feat: changement de leader en jeu et reconstruction de formation (#76) #85

Merged
Reliodas merged 1 commit from feature/76-leader-switch into develop 2026-06-22 11:40:54 +00:00
Owner

Closes #76.

GameState.set_leader() existait, mais aucun contrôle joueur ne l'appelait, et changer le leader par code ne reconstruisait pas les rôles visuels Player/Follower : le critère d'exploration avec un leader restait essentiellement technique. Ce ticket câble une surface jouable et la reconstruction immédiate de la formation.

Changements

  • Panneau de groupe : bouton Leader pour chaque membre actif et vivant qui n'est pas déjà leader (le protagoniste peut redevenir leader) ; statut « leader » / « à terre » affiché. Signal member_leader_requestedWorld.
  • World._on_member_leader_requested() : refuse un membre absent, hors groupe actif (via set_leader) ou à terre. En cas de succès, le leader sortant garde sa case courante (celle du jeton joueur), le jeton joueur (caméra + entrées) saute sur la case mémorisée du nouveau leader, puis rebuild_formation() recrée les suiveurs (l'ancien leader redevient suiveur). Les deux échangent donc leur place, sans doublon ni chevauchement, en préservant les positions individuelles.
  • World.rebuild_formation() reste neutre en position (il ne déplace pas le jeton joueur — posé par l'entrée de zone player_start_for ou par un changement de leader explicite), ce qui corrige une régression de position du joueur au rechargement.

Critères d'acceptation

  • le joueur peut désigner Bran comme leader puis revenir au protagoniste ;
  • le jeton contrôlé, la caméra et les suiveurs reflètent immédiatement le choix ;
  • aucun membre n'est perdu, dupliqué ou superposé ;
  • sauvegarde et chargement restaurent le leader ;
  • après la chute du leader en combat, le leader vivant choisi au retour est représenté correctement (ensure_valid_leader + rebuild_formation, cf. #55).

Tests

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

  • tests/unit/test_world_leader_switch.gd (chemin panneau réel) : désigner Bran leader → le jeton joueur suit (case du nouveau leader), l'ancien leader devient suiveur sans doublon et conserve sa position ; aller-retour protagoniste↔Bran ; refus d'un membre à terre (bouton absent + handler), hors groupe actif et absent ; persistance save/load du leader.

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

Le ressenti (caméra, file de suiveurs, collisions après changement de leader) sera validé dans Godot au #78.

Closes #76. `GameState.set_leader()` existait, mais aucun contrôle joueur ne l'appelait, et changer le leader par code ne reconstruisait pas les rôles visuels Player/Follower : le critère d'exploration avec un leader restait essentiellement technique. Ce ticket câble une surface jouable et la reconstruction immédiate de la formation. ## Changements - **Panneau de groupe** : bouton **Leader** pour chaque membre actif **et vivant** qui n'est pas déjà leader (le protagoniste peut redevenir leader) ; statut « leader » / « à terre » affiché. Signal `member_leader_requested` → `World`. - **`World._on_member_leader_requested()`** : refuse un membre absent, hors groupe actif (via `set_leader`) ou **à terre**. En cas de succès, le leader sortant garde sa case courante (celle du jeton joueur), le **jeton joueur (caméra + entrées) saute** sur la case mémorisée du nouveau leader, puis `rebuild_formation()` recrée les suiveurs (l'ancien leader redevient suiveur). Les deux échangent donc leur place, **sans doublon ni chevauchement**, en préservant les positions individuelles. - **`World.rebuild_formation()`** reste **neutre en position** (il ne déplace pas le jeton joueur — posé par l'entrée de zone `player_start_for` ou par un changement de leader explicite), ce qui corrige une régression de position du joueur au rechargement. ## Critères d'acceptation - [x] le joueur peut désigner Bran comme leader puis revenir au protagoniste ; - [x] le jeton contrôlé, la caméra et les suiveurs reflètent immédiatement le choix ; - [x] aucun membre n'est perdu, dupliqué ou superposé ; - [x] sauvegarde et chargement restaurent le leader ; - [x] après la chute du leader en combat, le leader vivant choisi au retour est représenté correctement (`ensure_valid_leader` + `rebuild_formation`, cf. #55). ## Tests Suite GUT complète verte : **304 tests** (depuis 299), stable sur plusieurs exécutions. - `tests/unit/test_world_leader_switch.gd` (chemin panneau réel) : désigner Bran leader → le jeton joueur suit (case du nouveau leader), l'ancien leader devient suiveur **sans doublon** et conserve sa position ; aller-retour protagoniste↔Bran ; refus d'un membre **à terre** (bouton absent + handler), hors groupe actif et absent ; persistance save/load du leader. ### Validation manuelle (différée au #78) Le ressenti (caméra, file de suiveurs, collisions après changement de leader) sera validé dans Godot au #78.
feat: changement de leader en jeu et reconstruction de la formation (#76)
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
25fb1a74f9
Le panneau de groupe expose un bouton « Leader » par membre actif et vivant
(signal member_leader_requested → World). Désigner un nouveau leader : le
jeton joueur (caméra + entrées) saute sur la case mémorisée du nouveau
leader, l'ancien leader y est enregistré puis réapparaît comme suiveur
(les deux échangent leur place), et la formation est reconstruite sans
doublon ni chevauchement. Refus d'un membre absent, hors groupe actif ou à
terre ; le leader est restauré au chargement.

rebuild_formation() reste neutre en position (n'déplace pas le jeton joueur,
fixé par l'entrée de zone ou par un changement de leader explicite), ce qui
évite la régression sur le rechargement (position du joueur préservée).

Tests : test_world_leader_switch.gd (chemin panneau) — le jeton joueur suit
le nouveau leader, l'ancien devient suiveur sans doublon, allers-retours,
refus mort/hors-actif/absent, persistance save/load du leader. Suite 304
tests, stable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 9010effcb7 into develop 2026-06-22 11:40:54 +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#85
No description provided.