バフ、デバフの効果量を術者の能力値依存にする方法について

返信する
香具師
記事: 2
登録日時: 2023年7月13日(木) 23:32

バフ、デバフの効果量を術者の能力値依存にする方法について

投稿記事 by 香具師 »

みなさん、はじめまして。
香具師と申します。
ツクール歴はまだ始めて一月未満で、プログラミングの経験もない初心者ですが、よろしくお願いします。

現在、敵味方の能力値を上下させる、いわゆるバフ、デバフのスキルを作っております。
専用ステートを用意して対象の能力値を割合で上下させるスキルを作る一方、効果量を術者の能力値に依存させるスキルも作りたいと考えております。
例えば、バフ、デバフの効果量を術者の魔法力依存にして、スキルの対象となったユニットの能力値に影響されず常に同じだけの効果量を発揮すると言うようなスキルです。

そのような効果のプラグインを探しましたが、対象の能力値を元に効果量を決めるものしか見つけることができませんでした。
また、rmmz_objects.js をいじれば、効果量を固定の数値にする事はできそうですが、それを術者の能力値に書き換える事は現在の自分には難しいように思われました。

この様な効果のプラグインが既に存在するならば、どちらにあるか教えていただけないでしょうか。
また、その様なプラグインがない場合、今後時間をかけてスクリプトを学んでいくつもりですが、多少の知識でプラグインを自作できるレベルの問題であるかどうか、教えていただけないでしょうか。
よろしくお願いします。
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: バフ、デバフの効果量を術者の能力値依存にする方法について

投稿記事 by Plasma Dark »

既存のプラグイン有無についてはもっと詳しい方がいらっしゃると思うので、そちらにお譲りします。
多少の知識でプラグインを自作できるレベルの問題であるか
これについて回答します。

知識はもちろん効率よくコードを書くためには重要ですが、実はJavaScriptについて言えば、そこまで深い知識がなくとも書くことはできます。
プラグインがコアスクリプトの処理を上書きしていることだけわかれば、規模の小さいプラグインをちょっと書き換えて動かしてみたり、見様見真似で新しいプラグインを書いたりできると思います。
文法については、MDNJSprimerといったサイトで調べればだいたいわかります。

より重要なのはツクールの知識です。
プラグインを書こうとする際、その仕様を設計の段階から決めておく必要があります。
元々のツクールがどういう仕組でステートや強化・弱体を実現しているのか、その仕組をどういう風に変更したり拡張したりするのかについて、ツクールの用語を用いながら日本語で文章化することが、まず第一歩になります。

例えば、今回の例で言えば

スキルの使用効果でステート付加した場合に、ステートが付加された対象の通常能力値を、スキル使用者の能力に応じて固定値で増減させたい

であるのか

スキルの使用効果で強化・弱体を付加した場合に、強化・弱体の効果量をスキル使用者の能力に応じて固定値で決定したい

であるのか

自分でプラグインを書くにしても人に書いてもらうにしても、こういった要件の言語化は読む人に誤解なく伝わるような表現が望ましいです。
次の書き込みでは、後者としてツクールの仕組とプラグイン開発のアプローチを簡単に説明します。
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: バフ、デバフの効果量を術者の能力値依存にする方法について

投稿記事 by Plasma Dark »

ツクールがどういう仕組で強化・弱体を実現しているのかは、
_buffs で rmmz_objects.js 内を検索して眺めてみるとわかりやすいです。

Game_BattlerBase クラス(バトラーを表すクラス)のインスタンス(アクターや敵キャラの実体)は _buffs という数値型の配列を持っています。
これは、各通常能力値について、何段階の強化・弱体がかかっているかを表します。
例えば、攻撃力に強化が2段階入っていれば、 _buffs[2] の値は 2 になります。
防御力に弱体が1段階入っている場合は、 _buffs[3] の値が -1 になります。

これによる能力値増減を決めているのは Game_BattlerBase.prototype.paramBuffRate 関数です。
この関数は _buffs の値に対して、0.25をかけて1を足した値を返しています。
この関数から返される値が、強化・弱体による能力値変化の割合です。
Game_BattlerBase.prototype.param 関数内で能力値を計算する際に、この倍率を掛け算しています。
2段階の強化なら 1.5、1段階の弱体なら 0.75 が返りますから、それぞれ元の能力値の50%アップ、25%ダウンとなりますね。

これで強化・弱体の仕組については概ねわかりました。次はプラグイン開発のアプローチを考えてみます。
まず、簡単のために強化1段階の場合は10、2段階の場合は20だけ能力値を増減させるプラグインを作ってみて、スキル使用者に依存させるのは後回しにします。
paramBuffRate 関数の戻り値は能力値計算の際に掛け算されてしまうので、ひとまず1.0を返すように変更してしまいます。
param 関数の計算に、強化・弱体による固定値の増減を組み込むため、この増減量を返す関数を新しく定義します。
あとは param 関数の計算に新しく定義した関数での計算を組み込めば……

コード: 全て選択

(() => {
  'use strict';

  Game_BattlerBase.prototype.paramBuffRate = function (paramId) {
    return 1.0;
  };

  Game_BattlerBase.prototype.paramBuffValue = function (paramId) {
    return this._buffs[paramId] * 10;
  };

  const _param = Game_BattlerBase.prototype.param;
  Game_BattlerBase.prototype.param = function (paramId) {
    const value = _param.call(this, paramId) + this.paramBuffValue(paramId);
    return value.clamp(this.paramMax(paramId), this.paramMin(paramId));
  };
})();
強化・弱体による能力値増減を固定値にするプラグインの完成です。

さて、強化・弱体の元となるスキルの使用者の能力値に依存させるにはどうすれば良いかというと、これも細かな仕様によって方針が変わります。
1. リアルタイムでスキル使用者の能力値を参照する
2. スキル使用時点のスキル使用者の能力値を参照する

1は考えることが増えるため、いきなり挑戦するのは難しいかと思います。2のほうがシンプルに済みます。
強化・弱体の付加時に強化・弱体の強さ(能力値増減量)をスキル使用者の能力値に応じて対象のバトラーに設定することができれば、それで済みますからね。

今回はシンプルに、スキル使用者の能力値の10%を設定してみます。
Game_BattlerBaseクラスには強化・弱体の持続ターンを記録するための _buffTurns 配列がありますので、それに倣って能力値増減量を配列で記録します。
今回は _buffValues という名前にしておきます。
_buffTurns に倣って初期化したり、強化・弱体付与の成功時にその値を計算して設定したり、先程作った paramBuffValue で参照したりすれば完成です。
https://gist.github.com/elleonard/af6eb ... fee625096c

ただし、まだ考えるべきことがあります。
今回作ったプラグインでは、強化と弱体について能力値増減を共有してしまっています。
つまり、2段階強化されている対象に1段階の弱体を入れた場合、強化は1段階に減るものの、能力値増減量が増えてかえって強くなってしまう可能性があります。
強化と弱体で能力値増減量を表す配列を別にして、 paramBuffValue で分岐してあげるのがシンプルでしょうか。

強化や弱体を別々のスキル使用者から重ねてかけられる場合、後にかけるスキルの使用者の能力が優先されてしまう、というのも、ゲームの仕様次第では問題になりそうです。
能力値増減量の計算の際に用いるスキル使用者の能力値は、強化・弱体の影響を受けた後のものとしていますが、これもゲームによっては仕様を考えたほうが良いでしょう。
このあたりの細かいことを考え始めると大変かもしれません。
香具師
記事: 2
登録日時: 2023年7月13日(木) 23:32

Re: バフ、デバフの効果量を術者の能力値依存にする方法について

投稿記事 by 香具師 »

Plasma Darkさん、丁寧にご教示いただき本当にありがとうございます。
基礎を学ぶための参考サイトまで示していただき、感謝の極みです。
濃密な情報量で咀嚼に時間を要すると思われるので、まずはお礼だけ先に述べさせていただきます。
返信する

“MZ:質問”に戻る