
BattleTech: The Crescent Hawk's Inception(1988年、MS-DOS、Infocom発売、エンジンは Westwood Associates)のリバースエンジニアリング — および進行中の Godot 4 / C# による再構築。
このリポジトリの他の内容を信じる前に、このセクションを読んでください。 このプロジェクトは成熟度が大きく異なる2つの取り組みであり、ドキュメント内の他の場所で使われる「フェーズ」という語はコードが書かれたことを意味し、動作が証明されたことを意味しません。
このプロジェクトは同時に2つの成果物を生み出し、2つ目は1つ目の上に成り立っています:
(1) 文書化されたリバースエンジニアリング。 reko/ の逆コンパイル、docs/ の仕様、BattleTech 固有の MCP ツールを備えた Spice86 エミュレータ、および Python ツール群。これが本当の RE 作業です:ファイルフォーマット、ストーリーテキスト、メモリマップ、そしてエンジンロジックの大部分が文書化され、逆コンパイラ出力とライブのエミュレータトレースに対して相互検証されています。これはそれ自体が成果物であり、同時に (2) の仕様でもあります。
(2) 再構築 (BattleTechCHI/)。 (1) から派生する Godot 4 C# プログラム:オリジナルのデータファイル(.BLD、.MTP、.ANM、GAME* セーブ)を読み込み、(1) で文書化された通りにエンジンの動作を再実装します。これはデータに忠実であり、動作に忠実ではなく、オリジナルに対してエンドツーエンドで検証されたことはありません。
両者は並行して動作しますが、依存の方向は固定されています:
(2) は (1) が完全かつ検証済みであるのと同じ程度にしか忠実になれない。 (1) が推測または未解決と述べている箇所では、(2) は当て推量です。
だからこそロードマップでは、RE のギャップを埋めること(トラック1)と (2) のエミュレータに対する差分検証(トラック3) を機能作業より前に置いています。再構築は、それを支えるリバースエンジニアリングと同じ良さしか持ちません。
ビット単位で正確な移植を探しているなら、それはまだ存在しません。ツール支援の RE 環境と、オリジナルアセット上で動作するデータ駆動の再構築を探しているなら、それがここにあります。
凡例:✅ 真 / 完了 · ⚠️ 部分的、近似的、または暗黙のギャップあり · ❓ 不明 / 未検証 · ❌ 欠如
| システム | 実行時にオリジナルファイルを読む | 動作がオリジナルと一致 | 検証 |
|---|---|---|---|
| BLD 復号 + 暗号文 | ✅ BldLoader.cs | ✅(テキスト) | ✅ BLD↔JSON のラウンドトリップがバイト単位で一致(tools/bld) |
| BLD オペコードインタプリタ(28スロット 0xE4–0xFF) | ✅ | ⚠️ 部分的 | ❓ エンドツーエンドでプレイされたことはない;オペランドサイズは固定(EB/EC/F6/F7);全スロットを処理(暗黙のドロップなし) |
Fn1CD3 ディスパッチ(47ケース) | ✅ | ⚠️ 部分的 | ❓ 逆コンパイルから実装;いくつかのケースは近似 |
| MTP マップヘッダ/タイル | ✅ MapLoader.cs / LocalMapView.cs | ✅(構造) | ⚠️ レイアウトはデコード済み、フレーム単位の差分は未実施 |
| ANM アニメーション(XOR 差分 RLE) | ✅ 実行時、PNG フォールバック | ⚠️ | ❓;リポジトリに ANM スプライトシートなし(Assets/Animations/ は空) |
| ICN/CMP タイル | ❌(事前変換済み) | — | TileManager は BMP を読み込む;Assets/Tilesets/ は空 |
セーブファイル GAME1–6(4096 B) | ✅ パーサー SaveManager.cs | ❓ | ❌ オリジナルセーブに対するラウンドトリップは未検証 |
ストーリー状態(b0057、プロパティ) | ✅(読み取り) | ❓ 意味は推測 | ❓ 意味はプレイで確認されていない |
| 戦闘(命中判定、ダメージ、AI、熱、弾薬、霧) | —(独自ロジック) | ❌ 近似 | ❌ RNG/数式はオリジナルに対して一度も差分検証されていない |
| ビューポート / 画面レイアウト | — | ⚠️ 近似 | ❓ 正規のビューポート構造体は未特定 |
| サウンド / 音楽 | ❌ | ❌ | ❌ フォーマット未デコード |
| マップ→BLD トリガーマッピング | ⚠️ 部分的 | ❓ | タイルプロパティテーブル + [0x5460]:0x4602 変換は未デコード |
.BLD スクリプトを読み込んで復号し、解釈する(ダイアログ、メニュー、ショップ、多くのディスパッチケース)— 未実装のオペコードには暗黙のギャップあり。.MTP マップを解析し、実際の 4096 バイトのセーブレイアウトを読み書きする。| 領域 | 状態 | 正規ドキュメント |
|---|---|---|
| BLD フォーマット、暗号、オペコード | 🟢 堅実 | docs/formats/bld-bytecode.md |
| ストーリーテキスト(全26 BLD) | 🟢 抽出済み | docs/story/STORY_TEXT.txt |
| メモリマップ(100以上のアドレス、セグメント) | 🟢 堅実 | docs/formats/memory-map.md |
| ワールドマップ / ローカルマップ | 🟢 堅実 | docs/world-map.md |
| 戦闘モデル | 🟡 約90%、一部推測 | docs/combat-system.md |
| 経済 / ショップ / 在庫 | 🟡 UI フローはライブで観察済み | docs/story/story-system.md |
| ANM フォーマット | 🟢 文書化済み | docs/formats/anm-format.md |
| ビューポート抽象化 | 🔴 不完全 | docs/engine/viewport.md |
| サウンド | 🔴 0% | — |
これらが本当のブロッカーであり、§6 のロードマップはこれらに依存しています。
docs/combat-system.md)19EF / 1000 の戦闘/移動コードが Reko 出力から欠落;これらのルーチンを復元する必要がある。(docs/UNVERIFIED_DISCOVERIES.md §7)b0057(0/1/2)と隣接する b0055/b0056/b0058 は推測;プロパティ ID 0x1C–0x23 は未マッピング。(§5)0x32C6)+ 変換テーブル([0x5460]:0x4602)が未デコード;入口は現在手作業でマップを歩いて見つけている(開始マップの Citadel (34,10)、ComStar (51,10))。(docs/context.md)0x246C の設定構造体は部分的にしかマッピングされておらず;push/pop の意味論は不明。(docs/engine/viewport.md)0x32C6 を読むか。(§2)GAME* のロード→セーブ→比較は行われていない。docs/story/story-system.md)BldInterpreter.cs のデフォルト分岐)2A02 か他の場所か)。(§1)実行ファイルだけからの RE には限界があります(コンパイラ最適化されたコード、欠落セグメント、推測された意味論)。ゲームに実際に何が入っているかを理解するために、私たちはいくつかの種類の情報源を相互検証します — どれもバイナリを置き換えることはできませんが、合わせることで意図を解明しギャップを埋めます:
docs/walkthrough/bt-walkthrough-1..3.md(ナビゲーションとイベント順序)。bt_* MCP ツールが、差分検証するための正確な実行時レジスタ/メモリ状態を与える。優先順位: 動作については、バイナリ/エミュレータが勝つ;文書は意図について権威である。文書や記憶から回収されたすべての主張は、再構築に入る前に出典を明記し、バイナリに対して再検証する。完全なポリシー(情報源クラス、証拠タグ ✅/🟡/❓、および情報源→検証ワークフロー)は docs/SOURCES.md にあります。
順序は意図的です:より多くの画面を作る前に、データパスと動作を証明する。 各ゲートは検証であり、機能ではありません。
docs/rebuild/progress.md、wiki を正直に保つ;すべての主張を検証済み / 推測 / 不明とマークし、日付を付ける。19EF/1000(戦闘/移動)を逆コンパイル/注釈付け。 ← 2 をアンブロックw4FBC/push-pop を解決する;タイルプロパティビットを完成させる。GAME* ファイルに対してセーブのラウンドトリップを検証する。WINSCENE / ENDMECH / TINYLAND。ステップごとの詳細なチェックリストは docs/rebuild/roadmap.md にあります;フェーズ台帳は docs/rebuild/progress.md です。
docs/ RE documentation (canonical doc per topic: docs/INDEX.md)
reko/ Reko decompiler output (C + asm, per segment)
tools/
bld/ BLD decode / JSON round-trip / story extraction
assets/ Asset extraction & rendering
analysis/ Binary & memory-dump analysis
playtest/ bt.py — drive the emulator via MCP + memory API
BattleTechCHI/ Godot 4 + C# recreation (~4.9k lines, ~45 scripts)
Scripts/{Core,Data,Maps,BLD,Combat,UI}
Assets/ 15 map PNGs, 44 mech sprites, 9 screens (tilesets/ANM/fonts EMPTY)
original/ Original game files (local only, gitignored)
BattleTechMcpTools/ Spice86 override supplier + 23 bt_* MCP tools