Travail effectué
Après la décompression réussie des fichiers SBDepack-packés, on adapte
LevelFullExtractor pour lire directement depuis original/levels/ au lieu de
src/main/resources/levels/. C’est le 1er extracteur qui pointe sur la nouvelle
racine read-only de vérité.
Identification des fichiers de niveau
Lecture de level_data.s (sources Amiga) qui liste les fichiers chargés par le
moteur :
– twolev.bin (LvlT + control points + messages + objets) – obligatoire
– twolev.graph.bin (zones, edges, doors/lifts, switches) – obligatoire
– twolev.clips (table de clip points pour le PVS) – reste à intégrer
– twolev.map (grille top-down 100×100) – reste à intégrer
– twolev.flymap (grille pathfinding 100×100) – reste à intégrer
– floortile, wall_<N>.256wad (overrides per-level optionnels)
– properties.dat, errata.dat (modifications per-level optionnelles)
Les fichiers twolev.dat, twolev.links, twolev.obj qu’on voit dans le rapport
originalInventory ne sont PAS chargés par le moteur. Ce sont des artefacts du
level editor AMOS (ab3dii-editor_s/leved303.amos). On peut les ignorer pour l’extraction.
Format de twolev.clips reverse-engineeré depuis hires.s:418-475
- Tableau de WORD signés 16-bit big-endian
- Séparateur
-2(0xFFFE) entre les groupes de clips - Chaque groupe = liste d’indices vers les points (vertices) qui clippent un edge
dans le PVS d’une zone donnée - Chaque PvsTuple a un PVST_ClipID_w qui pointe vers son groupe dans clips
- Suivi par une ConnectTable à la fin (Lvl_ConnectTablePtr_l)
Format de twolev.map et twolev.flymap
- Grilles 100×100 bytes (10000 = 100²) – taille fixée
- twolev.map = top-down map (chaque byte = id de tile sol/plafond)
- twolev.flymap = pathfinding AI (similaire mais pour flying aliens)
Modifications
- LevelFullExtractorMain.java : pointe maintenant sur
original/levels/au lieu
desrc/main/resources/. Sortie déplacée versbuild/levels-full/(au lieu de
assets/levels/) pour ne pas concurrencer leLevelJsonExporterhistorique.
Affiche un compteur de bytes lus vs écrits. - build.gradle / extractLevelsFull task : passe maintenant
original/levelsà
l’extracteur. Surcharge possible via-Plevels.root=et-Plevels.out=.
Étape 2 à venir
Intégrer la lecture de twolev.clips, twolev.map, twolev.flymap dans
LevelFullExtractor.extract() (overload à 6 args ou null équivalent). Le record
ExtractedLevel sera étendu avec :
– List<List<Integer>> pvsClipGroups (groupes de clip indices, séparés par 0xFFFE)
– byte[] connectTableHex (tail après les clips groups)
– byte[][] mapGrid (100×100)
– byte[][] flyMapGrid (100×100)