
BattleTech: L'Inception du Faucon Croissant rétro-ingénierie
Rétro-ingénierie de BattleTech: The Crescent Hawk's Inception (1988, MS-DOS ; publié par Infocom, moteur par Westwood Associates) — et une recréation en cours sous Godot 4 / C#.
Lisez cette section avant de faire confiance à quoi que ce soit d'autre dans ce dépôt. Le projet regroupe deux efforts à la maturité très différente, et le mot « phase » ailleurs dans la documentation signifie code écrit, pas comportement prouvé.
Ce projet produit deux artefacts en même temps, et le second s'appuie sur le premier :
(1) La rétro-ingénierie documentée. La décompilation reko/, les spécifications docs/,
l'émulateur Spice86 avec les outils MCP spécifiques à BattleTech, et l'outillage Python. C'est le vrai
travail de RE : formats de fichiers, texte de l'histoire, carte mémoire, et une grande partie de la
logique du moteur sont documentés et recoupés avec la sortie du décompilateur et les traces de
l'émulateur en direct. C'est un livrable à part entière, et c'est aussi la spécification de (2).
(2) La recréation (BattleTechCHI/). Un programme Godot 4 C# qui dérive de (1) : il lit
les fichiers de données originaux (.BLD, .MTP, .ANM, sauvegardes GAME*) et réimplémente le
comportement du moteur tel que documenté par (1). Il est fidèle aux données, pas au comportement,
et n'a jamais été validé de bout en bout par rapport à l'original.
Ils tournent en parallèle, mais la direction de dépendance est fixe :
(2) ne peut être aussi fidèle que (1) est complet et vérifié. Là où (1) dit inféré ou ouvert, (2) est une supposition.
C'est pourquoi la feuille de route place la fermeture des lacunes de RE (Track 1) et la validation différentielle de (2) contre l'émulateur (Track 3) avant le travail sur les fonctionnalités. Une recréation ne vaut que ce que vaut la rétro-ingénierie sur laquelle elle s'appuie.
Si vous cherchez un portage bit-exact, il n'existe pas encore. Si vous cherchez un environnement de RE assisté par outils plus une reconstruction pilotée par les données qui tourne sur les ressources originales, c'est ce qu'il y a ici.
Légende : ✅ vrai / fait · ⚠️ partiel, approximatif, ou avec des lacunes silencieuses · ❓ inconnu / non vérifié · ❌ absent
| Système | Lit les fichiers originaux à l'exécution | Comportement identique à l'original | Validation |
|---|---|---|---|
| Déchiffrement BLD + texte chiffré | ✅ BldLoader.cs | ✅ (texte) | ✅ aller-retour BLD↔JSON identique octet pour octet (tools/bld) |
| Interpréteur d'opcodes BLD (28 slots 0xE4–0xFF) | ✅ | ⚠️ partiel | ❓ jamais joué de bout en bout ; tailles d'opérandes fixées (EB/EC/F6/F7) ; tous les slots traités (aucun abandon silencieux) |
Dispatch Fn1CD3 (47 cas) | ✅ | ⚠️ partiel | ❓ implémenté d'après la décompilation ; plusieurs cas sont des approximations |
| En-tête/tuiles de carte MTP | ✅ MapLoader.cs / LocalMapView.cs | ✅ (structure) | ⚠️ disposition décodée, pas diffée image par image |
| Animation ANM (RLE à delta XOR) | ✅ à l'exécution, repli PNG | ⚠️ | ❓ ; le dépôt ne contient aucune planche de sprites ANM (Assets/Animations/ vide) |
| Tuiles ICN/CMP | ❌ (pré-converties) | — | TileManager charge des BMP ; Assets/Tilesets/ vide |
Fichiers de sauvegarde GAME1–6 (4096 o) | ✅ parseur SaveManager.cs | ❓ | ❌ aller-retour non vérifié par rapport aux sauvegardes originales |
État de l'histoire (b0057, props) | ✅ (lecture) | ❓ signification inférée | ❓ sémantique non confirmée en jeu |
| Combat (toucher, dégâts, IA, chaleur, munitions, brouillard) | — (logique propre) | ❌ approximatif | ❌ RNG/formules jamais diffés par rapport à l'original |
| Fenêtre d'affichage / disposition de l'écran | — | ⚠️ approximatif | ❓ aucune structure de viewport canonique localisée |
| Son / musique | ❌ | ❌ | ❌ format non décodé |
| Correspondance carte→déclencheur BLD | ⚠️ partiel | ❓ | table de propriétés de tuiles + traduction [0x5460]:0x4602 non décodée |
.BLD et les interpréter (dialogues, menus, boutiques, de
nombreux cas de dispatch) — avec des lacunes silencieuses sur les opcodes non implémentés..MTP, et lire/écrire la vraie disposition de sauvegarde de 4096 octets.| Domaine | État | Doc canonique |
|---|---|---|
| Format BLD, chiffrement, opcodes | 🟢 solide | docs/formats/bld-bytecode.md |
| Texte de l'histoire (les 26 BLD) | 🟢 extrait | docs/story/STORY_TEXT.txt |
| Carte mémoire (100+ adresses, segments) | 🟢 solide | docs/formats/memory-map.md |
| Carte du monde / cartes locales | 🟢 solide | docs/world-map.md |
| Modèle de combat | 🟡 ~90%, certains inférés | docs/combat-system.md |
| Économie / boutiques / stock | 🟡 flux UI désormais observé en direct | docs/story/story-system.md |
| Format ANM | 🟢 documenté | docs/formats/anm-format.md |
| Abstraction du viewport | 🔴 incomplet | docs/engine/viewport.md |
| Son | 🔴 0% | — |
Ce sont les vrais blocages ; la feuille de route du §6 en dépend.