【解決済み】BattleFormationとメニュー画面にSVアクターを表示しているプラグインの競合について

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

Re: BattleFormationとメニュー画面にSVアクターを表示しているプラグインの競合について

投稿記事by Plasma Dark » 2020年4月06日(月) 02:19

直接的なエラーの原因となるのは、 BattleFormationの715行目


このエラーは戦闘可能な最大人数が描画しようとしている人数より多いために起こるものだと思われます。
BattleFormation.js で5人以上のアクターを扱おうとする場合、 FTKR_MaxBattleMembers.js による、戦闘可能な最大人数の拡張は必須です。

BattleFormation.js, TsumioMenuSystem.js, FTKR_MaxBattleMembers.js のすべてを有効にした際のエラーメッセージは異なるものだと思われますが、どう表示されていますか。

アバター
アーヴェル
記事: 27
登録日時: 2019年5月18日(土) 12:02

Re: BattleFormationとメニュー画面にSVアクターを表示しているプラグインの競合について

投稿記事by アーヴェル » 2020年4月06日(月) 10:43

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

Twitterですが、参考動画を用意させて頂きました。
最後のエラーはメニュー画面を開こうとした瞬間のエラーとなります。
https://twitter.com/LF71_S/status/1246976185357090817


プラグインはご指摘、そして動画の通り、
BattleFormation.js, TsumioMenuSystem.js, FTKR_MaxBattleMembers.js
となっております。

希望する挙動を画像に添付するため、
FTKR_MaxBattleMembers.jsにてバトルメンバー最大数を8名に設定してあります。

TsumioMenuSystemでは、各アクターのステータスにSVアクターが表示されており、
列数を8にすると画像の通り、8名が表示されている状態になっています。
(最終的な希望の状態がの列数8なので8に設定しましたが、
これを変更しても後述するエラーの条件を満たせばこちらの数値に関係なくエラーするようです)


この状態ではBattleFormationの陣形プラグインが正常に動作します。
こちらも画像に添付した状態となっております。


ただし、バトルメンバー最大数を8名とは考えては居ないため、
この最大数は減らしたいのですが、(希望数は5です)

バトルメンバー最大数 < パーティの合計メンバー数

という状態でメニュー画面を開こうとするとエラーが生じます。

これはFTKR_MaxBattleMembersに限らず、

SceneFormation
FTKR_CSS_BattleStatus

等のバトルメンバー最大数を変更できる他のプラグインでも同様のエラーが生じるようです。
或いはこれらのバトルメンバー最大数を変更できるプラグインを全て抜き、デフォルトの状態(4名)でも

TsumioMenuSystem.jsとBattleFormationが共存している状態では、
バトルメンバー最大数 < パーティの合計メンバー数
の場合はメニュー画面を開こうとした瞬間に前述したエラーが生じます。

エラー内容に関してもBattleFormation.jsの715行目であり、
こちらの2020年4月05日(日) 23:17投稿したエラーと完全に同一のものとなります。
添付ファイル
gazou8.png
gazou7.png
gazou6.png
gazou5.png
アバター
Plasma Dark
記事: 303
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: BattleFormationとメニュー画面にSVアクターを表示しているプラグインの競合について

投稿記事by Plasma Dark » 2020年4月06日(月) 11:50

ただし、バトルメンバー最大数を8名とは考えては居ないため、
この最大数は減らしたいのですが、(希望数は5です)

バトルメンバー最大数 < パーティの合計メンバー数

という状態でメニュー画面を開こうとするとエラーが生じます。


なるほど、そういうことでしたか。理解しました。
BattleFormation.js のバグですね。しかも追加プラグインによる対応が難しい類の面倒なヤツです。

BattleFormation.js の710行目付近 setActorHome 関数に、下記を参考に追記してみてください。

コード: 全て選択

var __SActor_setActorHome = Sprite_Actor.prototype.setActorHome;
Sprite_Actor.prototype.setActorHome = function(index) {
  __SActor_setActorHome.call(this, index);
  if (!this._actor._bfHome) $gameParty.setBattleFormation(null);
+ if (!this._actor._bfHome) return;
  var home = this._actor._bfHome;
  this.setHome(home[0], home[1] + 80);
  if (this._actor._home) {
    this._actor._home = this._actor._bfHome;
  }
};


(+ と書かれた行を追記。先頭の+は消してください)

原因について簡単に説明すると、

1. BattleFormation.js は戦闘可能なメンバー分のみ、SVアクターのスプライト生成時にデフォルト座標を計算し、それを参照する
2. TsumioMenuSystem.js はメニューを開いた時に戦闘可能でないメンバーまで含めてSVアクターのスプライトを生成する
3. 以上より、メニューを開くタイミングで BattleFormation.js が、計算していない戦闘可能でないメンバーの座標を参照しようとして落ちる

です。修正コードでは、計算していないメンバーの座標を参照しないようにしていますので、少なくとも同じ原因で落ちることはなくなるかと思います。
アバター
アーヴェル
記事: 27
登録日時: 2019年5月18日(土) 12:02

Re: BattleFormationとメニュー画面にSVアクターを表示しているプラグインの競合について

投稿記事by アーヴェル » 2020年4月06日(月) 19:16

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

コードを入れた所、該当箇所でエラー落ちはしなくなりました。ご助言ありがとうございます!
ただその後、挙動の確認作業を行っていたのですが

バトルメンバー最大数 < パーティの合計メンバー数

の状態、先程ちょうどエラー落ちしていた条件になりますが、Plasma Darkさんの改善案によって、
メニューも開くことが出来、陣形選択画面も問題なく、決定を押すことは出来るのですが、

その後メニューに戻ると陣形情報が保存されない。という状態になっております。

https://twitter.com/LF71_S/status/1247099632124981248
こちら、参考動画となっております。

プラグインは先述の3つと、動画では陣形を用意するのが手間だったのに加えて、
メインデータでは解像度変更を行っていてアクター画面外に行ってしまうということでわかりにくいため、
YEP_CoreEngineも入れた状態となっておりますが、それを抜いても同様の状態となりました。

表記だけの問題を疑い、その状態で戦闘を行いましたが、
設定されている座標及び陣形による能力上昇も得られていないということで、
設定の際にエラーが出ないにしろ問題が起きているんだろうなぁと感じております。

これに関しても、パーティメンバーの数・・・というよりメニュー画面で呼び出しているSVアクターの表示数が、
バトルメンバー最大数を上回っているケースでのみ起こることであり、

控えメンバーで表示されているSVアクターを戻さないといけないんだろうなぁ・・・とか。
考えることは出来ますが、根が深い問題・・・というより、
少なくとも自分の知識ではもう完全に手に負えない問題であると感じ、
完全に皆様のご厚意待ちという状況よりは、別の方法を取ることも本格的に考えなければと思い始めた所存です。

動いた時は、散々悩んだ場所が一行で! と感動しました。
ご回答いただいた皆様全員、そして閲覧して考えてくださった方、
私の質問に時間を割いて頂いたこと、このタイミングで感謝申し上げます。


もうしばらくの間、皆様のご厚意に甘えさせていただこうかと思いますが、
解決が難しそうであれば、質問の方は取り下げさせていただこうかと考えております。
アバター
Plasma Dark
記事: 303
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: BattleFormationとメニュー画面にSVアクターを表示しているプラグインの競合について

投稿記事by Plasma Dark » 2020年4月06日(月) 20:12

メニューも開くことが出来、陣形選択画面も問題なく、決定を押すことは出来るのですが、

その後メニューに戻ると陣形情報が保存されない。という状態になっております。


おお、たしかにそうなってしまいますね。すみません、修正が雑だったせいです。
以下のようにすれば多分大丈夫……なはず。

コード: 全て選択

var __SActor_setActorHome = Sprite_Actor.prototype.setActorHome;
Sprite_Actor.prototype.setActorHome = function(index) {
  __SActor_setActorHome.call(this, index);
+ if (!this._actor.isBattleMember()) return;
  if (!this._actor._bfHome) $gameParty.setBattleFormation(null);
  var home = this._actor._bfHome;
  this.setHome(home[0], home[1] + 80);
  if (this._actor._home) {
    this._actor._home = this._actor._bfHome;
  }
};


Game_Party.prototype.setBattleFormation 関数は、アクターの座標計算だけでなく、パーティに対して陣形をセットする役目を持っているのでした。
SVアクターのスプライト生成時に毎回、nullをセットしてしまうので、メニューを開いたり戦闘開始したりした際に強制的に基本陣形に戻っちゃいますね。

前の修正ではアクターの座標計算をやった上で、座標が存在しないメンバーについてその後の
処理を行わない、としていました。
普通に戦闘メンバー以外に対してやるべき処理ではないので、座標計算前にその判定をして返してあげる、というのが今回の修正です。
アバター
アーヴェル
記事: 27
登録日時: 2019年5月18日(土) 12:02

Re: BattleFormationとメニュー画面にSVアクターを表示しているプラグインの競合について

投稿記事by アーヴェル » 2020年4月06日(月) 20:33

返信ありがとうございます!

完璧に動きました!
Plasma Darkさん、何度も修正案をご提示頂きどうもありがとうございました!
正直な所、これは無理そうなのかなぁ・・・と思っていた所を即座に解決と、
感動もそうですが、いやぁ・・・本当に凄いなと驚きと尊敬の念を感じざるを得ません。

スクリプトの解説も兼ねていただいて、勉強にもなりました。
自分にはお返しできることが無いというのが心苦しくありますが、
心よりの感謝を述べさせていただこうと思います。

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

“MV:質問” へ戻る