feat: recrutement et composition du groupe accessibles en jeu (#69) #83

Merged
Reliodas merged 1 commit from feature/69-in-game-recruitment into develop 2026-06-22 11:28:04 +00:00
Owner

Closes #69.

Le système de recrutement existait dans GameState, mais aucun chemin jouable ne l'appelait : une partie normale restait toujours solo (le smoke test #58 contournait le manque en appelant l'API directement). Ce ticket câble une vraie surface de jeu. Premier ticket du lot « surfaces de jeu » de l'audit 0.16.0.

Changements

  • Panneau de groupe scenes/exploration/party_panel.gd (PartyPanel, construit en code, style character_creation) : ouvert/fermé par [P] en exploration uniquement (World._unhandled_input, ignoré en combat). Il liste le roster (nom, PV, statut) et propose Recruter Bran (tant qu'il n'est pas au roster) puis Quitter / Rejoindre le groupe actif. Purement présentation : il émet des signaux, ne mute pas l'état lui-même.
  • World applique ces signaux via l'API existante (GameState.recruit_demo_companion() / leave_active_group() / rejoin_active_group()), puis appelle World.rebuild_formation() et affiche un toast. rebuild_formation() centralise « marquer le groupe actif présent + (re)placer les jetons Follower sans doublon » — désormais utilisé à l'entrée de zone et après chaque mutation (réutilisé par #76).

Critères d'acceptation

  • depuis une nouvelle partie normale, le joueur peut recruter Bran sans outil de développement ;
  • Bran apparaît immédiatement comme suiveur lorsqu'il rejoint le groupe actif ;
  • quitter le groupe retire son jeton sans supprimer son roster ni sa Creature ;
  • réintégrer le groupe restaure son jeton et son état ;
  • sauvegarder/recharger conserve recrutement et appartenance active ;
  • une tentative répétée reste idempotente.

Tests

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

  • tests/unit/test_world_party_panel.gd emprunte le vrai chemin d'entrée (presse les boutons du panneau via leur signal pressed — aucun appel direct à recruit_demo_companion() dans le corps du scénario) : recrutement → jeton suiveur présent ; idempotence (le bouton disparaît, l'API refuse) ; départ → suiveur retiré, roster conservé ; retour → suiveur restauré ; save/load recruté et hors groupe actif.

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

L'ergonomie réelle du panneau (ouverture [P], lisibilité, messages) sera validée dans Godot au #78.

Closes #69. Le système de recrutement existait dans `GameState`, mais **aucun chemin jouable** ne l'appelait : une partie normale restait toujours solo (le smoke test #58 contournait le manque en appelant l'API directement). Ce ticket câble une vraie surface de jeu. Premier ticket du lot « surfaces de jeu » de l'audit 0.16.0. ## Changements - **Panneau de groupe** `scenes/exploration/party_panel.gd` (`PartyPanel`, construit en code, style `character_creation`) : ouvert/fermé par **[P]** en exploration uniquement (`World._unhandled_input`, ignoré en combat). Il liste le roster (nom, PV, statut) et propose **Recruter Bran** (tant qu'il n'est pas au roster) puis **Quitter / Rejoindre** le groupe actif. Purement présentation : il émet des signaux, ne mute pas l'état lui-même. - **`World`** applique ces signaux via l'API existante (`GameState.recruit_demo_companion()` / `leave_active_group()` / `rejoin_active_group()`), puis appelle **`World.rebuild_formation()`** et affiche un toast. `rebuild_formation()` centralise « marquer le groupe actif présent + (re)placer les jetons `Follower` sans doublon » — désormais utilisé à l'entrée de zone **et** après chaque mutation (réutilisé par #76). ## Critères d'acceptation - [x] depuis une nouvelle partie normale, le joueur peut recruter Bran sans outil de développement ; - [x] Bran apparaît immédiatement comme suiveur lorsqu'il rejoint le groupe actif ; - [x] quitter le groupe retire son jeton sans supprimer son roster ni sa Creature ; - [x] réintégrer le groupe restaure son jeton et son état ; - [x] sauvegarder/recharger conserve recrutement et appartenance active ; - [x] une tentative répétée reste idempotente. ## Tests Suite GUT complète verte : **294 tests** (depuis 289), stable sur plusieurs exécutions. - `tests/unit/test_world_party_panel.gd` emprunte le **vrai chemin d'entrée** (presse les boutons du panneau via leur signal `pressed` — aucun appel direct à `recruit_demo_companion()` dans le corps du scénario) : recrutement → jeton suiveur présent ; idempotence (le bouton disparaît, l'API refuse) ; départ → suiveur retiré, roster conservé ; retour → suiveur restauré ; save/load recruté **et** hors groupe actif. ### Validation manuelle (différée au #78) L'ergonomie réelle du panneau (ouverture [P], lisibilité, messages) sera validée dans Godot au #78.
feat: recrutement et composition du groupe accessibles en jeu (#69)
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
7bfe90231d
Ajoute un panneau de groupe (PartyPanel, construit en code) ouvert/fermé
par [P] en exploration : il liste le roster et propose de recruter Bran,
puis de le faire quitter/rejoindre le groupe actif. Les boutons émettent
des signaux que World applique via l'API GameState
(recruit_demo_companion / leave_active_group / rejoin_active_group), suivis
de World.rebuild_formation() qui resynchronise les jetons (apparition et
retrait immédiats du suiveur, sans doublon) et d'un toast.

Le recrutement reste idempotent (le bouton disparaît une fois Bran au
roster) et l'appartenance survit à la sauvegarde. rebuild_formation()
centralise le marquage de présence + (re)placement des suiveurs,
désormais appelé aussi à l'entrée de zone.

Tests : test_world_party_panel.gd emprunte le vrai chemin (presse les
boutons du panneau, sans appeler recruit_demo_companion() dans le
scénario) — apparition/retrait du jeton suiveur, idempotence, départ/retour,
save/load recruté et hors groupe. Suite 294 tests, stable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 35ae5392d6 into develop 2026-06-22 11:28:04 +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#83
No description provided.