#=========================================================================== # ◆ A1 Scripts ◆ # 戦闘中入れ替え(RGSS3) # # バージョン : 1.00 (2012/01/18) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・戦闘中にメンバーを入れ替えます #--------------------------------------------------------------------------- # 更新履歴   :2012/01/18 Ver1.00 リリース #--------------------------------------------------------------------------- # 設置場所 # A1バトル共通スクリプト以下 # # 必要スクリプト # A1バトル共通スクリプト #--------------------------------------------------------------------------- # 使い方 # 導入することで適用されます #============================================================================== $imported ||= {} if $imported["A1_BattleCommonScript"] $imported["A1_ChangeMember"] = true old_common_script("戦闘中入れ替え", "3.90") if common_version < 3.90 #============================================================================== # ■ Window_PartyCommand #============================================================================== class Window_MemberChange < Window_Selectable #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @form_actor_window = Window_PersonalStatus.new(0, Graphics.height - 120, 255) @to_actor_window = Window_PersonalStatus.new(Graphics.width / 2, Graphics.height - 120, 255) setup_members width = @battle_members.size * 48 + standard_padding * 2 height = (@all_members.size / @battle_members.size.to_f).ceil * 48 + standard_padding * 2 + 36 super((Graphics.width - width) / 2, (Graphics.height - height) / 2, width, height) self.y = Graphics.height - @form_actor_window.height - height if self.y + height > Graphics.height - @form_actor_window.height self.index = 0 @from_actor = -1 self.openness = 0 end #-------------------------------------------------------------------------- # ○ アクティブ化 #-------------------------------------------------------------------------- def activate super refresh @form_actor_window.actor = @all_members[self.index] end #-------------------------------------------------------------------------- # ○ メンバーのセットアップ #-------------------------------------------------------------------------- def setup_members @all_members = $game_party.all_members @battle_members = $game_party.battle_members end #-------------------------------------------------------------------------- # ○ 項目の選択 #-------------------------------------------------------------------------- def select(index) super @form_actor_window.actor = @all_members[self.index] if @from_actor == -1 @to_actor_window.actor = @all_members[self.index] if @from_actor >= 0 end #-------------------------------------------------------------------------- # ○ 項目数の取得 #-------------------------------------------------------------------------- def item_max @all_members.size end #-------------------------------------------------------------------------- # ○ 桁数の取得 #-------------------------------------------------------------------------- def col_max @battle_members.size end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh super draw_horz_line(52) end #-------------------------------------------------------------------------- # ○ 水平線の描画 #-------------------------------------------------------------------------- def draw_horz_line(y) line_y = y + line_height / 2 - 1 contents.fill_rect(0, line_y, contents_width, 2, line_color) end #-------------------------------------------------------------------------- # ○ 水平線の色を取得 #-------------------------------------------------------------------------- def line_color color = normal_color color.alpha = 128 color end #-------------------------------------------------------------------------- # ○ 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) c_name = member(index).character_name c_index = member(index).character_index rect = item_rect(index) draw_character(c_name, c_index, rect.x + 24, rect.y + 40) end #-------------------------------------------------------------------------- # ○ 項目を描画する矩形の取得 #-------------------------------------------------------------------------- def item_rect(index) rect = Rect.new rect.width = item_width rect.height = item_height rect.x = index % col_max * item_width rect.y = index / col_max * item_height rect.y += 24 if index > @battle_members.size - 1 rect end #-------------------------------------------------------------------------- # ○ 項目の幅を取得 #-------------------------------------------------------------------------- def item_width return 48 end #-------------------------------------------------------------------------- # ○ 項目の高さを取得 #-------------------------------------------------------------------------- def item_height return 48 end #-------------------------------------------------------------------------- # ○ ウィンドウ内容の高さを計算 #-------------------------------------------------------------------------- def contents_height row_max * item_height + 24 end #-------------------------------------------------------------------------- # ○ 下端パディングの更新 #-------------------------------------------------------------------------- def update_padding_bottom surplus = (height - standard_padding * 2) % item_height - 24 self.padding_bottom = padding + surplus end #-------------------------------------------------------------------------- # ○ メンバーの取得 #-------------------------------------------------------------------------- def member(index) @all_members[index] end #-------------------------------------------------------------------------- # ○ 決定処理の有効状態を取得 #-------------------------------------------------------------------------- def ok_enabled? return true end #-------------------------------------------------------------------------- # ○ 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_ok Sound.play_ok Input.update return select_start_to_actor if @from_actor == -1 return call_cancel_handler if @from_actor == self.index change_member if @from_actor >= 0 post_change_member end #-------------------------------------------------------------------------- # ○ メンバー入れ替え #-------------------------------------------------------------------------- def change_member $game_party.swap_order(@from_actor, self.index) end #-------------------------------------------------------------------------- # ○ メンバー入れ替え後の処理 #-------------------------------------------------------------------------- def post_change_member setup_members self.index = @from_actor @form_actor_window.actor = @all_members[self.index] @from_actor = -1 @to_actor_window.close refresh end #-------------------------------------------------------------------------- # ○ 入れ替え先のアクター選択開始 #-------------------------------------------------------------------------- def select_start_to_actor @from_actor = self.index @to_actor_window.open self.index = self.index < @battle_members.size ? @battle_members.size : 0 @to_actor_window.actor = @all_members[self.index] end #-------------------------------------------------------------------------- # ○ 入れ替え元のアクター #-------------------------------------------------------------------------- def from_actor @from_actor end #-------------------------------------------------------------------------- # ○ オープン #-------------------------------------------------------------------------- def open super @form_actor_window.open end #-------------------------------------------------------------------------- # ○ キャンセルハンドラの呼び出し #-------------------------------------------------------------------------- def call_cancel_handler super if @from_actor == -1 @from_actor = -1 @to_actor_window.close @form_actor_window.actor = @all_members[self.index] activate end #-------------------------------------------------------------------------- # ○ クローズ #-------------------------------------------------------------------------- def close super @form_actor_window.close @to_actor_window.close end #-------------------------------------------------------------------------- # ○ フレーム更新 #-------------------------------------------------------------------------- def update super @form_actor_window.update @to_actor_window.update end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose super @form_actor_window.dispose @to_actor_window.dispose end end #============================================================================== # ■ Window_PartyCommand #------------------------------------------------------------------------------ #  バトル画面で、戦うか逃げるかを選択するウィンドウです。 #============================================================================== class Window_PartyCommand < Window_Command #-------------------------------------------------------------------------- # ☆ コマンドリストの作成 #-------------------------------------------------------------------------- alias a1_cbm_wpc_make_command_list make_command_list def make_command_list a1_cbm_wpc_make_command_list add_command("入れ替え", :member_change, $game_party.all_members.size > $game_party.max_battle_members) end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ☆ 全ウィンドウの作成 #-------------------------------------------------------------------------- alias a1_cbm_wpc_create_all_windows create_all_windows def create_all_windows a1_cbm_wpc_create_all_windows create_member_change_window end #-------------------------------------------------------------------------- # ○ 入れ替えウィンドウの作成 #-------------------------------------------------------------------------- def create_member_change_window @window_member_change = Window_MemberChange.new @window_member_change.set_handler(:cancel, method(:on_member_change_cancel)) end #-------------------------------------------------------------------------- # ☆ パーティコマンドウィンドウハンドルの定義 #-------------------------------------------------------------------------- alias a1_cbm_sb_define_party_command_window_handle define_party_command_window_handle def define_party_command_window_handle a1_cbm_sb_define_party_command_window_handle @party_command_window.set_handler(:member_change, method(:command_member_change)) end #-------------------------------------------------------------------------- # ○ 入れ替え #-------------------------------------------------------------------------- def command_member_change @prev_battle_members = $game_party.battle_members @status_window.close @party_command_window.close @window_member_change.open @window_member_change.activate end #-------------------------------------------------------------------------- # ○ 変更したメンバーを取得 #-------------------------------------------------------------------------- def change_diss_members(ret = []) $game_party.battle_members.each_with_index {|member, i| ret.push(member) if member != @prev_battle_members[i] } return ret end #-------------------------------------------------------------------------- # ○ メンバーチェンジ[キャンセル] #-------------------------------------------------------------------------- def on_member_change_cancel @party_command_window.activate @status_window.refresh @status_window.open @party_command_window.open @window_member_change.close change_diss_members.each {|member| member.make_actions } @party_battle_members = $game_party.battle_members end end end