feat: zacus v1 (scenario, kit MJ, printables/audio pipeline, docs, licenses)
This commit is contained in:
+7
-11
@@ -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 à l’usage pour 6–14 enfants pendant 60–90 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
@@ -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
@@ -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.
|
S’applique à : 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.
|
S’applique à : 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.
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -1,9 +1,6 @@
|
|||||||
# Le Mystère du Professeur Zacus — kit d’enquête (printables + guide MJ + hardware)
|
# Le Mystère du Professeur Zacus — kit d’enquête (printables + guide MJ + audio)
|
||||||
|
|
||||||
Kit d’enquête pour anniversaire (9–11 ans), ambiance laboratoire / campus scientifique.
|
Kit d’enquête pour anniversaire (6–14 enfants, 60–90 minutes), ambiance laboratoire / campus scientifique.
|
||||||
|
|
||||||
## Aperçu visuel
|
|
||||||

|
|
||||||
|
|
||||||
## Aperçu visuel
|
## Aperçu visuel
|
||||||

|

|
||||||
@@ -11,63 +8,59 @@ Kit d’enquête pour anniversaire (9–11 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 (6–14 enfants)
|
- distribution des rôles (modulable 6–14 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 d’enquête
|
- ordres d’impression standardisés
|
||||||
- badges détective
|
- badges détective, fiches d’enquête, cartes personnages, zones
|
||||||
- règles en 1 page
|
|
||||||
- ordre d’impression
|
|
||||||
|
|
||||||
### 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 d’ajout et d’examen 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`
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
# Quickstart
|
||||||
|
|
||||||
|
## En un coup d’œil
|
||||||
|
- Public : 6 à 14 enfants, 60–90 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 l’accueil 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 d’enquête (10-65 min) : station par station, fiche d’enquê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 t’inspirant 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).
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# Style guide
|
||||||
|
|
||||||
|
## Tonalité générale
|
||||||
|
- Français léger, accessible, phrases courtes.
|
||||||
|
- Préfère des verbes d’action, un vocabulaire spatial (laboratoire, station, énigme) et des termes d’enquête (preuve, mobile, hypothèse).
|
||||||
|
- Maintiens le respect des consignes (noir & blanc, pas de marques externes, jeux pour 6–14 enfants). Mentionne la plage 60–90 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 60–90 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 l’orientation 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
@@ -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
@@ -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 41‑46) and a CC BY-SA 4.0 / GPL-3.0-or-later pair (lines 48‑51), 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 25‑29), 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 s’ils restent ou disparaissent lors d’un 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.
|
|
||||||
|
|||||||
@@ -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."
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Incident audio
|
||||||
|
Une voix affolée dit : "Le système détecte un pic thermique et la porte des prototypes s’est verrouillée ! Quelqu’un 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."
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Intro audio
|
||||||
|
Une voix métallique lit : "Attention équipe Zacus, le professeur s’adresse à vous. Les capteurs 3A clignotent, j’ai 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."
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Solution audio
|
||||||
|
Une voix grave conclut : "Zacus est sain et sauf. Lila Caron a agi par conviction pour garder l’Auréole hors des mains des militaires. Elle a déclenché la procédure d’urgence pour pouvoir stabiliser la machine plus longtemps. Merci équipe Zacus, vous avez mené l’enquête à son terme."
|
||||||
@@ -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: "6–14 ans (9–11 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: l’empreinte 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 l’expé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 l’emplacement 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 s’est ouverte manuellement."
|
||||||
|
- id: mobile
|
||||||
|
type: narration
|
||||||
|
clue: "Le parchemin évoque un message : 'Je ne veux pas que l’Auréole devienne un jouet des contrats militaires alors que les cobayes humains sont encore instables.'"
|
||||||
|
effect: "Donne le mobile moral unique et pousse vers l’accusation finale."
|
||||||
|
solution:
|
||||||
|
culprit: Lila Caron, l’assistante 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 qu’elle connaissait mieux que quiconque.
|
||||||
|
Elle craignait que la direction confie l’Auré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:
|
||||||
|
- "L’empreinte de gants est celle qu’elle 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 n’aurait jamais eu le temps d’ajuster l’Auré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 l’Auréole était essentielle.
|
||||||
@@ -1,3 +1,28 @@
|
|||||||
# Checklist matériel
|
# Checklist matériel
|
||||||
|
|
||||||
> À compléter : matériel d’impression, 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 d’enquê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 l’ambiance
|
||||||
|
- [ ] Lumières tamisées (lampes de bureau, guirlandes à LED)
|
||||||
|
- [ ] Accessoires laboratoire : éprouvettes, flacons colorés, filtres
|
||||||
|
- [ ] Éléments visuels imprimés : plan de l’Auré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.
|
||||||
|
|||||||
@@ -1,3 +1,24 @@
|
|||||||
# Distribution des rôles
|
# Distribution des rôles
|
||||||
|
|
||||||
> À compléter : tableau de distribution + variantes 6–14 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 (60–90 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 d’enquê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 l’histoire.
|
||||||
|
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 n’a é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 (6–8 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.
|
||||||
|
|||||||
@@ -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 6–14.
|
||||||
- **Mobile** (pourquoi ?)
|
- `duration_minutes` doit indiquer une fourchette 60–90.
|
||||||
- **Méthode** (comment ?)
|
- `solution_unique` doit être `true` et les preuves dans `solution.proof` doivent justifier l’accusation principale.
|
||||||
- **Chronologie** (dans quel ordre ?)
|
|
||||||
|
|
||||||
Règle d’or : 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 qu’il 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 9–11 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 d’enquê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é, l’enquê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 10–15 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 d’une progression visuelle simple et d’un seul point de friction majeur.
|
||||||
|
|||||||
@@ -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 (6–14 enfants) concentrée pendant 60–90 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 d’indices 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 d’une 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 d’enquête ou à poser une question « pourquoi ? » à l’équipe.
|
||||||
|
|
||||||
|
> Astuce : les enfants peuvent inventer un cri de code (« Zacus ! ») pour signaler qu’ils ont besoin d’un 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 6–14 enfants pour 60–90 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 à l’envers.
|
||||||
|
|
||||||
|
### 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 l’entrée finale décrivant le mobile (« je ne veux pas que l’Auré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 d’ouvrir trop de cartes d’un coup.
|
||||||
|
- Pose les cartes de rôle près de l’accueil 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.
|
||||||
|
|||||||
@@ -1,3 +1,33 @@
|
|||||||
# Script minute-par-minute
|
# Script minute-par-minute
|
||||||
|
|
||||||
> À compléter : déroulé de l’accueil à la révélation finale (rythme enfants 9–11 ans).
|
> Version prête à jouer pour 6 à 14 enfants, 60–90 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 d’ambiance scientifique discrète (option portable) et ajuste la lumière pour laisser l’ombre 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 d’enquête du Campus.".
|
||||||
|
- Donne les badges, répartis les rôles (chef de piste, expert matériel, mémoire) et lis l’intro 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 d’enquê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 « j’ai besoin d’un 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 d’enquê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 l’audio `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 l’audio `game/prompts/audio/accusation.md` pour simuler l’arrivée du professeur ou d’un témoin.
|
||||||
|
- Si la conclusion ne colle pas, remobilise la piste clé (preuve unique). Sinon, confirme avec l’audio `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 l’anecdote 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 l’audio d’introduction externe.
|
||||||
|
|||||||
@@ -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 l’Auré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 d’urgence 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, l’empreinte du professeur sur la baie de transfert et l’alarme ciblée. Cela indique qu’un 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 d’un 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 qu’elle a utilisé ses doigts (gants) pour brouiller l’écriture et qu’elle connaissait bien le calendrier de Zacus.
|
||||||
|
4. **Mobile moral** : la dernière phrase écrite dans le carnet secret exprime son refus d’abandonner l’expé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 l’accusation finale, silencieux dans les archives. Il remercie les enfants : sans le temps gagné par Lila, il n’aurait pas pu stabiliser l’Auréole et canaliser l’énergie vers la bibliothèque des étudiants plutôt que le secteur militaire.
|
||||||
|
|||||||
@@ -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, d’imprimer rapidement et de respecter la durée (60–90 min) du jeu. Si tu veux ajouter une déclinaison, copie les prompts et adapte la version (ex. `indices-v2`).
|
||||||
@@ -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é d’elle.
|
||||||
|
- É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 qu’elles restent abstraites (formes simples), afin d’éviter tout visage détaillé et de conserver l’ambiance N&B.
|
||||||
@@ -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 d’archive avec des lignes floutées, une date nette (18h15), la mention « Journal de capteurs » en haut.
|
||||||
|
- Mobile moral : encadre la phrase « Je protège l’Auréole des usages militaires » dans un style de note griffonnée.
|
||||||
|
- Badge coupable : une étiquette au nom de Lila Caron, entourée d’un 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 qu’elles sont reliées.
|
||||||
@@ -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 d’une 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.”
|
||||||
Executable
+70
@@ -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())
|
||||||
Executable
+107
@@ -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())
|
||||||
Reference in New Issue
Block a user