【解決済み】BattleManager.processVictory(); で戦闘勝利させるとメッセージが戦闘終了後のマップ画面で発生する

しらそまん
記事: 20
登録日時: 2018年3月12日(月) 22:50

【解決済み】BattleManager.processVictory(); で戦闘勝利させるとメッセージが戦闘終了後のマップ画面で発生する

投稿記事by しらそまん » 2021年10月07日(木) 02:12

お世話になっております。

敵が残っていても勝利にしたいと思い、BattleManager.processVictory();のスクリプトを用いてみました。
こちらで勝利することは可能なのですが、即座に戦闘画面から離脱して経験値やお金獲得のメッセージが戦闘終了後のマップ画面で発生してしまいます。

こちらを修正する方法はなにかありますでしょうか?

よろしくお願いいたします。
最後に編集したユーザー しらそまん on 2021年10月16日(土) 06:06 [ 編集 2 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: BattleManager.processVictory(); で戦闘勝利させるとメッセージが

投稿記事by Plasma Dark » 2021年10月07日(木) 16:06

即座に戦闘画面から離脱して経験値やお金獲得のメッセージが戦闘終了後のマップ画面で発生してしまいます。


BattleManager.processVictory(); のみを実行するコモンイベントを呼び出すスキルや、バトルイベントのスパンをバトルやターンにして再現を試みましたが、再現しませんでした。
どのようにprocessVictoryを呼んでいるのでしょう。
しらそまん
記事: 20
登録日時: 2018年3月12日(月) 22:50

Re: BattleManager.processVictory(); で戦闘勝利させるとメッセージが

投稿記事by しらそまん » 2021年10月07日(木) 20:31

お返事ありがとうございます。

スクリプトを実行で BattleManager.processVictory(); で呼び出しています。
スキルでコモンイベントを呼び出し、その中で勝利条件を満たした時に実行するようにしています。

こちらでもいろいろ試してみたのですが、BattleManager.processVictory();のあとに何もイベントがないと表題の動作になり、何かしら実行するイベントが有るときは戦闘中にメッセージが発生する正しい動作になりました。
とりあえずダミーでメッセージを差し込めばそのイベントは戦闘後には表示されないようなので動作としてはうまくいくようになりました。

一応はこれで大丈夫なのですが、こちらから考えられる原因はわかりますでしょうか?

以上です。お手数ですがよろしくお願いいたします。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: BattleManager.processVictory(); で戦闘勝利させるとメッセージが

投稿記事by Plasma Dark » 2021年10月07日(木) 21:53

すみません。検証用プロジェクトが壊れていたので再現できないだけでした。
普通に、スキルでコモンイベントを呼び出し、 BattleManager.processVictory(); すると戦闘から抜けてマップ上でメッセージが出てしまいますね。

お試し頂いたように、空メッセージを後ろに付け足すだけでも解決はします。

以下のようなプラグインを入れて対応する手もあります。( processVictory を直接呼び出すのではなく、プラグインコマンドで通常の勝利条件を満たしたときと同じような処理を行わせます)
https://gist.github.com/elleonard/20d6324fb756cb8540765bffd09ca59a

以下、詳しい原因の解説になります。
BattleManager.processVictory(); は、戦闘のフェーズを戦闘終了フェーズに移行させる副作用を持ちます。
通常、勝利条件を満たした場合、 BattleManager.processVictory() を実行するメソッド checkBattleEnd が真を返します。
これによって BattleManager.update() のループから抜けて Scene_Battle に制御が移り、メッセージの表示を終えてから、戦闘終了フェーズの処理によってマップへ戻ります。

BattleManager.processVictory() を単体で実行してしまうと、 checkBattleEnd が偽を返し、 Scene_Battle に制御が戻ることなく、即座に戦闘終了フェーズの処理 updateBattleEnd が呼び出されてしまいます。
メッセージの表示を待たずに戦闘終了フェーズの処理によってマップへ戻り、その後でメッセージが処理されてしまう、というわけです。
しらそまん
記事: 20
登録日時: 2018年3月12日(月) 22:50

Re: BattleManager.processVictory(); で戦闘勝利させるとメッセージが

投稿記事by しらそまん » 2021年10月08日(金) 01:47

ありがとうございます。

とりあえず空メッセージが簡単なのでこちらで処理しようと思います。

丁寧なご対応ありがとうございました!

“MV:質問” へ戻る