ページ 11

【解決済み】HP0以外の条件(MP0)でもHP0と同じような(敵を倒した際の)処理を実現する方法

Posted: 2024年6月01日(土) 13:50
by kreisring
具体的には、FF6の魔法生物のようにMPが0になったら戦闘不能になる敵キャラを作ろうとして、トリアコンタン様作のプラグイン「ConditionalState.js」(ver.1.2.1)を使って当該敵キャラ(最大MPは1000に設定)のメモに
<CS_下限MP:0,1>
と記載したのですが、MPダメージの計算式「b.mp」を設定したスキルやアイテムでMPを1000減らしても戦闘不能になりませんでした。

切り分けとして敵キャラのメモタグを
<CS_下限MP:1,1>
に変えたところ、MPダメージ1000を与えた場合もMPダメージの計算式「b.mp - 1」を設定したスキル・アイテムでMPを999減らした場合もダメージのポップアップなし(ログにもダメージ表示なし)で戦闘不能の処理がされました。

代替策としてケケー様作のプラグイン「Keke_ReactionSkill.js」(ver1.6.0)を使って「MPを0にする攻撃に対するカウンターとして自分に戦闘不能を付与するスキルを使う」ことでMP0での戦闘不能を実現しましたが、これもステートで行動制約がされていると発動できず(FF6でいうところのカウンター封じやファイナルアタック封じのような状態)、万全ではありません。

ターン終了のタイミングなどではなく条件を満たした瞬間に、行動制約などの影響を受けずにMP0で(可能であればそれ以外の条件でも)通常と同じような戦闘不能の処理ができる方法をご教示いただけますでしょうか。

Re: HP0以外の条件(MP0)でもHP0と同じような(敵を倒した際の)処理を実現する方法

Posted: 2024年6月01日(土) 19:59
by 名無し蛙
「HP0になると戦闘不能になる」という処理がこの部分なのでここに合わせて拡張すれば良いのでは。

コード: 全て選択

Game_Battler.prototype.refresh = function() {
    Game_BattlerBase.prototype.refresh.call(this);
    if (this.hp === 0) {
        this.addState(this.deathStateId());
    } else {
        this.removeState(this.deathStateId());
    }
};
適当にプラグイン化するならこんな感じですか?
テストプレイもしてないのでエラーが出るかもしれませんが。
エネミーのメモ欄に<魔法生物>と書けばONになると思います。

コード: 全て選択

/*:
 * @target MZ
 * ver1.1.0
 */

(() => {
    'use strict'

    const _refresh = Game_Enemy.prototype.refresh;
    Game_Enemy.prototype.refresh = function() {
        _refresh.apply(this, arguments);
        if (this.enemy().meta['魔法生物'] && this.mp === 0) {
            this.addState(this.deathStateId());
        }
    };
    
    const _canPaySkillCost = Game_Enemy.prototype.canPaySkillCost;
    Game_Enemy.prototype.canPaySkillCost = function(skill) {
        if (this.enemy().meta['魔法生物']) {
            return (
                this._tp >= this.skillTpCost(skill) &&
                this._mp >= this.skillMpCost(skill) + 1
            );
        } else {
            return _canPaySkillCost.apply(this, arguments);
        }
    };

    Window_BattleLog.prototype.displayMpDamage = function(target) {
        if (target.result().mpDamage !== 0) {
            if (target.result().mpDamage < 0) {
                this.push("performRecovery", target);
            }
            this.push("addText", this.makeMpDamageText(target));
        }
    };    
})();
追記:テストして違和感あった部分を修正しました
a.デフォルトで「MPダメージと同時に死亡した場合ログ表示をカットする」
という条件が付いているのでこれを削除
b.エネミー自身のスキルコストでちょうどMP0になった場合挙動がおかしくなるので
<魔法生物>に限りmp1以上残らないとスキルが不発になるように修正

Re: HP0以外の条件(MP0)でもHP0と同じような(敵を倒した際の)処理を実現する方法

Posted: 2024年6月14日(金) 14:59
by kreisring
名無し蛙様

質問したその日のうちに回答いただいていたようでありがとうございます!

プラグインのほうを使い、戦闘テストの相手にHP999999 MP1000の魔法生物を用意して、
戦闘の初手で敵のMPを0にする(タイプ:MPダメージ 計算式:b.mp)アイテム「MPバスター」を使ったら、
想定通りMPが1000減ったメッセージに続いて、倒したメッセージが出て魔法生物が消えました!

このままありがたく使わせていただきます!
ありがとうございました!