
BattleTech: The Crescent Hawk's Inception — реверс-инжиниринг
Обратная разработка BattleTech: The Crescent Hawk's Inception (1988, MS-DOS; издатель — Infocom, движок — Westwood Associates) — и незавершённая реконструкция на Godot 4 / C#.
Прочитайте этот раздел, прежде чем доверять чему-либо ещё в этом репозитории. Проект — это два направления работы с очень разной степенью зрелости, и слово «фаза» в остальной документации означает код написан, а не поведение доказано.
Этот проект производит два артефакта одновременно, и второй опирается на первый:
(1) Документированная обратная разработка. Декомпиляция в reko/, спецификации в docs/,
эмулятор Spice86 со специфичными для BattleTech инструментами MCP и инструментарий на Python.
Это настоящая работа по RE: форматы файлов, текст истории, карта памяти и большая часть логики
движка задокументированы и перекрёстно проверены по выводу декомпилятора и трассировкам живого
эмулятора. Это результат сам по себе, а также спецификация для (2).
(2) Реконструкция (BattleTechCHI/). Программа на Godot 4 C#, которая происходит из (1):
она читает оригинальные файлы данных (.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 Б) | ✅ парсер SaveManager.cs | ❓ | ❌ обратимое преобразование не проверено против оригинальных сохранений |
Состояние истории (b0057, свойства) | ✅ (чтение) | ❓ значение предположительно | ❓ семантика не подтверждена в игре |
| Бой (попадание, урон, ИИ, нагрев, боеприпасы, туман) | — (собственная логика) | ❌ приблизительно | ❌ 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) не декодированы; входы сейчас находятся ручным обходом карты
(Цитадель (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)