feat: modèle Party et modes de contrôle (#49) #59
No reviewers
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: jeux/beaulieu-sur-brume#59
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/49-party-model"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #49.
Introduit le modèle de domaine
Party, première pierre du jalon 0.16.0 « Un groupe contrôlable ». Il remplace progressivement l'hypothèse d'un héros unique sans coupler lesCreatureauxNodede scène :GameState.partydevient la source de vérité runtime etGameState.heron'est plus qu'une façade transitoire vers le membreprotagonist. Le solo 0.15.0 (création de personnage, sauvegarde, combat) reste inchangé. Cette base débloque le recrutement (#51), l'exploration leader/suiveurs (#52) et le combat multi-acteurs (#54).Changements
PartyMember(scripts/party/party_member.gd) : uneCreature, unmember_idstable et uncontrol_mode(PLAYER/AUTO_ALLY/SCRIPTED_GUEST). Le mode de contrôle est orthogonal à l'équipe de combat — on ne déduit jamaisCreature.teamdu mode. LaCreaturese remplace viareplace_creature, l'identifiant ne change jamais.Party(scripts/party/party.gd) distinguant trois cercles emboîtés — roster ⊇ actif ⊇ présents — avec un leader. Ordres déterministes (tableaux d'ids, jamaisDictionary.values()), collections renvoyées en copies, opérations atomiques : toute opération invalide renvoiefalsesans laisser d'état partiel. Réaffectation déterministe du leader quand il quitte l'actif.GameState:herodevient une propriété calculée vers le membreprotagonist(créé actif, joueur, leader) ; ajout deGameState.party(lecture seule) et deGameState.reset_party().begin_new_game,reset_runetapply_saveréinitialisent explicitement le groupe pour ne jamais conserver de compagnon résiduel d'une session précédente.GameState.hero = nullcomme nettoyage global migrés versGameState.reset_party().Critères d'acceptation
Tests
Suite GUT complète verte : 213 tests / 687 assertions (depuis 189 / 599).
tests/unit/test_party.gd: roster/actif/présent, ordre déterministe, ids vides et doublons, mêmeCreatureinscrite deux fois, références inconnues, retrait en cascade, réaffectation du leader, orthogonalité du mode de contrôle.tests/unit/test_game_state_party.gd: façadehero(création/remplacement du protagoniste, actif/joueur/leader,hero = nulln'efface que le protagoniste,begin_new_gamevide le groupe,apply_save0.15.0 remplace un groupe préexistant,ensure_heroconserve la mêmeCreature).