feat: recrutement et retrait d'un compagnon (#51) #61

Merged
Reliodas merged 1 commit from feature/51-companion-recruitment into develop 2026-06-22 03:23:18 +00:00
Owner

Closes #51.

Ajoute le flux de jeu minimal permettant à un personnage stable de rejoindre ou quitter le groupe sans perdre son état. Troisième pierre du jalon 0.16.0, à la suite de #49 (modèle) et #50 (sauvegarde). Le protagoniste est désormais le premier membre du groupe sur une nouvelle partie, et un compagnon de démonstration peut être recruté, sortir du groupe actif, puis le réintégrer — son état survit à tout, y compris au save/load. Cette base débloque l'exploration leader/suiveurs (#52) et les participants alliés en combat (#53).

Changements

  • CompanionFactory (scripts/companion_factory.gd) : construit le compagnon de démonstration Bran, Prêtre niveau 3, sur le même modèle que HeroFactory. Son identifiant companion_bran vient du contenu, jamais du nom ni de la position — il reste stable à travers recrutement, départs et sauvegardes.
  • Flux de recrutement sur GameState :
    • recruit(member) inscrit au roster puis fait rejoindre le groupe actif s'il reste de la place (deux opérations vérifiées) ; idempotent : un id déjà au roster n'est jamais recruté deux fois ; refuse aussi un membre invalide ou une Creature déjà inscrite ;
    • recruit_demo_companion() : point d'entrée du compagnon de démo (interaction / point de test en monde) ;
    • leave_active_group(id) / rejoin_active_group(id) : sortir du groupe actif sans destruction (la Creature et ses PV restent au roster) puis réintégrer ;
    • MAX_ACTIVE_PARTY = 4 + active_group_is_full() : règle de composition minimale et explicite.

Critères d'acceptation

  • une nouvelle partie place le protagoniste dans Party ;
  • un compagnon peut être recruté une seule fois ;
  • rejoindre et quitter le groupe conserve sa Creature, ses PV et ses ressources ;
  • le compagnon reste dans le roster lorsqu'il quitte le groupe actif ;
  • l'état de recrutement est compatible avec la sauvegarde ;
  • tests couvrent recrutement, retrait et réintégration.

Tests

Suite GUT complète verte : 230 tests / 758 assertions (depuis 223 / 724).

  • tests/unit/test_party_recruitment.gd : protagoniste premier membre sur une nouvelle partie, recrutement unique (idempotent), refus des recrues invalides / Creature dupliquée, quitter/réintégrer le groupe actif en conservant l'état, limite de composition MAX_ACTIVE_PARTY, et round-trip sauvegarde complet d'un compagnon recruté hors groupe actif.

Note de périmètre

Conformément au plan validé (garde-fous #51, centrés sur le modèle/flux) et au libellé du ticket (« interaction simple ou un point de test en monde »), #51 livre le flux de recrutement, le compagnon de contenu et son état persistant, exercés par un test de bout en bout. Le point de recrutement spatial (jeton/PNJ neutre au contact) est délivré avec #52, où les compagnons gagnent une présence et des positions en monde — éviter d'introduire ici du code de monde que #52 refondrait.

Closes #51. Ajoute le flux de jeu minimal permettant à un personnage stable de rejoindre ou quitter le groupe sans perdre son état. Troisième pierre du jalon 0.16.0, à la suite de #49 (modèle) et #50 (sauvegarde). Le protagoniste est désormais le premier membre du groupe sur une nouvelle partie, et un compagnon de démonstration peut être recruté, sortir du groupe actif, puis le réintégrer — son état survit à tout, y compris au save/load. Cette base débloque l'exploration leader/suiveurs (#52) et les participants alliés en combat (#53). ## Changements - **`CompanionFactory`** (`scripts/companion_factory.gd`) : construit le compagnon de démonstration **Bran**, Prêtre niveau 3, sur le même modèle que `HeroFactory`. Son identifiant `companion_bran` vient du **contenu**, jamais du nom ni de la position — il reste stable à travers recrutement, départs et sauvegardes. - **Flux de recrutement sur `GameState`** : - `recruit(member)` inscrit au roster **puis** fait rejoindre le groupe actif s'il reste de la place (deux opérations vérifiées) ; **idempotent** : un id déjà au roster n'est jamais recruté deux fois ; refuse aussi un membre invalide ou une `Creature` déjà inscrite ; - `recruit_demo_companion()` : point d'entrée du compagnon de démo (interaction / point de test en monde) ; - `leave_active_group(id)` / `rejoin_active_group(id)` : sortir du groupe actif **sans destruction** (la `Creature` et ses PV restent au roster) puis réintégrer ; - `MAX_ACTIVE_PARTY = 4` + `active_group_is_full()` : règle de composition minimale et explicite. ## Critères d'acceptation - [x] une nouvelle partie place le protagoniste dans Party ; - [x] un compagnon peut être recruté une seule fois ; - [x] rejoindre et quitter le groupe conserve sa Creature, ses PV et ses ressources ; - [x] le compagnon reste dans le roster lorsqu'il quitte le groupe actif ; - [x] l'état de recrutement est compatible avec la sauvegarde ; - [x] tests couvrent recrutement, retrait et réintégration. ## Tests Suite GUT complète verte : **230 tests / 758 assertions** (depuis 223 / 724). - `tests/unit/test_party_recruitment.gd` : protagoniste premier membre sur une nouvelle partie, recrutement unique (idempotent), refus des recrues invalides / `Creature` dupliquée, quitter/réintégrer le groupe actif en conservant l'état, limite de composition `MAX_ACTIVE_PARTY`, et round-trip sauvegarde complet d'un compagnon recruté hors groupe actif. ### Note de périmètre Conformément au plan validé (garde-fous #51, centrés sur le modèle/flux) et au libellé du ticket (« interaction simple **ou** un point de test en monde »), #51 livre le flux de recrutement, le compagnon de contenu et son état persistant, exercés par un test de bout en bout. Le **point de recrutement spatial** (jeton/PNJ neutre au contact) est délivré avec #52, où les compagnons gagnent une présence et des positions en monde — éviter d'introduire ici du code de monde que #52 refondrait.
feat: recrutement et retrait d'un compagnon (#51)
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
5de57313f6
Ajoute CompanionFactory (Bran, Prêtre niveau 3, id de contenu stable
companion_bran) et le flux de recrutement sur GameState :

- recruit(member) : inscrit au roster puis rejoint le groupe actif s'il
  reste de la place ; idempotent (jamais deux fois le même id) ;
- recruit_demo_companion() : point d'entrée du compagnon de démo ;
- leave_active_group / rejoin_active_group : sortir/réintégrer le groupe
  actif sans détruire le membre (Creature et PV conservés au roster) ;
- MAX_ACTIVE_PARTY = 4 + active_group_is_full() : composition explicite.

L'état de recrutement est compatible avec la sauvegarde (#50).

Tests : test_party_recruitment.gd (protagoniste premier membre,
recrutement unique, quitter/réintégrer sans perte d'état, limite de
composition, round-trip sauvegarde). Suite 230 tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 93924f8460 into develop 2026-06-22 03:23:18 +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#61
No description provided.