【解決】「特殊効果:逃げる」のバグを修正するプラグイン2種で起こる問題について

ほげほげ

ユーザー
味方全員に対して「特殊効果:逃げる」を使用すると、ゲームオーバーになってしまうかと思います。

この現象に対処するプラグインは、
・トリアコンタン様のBugFixFreezeOfSkillEscape.js
・GrayOgre様のFixSpecialEffectEscape.js
が存在するようです。
しかしどちらのプラグインも同じ問題があるようです。

「特殊効果:逃げる」を使用時にすでに戦闘不能になった味方が居る場合、
その「特殊効果:逃げる」を使用するたびに、繰り返し、すでに戦闘不能になった味方について、
戦闘後に数歩歩いた時点で、改めて「メンバーAは倒れた」という表示がされてしまいます。

現時点で自分が確認している挙動の流れは以下の通りです。
・戦闘に入る
・敵の攻撃により味方が戦闘不能になり「メンバーAは倒れた」の表示
・「特殊効果:逃げる」を味方全員に使用するアイテムを使用
・味方全員が逃げ戦闘終了
・数歩歩くと再度「メンバーAは倒れた」の表示
・別の戦闘に入る
・「特殊効果:逃げる」を味方全員に使用するアイテムを使用
・味方全員が逃げ戦闘終了
・数歩歩くと再度「メンバーAは倒れた」の表示

この問題に対処できるプラグインは現時点ではないと思っています。
この問題に対処できない深い理由があるものなのでしょうか?
それとも偶然どなたもこの問題に気付かれてない状況なのでしょうか?
どなたか教えてください。
よろしくお願いいたします。
 

DarkPlasma

ユーザー
実は、ツクールMV/MZには特殊効果:逃げるによって逃走したバトラーのステートはすべて解除されるという謎の仕様があります。
これによって、戦闘不能アクターを特殊効果:逃げるで逃走させた場合、HP0であるにも関わらず戦闘不能ステートが解除された状態になり、しばらく歩くと戦闘不能になった判定されるというわけです。

この問題に対処できない深い理由があるものなのでしょうか?
それとも偶然どなたもこの問題に気付かれてない状況なのでしょうか?

Game_Actor.prototype.escape をフックするなりして戦闘不能ステートだけ解除されないようにしてしまえば対処は可能です。
特殊効果:逃げるを使うケースが稀なので誰も気づいてないんじゃないかと思います。
 

ほげほげ

ユーザー
ありがとうございます!
なるほど、ようやく理由がわかりました。
謎仕様ですね…。

Game_Actor.prototype.escape をフックするなりして戦闘不能ステートだけ解除されないようにしてしまえば対処は可能です。
特殊効果:逃げるを使うケースが稀なので誰も気づいてないんじゃないかと思います。

自分の場合は「使うと必ず逃げることができるアイテム」を設定したことで、この問題にぶつかりました。
皆さん「特殊効果:逃げる」をあまり使われないのですね。

「戦闘不能ステートだけ解除されないようにする」技術が自分にはないので、
いつかお詳しい方々がプラグインを作ってくださる日を待つしかなさそうですね…。
ありがとうございます!
 

chronicle

ユーザー
バグ修正というのは、MVのVer1.3.3以下の場合、フリーズするというものですね。
RPGツクールMV アップデートVer.1.3.4配信開始
MVはゲームオーバーにならない、MZはゲームオーバーになるのが仕様(公式ヘルプ)です。
ちなみに戦闘の処理で逃走可の場合はゲームオーバーになりません。

戦闘不能者がアイテム/スキルで逃げるのは想定外なのと、戦闘終了時やターンで自動解除させるステートが(実行時に)残ったままになるので、ステート全解除なのかと思います。


追加変更:
通常の戦闘終了時と同じような仕様になるよう、更新しました。
戦闘終了後も消えずに残るバフは削除します。

スキル/アイテム使用時には、全てのステートが維持されます。

追加2:
タイムプログレス(アクティブ)時、条件によって進行不能になるバグを修正します。

JavaScript:
(function () {
  'use strict'

    const _initMembers = Game_Battler.prototype.initMembers;
    Game_Battler.prototype.initMembers = function() {
        _initMembers.apply(this, arguments);
        this._escapedKeepStates = false;
        this._escapedRemoveBuff = false;
    };
   
    const _escape = Game_Battler.prototype.escape;
    Game_Battler.prototype.escape = function() {
        this._escapedKeepStates= true;
        _escape.apply(this, arguments);
        this._escapedKeepStates = false;
        this._escapedRemoveBuff = true;
    };

    const _clearStates = Game_Battler.prototype.clearStates;
    Game_Battler.prototype.clearStates = function() {
        if (this._escapedKeepStates) return;
        _clearStates.apply(this, arguments);
    };

    const _onBattleEnd = Game_Battler.prototype.onBattleEnd;
    Game_Battler.prototype.onBattleEnd = function() {
        _onBattleEnd.apply(this, arguments);
        if (!this._escapedRemoveBuff) return;
        this.removeAllBuffs();
        this._escapedRemoveBuff = false;
    };

    const _Sprite_Battler_update = Sprite_Battler.prototype.update;
    Sprite_Battler.prototype.update = function() {
        _Sprite_Battler_update.apply(this, arguments)
        if (!this._battler && this.isMoving()) this._movementDuration = 0;
    };

})();
 
最後に編集:

ほげほげ

ユーザー
chronicle様

ありがとうございます!
・GrayOgre様のFixSpecialEffectEscape.js
・chronicle様が書いてくださったプラグイン
の併用で解決できました。
ありがとうございました。

自分が勘違いしていた点もあったため、以下、訂正も兼ねて2点記載します。

①バグ修正に係る勘違いについて
バグ修正というのは、MVのVer1.3.3以下の場合、フリーズするというものですね。
RPGツクールMV アップデートVer.1.3.4配信開始
MVはゲームオーバーにならない、MZはゲームオーバーになるのが仕様(公式ヘルプ)です。
自分がMZしか使ったことがなく、MVのフリーズ現象をよく分かっておらず、
MVのフリーズとMZのゲームオーバーを混同して勘違いしていました。
その結果、当初の自分の状況説明が分かりにくいものとなっていたようです。
申し訳ありませんでした。
このMZの仕様は、これまで同様、GrayOgre様のFixSpecialEffectEscape.jsで回避することにしました。

②MZの仕様について
MVはゲームオーバーにならない、MZはゲームオーバーになるのが仕様(公式ヘルプ)です。
ちなみに戦闘の処理で逃走可の場合はゲームオーバーになりません。
MZのVer1.3.2と最新Ver1.3.3で改めて試してみたのですが、
逃走可の場合であっても、どうやらゲームオーバーになるようです。
これは、chronicle様が書いてくださったプラグインで回避することができました。

おかげさまで解決しました。
皆様ありがとうございました。
 

mizu

ユーザー
すいません。
解決済みのところ横から失礼致します。

この記事を見てツクールにそんな仕様があった事に驚いているのと、
大変勉強になりました。

上記2つのプラグインを入れてRPGツクールMZで自分でも試してみたのですが、
ステートに関しては問題ないのを確認致しました。

ただ、特殊効果で逃げるを行った際に
プレイヤーに付与されたバフが残ったままになってしまいます。(攻撃力低下などのバフ

通常パーティーコマンドの逃げるではバフは消えますので、
できれば消したいと考えています。

自分で加筆修正できればと思ったのですがうまくいかず、
皆様のお力添えをいただければと思いました。

何卒よろしくお願い致します。
 

chronicle

ユーザー
MZのVer1.3.2と最新Ver1.3.3で改めて試してみたのですが、
逃走可の場合であっても、どうやらゲームオーバーになるようです。
すいません、逃走可と敗北可の時です。

MVについては、そのMV用プラグインをMZで動かすと問題が起こらないか気になったからです。
 

chronicle

ユーザー
ただ、特殊効果で逃げるを行った際に
プレイヤーに付与されたバフが残ったままになってしまいます。(攻撃力低下などのバフ
バフはリセットされない仕様です。(追記:TPは通常通りリセットされます)

戦闘中に特定のバトラーが抜ける事になるので、戦闘終了処理が行われない形です。

プラグインで戦闘終了時の処理があった場合にも問題になるので、通常の戦闘終了時や逃走時と同じ仕様にしようと思います。

明日そのバージョンも追加します。
 
最後に編集:

mizu

ユーザー
バフもTPもリセットされない仕様です。

戦闘中に特定のバトラーが抜ける事になるので、戦闘終了処理が行われない形です。

プラグインで戦闘終了時の処理があった場合にも問題になるので、通常の戦闘終了時や逃走時と同じ仕様にしようと思います。

明日そのバージョンも追加します。
回答ありがとうございます。
通常の戦闘終了時・逃走時と同じ仕様だと助かります。

バージョンも追加していただけるとの事感謝致します。
何卒よろしくお願い致します。
 

chronicle

ユーザー
通常の戦闘終了時・逃走時と同じ仕様だと助かります。
一応同じような(バフがリセットされる)仕様になるバージョンに差し替えました。
内部的には面倒で複雑な状態なので、プラグインによっては影響が出てしまいます。

TPは元々影響を受けなかった為問題はなかったです。

もし味方全員を対象にしたい場合は、パーティーコマンドの逃げると同じ動作(逃走確率は自由に設定)をするプラグインは制作可能なので、その方がいいです。
 

mizu

ユーザー
一応同じような(バフがリセットされる)仕様になるバージョンに差し替えました。
内部的には面倒で複雑な状態なので、プラグインによっては影響が出てしまいます。

TPは元々影響を受けなかった為問題はなかったです。

もし味方全員を対象にしたい場合は、パーティーコマンドの逃げると同じ動作(逃走確率は自由に設定)をするプラグインは制作可能なので、その方がいいです。
ありがとうございました!
確かにプラグインの状態によっては多少影響が出そうです。
プラグイン導入順は現在のところ

・chronicle様が書いてくださったプラグイン
・GrayOgre様のFixSpecialEffectEscape.js

の方がよさそうです。
また、導入はなるべく上の方にしてみたところエラー等なく起動しております。
(バフも消えますし、ステートも問題ありません)
敵の逃げるでの特殊効果も問題ありませんでした。

(実はバフが消えない症状があったため、競合があると思われます。
ただし、どのプラグインの競合かは不明でした)

また、新規プロジェクトでサイドビューのTPB(アクティブ)で試したところ
全員ゲージが溜まった状態でキャンセルをしてから特殊効果逃げるをすると
最後のキャラだけ残ってしまい戦闘が止まるという事態がありました。

回避方法としては
・NEWRPGProject様のNRP_TpbCustomize
・うなぎおおとろ様のTPB_Extension

いずれかを導入すれば回避できそうです(自分で試しただけなので保障はないです。
(原因はわかりません)

結果としては現状問題なく使用させていただいてます。
もう少しテストプレーを重ねて問題がでたらご報告致します。
ありがとうございました!
 

chronicle

ユーザー
プラグイン導入順は現在のところ

・chronicle様が書いてくださったプラグイン
・GrayOgre様のFixSpecialEffectEscape.js

の方がよさそうです。
また、導入はなるべく上の方にしてみたところエラー等なく起動しております。
(バフも消えますし、ステートも問題ありません)
敵の逃げるでの特殊効果も問題ありませんでした。

(実はバフが消えない症状があったため、競合があると思われます。
ただし、どのプラグインの競合かは不明でした)
FixSpecialEffectEscape.jsで本来行うはずの処理(Game_Battler.prototypeを呼び出す)が行われていないので、上にした場合実質的に無効化されるので、バフが消えずステートは全消し状態になります。
FixSpecialEffectEscape.jsの32行目以降を、以下に変更すれば順序は関係なくなります。
JavaScript:
    const _Game_Actor_escape = Game_Actor.prototype.hasOwnProperty('escape') ? Game_Actor.prototype.escape : null;
    Game_Actor.prototype.escape = function() {
        _Game_Actor_escape ? _Game_Actor_escape.apply(this, arguments) : Game_Battler.prototype.escape.call(this);
        this._escaped = true;
        BattleManager._escapeMemberCount++;
    }
また、新規プロジェクトでサイドビューのTPB(アクティブ)で試したところ
全員ゲージが溜まった状態でキャンセルをしてから特殊効果逃げるをすると
最後のキャラだけ残ってしまい戦闘が止まるという事態がありました。
検証した所、コマンド選択時は前に出ている状態になり、その状態で特殊効果:逃げるが使用されると、コマンドは消えるが内部的に前に出ている状態が残ってしまっていました。
3番目が4番目に使用して、4番目がコマンド選択中の場合にも発生して、
1番目がコマンド選択中の場合は、発生することはなかったりします。

その対策版に差し替えました。
これはデフォルトスキルの使用者が逃げる想定なので、想定外のバグだと思います。
 

panda

ユーザー
既に解決しているようですが、私は「必ず逃げられる」スキル・アイテムを作るのに、
イベントコマンドの「バトルの中断」を使用しています。
(「バトルの中断」を実行するコモンイベントを作って、それをスキルの特徴として指定)

バトルの中断=逃亡時の処理と同じだったと記憶しているので、
個別のアクターだけ逃げる、とかでなければそれで十分のような気がしています。
 

mizu

ユーザー
chronicle様ありがとうございました!
おっしゃられる通りプラグイン修正を行ってテストしたところ
エラーがなくなりました。

色々と試してみましたが、
今のところは問題なさそうです。

また何か問題がでましたらご報告致します。
こういう機会を設けて下さった皆々様方にも感謝致します。

ありがとうございました!
 

mizu

ユーザー
既に解決しているようですが、私は「必ず逃げられる」スキル・アイテムを作るのに、
イベントコマンドの「バトルの中断」を使用しています。
(「バトルの中断」を実行するコモンイベントを作って、それをスキルの特徴として指定)

バトルの中断=逃亡時の処理と同じだったと記憶しているので、
個別のアクターだけ逃げる、とかでなければそれで十分のような気がしています。
なるほど、
勉強になります。

後学のために
その場合は戦闘で逃走不可の時はスイッチか何かを使って
条件分岐をするのでしょうか?

おそらくコモンイベントでバトル中断のみでは
ボス戦等でも遠慮なく中断してしまいますよね。

特殊効果の逃げるでの利点はおそらく戦闘で逃走不可の時、
そのスキル自体も選択できないところにあるのではと思っています。
(ただ、色んなプラグインを入れてるのでそうなってるだけかもしれませんが…)
 

panda

ユーザー
あ、そうですね。
さすらいのトム様のスキル使用条件拡張プラグイン(ExtendSkillCondition.js)を使用して、
特定のスイッチを使用条件に設定しています。
普段はONにしておいて、ボス戦の時だけOFFにしています。
 

mizu

ユーザー
あ、そうですね。
さすらいのトム様のスキル使用条件拡張プラグイン(ExtendSkillCondition.js)を使用して、
特定のスイッチを使用条件に設定しています。
普段はONにしておいて、ボス戦の時だけOFFにしています。
回答ありがとうございます!
またひとつ良い勉強をさせていただきました。
今後のゲーム製作の参考にさせていただきます。

情報が増える事はとても良い事だなと思っています。
特にツクールを始めたばかりの人は、
絶対この特殊効果:逃げるで躓くと思います。

普通は味方も逃げられるでしょ→ゲームオーバー→なんで!?
っとなってフォーラム等を活用して情報が集まれば
悩む時間が少なくなっていいかなと思いました。

今回お世話になった皆様方大変ありがとうございました。
 

chronicle

ユーザー
色々と試してみましたが、
今のところは問題なさそうです。

また何か問題がでましたらご報告致します。
特殊効果の逃げるでの利点はおそらく戦闘で逃走不可の時、
そのスキル自体も選択できないところにあるのではと思っています。
そもそもこれだけの検証とプラグインで修正や仕様変更しなければ実用的にならないので、比較するものではないです。

今回は新規プロジェクトでも発生するコアスクリプトの仕様やバグなので対応出来ただけですので、
今後問題や競合が発生してもこちらでは対応は出来ないです。

少なくとも、公式がMVでも進行不能、MZでもTPB(アクティブ)で進行不能の深刻な不具合が発生するくらいには使用しない方がいい使い方です。

追記:バフが消えないのは、戦闘不能ステートはないけど死亡扱いになっているからという理由です。
(スクリプトやプラグインでも何らかの不具合が発生する)
 

mizu

ユーザー
そもそもこれだけの検証とプラグインで修正や仕様変更しなければ実用的にならないので、比較するものではないです。

今回は新規プロジェクトでも発生するコアスクリプトの仕様やバグなので対応出来ただけですので、
今後問題や競合が発生してもこちらでは対応は出来ないです。

少なくとも、公式がMVでも進行不能、MZでもTPB(アクティブ)で進行不能の深刻な不具合が発生するくらいには使用しない方がいい使い方です。

追記:バフが消えないのは、戦闘不能ステートはないけど死亡扱いになっているからという理由です。
(スクリプトやプラグインでも何らかの不具合が発生する)
いえいえ、
こちらこそ丁寧に対応していただきありがとうございました!
 

ほげほげ

ユーザー
しばらく見ていない間に、すっかり自分では付いていけないような難しい話になっていたようです。
自分には難しく、よく分からないのですが、chronicle様の最新のものを使わせていただきます。
chronicle様、mizu様、panda様ありがとうございました!
 
トップ