【RGSS3】余剰ダメージが別の敵に貫通するスキル・ステート

せくもん
記事: 39
登録日時: 2018年6月09日(土) 21:48

【RGSS3】余剰ダメージが別の敵に貫通するスキル・ステート

投稿記事by せくもん » 2020年1月30日(木) 08:46

いつもお世話になっております。

VX aceにて、例えば残りのHPが60の敵に100のダメージを与えて倒した際に
まだ敵側に生存者がいる場合は余剰分の40ダメージを
「別の相手に貫通した!」等のメッセージと共に、その生存者に与えるスキルや
味方にかける事で物理攻撃or魔法攻撃かつ敵1体が対象のスキルに貫通効果を持たせるステートを
作りたいと思っています。

既に最初に倒した敵の時点で命中率判定とダメージ計算が終わっているので
回避率や防御力が高くて、直接ターゲットにした場合ダメージを与えにくい敵に
効果的なスキルとして活用したいのですが
この場合、どの様にスクリプトを記述したら良いのでしょうか?

u-kun
記事: 15
登録日時: 2018年4月11日(水) 01:40

Re: 【RGSS3】余剰ダメージが別の敵に貫通するスキル・ステート

投稿記事by u-kun » 2020年2月05日(水) 03:41

スクリプトではなくコモンイベントになりますが、一応作ってみました。
ステート付与での貫通には対応できていませんが、スキルでの貫通攻撃は実現できていると思います。
ただし、イベントコマンドでのスクリプトの記述では文字数制限が厳しいため、
・貫通先は敵グループIDが小さい順に選定(ID2やID3を攻撃してもID1が生きていれば必ずID1に貫通する)
・与ダメの分散度を0として余剰ダメージを計算する
・ダメージ計算式に含まれない要素(属性など)でのダメージカットは無視して余剰ダメージを計算する
・その他、貫通ダメージを防ぐ(減衰する)手段は一切なし
という感じの挙動になっています。


1.スクリプトの準備
コモンイベントでダメージの処理を行うため、戦闘中のメッセージを表示できるようにスクリプトを導入する必要があります。

コード: 全て選択

class Scene_Battle < Scene_Base
  attr_reader :log_window
end

これです。
詳しくは「【解決済】 ACE 戦闘中のメッセージについて」というトピックを参照してください。


2.スキルの準備
貫通処理を行うコモンイベントを設定することは当然として、ダメージ計算式にて敵の情報と発生したダメージを取得します。
ついでに貫通攻撃が発生した時のアニメーションIDもここで設定します。
計算式:
v[3] = 13; v[2] = b.dup; v[1] = a.atk * 4 - b.def * 2
このような感じに記述することで、変数1にダメージ、変数2に敵の情報、変数3にアニメーションIDを設定できます。
計算式はセミコロンで区切ることで強引に複数の処理を行うことができます。
ダメージとしては最後の計算結果が適用されるので、処理の順番に注意してください。
(v[3] = 13 を最後に持ってくるとダメージが13になる)



3.コモンイベントの作成
以下の通りにコモンイベントを作成してください。
2ヶ所の「スクリプト」ではスキルのダメージ計算式で指定した変数番号の設定が必要です。

◆条件分岐:スクリプト:$game_troop.members.size > 1
 ◆注釈:d_id ... スキルのダメージを保存した変数番号
    :b_id ... 敵情報を保存した変数番号
 ◆スクリプト:

コード: 全て選択

d_id = 1 # ←
b_id = 2 # ←
b = $game_variables[b_id]
$game_variables[d_id] -= b.hp
troop_size = $game_troop.members.size
if $game_variables[d_id] > 0
 for i in 0...troop_size
  if b.index != i && b.alive?
   $game_variables[b_id] = i; break
  end; i += 1
  $game_variables[b_id] = -1 if i == troop_size
end; end

 ◆注釈:上のスクリプトで変数d_idの内容が余剰ダメに変わる
    :余剰ダメが0超ならダメージを適用
 ◆条件分岐:変数[0001:ダメージ] > 0
  ◆注釈:d_id ... スキルのダメージを保存した変数番号
     :b_id ... 敵情報を保存した変数番号
     :a_id ... アニメIDを保存した変数番号
  ◆スクリプト:

コード: 全て選択

d_id = 1; b_id = 2; a_id = 3 # ← ← ←
id=$game_variables[b_id];dmg=$game_variables[d_id]
enemy = $game_troop.members[id]
enemy.animation_id = $game_variables[a_id]
wait(1) if SceneManager.scene.wait_for_animation
enemy.perform_damage_effect
SceneManager.scene.log_window.add_text(sprintf(
"貫通攻撃! %sに %d のダメージを与えた!",
enemy.name, dmg))
SceneManager.scene.log_window.wait_and_clear
enemy.change_hp(-dmg, true)
enemy.perform_collapse_effect if enemy.dead?

  :分岐終了
 ◆注釈:ここまでで使った変数を初期化
 ◆変数の操作:[0001..0003] = 0
:分岐終了

注意点として、
(ほぼない状況だとは思いますが)スキル実行からコモン実行までの間に設定した変数の中身が変わるとエラーが発生して落ちます。
万全を期すのであれば、他では絶対に使わない変数番号を指定するようにしてください。

“VX / Ace:質問” へ戻る