Aller au contenu principal

Session 119 — Niveaux de test minimalistes (DSL + générateur)

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_.j3o} pour des niveaux dont le nom n’est pas
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).

Laisser un commentaire

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