ページ 11

範囲【味方全員(戦闘不能)】のターゲット表示について

Posted: 2023年5月21日(日) 12:36
by ksk
いつもお世話になっております。

ターゲット選択拡張 - TYA_TargetingCustom.js
https://plugin.fungamemake.com/archives/16331

MPP 対象タッチ選択 - MPP_TouchTargetSelect.js
https://woodpenguin.web.fc2.com/MV_Plug ... elect.html

上記2つのプラグインを導入し、下記のとおり運用しております。
・対象が全体、使用者などでも対象選択をするようにする。
・選択中の対象にカーソルを表示する。

その際、範囲が【味方全員(戦闘不能)】のスキルのみ、カーソルが正しく表示されずに難儀しています。
(戦闘不能のアクターのみにカーソルを表示させたいが、敵にカーソルが表示されてしまう)
TYA_TargetingCustom.jsのみを導入した場合でも、同様のスキルで敵グラフィックが点滅していることから、
おそらく修正を加えるべきなのはTYA_TargetingCustom.jsかと考えました。
しばらくコードとにらめっこしましたが、自分には対応が難しいようです……。
有識者の方、プラグインの修正箇所など分かりましたらご教示いただけないでしょうか。

環境の再現が面倒かと思いますので、サンプルプロジェクトを用意しました。
https://22.gigafile.nu/0720-dc5a53aa2b2 ... 28e3f9db0e
ダウンロードパスワード:486

どうぞよろしくお願いいたします。

Re: 範囲【味方全員(戦闘不能)】のターゲット表示について

Posted: 2023年5月21日(日) 13:59
by Plasma Dark
とりあえずの応急処置で良いのであれば、L175で setAllSelectChange に渡している引数を3から2にすればお望みの挙動になります。

原因は、TYA_TargetingCustom.jsの対象選択に関する不具合です。
この原因を特定するために理解すべきは Game_Battler.prototype.isSelected の意味と、そこに書かれている特殊な選択に関するコードです。
Game_Battler.prototype.isSelected は、そのバトラーが選択されているかどうかを返します。
このメソッドの返値が真であるようなバトラーについて、 rpg_sprites.js 内の Sprite_Battler.prototype.updateSelectionEffect で、バトラー画像を選択されているように見せる処理が行われます。
(MPP_TouchTargetSelect.js では同じように isSelected を使って、選択されている対象にカーソルを表示させています)

isSelected の処理は、 $gameParty._allSelect の値によって分岐していますね。

ただし、TYA_TargetingCustom.jsは以下の点で読み解くのが難しいタイプのプラグインです。

- 定数に名前をつけずマジックナンバーとして扱っている
- メソッド名を不必要に省略し、名前から意味を推測しにくくしている
- カプセル化を無視して種々の値を書き換えている

特に1番目のマジックナンバーが曲者です。

- $gameParty._allSelect: 全体選択の状態を表す定数
- Scene_Battle.prototype.selectActorSelection の引数 id
- Scene_Battle.prototype.selectEnemySelection の引数 id

これらの意味を推測するためにコードをじっくり読むと、原因がわかります。
読んでみると、それぞれの定数について、以下の通りの処理を行っているようです。

$gameParty._allSelect: 全体選択の状態を表す定数
Game_Battler.prototype.isSelected の結果(対象に選択されているか)をこの値によって分岐させている
0: 通常の選択
1: 味方全体(戦闘不能でない)が選択されている
2: 味方全体(戦闘不能)が選択されている
3: 敵全体(戦闘不能でない)が選択されている

Scene_Battle.prototype.selectActorSelection, selectEnemySelection の引数については、 Scene_Battle.prototype.onSelectAction を読むとわかります。
行動の対象設定によって分岐しています。

Scene_Battle.prototype.selectActorSelection の引数 id: 対象アクターの選択状態をウィンドウに反映させるための選択対象を表す
0以上: 通常の選択
-1: 対象が味方全体 全体選択状態を1にする
-2: 対象が使用者
-3: 対象が味方全体(戦闘不能) 全体選択状態を3にする <- ここがバグ

Scene_Battle.prototype.selectEnemySelection の引数 id: 対象エネミーの選択状態をウィンドウに反映させるための選択対象を表す
0以上: 通常の選択
-1: 対象が敵全体または敵ランダム 全体選択状態を3にする

対象が味方全体(戦闘不能)なのに、全体選択状態を3にしてしまっているのが問題とわかります。
対象が味方全体(戦闘不能)の場合は、 isSelected において全体選択状態が2になっていなければならないので、とりあえずその部分の3を2に直してあげれば、不具合自体は解決します。

Re: 範囲【味方全員(戦闘不能)】のターゲット表示について

Posted: 2023年5月21日(日) 16:48
by ksk
Plasma Dark様

さっそくありがとうございます。
ご指摘の通り修正を加えてみたところ、カーソルが戦闘不能のアクターに表示されるようになりました。

また、詳細に解説もいただきありがとうございます。
なるほど、そもそも読み解くのが難しいコードだったのですね……。
類似のプラグインと比較したりChatGPTに聞いてみたりと四苦八苦してましたが、
自分一人では解読できなかったと思いますので助かりました。