Files
clement b76f2d3c98
Repo State / repo-state (push) Failing after 12m35s
Validate Zacus refactor / validate (push) Successful in 17m26s
fix(scenario): zacus_v3 valide — act/objective/firmware_step sur les 3 puzzles
Les puzzles de zacus_v3.yaml n'avaient ni `act`, ni `objective`, ni
`firmware_step` (requis par le validateur schema V2). Ajout calqué sur
zacus_v2 : Diapason→acte 1, Piano LEFOU→acte 2, QR Archives→acte 2 ;
valeurs déduites du contenu existant (scène, runtime_steps, solution).
Le scénario valide, compile et simule désormais le playthrough complet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 13:07:45 +02:00

553 lines
18 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
id: zacus_v3
version: 3
title: "Le mystère du Professeur Zacus — v3 NPC + Téléphone + Fallback"
theme: "Enquête scientifique + stabilisation audio + épreuve Zone 4 + déverrouillage final"
players:
min: 6
max: 14
ages: "614 ans (911 recommandés)"
duration:
act_1_minutes: 45
act_2_minutes: 60
total_minutes: 105
# ============================================================
# RÉALITÉ FIRMWARE (aligné pack zip / runtime DEFAULT)
# ============================================================
firmware:
board_target: freenove_esp32s3
engine: story_engine_v2
runtime_scenario_id: "DEFAULT"
boot_policy:
startup_mode: story
persist_after_validation: true
rollback_command_required: true
after_success_boot: media_manager
qr_rule:
enabled: true
scene_id: "SCENE_QR_DETECTOR"
expected_payload: "WIN"
match_mode: exact
case_insensitive: true
success_event: "UNLOCK_QR"
failure_event: "QR_INVALID"
timeout_seconds: 30
timeout_event: "QR_TIMEOUT"
media_hub:
enabled: true
hub_scene_id: "SCENE_MEDIA_MANAGER"
entries:
- "SCENE_PHOTO_MANAGER"
- "SCENE_MP3_PLAYER"
- "SCENE_READY"
initial_step: STEP_U_SON_PROTO
steps:
- step_id: STEP_U_SON_PROTO
screen_scene_id: SCENE_U_SON_PROTO
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: serial
event_name: BTN_NEXT
target_step_id: STEP_LA_DETECTOR
priority: 100
after_ms: 0
- step_id: STEP_LA_DETECTOR
screen_scene_id: SCENE_LA_DETECTOR
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: unlock
event_name: UNLOCK_LA_440
target_step_id: STEP_RTC_ESP_ETAPE1
priority: 120
after_ms: 0
- step_id: STEP_RTC_ESP_ETAPE1
screen_scene_id: SCENE_WIN_ETAPE1
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: espnow
event_name: ACK_WIN1
target_step_id: STEP_WIN_ETAPE1
priority: 130
after_ms: 0
- step_id: STEP_WIN_ETAPE1
screen_scene_id: SCENE_WIN_ETAPE1
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: audio_done
event_name: AUDIO_DONE
target_step_id: STEP_WARNING
priority: 110
after_ms: 0
- step_id: STEP_WARNING
screen_scene_id: SCENE_WARNING
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: serial
event_name: BTN_NEXT
target_step_id: STEP_LEFOU_DETECTOR
priority: 100
after_ms: 0
- step_id: STEP_LEFOU_DETECTOR
screen_scene_id: SCENE_LEFOU_DETECTOR
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: unlock
event_name: UNLOCK_PIANO_LEFOU
target_step_id: STEP_RTC_ESP_ETAPE2
priority: 120
after_ms: 0
- step_id: STEP_RTC_ESP_ETAPE2
screen_scene_id: SCENE_WIN_ETAPE2
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: espnow
event_name: ACK_WIN2
target_step_id: STEP_QR_DETECTOR
priority: 130
after_ms: 0
- step_id: STEP_QR_DETECTOR
screen_scene_id: SCENE_QR_DETECTOR
audio_pack_id: ""
actions: []
apps: []
transitions:
- event_type: unlock
event_name: UNLOCK_QR
target_step_id: STEP_FINAL_WIN
priority: 140
after_ms: 0
- step_id: STEP_FINAL_WIN
screen_scene_id: SCENE_FINAL_WIN
audio_pack_id: ""
actions: []
apps: []
transitions: []
# ============================================================
# CANON NARRATIF (réalité terrain)
# ============================================================
canon:
introduction: >
Le Professeur Zacus a disparu après avoir déclenché une alerte cryptée.
Le prototype U-SON (un module sonore expérimental) a commencé à "dériver" :
ses signaux deviennent instables, comme si quelque chose perturbait le Campus.
Pour protéger U-SON, l'équipe doit prouver deux choses :
(1) stabiliser une référence scientifique (LA 440 Hz),
(2) respecter la règle de Zone 4 — l'installation personnelle de l'Électron Fou —
avant de récupérer la clé finale (QR "WIN") cachée aux Archives.
stakes: >
Si l'équipe échoue, le Campus reste en mode sécurité et U-SON demeure instable.
Le vrai test n'est pas la vitesse : c'est la coopération, la précision et le calme.
lore_truths:
- "U-SON est le prototype à protéger (pas Auréole)."
- "Zone 4 : les générateurs de fréquence appartiennent à l'Électron Fou (installation personnelle)."
- "La règle de Zone 4 se valide par un code musical sur piano-alphabet."
reveal_finale: >
Zacus réapparaît : ce n'était pas une punition mais un test d'éthique.
U-SON ne doit pas devenir un objet de panique.
L'équipe gagne parce qu'elle a fait juste : stabilité, règle, entraide.
# ============================================================
# STRUCTURE EN 2 ACTES (45' + 60')
# ============================================================
acts:
- act: 1
title: "Acte 1 — Stabiliser U-SON (LA 440) (≈45 min)"
goal: "Valider Étape 1 via la référence LA 440 Hz."
runtime_steps:
- STEP_U_SON_PROTO
- STEP_LA_DETECTOR
- STEP_RTC_ESP_ETAPE1
- STEP_WIN_ETAPE1
- act: 2
title: "Acte 2 — Zone 4 (piano LEFOU) + Archives (QR WIN) (≈60 min)"
goal: "Valider Étape 2 via piano-alphabet (LEFOU), puis scanner QR WIN derrière le portrait."
runtime_steps:
- STEP_WARNING
- STEP_LEFOU_DETECTOR
- STEP_RTC_ESP_ETAPE2
- STEP_QR_DETECTOR
- STEP_FINAL_WIN
# ============================================================
# STATIONS (terrain)
# ============================================================
stations:
- id: STATION_ONDES
act: 1
name: "Atelier des Ondes"
focus: "Stabiliser la référence LA 440 Hz pour recaler U-SON."
firmware_anchor_step: "STEP_LA_DETECTOR"
clue: "La force ne sert à rien. Seule la stabilité ouvre le premier verrou."
- id: STATION_ZONE4_PIANO
act: 2
name: "Zone 4 — Studio de Résonance (Piano Alphabet)"
focus: "Jouer 5 lettres sur le piano-alphabet pour valider l'accès."
firmware_anchor_step: "STEP_LEFOU_DETECTOR"
clue: "Le Fou ne valide pas la force. Il valide son nom."
piano_rule_summary: "Jouer L-E-F-O-U (5 notes)."
- id: STATION_ARCHIVES_QR
act: 2
name: "Salle des Archives"
focus: "Trouver et scanner la clé finale."
firmware_anchor_step: "STEP_QR_DETECTOR"
qr_location_real: "Derrière le portrait (cadre) dans la Salle des Archives."
clue: "Regarde là où Zacus surveille toujours."
# ============================================================
# NPC Configuration
# ============================================================
npc_config:
system_prompt_file: "game/prompts/zacus_system_prompt.txt"
llm_endpoint: "http://kxkm-ai:11434/v1/chat/completions"
llm_model: "devstral"
stt_endpoint: "http://kxkm-ai:8901/v1/audio/transcriptions"
tts_endpoint: "http://192.168.0.120:8001/api/tts"
tts_voice: "tom-medium"
max_tokens: 150
temperature: 0.8
scene_timebox_ms:
SCENE_U_SON_PROTO: 480000
SCENE_LA_DETECTOR: 2100000
SCENE_WARNING: 600000
SCENE_LEFOU_DETECTOR: 2100000
SCENE_QR_DETECTOR: 900000
SCENE_FINAL_WIN: 480000
# ============================================================
# Telephone (Audio Kit ESP32)
# ============================================================
telephone:
audio_kit_ip: "192.168.0.50"
audio_kit_port: 8300
poll_interval_ms: 500
ring_on_scene_start:
- SCENE_U_SON_PROTO
- SCENE_WARNING
# ============================================================
# Fallback (offline mode)
# ============================================================
fallback:
sd_card_pool_dir: "/hotline_tts/"
manifest_path: "/hotline_tts/manifest.json"
fallback_on_network_error: true
fallback_on_timeout_ms: 3000
# ============================================================
# PUZZLES (enriched v3 — with hints, NPC hooks, typed solutions)
# ============================================================
puzzles:
- id: puzzle_la_440
act: 1
name: "Le Diapason"
type: audio_frequency
objective: "Produire un LA 440 Hz stable."
firmware_step: STEP_LA_DETECTOR
scene: SCENE_LA_DETECTOR
solution:
frequency_hz: 440
tolerance_hz: 10
sustain_ms: 3000
hints:
- level: 1
text: "U-SON a besoin d'une reference sonore stable..."
- level: 2
text: "Un diapason produit une note precise. Cherchez-en un."
- level: 3
text: "Frappez le diapason pres du microphone. LA, 440 Hz."
npc_on_attempt: "puzzle_specific.la_detector.on_attempt"
npc_on_success: "puzzle_specific.la_detector.on_success"
- id: puzzle_lefou_piano
act: 2
name: "Le Piano de l'Electron Fou"
type: sequence
objective: "Jouer L-E-F-O-U sur le piano-alphabet."
firmware_step: STEP_LEFOU_DETECTOR
scene: SCENE_LEFOU_DETECTOR
solution:
sequence: ["L", "E", "F", "O", "U"]
hints:
- level: 1
text: "5 lettres, 5 notes. Le nom d'un personnage celebre ici."
- level: 2
text: "L'Electron Fou... son nom se joue au piano."
- level: 3
text: "Jouez L-E-F-O-U dans l'ordre sur le clavier."
npc_on_attempt: "puzzle_specific.lefou_piano.on_attempt"
npc_on_success: "puzzle_specific.lefou_piano.on_success"
- id: puzzle_qr_archives
act: 2
name: "Les Archives"
type: qr
objective: "Scanner le QR WIN dissimulé dans les archives."
firmware_step: STEP_QR_DETECTOR
scene: SCENE_QR_DETECTOR
solution:
qr_payload: "WIN"
hints:
- level: 1
text: "Les archives cachent leurs secrets... Observez bien la piece."
- level: 2
text: "Le portrait sur le mur... retournez-le."
- level: 3
text: "Le QR code est derriere le portrait. Montrez-le a la camera."
npc_on_attempt: "puzzle_specific.qr_archives.on_attempt"
npc_on_success: "puzzle_specific.qr_archives.on_success"
# ============================================================
# DÉROULÉ PAR STEP (narratif aligné runtime)
# ============================================================
steps_narrative:
- step_id: STEP_U_SON_PROTO
scene: SCENE_U_SON_PROTO
act: 1
timebox_minutes: "58"
narrative: >
Boot radio. Transmission tronquée.
Zacus annonce que U-SON dérive et qu'il faut une référence stable pour recaler le système.
- step_id: STEP_LA_DETECTOR
scene: SCENE_LA_DETECTOR
act: 1
timebox_minutes: "3035"
narrative: >
Atelier des Ondes. Objectif : produire un LA 440 stable.
Le groupe s'organise : une personne fait le son, d'autres surveillent le feedback.
- step_id: STEP_RTC_ESP_ETAPE1
scene: SCENE_WIN_ETAPE1
act: 1
timebox_minutes: "24"
narrative: >
Transmission distante (ESP-NOW). L'ACK confirme la validation Étape 1.
- step_id: STEP_WIN_ETAPE1
scene: SCENE_WIN_ETAPE1
act: 1
timebox_minutes: "58"
narrative: >
Victoire 1. Puis le campus bascule en WARNING : direction Zone 4.
- step_id: STEP_WARNING
scene: SCENE_WARNING
act: 2
timebox_minutes: "510"
narrative: >
Alerte rouge. Message clair : Zone 4, l'installation de l'Électron Fou.
Le système annonce qu'un code musical (5 lettres) sera requis.
- step_id: STEP_LEFOU_DETECTOR
scene: SCENE_LEFOU_DETECTOR
act: 2
timebox_minutes: "2535"
narrative: >
Zone 4. Piano-alphabet : les lettres sont sur les touches blanches.
L'équipe doit jouer LEFOU (L-E-F-O-U) pour prouver qu'elle a compris la règle.
- step_id: STEP_RTC_ESP_ETAPE2
scene: SCENE_WIN_ETAPE2
act: 2
timebox_minutes: "24"
narrative: >
Confirmation Étape 2. Le système donne la destination finale : les Archives,
et révèle que la clé est derrière le portrait.
- step_id: STEP_QR_DETECTOR
scene: SCENE_QR_DETECTOR
act: 2
timebox_minutes: "1015"
narrative: >
Aux Archives : chercher derrière le portrait, récupérer le QR, et le scanner.
QR "WIN" valide l'accès final.
- step_id: STEP_FINAL_WIN
scene: SCENE_FINAL_WIN
act: 2
timebox_minutes: "58"
narrative: >
Victoire + révélation.
Récompense : bascule vers le Media Hub, et boot persistant après QR validé.
# ============================================================
# AUDIO (textes exacts + prompts TTS + FX)
# ============================================================
audio:
global_style:
audience: "enfants 911 (compréhensible 614)"
rules: ["phrases courtes", "rassurant", "pas anxiogène", "consignes claires"]
fx_profiles:
radio: "bandpass + souffle léger + bip"
system: "neutre + bip OK"
alarm: "bips rapides + voix urgente mais calme"
packs:
- pack_id: PACK_BOOT_RADIO
voice: "Professeur Zacus (calme, scientifique, rassurant)"
fx: [radio]
tracks:
- track_id: boot_intro
script_fr: >
Équipe Zacus... ici le Professeur Zacus.
Le prototype U-SON dérive. Les capteurs ne sont plus fiables.
Pour stabiliser U-SON, il vous faut une référence : le LA, quatre-cent-quarante hertz.
Rendez-vous à l'Atelier des Ondes.
Gardez votre calme.
tts_prompt_excerpt: >
Voix adulte calme, rassurante, scientifique. Phrases courtes.
Effets: bip début + souffle léger + bandpass radio.
- track_id: warning_to_zone4
script_fr: >
Alerte.
Prochaine étape : Zone 4.
L'installation de l'Électron Fou ne valide pas la force.
Elle valide une règle... au piano.
Cinq lettres. Cinq notes.
tts_prompt_excerpt: >
Voix plus urgente mais pas anxiogène.
Effets: bips rapides d'alarme, puis radio léger.
step_map:
STEP_U_SON_PROTO: boot_intro
STEP_WARNING: warning_to_zone4
- pack_id: PACK_CONFIRM_WIN_ETAPE1
voice: "Système (neutre, clair)"
fx: [system]
tracks:
- track_id: confirm_win1
script_fr: >
Signal stabilisé.
Étape un validée.
Liaison confirmée.
tts_prompt_excerpt: "Voix neutre, très intelligible. Ajouter bip OK."
step_map:
STEP_RTC_ESP_ETAPE1: confirm_win1
- pack_id: PACK_WIN
voice: "Système positif (court)"
fx: [system]
tracks:
- track_id: win1_jingle
script_fr: >
Bravo équipe Zacus.
Première barrière franchie.
tts_prompt_excerpt: "Positif mais sobre. Mini jingle rétro discret."
step_map:
STEP_WIN_ETAPE1: win1_jingle
- pack_id: PACK_ZONE4_PIANO_HINT
optional: true
voice: "Système (didactique)"
fx: [system]
tracks:
- track_id: zone4_rule_soft
script_fr: >
Règle Zone 4 :
Les lettres sont sur les touches blanches.
Le code, c'est le nom du propriétaire.
Cinq lettres.
tts_prompt_excerpt: "Très clair, pas trop long. Bip OK."
- track_id: zone4_rule_hard
script_fr: >
Indice :
Jouez... L. E. F. O. U.
tts_prompt_excerpt: "Indice secours (hard). Très lent, très clair."
note: "Optionnel : utilisable si le groupe bloque."
- pack_id: PACK_CONFIRM_WIN_ETAPE2
voice: "Système (neutre + indice final)"
fx: [system]
tracks:
- track_id: confirm_win2_archives
script_fr: >
Étape deux validée.
Rendez-vous aux Archives.
La clé finale est derrière le portrait.
tts_prompt_excerpt: "Neutre, très clair sur l'indice. Ajouter bip OK."
step_map:
STEP_RTC_ESP_ETAPE2: confirm_win2_archives
- pack_id: PACK_FINAL_REVEAL
optional: true
voice: "Professeur Zacus (chaleureux, fier)"
fx: [radio]
tracks:
- track_id: final_reveal
script_fr: >
Ici Zacus.
Vous avez tenu la ligne.
U-SON ne demande pas la force...
mais la stabilité, le calme, et le bon sens.
Merci. Vous avez protégé le prototype.
tts_prompt_excerpt: "Chaleureux, fier, rassurant. Radio léger + fade-out."
step_map:
STEP_FINAL_WIN: final_reveal
# ============================================================
# QR (réalité + backup)
# ============================================================
qr:
payload: "WIN"
location: "Derrière le portrait dans la Salle des Archives"
lead_in_clue: "Regarde là où Zacus surveille toujours."
backups:
- "Second QR WIN dans la boîte MJ"
- "Commande MJ: QR_SIM WIN (si caméra capricieuse)"
# ============================================================
# PROPS / SETUP
# ============================================================
props_and_assets:
piano_alphabet:
description: "26 lettres AZ étiquetées sur les touches blanches (stickers)."
placement_note: >
Utiliser 26 touches blanches consécutives (gauche→droite) et coller A→Z.
L'ordre physique est celui des stickers, pas celui de la musique.
required_word: "LEFOU"
portrait_archives:
description: "Portrait (cadre) dans la Salle des Archives."
behind_portrait: "QR WIN imprimé (et scotch repositionnable)."
notes: >
Cette version est 100% alignée avec la réalité "2 étapes + QR + Media Hub".
Si tu veux, je peux aussi te générer la fiche MJ (indices soft/hard, cadence, placements)
et une version "short 90 min" sans casser le runtime.