【解決済み】対象に特定のステートが付与されているかの分岐条件

水星人
記事: 25
登録日時: 2022年1月05日(水) 15:43

【解決済み】対象に特定のステートが付与されているかの分岐条件

投稿記事by 水星人 » 2023年2月23日(木) 14:46

攻撃対象に特定のステート複数種のうち1つでも付与されていたら追加効果のスキルを作成したいのですが
1つひとつ付与されているか確認せず、まとめて1つの条件分岐で出来ますか。

以前どこかで見たであろう、上と同じ条件で威力が上がるスキルはスキル計算式に

コード: 全て選択

[id1,id2,...].some(b.isStateAffected,b)?2:1)

こちらが使われていて、これで複数のステートIDの中から1つでも付与されていればの条件になっているようなのですが

コード: 全て選択

$gameTroop.members()[n].isStateAffected(id)

こちらの敵にステートが付与されているかのコードにどう組み合わせればいいのかがわかりません。

また、[n]を変数で指定する場合は、ラストターゲットのインデックスを変数に格納した後に
1引かないといけないでしょうか
最後に編集したユーザー 水星人 on 2023年2月25日(土) 00:17 [ 編集 1 回目 ]

名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 対象に特定のステートが付与されているかの分岐条件

投稿記事by 名無し蛙 » 2023年2月23日(木) 19:09

水星人 さんが書きました:以前どこかで見たであろう、上と同じ条件で威力が上がるスキルはスキル計算式に
[id1,id2,...].some(b.isStateAffected,b)?2:1)

文法がおかしいですね。おそらくは元はこうではないかと

コード: 全て選択

// ステートID5,6,7を判定する場合
([5, 6, 7].some(id => b.isStateAffected(id)) ? 2 : 1) * (a.atk * 4 - b.def - 2)

水星人 さんが書きました:こちらの敵にステートが付与されているかのコードにどう組み合わせればいいのかがわかりません。

また、[n]を変数で指定する場合は、ラストターゲットのインデックスを変数に格納した後に
1引かないといけないでしょうか

同じ要領でsomeで判定をすれば良いのでは。
マイナスする必要はないです。

コード: 全て選択

const battler = $gameTroop.members()[n];
if ( [5, 6, 7].some(id => battler.isStateAffected(id)) ) {

}

可読性の為に2行に分けましたけど
イベントコマンドの条件分岐>スクリプト欄に使用したいなら一行に纏めても問題無いです。
水星人
記事: 25
登録日時: 2022年1月05日(水) 15:43

Re: 対象に特定のステートが付与されているかの分岐条件

投稿記事by 水星人 » 2023年2月24日(金) 00:18

コード: 全て選択

const battler = $gameTroop.members()[$gameVariables.value(85)];
if ( [5,6,7,8,9,10,12,13,41,42,43,44,45,46,47,48].some(id => battler.isStateAffected(id)) ) {
$gameTroop.members()[$gameVariables.value(85)].addState(222)
}

これで試したところCannot read property 'isStateAffected' of undefinedが出ました。
どこがおかしいかわかりますか。

また

コード: 全て選択

(a.atk * 1.39 - b.def)*(a.isStateAffected(11)?1:0.5)*([5,6,7,8,9,10,12,13,41,42,43,44,45,46,47,48].some(b.isStateAffected,b)?2:1)

この計算式のスキルは対象がステート48の時ちゃんと倍になるのですが、修正したほうが良いのでしょうか
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 対象に特定のステートが付与されているかの分岐条件

投稿記事by 名無し蛙 » 2023年2月24日(金) 01:51

水星人 さんが書きました:この計算式のスキルは対象がステート48の時ちゃんと倍になるのですが、修正したほうが良いのでしょうか

軽く検証した限り最初に提示された例でも問題無く使用可能ですね。
これは自分が不勉強でした。混乱を招く発言をして申し訳ないです。
Array.prototype.some()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some
some(callbackFn, thisArg)
この使用法に該当します。
第一引数が評価用関数、第二引数が内部でthisを参照する為のオブジェクト指定です。

水星人 さんが書きました:これで試したところCannot read property 'isStateAffected' of undefinedが出ました。
どこがおかしいかわかりますか。

どう考えても$gameVariables.value(85)の中身ですね。
というかこれも自分が検証もせずに「インデックスなら0から始まる」という先入観で答えた事が原因ですね…
コアスクリプトを検めたところ、そのまま記録せずに途中で+1している事が分かりました。
重ね重ね申し訳ない。

コード: 全て選択

// rmmz_objects.js2256行目
Game_Action.prototype.updateLastTarget = function(target) {
    if (target.isActor()) {
        $gameTemp.setLastTargetActorId(target.actorId());
    } else {
        // 「変数の操作」「直前に対象になった敵キャラのインデックス」を記録する時に
        // 「戦闘行動の強制」の表記を揃える為に+1しています
        $gameTemp.setLastTargetEnemyIndex(target.index() + 1);
    }
};

この記録変数をスクリプトに用いる場合は-1するべきです。

コード: 全て選択

const battler = $gameTroop.members()[$gameVariables.value(85) - 1];
if ( [5,6,7,8,9,10,12,13,41,42,43,44,45,46,47,48].some(battler.isStateAffected, battler) ) {
    battler.addState(222);
}
水星人
記事: 25
登録日時: 2022年1月05日(水) 15:43

Re: 対象に特定のステートが付与されているかの分岐条件

投稿記事by 水星人 » 2023年2月25日(土) 00:17

修正後のコードで想定通りの動作が確認できました。ありがとうございます。
-1することってこと自体は聞いたことあったけどどのシチュエーションで引くのか、なぜ引く必要があるのかは
全くわかってなかったのでその理由が知れてよかったです。

自分も.some()がなんなのか知らなかったので調べたらアロー関数で書かれたものばかりで
スキル計算式に使われていた形を見つけることができなかったので助かりました。

それにしてもbattlerを$gameTroop.members()[$gameVariables.value(85)]で定義してたから
わざわざaddState()の前に$gameTroop.members()[$gameVariables.value(85)]って書く必要なかったですね......

“MZ:質問” へ戻る