紅魔郷の魔改造 th06-plus に当たり判定表示と無限残機を足した
th06-plus は『東方紅魔郷』の魔改造版で、GensokyoClub の th06 から fork している。元プロジェクトは紅魔郷 1.02h を一行ずつ reverse engineering してコンパイル可能なソースに再構築したもので、その土台の上に自分が欲しかった機能をいくつか足した。他人のものを fork しているので、まず先に断っておく。
reverse engineering の方針は、オリジナルの exe を参照にして Ghidra で decompile し、objdiff で関数を一つずつ突き合わせて、再コンパイルした機械語がオリジナルと一致するまで詰めていくというもの。かなり考古学的で、自分がバイナリ復元にずっとハマっている理由でもある。
ソースが手元にあれば手を加えるのは楽だ。フレームレートの bug を直し、当たり判定表示を足した。Shift 押しっぱなしで自機の中心に回転するインジケータが描かれ、身位取りに使える。無限残機は死んだら自動で補充され、純粋に弾幕を眺める用。中国語化は GB2312 と黒体フォントで対応していて、漢化された th06c_*.DAT は thdog.moe の整数作から持ってきたもので、自分が訳したわけではない。デフォルトはウィンドウ起動。
ツールチェインは 2002 年まで遡る必要がある。コンパイラの VS2002 もグラフィックライブラリの DirectX 8.0 も Web Archive から拾ってくる。Linux/macOS では wine で動かし、macOS では CL.EXE のヒープ問題を回避できる CrossOver の方をおすすめする。
動かすのは難しくない。オリジナルの exe を resources/game.exe にコピーして参照にし、あとは
python scripts/create_devenv.py scripts/dls scripts/prefix
python3 ./scripts/build.py
create_devenv.py はコンパイラとライブラリを自動で取ってきて、torrent まで対応している。build.py は ninja スクリプトを生成してビルドする。配布パッケージが欲しければ release.py。
reverse engineering に参加したいなら objdiff で関数を選んで齧るといい。config/stubbed.csv にあるのはどれも実装待ちで stub されたものだ。今回は関数の書き換えまで深く踏み込んではおらず、主に環境構築と機能追加だが、この decomp のフローを一通り歩けば、バイナリがどう分解されてまた組み立て直されるのかが分かるようになる。