Decisions architecturales (avant code)
- Strategie portage: portage frame-perfect d’abord, remaster optionnel apres (toggle Classic/Modern). Ce qui fait « AB3D2 » (gameplay, IA, level design, vitesses, degats) est sacre. La couche presentation (rendu, audio, controles) peut etre adaptee, avec un mode Classic pour la validation.
- Modding ready des le jour 1: trois changements legers pour preparer sans sur-engineerer.
1. Tout parametre gameplay sera externalise dans une classeGameTunables(littunables.json, vanilla = valeurs originales, mods peuvent surcharger).
2.AssetLoadercherche dans une pilemods/<nom>/->assets/vanilla/(premier hit gagne, comme Doom WAD/PWAD).
3.Rendererest une interface des aujourd’hui : implementationClassicRendereren phase 1, eventuelModernRendererplus tard. - Pas pour l’instant: scripting Lua, format de mod custom, hot-reload, editeur in-game, hooks d’events.
- Layout valide :
ab3d2-tkg-jme/
original/ # bruts disquettes, READ-ONLY ABSOLU, commite
src/main/resources/assets/
vanilla/ # regenere depuis original/, gitignored ou commite
levels/, walls/, sprites/, sounds/, ...
mods/ # gitignored sauf .gitkeep
<nom-du-mod>/ # arborescence calquee sur vanilla/
- Contrat de fidelite :
assets/vanilla/est REGENERE 100% depuisoriginal/a chaque execution des tasks d’extraction. Toute modif manuelle dedans disparait. Pour modifier quoi que ce soit, passer parmods/. C’est strict mais c’est ca qui garantit la fidelite.
Contenu de original/ (depose par l’utilisateur)
C’est un mix : disquettes retail + assets pre-convertis (le menu/ contient des PNG, les vectobj sont en clair vu leurs tailles). 8 fichiers presents par niveau LEVEL_A..P. walls/ et sounds/ vides — a fournir.
original/
256pal 1.5 KB palette globale 256 couleurs
TEST.LNK 83.0 KB script de progression des niveaux
levels/LEVEL_A..P/ 16 niveaux x 8 fichiers (twolev.bin/graph/dat/clips/flymap/links/map/obj)
menu/ back.png + back.pal + back2.raw + credits_only.raw + firepal.pal2 +
font_green.png + font16x16.pal2 + font16x16.raw2
vectobj/ 23 fichiers : armes (blaster, plasmagun, rocketlauncher, ...),
ennemis (Mantis, crab, wasp, snake), newtexturemaps + .pal,
SBDepack (binaire Amiga)
walls/ VIDE - a fournir
sounds/raw/ VIDE - a fournir
sounds/musics/ VIDE - a fournir
SBDepack analyse
Le fichier original/vectobj/SBDepack est un binaire Amiga m68k (HUNK_HEADER 0x000003F3). Strings extraites :
SB Depack by Jason Frecknall 1997
Decrunch algorithm by Team 17
Usage: SBDepack <file>
File not packed
C’est l’outil officiel Team17 (Jason Frecknall) pour depaqueter le format proprietaire interne. Aucun depack public connu. Si l’inventaire detecte des fichiers SBDepack-packed dans original/, il faudra reverser le binaire (3.2 KB de code 68k, faisable). Pour l’instant on attend de voir si necessaire.
Fichiers crees
-
tools/extract/inventory/FileMagic.java(~200 lignes) : detecteur de magics. Reconnait PowerPacker (PP20/PX20), Imploder (IMP!), XPK (XPKF + sous-format), RNC (Rob Northen), Crunch-Mania (CrM!/CrM2), executables Amiga (HUNK_HEADER), IFF FORM, PNG, JPEG, ZIP, LHA, formats AB3D2 par nom (twolev.bin, twolev.graph.bin, 256pal), heuristique texte ASCII. -
tools/extract/inventory/OriginalInventory.java(~280 lignes) : scanner recursif. Walk file tree, read 4 KB de chaque fichier, detecte le magic, produit deux rapports : build/original-inventory.txt(humain) : statistiques par type, fichiers compresses en gras, fichiers binaires non identifies, audit des fichiers attendus avec tableau LEVEL x fichiers visuel, listing complet.build/original-inventory.json(machine) : liste plate consommable par les extracteurs en aval pour savoir quoi depaqueter.
Tasks Gradle ajoutees
originalInventory: scanneoriginal/, ecrit les rapports dansbuild/. Pas de side effect, juste lecture.
Action NetBeans : action.custom-45.
Validation locale
Test synthetique avec un PP20 et un IMP! fabriques : detection correcte, rapport coherent, JSON valide. Compilation OK avec OpenJDK 21.
Reste a faire (ordre)
- Lancer
./gradlew originalInventorypour avoir le rapport reel sur le contenu actuel deoriginal/. Consulterbuild/original-inventory.txt. - Selon le rapport :
– Si fichiers compresses detectes (PowerPacker, Imploder, XPK) : ecrire/reutiliser un decompresseur Java. Le PowerPacker est documente, reimplementation directe.
– Si SBDepack-packed detecte (sans magic public connu) : reverser le binaire SBDepack pour reimplementer l’algo Team17.
– Si tout est en clair : on enchaine sans decompression. - Recuperer
walls/etsounds/de l’utilisateur (vides pour l’instant). - Adapter
LevelFullExtractorMainpour pointer suroriginal/levels/au lieu desrc/main/resources/levels/, ecrire dansassets/vanilla/levels/au lieu deassets/levels/. - Ecrire les autres extracteurs (textures wallinc, sounds, vectobj) dans
tools/extract/<domaine>/. - Implementer
AssetLoaderavec stackmods/*/->assets/vanilla/. - Implementer
GameTunablesavec lecture JSON.