thtk:東方ゲームデータ逆解析ツール一式を fork した話
Touhou Toolkit
thtk(Touhou Toolkit)は、東方の翻訳を手がける thpatch の連中が書いた C の CLI ツール一式で、東方シリーズのゲームが持つ独自データフォーマットを解体するために作られている。ここにあるのは俺が fork してきた実験用のコピーで、彼らがどう逆解析ツールを書いているかを学ぶためのもの。上流とは同期しないので、上流として使わないこと。
東方は作品ごとにアーカイブ、アニメ、スクリプト、ステージを自前のバイナリフォーマットに詰め込んでいて、thtk はそれを力技で逆解析してツールに仕立てている。初期作から 20 作目まで幅広くカバーする。何でもこなす大きなアーミーナイフではなく、それぞれ一領域を担当する小さなツールの集まりだ:
thdatはアーカイブ DAT を担当。xで展開、cでパック。対応作品数が最も充実しているthanmはアニメとスプライトシートの ANM を担当。xで展開、lで内容を一覧theclは ECL スクリプトを担当。dで逆コンパイル、cでコンパイルし直す。弾幕ロジックは全部ここthmsgは会話テキスト MSG を担当。dで dump、cで compile。翻訳が最初に手を付けるところthstdはステージ配置 STD を担当。dump/compile の一対
考え方は一貫している:独自フォーマットごとにツールを一つ用意し、まず人間が読んで編集できるものに解いて、直したらゲームが受け付けるバイナリに編み直す。取っ掛かりはどれかの作品の DAT を thdat x で解体するところから始めて、一層ずつ剥がしていけばいい。
本当に面白いのはソースコードだ。thecl、thmsg、thstd は Yacc/Lex で字句解析と構文を書いていて、dump して出てくるテキストは実は一つの小さな DSL、compile はそれをバイトに解析し直しているだけ。このバイナリと可読スクリプトを双方向でつなぐパイプラインはきれいで、フォーマットのバージョンをテーブル駆動でどう区別するか、バージョン間の互換性にどう逃げ道を残すか、CMake が大量の extlib をどう束ねるか、読んでいけば今まで適当に流してきた箇所をかなり理解できる。
一つ注意:このリポジトリはローカルでいじるだけだ。ゲームの独自バイナリや、パス付きの認証情報みたいなものは一切 commit しない。ツール自体は公開されているが、解体して取り出したゲームデータは相手の著作物なので、その境界は自分で守ること。ライセンスは thpatch/thtk の上流を見てくれ。そこは俺は触っていない。