fix: World suit l'acteur actif et les jetons alliés en combat (#71) #86

Merged
Reliodas merged 1 commit from feature/71-world-active-actor-sync into develop 2026-06-22 11:50:25 +00:00
Owner

Closes #71.

CombatController raisonne sur active_actor() (#54), mais World._process() utilisait encore c.hero pour déplacer le jeton joueur, calculer les cibles attaquables et afficher les cases atteignables ; les jetons Follower ne suivaient pas les déplacements tactiques de leur Creature (bug confirmé : un allié PLAYER changeait de case dans TacticalGrid, son jeton restait en place). Lot « synchronisation visuelle » de l'audit 0.16.0.

Changements

  • Table Creature → jeton de monde (_party_combat_tokens) construite au démarrage du combat (start_encounter) : héros + alliés, chacun associé à son jeton (Player pour le leader, Follower pour les autres) — en plus des ennemis (_participant_tokens).
  • World._process() déplace chaque jeton du groupe vers grid.position_of(creature) (les alliés suivent enfin leur Creature) ; la surbrillance des cibles, les cases atteignables et le centrage caméra sont calculés depuis active_actor() / reachable_cells(), plus depuis c.hero. Les façades hero_* ne sont plus utilisées par World. La caméra se recentre sur le jeton joueur au retour à l'exploration.
  • Réinitialisation propre de _party_combat_tokens et de la caméra à la fin du combat (victoire/fuite/défaite).

Critères d'acceptation

  • au tour d'un allié PLAYER, les cibles attaquables reflètent sa position, son arme et sa ligne de vue ;
  • son déplacement tactique déplace immédiatement le bon jeton ;
  • les autres jetons alliés restent sur leurs propres cases ;
  • changer de leader avant un combat ne crée aucun doublon visuel ;
  • la reprise d'exploration conserve toutes les positions finales (via _sync_surviving_allies, #55) ;
  • le cas solo reste inchangé.

Tests

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

  • tests/unit/test_world_combat_active_actor.gd : le jeton d'un allié suit sa case sur la grille après _process() ; la surbrillance reflète l'acteur actif (une cible atteignable seulement par Bran est surlignée à son tour, pas à celui du héros) ; après un changement de leader pré-combat, héros et Bran sont mappés à des jetons distincts (leader = jeton joueur, protagoniste = suiveur) ; régression solo (le jeton joueur suit la Creature du héros).

Validation manuelle (différée au #78)

Caméra, fluidité du suivi des jetons et sélection de cible au tour de chaque acteur seront validées dans Godot au #78.

Closes #71. `CombatController` raisonne sur `active_actor()` (#54), mais `World._process()` utilisait encore `c.hero` pour déplacer le jeton joueur, calculer les cibles attaquables et afficher les cases atteignables ; les jetons `Follower` ne suivaient pas les déplacements tactiques de leur `Creature` (bug confirmé : un allié PLAYER changeait de case dans `TacticalGrid`, son jeton restait en place). Lot « synchronisation visuelle » de l'audit 0.16.0. ## Changements - **Table `Creature → jeton de monde`** (`_party_combat_tokens`) construite au démarrage du combat (`start_encounter`) : héros + alliés, chacun associé à son jeton (`Player` pour le leader, `Follower` pour les autres) — en plus des ennemis (`_participant_tokens`). - **`World._process()`** déplace **chaque** jeton du groupe vers `grid.position_of(creature)` (les alliés suivent enfin leur Creature) ; la **surbrillance des cibles**, les **cases atteignables** et le **centrage caméra** sont calculés depuis **`active_actor()`** / `reachable_cells()`, plus depuis `c.hero`. Les façades `hero_*` ne sont plus utilisées par `World`. La caméra se recentre sur le jeton joueur au retour à l'exploration. - Réinitialisation propre de `_party_combat_tokens` et de la caméra à la fin du combat (victoire/fuite/défaite). ## Critères d'acceptation - [x] au tour d'un allié PLAYER, les cibles attaquables reflètent sa position, son arme et sa ligne de vue ; - [x] son déplacement tactique déplace immédiatement le bon jeton ; - [x] les autres jetons alliés restent sur leurs propres cases ; - [x] changer de leader avant un combat ne crée aucun doublon visuel ; - [x] la reprise d'exploration conserve toutes les positions finales (via `_sync_surviving_allies`, #55) ; - [x] le cas solo reste inchangé. ## Tests Suite GUT complète verte : **308 tests** (depuis 304), stable sur plusieurs exécutions. - `tests/unit/test_world_combat_active_actor.gd` : le jeton d'un allié suit sa case sur la grille après `_process()` ; la surbrillance reflète l'acteur actif (une cible atteignable seulement par Bran est surlignée à **son** tour, pas à celui du héros) ; après un changement de leader pré-combat, héros et Bran sont mappés à des jetons **distincts** (leader = jeton joueur, protagoniste = suiveur) ; régression solo (le jeton joueur suit la Creature du héros). ### Validation manuelle (différée au #78) Caméra, fluidité du suivi des jetons et sélection de cible au tour de chaque acteur seront validées dans Godot au #78.
fix: World suit l'acteur actif et tous les jetons alliés en combat (#71)
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
01bbf6bb22
World._process() utilisait c.hero pour déplacer le jeton joueur, calculer
les cibles attaquables et les cases atteignables, et les jetons Follower ne
suivaient pas leur Creature en combat (un allié PLAYER changeait de case
sans que son jeton bouge).

start_encounter() construit désormais une table Creature -> jeton de monde
(_party_combat_tokens) couvrant héros + alliés (Player du leader, Follower
des autres). _process() déplace chaque jeton du groupe depuis la grille,
calcule surbrillance/atteignables/caméra depuis active_actor() et
reachable_cells() (façades hero_* retirées de World). La caméra se recentre
sur le jeton joueur au retour à l'exploration.

Tests : test_world_combat_active_actor.gd — le jeton d'un allié suit sa
case ; la surbrillance reflète l'acteur actif (cible atteignable seulement
par Bran surlignée à son tour, pas à celui du héros) ; jetons distincts
après changement de leader (leader = jeton joueur, protagoniste = suiveur) ;
régression solo (le jeton joueur suit le héros). Suite 308 tests, stable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit ae7511ec1f into develop 2026-06-22 11:50:25 +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#86
No description provided.