dwgx@blog:~$dwgx
> cd ../posts

th06 リバースエンジニアリングの土台を載せ替える D3D8 を引き抜いて SDL2/OpenGL へ

// created

先に断っておく これはゼロから書いたものじゃなく happyhavoc/th06 の fork だ。大勢がバイナリを力ずくで解析し 『東方紅魔郷』v1.02h を 1 バイトずつリバースして再構築したソースコードだ。リバースの功績はすべて彼らのもので 俺がやったのは 1 つだけ 低レベルの Direct3D 8 / Win32 一式を引き剥がして SDL2 + OpenGL に載せ替えた。

なぜ手を出したか。元のプロジェクトは「オリジナルの exe と 1 バイト単位で一致」を目指しているので 2002 年当時の骨董スタックを律儀に背負っている 描画は D3D8 音声は DirectSound ウィンドウは Win32。厳密さには脱帽するが その代償として古い Windows に釘付けにされる。自分のマシンで動かしてもぎこちないし Linux は言うまでもない。紅魔郷のロジックは複雑じゃなく ボトルネックはあの数個の骨董 API に集中している だからこそ「土台の載せ替え」の実験材料にちょうどいい。

方針はプラットフォーム依存の部分をインターフェースに抽出し それぞれ実装すること。描画は D3D8 をやめて SDL2 + OpenGL に デスクトップは通常の OpenGL で走らせる。別途 OpenGL ES 2.0 バックエンド RendererGLES を書き FBO でフルスクリーンのスケーリングを行い モバイル方向に寄せた その上に IRenderer 抽象をかぶせている。音声は DirectSound をやめて SDL2_mixer に テクスチャは SDL2_image に任せ ウィンドウとフレーム計時は GameWindow に収めた。ついでにランタイムのエンコーディング検出も入れて GBK か Shift-JIS かをプログラムが自分で判別する 中国語版と日本語版で別々にビルドする必要はない。プラクティス部分は thprac のオーバーレイをつないだので ステージセレクトやデバッグがそのまま使える。

ビルドは CMake に移した。Windows では SDL2 のライブラリ群を 3rdparty/ に放り込めば自動でリンクされ Linux ではシステムのパッケージマネージャで入れればいい。

# Windows(Win32 で GLES レンダラーを有効化)
cmake -B build_sdl2 -A Win32 -DUSE_GLES=ON
cmake --build build_sdl2 --config Release

動かすにはオリジナルのデータ(東方紅魔郷.exe v1.02h 一式)を実行ファイルの隣に置く必要がある。これはエンジンを載せ替えただけの殻で リソースは今でも ZUN のオリジナルだ。現状 Windows(x86/x64)と Linux(x86/x64 GLES)は動く Android はまだ穴埋め中だ。

正直に言う。この山のような C++ の力仕事 API 置換 描画の縫合には LLM の補助をかなり使った commit を読めばおそらく AI の匂いを嗅ぎ取るだろう 隠さない。俺が気にしているのはコードがどれだけ綺麗かではなく あの発想が成立するかどうかだ リバースの成果を骨董 API から切り離し 現代のハードウェアで OpenGL アクセラレーションを目一杯効かせて動かす。今それが動く 実験は成功とみなす。ゲーム自体は ZUN のもの リバースされたソースは happyhavoc/th06 のもの 俺は他人の肩の上で土台を 1 つ載せ替えただけだ。