ページ 11

【解決済】属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月21日(金) 20:01
by sisimaru69
現在、件名のシステムを作るためにviewtopic.php?t=12782viewtopic.php?f=23&t=12587&p=46972を参考にプラグインを作っております。
上記を参考にスキルのメモ欄とアクターのメモ欄に<TP_ELEMENTS>を記載することでダメージに倍率がかかるようにはできたのですが、味方側はイベントによって弱点属性を変動させたいので、変数に弱点属性IDを格納しておいて、
それを参照するようにしたいのですがうまくいきません。

コードを記載するので、どうすればいいか教えてもらえませんか?

コード: 全て選択

(() => {
    'use strict';

    const _Game_Action_apply = Game_Action.prototype.apply;
    Game_Action.prototype.apply = function(target) {
        _Game_Action_apply.apply(this, arguments);
        if (!target.result().isHit()) return;
        if (!this.item().meta['TP_DAMAGE']) return;

        var damageFormula = this.item().meta['TP_DAMAGE'];
        var damageMultiplier = 1.0; // 初期のダメージ倍率を1.0とする
		var parameters = PluginManager.parameters('TPdamageKAI2');
		var BonusRate = parseFloat(parameters['BonusRate'] || 1.3);
		
        // スキルのメモ欄にTP_ELEMENTSが指定されている場合、ダメージ倍率を取得
        if (this.item().meta['TP_ELEMENTS']) {
            var elements = this.item().meta['TP_ELEMENTS'].split(','); // メモ欄の属性をカンマで区切って配列に変換
            var targetElements;

			if (target.isActor()) {
				targetElements = target.actor().meta['TP_ELEMENTS']; // ターゲットが味方なら
				} else if (target.isEnemy()) {
				targetElements = target.enemy().meta['TP_ELEMENTS']; // ターゲットが敵なら
			}

            // 属性が一致するかをチェックし、一致すればダメージ倍率を1.3倍に設定
            if (targetElements && elements.some(element => targetElements.includes(element))) {
                damageMultiplier = BonusRate;
            }
        }

        // ダメージ計算式をevalで評価します
        var value = Math.max(eval(damageFormula), 0); // ダメージがマイナスにならないように0でクランプ
        value = Math.floor(value * target.tcr * damageMultiplier);
        target.gainTp(-value);
    };
})();
他に必要な情報等あれば記載します。
よろしくお願いいたします。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月21日(金) 22:59
by Plasma Dark
各メモタグの意味を書いていただけると、コードの意図が伝わりやすいかと思います。

スキルのメモタグ
<TP_DAMAGE:f>
効果適用時に対象のTPにfの式を評価したダメージを与えるスキルであることを表す。
特にスキル使用者や対象者の情報は使用しない?

<TP_ELEMENTS:e1,e2,...>
スキルのTPダメージは、カンマ区切りで指定した属性を持つ。
属性はどう指定する?
データベースのタイプで指定される名前?

アクター・敵キャラのメモタグ
<TP_ELEMENTS:e1>
アクター・敵キャラのTPダメージ属性に対する弱点を表す何か?
TPダメージ属性の弱点は、各バトラーが持つ属性有効度とは独立した概念?

以上を踏まえてコードを整理するとこんな感じになります。
https://gist.github.com/elleonard/f0648 ... 11203027f8
getTpWeakElements に弱点属性リストを返すような記述をすれば、意図通りの動きになるのではないかと思います。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月21日(金) 23:47
by sisimaru69
スキルのメモタグ
<TP_DAMAGE:f>
そのスキルの基礎ダメージ値を想定しています。
スキル使用者や対象者のパラメーターも参照できればいいのですが、方法が分からず暫定でこうなっています。

<TP_ELEMENTS:e1,e2,...>
これはデータベースの属性番号で指定できればと考えています。

アクター・敵キャラのメモタグ
<TP_ELEMENTS:e1>
各バトラーが持つ属性有効度で問題ないですね;
装備で属性有効度を変化させられることを失念していました。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月22日(土) 00:52
by sisimaru69
追記になりますが、この仕様にしたい目的は
まずTPをバリアのように扱いたい。TPがある間にHPにダメージを与えたくない。
TPを0にすると特定のステートが付与されて割合ダメージを発生させる。
ダメージを与えるとステートは解除されてTPが100に戻る。
この部分は既存のプラグインでできています。

その上で弱点属性を実装したいなと思ったのですが、通常ダメージタイプを設定しないと属性は設定できないようなので、スキルのメモ欄にタグを設定することで擬似的に属性を付与できないかと思い色々やってみまして、自分が貼ったコードで一応動作はしていますが、味方側の弱点属性を変動させる部分がうまく行かずに今回投稿させてもらいました。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月22日(土) 03:42
by Plasma Dark
スキル使用者や対象者のパラメーターも参照できればいいのですが、方法が分からず暫定でこうなっています。
rpg_objects.js にある Game_Action.prototype.evalDamageFormula が参考になります。
evalで評価する前に a, b, vといった変数を上記関数と同様に定義することで、 a.atk など、ダメージ計算と同じ記述が可能になります。
これはデータベースの属性番号で指定できればと考えています。
そうなると、数値型で扱うほうが間違いがなくて良さそうです。
splitで配列にした後、それぞれについてmapでNumber型に変えてあげると良いでしょう。

コード: 全て選択

const skillElements = this.item().meta['TP_ELEMENTS'].split(',')
  .map(elementId => Number(elementId)); // メモ欄の属性をカンマで区切って配列に変換
各バトラーが持つ属性有効度で問題ないですね;
プラグインパラメータで設定する倍率(デフォルト1.3倍)を使わず、属性有効度を使うのであれば、 target.elementRate(elementId) が利用できます。
ツクールMVのデフォルト属性倍率計算同様に、複数属性のうち最も高い有効度の属性を用いるのであれば、更に簡単で this.elementMaxRate(target, elements) が利用できます。

私が提示したコード中の Game_Action.prototype.tpDamageRate において、その計算結果を返すだけですね。

コード: 全て選択

return this.elementMaxRate(target, skillElements);
属性有効度関係なく設定したい場合のために用意していた isTpWeakElement, getTpWeakElements 関数は不要になったので消しても問題ありません。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月22日(土) 09:25
by sisimaru69
ご返信ありがとうございます。
まずは頂いたコードを参考にやってみます。

またつまったら質問させてもらうかもしれませんが、よろしくお願いいたします。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月22日(土) 13:35
by sisimaru69
またちょっとエラーの修正の仕方がわからないので質問させてください。

コード: 全て選択

(() => {
  'use strict';

  const pluginName = 'TPdamageKAI4';
  const parameters = PluginManager.parameters(pluginName);
  const damageBonusRate = parseFloat(parameters['BonusRate'] || 1.3);

  const _Game_Action_apply = Game_Action.prototype.apply;
  Game_Action.prototype.apply = function (target) {
    _Game_Action_apply.apply(this, arguments);
    if (!target.result().isHit()) return;
    if (!this.item().meta['TP_DAMAGE']) return;

    const tpDamage = this.makeTpDamageValue(target); // targetを引数として渡す
    target.gainTp(-tpDamage); // TPを減らす
  };

  Game_Action.prototype.makeTpDamageValue = function (target) {
    return Math.floor(this.evalTpDamageFormula() * target.tcr * this.tpDamageRate());
  };

  Game_Action.prototype.evalTpDamageFormula = function (target) {

	
	const damageFormula = this.item().meta['TP_DAMAGE'];
    // ダメージ計算式をevalで評価します
    return Math.max(eval(damageFormula), 0); // ダメージがマイナスにならないように0でクランプ
  };

  Game_Action.prototype.tpDamageRate = function (target) {
    if (!this.item().meta['TP_ELEMENTS']) {
      return 1.0;
    }
    const skillElements = this.item().meta['TP_ELEMENTS'].split(',')
	.map(elementId => Number(elementId)); // メモ欄の属性をカンマで区切って配列に変換

    return this.elementsMaxRate(target, skillElements);
  };


})();
上記のコードで実行すると
Desktop Screenshot 2023.07.22 - 13.29.11.51.png
このようなエラーが表示されます。
どう直せばいいか分からず、教えてもらえたらと思います、

よろしくお願いします。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月22日(土) 15:25
by Plasma Dark
エラーメッセージとstacktraceを見ると、どこで何が起きているのかわかるようになっています。
Cannot read property 'elementRate' of undefined
undefinedなシンボルに対して .elementRate を参照しようとしてエラーが起きています。
その後、 rpg_objects.js:1716 とあるので、 rpg_objects.js の1716行目でエラーが起きていることがわかります。

つまり、 elementsMaxRate 関数に渡された target がundefinedになってしまっています。
その関数呼び出しの経路を辿っていくと……すみません。 tpDamageRate 関数に target を渡しておくのを忘れていますね。
tpDamageRate 関数の引数に target を追加して、 makeTpDamageValue から呼び出すときにも target を渡してあげれば解決しそうです。

Re: 属性によってTPに与えるダメージを変動させるシステム

Posted: 2023年7月22日(土) 17:14
by sisimaru69
ありがとうございます!無事にできました!

あとはこれをベースにダメージ計算などを組み込んでいこうと思います。
助かりました。本当にありがとうございました!