永夜抄 TH08 に無理やり通信対戦をねじ込む
TH08-Platform は『東方永夜抄』(Touhou 8) に通信対戦を追加する。本体は ZUN が20年以上前に VS2002 + DX8 で書いた32ビットの古いプログラムで、公式にはこの機能はない。このプロジェクトは本体には手を触れず、DLL インジェクションでメモリに2人対戦を無理やりねじ込む。
本当の難所はネットワークではなく、まずゲーム内部がどうなっているかを解明することだ:フレームループはどこにあるか、プレイヤー状態の構造体はどう並んでいるか、毎フレームの入力はどこから読むか。オリジナルのバイナリにはシンボルがなく、すべて自力で掘り起こす。だからこのリポジトリは2本の線が絡み合った monorepo になっている。
1本は game/、th08 のデコンパイルプロジェクトで、GensokyoClub/th08 (AGPL-3.0) から fork したもの。オリジナルではなく、他人の成果の上に積み上げている。「オリジナル版のメモリレイアウトと関数アドレスの辞書」として使う。現在722個の追跡関数のうち399個以上が一致し、カバー率55%。関数ごとの比較は reccmp を使う:
reccmp-reccmp --target th08 --json
もう1本の dll/ こそ本題:通信対戦 DLL とローダーを追加する。th08.exe は1バイトも変更しない。プロセス起動時に DLL を注入し、MinHook でフックする。ディスク上の本体は常にクリーンなオリジナルのままで、変更はすべてメモリ内で起きる。
進捗はまだ非常に初期段階だ。Phase 0 はフックできる hello world で、GameManager::OnUpdate (0x43aa03) をフックし、毎フレーム log にフレームカウンタを書き込む。Phase 1-5 は docs/DLL_PLAN.md に書いてある:状態キャプチャとロールバックの土台、入力 hook、UDP lockstep、rollback netcode、2機目の自機と共有 HUD。ロビーマッチングの類はまだ1行も書いていない。
rollback は主に Giuroll を参考にする。デコンパイルから通信対戦へというこの道は、th06_multi_net がすでに実現可能だと証明している。動かすにはハードルがある:th08.exe v1.00d は自分で用意する必要があり、リポジトリには絶対に含まれない。あれは ZUN の著作物だからだ;さらに VS2022、IDA Pro 9.x に ida-pro-mcp、reccmp が必要になる。プロジェクト全体は AGPL-3.0 の私有リポジトリで、改変した本体は一切配布しない。