【解決済】戦闘計算式でステート付与率を操作する方法について

sally
記事: 119
登録日時: 2019年8月06日(火) 05:11

【解決済】戦闘計算式でステート付与率を操作する方法について

投稿記事by sally » 2021年6月07日(月) 21:50

件名の内容について、主に状態異常付与についてのご相談です。

現在のツクールの仕様上、ステートの付与についてはスキル効果にて設定しますが、
これをスクリプトや戦闘計算式などで操作する方法はないか、ご存知の方はいらっしゃらないでしょうか?

実装したい内容としては、
アクターとエネミーのステータス差によって攻撃回数が決まり、その回数によって付与成功率も最終決定させたい、となります。
例えば付与率と耐性の計算結果が20%、攻撃回数が5 回の場合は20%を5回試行するのではなく、20%×5回=100%、という結果としたく、また、HPやMPダメージと両立させたいと考えています。

攻撃回数については変動するため、スキル設定にあるものは利用しておりません。
使用効果:コモンイベントでの実装も考えたのですが、全体攻撃やランダム攻撃などの複数対象範囲の場合などの汎用性が思いつかず、冒頭の戦闘計算式ならば可能か、と思いついた結果となります。

よろしくお願い致します。
最後に編集したユーザー sally on 2021年6月10日(木) 18:33 [ 編集 1 回目 ]

アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: 戦闘計算式でステート付与率を操作する方法について

投稿記事by WTR » 2021年6月08日(火) 18:44

sally さんが書きました:アクターとエネミーのステータス差によって攻撃回数が決まり

このあたりの仕様がわからないので部分的な回答になってしまいますが
ダメージ計算式でステートの付与を行いつつダメージも与えることは可能です。

毒ステート・通常攻撃相当のダメージを同時に与えるなら…

コード: 全て選択

b.addState(4); a.atk * 4 - b.def * 2;

しかし、それほど単純な話でもなかろうなという気もします。上記だと付与率は考えてないですし。
ダメージ計算式は一行で書くのが前提なので複雑な条件分岐は作りにくいですね。


以下は本質的には質問と関係ないですが
ダメージ計算式をプラグイン化すると複雑なことも比較的やりやすいかも、という話。
例えば以下のようなプラグインを作って

コード: 全て選択

((_global) => {
"use strict"
_global.DAMAGE_CALC = {
   // (使用者のAGI - 対象のAGI) x 10 の確率で毒ステートを与え、通常攻撃ダメージも与える
   SKILL_001: (a, b) => {
      const rate = (a.agi - b.agi) * 10; // AGI の差分 x 10
      const damage = a.atk * 4 - b.def * 2; // 通常攻撃同等のダメージ
      if (rate > Math.randomInt(100)) {
         b.addState(4); // 毒ステート ID: 4
      }
      return damage; // return した値がダメージになる
   },

   SKILL_002: (a, b) => {
      return ;
   },

   SKILL_003: (a, b) => {
      return ;
   }
};
})(this);

ダメージ計算式には以下のように書く

コード: 全て選択

DAMAGE_CALC.SKILL_001(a, b)

攻撃回数云々がよくわからないのでドンピシャな例にはなっていないですが
SKILL_001 はアクターとエネミーのステータス差(AGIの差)によって
確率でステートを与え、かつダメージも発生するという計算式のサンプルです。
SKILL_002, SKILL_003 はからっぽです。

普通にダメージ計算式に書くように a.atk とか b.def とかはそのまま書けばよし。
計算途中の値を変数に保持することもできるし、条件分岐も三項演算子に拘らなくていい。
素晴らしい発想だと思っているのですが
余計なお世話だという意見もあるかもしれないので参考までに…
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
sally
記事: 119
登録日時: 2019年8月06日(火) 05:11

Re: 戦闘計算式でステート付与率を操作する方法について

投稿記事by sally » 2021年6月09日(水) 00:20

早速のご回答ありがとうございます。

攻撃回数云々がよくわからないので


こちらについて、記述不足で失礼しました。
運を攻撃回数とし、こちらをベースに計算しています。

現状は

コード: 全て選択

a.luk * Math.max((a.agi - b. agi)/10,1)

としています。

付与率のみを単純に戦闘計算式で設定できれば、そこに別途、攻撃回数を乗算すれば可能かな
と思っていたのですが、そう単純ではないと認識していませんでした。

ダメージ計算式は一行で書くのが前提なので複雑な条件分岐は作りにくい

おっしゃる通り、ここがネックな部分です。。

また、ご提示いただきました戦闘計算式のプラグイン化について、
こちらであれば別途でやりたかったことも実装できそうです。
おっしゃる通り、素晴らしい発想だと思います。

ちなみにですが、こちらのプラグイン化した戦闘計算式について、
SKILL 1 と SKILL 2 は併用して使うことも可能なのでしょうか。
SKILL1内のconst rateとconst damageをそれぞれSKILL1とSKILL2に分割し、
戦闘計算式ではSKILL1とSKILL2を合わせて一つの式として扱う状態をイメージしております。
アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: 戦闘計算式でステート付与率を操作する方法について

投稿記事by WTR » 2021年6月09日(水) 01:10

sally さんが書きました:おっしゃる通り、素晴らしい発想だと思います。

ですよね!ちなみに私の発想ではないです。
以前どこかで見かけて、いつか真似しようと思っていただけです。

sally さんが書きました:SKILL1内のconst rateとconst damageをそれぞれSKILL1とSKILL2に分割し、
戦闘計算式ではSKILL1とSKILL2を合わせて一つの式として扱う状態をイメージしております。

残念ながら意図というか意味というか…ちょっと理解できていません。

コード: 全て選択

DAMAGE_CALC.SKILL_001(a, b) + DAMAGE_CALC.SKILL_002(a, b)

と書いて SKILL_001 と SKILL_002 のダメージの合計を与えることはできると思いますが
それならはじめからそういうスキルを作ればいいのでは…と

たぶんそういうことじゃないですよね
もう少し具体的な内容を書けるでしょうか?
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
sally
記事: 119
登録日時: 2019年8月06日(火) 05:11

Re: 戦闘計算式でステート付与率を操作する方法について

投稿記事by sally » 2021年6月09日(水) 22:31

返信が遅れ申し訳ありません。
また、言葉が足りず、失礼しました。

やりたいことを端的に言えば、ご提示頂いた

コード: 全て選択

DAMAGE_CALC.SKILL_001(a, b) + DAMAGE_CALC.SKILL_002(a, b)

とほぼ同意となります。

プラグイン化の方法を拝読した際、
スキルごとに戦闘計算式を作るのではなく、逆に基礎戦闘計算式を組み合わせて一つのスキルとして作れれば、汎用性が広がるかなと思ったのが伺った動機です。

例えばステートが4種類あり、ステート付与とステート付与攻撃がそれぞれに存在するとしたら本来は式を8個作る必要がありますが、
攻撃側の計算が1種類しかなければ5つの式を組むだけでよくなります。

お恥ずかしい話ですが、要は単なる横着ですね…。
アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: 戦闘計算式でステート付与率を操作する方法について

投稿記事by WTR » 2021年6月09日(水) 23:41

基本的にはおススメできない手法かと思います。

ダメージ計算式というのは本来はその名前の通り、ダメージを計算する式です。
ステートを与えるというのも実はもうそのスコープ外の裏技的な位置づけといえる気がします。
ステートも含めて何かの状態を変更する処理があると
処理順によって結果が変わる可能性があるわけで、それを処理順も含めて自由な組み合わせで保証するのは
かなり高度というか危うい話だと思います。

毒ステートとダメージを与える例を出しましたが
それが仮に防御ステートだったら与えるダメージは半分になってしまいます。
もっともコレはメソッドにしたからという話ではないですが
書き方の制約がなくなる分、わけのわからないことを起こしてしまうリスクもあると思いますので…
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
sally
記事: 119
登録日時: 2019年8月06日(火) 05:11

【解決済み】Re: 戦闘計算式でステート付与率を操作する方法について

投稿記事by sally » 2021年6月10日(木) 18:33

ご回答ありがとうございます。

なるほど…。
プラグイン化のサンプルをご提示頂いた際、単純に既存の計算方法を独立させられるなと思ったのですが、
処理順の問題については認識できていませんでした。

確かに、防御力を下げる+HPダメージのスキルがあったとして、その処理の順番次第でスキルの意味合いが変わってくるパターンもありますね。

少し自分の認識が甘かったようです。

掲題からずれた内容に対しての質問にも関わらず、
ご丁寧なご回答をいただきありがとうございます。

非常に興味深く、本音でいえばもっとお話を伺いたいのですが、
掲題につきましてはサンプルとして頂いた内容にて解決し、また、こちらからの質問攻めになりご負担かけるのも本意ではございませんので、本件は解決済みとさせて頂きます。

WTRさん、ありがとうございました。

“MZ:質問” へ戻る