Files
clement 05c4c11c0b
Repo State / repo-state (pull_request) Failing after 35s
Repo State / repo-state (push) Failing after 40s
Validate Zacus refactor / validate (pull_request) Failing after 5m58s
Validate Zacus refactor / validate (push) Failing after 7m16s
feat: gamebook authoring + demo + bump fw
Context:
The new firmware gamebook mode needs a book on the Freenove SD, plus a
reusable way to author one. We also want a playable demo to prove the
whole chain (button -> navigation -> WAV narration from SD -> screen).

Approach:
Author the book in a human-friendly YAML; a generator renders each
passage's narration with macOS say (16 kHz mono, canonical WAV — the
Apple FLLR chunk is stripped so the firmware parser decodes it),
emits a compact gamebook.json, and stages WAVs + JSON onto the master
SD via POST /game/file?path=sd/gamebook/.

Changes:
- game/gamebooks/zacus_demo.yaml: a branching mini-adventure (the
  Professeur Zacus lab) — 8 passages, 3 endings.
- tools/gamebook/build_gamebook.py: reusable/idempotent generator
  (--book/--ip/--sd-dir/--dry-run); ASCII-folds on-screen text (fonts
  have no accents) while the WAV keeps the accented narration; choices
  carry label + goto (navigation is generic, D-pad + click).
- .gitignore: ignore the generated WAV pack (tools/gamebook/build/).
- Bump ESP32_ZACUS to the gamebook-mode firmware.

Impact:
Authors can write a gamebook in YAML and stage it to the Freenove in
one command; the bundled demo plays end to end, fully offline.
2026-06-19 14:31:50 +02:00

115 lines
4.3 KiB
YAML

# Livre dont vous êtes le héros — démo Zacus
# Joué sur la Freenove (master ESP32-S3) : narration WAV (say) depuis la SD,
# navigation au pavé 5 voies. Compilé par tools/gamebook/build_gamebook.py.
#
# Navigation au D-pad : haut/bas (et gauche/droite) déplacent le curseur ">"
# dans la liste des choix, le clic central valide. L'ordre des choix = l'ordre
# d'affichage. Chaque passage : text (narré en WAV + affiché), screen (titre
# court LCD), choices[] (label + goto). Un passage sans choices = fin (le clic
# recommence l'aventure). Le champ "key" éventuel est ignoré (nav générique).
title: "Le Mystère du Labo de Zacus"
voice: Thomas
start: intro
passages:
intro:
screen: "Minuit au labo"
text: >
Minuit. Le laboratoire du Professeur Zacus est plongé dans le noir.
Une lampe clignote au-dessus d'un établi encombré. Au fond, une machine
étrange ronronne et crache des étincelles bleues. Sur la porte, un mot :
« Si tu lis ceci, c'est que j'ai disparu. Trouve l'Électron Fou. »
Que faites-vous ?
choices:
- key: select
label: "Examiner la machine qui ronronne"
goto: machine
- key: leftright
label: "Fouiller le bureau du Professeur"
goto: bureau
machine:
screen: "La machine"
text: >
Vous approchez de la machine. Un cadran affiche une fréquence qui monte :
quatre cent quarante hertz. Un levier rouge pulse à côté d'un haut-parleur.
Une étiquette jaunie indique : « U-SON — prototype instable ».
choices:
- key: select
label: "Abaisser le levier rouge"
goto: levier
- key: up
label: "Reculer et observer le cadran"
goto: cadran
bureau:
screen: "Le bureau"
text: >
Le bureau déborde de schémas griffonnés. Sous une pile de notes, vous
trouvez un carnet ouvert à une page : « L'Électron Fou se cache là où le
LA résonne. Ne lui parle jamais directement — il fuit. » Un trousseau de
clés pend à un crochet.
choices:
- key: select
label: "Prendre les clés et retourner à la machine"
goto: machine
- key: down
label: "Lire la dernière page du carnet"
goto: carnet
carnet:
screen: "Le carnet"
text: >
La dernière page est presque effacée. On devine : « Coordonnées du refuge :
suis le son, pas la lumière. » Au moment où vous refermez le carnet, la
machine derrière vous s'emballe. Le ronronnement devient strident.
choices:
- key: select
label: "Courir vers la machine"
goto: levier
- key: up
label: "Se cacher sous le bureau"
goto: cache
cadran:
screen: "Le cadran"
text: >
Vous reculez. Le cadran grimpe : quatre cent quarante, puis huit cent
quatre-vingts hertz. Une voix grésille dans le haut-parleur : « Tu chauffes !
Mais l'harmonie n'est pas dans la puissance, petit. » C'est la voix de Zacus !
Le levier rouge clignote de plus en plus vite.
choices:
- key: select
label: "Abaisser le levier maintenant"
goto: levier
- key: down
label: "Débrancher la machine"
goto: debranche
levier:
screen: "Le levier"
text: >
Vous abaissez le levier rouge. Un éclair, un silence — puis un La parfait
emplit la pièce. Le mur du fond coulisse, révélant un passage secret d'où
monte une mélodie. La voix de Zacus résonne : « Bravo. Tu as trouvé la
bonne fréquence. Suis le son... » L'aventure ne fait que commencer.
# fin (victoire)
debranche:
screen: "Court-circuit"
text: >
Vous arrachez la prise. La machine s'éteint dans un gémissement métallique,
et le passage secret se referme à jamais. Dans le noir, le carnet de Zacus
tombe en poussière. Vous ne saurez jamais où menait le son. Fin.
# fin (échec)
cache:
screen: "Sous le bureau"
text: >
Recroquevillé sous le bureau, vous attendez. La machine hurle, crache une
gerbe d'étincelles, puis se calme d'elle-même. Quand vous ressortez, un La
grave vibre encore dans l'air, et le mur du fond est entrouvert. La curiosité
l'emporte : vous vous glissez dans le passage. À suivre...
# fin (alternative)