Aller au contenu principal

Session 132quintus — Layout original/vanilla/mods + scanner d’inventaire

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 classe GameTunables (lit tunables.json, vanilla = valeurs originales, mods peuvent surcharger).
    2. AssetLoader cherche dans une pile mods/<nom>/ -> assets/vanilla/ (premier hit gagne, comme Doom WAD/PWAD).
    3. Renderer est une interface des aujourd’hui : implementation ClassicRenderer en phase 1, eventuel ModernRenderer plus 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% depuis original/ a chaque execution des tasks d’extraction. Toute modif manuelle dedans disparait. Pour modifier quoi que ce soit, passer par mods/. 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 : scanne original/, ecrit les rapports dans build/. 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)

  1. Lancer ./gradlew originalInventory pour avoir le rapport reel sur le contenu actuel de original/. Consulter build/original-inventory.txt.
  2. 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.
  3. Recuperer walls/ et sounds/ de l’utilisateur (vides pour l’instant).
  4. Adapter LevelFullExtractorMain pour pointer sur original/levels/ au lieu de src/main/resources/levels/, ecrire dans assets/vanilla/levels/ au lieu de assets/levels/.
  5. Ecrire les autres extracteurs (textures wallinc, sounds, vectobj) dans tools/extract/<domaine>/.
  6. Implementer AssetLoader avec stack mods/*/ -> assets/vanilla/.
  7. Implementer GameTunables avec lecture JSON.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *