スクリプトを動作させるには2パターンあってエミュレータ本体であるFBArrからのコールバックか、スクリプト本体がスクリプト実行の途中にエミュレータ本体のゲーム進行をすすめるかのどちらかになります。
以下はFBArrで用意されている関数のうちのコールバック関数登録用の関数です。
- emu.registerbefore(function func)
- emu.registerafter(function func)
- emu.registerstart(function func)
- emu.registerexit(function func)
- memory.registerread (address, [size,] func)
- memory.registerwrite (address, [size,] func)
- memory.registerexec (address, [size,] func)
- savestate.registersave(function func)
- savestate.registerload(function func)
- gui.register(function func)
- input.registerhotkey(int which, function func)
エミュレータ本体がわちゃわちゃ動いている途中にこれらで登録したコールバック関数が呼び出されて動くことになります。
今回、トレモでやりたいことはメモリ状態をみたり更新したりしてキャラの状態を確認したり、操作をしたいんですが、ゲームからのメモリ更新タイミングや、ゲームへの反映タイミングを1フレームのずれなくおこなおうとしたときにどれをどう使えばいいのかになります。
- 入力のフィルタはエミュレータ本体での入力確定後、ゲーム動作前に介在させたい。
- 出力のフィルタはエミュレータ本体の動作後、画面描画前に介在させたい。
- リアルタイム性が必要ない処理はどこでもいい。
- その他、初期化やゲームのメモリ状態がリセットされるのに合わせた処理を入れる。
これらをやろうとしたとき1は emu.registerbefore(function func) ですが入力が完了しているかどうかはソースみないとわかりません。2は gui.register(function func) が最適そうですが、後者は描画がスキップされると動作しません。
となった場合、エミュレータでゲームの動作直前や動作直後をコールバックで検知するのがいいのではないかと考えています。
ゲームのプログラムを追ったり、メモリやレジスタを読んでいけばいいのかもしれませんが、そのへんぜんぜんわからんので追うのは絶望的というかそんなにエネルギー費やせません。幸い、先達様がつくっている当たり判定表示用のスクリプトがレジスタの変化をフックしてメモリ状態をチェックしていたりするので、その辺をヒントに進めるかもしれないなと考えています。