Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module RPG
- class Map
- def initialize(width, height)
- @tileset_id = 1
- @width = width
- @height = height
- @autoplay_bgm = false
- @bgm = RPG::AudioFile.new
- @autoplay_bgs = false
- @bgs = RPG::AudioFile.new('', 80)
- @encounter_list = []
- @encounter_step = 30
- @data = Table.new(width, height, 3)
- @events = {}
- end
- attr_accessor :tileset_id
- attr_accessor :width
- attr_accessor :height
- attr_accessor :autoplay_bgm
- attr_accessor :bgm
- attr_accessor :autoplay_bgs
- attr_accessor :bgs
- attr_accessor :encounter_list
- attr_accessor :encounter_step
- attr_accessor :data
- attr_accessor :events
- end
- class MapInfo
- def initialize
- @name = ''
- @parent_id = 0
- @order = 0
- @expanded = false
- @scroll_x = 0
- @scroll_y = 0
- end
- attr_accessor :name
- attr_accessor :parent_id
- attr_accessor :order
- attr_accessor :expanded
- attr_accessor :scroll_x
- attr_accessor :scroll_y
- end
- class Event
- def initialize(x, y)
- @id = 0
- @name = ''
- @x = x
- @y = y
- @pages = [RPG::Event::Page.new]
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :x
- attr_accessor :y
- attr_accessor :pages
- class Page
- def initialize
- @condition = RPG::Event::Page::Condition.new
- @graphic = RPG::Event::Page::Graphic.new
- @move_type = 0
- @move_speed = 3
- @move_frequency = 3
- @move_route = RPG::MoveRoute.new
- @walk_anime = true
- @step_anime = false
- @direction_fix = false
- @through = false
- @always_on_top = false
- @trigger = 0
- @list = [RPG::EventCommand.new]
- end
- attr_accessor :condition
- attr_accessor :graphic
- attr_accessor :move_type
- attr_accessor :move_speed
- attr_accessor :move_frequency
- attr_accessor :move_route
- attr_accessor :walk_anime
- attr_accessor :step_anime
- attr_accessor :direction_fix
- attr_accessor :through
- attr_accessor :always_on_top
- attr_accessor :trigger
- attr_accessor :list
- class Condition
- def initialize
- @switch1_valid = false
- @switch2_valid = false
- @variable_valid = false
- @self_switch_valid = false
- @switch1_id = 1
- @switch2_id = 1
- @variable_id = 1
- @variable_value = 0
- @self_switch_ch = 'A'
- end
- attr_accessor :switch1_valid
- attr_accessor :switch2_valid
- attr_accessor :variable_valid
- attr_accessor :self_switch_valid
- attr_accessor :switch1_id
- attr_accessor :switch2_id
- attr_accessor :variable_id
- attr_accessor :variable_value
- attr_accessor :self_switch_ch
- end
- class Graphic
- def initialize
- @tile_id = 0
- @character_name = ''
- @character_hue = 0
- @direction = 2
- @pattern = 0
- @opacity = 255
- @blend_type = 0
- end
- attr_accessor :tile_id
- attr_accessor :character_name
- attr_accessor :character_hue
- attr_accessor :direction
- attr_accessor :pattern
- attr_accessor :opacity
- attr_accessor :blend_type
- end
- end
- end
- class EventCommand
- def initialize(code = 0, indent = 0, parameters = [])
- @code = code
- @indent = indent
- @parameters = parameters
- end
- attr_accessor :code
- attr_accessor :indent
- attr_accessor :parameters
- end
- class MoveRoute
- def initialize
- @repeat = true
- @skippable = false
- @list = [RPG::MoveCommand.new]
- end
- attr_accessor :repeat
- attr_accessor :skippable
- attr_accessor :list
- end
- class MoveCommand
- def initialize(code = 0, parameters = [])
- @code = code
- @parameters = parameters
- end
- attr_accessor :code
- attr_accessor :parameters
- end
- class Actor
- def initialize
- @id = 0
- @name = ''
- @class_id = 1
- @initial_level = 1
- @final_level = 99
- @exp_basis = 30
- @exp_inflation = 30
- @character_name = ''
- @character_hue = 0
- @battler_name = ''
- @battler_hue = 0
- @parameters = Table.new(6,100)
- for i in 1..99
- @parameters[0,i] = 500+i*50
- @parameters[1,i] = 500+i*50
- @parameters[2,i] = 50+i*5
- @parameters[3,i] = 50+i*5
- @parameters[4,i] = 50+i*5
- @parameters[5,i] = 50+i*5
- end
- @weapon_id = 0
- @armor1_id = 0
- @armor2_id = 0
- @armor3_id = 0
- @armor4_id = 0
- @weapon_fix = false
- @armor1_fix = false
- @armor2_fix = false
- @armor3_fix = false
- @armor4_fix = false
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :class_id
- attr_accessor :initial_level
- attr_accessor :final_level
- attr_accessor :exp_basis
- attr_accessor :exp_inflation
- attr_accessor :character_name
- attr_accessor :character_hue
- attr_accessor :battler_name
- attr_accessor :battler_hue
- attr_accessor :parameters
- attr_accessor :weapon_id
- attr_accessor :armor1_id
- attr_accessor :armor2_id
- attr_accessor :armor3_id
- attr_accessor :armor4_id
- attr_accessor :weapon_fix
- attr_accessor :armor1_fix
- attr_accessor :armor2_fix
- attr_accessor :armor3_fix
- attr_accessor :armor4_fix
- end
- class Class
- def initialize
- @id = 0
- @name = ''
- @position = 0
- @weapon_set = []
- @armor_set = []
- @element_ranks = Table.new(1)
- @state_ranks = Table.new(1)
- @learnings = []
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :position
- attr_accessor :weapon_set
- attr_accessor :armor_set
- attr_accessor :element_ranks
- attr_accessor :state_ranks
- attr_accessor :learnings
- class Learning
- def initialize
- @level = 1
- @skill_id = 1
- end
- attr_accessor :level
- attr_accessor :skill_id
- end
- end
- class Skill
- def initialize
- @id = 0
- @name = ''
- @icon_name = ''
- @description = ''
- @scope = 0
- @occasion = 1
- @animation1_id = 0
- @animation2_id = 0
- @menu_se = RPG::AudioFile.new('', 80)
- @common_event_id = 0
- @sp_cost = 0
- @power = 0
- @atk_f = 0
- @eva_f = 0
- @str_f = 0
- @dex_f = 0
- @agi_f = 0
- @int_f = 100
- @hit = 100
- @pdef_f = 0
- @mdef_f = 100
- @variance = 15
- @element_set = []
- @plus_state_set = []
- @minus_state_set = []
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :icon_name
- attr_accessor :description
- attr_accessor :scope
- attr_accessor :occasion
- attr_accessor :animation1_id
- attr_accessor :animation2_id
- attr_accessor :menu_se
- attr_accessor :common_event_id
- attr_accessor :sp_cost
- attr_accessor :power
- attr_accessor :atk_f
- attr_accessor :eva_f
- attr_accessor :str_f
- attr_accessor :dex_f
- attr_accessor :agi_f
- attr_accessor :int_f
- attr_accessor :hit
- attr_accessor :pdef_f
- attr_accessor :mdef_f
- attr_accessor :variance
- attr_accessor :element_set
- attr_accessor :plus_state_set
- attr_accessor :minus_state_set
- end
- class Item
- def initialize
- @id = 0
- @name = ''
- @icon_name = ''
- @description = ''
- @scope = 0
- @occasion = 0
- @animation1_id = 0
- @animation2_id = 0
- @menu_se = RPG::AudioFile.new('', 80)
- @common_event_id = 0
- @price = 0
- @consumable = true
- @parameter_type = 0
- @parameter_points = 0
- @recover_hp_rate = 0
- @recover_hp = 0
- @recover_sp_rate = 0
- @recover_sp = 0
- @hit = 100
- @pdef_f = 0
- @mdef_f = 0
- @variance = 0
- @element_set = []
- @plus_state_set = []
- @minus_state_set = []
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :icon_name
- attr_accessor :description
- attr_accessor :scope
- attr_accessor :occasion
- attr_accessor :animation1_id
- attr_accessor :animation2_id
- attr_accessor :menu_se
- attr_accessor :common_event_id
- attr_accessor :price
- attr_accessor :consumable
- attr_accessor :parameter_type
- attr_accessor :parameter_points
- attr_accessor :recover_hp_rate
- attr_accessor :recover_hp
- attr_accessor :recover_sp_rate
- attr_accessor :recover_sp
- attr_accessor :hit
- attr_accessor :pdef_f
- attr_accessor :mdef_f
- attr_accessor :variance
- attr_accessor :element_set
- attr_accessor :plus_state_set
- attr_accessor :minus_state_set
- end
- class Weapon
- def initialize
- @id = 0
- @name = ''
- @icon_name = ''
- @description = ''
- @animation1_id = 0
- @animation2_id = 0
- @price = 0
- @atk = 0
- @pdef = 0
- @mdef = 0
- @str_plus = 0
- @dex_plus = 0
- @agi_plus = 0
- @int_plus = 0
- @element_set = []
- @plus_state_set = []
- @minus_state_set = []
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :icon_name
- attr_accessor :description
- attr_accessor :animation1_id
- attr_accessor :animation2_id
- attr_accessor :price
- attr_accessor :atk
- attr_accessor :pdef
- attr_accessor :mdef
- attr_accessor :str_plus
- attr_accessor :dex_plus
- attr_accessor :agi_plus
- attr_accessor :int_plus
- attr_accessor :element_set
- attr_accessor :plus_state_set
- attr_accessor :minus_state_set
- end
- class Armor
- def initialize
- @id = 0
- @name = ''
- @icon_name = ''
- @description = ''
- @kind = 0
- @auto_state_id = 0
- @price = 0
- @pdef = 0
- @mdef = 0
- @eva = 0
- @str_plus = 0
- @dex_plus = 0
- @agi_plus = 0
- @int_plus = 0
- @guard_element_set = []
- @guard_state_set = []
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :icon_name
- attr_accessor :description
- attr_accessor :kind
- attr_accessor :auto_state_id
- attr_accessor :price
- attr_accessor :pdef
- attr_accessor :mdef
- attr_accessor :eva
- attr_accessor :str_plus
- attr_accessor :dex_plus
- attr_accessor :agi_plus
- attr_accessor :int_plus
- attr_accessor :guard_element_set
- attr_accessor :guard_state_set
- end
- class Enemy
- def initialize
- @id = 0
- @name = ''
- @battler_name = ''
- @battler_hue = 0
- @maxhp = 500
- @maxsp = 500
- @str = 50
- @dex = 50
- @agi = 50
- @int = 50
- @atk = 100
- @pdef = 100
- @mdef = 100
- @eva = 0
- @animation1_id = 0
- @animation2_id = 0
- @element_ranks = Table.new(1)
- @state_ranks = Table.new(1)
- @actions = [RPG::Enemy::Action.new]
- @exp = 0
- @gold = 0
- @item_id = 0
- @weapon_id = 0
- @armor_id = 0
- @treasure_prob = 100
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :battler_name
- attr_accessor :battler_hue
- attr_accessor :maxhp
- attr_accessor :maxsp
- attr_accessor :str
- attr_accessor :dex
- attr_accessor :agi
- attr_accessor :int
- attr_accessor :atk
- attr_accessor :pdef
- attr_accessor :mdef
- attr_accessor :eva
- attr_accessor :animation1_id
- attr_accessor :animation2_id
- attr_accessor :element_ranks
- attr_accessor :state_ranks
- attr_accessor :actions
- attr_accessor :exp
- attr_accessor :gold
- attr_accessor :item_id
- attr_accessor :weapon_id
- attr_accessor :armor_id
- attr_accessor :treasure_prob
- class Action
- def initialize
- @kind = 0
- @basic = 0
- @skill_id = 1
- @condition_turn_a = 0
- @condition_turn_b = 1
- @condition_hp = 100
- @condition_level = 1
- @condition_switch_id = 0
- @rating = 5
- end
- attr_accessor :kind
- attr_accessor :basic
- attr_accessor :skill_id
- attr_accessor :condition_turn_a
- attr_accessor :condition_turn_b
- attr_accessor :condition_hp
- attr_accessor :condition_level
- attr_accessor :condition_switch_id
- attr_accessor :rating
- end
- end
- class Troop
- def initialize
- @id = 0
- @name = ''
- @members = []
- @pages = [RPG::Troop::Page.new]
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :members
- attr_accessor :pages
- class Member
- def initialize
- @enemy_id = 1
- @x = 0
- @y = 0
- @hidden = false
- @immortal = false
- end
- attr_accessor :enemy_id
- attr_accessor :x
- attr_accessor :y
- attr_accessor :hidden
- attr_accessor :immortal
- end
- class Page
- def initialize
- @condition = RPG::Troop::Page::Condition.new
- @span = 0
- @list = [RPG::EventCommand.new]
- end
- attr_accessor :condition
- attr_accessor :span
- attr_accessor :list
- class Condition
- def initialize
- @turn_valid = false
- @enemy_valid = false
- @actor_valid = false
- @switch_valid = false
- @turn_a = 0
- @turn_b = 0
- @enemy_index = 0
- @enemy_hp = 50
- @actor_id = 1
- @actor_hp = 50
- @switch_id = 1
- end
- attr_accessor :turn_valid
- attr_accessor :enemy_valid
- attr_accessor :actor_valid
- attr_accessor :switch_valid
- attr_accessor :turn_a
- attr_accessor :turn_b
- attr_accessor :enemy_index
- attr_accessor :enemy_hp
- attr_accessor :actor_id
- attr_accessor :actor_hp
- attr_accessor :switch_id
- end
- end
- end
- class State
- def initialize
- @id = 0
- @name = ''
- @animation_id = 0
- @restriction = 0
- @nonresistance = false
- @zero_hp = false
- @cant_get_exp = false
- @cant_evade = false
- @slip_damage = false
- @rating = 5
- @hit_rate = 100
- @maxhp_rate = 100
- @maxsp_rate = 100
- @str_rate = 100
- @dex_rate = 100
- @agi_rate = 100
- @int_rate = 100
- @atk_rate = 100
- @pdef_rate = 100
- @mdef_rate = 100
- @eva = 0
- @battle_only = true
- @hold_turn = 0
- @auto_release_prob = 0
- @shock_release_prob = 0
- @guard_element_set = []
- @plus_state_set = []
- @minus_state_set = []
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :animation_id
- attr_accessor :restriction
- attr_accessor :nonresistance
- attr_accessor :zero_hp
- attr_accessor :cant_get_exp
- attr_accessor :cant_evade
- attr_accessor :slip_damage
- attr_accessor :rating
- attr_accessor :hit_rate
- attr_accessor :maxhp_rate
- attr_accessor :maxsp_rate
- attr_accessor :str_rate
- attr_accessor :dex_rate
- attr_accessor :agi_rate
- attr_accessor :int_rate
- attr_accessor :atk_rate
- attr_accessor :pdef_rate
- attr_accessor :mdef_rate
- attr_accessor :eva
- attr_accessor :battle_only
- attr_accessor :hold_turn
- attr_accessor :auto_release_prob
- attr_accessor :shock_release_prob
- attr_accessor :guard_element_set
- attr_accessor :plus_state_set
- attr_accessor :minus_state_set
- end
- class Animation
- def initialize
- @id = 0
- @name = ''
- @animation_name = ''
- @animation_hue = 0
- @position = 1
- @frame_max = 1
- @frames = [RPG::Animation::Frame.new]
- @timings = []
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :animation_name
- attr_accessor :animation_hue
- attr_accessor :position
- attr_accessor :frame_max
- attr_accessor :frames
- attr_accessor :timings
- class Frame
- def initialize
- @cell_max = 0
- @cell_data = Table.new(0, 0)
- end
- attr_accessor :cell_max
- attr_accessor :cell_data
- end
- class Timing
- def initialize
- @frame = 0
- @se = RPG::AudioFile.new('', 80)
- @flash_scope = 0
- @flash_color = Color.new(255,255,255,255)
- @flash_duration = 5
- @condition = 0
- end
- attr_accessor :frame
- attr_accessor :se
- attr_accessor :flash_scope
- attr_accessor :flash_color
- attr_accessor :flash_duration
- attr_accessor :condition
- end
- end
- class Tileset
- def initialize
- @id = 0
- @name = ''
- @tileset_name = ''
- @autotile_names = ['']*7
- @panorama_name = ''
- @panorama_hue = 0
- @fog_name = ''
- @fog_hue = 0
- @fog_opacity = 64
- @fog_blend_type = 0
- @fog_zoom = 200
- @fog_sx = 0
- @fog_sy = 0
- @battleback_name = ''
- @passages = Table.new(384)
- @priorities = Table.new(384)
- @priorities[0] = 5
- @terrain_tags = Table.new(384)
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :tileset_name
- attr_accessor :autotile_names
- attr_accessor :panorama_name
- attr_accessor :panorama_hue
- attr_accessor :fog_name
- attr_accessor :fog_hue
- attr_accessor :fog_opacity
- attr_accessor :fog_blend_type
- attr_accessor :fog_zoom
- attr_accessor :fog_sx
- attr_accessor :fog_sy
- attr_accessor :battleback_name
- attr_accessor :passages
- attr_accessor :priorities
- attr_accessor :terrain_tags
- end
- class CommonEvent
- def initialize
- @id = 0
- @name = ''
- @trigger = 0
- @switch_id = 1
- @list = [RPG::EventCommand.new]
- end
- attr_accessor :id
- attr_accessor :name
- attr_accessor :trigger
- attr_accessor :switch_id
- attr_accessor :list
- end
- class System
- def initialize
- @magic_number = 0
- @party_members = [1]
- @elements = [nil, '']
- @switches = [nil, '']
- @variables = [nil, '']
- @windowskin_name = ''
- @title_name = ''
- @gameover_name = ''
- @battle_transition = ''
- @title_bgm = RPG::AudioFile.new
- @battle_bgm = RPG::AudioFile.new
- @battle_end_me = RPG::AudioFile.new
- @gameover_me = RPG::AudioFile.new
- @cursor_se = RPG::AudioFile.new('', 80)
- @decision_se = RPG::AudioFile.new('', 80)
- @cancel_se = RPG::AudioFile.new('', 80)
- @buzzer_se = RPG::AudioFile.new('', 80)
- @equip_se = RPG::AudioFile.new('', 80)
- @shop_se = RPG::AudioFile.new('', 80)
- @save_se = RPG::AudioFile.new('', 80)
- @load_se = RPG::AudioFile.new('', 80)
- @battle_start_se = RPG::AudioFile.new('', 80)
- @escape_se = RPG::AudioFile.new('', 80)
- @actor_collapse_se = RPG::AudioFile.new('', 80)
- @enemy_collapse_se = RPG::AudioFile.new('', 80)
- @words = RPG::System::Words.new
- @test_battlers = []
- @test_troop_id = 1
- @start_map_id = 1
- @start_x = 0
- @start_y = 0
- @battleback_name = ''
- @battler_name = ''
- @battler_hue = 0
- @edit_map_id = 1
- end
- attr_accessor :magic_number
- attr_accessor :party_members
- attr_accessor :elements
- attr_accessor :switches
- attr_accessor :variables
- attr_accessor :windowskin_name
- attr_accessor :title_name
- attr_accessor :gameover_name
- attr_accessor :battle_transition
- attr_accessor :title_bgm
- attr_accessor :battle_bgm
- attr_accessor :battle_end_me
- attr_accessor :gameover_me
- attr_accessor :cursor_se
- attr_accessor :decision_se
- attr_accessor :cancel_se
- attr_accessor :buzzer_se
- attr_accessor :equip_se
- attr_accessor :shop_se
- attr_accessor :save_se
- attr_accessor :load_se
- attr_accessor :battle_start_se
- attr_accessor :escape_se
- attr_accessor :actor_collapse_se
- attr_accessor :enemy_collapse_se
- attr_accessor :words
- attr_accessor :test_battlers
- attr_accessor :test_troop_id
- attr_accessor :start_map_id
- attr_accessor :start_x
- attr_accessor :start_y
- attr_accessor :battleback_name
- attr_accessor :battler_name
- attr_accessor :battler_hue
- attr_accessor :edit_map_id
- class Words
- def initialize
- @gold = ''
- @hp = ''
- @sp = ''
- @str = ''
- @dex = ''
- @agi = ''
- @int = ''
- @atk = ''
- @pdef = ''
- @mdef = ''
- @weapon = ''
- @armor1 = ''
- @armor2 = ''
- @armor3 = ''
- @armor4 = ''
- @attack = ''
- @skill = ''
- @guard = ''
- @item = ''
- @equip = ''
- end
- attr_accessor :gold
- attr_accessor :hp
- attr_accessor :sp
- attr_accessor :str
- attr_accessor :dex
- attr_accessor :agi
- attr_accessor :int
- attr_accessor :atk
- attr_accessor :pdef
- attr_accessor :mdef
- attr_accessor :weapon
- attr_accessor :armor1
- attr_accessor :armor2
- attr_accessor :armor3
- attr_accessor :armor4
- attr_accessor :attack
- attr_accessor :skill
- attr_accessor :guard
- attr_accessor :item
- attr_accessor :equip
- end
- class TestBattler
- def initialize
- @actor_id = 1
- @level = 1
- @weapon_id = 0
- @armor1_id = 0
- @armor2_id = 0
- @armor3_id = 0
- @armor4_id = 0
- end
- attr_accessor :actor_id
- attr_accessor :level
- attr_accessor :weapon_id
- attr_accessor :armor1_id
- attr_accessor :armor2_id
- attr_accessor :armor3_id
- attr_accessor :armor4_id
- end
- end
- class AudioFile
- def initialize(name = '', volume = 100, pitch = 100)
- @name = name
- @volume = volume
- @pitch = pitch
- end
- attr_accessor :name
- attr_accessor :volume
- attr_accessor :pitch
- end
- module Cache
- @cache = {}
- def self.load_bitmap(folder_name, filename, hue = 0)
- path = folder_name + filename
- if not @cache.include?(path) or @cache[path].disposed?
- if filename != ''
- @cache[path] = Bitmap.new(path)
- else
- @cache[path] = Bitmap.new(32, 32)
- end
- end
- if hue == 0
- @cache[path]
- else
- key = [path, hue]
- if not @cache.include?(key) or @cache[key].disposed?
- @cache[key] = @cache[path].clone
- @cache[key].hue_change(hue)
- end
- @cache[key]
- end
- end
- def self.animation(filename, hue)
- self.load_bitmap('Graphics/Animations/', filename, hue)
- end
- def self.autotile(filename)
- self.load_bitmap('Graphics/Autotiles/', filename)
- end
- def self.battleback(filename)
- self.load_bitmap('Graphics/Battlebacks/', filename)
- end
- def self.battler(filename, hue)
- self.load_bitmap('Graphics/Battlers/', filename, hue)
- end
- def self.character(filename, hue)
- self.load_bitmap('Graphics/Characters/', filename, hue)
- end
- def self.fog(filename, hue)
- self.load_bitmap('Graphics/Fogs/', filename, hue)
- end
- def self.gameover(filename)
- self.load_bitmap('Graphics/Gameovers/', filename)
- end
- def self.icon(filename)
- self.load_bitmap('Graphics/Icons/', filename)
- end
- def self.panorama(filename, hue)
- self.load_bitmap('Graphics/Panoramas/', filename, hue)
- end
- def self.picture(filename)
- self.load_bitmap('Graphics/Pictures/', filename)
- end
- def self.tileset(filename)
- self.load_bitmap('Graphics/Tilesets/', filename)
- end
- def self.title(filename)
- self.load_bitmap('Graphics/Titles/', filename)
- end
- def self.windowskin(filename)
- self.load_bitmap('Graphics/Windowskins/', filename)
- end
- def self.tile(filename, tile_id, hue)
- key = [filename, tile_id, hue]
- if not @cache.include?(key) or @cache[key].disposed?
- @cache[key] = Bitmap.new(32, 32)
- x = (tile_id - 384) % 8 * 32
- y = (tile_id - 384) / 8 * 32
- rect = Rect.new(x, y, 32, 32)
- @cache[key].blt(0, 0, self.tileset(filename), rect)
- @cache[key].hue_change(hue)
- end
- @cache[key]
- end
- def self.clear
- @cache = {}
- GC.start
- end
- end
- class Sprite < ::Sprite
- @@_animations = []
- @@_reference_count = {}
- def initialize(viewport = nil)
- super(viewport)
- @_whiten_duration = 0
- @_appear_duration = 0
- @_escape_duration = 0
- @_collapse_duration = 0
- @_damage_duration = 0
- @_animation_duration = 0
- @_blink = false
- end
- def dispose
- dispose_damage
- dispose_animation
- dispose_loop_animation
- super
- end
- def whiten
- self.blend_type = 0
- self.color.set(255, 255, 255, 128)
- self.opacity = 255
- @_whiten_duration = 16
- @_appear_duration = 0
- @_escape_duration = 0
- @_collapse_duration = 0
- end
- def appear
- self.blend_type = 0
- self.color.set(0, 0, 0, 0)
- self.opacity = 0
- @_appear_duration = 16
- @_whiten_duration = 0
- @_escape_duration = 0
- @_collapse_duration = 0
- end
- def escape
- self.blend_type = 0
- self.color.set(0, 0, 0, 0)
- self.opacity = 255
- @_escape_duration = 32
- @_whiten_duration = 0
- @_appear_duration = 0
- @_collapse_duration = 0
- end
- def collapse
- self.blend_type = 1
- self.color.set(255, 64, 64, 255)
- self.opacity = 255
- @_collapse_duration = 48
- @_whiten_duration = 0
- @_appear_duration = 0
- @_escape_duration = 0
- end
- def damage(value, critical)
- dispose_damage
- if value.is_a?(Numeric)
- damage_string = value.abs.to_s
- else
- damage_string = value.to_s
- end
- bitmap = Bitmap.new(160, 48)
- bitmap.font.name = 'Arial Black'
- bitmap.font.size = 32
- bitmap.font.color.set(0, 0, 0)
- bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
- bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
- bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
- bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
- if value.is_a?(Numeric) and value < 0
- bitmap.font.color.set(176, 255, 144)
- else
- bitmap.font.color.set(255, 255, 255)
- end
- bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
- if critical
- bitmap.font.size = 20
- bitmap.font.color.set(0, 0, 0)
- bitmap.draw_text(-1, -1, 160, 20, 'CRITICAL', 1)
- bitmap.draw_text(+1, -1, 160, 20, 'CRITICAL', 1)
- bitmap.draw_text(-1, +1, 160, 20, 'CRITICAL', 1)
- bitmap.draw_text(+1, +1, 160, 20, 'CRITICAL', 1)
- bitmap.font.color.set(255, 255, 255)
- bitmap.draw_text(0, 0, 160, 20, 'CRITICAL', 1)
- end
- @_damage_sprite = ::Sprite.new(self.viewport)
- @_damage_sprite.bitmap = bitmap
- @_damage_sprite.ox = 80
- @_damage_sprite.oy = 20
- @_damage_sprite.x = self.x
- @_damage_sprite.y = self.y - self.oy / 2
- @_damage_sprite.z = 3000
- @_damage_duration = 40
- end
- def animation(animation, hit)
- dispose_animation
- @_animation = animation
- return if @_animation == nil
- @_animation_hit = hit
- @_animation_duration = @_animation.frame_max
- animation_name = @_animation.animation_name
- animation_hue = @_animation.animation_hue
- bitmap = RPG::Cache.animation(animation_name, animation_hue)
- if @@_reference_count.include?(bitmap)
- @@_reference_count[bitmap] += 1
- else
- @@_reference_count[bitmap] = 1
- end
- @_animation_sprites = []
- if @_animation.position != 3 or not @@_animations.include?(animation)
- for i in 0..15
- sprite = ::Sprite.new(self.viewport)
- sprite.bitmap = bitmap
- sprite.visible = false
- @_animation_sprites.push(sprite)
- end
- unless @@_animations.include?(animation)
- @@_animations.push(animation)
- end
- end
- update_animation
- end
- def loop_animation(animation)
- return if animation == @_loop_animation
- dispose_loop_animation
- @_loop_animation = animation
- return if @_loop_animation == nil
- @_loop_animation_index = 0
- animation_name = @_loop_animation.animation_name
- animation_hue = @_loop_animation.animation_hue
- bitmap = RPG::Cache.animation(animation_name, animation_hue)
- if @@_reference_count.include?(bitmap)
- @@_reference_count[bitmap] += 1
- else
- @@_reference_count[bitmap] = 1
- end
- @_loop_animation_sprites = []
- for i in 0..15
- sprite = ::Sprite.new(self.viewport)
- sprite.bitmap = bitmap
- sprite.visible = false
- @_loop_animation_sprites.push(sprite)
- end
- update_loop_animation
- end
- def dispose_damage
- if @_damage_sprite != nil
- @_damage_sprite.bitmap.dispose
- @_damage_sprite.dispose
- @_damage_sprite = nil
- @_damage_duration = 0
- end
- end
- def dispose_animation
- if @_animation_sprites != nil
- sprite = @_animation_sprites[0]
- if sprite != nil
- @@_reference_count[sprite.bitmap] -= 1
- if @@_reference_count[sprite.bitmap] == 0
- sprite.bitmap.dispose
- end
- end
- for sprite in @_animation_sprites
- sprite.dispose
- end
- @_animation_sprites = nil
- @_animation = nil
- end
- end
- def dispose_loop_animation
- if @_loop_animation_sprites != nil
- sprite = @_loop_animation_sprites[0]
- if sprite != nil
- @@_reference_count[sprite.bitmap] -= 1
- if @@_reference_count[sprite.bitmap] == 0
- sprite.bitmap.dispose
- end
- end
- for sprite in @_loop_animation_sprites
- sprite.dispose
- end
- @_loop_animation_sprites = nil
- @_loop_animation = nil
- end
- end
- def blink_on
- unless @_blink
- @_blink = true
- @_blink_count = 0
- end
- end
- def blink_off
- if @_blink
- @_blink = false
- self.color.set(0, 0, 0, 0)
- end
- end
- def blink?
- @_blink
- end
- def effect?
- @_whiten_duration > 0 or
- @_appear_duration > 0 or
- @_escape_duration > 0 or
- @_collapse_duration > 0 or
- @_damage_duration > 0 or
- @_animation_duration > 0
- end
- def update
- super
- if @_whiten_duration > 0
- @_whiten_duration -= 1
- self.color.alpha = 128 - (16 - @_whiten_duration) * 10
- end
- if @_appear_duration > 0
- @_appear_duration -= 1
- self.opacity = (16 - @_appear_duration) * 16
- end
- if @_escape_duration > 0
- @_escape_duration -= 1
- self.opacity = 256 - (32 - @_escape_duration) * 10
- end
- if @_collapse_duration > 0
- @_collapse_duration -= 1
- self.opacity = 256 - (48 - @_collapse_duration) * 6
- end
- if @_damage_duration > 0
- @_damage_duration -= 1
- case @_damage_duration
- when 38..39
- @_damage_sprite.y -= 4
- when 36..37
- @_damage_sprite.y -= 2
- when 34..35
- @_damage_sprite.y += 2
- when 28..33
- @_damage_sprite.y += 4
- end
- @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
- if @_damage_duration == 0
- dispose_damage
- end
- end
- if @_animation != nil and (Graphics.frame_count % 2 == 0)
- @_animation_duration -= 1
- update_animation
- end
- if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
- update_loop_animation
- @_loop_animation_index += 1
- @_loop_animation_index %= @_loop_animation.frame_max
- end
- if @_blink
- @_blink_count = (@_blink_count + 1) % 32
- if @_blink_count < 16
- alpha = (16 - @_blink_count) * 6
- else
- alpha = (@_blink_count - 16) * 6
- end
- self.color.set(255, 255, 255, alpha)
- end
- @@_animations.clear
- end
- def update_animation
- if @_animation_duration > 0
- frame_index = @_animation.frame_max - @_animation_duration
- cell_data = @_animation.frames[frame_index].cell_data
- position = @_animation.position
- animation_set_sprites(@_animation_sprites, cell_data, position)
- for timing in @_animation.timings
- if timing.frame == frame_index
- animation_process_timing(timing, @_animation_hit)
- end
- end
- else
- dispose_animation
- end
- end
- def update_loop_animation
- frame_index = @_loop_animation_index
- cell_data = @_loop_animation.frames[frame_index].cell_data
- position = @_loop_animation.position
- animation_set_sprites(@_loop_animation_sprites, cell_data, position)
- for timing in @_loop_animation.timings
- if timing.frame == frame_index
- animation_process_timing(timing, true)
- end
- end
- end
- def animation_set_sprites(sprites, cell_data, position)
- for i in 0..15
- sprite = sprites[i]
- pattern = cell_data[i, 0]
- if sprite == nil or pattern == nil or pattern == -1
- sprite.visible = false if sprite != nil
- next
- end
- sprite.visible = true
- sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
- if position == 3
- if self.viewport != nil
- sprite.x = self.viewport.rect.width / 2
- sprite.y = self.viewport.rect.height - 160
- else
- sprite.x = 320
- sprite.y = 240
- end
- else
- sprite.x = self.x - self.ox + self.src_rect.width / 2
- sprite.y = self.y - self.oy + self.src_rect.height / 2
- sprite.y -= self.src_rect.height / 4 if position == 0
- sprite.y += self.src_rect.height / 4 if position == 2
- end
- sprite.x += cell_data[i, 1]
- sprite.y += cell_data[i, 2]
- sprite.z = 2000
- sprite.ox = 96
- sprite.oy = 96
- sprite.zoom_x = cell_data[i, 3] / 100.0
- sprite.zoom_y = cell_data[i, 3] / 100.0
- sprite.angle = cell_data[i, 4]
- sprite.mirror = (cell_data[i, 5] == 1)
- sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
- sprite.blend_type = cell_data[i, 7]
- end
- end
- def animation_process_timing(timing, hit)
- if (timing.condition == 0) or(timing.condition == 1 and hit == true) or(timing.condition == 2 and hit == false)
- if timing.se.name != ''
- se = timing.se
- Audio.se_play('Audio/SE/' + se.name, se.volume, se.pitch)
- end
- case timing.flash_scope
- when 1
- self.flash(timing.flash_color, timing.flash_duration * 2)
- when 2
- if self.viewport != nil
- self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
- end
- when 3
- self.flash(nil, timing.flash_duration * 2)
- end
- end
- end
- def x=(x)
- sx = x - self.x
- if sx != 0
- if @_animation_sprites != nil
- for i in 0..15
- @_animation_sprites[i].x += sx
- end
- end
- if @_loop_animation_sprites != nil
- for i in 0..15
- @_loop_animation_sprites[i].x += sx
- end
- end
- end
- super
- end
- def y=(y)
- sy = y - self.y
- if sy != 0
- if @_animation_sprites != nil
- for i in 0..15
- @_animation_sprites[i].y += sy
- end
- end
- if @_loop_animation_sprites != nil
- for i in 0..15
- @_loop_animation_sprites[i].y += sy
- end
- end
- end
- super
- end
- end
- class Weather
- def initialize(viewport = nil)
- @type = 0
- @max = 0
- @ox = 0
- @oy = 0
- color1 = Color.new(255, 255, 255, 255)
- color2 = Color.new(255, 255, 255, 128)
- @rain_bitmap = Bitmap.new(7, 56)
- for i in 0..6
- @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
- end
- @storm_bitmap = Bitmap.new(34, 64)
- for i in 0..31
- @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
- @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
- @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
- end
- @snow_bitmap = Bitmap.new(6, 6)
- @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
- @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
- @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
- @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
- @sprites = []
- for i in 1..40
- sprite = Sprite.new(viewport)
- sprite.z = 1000
- sprite.visible = false
- sprite.opacity = 0
- @sprites.push(sprite)
- end
- end
- def dispose
- for sprite in @sprites
- sprite.dispose
- end
- @rain_bitmap.dispose
- @storm_bitmap.dispose
- @snow_bitmap.dispose
- end
- def type=(type)
- return if @type == type
- @type = type
- case @type
- when 1
- bitmap = @rain_bitmap
- when 2
- bitmap = @storm_bitmap
- when 3
- bitmap = @snow_bitmap
- else
- bitmap = nil
- end
- for i in 1..40
- sprite = @sprites[i]
- if sprite != nil
- sprite.visible = (i <= @max)
- sprite.bitmap = bitmap
- end
- end
- end
- def ox=(ox)
- return if @ox == ox
- @ox = ox
- for sprite in @sprites
- sprite.ox = @ox
- end
- end
- def oy=(oy)
- return if @oy == oy
- @oy = oy
- for sprite in @sprites
- sprite.oy = @oy
- end
- end
- def max=(max)
- return if @max == max
- @max = [[max, 0].max, 40].min
- for i in 1..40
- sprite = @sprites[i]
- if sprite != nil
- sprite.visible = (i <= @max)
- end
- end
- end
- def update
- return if @type == 0
- for i in 1..@max
- sprite = @sprites[i]
- if sprite == nil
- break
- end
- if @type == 1
- sprite.x -= 2
- sprite.y += 16
- sprite.opacity -= 8
- end
- if @type == 2
- sprite.x -= 8
- sprite.y += 16
- sprite.opacity -= 12
- end
- if @type == 3
- sprite.x -= 2
- sprite.y += 8
- sprite.opacity -= 8
- end
- x = sprite.x - @ox
- y = sprite.y - @oy
- if sprite.opacity < 64 or x < -50 or x > 750 or y < -300 or y > 500
- sprite.x = rand(800) - 50 + @ox
- sprite.y = rand(800) - 200 + @oy
- sprite.opacity = 255
- end
- end
- end
- attr_reader :type
- attr_reader :max
- attr_reader :ox
- attr_reader :oy
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement