ダメージ計算式のaddStateの挙動について

返信する
Nou-darake
記事: 8
登録日時: 2020年6月25日(木) 03:17

ダメージ計算式のaddStateの挙動について

投稿記事 by Nou-darake »

お疲れ様です。

ダメージ計算式の挙動が想定通り作用しておらず困っています。
具体的に ステート8番か9番が付与されている敵に攻撃した際、ステート3番を付与して通常より高いダメージを与える という処理を想定しています。
記述しているダメージ計算式は

(b.isStateAffected(8) || b.isStateAffected(9) ? b.addState(3) ; (50 + a.atk - b.def) * 2.5 : (50 + a.atk - b.def) * 1.5)

です。

想定している挙動; ステート8番か9番が付与されているbにステート3番が適用され、(50 + a.atk - b.def) * 2.5のダメージ処理が適用される。指定のステートが付与されていない場合は(50 + a.atk - b.def) * 1.5のダメージ処理のみが適用される
実際に確認できた挙動; ステート8番か9番が付与されているbには何のステートも付与されず、ダメージが0になる。指定のステートが付与されていない場合は問題なく(50 + a.atk - b.def) * 1.5のダメージが適用される。

当方が記述式に詳しくない為頓珍漢な記述をしているとは思うのですが、どなたか助言を頂戴できれば幸いです
アバター
Plasma Dark
記事: 731
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: ダメージ計算式のaddStateの挙動について

投稿記事 by Plasma Dark »

コード: 全て選択

(b.isStateAffected(8) || b.isStateAffected(9) ? b.addState(3) ; (50 + a.atk - b.def) * 2.5 : (50 + a.atk - b.def) * 1.5)
この記述では構文エラーになり、ステート8, 9にかかっているか否かに関わらず最終的にダメージ計算の結果は0となります。

JavaScriptにおいてセミコロンは文を区切る役割を果たします。
https://jsprimer.net/basic/statement-expression/

よく見かける

コード: 全て選択

b.addState(3); (ダメージ計算式)
というセミコロンで文を区切った記述は、evalが複数の式を評価した際に、評価された最後の式の値を返すという性質を利用しています。
https://developer.mozilla.org/ja/docs/W ... jects/eval
(RPGツクールMVのダメージ計算式はevalによって評価されています。 rpg_objects.js Game_Action.prototype.evalDamageFormula 参照)

ご提示頂いた計算式は、条件演算子を用いた式の途中で文を区切るような記述がされてしまっており、構文エラーになります。
あまり複雑な計算式を書くべきとは思いませんが、if文で分岐してあげることで意図通りの挙動になると思います。

コード: 全て選択

if (b.isStateAffected(8) || b.isStateAffected(9)) { b.addState(3) ; (50 + a.atk - b.def) * 2.5 } else { (50 + a.atk - b.def) * 1.5 }
アバター
Plasma Dark
記事: 731
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: ダメージ計算式のaddStateの挙動について

投稿記事 by Plasma Dark »

あまり複雑なダメージ計算を書くべきとは思わない、と書きながら対案がないのもアレなので、特定ステートにかかっている対象に使用した場合に別ステートを付与したりダメージ倍率を上げるスキル・アイテム効果を実現するプラグインの例を書いてみました。

https://gist.github.com/elleonard/fc1f7 ... a6ee10bb93

ただし、これは独自の効果を実現する方法の一例です。
応用を効かせれば他にも様々な効果が実現できますが、今回提示した効果のスキルをひとつだけ実装したい、などという場合にはちょっと大仰でもあります。
最終的にはプロジェクトの規模、自身や開発チームの能力などを総合して、管理しやすい方法で実現してください。
返信する

“MV:質問”に戻る