feat: contrôle joueur/auto d'un second personnage (#70) #84

Merged
Reliodas merged 1 commit from feature/70-control-mode-toggle into develop 2026-06-22 11:33:37 +00:00
Owner

Closes #70.

Le moteur sait gérer plusieurs acteurs PLAYER (#54), mais Bran était créé exclusivement en AUTO_ALLY et aucune surface de jeu ne permettait de changer son mode : le critère « le joueur contrôle au moins deux personnages dans un même combat » n'était pas atteignable en partie normale. Ce ticket câble cette surface.

Changements

  • GameState.set_control_mode(member_id, mode) : bascule un membre actif entre PLAYER et AUTO_ALLY. Refuse (renvoie faux) un membre absent, hors groupe actif, le protagoniste (toujours joueur), un invité SCRIPTED_GUEST (non modifiable) ou une cible de mode invalide. Ne modifie jamais Creature.team. Le mode est déjà sérialisé (#50) → persistance acquise.
  • Panneau de groupe : bouton « Mode : Joueur / Auto » par compagnon actif non invité (signal member_control_toggle_requestedWorld._on_member_control_toggle_requested), avec toast.
  • World relit member.control_mode pour composer la rencontre (_present_ally_entriesadd_ally(creature, control_mode)) : un Bran en mode joueur rejoint l'initiative comme acteur contrôlable. La visibilité « à qui le tour » est enrichie par #72.

Critères d'acceptation

  • Bran peut être placé en mode PLAYER depuis une surface jouable ;
  • héros et Bran rendent chacun la main au joueur lors de leur initiative ;
  • revenir en AUTO_ALLY rend son tour entièrement automatique ;
  • une sauvegarde restaure le mode choisi ;
  • aucun changement de mode ne modifie Creature.team.

Tests

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

  • tests/unit/test_party_control_mode.gd : bascule joueur↔auto (team inchangé) ; refus (absent, protagoniste, invité, hors groupe actif, cible invalide) ; persistance save/load du mode ; parcours World réel — recruter + passer Bran en joueur via le panneau, puis vérifier que héros et Bran rendent la main dans un même combat ; en mode auto, le combat se résout sans blocage d'initiative.

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

Le ressenti (basculer le mode, jouer successivement les deux personnages, indicateur de tour) sera validé dans Godot au #78, avec l'UI de groupe de #72.

Closes #70. Le moteur sait gérer plusieurs acteurs PLAYER (#54), mais Bran était créé exclusivement en `AUTO_ALLY` et aucune surface de jeu ne permettait de changer son mode : le critère « le joueur contrôle au moins deux personnages dans un même combat » n'était pas atteignable en partie normale. Ce ticket câble cette surface. ## Changements - **`GameState.set_control_mode(member_id, mode)`** : bascule un membre **actif** entre `PLAYER` et `AUTO_ALLY`. Refuse (renvoie faux) un membre absent, hors groupe actif, **le protagoniste** (toujours joueur), un **invité `SCRIPTED_GUEST`** (non modifiable) ou une cible de mode invalide. **Ne modifie jamais `Creature.team`.** Le mode est déjà sérialisé (#50) → persistance acquise. - **Panneau de groupe** : bouton **« Mode : Joueur / Auto »** par compagnon actif non invité (signal `member_control_toggle_requested` → `World._on_member_control_toggle_requested`), avec toast. - **`World`** relit `member.control_mode` pour composer la rencontre (`_present_ally_entries` → `add_ally(creature, control_mode)`) : un Bran en mode joueur rejoint l'initiative comme **acteur contrôlable**. La visibilité « à qui le tour » est enrichie par #72. ## Critères d'acceptation - [x] Bran peut être placé en mode PLAYER depuis une surface jouable ; - [x] héros et Bran rendent chacun la main au joueur lors de leur initiative ; - [x] revenir en AUTO_ALLY rend son tour entièrement automatique ; - [x] une sauvegarde restaure le mode choisi ; - [x] aucun changement de mode ne modifie Creature.team. ## Tests Suite GUT complète verte : **299 tests** (depuis 294), stable sur plusieurs exécutions. - `tests/unit/test_party_control_mode.gd` : bascule joueur↔auto (team inchangé) ; refus (absent, protagoniste, invité, hors groupe actif, cible invalide) ; persistance save/load du mode ; **parcours World réel** — recruter + passer Bran en joueur via le panneau, puis vérifier que héros **et** Bran rendent la main dans un même combat ; en mode auto, le combat se résout sans blocage d'initiative. ### Validation manuelle (différée au #78) Le ressenti (basculer le mode, jouer successivement les deux personnages, indicateur de tour) sera validé dans Godot au #78, avec l'UI de groupe de #72.
feat: contrôle joueur/auto d'un second personnage (#70)
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
0a4a69c393
GameState.set_control_mode(member_id, mode) bascule un membre actif entre
PLAYER et AUTO_ALLY : refuse un membre absent, hors groupe actif, le
protagoniste (toujours joueur) et un invité scénarisé (non modifiable), et
ne touche jamais Creature.team. Le mode étant sérialisé (#50), il persiste.

Le panneau de groupe expose un bouton « Mode : Joueur/Auto » par compagnon
actif non invité (signal member_control_toggle_requested → World). World
relit ce mode pour composer le combat : un Bran PLAYER rejoint l'initiative
comme acteur contrôlable.

Tests : set_control_mode (bascule, team inchangé, refus absent/protagoniste/
invité/hors-actif/cible invalide), persistance save/load, et parcours World
réel — recruter + passer Bran en joueur via le panneau, puis vérifier que
héros et Bran rendent tous deux la main dans un même combat ; mode auto :
combat résolu sans blocage. Suite 299 tests, stable.

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