【解決済み】テンプレートマップから生成したイベントがマップ上のイベント検索でヒットしなくなる

アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

【解決済み】テンプレートマップから生成したイベントがマップ上のイベント検索でヒットしなくなる

投稿記事by ドラムカン » 2022年9月23日(金) 17:39

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

トリアコンタン様の、イベント動的生成プラグインとセットで利用する
テンプレートイベントプラグインによって生成されたイベントに関する質問になります。

【イベント動的生成プラグイン(EventReSpawn.js)】
https://raw.githubusercontent.com/triac ... ReSpawn.js

【テンプレートイベントプラグイン(TemplateEvent.js)】
https://raw.githubusercontent.com/triac ... teEvent.js

以下のスクリプトで、
メモ欄に<テンプレートマップ生成イベント>という記述があるイベントを検索し、
複数の場合もあるため、forを回して配列化しています。

コード: 全て選択

let arr = [];
for(var id = $gameMap.events().length; id > 0; id--) {
   if($gameMap.event(id)!=null){
      if($gameMap.event(id).event().note.match("<テンプレートマップ生成イベント>")){
         arr[id] = $gameMap.event(id).event().name;
      }
   }
}
console.log(arr);


初回は、これで正常に取得できるのですが、
同じマップで、同じ生成イベントを、消去→再生成すると、
2回目以降から取得できなくなります。
.indexOf("<テンプレートマップ生成イベント>") !== -1 を用いても同様にスルーされます。

見た目、イベントはしっかり存在しているのですが、
上記スクリプトのメモ欄のifの中に入ってくれません。
($gameMap.events()では、2回目以降も確実に存在しており、取得も出来ました。
 .lengthの数も問題ありません。
 $gameMap.events()の中身を見た時に、
 Game_EventとGame_PrefabEventがあり、後者が生成イベントになるため
 event(id)を、PrefabEvent(id)としましたが、取得できずエラーになりましたし
 初回だとevent(id)でもPrefabEventが取得できるので、問題ではないと考えます)

また、再生成でイベントIDは新しく付与され、変化するのですが、
イベントIDではなくイベントのメモ欄を条件にしているため、こちらも問題ではないと考えます。

以下のような検証を行いました(※①~③は、それぞれ別々に実行しています)。
①4つのイベントを生成して、生成した順(イベントIDが小さい順)に2つを消去。そのあと上記のコードで検索をかけると、2つ生成イベントが残っているのに配列には何も入らない
②消去したイベントを再生成して、もう一度検索をかけると、再生成したイベントをスルーして、先ほど残っていたイベントだけが配列に入る
③別途、検索を実行しても、結果は②と同じ

これは、$gameMap.refresh();を要所に走らせても同じでした。

上記のことから、以下の仮説を立てました。
 最初に削除された生成イベントのIDが仮に10番、11番。残された生成イベントが12番、13番。
 10番と11番が消去されたため、歯抜けの状態となる(9、12、13)。
 イベント再生成で新たに14番と15番が生成される。しかし検知されたのは、12番と13番だけ。
 つまり、歯抜けができると、上記のコードでは、検索を途中でやめてしまうのではないか。

この仮説だと、②と③で検索をかけたとき、12番と13番が検知されるのは変ですが
12番と13番は初回生成イベントである点も考慮しなければならないかと思います。

ここまでくると、恐らくTemplateEvent側の仕様を確認する他ないと思われますが
もし、「こういう理由なのでは?」とお心当たりのある方がいらっしゃいましたら
この結果になってしまう原因をご教示いただけますと幸いです。

何卒、よろしくお願いいたします。
最後に編集したユーザー ドラムカン on 2022年9月24日(土) 02:03 [ 編集 1 回目 ]

アバター
トリアコンタン
記事: 2311
登録日時: 2015年11月10日(火) 21:13
お住まい: きのこ王国
連絡を取る:

Re: テンプレートマップから生成したイベントがマップ上のイベント検索でヒットしなくなる

投稿記事by トリアコンタン » 2022年9月23日(金) 22:02

こんにちは!
イベント動的生成プラグインで生成したイベントを消去した場合、メモリ領域を確保するためにイベント情報は削除されます。
そのため$gameMap.events()をfor文で回したときの添字はイベントIDではなくなります。
$gameMap.events()は動的生成かテンプレートかに拘わらず有効なイベントを返す配列なので単純にこの配列の要素に対して繰り返し処理をすればOKです。

ご提示のコードから最小限の変更でご要望を実現する例は以下の通りです。
ただし、配列arrの添字はイベントIDでなくなる点には注意です。

コード: 全て選択

let arr = [];
for(var i = $gameMap.events().length; i > 0; i--) {
   if($gameMap.events()[i]!=null){
      if($gameMap.events()[i].event().note.match("<テンプレートマップ生成イベント>")){
         arr[i] = $gameMap.events()[i].event().name;
      }
   }
}
console.log(arr);


もう少し分かりやすくするとこんな感じです。

コード: 全て選択

let arr = [];
$gameMap.events().forEach(function(event, i) {
    if(event.event().note.match("<テンプレートマップ生成イベント>")){
        arr[i] = $gameMap.events()[i].event().name;
    }
});
console.log(arr);
プラグイン関連のトラブルが発生した際の切り分けと報告の方法です。
http://qiita.com/triacontane/items/2e227e5b5ce9503a2c30

[Blog] : http://triacontane.blogspot.jp/
[Twitter]: https://twitter.com/triacontane/
[GitHub] : https://github.com/triacontane/
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: テンプレートマップから生成したイベントがマップ上のイベント検索でヒットしなくなる

投稿記事by ドラムカン » 2022年9月24日(土) 02:02

トリアコンタン 様

いつも大変お世話になっております。
早急にご回答くださり、心からお礼申し上げます。

イベント動的生成プラグインで生成したイベントを消去した場合、
メモリ領域を確保するためにイベント情報は削除されます。
そのため$gameMap.events()をfor文で回したときの添字はイベントIDではなくなります。


なるほど、取得できなかった理由がようやく理解できました。
$gameMap.events()で取得できていた理由につきましても、
併せてご解説くださり、誠にありがとうございます。

$gameMap.events()[i].event().note これで取れていたのですね……。
Game_PrefabEventや、._templateEventを条件にしており
$gameMap.events()[id].prefabevent()._templateEvent などとしておりましたが、当然エラーに。

一週間、深い霧の中をグルグルと徘徊しておりましたが、トリアコンタン様のおかげで
一気に快晴となりました。心から感謝申し上げます。

また、こちらの粗末なコードに沿って修正いただくだけでなく、
綺麗にリファクタリングされたコードまでご提示くださり、ご厚意に見合うお礼の言葉も見つかりません。

相当苦しんだだけに、このご回答は私にとって大変な価値のあるものです。
今後とも、どうかお力添えのほど、何卒よろしくお願い申し上げます。

改めまして、この度は誠にありがとうございました。

“MV:質問” へ戻る