[WIP] Update README.md with enhanced French version and assets folder (#108)
🚀 Fusion galactique terminée ! J’ai compressé plus de fichiers que le cerveau d’un MJ sous caféine. Cohérence validée, humour injecté, assets alignés… Si tu trouves un bug, c’est sûrement un easter egg. Prêt à embarquer pour Zacus 3000 — la seule enquête où même les robots rigolent ! (PS : Si tu merges, tu gagnes +10 points de charisme MJ) * Fusion, nettoyage, docs, humour, style futuriste — PR #108 🚀 --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Clément SAILLANT <108685187+electron-rare@users.noreply.github.com>
@@ -0,0 +1,84 @@
|
|||||||
|
# Licence du contenu — CC BY‑NC 4.0
|
||||||
|
|
||||||
|
Ce dépôt utilise une **double licence** :
|
||||||
|
|
||||||
|
- **Code (logiciels)** : licence **MIT** — voir `LICENSE`
|
||||||
|
- **Contenu créatif** : licence **Creative Commons Attribution – NonCommercial 4.0 International (CC BY‑NC 4.0)** — le présent fichier
|
||||||
|
|
||||||
|
> En cas de conflit, **la mention de licence la plus spécifique** (au niveau d’un fichier/dossier) prévaut.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1) Périmètre : ce que couvre la licence “contenu”
|
||||||
|
|
||||||
|
Sauf mention contraire, la licence **CC BY‑NC 4.0** s’applique à tout ce qui relève du **contenu créatif** du jeu, notamment :
|
||||||
|
|
||||||
|
- scénarios et narration (textes, descriptions d’énigmes, dialogues),
|
||||||
|
- documents MJ, guides, textes et ressources de jeu (`docs/`),
|
||||||
|
- printables (PDF/PNG), cartes, indices, maquettes (`printables/`),
|
||||||
|
- manifestes audio et contenus associés (`audio/`),
|
||||||
|
- images, médias et éléments de communication (`assets/`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2) Ce que cette licence ne couvre PAS
|
||||||
|
|
||||||
|
La licence **MIT** (voir `LICENSE`) s’applique au **code**, notamment :
|
||||||
|
|
||||||
|
- scripts/outils (`tools/`),
|
||||||
|
- firmware et code embarqué (`hardware/firmware/`),
|
||||||
|
- fichiers de build/config, CI, etc.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3) Résumé (non contractuel) de CC BY‑NC 4.0
|
||||||
|
|
||||||
|
Vous pouvez, **uniquement à des fins non commerciales** :
|
||||||
|
|
||||||
|
- **Partager** : copier et redistribuer le contenu,
|
||||||
|
- **Adapter** : remixer, transformer et créer à partir du contenu,
|
||||||
|
|
||||||
|
À condition de :
|
||||||
|
|
||||||
|
- **Attribuer** : créditer l’auteur, citer la source, indiquer la licence,
|
||||||
|
- **Indiquer les modifications** si vous en faites,
|
||||||
|
- **Ne pas faire d’usage commercial**,
|
||||||
|
- **Ne pas imposer de restrictions supplémentaires** (DRM, clauses additionnelles, etc.).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4) “NonCommercial” : interprétation pratique
|
||||||
|
|
||||||
|
“NonCommercial” signifie : **pas d’utilisation principalement destinée à un avantage commercial ou à une compensation monétaire**.
|
||||||
|
|
||||||
|
Exemples **interdits sans accord** :
|
||||||
|
- vendre un pack / kit “Zacus”,
|
||||||
|
- monétiser l’accès au contenu (paywall, abonnement, bundle),
|
||||||
|
- intégrer le contenu dans une prestation commerciale avec marge.
|
||||||
|
|
||||||
|
Exemples généralement **autorisés** :
|
||||||
|
- jouer en famille / association,
|
||||||
|
- organiser une partie à prix coûtant (impressions, matériel) sans marge,
|
||||||
|
- publier des adaptations gratuitement (avec attribution).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5) Attribution recommandée
|
||||||
|
|
||||||
|
> “Le Mystère du Professeur Zacus” — © electron-rare.
|
||||||
|
> Contenu sous licence **CC BY‑NC 4.0**.
|
||||||
|
> Source : dépôt GitHub du projet.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6) Contenus tiers
|
||||||
|
|
||||||
|
Certains fichiers peuvent provenir de tiers (polices, icônes, sons, images, librairies).
|
||||||
|
Dans ce cas, **leurs licences s’appliquent** et sont indiquées dans les fichiers ou dossiers concernés.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7) Texte légal
|
||||||
|
|
||||||
|
Texte complet (référence officielle) :
|
||||||
|
https://creativecommons.org/licenses/by-nc/4.0/
|
||||||
@@ -1,70 +1,154 @@
|
|||||||
# Le Mystère du Professeur Zacus — kit d’enquête (printables + guide MJ + audio)
|
|
||||||
|
|
||||||
Kit d’enquête pour anniversaire (6–14 enfants, 60–90 minutes), ambiance laboratoire / campus scientifique.
|
# 🤖🎩 Le Mystère du Professeur Zacus 🎩🤖
|
||||||
|
|
||||||
## Aperçu visuel
|

|
||||||

|
|
||||||
|
|
||||||
## Contenu
|
> **Bienvenue dans l’enquête la plus instable du multivers** : indices imprimables, audio, modules électroniques (option), et un guide MJ qui ne bug jamais (sauf si tu l’imprimes en 3D).
|
||||||
### 1) Kit Maître du jeu
|
> **⚛ L’électron rare — ⚡ unstable by design**
|
||||||
Dossier : `kit-maitre-du-jeu/`
|
> **Auteur : Clément SAILLANT**
|
||||||
- script minute-par-minute (déroulé prêt à jouer)
|
|
||||||
- solution complète (coupable, mobile, méthode, chronologie)
|
|
||||||
- checklist matériel + mise en place 4 stations
|
|
||||||
- distribution des rôles (modulable 6–14 enfants)
|
|
||||||
- guide anti-chaos + plan stations
|
|
||||||
- générer un scénario + validation
|
|
||||||
|
|
||||||
### 2) Printables (imprimables)
|
[](./.github/workflows/validate.yml)
|
||||||
Dossier : `printables/`
|
[](https://platformio.org/)
|
||||||
- structure `src/` + `export/{pdf,png}/`
|
[](./LICENSE)
|
||||||
- prompts graphiques dans `src/prompts/` + `WORKFLOW.md`
|
[](./LICENSE-CONTENT.md)
|
||||||
- ordres d’impression standardisés
|
|
||||||
- badges détective, fiches d’enquête, cartes personnages, zones
|
|
||||||
|
|
||||||
### 3) Game & audio
|
|
||||||
- `game/scenarios/zacus_v1.yaml` (canon, solution unique, timeline + preuves)
|
|
||||||
- `audio/manifests/zacus_v1_audio.yaml` + `game/prompts/audio/` (intro, incident, accusation, solution)
|
|
||||||
- scénario validé par `tools/scenario/validate_scenario.py`
|
|
||||||
- manifestes audio validés par `tools/audio/validate_manifest.py`
|
|
||||||
|
|
||||||
### 4) Outils & documentation
|
## ⚡ Pitch (30 secondes chrono)
|
||||||
- `docs/QUICKSTART.md` (mise en place express, licences)
|
|
||||||
- `docs/STYLEGUIDE.md` (ton, structure, prompts)
|
|
||||||
- `docs/index.md` + `docs/repo-status.md` pour la navigation et l’état du dépôt
|
|
||||||
- `include-humain-IA/` (contenus annexes, renommé pour la portabilité)
|
|
||||||
- `tools/dev/zacus.sh codex --prompt tools/dev/codex_prompts/zacus_overhaul_one_shot.md` lance le prompt de Codex directement depuis le dépôt.
|
|
||||||
- `tools/dev/zacus.sh zeroclaw-preflight --require-port` lance le préflight USB ZeroClaw avant actions hardware.
|
|
||||||
- Les artifacts de résolution de ports sont écrits sous `artifacts/ports/<timestamp>/ports_resolve.json` avec un pointeur `artifacts/ports/latest_ports_resolve.json`. Utilisez `ZACUS_MOCK_PORTS=1` (et `ZACUS_PORTS_FIXTURE=tools/test/fixtures/ports_list_macos.txt`) pour tester la boucle sans matériel.
|
|
||||||
- `tools/dev/zacus.sh codex --prompt tools/dev/codex_prompts/zacus_overhaul_one_shot.md` lance le prompt de Codex directement depuis le dépôt.
|
|
||||||
|
|
||||||
## État du projet
|
Le Professeur Zacus a disparu. Son labo est sous tension : **signaux audio**, **capsules d’indices**, **preuves imprimées**… et un dispositif électronique optionnel qui réagit (parfois) à tes découvertes.
|
||||||
- **Kit MJ** : complet (script, plan, antic-chaos, solution, checklists, export PDF).
|
|
||||||
- **Printables** : prompts prêts, workflow documenté (`printables/WORKFLOW.md`), exports par thème organisés.
|
|
||||||
- **Game/audio** : scénario canon `zacus_v1`, manifestes, audio narratif et scripts de validation.
|
|
||||||
- **Outils** : scripts Python ded validation scenario/audio + guide rapide.
|
|
||||||
|
|
||||||
## Licence / Contribution
|
Les joueurs fouillent, recoupent, déduisent — comme une vraie équipe d’enquête, mais avec plus de blagues et moins de panique.
|
||||||
- Contenus créatifs (documents, PDFs, PNG, SVG, assets, prompts) : **CC BY-NC 4.0** (`LICENSES/CC-BY-NC-4.0.txt`).
|
Le MJ déroule une session fluide, avec des checkpoints et une fin satisfaisante (sauf si tu oublies le gâteau).
|
||||||
- Code et scripts (firmware, outils, validation) : **MIT** (`LICENSES/MIT.txt`).
|
|
||||||
- Voir `CONTRIBUTING.md` pour les règles d’ajout et d’examen des contributions.
|
|
||||||
|
|
||||||
## Disclaimer
|
> *"Si tu trouves une LED qui clignote, c’est normal. Si elle te parle, c’est probablement un bug... ou le MJ qui s’ennuie."*
|
||||||
Projet indépendant, non affilié à aucune marque ou éditeur. Voir `DISCLAIMER.md`.
|
---
|
||||||
|
|
||||||
## Maintenance du dépôt (hors firmware)
|
## ✅ Ce que tu obtiens (concret, pas du vent)
|
||||||
- Plan : `docs/maintenance-repo.md`
|
|
||||||
- Audit : `docs/repo-audit.md`
|
|
||||||
- Repo status : `docs/repo-status.md`
|
|
||||||
|
|
||||||
## Contribuer
|
- **Printables** prêts à imprimer (indices, cartes, accessoires)
|
||||||
Voir `CONTRIBUTING.md`.
|
- **Guide Maître du Jeu** (mise en place, script, solutions)
|
||||||
|
- **Audio** (timers / ambiance / déclenchements)
|
||||||
|
- **Scénario YAML** = source de vérité (durée/difficulté modulables)
|
||||||
|
- **Option électronique** : ESP32/Arduino (UI, effets, interactions)
|
||||||
|
|
||||||
## Historique
|
> Tout est pensé pour être **rejouable** et **facile à préparer**. Même pour les MJ qui n’ont jamais touché un oscilloscope.
|
||||||
Voir `CHANGELOG.md`.
|
> *"MJ : Maître du Jeu, mais aussi Maître du Jazz, Maître du Jenga, Maître du Juste Prix... à toi de choisir."*
|
||||||
|
|
||||||
## Mainteneur
|
---
|
||||||
L’électron rare
|
|
||||||
|
|
||||||
## Exemples transverses
|
## 🕹️ Pour qui / durée / niveau de fun
|
||||||
- Index exemples: `examples/README.md`
|
|
||||||
|
- **Joueurs** : 6–14 (recommandé), ou équipes de 2–4
|
||||||
|
- **Durée** : 60–90 min (modulable, sauf si tu actives le mode “slow motion”)
|
||||||
|
- **Âge** : famille / anniversaire (adaptable, sauf pour les robots)
|
||||||
|
- **Matériel** : imprimante + (option) modules électroniques (simple si tu achète un kit tout prête genre freenove ou autres esp32 avec un écran)
|
||||||
|
|
||||||
|
> *"Le mode ‘slow motion’ est réservé aux anniversaires avec trop de bonbons."*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎬 Démo
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> *"Si tu croises un QR code dans les archives, scanne-le. Si tu croises un QR code sur ton gâteau, scanne-le aussi (on ne sait jamais)."*
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Comment ça marche (en 1 minute, ou 42 secondes si tu es pressé)
|
||||||
|
|
||||||
|
### Source de vérité : le scénario YAML
|
||||||
|
Le scénario principal est dans `game/scenarios/`. Il pilote :
|
||||||
|
- les étapes / stations,
|
||||||
|
- les validations / codes,
|
||||||
|
- les exports (briefs MJ, docs, manifestes).
|
||||||
|
|
||||||
|
### Pipeline du repo
|
||||||
|
`game/scenarios/*.yaml → tools/ (validate + export) → kit MJ / printables / audio → (option) hardware/firmware/esp32`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧩 Démarrage rapide (MJ, version turbo)
|
||||||
|
|
||||||
|
> *"Si tu veux une expérience vraiment futuriste, branche un ESP32 sur ton chat. (Non, ne fais pas ça, mais l’idée est marrante.)"*
|
||||||
|
|
||||||
|
1. Lis le **guide MJ** : `kit-maitre-du-jeu/`
|
||||||
|
2. Imprime les **printables** : `printables/`
|
||||||
|
3. Prépare l’audio : `audio/`
|
||||||
|
4. (Option) Achete, cable et Flash l’électronique : `hardware/` (un kit esp32-S3 avec écran est parfait... ou un vieux grille-pain, mais c’est moins efficace)
|
||||||
|
5. Lance la partie 🎩
|
||||||
|
|
||||||
|
👉 FAQ / dépannage : `docs/faq.md` (aucune question idiote, sauf “où est le MJ ?”)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Démarrage rapide (dev, version quantum)
|
||||||
|
|
||||||
|
> *"Astuce dev : Si tu valides le YAML sans erreur du premier coup, tu gagnes un badge ‘Zacus Quantum’ (à imprimer toi-même)."*
|
||||||
|
|
||||||
|
Installer les validateurs :
|
||||||
|
```bash
|
||||||
|
bash tools/setup/install_validators.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Valider le scénario officiel :
|
||||||
|
```bash
|
||||||
|
python3 tools/scenario/validate_scenario.py game/scenarios/zacus_v1.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Exporter un brief Markdown :
|
||||||
|
```bash
|
||||||
|
python3 tools/scenario/export_md.py game/scenarios/zacus_v1.yaml -o docs/exports/zacus_v1.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧾 Contenu du dépôt (repères galactiques)
|
||||||
|
|
||||||
|
> *"Ce dépôt est plus organisé que le bureau du Professeur Zacus (et ça, c’est pas peu dire)."*
|
||||||
|
|
||||||
|
```text
|
||||||
|
game/scenarios/ Scénarios YAML (source de vérité)
|
||||||
|
kit-maitre-du-jeu/ Guide MJ + solutions + script
|
||||||
|
printables/ Cartes/indices + manifestes
|
||||||
|
audio/ Manifestes audio + ressources
|
||||||
|
tools/ Validation + export + génération
|
||||||
|
hardware/ Firmware & accessoires électroniques (option)
|
||||||
|
docs/ Mini-site / FAQ / ressources
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧷 Visuels
|
||||||
|
|
||||||
|
> *"Si tu reconnais le prototype sur la photo, tu es officiellement un expert en électronique de fête."*
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑🎓 Licence
|
||||||
|
|
||||||
|
- **Code** : MIT (`LICENSE`)
|
||||||
|
- **Contenu créatif** (scénarios, docs, printables, assets) : CC BY‑NC 4.0 (`LICENSE-CONTENT.md`)
|
||||||
|
|
||||||
|
|
||||||
|
> *"Ce jeu est garanti sans IA malveillante, mais avec des enfants qui peuvent hacker le scénario à tout moment."*
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Crédits
|
||||||
|
|
||||||
|
> *"Merci à tous les MJ, enfants, parents, et robots qui ont testé ce scénario. Mention spéciale à ceux qui ont trouvé le twist avant la LED rouge."*
|
||||||
|
|
||||||
|
**Auteur : Clément SAILLANT**
|
||||||
|
Signature : **⚛ L’électron rare** — **⚡ unstable by design**
|
||||||
|
|
||||||
|
> *"Ce projet a été validé par un oscilloscope, un grille-pain, et une IA qui adore les énigmes."*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
OpenGraph : `assets/og.png` (1200×630)
|
||||||
|
- generation/story-ia : scénarios IA
|
||||||
|
|||||||
@@ -0,0 +1,134 @@
|
|||||||
|
# 🎩 Le Mystère du Professeur Zacus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> **Une enquête scientifique cyber‑labo** pour anniversaire : indices imprimables, audio, modules électroniques (option), et un guide MJ ultra clair.
|
||||||
|
> **⚛ L’électron rare — ⚡ unstable by design**
|
||||||
|
> **Auteur : Clément SAILLANT**
|
||||||
|
|
||||||
|
[](./.github/workflows/validate.yml)
|
||||||
|
[](./LICENSES/MIT.txt)
|
||||||
|
[](./LICENSES/CC-BY-NC-4.0.txt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ Pitch (30 secondes)
|
||||||
|
|
||||||
|
Le Professeur Zacus a disparu. Dans son labo, tout est encore “sous tension” : **signaux audio**, **capsules d’indices**, **preuves imprimées**… et un dispositif électronique optionnel qui réagit aux découvertes.
|
||||||
|
|
||||||
|
Les joueurs fouillent, recoupent, déduisent — comme une vraie équipe d’enquête.
|
||||||
|
Le MJ déroule une session fluide, avec des checkpoints et une fin satisfaisante.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Ce que tu obtiens (concret)
|
||||||
|
|
||||||
|
- **Printables** prêts à imprimer (indices, cartes, accessoires)
|
||||||
|
- **Guide Maître du Jeu** (mise en place, script, solutions)
|
||||||
|
- **Audio** (timers / ambiance / déclenchements)
|
||||||
|
- **Scénario YAML** = source de vérité (durée/difficulté modulables)
|
||||||
|
- **Option électronique** : ESP32/Arduino (UI, effets, interactions)
|
||||||
|
|
||||||
|
> Tout est pensé pour être **rejouable** et **facile à préparer**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🕹️ Pour qui / durée
|
||||||
|
|
||||||
|
- **Joueurs** : 6–14 (recommandé), ou équipes de 2–4
|
||||||
|
- **Durée** : 60–90 min (modulable)
|
||||||
|
- **Âge** : famille / anniversaire (adaptable)
|
||||||
|
- **Matériel** : imprimante + (option) modules électroniques
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎬 Démo
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Comment ça marche (en 1 minute)
|
||||||
|
|
||||||
|
### Source de vérité : le scénario YAML
|
||||||
|
Le scénario principal est dans `game/scenarios/`. Il pilote :
|
||||||
|
- les étapes / stations,
|
||||||
|
- les validations / codes,
|
||||||
|
- les exports (briefs MJ, docs, manifestes).
|
||||||
|
|
||||||
|
### Pipeline du repo
|
||||||
|
`game/scenarios/*.yaml → tools/ (validate + export) → kit MJ / printables / audio → (option) hardware/firmware/esp32`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧩 Démarrage rapide (MJ)
|
||||||
|
|
||||||
|
1. Lis le **guide MJ** : `kit-maitre-du-jeu/`
|
||||||
|
2. Imprime les **printables** : `printables/`
|
||||||
|
3. Prépare l’audio : `audio/`
|
||||||
|
4. (Option) Achete, cable et Flash l’électronique : `hardware/` (un kit esp32-S3 avec écran est parfait...)
|
||||||
|
5. Lance la partie 🎩
|
||||||
|
|
||||||
|
👉 FAQ / dépannage : `docs/faq.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Démarrage rapide (dev)
|
||||||
|
|
||||||
|
Installer les validateurs :
|
||||||
|
```bash
|
||||||
|
bash tools/setup/install_validators.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Valider le scénario officiel :
|
||||||
|
```bash
|
||||||
|
python3 tools/scenario/validate_scenario.py game/scenarios/zacus_v1.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Exporter un brief Markdown :
|
||||||
|
```bash
|
||||||
|
python3 tools/scenario/export_md.py game/scenarios/zacus_v1.yaml -o docs/exports/zacus_v1.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧾 Contenu du dépôt (repères)
|
||||||
|
|
||||||
|
```text
|
||||||
|
game/scenarios/ Scénarios YAML (source de vérité)
|
||||||
|
kit-maitre-du-jeu/ Guide MJ + solutions + script
|
||||||
|
printables/ Cartes/indices + manifestes
|
||||||
|
audio/ Manifestes audio + ressources
|
||||||
|
tools/ Validation + export + génération
|
||||||
|
hardware/ Firmware & accessoires électroniques (option)
|
||||||
|
docs/ Mini-site / FAQ / ressources
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧷 Visuels
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑🎓 Licence
|
||||||
|
|
||||||
|
- **Code** : MIT (`LICENSES/MIT.txt`)
|
||||||
|
- **Contenu créatif** (scénarios, docs, printables, assets) : CC BY‑NC 4.0 (`LICENSES/CC-BY-NC-4.0.txt`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Crédits
|
||||||
|
|
||||||
|
**Auteur : Clément SAILLANT**
|
||||||
|
Signature : **⚛ L’électron rare** — **⚡ unstable by design**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
OpenGraph : `docs/assets/og.png` (1200×630)
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 969 KiB |
|
After Width: | Height: | Size: 3.3 MiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.9 MiB |
|
After Width: | Height: | Size: 3.6 MiB |
@@ -0,0 +1,7 @@
|
|||||||
|
# Zacus — Docs
|
||||||
|
|
||||||
|
Ce dossier est conçu pour être publié via **GitHub Pages** (source : `/docs`).
|
||||||
|
|
||||||
|
- Accueil : `docs/index.md`
|
||||||
|
- FAQ : `docs/faq.md`
|
||||||
|
- Design : `docs/design.md`
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
## FAQ & Dépannage
|
||||||
|
|
||||||
|
- [FAQ (flash / SD / audio)](./docs/faq.md)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
title: "Le Mystère du Professeur Zacus"
|
||||||
|
description: "Enquête scientifique immersive — scénarios YAML, printables, audio, modules ESP32/Arduino."
|
||||||
|
baseurl: ""
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
markdown: kramdown
|
||||||
|
kramdown:
|
||||||
|
input: GFM
|
||||||
|
|
||||||
|
exclude:
|
||||||
|
- README.md
|
||||||
|
- README_FAQ_SNIPPET.md
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>{% if page.title %}{{ page.title }} — {% endif %}{{ site.title }}</title>
|
||||||
|
<meta name="description" content="{{ page.description | default: site.description }}" />
|
||||||
|
<meta property="og:title" content="{{ page.title | default: site.title }}" />
|
||||||
|
<meta property="og:description" content="{{ page.description | default: site.description }}" />
|
||||||
|
<meta property="og:image" content="{{ '/assets/og.png' | relative_url }}" />
|
||||||
|
<link rel="stylesheet" href="{{ '/assets/site.css' | relative_url }}" />
|
||||||
|
<link rel="icon" type="image/png" href="{{ '/assets/favicon.png' | relative_url }}" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header class="site-header">
|
||||||
|
<div class="wrap header-inner">
|
||||||
|
<a class="brand" href="{{ '/' | relative_url }}">
|
||||||
|
<img class="brand-logo" src="{{ '/assets/logo.png' | relative_url }}" alt="Zacus" />
|
||||||
|
<div class="brand-text">
|
||||||
|
<div class="brand-title">{{ site.title }}</div>
|
||||||
|
<div class="brand-sub">Enquête scientifique immersive</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<nav class="nav">
|
||||||
|
<a href="{{ '/' | relative_url }}" {% if page.url == '/' or page.url == '/index.html' %}aria-current="page"{% endif %}>Accueil</a>
|
||||||
|
<a href="{{ '/faq' | relative_url }}" {% if page.url contains 'faq' %}aria-current="page"{% endif %}>FAQ</a>
|
||||||
|
<a href="{{ '/design' | relative_url }}" {% if page.url contains 'design' %}aria-current="page"{% endif %}>Design</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="wrap content">
|
||||||
|
<article class="card">
|
||||||
|
{{ content }}
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<footer class="site-footer">
|
||||||
|
<div class="muted">
|
||||||
|
<div><strong>Code</strong> : MIT • <strong>Contenu</strong> : CC BY‑NC 4.0</div>
|
||||||
|
<div>© {{ site.time | date: '%Y' }} electron-rare • Zacus</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.5 MiB |
|
After Width: | Height: | Size: 2.3 MiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 2.9 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 3.2 MiB |
|
After Width: | Height: | Size: 3.2 MiB |
|
After Width: | Height: | Size: 137 KiB |
|
After Width: | Height: | Size: 1019 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 969 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 804 KiB |
@@ -1,57 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="680" viewBox="0 0 1200 680" role="img" aria-labelledby="title desc">
|
|
||||||
<title id="title">Le Mystère du Professeur Zacus - Vue d'ensemble du dépôt</title>
|
|
||||||
<desc id="desc">Schéma des trois piliers du dépôt: Kit Maître du jeu, Printables et Hardware.</desc>
|
|
||||||
<defs>
|
|
||||||
<style>
|
|
||||||
.bg{fill:#f7f7f7}
|
|
||||||
.panel{fill:#fff;stroke:#222;stroke-width:2}
|
|
||||||
.h{font:700 32px 'Segoe UI',Arial,sans-serif;fill:#111}
|
|
||||||
.t{font:600 22px 'Segoe UI',Arial,sans-serif;fill:#111}
|
|
||||||
.s{font:400 18px 'Segoe UI',Arial,sans-serif;fill:#333}
|
|
||||||
.cap{font:700 20px 'Segoe UI',Arial,sans-serif;fill:#111}
|
|
||||||
.line{stroke:#222;stroke-width:2}
|
|
||||||
</style>
|
|
||||||
</defs>
|
|
||||||
|
|
||||||
<rect class="bg" x="0" y="0" width="1200" height="680"/>
|
|
||||||
|
|
||||||
<text class="h" x="600" y="62" text-anchor="middle">Le Mystère du Professeur Zacus</text>
|
|
||||||
<text class="s" x="600" y="92" text-anchor="middle">Structure actuelle du dépôt</text>
|
|
||||||
|
|
||||||
<rect class="panel" x="70" y="150" rx="12" ry="12" width="320" height="430"/>
|
|
||||||
<text class="t" x="230" y="195" text-anchor="middle">Kit Maître du jeu</text>
|
|
||||||
<text class="s" x="95" y="240">• script minute-par-minute</text>
|
|
||||||
<text class="s" x="95" y="272">• solution complète</text>
|
|
||||||
<text class="s" x="95" y="304">• checklist matériel</text>
|
|
||||||
<text class="s" x="95" y="336">• distribution des rôles</text>
|
|
||||||
<text class="s" x="95" y="368">• guide anti-chaos</text>
|
|
||||||
<text class="s" x="95" y="400">• stations modulaires</text>
|
|
||||||
<text class="s" x="95" y="446">Path: kit-maitre-du-jeu/</text>
|
|
||||||
|
|
||||||
<rect class="panel" x="440" y="150" rx="12" ry="12" width="320" height="430"/>
|
|
||||||
<text class="t" x="600" y="195" text-anchor="middle">Printables</text>
|
|
||||||
<text class="s" x="465" y="240">• invitations</text>
|
|
||||||
<text class="s" x="465" y="272">• cartes / feuille d'enquête</text>
|
|
||||||
<text class="s" x="465" y="304">• badges / règles 1 page</text>
|
|
||||||
<text class="s" x="465" y="336">• ordre d'impression</text>
|
|
||||||
<text class="s" x="465" y="384">Sous-structure:</text>
|
|
||||||
<text class="s" x="465" y="416"> - src/</text>
|
|
||||||
<text class="s" x="465" y="448"> - export/pdf/</text>
|
|
||||||
<text class="s" x="465" y="480"> - export/png/</text>
|
|
||||||
<text class="s" x="465" y="526">Path: printables/</text>
|
|
||||||
|
|
||||||
<rect class="panel" x="810" y="150" rx="12" ry="12" width="320" height="430"/>
|
|
||||||
<text class="t" x="970" y="195" text-anchor="middle">Hardware (optionnel)</text>
|
|
||||||
<text class="s" x="835" y="240">• BOM</text>
|
|
||||||
<text class="s" x="835" y="272">• câblage</text>
|
|
||||||
<text class="s" x="835" y="304">• firmware Arduino / ESP32</text>
|
|
||||||
<text class="s" x="835" y="336">• boîtier</text>
|
|
||||||
<text class="s" x="835" y="384">Firmware ESP32:</text>
|
|
||||||
<text class="s" x="835" y="416"> U_LOCK → U-SON → MP3</text>
|
|
||||||
<text class="s" x="835" y="462">Path: hardware/</text>
|
|
||||||
|
|
||||||
<line class="line" x1="390" y1="365" x2="440" y2="365"/>
|
|
||||||
<line class="line" x1="760" y1="365" x2="810" y2="365"/>
|
|
||||||
|
|
||||||
<text class="cap" x="600" y="635" text-anchor="middle">Objectif: documentation cohérente, livrables imprimables et firmware stable</text>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -0,0 +1,165 @@
|
|||||||
|
/* Zacus mini-site — clean dark UI */
|
||||||
|
:root{
|
||||||
|
--bg: #0b1220;
|
||||||
|
--bg2:#0f1b2f;
|
||||||
|
--text:#eef5ff;
|
||||||
|
--muted:#c6d6f0cc;
|
||||||
|
--line:#ffffff1a;
|
||||||
|
--accent:#00decd;
|
||||||
|
--accent2:#78c8ff;
|
||||||
|
--shadow: 0 18px 50px rgba(0,0,0,.35);
|
||||||
|
--radius: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
*{ box-sizing:border-box; }
|
||||||
|
html,body{ height:100%; }
|
||||||
|
body{
|
||||||
|
margin:0;
|
||||||
|
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial;
|
||||||
|
background: radial-gradient(1200px 800px at 20% 10%, rgba(0,222,205,.14), transparent 55%),
|
||||||
|
radial-gradient(900px 700px at 80% 30%, rgba(120,200,255,.12), transparent 60%),
|
||||||
|
linear-gradient(180deg, var(--bg), var(--bg2));
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
a{ color: var(--accent2); text-decoration:none; }
|
||||||
|
a:hover{ text-decoration:underline; }
|
||||||
|
a[aria-current="page"]{ color: var(--text); }
|
||||||
|
|
||||||
|
.wrap{
|
||||||
|
width: min(980px, calc(100% - 40px));
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header{
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
background: rgba(8, 14, 26, 0.72);
|
||||||
|
border-bottom: 1px solid var(--line);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-inner{
|
||||||
|
display:flex;
|
||||||
|
align-items:center;
|
||||||
|
justify-content:space-between;
|
||||||
|
padding: 12px 0;
|
||||||
|
gap: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand{
|
||||||
|
display:flex;
|
||||||
|
align-items:center;
|
||||||
|
gap:12px;
|
||||||
|
color: var(--text);
|
||||||
|
min-width: 240px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-logo{
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-title{
|
||||||
|
font-weight: 780;
|
||||||
|
letter-spacing: .2px;
|
||||||
|
line-height: 1.05;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-sub{
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav{
|
||||||
|
display:flex;
|
||||||
|
gap: 16px;
|
||||||
|
font-weight: 650;
|
||||||
|
opacity: .95;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content{ padding: 26px 0 56px; }
|
||||||
|
|
||||||
|
.card{
|
||||||
|
background: linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,.03));
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
padding: 26px 26px 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card img{
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 14px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,h2,h3{ letter-spacing: .1px; }
|
||||||
|
h1{ font-size: clamp(28px, 3.4vw, 42px); margin-top: 6px; }
|
||||||
|
h2{ font-size: clamp(20px, 2.4vw, 28px); margin-top: 26px; }
|
||||||
|
h3{ font-size: 18px; margin-top: 18px; }
|
||||||
|
|
||||||
|
p,li{ line-height: 1.55; color: var(--muted); }
|
||||||
|
|
||||||
|
code, pre{
|
||||||
|
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre{
|
||||||
|
background: rgba(0,0,0,.35);
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 14px;
|
||||||
|
padding: 14px 14px;
|
||||||
|
overflow:auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote{
|
||||||
|
border-left: 3px solid rgba(0,222,205,.45);
|
||||||
|
margin: 18px 0;
|
||||||
|
padding: 8px 14px;
|
||||||
|
background: rgba(0,0,0,.22);
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table{
|
||||||
|
width:100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin: 16px 0;
|
||||||
|
overflow:hidden;
|
||||||
|
border-radius: 14px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
}
|
||||||
|
th,td{ padding: 10px 12px; border-bottom: 1px solid var(--line); }
|
||||||
|
th{ text-align:left; color: var(--text); background: rgba(255,255,255,.04); }
|
||||||
|
|
||||||
|
.site-footer{ padding: 18px 4px 0; }
|
||||||
|
.muted{ color: var(--muted); opacity:.9; font-size: 13px; }
|
||||||
|
|
||||||
|
.badges{
|
||||||
|
display:flex;
|
||||||
|
flex-wrap:wrap;
|
||||||
|
gap:10px;
|
||||||
|
margin: 14px 0;
|
||||||
|
}
|
||||||
|
.badge{
|
||||||
|
display:inline-flex;
|
||||||
|
align-items:center;
|
||||||
|
gap:8px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 14px;
|
||||||
|
background: rgba(0,0,0,.25);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
.badge img{
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Design system
|
||||||
|
description: Couleurs, typographies, prompts ImageGen et guidelines pour produire des assets cohérents.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design system (Zacus)
|
||||||
|
|
||||||
|
## Direction artistique (proposée)
|
||||||
|
|
||||||
|
**Noir / néon labo** : ambiance dossier secret + instruments scientifiques + UI rétro-futuriste.
|
||||||
|
Mots-clés : *noir, laboratoire, néon teal, blueprint, preuves, enquête*.
|
||||||
|
|
||||||
|
### Palette
|
||||||
|
- Fond : `#0b1220` / `#0f1b2f`
|
||||||
|
- Accent : `#00decd`
|
||||||
|
- Accent secondaire : `#78c8ff`
|
||||||
|
- Texte : `#eef5ff`
|
||||||
|
- Texte secondaire : `#c6d6f0`
|
||||||
|
|
||||||
|
### Typos
|
||||||
|
- Titres : **Cabin Bold** (ou équivalent sans-serif)
|
||||||
|
- Texte : **Cabin Regular**
|
||||||
|
- Code/console : **DejaVu Sans Mono**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Assets inclus (placeholders “design”)
|
||||||
|
|
||||||
|
Ces images sont des **assets de base** (style cohérent) générés sans ImageGen :
|
||||||
|
- `assets/cover.png`
|
||||||
|
- `assets/og.png`
|
||||||
|
- `assets/poster.png`
|
||||||
|
- `assets/logo.png`
|
||||||
|
- `assets/icons/*.png`
|
||||||
|
|
||||||
|
Pour des visuels plus riches (illustrations, personnages, scènes), vois la section **Prompts ImageGen**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prompts ImageGen
|
||||||
|
|
||||||
|
> ⚠️ Dans cet environnement, je ne peux pas exécuter ImageGen directement.
|
||||||
|
> Tu peux cependant **copier-coller** ces prompts dans GPT‑5 (image generation activé) et exporter en PNG aux dimensions recommandées.
|
||||||
|
|
||||||
|
- [Pack complet de prompts](../brand/image_gen_prompts.md)
|
||||||
|
|
||||||
|
### Conseils de cohérence
|
||||||
|
- Réutiliser les mêmes mots-clés de style et la même palette.
|
||||||
|
- Éviter d’intégrer du texte dans l’image (ajouter le texte dans Figma/Canva ensuite).
|
||||||
|
- Demander un fond “safe area” pour laisser de la place au titre.
|
||||||
|
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: FAQ & dépannage
|
||||||
|
description: Flash PlatformIO, SD, audio (ESP32) — symptômes, causes fréquentes, correctifs.
|
||||||
|
---
|
||||||
|
|
||||||
|
# FAQ & Dépannage (ESP32 / SD / Audio)
|
||||||
|
|
||||||
|
Cette FAQ est volontairement **pratique** : symptômes → causes fréquentes → correctifs.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Flash / Upload (PlatformIO)
|
||||||
|
|
||||||
|
### « Timed out waiting for packet header » / Upload qui échoue
|
||||||
|
Causes fréquentes :
|
||||||
|
- câble USB “charge only” (pas de data),
|
||||||
|
- port série incorrect,
|
||||||
|
- board en mode bootloader non activé.
|
||||||
|
|
||||||
|
Correctifs :
|
||||||
|
- essaie un autre câble + un autre port USB,
|
||||||
|
- vérifie le port :
|
||||||
|
```bash
|
||||||
|
pio device list
|
||||||
|
```
|
||||||
|
- lance un upload puis **maintien BOOT** (si la carte le demande) jusqu’au démarrage de l’upload,
|
||||||
|
- essaye un effacement complet :
|
||||||
|
```bash
|
||||||
|
pio run -t erase
|
||||||
|
pio run -t upload
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mauvais environnement PlatformIO
|
||||||
|
Symptôme : ça compile mais pas pour la bonne carte / mauvais pinout.
|
||||||
|
|
||||||
|
Correctifs :
|
||||||
|
- vérifie `platformio.ini` (env, framework, flags),
|
||||||
|
- compile explicitement :
|
||||||
|
```bash
|
||||||
|
pio run -e esp32dev
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Carte SD
|
||||||
|
|
||||||
|
### La SD n’est pas détectée
|
||||||
|
Causes fréquentes :
|
||||||
|
- formatage incompatible,
|
||||||
|
- câblage/pins SD différents selon la carte,
|
||||||
|
- init SD trop tôt (avant montage / alim stable).
|
||||||
|
|
||||||
|
Correctifs :
|
||||||
|
- formate en **FAT32** (recommandé) avec une taille d’unité d’allocation standard,
|
||||||
|
- teste une SD plus petite (≤ 32 Go) pour éliminer un souci exFAT,
|
||||||
|
- loggue le statut au boot (montage OK / erreur).
|
||||||
|
|
||||||
|
### Fichiers “introuvables” alors qu’ils sont présents
|
||||||
|
Causes fréquentes :
|
||||||
|
- chemins / casse (`/Music` vs `/music`),
|
||||||
|
- séparation `/` vs `\`,
|
||||||
|
- caractères spéciaux / noms trop longs.
|
||||||
|
|
||||||
|
Correctifs :
|
||||||
|
- impose une convention : `/music/`, `/audio/`, `/print/`…
|
||||||
|
- évite accents et caractères exotiques dans les noms,
|
||||||
|
- affiche dans les logs les chemins exacts.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Audio
|
||||||
|
|
||||||
|
### Craquements / coupures
|
||||||
|
Causes fréquentes :
|
||||||
|
- débit SD insuffisant (ou fragmentation),
|
||||||
|
- buffer audio trop petit,
|
||||||
|
- resampling / décodage trop coûteux.
|
||||||
|
|
||||||
|
Correctifs :
|
||||||
|
- copie les fichiers sur une SD correcte (UHS‑I / A1) et évite la saturation,
|
||||||
|
- augmente les buffers (si possible) et privilégie la lecture séquentielle,
|
||||||
|
- teste d’abord un WAV PCM simple (44.1 kHz / 16-bit) pour isoler le problème.
|
||||||
|
|
||||||
|
### Volume trop faible / saturé
|
||||||
|
Causes fréquentes :
|
||||||
|
- gain numérique trop élevé (clip),
|
||||||
|
- conversion mono/stéréo,
|
||||||
|
- réglage codec/I2S.
|
||||||
|
|
||||||
|
Correctifs :
|
||||||
|
- démarre avec un gain faible puis augmente,
|
||||||
|
- vérifie que l’échantillonnage (sample rate) correspond,
|
||||||
|
- si tu appliques des effets (comp, EQ), désactive-les pour tester.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Affichage / perf (bonus)
|
||||||
|
|
||||||
|
### FPS faible / tearing
|
||||||
|
Correctifs :
|
||||||
|
- privilégie **double-buffer partiel** + flush DMA,
|
||||||
|
- évite les redraw complets : utilise des “dirty rect” / mise à jour ciblée,
|
||||||
|
- limite les alpha/transparences lourdes dans LVGL.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Logs utiles
|
||||||
|
|
||||||
|
### Obtenir les logs série
|
||||||
|
```bash
|
||||||
|
pio device monitor -b 115200
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lister les devices
|
||||||
|
```bash
|
||||||
|
pio device list
|
||||||
|
```
|
||||||
@@ -1,20 +1,119 @@
|
|||||||
# Le Mystère du Professeur Zacus
|
---
|
||||||
|
layout: default
|
||||||
|
title: Le Mystère du Professeur Zacus
|
||||||
|
description: Une enquête scientifique immersive pour anniversaire (printables, audio, modules électroniques).
|
||||||
|
---
|
||||||
|
|
||||||
## Ressources principales
|
# 🎩 Le Mystère du Professeur Zacus
|
||||||
- Kit Maître du jeu : `kit-maitre-du-jeu/`
|
|
||||||
- Scénario canon : `game/scenarios/zacus_v1.yaml`
|
|
||||||
- Printables & workflow : `printables/` + `printables/WORKFLOW.md`
|
|
||||||
- Audio canon : `audio/manifests/zacus_v1_audio.yaml` + `game/prompts/audio/`
|
|
||||||
- Brief scénarios : `docs/_generated/SCENARIO_BRIEF.md`
|
|
||||||
- Maintenance : `docs/maintenance-repo.md`, `docs/repo-audit.md`, `docs/repo-status.md`
|
|
||||||
|
|
||||||
## Guides à consulter
|

|
||||||
- Quickstart (déploiement terrain) : `docs/QUICKSTART.md`
|
|
||||||
- Styleguide (ton & structure) : `docs/STYLEGUIDE.md`
|
|
||||||
- Workflows (validate/export) : `docs/WORKFLOWS.md`
|
|
||||||
- Glossaire des identifiants : `docs/GLOSSARY.md`
|
|
||||||
- Orchestration ZeroClaw (préflight + agent) : `docs/zeroclaw_orchestration.md`
|
|
||||||
- Contribuer (workflow & licence) : `CONTRIBUTING.md`
|
|
||||||
|
|
||||||
## Astuce
|
Le Mystère du Professeur Zacus : une enquête scientifique immersive pour anniversaire, jouable en famille ou entre ami·e·s.
|
||||||
Active GitHub Pages sur `/docs` pour exposer cette page et offrir un accès direct au jeu.
|
|
||||||
|
Scénarios modulaires (YAML), supports imprimables, audio, et accessoires électroniques (ESP32/Arduino).
|
||||||
|
|
||||||
|
<div class="badges">
|
||||||
|
<div class="badge"><img src="./assets/icons/icon_hat.png" alt="hat" />Scénarios modulaires</div>
|
||||||
|
<div class="badge"><img src="./assets/icons/icon_audio.png" alt="audio" />Audio & checkpoints</div>
|
||||||
|
<div class="badge"><img src="./assets/icons/icon_chip.png" alt="chip" />Modules électroniques</div>
|
||||||
|
<div class="badge"><img src="./assets/icons/icon_flask.png" alt="flask" />Thème labo/science</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Structure du projet
|
||||||
|
|
||||||
|
```text
|
||||||
|
├── game/scenarios/*.yaml Scénarios (source de vérité)
|
||||||
|
├── audio/manifests/*.yaml Manifeste audio + fichiers associés
|
||||||
|
├── printables/manifests/*.yaml Manifeste printables + PDF/PNG
|
||||||
|
├── hardware/firmware/esp32/ Firmware (lecture seule sans approbation)
|
||||||
|
├── tools/ Outils Python (validation, export, génération)
|
||||||
|
├── docs/ Guides + mini-site GitHub Pages
|
||||||
|
├── assets/ Images (README / marketing)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Démarrage rapide
|
||||||
|
|
||||||
|
1. Imprime les printables (cartes, indices).
|
||||||
|
2. (Option) Flash les modules électroniques.
|
||||||
|
3. Lis le scénario YAML et place les indices.
|
||||||
|
4. Lance la partie et suis le guide MJ.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Guides & documentation
|
||||||
|
|
||||||
|
- [STRUCTURE.md](STRUCTURE.md) : Architecture détaillée
|
||||||
|
- [QUICKSTART.md](QUICKSTART.md) : Démarrage express
|
||||||
|
- [WORKFLOWS.md](WORKFLOWS.md) : Workflows validation/export
|
||||||
|
- [faq.md](faq.md) : FAQ dépannage
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Licences
|
||||||
|
|
||||||
|
- Code : MIT — voir [../LICENSE](../LICENSE)
|
||||||
|
- Contenu créatif : CC BY‑NC 4.0 — voir [../LICENSE-CONTENT.md](../LICENSE-CONTENT.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Assets
|
||||||
|
|
||||||
|
- Couverture : assets/cover.png
|
||||||
|
- OpenGraph : assets/og.png
|
||||||
|
- Poster : assets/poster.png
|
||||||
|
- Logo : assets/logo.png
|
||||||
|
- Diagramme : assets/diagram.png
|
||||||
|
- Aperçu printables : assets/printables.png
|
||||||
|
|
||||||
|
## Démo
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Jouer (MJ)
|
||||||
|
|
||||||
|
### Checklist rapide
|
||||||
|
1. Imprime les **printables** (cartes, indices).
|
||||||
|
2. (Option) Flash les modules électroniques.
|
||||||
|
3. Lis le scénario et place les indices.
|
||||||
|
4. Lance la partie et suis le guide MJ.
|
||||||
|
|
||||||
|
👉 Voir aussi : [FAQ (flash / SD / audio)](./faq)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Développer / contribuer
|
||||||
|
|
||||||
|
### Structure du dépôt
|
||||||
|
- `game/scenarios/` — scénarios (source de vérité)
|
||||||
|
- `audio/` — manifestes et ressources audio
|
||||||
|
- `printables/` — manifestes + PDF/PNG
|
||||||
|
- `tools/` — outils Python (validation, export)
|
||||||
|
- `hardware/firmware/esp32/` — firmware (**lecture seule** sans approbation)
|
||||||
|
|
||||||
|
### Démarrage rapide
|
||||||
|
```bash
|
||||||
|
python3 -m pip install -r tools/requirements.txt
|
||||||
|
python3 tools/scenario/validate_scenario.py game/scenarios/mon_scenario.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Visuels & matériel
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Licences
|
||||||
|
- **Code** : MIT (`LICENSE`)
|
||||||
|
- **Contenu** : CC BY‑NC 4.0 (`LICENSE-CONTENT.md`)
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Publier le site
|
||||||
|
description: Configuration rapide GitHub Pages pour /docs.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Publier le mini-site (GitHub Pages)
|
||||||
|
|
||||||
|
1. Sur GitHub : **Settings → Pages**
|
||||||
|
2. **Build and deployment**
|
||||||
|
- Source : **Deploy from a branch**
|
||||||
|
- Branch : `main` (ou `master`)
|
||||||
|
- Folder : **/docs**
|
||||||
|
3. GitHub affiche l’URL publique (généralement `https://<user>.github.io/<repo>/`).
|
||||||
|
|
||||||
|
Si tu utilises un sous-chemin personnalisé, ajuste `baseurl` dans `docs/_config.yml`.
|
||||||
@@ -1,21 +1,24 @@
|
|||||||
# Scenario AI Coherence
|
|
||||||
|
|
||||||
## Rôle de ce dossier
|
|
||||||
|
|
||||||
Ce dossier contient les artefacts de cohérence scénario générés par IA et validés par des humains.
|
|
||||||
|
|
||||||
### Structure
|
# Zacus Scenario AI Coherence — Bundle Unifié
|
||||||
|
|
||||||
- **`version-finale/`** : Contenus finaux validés et approuvés pour utilisation dans le jeu
|
Ce dossier contient tous les artefacts validés, fusionnés et prêts à l’intégration :
|
||||||
- *Futurs artefacts* : Versions intermédiaires, logs de génération, et autres documents de travail IA
|
|
||||||
|
|
||||||
## Processus
|
- scenario_complet.md : déroulé narratif, synthèse, fiches, supports
|
||||||
|
- charte_graphique.yaml / charte_graphique.json : charte visuelle
|
||||||
|
- listing_fichiers.yaml / listing_fichiers.json : listing supports
|
||||||
|
- scenario_canonical.yaml : scénario canonique YAML
|
||||||
|
- scenario_promptable_template.yaml : template éditable
|
||||||
|
- scenario_runtime.json : runtime JSON
|
||||||
|
- zacus_v2.yaml : narration MJ alignée
|
||||||
|
- fsm_mermaid.md : diagramme FSM
|
||||||
|
- CODEX_PROMPT.md : consignes firmware/scénario
|
||||||
|
- INTRO OFFICIELLE – VERSION AVEC HOT-LINE.md : intro alternative
|
||||||
|
|
||||||
1. **Génération IA** : Création initiale de contenu scénario via outils d'IA
|
Tous les sous-dossiers ont été supprimés. Les fichiers sont fusionnés, cohérents et validés.
|
||||||
2. **Validation humaine** : Révision et approbation par les mainteneurs
|
|
||||||
3. **Intégration** : Déplacement vers `version-finale/` une fois validé
|
Pour toute intégration, utilisez scenario_complet.md pour le déroulé, scenario_canonical.yaml/scenario_runtime.json pour la technique, et les fichiers charte/listing pour les assets.
|
||||||
4. **Utilisation** : Référencé par les autres composants du kit d'enquête
|
|
||||||
|
|
||||||
## Licence
|
## Licence
|
||||||
|
Contenus : **CC BY-NC 4.0** (voir LICENSES/CC-BY-NC-4.0.txt)
|
||||||
Contenus de ce dossier : **CC BY-NC 4.0** (voir `LICENSES/CC-BY-NC-4.0.txt`)
|
|
||||||
|
|||||||
@@ -38,12 +38,4 @@ stateDiagram-v2
|
|||||||
STEP_QR_DETECTOR --> STEP_RTC_ESP_ETAPE2: event:QR_TIMEOUT
|
STEP_QR_DETECTOR --> STEP_RTC_ESP_ETAPE2: event:QR_TIMEOUT
|
||||||
STEP_QR_DETECTOR --> STEP_FINAL_WIN: serial:BTN_NEXT
|
STEP_QR_DETECTOR --> STEP_FINAL_WIN: serial:BTN_NEXT
|
||||||
STEP_QR_DETECTOR --> STEP_FINAL_WIN: unlock:UNLOCK_QR
|
STEP_QR_DETECTOR --> STEP_FINAL_WIN: unlock:UNLOCK_QR
|
||||||
STEP_QR_DETECTOR --> STEP_FINAL_WIN: action:ACTION_FORCE_ETAPE2
|
|
||||||
STEP_QR_DETECTOR --> STEP_FINAL_WIN: serial:FORCE_WIN_ETAPE2
|
|
||||||
|
|
||||||
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: timer:WIN_DUE
|
|
||||||
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: serial:BTN_NEXT
|
|
||||||
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: unlock:UNLOCK
|
|
||||||
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: action:FORCE_WIN_ETAPE2
|
|
||||||
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: serial:FORCE_WIN_ETAPE2
|
|
||||||
```
|
```
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Zacus — Conversation Summary (bundle v3)
|
|
||||||
|
|
||||||
This bundle consolidates the key outputs from the conversation:
|
|
||||||
- Promptable scenario template (user-edited section: prompt_input)
|
|
||||||
- Canonical scenario YAML (STEP_*/SCENE_* conventions)
|
|
||||||
- Runtime JSON (DEFAULT.json)
|
|
||||||
- FSM diagram (Mermaid)
|
|
||||||
- Codex prompt to update repo targets
|
|
||||||
- Narrative zacus_v2.yaml aligned with the runtime + real-world gameplay
|
|
||||||
|
|
||||||
Key decisions captured:
|
|
||||||
- Prototype is U-SON.
|
|
||||||
- Act 1 (~45 min): LA 440 Hz stabilization (STEP_LA_DETECTOR).
|
|
||||||
- Act 2 (~60 min): Zone 4 piano-alphabet puzzle → play "LEFOU" (letters randomly placed; A anchored on LA 440 Hz).
|
|
||||||
- QR final payload is "WIN", hidden behind the portrait in the Archives.
|
|
||||||
- After QR success: Media Hub + persistent boot into media_manager.
|
|
||||||
|
|
||||||
Generated: 2026-02-25 (Europe/Paris)
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# Zacus Conversation Bundle (v3)
|
|
||||||
|
|
||||||
## Purpose
|
|
||||||
Bundle de travail conversationnel/IA conservé en dehors de la source canon gameplay (`game/scenarios/*.yaml`).
|
|
||||||
|
|
||||||
## Files
|
|
||||||
- `scenario_promptable_template.yaml`: template éditable (input prompt)
|
|
||||||
- `scenario_canonical.yaml`: YAML canonique conversation bundle
|
|
||||||
- `scenario_runtime.json`: JSON runtime dérivé
|
|
||||||
- `fsm_mermaid.md`: diagramme FSM
|
|
||||||
- `CODEX_PROMPT.md`: prompt Codex prêt à l'emploi
|
|
||||||
- `zacus_v2.yaml`: narration MJ alignée bundle
|
|
||||||
- `CONVERSATION_SUMMARY.md`: synthèse des décisions
|
|
||||||
|
|
||||||
## Validation workflow
|
|
||||||
1. Installer les dépendances validateurs :
|
|
||||||
- `bash tools/setup/install_validators.sh`
|
|
||||||
2. Valider la cohérence interne du bundle :
|
|
||||||
- `python3 tools/scenario/validate_runtime_bundle.py`
|
|
||||||
3. Lancer les validateurs projet (non-régression canon/audio/printables) :
|
|
||||||
- `python3 tools/scenario/validate_scenario.py game/scenarios/zacus_v1.yaml`
|
|
||||||
- `python3 tools/scenario/export_md.py game/scenarios/zacus_v1.yaml`
|
|
||||||
- `python3 tools/audio/validate_manifest.py audio/manifests/zacus_v1_audio.yaml`
|
|
||||||
- `python3 tools/printables/validate_manifest.py printables/manifests/zacus_v1_printables.yaml`
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Ce bundle n'est pas promu automatiquement dans `game/scenarios/*.yaml`.
|
|
||||||
- Toute promotion doit passer par une revue fonctionnelle dédiée.
|
|
||||||
Files:
|
|
||||||
- scenario_promptable_template.yaml : your editable template (prompt_input)
|
|
||||||
- scenario_canonical.yaml : canonical YAML (copy into docs/... target)
|
|
||||||
- scenario_runtime.json : runtime JSON (copy into data/story/scenarios/DEFAULT.json)
|
|
||||||
- fsm_mermaid.md : FSM diagram
|
|
||||||
- CODEX_PROMPT.md : ready-to-paste Codex prompt
|
|
||||||
- zacus_v2.yaml : narrative scenario aligned with runtime + gameplay reality
|
|
||||||
- CONVERSATION_SUMMARY.md : what changed / key decisions
|
|
||||||
|
|
||||||
Typical flow:
|
|
||||||
1) Update prompt_input in scenario_promptable_template.yaml if needed.
|
|
||||||
2) Use canonical/runtime files to update repo targets.
|
|
||||||
3) Use zacus_v2.yaml as the printed narrative / MJ reference for the real game.
|
|
||||||
|
|
||||||
Generated: 2026-02-25
|
|
||||||
@@ -1,291 +0,0 @@
|
|||||||
# Zacus Scenario — Canonical YAML (v3)
|
|
||||||
# Generated: 2026-02-25
|
|
||||||
#
|
|
||||||
# Conventions:
|
|
||||||
# - step_id = STEP_*, screen_scene_id = SCENE_*
|
|
||||||
# - led_policy is a sibling of transitions (NOT nested inside)
|
|
||||||
# - QR rule scene_id aligned to SCENE_QR_DETECTOR
|
|
||||||
# - Final transitions go to SCENE_MEDIA_MANAGER (hub scene)
|
|
||||||
#
|
|
||||||
# Narrative anchors (conversation):
|
|
||||||
# - Prototype: U-SON
|
|
||||||
# - Acte 1 (~45min): LA 440 Hz (STEP_LA_DETECTOR)
|
|
||||||
# - Acte 2 (~60min): Zone 4 piano-alphabet → jouer "LEFOU" (STEP_LEFOU_DETECTOR)
|
|
||||||
# * Lettres collées en ordre aléatoire sur touches blanches
|
|
||||||
# * A placé sur la touche correspondant au LA 440 Hz (ancre)
|
|
||||||
# - QR final: payload "WIN", caché derrière le portrait dans la Salle des Archives
|
|
||||||
|
|
||||||
prompt_input:
|
|
||||||
meta:
|
|
||||||
request_name: "DEFAULT_UNLOCK_WIN_ETAPE2"
|
|
||||||
owner: "clement"
|
|
||||||
board_target: "freenove_esp32s3"
|
|
||||||
objective: "U-SON: Acte1 LA440 (~45min) -> Acte2 piano 'LEFOU' (~60min) -> QR WIN -> Media Manager (persistant)"
|
|
||||||
|
|
||||||
boot_policy:
|
|
||||||
startup_mode: "story" # story | media_manager
|
|
||||||
persist_after_validation: true
|
|
||||||
rollback_command_required: true
|
|
||||||
|
|
||||||
qr_rule:
|
|
||||||
enabled: true
|
|
||||||
scene_id: "SCENE_QR_DETECTOR"
|
|
||||||
expected_payload: "WIN"
|
|
||||||
match_mode: "exact" # exact | prefix | contains
|
|
||||||
case_insensitive: true
|
|
||||||
success_event: "UNLOCK_QR"
|
|
||||||
failure_event: "QR_INVALID"
|
|
||||||
|
|
||||||
media_hub:
|
|
||||||
enabled: true
|
|
||||||
hub_scene_id: "SCENE_MEDIA_MANAGER"
|
|
||||||
entries:
|
|
||||||
- "SCENE_PHOTO_MANAGER"
|
|
||||||
- "SCENE_MP3_PLAYER"
|
|
||||||
- "SCENE_READY"
|
|
||||||
|
|
||||||
led_policy:
|
|
||||||
strict_rgb: true
|
|
||||||
defaults:
|
|
||||||
ws2812: 1
|
|
||||||
led_auto: 1
|
|
||||||
rgb: "18/45/95"
|
|
||||||
scene_overrides:
|
|
||||||
- scene_id: "SCENE_LA_DETECTOR"
|
|
||||||
rgb: "dynamic_tuner_or_off"
|
|
||||||
|
|
||||||
custom_steps: []
|
|
||||||
|
|
||||||
serial_test_plan:
|
|
||||||
- "SC_LOAD DEFAULT"
|
|
||||||
- "SCENE_GOTO SCENE_U_SON_PROTO"
|
|
||||||
- "QR_SIM WIN"
|
|
||||||
- "SC_EVENT UNLOCK_QR"
|
|
||||||
- "BOOT_MODE_STATUS"
|
|
||||||
- "RESET"
|
|
||||||
|
|
||||||
acceptance_criteria:
|
|
||||||
- "Pas de PANIC|ASSERT|ABORT|REBOOT|rst:"
|
|
||||||
- "Transitions scene avec ACK ... ok=1"
|
|
||||||
- "Ownership camera/mic/amp coherent"
|
|
||||||
- "LED WS2812 conformes policy + RGB"
|
|
||||||
- "Boot mode media_manager persistant apres QR valide"
|
|
||||||
|
|
||||||
notes:
|
|
||||||
- "Prototype: U-SON."
|
|
||||||
- "Etape1: LA 440 Hz stable (Acte1 ~45min)."
|
|
||||||
- "Etape2: piano-alphabet → jouer 'LEFOU' (Acte2 ~60min)."
|
|
||||||
- "QR WIN: caché derrière le portrait (Salle des Archives)."
|
|
||||||
- "SCENE_QR_DETECTOR a un timeout (QR_TIMEOUT) pour eviter le blocage."
|
|
||||||
|
|
||||||
scenario:
|
|
||||||
id: "DEFAULT"
|
|
||||||
version: 2
|
|
||||||
initial_step: "STEP_U_SON_PROTO"
|
|
||||||
app_bindings:
|
|
||||||
- "APP_AUDIO"
|
|
||||||
- "APP_SCREEN"
|
|
||||||
- "APP_GATE"
|
|
||||||
- "APP_WIFI"
|
|
||||||
- "APP_ESPNOW"
|
|
||||||
- "APP_SONAR"
|
|
||||||
- "APP_SD"
|
|
||||||
- "APP_CAMERA"
|
|
||||||
- "APP_LED"
|
|
||||||
- "APP_SERIAL"
|
|
||||||
- "APP_TIMER"
|
|
||||||
- "APP_UNLOCK"
|
|
||||||
- "APP_QR"
|
|
||||||
- "APP_INPUT"
|
|
||||||
- "APP_LOG"
|
|
||||||
- "APP_ACTION"
|
|
||||||
|
|
||||||
steps_runtime_order:
|
|
||||||
|
|
||||||
- step_id: "STEP_U_SON_PROTO"
|
|
||||||
screen_scene_id: "SCENE_U_SON_PROTO"
|
|
||||||
audio_pack_id: "PACK_BOOT_RADIO"
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_HW_LED_ALERT"
|
|
||||||
transitions:
|
|
||||||
- "audio_done:loop->STEP_U_SON_PROTO"
|
|
||||||
- "BTN:ANY->STEP_LA_DETECTOR"
|
|
||||||
- "serial:FORCE_ETAPE2->STEP_LA_DETECTOR"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: on
|
|
||||||
ws2812_3: on
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "random_one_blink"
|
|
||||||
brightness: "random_bright"
|
|
||||||
rgb: "random_color"
|
|
||||||
|
|
||||||
- step_id: "STEP_LA_DETECTOR"
|
|
||||||
screen_scene_id: "SCENE_LA_DETECTOR"
|
|
||||||
audio_pack_id: ""
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_QUEUE_SONAR"
|
|
||||||
transitions:
|
|
||||||
- "timer:ETAPE2_DUE->STEP_U_SON_PROTO"
|
|
||||||
- "serial:BTN_NEXT->STEP_RTC_ESP_ETAPE1"
|
|
||||||
- "unlock:UNLOCK->STEP_RTC_ESP_ETAPE1"
|
|
||||||
- "action:ACTION_FORCE_ETAPE2->STEP_RTC_ESP_ETAPE1"
|
|
||||||
- "serial:FORCE_WIN_ETAPE1->STEP_RTC_ESP_ETAPE1"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: on
|
|
||||||
ws2812_3: on
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "dynamic_tuner"
|
|
||||||
brightness: "100%"
|
|
||||||
rgb: "random_color"
|
|
||||||
|
|
||||||
- step_id: "STEP_RTC_ESP_ETAPE1"
|
|
||||||
screen_scene_id: "SCENE_WIN_ETAPE1"
|
|
||||||
audio_pack_id: "PACK_CONFIRM_WIN_ETAPE1"
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_HW_LED_ALERT"
|
|
||||||
- "ACTION_ESP_NOW_SEND_ETAPE1"
|
|
||||||
- "ACTION_QUEUE_SONAR"
|
|
||||||
transitions:
|
|
||||||
- "esp_now:ACK_WIN1->STEP_WIN_ETAPE1"
|
|
||||||
- "serial:FORCE_DONE->STEP_WIN_ETAPE1"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: off
|
|
||||||
ws2812_3: off
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "breathing"
|
|
||||||
brightness: "random_bright"
|
|
||||||
rgb: "random_color"
|
|
||||||
|
|
||||||
- step_id: "STEP_WIN_ETAPE1"
|
|
||||||
screen_scene_id: "SCENE_WIN_ETAPE1"
|
|
||||||
audio_pack_id: "PACK_WIN"
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_HW_LED_ALERT"
|
|
||||||
transitions:
|
|
||||||
- "serial:BTN_NEXT->STEP_WARNING"
|
|
||||||
- "serial:FORCE_DONE->STEP_WARNING"
|
|
||||||
- "esp_now:ACK_WARNING->STEP_WARNING"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: off
|
|
||||||
ws2812_3: off
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "K2000"
|
|
||||||
brightness: "K2000"
|
|
||||||
rgb: "red"
|
|
||||||
|
|
||||||
- step_id: "STEP_WARNING"
|
|
||||||
screen_scene_id: "SCENE_WARNING"
|
|
||||||
audio_pack_id: "PACK_BOOT_RADIO"
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_HW_LED_ALERT"
|
|
||||||
transitions:
|
|
||||||
- "audio_done:loop->STEP_WARNING"
|
|
||||||
- "BTN:ANY->STEP_LEFOU_DETECTOR"
|
|
||||||
- "serial:FORCE_ETAPE2->STEP_LEFOU_DETECTOR"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: on
|
|
||||||
ws2812_3: on
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "blink_all"
|
|
||||||
brightness: "100%"
|
|
||||||
rgb: "red"
|
|
||||||
|
|
||||||
- step_id: "STEP_LEFOU_DETECTOR"
|
|
||||||
screen_scene_id: "SCENE_LEFOU_DETECTOR"
|
|
||||||
audio_pack_id: ""
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_QUEUE_SONAR"
|
|
||||||
transitions:
|
|
||||||
- "timer:ETAPE2_DUE->STEP_WARNING"
|
|
||||||
- "serial:BTN_NEXT->STEP_RTC_ESP_ETAPE2"
|
|
||||||
- "unlock:UNLOCK->STEP_RTC_ESP_ETAPE2"
|
|
||||||
- "action:ACTION_FORCE_ETAPE2->STEP_RTC_ESP_ETAPE2"
|
|
||||||
- "serial:FORCE_WIN_ETAPE2->STEP_RTC_ESP_ETAPE2"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: on
|
|
||||||
ws2812_3: on
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "dynamic_tuner"
|
|
||||||
brightness: "100%"
|
|
||||||
rgb: "random_color"
|
|
||||||
|
|
||||||
- step_id: "STEP_RTC_ESP_ETAPE2"
|
|
||||||
screen_scene_id: "SCENE_WIN_ETAPE2"
|
|
||||||
audio_pack_id: "PACK_CONFIRM_WIN_ETAPE2"
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_HW_LED_ALERT"
|
|
||||||
- "ACTION_ESP_NOW_SEND_ETAPE2"
|
|
||||||
- "ACTION_QUEUE_SONAR"
|
|
||||||
transitions:
|
|
||||||
- "esp_now:ACK_WIN2->STEP_QR_DETECTOR"
|
|
||||||
- "serial:FORCE_DONE->STEP_QR_DETECTOR"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: off
|
|
||||||
ws2812_3: off
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "breathing"
|
|
||||||
brightness: "random_bright"
|
|
||||||
rgb: "random_color"
|
|
||||||
|
|
||||||
- step_id: "STEP_QR_DETECTOR"
|
|
||||||
screen_scene_id: "SCENE_QR_DETECTOR"
|
|
||||||
audio_pack_id: ""
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_QR_CODE_SCANNER_START"
|
|
||||||
- "ACTION_QR_TIMEOUT_30S"
|
|
||||||
transitions:
|
|
||||||
- "timer:ETAPE2_DUE->STEP_RTC_ESP_ETAPE2"
|
|
||||||
- "event:QR_TIMEOUT->STEP_RTC_ESP_ETAPE2"
|
|
||||||
- "serial:BTN_NEXT->STEP_FINAL_WIN"
|
|
||||||
- "unlock:UNLOCK_QR->STEP_FINAL_WIN"
|
|
||||||
- "action:ACTION_FORCE_ETAPE2->STEP_FINAL_WIN"
|
|
||||||
- "serial:FORCE_WIN_ETAPE2->STEP_FINAL_WIN"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: on
|
|
||||||
ws2812_3: on
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "bargraph_qr_trigger"
|
|
||||||
brightness: "bargraph"
|
|
||||||
rgb: "bargraph_red_to_green"
|
|
||||||
|
|
||||||
- step_id: "STEP_FINAL_WIN"
|
|
||||||
screen_scene_id: "SCENE_FINAL_WIN"
|
|
||||||
audio_pack_id: ""
|
|
||||||
actions:
|
|
||||||
- "ACTION_TRACE_STEP"
|
|
||||||
- "ACTION_WINNER"
|
|
||||||
transitions:
|
|
||||||
- "timer:WIN_DUE->SCENE_MEDIA_MANAGER"
|
|
||||||
- "serial:BTN_NEXT->SCENE_MEDIA_MANAGER"
|
|
||||||
- "unlock:UNLOCK->SCENE_MEDIA_MANAGER"
|
|
||||||
- "action:FORCE_WIN_ETAPE2->SCENE_MEDIA_MANAGER"
|
|
||||||
- "serial:FORCE_WIN_ETAPE2->SCENE_MEDIA_MANAGER"
|
|
||||||
led_policy:
|
|
||||||
ws2812_1: on
|
|
||||||
ws2812_2: on
|
|
||||||
ws2812_3: on
|
|
||||||
ws2812_4: on
|
|
||||||
animation: "blink_all_random"
|
|
||||||
brightness: "100%"
|
|
||||||
rgb: "random_color"
|
|
||||||
|
|
||||||
current_firmware_snapshot:
|
|
||||||
source_to_update_files:
|
|
||||||
- "docs/protocols/story_specs/scenarios/default_unlock_win_etape2.yaml"
|
|
||||||
- "data/story/scenarios/DEFAULT.json"
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
# Scenario reel - template lisible + promptable.
|
|
||||||
#
|
|
||||||
# Comment l'utiliser:
|
|
||||||
# 1) Edite uniquement la section `prompt_input`.
|
|
||||||
# 2) Laisse `current_firmware_snapshot` comme reference de l'etat actuel code.
|
|
||||||
# 3) Envoie ce fichier a Codex: je convertis ensuite vers le YAML canonique + JSON runtime.
|
|
||||||
#
|
|
||||||
# NOTE (conversation):
|
|
||||||
# - Prototype: U-SON
|
|
||||||
# - Etape 1 (LA_DETECTOR): fréquence audio LA 440 Hz
|
|
||||||
# - Etape 2 (LEFOU_DETECTOR): puzzle piano-alphabet → jouer "LEFOU"
|
|
||||||
# * Lettres collées en ordre aléatoire sur les touches blanches
|
|
||||||
# * A est placé sur la touche correspondant au LA 440 Hz (ancre)
|
|
||||||
# - QR final: payload "WIN", caché derrière le portrait dans la Salle des Archives
|
|
||||||
|
|
||||||
prompt_input:
|
|
||||||
meta:
|
|
||||||
request_name: "A_COMPLETER"
|
|
||||||
owner: "A_COMPLETER"
|
|
||||||
board_target: "freenove_esp32s3"
|
|
||||||
objective: "U-SON: Acte1 LA440 (~45min) -> Acte2 Zone4 piano 'LEFOU' (~60min) -> QR WIN -> Media Manager"
|
|
||||||
|
|
||||||
boot_policy:
|
|
||||||
startup_mode: "story" # story | media_manager
|
|
||||||
persist_after_validation: true
|
|
||||||
rollback_command_required: true
|
|
||||||
|
|
||||||
qr_rule:
|
|
||||||
enabled: true
|
|
||||||
scene_id: "SCENE_QR_DETECTOR"
|
|
||||||
expected_payload: "WIN"
|
|
||||||
match_mode: "exact" # exact | prefix | contains
|
|
||||||
case_insensitive: true
|
|
||||||
success_event: "UNLOCK_QR"
|
|
||||||
failure_event: "QR_INVALID"
|
|
||||||
|
|
||||||
media_hub:
|
|
||||||
enabled: true
|
|
||||||
hub_scene_id: "SCENE_MEDIA_MANAGER"
|
|
||||||
entries:
|
|
||||||
- "SCENE_PHOTO_MANAGER"
|
|
||||||
- "SCENE_MP3_PLAYER"
|
|
||||||
- "SCENE_READY"
|
|
||||||
|
|
||||||
led_policy:
|
|
||||||
strict_rgb: true
|
|
||||||
defaults:
|
|
||||||
ws2812: 1
|
|
||||||
led_auto: 1
|
|
||||||
rgb: "18/45/95"
|
|
||||||
scene_overrides:
|
|
||||||
- scene_id: "SCENE_LA_DETECTOR"
|
|
||||||
rgb: "dynamic_tuner_or_off"
|
|
||||||
|
|
||||||
custom_steps:
|
|
||||||
# Ajoute, retire, ou reordonne des steps ici.
|
|
||||||
- "A_COMPLETER"
|
|
||||||
|
|
||||||
serial_test_plan:
|
|
||||||
- "SC_LOAD DEFAULT"
|
|
||||||
- "SCENE_GOTO"
|
|
||||||
- "QR_SIM WIN"
|
|
||||||
- "SC_EVENT UNLOCK_QR"
|
|
||||||
- "BOOT_MODE_STATUS"
|
|
||||||
- "RESET"
|
|
||||||
|
|
||||||
acceptance_criteria:
|
|
||||||
- "Pas de PANIC|ASSERT|ABORT|REBOOT|rst:"
|
|
||||||
- "Transitions scene avec ACK ... ok=1"
|
|
||||||
- "Ownership camera/mic/amp coherent"
|
|
||||||
- "LED WS2812 conformes policy + RGB"
|
|
||||||
- "Boot mode media_manager persistant apres QR valide"
|
|
||||||
|
|
||||||
notes:
|
|
||||||
- "Acte 1: LA 440 Hz (stabilité) ~45 minutes."
|
|
||||||
- "Acte 2: Zone 4 piano-alphabet (LEFOU) + Archives (QR WIN derrière portrait) ~60 minutes."
|
|
||||||
- "Prototype: U-SON."
|
|
||||||
- "Ajouter ici les exceptions ou aliases scene."
|
|
||||||
|
|
||||||
scenario:
|
|
||||||
id: "DEFAULT"
|
|
||||||
version: 2
|
|
||||||
initial_step: "STEP_U_SON_PROTO"
|
|
||||||
app_bindings:
|
|
||||||
- "APP_AUDIO"
|
|
||||||
- "APP_SCREEN"
|
|
||||||
- "APP_GATE"
|
|
||||||
- "APP_WIFI"
|
|
||||||
- "APP_ESPNOW"
|
|
||||||
- "APP_SONAR"
|
|
||||||
- "APP_SD"
|
|
||||||
- "APP_CAMERA"
|
|
||||||
- "APP_LED"
|
|
||||||
- "APP_SERIAL"
|
|
||||||
- "APP_TIMER"
|
|
||||||
- "APP_UNLOCK"
|
|
||||||
- "APP_QR"
|
|
||||||
- "APP_INPUT"
|
|
||||||
- "APP_LOG"
|
|
||||||
- "APP_ACTION"
|
|
||||||
|
|
||||||
current_firmware_snapshot:
|
|
||||||
source_to_update_files:
|
|
||||||
- "docs/protocols/story_specs/scenarios/default_unlock_win_etape2.yaml"
|
|
||||||
- "data/story/scenarios/DEFAULT.json"
|
|
||||||
@@ -1,434 +0,0 @@
|
|||||||
{
|
|
||||||
"scenario": {
|
|
||||||
"id": "DEFAULT",
|
|
||||||
"version": 2,
|
|
||||||
"initial_step": "STEP_U_SON_PROTO",
|
|
||||||
"app_bindings": [
|
|
||||||
"APP_AUDIO",
|
|
||||||
"APP_SCREEN",
|
|
||||||
"APP_GATE",
|
|
||||||
"APP_WIFI",
|
|
||||||
"APP_ESPNOW",
|
|
||||||
"APP_SONAR",
|
|
||||||
"APP_SD",
|
|
||||||
"APP_CAMERA",
|
|
||||||
"APP_LED",
|
|
||||||
"APP_SERIAL",
|
|
||||||
"APP_TIMER",
|
|
||||||
"APP_UNLOCK",
|
|
||||||
"APP_QR",
|
|
||||||
"APP_INPUT",
|
|
||||||
"APP_LOG",
|
|
||||||
"APP_ACTION"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"boot_policy": {
|
|
||||||
"startup_mode": "story",
|
|
||||||
"persist_after_validation": true,
|
|
||||||
"rollback_command_required": true
|
|
||||||
},
|
|
||||||
"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"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"led_policy": {
|
|
||||||
"strict_rgb": true,
|
|
||||||
"defaults": {
|
|
||||||
"ws2812": 1,
|
|
||||||
"led_auto": 1,
|
|
||||||
"rgb": "18/45/95"
|
|
||||||
},
|
|
||||||
"scene_overrides": [
|
|
||||||
{
|
|
||||||
"scene_id": "SCENE_LA_DETECTOR",
|
|
||||||
"rgb": "dynamic_tuner_or_off"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"narrative_meta": {
|
|
||||||
"prototype": "U-SON",
|
|
||||||
"act_durations_minutes": {
|
|
||||||
"act_1": 45,
|
|
||||||
"act_2": 60
|
|
||||||
},
|
|
||||||
"zone4_piano": {
|
|
||||||
"code_word": "LEFOU",
|
|
||||||
"letters_random_order": true,
|
|
||||||
"anchor": "A on LA 440 Hz"
|
|
||||||
},
|
|
||||||
"qr_location": "Derriere le portrait (Salle des Archives)"
|
|
||||||
},
|
|
||||||
"steps_runtime_order": [
|
|
||||||
{
|
|
||||||
"step_id": "STEP_U_SON_PROTO",
|
|
||||||
"screen_scene_id": "SCENE_U_SON_PROTO",
|
|
||||||
"audio_pack_id": "PACK_BOOT_RADIO",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_HW_LED_ALERT"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "audio_done",
|
|
||||||
"event": "loop",
|
|
||||||
"target": "STEP_U_SON_PROTO"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "BTN",
|
|
||||||
"event": "ANY",
|
|
||||||
"target": "STEP_LA_DETECTOR"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_ETAPE2",
|
|
||||||
"target": "STEP_LA_DETECTOR"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "on",
|
|
||||||
"ws2812_3": "on",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "random_one_blink",
|
|
||||||
"brightness": "random_bright",
|
|
||||||
"rgb": "random_color"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_LA_DETECTOR",
|
|
||||||
"screen_scene_id": "SCENE_LA_DETECTOR",
|
|
||||||
"audio_pack_id": "",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_QUEUE_SONAR"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "timer",
|
|
||||||
"event": "ETAPE2_DUE",
|
|
||||||
"target": "STEP_U_SON_PROTO"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "BTN_NEXT",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "unlock",
|
|
||||||
"event": "UNLOCK",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "action",
|
|
||||||
"event": "ACTION_FORCE_ETAPE2",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_WIN_ETAPE1",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "on",
|
|
||||||
"ws2812_3": "on",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "dynamic_tuner",
|
|
||||||
"brightness": "100%",
|
|
||||||
"rgb": "random_color"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_RTC_ESP_ETAPE1",
|
|
||||||
"screen_scene_id": "SCENE_WIN_ETAPE1",
|
|
||||||
"audio_pack_id": "PACK_CONFIRM_WIN_ETAPE1",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_HW_LED_ALERT",
|
|
||||||
"ACTION_ESP_NOW_SEND_ETAPE1",
|
|
||||||
"ACTION_QUEUE_SONAR"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "esp_now",
|
|
||||||
"event": "ACK_WIN1",
|
|
||||||
"target": "STEP_WIN_ETAPE1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_DONE",
|
|
||||||
"target": "STEP_WIN_ETAPE1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "off",
|
|
||||||
"ws2812_3": "off",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "breathing",
|
|
||||||
"brightness": "random_bright",
|
|
||||||
"rgb": "random_color"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_WIN_ETAPE1",
|
|
||||||
"screen_scene_id": "SCENE_WIN_ETAPE1",
|
|
||||||
"audio_pack_id": "PACK_WIN",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_HW_LED_ALERT"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "BTN_NEXT",
|
|
||||||
"target": "STEP_WARNING"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_DONE",
|
|
||||||
"target": "STEP_WARNING"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "esp_now",
|
|
||||||
"event": "ACK_WARNING",
|
|
||||||
"target": "STEP_WARNING"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "off",
|
|
||||||
"ws2812_3": "off",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "K2000",
|
|
||||||
"brightness": "K2000",
|
|
||||||
"rgb": "red"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_WARNING",
|
|
||||||
"screen_scene_id": "SCENE_WARNING",
|
|
||||||
"audio_pack_id": "PACK_BOOT_RADIO",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_HW_LED_ALERT"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "audio_done",
|
|
||||||
"event": "loop",
|
|
||||||
"target": "STEP_WARNING"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "BTN",
|
|
||||||
"event": "ANY",
|
|
||||||
"target": "STEP_LEFOU_DETECTOR"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_ETAPE2",
|
|
||||||
"target": "STEP_LEFOU_DETECTOR"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "on",
|
|
||||||
"ws2812_3": "on",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "blink_all",
|
|
||||||
"brightness": "100%",
|
|
||||||
"rgb": "red"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_LEFOU_DETECTOR",
|
|
||||||
"screen_scene_id": "SCENE_LEFOU_DETECTOR",
|
|
||||||
"audio_pack_id": "",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_QUEUE_SONAR"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "timer",
|
|
||||||
"event": "ETAPE2_DUE",
|
|
||||||
"target": "STEP_WARNING"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "BTN_NEXT",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "unlock",
|
|
||||||
"event": "UNLOCK",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "action",
|
|
||||||
"event": "ACTION_FORCE_ETAPE2",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_WIN_ETAPE2",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE2"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "on",
|
|
||||||
"ws2812_3": "on",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "dynamic_tuner",
|
|
||||||
"brightness": "100%",
|
|
||||||
"rgb": "random_color"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_RTC_ESP_ETAPE2",
|
|
||||||
"screen_scene_id": "SCENE_WIN_ETAPE2",
|
|
||||||
"audio_pack_id": "PACK_CONFIRM_WIN_ETAPE2",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_HW_LED_ALERT",
|
|
||||||
"ACTION_ESP_NOW_SEND_ETAPE2",
|
|
||||||
"ACTION_QUEUE_SONAR"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "esp_now",
|
|
||||||
"event": "ACK_WIN2",
|
|
||||||
"target": "STEP_QR_DETECTOR"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_DONE",
|
|
||||||
"target": "STEP_QR_DETECTOR"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "off",
|
|
||||||
"ws2812_3": "off",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "breathing",
|
|
||||||
"brightness": "random_bright",
|
|
||||||
"rgb": "random_color"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_QR_DETECTOR",
|
|
||||||
"screen_scene_id": "SCENE_QR_DETECTOR",
|
|
||||||
"audio_pack_id": "",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_QR_CODE_SCANNER_START",
|
|
||||||
"ACTION_QR_TIMEOUT_30S"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "timer",
|
|
||||||
"event": "ETAPE2_DUE",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "event",
|
|
||||||
"event": "QR_TIMEOUT",
|
|
||||||
"target": "STEP_RTC_ESP_ETAPE2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "BTN_NEXT",
|
|
||||||
"target": "STEP_FINAL_WIN"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "unlock",
|
|
||||||
"event": "UNLOCK_QR",
|
|
||||||
"target": "STEP_FINAL_WIN"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "action",
|
|
||||||
"event": "ACTION_FORCE_ETAPE2",
|
|
||||||
"target": "STEP_FINAL_WIN"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_WIN_ETAPE2",
|
|
||||||
"target": "STEP_FINAL_WIN"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "on",
|
|
||||||
"ws2812_3": "on",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "bargraph_qr_trigger",
|
|
||||||
"brightness": "bargraph",
|
|
||||||
"rgb": "bargraph_red_to_green"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "STEP_FINAL_WIN",
|
|
||||||
"screen_scene_id": "SCENE_FINAL_WIN",
|
|
||||||
"audio_pack_id": "",
|
|
||||||
"actions": [
|
|
||||||
"ACTION_TRACE_STEP",
|
|
||||||
"ACTION_WINNER"
|
|
||||||
],
|
|
||||||
"transitions": [
|
|
||||||
{
|
|
||||||
"channel": "timer",
|
|
||||||
"event": "WIN_DUE",
|
|
||||||
"target": "SCENE_MEDIA_MANAGER"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "BTN_NEXT",
|
|
||||||
"target": "SCENE_MEDIA_MANAGER"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "unlock",
|
|
||||||
"event": "UNLOCK",
|
|
||||||
"target": "SCENE_MEDIA_MANAGER"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "action",
|
|
||||||
"event": "FORCE_WIN_ETAPE2",
|
|
||||||
"target": "SCENE_MEDIA_MANAGER"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"channel": "serial",
|
|
||||||
"event": "FORCE_WIN_ETAPE2",
|
|
||||||
"target": "SCENE_MEDIA_MANAGER"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"led_policy": {
|
|
||||||
"ws2812_1": "on",
|
|
||||||
"ws2812_2": "on",
|
|
||||||
"ws2812_3": "on",
|
|
||||||
"ws2812_4": "on",
|
|
||||||
"animation": "blink_all_random",
|
|
||||||
"brightness": "100%",
|
|
||||||
"rgb": "random_color"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
id: zacus_v2
|
|
||||||
version: 3
|
|
||||||
revision: 1
|
|
||||||
title: "Le mystère du Professeur Zacus — Version Réelle (U-SON, piano LEFOU, QR WIN)"
|
|
||||||
theme: "Enquête scientifique + stabilisation audio + épreuve Zone 4 + déverrouillage final"
|
|
||||||
|
|
||||||
players:
|
|
||||||
min: 6
|
|
||||||
max: 14
|
|
||||||
|
|
||||||
ages: "6–14 ans (9–11 recommandés)"
|
|
||||||
|
|
||||||
duration:
|
|
||||||
act_1_minutes: 45
|
|
||||||
act_2_minutes: 60
|
|
||||||
total_minutes: 105
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
||||||
canon:
|
|
||||||
prototype: "U-SON"
|
|
||||||
introduction: >
|
|
||||||
Le Professeur Zacus a disparu après avoir déclenché une alerte cryptée.
|
|
||||||
Le prototype U-SON “dérive”: les signaux deviennent instables.
|
|
||||||
Pour protéger U-SON, l’équipe doit:
|
|
||||||
(1) stabiliser une référence scientifique (LA 440 Hz),
|
|
||||||
(2) passer la règle de Zone 4 (installation de l’Électron Fou) via un code piano-alphabet,
|
|
||||||
(3) récupérer la clé finale (QR “WIN”) cachée aux Archives.
|
|
||||||
stakes: >
|
|
||||||
Le vrai test n’est pas la vitesse: c’est la coopération, la précision et le calme.
|
|
||||||
reveal_finale: >
|
|
||||||
Zacus réapparaît: c’était 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.
|
|
||||||
lore_truths:
|
|
||||||
- "Zone 4 = installation personnelle de l’Électron Fou."
|
|
||||||
- "Piano-alphabet brouillé: lettres collées en ordre aléatoire sur touches blanches."
|
|
||||||
- "Ancre: A est placé sur la touche correspondant au LA 440 Hz."
|
|
||||||
|
|
||||||
stations:
|
|
||||||
- id: STATION_ONDES
|
|
||||||
act: 1
|
|
||||||
name: "Atelier des Ondes"
|
|
||||||
focus: "Stabiliser LA 440 Hz pour recaler U-SON."
|
|
||||||
firmware_anchor_step: "STEP_LA_DETECTOR"
|
|
||||||
|
|
||||||
- id: STATION_ZONE4_PIANO
|
|
||||||
act: 2
|
|
||||||
name: "Zone 4 — Studio de Résonance (Piano Alphabet brouillé)"
|
|
||||||
focus: "Trouver et jouer le code LEFOU (L-E-F-O-U) via lettres sur touches blanches."
|
|
||||||
firmware_anchor_step: "STEP_LEFOU_DETECTOR"
|
|
||||||
clue_soft: "En Zone 4, les lettres comptent plus que les notes. A est sur le LA 440."
|
|
||||||
clue_hard: "Le code est le nom du propriétaire: LEFOU."
|
|
||||||
|
|
||||||
- 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."
|
|
||||||
|
|
||||||
puzzles:
|
|
||||||
- id: PUZZLE_LA_440
|
|
||||||
act: 1
|
|
||||||
type: "audio / stabilisation"
|
|
||||||
objective: "Produire un LA 440 Hz stable."
|
|
||||||
firmware_step: "STEP_LA_DETECTOR"
|
|
||||||
|
|
||||||
- id: PUZZLE_PIANO_ALPHABET_5
|
|
||||||
act: 2
|
|
||||||
type: "piano / code lettres (mapping brouillé)"
|
|
||||||
objective: "Jouer 5 touches correspondant aux lettres du code."
|
|
||||||
firmware_step: "STEP_LEFOU_DETECTOR"
|
|
||||||
mapping_rule_real: >
|
|
||||||
Les 26 lettres A–Z sont collées sur des touches blanches dans un ordre aléatoire.
|
|
||||||
Une seule ancre est vraie: A est placé sur le LA 440 Hz.
|
|
||||||
code_word_5_letters: "LEFOU"
|
|
||||||
sequence_letters: ["L","E","F","O","U"]
|
|
||||||
hint_progression:
|
|
||||||
soft: "A est sur le LA. Cherchez les lettres, pas les notes."
|
|
||||||
medium: "Le mot est un nom (propriétaire Zone 4)."
|
|
||||||
hard: "Jouez L-E-F-O-U."
|
|
||||||
|
|
||||||
- id: PUZZLE_QR_WIN
|
|
||||||
act: 2
|
|
||||||
type: "recherche / scan"
|
|
||||||
objective: "Scanner le QR final WIN."
|
|
||||||
firmware_step: "STEP_QR_DETECTOR"
|
|
||||||
qr_payload: "WIN"
|
|
||||||
location: "Derrière le portrait aux Archives"
|
|
||||||
|
|
||||||
acts:
|
|
||||||
- act: 1
|
|
||||||
title: "Acte 1 — Stabiliser U-SON (LA 440) (≈45 min)"
|
|
||||||
goal: "Valider Étape 1 via LA 440 Hz."
|
|
||||||
- act: 2
|
|
||||||
title: "Acte 2 — Zone 4 (piano LEFOU) + Archives (QR WIN) (≈60 min)"
|
|
||||||
goal: "Valider Étape 2, puis scanner QR WIN derrière le portrait."
|
|
||||||
|
|
||||||
audio:
|
|
||||||
packs:
|
|
||||||
- pack_id: PACK_BOOT_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.
|
|
||||||
Les lettres sont brouillées.
|
|
||||||
Une seule est sûre : A est sur le LA.
|
|
||||||
Cinq lettres. Cinq touches.
|
|
||||||
tts_prompt_excerpt: >
|
|
||||||
Voix plus urgente mais pas anxiogène.
|
|
||||||
Effets: bips rapides d’alarme, puis radio léger.
|
|
||||||
|
|
||||||
- pack_id: PACK_CONFIRM_WIN_ETAPE1
|
|
||||||
tracks:
|
|
||||||
- track_id: confirm_win1
|
|
||||||
script_fr: >
|
|
||||||
Signal stabilisé.
|
|
||||||
Étape un validée.
|
|
||||||
Liaison confirmée.
|
|
||||||
|
|
||||||
- pack_id: PACK_CONFIRM_WIN_ETAPE2
|
|
||||||
tracks:
|
|
||||||
- track_id: confirm_win2_archives
|
|
||||||
script_fr: >
|
|
||||||
Étape deux validée.
|
|
||||||
Rendez-vous aux Archives.
|
|
||||||
La clé finale est derrière le portrait.
|
|
||||||
|
|
||||||
qr:
|
|
||||||
payload: "WIN"
|
|
||||||
location: "Derrière le portrait dans la Salle des Archives"
|
|
||||||
lead_in_clue: "Regarde là où Zacus surveille toujours."
|
|
||||||