module RPG class Item def name return @name.split(/#/)[0] end def indentify return @name.split(/#/)[1] end end class Weapon def name return @name.split(/#/)[0] end def indentify return @name.split(/#/)[1] end end class Armor def name return @name.split(/#/)[0] end def indentify return @name.split(/#/)[1] end end end module OPTION CALL_WINDOW = Proc.new{$Scene.call_window } end class Game_System #-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_accessor :item_indentify_table # 物品鉴定表 attr_accessor :weapon_indentify_table # 武器鉴定表 attr_accessor :armor_indentify_table # 防具鉴定表 #-------------------------------------------------------------------------- # ● 初始化对像 #-------------------------------------------------------------------------- alias ori_initialize initialize def initialize ori_initialize @item_indentify_table = IT.new.set_item @weapon_indentify_table = IT.new.set_weapon @armor_indentify_table = IT.new.set_armor end end #-------------------------------------------------------------------------- # ● 存储数据表的IT类 #-------------------------------------------------------------------------- class IT def initialize @items = $data_items @weapons = $data_weapons @armors = $data_armors end def set_item hash = {} for i in [email protected] hash[@items[i].name] = @items[i].indentify end return hash end def set_weapon hash = {} for i in [email protected] hash[@weapons[i].name] = @weapons[i].indentify end return hash end def set_armor hash = {} for i in [email protected] hash[@armors[i].name] = @armors[i].indentify end return hash end end #============================================================================== # ■ Window_Item #------------------------------------------------------------------------------ # 物品画面、战斗画面、显示浏览物品的窗口。 #============================================================================== class Window_Item < Window_Selectable #-------------------------------------------------------------------------- # ● 描绘项目 # index : 项目编号 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] case item when RPG::Item number = $game_party.item_number(item.id) # 添加判断(物品) indentify = $game_system.item_indentify_table[item.name] when RPG::Weapon number = $game_party.weapon_number(item.id) # 添加判断(武器) indentify = $game_system.weapon_indentify_table[item.name] when RPG::Armor # 添加判断(防具) number = $game_party.armor_number(item.id) indentify = $game_system.armor_indentify_table[item.name] end if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id) self.contents.font.color = normal_color else self.contents.font.color = disabled_color end x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(item.icon_name) opacity = self.contents.font.color == normal_color ? 255 : 128 self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) if indentify == "0" self.contents.draw_text(x + 28, y, 212, 32,"未鉴定", 0) else self.contents.draw_text(x + 28, y, 212, 32, item.name, 0) end self.contents.draw_text(x + 240, y, 16, 32, ":", 1) self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2) end end #============================================================================== # ■ Scene_Item #------------------------------------------------------------------------------ # 处理物品画面的类。 #============================================================================== class Scene_Item #-------------------------------------------------------------------------- # ● 刷新画面 (目标窗口被激活的情况下) #-------------------------------------------------------------------------- def update_target # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 由于物品用完而不能使用的场合 unless $game_party.item_can_use?(@item.id) # 再次生成物品窗口的内容 @item_window.refresh end # 删除目标窗口 @item_window.active = true @target_window.visible = false @target_window.active = false return end # 按下 C 键的情况下 if Input.trigger?(Input::C) # 如果物品用完的情况下 if $game_party.item_number(@item.id) == 0 # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end p $game_system.item_indentify_table[@item.name] # 判断是否为未鉴定物品 if $game_system.item_indentify_table[@item.name] == "0" # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # -------------------- # 目标是全体的情况下 if @target_window.index == -1 # 对同伴全体应用物品使用效果 used = false for i in $game_party.actors used |= i.item_effect(@item) end end # 目标是单体的情况下 if @target_window.index >= 0 # 对目标角色应用物品的使用效果 target = $game_party.actors[@target_window.index] used = target.item_effect(@item) end # 使用物品的情况下 if used # 演奏物品使用时的 SE $game_system.se_play(@item.menu_se) # 消耗品的情况下 if @item.consumable # 使用的物品数减 1 $game_party.lose_item(@item.id, 1) # 再描绘物品窗口的项目 @item_window.draw_item(@item_window.index) end # 再生成目标窗口的内容 @target_window.refresh # 全灭的情况下 if $game_party.all_dead? # 切换到游戏结束画面 $scene = Scene_Gameover.new return end # 公共事件 ID 有效的情况下 if @item.common_event_id > 0 # 预约调用公共事件 $game_temp.common_event_id = @item.common_event_id # 切换到地图画面 $scene = Scene_Map.new return end end # 无法使用物品的情况下 unless used # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) end return end end end #============================================================================== # ■ Window_EquipItem #------------------------------------------------------------------------------ # 装备画面、显示浏览变更装备的候补物品的窗口。 #============================================================================== class Window_EquipItem < Window_Selectable #-------------------------------------------------------------------------- # ● 项目的描绘 # index : 项目符号 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 case item when RPG::Weapon number = $game_party.weapon_number(item.id) # 添加判断(武器) indentify = $game_system.weapon_indentify_table[item.name] when RPG::Armor number = $game_party.armor_number(item.id) # 添加判断(防具) indentify = $game_system.armor_indentify_table[item.name] end bitmap = RPG::Cache.icon(item.icon_name) self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24)) self.contents.font.color = normal_color if indentify == "0" self.contents.draw_text(x + 28, y, 212, 32,"未鉴定", 0) else self.contents.draw_text(x + 28, y, 212, 32, item.name, 0) end self.contents.draw_text(x + 240, y, 16, 32, ":", 1) self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2) end end #============================================================================== # ■ Scene_Equip #------------------------------------------------------------------------------ # 处理装备画面的类。 #============================================================================== class Scene_Equip #-------------------------------------------------------------------------- # ● 刷新画面 (物品窗口被激活的情况下) #-------------------------------------------------------------------------- def update_item # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 激活右侧窗口 @right_window.active = true @item_window.active = false @item_window.index = -1 return end # 按下 C 键的情况下 if Input.trigger?(Input::C) case @item_window.item when RPG::Weapon # 添加判断(武器) indentify = $game_system.weapon_indentify_table[@item_window.item.name] when RPG::Armor # 添加判断(防具) indentify = $game_system.armor_indentify_table[@item_window.item.name] end if @item_window.item != nil if indentify == "0" return end end # 演奏装备 SE $game_system.se_play($data_system.equip_se) # 获取物品窗口现在选择的装备数据 item = @item_window.item # 变更装备 @actor.equip(@right_window.index, item == nil ? 0 : item.id) # 激活右侧窗口 @right_window.active = true @item_window.active = false @item_window.index = -1 # 再生成右侧窗口、物品窗口的内容 @right_window.refresh @item_window.refresh return end end end class Game_Party attr_reader :items attr_reader :weapons attr_reader :armors end class Window_Item_Indentify < Window_Selectable def initialize super(160,80,320,320) self.contents = Bitmap.new(width - 32, height - 32) @column_max = 1 @item_max = items[0].size + weapons[0].size + armors[0].size - 1 @data = [] refresh self.index = 0 end def items hash = {} item_names = [] item_ids = [] items = $game_party.items items.each_key{|key|item_names.push($data_items[key].name)} items.each_key{|key|item_ids.push(key)} return [item_names,item_ids] end def weapons hash = {} weapon_names = [] weapon_ids = [] weapons = $game_party.weapons weapons.each_key{|key|weapon_names.push($data_weapons[key].name)} weapons.each_key{|key|weapon_ids.push(key)} return [weapon_names,weapon_ids] end def armors hash = {} armor_names = [] armor_ids = [] armors = $game_party.armors armors.each_key{|key|armor_names.push($data_armors[key].name)} armors.each_key{|key|armor_ids.push(key)} return [armor_names,armor_ids] end def all all = [] items[1].each{|id| all.push($data_items[id])} weapons[1].each{|id| all.push($data_weapons[id])} armors[1].each{|id| all.push($data_armors[id])} return all end def refresh self.contents.clear for i in 0...all.size case all[i] when RPG::Item indentify = $game_system.item_indentify_table[all[i].name] when RPG::Weapon indentify = $game_system.weapon_indentify_table[all[i].name] when RPG::Armor indentify = $game_system.armor_indentify_table[all[i].name] end bitmap = RPG::Cache.icon(all[i].icon_name) self.contents.blt(0,i*32,bitmap,Rect.new(0, 0, 24, 24)) if indentify == "0" self.contents.draw_text(64,i*32,200,32,"未鉴定") else self.contents.draw_text(64,i*32,200,32,all[i].name) end end end end class Scene_Indentify def main @spriteset = Spriteset_Map.new @window = Window_Item_Indentify.new @help_window = Window_Help.new @help_window.active = false @help_window.y = 0 Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze @help_window.dispose @window.dispose @spriteset.dispose end def update @help_window.update if @window.active window_update end if @help_window.active help_window_update end end def window_update @window.update if Input.trigger?(Input::C) data = @window.all[@window.index] case @window.all[@window.index] when RPG::Item indentify = $game_system.item_indentify_table[data.name] if indentify == "0" indentify = $game_system.item_indentify_table[data.name] = 1 @window.active = false @help_window.active = true @help_window.set_text("鉴定结果"+ data.name ) end when RPG::Weapon indentify = $game_system.weapon_indentify_table[data.name] if indentify == "0" indentify = $game_system.weapon_indentify_table[data.name] = 1 @window.active = false @help_window.active = true @help_window.set_text("鉴定结果"+ data.name ) end when RPG::Armor indentify = $game_system.armor_indentify_table[data.name] if indentify == "0" indentify = $game_system.armor_indentify_table[data.name] = 1 @window.active = false @help_window.active = true @help_window.set_text("鉴定结果"+ data.name ) end end end if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) $scene = Scene_Map.new end end def help_window_update if Input.press?(Input::C) $game_system.se_play($data_system.decision_se) for i in 0..30 Graphics.update end $scene = Scene_Map.new end end end
|
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-11-26 12:36
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.