05c4c11c0b
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.
115 lines
4.3 KiB
YAML
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)
|