对 BattleTech: The Crescent Hawk's Inception(1988 年,MS-DOS;由 Infocom 发行,引擎由 Westwood Associates 开发)的逆向工程——以及一个进行中的 Godot 4 / C# 复刻项目。
在信任本仓库中的任何其他内容之前,请先阅读本节。 本项目包含两项成熟度差异极大的工作,文档中其他地方出现的“阶段”一词指的是代码已编写,而非 行为已验证。
本项目同时产出两个工件,且第二个建立在第一个之上:
(1)有文档记录的逆向工程。 reko/ 反编译输出、docs/ 规范、带有 BattleTech 专用 MCP 工具的 Spice86 模拟器,以及 Python 工具链。这是真正的逆向工程工作:文件格式、剧情文本、内存映射以及大部分引擎逻辑均已记录,并与反编译器输出和实时模拟器跟踪进行交叉验证。它本身就是一个独立的交付物,同时也是(2)的规范。
(2)复刻项目(BattleTechCHI/)。 一个 Godot 4 C# 程序,派生自(1):它读取原始数据文件(.BLD、.MTP、.ANM、GAME* 存档),并按照(1)所记录的内容重新实现引擎行为。它忠实于数据,而非忠实于行为,并且从未针对原版进行过端到端验证。
两者并行运行,但依赖方向是固定的:
(2)的忠实度只能达到(1)的完整与验证程度。 凡是(1)标注为推断或未决之处,(2)都只是猜测。
这就是为什么路线图将填补逆向工程空白(Track 1)以及**(2)针对模拟器的差分验证(Track 3)**置于功能开发之前。复刻的质量取决于支撑它的逆向工程。
如果你在寻找一个逐位精确的移植版本,它尚不存在。如果你在寻找一个工具辅助的逆向工程环境,外加一个基于原始资源运行的数据驱动重建,那么这里就是。
图例:✅ 真实 / 已完成 · ⚠️ 部分、近似或存在隐性缺口 · ❓ 未知 / 未验证 · ❌ 缺失
| 系统 | 运行时读取原始文件 | 行为与原版一致 | 验证 |
|---|---|---|---|
| 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)仅从可执行文件进行逆向工程有其局限(编译器优化代码、缺失的段、推断的语义)。为了理解游戏中实际有什么,我们交叉核对几种来源——它们都无法替代二进制文件,但合在一起可以厘清意图并填补空白:
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
# Emulator + MCP (ground truth for traces)
fuser -k 20000/tcp 8086/tcp 2>/dev/null
: > /tmp/emu.log
dotnet exec bin/Debug/net10.0/UNBATTLETECH.dll \
--Exe "/path/to/UNBTECH.exe" --CDrive "/path/to/game/" \
--HeadlessMode Minimal --McpHttpPort 8086 --NoGui
# Playtest harness
python3 tools/playtest/bt.py state # mode/cursor/credits/flags snapshot
python3 tools/playtest/bt.py png out.png # true-colour screenshot
# Godot rebuild (needs a display; use xvfb-run headless)
cd BattleTechCHI && dotnet build && bash run.sh
# BLD round-trip / story extraction
python3 tools/bld/bld_json_converter.py to-json original/bld/
python3 tools/bld/extract_story.py
本仓库不包含任何原始游戏资源(EXE、BLD、CMP、ICN、MTP、ANM、存档)。仅包含逆向工程分析、文档以及用于净室重建的原创源代码。BattleTechCHI/Assets/ 下的 69 张 PNG 是用于本地开发的转换渲染图。原始资源保留在 original/(已 gitignore)中,运行加载器需要它们。