パーティ番号Xの味方が「行動可能か/行動制約のあるステートにかかっていないか」を調べるスクリプト

ツクる上でのちょっとした小ネタや裏ワザなどを紹介してみましょう。
メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

パーティ番号Xの味方が「行動可能か/行動制約のあるステートにかかっていないか」を調べるスクリプト

投稿記事by メルサイア » 2016年11月03日(木) 10:37

エディタのイベントコマンド「戦闘行動の強制」は便利ですが、そのキャラが行動制約のあるステートにかかっていても強制発動してしまうため、
例えば「睡眠」ステート時でも、実行してしまいます。
その条件分岐を簡略化出来ないかと思い、色々探していました。

エディタにありそうでない……ので、欲しくって、簡単ですが作ってみました。

変数名を自由に変えて、コモンイベントのスクリプトなどにコピペしてお使いください。
プラグイン化してもらっても構いません。

======================================================================================
パーティ番号Xの味方が「行動可能か/行動制約のあるステートにかかっていないか」を調べるスクリプト
======================================================================================

コード: 全て選択

// X=1029。スイッチ1029に行動可能ならON、OFFなら、何らかの行動制約のあるステートにかかっている、というようにします。
$gameSwitches.setValue(1029, true);
// 変数1029で指定したパーティ番号の味方が行動可能かは、以下でとれます。
var _actorId = $gameParty._actors[$gameVariables.value(1029) - 1];
if($gameActors.actor(_actorId) != null){ // アクターIDでとりたいなら、ここからでいいよ
  var _states = $gameActors.actor(_actorId).states();
  if(_states != null && _states.length > 0){ // 注意:alert(_states);で、何もステートにかかってないと配列数0のArray[]になるよ
    var _canAct = _states.some(function(state) {return !(state.restriction); }); // restrictionは行動制約のあるステートだよ。だから!で反転してるよ
    $gameSwitches.setValue(1029, _canAct);
  }
}

コード: 全て選択

// 確認だよ。
if($gameActors.actor(_actorId) != null){
  alert("変数1029の味方パーティ番号:#"+$gameVariables.value(1029)+": アクターID"+_actorId+"("+$dataActors[_actorId].name+")が行動可能か : "+$gameSwitches.value(1029));
}else{
  alert("変数1029に指定したパーティ番号のアクターがnullかundefinedだよ。");
}

=================================================================================
きれいに書けば1行で書けるのかもしれませんが、それだと予期せぬタイミングで呼び出されてエラーになることが多いので……。
例外処理がかなり苦労したので、誰かのためになれば…と思い、自分用のメモですが、公開します。
くらむぼんさんのお力添えに感謝です。
添付ファイル
14b5733f8fd08ae4521fd6db4b287c7c.png
最後に編集したユーザー メルサイア on 2016年11月03日(木) 18:26 [ 編集 2 回目 ]

メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

Re: パーティ番号Xの味方が「行動可能か/行動制約のあるステートにかかっていないか」を調べるスクリプト

投稿記事by メルサイア » 2016年11月03日(木) 18:06

くらむぼんさんに、別の書き方を教えていただいたので、もうすこし簡潔化できました。
実際にテストして、付加ステートが無い時もエラーにならないことを確認しています。
また、該当するアクターIDが見つからない時は、OFF(行動できない)とするため、デフォルトをOFFに変更にしました。

コード: 全て選択

// X=1029。スイッチ1029に行動可能ならON、OFFなら、パーティにいないか、何らかの行動制約のあるステートにかかっている、というようにします。
$gameSwitches.setValue(1029, false);
// 変数1029で指定したパーティ番号の味方が行動可能かは、以下でとれます。
var _actorId = $gameParty._actors[$gameVariables.value(1029) - 1];
if($gameActors.actor(_actorId) != null){ // アクターIDでとりたいなら、ここからでいいよ
  var _isRestricted = $gameActors.actor(_actorId).restriction() > 0; // 行動制約のあるステートが一つでもあればtrueだよ。
  $gameSwitches.setValue(1029, !_isRestricted);                      // 行動可能かを取りたいから、「!」で反転してるよ
}


パーティ番号は0以下になってもエラーにならないことを確認していますが、
必要であれば、前もってこういう例外処理を入れておくといいかもです。

コード: 全て選択

//変数のエラーチェック。値の範囲は1~にします。
if($gameVariables.value(1029) <= 0){
  alert("コモンイベント0029: パーティ番号に入れる、変数の値は1以上にしてください。: \\V[1029]="+$gameVariables.value(1029)
        +"\nエラーを避けるため、自動的に1に変更します。");
  $gameVariables.setValue(1029, 1);
}

解説:
アクタークラス.restriction() > 0 は、行動制約のあるステートの数が1つでもあれば、trueを返します。
これを「!」で反転することで、行動可能化を判定しています。

余談:
はじめは、Game_BattlerBase.prototype.isRestricted()のメソッドが使えると教えていただいたのですが、
中身を見ると、前の処理より、条件式がisAppeared()がtrueがあることが必須条件になっています。

isAppeared()は直訳すると「そのキャラが出現しているか」ですが、
(i)戦闘参加パーティにいるか、なのか、
(ii)サブパーティも含めているか、なのか、私の力ではよくわかりませんでした。
ですので、isAppeared()の判定部を抜いた、.restriction() > 0 だけを使っています。

コアスクリプトに宣言部を探しましたが、隠蔽されてて、追えませんでした…。どなたか、教えていただけるとありがたいです><。

“MV:小ネタ・TIPS・講座” へ戻る