#============================================================================== # ■ メンバー入れ替え(メニュー) by Claimh #------------------------------------------------------------------------------ # ・要:パーティー拡張、動くアクター(基本セット) # ・パーティーメンバーの入れ替えができます。(非戦闘中) #============================================================================== #============================================================================== # ■ Window_PartyChangeMain #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、戦闘メンバー画面です。 #============================================================================== class Window_PartyChangeMain < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, 640-180, 150) self.contents = Bitmap.new(width - 32, height - 32) @item_max = $game_party.actors.size @column_max = $game_party.actors.size self.index = 0 @actor_sprite = [] for i in 0...$game_party.actors.size actor = $game_party.actors[i] x = i % 4 * (440 / 4) + 62 y = (i / 4).truncate + 112 @actor_sprite[actor.id] = Sprite_MoveActor.new(nil, actor) @actor_sprite[actor.id].x = x @actor_sprite[actor.id].y = y @actor_sprite[actor.id].z = 160 @actor_sprite[actor.id].move_type = 0 @actor_sprite[actor.id].move_stop = true @actor_sprite[actor.id].update end refresh update_cursor_rect end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...$game_party.actors.size actor = $game_party.actors[i] x = i % 4 * (440 / 4) + 4 y = (i / 4).truncate + 95 self.contents.draw_text(x, y-95, self.width / 4 - 40, 32, actor.name,2) end x = @index * 110 + 4 self.cursor_rect.set(x, 30, self.width / 4 - 32, 80) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_info($game_party.actors[self.index]) end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if @index < 0 or !self.active self.cursor_rect.empty else x = @index * 110 + 4 y = 30 self.cursor_rect.set(x, y, self.width / 4 - 32, 80) end return if @actor_sprite.nil? for i in 0...$game_party.actors.size actor = $game_party.actors[i] next if @actor_sprite[actor.id].nil? if actor.already_change @actor_sprite[actor.id].move_type = 1 @actor_sprite[actor.id].move_stop = false elsif i == self.index @actor_sprite[actor.id].move_type = 0 @actor_sprite[actor.id].move_stop = false else @actor_sprite[actor.id].move_stop = true end end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super for actor in $game_party.actors @actor_sprite[actor.id].update end end #-------------------------------------------------------------------------- # ● 動くアクタースプライト消去 #-------------------------------------------------------------------------- def dispose super for actor in $game_party.actors @actor_sprite[actor.id].dispose end end #-------------------------------------------------------------------------- # ● アクター交換イベント更新 #-------------------------------------------------------------------------- def actor_change if self.index == $game_party.actors.size and self.active @index = $game_party.actors.size - 1 end # スプライト張替え for i in 0...$game_party.actors.size actor = $game_party.actors[i] x = i % 4 * (440 / 4) + 62 y = (i / 4).truncate + 112 @actor_sprite[actor.id] = Sprite_MoveActor.new(nil, actor) @actor_sprite[actor.id].x = x @actor_sprite[actor.id].y = y @actor_sprite[actor.id].z = 160 @actor_sprite[actor.id].move_type = 0 @actor_sprite[actor.id].move_stop = true @actor_sprite[actor.id].update end @item_max = $game_party.actors.size @column_max = $game_party.actors.size refresh end #-------------------------------------------------------------------------- # ● アクター交換イベント更新 #-------------------------------------------------------------------------- def actor_dispose for actor in $game_party.actors @actor_sprite[actor.id].dispose end end end #============================================================================== # ■ Window_PartyInfoMain #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、選択中アクターの情報ウィンドウです。 #============================================================================== class Window_PartyInfoMain < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(640-180, 0, 180, (480-64)/2) self.contents = Bitmap.new(width - 32, height - 32) @actor = $game_party.actors[0] refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear return if @actor == nil draw_actor_name(@actor, 0, 0) draw_actor_level(@actor, 80, 32) draw_actor_class(@actor, 0, 64) draw_actor_hp(@actor, 0, 96) draw_actor_sp(@actor, 0, 128) end #-------------------------------------------------------------------------- # ● アクター更新 #-------------------------------------------------------------------------- def set_info(actor) # アクター更新 if actor != @actor @actor = actor refresh end end end #============================================================================== # ■ Window_PartyChangeSub #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、待機メンバー画面です。 #============================================================================== class Window_PartyChangeSub < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 150, 640-180, 480-150-64) self.contents = Bitmap.new(width - 32, height - 32) self.index = -1 @item_max = $game_party.sub_actors.size if $game_party.sub_actors.size <= 4 @column_max = $game_party.sub_actors.size else @column_max = 4 end @sub_actor_sprite = [] for i in 0...$game_party.sub_actors.size actor = $game_party.sub_actors[i] x = i % 4 * (440 / 4) + 62 y = (i / 4).truncate * 110 + 262 @sub_actor_sprite[actor.id] = Sprite_MoveActor.new(nil, actor) @sub_actor_sprite[actor.id].x = x @sub_actor_sprite[actor.id].y = y @sub_actor_sprite[actor.id].z = 160 @sub_actor_sprite[actor.id].move_type = 0 @sub_actor_sprite[actor.id].move_stop = true @sub_actor_sprite[actor.id].update end refresh update_cursor_rect end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear return if $game_party.sub_actors.size == 0 for i in 0...$game_party.sub_actors.size actor = $game_party.sub_actors[i] x = i % 4 * 110 + 4 y = (i / 4).truncate * 110 + 95 self.contents.draw_text(x, y-95, self.width / 4 - 40, 32, actor.name,2) end x = @index % 4 * 110 + 4 y = (@index / 4).truncate * 110 + 30 self.cursor_rect.set(x, y, self.width / 4 - 32, 80) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_info($game_party.sub_actors[self.index]) end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if @index < 0 or !self.active self.cursor_rect.empty else x = @index % 4 * 110 + 4 y = (@index / 4).truncate * 110 + 30 self.cursor_rect.set(x, y, self.width / 4 - 32, 80) end return if @sub_actor_sprite.nil? for i in 0...$game_party.sub_actors.size actor = $game_party.sub_actors[i] next if @sub_actor_sprite[actor.id].nil? if actor.already_change @sub_actor_sprite[actor.id].move_type = 1 @sub_actor_sprite[actor.id].move_stop = false elsif i == self.index @sub_actor_sprite[actor.id].move_type = 0 @sub_actor_sprite[actor.id].move_stop = false else @sub_actor_sprite[actor.id].move_stop = true end end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super for actor in $game_party.sub_actors @sub_actor_sprite[actor.id].update end end #-------------------------------------------------------------------------- # ● 動くアクタースプライト消去 #-------------------------------------------------------------------------- def dispose super for actor in $game_party.sub_actors @sub_actor_sprite[actor.id].dispose end end #-------------------------------------------------------------------------- # ● アクター交換イベント更新 #-------------------------------------------------------------------------- def actor_change if self.index == $game_party.sub_actors.size and self.active @index = $game_party.sub_actors.size - 1 end # スプライト張替え for i in 0...$game_party.sub_actors.size actor = $game_party.sub_actors[i] x = i % 4 * (440 / 4) + 62 y = (i / 4).truncate * 110 + 262 @sub_actor_sprite[actor.id] = Sprite_MoveActor.new(nil, actor) @sub_actor_sprite[actor.id].x = x @sub_actor_sprite[actor.id].y = y @sub_actor_sprite[actor.id].z = 160 @sub_actor_sprite[actor.id].move_type = 0 @sub_actor_sprite[actor.id].move_stop = true @sub_actor_sprite[actor.id].update end @item_max = $game_party.sub_actors.size if $game_party.sub_actors.size <= 4 @column_max = $game_party.sub_actors.size else @column_max = 4 end refresh end #-------------------------------------------------------------------------- # ● アクター交換イベント更新 #-------------------------------------------------------------------------- def actor_dispose for actor in $game_party.sub_actors @sub_actor_sprite[actor.id].dispose end end end #============================================================================== # ■ Window_PartyInfoSub #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、選択中アクターの情報ウィンドウです。 #============================================================================== class Window_PartyInfoSub < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(640-180, (480-64)/2, 180, (480-64)/2) self.contents = Bitmap.new(width - 32, height - 32) @actor = nil refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear return if @actor == nil draw_actor_name(@actor, 0, 0) draw_actor_level(@actor, 80, 32) draw_actor_class(@actor, 0, 64) draw_actor_hp(@actor, 0, 96) draw_actor_sp(@actor, 0, 128) end #-------------------------------------------------------------------------- # ● アクター更新 #-------------------------------------------------------------------------- def set_info(actor) # アクター更新 if actor != @actor @actor = actor refresh end end end #============================================================================== # ■ Window_Party_Notice #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、案内用のウィンドウです。 #============================================================================== class Window_Party_Notice < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター #-------------------------------------------------------------------------- def initialize super(0, 480-64, 640, 64) self.contents = Bitmap.new(width - 32, height - 32) @type = 0 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = system_color if @type == 1 self.contents.draw_text(4, 0, 200, 32, "A:戦闘メンバーへ") else self.contents.draw_text(4, 0, 200, 32, "A:待機メンバーへ") end self.contents.draw_text(200, 0, 220, 32, "C:メンバー入れ替え") self.contents.draw_text(420, 0, 150, 32, "B:メニューに戻る") end #-------------------------------------------------------------------------- # ● 表示タイプ切り替え #-------------------------------------------------------------------------- def change_type(type) if type != @type @type = type refresh end end end #============================================================================== # ■ Scene_PartyChange #------------------------------------------------------------------------------ #  メンバー交換画面の制御を行います。 #============================================================================== class Scene_PartyChange #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # ウィンドウを作成 @main_window = Window_PartyChangeMain.new @main_info_window = Window_PartyInfoMain.new @sub_window = Window_PartyChangeSub.new @sub_info_window = Window_PartyInfoSub.new @notice_window = Window_Party_Notice.new # ヘルプウィンドウを関連付け @main_window.help_window = @main_info_window @choice = false @ch_actor = nil @main_window.active = true @sub_window.active = false # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウを解放 @main_window.dispose @main_info_window.dispose @sub_window.dispose @sub_info_window.dispose @notice_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update @sub_window_index = @sub_window.index # ウィンドウを更新 @main_window.update @sub_window.update # メインウィンドウがアクティブの場合: update_main を呼ぶ if @main_window.active @notice_window.change_type(0) update_main return end # サブウィンドウがアクティブの場合: update_sub を呼ぶ if @sub_window.active @notice_window.change_type(1) update_sub return end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_main # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # 選択中 if @choice # 選択中フラグOFF @choice = false @ch_actor.already_change = false @ch_actor = nil @main_window.help_window = @main_info_window @main_info_window.set_info($game_party.actors[@main_window.index]) @sub_info_window.set_info(nil) @main_info_window.update @sub_info_window.update else # マップ画面に切り替え $scene = Scene_Map.new end return end # C ボタンが押された場合 if Input.trigger?(Input::C) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # パーティー入れ替え if @choice @main_window.actor_dispose @sub_window.actor_dispose actor2 = $game_party.actors[@main_window.index] $game_party.change_actors(@ch_actor.id, actor2.id) # 選択中フラグOFF @choice = false @ch_actor.already_change = false @ch_actor = nil @main_window.help_window = @main_info_window @main_info_window.set_info($game_party.actors[@main_window.index]) @sub_info_window.set_info(nil) @main_window.actor_change @sub_window.actor_change @main_info_window.update @sub_info_window.update return end # 選択中に移行 @choice = true # 交換対象アクター @ch_actor = $game_party.actors[@main_window.index] @ch_actor.already_change = true @sub_window.help_window = @sub_indo_window @main_window.help_window = @sub_info_window @main_window.refresh @sub_info_window.set_info($game_party.actors[@main_window.index]) @sub_info_window.update return end # 主要メンバーからはずす if Input.trigger?(Input::A) # 待機メンバーに空きがある if $game_party.sub_actors.size < Party_Extend::SUB_MEMBER # 主要メンバーが空になる場合は不可 if $game_party.actors.size == 1 # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @main_window.actor_dispose @sub_window.actor_dispose actor = $game_party.actors[@main_window.index] $game_party.remove_actor(actor.id) $game_party.sub_actors.push(actor) @main_window.actor_change @sub_window.actor_change else # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) end return end # サブウィンドウ切り替え if Input.trigger?(Input::DOWN) if $game_party.sub_actors.size != 0 # カーソルSE $game_system.se_play($data_system.cursor_se) if @main_window.index <= ($game_party.sub_actors.size-1) @sub_window.index = @main_window.index else @sub_window.index = $game_party.sub_actors.size-1 end @main_window.help_window = nil if @choice @sub_window.help_window = @sub_info_window else @sub_window.help_window = @main_info_window end @main_window.active = false @main_window.index = -1 @sub_window.active = true end return end end #-------------------------------------------------------------------------- # ● フレーム更新 (サブウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_sub # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # 選択中 if @choice # 選択中フラグOFF @choice = false @ch_actor.already_change = false @ch_actor = nil @sub_window.help_window = @main_info_window @main_info_window.set_info($game_party.sub_actors[@sub_window.index]) @sub_info_window.set_info(nil) @main_info_window.update @sub_info_window.update else # マップ画面に切り替え $scene = Scene_Map.new end return end # C ボタンが押された場合 if Input.trigger?(Input::C) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # パーティー入れ替え if @choice @main_window.actor_dispose @sub_window.actor_dispose actor2 = $game_party.sub_actors[@sub_window.index] $game_party.change_actors(@ch_actor.id, actor2.id) # 選択中フラグOFF @choice = false @ch_actor.already_change = false @ch_actor = nil @sub_window.help_window = @main_info_window @main_info_window.set_info($game_party.sub_actors[@sub_window.index]) @sub_info_window.set_info(nil) @main_window.actor_change @sub_window.actor_change @main_info_window.update @sub_info_window.update return end # 選択中に移行 @choice = true # 交換対象アクター @ch_actor = $game_party.sub_actors[@sub_window.index] @ch_actor.already_change = true @main_window.help_window = @sub_info_window @sub_window.help_window = @sub_indo_window @main_window.refresh @sub_info_window.set_info($game_party.sub_actors[@sub_window.index]) @sub_info_window.update return end # 主要メンバーに加える if Input.trigger?(Input::A) # 主要メンバーに空きがある if $game_party.actors.size < Party_Extend::MAIN_MEMBER # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @main_window.actor_dispose @sub_window.actor_dispose actor = $game_party.sub_actors[@sub_window.index] $game_party.remove_actor(actor.id) $game_party.actors.push(actor) @main_window.actor_change @sub_window.actor_change # 待機メンバーが空になる場合はメインウィンドウに移行 if $game_party.sub_actors.size == 0 chenge_main_window end else # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) end return end # メインウィンドウ切り替え if Input.trigger?(Input::UP) if @sub_window_index < 4 chenge_main_window end return end end #-------------------------------------------------------------------------- # ● メインウィンドウ切り替え #-------------------------------------------------------------------------- def chenge_main_window # カーソルSE $game_system.se_play($data_system.cursor_se) if @sub_window.index <= ($game_party.actors.size-1) @main_window.index = @sub_window.index else @main_window.index = $game_party.actors.size-1 end @sub_window.index = -1 @sub_window.help_window = nil if @choice @main_window.help_window = @sub_info_window else @main_window.help_window = @main_info_window end @main_window.active = true @sub_window.active = false end end