# Variantes de monstres — schéma 69

Le niveau 1 reste la fiche `enemies.<id>`. `levels` contient jusqu’à 19 fiches
supplémentaires complètes. Le bouton + copie le dernier niveau, sans lien
vivant avec lui. Les sections différentes du niveau précédent sont vertes.
La suppression porte uniquement sur le dernier niveau pour garder les indices
stables. Aucun niveau n’est ajouté automatiquement aux données existantes.

Chaque fiche possède ses PV, attaques, butin, comportements, modèle et visuels,
ainsi que `name_prefix`, `name_suffix`, `tint`, `conditions` et `no_return`.
Le blanc `#ffffff` est un filtre neutre. Le nom affiché assemble préfixe, nom
et suffixe, avec localisation ; aucun numéro de niveau n’est affiché.

La vague tire une famille avec ses poids habituels. Son minimum et maximum
de quantité viennent du niveau 1 et sont communs à toutes ses variantes.
Pour chaque apparition, le jeu tire ensuite parmi les variantes dont toutes
les conditions sont remplies et dont `spawn_weight` est strictement positif.
Le poids est relatif entre variantes de cette famille ; zéro désactive une
variante. Si aucune variante n’est admissible, la famille ne peuple pas la vague.

Dès que les conditions d’un niveau `no_return` sont remplies, il relève le seuil
minimal de sa famille. Les niveaux inférieurs sont exclus, même si leurs propres
conditions et poids permettraient leur apparition. Le seuil ne dispense jamais
les niveaux restants de leurs conditions et poids : une configuration peut donc
ne laisser aucune variante admissible. Une case cochée avec poids nul peut
quand même relever le seuil ; sa condition d’accès est le déclencheur.

`GameState.enemy_level_floors` est sauvegardé. `end_run()` le conserve.
`complete_dimension()` l’efface après les remises à zéro, puis les conditions
sont réévaluées dans le nouvel état. Les anciennes sauvegardes commencent sans
seuil mémorisé. Les changements ne transforment pas les monstres déjà présents.
Leurs compteurs, références de salles et événements restent ceux de la famille.

Les noms localisés des variantes utilisent `enemies.<id>.levels.<index>.<champ>`
(index zéro pour le niveau 2). Les exports JSON et Excel incluent les variantes.
Migration idempotente : `tools/game-data-manager/migrate_schema_69.php`.

Contrôles : `enemy_levels_check.tscn`, `enemy_levels_validation_test.php`,
`enemy_levels_browser_test.js`, puis les contrôles généraux de CLAUDE.md.
