#============================================================================== # ■ XP-RGSS-36 メンバー入れ替え [Ver1.1.1] by Claimh #------------------------------------------------------------------------------ #・要:パーティー拡張、動くアクター(基本セット) #・パーティーメンバーの入れ替えができます。(非戦闘中) #============================================================================== #============================================================================== # ■ Window_PartyChangeMain #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、戦闘メンバー画面です。 #============================================================================== class Window_PartyChangeMain < Window_Selectable #-------------------------------------------------------------------------- # ● window type #-------------------------------------------------------------------------- def type return 0 end #-------------------------------------------------------------------------- # ● ウィンドウ矩形 #-------------------------------------------------------------------------- def rect return Rect.new(0, 0, 640-180, 150) end #-------------------------------------------------------------------------- # ● アクター配列 #-------------------------------------------------------------------------- def actors return $game_party.actors end #-------------------------------------------------------------------------- # ● 最大数更新 #-------------------------------------------------------------------------- def update_max @item_max = actors.size @column_max = actors.size < 4 ? actors.size : 4 end #-------------------------------------------------------------------------- # ● アクタースプライトのY座標オフセット #-------------------------------------------------------------------------- def sprite_y_offset return 112 end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @actor_sprite = [] super(rect.x, rect.y, rect.width, rect.height) self.contents = Bitmap.new(width - 32, height - 32) actor_change self.index = -1 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...actors.size actor = actors[i] x = i % 4 * (self.contents.width / 4) y = (i / 4).truncate * 110 + 95 self.contents.font.color = actor.ch_lock ? disabled_color : normal_color self.contents.draw_text(x, y-95, self.contents.width / 4, 32, actor.name, 1) end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_info(actors[self.index]) end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if @index < 0 or !self.active self.cursor_rect.empty else x = @index % 4 * (self.contents.width / 4) y = (@index / 4).truncate * 110 + 30 self.cursor_rect.set(x, y, self.contents.width / 4, 80) end return if @actor_sprite.nil? for i in 0...actors.size actor = actors[i] next if @actor_sprite[actor.id].nil? or @actor_sprite[actor.id].disposed? 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 if self.active for sprite in @actor_sprite sprite.update unless sprite.nil? or sprite.disposed? end end #-------------------------------------------------------------------------- # ● 消去 #-------------------------------------------------------------------------- def dispose super actor_dispose end #-------------------------------------------------------------------------- # ● アクター交換イベント更新 #-------------------------------------------------------------------------- def actor_change if self.index == actors.size and self.active @index = actors.size - 1 end # スプライト張替え for i in 0...actors.size actor = actors[i] x = i % 4 * (self.contents.width / 4) + (self.contents.width / 8 + 16) y = (i / 4).truncate * 110 + sprite_y_offset @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 update_max refresh end #-------------------------------------------------------------------------- # ● アクター消去 #-------------------------------------------------------------------------- def actor_dispose for actor in actors @actor_sprite[actor.id].dispose end end end #============================================================================== # ■ Window_PartyChangeSub #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、待機メンバー画面です。 #============================================================================== class Window_PartyChangeSub < Window_PartyChangeMain #-------------------------------------------------------------------------- # ● window type #-------------------------------------------------------------------------- def type return 1 end #-------------------------------------------------------------------------- # ● ウィンドウ矩形 #-------------------------------------------------------------------------- def rect return Rect.new(0, 150, 640-180, 480-150-64) end #-------------------------------------------------------------------------- # ● アクター配列 #-------------------------------------------------------------------------- def actors return $game_party.sub_actors end #-------------------------------------------------------------------------- # ● アクタースプライトのY座標オフセット #-------------------------------------------------------------------------- def sprite_y_offset return 262 end end #============================================================================== # ■ Window_PartyInfo #------------------------------------------------------------------------------ #  メンバー交換画面で表示する、選択中アクターの情報ウィンドウです。 #============================================================================== class Window_PartyInfo < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(640-180, 0, 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) self.contents.font.color = system_color @type = 0 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear text = @type == 0 ? "A:待機メンバーへ" : "A:戦闘メンバーへ" self.contents.draw_text(4, 0, 200, 32, text) self.contents.draw_text(200, 0, 220, 32, "C:メンバー入れ替え") self.contents.draw_text(420, 0, 170, 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_window.index = 0 @sub_window = Window_PartyChangeSub.new @main_info_window = Window_PartyInfo.new @sub_info_window = Window_PartyInfo.new @sub_info_window.y = (480-64)/2 @notice_window = Window_Party_Notice.new # 初期設定 @ch_actor = nil @main_window.active = true @sub_window.active = false @active_window = @main_window @sleep_window = @sub_window clear_temp # トランジション実行 Graphics.transition # メインループ loop do Graphics.update;Input.update;update break if $scene != self end # トランジション準備 Graphics.freeze # ウィンドウを解放 @main_window.dispose @sub_window.dispose @main_info_window.dispose @sub_info_window.dispose @notice_window.dispose end #-------------------------------------------------------------------------- # ● 変数のクリア #-------------------------------------------------------------------------- def clear_temp @choice = false unless @ch_actor.nil? @ch_actor.already_change = false @ch_actor = nil end @active_window.help_window = @main_info_window @sub_info_window.set_info(nil) end #-------------------------------------------------------------------------- # ● 選択中のアクター #-------------------------------------------------------------------------- def active_actor return @active_window.actors[@active_window.index] end #-------------------------------------------------------------------------- # ● 選択中のアクター配列 #-------------------------------------------------------------------------- def active_actors return @active_window.actors end #-------------------------------------------------------------------------- # ● SleepWindow側へのアクター追加判定 #-------------------------------------------------------------------------- def can_change? case @sleep_window.type when 0 # 主要メンバーに空きがある ret = $game_party.actors.size < Party_Extend::MAIN_MEMBER when 1 # 待機メンバーに空きがあるかつ主要メンバーがゼロにならない ret = ($game_party.sub_actors.size < Party_Extend::SUB_MEMBER and $game_party.actors.size > 1) end # 入れ替え禁止になっているか? ret = false if active_actor.ch_lock # 決定SE or ブザーSEを演奏 $game_system.se_play(ret ? $data_system.decision_se : $data_system.buzzer_se) return ret end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # Input::UP時に一気にWindow切り替えが起きないように # 更新前のSubWindowのIndexを覚えておく @sub_window_index = @sub_window.index # ウィンドウを更新 @main_window.update;@sub_window.update # C ボタンが押された場合 if Input.trigger?(Input::C) on_decision;return end # B ボタンが押された場合 if Input.trigger?(Input::B) on_cancel;return end # A ボタンが押された場合 if Input.trigger?(Input::A) and can_change? on_change;return end # メインウィンドウがアクティブの場合 if @main_window.active and Input.trigger?(Input::DOWN) and $game_party.sub_actors.size > 0 $game_system.se_play($data_system.cursor_se) change_active_window(@sub_window) return end # サブウィンドウがアクティブの場合 if @sub_window.active and Input.trigger?(Input::UP) and @sub_window_index < 4 $game_system.se_play($data_system.cursor_se) change_active_window(@main_window) return end end #-------------------------------------------------------------------------- # ● 決定時の処理 #-------------------------------------------------------------------------- def on_decision if active_actor.ch_lock # 入れ替え禁止 $game_system.se_play($data_system.buzzer_se);return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # パーティー入れ替え if @choice # アクタースプライト消去 @main_window.actor_dispose;@sub_window.actor_dispose # 入れ替え処理 $game_party.change_actors(@ch_actor.id, active_actor.id) # アクタースプライト再構築 @main_window.actor_change;@sub_window.actor_change # HelpWindow更新 @active_window.help_window = @main_info_window @sub_info_window.set_info(nil) # テンポラリ情報クリア clear_temp else # 選択中に移行 @choice = true # 交換対象アクター @ch_actor = active_actor @ch_actor.already_change = true # HelpWindow更新 @active_window.help_window = @sub_info_window end end #-------------------------------------------------------------------------- # ● キャンセル時の処理 #-------------------------------------------------------------------------- def on_cancel # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) if @choice # 選択中ならテンポラリ情報クリア clear_temp else # 非選択中ならシーンチェンジ $scene = Scene_Map.new # マップ画面に遷移 #$scene = Scene_Menu.new(5) # メニュー画面に遷移 end end #-------------------------------------------------------------------------- # ● 入れ替え時の処理 #-------------------------------------------------------------------------- def on_change # アクタースプライト消去 @main_window.actor_dispose;@sub_window.actor_dispose # 入れ替え処理 actor = active_actor $game_party.remove_actor(actor.id) case @active_window.type when 0 # main $game_party.sub_actors.push(actor) when 1 # sub $game_party.actors.push(actor) # 待機メンバーが空になる場合はメインウィンドウに移行 if $game_party.sub_actors.size == 0 change_active_window(@main_window) @active_window.index = 0 end end # アクタースプライト再構築 @main_window.actor_change;@sub_window.actor_change # テンポラリ情報クリア clear_temp end #-------------------------------------------------------------------------- # ● ActiveWindowの切り替え処理 #-------------------------------------------------------------------------- def change_active_window(new_active_window) # 旧ActiveWindowをSleepWindowに設定 @sleep_window = @active_window @sleep_window.active = false # 新ActiveWindowの設定 @active_window = new_active_window @active_window.active = true # help_window更新 @sleep_window.help_window = nil @active_window.help_window = @choice ? @sub_info_window : @main_info_window # Index更新 @active_window.index = @sleep_window.index <= (active_actors.size-1) ? @sleep_window.index : active_actors.size-1 @sleep_window.index = -1 # 下部表示更新 @notice_window.change_type(@active_window.type) end end