thprac:東方弾幕の練習ツールを fork して注入を研究する
thprac は東方弾幕(Touhou shmup)の練習ツールで、ゲーム標準の簡素な練習メニューを、スペルカード選択・ステージ選択・パラメータ調整ができる新しい UI に置き換える。自分が書いたものではない。最初は Ack が作り、彼が手を引いた後は touhouworldcup の連中が引き継いで保守している。このリポジトリは fork で、純粋にソースから注入を研究するために置いている。
面白いのは、クローズドソースのゲームプロセスにコードを押し込むところだ。東方は格好の RE 標本で、ZUN は th06 から th19 まで書いており、作ごとにメモリレイアウトが違う。thprac のやり方は、走っているゲームに自身を注入し、オリジナルのメニューを直接差し替えるというものだ。

注入方式はいくつかあり、設計はかなり綺麗だ。exe をゲームディレクトリに放り込むとファイル名からどの作品か自動判別する。ゲームが起動していれば thprac.exe --attach がプロセスを探し、--attach <pid> で特定のものを指定でき、あるいはゲームの exe をドラッグしてもいい。さらに --without-vpatch や --without-oilp といったスイッチもある。ついでに vpatch や OpenInputLagPatch も一緒に patch するからだ。成熟した注入ツールは、手間の半分を他の patch との共存に費やしている。
本当に読む価値があるのは作ごとの対応だ。作ごとに独立した hook のセットがあり、スペルカード・ボス・ステージ判定がどれも違う。DDC(th14)ではあの悪名高い魔理沙レーザーの desync をメモリ上で直接修正しているし、EoSD には終了しても replay を保存できるポーズメニューを追加している。PoFV や UDoALG のような対戦作にはそれぞれ専用のツールウィンドウを用意している。練習中に有効化したオプションは replay に書き込まれ、再生時に自動で復元される。
ゲーム内では Backspace でクイックメニュー、F12 で高度なオプションを開き、ホットキーは launcher で変更でき、Wine と Steam Deck に対応している。プロジェクトは C++ で、msbuild でビルドし、ローカライズ json を埋め込む loc_json を同梱している。fork したのは公開のためではなく、RE・注入・作ごとに差別化した patch という三つの厄介事を、どうやって一つの使えるツールにまとめ上げているのかを見たかっただけだ。上流は touhouworldcup/thprac。