Empêcher le retour d'un ennemi vaincu après une fuite et un rechargement (#16) #19

Merged
Reliodas merged 1 commit from feature/16-fix-retour-ennemi-fuite into develop 2026-06-19 21:42:15 +00:00
Owner

Closes #16. Bug critique introduit par #5, corrigé sur les entités stables de #2.

Le bug

Un ennemi en fuite change de case. L'identité de rencontre étant dérivée de la cellule, une victoire ultérieure marquait la mauvaise case, tandis que ZoneData recréait l'ennemi à son origine au chargement → réapparition. Sa Creature était aussi reconstruite à chaque engagement, restaurant ses PV.

Correctif

  • Identité stable : l'identité de rencontre suit l'entity_id (dérivé de la case d'apparition, indépendant de la case courante). start_encounter pose current_encounter_id = ent.entity_id ; la victoire marque l'entité, pas la cellule.
  • Creature persistante : WorldEntity construit sa Creature une fois et la conserve ; CombatController/EncounterFlow acceptent une Creature fournie → les PV survivent à une fuite (plus de régénération).
  • Survie au save/load : l'état des entités vivantes ayant divergé (position + PV) est sérialisé dans GameSave.entity_state_by_map et restauré par World à l'entrée sur la carte ; libéré à la victoire.

Critères d'acceptation

  • une entité conserve un identifiant indépendant de sa position ;
  • sa position et son état de Creature survivent à une fuite et au save/load ;
  • la victoire marque l'entité, pas sa cellule courante ;
  • une entité vaincue ne réapparaît jamais à sa position d'origine ;
  • un test de régression couvre fuite, déplacement, victoire et rechargement.

Tests

Suite complète 115/115 (+4) — test_encounter_persistence.gd reproduit l'issue de bout en bout, plus PV conservés au réengagement, position+PV de fuite survivant au save/load, identité stable au réengagement.

Closes #16. Bug **critique** introduit par #5, corrigé sur les entités stables de #2. ## Le bug Un ennemi en fuite change de case. L'identité de rencontre étant dérivée de la cellule, une victoire ultérieure marquait la **mauvaise case**, tandis que `ZoneData` recréait l'ennemi à son **origine** au chargement → réapparition. Sa `Creature` était aussi reconstruite à chaque engagement, restaurant ses PV. ## Correctif - **Identité stable** : l'identité de rencontre suit l'`entity_id` (dérivé de la case d'apparition, indépendant de la case courante). `start_encounter` pose `current_encounter_id = ent.entity_id` ; la victoire marque **l'entité**, pas la cellule. - **Creature persistante** : `WorldEntity` construit sa `Creature` une fois et la conserve ; `CombatController`/`EncounterFlow` acceptent une `Creature` fournie → les PV survivent à une fuite (plus de régénération). - **Survie au save/load** : l'état des entités vivantes ayant divergé (position + PV) est sérialisé dans `GameSave.entity_state_by_map` et restauré par `World` à l'entrée sur la carte ; libéré à la victoire. ## Critères d'acceptation - [x] une entité conserve un identifiant indépendant de sa position ; - [x] sa position et son état de Creature survivent à une fuite et au save/load ; - [x] la victoire marque l'entité, pas sa cellule courante ; - [x] une entité vaincue ne réapparaît jamais à sa position d'origine ; - [x] un test de régression couvre fuite, déplacement, victoire et rechargement. ## Tests Suite complète **115/115** (+4) — `test_encounter_persistence.gd` reproduit l'issue de bout en bout, plus PV conservés au réengagement, position+PV de fuite survivant au save/load, identité stable au réengagement.
Reliodas added this to the 0.15.0 milestone 2026-06-19 21:40:26 +00:00
fix: empêche le retour d'un ennemi vaincu après une fuite et un rechargement (#16)
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_metadata/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
fec0658f11
Le bug : un ennemi en fuite changeait de case ; l'identité de rencontre étant
dérivée de la cellule, une victoire ultérieure marquait la mauvaise case et
ZoneData recréait l'ennemi à son origine au chargement. Sa Creature était aussi
reconstruite à chaque engagement, restaurant ses PV.

Correctif (sur les entités stables de #2) :
- L'identité de rencontre suit l'entity_id STABLE de l'entité (indépendant de la
  case courante) : start_encounter pose current_encounter_id = ent.entity_id, et
  la victoire marque l'entité.
- WorldEntity porte une Creature PERSISTANTE (construite une fois) ; le combat la
  réutilise (CombatController accepte une Creature fournie via EncounterFlow), si
  bien que les PV survivent à une fuite.
- État persistant des entités vivantes ayant divergé (position + PV) sérialisé
  dans GameSave.entity_state_by_map et restauré par World à l'entrée sur la carte
  → survit au save/load. World libère cet état à la victoire.

Tests : suite complète 115/115 — régression complète (fuite, déplacement,
victoire, rechargement), PV conservés au réengagement, position+PV de fuite
survivant au save/load, identité stable au réengagement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 9b4abcebc9 into develop 2026-06-19 21:42:15 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jeux/beaulieu-sur-brume#19
No description provided.