【解決済み】敵・味方の行動の命中判定を取得する方法について

Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

【解決済み】敵・味方の行動の命中判定を取得する方法について

投稿記事by Arkroyal » 2023年5月28日(日) 17:53

いつもお世話になっております、皆様。

現在私はアクターが攻撃を受けるとHPダメージに加えてTPも減るようにしており、
このTPが減る処理をコモンイベント・TPの増減で行っています。

ですがスキルの特徴に追加したコモンイベントは命中判定に関係なく常に処理されるため、
条件分岐で命中した場合にコモンイベントの処理を、命中しなかった場合は何も起こらないようにするのが目的です。



現在私が困っているのは、$gameActors.actorや$gameTroop.membersのresultにあるオブジェクトがどんな状況でもfalseを返す問題です。

命中判定を取得するために私が試してみたスクリプトは以下の通りです。

$gameTroop.members()[n].result().hpAffected()
$gameTroop.members()[n].result().isHit()
$gameActors.actor(n).result().evaded


これらのスクリプトを敵が行動する前、行動する瞬間、行動した後のどのタイミングに入力しても常にfalseを返しています。

スクリプトでは取得できないだけで、実際に行動が起こっている時だけ結果値が保存されるのではと思ってコモンイベントの処理を条件分岐にしてみたんですけど、

◆変数の操作:#0101 TPダメージターゲット = 直前に対象となったアクターのID
◆変数の操作:#0103 TP攻撃者・INDEX = 直前に行動した敵キャラのインデックス
◆条件分岐:スクリプト:$gameTroop.members()[($gameVariables.value(103)-1)].result().isHit()
◆変数の操作:#0102 TPダメージ量 = 乱数 10..20
◆TPの増減:{TPダメージターゲット}, - {TPダメージ量}

:それ以外のとき

:分岐終了


このように処理しても命中判定に関係なくTPに変動はありませんでした。(命中してもTPが減らない)

私が取得する先を間違っているのでしょうか?それとも何かを見落としているのでしょうか?

もしくは、命中判定を取得できる他の方法やプラグインなどがあれば教えていただけますでしょうか?

ご教授のほどよろしくお願いいたします。
最後に編集したユーザー Arkroyal on 2023年5月31日(水) 01:00 [ 編集 1 回目 ]

アバター
剣崎 宗二
記事: 678
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: 敵・味方の行動の命中判定を取得する方法について

投稿記事by 剣崎 宗二 » 2023年5月29日(月) 00:00

「行動する瞬間」の取得をどういった方法でやっているのかにもよりますが、キャラの行動が終わり次第_resultオブジェクトはクリアされます。
(Game_Battler.prototype.onAllActionsEndを見ればわかります)

また、攻撃側の_resultも攻撃開始時にクリアされます
(Game_Action.prototype.apply内2行目)

なので、これらを使って何か判定を行う場合は、セットされた直後に(Game_Action.prototype.apply内等で)該当のオブジェクトを他にコピーして退避しないとだめかと思います。
私も昔連鎖技プラグイン製造の際にこれに相当頭を痛めました…
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

Re: 敵・味方の行動の命中判定を取得する方法について

投稿記事by Arkroyal » 2023年5月29日(月) 02:14

ご返答ありがとうございます!コモンイベントが実行される時には既にresultの中身が全部クリアされているのですね…。

こうなると結局Game_Battlerの一部のスクリプトを書き足して、中身がクリアされる前に必要な情報を変数かスイッチに保存する方向で試してみます。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 敵・味方の行動の命中判定を取得する方法について

投稿記事by Plasma Dark » 2023年5月29日(月) 02:39

行動者のresultを参照されているようですが、行動の結果は、行動対象のresultに反映されます。

剣崎さんが仰っているのは行動者のresultの話であり、行動対象のresultは(特に戦闘の流れをいじるプラグインを採用していなければ)残っています。
アバター
剣崎 宗二
記事: 678
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: 敵・味方の行動の命中判定を取得する方法について

投稿記事by 剣崎 宗二 » 2023年5月29日(月) 03:25

Plasma Dark さんが書きました:剣崎さんが仰っているのは行動者のresultの話であり、行動対象のresultは(特に戦闘の流れをいじるプラグインを採用していなければ)残っています。


失礼しました。掲載されたコードの読み込みが足りませんでした。
ただ、行動対象のresultも、ダメージが与えられたり、Missを表示されるような状況になると、その一環としてSprite_Battler.prototype.setupDamagePopupによりクリアされるようです。ご確認ください。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 敵・味方の行動の命中判定を取得する方法について

投稿記事by Plasma Dark » 2023年5月29日(月) 09:55

ただ、行動対象のresultも、ダメージが与えられたり、Missを表示されるような状況になると、その一環としてSprite_Battler.prototype.setupDamagePopupによりクリアされるようです。ご確認ください。


おお、確かにそのようですね。
フロントビューにおいては、味方にはダメージポップアップがないので、その場合は敵から味方への行動時にはコモンイベントの実行タイミングでもresultが残っていますが、逆の場合は残っていなさそうでした。

そうなると、やはり剣崎さんの仰る通り、applyの末尾などで isHit の結果をスイッチか何かに保持してあげるのがお手軽そうですね。

コード: 全て選択

(() => {
  'use strict';

  const IS_HIT_SWITCH = 13;
  function Game_Action_IsHitMixIn(gameAction) {
    const _apply = gameAction.apply;
    gameAction.apply = function (target) {
      _apply.call(this, target);
      $gameSwitches.setValue(IS_HIT_SWITCH, target.result().isHit());
    }
  }

  Game_Action_IsHitMixIn(Game_Action.prototype);
})();


こんな感じで。
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

Re: 敵・味方の行動の命中判定を取得する方法について

投稿記事by Arkroyal » 2023年5月29日(月) 11:42

私はOnDamgeにresult.hpAffectedを入れました。evadedはなぜか一人が回避してもアクター全員からtrueを返したので…。

アクターのhpに変化があるとスイッチをONにして、コモンイベントでTPダメージの処理をした後スイッチをOFFにする感じです。

まだ毒などのステートまでテストしてはいませんが、敵の攻撃を回避した場合TPダメージを受けないようにはなりました。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 敵・味方の行動の命中判定を取得する方法について

投稿記事by Plasma Dark » 2023年5月29日(月) 14:21

evadedはなぜか一人が回避してもアクター全員からtrueを返したので…。


全体を対象とする行動でしょうか。
その場合は対象ごとに個別にスイッチを用意しないと全て正常に取得できませんね。

……というか、onDamageまで到達しているなら、コモンイベント使わずにプラグインで完結させたほうがシンプルな気もしてきました。

コード: 全て選択

(() => {
  'use strict';

  function Game_Battler_LoseTpByDamageMixIn(gameBattler) {
    const _onDamage = gameBattler.onDamage;
    gameBattler.onDamage = function (value) {
      _onDamage.call(this, value);
      this.loseTpByDamage(value / this.mhp);
    };

    gameBattler.chargeTpByDamage = function(damageRate) {};

    gameBattler.loseTpByDamage = function (damageRate) {
      const value = -Math.floor(50 * damageRate * this.tcr);
      this.gainSilentTp(value);
    };
  }

  Game_Battler_LoseTpByDamageMixIn(Game_Battler.prototype);
})();

“MZ:質問” へ戻る