PCゲームでもコマ送り(frame advance)は可能なんじゃないか、という思い付き企 画。コマ送り自体は実現できましたが、TAS制作にはまだまだ障害が多いので草案段 階といったところです。
このゲームはいわゆるエロゲなので知名度は低いと思われますが、ACTパートの出 来が非常に良く、個人的には傑作だと思っています(だいぶ前に 攻略サイトを作っ たりしていました)。ひそかにプレイ動画を上げてたりします:
リプレイ機能、AVI書き出し機能などについては前述の攻略サイトを参照。
とりあえずコマ送りを実現するツールを作成しました(Windows XP SP3で動作確 認。listexportの吐 くコードをベースに作成)。一応ソース付き(VC専用)ですが、私はWindowsプログラミ ングには詳しくないのでおかしなところがあるかもしれません^^;
ダウンロード: mikotas-20090709.zip ※体験版に対しても有効
linmm.dll を ryoko_fight.exe と同じディレクトリに置き、ryoko_fight.exe を バイナリエディタで開いて "winmm.dll" と書かれている箇所を "linmm.dll" に書き 換えれば動くはずです。これによりゲーム中にPauseキーでポーズ、 \キーでコマ送りができるようになります。
QS/QLは難しそうだと思っていましたが、このゲームはステージ途中までのリプレ イを再生するとそのまま継続して操作できるようなので、これを利用すれば擬似的に QS/QLが可能かもしれません。現在模索中。
※追記: リプレイ再生後そのまま操作できるというのは勘違いだったみたいです。 なので、QS/QLを実現するには自前でリプレイ機能を持つ必要があると思われます。 可能かどうかは調査中。
TASとは直接関係ないですが、AVI書き出し機能は映像のみで音声は書き出してく れないようなので、そのあたりも補完できたらいいなと思っています。
原理は単純で、timeGetTime() を乗っ取って偽のuptime(起動してからの時間)を 返しているだけです。このゲームは timeGetTime() を用いて速度制御を行っている ので、偽の値を返してやれば速度が変化するというわけです(例えば、半分の値を返 してやれば1/2倍速になる)。
APIフックの方法は色々あるようですが、今のところは偽DLL + EXE書き換え方式 を採っています。これは単に一番簡単そうだったからという理由ですが、いずれEXE を書き換えずに済む方法に移行すべきだとは思っています。
速度制御については、DLL内部に偽のuptimeと本物のuptimeを保持しておき、等速 動作中は本物のuptimeの差分から偽のuptimeを計算して返し、コマ送り中は1F分の時 間を偽のuptimeに加えて返す、という実装になっています。1F分の時間は16msとして います(リプレイファイルのフレーム数から62.555...FPS動作と推測。というより、 timeGetTime() がms単位であるために、1000/60 の小数点以下を切り捨てた結果、ウェ イトが16msになったものと思われる)。
なお、winmm.dll 内には @ を含む関数名があるので、アンダースコアに置き換え てビルドしています。本来はビルド後にDLLをバイナリエディタで編集してアンダー スコアを @ に戻すべきですが、このゲームでは当該の関数は使っていないようなの でそのままにしています。
なんとなく完成までの経緯を記してみるテスト:
リプレイファイルは *.rfr, *.rfr.sdt の2つ組で、両方が揃っていないと再生で きません。*.rfr が入力データで、*.rfr.sdt は付属情報のようです。とりあえず hex editingを行うだけなら *.rfr ファイルのフォーマットのみわかっていれば十分 です(*.rfr.sdt は埋め込みサムネイルらしきものなどが入っているが、今のところ フォーマットが不明)。
先頭12Byteがヘッダ、それ以降が入力データ。入力データは1F当たり4Byte。数値 はすべてリトルエンディアン。
0x00 U32 ステージID(リプレイファイルの先頭に付く数字) 0x04 U32 乱数シード(敵の動きに影響。ステージ開始時のuptimeをそのまま使っていると思われる) 0x08 U32 フレーム数(編集時は整合性を保つのが無難。特に入力が長くなる場合は修正必須)
Byte0が方向キー、Byte1がボタン。Byte2-3はおそらく常に0。
Byte0:
bit7 下キー押し始めフラグ bit6 下キー bit5 上キー押し始めフラグ bit4 上キー bit3 右キー押し始めフラグ bit2 右キー bit1 左キー押し始めフラグ bit0 左キー
Byte1:
bit7 (無視される?) bit6 (無視される?) bit5 御札ボタン押し始めフラグ bit4 御札ボタン bit3 ジャンプボタン押し始めフラグ bit2 ジャンプボタン bit1 式神ボタン押し始めフラグ bit0 式神ボタン
押し始めフラグはダッシュ入力判定などに使われるようです。なお、2Fの間にキー を押す→離す→押す、とすることで2F連続で押し始めフラグを立てることができる (コマ送りで確認済)ので、hex editingで同様の編集を行っても問題はないはずです (通常プレイで再現可能という意味で)。
メモリウォッチ自体はMHSなどを 使えば可能です。ただし、座標や速度のアドレスはゲームを起動するたびに変わるよ うです。
とりあえず、座標および速度はともにdouble型(64bit)であり、相対位置は (x座 標, y座標, x速度, y速度) となっています。また、おまけモード開始直後の座標は (2880.0, 3072.0) なので、これを手掛かりにすればアドレスはすぐ見つかると思い ます。また、x速度は壁にぶつかると0になります(普通に停止しても完全に0にはなら ない)。
上下左右同時押しは特に意味がないようです(上下/左右同時押しは無入力状態と 同様に扱われる模様)。