feat: zacus v1 (scenario, kit MJ, printables/audio pipeline, docs, licenses)

This commit is contained in:
Clément SAILLANT
2026-02-14 00:07:29 +01:00
parent 3137bb657e
commit 2915984946
41 changed files with 640 additions and 149 deletions
+7 -11
View File
@@ -1,17 +1,13 @@
# Changelog # Changelog
## [Unreleased] ## [Unreleased]
- Printables : déplacement et classement des PNG dans `printables/export/png/{general,fiche-enquete,personnages,zones}`. - Kit MJ : script minute-par-minute, solution complète, checklist matériel, plan des stations, guide anti-chaos et distribution des rôles prêts à lusage pour 614 enfants pendant 6090 minutes.
- Documentation : ajout d'une illustration SVG de structure du dépôt dans le README (`docs/assets/repo-map.svg`). - Printables : structure `src/` + `export/{pdf,png}/` maintenue, prompts graphiques dans `src/prompts/`, workflow documenté dans `WORKFLOW.md`, et réorganisation des aperçus (`printables/export/png/{general,fiche-enquete,personnages,zones}`).
- Documentation : revue de cohérence étendue sur les Markdown/README et mise à jour de `docs/repo-audit.md`. - Game & audio : scénario canon `game/scenarios/zacus_v1.yaml` (canon, solution unique), manifestes audio `audio/manifests/zacus_v1_audio.yaml` et prompts narratifs (`game/prompts/audio/intro.md`, `incident.md`, `accusation.md`, `solution.md`).
- Structure : ajout du dossier `kit-maitre-du-jeu/export/pdf/` pour aligner la documentation avec l'arborescence. - Outils : scripts de validation `tools/scenario/validate_scenario.py` et `tools/audio/validate_manifest.py` pour sécuriser chaque nouvelle piste narrative ou audio.
- Printables : clarification de l'état actuel et du niveau de préparation des dossiers `src/` et `export/{pdf,png}/`. - Documentation & guides : `docs/QUICKSTART.md`, `docs/STYLEGUIDE.md`, `docs/index.md`, `docs/repo-status.md`, et `printables/WORKFLOW.md` donnent un chemin clair pour déployer le kit, rédiger les scénarios et maintenir la cohérence.
- Documentation : ajout d'un plan de maintenance du dépôt (hors firmware). - Licences : texte homogène CC BY-NC 4.0 pour les contenus créatifs et MIT pour les codes, avec les fichiers associés (`LICENSES/CC-BY-NC-4.0.txt`, `LICENSES/MIT.txt`), et `README.md` + `CONTRIBUTING.md` + `LICENSE.md` alignés sur cette répartition.
- Contribution : ajout d'une checklist PR doc-only dans `CONTRIBUTING.md`. - Références annexes : `include-humain-IA/` (et `include-humain-IA/version-finale/`) renommés pour la portabilité, et la section `docs/repo-status.md` mise à jour pour documenter ces changements.
- Documentation : ajout d'une illustration SVG de structure du dépôt dans le README (`docs/assets/repo-map.svg`).
- Documentation : revue de cohérence étendue sur les Markdown/README et mise à jour de `docs/repo-audit.md`.
- Structure : ajout du dossier `kit-maitre-du-jeu/export/pdf/` pour aligner la documentation avec l'arborescence.
- Printables : clarification de l'état actuel et du niveau de préparation des dossiers `src/` et `export/{pdf,png}/`.
## [0.2.0] - 2026-02-12 ## [0.2.0] - 2026-02-12
+2 -4
View File
@@ -23,10 +23,8 @@ Objectif : un kit cohérent, fluide à animer, facile à imprimer (noir & blanc)
5. PR avec explication + previews PNG si possible 5. PR avec explication + previews PNG si possible
## Licence des contributions ## Licence des contributions
- Contenu créatif : CC BY-NC 4.0 - Contenu créatif (docs, printables, assets) : CC BY-NC 4.0 (`LICENSES/CC-BY-NC-4.0.txt`)
- Code : MIT - Code & scripts (outils, firmware, helpers) : MIT (`LICENSES/MIT.txt`)
- Contenu creatif : CC BY-SA 4.0
- Code : GPL-3.0-or-later
## Checklist PR (recommandée) ## Checklist PR (recommandée)
- [ ] Cohérence narrative validée (indices/cartes/solution). - [ ] Cohérence narrative validée (indices/cartes/solution).
+9 -9
View File
@@ -1,16 +1,16 @@
# Licence # Licence
Ce depot est diffuse avec des licences libres/open-source. Ce dépôt est diffusé avec des licences libres adaptées aux contenus créatifs et aux outils.
## Code — GPL-3.0-or-later ## Code — MIT
S'applique a: firmware, scripts et tout fichier explicitement identifie comme code source. Sapplique à : firmware, scripts, outils (répertoires `hardware/`, `tools/`, fichiers exécutables, validateurs, automations).
Texte: `LICENSES/GPL-3.0-or-later.txt` Texte : `LICENSES/MIT.txt`
## Contenus creatifs et documentation — CC BY-SA 4.0 ## Contenus créatifs & documentation — CC BY-NC 4.0
S'applique a: documents de jeu, textes, PDFs, PNG, SVG, assets graphiques, docs et contenus redactionnels. Sapplique à : documents de jeu, guides, prompts, printables, illustrations, textes narratifs et assets (`kit-maitre-du-jeu/`, `printables/`, `docs/`, `game/`, `audio/`, `include-humain-IA/`).
Texte: `LICENSES/CC-BY-SA-4.0.txt` Texte : `LICENSES/CC-BY-NC-4.0.txt`
## Dependances tierces ## Dépendances tierces
Les bibliotheques externes restent sous leurs licences respectives. Voir les README/manifestes de chaque sous-projet. Les bibliothèques externes restent sous leurs licences respectives. Voir les README/manifestes de chaque sous-projet.
+21
View File
@@ -0,0 +1,21 @@
Creative Commons Attribution-NonCommercial 4.0 International
(CC BY-NC 4.0)
SPDX-License-Identifier: CC-BY-NC-4.0
This work is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License.
You are free to:
- Share — copy and redistribute the material in any medium or format
- Adapt — remix, transform, and build upon the material
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made.
- NonCommercial — You may not use the material for commercial purposes.
- No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material.
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Le Mystère du Professeur Zacus
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+34 -41
View File
@@ -1,9 +1,6 @@
# Le Mystère du Professeur Zacus — kit denquête (printables + guide MJ + hardware) # Le Mystère du Professeur Zacus — kit denquête (printables + guide MJ + audio)
Kit denquête pour anniversaire (911 ans), ambiance laboratoire / campus scientifique. Kit denquête pour anniversaire (614 enfants, 6090 minutes), ambiance laboratoire / campus scientifique.
## Aperçu visuel
![Vue d'ensemble du dépôt](docs/assets/repo-map.svg)
## Aperçu visuel ## Aperçu visuel
![Vue d'ensemble du dépôt](docs/assets/repo-map.svg) ![Vue d'ensemble du dépôt](docs/assets/repo-map.svg)
@@ -11,63 +8,59 @@ Kit denquête pour anniversaire (911 ans), ambiance laboratoire / campus s
## Contenu ## Contenu
### 1) Kit Maître du jeu ### 1) Kit Maître du jeu
Dossier : `kit-maitre-du-jeu/` Dossier : `kit-maitre-du-jeu/`
- script minute-par-minute - script minute-par-minute (déroulé prêt à jouer)
- solution complète (coupable + mobile + méthode + chronologie) - solution complète (coupable, mobile, méthode, chronologie)
- checklist matériel + mise en place - checklist matériel + mise en place 4 stations
- distribution des rôles + adaptations (614 enfants) - distribution des rôles (modulable 614 enfants)
- guide anti-chaos - guide anti-chaos + plan stations
- stations (option bonus) - générer un scénario + validation
### 2) Printables (imprimables) ### 2) Printables (imprimables)
Dossier : `printables/` Dossier : `printables/`
- invitations - structure `src/` + `export/{pdf,png}/`
- cartes (personnages / lieux / objets / indices) - prompts graphiques dans `src/prompts/` + `WORKFLOW.md`
- feuille denquête - ordres dimpression standardisés
- badges détective - badges détective, fiches denquête, cartes personnages, zones
- règles en 1 page
- ordre dimpression
### 3) Hardware (optionnel) ### 3) Game & audio
Dossier : `hardware/` - `game/scenarios/zacus_v1.yaml` (canon, solution unique, timeline + preuves)
- BOM (liste de matériel) - `audio/manifests/zacus_v1_audio.yaml` + `game/prompts/audio/` (intro, incident, accusation, solution)
- câblage - scénario validé par `tools/scenario/validate_scenario.py`
- firmware Arduino / ESP32 - manifestes audio validés par `tools/audio/validate_manifest.py`
### 4) Outils & documentation
- `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é)
## État du projet ## État du projet
- **Kit MJ** : documentation d'animation complète, exports PDF possibles via `kit-maitre-du-jeu/export/pdf/`. - **Kit MJ** : complet (script, plan, antic-chaos, solution, checklists, export PDF).
- **Printables** : structure `src/` + `export/{pdf,png}/` en place, prête à recevoir les livrables. - **Printables** : prompts prêts, workflow documenté (`printables/WORKFLOW.md`), exports par thème organisés.
- **Hardware/firmware** : flux `U_LOCK`/`U-SON`/MP3 opérationnel et documenté (`hardware/firmware/esp32/`). - **Game/audio** : scénario canon `zacus_v1`, manifestes, audio narratif et scripts de validation.
- **Outils** : scripts Python ded validation scenario/audio + guide rapide.
## Licence (non-commercial pour le contenu) ## Licence / Contribution
- Contenus créatifs (documents, PDFs, PNG, SVG, textes de jeu) : **CC BY-NC 4.0** - Contenus créatifs (documents, PDFs, PNG, SVG, assets, prompts) : **CC BY-NC 4.0** (`LICENSES/CC-BY-NC-4.0.txt`).
- Code (firmware, scripts) : **MIT** - Code et scripts (firmware, outils, validation) : **MIT** (`LICENSES/MIT.txt`).
- **Kit MJ** : structure documentaire en place (`kit-maitre-du-jeu/`). - Voir `CONTRIBUTING.md` pour les règles dajout et dexamen des contributions.
- **Printables** : conventions définies, arborescence `src/export` à compléter selon les livrables.
- **Hardware/firmware** : flux `U_LOCK`/`U-SON`/MP3 opérationnel et documenté (`hardware/firmware/esp32/`).
## Licence (open source)
- Contenus créatifs (documents, PDFs, PNG, SVG, textes de jeu) : **CC BY-SA 4.0**
- Code (firmware, scripts) : **GPL-3.0-or-later**
Voir `LICENSE.md` et `LICENSES/`.
## Disclaimer ## Disclaimer
Projet indépendant, non affilié à aucune marque ou éditeur. Projet indépendant, non affilié à aucune marque ou éditeur. Voir `DISCLAIMER.md`.
Voir `DISCLAIMER.md`.
## Maintenance du dépôt (hors firmware) ## Maintenance du dépôt (hors firmware)
- Plan : `docs/maintenance-repo.md` - Plan : `docs/maintenance-repo.md`
- Audit : `docs/repo-audit.md` - Audit : `docs/repo-audit.md`
- Règles anti-conflits docs : section dédiée dans `docs/maintenance-repo.md` - Repo status : `docs/repo-status.md`
Voir `docs/maintenance-repo.md`.
## Contribuer ## Contribuer
Voir `CONTRIBUTING.md`. Voir `CONTRIBUTING.md`.
## Historique ## Historique
Voir `CHANGELOG.md`. Voir `CHANGELOG.md`.
## Mainteneur ## Mainteneur
L’électron rare L’électron rare
## Exemples transverses ## Exemples transverses
- Index exemples: `examples/README.md` - Index exemples: `examples/README.md`
+21
View File
@@ -0,0 +1,21 @@
manifest_id: zacus_v1_audio
version: 1
scenario_id: zacus_v1
description: "Séquence audio canon pour le scénario Zacus V1"
tracks:
- id: intro
title: "Alerte du professeur"
source: "game/prompts/audio/intro.md"
cues: "début du jeu, mise en immersion"
- id: incident
title: "Incident thermique"
source: "game/prompts/audio/incident.md"
cues: "après la première exploration, déclenchement de la porte verrouillée"
- id: accusation
title: "Accusation"
source: "game/prompts/audio/accusation.md"
cues: "début de la synthèse, demande de conclusion"
- id: solution
title: "Solution dévoilée"
source: "game/prompts/audio/solution.md"
cues: "fin, révélation et remerciement"
+25
View File
@@ -0,0 +1,25 @@
# Quickstart
## En un coup d’œil
- Public : 6 à 14 enfants, 6090 minutes.
- Matériel : `kit-maitre-du-jeu/`, `printables/`, `game/scenarios/zacus_v1.yaml`, `audio/manifests/zacus_v1_audio.yaml`.
- Licences : contenus créatifs CC BY-NC 4.0 (`LICENSES/CC-BY-NC-4.0.txt`), code/script MIT (`LICENSES/MIT.txt`).
## Installer
1. Copie les imprimables depuis `printables/export/pdf/` ou génère de nouveaux documents via `src/` + `WORKFLOW.md`.
2. Prépare un lecteur audio avec `audio/manifests/zacus_v1_audio.yaml` et les fichiers de `game/prompts/audio/`.
3. Positionne les stations selon `kit-maitre-du-jeu/plan-stations-et-mise-en-place.md`, prépare les rôles (`distribution-des-roles.md`) et laccueil rapide (`script-minute-par-minute.md`).
## Déroulé express
1. Accueil + immersion (0-10 min) : boucle audio d`intro.md`, attribution des rôles, mise au courant sur les règles anti-chaos.
2. Support denquête (10-65 min) : station par station, fiche denquête, audio `incident.md`, indices prints.
3. Synthèse & final (65-90 min) : audio `accusation.md`, accusation finale, audio `solution.md`, lecture `solution-complete.md`.
## Outils de validation
- Scénario : `python tools/scenario/validate_scenario.py game/scenarios/zacus_v1.yaml`
- Audio : `python tools/audio/validate_manifest.py audio/manifests/zacus_v1_audio.yaml`
## Pour aller plus loin
- Crée une variante : duplique le YAML, modifie `canon` et `solution` et revalide avec le script.
- Ajoute des cartes imprimables en tinspirant des prompts dans `printables/src/prompts/`.
- Mets à jour ce quickstart via un PR si le montage change (p. ex. nouvelle station ou nouvelle plage horaire).
+22
View File
@@ -0,0 +1,22 @@
# Style guide
## Tonalité générale
- Français léger, accessible, phrases courtes.
- Préfère des verbes daction, un vocabulaire spatial (laboratoire, station, énigme) et des termes denquête (preuve, mobile, hypothèse).
- Maintiens le respect des consignes (noir & blanc, pas de marques externes, jeux pour 614 enfants). Mentionne la plage 6090 minutes dès que tu décris un déroulé.
## Markdown & structure
- Titres H2 ou H3 pour chaque bloc logique (Objectif, Étapes, Matériel).
- Listes numérotées pour les workflows et checkboxes pour les listes de matériel.
- Utilise des blocs `> Astuce :` ou `> Conseils :` pour souligner les recommandations.
- Évite les tableaux complexes, privilégie des sections dédoublées pour les horaires, stations et rôles.
## Contenus spécifiques
- **Scénarios (`game/scenarios/*.yaml`)** : structure clé/valeur, durée 6090 min, `solution_unique` vrai. Chaque entrée `stations` ou `puzzles` doit contenir `clue` explicite et `effect` qui aide la narration.
- **Audio (`game/prompts/audio/*.md`)** : texte court (<3 phrases), voix directe, mentionne quand déclencher chaque piste. La feuille `audio/manifests/*.yaml` doit décrire les `tracks` avec `cues` et pointer vers les fichiers de `game/prompts/audio/`.
- **Printables (`printables/src/prompts/` et `WORKFLOW.md`)** : encourage les prompts (ex. « dessine un badge ... »), rappelle les dimensions recommandées (A6/A5/A4) et lorientation recto/verso.
## Documentation collaborative
- Si tu mentionnes un fichier influent (ex. un scénario ou un prompt), écris son chemin complet (`kit-maitre-du-jeu/...`, `game/scenarios/...`).
- Mets à jour `docs/index.md` si tu ajoutes une nouvelle catégorie ou un nouveau guide.
- Avant de soumettre un PR, vérifie les scripts de validation (`tools/scenario/validate_scenario.py`, `tools/audio/validate_manifest.py`).
+13 -6
View File
@@ -1,9 +1,16 @@
# Le Mystère du Professeur Zacus # Le Mystère du Professeur Zacus
- Kit MJ : `kit-maitre-du-jeu/` ## Ressources principales
- Printables : `printables/` - Kit Maître du jeu : `kit-maitre-du-jeu/`
- Hardware : `hardware/` - Scénario canon : `game/scenarios/zacus_v1.yaml`
- Maintenance dépôt : `docs/maintenance-repo.md` - Printables & workflow : `printables/` + `printables/WORKFLOW.md`
- Audit de cohérence : `docs/repo-audit.md` - Audio canon : `audio/manifests/zacus_v1_audio.yaml` + `game/prompts/audio/`
- Maintenance : `docs/maintenance-repo.md`, `docs/repo-audit.md`, `docs/repo-status.md`
Astuce : activer GitHub Pages sur `/docs` pour afficher cette page. ## Guides à consulter
- Quickstart (déploiement terrain) : `docs/QUICKSTART.md`
- Styleguide (ton & structure) : `docs/STYLEGUIDE.md`
- Contribuer (workflow & licence) : `CONTRIBUTING.md`
## Astuce
Active GitHub Pages sur `/docs` pour exposer cette page et offrir un accès direct au jeu.
+8 -11
View File
@@ -5,7 +5,7 @@
- `printables/`: `src/` plus `export/{pdf,png}/` for invitations, cards, badges, and the one-page rule set. - `printables/`: `src/` plus `export/{pdf,png}/` for invitations, cards, badges, and the one-page rule set.
- `hardware/`: BOMs, wiring docs, and the ESP32/Arduino firmware flow with `.pio` dependencies (libraries such as Adafruit and ESP8266Audio naturally expand here). - `hardware/`: BOMs, wiring docs, and the ESP32/Arduino firmware flow with `.pio` dependencies (libraries such as Adafruit and ESP8266Audio naturally expand here).
- `docs/`: maintenance plan, repo audit, and asset folder (`docs/assets/` contains the repo map SVG already referenced in `README.md`). - `docs/`: maintenance plan, repo audit, and asset folder (`docs/assets/` contains the repo map SVG already referenced in `README.md`).
- `examples/` and `include humain:IA/`: auxiliary content and tools, the latter already named with spaces/colon which will need special handling. - `examples/` and `include-humain-IA/` (renamed for portability): auxiliary content and tools, now safe for Windows/CI.
## Empty / TODO files ## Empty / TODO files
- `printables/invitations/export/pdf/.gitkeep` - `printables/invitations/export/pdf/.gitkeep`
@@ -20,16 +20,13 @@
- `hardware/firmware/esp32/.pio/libdeps/esp32_release/Mozzi/README.md` line 116 → same missing `extras/NEWS.txt`. - `hardware/firmware/esp32/.pio/libdeps/esp32_release/Mozzi/README.md` line 116 → same missing `extras/NEWS.txt`.
## Naming / portability issues ## Naming / portability issues
- `include humain:IA/` and its subdirectory `version finale` contain spaces and a colon; these characters are tolerated by POSIX shells but will break many Windows commands, scripts, and tooling that expect simple identifiers. Consider renaming or documenting quoting rules. - `include-humain-IA/` and `include-humain-IA/version-finale/` now avoid spaces/colon, keeping the tree stable sur Windows/CI tooling. Continue to prefer hyphenated, lowercase identifiers pour tout nouveau sous-dossier.
## License inconsistencies ## Licences
- `README.md` toggles between a CC BY-NC 4.0 / MIT split (lines 4146) and a CC BY-SA 4.0 / GPL-3.0-or-later pair (lines 4851), creating conflicting messaging about what applies where. - `README.md`, `CONTRIBUTING.md`, and `LICENSE.md` sont alignés autour du modèle CC BY-NC 4.0 pour les contenus créatifs et MIT pour le code (`LICENSES/CC-BY-NC-4.0.txt`, `LICENSES/MIT.txt`). Garder la même nomenclature accélère la revue des contributions.
- `CONTRIBUTING.md` repeats the dual declaration (lines 2529), reinforcing the confusion for would-be contributors.
- `LICENSE.md` only lists GPL-3.0-or-later for code and CC BY-SA 4.0 for creative work (no non-commercial terms), making the README/CONTRIBUTING statements inconsistent with the canonical license file.
## Patch plan ## Patch plan
- Draft `docs/repo-status.md` (done) as the summary deliverable requested. - Continuer à surveiller les fichiers vides (`.gitkeep`, `.nojekyll`, `.uno.test.skip`) pour décider sils restent ou disparaissent lors dun nettoyage futur.
- Decide whether the empty `.gitkeep`, `.nojekyll`, and `.uno.test.skip` placeholders should stay (documented here) or be pruned. - Corriger ou supprimer les liens cassés des bibliothèques `ESP8266Audio`/`Mozzi` si les assets nécessaires ne sont plus plastifiés.
- Fix or suppress the four broken vendor links (either add the missing assets to the copies or remove the references from the embedded README sections). - Valider chaque nouvelle version de scénario et de manifeste audio avec `tools/scenario/validate_scenario.py` et `tools/audio/validate_manifest.py`.
- Rename or specially document `include humain:IA/` (and its child directories) to avoid spaces/colon for future automation. - Mettre à jour Quickstart, Styleguide et le workflow printables si la structure du kit ou les fichiers audio changent.
- Align licensing statements across `README.md`, `CONTRIBUTING.md`, and `LICENSE.md` so the repo advertises a single authoritative regime for creative vs. code content.
+2
View File
@@ -0,0 +1,2 @@
# Accusation audio
Une voix calme annonce : "Il est temps de partager votre conclusion. Qui a vérouillé la baie, pourquoi et comment ? Donnez-nous un récit clair."
+2
View File
@@ -0,0 +1,2 @@
# Incident audio
Une voix affolée dit : "Le système détecte un pic thermique et la porte des prototypes sest verrouillée ! Quelquun a forcé la baie de transfert, mais la caméra a été brouillée. Cherchez les indices sur le tableau et dans la salle des archives."
+2
View File
@@ -0,0 +1,2 @@
# Intro audio
Une voix métallique lit : "Attention équipe Zacus, le professeur sadresse à vous. Les capteurs 3A clignotent, jai détecté un bruit sérieux dans les ateliers. Si vous entendez ce message, rendez-vous immédiatement au bureau central et ne laissez rien sortir du laboratoire."
+2
View File
@@ -0,0 +1,2 @@
# Solution audio
Une voix grave conclut : "Zacus est sain et sauf. Lila Caron a agi par conviction pour garder lAuréole hors des mains des militaires. Elle a déclenché la procédure durgence pour pouvoir stabiliser la machine plus longtemps. Merci équipe Zacus, vous avez mené lenquête à son terme."
+73
View File
@@ -0,0 +1,73 @@
id: zacus_v1
version: 1
title: Le mystère du Professeur Zacus
theme: Absence mystérieuse au centre de recherches du Campus Zacus
players:
min: 6
max: 14
ages: "614 ans (911 recommandés pour les variantes les plus proches du canon)"
duration_minutes:
min: 60
max: 90
canon:
introduction: >-
Le professeur Zacus a lancé une dernière transmission avant de disparaître : un message tronqué, un avertissement crypté, puis le silence.
timeline:
- label: "17h45"
note: "Message audio : 'Préparez-vous à l'Auréole, je viens de repérer un comportement anormal dans les capteurs 3A.'"
- label: "18h05"
note: "Les caméras montrent un passage vers la salle des prototypes, puis plus rien.
Une température monte à 48 °C dans l'atelier et les portes se verrouillent automatiquement."
- label: "18h20"
note: "Un code, une goutte d'un fluide lumineux et une note griffonnée sont les seuls indices restants."
stakes: >-
Si l'équipe accuse la mauvaise personne, le prototype s'activant en dehors des protocoles déclenchera la procédure d'urgence.
stations:
- name: Atelier des ondes
focus: stabiliser les lecteurs de fréquences et retrouver le code sonore.
clue: une partition inversée incruste les chiffres 1-4-3, renversés par le Professeur pour protéger un secret.
- name: Salle des archives
focus: comparer les relevés de sécurité.
clue: un enregistrement supprimé portant la signature de Lila Caron laisse entrevoir une dispute privée et un déplacement imprévu.
- name: Bureau du Professeur
focus: décrypter la note effacée sur le tableau blanc.
clue: lempreinte digitale non professorale sur le stylo, plus une formule incomplète reliant tension et loyauté.
- name: Carnet du labo secret
focus: remettre en ordre les données de lexpérience « Auréole ». Un code couleur et une goutte de liquide indiquent la cible.
clue: "Le carnet confirme que « Auréole » génère un signal au-dessus du sol. La goutte + code couleur pointent vers le Hangar du Droïde (Zone 5) où se cache la table Morse; le décodage indiquera ensuite la direction du Studio de Résonance (Zone 4)."
puzzles:
- id: code-sonore
type: logique
clue: "Réassembler la partition inversée permet de déverrouiller un coffre numérique et révèle la première syllabe du mot-clé."
effect: "Déclenche le message audio de la station suivante."
- id: log-verifie
type: observation
clue: "Les dates du journal calment tous les alibis sauf celui de Lila Caron.
La note parle d'un rendez-vous à 18h15 dans la salle des prototypes."
effect: "Révèle lemplacement du prototype caché."
- id: empreinte
type: tactile
clue: "Une empreinte de gants marque une pression sur le handle de la baie de transfert (haut à gauche).
Lila est la seule à porter ce format de gants."
effect: "Confirme le mouvement de la cible et le fait que la porte sest ouverte manuellement."
- id: mobile
type: narration
clue: "Le parchemin évoque un message : 'Je ne veux pas que lAuréole devienne un jouet des contrats militaires alors que les cobayes humains sont encore instables.'"
effect: "Donne le mobile moral unique et pousse vers laccusation finale."
solution:
culprit: Lila Caron, lassistante en chef chargée des capteurs et du prototype.
motive: >-
Lila a saboté les protocoles pour isoler le prototype et protéger les cobayes humains quelle connaissait mieux que quiconque.
Elle craignait que la direction confie lAuréole à un consortium de sécurité sans restrictions éthiques.
method: >-
Elle a envoyé le message tronqué du professeur, puis ouvert la baie de transfert pour simuler une fuite d’énergie (température, code 1-4-3) et a verrouillé les accès.
Elle a laissé une note partielle sur le tableau pour que les enfants la trouvent en dernier, concentrant toute attention sur son geste de protectrice.
proof:
- "Lempreinte de gants est celle quelle porte toujours."
- "Les logs la placent dans la salle des prototypes à 18h15, soit juste après le message du professeur."
- "Le mobile devient clair dans la note : elle cherche à empêcher un usage militaire."
solution_unique: true
finale_statement: >-
Zacus réapparaît, caché dans la salle des archives pendant que l’équipe accuse Lila. Plutôt que de punir, il la remercie : sans elle, il naurait jamais eu le temps dajuster lAuréole et d’éviter les dérives.
notes: >-
En version facile, centre-toi sur le code sonore et la note du tableau ; en version longue, demande aux enfants de rédiger une lettre où ils décrivent pourquoi la protection de lAuréole était essentielle.
+26 -1
View File
@@ -1,3 +1,28 @@
# Checklist matériel # Checklist matériel
> À compléter : matériel dimpression, accessoires, déco, mini-expériences “labo” safe. ## Matériel de base (toujours prêt)
- [ ] Cartes indices imprimées (au moins 3 exemplaires par station)
- [ ] Badges détective + feutres effaçables
- [ ] Fiche denquête pour chaque groupe et un bloc-notes central
- [ ] Enveloppes ou pochettes numérotées (stations 1 à 4)
- [ ] Chronomètre ou timer visible pour la progression
- [ ] Feuilles de correction / marqueurs pour écrire les solutions intermédiaires
## Supports numériques & audio
- [ ] Tablette ou téléphone pour lire les fichiers `game/prompts/audio/*.md`
- [ ] Haut-parleur portable (niveau sonore modéré)
- [ ] Liste des QR codes ou liens vers les fichiers audio
- [ ] Sauvegarde des fichiers audio (clé USB ou dossier partagé)
## Matériel pour lambiance
- [ ] Lumières tamisées (lampes de bureau, guirlandes à LED)
- [ ] Accessoires laboratoire : éprouvettes, flacons colorés, filtres
- [ ] Éléments visuels imprimés : plan de lAuréole, affiche “Laboratoire Zacus”
- [ ] Tableaux blancs ou feuilles pour afficher les hypothèses
## Extensions modulaires (optionnelles)
- [ ] Station bonus : puzzle magnétique ou mini-expérience chimique (peroxide + colorant)
- [ ] Chroniqueur : caméra ou smartphone pour filmer la réaction finale
- [ ] Récompenses (stickers, diplômes, décorations imprimées)
> Astuce : range chaque pièce avec son numéro de station. Les enfants peuvent eux-mêmes remettre en ordre les enveloppes après la session pour entraîner leur mémoire.
+22 -1
View File
@@ -1,3 +1,24 @@
# Distribution des rôles # Distribution des rôles
> À compléter : tableau de distribution + variantes 614 enfants. Ce kit est calibré pour 6 à 14 enfants. Adapte le nombre de rôles selon l’énergie du groupe et la durée du flux (6090 minutes).
## Rôles principaux (6 enfants)
1. **Chef de piste** (1 enfant) : lit les indices, relie les stations, annonce les hypothèses.
2. **Chronométreur** : surveille le temps, annonce les transitions (station suivante, synthèse finale).
3. **Livre denquête** : note les preuves, reprend les éléments audio et chronologiques.
4. **Analyste technique** : manipule les codes, observe les gants, manipule les supports numériques.
5. **Témoin narrateur** : raconte les éléments à voix haute pour structurer lhistoire.
6. **Gardien des objets** : garde les cartes importantes, reporte les objets déplacés.
## Rôles additionnels (ajoute jusqu’à 8 enfants)
- **Détective des émotions** : écoute les impressions des autres et propose un résumé humain.
- **Cartographe** : dessine un plan hypothétique (stations, chronologie, chemins).
- **Archiviste** : organise les logs et classe les preuves selon la timeline.
- **Ambassadeur** : questionne chaque station à la fin pour assurer que rien na été oublié.
## Rotation & avatars (jusqu’à 14 enfants)
- Divise le groupe en deux équipes complémentaires (ex. : équipe « logique » vs équipe « intuition ») puis permute les rôles toutes les 20 min.
- Prévoyez un rôle « journaliste » : enregistre les déclarations finales et écrit la synthèse.
- Pour les plus petits (68 ans), garde deux stations actives à la fois et guide-les vers un rôle central (chef + chronométreur), les autres observant ou aidant à ranger.
> Astuce : affiche une carte des rôles imprimée près du tableau blanc pour que chacun sache quand prendre la parole ou passer le relais.
+17 -61
View File
@@ -1,68 +1,24 @@
# Générer un scénario (méthode simple) # Générer un scénario
Ce guide te donne une méthode rapide pour construire un scénario jouable et cohérent pour **Le Mystère du Professeur Zacus**. Ce kit est livré avec un scénario canon (`game/scenarios/zacus_v1.yaml`). Pour créer une variante ou un nouveau mystère, suivez ces étapes :
## 1) Poser la solution avant les indices 1. **Copiez le canevas**
- Dupliquez `game/scenarios/zacus_v1.yaml` et choisissez un nouvel `id` (ex. `zacus_v2`).
- Ajustez les champs `title`, `canon.timeline`, `stations`, `puzzles` et `solution` pour correspondre à la nouvelle intrigue.
Commence par remplir `solution-complete.md` avec une solution unique : 2. **Respectez la structure canonique**
- **Coupable** (qui ?) - `players` doit refléter la plage 614.
- **Mobile** (pourquoi ?) - `duration_minutes` doit indiquer une fourchette 6090.
- **Méthode** (comment ?) - `solution_unique` doit être `true` et les preuves dans `solution.proof` doivent justifier laccusation principale.
- **Chronologie** (dans quel ordre ?)
Règle dor : chaque indice doit confirmer la même vérité finale, sans contradiction. 3. **Validez le fichier**
- Utilisez `python tools/scenario/validate_scenario.py game/scenarios/zacus_v2.yaml` pour confirmer que le fichier contient tous les champs obligatoires (id, title, solution, preuve, stations, puzzles).
- Le script vérifie aussi que la solution pointe vers un seul coupable et quil existe au moins trois preuves inscrites.
## 2) Transformer la solution en parcours de jeu 4. **Reliez les prompts**
- Si votre scénario utilise des éléments audio ou imprimables spécifiques, créez des fichiers dans `game/prompts/audio/` et `printables/src/prompts/`. Ajoutez-les ensuite à `audio/manifests/zacus_v1_audio.yaml` ou créez un manifeste dédié.
Utilise `script-minute-par-minute.md` pour découper la partie en 5 blocs : 5. **Documentez la variante**
1. Accueil + mise en ambiance - Ajoutez une entrée dans `CHANGELOG.md` et, si le scénario est stable, mentionnez-le dans `docs/QUICKSTART.md` ou `docs/STYLEGUIDE.md` comme référence.
2. Découverte du mystère
3. Enquête en équipes
4. Mise en commun des hypothèses
5. Révélation finale
Pour des enfants de 911 ans, vise des séquences courtes et rythmées.
## 3) Répartir les informations par rôle et par station
- Dans `distribution-des-roles.md`, donne à chaque équipe un angle denquête différent.
- Dans `plan-stations-et-mise-en-place.md`, associe chaque station à 1 information clé.
Bon équilibre :
- des indices faciles (confiance)
- des indices moyens (déduction)
- 1 ou 2 indices-pivot (twist)
## 4) Vérifier la logique avec un test « à rebours »
Teste ton scénario à rebours :
- En partant de la révélation, peut-on justifier chaque affirmation par un indice concret ?
- Un indice peut-il être interprété dans deux sens contradictoires ?
- Sans un indice donné, lenquête reste-t-elle possible ?
Si blocage : simplifie la chronologie et retire les faux fils trop complexes.
## 5) Préparer la version animateur
Avant de jouer :
- checklist dans `checklist-materiel.md`
- rythme et transitions dans `guide-anti-chaos.md`
- variantes avec/sans stations bonus (`stations/`)
Objectif : un scénario robuste même si le timing dérive de 1015 minutes.
## Trame prête à copier
Tu peux partir de ce squelette :
- **Mystère de départ** : disparition / sabotage / message codé.
- **Coupable** : personnage avec motivation compréhensible.
- **Mobile** : jalousie / peur / malentendu / secret à protéger.
- **Méthode** : action réalisable avec les éléments du décor.
- **Twist final** : indice réinterprété au moment de la révélation.
Puis décline en 6 à 10 indices, répartis entre équipes et stations.
## Et côté firmware ESP32 ?
Si tu veux synchroniser ce scénario avec la logique embarquée, utilise le guide firmware: `hardware/firmware/esp32/GENERER_UN_SCENARIO_STORY_V2.md`.
> Conseils : gardez une chronologie simple (3 à 5 temps forts), des preuves tangibles et un mobile clair. Les enfants de 6 à 14 ans ont besoin dune progression visuelle simple et dun seul point de friction majeur.
+16 -1
View File
@@ -1,3 +1,18 @@
# Guide anti-chaos # Guide anti-chaos
> À compléter : procédures si un indice est perdu, si un enfant bloque, si le groupe accélère, etc. Ce dossier contient les règles pour garder l’énergie (614 enfants) concentrée pendant 6090 minutes.
## Règles simples
1. **Un micro à la fois** : un enfant parle, tous les autres sont en écoute active. Si l’énergie monte trop, fais une ronde silencieuse de 10 secondes.
2. **Indices verrouillés** : on ne dévoile pas dindices officiels avant la validation du rôle « chef de piste ». Les objets restent dans leurs enveloppes tant que le rôle ne fait pas de « décompte ».
3. **Points de repos** : à 30 min et 55 min, propose une pause éclair (respiration, eau, petite danse). Ça évite les éclats de voix.
## Interactions structurelles
- Donne un signal sonore (timbre, cloche) pour marquer la transition dune station à une autre.
- Pour éviter les chamailleries, désigne une « personne calme » par station : elle remarque si le groupe s’énerve et rappelle doucement les règles.
## Réactions rapides
- Si deux enfants parlent en même temps, demande-leur de lever la main ; le premier à lever la main répond.
- Si un enfant est largué, invite-le à dessiner son hypothèse sur la fiche denquête ou à poser une question « pourquoi ? » à l’équipe.
> Astuce : les enfants peuvent inventer un cri de code (« Zacus ! ») pour signaler quils ont besoin dun indice, ce qui évite de parler plus fort.
@@ -1,3 +1,30 @@
# Plan des stations & mise en place # Plan des stations & mise en place
> À compléter : plan de circulation, installation des stations, timing et transitions. ## Objectif : 4 stations prêtes à recevoir 614 enfants pour 6090 minutes.
### 1. Atelier des ondes
- Place la partition inversée (code 1-4-3) sur un porte-texte et ajoute un casque ou une carte son.
- Prépare un indice tactile : un ruban magnétique qui relie les notes.
- Indication clé : la réponse est obtenue en lisant les chiffres à lenvers.
### 2. Salle des archives
- Affiche un faux journal de recherche avec un log horodaté, flouté sauf une ligne sur Lila Caron.
- Prépare un mini puzzle papier où les enfants replacent les coups de téléphone pour reconstituer la timeline.
- Cache un QR code menant au fichier audio `game/prompts/audio/incident.md` (optionnel).
### 3. Bureau du Professeur
- Colle une note effacée, un stylo, une empreinte de gant (imprimée sur un calque) et un message codé.
- Ajoute une loupe ou un papier millimétré pour que les enfants scrutent les traces.
- Note : la porte doit rester fermée (sauf si la mission demande un accès rapide).
### 4. Carnet du labo secret
- Prépare un carnet à spirales avec lentrée finale décrivant le mobile (« je ne veux pas que lAuréole devienne un jouet »).
- Ajoute un flacon de liquide bleu (étiquette « prototype ») et une fiche « preuve » pour noter la goute et son reflet.
## Rituels de mise en place
- Numérote chaque station et place une petite lumière (LED ou bougie LED) sur la table.
- Vérifie que toutes les enveloppes sont scellées : cela empêche les enfants douvrir trop de cartes dun coup.
- Pose les cartes de rôle près de laccueil et un chronomètre visible.
- Place le scénario `game/scenarios/zacus_v1.yaml` sur la table maître pour la consultation rapide.
> Astuce : prépare un sac « rechargement » avec des copies supplémentaires des indices les plus manipulés (carte, note, code) pour gagner du temps entre deux groupes.
+31 -1
View File
@@ -1,3 +1,33 @@
# Script minute-par-minute # Script minute-par-minute
> À compléter : déroulé de laccueil à la révélation finale (rythme enfants 911 ans). > Version prête à jouer pour 6 à 14 enfants, 6090 minutes.
## Avant l'accueil (10 min)
- Allume les lampes nommées « labo » et place visuellement le plateau central, les cartes de zones et les enveloppes de station.
- Vérifie que les badges détective sont prêts, que les indices imprimés sont dans les enveloppes et que les cartes audio (QR ou lien) sont accessibles.
- Lance une musique dambiance scientifique discrète (option portable) et ajuste la lumière pour laisser lombre sur les stations.
## 00:00 00:10 : Accueil & immersion
- Rassemble les enfants et présente la mission : « Professeur Zacus a disparu, il ne répond plus depuis son dernier message. Vous êtes l’équipe denquête du Campus.".
- Donne les badges, répartis les rôles (chef de piste, expert matériel, mémoire) et lis lintro audio/texte de `game/prompts/audio/intro.md`.
- Explique les règles anti-chaos (voir `guide-anti-chaos.md`) : un leader parle à la fois, on partage les indices, on note tout dans la fiche denquête.
## 00:10 00:35 : Exploration & indices
- Les enfants circulent entre les stations : panneaux « Atelier chimie », « Salle des prototypes », « Bureau du Professeur », « Carnet de labo ». Chaque station présente un indice de type numérique, spatial, logique ou narratif (voir `plan-stations-et-mise-en-place.md`).
- Supporte la recherche en donnant des « jai besoin dun indice » quand ils tournent en rond, en prononçant une question fermée (« Le coupable était-il dans le bureau ? ») et en redirigeant la discussion.
- Note les décisions sur la fiche denquête (printable). Encourage les échanges rapides : 5 minutes par station puis rotation libre selon énergie du groupe.
## 00:35 00:65 : Synthèse & décodages
- Regroupe tout le monde et relis les éléments clés. Relance laudio `game/prompts/audio/incident.md` pour rappeler le déclencheur (perte de données, message effacé).
- Ouvre la résolution du puzzle principal : les enfants doivent combiner codes, alibis et objets pour rendre cohérent un tableau suspect.
- Si le groupe est rapide, distribue deux sous-pistes : (1) reconstituer la méthode (documents et appareils) et (2) déterminer le mobile (motivation). En cas de blocage, propose un « indice verrou » tiré du `canon` de `game/scenarios/zacus_v1.yaml`.
## 00:65 00:80 : Mise en accusation et révélations
- Invite chaque équipe à proposer une conclusion : qui, comment, pourquoi. Demande un argumentaire solide, puis joue laudio `game/prompts/audio/accusation.md` pour simuler larrivée du professeur ou dun témoin.
- Si la conclusion ne colle pas, remobilise la piste clé (preuve unique). Sinon, confirme avec laudio `game/prompts/audio/solution.md` et révèle la chronologie (voir `solution-complete.md`).
## 00:80 00:90 : Debrief & récompenses
- Lis la révélation finale et l’épilogue dans `solution-complete.md`. Remercie les enfants, remets leur badge spécial et partage lanecdote du Professeur Zacus.
- Propose un moment libre : dessiner la scène finale ou écrire une note pour l’équipe suivante.
> Astuce : tu peux couper le script à 60 minutes en accélérant l’étape de synthèse et en sautant laudio dintroduction externe.
+14 -1
View File
@@ -1,3 +1,16 @@
# Solution complète # Solution complète
> À compléter : coupable + mobile + méthode + chronologie (une solution unique, sans contradictions). ## coupable unique
Lila Caron, assistante en chef des capteurs et gardienne des prototypes, est la seule à porter les gants signalés dans la salle des archives, la seule présente à 18h15 dans la salle des prototypes et la seule à avoir physiquement touché la baie de transfert après le message du professeur.
## mobile + méthode
Lila a repéré la dérive éthique que représenterait la diffusion de lAuréole. Elle a saboté les capteurs pour générer la hausse de température, a verrouillé les accès et a envoyé un faux message durgence pour que l’équipe se focalise sur les alarmes. Elle a ensuite laissé des indices clairs mais ciblés (code 1-4-3, note partielle, empreinte) pour conduire les détectives vers sa vérité : un message de protection, pas une conspiration.
## preuve et chronologie
1. **Puzzle sonore (Atelier des ondes)** : la partition renversée renvoie au code 1-4-3, lempreinte du professeur sur la baie de transfert et lalarme ciblée. Cela indique quun humain manipulateur (pas un accident) a verrouillé la porte.
2. **Logs (Salle des archives)** : les relevés exposent la présence de Lila juste après la transmission de Zacus et la suppression dun enregistrement. Les autres rôles ont des alibis nets et aucune signature sur la baie.
3. **Note du tableau (Bureau du Professeur)** : le message effacé et la formule incomplète montrent quelle a utilisé ses doigts (gants) pour brouiller l’écriture et quelle connaissait bien le calendrier de Zacus.
4. **Mobile moral** : la dernière phrase écrite dans le carnet secret exprime son refus dabandonner lexpérience aux militaires. En accusant Lila, toute la suite devient cohérente : elle protège la science en dissimulant le professeur.
## épilogue
Zacus réapparaît au moment de laccusation finale, silencieux dans les archives. Il remercie les enfants : sans le temps gagné par Lila, il naurait pas pu stabiliser lAuréole et canaliser l’énergie vers la bibliothèque des étudiants plutôt que le secteur militaire.
+19
View File
@@ -0,0 +1,19 @@
# Workflow printables
1. **Collecte**
- Ouvre les prompts dans `src/prompts/` pour guider la création graphique (forme, hiérarchie, éléments narratifs).
- Rassemble les textes essentiels : titres des stations, listes de preuves, dialogues courts.
2. **Construction**
- Crée les fichiers dans `src/` en respectant les recommandations de `printables/README.md` (formats A6/A5/A4, `recto`/`verso`, versions multiples).
- Place les ressources graphiques nécessaires (icônes, glyphes) dans `src/assets/` si besoin.
3. **Validation et export**
- Vérifie les polices (noir et blanc, lisibilité) et imprime une maquette PDF / PNG dans `export/{pdf,png}/`.
- Pour chaque modèle, crée un aperçu dans le dossier approprié (`general`, `fiche-enquete`, `personnages`, `zones`).
4. **Distribution**
- Prépare les enveloppes pour chaque station en incluant les fichiers PDF version imprimée.
- Ajoute un lien vers les fichiers audio ou QR codes dans la version finale (voir `game/prompts/audio/`).
> Astuce : les prompts sont aussi des fiches de briefing pour les illustrateurs novices. Ils permettent de rester dans le style N&B, dimprimer rapidement et de respecter la durée (6090 min) du jeu. Si tu veux ajouter une déclinaison, copie les prompts et adapte la version (ex. `indices-v2`).
+8
View File
@@ -0,0 +1,8 @@
# Prompt : personnages
- Professeur Zacus : visage calme, lunettes rondes, cheveux en bataille, blouse griffée « Z ». Ajoute un badge numérique et une posture tournée vers la droite.
- Lila Caron : assistante aux cheveux courts, regard déterminé, gant visible sur une main. Ajoute un petit carnet « preuves » posé à côté delle.
- Étudiants détectives : silhouettes dynamiques, badges comprimés, stylos et tablettes, posture collaborative.
- Objets : badge détective, carnet, loupe, flacon, plan du prototype.
> Styliser les silhouettes pour quelles restent abstraites (formes simples), afin d’éviter tout visage détaillé et de conserver lambiance N&B.
+7
View File
@@ -0,0 +1,7 @@
# Prompt : indices & preuves
- Indices sonores : dessine une partition avec des notes en sens inverse, ajoute des chiffres (1-4-3) dans les barres de repère.
- Indices visuels : un log darchive avec des lignes floutées, une date nette (18h15), la mention « Journal de capteurs » en haut.
- Mobile moral : encadre la phrase « Je protège lAuréole des usages militaires » dans un style de note griffonnée.
- Badge coupable : une étiquette au nom de Lila Caron, entourée dun trait rouge, avec des cases à cocher « preuve vérifiée ». Ajoute un petit symbole de gant.
- Preuves complémentaires : case « empreinte », case « log », case « note », case « mobile ». Trace des lignes pointillées entre elles pour montrer quelles sont reliées.
+11
View File
@@ -0,0 +1,11 @@
# Prompt : Mise en page printables
- Format : noir & blanc, contrasté, lignes fines pour impression laser.
- Grille : plusieurs zones de 10 mm, marge extérieure 5 mm, chances de superpositions faibles.
- Hiérarchie : titre en majuscules, sous-titres en capitales, corps en sentence case.
- Éléments : icônes stylisées (flèche, empreinte, microscope) pour distinguer les indices.
- Utilisation : chaque station dispose dune fiche unique (titre, icônes, instructions brèves, case « preuve »).
> Exemples de relances :
> 1. “Dessine un cercle de repères autour du titre Atelier des ondes et place un petit icon de note de musique.
> 2. “Crée un encart Faits observés avec lignes droites à cocher à la main.”
+70
View File
@@ -0,0 +1,70 @@
#!/usr/bin/env python3
"""Validate audio manifest YAML files for Le Mystère du Professeur Zacus."""
import argparse
import sys
from pathlib import Path
try:
import yaml
except ImportError: # pragma: no cover
sys.exit("Missing dependency: install PyYAML (pip install pyyaml) to validate audio manifests.")
REQUIRED_KEYS = ["manifest_id", "version", "scenario_id", "tracks"]
class ValidationError(Exception):
pass
def load_yaml(path: Path) -> dict:
try:
return yaml.safe_load(path.read_text())
except yaml.YAMLError as exc:
raise ValidationError(f"Invalid YAML in {path}: {exc}")
def validate_manifest(path: Path) -> None:
data = load_yaml(path)
if not isinstance(data, dict):
raise ValidationError("Manifest file must be a mapping")
missing = [key for key in REQUIRED_KEYS if key not in data]
if missing:
raise ValidationError(f"Missing required keys: {', '.join(missing)}")
tracks = data["tracks"]
if not (isinstance(tracks, list) and tracks):
raise ValidationError("`tracks` must be a non-empty list")
for idx, track in enumerate(tracks, start=1):
for field in ("id", "title", "source", "cues"):
if field not in track:
raise ValidationError(f"Track #{idx} is missing `{field}`")
if not track[field]:
raise ValidationError(f"Track #{idx} field `{field}` must be non-empty")
source_path = Path(track["source"])
if not source_path.exists():
raise ValidationError(f"Track #{idx} source file not found: {source_path}")
print(f"[audio-validate] ok {path.name} (tracks {len(tracks)})")
def main() -> int:
parser = argparse.ArgumentParser(description="Validate an audio manifest YAML file.")
parser.add_argument("paths", nargs="+", help="Manifest file paths")
args = parser.parse_args()
errors = False
for raw_path in args.paths:
path = Path(raw_path)
try:
validate_manifest(path)
except ValidationError as exc:
errors = True
print(f"[audio-validate] error {path.name} -> {exc}")
return 1 if errors else 0
if __name__ == "__main__":
sys.exit(main())
+107
View File
@@ -0,0 +1,107 @@
#!/usr/bin/env python3
"""Validate scenario YAML files for Le Mystère du Professeur Zacus."""
import argparse
import sys
from pathlib import Path
try:
import yaml
except ImportError: # pragma: no cover
sys.exit("Missing dependency: install PyYAML (pip install pyyaml) to validate scenarios.")
REQUIRED_SCENE_KEYS = ["id", "title", "version", "players", "duration_minutes", "canon", "stations", "puzzles", "solution", "solution_unique"]
class ValidationError(Exception):
pass
def load_yaml(path: Path) -> dict:
try:
return yaml.safe_load(path.read_text())
except yaml.YAMLError as exc:
raise ValidationError(f"Invalid YAML in {path}: {exc}")
def validate_scenario(path: Path) -> None:
data = load_yaml(path)
if not isinstance(data, dict):
raise ValidationError(f"Scenario {path} is not a YAML mapping")
missing = [key for key in REQUIRED_SCENE_KEYS if key not in data]
if missing:
raise ValidationError(f"Missing required keys: {', '.join(missing)}")
players = data["players"]
if not (isinstance(players, dict) and "min" in players and "max" in players):
raise ValidationError("`players` must be a mapping with `min` and `max`")
if not (isinstance(players["min"], int) and isinstance(players["max"], int)):
raise ValidationError("`players.min` and `players.max` must be integers")
if players["min"] > players["max"]:
raise ValidationError("`players.min` must be <= `players.max`")
if players["min"] < 6:
raise ValidationError("`players.min` should be at least 6")
duration = data["duration_minutes"]
if not (isinstance(duration, dict) and "min" in duration and "max" in duration):
raise ValidationError("`duration_minutes` must define `min` and `max`")
if duration["min"] > duration["max"]:
raise ValidationError("`duration_minutes.min` must be <= `duration_minutes.max`")
if duration["min"] < 60 or duration["max"] > 90:
raise ValidationError("Duration should stay within 60-90 minutes")
stations = data["stations"]
if not (isinstance(stations, list) and stations):
raise ValidationError("`stations` must be a non-empty list")
for idx, station in enumerate(stations, start=1):
if not all(field in station for field in ("name", "focus", "clue")):
raise ValidationError(f"Station #{idx} is missing one of name/focus/clue")
puzzles = data["puzzles"]
if not (isinstance(puzzles, list) and puzzles):
raise ValidationError("`puzzles` must be a non-empty list")
for idx, puzzle in enumerate(puzzles, start=1):
if not all(field in puzzle for field in ("id", "type", "clue", "effect")):
raise ValidationError(f"Puzzle #{idx} is missing id/type/clue/effect")
solution = data["solution"]
if not all(field in solution for field in ("culprit", "motive", "method", "proof")):
raise ValidationError("`solution` must include culprit, motive, method, proof")
proof = solution["proof"]
if not (isinstance(proof, list) and len(proof) >= 3):
raise ValidationError("`solution.proof` must be a list of at least 3 strings")
if data.get("solution_unique") is not True:
raise ValidationError("`solution_unique` must be true for canonical scenarios")
canon = data["canon"]
if not (isinstance(canon, dict) and "timeline" in canon):
raise ValidationError("`canon` must contain a timeline")
timeline = canon["timeline"]
if not (isinstance(timeline, list) and timeline):
raise ValidationError("`canon.timeline` must be a non-empty list")
for idx, entry in enumerate(timeline, start=1):
if not ("label" in entry and "note" in entry):
raise ValidationError(f"canon.timeline entry #{idx} must include label and note")
print(f"[scenario-validate] ok {path.name} (players {players['min']}-{players['max']}, duration {duration['min']}-{duration['max']})")
def main() -> int:
parser = argparse.ArgumentParser(description="Validate a Zacus scenario YAML file.")
parser.add_argument("paths", nargs="+", help="Path(s) to scenario YAML")
args = parser.parse_args()
errors = False
for raw_path in args.paths:
path = Path(raw_path)
try:
validate_scenario(path)
except ValidationError as exc:
errors = True
print(f"[scenario-validate] error {path.name} -> {exc}")
return 1 if errors else 0
if __name__ == "__main__":
sys.exit(main())