#============================================================================== # ■ RGSS3 戦闘中パーティ入れ替え&パーティ入れ替え封印特徴 Ver1.05 by 星潟 #============================================================================== # 戦闘中、パーティコマンドからパーティメンバーの入れ替えを行えるようにします。 # 控えメンバーがいない場合は使用できません。 # # また、パーティメンバーの入れ替えを封印する特徴を設定可能になります。 # # 当方の他サイト対応素材における下記スクリプトは # このスクリプトにも同じように、拡張スクリプトとして使用できます。 # # 戦闘後パーティメンバー復元 # 戦闘後パーティメンバー復元機能をメニュー画面で切り替え #============================================================================== # 特徴を有する項目のメモ欄に下記のように記述する事で効果を発揮します。 #------------------------------------------------------------------------------ # <戦闘中入れ替え不可> # # このアクターの戦闘中の入れ替えが禁止されます。 #============================================================================== module PTMCB #パーティ入れ替えコマンドの有効化スイッチを指定します。 #ここで指定したスイッチがONの時のみ入れ替えが可能になります。 #0にした場合は、常時入れ替え可能になります。 I = 0 #入れ替え不可特徴設定用キーワードを指定。 W = "戦闘中入れ替え不可" #パーティメンバー入れ替えコマンド名を指定。 C = "入れ替え" #ヘルプウィンドウに表示するテキストを指定。 #例.["入れ替える戦闘メンバーを選択して下さい。","入れ替える控えメンバーを選択して下さい。"] #この場合、入れ替える戦闘メンバー選択時には #「入れ替える戦闘メンバーを選択して下さい。」の文章。(鍵括弧は除く) #入れ替える控えメンバー選択時には #「入れ替える控えメンバーを選択して下さい。」の文章(鍵括弧は除く)が #ヘルプウィンドウに表示される。 H = ["入れ替える戦闘メンバーを選択して下さい。","入れ替える控えメンバーを選択して下さい。"] #ステート無効の特徴が付与されている場合 #ステート有効度の表示を"無効"と表示するか、0(もしくは100)と表示するか? #trueで"無効"、falseで0か100。 R = false #空の配列を用意。 S = [] #以下にステータス描写設定を行います。 #顔グラフィック・キャラグラフィックは設定項目3種。(実質2種) #(:xと:yの後の値がそれぞれX座標とY座標) #顔グラフィック描写設定。 S.push({:t => "F",:x => 0,:y => 24}) #顔グラフィック描写設定。 S.push({:t => "G",:x => 16,:y => 120}) #アイコン〜通常能力値までは設定項目4種。(実質3種) #(:xと:yの後の値がそれぞれX座標とY座標、:wの後の値が項目の幅) #アイコン描写設定。 S.push({:t => "I",:x => 120,:y => 24,:w => 96}) #アクター名描写設定。 S.push({:t => "A",:x => 0,:y => 0,:w => 112}) #クラス名描写設定。 S.push({:t => "C",:x => 120,:y => 0,:w => 112}) #HP描写設定。 S.push({:t => 0,:x => 120,:y => 48,:w => 160}) #MP描写設定。 S.push({:t => 1,:x => 120,:y => 72,:w => 160}) #TP描写設定。 S.push({:t => "T",:x => 120,:y => 96,:w => 160}) #攻撃力描写設定。 S.push({:t => 2,:x => 0,:y => 144,:w => 120}) #防御力描写設定。 S.push({:t => 3,:x => 0,:y => 168,:w => 120}) #魔法力描写設定。 S.push({:t => 4,:x => 0,:y => 192,:w => 120}) #魔法防御描写設定。 S.push({:t => 5,:x => 0,:y => 216,:w => 120}) #敏捷力描写設定。 S.push({:t => 6,:x => 0,:y => 240,:w => 120}) #運描写設定。 S.push({:t => 7,:x => 0,:y => 264,:w => 120}) #以下、「#」を使用してコメントアウト済み。 #使用する場合はここまでの処理を参考に式部分だけ外して下さい。 #追加能力値は設定項目5種。 #(:tの後の数字は種類に応じた値に1000を足した物。 # :xと:yの後の値がそれぞれX座標とY座標、:wの後の値が項目の幅、:nameの後が項目名) #命中率描写設定。 #S.push({:t => 1000,:x => 124,:y => 144,:w => 120,:name => "命中率"}) #回避率描写設定。 #S.push({:t => 1001,:x => 124,:y => 168,:w => 120,:name => "回避率"}) #会心率描写設定。 #S.push({:t => 1002,:x => 124,:y => 192,:w => 120,:name => "会心率"}) #会心回避描写設定。 #S.push({:t => 1003,:x => 124,:y => 216,:w => 120,:name => "会心回避"}) #魔法回避描写設定。 #S.push({:t => 1004,:x => 124,:y => 240,:w => 120,:name => "魔法回避"}) #魔法反射描写設定。 #S.push({:t => 1005,:x => 124,:y => 264,:w => 120,:name => "魔法反射"}) #特殊能力値は設定項目5種。 #(:tの後の数字は種類に応じた値に2000を足した物。 # :xと:yの後の値がそれぞれX座標とY座標、:wの後の値が項目の幅、:nameの後が項目名) #狙われ率描写設定。 #S.push({:t => 2000,:x => 0,:y => 288,:w => 120,:name => "狙われ率"}) #属性有効度〜ステート有効度までは設定項目6種。 #(:tの後の数字は種類に応じた値に特定の値を足した物。 # 属性有効度なら属性IDに3000を足した値。 # 弱体有効度なら弱体対象の能力値IDに4000を足した値。 # ステート有効度ならステートIDに5000を足した値。 # :xと:yの後の値がそれぞれX座標とY座標、:wの後の値が項目の幅、 # :nameの後が項目名、:rの後は表示する値を100から本来の値を引いた値にするかの指定) #属性ID3有効度描写設定。#を使用してコメントアウト済み。使用する場合は外して下さい。 #S.push({:t => 3003,:x => 0,:y => 312,:w => 120,:name => "炎耐性",:r => true}) #防御弱体有効度描写設定。#を使用してコメントアウト済み。使用する場合は外して下さい。 #S.push({:t => 4003,:x => 124,:y => 288,:w => 120,:name => "防御弱体",:r => true}) #ステートID2有効度設定。#を使用してコメントアウト済み。使用する場合は外して下さい。 #S.push({:t => 5002,:x => 124,:y => 312,:w => 120,:name => "毒耐性",:r => true}) end class Game_System #-------------------------------------------------------------------------- # ロード後の処理 #-------------------------------------------------------------------------- alias on_after_load_ptm_window on_after_load def on_after_load on_after_load_ptm_window $game_party.delete_action_times_fix end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- alias start_ptm_window start def start ptm_atf_clear start_ptm_window end #-------------------------------------------------------------------------- # 全ウィンドウの作成 #-------------------------------------------------------------------------- alias create_all_windows_ptm_window create_all_windows def create_all_windows create_all_windows_ptm_window create_ptmh_window create_ptmi_window create_ptmo_window create_ptms_window end #-------------------------------------------------------------------------- # パーティコマンドウィンドウの作成 #-------------------------------------------------------------------------- alias create_party_command_window_ptm_window create_party_command_window def create_party_command_window create_party_command_window_ptm_window @party_command_window.set_handler(:ptm_change, method(:ptm_change_start)) end #-------------------------------------------------------------------------- # パーティ入れ替えヘルプウィンドウの作成 #-------------------------------------------------------------------------- def create_ptmh_window @window_ptmh = Window_Help.new(1) @window_ptmh.back_opacity = 255 @window_ptmh.hide end #-------------------------------------------------------------------------- # 戦闘メンバーウィンドウの作成 #-------------------------------------------------------------------------- def create_ptmi_window @window_ptmi = Window_PTMI.new @window_ptmi.set_handler(:ptmi_select, method(:ptmi_select)) @window_ptmi.set_handler(:cancel, method(:ptmi_cancel)) @window_ptmi.y = @window_ptmh.height end #-------------------------------------------------------------------------- # 控えメンバーウィンドウの作成 #-------------------------------------------------------------------------- def create_ptmo_window y = @window_ptmi.y + @window_ptmi.height @window_ptmo = Window_PTMO.new(@window_ptmi,Graphics.height - y) @window_ptmo.set_handler(:ptmo_select, method(:ptmo_select)) @window_ptmo.set_handler(:cancel,method(:ptmo_cancel)) @window_ptmo.y = y end #-------------------------------------------------------------------------- # 選択アクターステータスウィンドウの作成 #-------------------------------------------------------------------------- def create_ptms_window @window_ptms = Window_PTM_Status.new(@window_ptmo,@window_ptmi,Graphics.height - @window_ptmh.height) @window_ptms.x = @window_ptmi.width @window_ptms.y = @window_ptmh.height @window_ptms.hide end #-------------------------------------------------------------------------- # 入れ替えの実行 #-------------------------------------------------------------------------- def ptm_change create_ptm_windows @window_ptmi.activate end #-------------------------------------------------------------------------- # 入れ替え開始 #-------------------------------------------------------------------------- def ptm_change_start ptm_change @window_ptmh.show @window_ptmi.show @window_ptmo.show @window_ptms.show end #-------------------------------------------------------------------------- # メンバー入れ替え #-------------------------------------------------------------------------- def ptm_change @window_ptmi.activate @window_ptmi.refresh @window_ptmo.y = @window_ptmi.y + @window_ptmi.height @window_ptmo.refresh @window_ptms.refresh @window_ptmh.set_text(PTMCB::H[0]) end #-------------------------------------------------------------------------- # 戦闘メンバー選択 #-------------------------------------------------------------------------- def ptmi_select @window_ptmo.activate @window_ptmh.set_text(PTMCB::H[1]) end #-------------------------------------------------------------------------- # 選択終了 #-------------------------------------------------------------------------- def ptmi_cancel @party_command_window.activate refresh_status @window_ptmh.hide @window_ptmi.hide @window_ptmo.hide @window_ptms.hide $game_party.make_actions end #-------------------------------------------------------------------------- # 控えメンバー選択 #-------------------------------------------------------------------------- def ptmo_select a = [@window_ptmi.actor,@window_ptmo.actor].inject([]) {|r,i| r += [$game_party.all_members.index(i)]} $game_party.swap_order(a[0],a[1]) ptm_change end #-------------------------------------------------------------------------- # 控えメンバーキャンセル #-------------------------------------------------------------------------- def ptmo_cancel @window_ptmi.activate @window_ptmh.set_text(PTMCB::H[0]) end #-------------------------------------------------------------------------- # ターン開始 #-------------------------------------------------------------------------- alias turn_start_ptm_change turn_start def turn_start ptm_atf_clear turn_start_ptm_change end #-------------------------------------------------------------------------- # 行動回数リセット #-------------------------------------------------------------------------- def ptm_atf_clear $game_party.ptm_atf_clear end end class Game_BattlerBase #-------------------------------------------------------------------------- # 戦闘中パーティ変更禁止 #-------------------------------------------------------------------------- def party_c_sib feature_objects.any? {|f| f.party_c_sib} end end class Game_Battler < Game_BattlerBase attr_accessor :action_times_fix #-------------------------------------------------------------------------- # 行動回数の決定 #-------------------------------------------------------------------------- alias make_action_times_ptm_window make_action_times def make_action_times if self.actor? n = @action_times_fix return n if n $game_party.ptm_atf_flag_set(self.id) @action_times_fix = make_action_times_ptm_window else make_action_times_ptm_window end end end class Game_Actors #-------------------------------------------------------------------------- # 全アクター行動回数キャッシュ削除 #-------------------------------------------------------------------------- def delete_action_times_fix @data.each {|actor| actor.action_times_fix = nil if actor} end end class Game_Party < Game_Unit attr_accessor :action_times_fix_version #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_ptm_window initialize def initialize initialize_ptm_window @action_times_fix_version = 0 end #-------------------------------------------------------------------------- # 全アクター行動回数キャッシュ削除 #-------------------------------------------------------------------------- def delete_action_times_fix case @action_times_fix_version when nil;$game_actors.delete_action_times_fix end @action_times_fix_version = 0 end #-------------------------------------------------------------------------- # 行動回数リセット #-------------------------------------------------------------------------- def ptm_atf_clear ptm_atf_flag.each {|i| $game_actors[i].action_times_fix = nil if $game_actors[i]} @ptm_atf_flag.clear end #-------------------------------------------------------------------------- # 行動回数保存済みアクター #-------------------------------------------------------------------------- def ptm_atf_flag @ptm_atf_flag ||= [] end #-------------------------------------------------------------------------- # 行動回数保存済みアクター設定 #-------------------------------------------------------------------------- def ptm_atf_flag_set(actor_id) @ptm_atf_flag ||= [] @ptm_atf_flag.push(actor_id) @ptm_atf_flag.uniq! end end class Window_PartyCommand < Window_Command #-------------------------------------------------------------------------- # コマンドリストの作成 #-------------------------------------------------------------------------- alias make_command_list_ptm_window make_command_list def make_command_list make_command_list_ptm_window i = PTMCB::I d = $game_party.all_members.size > $game_party.battle_members.size && (i == 0 or $game_switches[i]) add_command(PTMCB::C,:ptm_change,d) end end class Window_PTMB < Window_Command #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize actors_get super(0, 0) self.back_opacity = 255 deactivate hide end #-------------------------------------------------------------------------- # ウィンドウの幅を取得 #-------------------------------------------------------------------------- def window_width Graphics.width / 2 end #-------------------------------------------------------------------------- # 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) super(index) r = item_rect(index) draw_actor_hp(@actors[index], r.width - 144, r.y, 140) end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh actors_get super end #-------------------------------------------------------------------------- # アクター情報取得 #-------------------------------------------------------------------------- def actor @actors[self.index] end end class Window_PTMI < Window_PTMB #-------------------------------------------------------------------------- # アクター配列取得 #-------------------------------------------------------------------------- def actors_get @actors = $game_party.battle_members end #-------------------------------------------------------------------------- # 項目数の取得 #-------------------------------------------------------------------------- def item_max $game_party.battle_members.size end #-------------------------------------------------------------------------- # コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list @actors.each {|a| add_command(a.name, :ptmi_select, !a.party_c_sib, a.id)} end #-------------------------------------------------------------------------- # 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number $game_party.max_battle_members end end class Window_PTMO < Window_PTMB #-------------------------------------------------------------------------- # オブジェクト初期化(とりあえず) #-------------------------------------------------------------------------- def initialize super end #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_ptmo initialize def initialize(window,height) @ptmi_window = window @height = height initialize_ptmo end #-------------------------------------------------------------------------- # アクター配列取得 #-------------------------------------------------------------------------- def actors_get b = $game_party.battle_members @actors = $game_party.all_members.select {|i| !b.include?(i)} end #-------------------------------------------------------------------------- # ウィンドウの高さ #-------------------------------------------------------------------------- def window_height @height end #-------------------------------------------------------------------------- # コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list l = command_usable? @actors.each {|a| add_command(a.name, :ptmo_select,!a.party_c_sib && (l or a.alive?), a.id)} end #-------------------------------------------------------------------------- # 更新 #-------------------------------------------------------------------------- def update super cu = command_usable? if @lcu != cu @lcu = cu refresh end end #-------------------------------------------------------------------------- # コマンド特殊制限 #-------------------------------------------------------------------------- def command_usable? ($game_party.battle_members.select {|a| a.alive?}).size > 1 or !@ptmi_window.actor.alive? end end class Window_PTM_Status < Window_Base #-------------------------------------------------------------------------- # 初期化 #-------------------------------------------------------------------------- def initialize(window1,window2,h) @window1 = window1 @window2 = window2 super(0,0,@window1.width,h) self.back_opacity = 255 end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh create_contents a = actor return unless a PTMCB::S.each {|i| draw_item(a,i)} end #-------------------------------------------------------------------------- # 項目描写 #-------------------------------------------------------------------------- def draw_item(actor,h) x = h[:x] y = h[:y] w = h[:w] a = actor case h[:t] when "A" draw_actor_name(a, x, y) when "C" draw_actor_class(a, x, y) when "N" draw_actor_nickname(a, x, y) when "F" draw_actor_face(a, x, y) when "G" draw_actor_graphic(a, x, y) when "I" draw_actor_icons(a, x, y) when "T" draw_actor_tp(a, x, y) when 0 draw_actor_hp(a, x, y) when 1 draw_actor_mp(a, x, y) else draw_actor_param_ptms(a, x, y, h, w) end end #-------------------------------------------------------------------------- # パラメータ描写 #-------------------------------------------------------------------------- def draw_actor_param_ptms(actor, x, y, h, w) change_color(system_color) draw_text(x,y,w,line_height,h[:name] ? h[:name] : Vocab.param(h[:t])) change_color(normal_color) case h[:t] when 2..999 d = actor.param(h[:t]) when 1000..1999 d = ((actor.xparam(h[:t] - 1000)) * 100).round(10).to_i when 2000..2999 d = ((actor.sparam(h[:t] - 2000)) * 100).round(10).to_i when 3000..3999 d = ((actor.element_rate(h[:t] - 3000)) * 100).round(10).to_i d = 100 - d if h[:r] when 4000..4999 d = ((actor.debuff_rate(h[:t] - 4000)) * 100).round(10).to_i d = 100 - d if h[:r] when 5000..5999 i = h[:t] - 5000 if actor.state_resist?(i) d = PTMCB::R ? "無効" : (h[:r] ? 100 : 0) else d = ((actor.state_rate(i)) * 100).round(10).to_i d = 100 - d if h[:r] end end draw_text(x,y,w,line_height,d, 2) end #-------------------------------------------------------------------------- # 選択されているアクター #-------------------------------------------------------------------------- def actor [@window1,@window2].each {|w| return w.actor if w.active} nil end #-------------------------------------------------------------------------- # 更新 #-------------------------------------------------------------------------- def update super if actor && @la_id != actor.id @la_id = actor.id refresh end end end class RPG::BaseItem #-------------------------------------------------------------------------- # 戦闘中パーティ変更禁止 #-------------------------------------------------------------------------- def party_c_sib @party_c_sib ||= /<#{PTMCB::W}>/ =~ note end end