Files
Ransom-s-wake/docs/adr/0009-player-knowledge-driven-progression.md
T

164 lines
8.1 KiB
Markdown

# 0009 — Progression pilotée par les connaissances et actions du joueur
- Statut : accepté
- Date : 2026-08-10
- Remplace : aucun
## Contexte
L'entreprise qui engage le joueur sait qu'elle poursuit un trésor, mais présente
la première mission comme la récupération du travail du précédent opérateur.
Le monde possède donc une vérité, le commanditaire possède des intentions et le
joueur ne dispose au départ que d'une version partielle ou mensongère.
Une épave peut être localisée, identifiée, examinée, ouverte et revisitée sans
que son objectif principal ait été sécurisé. Débloquer la suite dès la
découverte du navire rendrait la récupération de l'objet ou de l'indice
facultative et contredirait la boucle de campagne. À l'inverse, utiliser les
secrets du contenu pour colorer une icône ou construire un objectif visible
révélerait indirectement une information que le joueur n'a pas encore obtenue.
## Décision
### Trois niveaux d'information
Le modèle sépare explicitement :
1. **La vérité du contenu** : identité réelle d'une épave, objets présents,
chronologie, motivations et liens narratifs. Elle réside dans les définitions
de contenu et n'est jamais envoyée telle quelle à la présentation.
2. **Les termes visibles du contrat** : `ContractTerms` contient uniquement le
commanditaire affiché, les informations communiquées au joueur, l'objectif
officiel, le paiement et les prérequis annoncés.
3. **Les connaissances du joueur** : `MissionProgress` contient uniquement les
faits observés, révélations acquises, objectifs connus, épaves localisées,
identités établies et activités découvertes.
Les intentions cachées de l'entreprise et les véritables étapes de progression
sont décrites dans des `CampaignObjectiveDefinition` distinctes de
`ContractTerms`. Une définition peut rester invisible, devenir connue après une
révélation ou n'exister que comme règle interne reliant des faits.
La sauvegarde persiste les identifiants et états nécessaires à la progression,
mais l'application expose à chaque écran une projection filtrée par les
connaissances du joueur. Le fait qu'une donnée existe dans le contenu ou le
format de sauvegarde ne l'autorise pas à traverser le contrat de présentation.
### Faits, objectifs et révélations
Un fait est un événement métier idempotent déjà établi, par exemple :
- une zone d'écho a été obtenue ;
- une épave a été localisée ;
- une preuve a été observée ;
- une identité a été établie ;
- un accès a été ouvert ;
- un objet se trouve sur le site, dans le panier, dans la cale ou a été remis ;
- des données récupérées ont été analysées.
Une révélation est une nouvelle connaissance produite par une commande validée
et ses prérequis, pas un texte déclenché par l'interface. Elle peut rendre
visible un objectif, une activité, une identité ou une nouvelle zone probable.
Un `CampaignObjectiveDefinition` exprime des prérequis typés et un effet. La
progression les évalue après les commandes applicatives. Elle ne dépend ni de
la scène ouverte, ni d'un libellé, ni d'une comparaison effectuée dans le HUD.
Les mêmes faits ne produisent une révélation qu'une seule fois.
Une hypothèse de joueur, telle que la cible présumée dans le dossier, reste
révisable et n'est pas un fait d'identification. Elle ne valide ni le contrat,
ni une étape cachée.
### Localisation distincte de l'accomplissement
Localiser ou identifier une épave ne satisfait pas automatiquement l'objectif
qui y conduit. Chaque étape requiert le dernier fait métier prévu par sa
définition : récupération, sécurisation dans la cale, analyse, lecture, remise
ou autre action explicitement nommée.
Pour la première mission de la verticale :
1. le contrat visible demande de retrouver le navire de prospection et son
module de cartographie ;
2. la localisation rend l'épave revisitable, sans révéler la piste suivante ;
3. l'identification confirme le navire, sans terminer la mission ;
4. les objets placés dans le panier restent provisoires ;
5. le treuillage puis `EmptyBasket` sécurisent le module et ses données dans la
cale ;
6. `AnalyzeRecoveredData` révèle la zone probable du U-Boot ;
7. la remise physique du module et le paiement restent des actions séparées.
La copie analysable des données demeure acquise après son transfert, même si le
module physique est remis ensuite. Les intentions réelles de l'entreprise ne
deviennent visibles que par une révélation narrative prévue, pas par le simple
accomplissement technique d'un objectif caché.
### Projection de la carte
La carte globale reçoit une projection de `MissionProgress` et applique les
états suivants :
- une vérité de contenu non localisée n'est pas affichée comme épave ;
- une zone d'écho connue reste une zone approximative ;
- une épave localisée sans identité établie est nommée
`Épave non identifiée` ;
- une épave identifiée utilise le nom du navire ;
- l'icône est colorée lorsqu'au moins une activité connue et réalisable reste à
accomplir ;
- l'icône devient monochrome lorsque toutes les activités connues sont
terminées et qu'aucun objectif connu n'y demande une action.
Une activité cachée ne colore pas l'icône : cela divulguerait son existence.
Lorsqu'une révélation la rend connue, la projection peut redevenir colorée.
Cette couleur est une information de présentation dérivée d'un état métier
filtré ; elle n'est pas sauvegardée comme vérité indépendante.
### Responsabilités
Le domaine possède faits, prérequis, états d'objets et transitions de
progression. L'application exécute les commandes, publie les révélations et
construit les projections autorisées. Le monde produit uniquement des
observations et interactions. La présentation affiche les projections et émet
des commandes ; elle ne lit jamais directement les définitions cachées.
Les tests de contenu vérifient au minimum :
- que le contrat visible ne référence pas une révélation prématurée ;
- que chaque objectif de campagne possède une suite de prérequis atteignable ;
- que la campagne reste terminable sans le pack d'archives facultatif ;
- que localiser ou identifier seul la première épave ne révèle pas le U-Boot ;
- que l'analyse des données sécurisées le révèle une seule fois ;
- que chaque leurre possède des faits cohérents et une contradiction
découvrable ;
- qu'aucune projection ne contient un fait ou une activité encore caché.
## Conséquences
- L'entreprise peut mentir sans dupliquer une seconde mission ou risquer que
l'interface expose son véritable objectif.
- Une épave découverte reste facile à retrouver, mais sa découverte ne court-
circuite pas la récupération et l'analyse.
- La carte peut revenir sur une épave lorsqu'une nouvelle activité y est
révélée, sans modifier son historique d'exploration.
- Ajouter une révélation exige des prérequis typés et un test de contenu, ce qui
augmente le travail d'auteur mais réduit les blocages narratifs.
- Les écrans reçoivent des projections dédiées plutôt que les ressources de
contenu complètes.
- Les états de couleur et les libellés de carte restent dérivés et ne créent
pas une source de vérité concurrente.
## Alternatives considérées
- **Mettre objectifs visibles et cachés dans `ContractTerms`** : rejeté, car un
écran ou un export de contrat pourrait révéler les intentions de l'entreprise.
- **Utiliser des booléens globaux sans propriétaire** : rejeté, car leur origine,
leur ordre et leurs prérequis seraient implicites.
- **Débloquer la suite à l'identification de l'épave** : rejeté, car l'objet ou
l'indice demandé deviendrait facultatif.
- **Laisser l'UI déduire l'objectif suivant** : rejeté, car la présentation
calculerait une règle de campagne.
- **Colorer une épave tant qu'elle contient un secret quelconque** : rejeté,
car la carte divulguerait les activités inconnues du joueur.
- **Valider immédiatement la cible présumée** : rejeté, car l'hypothèse doit
rester révisable et la déduction ne doit pas devenir un quiz d'interface.