fix: libère la case de tout combattant tombé, héros inclus (#75) #81

Merged
Reliodas merged 1 commit from feature/75-cleanup-dead-hero into develop 2026-06-22 11:17:43 +00:00
Owner

Closes #75.

Le nettoyage des combattants morts (CombatController._cleanup_dead_combatants()) retirait les ennemis et les alliés de TacticalGrid, mais jamais hero. Quand le protagoniste tombe et qu'un compagnon poursuit le combat, sa case restait donc occupée, bloquant déplacement et pathfinding. Troisième correctif de l'audit 0.16.0.

Changements

  • scripts/combat_controller.gd _cleanup_dead_combatants() : itère désormais tous les combattants (_all_combatants() = héros + alliés + ennemis) et grid.remove() ceux qui sont tombés — hero inclus. grid.remove est idempotent (aucun double retrait). Le PartyMember et la Creature ne sont jamais supprimés (l'état « à terre » reste sérialisable au roster).

Critères d'acceptation

  • la case du protagoniste tombé devient libre pendant que le combat continue ;
  • même comportement pour tout allié ;
  • l'IA et les acteurs contrôlés peuvent traverser ou occuper la case libérée ;
  • le membre tombé reste sérialisable dans le roster ;
  • le nettoyage reste idempotent.

Tests

Suite GUT complète verte : 284 tests (depuis 280), stable sur plusieurs exécutions.

  • tests/unit/test_combat_outcomes.gd : grid.occupant_at(hero_cell) == null après nettoyage avec un allié vivant (et un allié peut s'y placer) ; cases d'alliés PLAYER et AUTO_ALLY tombés libérées ; nettoyage idempotent (double appel, les vivants restent placés) ; membre à terre toujours présent au roster après save/load.
Closes #75. Le nettoyage des combattants morts (`CombatController._cleanup_dead_combatants()`) retirait les ennemis et les alliés de `TacticalGrid`, mais **jamais `hero`**. Quand le protagoniste tombe et qu'un compagnon poursuit le combat, sa case restait donc occupée, bloquant déplacement et pathfinding. Troisième correctif de l'audit 0.16.0. ## Changements - `scripts/combat_controller.gd` `_cleanup_dead_combatants()` : itère désormais **tous** les combattants (`_all_combatants()` = héros + alliés + ennemis) et `grid.remove()` ceux qui sont tombés — `hero` inclus. `grid.remove` est idempotent (aucun double retrait). Le `PartyMember` et la `Creature` ne sont jamais supprimés (l'état « à terre » reste sérialisable au roster). ## Critères d'acceptation - [x] la case du protagoniste tombé devient libre pendant que le combat continue ; - [x] même comportement pour tout allié ; - [x] l'IA et les acteurs contrôlés peuvent traverser ou occuper la case libérée ; - [x] le membre tombé reste sérialisable dans le roster ; - [x] le nettoyage reste idempotent. ## Tests Suite GUT complète verte : **284 tests** (depuis 280), stable sur plusieurs exécutions. - `tests/unit/test_combat_outcomes.gd` : `grid.occupant_at(hero_cell) == null` après nettoyage avec un allié vivant (et un allié peut s'y placer) ; cases d'alliés PLAYER **et** AUTO_ALLY tombés libérées ; nettoyage idempotent (double appel, les vivants restent placés) ; membre à terre toujours présent au roster après save/load.
fix: libère la case de tout combattant tombé, héros inclus (#75)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
5a9fb2f354
_cleanup_dead_combatants() retirait les ennemis et alliés morts de la
grille mais jamais le héros : quand le protagoniste tombait et qu'un
compagnon poursuivait le combat, sa case restait occupée dans TacticalGrid
et bloquait déplacement et pathfinding. Le nettoyage itère désormais tous
les combattants (_all_combatants) ; grid.remove est idempotent. Le
PartyMember et la Creature restent au roster (état à terre sérialisable).

Tests : case du protagoniste tombé libérée (et occupable par un allié) ;
cases d'alliés PLAYER et AUTO_ALLY tombés libérées ; nettoyage idempotent
(double appel) ; membre à terre toujours sérialisable au roster. Suite 284
tests, stable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 022c88e0f6 into develop 2026-06-22 11:17:43 +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#81
No description provided.