Problème
Des micro-bugs persistent (en particulier les aliens tirent des bullets
incorrectes). Les debugger dans les niveaux A-P du jeu original est
pénible : trop d’éléments en même temps, le bruit (autres aliens, portes,
lifts) empêche d’isoler le comportement à tester.
Approche
Introduction d’une suite de niveaux de test minimalistes, chacun
concentré sur une chose à vérifier, dans une salle vide. C’est
l’équivalent « unit-test » appliqué au gameplay : un niveau = un comportement
à valider.
Le format JSON produit par {@code LevelJsonExporter} est trop dense pour
être écrit à la main (level_A = 348 points, 635 edges, 134 zones avec PVS
précalculé). Solution : un DSL Java fluide qui génère le JSON
programmatiquement.
Fichiers nouveaux (4)
src/main/java/com/ab3d2/tools/testlevel/AlienType.java —
Enum mappant les 20 types d’aliens de {@code definitions.json}. Chaque
entrée expose son {@code defIndex} (= index dans le JSON) et son
{@code expectedBulType} (= bullet attendu). Cette table est la référence
pour le bug actuel : un alien doit tirer le bulType déclaré ici, pas
un autre.
src/main/java/com/ab3d2/tools/testlevel/PickupType.java —
Enum mappant les 30 objets/pickups (armes, munitions, santé, clés,
scenery, lights, switches). Helpers {@code allWeapons()} / {@code allAmmo()}
pour les niveaux test_pickups futurs.
src/main/java/com/ab3d2/tools/testlevel/Direction.java —
Enum NORTH/EAST/SOUTH/WEST avec conversion vers les angles Amiga 16-bit
(BAM, 0/16384/32768/49152). Convention CW vue d’au-dessus.
src/main/java/com/ab3d2/tools/testlevel/TestLevelBuilder.java —
DSL fluide :
TestLevelBuilder.create("ALIEN_BULLETS")
.room().size(4000, 4000).floorH(0).roofH(-256).brightness(80)
.player(0, 1500, Direction.NORTH)
.alien(AlienType.RED_ALIEN, -1500, -1500, Direction.SOUTH)
.alien(AlienType.GUARD, -750, -1500, Direction.SOUTH)
// ...
.build(Path.of("assets/levels/test_alien_bullets.json"));
Le builder s’occupe :
– Calcul des indices cohérents (4 points, 4 edges, 4 walls par salle)
– Génération du PVS minimal (1 zone se voit elle-même)
– Validation : spawn et aliens doivent être dans la salle
– Sérialisation JSON manuelle (pas de dépendance Jackson, cohérent avec
le reste du projet)
src/main/java/com/ab3d2/tools/testlevel/TestLevelGenerator.java —
Main qui génère tous les niveaux test. Pour l’instant : test_alien_bullets
(16 aliens combatifs en ligne face au joueur).
Fichiers modifiés (3)
build.gradle : task genTestLevels
./gradlew genTestLevels # génère assets/levels/test_*.json
./gradlew buildScenes # produit assets/Scenes/scene_TEST_*.j3o
./gradlew run --args="--test-level TEST_ALIEN_BULLETS"
gradle.properties : ajout des actions custom-35 (genTestLevels) et
custom-36 (genTestLevelsAndBuild) pour intégration NetBeans.
Main.java : nouvelle option ligne de commande --test-level <name>
qui bypass le menu et lance directement le niveau test. Le préfixe
« TEST_ » est ajouté automatiquement si absent. Backward compatible :
sans cet argument, le flux normal est inchangé.
GameAppState.java : nouveau constructeur
{@code GameAppState(Path, Path, String levelName)} en parallèle de
l’existant {@code (Path, Path, int levelIndex)}. Permet de charger
{@code Scenes/scene_
A-P. Un champ {@code String levelName} factorise les deux constructeurs.
Pipeline de test
+---------------------------+
| TestLevelBuilder DSL |
+-------------+-------------+
| build(Path)
v
+---------------------------+
| assets/levels/test_*.json | <- cohérent avec format level_A.json
+-------------+-------------+
| buildScenes (existant)
v
+---------------------------+
| assets/Scenes/scene_TEST_ |
| <NAME>.j3o |
+-------------+-------------+
| --test-level
v
+---------------------------+
| GameAppState charge .j3o |
+---------------------------+
Niveau livré : test_alien_bullets
Objectif : valider que chaque type d’alien tire le bullet déclaré dans
{@code definitions.json}. Layout :
– Salle 7200×4000 unités Amiga
– 16 aliens combatifs (Red Alien, Snake, Guard, Droid, Ashnarg,
‘Ard Guard, well ard guard, Insect, Priest, BigInsect, Triclaw,
Tough Triclaw, Wasp Boss, Mantis Boss, Insect Boss, Crab Boss)
– Alignés au nord, espacés de 450 unités, face SUD
– Joueur au sud, face NORD
Table de référence des bulType attendus (depuis definitions.json) :
Red=0, Snake=9, Guard=9, Droid=1, Ashnarg=0, ArdGuard=7, WellArd=1,
Insect=9, Priest=12, BigInsect=13, Triclaw=0, ToughTriclaw=0,
Wasp=0, Mantis=2, InsectBoss=0, Crab=13.
Suite future
Niveaux prévus : test_combat_dummy (1 alien 9999 HP pour tester chaque
arme), test_pickups (tous les items), test_doors, test_lifts, test_triggers,
test_zones (mezzanines, water, brightness varié), test_objects (computers,
ventfans, lamps, generators).