要望:アクターのステータス成長に基づいてステータスを上昇させるアイテム

やりたいことは以下の通りです。

キャラクターがレベルアップごとに、攻撃力+6、防御力+3、魔法攻撃力+6、魔法防御力+3、敏捷性+6、幸運+6を獲得する。

このアイテムは、ステータスの固定値付与ではなく(コモンイベントやスクリプトを使用して)これらのステータス上昇をシミュレートするものであるべき。

また、Yanfly Engineプラグインを使用しています。

これは小さなプラグインで作るのが一番簡単だと思います。各アクターの成長値をクラスから直接読み取るので、成長速度が異なるアクターであっても同じアイテムを使用できます。

プロジェクトの js/plugins フォルダに「LevelGrowthItems.js」という名前の新規テキストファイルを作成し、以下のコードを貼り付けてください。その後、プラグインマネージャーで Yanfly のプラグインより下に追加してください。

/*:
 * @plugindesc Items with <Level Growth> in their note give the target one level's worth of stat growth.
 */
(function() {
    function levelGrowth(actor) {
        var level = actor._level;
        var high = Math.min(level + 1, actor.maxLevel());
        var low = high - 1;
        for (var i = 2; i < 8; i++) {
            actor._level = high;
            var gain = actor.paramBase(i);
            actor._level = low;
            gain -= actor.paramBase(i);
            actor._level = level;
            actor.addParam(i, gain);
        }
    }

    var _testApply = Game_Action.prototype.testApply;
    Game_Action.prototype.testApply = function(target) {
        if (this.item().meta['Level Growth'] && target.isActor()) {
            return this.isForDeadFriend() === target.isDead();
        }
        return _testApply.call(this, target);
    };

    var _apply = Game_Action.prototype.apply;
    Game_Action.prototype.apply = function(target) {
        _apply.call(this, target);
        if (this.item().meta['Level Growth'] && target.isActor() && target.result().isHit()) {
            levelGrowth(target);
            this.makeSuccess(target);
        }
    };
})();

次に、アイテムの説明欄に <Level Growth> を記載し、範囲を「1人の味方」に設定してください。使用すると、アクターは次のレベルアップ時に得られる攻撃力、防御力、魔攻力、魔防力、敏捷性、運の成長分を獲得します。最大HPと最大MPも含める場合は、i = 2 を i = 0 に変更してください。

「いいね!」 1

いいですね。でも、共通イベントで適用できるバージョンはありますか?(大量にある場合で、入力数値イベントを使ってそれぞれを追加しているためです)

あと、すべてのステータスも含めてください。

例:入力数値が125の場合、変数を125に設定し、その効果を125回繰り返す

このバージョンには最大HPと最大MPが含まれ、コモンイベントから使用できるスクリプト呼び出しが追加されています。LevelGrowthItems.js内のすべての内容を次のコードに置き換えてください:

/*:
 * @plugindescレベルアップ時のステータス成長を <Level Growth> アイテムまたはスクリプト呼び出しで処理します。
 */
(function() {
    Game_Actor.prototype.gainLevelGrowth = function(times) {
        if (times === undefined) times = 1;
        var level = this._level;
        var high = Math.min(level + 1, this.maxLevel());
        var low = high - 1;
        for (var i = 0; i < 8; i++) {
            this._level = high;
            var gain = this.paramBase(i);
            this._level = low;
            gain -= this.paramBase(i);
            this._level = level;
            this.addParam(i, gain * times);
        }
    };

    var _testApply = Game_Action.prototype.testApply;
    Game_Action.prototype.testApply = function(target) {
        if (this.item().meta['Level Growth'] && target.isActor()) {
            return this.isForDeadFriend() === target.isDead();
        }
        return _testApply.call(this, target);
    };

    var _apply = Game_Action.prototype.apply;
    Game_Action.prototype.apply = function(target) {
        _apply.call(this, target);
        if (this.item().meta['Level Growth'] && target.isActor() && target.result().isHit()) {
            target.gainLevelGrowth(1);
            this.makeSuccess(target);
        }
    };
})();

次に、コモンイベント内で「数値入力処理」の直後に、スクリプトコマンドを追加し、次の行を入力してください。1を、数値入力処理で変数に保存されるIDに書き換えてください:

$gameParty.targetActor().gainLevelGrowth($gameVariables.value(1));

$gameParty.targetActor() は、メニューからアイテムを使用した際に選択されたキャラクターを指します。そのため、アイテムにはコモンイベントの効果として、作成したコモンイベントを呼び出し、範囲を「味方1名」、タイミングを「メニュー画面」に設定します。また、追加のレベル分が余計に付与されないよう、メモ欄の <Level Growth> タグも削除してください。さらに、消費アイテムを「いいえ」に設定し、コモンイベント内で「アイテムの増減」コマンドを使って、同じ変数の数値分だけ減少させるようにしてください。

NPCなど他の場所からコモンイベントを実行したい場合は、$gameParty.targetActor() を $gameActors.actor(1) に置き換え、1の部分をキャラクターIDに変更してください。