diff --git a/.gitignore b/.gitignore index 2643d5f..24ddf14 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Runtime et artefacts Godot .godot/ build/ +dist/ # Outillage telecharge par `make setup` (Godot, GUT), non versionne .godot-bin/ diff --git a/CLAUDE.md b/CLAUDE.md index 3f3c736..508f70d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -19,6 +19,7 @@ Le `Makefile` est le seul point d'entrée pour les opérations système. Tenir c - `make content-review` : régénère `docs/review/content-review.md` à partir de `data/` - `make generate-dictation-audio` : génère l'audio provisoire des dictées (voix neuronale Piper via `.venv`, `ffmpeg` requis sur la machine) dans `assets/audio/dictations/`, sans écraser l'existant (`--force` pour régénérer) - `make export-linux` / `make export-windows` : exports dans `build/` +- `make package` : réexporte puis produit les archives distribuables (exécutable unique + licence + crédits + notice) et `SHA256SUMS` dans `dist/` ## Conventions de code diff --git a/Makefile b/Makefile index 4764b66..7ded539 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ PYRIGHT := $(VENV)/bin/pyright PYTHON := $(VENV)/bin/python3 GD_SOURCES := autoload scripts tests -.PHONY: setup run lint format validate-data test check content-review generate-dictation-audio export-linux export-windows +.PHONY: setup run lint format validate-data test check content-review generate-dictation-audio export-linux export-windows package setup: tools/setup.sh @@ -42,3 +42,6 @@ export-linux: export-windows: mkdir -p build/windows $(GODOT_BIN) --headless --path . --export-release "Windows" build/windows/aventuriers_des_mots.exe + +package: + tools/package.sh diff --git a/README-EN.md b/README-EN.md index 09b0c63..c6a284e 100644 --- a/README-EN.md +++ b/README-EN.md @@ -2,7 +2,7 @@ An educational French-language game for 7-9 year olds (French grades CE1-CE2): an offline 2D adventure with an explorable map, a guide character, and grammar, spelling, and dictation exercises. -Open source project, in development. Current status: first playable prototype (scope of cahier-des-charges §15) — boot, profiles, a three-location map, all three exercise types, saves, Linux/Windows exports. Pedagogical content is still minimal (see `docs/specs/decisions.md` for scoping decisions and `docs/specs/cahier-des-charges.md` for the full specification, both in French — this is a French-curriculum product). +Open source project, in development. Current status: version 0.1.0, playable offline on Linux and Windows — profiles, saves, three exercise types (multiple choice, sentence correction, dictation), a CE1 chapter on noun-group agreement (3 rules) and a CE2 chapter on grammatical homophones (a/à, et/est, son/sont, on/ont), 21 missions. All pedagogical content is still `draft` (awaiting validation) and dictation voices are placeholders (see `assets/CREDITS.md`; see `docs/specs/decisions.md` for scoping decisions and `docs/specs/cahier-des-charges.md` for the full specification, both in French — this is a French-curriculum product). ## Tech stack @@ -27,7 +27,10 @@ make run # runs the game | `make validate-data` | validates the JSON files in `data/` | | `make test` | headless tests | | `make check` | lint + validate-data + test, must pass before every commit | +| `make content-review` | regenerates `docs/review/content-review.md` (content validation document) | +| `make generate-dictation-audio` | generates the placeholder dictation audio | | `make export-linux` / `make export-windows` | exports into `build/` | +| `make package` | builds the distributable archives in `dist/` (single executable + license + credits) | ## Structure diff --git a/README.md b/README.md index b3fba93..389b2c6 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Jeu éducatif de français pour les CE1-CE2 (7-9 ans) : une aventure 2D hors ligne, avec une carte à explorer, un personnage guide, et des exercices de grammaire, d'orthographe et de dictées. -Projet open source, en développement. Statut actuel : premier prototype jouable (périmètre du §15 du cahier des charges) — démarrage, profils, carte à trois lieux, trois types d'exercices, sauvegardes, exports Linux/Windows. Contenu pédagogique encore minimal (voir `docs/specs/decisions.md` pour les décisions de cadrage et `docs/specs/cahier-des-charges.md` pour la spécification complète). +Projet open source, en développement. Statut actuel : version 0.1.0, jouable hors ligne sur Linux et Windows — profils, sauvegardes, trois types d'exercices (choix multiple, correction de phrase, dictée), chapitre CE1 « accords dans le groupe nominal » (3 règles) et chapitre CE2 « homophones grammaticaux » (a/à, et/est, son/sont, on/ont), 21 missions. Contenu pédagogique entièrement en brouillon (`draft`, à valider) et voix des dictées provisoires (voir `assets/CREDITS.md` ; voir `docs/specs/decisions.md` pour les décisions de cadrage et `docs/specs/cahier-des-charges.md` pour la spécification complète). ## Pile technique @@ -27,7 +27,10 @@ make run # lance le jeu | `make validate-data` | valide les JSON de `data/` | | `make test` | tests headless | | `make check` | lint + validate-data + test, à passer avant chaque commit | +| `make content-review` | régénère `docs/review/content-review.md` (document de validation du contenu) | +| `make generate-dictation-audio` | génère l'audio provisoire des dictées | | `make export-linux` / `make export-windows` | exports dans `build/` | +| `make package` | produit les archives distribuables dans `dist/` (exécutable unique + licence + crédits) | ## Structure diff --git a/docs/specs/decisions.md b/docs/specs/decisions.md index 4b7c391..2b1eb5a 100644 --- a/docs/specs/decisions.md +++ b/docs/specs/decisions.md @@ -262,3 +262,11 @@ Ajouts à l'arborescence proposée : **Correction** : restauration des accents sur 76 lignes de 44 fichiers de `data/` (champs `instruction`, `question`, `hint`, `explanation`, `statement`, `example`, `title`, `narrative_context` uniquement ; aucun identifiant, `target_text`, mot de dictée ni token modifié, donc aucun lien entre données ni audio touché). Cas particuliers : « a » devenu « à » (préposition) et « annonce » devenu « annoncé ». Le tag interne `feminin` de `review_tags` est conservé (identifiant, non affiché). **Règle pour la suite** : tout texte destiné à l'enfant est écrit avec ses accents dès la rédaction. + +## 29. Production de la version 0.1.0 (relecture du cahier des charges) + +**Relecture** : le §15 (première version jouable) demande un export Linux et Windows ; le §12 demande « une version installable et testée » par plateforme ; le §13 recommande de valider d'abord Linux et Windows, Android/macOS/iOS venant ensuite (hors périmètre, prompt-lancement.md). La version est donc produite pour Linux x86_64 et Windows x86_64. + +**Mise en œuvre** : `config/version="0.1.0"` dans `project.godot` ; PCK embarqué dans l'exécutable (`binary_format/embed_pck=true`) pour un fichier unique par plateforme ; `make package` (`tools/package.sh`) réexporte depuis zéro puis crée `dist/` : `.tar.gz` Linux et `.zip` Windows contenant l'exécutable, `LICENSE`, `README.md`, `README-EN.md`, `CREDITS.md` et une notice `LISEZMOI.txt` (lancement, emplacement des sauvegardes, voix provisoires), plus `SHA256SUMS`. Le script refuse d'empaqueter un document vide (un README tronqué par une erreur d'édition a été détecté pendant cette production). + +**Écarts connus par rapport au cahier des charges, non traités** (hors périmètre du §15 ou nécessitant des ressources/décisions humaines) : voix préenregistrées naturelles (§16 : voix de synthèse provisoires), illustrations originales et personnage guide animé (formes simples, §11/§16), espace adulte et export/restauration des sauvegardes (§9/§10), écran de réglages (volume, taille du texte, animations — `SettingsManager` existe sans interface), tests sur appareils réels et sur d'autres distributions/Windows (§12/§13), contenu entièrement en `draft` (validation humaine requise avant diffusion). diff --git a/docs/testing/manual-checklist.md b/docs/testing/manual-checklist.md index 1926a82..26fb3d0 100644 --- a/docs/testing/manual-checklist.md +++ b/docs/testing/manual-checklist.md @@ -35,6 +35,8 @@ Tout ce qui suit ne peut pas être vérifié sans écran (rendu, mise en page, a ## Exports +- `make package` produit `dist/aventuriers-des-mots-0.1.0-{linux,windows}-x86_64.*` (exécutable unique, PCK embarqué) : sommes de contrôle et lancement headless de l'archive Linux vérifiés ici ; le binaire Windows n'a été vérifié que par son format (PE32+). + - `make export-linux` produit `build/linux/aventuriers_des_mots.x86_64` : lancé et vérifié en headless dans cet environnement, mais **jamais vu à l'écran** ni testé sur une autre distribution (cahier des charges §13 demande un test sur les distributions cibles). - `make export-windows` produit `build/windows/aventuriers_des_mots.exe` : seul le format du binaire (PE32+) a pu être vérifié ici. **Jamais exécuté** (pas de machine Windows ni de Wine disponibles) : à tester sur une vraie machine Windows avant toute diffusion. - Vérifier manuellement que le jeu se comporte correctement en plein écran et en fenêtré sur les deux plateformes. diff --git a/export_presets.cfg b/export_presets.cfg index 3e9124a..d1a4290 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -20,6 +20,7 @@ script_export_mode=2 [preset.0.options] binary_format/architecture="x86_64" +binary_format/embed_pck=true [preset.1] @@ -43,3 +44,4 @@ script_export_mode=2 [preset.1.options] binary_format/architecture="x86_64" +binary_format/embed_pck=true diff --git a/project.godot b/project.godot index f9cc2e0..cfb6ce0 100644 --- a/project.godot +++ b/project.godot @@ -11,6 +11,7 @@ config_version=5 [application] config/name="Les Aventuriers des mots" +config/version="0.1.0" run/main_scene="res://scenes/boot/boot.tscn" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg" diff --git a/tools/package.sh b/tools/package.sh new file mode 100755 index 0000000..3e769fc --- /dev/null +++ b/tools/package.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# Produit les archives distribuables dans dist/ : un executable unique par +# plateforme (PCK embarque) + licence, credits et notice. Reexporte toujours +# depuis zero pour ne jamais empaqueter un build perime. +set -euo pipefail + +cd "$(dirname "$0")/.." + +VERSION="$(sed -n 's/^config\/version="\(.*\)"/\1/p' project.godot)" +[ -n "${VERSION}" ] || { echo "config/version absent de project.godot" >&2; exit 1; } + +rm -rf build dist +make export-linux export-windows >/dev/null + +write_notice() { + cat > "$1/LISEZMOI.txt" <&2; exit 1; } + done + cp LICENSE README.md README-EN.md "${dir}/" + cp assets/CREDITS.md "${dir}/CREDITS.md" + write_notice "${dir}" "${launch}" "${saves}" +} + +LINUX="aventuriers-des-mots-${VERSION}-linux-x86_64" +WINDOWS="aventuriers-des-mots-${VERSION}-windows-x86_64" + +stage "${LINUX}" build/linux/aventuriers_des_mots.x86_64 \ + "./aventuriers_des_mots.x86_64 (au besoin : chmod +x aventuriers_des_mots.x86_64)" \ + "~/.local/share/godot/app_userdata/Les Aventuriers des mots/" +stage "${WINDOWS}" build/windows/aventuriers_des_mots.exe \ + "double-clic sur aventuriers_des_mots.exe" \ + "%APPDATA%\\Godot\\app_userdata\\Les Aventuriers des mots\\" + +(cd dist && tar czf "${LINUX}.tar.gz" "${LINUX}" && zip -qr "${WINDOWS}.zip" "${WINDOWS}") +(cd dist && sha256sum "${LINUX}.tar.gz" "${WINDOWS}.zip" > SHA256SUMS) +rm -rf "dist/${LINUX}" "dist/${WINDOWS}" +ls -lh dist