=begin ◆概要 特定の武器の組み合わせで別の武器に変化させるようにします。 ◆機能 ・CHANGE_COUPLE_WEAPONSで武器の組み合わせを設定すると、その二つの武器を同時に 装備した際、別の武器に変化させるようにします。 ・装備画面で組み合わせを外すこともできます。 ◆仕様 ・0以外は二刀流時のみ可能。0だと「盾なし」も含めることが出来る。 ◆使用上の注意 ・★……エイリアス ●……再定義 ○……新規定義 =end CHANGE_COUPLE_WEAPONS = { # 二つの武器の組み合わせにより出来る一つの武器。 # セイバー二つでツインセイバー、バスタードソードの両手持ちなど。 [10, 0] => 31, [16,32] => 34, [30,33] => 35, } def change_couple_weapons(key) key.collect!{|k|k ? k.id : 0}; key.push(0) if key.size < 2 key.reverse! if CHANGE_COUPLE_WEAPONS[key].nil? return nil if CHANGE_COUPLE_WEAPONS[key].nil? return $data_weapons[CHANGE_COUPLE_WEAPONS[key]] end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :weapons_change #-------------------------------------------------------------------------- # ★ オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_couple initialize; def initialize(actor_id) initialize_couple(actor_id) @weapons_change = false end #-------------------------------------------------------------------------- # ★ 武器オブジェクトの配列取得 #-------------------------------------------------------------------------- alias weapons_couple weapons; def weapons result = change_couple_weapons(weapons_couple) return weapons_couple if !(@armor1_id.zero? || actor.two_swords_style) return weapons_couple if result.nil? or !weapons_change return two_swords_style ? [result, nil] : [result] end #-------------------------------------------------------------------------- # ○ 武器変更の組み合わせか? #-------------------------------------------------------------------------- def weapons_can_change? result1 = weapons; @weapons_change ^= true result2 = weapons; @weapons_change ^= true return result1 != result2 end #-------------------------------------------------------------------------- # ★ 装備の変更 (オブジェクトで指定) # equip_type : 装備部位 (0..4) # item : 武器 or 防具 (nil なら装備解除) # test : テストフラグ (戦闘テスト、または装備画面での一時装備) #-------------------------------------------------------------------------- alias change_equip_couple change_equip def change_equip(equip_type, item, test = false) last_change = @weapons_change ? true : false @weapons_change = false change_equip_couple(equip_type, item, test) @weapons_change = last_change end end #============================================================================== # ■ Window_ChangedWeapon #============================================================================== class Window_ChangedWeapon < Window_Selectable #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, 336, WLH * 2 + 16) self.back_opacity = 255 @actor = $game_party.members[0] end #-------------------------------------------------------------------------- # ○ 項目の描画 #-------------------------------------------------------------------------- def draw_item(actor) self.contents.clear @actor = actor self.contents.font.color = system_color self.contents.draw_text(4, WLH / 2 - 8, 92, WLH, Vocab::weapon) self.contents.font.color = normal_color draw_item_name(actor.weapons[0], 92, WLH / 2 - 8) self.index = 0 end #-------------------------------------------------------------------------- # ○ カーソルの更新 #-------------------------------------------------------------------------- def update_cursor; super; self.cursor_rect.y += 4 end #-------------------------------------------------------------------------- # ○ ヘルプウィンドウの更新 #-------------------------------------------------------------------------- def update_help item = @actor.weapons[0] @help_window.set_text(item == nil ? "" : item.description) end end #============================================================================== # ■ Scene_Equip #============================================================================== class Scene_Equip < Scene_Base #-------------------------------------------------------------------------- # ★ 開始処理 #-------------------------------------------------------------------------- alias start_couple start def start start_couple @change_window = Window_ChangedWeapon.new(208, 56) @change_window.visible = @actor.weapons_change @change_window.active = @actor.weapons_change @change_window.help_window = @help_window @equip_window.active = !@actor.weapons_change @change_window.draw_item(@actor) if @actor.weapons_change change_comannd_set end #-------------------------------------------------------------------------- # ○ コマンドウィンドウのセット #-------------------------------------------------------------------------- def change_comannd_set @change_command = [] @change_command[0] = Window_Command.new(96, ["装備変更","結合"]) @change_command[1] = Window_Command.new(96, ["解除"]) @change_command.each{|window|window.x = 314; window.y = 118 window.openness = 0; window.active = false} end #-------------------------------------------------------------------------- # ★ 終了処理 #-------------------------------------------------------------------------- alias terminate_couple terminate def terminate terminate_couple @change_window.dispose @change_command.each{|window|window.dispose} end #-------------------------------------------------------------------------- # ★ フレーム更新 #-------------------------------------------------------------------------- alias update_couple update def update if @change_window.active update_item_windows update_status_window update_change_window elsif @change_command[0].active update_item_windows update_status_window update_change_command(0) elsif @change_command[1].active update_item_windows update_status_window update_change_command(1) else update_couple if @change_window.visible and (0..1).include?(@equip_window.index) @change_window.active = true @change_window.index = 0 @equip_window.index = 0 @equip_window.active = false @change_window.update_help end end end #-------------------------------------------------------------------------- # ○ 変化装備ウィンドウの更新 #-------------------------------------------------------------------------- def update_change_window @change_window.update if Input.trigger?(Input::C) Sound.play_decision @change_command[1].open; @change_command[1].active = true @change_window.active = false elsif Input.trigger?(Input::R) Sound.play_cursor next_actor elsif Input.trigger?(Input::L) Sound.play_cursor prev_actor elsif Input.trigger?(Input::DOWN) Sound.play_cursor @equip_window.active = true @equip_window.index = 2 @change_window.index = -1 @change_window.active = false elsif Input.trigger?(Input::UP) Sound.play_cursor @equip_window.active = true @equip_window.index = 4 @change_window.index = -1 @change_window.active = false end end #-------------------------------------------------------------------------- # ○ 変化装備コマンドの更新 #-------------------------------------------------------------------------- def update_change_command(key) if key.zero? @change_command[0].update if Input.trigger?(Input::C) if @change_command[0].index.zero? Sound.play_decision @item_window.active = true @item_window.index = 0 else Sound.play_equip @actor.weapons_change = true @change_window.visible = true @change_window.active = true @equip_window.index = 0 @change_window.draw_item(@actor) update_item_windows end @status_window.refresh @change_command[0].close while !@change_command[0].openness.zero? do@change_command[0].update end @change_command[0].active = false @change_command[0].visible = false @change_command[0].active = false elsif Input.trigger?(Input::B) Sound.play_cancel @equip_window.active = true @change_command[0].active = false @change_command[0].close while !@change_command[0].openness.zero? do@change_command[0].update end @change_command[0].active = false @change_command[0].visible = false @change_command[0].active = false end else @change_command[1].update if Input.trigger?(Input::C) Sound.play_equip @actor.weapons_change = false @status_window.refresh @equip_window.active = true @change_command[1].close while !@change_command[1].openness.zero? do @change_command[1].update end @change_command[1].active = false @change_window.visible = false elsif Input.trigger?(Input::B) Sound.play_cancel @change_window.active = true @change_command[1].active = false @change_command[1].close while !@change_command[1].openness.zero? do @change_command[1].update end @change_command[1].active = false end end end #-------------------------------------------------------------------------- # ★ ステータスウィンドウの更新 #-------------------------------------------------------------------------- alias update_status_window_couple update_status_window def update_status_window if @change_window.active @status_window.set_new_parameters(nil, nil, nil, nil) elsif @change_command[0].active or @change_command[1].active if !@change_command[0].index.zero? or @change_command[1].active temp_actor = @actor.clone temp_actor.weapons_change = @change_command[0].active new_atk = temp_actor.atk; new_def = temp_actor.def new_spi = temp_actor.spi; new_agi = temp_actor.agi @status_window.set_new_parameters(new_atk, new_def, new_spi, new_agi) else @status_window.set_new_parameters(nil, nil, nil, nil) end end @status_window.refresh update_status_window_couple end #-------------------------------------------------------------------------- # ★ アイテムウィンドウの更新 #-------------------------------------------------------------------------- alias update_item_windows_couple update_item_windows def update_item_windows update_item_windows_couple if @change_window.active @item_windows[0].visible = @change_window.active @item_windows[0].update @item_window = @item_windows[0] end end #-------------------------------------------------------------------------- # ★ 装備部位選択の更新 #-------------------------------------------------------------------------- alias update_equip_selection_couple update_equip_selection def update_equip_selection update_equip_selection_couple if Input.trigger?(Input::C) if (0..1).include?(@equip_window.index) && @actor.weapons_can_change? @item_window.index = -1 @item_window.active = false @change_command[0].visible = true @change_command[0].active = true @change_command[0].open end end end #-------------------------------------------------------------------------- # ★ アイテム選択の更新 #-------------------------------------------------------------------------- alias update_item_selection_couple update_item_selection def update_item_selection update_item_selection_couple if Input.trigger?(Input::C) if (0..1).include?(@equip_window.index) && @actor.weapons_can_change? @actor.weapons_change = true; @change_window.visible = true @change_window.active = true; @equip_window.index = 0 @equip_window.active = false @change_window.draw_item(@actor); @change_window.update_help end @status_window.refresh update_item_windows end end end