# Atelier narratif — synthèse du chantier

État au 30/09/2026. Ce document résume le chantier ouvert le 29/09. Le détail
des décisions reste dans `docs/cahier-atelier-narratif.md` (notes datées) et
l'analyse d'origine dans `docs/proposition-outil-narratif.md` et
`docs/proposition-atelier-narratif.md`.

---

## 1. Pourquoi cet atelier

Le point de départ : les générateurs narratifs de Taskmaster3000, et l'envie
d'un gestionnaire / visualisateur d'histoire pour Big Egg (acteurs, conditions,
récompenses, salles).

Trois priorités, dans cet ordre :

1. **Ne jamais mettre en péril le système actuel.** L'atelier ne remplace pas
   le gestionnaire et ne touche pas au jeu.
2. **Enlever les freins à l'écriture d'une narration élaborée**, en voyant le
   jeu tel qu'il est vraiment.
3. **Créer de vrais éléments de jeu** : un bonus, pas l'objectif.

Le recadrage le plus important est venu en cours de route. Une fois la lecture
du jeu lisible, il manquait l'essentiel : **lancer des idées, créer des
intrigues, les relier par cause et effet.** C'est l'étape 2.

---

## 2. Ce que fait l'atelier aujourd'hui

Adresse : `tools/game-data-manager/narrative/` (lien depuis le gestionnaire).

### 2.1 Lire le jeu publié

Le tableau se remplit **en sens unique** à partir des données publiées
(`load_master`). Le brouillon n'y apparaît jamais : il vit trop peu longtemps.
La quête de Bob y figure donc d'office, sans rien saisir.

**Une seule sorte de carte : l'événement.**

- Ce qui compte comme événement : un déclencheur, une réplique, un crochet
  (« servi », « tué », etc.), une vague conditionnelle, un PNJ mis de côté, un
  compteur du moteur.
- Les **ouvertures** ne font pas de carte à part. Une salle qui peut apparaître,
  un client qui peut venir, une recette, une arme ou un employé débloqué
  s'affichent en « Ouvre / Ferme » sur l'événement qui les cause. C'est ce qui a
  réglé les doublons du type « Bob vient au restaurant » / « Bob entre au
  restaurant ».

**Chronologie par étapes de quête**, sous forme de rangées libellées : Avant la
quête, Étape n, Quête réussie, Quête échouée, Hors de la trame. Plus de bandes
de fond.

**Cartes lisibles sans cliquer** : phase, titre, lieu · personnage, « Quand »,
première ligne de scène, « Change », « Ouvre », « Ferme ».

**Conditions héritées masquées.**

- Une salle transmet ses conditions d'ouverture aux événements qu'elle contient.
- La recette fixe d'un client transmet les siennes à son « servi ».
- Si un parent exige déjà une condition, l'enfant ne la répète pas.
- Les conditions masquées restent consultables dans l'inspecteur.

**Flèches élaguées.** Une flèche n'existe que si elle porte une condition
affichée. Un parent ne peut masquer une condition que s'il vient plus tôt,
garde un lien vers l'enfant et ne remet pas lui-même la condition à faux.

**Règles d'ordre automatiques :**

- un déclencheur automatique passe avant une réplique (« ensuite, si on lui
  reparle ») ;
- un déclencheur « Fait parler » relie les répliques compatibles de son
  personnage ;
- le fil d'une salle va dans l'ordre entrée → événements intérieurs → « salle
  nettoyée », après ses vagues ;
- **salle fermée** : un effet produit ailleurs, qui ferme une salle,
  n'atteint pas les événements épinglés à cette salle ;
- une réplique n'est épinglée à une salle que si le personnage n'existe que là
  et n'est pas aussi client. Bob se parle aussi attablé au restaurant, donc ses
  répliques sont multi-lieux ;
- un PNJ qui part avec une vague est fondu dans la carte « une vague arrive ».

**Besoin d'arme** : un ennemi qui résiste à moins de 0,25 est signalé comme
exigeant une autre arme (El Tuna, 5 % à la fourchette).

**Inspecteur**, pour chaque événement :

- ses détails, avec les conditions masquées dépliables ;
- les liens « Rendu possible par » et « Empêché par » ;
- **un lien vers la fiche dans le gestionnaire** (`#fiche=collection:id`). Si un
  onglet du gestionnaire est déjà ouvert, il navigue sans recharger
  (`BroadcastChannel`).

**Écran tactile** : glisser, pincer pour zoomer, double-toucher. Le cas où le
tableau ne défilait plus (pointeurs fantômes pris pour un pincement) est
corrigé.

### 2.2 Écrire son histoire (étape 2)

- **Intrigues** : `+ Intrigue`, choix dans le menu « Histoire ». Chaque
  intrigue a sa fiche.
- **Idées** : `+ Idée`, cartes en pointillé avec un statut : idée → formée →
  prête → dans le jeu.
- Champs d'une idée : **quand, où, qui, change, récompenses**. Chaque entrée est
  reconnue automatiquement :
  - **réelle**, si le nom existe dans le jeu ;
  - **à créer**, si elle ressemble à un élément de jeu inconnu ;
  - **texte**, sinon.
- **Liens** entre cartes (cause → effet), idées et événements réels mélangés.
- **« À créer dans le jeu »** : la fiche d'intrigue liste ce qui reste à
  fabriquer dans le gestionnaire.
- Dupliquer, supprimer, annuler / rétablir, chercher, cadrer, réorganiser.
- Seules les cartes **déplacées à la main** gardent leur position. Le reste se
  replace tout seul quand le jeu change.

---

## 3. Garanties de sécurité

C'est la priorité 1, vérifiée par un test dédié (`narrative_safety_test.js`).

| Point | Garantie |
|---|---|
| Lecture du jeu | uniquement `GET ../api.php?action=load_master` |
| Écriture | uniquement `data/narrative_plan.json` via `plan_api.php` |
| Chemin | fixe, aucun nom de fichier venu du navigateur |
| Conflit | empreinte SHA-256; un plan modifié ailleurs répond 409, rien n'est écrasé |
| Écriture atomique | fichier temporaire puis renommage, copie `.previous` gardée |
| Jeu / brouillon | jamais touchés, aucun appel de publication |

`data/narrative_plan.json` t'appartient. Il n'est pas suivi par Git : c'est ton
cahier d'auteur, pas une donnée du jeu.

---

## 4. Changements hors de l'atelier

### 4.1 Gestionnaire

- **Liens profonds** : `#fiche=collection:id` ouvre directement une fiche.
- **Brouillon jetable.** Ta règle : « j'ai une idée → j'ouvre → je modifie →
  je publie ».
  - Un brouillon sans modification depuis **10 minutes** est abandonné au
    retour sur l'onglet ou au premier geste.
  - Ce premier geste est avalé : un clic sur « Publier » ne publie donc pas un
    vieux brouillon.
- **Déclencheurs : deux champs au lieu d'un** (schéma 92). Tu l'avais jugé
  critique, avec raison : « Style de » mélangeait deux sens.
  - **« Fait parler »** (`dialogue`) : ouvre la conversation d'un personnage,
    dont la première réplique valide joue.
  - **« Boîte de dialogue de »** (`character`) : apparence seulement, pour la
    scène jouée.
  - Une scène **ou** « Fait parler », pas les deux ; le PHP le refuse.
  - La migration n'a touché qu'un déclencheur : `bob_hideout_greeting`.

### 4.2 Jeu

- `story_triggers.gd` : un déclencheur avec « Fait parler » ouvre le dialogue du
  personnage. Sinon il joue sa scène, habillée par « Boîte de dialogue de ».
- `data_catalog.gd` : schéma 92, lecture et validation de `dialogue`.
- `bob_quest_check.gd` : El Tuna n'a plus besoin d'être immunisé à la
  fourchette. Le contrôle exige seulement :
  - fourchette ≤ 2,5 / 10 ;
  - lance-œufs > 5 / 10.

  Tes 5 % respectent donc le défi pour un joueur expérimenté.

---

## 5. Tests

| Contrôle | État |
|---|---|
| 7 tests de l'atelier (`dev.py check --area manager --match narrative`) | verts |
| story_tools (PHP + navigateur), dialogue, quêtes, bob_quest | verts |
| brouillon jetable (navigateur) | vert |
| migration 92 | vérifiée par comparaison JSON avec la copie d'avant |

**Échecs préexistants, sans lien avec l'atelier :**

- **14 tests du gestionnaire** échouent aussi avec l'`app.js` d'avant le
  chantier. Ils tiennent à tes données en cours : équilibrage, améliorations,
  éléments de restaurant, recettes, formes, etc.
- **9 contrôles du smoke test** : formule de paiement, charge 42 px, parents de
  branche, niveaux de coquilles `pv1_copy…`, compteurs 0/9, télégraphe
  frontal, recul.

---

## 6. Observations en suspens (rien n'a été modifié)

- **« Bob attend son plat »** exige que Bob client soit présent. Cette réplique
  ne joue donc qu'au restaurant, jamais dans la planque. À confirmer si c'est
  voulu.
- **« eLTuna »** : la casse du nom affiché de l'ennemi semble fautive.
- Les 14 + 9 échecs ci-dessus attendent tes données définitives, pas du code.

---

## 7. Ce qui reste (feuille de route du cahier)

- **Étape 3 — sortir du papier.**
  - Export Markdown de la « fiche d'implémentation » d'une intrigue : ce qu'il
    faut créer, où et avec quelles conditions.
  - Bibliothèque de motifs (quête à étapes, PNJ qui part, récompense de
    boss, etc.) pour démarrer une intrigue en un clic.
- **Étape 4 — diagnostics élargis.**
  - Événements inatteignables, conditions jamais satisfaites.
  - Récompenses sans source, quêtes sans issue.
- **Bonus (priorité 3)** : créer un élément réel depuis une idée. Pour
  l'instant, le lien vers le gestionnaire suffit. Toute écriture passerait par
  le brouillon et ta publication, jamais directement.

---

## 8. Commits du chantier

| Commit | Contenu |
|---|---|
| f7149ad | Étape 1 : le jeu publié dessine ses histoires |
| f4afcb8 | Une seule sorte de carte |
| ea04f0d | Frise par étapes de la quête |
| ea0a022 | Événements et ouvertures, dans l'ordre de la quête |
| 696a52c | Cartes lisibles sans cliquer, conditions non répétées |
| d37342d | Plus de flèches redondantes |
| e6d4fbf | Le fil d'une salle; une salle fermée ne se traverse pas |
| fea210c | Étape 2 : écrire ses intrigues, idées et liens |
| 9a2104f | Écran tactile |
| 3e19684 | Un PNJ qui part avec la vague est fondu dans la vague |
| 273f126 | Liens vers le gestionnaire, tableau débloqué, ordre automatique |
| e679eb5 | Brouillon inactif 10 minutes abandonné |
| 40f9acf | Schéma 92 : « Fait parler » séparé de la boîte de dialogue |
| 35f5cf2 | bob_quest : El Tuna résiste à la fourchette, sans immunité |

## 9. Fichiers principaux

- Atelier :
  - `tools/game-data-manager/narrative/index.php`
  - `narrative_index.js` (lecture du jeu)
  - `narrative_plan.js` (modèle du cahier)
  - `narrative_view.js` (page)
  - `narrative.css`
  - `plan_store.php`, `plan_api.php`
- Gestionnaire : `assets/app.js`, `config.php`, `migrate_schema_92.php`,
  `README.md`.
- Jeu : `scripts/core/story_triggers.gd`, `data_catalog.gd`,
  `story_tools_check.gd`, `bob_quest_check.gd`.
- Tests : `tools/game-data-manager/tests/narrative_*`,
  `stale_draft_browser_test.js`, `story_tools_*`.
