まず身代わりがどうやって判定されているか見てみましょうか。
スクリプトエディタでctrl+shift+Fの「全体検索」を使い、「身代わり」で検索するといくつか候補が出てきます。
その中で「身代わりの適用」をチェックします。
コード: 全て選択
#--------------------------------------------------------------------------
# ● 身代わりの適用
#--------------------------------------------------------------------------
def apply_substitute(target, item)
(略)
end
この処理は(関係ないので簡略化しますが)身代わり条件を満たしていれば身代わり候補を探し、
身代わり条件を満たしていない、もしくは身代わり候補がいない場合は元々の対象を返すという処理です。
この処理がどこで使われているか、「apply_substitute」で全体検索すると、
この処理の本体ともう一か所しか出てこないので、もう一か所のほうをチェックします。
コード: 全て選択
#--------------------------------------------------------------------------
# ● スキル/アイテムの発動
#--------------------------------------------------------------------------
def invoke_item(target, item)
if rand < target.item_cnt(@subject, item)
invoke_counter_attack(target, item)
elsif rand < target.item_mrf(@subject, item)
invoke_magic_reflection(target, item)
else
apply_item_effects(apply_substitute(target, item), item) # これ
end
@subject.last_target_index = target.index
end
これが使われている場所です。さらにこの処理の上の処理では、
コード: 全て選択
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
#--------------------------------------------------------------------------
def use_item
item = @subject.current_action.item
(中略)
targets = @subject.current_action.make_targets.compact
show_animation(targets, item.animation_id)
targets.each {|target| item.repeats.times { invoke_item(target, item) } } # ここ
end
ここで先ほどチェックした処理が行われています。# ここ の行を細かく見ていくと、
「選ばれた(プレイヤーが選択した、もしくはランダムな)ターゲット一人ひとりに」「スキルの連続回数の数だけ」
「スキルを使う」という処理になっていることが分かります。
……で、ここで重要なところは「連続回数の数スキルを使っている間、
ターゲットは保持される」ということです。
つまり連続攻撃の最中で何度身代わりが死のうが、本来のターゲットを狙い続けるということですね。
これは湯喜乃湯さんが挙げられた状況にピッタリです。
もう少しわかりやすく示すなら、本来の敵をA、かばう敵をBとすると、
最初は [A, A, A] Bによるかばうが発動すると [B, A, A]
で、[A(発動済), A, A] になる。これを後ろの2つにも繰り返す、というわけです。
……なんだかわかりにくくなっちゃいましたね。
じゃあどうしようという話ですね。先ほどの例で挙げると、
Bによるかばうが発動した時に [B, B, B] になればいいわけです。
あくまで一例なのですが、このようにしてみます。
コード: 全て選択
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
#--------------------------------------------------------------------------
def use_item
(中略)
targets.each {|target| invoke_item(target, item) } # ①
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの発動
#--------------------------------------------------------------------------
def invoke_item(target, item)
ori_target = target # ②
item.repeats.times { # ①
if rand < target.item_cnt(@subject, item) # ④
invoke_counter_attack(target, item)
elsif rand < target.item_mrf(@subject, item) # ④
invoke_magic_reflection(target, item)
else
target = apply_substitute(target, item) if ori_target == target # ③
apply_item_effects(target, item)
end
} # ①
@subject.last_target_index = ori_target.index # ⑤
end
①まず、連続回数による繰り返しを内部の処理に持っていきます。
②次に、本来の対象をバックアップで残して、
③本来の対象と「今の(身代わりによって変更されているかもしれない)対象」を比較し、それで変更が無かったら
身代わり候補を探します。
④その時、反撃とか反射とかは今の対象のパラメータで決定されます。
⑤ラストターゲットは本来の対象を選択します。
だいぶ長くなってしまいましたが、こんな感じでどうでしょう。
なお、このスクリプトは「デフォルト戦闘」でのみ動作保証しております。
※お持ち帰りして素材欄に貼っ付ける用
コード: 全て選択
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
#--------------------------------------------------------------------------
def use_item
item = @subject.current_action.item
@log_window.display_use_item(@subject, item)
@subject.use_item(item)
refresh_status
targets = @subject.current_action.make_targets.compact
show_animation(targets, item.animation_id)
targets.each {|target| invoke_item(target, item) }
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの発動
#--------------------------------------------------------------------------
def invoke_item(target, item)
ori_target = target
item.repeats.times {
if rand < target.item_cnt(@subject, item)
invoke_counter_attack(target, item)
elsif rand < target.item_mrf(@subject, item)
invoke_magic_reflection(target, item)
else
target = apply_substitute(target, item) if ori_target == target
apply_item_effects(target, item)
end
}
@subject.last_target_index = ori_target.index
end
end