# Le dévoilement du texte des scènes

Ligne 72 du Sheet de suivi ; décisions de l'auteur du 12/10/2026.

## Ce que voit le joueur

Chaque réplique (événement « texte ») passe par deux états : elle s'écrit
(« en dévoilement »), puis elle reste (« dévoilée »).

- **A** (clic, Entrée, Espace, A) : dévoilée, la suivante ; en dévoilement
  passable, tout dévoiler.
- **B** (Retour arrière, clic droit, B) : dévoilée, la suivante ; en
  dévoilement, passer la réplique si elle est passable, sinon tout dévoiler.
- Dévoilement non passable : A et B ne font rien pendant qu'elle s'écrit.
- **B maintenu**, après une attente : des passes rapides jusqu'à la prochaine
  réplique non passable, où il dévoile et s'arrête (ou jusqu'à un choix).
- **Gardes** : A puis B ne comptent qu'après un court délai depuis
  l'apparition de la réplique (ou depuis un « tout dévoiler ») ; les boutons
  d'un choix attendent un peu plus.
- Les autres touches ne font rien ; Échap et Start ouvrent la pause, qui
  propose « Passer la scène ».
- Une réplique minutée (`duration` > 0) s'écrit, puis sa minuterie part.

## Les réglages

Trois niveaux : la réplique, sinon la scène (`reveal_defaults`), sinon les
variables d'auteur (catégorie « scenes »). Vide = hérite.

| Champ (réplique ou `reveal_defaults`) | Valeurs | Variable d'auteur |
|---|---|---|
| `reveal_mode` | vide, `letters`, `words`, `instant` | lettre par lettre |
| `reveal_speed` | 0 = héritée, sinon lettres ou mots par seconde | `scene_reveal_letters_per_second` (45), `scene_reveal_words_per_second` (8) |
| `reveal_skippable` | vide, `yes`, `no` | `scene_reveal_skippable` (1) |
| `reveal_skippable_second_time` | idem, scène déjà vue | `scene_reveal_skippable_second_time` (1) |
| `line_skippable` | idem : B passe, B maintenu traverse | `scene_line_skippable` (1) |
| `line_skippable_second_time` | idem, scène déjà vue | `scene_line_skippable_second_time` (1) |

Délais, en secondes : `scene_guard_a` (0,25), `scene_guard_b` (0,12),
`scene_guard_choice` (0,6), `scene_hold_delay` (0,5), `scene_hold_interval`
(0,08).

Les noms de la spécification se lisent ainsi : `devoilement_skippable` =
`reveal_skippable` ; `skippable` (du paragraphe) = `line_skippable`, pour ne
pas le confondre avec le `skippable` de la scène, qui permet de passer la
scène entière depuis la pause.

## Scène déjà vue

Une scène finie ou passée s'inscrit parmi les scènes vues
(`GameState.scene_seen`, portée méta de la partie) ; ses répliques lisent
alors leurs réglages « deuxième fois ». L'intro ne s'y inscrit pas
(`record_seen = false`) : rejouée à chaque partie neuve, elle garde ses
réglages de première fois.

## Code et contrôle

- `scripts/core/story_scene_player.gd` : `press_a`, `press_b`, `_reveal_line`,
  `_resolve_line`, B maintenu dans `_process`. `continue_scene()` passe à la
  suite quoi qu'il arrive (contrôles, pause).
- Schéma : PHP (`normalize_reveal_settings`), `data_catalog.gd`
  (`_normalize_reveal`), formulaire du gestionnaire (répliques et section
  « Dévoilement du texte » de la scène).
- Migration : `migrate_scene_reveal_20261012.php`.
- Contrôle : `python tools/dev/dev.py check --area scene_reveal`.
