# Fausse fin D1 — lignes 95 et 100

## Ligne 100 : la rêverie qui boucle

Choix validés par l'auteur le 15/10/2026 : version complète du texte, générique
limité à ce que le chef a croisé, carton « Fin. » conservé.

Big Egg reconnaît le héros sans ambiguïté, reprend le « Tes ingrédients sont
poches » de l'intro et avoue qu'il l'agaçait pour se rapprocher de lui. Choix :
« Pardonner à Big Egg » ou « Va chier, Big Egg. ». Pardonner : fondu au noir,
générique rapide, « … Les mois ont passé… », les trois diapos de la ligne 95,
« Fin. », « … ou pas. », puis fondu de retour sur le hall. Big Egg : « Allô ? Tu
écoutes ce que je dis ?? », il repose la question, et la même séquence revient
tant que le joueur ne l'envoie pas chier. Seul ce refus lance le combat.

- Événement **Générique** (`credits`, champ `duration`, 0 à 120 s ; 0 garde la
  vitesse de lecture) : `credits_roll.gd` en fin « scène ». Il défile en
  `duration` secondes, Retour (B) le passe et le reste des noms s'efface ; aucun
  carton, la scène écrit la suite. Il passe au-dessus du lecteur
  (`Stage.push_interface`), qui attend sa fin ; la scène interrompue l'arrête.
- Distribution « déjà croisée » (`CreditsRoll.met_ids`), lue dans la sauvegarde
  sans nouveau stockage : employés embauchés ou débloqués, personnages qui ont
  parlé (`times_talked`) ou qui parlent dans une scène vue ou dans la scène
  jouée, clients servis ou partis fâchés, bêtes sorties d'une vague. Le
  générique de la fin du jeu garde toute la distribution.
- Diapo **Retour au jeu** (`slide`, `to_world: true`) : tout le calque s'efface
  en `duration`, puis le lecteur retrouve son style de dialogue. Un calque neuf
  ouvert sur un visuel vide fond au noir au lieu de couper.
- La boucle est en données : un `goto` vers `choice`.

Migration : `tools/game-data-manager/migrate_fake_ending_loop_20261015.py`
(aperçu par défaut, `--apply`), même garde que celle de la ligne 95. Elle garde
les légendes, les diapos et les faits de la ligne 95 et ne réécrit que
`big_egg_d1_offer`.

Contrôle : `fake_ending` accepte une fois, passe le générique avec B, vérifie
le fondu au noir, le carton des mois, le retour au monde (diapos libérées,
style du dialogue, Big Egg qui parle), la seconde question, puis refuse.
`--regression-loop` retire en mémoire le générique et la boucle.

Validation du 15/10 : `fake_ending`, `intro_comic`, `d4_engine` (générique de
la vraie fin), `dialogue`, `scene_reveal`, `d1_story` : PASS
(`20261015-003036-checks-yofs9f5c`). Rouges : `fake_ending` sur les données
de la ligne 95 (7 échecs), puis `--regression-loop` (2) ; PHP avant migration
(12). `fake_ending_validation_test.php`, `story_scene_validation_test.php` et
`story_scene_test.js` : OK. Batterie `gameplay` : 33/34 PASS ; le smoke échoue
sur ses assertions déjà connues, dont trois instables (Frontal, Knockback,
immobilité) qui vont et viennent d'une exécution à l'autre.

## Ligne 95 : les diapos

Choix validé par l'auteur le 14/10/2026 : trois illustrations, marché, plage
(Big Egg prend un coup de soleil), compagnons de vie. Même dessin, même cadre
de légende et mêmes fondus de 1,5 seconde que l'intro. Les légendes existantes
restent celles de `big_egg_d1_offer`, puis « Fin. », « … ou pas. » sur fond
noir. La scène pose ses faits habituels et laisse partir le combat.

Les trois PNG sont dans `assets/story/big_egg_fake_end/`. Le fichier voisin
`generation.json` conserve les prompts et les références du skill imagegen,
outil intégré `image_gen` : le chef de `intro/07_kitchen_single.png`, Big Egg
de `intro/05_mayor_single.png`, puis la première image pour la cohérence.

L'événement générique **Diapo plein écran** (`slide`) choisit un `visual` et
sa durée de fondu (0 à 30 s, 1,5 par défaut). Un visuel vide fond au noir.
Le gestionnaire l'édite, PHP le publie et le catalogue Godot le valide.
`story_slides.gd` couvre le monde sous les légendes, même en rendu 3D, et
attend le fondu avant de rendre la main au lecteur de texte. Le menu de pause
suspend le fondu. Le lecteur habituel garde les choix, les effets et la pause
du jeu. Depuis la ligne 94, l'intro est elle aussi une seule scène de diapos
(`intro`, que `intro_comic.gd` joue avec ce lecteur) : `docs/intro-une-scene.md`.
Le clic sur le panneau de légende transmet explicitement l'action au lecteur,
comme l'intro : en fenêtre, le GUI l'absorbe avant les entrées non traitées.

La branche « Refuser » évite toutes les diapos. « Rejoindre Big Egg » passe
par les trois images puis les deux cartons ; aucun événement de récompense
ni de souvenir n'est dupliqué. À la fin, le lecteur libère les images et rend
son style de texte précédent.

Migration idempotente et ciblée :
`tools/game-data-manager/migrate_fake_ending_slides_20261014.py` (sans option :
aperçu ; `--apply` : maître et brouillon). Elle ajoute trois visuels, quatre
événements et la destination du choix. Elle conserve les autres octets et
refuse une édition concurrente.

Contrôles : `dev.py check --area fake_ending --area intro_comic`,
`fake_ending_validation_test.php`, et les diapos de `story_scene_test.js`.
Le contrôle de la fausse fin emprunte le vrai hall, ses boutons de choix,
les entrées du joueur et sa vague de Big Egg ; il vérifie les images, les
fondus, les cartons, les faits, le héros et l'endurance figés, et la reprise
unique du combat. `--regression-slides` recrée l'ancienne branche sans images
en mémoire. `--slides-captures=<dossier>` capture les cinq cartons en fenêtre
avec la même scène de contrôle et une sauvegarde isolée.

Validation du 14/10 : faux montage sans images rouge en mémoire, puis vert ;
PHP rouge avant migration, vert après ; JS rouge avec une attente à la place
de la diapo, vert après. `fake_ending` et `intro_comic` : PASS dans
`20261014-213246-checks-sj2kfa7l` ; dialogues, dévoilement, histoire D1,
édition JS et validation PHP des scènes : PASS dans
`20261014-212855-checks-l1biuv69`. Le contrôle d'intro reconnaît maintenant
les neuf légendes réellement écrites (huit chapitres), au lieu d'en exiger huit.
Captures graphiques finales et toutes les assertions, clic/pause compris :
PASS, `20261014-213428-ligne95-captures-h6wls_c6`, cinq PNG et aucune erreur.
Ce passage a d'abord révélé puis confirmé la correction du clic du panneau.

Le smoke reste FAIL (11 assertions) dans la batterie `212855` : économie,
parents d'upgrades, compteurs de coquille, état de mort et physique. Ces erreurs
figurent déjà dans les rapports `20261014-211154-checks-8nq9h3hc` et
`20261014-152016-checks-w4e6o4dt`. Ne pas présenter la validation globale comme
verte. Les contrôles de la ligne 95 sont verts.

Retouche du 15/10/2026 (9933efd) : le héros de la plage rit à bouche ouverte,
yeux plissés, tête relevée et main abaissée. L'expression varie ainsi du sourire
du marché. Remplacement du seul PNG de plage, même chemin ; prompt d'édition
ajouté à `generation.json`. Capture et parcours du diaporama : PASS, aucune
erreur, cinq PNG dans `20261015-220423-ligne95-captures-_y68a9z2`. Image en jeu
relue visuellement. Code, légendes et données de jeu inchangés.
