#============================================================================== # ■ Harts_Window_EquipTitle #------------------------------------------------------------------------------ #  装備画面で、タイトルを表示するウィンドウ。 #============================================================================== class Harts_Window_EquipTitle < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, 160, 64) self.contents = Bitmap.new(width - 32, height - 32) self.contents.clear self.contents.font.color = normal_color self.contents.draw_text(4, 0, 120, 32, $data_system.words.equip, 1) end end #============================================================================== # ■ Harts_Window_EquipCommand #------------------------------------------------------------------------------ #  装備の選択を行うウィンドウです。 #============================================================================== class Harts_Window_EquipCommand < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(160, 0, 480, 64) self.contents = Bitmap.new(width - 32, height - 32) @item_max = 3 @column_max = 3 @commands = ["装備", "最強装備", "終わる"] refresh self.index = 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max draw_item(i, normal_color) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 # color : 文字色 #-------------------------------------------------------------------------- def draw_item(index, color) self.contents.font.color = color x = index * 160 + 4 self.contents.draw_text(x, 0, 128, 32, @commands[index], 1) end end #============================================================================== # ■ Harts_Window_EquipItem #------------------------------------------------------------------------------ #  装備画面で、装備変更の候補となるアイテムの一覧を表示するウィンドウです。 #============================================================================== class Harts_Window_EquipItem < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター # equip_type : 装備部位 (0〜3) #-------------------------------------------------------------------------- def initialize(actor, equip_type) super(272, 256, 368, 160) @actor = actor @equip_type = equip_type @column_max = 1 refresh self.active = false self.index = -1 end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # ● 最強アイテムのid取得 #-------------------------------------------------------------------------- def max_item_id if @equip_type == 0 if @actor.weapon_id == 0 max = 0 else max = $data_weapons[@actor.weapon_id].atk end elsif @equip_type == 1 if @actor.armor1_id == 0 max = 0 else max = $data_armors[@actor.armor1_id].pdef end elsif @equip_type == 2 if @actor.armor2_id == 0 max = 0 else max = $data_armors[@actor.armor2_id].pdef end elsif @equip_type == 3 if @actor.armor3_id == 0 max = 0 else max = $data_armors[@actor.armor3_id].pdef end end for i in 0...@data.size-1 if @equip_type == 0 if max <= $data_weapons[@data[i].id].atk max = $data_weapons[@data[i].id].atk item_id = @data[i].id end elsif @equip_type >= 1 if max <= $data_armors[@data[i].id].pdef max = $data_armors[@data[i].id].pdef item_id = @data[i].id end end end return item_id end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] # 装備可能な武器を追加 if @equip_type == 0 weapon_set = $data_classes[@actor.class_id].weapon_set for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 and weapon_set.include?(i) @data.push($data_weapons[i]) end end end # 装備可能な防具を追加 if @equip_type >= 1 armor_set = $data_classes[@actor.class_id].armor_set for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 and armor_set.include?(i) if $data_armors[i].kind == @equip_type-1 @data.push($data_armors[i]) end end end end # 空白を追加 @data.push(nil) # ビットマップを作成し、全項目を描画 @item_max = @data.size self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max-1 draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] x = 4 y = index * 32 case item when RPG::Weapon number = $game_party.weapon_number(item.id) when RPG::Armor number = $game_party.armor_number(item.id) 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 self.contents.draw_text(x + 28, y, 212, 32, item.name, 0) self.contents.draw_text(x + 280, y, 16, 32, ":", 1) self.contents.draw_text(x + 296, y, 24, 32, number.to_s, 2) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(self.item == nil ? "" : self.item.description) end end #============================================================================== # ■ Harts_Window_EquipLeft #------------------------------------------------------------------------------ #  装備画面で、アクターのパラメータ変化を表示するウィンドウです。 #============================================================================== class Harts_Window_EquipLeft < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター #-------------------------------------------------------------------------- def initialize(actor) super(0, 64, 272, 352) self.contents = Bitmap.new(width - 32, height - 32) @actor = actor refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear draw_actor_graphic(@actor, 32, 64) draw_actor_name(@actor, 4 + 96, 0) draw_actor_level(@actor, 4 + 96, 32) draw_actor_parameter(@actor, 4, 80, 0) draw_actor_parameter(@actor, 4, 112, 1) draw_actor_parameter(@actor, 4, 144, 2) draw_actor_parameter(@actor, 4, 192, 3) draw_actor_parameter(@actor, 4, 224, 4) draw_actor_parameter(@actor, 4, 256, 5) draw_actor_parameter(@actor, 4, 288, 6) if @new_atk != nil and @new_atk != @actor.atk if @new_atk > @actor.atk self.contents.font.color = system_color else self.contents.font.color = disabled_color end self.contents.draw_text(160, 80, 40, 32, "→", 1) self.contents.draw_text(200, 80, 36, 32, @new_atk.to_s, 2) end if @new_pdef != nil and @new_pdef != @actor.pdef if @new_pdef > @actor.pdef self.contents.font.color = system_color else self.contents.font.color = disabled_color end self.contents.draw_text(160, 112, 40, 32, "→", 1) self.contents.draw_text(200, 112, 36, 32, @new_pdef.to_s, 2) end if @new_mdef != nil and @new_mdef != @actor.mdef if @new_mdef > @actor.mdef self.contents.font.color = system_color else self.contents.font.color = disabled_color end self.contents.draw_text(160, 144, 40, 32, "→", 1) self.contents.draw_text(200, 144, 36, 32, @new_mdef.to_s, 2) end if @new_str != nil and @new_str != @actor.str if @new_str > @actor.str self.contents.font.color = system_color else self.contents.font.color = disabled_color end self.contents.draw_text(160, 192, 40, 32, "→", 1) self.contents.draw_text(200, 192, 36, 32, @new_str.to_s, 2) end if @new_dex != nil and @new_dex != @actor.dex if @new_dex > @actor.dex self.contents.font.color = system_color else self.contents.font.color = disabled_color end self.contents.draw_text(160, 224, 40, 32, "→", 1) self.contents.draw_text(200, 224, 36, 32, @new_dex.to_s, 2) end if @new_agi != nil and @new_agi != @actor.agi if @new_agi > @actor.agi self.contents.font.color = system_color else self.contents.font.color = disabled_color end self.contents.draw_text(160, 256, 40, 32, "→", 1) self.contents.draw_text(200, 256, 36, 32, @new_agi.to_s, 2) end if @new_int != nil and @new_int != @actor.int if @new_int > @actor.int self.contents.font.color = system_color else self.contents.font.color = disabled_color end self.contents.draw_text(160, 288, 40, 32, "→", 1) self.contents.draw_text(200, 288, 36, 32, @new_int.to_s, 2) end end #-------------------------------------------------------------------------- # ● 装備変更後のパラメータ設定 # new_atk : 装備変更後の攻撃力 # new_pdef : 装備変更後の物理防御 # new_mdef : 装備変更後の魔法防御 #-------------------------------------------------------------------------- def set_new_parameters(new_atk, new_pdef, new_mdef, new_str, new_dex, new_agi, new_int) if @new_atk != new_atk or @new_pdef != new_pdef or @new_mdef != new_mdef or @new_str != new_str or @new_dex != new_dex or @new_agi != new_agi or @new_int != new_int @new_atk = new_atk @new_pdef = new_pdef @new_mdef = new_mdef @new_str = new_str @new_dex = new_dex @new_agi = new_agi @new_int = new_int refresh end end end #============================================================================== # ■ Harts_Scene_Equip #------------------------------------------------------------------------------ #  装備画面の処理を行うクラスです。 #============================================================================== class Scene_Equip #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor_index : アクターインデックス # equip_index : 装備インデックス #-------------------------------------------------------------------------- def initialize(actor_index = 0, equip_index = -1, command_index = 0, equip_active = false, command_active = true) @actor_index = actor_index @equip_index = equip_index @command_index = command_index @equip_active = equip_active @command_active = command_active end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # アクターを取得 @actor = $game_party.actors[@actor_index] # ウィンドウを作成 @title_window = Harts_Window_EquipTitle.new @command_window = Harts_Window_EquipCommand.new @help_window = Window_Help.new @help_window.y = 416 @left_window = Harts_Window_EquipLeft.new(@actor) @right_window = Window_EquipRight.new(@actor) @item_window0 = Harts_Window_EquipItem.new(@actor, -1) @item_window1 = Harts_Window_EquipItem.new(@actor, 0) @item_window2 = Harts_Window_EquipItem.new(@actor, 1) @item_window3 = Harts_Window_EquipItem.new(@actor, 2) @item_window4 = Harts_Window_EquipItem.new(@actor, 3) @item_window5 = Harts_Window_EquipItem.new(@actor, 4) # ヘルプウィンドウを関連付け @right_window.help_window = @help_window @item_window0.help_window = @help_window @item_window1.help_window = @help_window @item_window2.help_window = @help_window @item_window3.help_window = @help_window @item_window4.help_window = @help_window @item_window5.help_window = @help_window # カーソル位置を設定 @command_window.index = @command_index @right_window.index = @equip_index # アクティブウィンドウを設定 @command_window.active = @command_active @right_window.active = @equip_active refresh # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウを解放 @title_window.dispose @command_window.dispose @help_window.dispose @left_window.dispose @right_window.dispose @item_window0.dispose @item_window1.dispose @item_window2.dispose @item_window3.dispose @item_window4.dispose @item_window5.dispose end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh # アイテムウィンドウの可視状態設定 @item_window0.visible = (@right_window.index == -1) @item_window1.visible = (@right_window.index == 0) @item_window2.visible = (@right_window.index == 1) @item_window3.visible = (@right_window.index == 2) @item_window4.visible = (@right_window.index == 3) @item_window5.visible = (@right_window.index == 4) # 現在装備中のアイテムを取得 item1 = @right_window.item # 現在のアイテムウィンドウを @item_window に設定 case @right_window.index when -1 @item_window = @item_window0 when 0 @item_window = @item_window1 when 1 @item_window = @item_window2 when 2 @item_window = @item_window3 when 3 @item_window = @item_window4 when 4 @item_window = @item_window5 end # ライトウィンドウがアクティブの場合 if @right_window.active # 装備変更後のパラメータを消去 @left_window.set_new_parameters(nil, nil, nil, nil, nil, nil, nil) end # アイテムウィンドウがアクティブの場合 if @item_window.active # 現在選択中のアイテムを取得 item2 = @item_window.item # 装備を変更 last_hp = @actor.hp last_sp = @actor.sp @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id) # 装備変更後のパラメータを取得 new_atk = @actor.atk new_pdef = @actor.pdef new_mdef = @actor.mdef new_str = @actor.str new_dex = @actor.dex new_agi = @actor.agi new_int = @actor.int # 装備を戻す @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id) @actor.hp = last_hp @actor.sp = last_sp # レフトウィンドウに描画 @left_window.set_new_parameters(new_atk, new_pdef, new_mdef, new_str, new_dex, new_agi, new_int) end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ウィンドウを更新 @title_window.update @command_window.update @left_window.update @right_window.update @item_window.update refresh # コマンドウィンドウがアクティブの場合: update_command を呼ぶ if @command_window.active update_command return end # ライトウィンドウがアクティブの場合: update_right を呼ぶ if @right_window.active update_right return end # アイテムウィンドウがアクティブの場合: update_item を呼ぶ if @item_window.active update_item return end end #-------------------------------------------------------------------------- # ● フレーム更新 (コマンドウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_command # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # メニュー画面に切り替え $scene = Scene_Menu.new(2) return end # C ボタンが押された場合 if Input.trigger?(Input::C) case @command_window.index # 装備の場合 when 0 # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # ライトウィンドウをアクティブ化 @right_window.active = true @command_window.active = false @right_window.index = 0 @command_window.index = -1 return # 最強装備の場合  when 1 # 装備 SE を演奏 $game_system.se_play($data_system.equip_se) # 最強装備の取得 max_weapon_id = @item_window1.max_item_id max_armor1_id = @item_window2.max_item_id max_armor2_id = @item_window3.max_item_id max_armor3_id = @item_window4.max_item_id # 最強装備実行 @actor.equip(0, max_weapon_id) @actor.equip(1, max_armor1_id) @actor.equip(2, max_armor2_id) @actor.equip(3, max_armor3_id) # ライトウィンドウ、アイテムウィンドウの内容を再作成 @right_window.refresh @left_window.refresh @item_window1.refresh @item_window2.refresh @item_window3.refresh @item_window4.refresh return #終わるの場合 when 2 # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # メニュー画面に切り替え $scene = Scene_Menu.new(2) return end end # R ボタンが押された場合 if Input.trigger?(Input::R) # カーソル SE を演奏 $game_system.se_play($data_system.cursor_se) # 次のアクターへ @actor_index += 1 @actor_index %= $game_party.actors.size # 別の装備画面に切り替え $scene = Scene_Equip.new(@actor_index, @right_window.index, @command_window.index) return end # L ボタンが押された場合 if Input.trigger?(Input::L) # カーソル SE を演奏 $game_system.se_play($data_system.cursor_se) # 前のアクターへ @actor_index += $game_party.actors.size - 1 @actor_index %= $game_party.actors.size # 別の装備画面に切り替え $scene = Scene_Equip.new(@actor_index, @right_window.index, @command_window.index) return end end #-------------------------------------------------------------------------- # ● フレーム更新 (ライトウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_right # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # コマンドウィンドウをアクティブ化 @right_window.active = false @command_window.active = true @right_window.index = -1 @command_window.index = 0 return end # C ボタンが押された場合 if Input.trigger?(Input::C) # 装備固定の場合 if @actor.equip_fix?(@right_window.index) # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # アイテムウィンドウをアクティブ化 @right_window.active = false @item_window.active = true @item_window.index = 0 return end # R ボタンが押された場合 if Input.trigger?(Input::R) # カーソル SE を演奏 $game_system.se_play($data_system.cursor_se) # 次のアクターへ @actor_index += 1 @actor_index %= $game_party.actors.size # 別の装備画面に切り替え $scene = Scene_Equip.new(@actor_index, @right_window.index, @command_window.index, true, false) return end # L ボタンが押された場合 if Input.trigger?(Input::L) # カーソル SE を演奏 $game_system.se_play($data_system.cursor_se) # 前のアクターへ @actor_index += $game_party.actors.size - 1 @actor_index %= $game_party.actors.size # 別の装備画面に切り替え $scene = Scene_Equip.new(@actor_index, @right_window.index, @command_window.index, true, false) return end end #-------------------------------------------------------------------------- # ● フレーム更新 (アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- 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) # 装備 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