この掲示板にはコードを書くための専用タグが用意されているので、コードを貼り付ける場合はそれを用いると良いと思います。
(書き込みフォーム上部の Code ボタンを押すことで手軽に使えます)
jsのコードを書く場合は、実行コンテキストを意識すると良いと思います。
イベントのスクリプトコマンドであれば、そのスクリプトを書くイベントが並列処理であるか否か、捕食者のイベントなのか、被捕食者のイベントなのか、あるいは捕食システムを制御する専用イベントなのか。
どんなアプローチで実装しようとしているかの情報に、これが含まれているとわかりやすいです。
$gameMap.events() で取得できるのは、そのマップ上に存在するイベント(Game_Eventインスタンス)の配列です。
Game_Eventインスタンスからメモ欄のタグやイベントIDを取得する方法は、すでにご提示頂いたコードの中に存在します。
捕食者イベントのGame_Eventインスタンスを取得するベストな方法は実行コンテキスト次第ではありますが、ここではとりあえずコンテキストを限定せずに取得してみます。
(メモ欄に <eater> の記述があるイベントを捕食者とします)
コード: 全て選択
$gameMap.events().find(gameEvent => gameEvent.event() && gameEvent.event().meta.eater);
配列の中から特定の条件を満たす要素をひとつ取得するには、 Array.prototype.find を用います。
https://developer.mozilla.org/ja/docs/W ... Array/find捕食者から最も近い、生存している被捕食者を取得したい場合、こんな風に書けます。
(生きている=セルフスイッチAがOFF、被捕食者=メモ欄に <food> と書かれたイベントとします)
コード: 全て選択
const eater = $gameMap.events().find(gameEvent => gameEvent.event() && gameEvent.event().meta.eater);
$gameMap.events().reduce((result, gameEvent) => {
if (!gameEvent.event() || !gameEvent.event().meta.food) {
return result;
}
if (!$gameSelfSwitches.value([$gameMap.mapId(), gameEvent.eventId(), "A"])) {
return result;
}
return result && $gameMap.distance(eater.x, eater.y, result.x, result.y) < $gameMap.distance(eater.x, eater.y, gameEvent.x, gameEvent.y) ? result : gameEvent;
}, null);
配列のすべての要素について計算して結果をひとつにまとめるような場合、 Array.prototype.reduce を用います。
https://developer.mozilla.org/ja/docs/W ... ray/Reduce日本語だと汎用的な説明がピンと来ないかもしれませんが、今回は生存している被捕食者の配列の中で最も捕食者との距離が近いものを探すために利用しています。
コード中のresultの値は、最初はnullです。(reduceの第2引数に指定しています)
gameEventの値は、$gameMap.events()で取得した配列の中の要素ひとつです。
(reduceは配列の中身をひとつひとつ順番に見ていきます)
配列から最初に被捕食者を見つけたとき、resultの値はそのイベントのGame_Eventインスタンスになります。
次に被捕食者を見つけたとき、互いの捕食者との距離を比較して、小さいほうをresultの値とします。
これを繰り返して、捕食者から最も近い、生存している被捕食者のイベントを取得します。
そうしたら、そのイベントのIDを変数に記録するんでしたね。
コード: 全て選択
const VARIABLE_ID = 1;
const eater = $gameMap.events().find(gameEvent => gameEvent.event() && gameEvent.event().meta.eater);
const nearestAliveFood = $gameMap.events().reduce((result, gameEvent) => {
if (!gameEvent.event() || !gameEvent.event().meta.food) {
return result;
}
if (!$gameSelfSwitches.value([$gameMap.mapId(), gameEvent.eventId(), "A"])) {
return result;
}
return result && $gameMap.distance(eater.x, eater.y, result.x, result.y) < $gameMap.distance(eater.x, eater.y, gameEvent.x, gameEvent.y) ? result : gameEvent;
}, null);
$gameVariables.setValue(VARIABLE_ID, nearestAliveFood ? nearestAliveFood.eventId() : 0);
頭の体操になりそうだったので、
大部分をプラグインに任せるやり方で実装してみました。
要件を詳しく掘り下げたわけではないので、これをそのまま使うことは推奨しませんが、コードが参考になれば幸いです。