From d0380a76afe4ae89b16cad6ba4bb139ecab480ce Mon Sep 17 00:00:00 2001 From: Denis Defolie Date: Mon, 12 Oct 2026 11:05:00 +0200 Subject: [PATCH] Add several boards per level, CM1/CM2 levels and the CE1 'plage des sons' pilot board (0.6.0) Co-Authored-By: Claude Sonnet 5.5 --- README-EN.md | 2 +- README.md | 2 +- .../dictations/ce1_cedille_dictee_01.ogg | Bin 0 -> 15541 bytes .../ce1_cedille_dictee_01.ogg.import | 19 +++++ .../dictations/ce1_cedille_dictee_02.ogg | Bin 0 -> 18862 bytes .../ce1_cedille_dictee_02.ogg.import | 19 +++++ .../dictations/ce1_cedille_dictee_03.ogg | Bin 0 -> 20932 bytes .../ce1_cedille_dictee_03.ogg.import | 19 +++++ .../audio/dictations/ce1_m_mbp_dictee_01.ogg | Bin 0 -> 16875 bytes .../dictations/ce1_m_mbp_dictee_01.ogg.import | 19 +++++ .../audio/dictations/ce1_m_mbp_dictee_02.ogg | Bin 0 -> 16861 bytes .../dictations/ce1_m_mbp_dictee_02.ogg.import | 19 +++++ .../audio/dictations/ce1_m_mbp_dictee_03.ogg | Bin 0 -> 19345 bytes .../dictations/ce1_m_mbp_dictee_03.ogg.import | 19 +++++ .../audio/dictations/ce1_s_ss_dictee_01.ogg | Bin 0 -> 16151 bytes .../dictations/ce1_s_ss_dictee_01.ogg.import | 19 +++++ .../audio/dictations/ce1_s_ss_dictee_02.ogg | Bin 0 -> 18872 bytes .../dictations/ce1_s_ss_dictee_02.ogg.import | 19 +++++ .../audio/dictations/ce1_s_ss_dictee_03.ogg | Bin 0 -> 17722 bytes .../dictations/ce1_s_ss_dictee_03.ogg.import | 19 +++++ assets/environments/beach_backdrop.svg | 59 +++++++++++++ assets/environments/beach_backdrop.svg.import | 43 ++++++++++ autoload/audio_manager.gd | 15 +++- autoload/exercise_engine.gd | 70 ++++++++++++++++ autoload/game_manager.gd | 3 + .../ce1_accords_groupe_nominal.json | 9 +- data/curriculum/ce1_sons_et_lettres.json | 15 ++++ .../ce2_homophones_grammaticaux.json | 3 + data/dictations/ce1_cedille_dictee_01.json | 37 ++++++++ data/dictations/ce1_cedille_dictee_02.json | 37 ++++++++ data/dictations/ce1_cedille_dictee_03.json | 42 ++++++++++ data/dictations/ce1_m_mbp_dictee_01.json | 39 +++++++++ data/dictations/ce1_m_mbp_dictee_02.json | 45 ++++++++++ data/dictations/ce1_m_mbp_dictee_03.json | 46 ++++++++++ data/dictations/ce1_s_ss_dictee_01.json | 39 +++++++++ data/dictations/ce1_s_ss_dictee_02.json | 42 ++++++++++ data/dictations/ce1_s_ss_dictee_03.json | 42 ++++++++++ .../ce1/ce1_cedille_correction_01.json | 53 ++++++++++++ .../ce1/ce1_cedille_correction_02.json | 57 +++++++++++++ .../ce1/ce1_cedille_correction_03.json | 49 +++++++++++ .../ce1/ce1_cedille_correction_04.json | 53 ++++++++++++ data/exercises/ce1/ce1_cedille_qcm_01.json | 23 +++++ data/exercises/ce1/ce1_cedille_qcm_02.json | 23 +++++ data/exercises/ce1/ce1_cedille_qcm_03.json | 23 +++++ data/exercises/ce1/ce1_cedille_qcm_04.json | 23 +++++ data/exercises/ce1/ce1_cedille_qcm_05.json | 23 +++++ data/exercises/ce1/ce1_cedille_qcm_06.json | 23 +++++ data/exercises/ce1/ce1_cedille_qcm_07.json | 23 +++++ data/exercises/ce1/ce1_cedille_qcm_08.json | 23 +++++ .../ce1/ce1_m_mbp_correction_01.json | 49 +++++++++++ .../ce1/ce1_m_mbp_correction_02.json | 45 ++++++++++ .../ce1/ce1_m_mbp_correction_03.json | 49 +++++++++++ .../ce1/ce1_m_mbp_correction_04.json | 53 ++++++++++++ data/exercises/ce1/ce1_m_mbp_qcm_01.json | 23 +++++ data/exercises/ce1/ce1_m_mbp_qcm_02.json | 23 +++++ data/exercises/ce1/ce1_m_mbp_qcm_03.json | 23 +++++ data/exercises/ce1/ce1_m_mbp_qcm_04.json | 23 +++++ data/exercises/ce1/ce1_m_mbp_qcm_05.json | 23 +++++ data/exercises/ce1/ce1_m_mbp_qcm_06.json | 23 +++++ data/exercises/ce1/ce1_m_mbp_qcm_07.json | 23 +++++ data/exercises/ce1/ce1_m_mbp_qcm_08.json | 23 +++++ .../exercises/ce1/ce1_s_ss_correction_01.json | 45 ++++++++++ .../exercises/ce1/ce1_s_ss_correction_02.json | 49 +++++++++++ .../exercises/ce1/ce1_s_ss_correction_03.json | 49 +++++++++++ .../exercises/ce1/ce1_s_ss_correction_04.json | 53 ++++++++++++ data/exercises/ce1/ce1_s_ss_qcm_01.json | 23 +++++ data/exercises/ce1/ce1_s_ss_qcm_02.json | 23 +++++ data/exercises/ce1/ce1_s_ss_qcm_03.json | 23 +++++ data/exercises/ce1/ce1_s_ss_qcm_04.json | 23 +++++ data/exercises/ce1/ce1_s_ss_qcm_05.json | 23 +++++ data/exercises/ce1/ce1_s_ss_qcm_06.json | 23 +++++ data/exercises/ce1/ce1_s_ss_qcm_07.json | 23 +++++ data/exercises/ce1/ce1_s_ss_qcm_08.json | 23 +++++ data/localization/fr.json | 13 +-- data/missions/mission_22_seau_et_pelle.json | 12 +++ .../mission_23_panier_coquillages.json | 12 +++ .../missions/mission_24_coquille_murmure.json | 12 +++ .../missions/mission_25_phare_du_petit_c.json | 12 +++ .../mission_26_balancoire_du_port.json | 12 +++ .../mission_27_cerf_volant_parleur.json | 12 +++ .../missions/mission_28_chateau_de_sable.json | 12 +++ .../mission_29_bateau_des_pompiers.json | 12 +++ .../mission_30_tambour_de_la_plage.json | 12 +++ data/rules/regle_c_cedille.json | 9 ++ data/rules/regle_m_devant_mbp.json | 9 ++ data/rules/regle_s_ss.json | 9 ++ data/schemas/curriculum.schema.json | 5 +- data/schemas/dictation.schema.json | 2 +- .../exercise_multiple_choice.schema.json | 2 +- .../exercise_sentence_correction.schema.json | 2 +- data/schemas/rule.schema.json | 2 +- data/schemas/save.schema.json | 2 +- docs/specs/decisions.md | 14 ++++ docs/testing/manual-checklist.md | 6 ++ project.godot | 2 +- scenes/exercises/exercise_host.gd | 5 +- scenes/profiles/profile_create.gd | 37 ++++++-- scenes/profiles/profile_create.tscn | 23 +---- scenes/profiles/profile_select.gd | 2 +- scenes/ui/backdrop.gd | 13 ++- scenes/ui/reward_screen.gd | 6 +- scenes/ui/settings.gd | 2 +- scenes/world/mission_intro.gd | 3 +- scenes/world/world_map.gd | 79 +++++++++++++++--- scenes/world/world_map.tscn | 7 ++ scripts/audio/sound_catalog.gd | 14 ++-- scripts/profiles/school_levels.gd | 24 ++++++ scripts/profiles/school_levels.gd.uid | 1 + scripts/ui/backdrop_kinds.gd | 36 ++++++++ scripts/ui/backdrop_kinds.gd.uid | 1 + tests/audio/test_sound_catalog.gd | 12 +-- tests/data/test_curriculum.gd | 63 ++++++++++++++ tests/data/test_curriculum.gd.uid | 1 + tests/data/test_mission_positions.gd | 38 +++++---- tests/exercises/test_exercise_engine.gd | 16 +++- tests/world/test_settings_scenes.gd | 16 ++++ tests/world/test_world_map.gd | 25 +++++- tools/screenshot.gd | 6 +- 118 files changed, 2421 insertions(+), 111 deletions(-) create mode 100644 assets/audio/dictations/ce1_cedille_dictee_01.ogg create mode 100644 assets/audio/dictations/ce1_cedille_dictee_01.ogg.import create mode 100644 assets/audio/dictations/ce1_cedille_dictee_02.ogg create mode 100644 assets/audio/dictations/ce1_cedille_dictee_02.ogg.import create mode 100644 assets/audio/dictations/ce1_cedille_dictee_03.ogg create mode 100644 assets/audio/dictations/ce1_cedille_dictee_03.ogg.import create mode 100644 assets/audio/dictations/ce1_m_mbp_dictee_01.ogg create mode 100644 assets/audio/dictations/ce1_m_mbp_dictee_01.ogg.import create mode 100644 assets/audio/dictations/ce1_m_mbp_dictee_02.ogg create mode 100644 assets/audio/dictations/ce1_m_mbp_dictee_02.ogg.import create mode 100644 assets/audio/dictations/ce1_m_mbp_dictee_03.ogg create mode 100644 assets/audio/dictations/ce1_m_mbp_dictee_03.ogg.import create mode 100644 assets/audio/dictations/ce1_s_ss_dictee_01.ogg create mode 100644 assets/audio/dictations/ce1_s_ss_dictee_01.ogg.import create mode 100644 assets/audio/dictations/ce1_s_ss_dictee_02.ogg create mode 100644 assets/audio/dictations/ce1_s_ss_dictee_02.ogg.import create mode 100644 assets/audio/dictations/ce1_s_ss_dictee_03.ogg create mode 100644 assets/audio/dictations/ce1_s_ss_dictee_03.ogg.import create mode 100644 assets/environments/beach_backdrop.svg create mode 100644 assets/environments/beach_backdrop.svg.import create mode 100644 data/curriculum/ce1_sons_et_lettres.json create mode 100644 data/dictations/ce1_cedille_dictee_01.json create mode 100644 data/dictations/ce1_cedille_dictee_02.json create mode 100644 data/dictations/ce1_cedille_dictee_03.json create mode 100644 data/dictations/ce1_m_mbp_dictee_01.json create mode 100644 data/dictations/ce1_m_mbp_dictee_02.json create mode 100644 data/dictations/ce1_m_mbp_dictee_03.json create mode 100644 data/dictations/ce1_s_ss_dictee_01.json create mode 100644 data/dictations/ce1_s_ss_dictee_02.json create mode 100644 data/dictations/ce1_s_ss_dictee_03.json create mode 100644 data/exercises/ce1/ce1_cedille_correction_01.json create mode 100644 data/exercises/ce1/ce1_cedille_correction_02.json create mode 100644 data/exercises/ce1/ce1_cedille_correction_03.json create mode 100644 data/exercises/ce1/ce1_cedille_correction_04.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_01.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_02.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_03.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_04.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_05.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_06.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_07.json create mode 100644 data/exercises/ce1/ce1_cedille_qcm_08.json create mode 100644 data/exercises/ce1/ce1_m_mbp_correction_01.json create mode 100644 data/exercises/ce1/ce1_m_mbp_correction_02.json create mode 100644 data/exercises/ce1/ce1_m_mbp_correction_03.json create mode 100644 data/exercises/ce1/ce1_m_mbp_correction_04.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_01.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_02.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_03.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_04.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_05.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_06.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_07.json create mode 100644 data/exercises/ce1/ce1_m_mbp_qcm_08.json create mode 100644 data/exercises/ce1/ce1_s_ss_correction_01.json create mode 100644 data/exercises/ce1/ce1_s_ss_correction_02.json create mode 100644 data/exercises/ce1/ce1_s_ss_correction_03.json create mode 100644 data/exercises/ce1/ce1_s_ss_correction_04.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_01.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_02.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_03.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_04.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_05.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_06.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_07.json create mode 100644 data/exercises/ce1/ce1_s_ss_qcm_08.json create mode 100644 data/missions/mission_22_seau_et_pelle.json create mode 100644 data/missions/mission_23_panier_coquillages.json create mode 100644 data/missions/mission_24_coquille_murmure.json create mode 100644 data/missions/mission_25_phare_du_petit_c.json create mode 100644 data/missions/mission_26_balancoire_du_port.json create mode 100644 data/missions/mission_27_cerf_volant_parleur.json create mode 100644 data/missions/mission_28_chateau_de_sable.json create mode 100644 data/missions/mission_29_bateau_des_pompiers.json create mode 100644 data/missions/mission_30_tambour_de_la_plage.json create mode 100644 data/rules/regle_c_cedille.json create mode 100644 data/rules/regle_m_devant_mbp.json create mode 100644 data/rules/regle_s_ss.json create mode 100644 scripts/profiles/school_levels.gd create mode 100644 scripts/profiles/school_levels.gd.uid create mode 100644 scripts/ui/backdrop_kinds.gd create mode 100644 scripts/ui/backdrop_kinds.gd.uid create mode 100644 tests/data/test_curriculum.gd create mode 100644 tests/data/test_curriculum.gd.uid diff --git a/README-EN.md b/README-EN.md index efad594..a6ba864 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: version 0.5.0, playable offline on Linux and Windows — profiles, saves (with export and restore in the adult area), stars and an item collection, sound effects and music, settings (volumes, text size, animations), a progress dashboard for adults, 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). +Open source project, in development. Current status: version 0.6.0, playable offline on Linux and Windows — profiles, saves (with export and restore in the adult area), stars and an item collection, sound effects and music, settings (volumes, text size, animations), a progress dashboard for adults, three exercise types (multiple choice, sentence correction, dictation), CE1 in two boards (noun-group agreement; sounds and letters) and a CE2 board on grammatical homophones (a/à, et/est, son/sont, on/ont), 30 missions; CM1 and CM2 are planned. 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 diff --git a/README.md b/README.md index 976e1cf..f89352c 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 : version 0.5.0, jouable hors ligne sur Linux et Windows — profils, sauvegardes (avec export et restauration dans l'espace adulte), étoiles et collection d'objets, sons et musique, réglages (volumes, taille du texte, animations), tableau de progrès pour l'adulte, 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). +Projet open source, en développement. Statut actuel : version 0.6.0, jouable hors ligne sur Linux et Windows — profils, sauvegardes (avec export et restauration dans l'espace adulte), étoiles et collection d'objets, sons et musique, réglages (volumes, taille du texte, animations), tableau de progrès pour l'adulte, trois types d'exercices (choix multiple, correction de phrase, dictée), CE1 en deux tableaux (accords dans le groupe nominal ; sons et lettres) et CE2 « homophones grammaticaux » (a/à, et/est, son/sont, on/ont), 30 missions ; CM1 et CM2 sont prévus. 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 diff --git a/assets/audio/dictations/ce1_cedille_dictee_01.ogg b/assets/audio/dictations/ce1_cedille_dictee_01.ogg new file mode 100644 index 0000000000000000000000000000000000000000..77233a3e0d25bda2d2d9f578d456acea7c380d63 GIT binary patch literal 15541 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 literal 0 HcmV?d00001 diff --git a/assets/audio/dictations/ce1_cedille_dictee_01.ogg.import b/assets/audio/dictations/ce1_cedille_dictee_01.ogg.import new file mode 100644 index 0000000..cc79939 --- /dev/null +++ b/assets/audio/dictations/ce1_cedille_dictee_01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bdm0vxnxxkw54" +path="res://.godot/imported/ce1_cedille_dictee_01.ogg-e6552e5f28eccfaef4b40e84445125a8.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce1_cedille_dictee_01.ogg" +dest_files=["res://.godot/imported/ce1_cedille_dictee_01.ogg-e6552e5f28eccfaef4b40e84445125a8.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce1_cedille_dictee_02.ogg b/assets/audio/dictations/ce1_cedille_dictee_02.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a56a6433c3ba92cc1f9e5cd1afd95d4e9d7af51b GIT binary patch literal 18862 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

w@(uU5Y(zzH&x&+zkC1wjUM<0 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�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 Mmi0H0%z3c?3vPNqf&c&j literal 0 HcmV?d00001 diff --git a/assets/audio/dictations/ce1_m_mbp_dictee_01.ogg.import b/assets/audio/dictations/ce1_m_mbp_dictee_01.ogg.import new file mode 100644 index 0000000..c814275 --- /dev/null +++ b/assets/audio/dictations/ce1_m_mbp_dictee_01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bi7a01kq1knvw" +path="res://.godot/imported/ce1_m_mbp_dictee_01.ogg-d2fc4ef0f9901ff6b4afb10ea6a0732d.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce1_m_mbp_dictee_01.ogg" +dest_files=["res://.godot/imported/ce1_m_mbp_dictee_01.ogg-d2fc4ef0f9901ff6b4afb10ea6a0732d.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce1_m_mbp_dictee_02.ogg b/assets/audio/dictations/ce1_m_mbp_dictee_02.ogg new file mode 100644 index 0000000000000000000000000000000000000000..41f4660e369c821642d8ba15044549550dd6ad96 GIT binary patch literal 16861 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/audio/dictations/ce1_m_mbp_dictee_03.ogg.import b/assets/audio/dictations/ce1_m_mbp_dictee_03.ogg.import new file mode 100644 index 0000000..0d79882 --- /dev/null +++ b/assets/audio/dictations/ce1_m_mbp_dictee_03.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://c78pgyq4b1x6b" +path="res://.godot/imported/ce1_m_mbp_dictee_03.ogg-2126902c8207abfcba6a006d9f1e10a5.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce1_m_mbp_dictee_03.ogg" +dest_files=["res://.godot/imported/ce1_m_mbp_dictee_03.ogg-2126902c8207abfcba6a006d9f1e10a5.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce1_s_ss_dictee_01.ogg b/assets/audio/dictations/ce1_s_ss_dictee_01.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3d4e0aa08d974ec7d2b1351cfa2e63838eb92b2d GIT binary patch literal 16151 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 TXCnJSP%pYOIP6yQ)q(#7`dNx% literal 0 HcmV?d00001 diff --git a/assets/audio/dictations/ce1_s_ss_dictee_01.ogg.import b/assets/audio/dictations/ce1_s_ss_dictee_01.ogg.import new file mode 100644 index 0000000..62c40bc --- /dev/null +++ b/assets/audio/dictations/ce1_s_ss_dictee_01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cx7m1ctlcqrov" +path="res://.godot/imported/ce1_s_ss_dictee_01.ogg-8fad4cd28cdf9a8f5365d3d14e9e5b63.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce1_s_ss_dictee_01.ogg" +dest_files=["res://.godot/imported/ce1_s_ss_dictee_01.ogg-8fad4cd28cdf9a8f5365d3d14e9e5b63.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce1_s_ss_dictee_02.ogg b/assets/audio/dictations/ce1_s_ss_dictee_02.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4ea0e3879470d28b25171c88949e8d5ff86199ef GIT binary patch literal 18872 zcmcfobyOWq@FfHWj)g~@@8gA05tHwQU(jf!fO?8QJ)ct6w1}k(a^%_^#&BB z>gx#rI4l1<7emRv_Wa-JwI>whN`PIi4qfo&|B-rO{zHQbfyx-TnsTr*b278Ce0*(9 z202V@jqHp~9Qh$IBM6L@8vZ{l6BKz=qThM?*!%H~B$|xFL38xU*ms8#4GxLHCxs_T&MC^ERaj$|L&2q8NUT$ z03bVuE^Lbq9h0yc85jTnOd$sxi61zhtB8jusn8J7G~gg&01zSVB!lxM!wS@+Of52L zJaXw$bLmT~ErzNYhpUg8ng4Z{1OSCEIKB2b2><#S0|25vU05Dh)Q);=fkq}mU~m~U z;0pk-kanmNRXDQeRO1(X7l8%-&d2_sT?o$=qUd7k|z0!#ofz~TDt*H48=5om}*E9Ov04ypa7QXg{P zr$Sr}z!Ygr_Z)75^!PUw5FR_p12IJ)Z6F0GKVDH1RG4fS2I?nv8e#1x4?z8}pB*R1 zGngMM$1_Bg7o}(gs>4x|srrp;1g@J)cd8Hu8AY)6;s4*oyMNOFVHgvhz&Hj%U?9#v zq>d1L#Q(7c0lu06@h3$p2}df4SgOHTMyWWy;hNVhJ0m9hR%KSjX8y)T@5W|*)@1$0 zWO>#^C(&fJ&PHcWM`zyU|IGhb_k{&~qjn&(4#|>H`I5;0gcAb=U;@5*Tw&Xi5P3vV zYsAu6B$~M=7P+VX3?=>71R@y7tU;1*?mw|nX(Sd}WEQ;&yQCznu(+heGPTg+|2;$J zP?Q1y5&)3&I}l4a5cfO0a`kV9$zcF;01*8`{K=8AKbGw?gvV*I@hj~w94<;~Hvc08 zNR!vp@5BemgOI6!RO0xgrrBiwf6T8F3k^V&4>K-CTCPe>9Mnfut4p7c6F1}eGucpv z=cHH!9)!>oB27_{J-zm!AVv|@vnW|)0RJ#2Aci%la(>BayzQ10BD^<%7{p)nk@sO5 z4Y1Ns2Vk-GQyD8#?xn}eNz)YMt7?wq2PR90|8SC%rlpQk)I=#ZiIujZE`*2_niz60 z2100o1-<~lcUDPIK8~U^Yf-YOG^jt`ND}lr-BFIaKiL_Reh=RnT{=JBF^an=-3jXh zLV^>z2u%h=3;+V;K*^bic?%_!4!MqT3S&ilV}vP!1PW46EJ=@>5|%0sh*gv-?u}K9 zNN`f*K?1p8Dbj;_)fK~-@|BG&nC7PxBboZrwIbSr;|-aLXEilTn|jrq!r5;JxTQ1V z=XgNif;mfB@a&S51ylZ_Fa0A39F%CtP~5v;yrDV>Axx%d{$M z>Q4_~0nesu4s-V=dyZ7?B|BlnI>kd!xhQIW2G6Eyma@l9XH+y!AUrVcm9^S$&Qd3;G7LW-5bhj|F9-u>+G_W+>Z2?daM27XX59|!}; z6eGnC{rQ1dn)KAQSke~7 z@l%>~1$Bv<5uiF;QBZM^q9#K@ZK7rgYn`gmujKd7cr~sk>)}UTxt?;_w*Qx%cs%Xht2f1XO|IP{` zfb`gdcr?Y=F}P_90-~gMv-4vWtqSsSKJMm2v~P$!PZ6Rr1z1WDsvxKe^5--o>I!Ex znW*a^sH)w*bJh0kM01 z5du0kV`=~s61(tw@QpAD3(_Gb8W8U^CN-E2as1K{)ew;cImwAgGntGDOBUBDNK1oz zaiyh->u^y3fX*Hgx+;a03>|#`Ig@_|EX@j^!zvEiBWLTQ>wOh=UwWJZ2%^pkA0X9{V#I4`4}*kz2yd?dNT`7TAj%jE3HO1R()+LUfeM@rvN6mZ-r z{$mtL-2Zj6378q#ghU$Fj>LXB% z9YdA~KzS8rAPfK?3)2-CLS#V=Sy+HF;vkax5uhl20I^qTB!~l%M*LTh#4CzG#03%D z{}ep`Qybz26~w&)#KxpRuL=k%cop#fwELgh|6bhuzf1@;&`3lKkYib=8&DsV*|RnN z(+9}HE*r-wN*WOqAEWp)IX6lK1j<*GMt);7CUr;*2}Ka^G{lWqkRLBXPvJ5qj6fX} zqliS25XG}k7q6g5PaQwSO;-?zBP|U|h!K%2c8*u1qfU5joS-NzNu7WxjhvCMER9^8 zudIle;T$7EOPwDJxr~d4^eu>&mZo-A6rl$dKrFX79#dKpR3Hb5dHFaZbQD1lcBuB-lA=Up z{ggtB2I?cP%V+GtREiBf$1#fFrV|%MXWfa%$CF0P2{7cNNe~@U_|nuc!wuJqYvgrS zg$G#{AVLGMfv^BRIbAXo0FQw94gs133Krc4@byDXK|)2&=@O;^_=LnH;eb%2u&E$s zL<)cBH^%3kLD-y`jhlh!HvcWQFo8c%K#T(L=FQ}Yin_MGvAMOq^H(ol2=3Q}2zUVi z6{V1v7@N~uTs(XNLLy=kQZjOi*C&~ONk~ZO-IOjYka zGcGnp88%Z3r?BYn;So{p0Tvd)Hr7#cx~9QCk=9P0aiM+@5~h~cHc@^75ptHU2@&7@ z{S!?LgWRvOFHEmuEsaM+9zWiFT5roo3yo3AYdN)hy7N#)hPjhVcUi$`gKd*L=)-Sm zQu!)~swBVEaNmRokRnRO(rrNHqUQ%ZZg03S4W(yNfcWlj*|Ng};cqYyzJ?0%U;uLs z_XOX7??MCh1V%Vqb`-xhy=BTJettxivYYtyjKOo;ShkKzy*?d5dDx5KCTMFSwBQM! zcnevDyPIc!!75Em#icJJHYTYIyHlbUK4LDi><`w!ut{;JHHnyw|Y>)Z%KbOc_ z58B}jOJpZJx68HNQxq3-g8h+`Sl3m3jr+s1!&$ft^WO9P>0CgkXPBXaXYLO+sAWA1 zsz_3aGO9S^My6^B#sM$-sC+S4z?iosP(DRI1zw0OyA6e}DDN#1fP>P>nuVbHJb^0K z(0H!i=eoV?T>Uf)ql!T<&-B^z`BXcMWNddVIRN%vRn@7Ty zDA?k;I8(S0u-#mRU5(ZErO|iqf3HccolS0}+37)5csEC#4@ugOqd%#F@ITAomS80^O zw=+EZx$d1ptf^_I+|%u5<5x;_IJ)pbjTNT#Tdn)LdV4x%o@+2Ht!?-0;Y1+8UZ6(^ zy&HG&qbCCIxYNNDI?yi721nOWfh5P%LI`Ag+IN1`{L!e!YuU$v$?`QPXVEqUTdRO$ z0}sY~TiH#^yb^)zTf0lWY?B!Ek7ED)6=Grd)TosHfC%ZRJYwcDO<6%KgTgJ4x-;P( z`TLn+3;>A=_*61CMC#)ZubFTA%lMLOPeYP=TzN*#tIr1B|Lw6Wg6jNb&S&ru{%&P6 zx^77=;tv0QcA8TUg;)FWx*Cdo=NF4O8(k=xZ-y1oMj;5z4^PH4Bd~o1!Aozr=&ezI zigjhBqvhWR<@fz?9v!-aE!safvwz@iVQBKI8wW zVIoP(cz#%%Ln$u9w^v)+Htf1@!+_?6>RLQ0iKIj9Qjrn7y^tXYKT&?G#1`L zyb4AXbgh-rhggz{v+pQ2{ux<;Pog?3I@t`uzbJGS4lCil>H0pndL;vOaE(yrsQU%2 z1Ol)z3%{x}iRpbG-=oR;H`i=vN+5IJc3m7GX#A!d1}OHe->5ck3Vq=4&z+kr~bUmSDrxkW0~Apd#6-M~dFg^SNW6t#(yQ)pRE zYpotMa(`TMnMio8`lbJx6ukD`u#U$yJCnmDjp;$xtUawoCJ)Ak@E6jC9HR3>ONd22 z*v4oPa4Zfx@%W7pNz!gNq@=46&MOU!9vd^^TQx~e_q0pTDz1c>g4Y6)nn4WqwVoz zm6tT6DDMg?o2w+>JugDZyO9bwsOCH#9*yKbTy=^W9FnzEPLt7BIwr`0FreI^a~s5#3+N;e(%mE2wgj)z(yD zCVuqQ>l!a_W^X(x9qeqMDfsOd50Sw0%WneQi2h((j(2<=)JBds_&6KJ2TZ6#Xm)~b zUebJ3%vgA4-v-T)j`$I3gYfPLU6ytm5+YABLNZQ!_YmYQcGEK#-}gJ}n;EX%lv_aS zM-K`)SQ~)*ZW-nLFGy42O5+G5{-%8ynzT*{AocqD_8lgmNS_biNCxBVuzoin6b=_V zScS0$qTeu`a)fm*^~uAI z`hWZ;wcAum2_SyD0K-`K+O{$4E?dL7QuUA3H1vJ}bW-Zx%a5es{HeL_k_GdhJ}jOI zuII$3wJa-%Kdff(S0qnK3y^$uCl7a}06rl=Z4DJ3HEe1$$*%4N$~1Mn^BI@GFCpfZ zVlRBhLv7=*(qU)kGuH4)g%uHykr3a#(?vcpMk9`Y3;4vC-~DEwC4E>pJiL&c^hijg zuPwax&d_bX+FD0CiByQhN7QwFC@SWA|NdF3vZap3YCZOfDjIfg#>A6!;ZZc~`*4$l zt?Juaw=Pj#*+;pq=&Ew#jlYCQQIZ6Jqs7d3)gmI8xR%9rf=*_9^P^82tVf@FsCe4i z`rfECsN6S7Go8ugdv_0Aqm1`!$#Tq6NQB0dUF-0R!|V?_?a7F4=5IApuM@ZBA=(B% znf5Nlgd0I;_%fmQXLXP?fhz)ZQ4iOY06HgXjNdS`do(O3b7%nBJQ~jq5e&(XV~6cG zmITD@$RYh;7(iJ{JcCaFR2zt9bJZ#3;!3K#9Gv?0qO9z3oHPClw9VU|uZ%h)ah?o$ z(}(2}eV2hzr-B`}Xjp&PcP5WZvP{`MZZqzWIWlBOtd3KloO{c??`I;3#`57%v?%5z zYk-B9?8CaU=gJPI@Md4j>ElHU*@yL;qQ{Lahn6^pu}SAb0tIwHKNz87{cBI7^4o#x zBkod9D9=cV<8L0jH|!?ZQ*)=>8|Kq>i%`}*1Q)zX@;K|UGqPUfbq({Q`zXG(T>|yY z&iFY59hN$uMLi7d_(ERd;pBM)rS2Ct{hv~eTAMhn@eDWmv{M0tJJw9>-TPzA7|t7& za(2`bwN;FdgL&R|KW;1xLct>5m;gD{lI2dI*tfVap4+4|q7e(3N6-C0G!B2Nns*i$ zoin~iye7{Ll@ERxf3DVMe7>G;Cs7DBN~V%csiS1kCvVgF__liLtSsWi{w1tEF6$e1V2)W z>3@v$7DDXI#A6f1k>gv(rrdnitbsz`J)6T!o*)CDAkoN<=-f$N_^ft@Yn3nIseoR_ zjHu_9co2Iy;pVvcjZLf*(;fF4ubMpg#4swHWKJ?kGuw@5f#fibD5JNPRy1kUzD%uI zsqbvoDq=dF_q4fT*9V)G-6t8Jr6kxY*fa}7HI51U%GBRX-&NZCB{t}L@mz41KdblA z5wfM>zUh5bV#SSf8QoXs(5QC`Ih4;pvkys*;Fi~3pFE6^vs+)UD!#+K-dxM_kMwtboSaWm>#S@c}4Shp@KHJQ-IGSyRFU*rA} zOP!rfXP?~L{`QyCR@}ErLFQ96HDk?s(SYaio=+Ks&@8>SW2ydODH!mCcf9}`NjbS2 ztxV}VD8QyPRJuwN=}L0e?QR)K*(k7~)X0gW`<uSLKw!A=LiW& zvQvpM56ahiL9HmVRl?Ki?|;{%C1olvz*3EG8@64) zOVPOsg;r$HQcYZuriLozcG$MMEm#Y8GrB9XNOz&H+4L4j4|l@`>idc7;DnN$*}k#C zAgXHCWZ0Ozj!uwY5|{*xZz^bo4mrGA$9hchE@NdZOe*c`Wi<>&?v& z+sCrpmkeSM%%a?<54_-djKSGS@Uj9C3p7O(k?Y+nu7xSg4M#(l&zjThUBuIG9~;yo z#zo-S^o>u>D782du#6{S?oFC4K8F(nSCx%?)K-Z5Y-UE64Wl~IJx;@HJ>c=%d=ox1 z>&24}vd_?L5$^`$vGqFYrP*^0cVh^eHI4XeMH3Uuxn52w?TQ<&c6CUv>bd7qjNm5N zP%w`<9VQPY;IrDfFiV`6sC}~&x5?jUb{NA4+#k}Jkdb8>W%dha3Nnvp8D;bfld=*m z&K8M}#?G=t6Yk#;yR~Tepw9Y2nx>4-JhNEBvk69&I;4*$<)jcoQS~$H^tpe5M?fcs zs+(jQ2A_|2kAB--w11fuMt9`t&$8nu7?Nw2(zH#vANOqbZe&5&jGf z3%Mmp%Md;;#O-F31`I3|LzfA}7X@QIUJv!<2#$ov7ZQU-hDY(7s!UK) zm&!g9WR~t{_tX&G=yf0Ur~;J?=6<`r#5U^wF4>;yXDXi?FCR~OL>8FhOFCN!JN;n{ zI4fx${#?+1%Ue5}nXW<0le1*qAww|uQZJb8(JSfu?Ey6_TdeqTY8`Zv`$x*)2v8qbol#xXkaZx+eLpxfoI>`H9(KP z)fdbH5FyS1Z_xyR@|Ur9`^@|dRGEWs7RLFJW?HcR{?5YvdZ*2xSfoI|D9DUGms^WA zGd*&-JMzRA=_9p(c154+A0*>WM#tO!J_B~52&k8G^n#qzp={W)_qiI&D~^-NK2FL8!ZuFKSU<$C~;0-2lcMFUp;!w?0Qi)FH#?95+IC4sNCOiPfM=1j8q*U5hB$BO6VwOHC87D1FP z**%y2Q5hCAr5-zlrQRfrtPTtl(wk#h-^$F}gM|3R=W|9sB-~nwZhdCSS)FcngP%9J zO{}NJzrSduU-5D8%^u>B%su~RGNge^Di*)yiL~&%`9-Em?&&5jOTVULJa_0{o_=k% z$E1S|WHz$@3Uw`*KG;|e;dg^q$O5ORN%$sNwQV(Cok!sY6XlE*$J;qqxkI*>3HFFl zCpSyWL%POV2uTTl8^{}$n_!ob$!Glmt+=0xr`+h}rnax$NPt&Aq}^ZGOx*^5zMgxq zu&VsN^W3^eT-XPfFqfvXjB)Kmx#~J)gK6~Lnsr63Z2PR`p66Bx@PW_*qZ>->J#=c6 z4kI*axwm3Cdy{#+cb7Y_*+QMmDM7xeS#c=xQ!EM`(?)UjT%W$m{Tv->;S7JHeU+au zv*u=WJ3cPc(bCQx3Ag@RW0s=CR{egO=wMr2{YCH8MeRfR(3TU9HnWJ;QRX4TJBfqk zP&{rv4W1^U+skVeg_9e;q}w>4T_RFB7M*Q>r`@;wpgQAcsZ1f~S;x(ARtE1ktC|;e z-f~a}*i~_r+x_Sg3=G(3Q3}>{xm5(M_O-VXWMi>RG_R7ofC{59j%-G`@8+2p~;mL(E4Z zlvxw-D%we>Ln=v-?&eVL%tcpg*OM2<2(2F4{#X-9HjsmKda8Bgs$U>-mdRh-Nf~c( zrUDLJQJR?88A3gK|6>`CO=s8`$+SuIBn+YRS7lCu7TM!=Zs67+O<{zXl0u ziZ8G`d}JkT*c+A|IcIKIMzAj=V^jH4pvmyoN5}CK18ly}@WGE5Tg^=GY4&Y3zS2;# z#kD+1yK2s2r~xB;+Z({S>xcO+dou|+6|Hx&pgr zGscGGtHjM#q+S59W~C%`pO=I7g+cEG%>NdY#=!*I9(*KvFt!7;q9+N+t?+&kXHXw` zpSTDBhj|T8p8bQ(c=G(r&rMo}q9)nM(eYyO&-G8M?a{E`?1T!(hFqYcKSGz>$ord# zRrtO6j54Q#x1Ejk4@-;K;Al-F6RW_$I0+j|+aH0!ArVoL5y63> z!G4e%pH0n;Y!d>50|UeCoTFpDhxim7A_8=nE9|KZSo+Ij^)_a9wmzl5lhh7fN z|7hksO)Y;j(u@{<1(F_Y^kQDz9bU8E9p8`DCS$|~U4o9NFS0~IDO*8T52JRa<=VCz z0_xMzN<3U=;w+cv?Ix)H=G|VD67r48!pwD+aLvOPHx}AFeOd!kco%V06-Pq?nJ&N; z%haM9u#TDvXU~OCAO^${xhudjwdR=1D zww%3JRLWjy-tr#4xRdWT@ng>{z{RY!SK94rt51q>?_gTvF5?|FYt88OS8(p$K)Zjh zp4HbD9w6qd9$hI%UuZ!e?at#SW@vhxbpDuyF_Nr44Zc}T(py-3pJT~$9FikCsMvM0 zN2`ZV|Kysx)17j%c0ah2Zqs=7CQ)KluKvU$dcJ-dNiq1=b;k>QH zt4+?gXV*8V8I5`pQrjW1e#eWBS#R-T_?i|EGmK|*+f1Am$K{+Il{v6Y9BgrZLX%}H zC81HWWQ&{d>fF?Wz>zOy?)|P)-~6I)3f71fzzId z=97W|SocuuJ$ao!;Q%#l8*H)HqbD7>z=vUI^&`W-Q&9&_y5iW5nb$_z78>HFN!>@r z*Or+$J0F@0i~7JFZtb@&&zW-dbGB~~OVU%qfA=xwGht zMD2fGZ9dF3<>G1uw_L9bb$P$|IdXnf`u>YyXj5JTA-t7vhJw!3i2>o`T2v%OvrVY{+H>x_bv}d zwPS)_s2M#)-tKd5;kO{TS^3pbd*>?KI)`~oWQ_p7>!l@8HPDlic>1sJg?AKC9J$^+ z>&ec!24tkhbm0BS>~N9V(o*U98Eyl182n5DW&ugE+=BK9^BXGq%X7q-4BzcyctCfk z47Kr$0fEho^RD2{*xM)=fEeRyPWeh1cz7tsZSNyR4QvaB0s>T_0@0P*ztYV(_XegC zb|{Q&URX}__)FgGUiNT#?6OnvzVmp`t$~u^oA&ViGf*wUbuh@Vb5@#p#nn$SC+O!wJ|NYkg=A=llz!K!Mg`k`9CquWR&1d>ytyp#(lBZx}~M z>(pamN}<6T&Ad3U4+R*H`d~1fFatp6xey>GB^wEk2pAY_FZcH25ehZ@Oi+E;`oV`6 zb;FQKN`JduJ?jX>&v=%&w)T5G@)u6=b}0BUqi;#!DI+Q2tADgjbo@H!W1e>Qenbm! z9%g0#%saUu5DNvZyn&;xshHgqm@2WimhVhPUk6TWI~QFaBON^XqGS1Ijj)>hyh5}| zo`sKlC9pnmT=BB^+uig}Kxl6ZtjtwP}Zgwf49x*=q03te^ST`}oB;HlPOuvH(18aj>g+GX6p~8%vJT zI>7IGb@#V;;PD$Cz_NYuFgTER&tAu2Z@*|s)b)&&4!1Jzd30i-mka>THL429<1Z&m zfPNd3KGX%AKEG$f>U>4B1NOCh)eEx~Q5=nq&vP_Uc#g5lwE(e`GX21T9($U5lebGQ z7}K`4D%#|UEVd(k4A(n#w~C8jFMZ3y$PQCqSdKY|+Vb?G##!g>%{1iwJmBHUTR5de zD{QL<`P@`08a)=)Zkvsl4&$w2z|2#3r6g$LQ? zTX#AO;Bom4jT-ri<*~^(4NZ!~M1ardWg?FF!Elw5v*4!+TAU5x7VX+TX@o}Q2jQUD zS-6WmL7)Lz-{CF1DR(F7GddsuOZQ-0>Fvp_?$<}4cX(qI0RJGu!={1IXHe1aem%BT zEiBSi$88QrXr^4)0lf;tb&*EKl9dMm3n*M( zUU+?vnQRYNcF0F0%*bN12hjTyy7<{R&7RBZ$?oK+1j9% zQNgB`70vlK+8_^ZVlO9iNr26-5Om@)`*0EM7T5jo^H%fLa$w?|Pe^5$iO&Bt2C&%dtPjwd>tz-!hljiJJQH6zXZOw<|ZIp5Ca zqsh3V*J!Qg_D+v=0p$*LBlgBwfSkMqXot7&YXALbVJ!2?u?Bz5{n)wWEwMyLdN4LF z>DCC}-*Ij0bqhALlPTCsdMFoD_^mFXRPf79R=?fUMvqiLjqTJ%a(%(J;WMA}s>2A> zge4){GGBA(d{HBTD?VT?+VR2SJt6St2Y|4TWS;t9Bj70`Wv*#Pn@Otu*~vLi(BbZD zMHVPCwVfF(IDAkDJ5I{b=1gJY?4`?XPWad)N$kchTN%WP`)Ogk8_~snnAs}5E$$=z zRR1G=A#0jmd)w^yF9%1{vy~8wY_^p75c8R8e{O97{`u-@0(l2}p^`+Tz)-bS0h(mV zk~Uhq&MPQtz7^ z$GOeT>5Z4iGf~Yo`B*0BweZnaho>~(RIRRSkGpJr{gU{lEfrYfk)cAY^$|MSAribZ zNCSK$-ONp^zu3SW@d>GriAM*(N{|HQ2-keWoH3@uKK&dJo|L+K#37q2@*{0CD>~1v zs2$B8JsXLqoXa8xWp{eJ!>gqts0>J46?s;h!S*9?STVmfS&K{K&Jks}f%Ep~__ZK) zWxFS)w2mRaa$FcT(UsSARtK+}hyJ{+~w=t_cYHI7=JJ6mO(;cN-pFivw zh2S39Q*_M3{5-lpY5blUhNCuoX)KFV78O6}uiB^2iDiAc-oFy3dB#?HJavN#w7WaQ zO;{%T{U&uP$!vzI^nIj|+W^?h^@uIKwAii68{!4IXR zbGb66i)7UtbecLE-F5S2&S?xSYev-XUYaunSEh4Dhih;Fy zmec}Gd(Iph?(MZ@1j%T~Z)S6=#n00xwFIjT2|-_fv&fVu&Ys74*yfcmSBIPM38y(w ziaG~XRK^XuaH$P%%D!K%cfq3ro|EDcV)ad-6CdviIstHlW#jyx5zu=bNNMHp{^SkRa6?Gm;q|jWJzE9R=fNe7 z+Z4YvDBtbPynM+gua>GdVs;MILg$GID@ac> zT1EKt&p33}o6CW{F<8B(uTx~r1OY5ZW_m8lJWo154Nk7J!knYS0mikWt5TsfW;}gw zcPb*GUQ4`_)+`#-yfZeu2A9CylYTMUKSrLnF9Ea!Ftvh;%-tDc_SllsHK}K}L}^0y zuB#Tx11)y>>cV|3W-Nh4)E|isPE$+mi5@54O%E-H@+;2r=oK?#5`D>i1AP|a{Pv3h zYlH@z44%)Y_JP6CBs0h5gB6rJC;|E%VgN^d9_`U8AbOk%n2SkP4aoTEEA(?|d|Ot{ z`Nw?&dp={L7M&~%;XQvx@x6ZXt(>&5%uZX zmsig>(q?~Vi^neget2`i-Td8R>W;%7ONfS^Nu!ntKzl!T*OcLnab67E7nRtQ1DVqK zNI|iVanmF&uj>#4BIHA`>gfSF>_}19iI5#~1o7 z5DLuiH6t>hv~Kl?4c;{oIkh64Gn^INI!jNv4=X3zLKF6PDbYsp=L=q;CWFpwi`t%< z=B~vCE~!I)5%V634cGOfx-1MCtv5$Cep~BD2cAK-NR^KP**#7@Ss%Wlk#wRTU!i5c zZJ0&=%G?+5{ghN&qVLa)Z)rz&XYpjE%k50|9e$Mbm_loV<^DU^U_XMb#<5QaCpTF& zaCTH-zJJee0tslp<*J5lwLC>EAiHORf%padE2xMounCkY&8leoK7=)UPX44s=VQ41v%~&q2+GI9vEcHyN zWih;`3qAizT+F+Y_W}BSvW0c5_s946*(lhM7fm^R8vrrWu?buUTRuDxVc_`4Th`l8 zlCUX+-FhR?G`5w(hOEP#<!(B!atY^`@F9MS%^}td)bU2+Eq?hh$dE~JS zu+?#Y-5Qkw7F+>f2yHkEOjE9-t1EEZ9klmen`<5#!<-Q9m*5lc=FWQ3SREUp<^4*N z)1GQV(fhVPE5t~}2*Q}KUD-=Br}iv@Uo@);*vHiZ_{JQ_vIM`Kp4!$s2(hH~Z--0* z!NDnS0IC)fHq$5_VgJ~S^*SW;A?Uk#gyHG=sJ79Ct!-}!!{rPc9@NDAeDqUK4=D87 z;okM6j$@t?r9$ECO>U0AsE32!q3!pmv9OMZ9%;P9pbakG-v7?ec+2<9*r3u9p3uZd z>zRladYCWE)@8fm4A1Br-@V&$rrx&5S-e}s#Ack-!SSF@#P-2g_2c|uREF)5sJB;t zF$1^mIMQOqf&Qwc?Jw8U(a(rOZ(IxhFqPBvo5MmIf8MAiSsQ=TA&rXId16*XsSfar z|4ONMpK?&^e<~PwbNOVF#hSLH#JWn8^m|I+9Y*u0$?Z4slSnD-K0U6c6lYI=b`DCy zpS0!-9l<}S8rf3j+4f+`^kmWgs3@smT;H^1%>mB+NN!&R4>D>2p!Q53#X&y?FvriP z?BHDvZg#2jpz=rnv);U@$70wIbm=>_**v-(QdR8iNB0dLj(1JnH+ntN?0PJ`O?=b0 zIQ;09kN{6|H7ycyt<5b1v+3VG zgE1W1jOFx|lSDWgblRUT7U+L)|6teXC-^J zT~t(BD953Zu2(Kk@#q(X>Aidb-gC=8uh7l`d}VdCi*O)}yLFUonOl2V~h7hJ&>OcJSjEbP{#CIMXuXISsn1 z>><_CQCY&b7KQsz?`6qrMv`%n=pW_N*^6gVUv3j<3deQuGj)xfP-E?{)9Ihb&{lY+ z_o5vrkZ+?IOW^1frm}SfpPYB^w_xdAw+_bAc~qP`a|4Z8QeO5`*uSzBY=D!N^}XPO zp-P*w{-l01R*P}r;Ch2hq7fycrw)b*+p}%DHQ9;$xN9ntOfoGZ3 zyR^lu^Xu`b$g00~Fapq|9lQhU|3i6FOVz~gd*YTY?y73C?NO@A7+$#!_>!!~$xIAxXkY@%NZh1%bP zn@np-EJw@cZlmL$oNL#AbG`S`G~mPS8bNZZifS9KZ%Ia7xvHBv;~W3B%-!&vohSwI zhw@bs^$Qwk*3Hud#cTs(wQjYHM~@ujP3mDkJ`!MU@R(>SOKaKIuaMJA_>-A{uP7ps zc-VUM57jpoYU1J_}l1mheYIjo}DIlIC#n3*%ex z40^TT7pN+uUm6&d%@K+v(c<_YuCay0_z{dUgH|f|jFMs~nNKZfUO3}#l+HFq=6gUG z5*bgb@fA>{C5*(O^Eq9FrJwBKd(5d(cWe+tq0j_zvbE1q|YG#qg!d= zE94)8|INt#uQL6+3S*Q77=+ywk2{mi1->bvxrGHwg=-~Vm9NnGu*G~6G#Vd^DfdSLQ;9!<;WvnD%MFt)-( zryHgy!$OE4C@&h4lSP^DF)1H^iLEq1N&03igkE?i0|6n}BcdX*4^2l406 zOkeQD>3dFQ&+8Y>hj2!bmi}Jr9XcL2Fpni+2$a?@2Y5UDQWrb;1kanZXx`me<^6cr z>vl36=@p|dKpVFpn@k6J0dn!ZVsL_OQQ)tp*`tTI3JWYeG|-%k!wKaJt>w0z0Ru&z zZKIXRxRmh4T7ioNwwjATT2fVGBvJT{guUB2x+S~vM~La95Z$L9mlJqjueq- zA*7Y6%jLaBC{>6}Ma#I*17ij2!bKc%9a6 zOgTw@n$1-_Hh}k)VcLuG5eTI_g~>@daP(^rM2|{rb}nI48|YjHaJPh1KLKr^*#vOLO_l zuCrx-N`g5wF?)KVXtv^9J0r#!!EF>P|Ls4)0^|R-pZ@({^!lF?4Ky|smcLJc-!~6C zM|TH%V`pnydn=UokSisr*$TYQPyQT>?qTJI9qJw#&aQp4mR}9L1tSx>WIuGU(+UlW zht{kM_IC-DPRBTwv}8Fyv8o7qkRDzUEPIcHWQMa_kU6lERp|zfX63Y5gZ7=W;6yBH zTkqV2IdWC;6vw}%#F217UUHsXTX2KTi*fb)-f2WP1-?r^14uR5-~eZRtNt^&$|=GI z8*Z*9hP&F50DfW22via8zc-aP@keu@hl35j%8nL1ZnZCOJAu7NxRap%go?RtnV9T! zdQYV$+pTls>+n)j<~{5B`*i^XBL6yH#NXY({jmGy) zCw1TACb{!HhYo*~d?bt^{w1JmmK%VCvrL0JmTG``3M-ShKAJktPrXVPt-cXq1^1@8_45 zU}HpEj)HR?sd`3s9|6L#^1tpkp|VV*d&c$I&L3o7B;^2~)a}Ti-|2$idAT^FV*6I) z;ea9OC`sd=PsLIKu=Tb4SSn@%KX#9KTK_sU5YqPubY(l9~r@P&Y8~AC-T+m7`%fTO7Y8DtLpmY{cJG^M3`U z1zP&M{Ka%>(KvvrFOUbv6<$g;yZcUY`y-CZl1;4_d6^f($k-4>PPlVjrmdG_4U<%d zy>)E-E`MrdT3Zw{rjb7JUTG+i{Q91Jy^~wY3k^T<8b*)1w=DqvnL`5$k5hfX;N5K7 z1gAQH01~y%Ta$yQzc!oje_m}amdROP&%+F6!Ju4G2rXMm-0KS7aS+B}()-(J+Xw`U zx2oCS>K7Xb`I#|5-$0ypx~&~MEyfrX!y=NVC}?p8hj5tsPiG(40Ix5cv-Q(5SClm- zBJE9jR}d8+63Yrkkda_y8O))k==s2_0GLy|-O_^_6wCuE!a+v;+i{P&W<3 zJ|1qGsTauiy-#pFp85^zFtQkDQOb4aDlUSv?7h^PUziG)c??hhp%5R1ppqn3W0)B}7MX_ah#vbY=P&svtIl~d zLn*lT5+W+JHvD))@}hDs-Rs6S5tF%ZTL?<$bOYpkX}XBO6)3(k4@4%z|$eur9+ z0RR?U>I1T~leX1SFT9YNv>i&c4H%4z#TjB)me1q%32ciiu(*C*(>_lytmc$Dfl|l( znCVU&dzjx>P(|vYWFpAKGt@wk3O4b2a!gPH!{!a{w2}IhMQF)M zDs-v=9uV>b(4)@D17_&^rG5rI#Um}Y#Yd~i_Dj#CO)GK)2-Um z%7oyp<8-M%Cb;r#anJ{=Y2_IUjSk>q&5MjUPudElKTF=f)8lj2X}D<>i18&)_G9M( zo;TWq8vs09qYpUB2u4F~@V z69e3ryp9quok6MyLH2(MDETR*n|FBu1`-V z?PqNl#`GwTp-l=E#{Sd*z6ZJ@9{`91cc_G5w$<5IhHX!u`hm;s6FivnkU6+ny`H%u zqW+7;ZN?o7s;^v2J}zBr9HlmBZL^bL*-Y!mOV}ZKoEGN;d=AvraljwZMS0HfeF4Rx`Gb?B)CX{VJB?ccCa}#mhN|LN5@85zSxX< zGLj%Ndr=T~N2rR|t~Hdch9>BJ2PZi_B(Dxb<<*n5BG<$KT}MqHr0mRqn+6&1Btst8;@Z5?lav^ah1w7# vBxYj1mq;MLp0?7nj1p-Q9{8D-|^MAr~O*q&ajTH(ew&>IUE%YG#2Ms0+DsSj)%ER%7_YDU- z=W}UF*zc3Av7N~$2Voe@7zX3uhXFaLtSyZGQwN`JN>)2a*tn!s=s-UJ;ELH3NPi)at0Wtmpv6MP(nNxZ0YHV7lL^k13D47r zHnqs4cmK|q`kkq`%3`pJWvFVu>CM0DG610bfuQFz0m{F6CIEnHz!;vx7yU;gE>ANP zB`~-I9`FSKL|8dY=}H2HQ`)gJp|SJ-XZ%mIQ~&_@Gnx=1{I>{DsYyvBGaz_6=!6nv zFC@t&MkR~#0)Byl=!_>-O2kpAJ&%R2S3QpZBLZ9iFeKm$_3NWWr4BSAV34xUr-J1+ zX*CAjc4$#o0&pc7(mjS6VKx4B1&qfIsz6)`SQ%IX%1waCfbvs}!a;px&|!`~ssPNl zJ6Z9H0t2~miUNbQInfX+P%VLqeB~ygacS*rI<#CIWE{!SOZV!nBmaOSKs_o4G3+{VSWb znNMq1pO$7m=_Y+zskPCa)zzJI`rqR})_oBH-{?QEUWY}Q=v*1}f5M4{18@P~9KP@k z8JIkx=``c$Et1UKk_y~X3&SY>6@du`)@!if`~9ETXf>1aEiwz9h5h44cz)53AC{^4 z7XRl6pG^%L%V+>V-e*rHZBN!`|IF3D9;QM7r~p9n1KB$VmcBSHIT(*qQezi7A9$Qp zKHB`Z5MV`~LmyNK76)Km0n5Y-$xd-8{C|wk9SaY@ln*yP7OYtL@ja-QwnmRBmmq%H zqcFutUf{4u0vUwT7y_ow%bHq!n->eg^e9M?=qKLG4v6Ils+e1Zjz=Zb#kb=z@ zy;Qxp#{C@hbOCrAeY7T!*W2j{ieUP@Ty?GC+`trY#22U{n1L=HqJ>fPDGqE!mk$#u zJQ?iA5(uLO5%>TAp&T-xTmlG~qaZ~R4C+fTmH}<1J1Fw^r8wd;Z4*0UgL4xcqWKHb zp?Ggm5~0`<^cgTQ04T5@M)r8@OE|G~*n2EAoCEcRF|Gs}C`cLdBRzgnT(&464kBCB z69<7G*71b7ze#SbJxUMnJvkoS@R6BqQdco_V7o?%EV63>AU#7^pYX zs-&?mJ%GJ*CS7ZYzbD0GxN{0DF|*%nst9udZ`C} zBQd)iVa~ceZHdFwn+YB5oL>&WE!|AFJP_`g_c-DwUV@&K&i>LKdDovFFy45R@4^0l zW-(y67WFF>S77J0+)g5{giO&zU$;aO785q{JOts_wHs!BxbTxMEDD+;yN5DZm7 zILA#YlwDxkNVT*R#$aqMVYUYwc$+HWM=i=%E9JLyFjPG|SrKdiV9)^vP;~^pRW|Pr z2dESQU-5qaJmNqw2sJw}L4pya7Af1G5)jA1ke2|_LZz#PN$smK{otroH~yKDFw75v)c}J^6Cql~Wbttvj70&l zU=XMW0*Qdh`Rz`jBQBV!=%*^gqBM6B0?LCafHkN`RXd_K__?cpszWR}YGJP&bD39XDZo?)%)|j}!-``oRV#u61^|J2dlOV*YOm5^no+Cz4A9WFgH4)(FeQU=PS=y76;TOOOGdi7e~lBvYSa-L z<7C%pz)iSv26G^1bG!#_Q*re&_B;!_H$7e%1XE|_w=i{4 z25+T9alvTR2@o)tIuHUw1skyN&ja`s7abuAjG%Y_A;>tLbCeoABX1N!Ta+{V!HO}D zR4y{3SKVX3af;N#rja)R991+MZ8g+5vudFrTu%lgNDxMlUH~GJX`GlHzxRCR^*>8|NlRMkqVQ`|DG@a{q{zl1yiA^{T@OmP35 z2>f?$kROy6{|t~Cl?6R3ASmxy!2ezDzjObyxcNVH2t3g6iVUE_vradp+b#Lb)$mUr zU<e$KjV8zY>qz(#6)1!>;NMn`b5b=EcEQ!%E%0mvw*G$`=oaERD8fUh6wS2RrY>`rldKuAnV1_=m53!e;ngG%l1 z_`>A0BM6^2vtd0D+vY!uEnMIP4v19-Uc8tXR@2ZiFfq6O?C9$03&Z^!PytT>pnWYS zCB+4ONk~LYLi&n~oPv^y`gtewFNleW{d-cuQZcdrY><5aYvc61L3&7bo+#q_(VL~H1l-5m=swi= zdEpuefev%)o?#qylQ20 zi*?sf$8o~Z#Yq8`H~F}9Bp<$sBVMI)E$S^Vl-9)va%LuC9*9qx3$Gi|j+V3km>7_q zU*DIkm$<|AZB1gZL>A6{aS=rW2@P_8voU=WNTZ|U8yr#7ZS=-Gp=VFg`Y&br9}D(n zU1ssyyVu$m)X0w|S?)o8VI366xpRiw=ZOBX%zsGPRb_ZLvvbOce`haiyWD>0TlQb4 z`}y~C_)$KzF2k1R_lsWcxjXy8(n%iOVI4BF7lzHzhR2(>iH(Yqv#dDb8*r-vX@ZK= zX}*@rYDj?jP(y?%n(ljl8EmQrfp2AYWo+RH-APp89#W5=F)>gZ$XLpvno zzBH(a@)icymh~)8M!ChBRVU6&e%al@K!*44xm;^;|J1QX9YPsF+sECs+O)sdzww*w zZA8KmmgObwWqP;sLab~~q$9by;1b<1Q#`!oZj`y@M|)y-aX^sZggAW+N%~X z)iJ)?6-lfD!wVdLZ6MdJZE?%r@be!^GNr}PA!!$pshM>S5!t&4z!NUJki8?;hzvP~ zXY(m?P5jtv2p}X0P{n@P#4$D=6c8iW#hdL04$UFF{m~g;-%~`ahCO77-(J7KlLYd0ng5m)lv7z<3>$h8k|PG$}b}8-+`2aDEu~FMMf!d^7FcJo6ss6!ozC1;CRQDL#9TT&ylJvRd&} zk9639j$>CGQaXw*#?gr~K#Hq-bGIR zpcNH8ouL<8=a6ecLqTct+b5S zX~Zh#114ZSa1~X}!6y z{WQq_g^D8C8rxgnlPl#(@HikmCr4(*Ry4eM(EYppBuiLWhVa2O%|Z|N@DmaRlcl{H z0UW8dAdf8^vCK-vQvnEn5f?F94n@+L32>y+`C+P3j@kZr%fU0W8`-YSInGR%NM!iw zbgnAA3o+^i@(*@-zc!)V^~{6W4M#!+@ImFxmFxIzDZ81{3NOW8p5oR};koS8MDa-@ z!&-6sT>3DA9tYc&4(7M}e7wWkd75g9_$PqSdWn0BG*scsG?sU&fVCJ9Ldy|9i9lfh zxIx?5L2u$?C=6T5Q2y>6As5)eHF?nB)>kV7Q8_o7a;d#U^?7ndYmtOXQ=~UD0vByF z+4q(J^bO|f7T8UEyPRjuYaN@pS+#TXn5o``(iHpnBy*3M40~MBGbXImN1-P%-VTWq z-m#Wr$op~bD}Z*|m}ZI%+e0f?WGXP+<)Q|&4asg{}ehL&C1j4@(%w7|lO!VQTc{$kojzmTZYi{@9AuVxzCWH&y_ zbteu&9{Y0f9r?GV54P9L5HJBk^UlU#5gys<6XilPBiA+g;1EL^4~+tw>{d}GrMWw2 zaQ|N1$j#XwRsG8SxId0g8mF&+XcQQHyyYSBl4kpi=9A<$D(ujR=RJZyq%Wdr$8*p0 z=sLH%h&S*D?e5jGbX%R1m)Q1^CF}&Oft`JiW=>7)2=i@W5qAWxepRR6XT;?FMtIb( z7_rA*#|u|!%}m^n*Q9s@k9GmsE@Qa_kAY;Fh!?nfF5Y0W%cs4=#gZP=VVyt-?%#*k zgFNePNmdwExqFU6n5x&bK1S}bdkVINeeXA&NbnKoxjzG@HO$sTp%%@@wa9>oP)kO? z4vVK)ePd_(4{iisstI{4WHxeNq`xaf5UM`EvrRPkOM{;3bArkeg03=lMNXp~`kyfo z5u}{)6>NT01D%w5XYxjiyNN>_WpeTHgGhwt@30;a$T&}>vt`<_3Vba);JfQVQI|kP zjjDq9r@U(0&`7hr68^mG`?up{1GN|&Z8i}1@guH@LCToq_XwQ*&f9tbF2OG$=`GfK z$DO5ZzTSOj{T45?)`HUD$GZJ5&2R6S700)rBdH9BI5AGn`OE&k{d^td*ZWb+h=974 z&~>MR-fC7(V<*L5FBLyD7IW=kSu;ks@0;BoVD|a0_8|1114BuMxXM1!w-v!uIeg70 zb@VPaBGR2LEvIq9^3)Ib#BEHP7WELkd)F`>W_hK#{mV4>+QlABb2m0o1chQL(GTBK z_jw*ANpAR>CpH|R-YXHT`eT1~`vv|+Y$@6$bZe%qFaw^_-!TvSo~Ag5fDT=q19OyV zTR@i(XcA@1WyD!PldpK$RQz)=K&3q(2ZsH`{-(Ih7 zwuZWwb>JkC95T-%n!_OtEu|*4gpe?)rR%-|Ul-2J|C3>=Gmi0fM zLqy7A0WJnbnaP_16w@_XKCzz-9&g_d1s1<+z8nZNLs5zAEm82&w~kTwlVQglqi!U* z&MQ+dmveiQfpUBLO`x34^(--P|8Mk^fs&nF`?gQluqrZeHz3D&co+wl+|OIlrOnJ-Sp2}&sE?;8y7LjZ#$u&hM zmI;pgjE}$l9>e2(psgcRItu{ady#M@9y9ok^}MbM0WtA5bq>DHJ>hSykk~bzRFJgw zGd!5|%iDEmxbm@-qZm)<$r;aZG5QbBe&59|U>NnAR_PX#;;Gqb0(J6d`~9YzhPV&> zkrP6}9QT8N21a@+M{mBmZVe3$WMXRX4yCh#8(L$g{ZWNI-Sx846QXGNbGZuQ6?n@4 z=ex*gg=4{<6+B^GyA&1G3&jp(1L^sK+Deu|Iwk`Q6zPb#Z^Z=>{#x2;lF(T?Diz;O z%546x30V|EuUZB94M-3(q~v+jtv-n0)qXDRlzwl1-1{rm6|B5@kY7er_F#gvuQ4mX z&5e8t%vf8kxodvBbO;F6NFXTFasF_NVlyLQ?4HfLYAtw5#L&+;REJWO)z)gug}C|?3tfy)yMNu z!Ttb_2(^f7+{!(U6?MZR8CsbrR|5lEp^h_XNiIrU6_a8(uYOpd|EheiM6~C-bN}0F z3+dR*04sPa9%8MTOZUfj)3yR0jmmC*Emg+$0~H{>4;8O4LM7mK(O&wr+HoATy$kt) zx2>TLa-joL(lOROfB=(bLo^E)IKYHlrYDY89jG{1?>}yDs+|3#%%RtNW!6fZI3g=T zVPiCgdCRbxmvj-S*kZ#=N8SidA7i4WQmZ|qtimUc+Z}TDl2U}gJ2p=6oZpsE16eLS ztPLHCztE1a4=lyWnj0Cn-K|r1l{ZY#c$@xS)Dg|pk~$gS?#;DYYjVN8mA2WkXl`t3 zC`}!s&M+?LoRBO$7f?HKN?@Hzz&^)j8Ft~mRNyFtoiep9J6nErCIWzYNBCa&*dY#f zX#f?KSb)OC7;9rwHWS+>O?_YHifXQO_B7gQjICT74JUrI)>2sy{spqAaVHk#$QOjy z?)oQlhiR{KrUr1kz;9kS*71bwo%sl#FHAp9U&@>5g-EGT!9kdH?hID`(!bRmEkg!m zB1U@xRtL#u@D}Awe*%~@e3nFKg?(3;f8hDs?Vp2xX_QgjizW8Y&7a2ZxIIhXV)Yts1cZAkYkSD%iSqXO?WmT zNN9t-GAa_)8Ud4cPuL^db4v(-0Y4#-0$>>~l|G!vfM_zA@vLWz41Zb&-%-()`U%xvE7-;eqQyL!az-nQ&u`TZt~6mu{``RAr0_FQ zMV+T+9M>Etd1$r+0CdJ$$BDx2y!!yavC5ZkTvkjnTA;7Xt$y|3NcA2+bJIR&>x(=# ziOY(!_fXvYH!^A=qXLZ7(rKyD9sw8IqsIydClL6rX1&vuFu#~i>URRudna$YN%68y z=yvu@>S?#LNQgwArIVZ2olq4k00_-Z-%nnRz|Mi^6InW5mKw-WVT70x__Szffvy%r z4kGAa)7M2qZxCXd=dIWJHx!_qC8^e+W5K&ZR_+cieKF}VEDu+F zfUrcW3UWH^YwE>P@kiz(j~3aalgX~3#ZUrKKv1byvte__t0#hK3S1jL&Bf}~Dv{M$ zK;6uwIf=YY*@B(lA>khSEn8hz_`zPspat#ym8@?Zl0yRTyq)eKD=WTV?-!|7s>m)) z8#+@`R7*vHrr}PnWwOY~f-0j8&VAXY!<`T|ADycsm~AQiWZ*}ms4DQy%i0GhbT64P zg84<-7gt1(2AX)<4yU4Kv(bK^%~5vF?=+b%GH+xc$I&pnVP^RmWHiF1E&^z5jb6wm zf70@J@v=rddFKQ43)?4gdeorpyZ*xrxZ{n*S9P+l*$*0b=NJ)#0?uIDF5kNoRb^r1 z6z0MRyK>_N1-YWXWXAOw!6L;%gxW2tW@A&6N!%X>9th$hYVe*b3&L~ ztq-k-VpFQXy^8Z{Kh7vvJl3fE>ERP6JbKyWs)!APZ;f5JR6OHQa{ofJ^eCsT5U`Zh z;xlzoa4?C3s-gw2S4TAjfv7l*rw#td!I12bn#rj<$} zK#z$I2#{OW$Lq-x{0T=UwWggFB_8#n6Z)Pi zO>Ah0&$tyJR)WJvnY|}vI7CQz%Uo4uDfr=w%AWDIGcy3&%X2X5xdte1A-Avg`Y1|9 z0IX0f1IBndgV8=V*Hc!UU{6z=cQ0lN&|`Ut+GS>AKdIH$-gSxC$k>+S9K6y9sX2GW z8Gz&H+>HFpfiC0=j@>a!RNLGoZD^SOD@ACTg9p_#QNcYCzjWHp$!YL>q~IxCy+E0; z&eTm##*U_}`e_YMyGZA)3`ZTc9<^k^sC&L23yBt%7~>n4 zYmssGub4?DCDOmWLoa!(US81`YyK96#(D|5I4fF+y_0KWviZ8I6evoA_)#kNhWd{= z#Zk_JgJQeU&5Q3&T1uahWdRYAcSOEl*(*fv&FkCo@O})KRPBH^X47LHQ3NCkyx?e{ zobxRA;Tof6^b#Z0KV?ic=T-=nkXK9A+R=?|=~MfyR$FdE8#fo}aaPLDgVW-J<0hC3 z?}xU(?Z}j#awVeSxp=>JS9yVeU`9rpE6j(SYupe5Iy|9-|Mm{)0W;@a^Dm4tEI{w( z50RfQdQ$DT10HgO13*5r#_FZ8i`6dT$D^l@haDr}oGW-ZIzjzmGa9*+&QL1mGu$w# zo)&q|FGb%x^+I*G*Pg0AuVqSnBrFeWbFabbd+1)xAK1MvS{Tgn&&`1S_)w! z>}zdRPecnkb>P0PW7iQ8#y9H!G|a+15Q5xNLIh9mw0ZLFk$}^CA!zngES*#xL zDicggY_7>u)#PMb@q}gj%Z<#JT9O5MhgSI&i-9U#8+=2UdX{aM$!0E*=XKq5hjC;# z7oyV)@6X^*37P~LUbTx=oV7Q+dar`z9W_VupSE}yqbFyjH>^jH(>k5%c8>At#q)f~ z0`|+o-w}0FYzCPN6HhjZEHp<++7Uc4_e!Rw`2de#Dey#3DaH69G~iZF9GS-tKWo^! zpOxHqwmLwDxqzML`LfaMqS<*{Btc$Njc!G~o{eopKR9 zNLw{>qe;@9(;9f6#;*EBICdNd@1bg~=cn6tUgoRky zStN!=sF<1B#YaVi#eQ(HkMeQ#@%0Px0b3gRDVUjA+L=Z;C%Ky-5`+ct+ot5?%kM}6 zrBm39X~=@CetT!%l`Ily1}w!{*<#$;Wl&>M8PC_nDUWW2$f^3)2e{_ZMv`%6Kk9t@ zQAhHM$z=SitAy^)*1c*_Wo=G2HzveUnC=aM>wZ{07|_K z%ecPkyVW4E>X%>iH)?3~J$bJe2@j~s-K36D+FM&S?N{5tpY z!?d-JXk)t#)%AKtcj9f_6Ol$9!6s<&w>3N+rL0ZBGTTUxeoJ4H)z+D5zem-mns|cFlP=6@cZce%L!-P7 zY&IAQ@B)B&nz_18ZIrsJ^uDyHf5?nitGOAjpl(fu7Iyf=)yJSO9UD7qO5e6RcUhD? z&q*_0r=74Zw8Y~C-!Vk@{mt(PJ?D+!RUR`pZ71igQrpO;;vaZQu?q#P4i`!Utqg^@ ztyip=T{lx}3D0sF9j7(VqGv#8p(D=`g}+IK2CcH9J&z zF5NUk?SeW*-Udo<%+Cxa43qSA;dVx87Qd7;mgUZ*;Mfn=g__y)Tm~O}srTIppVi%#FJxEeZr$+XEu8=!3MM8V< zRhOD)-HTh3>4_A60*Ym}!MUgMv+tg?KqjjCvRE;hW7qw!Wfb;9OXnHq$C1x%HaaZ* zeGg*fpxUlDhjV!Q01J@+hUdMp9R=(PX)sL!0D6U+^I}B~+3}6@FD({l5Q|6tbRun>+>oOqPbDVMTTjnYUjM!hsvt(& zvB{k7OFGvR>cU$PP2t6^XwhYE1&>vqW!M-t?Lq`v_rI)N|I1 z(joimY#X7q$gT36(lQtvel?cJqt{jRmGSBY~L~^ zYkpuGu8vnEH-3vFp8gm%>n)E9Yd;XU8etGu8iws)#kvpx*OD@MW-$d{s?^s%a}?lW z-*i}6c@6owbrGXJ>Pi`K0l?-t#s&swgh%fr1}@(*9G)#tX&Zk7JRyz@e=E-*2YhLh zL@>wEg&QG9ou;WB3nDkPC+8jvyCF=bFM?=MxP z8hi!z+ejHJpb_haELA4=nAvyqUbo(tidTI6UV5Uc+vXRaqC5Xtdgrbjh^3ySmDh6W z_{ccUL;Rp+S*zekm|ENJ#}j*obT{@9n8Y?}>-!YA}b2yzJV1_@nek)26b$g7at$ezNxHr^?B?D?O%hYKiQ58wN+90a1N1T0y>g2zo53T8yZtw7nx=A zE0hD~KJv3$uCKE0-6-kWM{`XX^ z0}t5%jd2yjv=13sY48bW_Z`{|Cd0S1MC@itoT=2l|y)$a* z8eQ9+n<*&{^|3^NtH{C!&dG<__bbV_kj`BdFL(7g7r%QN)TSR7@RrNcO5-D50p{>m z#{qU68iGQF^gUR4Vy4zX(;dH-cf*pw)=H5L`fO;{bY#{TYC5F#6B?!aW;RDod1%=Z zl^Ve_(dTg%gD>3j{LxRdxAw1wDT=SZWsY?6(w*Ju#m*LY76;;KvtL!m$jfRt&YF9i z8xkS26Qgn8a(9rNqtWA!yb68mWIt?D*9+@Xfiv z{^^!KBj`vr;o_U()J;bU@y4&ScsBa?<)ZS*Ztw?W`E$fv0rF?HShEOZj)pm@w#8@ zm41$2Os<2CQ30C&v}Bh46flfzQ4yzys{s?>EehzQ!u{Lj1XkaUZ0e8kX(ojl!A5 zK;Gd~^QFi@p50&U$WN^G7N6G=+&uCvVhvN!yQU4iql^p{W3@M(Z!NLE#;wrwoBtug za7kA(i)&uk=(BDLpT_(X#bV;(X?viAF(KtJJKaWl3HQTU6K(mdWM^Y-4A#}krbBKnVQz55x^HAUkr{TezJ4@XF(baZ>I zqS*5L7o?mPp|PR4`RU!)H^YjYV`CDGr?*LcazbuzcW86#7aSA6&Mdk7%+Batw+kD% zrnUlr%*6vV#no8B$&tqOf?tGxC!#Pa#Ayb#*hTyRG*s`XtX0dzfiK=JHe_H|FTg%mB!Ye)w0I# z;cj`SPJYL?P^$`ND|lth@Yd*#RuHW$@gOf$|9)3V!R*2V0P2G!QqljG3hl zo?4?(rn93-Nj}?Qy4rZF(mlIh-ZV;-dPAx8{ixJT@BLgc$vX_fcT2b29bbPLUkYkl z>%p!xuP5`S8t+b$sqeKXQtk?Z0c!>F-Khg>5??tD;Jd>L-s2kKk4w3sczt({;ak%? zn+l_f5`c?(D=)xdbb=uZL4L7#d$H@I#h}RE#MvUnDT8`a9AiyejeDg$}36nBv&+ zlVJ(*2z=8#Ee_y|JbR1|kogW^)k={Z=|8py@LAupeK?XV*dDN2WO0~SAFK|0!JV6n z_5r0pV8zRAgmfvZ@Hl7*>|Ax}a{M9vp)8_Xz;y(=Zo~5KG>%`q#rxyRw@PO=o!)P+ zMLn#=j^Xw9Ts?amvE`*&LP7|%g=w}q_*hUr#@OXYe8kh~hg0L^ats!?Xw3Y50*Dmm z^2*krA;AtPtQm+6hNo2&Fk6{$+-m6-Z^tT2y)_arzw_26Woj-|J2dAsW4J}es27-f zj>di_8Lj7c5abEb$~kuXP9UsWtJt_cj2q=vJOZ77Y{&0~s!18T%6`iE>f65jcM7Sy z%3Egkqf))Gf0_VZ!8EUAe4{(tcS1UR!*OWH*BPtcyc>G&n?MXaGDHFTK0QB#iU36B za>AjLlV9X%y*%Z}58a3JX`{I379OL+Ie2Mwz}lbv0A&Fve=LZE`MeR!5x7d+_!C+?AQ z@!*8=33u#+{jK`=O&N3z{RFlKo(|#qoIS~*U-Rcvp3S6|f@&Ny+iYpDVEy7O@*x^X zJx|Bx#xPwv2DluN7KoW1x~uXWpzU*WIorV|!&r$(t@Dw?49k68jj6Yj)-kYm>` z#TZdTczM~QGxk$ahObW#k%+z{?=4ifY{|1NMrjZdjvb#8Ts1ezK}aX-s?2{(zC-c` zc;<77=u$-l*c&@4Bf-#ktnpV_{SS;k$T& zl=L^tAy-#=U12nsLl_$kR~%HwcGr@SpVI^15tk7pC805$U-TZ3Fee&C%tzx4kal*& z21{DkmNp0U<;R9*7GL8mCE4o9+o)Z2wVEtM&9A7J-7=)Fyd#pgB%b%L*^bw6Y+J$j z-VlJv(A@fZ^NnU+s9^(}Cmg2ap%!d0(Sd+by^akJD4aWu1kihV8NJd2-@w_(gf>WhgFzN)HYbN%q0YxsY>4b!7mj9tg5Zn)a}|4JOQDy zrnyIGUo}yau;Hf(bpL8o@3puqk;ss=n)8@)y58*NTDzwC0yJq2NA2M4!^f1o z^1wU9dToQSNRMA;{?RunI`PmYa`0zYc4FP-ACBjRgGEi$j*8zJ!r52979_Yj?;5heHxR2Y*KdLLcLxYrepXm{ zyBYxj5=b*lBl;s~r*URw{dedTF(};JP4ECc()0u{@%2^oLEGK(jqVNBFQ6F=d6!r* zyP#4xHsq~Y>uO`@>3X^5Zfxdn!>U)R2`@sb)Vn6F;x<10b?_|H&AEc`wt=>d>%-8l zL4}J$1{Lwn8ctJ$#jNVvWMep{S)nwu>zv1vMuGFUEqLkX>&CY6Q=er!tZMg;$KXU3 zi^1czOK^8owtux#;immw%f3lNvhG_${}zQwgOXO{#ADySp4yJ}36yNw)quQ1>cndq zLS6d! z!nv*~rs@1m0$m2$HHWsIz~O?T=Zq-&Hkspu)>s?ICvH?nwA;CxCaxzu zd--ocb#I3r6anwSV!?pxTBZE=JuBw9MZ_Hl-KYkkGD+<2+gLjO?Omqh3`iech^?~% zAtypM-;ESeDC53T&*X7MHr7+jJ){^0nGO9RPBzpy@DX~0I9dHesMu-I(WszHDSL}x zUF{G7O|oR^k^789UzFj3Qc=i7q6V2uGHN##pYPU;$fF2Rq^VkAFKyY!z_B{#LD;CX z7yC2N!lm0-77@Eq~$e(=)@G!{<0*qAd)jea^9ll8B$vs{8CMyd!IPPVX{YNq(+dOS!ltNc5 zS5t0rge;^J1=x)Di_rJ6DZigsk=|8(_=P# z*s~XX4M^4MRd}Am10{$G8xb?iTI3(OETwWLQmiAV+n-vADM-G4TtYGK{GPW#rA=A3 zxU}u+9Xm3X{GB8VDmHRHQw*mu;P`h+MZEW}TV+Ei8U&ZY8Z&0br`~$~Ev8qN=nExf zWprPswRtc+SG6r>!#)b8*ex6*?_+B%^njFtc!=moghL}7?~`r3w)!9M-`C{j8394O zU)>hFtqDpW$h=SgQt?Jy(2}BC5VO^kWnK`9e6-lxP&=rxN9A5Mw@CCeru^78%DNGA?n4Mt#O{p^-YgM~ zXn<@egRZt>FTFK}%Bojq)4z3wRY!J5Vc4JoT%zy4kwqOBMpF1Pbxu#GeZgq%{8K(A zcr{-?jgZ!7SQhjpDJa9<2xmq^pQYswjwEbx8Aa}XRK4@E9QC)MF&j-Uu2n(TeEQWH z?B0AcX!F9=(d1-72+$}cgdZ;vy3v`lgHVhv-0t|*5^c3vrh5ta%rKEj3Aklx*VQ~( zBa3GUUkP^pc3gPPp_WSWo?=WTI&_MY^H-hQdx@fGO?7pdu(^-iv`!}>G6KWjla>0X=HU$cg*ic8m=2LVS{;;f!S9uu*j1$mVs z1dEyM?XkEwpH2EtU+|{O$9tX+%^Bju6?OzxBCYMD_MX|7+UdDA?aPG)1r>@|mlDJN zz1~WN7u6n**sE2Y$Gg|29&aWPduWW7z z;0l7R<4$Q|eq)_Z5tm;}9}cZ3u|Eqmlmk1T?!4!G6ZK2f>IRyY z;mfsJF6Nwy{$_2*s%OkA37!ms6PPtF!S&Q!2~(7yj|_Q{K4z0K(bT zSED=30B$jU9pP%D-_?83duQ!#$M2kfcW>=M?_Jb*6H%p44#||IgTU~dy5!{D zUnGmKCA=#UU)R%nB|DismP@-JJ*EmUcXs`j_Do?h$lqTh+K2NiY8kD;2t5Gwk|F2- z7wYl+qAmf!VFmdRZEr||n_D?4hrPv)&`puz<=8tU#A-;)=tVzEIozqD;U0J=nmh$J z*l)jd{b68F)!O9CCSJf8YZ!k8g!#Q&ygOGyZ>|Ky@jlswNB@fVR#BK1`qRVhE_xyv zBC&}EtR{hB|C%~TJ#>f5G7mAX!!Nz;ZjKRjt&~We-M9UEt=#7tTYvoF1U#;qHIBq@2z&oh6oYyE_?MS|cztL-w0dKRs1vu)#rL{C zk&>MkQC}&Pv%2M)ajJYuIb^1)e$jJ!ehx0vY|$6r*ItTk1(^WWW?grxx7*s5nLnm9 zgE`Vv{m;hp`P8@Xc~Yt_180YY0#&SS#dS2nxmlwp(yw|04?f|WacI<7`E}Dy6u~bm z4Ge5Zg18H!ckWCP-`TR)sJ^~Qr42az`Ia^JO~{K3lUX95&1^9M1;En*7EJ37$sWoc zO7o!NODm!ZUAL)_i^vkl!N~>T;+!J_+99;}OP*KJuo%Of4!s3u-&cRx-v-XJ1Ca1h zLwT;?{}m(w+y2=SF;*OEAux7Ab(fh{9MlVf>ni4?;@KPOy5(e9Dc@x^8(WUAGyuL= zI)OI;L^vd9+BUQ8AfJ2kb)Il}-}qqI1lAnqi#~rMvbQ6etAB6K=)z``dzx-Sr^U`G z?D5sQV5rc9AH_5E3MiQ!9=e3;e5}9=1GzRIRjN7x`0CKu1XBtgzO2|`i5^)zH!|;| zhNA~<<}|ak`D`%+0KO->f*$}xI4n@HowIF6JluLe&?y(q=|0(r&ApUKR?Wv<6}CU} z%zb)@ASlzYer`~GWsO1rO$lxdl{&N#eBK2%@v|$ZwGzsHg(bq-VrCc9qJxx~BC#s9 tE#U(i-8s2!r0~4KuqR9=F*^+a-naRM2mlU52?_u#0O+#@0H?FYr3T73@BIJ( literal 0 HcmV?d00001 diff --git a/assets/audio/dictations/ce1_s_ss_dictee_03.ogg.import b/assets/audio/dictations/ce1_s_ss_dictee_03.ogg.import new file mode 100644 index 0000000..d039c91 --- /dev/null +++ b/assets/audio/dictations/ce1_s_ss_dictee_03.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cgmru2lpwpprh" +path="res://.godot/imported/ce1_s_ss_dictee_03.ogg-2d8ec2781067dfd6a5691f3ff427c449.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce1_s_ss_dictee_03.ogg" +dest_files=["res://.godot/imported/ce1_s_ss_dictee_03.ogg-2d8ec2781067dfd6a5691f3ff427c449.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/environments/beach_backdrop.svg b/assets/environments/beach_backdrop.svg new file mode 100644 index 0000000..36cd12f --- /dev/null +++ b/assets/environments/beach_backdrop.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/environments/beach_backdrop.svg.import b/assets/environments/beach_backdrop.svg.import new file mode 100644 index 0000000..5164adc --- /dev/null +++ b/assets/environments/beach_backdrop.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctpna4eidmvd1" +path="res://.godot/imported/beach_backdrop.svg-e8f55deddf7256ec7aef29764778e1d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/environments/beach_backdrop.svg" +dest_files=["res://.godot/imported/beach_backdrop.svg-e8f55deddf7256ec7aef29764778e1d0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/autoload/audio_manager.gd b/autoload/audio_manager.gd index b253709..ff432d8 100644 --- a/autoload/audio_manager.gd +++ b/autoload/audio_manager.gd @@ -12,6 +12,7 @@ var _voice_player: AudioStreamPlayer var _music_player: AudioStreamPlayer var _effect_players: Array[AudioStreamPlayer] = [] var _current_music_id := "" +var _backdrop_kind := "forest" var _stream_cache: Dictionary = {} @@ -76,10 +77,16 @@ func play_music(music_id: String) -> void: _music_player.play() -## Musique de fond selon le choix des reglages et le niveau scolaire de la -## scene appelante (« automatique » = celle de la region). -func play_region_music(level: String) -> void: - play_music(SoundCatalog.resolve_music(SettingsManager.music_track, level)) +## Musique de fond selon le choix des reglages et le decor du tableau de la +## scene appelante (« automatique » = celle du decor). +func play_region_music(backdrop_kind: String) -> void: + _backdrop_kind = backdrop_kind + play_music(SoundCatalog.resolve_music(SettingsManager.music_track, backdrop_kind)) + + +## Decor du dernier tableau annonce a play_region_music (« forest » au debut). +func current_backdrop_kind() -> String: + return _backdrop_kind func current_music_id() -> String: diff --git a/autoload/exercise_engine.gd b/autoload/exercise_engine.gd index 94dc998..daf0f5d 100644 --- a/autoload/exercise_engine.gd +++ b/autoload/exercise_engine.gd @@ -11,6 +11,8 @@ var _rules: Dictionary = {} var _exercises_by_rule_and_type: Dictionary = {} var _dictations_by_rule: Dictionary = {} var _reward_items: Array[Dictionary] = [] +var _regions: Dictionary = {} +var _region_order: Array[String] = [] var _missions: Dictionary = {} var _mission_order: Array[String] = [] var _rng := RandomNumberGenerator.new() @@ -19,6 +21,7 @@ var _rng := RandomNumberGenerator.new() func _ready() -> void: _rng.randomize() _load_rules() + _load_regions() _load_exercises() _load_dictations() _load_missions() @@ -46,6 +49,47 @@ func get_missions_for_level(level: String) -> Array[Dictionary]: return missions +## « Tableaux » (regions de la carte) du niveau, dans l'ordre d'affichage : +## chacun est un fichier de data/curriculum/ (titre, decor, regles). +func get_regions_for_level(level: String) -> Array[Dictionary]: + var regions: Array[Dictionary] = [] + for region_id in _region_order: + if _regions[region_id]["level"] == level: + regions.append(_regions[region_id]) + return regions + + +func get_region(region_id: String) -> Dictionary: + return _regions.get(region_id, {}) + + +## Tableau auquel appartient une regle ("" si aucun). +func region_id_for_rule(rule_id: String) -> String: + for region_id in _region_order: + if (_regions[region_id]["rule_ids"] as Array).has(rule_id): + return region_id + return "" + + +## Missions d'un tableau : celles dont la regle figure dans ce tableau. +func get_missions_for_region(region_id: String) -> Array[Dictionary]: + var missions: Array[Dictionary] = [] + var rule_ids: Array = _regions.get(region_id, {}).get("rule_ids", []) + for mission in get_missions(): + if rule_ids.has(mission["rule_id"]): + missions.append(mission) + return missions + + +## Decor (BackdropKinds) du tableau d'une regle ; a defaut, celui du niveau. +func backdrop_for_rule(rule_id: String) -> String: + var region := get_region(region_id_for_rule(rule_id)) + var kind: String = region.get("backdrop", "") + if BackdropKinds.is_valid(kind): + return kind + return "marsh" if get_rule(rule_id).get("level", "") == "CE2" else BackdropKinds.FALLBACK + + ## Catalogue des objets de la collection, du plus facile au plus difficile ## a obtenir (ordre stable : seuil puis identifiant). func get_reward_items() -> Array[Dictionary]: @@ -113,6 +157,32 @@ func _load_rules() -> void: _rules[rule["rule_id"]] = rule +func _load_regions() -> void: + var loaded: Array[Dictionary] = [] + for path in DataLoader.find_json_files("res://data/curriculum"): + var errors := DataLoader.validate_file(path, "curriculum") + if not errors.is_empty(): + push_error("Tableau ignore (%s) : %s" % [path, errors]) + continue + loaded.append(DataLoader.read_json(path)) + # Ordre : niveau, puis numero de tableau, puis identifiant (stable). + loaded.sort_custom( + func(a: Dictionary, b: Dictionary) -> bool: + var rank_a := SchoolLevels.rank(a["level"]) + var rank_b := SchoolLevels.rank(b["level"]) + if rank_a != rank_b: + return rank_a < rank_b + var order_a := int(a.get("order", 1)) + var order_b := int(b.get("order", 1)) + if order_a != order_b: + return order_a < order_b + return a["region_id"] < b["region_id"] + ) + for region in loaded: + _regions[region["region_id"]] = region + _region_order.append(region["region_id"]) + + func _load_exercises() -> void: for path in DataLoader.find_json_files("res://data/exercises"): var raw: Variant = DataLoader.read_json(path) diff --git a/autoload/game_manager.gd b/autoload/game_manager.gd index 3c9a321..e9d9363 100644 --- a/autoload/game_manager.gd +++ b/autoload/game_manager.gd @@ -27,6 +27,9 @@ var last_outcomes: Array[String] = [] ## profil, selon d'ou il a ete ouvert). var settings_return_scene: String = SCENE_WORLD_MAP +## Dernier tableau consulte sur la carte : on y revient apres une mission. +var map_region_id: String = "" + func goto(scene_path: String) -> void: # Differe le changement de scene : l'appeler depuis le _ready() de la diff --git a/data/curriculum/ce1_accords_groupe_nominal.json b/data/curriculum/ce1_accords_groupe_nominal.json index f875502..690bc61 100644 --- a/data/curriculum/ce1_accords_groupe_nominal.json +++ b/data/curriculum/ce1_accords_groupe_nominal.json @@ -3,6 +3,13 @@ "region_id": "foret_des_accords", "chapter_id": "accords_groupe_nominal", "title": "Les accords dans le groupe nominal", - "rule_ids": ["regle_accord_adjectif", "regle_pluriel_nom", "regle_accord_determinant"], + "region_title": "La forêt des accords", + "order": 1, + "backdrop": "forest", + "rule_ids": [ + "regle_accord_adjectif", + "regle_pluriel_nom", + "regle_accord_determinant" + ], "review_status": "draft" } diff --git a/data/curriculum/ce1_sons_et_lettres.json b/data/curriculum/ce1_sons_et_lettres.json new file mode 100644 index 0000000..b20ba97 --- /dev/null +++ b/data/curriculum/ce1_sons_et_lettres.json @@ -0,0 +1,15 @@ +{ + "level": "CE1", + "region_id": "plage_des_sons", + "chapter_id": "sons_et_lettres", + "title": "Les sons et les lettres", + "region_title": "La plage des sons", + "order": 2, + "backdrop": "beach", + "rule_ids": [ + "regle_s_ss", + "regle_c_cedille", + "regle_m_devant_mbp" + ], + "review_status": "draft" +} diff --git a/data/curriculum/ce2_homophones_grammaticaux.json b/data/curriculum/ce2_homophones_grammaticaux.json index 726a165..0af7378 100644 --- a/data/curriculum/ce2_homophones_grammaticaux.json +++ b/data/curriculum/ce2_homophones_grammaticaux.json @@ -3,6 +3,9 @@ "region_id": "marais_des_homophones", "chapter_id": "homophones_grammaticaux", "title": "Les homophones grammaticaux", + "region_title": "Le marais des homophones", + "order": 1, + "backdrop": "marsh", "rule_ids": [ "regle_homophone_a_a", "regle_homophone_et_est", diff --git a/data/dictations/ce1_cedille_dictee_01.json b/data/dictations/ce1_cedille_dictee_01.json new file mode 100644 index 0000000..e71d265 --- /dev/null +++ b/data/dictations/ce1_cedille_dictee_01.json @@ -0,0 +1,37 @@ +{ + "id": "ce1_cedille_dictee_01", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_c_cedille" + ], + "difficulty": 1, + "target_text": "Ma leçon de français est facile.", + "words": [ + { + "text": "Ma", + "expects_capital": true + }, + { + "text": "leçon", + "rule_id": "regle_c_cedille" + }, + { + "text": "de" + }, + { + "text": "français", + "rule_id": "regle_c_cedille" + }, + { + "text": "est" + }, + { + "text": "facile." + } + ], + "audio_id": "ce1_cedille_dictee_01", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_cedille_dictee_02.json b/data/dictations/ce1_cedille_dictee_02.json new file mode 100644 index 0000000..aa20819 --- /dev/null +++ b/data/dictations/ce1_cedille_dictee_02.json @@ -0,0 +1,37 @@ +{ + "id": "ce1_cedille_dictee_02", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_c_cedille" + ], + "difficulty": 2, + "target_text": "Le maçon construit une façade neuve.", + "words": [ + { + "text": "Le", + "expects_capital": true + }, + { + "text": "maçon", + "rule_id": "regle_c_cedille" + }, + { + "text": "construit" + }, + { + "text": "une" + }, + { + "text": "façade", + "rule_id": "regle_c_cedille" + }, + { + "text": "neuve." + } + ], + "audio_id": "ce1_cedille_dictee_02", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_cedille_dictee_03.json b/data/dictations/ce1_cedille_dictee_03.json new file mode 100644 index 0000000..c02f9d3 --- /dev/null +++ b/data/dictations/ce1_cedille_dictee_03.json @@ -0,0 +1,42 @@ +{ + "id": "ce1_cedille_dictee_03", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_c_cedille" + ], + "difficulty": 3, + "target_text": "Hier, j'ai reçu une carte postale de Lola.", + "words": [ + { + "text": "Hier,", + "expects_capital": true + }, + { + "text": "j'ai" + }, + { + "text": "reçu", + "rule_id": "regle_c_cedille" + }, + { + "text": "une" + }, + { + "text": "carte" + }, + { + "text": "postale" + }, + { + "text": "de" + }, + { + "text": "Lola." + } + ], + "audio_id": "ce1_cedille_dictee_03", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_m_mbp_dictee_01.json b/data/dictations/ce1_m_mbp_dictee_01.json new file mode 100644 index 0000000..08c71ba --- /dev/null +++ b/data/dictations/ce1_m_mbp_dictee_01.json @@ -0,0 +1,39 @@ +{ + "id": "ce1_m_mbp_dictee_01", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_m_devant_mbp" + ], + "difficulty": 1, + "target_text": "Le pompier monte sur la grande échelle.", + "words": [ + { + "text": "Le", + "expects_capital": true + }, + { + "text": "pompier", + "rule_id": "regle_m_devant_mbp" + }, + { + "text": "monte" + }, + { + "text": "sur" + }, + { + "text": "la" + }, + { + "text": "grande" + }, + { + "text": "échelle." + } + ], + "audio_id": "ce1_m_mbp_dictee_01", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_m_mbp_dictee_02.json b/data/dictations/ce1_m_mbp_dictee_02.json new file mode 100644 index 0000000..ff7c165 --- /dev/null +++ b/data/dictations/ce1_m_mbp_dictee_02.json @@ -0,0 +1,45 @@ +{ + "id": "ce1_m_mbp_dictee_02", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_m_devant_mbp" + ], + "difficulty": 2, + "target_text": "Il y a un timbre rouge sur la lettre.", + "words": [ + { + "text": "Il", + "expects_capital": true + }, + { + "text": "y" + }, + { + "text": "a" + }, + { + "text": "un" + }, + { + "text": "timbre", + "rule_id": "regle_m_devant_mbp" + }, + { + "text": "rouge" + }, + { + "text": "sur" + }, + { + "text": "la" + }, + { + "text": "lettre." + } + ], + "audio_id": "ce1_m_mbp_dictee_02", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_m_mbp_dictee_03.json b/data/dictations/ce1_m_mbp_dictee_03.json new file mode 100644 index 0000000..907f4e0 --- /dev/null +++ b/data/dictations/ce1_m_mbp_dictee_03.json @@ -0,0 +1,46 @@ +{ + "id": "ce1_m_mbp_dictee_03", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_m_devant_mbp" + ], + "difficulty": 3, + "target_text": "Le campeur plante sa tente près de la rivière.", + "words": [ + { + "text": "Le", + "expects_capital": true + }, + { + "text": "campeur", + "rule_id": "regle_m_devant_mbp" + }, + { + "text": "plante" + }, + { + "text": "sa" + }, + { + "text": "tente", + "rule_id": "regle_m_devant_mbp" + }, + { + "text": "près" + }, + { + "text": "de" + }, + { + "text": "la" + }, + { + "text": "rivière." + } + ], + "audio_id": "ce1_m_mbp_dictee_03", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_s_ss_dictee_01.json b/data/dictations/ce1_s_ss_dictee_01.json new file mode 100644 index 0000000..cb6a885 --- /dev/null +++ b/data/dictations/ce1_s_ss_dictee_01.json @@ -0,0 +1,39 @@ +{ + "id": "ce1_s_ss_dictee_01", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_s_ss" + ], + "difficulty": 1, + "target_text": "Le poisson rouge nage dans le bocal.", + "words": [ + { + "text": "Le", + "expects_capital": true + }, + { + "text": "poisson", + "rule_id": "regle_s_ss" + }, + { + "text": "rouge" + }, + { + "text": "nage" + }, + { + "text": "dans" + }, + { + "text": "le" + }, + { + "text": "bocal." + } + ], + "audio_id": "ce1_s_ss_dictee_01", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_s_ss_dictee_02.json b/data/dictations/ce1_s_ss_dictee_02.json new file mode 100644 index 0000000..4403e49 --- /dev/null +++ b/data/dictations/ce1_s_ss_dictee_02.json @@ -0,0 +1,42 @@ +{ + "id": "ce1_s_ss_dictee_02", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_s_ss" + ], + "difficulty": 2, + "target_text": "La grosse tasse est pleine de chocolat chaud.", + "words": [ + { + "text": "La", + "expects_capital": true + }, + { + "text": "grosse" + }, + { + "text": "tasse", + "rule_id": "regle_s_ss" + }, + { + "text": "est" + }, + { + "text": "pleine" + }, + { + "text": "de" + }, + { + "text": "chocolat" + }, + { + "text": "chaud." + } + ], + "audio_id": "ce1_s_ss_dictee_02", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce1_s_ss_dictee_03.json b/data/dictations/ce1_s_ss_dictee_03.json new file mode 100644 index 0000000..b97968c --- /dev/null +++ b/data/dictations/ce1_s_ss_dictee_03.json @@ -0,0 +1,42 @@ +{ + "id": "ce1_s_ss_dictee_03", + "level": "CE1", + "domain": "orthographe", + "rule_ids": [ + "regle_s_ss" + ], + "difficulty": 3, + "target_text": "Mamie a mis ses chaussons dans la chambre.", + "words": [ + { + "text": "Mamie", + "expects_capital": true + }, + { + "text": "a" + }, + { + "text": "mis" + }, + { + "text": "ses" + }, + { + "text": "chaussons", + "rule_id": "regle_s_ss" + }, + { + "text": "dans" + }, + { + "text": "la" + }, + { + "text": "chambre." + } + ], + "audio_id": "ce1_s_ss_dictee_03", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_correction_01.json b/data/exercises/ce1/ce1_cedille_correction_01.json new file mode 100644 index 0000000..f3144c8 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_correction_01.json @@ -0,0 +1,53 @@ +{ + "id": "ce1_cedille_correction_01", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Léo", + "correct": true + }, + { + "text": "se", + "correct": true + }, + { + "text": "balance", + "correct": true + }, + { + "text": "sur", + "correct": true + }, + { + "text": "la", + "correct": true + }, + { + "text": "balancoire", + "correct": false, + "expected": "balançoire", + "rule_id": "regle_c_cedille" + }, + { + "text": "du", + "correct": true + }, + { + "text": "parc.", + "correct": true + } + ], + "hint": "Devant « o », pour entendre [s], il faut une cédille.", + "explanation": "On écrit « ç » devant « o » pour le son [s] : « balançoire ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_correction_02.json b/data/exercises/ce1/ce1_cedille_correction_02.json new file mode 100644 index 0000000..36dcad0 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_correction_02.json @@ -0,0 +1,57 @@ +{ + "id": "ce1_cedille_correction_02", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Il", + "correct": true + }, + { + "text": "y", + "correct": true + }, + { + "text": "a", + "correct": true + }, + { + "text": "un", + "correct": true + }, + { + "text": "glacon", + "correct": false, + "expected": "glaçon", + "rule_id": "regle_c_cedille" + }, + { + "text": "dans", + "correct": true + }, + { + "text": "mon", + "correct": true + }, + { + "text": "verre", + "correct": true + }, + { + "text": "d'eau.", + "correct": true + } + ], + "hint": "Devant « o », le son [s] demande une cédille.", + "explanation": "On écrit « ç » devant « o » pour le son [s] : « glaçon ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_correction_03.json b/data/exercises/ce1/ce1_cedille_correction_03.json new file mode 100644 index 0000000..26af277 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_correction_03.json @@ -0,0 +1,49 @@ +{ + "id": "ce1_cedille_correction_03", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Nous", + "correct": true + }, + { + "text": "commencons", + "correct": false, + "expected": "commençons", + "rule_id": "regle_c_cedille" + }, + { + "text": "la", + "correct": true + }, + { + "text": "dictée", + "correct": true + }, + { + "text": "à", + "correct": true + }, + { + "text": "neuf", + "correct": true + }, + { + "text": "heures.", + "correct": true + } + ], + "hint": "Devant « o », le son [s] demande une cédille.", + "explanation": "On écrit « ç » devant « o » pour le son [s] : « commençons ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_correction_04.json b/data/exercises/ce1/ce1_cedille_correction_04.json new file mode 100644 index 0000000..e029775 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_correction_04.json @@ -0,0 +1,53 @@ +{ + "id": "ce1_cedille_correction_04", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 3, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "La", + "correct": true + }, + { + "text": "maman", + "correct": true + }, + { + "text": "appelle", + "correct": true + }, + { + "text": "son", + "correct": true + }, + { + "text": "garcon", + "correct": false, + "expected": "garçon", + "rule_id": "regle_c_cedille" + }, + { + "text": "pour", + "correct": true + }, + { + "text": "le", + "correct": true + }, + { + "text": "dîner.", + "correct": true + } + ], + "hint": "Devant « o », pour entendre [s], il faut une cédille.", + "explanation": "On écrit « ç » devant « o » pour le son [s] : « garçon ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_01.json b/data/exercises/ce1/ce1_cedille_qcm_01.json new file mode 100644 index 0000000..ddc97bc --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_01.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_01", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le petit ... joue au ballon.", + "answers": [ + "garçon", + "garcon" + ], + "correct_answer": 0, + "hint": "Devant « o », pour entendre [s], il faut une cédille.", + "explanation": "Devant « o », « c » se lit [k] ; pour entendre [s], on écrit « ç » : « garçon ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_02.json b/data/exercises/ce1/ce1_cedille_qcm_02.json new file mode 100644 index 0000000..9c3a0d0 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_02.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_02", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Ma maîtresse nous donne une ... à apprendre.", + "answers": [ + "leçon", + "lecon" + ], + "correct_answer": 0, + "hint": "Devant « o », pour entendre [s], il faut une cédille.", + "explanation": "On écrit « ç » devant « o » pour le son [s] : « leçon ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_03.json b/data/exercises/ce1/ce1_cedille_qcm_03.json new file mode 100644 index 0000000..b5bf2c0 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_03.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_03", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "... va très bien, merci !", + "answers": [ + "Ça", + "Ca" + ], + "correct_answer": 0, + "hint": "Devant « a », pour entendre [s], il faut une cédille.", + "explanation": "On écrit « ç » devant « a » pour le son [s] : « ça ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_04.json b/data/exercises/ce1/ce1_cedille_qcm_04.json new file mode 100644 index 0000000..2c04713 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_04.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_04", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le ... construit un mur en pierre.", + "answers": [ + "maçon", + "macon" + ], + "correct_answer": 0, + "hint": "Le son [s] devant « o » s'écrit avec une cédille.", + "explanation": "On écrit « ç » devant « o » pour le son [s] : « maçon ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_05.json b/data/exercises/ce1/ce1_cedille_qcm_05.json new file mode 100644 index 0000000..43b8156 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_05.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_05", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "La ... de la maison est blanche.", + "answers": [ + "façade", + "facade" + ], + "correct_answer": 0, + "hint": "Devant « a », pour entendre [s], il faut une cédille.", + "explanation": "On écrit « ç » devant « a » pour le son [s] : « façade ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_06.json b/data/exercises/ce1/ce1_cedille_qcm_06.json new file mode 100644 index 0000000..9c59bef --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_06.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_06", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Mon livre est écrit en ... .", + "answers": [ + "français", + "francais" + ], + "correct_answer": 0, + "hint": "Devant « a », le son [s] demande une cédille.", + "explanation": "On écrit « ç » devant « a » pour le son [s] : « français ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_07.json b/data/exercises/ce1/ce1_cedille_qcm_07.json new file mode 100644 index 0000000..24d0ceb --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_07.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_07", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Papa a ... une lettre ce matin.", + "answers": [ + "reçu", + "recu" + ], + "correct_answer": 0, + "hint": "Devant « u », pour entendre [s], il faut une cédille.", + "explanation": "On écrit « ç » devant « u » pour le son [s] : « reçu ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_cedille_qcm_08.json b/data/exercises/ce1/ce1_cedille_qcm_08.json new file mode 100644 index 0000000..42e3138 --- /dev/null +++ b/data/exercises/ce1/ce1_cedille_qcm_08.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_cedille_qcm_08", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_c_cedille", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les enfants forment un grand ... dans la cour.", + "answers": [ + "cercle", + "çercle" + ], + "correct_answer": 0, + "hint": "Devant « e », la lettre « c » donne déjà le son [s].", + "explanation": "Devant « e » et « i », « c » se lit [s] tout seul : pas de cédille, on écrit « cercle ».", + "review_tags": [ + "sons_lettres", + "cedille" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_correction_01.json b/data/exercises/ce1/ce1_m_mbp_correction_01.json new file mode 100644 index 0000000..b4cb250 --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_correction_01.json @@ -0,0 +1,49 @@ +{ + "id": "ce1_m_mbp_correction_01", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Maman", + "correct": true + }, + { + "text": "coupe", + "correct": true + }, + { + "text": "du", + "correct": true + }, + { + "text": "janbon", + "correct": false, + "expected": "jambon", + "rule_id": "regle_m_devant_mbp" + }, + { + "text": "pour", + "correct": true + }, + { + "text": "le", + "correct": true + }, + { + "text": "pique-nique.", + "correct": true + } + ], + "hint": "Regarde la lettre qui suit : un « b ».", + "explanation": "Devant « b », on écrit « m » : « jambon ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_correction_02.json b/data/exercises/ce1/ce1_m_mbp_correction_02.json new file mode 100644 index 0000000..52bd577 --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_correction_02.json @@ -0,0 +1,45 @@ +{ + "id": "ce1_m_mbp_correction_02", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Le", + "correct": true + }, + { + "text": "clown", + "correct": true + }, + { + "text": "souffle", + "correct": true + }, + { + "text": "dans", + "correct": true + }, + { + "text": "sa", + "correct": true + }, + { + "text": "tronpette.", + "correct": false, + "expected": "trompette.", + "rule_id": "regle_m_devant_mbp" + } + ], + "hint": "Devant « p », quelle lettre faut-il écrire ?", + "explanation": "Devant « p », on écrit « m » : « trompette ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_correction_03.json b/data/exercises/ce1/ce1_m_mbp_correction_03.json new file mode 100644 index 0000000..5a0a823 --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_correction_03.json @@ -0,0 +1,49 @@ +{ + "id": "ce1_m_mbp_correction_03", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Il", + "correct": true + }, + { + "text": "faut", + "correct": true + }, + { + "text": "changer", + "correct": true + }, + { + "text": "l'anpoule", + "correct": false, + "expected": "l'ampoule", + "rule_id": "regle_m_devant_mbp" + }, + { + "text": "de", + "correct": true + }, + { + "text": "la", + "correct": true + }, + { + "text": "cuisine.", + "correct": true + } + ], + "hint": "Devant « p », quelle lettre faut-il écrire ?", + "explanation": "Devant « p », on écrit « m » : « ampoule ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_correction_04.json b/data/exercises/ce1/ce1_m_mbp_correction_04.json new file mode 100644 index 0000000..c3bc534 --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_correction_04.json @@ -0,0 +1,53 @@ +{ + "id": "ce1_m_mbp_correction_04", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 3, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Lola", + "correct": true + }, + { + "text": "va", + "correct": true + }, + { + "text": "enmener", + "correct": false, + "expected": "emmener", + "rule_id": "regle_m_devant_mbp" + }, + { + "text": "son", + "correct": true + }, + { + "text": "chien", + "correct": true + }, + { + "text": "chez", + "correct": true + }, + { + "text": "le", + "correct": true + }, + { + "text": "vétérinaire.", + "correct": true + } + ], + "hint": "Devant un « m », on écrit aussi « m ».", + "explanation": "Devant « m », on écrit « m » : « emmener » (deux m).", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_01.json b/data/exercises/ce1/ce1_m_mbp_qcm_01.json new file mode 100644 index 0000000..a4142c8 --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_01.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_01", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Papa allume la ... près du lit.", + "answers": [ + "lampe", + "lanpe" + ], + "correct_answer": 0, + "hint": "Après la voyelle, on entend [p] : quelle lettre faut-il avant ?", + "explanation": "Devant « p », on écrit « m » : « lampe ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_02.json b/data/exercises/ce1/ce1_m_mbp_qcm_02.json new file mode 100644 index 0000000..3e3a53f --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_02.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_02", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le garçon a mal à la ... .", + "answers": [ + "jambe", + "janbe" + ], + "correct_answer": 0, + "hint": "Regarde la lettre qui suit : un « b ».", + "explanation": "Devant « b », on écrit « m » : « jambe ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_03.json b/data/exercises/ce1/ce1_m_mbp_qcm_03.json new file mode 100644 index 0000000..ee3e5dc --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_03.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_03", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Je colle un ... sur l'enveloppe.", + "answers": [ + "timbre", + "tinbre" + ], + "correct_answer": 0, + "hint": "Regarde la lettre qui suit : un « b ».", + "explanation": "Devant « b », on écrit « m » : « timbre ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_04.json b/data/exercises/ce1/ce1_m_mbp_qcm_04.json new file mode 100644 index 0000000..26c6c6f --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_04.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_04", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le ... éteint l'incendie.", + "answers": [ + "pompier", + "ponpier" + ], + "correct_answer": 0, + "hint": "Devant « p », quelle lettre faut-il écrire ?", + "explanation": "Devant « p », on écrit « m » : « pompier ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_05.json b/data/exercises/ce1/ce1_m_mbp_qcm_05.json new file mode 100644 index 0000000..b3ed17f --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_05.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_05", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Il joue du ... dans la fanfare.", + "answers": [ + "tambour", + "tanbour" + ], + "correct_answer": 0, + "hint": "Devant « b », quelle lettre faut-il écrire ?", + "explanation": "Devant « b », on écrit « m » : « tambour ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_06.json b/data/exercises/ce1/ce1_m_mbp_qcm_06.json new file mode 100644 index 0000000..2bfba71 --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_06.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_06", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Nous dormons sous une ... dans le camping.", + "answers": [ + "tente", + "temte" + ], + "correct_answer": 0, + "hint": "Attention : la lettre qui suit n'est ni « m », ni « b », ni « p ».", + "explanation": "Devant « t », on écrit « n » : « tente ». La règle du « m » ne vaut que devant m, b, p.", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_07.json b/data/exercises/ce1/ce1_m_mbp_qcm_07.json new file mode 100644 index 0000000..869df0c --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_07.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_07", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Ma ... est au premier étage.", + "answers": [ + "chambre", + "chanbre" + ], + "correct_answer": 0, + "hint": "Regarde la lettre qui suit : un « b ».", + "explanation": "Devant « b », on écrit « m » : « chambre ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_m_mbp_qcm_08.json b/data/exercises/ce1/ce1_m_mbp_qcm_08.json new file mode 100644 index 0000000..abea06c --- /dev/null +++ b/data/exercises/ce1/ce1_m_mbp_qcm_08.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_m_mbp_qcm_08", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_m_devant_mbp", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les vaches mangent dans le ... .", + "answers": [ + "champ", + "chanp" + ], + "correct_answer": 0, + "hint": "Devant « p », quelle lettre faut-il écrire ?", + "explanation": "Devant « p », on écrit « m » : « champ ».", + "review_tags": [ + "sons_lettres", + "m_mbp" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_correction_01.json b/data/exercises/ce1/ce1_s_ss_correction_01.json new file mode 100644 index 0000000..285d2f5 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_correction_01.json @@ -0,0 +1,45 @@ +{ + "id": "ce1_s_ss_correction_01", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "La", + "correct": true + }, + { + "text": "fillette", + "correct": true + }, + { + "text": "sent", + "correct": true + }, + { + "text": "une", + "correct": true + }, + { + "text": "belle", + "correct": true + }, + { + "text": "roze.", + "correct": false, + "expected": "rose.", + "rule_id": "regle_s_ss" + } + ], + "hint": "Écoute : tu entends [z], comme dans « maison ».", + "explanation": "On entend [z] entre deux voyelles : un seul « s », on écrit « rose ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_correction_02.json b/data/exercises/ce1/ce1_s_ss_correction_02.json new file mode 100644 index 0000000..5e5abd3 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_correction_02.json @@ -0,0 +1,49 @@ +{ + "id": "ce1_s_ss_correction_02", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Tom", + "correct": true + }, + { + "text": "pouse", + "correct": false, + "expected": "pousse", + "rule_id": "regle_s_ss" + }, + { + "text": "la", + "correct": true + }, + { + "text": "porte", + "correct": true + }, + { + "text": "de", + "correct": true + }, + { + "text": "la", + "correct": true + }, + { + "text": "cabane.", + "correct": true + } + ], + "hint": "Tu entends le son [s] entre deux voyelles.", + "explanation": "Pour entendre [s] entre deux voyelles, on écrit « ss » : « pousse ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_correction_03.json b/data/exercises/ce1/ce1_s_ss_correction_03.json new file mode 100644 index 0000000..92736a5 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_correction_03.json @@ -0,0 +1,49 @@ +{ + "id": "ce1_s_ss_correction_03", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Sara", + "correct": true + }, + { + "text": "se", + "correct": true + }, + { + "text": "brose", + "correct": false, + "expected": "brosse", + "rule_id": "regle_s_ss" + }, + { + "text": "les", + "correct": true + }, + { + "text": "dents", + "correct": true + }, + { + "text": "le", + "correct": true + }, + { + "text": "soir.", + "correct": true + } + ], + "hint": "Tu entends le son [s] entre deux voyelles.", + "explanation": "Pour entendre [s] entre deux voyelles, on écrit « ss » : « brosse ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_correction_04.json b/data/exercises/ce1/ce1_s_ss_correction_04.json new file mode 100644 index 0000000..47bd554 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_correction_04.json @@ -0,0 +1,53 @@ +{ + "id": "ce1_s_ss_correction_04", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 3, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Les", + "correct": true + }, + { + "text": "enfants", + "correct": true + }, + { + "text": "sont", + "correct": true + }, + { + "text": "asis", + "correct": false, + "expected": "assis", + "rule_id": "regle_s_ss" + }, + { + "text": "autour", + "correct": true + }, + { + "text": "de", + "correct": true + }, + { + "text": "la", + "correct": true + }, + { + "text": "table.", + "correct": true + } + ], + "hint": "Écoute le son [s] entre le « a » et le « i ».", + "explanation": "Pour entendre [s] entre deux voyelles, on écrit « ss » : « assis ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_01.json b/data/exercises/ce1/ce1_s_ss_qcm_01.json new file mode 100644 index 0000000..0558339 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_01.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_01", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le chat boit dans une ... .", + "answers": [ + "tasse", + "tase" + ], + "correct_answer": 0, + "hint": "Pour entendre [s] entre deux voyelles, il faut deux s.", + "explanation": "Entre deux voyelles, on écrit « ss » pour le son [s] : « tasse ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_02.json b/data/exercises/ce1/ce1_s_ss_qcm_02.json new file mode 100644 index 0000000..6b87801 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_02.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_02", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Il y a une ... près de la table.", + "answers": [ + "chaise", + "chaisse" + ], + "correct_answer": 0, + "hint": "Ici, on entend le son [z], comme dans « rose ».", + "explanation": "On entend [z] entre deux voyelles : un seul « s » suffit, on écrit « chaise ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_03.json b/data/exercises/ce1/ce1_s_ss_qcm_03.json new file mode 100644 index 0000000..6ab6cab --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_03.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_03", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Ma ... est près de l'école.", + "answers": [ + "maison", + "maisson" + ], + "correct_answer": 0, + "hint": "Écoute : tu entends [z], pas [s].", + "explanation": "On entend [z] entre deux voyelles : un seul « s », on écrit « maison ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_04.json b/data/exercises/ce1/ce1_s_ss_qcm_04.json new file mode 100644 index 0000000..4e62017 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_04.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_04", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Un ... nage dans l'aquarium.", + "answers": [ + "poisson", + "poison" + ], + "correct_answer": 0, + "hint": "Pense à l'animal qui vit dans l'eau, et au son [s].", + "explanation": "Pour le son [s] entre deux voyelles, on écrit « ss » : « poisson ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_05.json b/data/exercises/ce1/ce1_s_ss_qcm_05.json new file mode 100644 index 0000000..b7a9898 --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_05.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_05", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Un petit ... chante sur la branche.", + "answers": [ + "oiseau", + "oisseau" + ], + "correct_answer": 0, + "hint": "Écoute bien : on entend [z] dans ce mot.", + "explanation": "On entend [z] entre deux voyelles : un seul « s », on écrit « oiseau ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_06.json b/data/exercises/ce1/ce1_s_ss_qcm_06.json new file mode 100644 index 0000000..dac903f --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_06.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_06", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Léa fait un beau ... de son chat.", + "answers": [ + "dessin", + "desin" + ], + "correct_answer": 0, + "hint": "Le son [s] entre deux voyelles s'écrit avec deux s.", + "explanation": "Pour entendre [s] entre « e » et « i », on écrit « ss » : « dessin ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_07.json b/data/exercises/ce1/ce1_s_ss_qcm_07.json new file mode 100644 index 0000000..2985d7f --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_07.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_07", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "La maîtresse entre dans la ... .", + "answers": [ + "classe", + "clase" + ], + "correct_answer": 0, + "hint": "Entre « a » et « e », quel son entends-tu ?", + "explanation": "Pour le son [s] entre deux voyelles, on écrit « ss » : « classe ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce1/ce1_s_ss_qcm_08.json b/data/exercises/ce1/ce1_s_ss_qcm_08.json new file mode 100644 index 0000000..809896d --- /dev/null +++ b/data/exercises/ce1/ce1_s_ss_qcm_08.json @@ -0,0 +1,23 @@ +{ + "id": "ce1_s_ss_qcm_08", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "rule_id": "regle_s_ss", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le petit garçon ... sur la glace.", + "answers": [ + "glisse", + "glise" + ], + "correct_answer": 0, + "hint": "Le son [s] se trouve entre le « i » et le « e ».", + "explanation": "Pour entendre [s] entre deux voyelles, on écrit « ss » : « glisse ».", + "review_tags": [ + "sons_lettres", + "s_ss" + ], + "review_status": "draft" +} diff --git a/data/localization/fr.json b/data/localization/fr.json index 2403f0b..89eaedb 100644 --- a/data/localization/fr.json +++ b/data/localization/fr.json @@ -11,11 +11,7 @@ "profile_create.confirm_button": "Commencer l'aventure", "profile_create.cancel_button": "Retour", "profile_create.name_required_error": "Choisis un prénom avant de continuer.", - "world_map.title": "La forêt des accords", "world_map.guide_hint": "Choisis un lieu pour commencer l'aventure !", - "world_map.title_ce2": "Le marais des homophones", - "world_map.review_ce1_button": "Revoir le CE1", - "world_map.back_to_ce2_button": "Retour au CE2", "world_map.status_decouverte": "À découvrir", "world_map.status_en_acquisition": "En entraînement", "world_map.status_en_consolidation": "En progrès", @@ -117,5 +113,12 @@ "adult.delete_confirm_message": "Effacer pour toujours le profil « %s » et toute sa progression ? Pense à l'exporter avant si tu veux pouvoir le restaurer.", "adult.delete_confirm_yes": "Oui, supprimer", "adult.delete_confirm_no": "Non, annuler", - "adult.delete_done": "Profil supprimé." + "adult.delete_done": "Profil supprimé.", + "world_map.review_level_button": "Revoir le %s", + "world_map.back_to_level_button": "Retour au %s", + "world_map.other_region_button": "Aller : %s", + "profile_create.level_cm1": "CM1", + "profile_create.level_cm2": "CM2", + "skill.sons_et_lettres": "Sons et lettres", + "world_map.coming_soon": "Ce niveau arrive bientôt !" } diff --git a/data/missions/mission_22_seau_et_pelle.json b/data/missions/mission_22_seau_et_pelle.json new file mode 100644 index 0000000..8b00a01 --- /dev/null +++ b/data/missions/mission_22_seau_et_pelle.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_22_seau_et_pelle", + "title": "Le seau et la pelle", + "narrative_context": "Sur la plage, un seau est rempli de mots. Choisis la bonne écriture pour que le château de sable tienne debout !", + "rule_id": "regle_s_ss", + "exercise_type": "multiple_choice", + "map_position": { + "x": 0.15, + "y": 0.15 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_23_panier_coquillages.json b/data/missions/mission_23_panier_coquillages.json new file mode 100644 index 0000000..b54c2fe --- /dev/null +++ b/data/missions/mission_23_panier_coquillages.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_23_panier_coquillages", + "title": "Le panier à coquillages", + "narrative_context": "Des coquillages portent un mot mal écrit. Trouve celui qui cloche et remets-le d'aplomb.", + "rule_id": "regle_s_ss", + "exercise_type": "sentence_correction", + "map_position": { + "x": 0.5, + "y": 0.15 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_24_coquille_murmure.json b/data/missions/mission_24_coquille_murmure.json new file mode 100644 index 0000000..208a090 --- /dev/null +++ b/data/missions/mission_24_coquille_murmure.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_24_coquille_murmure", + "title": "La coquille qui murmure", + "narrative_context": "Colle ton oreille à la coquille : elle murmure une phrase, une seule fois. Écoute bien et écris-la en entier.", + "rule_id": "regle_s_ss", + "exercise_type": "dictation", + "map_position": { + "x": 0.85, + "y": 0.15 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_25_phare_du_petit_c.json b/data/missions/mission_25_phare_du_petit_c.json new file mode 100644 index 0000000..cfcce29 --- /dev/null +++ b/data/missions/mission_25_phare_du_petit_c.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_25_phare_du_petit_c", + "title": "Le phare du petit ç", + "narrative_context": "Le gardien du phare a perdu une cédille. Aide-le à choisir la bonne écriture pour guider les bateaux.", + "rule_id": "regle_c_cedille", + "exercise_type": "multiple_choice", + "map_position": { + "x": 0.15, + "y": 0.5 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_26_balancoire_du_port.json b/data/missions/mission_26_balancoire_du_port.json new file mode 100644 index 0000000..29e758d --- /dev/null +++ b/data/missions/mission_26_balancoire_du_port.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_26_balancoire_du_port", + "title": "La balançoire du port", + "narrative_context": "Sur le port, des lettres se sont balancées trop loin. Trouve le mot fautif et corrige-le.", + "rule_id": "regle_c_cedille", + "exercise_type": "sentence_correction", + "map_position": { + "x": 0.5, + "y": 0.5 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_27_cerf_volant_parleur.json b/data/missions/mission_27_cerf_volant_parleur.json new file mode 100644 index 0000000..e772390 --- /dev/null +++ b/data/missions/mission_27_cerf_volant_parleur.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_27_cerf_volant_parleur", + "title": "Le cerf-volant parleur", + "narrative_context": "Le cerf-volant te souffle une phrase, une seule fois. Écoute-le bien et écris exactement ce qu'il dit.", + "rule_id": "regle_c_cedille", + "exercise_type": "dictation", + "map_position": { + "x": 0.85, + "y": 0.5 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_28_chateau_de_sable.json b/data/missions/mission_28_chateau_de_sable.json new file mode 100644 index 0000000..a41c12b --- /dev/null +++ b/data/missions/mission_28_chateau_de_sable.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_28_chateau_de_sable", + "title": "Le château de sable", + "narrative_context": "Ton château de sable a des tours en « m » et en « n ». Choisis la bonne lettre pour qu'il résiste aux vagues.", + "rule_id": "regle_m_devant_mbp", + "exercise_type": "multiple_choice", + "map_position": { + "x": 0.15, + "y": 0.85 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_29_bateau_des_pompiers.json b/data/missions/mission_29_bateau_des_pompiers.json new file mode 100644 index 0000000..163a780 --- /dev/null +++ b/data/missions/mission_29_bateau_des_pompiers.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_29_bateau_des_pompiers", + "title": "Le bateau des pompiers", + "narrative_context": "Les pompiers du port ont un message mal écrit. Repère le mot fautif et remplace-le par le bon.", + "rule_id": "regle_m_devant_mbp", + "exercise_type": "sentence_correction", + "map_position": { + "x": 0.5, + "y": 0.85 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_30_tambour_de_la_plage.json b/data/missions/mission_30_tambour_de_la_plage.json new file mode 100644 index 0000000..4fe1e46 --- /dev/null +++ b/data/missions/mission_30_tambour_de_la_plage.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_30_tambour_de_la_plage", + "title": "Le tambour de la plage", + "narrative_context": "Le tambour de la plage bat une phrase, une seule fois. Écoute bien et écris-la sans faute.", + "rule_id": "regle_m_devant_mbp", + "exercise_type": "dictation", + "map_position": { + "x": 0.85, + "y": 0.85 + }, + "review_status": "draft" +} diff --git a/data/rules/regle_c_cedille.json b/data/rules/regle_c_cedille.json new file mode 100644 index 0000000..895f158 --- /dev/null +++ b/data/rules/regle_c_cedille.json @@ -0,0 +1,9 @@ +{ + "rule_id": "regle_c_cedille", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "statement": "Devant a, o ou u, la lettre « c » se prononce [k]. Pour entendre le son [s], on écrit « ç » avec une cédille.", + "example": "Un garçon. Une leçon. Ça va.", + "review_status": "draft" +} diff --git a/data/rules/regle_m_devant_mbp.json b/data/rules/regle_m_devant_mbp.json new file mode 100644 index 0000000..5459d09 --- /dev/null +++ b/data/rules/regle_m_devant_mbp.json @@ -0,0 +1,9 @@ +{ + "rule_id": "regle_m_devant_mbp", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "statement": "Devant les lettres m, b et p, on écrit « m » et non « n ».", + "example": "Une lampe. Une jambe. Un timbre.", + "review_status": "draft" +} diff --git a/data/rules/regle_s_ss.json b/data/rules/regle_s_ss.json new file mode 100644 index 0000000..9eb3594 --- /dev/null +++ b/data/rules/regle_s_ss.json @@ -0,0 +1,9 @@ +{ + "rule_id": "regle_s_ss", + "level": "CE1", + "domain": "orthographe", + "skill": "sons_et_lettres", + "statement": "Entre deux voyelles, la lettre « s » seule se prononce [z]. Pour entendre le son [s], on écrit « ss ».", + "example": "Une rose. Un poisson. Une tasse.", + "review_status": "draft" +} diff --git a/data/schemas/curriculum.schema.json b/data/schemas/curriculum.schema.json index 46565c8..3b72e2e 100644 --- a/data/schemas/curriculum.schema.json +++ b/data/schemas/curriculum.schema.json @@ -10,10 +10,13 @@ ], "additionalProperties": false, "properties": { - "level": { "type": "string", "enum": ["CE1", "CE2"] }, + "level": { "type": "string", "enum": ["CE1", "CE2", "CM1", "CM2"] }, "region_id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "chapter_id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "title": { "type": "string", "minLength": 1 }, + "region_title": { "type": "string", "minLength": 1 }, + "order": { "type": "integer", "minimum": 1, "maximum": 3 }, + "backdrop": { "type": "string", "enum": ["forest", "marsh", "beach"] }, "rule_ids": { "type": "array", "minItems": 1, diff --git a/data/schemas/dictation.schema.json b/data/schemas/dictation.schema.json index d32120d..3f5520d 100644 --- a/data/schemas/dictation.schema.json +++ b/data/schemas/dictation.schema.json @@ -16,7 +16,7 @@ "additionalProperties": false, "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, - "level": { "type": "string", "enum": ["CE1", "CE2"] }, + "level": { "type": "string", "enum": ["CE1", "CE2", "CM1", "CM2"] }, "domain": { "type": "string", "enum": ["grammaire", "orthographe"] }, "rule_ids": { "type": "array", diff --git a/data/schemas/exercise_multiple_choice.schema.json b/data/schemas/exercise_multiple_choice.schema.json index 7f86b10..cfa6860 100644 --- a/data/schemas/exercise_multiple_choice.schema.json +++ b/data/schemas/exercise_multiple_choice.schema.json @@ -20,7 +20,7 @@ "additionalProperties": false, "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, - "level": { "type": "string", "enum": ["CE1", "CE2"] }, + "level": { "type": "string", "enum": ["CE1", "CE2", "CM1", "CM2"] }, "domain": { "type": "string", "enum": ["grammaire", "orthographe"] }, "skill": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "rule_id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, diff --git a/data/schemas/exercise_sentence_correction.schema.json b/data/schemas/exercise_sentence_correction.schema.json index 1d532f0..cf78581 100644 --- a/data/schemas/exercise_sentence_correction.schema.json +++ b/data/schemas/exercise_sentence_correction.schema.json @@ -18,7 +18,7 @@ "additionalProperties": false, "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, - "level": { "type": "string", "enum": ["CE1", "CE2"] }, + "level": { "type": "string", "enum": ["CE1", "CE2", "CM1", "CM2"] }, "domain": { "type": "string", "enum": ["grammaire", "orthographe"] }, "skill": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "rule_id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, diff --git a/data/schemas/rule.schema.json b/data/schemas/rule.schema.json index 81d49ca..2ba33f6 100644 --- a/data/schemas/rule.schema.json +++ b/data/schemas/rule.schema.json @@ -12,7 +12,7 @@ "additionalProperties": false, "properties": { "rule_id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, - "level": { "type": "string", "enum": ["CE1", "CE2"] }, + "level": { "type": "string", "enum": ["CE1", "CE2", "CM1", "CM2"] }, "domain": { "type": "string", "enum": ["grammaire", "orthographe"] }, "skill": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "statement": { "type": "string", "minLength": 1 }, diff --git a/data/schemas/save.schema.json b/data/schemas/save.schema.json index f03f570..2eebbab 100644 --- a/data/schemas/save.schema.json +++ b/data/schemas/save.schema.json @@ -16,7 +16,7 @@ "schema_version": { "type": "integer", "minimum": 1 }, "profile_id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "display_name": { "type": "string", "minLength": 1 }, - "school_level": { "type": "string", "enum": ["CE1", "CE2"] }, + "school_level": { "type": "string", "enum": ["CE1", "CE2", "CM1", "CM2"] }, "session_count": { "type": "integer", "minimum": 0 }, "unlocked_regions": { "type": "array", "items": { "type": "string" } }, "skills": { diff --git a/docs/specs/decisions.md b/docs/specs/decisions.md index 742f1d9..4e9d3d5 100644 --- a/docs/specs/decisions.md +++ b/docs/specs/decisions.md @@ -358,3 +358,17 @@ Ajouts à l'arborescence proposée : ## 37. Suppression d'un profil réservée à l'adulte (version 0.5.6) Demande utilisateur. Le bouton « Supprimer » est retiré de la sélection de profil (côté enfant) ; la suppression se fait dans l'espace adulte, derrière la barrière (point 32), via « Supprimer ce profil » avec une confirmation explicite qui nomme le profil et rappelle de l'exporter avant. Une suppression n'affecte jamais un autre profil. Le cahier des charges §9 (confirmation explicite) est respecté. + +## 38. Plusieurs « tableaux » par niveau, niveaux CM1/CM2, tableau pilote (version 0.6.0) + +Demande utilisateur : chaque niveau peut avoir jusqu'à 3 tableaux (lieux : forêt, marais, plage…) traitant d'autres règles de grammaire et d'orthographe, avec la même exigence « aucune phrase en double », et le jeu s'ouvre à CM1 et CM2 sur le même principe. Les notions s'inspirent de ce que travaillent les cahiers de ce type ; **seules les règles sont reprises, tous les textes sont originaux** (invariant du projet : rien du BLED n'est reproduit, son nom n'apparaît pas). + +**Format (validé par l'utilisateur avant implémentation)** : le niveau scolaire des schémas (`save`, `rule`, `curriculum`, `dictation`, exercices) passe de CE1/CE2 à CE1/CE2/CM1/CM2. Ajout compatible : aucun profil existant n'est migré, `schema_version` reste 2 ; une ancienne version du jeu ne lirait pas un profil CM. La liste est unique (`SchoolLevels`, testée contre les schémas). + +**Tableau = fichier de `data/curriculum/`** : nouveaux champs optionnels `region_title` (nom affiché), `order` (1 à 3) et `backdrop` (décor, liste fermée `BackdropKinds`, testée contre l'art disponible). Une mission appartient au tableau qui contient sa règle : aucun champ de plus dans les missions ni dans les sauvegardes. Garde-fous (`test_curriculum`) : une règle dans un seul tableau, du bon niveau, 3 tableaux maximum par niveau, toute mission rattachée à un tableau. + +**Carte** : bouton « Aller : » pour passer d'un tableau à l'autre ; « Revoir le » / « Retour au » généralisé ; on revient au dernier tableau consulté après une mission. Décor et musique automatique suivent le tableau (plage → morceau « rivière »). Création de profil : seuls les niveaux ayant du contenu sont proposés (CM1/CM2 apparaîtront avec leur premier tableau). + +**Tableau pilote CE1 « La plage des sons »** (`order` 2, décor plage) : 3 règles (s/ss entre deux voyelles, c/ç devant a-o-u, m devant m-b-p), 24 QCM, 12 corrections, 9 dictées (voix Piper provisoire, audio généré), 9 missions, compétence « sons et lettres ». Contenu entièrement `draft`. Unicité : tous les énoncés passent les gardes-fous de phrases en double et quasi doubles (points 34 et 36). + +**Reste à faire** : CE1 tableau 3 (« La montagne des verbes »), CE2 tableaux 2 et 3, CM1 et CM2 (3 tableaux chacun), d'autres décors et musiques par tableau. **Non vérifié** : lisibilité des nouvelles voix de dictée, pertinence pédagogique des règles et du niveau de difficulté (à relire), autres résolutions. diff --git a/docs/testing/manual-checklist.md b/docs/testing/manual-checklist.md index 3b1683d..02615cb 100644 --- a/docs/testing/manual-checklist.md +++ b/docs/testing/manual-checklist.md @@ -22,6 +22,12 @@ Tout ce qui suit ne peut pas être vérifié sans écran (rendu, mise en page, a 13. Quitter le jeu puis relancer `make run` : le profil et sa progression doivent être conservés (sélectionner le même profil, vérifier que l'état affiché sur la carte a changé par rapport à l'état initial). 14. La suppression d'un profil n'est plus sur la sélection de profil (point 37 de `decisions.md`) : Réglages → Espace adulte (barrière) → choisir le profil → « Supprimer ce profil » : une confirmation explicite nomme le profil ; annuler ne supprime rien ; les autres profils restent intacts. +## Tableaux supplémentaires (point 38 de `decisions.md`) + +- Profil CE1 : la carte « La forêt des accords » propose « Aller : La plage des sons » ; le tableau de la plage s'affiche avec son décor (mer, sable), ses 9 lieux sans chevauchement, et le bouton ramène à la forêt. Après une mission, on revient au tableau d'où l'on vient. +- Jouer une mission de chaque règle de la plage (s/ss, ç, m devant m-b-p), dont une dictée : voix claire, énoncés sans répétition, indices et explications justes. +- Création de profil : seuls CE1 et CE2 sont proposés (CM1/CM2 n'ont pas encore de contenu). + ## Accessibilité et interface - Habillage (point 31 de `decisions.md`) : relire chaque écran (profils, carte CE1 et CE2, introduction, règle, les trois types d'exercice, retour juste/faux, récompense, collection) ; le rendu à 1152x648 a été relu sur captures, pas les autres tailles ni le tactile. Redimensionner la fenêtre : les lieux de la carte restent entiers et ne se chevauchent pas. diff --git a/project.godot b/project.godot index 56f8108..8487842 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Les Aventuriers des mots" -config/version="0.5.6" +config/version="0.6.0" run/main_scene="res://scenes/boot/boot.tscn" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg" diff --git a/scenes/exercises/exercise_host.gd b/scenes/exercises/exercise_host.gd index 106d4ce..b7b5c61 100644 --- a/scenes/exercises/exercise_host.gd +++ b/scenes/exercises/exercise_host.gd @@ -65,8 +65,9 @@ func _ready() -> void: _rule = ExerciseEngine.get_rule(_mission["rule_id"]) _skill_id = _rule.get("skill", "") _current_difficulty = ProgressManager.next_difficulty_for_skill(_skill_id, 1) - $Backdrop.kind = "marsh" if _rule.get("level", "CE1") == "CE2" else "forest" - AudioManager.play_region_music(_rule.get("level", "CE1")) + var backdrop_kind := ExerciseEngine.backdrop_for_rule(_mission["rule_id"]) + $Backdrop.kind = backdrop_kind + AudioManager.play_region_music(backdrop_kind) _show_rule_panel() diff --git a/scenes/profiles/profile_create.gd b/scenes/profiles/profile_create.gd index dfe3bb4..36b6bdd 100644 --- a/scenes/profiles/profile_create.gd +++ b/scenes/profiles/profile_create.gd @@ -7,8 +7,7 @@ extends Control @onready var _name_label: Label = %NameLabel @onready var _name_edit: LineEdit = %NameEdit @onready var _level_label: Label = %LevelLabel -@onready var _ce1_button: Button = %CE1Button -@onready var _ce2_button: Button = %CE2Button +@onready var _level_box: HBoxContainer = %LevelBox @onready var _error_label: Label = %ErrorLabel @onready var _confirm_button: Button = %ConfirmButton @onready var _cancel_button: Button = %CancelButton @@ -19,26 +18,52 @@ func _ready() -> void: _name_label.text = UIText.get_text("profile_create.name_label") _name_edit.placeholder_text = UIText.get_text("profile_create.name_placeholder") _level_label.text = UIText.get_text("profile_create.level_label") - _ce1_button.text = UIText.get_text("profile_create.level_ce1") - _ce2_button.text = UIText.get_text("profile_create.level_ce2") _error_label.text = UIText.get_text("profile_create.name_required_error") _error_label.visible = false _confirm_button.text = UIText.get_text("profile_create.confirm_button") _cancel_button.text = UIText.get_text("profile_create.cancel_button") - _ce1_button.button_pressed = true + _build_level_buttons() _confirm_button.pressed.connect(_on_confirm_pressed) _cancel_button.pressed.connect(_on_cancel_pressed) +## Un bouton par niveau (SchoolLevels.ALL), un seul actif a la fois ; CE1 par +## defaut. +func _build_level_buttons() -> void: + var group := ButtonGroup.new() + for level in SchoolLevels.ALL: + # Un niveau sans contenu n'est pas propose (il apparait avec ses tableaux). + if ExerciseEngine.get_regions_for_level(level).is_empty(): + continue + var button := Button.new() + button.text = UIText.get_text("profile_create.level_%s" % level.to_lower()) + button.theme_type_variation = &"SecondaryButton" + button.toggle_mode = true + button.button_group = group + button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + button.custom_minimum_size = Vector2(0, 56) + button.set_meta("level", level) + button.button_pressed = _level_box.get_child_count() == 0 + _level_box.add_child(button) + + +func _selected_level() -> String: + for child in _level_box.get_children(): + var button := child as Button + if button != null and button.button_pressed: + return button.get_meta("level") + return "CE1" + + func _on_confirm_pressed() -> void: var display_name := _name_edit.text.strip_edges() if display_name.is_empty(): _error_label.visible = true return - var school_level := "CE1" if _ce1_button.button_pressed else "CE2" + var school_level := _selected_level() var profile_id := ProfileManager.create_profile(display_name, school_level) if ProfileManager.select_profile(profile_id): GameManager.goto(GameManager.SCENE_WORLD_MAP) diff --git a/scenes/profiles/profile_create.tscn b/scenes/profiles/profile_create.tscn index bafb7f6..1ac8f2e 100644 --- a/scenes/profiles/profile_create.tscn +++ b/scenes/profiles/profile_create.tscn @@ -1,11 +1,9 @@ -[gd_scene load_steps=4 format=3] +[gd_scene load_steps=3 format=3] [ext_resource type="Script" path="res://scenes/profiles/profile_create.gd" id="1"] [ext_resource type="PackedScene" path="res://scenes/ui/backdrop.tscn" id="backdrop"] -[sub_resource type="ButtonGroup" id="SchoolLevelGroup"] - [node name="ProfileCreate" type="Control"] layout_mode = 3 anchors_preset = 15 @@ -71,27 +69,10 @@ unique_name_in_owner = true layout_mode = 2 [node name="LevelBox" type="HBoxContainer" parent="Margin/Center/Card/VBox"] +unique_name_in_owner = true layout_mode = 2 theme_override_constants/separation = 16 -[node name="CE1Button" type="Button" parent="Margin/Center/Card/VBox/LevelBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -custom_minimum_size = Vector2(0, 56) -theme_type_variation = &"SecondaryButton" -toggle_mode = true -button_group = SubResource("SchoolLevelGroup") - -[node name="CE2Button" type="Button" parent="Margin/Center/Card/VBox/LevelBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -custom_minimum_size = Vector2(0, 56) -theme_type_variation = &"SecondaryButton" -toggle_mode = true -button_group = SubResource("SchoolLevelGroup") - [node name="ConfirmButton" type="Button" parent="Margin/Center/Card/VBox"] unique_name_in_owner = true layout_mode = 2 diff --git a/scenes/profiles/profile_select.gd b/scenes/profiles/profile_select.gd index 27029ca..f0d3b66 100644 --- a/scenes/profiles/profile_select.gd +++ b/scenes/profiles/profile_select.gd @@ -17,7 +17,7 @@ func _ready() -> void: _settings_button.pressed.connect(_on_settings_pressed) _new_profile_button.pressed.connect(_on_new_profile_pressed) - AudioManager.play_region_music("CE1") + AudioManager.play_region_music("forest") _refresh_profile_list() diff --git a/scenes/ui/backdrop.gd b/scenes/ui/backdrop.gd index 84fe7bc..b9dcd4f 100644 --- a/scenes/ui/backdrop.gd +++ b/scenes/ui/backdrop.gd @@ -1,13 +1,9 @@ extends Control ## Decor plein ecran derriere un ecran (illustration vectorielle provisoire, -## voir assets/CREDITS.md). "forest" pour le CE1, "marsh" pour le CE2. +## voir assets/CREDITS.md). Le decor est celui du « tableau » (BackdropKinds) ; +## un identifiant inconnu retombe sur la foret. -const TEXTURES := { - "forest": "res://assets/environments/forest_backdrop.svg", - "marsh": "res://assets/environments/marsh_backdrop.svg", -} - -@export_enum("forest", "marsh") var kind: String = "forest": +@export var kind: String = "forest": set(value): kind = value _apply() @@ -21,4 +17,5 @@ func _ready() -> void: func _apply() -> void: if _picture != null: - _picture.texture = load(TEXTURES.get(kind, TEXTURES["forest"])) + var path: String = BackdropKinds.TEXTURES.get(kind, BackdropKinds.TEXTURES["forest"]) + _picture.texture = load(path) diff --git a/scenes/ui/reward_screen.gd b/scenes/ui/reward_screen.gd index a3d7af9..c668f4e 100644 --- a/scenes/ui/reward_screen.gd +++ b/scenes/ui/reward_screen.gd @@ -26,9 +26,9 @@ const ITEM_SIZE := 72.0 func _ready() -> void: var mission := ExerciseEngine.get_mission(GameManager.pending_mission_id) - var rule := ExerciseEngine.get_rule(mission.get("rule_id", "")) - _backdrop.kind = "marsh" if rule.get("level", "CE1") == "CE2" else "forest" - AudioManager.play_region_music(rule.get("level", "CE1")) + var backdrop_kind := ExerciseEngine.backdrop_for_rule(mission.get("rule_id", "")) + _backdrop.kind = backdrop_kind + AudioManager.play_region_music(backdrop_kind) var summary := ProgressManager.complete_mission( GameManager.pending_mission_id, GameManager.last_outcomes diff --git a/scenes/ui/settings.gd b/scenes/ui/settings.gd index 2006f19..cd95392 100644 --- a/scenes/ui/settings.gd +++ b/scenes/ui/settings.gd @@ -95,7 +95,7 @@ func _build_track_option() -> void: func _on_track_selected(index: int) -> void: SettingsManager.set_music_track(SoundCatalog.music_choices()[index]) # On fait entendre le choix tout de suite. - AudioManager.play_region_music(ProgressManager.school_level()) + AudioManager.play_region_music(AudioManager.current_backdrop_kind()) func _on_volume_changed(value: float) -> void: diff --git a/scenes/world/mission_intro.gd b/scenes/world/mission_intro.gd index 80c3cf7..cba4921 100644 --- a/scenes/world/mission_intro.gd +++ b/scenes/world/mission_intro.gd @@ -13,8 +13,7 @@ func _ready() -> void: var mission := ExerciseEngine.get_mission(GameManager.pending_mission_id) _title_label.text = mission.get("title", "") _guide.say(mission.get("narrative_context", "")) - var rule := ExerciseEngine.get_rule(mission.get("rule_id", "")) - $Backdrop.kind = "marsh" if rule.get("level", "CE1") == "CE2" else "forest" + $Backdrop.kind = ExerciseEngine.backdrop_for_rule(mission.get("rule_id", "")) _start_button.text = UIText.get_text("mission_intro.start_button") _back_button.text = UIText.get_text("mission_intro.back_button") diff --git a/scenes/world/world_map.gd b/scenes/world/world_map.gd index 63e9a16..744bccf 100644 --- a/scenes/world/world_map.gd +++ b/scenes/world/world_map.gd @@ -4,17 +4,20 @@ extends Control ## etendu (docs/specs/decisions.md, points 25 et 27). La position de chaque ## mission vient de data/missions/*.json (fractions 0..1 de la zone de ## carte), jamais d'une position fixe en dur dans le script : chaque lieu est -## replace quand la zone change de taille. Un profil CE2 peut basculer sur la -## carte CE1 pour revoir les notions precedentes. +## replace quand la zone change de taille. Chaque niveau a un a trois +## « tableaux » (data/curriculum/) entre lesquels on circule ; un profil peut +## basculer sur le niveau precedent pour revoir les notions deja vues. const MARKER_SCENE := preload("res://scenes/world/mission_marker.tscn") var _viewed_level := "CE1" +var _viewed_region_id := "" @onready var _backdrop: Control = %Backdrop @onready var _title_label: Label = %TitleLabel @onready var _map_area: Control = %MapArea @onready var _level_toggle_button: Button = %LevelToggleButton +@onready var _region_button: Button = %RegionButton @onready var _total_stars_label: Label = %TotalStarsLabel @onready var _collection_button: Button = %CollectionButton @onready var _profile_button: Button = %ProfileButton @@ -24,8 +27,9 @@ var _viewed_level := "CE1" func _ready() -> void: _viewed_level = ProgressManager.school_level() - _level_toggle_button.visible = _viewed_level == "CE2" + _viewed_region_id = _initial_region_id() _level_toggle_button.pressed.connect(_on_level_toggle_pressed) + _region_button.pressed.connect(_on_region_pressed) _collection_button.text = UIText.get_text("world_map.collection_button") _collection_button.pressed.connect(_on_collection_pressed) _profile_button.text = UIText.get_text("world_map.change_profile_button") @@ -38,24 +42,63 @@ func _ready() -> void: func _refresh() -> void: - var is_ce2 := _viewed_level == "CE2" - _backdrop.kind = "marsh" if is_ce2 else "forest" - AudioManager.play_region_music(_viewed_level) - _title_label.text = UIText.get_text("world_map.title_ce2" if is_ce2 else "world_map.title") + var own_level := ProgressManager.school_level() + var previous_level := SchoolLevels.previous(own_level) + var regions := ExerciseEngine.get_regions_for_level(_viewed_level) + var region := ExerciseEngine.get_region(_viewed_region_id) + + var kind: String = region.get("backdrop", BackdropKinds.FALLBACK) + _backdrop.kind = kind if BackdropKinds.is_valid(kind) else BackdropKinds.FALLBACK + AudioManager.play_region_music(_backdrop.kind) + _title_label.text = region.get("region_title", region.get("title", "")) + + # Niveau precedent : « Revoir le CE1 » / « Retour au CE2 ». + _level_toggle_button.visible = previous_level != "" + var target_level := own_level if _viewed_level != own_level else previous_level _level_toggle_button.text = UIText.get_text( - "world_map.review_ce1_button" if is_ce2 else "world_map.back_to_ce2_button" - ) + "world_map.review_level_button" + if _viewed_level == own_level + else "world_map.back_to_level_button" + ) % target_level + + # Autres tableaux du niveau affiche : un bouton qui passe au suivant. + _region_button.visible = regions.size() > 1 + if regions.size() > 1: + var next_region := regions[(_region_index(regions) + 1) % regions.size()] + _region_button.text = ( + UIText.get_text("world_map.other_region_button") + % next_region.get("region_title", next_region["title"]) + ) _total_stars_label.text = str(ProgressManager.stars()) + if region.is_empty(): + _title_label.text = UIText.get_text("world_map.coming_soon") _populate_missions() +## Tableau a afficher a l'ouverture : celui d'ou l'on vient s'il appartient +## au niveau du profil, sinon le premier du niveau. +func _initial_region_id() -> String: + var regions := ExerciseEngine.get_regions_for_level(_viewed_level) + for region in regions: + if region["region_id"] == GameManager.map_region_id: + return region["region_id"] + return regions[0]["region_id"] if not regions.is_empty() else "" + + +func _region_index(regions: Array[Dictionary]) -> int: + for i in regions.size(): + if regions[i]["region_id"] == _viewed_region_id: + return i + return 0 + + func _populate_missions() -> void: for child in _map_area.get_children(): _map_area.remove_child(child) child.queue_free() var index := 0 - for mission: Dictionary in ExerciseEngine.get_missions_for_level(_viewed_level): + for mission: Dictionary in ExerciseEngine.get_missions_for_region(_viewed_region_id): var marker: Button = MARKER_SCENE.instantiate() _map_area.add_child(marker) marker.set_meta("map_position", mission["map_position"]) @@ -126,12 +169,26 @@ func _on_collection_pressed() -> void: func _on_level_toggle_pressed() -> void: - _viewed_level = "CE1" if _viewed_level == "CE2" else "CE2" + var own_level := ProgressManager.school_level() + _viewed_level = ( + SchoolLevels.previous(own_level) if _viewed_level == own_level else own_level + ) + _viewed_region_id = _initial_region_id() + _refresh() + + +func _on_region_pressed() -> void: + var regions := ExerciseEngine.get_regions_for_level(_viewed_level) + if regions.size() < 2: + return + _viewed_region_id = regions[(_region_index(regions) + 1) % regions.size()]["region_id"] + GameManager.map_region_id = _viewed_region_id _refresh() func _on_mission_pressed(mission_id: String) -> void: GameManager.pending_mission_id = mission_id + GameManager.map_region_id = _viewed_region_id GameManager.goto(GameManager.SCENE_MISSION_INTRO) diff --git a/scenes/world/world_map.tscn b/scenes/world/world_map.tscn index c5fa4cf..cb4ad62 100644 --- a/scenes/world/world_map.tscn +++ b/scenes/world/world_map.tscn @@ -96,6 +96,13 @@ theme_override_constants/separation = 12 unique_name_in_owner = true layout_mode = 2 +[node name="RegionButton" type="Button" parent="Margin/VBox/BottomBar"] +unique_name_in_owner = true +theme_type_variation = &"SecondaryButton" +layout_mode = 2 +size_flags_vertical = 4 +custom_minimum_size = Vector2(0, 52) + [node name="LevelToggleButton" type="Button" parent="Margin/VBox/BottomBar"] unique_name_in_owner = true theme_type_variation = &"SecondaryButton" diff --git a/scripts/audio/sound_catalog.gd b/scripts/audio/sound_catalog.gd index d143255..44e6e4c 100644 --- a/scripts/audio/sound_catalog.gd +++ b/scripts/audio/sound_catalog.gd @@ -9,7 +9,7 @@ const MUSIC_DIR := "res://assets/audio/music" const SFX_IDS: Array[String] = ["click", "success", "try_again", "star", "fanfare"] const MUSIC_IDS: Array[String] = ["forest", "marsh", "meadow", "river", "night"] -## Choix « automatique » : la musique de la region (voir music_for_level). +## Choix « automatique » : la musique du decor du tableau (BackdropKinds). const MUSIC_AUTO := "auto" @@ -25,11 +25,6 @@ static func music_path(music_id: String) -> String: return "%s/%s.ogg" % [MUSIC_DIR, music_id] -## Musique d'une region selon le niveau scolaire de la regle. -static func music_for_level(level: String) -> String: - return "marsh" if level == "CE2" else "forest" - - ## Choix possibles dans les reglages : automatique puis chaque morceau. static func music_choices() -> Array[String]: var choices: Array[String] = [MUSIC_AUTO] @@ -37,8 +32,9 @@ static func music_choices() -> Array[String]: return choices -## Morceau a jouer pour le choix de l'utilisateur et le niveau scolaire. -static func resolve_music(choice: String, level: String) -> String: +## Morceau a jouer pour le choix de l'utilisateur et le decor du tableau : +## un morceau choisi vaut partout ; « automatique » suit le decor. +static func resolve_music(choice: String, backdrop_kind: String) -> String: if MUSIC_IDS.has(choice): return choice - return music_for_level(level) + return BackdropKinds.music_for(backdrop_kind) diff --git a/scripts/profiles/school_levels.gd b/scripts/profiles/school_levels.gd new file mode 100644 index 0000000..155b1b1 --- /dev/null +++ b/scripts/profiles/school_levels.gd @@ -0,0 +1,24 @@ +class_name SchoolLevels +extends RefCounted +## Niveaux scolaires du jeu, dans l'ordre de progression. Code pur. La liste +## est fermee : elle est aussi celle des schemas (data/schemas/*.json), et +## un test verifie que les deux concordent. + +const ALL: Array[String] = ["CE1", "CE2", "CM1", "CM2"] + + +static func is_valid(level: String) -> bool: + return ALL.has(level) + + +## Niveau juste avant `level` (celui que l'on peut « revoir »), ou "" pour +## le premier niveau ou une valeur inconnue. +static func previous(level: String) -> String: + var index := ALL.find(level) + return ALL[index - 1] if index > 0 else "" + + +## Rang du niveau (0 pour CE1), grand pour un niveau inconnu : sert au tri. +static func rank(level: String) -> int: + var index := ALL.find(level) + return index if index >= 0 else ALL.size() diff --git a/scripts/profiles/school_levels.gd.uid b/scripts/profiles/school_levels.gd.uid new file mode 100644 index 0000000..d1e4adf --- /dev/null +++ b/scripts/profiles/school_levels.gd.uid @@ -0,0 +1 @@ +uid://1padrqilrpin diff --git a/scripts/ui/backdrop_kinds.gd b/scripts/ui/backdrop_kinds.gd new file mode 100644 index 0000000..0cb7f9f --- /dev/null +++ b/scripts/ui/backdrop_kinds.gd @@ -0,0 +1,36 @@ +class_name BackdropKinds +extends RefCounted +## Decors disponibles (un par « tableau » de la carte) et musique associee. +## Liste fermee, resolue par identifiant vers un repertoire fixe ; un test +## verifie qu'elle concorde avec l'enum `backdrop` de +## data/schemas/curriculum.schema.json. + +const TEXTURES := { + "forest": "res://assets/environments/forest_backdrop.svg", + "marsh": "res://assets/environments/marsh_backdrop.svg", + "beach": "res://assets/environments/beach_backdrop.svg", +} + +## Morceau joue par defaut avec chaque decor (reglage « automatique »). +const MUSIC := { + "forest": "forest", + "marsh": "marsh", + "beach": "river", +} + +const FALLBACK := "forest" + + +static func kinds() -> Array[String]: + var result: Array[String] = [] + for kind: String in TEXTURES: + result.append(kind) + return result + + +static func is_valid(kind: String) -> bool: + return TEXTURES.has(kind) + + +static func music_for(kind: String) -> String: + return MUSIC.get(kind, MUSIC[FALLBACK]) diff --git a/scripts/ui/backdrop_kinds.gd.uid b/scripts/ui/backdrop_kinds.gd.uid new file mode 100644 index 0000000..6159315 --- /dev/null +++ b/scripts/ui/backdrop_kinds.gd.uid @@ -0,0 +1 @@ +uid://btn7aydf3704h diff --git a/tests/audio/test_sound_catalog.gd b/tests/audio/test_sound_catalog.gd index 382063c..b43c101 100644 --- a/tests/audio/test_sound_catalog.gd +++ b/tests/audio/test_sound_catalog.gd @@ -18,9 +18,9 @@ func test_unknown_ids_give_no_path() -> void: assert_eq(SoundCatalog.music_path("inconnue"), "") -func test_music_follows_the_level() -> void: - assert_eq(SoundCatalog.music_for_level("CE1"), "forest") - assert_eq(SoundCatalog.music_for_level("CE2"), "marsh") +func test_music_follows_the_backdrop() -> void: + assert_eq(SoundCatalog.resolve_music("auto", "forest"), "forest") + assert_eq(SoundCatalog.resolve_music("auto", "marsh"), "marsh") func test_there_are_five_music_tracks_and_an_automatic_choice() -> void: @@ -30,9 +30,9 @@ func test_there_are_five_music_tracks_and_an_automatic_choice() -> void: func test_resolve_music_follows_choice_or_level() -> void: - assert_eq(SoundCatalog.resolve_music("night", "CE1"), "night") - assert_eq(SoundCatalog.resolve_music("auto", "CE2"), "marsh") - assert_eq(SoundCatalog.resolve_music("n_importe_quoi", "CE1"), "forest") + assert_eq(SoundCatalog.resolve_music("night", "forest"), "night") + assert_eq(SoundCatalog.resolve_music("auto", "beach"), "river") + assert_eq(SoundCatalog.resolve_music("n_importe_quoi", "inconnu"), "forest") func test_every_music_choice_has_a_label() -> void: diff --git a/tests/data/test_curriculum.gd b/tests/data/test_curriculum.gd new file mode 100644 index 0000000..c73b1a4 --- /dev/null +++ b/tests/data/test_curriculum.gd @@ -0,0 +1,63 @@ +extends GutTest +## Coherence des « tableaux » (data/curriculum/) avec le reste des donnees. + + +func test_school_levels_match_the_schemas() -> void: + for schema_name in ["save", "rule", "curriculum", "dictation", "exercise_multiple_choice"]: + var schema := DataLoader.load_schema(schema_name) + var enum_values: Array = [] + if schema_name == "save": + enum_values = schema["properties"]["school_level"]["enum"] + else: + enum_values = schema["properties"]["level"]["enum"] + assert_eq(enum_values, SchoolLevels.ALL as Array, "schema %s" % schema_name) + + +func test_backdrop_enum_matches_available_art() -> void: + var schema := DataLoader.load_schema("curriculum") + var enum_values: Array = schema["properties"]["backdrop"]["enum"] + var kinds: Array = BackdropKinds.kinds() + enum_values.sort() + kinds.sort() + assert_eq(enum_values, kinds) + for kind in BackdropKinds.kinds(): + assert_true( + ResourceLoader.exists(BackdropKinds.TEXTURES[kind]), "decor manquant : %s" % kind + ) + assert_true(SoundCatalog.MUSIC_IDS.has(BackdropKinds.music_for(kind))) + + +func test_every_rule_belongs_to_exactly_one_region_of_its_level() -> void: + var owners := {} + for level in SchoolLevels.ALL: + for region in ExerciseEngine.get_regions_for_level(level): + assert_between( + ExerciseEngine.get_regions_for_level(level).size(), 1, 3, "3 tableaux maximum" + ) + for rule_id: String in region["rule_ids"]: + assert_false(owners.has(rule_id), "regle dans deux tableaux : %s" % rule_id) + owners[rule_id] = region["region_id"] + var rule := ExerciseEngine.get_rule(rule_id) + assert_false(rule.is_empty(), "regle inconnue : %s" % rule_id) + assert_eq(rule.get("level", ""), level, "niveau de %s" % rule_id) + for mission in ExerciseEngine.get_missions(): + assert_true( + owners.has(mission["rule_id"]), "mission hors tableau : %s" % mission["mission_id"] + ) + + +func test_regions_have_a_child_facing_title_and_unique_order() -> void: + for level in SchoolLevels.ALL: + var orders := {} + for region in ExerciseEngine.get_regions_for_level(level): + assert_true(region.has("region_title"), "titre manquant : %s" % region["region_id"]) + var order := int(region.get("order", 1)) + assert_false(orders.has(order), "numero de tableau en double dans %s" % level) + orders[order] = true + + +func test_school_levels_helpers() -> void: + assert_eq(SchoolLevels.previous("CE1"), "") + assert_eq(SchoolLevels.previous("CM1"), "CE2") + assert_eq(SchoolLevels.previous("n_importe_quoi"), "") + assert_true(SchoolLevels.rank("CM2") > SchoolLevels.rank("CE2")) diff --git a/tests/data/test_curriculum.gd.uid b/tests/data/test_curriculum.gd.uid new file mode 100644 index 0000000..d88f298 --- /dev/null +++ b/tests/data/test_curriculum.gd.uid @@ -0,0 +1 @@ +uid://domp0yvjne65v diff --git a/tests/data/test_mission_positions.gd b/tests/data/test_mission_positions.gd index 7acd8e6..82a84ff 100644 --- a/tests/data/test_mission_positions.gd +++ b/tests/data/test_mission_positions.gd @@ -13,20 +13,24 @@ const MIN_GAP_X := 0.2 const MIN_GAP_Y := 0.3 -func test_mission_markers_do_not_overlap_within_a_level() -> void: - for level in ["CE1", "CE2"]: - var missions := ExerciseEngine.get_missions_for_level(level) - assert_false(missions.is_empty(), "aucune mission pour %s" % level) - for i in missions.size(): - for j in range(i + 1, missions.size()): - var a: Dictionary = missions[i]["map_position"] - var b: Dictionary = missions[j]["map_position"] - var dx: float = abs(float(a["x"]) - float(b["x"])) - var dy: float = abs(float(a["y"]) - float(b["y"])) - assert_true( - dx >= MIN_GAP_X or dy >= MIN_GAP_Y, - ( - "%s et %s sont trop proches (dx=%s, dy=%s)" - % [missions[i]["mission_id"], missions[j]["mission_id"], dx, dy] - ), - ) +func test_mission_markers_do_not_overlap_within_a_region() -> void: + var checked_regions := 0 + for level in SchoolLevels.ALL: + for region in ExerciseEngine.get_regions_for_level(level): + var missions := ExerciseEngine.get_missions_for_region(region["region_id"]) + assert_false(missions.is_empty(), "aucune mission pour %s" % region["region_id"]) + checked_regions += 1 + for i in missions.size(): + for j in range(i + 1, missions.size()): + var a: Dictionary = missions[i]["map_position"] + var b: Dictionary = missions[j]["map_position"] + var dx: float = abs(float(a["x"]) - float(b["x"])) + var dy: float = abs(float(a["y"]) - float(b["y"])) + assert_true( + dx >= MIN_GAP_X or dy >= MIN_GAP_Y, + ( + "%s et %s sont trop proches (dx=%s, dy=%s)" + % [missions[i]["mission_id"], missions[j]["mission_id"], dx, dy] + ), + ) + assert_gt(checked_regions, 1) diff --git a/tests/exercises/test_exercise_engine.gd b/tests/exercises/test_exercise_engine.gd index 4669a76..b0062d8 100644 --- a/tests/exercises/test_exercise_engine.gd +++ b/tests/exercises/test_exercise_engine.gd @@ -15,7 +15,7 @@ func test_unknown_rule_returns_empty_dictionary() -> void: func test_missions_are_loaded_and_sorted() -> void: var missions := ExerciseEngine.get_missions() - assert_eq(missions.size(), 21) + assert_eq(missions.size(), 30) var ids: Array = missions.map(func(m: Dictionary) -> String: return m["mission_id"]) assert_eq(ids, ids.duplicate()) # trivialement vrai, documente l'ordre stable assert_true(ids.has("mission_01_pre_des_mots")) @@ -24,11 +24,23 @@ func test_missions_are_loaded_and_sorted() -> void: func test_missions_are_filtered_by_the_level_of_their_rule() -> void: - assert_eq(ExerciseEngine.get_missions_for_level("CE1").size(), 9) + assert_eq(ExerciseEngine.get_missions_for_level("CE1").size(), 18) assert_eq(ExerciseEngine.get_missions_for_level("CE2").size(), 12) assert_eq(ExerciseEngine.get_missions_for_level("CM1").size(), 0) +func test_regions_are_ordered_and_hold_their_missions() -> void: + var ce1 := ExerciseEngine.get_regions_for_level("CE1") + assert_eq(ce1.size(), 2) + assert_eq(ce1[0]["region_id"], "foret_des_accords") + assert_eq(ce1[1]["region_id"], "plage_des_sons") + assert_eq(ExerciseEngine.get_missions_for_region("foret_des_accords").size(), 9) + assert_eq(ExerciseEngine.get_missions_for_region("plage_des_sons").size(), 9) + assert_eq(ExerciseEngine.backdrop_for_rule("regle_s_ss"), "beach") + assert_eq(ExerciseEngine.backdrop_for_rule("regle_pluriel_nom"), "forest") + assert_eq(ExerciseEngine.backdrop_for_rule("regle_homophone_a_a"), "marsh") + + func test_reward_catalog_is_loaded_and_sorted_by_threshold() -> void: var items := ExerciseEngine.get_reward_items() assert_eq(items.size(), 10) diff --git a/tests/world/test_settings_scenes.gd b/tests/world/test_settings_scenes.gd index 0915a7f..190ea62 100644 --- a/tests/world/test_settings_scenes.gd +++ b/tests/world/test_settings_scenes.gd @@ -70,3 +70,19 @@ func test_profile_deletion_belongs_to_the_adult_space() -> void: assert_true(ProfileManager.list_profiles().has(other_id), "les autres profils sont intacts") ProfileManager.delete_profile(other_id) + + +func test_profile_creation_offers_only_levels_that_have_content() -> void: + var scene: Control = add_child_autofree( + load("res://scenes/profiles/profile_create.tscn").instantiate() + ) + await wait_process_frames(1) + var offered: Array[String] = [] + for button in scene.get_node("%LevelBox").get_children(): + offered.append(button.get_meta("level")) + var expected: Array[String] = [] + for level in SchoolLevels.ALL: + if not ExerciseEngine.get_regions_for_level(level).is_empty(): + expected.append(level) + assert_eq(offered, expected) + assert_true(offered.has("CE1") and offered.has("CE2")) diff --git a/tests/world/test_world_map.gd b/tests/world/test_world_map.gd index 9cd4766..019af38 100644 --- a/tests/world/test_world_map.gd +++ b/tests/world/test_world_map.gd @@ -24,6 +24,7 @@ func test_ce1_profile_sees_only_ce1_missions_and_no_toggle() -> void: assert_eq(map.get_node("%MapArea").get_child_count(), 9) assert_false(map.get_node("%LevelToggleButton").visible) + GameManager.map_region_id = "" func test_ce2_profile_sees_ce2_missions_and_can_review_ce1() -> void: @@ -31,20 +32,40 @@ func test_ce2_profile_sees_ce2_missions_and_can_review_ce1() -> void: await wait_process_frames(1) assert_eq(map.get_node("%MapArea").get_child_count(), 12) - assert_eq(map.get_node("%TitleLabel").text, UIText.get_text("world_map.title_ce2")) + assert_eq(map.get_node("%TitleLabel").text, "Le marais des homophones") var toggle: Button = map.get_node("%LevelToggleButton") assert_true(toggle.visible) toggle.pressed.emit() await wait_process_frames(1) assert_eq(map.get_node("%MapArea").get_child_count(), 9) - assert_eq(map.get_node("%TitleLabel").text, UIText.get_text("world_map.title")) + assert_eq(map.get_node("%TitleLabel").text, "La forêt des accords") + assert_eq(toggle.text, "Retour au CE2") toggle.pressed.emit() await wait_process_frames(1) assert_eq(map.get_node("%MapArea").get_child_count(), 12) +func test_ce1_profile_can_move_between_its_regions() -> void: + var map := _open_map_for("CE1") + await wait_process_frames(1) + assert_eq(map.get_node("%TitleLabel").text, "La forêt des accords") + var button: Button = map.get_node("%RegionButton") + assert_true(button.visible) + assert_eq(map.get_node("%MapArea").get_child_count(), 9) + + button.pressed.emit() + await wait_process_frames(1) + assert_eq(map.get_node("%TitleLabel").text, "La plage des sons") + assert_eq(map.get_node("%MapArea").get_child_count(), 9) + + button.pressed.emit() + await wait_process_frames(1) + assert_eq(map.get_node("%TitleLabel").text, "La forêt des accords") + GameManager.map_region_id = "" + + func test_map_offers_a_way_back_to_the_profile_selection() -> void: var map := _open_map_for("CE1") await wait_process_frames(1) diff --git a/tools/screenshot.gd b/tools/screenshot.gd index f653165..b134692 100644 --- a/tools/screenshot.gd +++ b/tools/screenshot.gd @@ -43,7 +43,7 @@ func _initialize() -> void: await process_frame # Actions optionnelles sur exercise_host, a partir du 5e argument : # continue_rule | answer: | toggle: | type: | validate - # | continue_feedback | solve_gate (espace adulte) + # | continue_feedback | solve_gate (espace adulte) | call: for action in args.slice(4): if action.begins_with("outcomes:") or action.begins_with("text_scale:"): continue @@ -60,6 +60,10 @@ func _initialize() -> void: func _run_action(scene: Node, action: String) -> void: var parts := action.split(":", true, 1) + if parts[0] == "call": + # Appelle une methode de la scene (ex. call:_on_region_pressed). + scene.call(parts[1]) + return if parts[0] == "solve_gate": # Espace adulte : saisit la bonne reponse a la barriere. var input: LineEdit = scene.find_child("GateInput", true, false)