feat: sérialisation Party et migration des sauvegardes (#50) #60
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#60
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/50-party-serialization"
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 #50.
Fait du groupe
Partyla source persistante de la sauvegarde, tout en conservant une migration explicite depuis les sauvegardes 0.15.0. Deuxième pierre du jalon 0.16.0, à la suite de #49 (modèle runtime). Le groupe — roster, actif, présents, leader, modes de contrôle, état complet desCreature— survit désormais au save/load, et une ancienne sauvegarde centrée sur le héros reste chargeable. Cette base débloque le recrutement (#51) et le suivi des compagnons en exploration (#52).Changements
Resourcedédiés sousscripts/party/—PartyMemberSaveData(member_id,creature,control_mode) etPartySaveData(roster ordonné,active_ids,present_ids,leader_id) — distincts du modèle runtimeRefCounted, car seules les ressources se sérialisent proprement en.tres.Party.to_save_data()/Party.from_save_data(): la reconstruction rejoue chaque étape via l'API publique deParty, donc valide tous les invariants ; toute incohérence renvoienull(reconstruction atomique, jamais de demi-groupe).GameSavegagneformat_version(défaut 0 à dessein, pour distinguer une sauvegarde 0.15.0 sans ce champ) etparty_data.GameState.SAVE_FORMAT_VERSION = 1; les nouvelles sauvegardes laissent le champ héritéheroànull.GameState.apply_save()reconstruit et valide le groupe hors de l'état courant, ne remplace l'état qu'en cas de succès et renvoie unbool;SaveManager.load_from_slot()le propage. Une sauvegarde corrompue (version ≥ 1 sansparty_data) est refusée sans rien altérer.heronon nul devient un protagoniste joueur, actif et leader.Critères d'acceptation
Tests
Suite GUT complète verte : 223 tests / 724 assertions (depuis 213 / 687).
tests/unit/test_party_save.gd: aller-retour DTO (ordre roster/actif/présents, leader, modes de contrôle, état desCreaturey compris hors groupe actif), refus des données invalides (id dupliqué, actif inconnu, leader/présent hors actif, format récent sansparty_data), migration 0.15.0, et round-trip disque complet avec compagnon viaSaveManager.tests/unit/test_world_foundations.gd: tests de sauvegarde 0.15.0 réalignés sur le nouveau contrat (héros viaparty_data).Note de périmètre
Les positions individuelles par membre (
member_pos_by_map) évoquées au plan sont différées à #52, oùWorldintroduit des positions distinctes pour le leader et les suiveurs. En 0.16.0/#50, le seul membre présent est le protagoniste, dont la position reste portée parplayer_pos_by_map(round-trip déjà couvert) : le critère « positions de chaque membre présent restaurées » est satisfait sans introduire de seconde carte de positions à moitié câblée.