mirror of
https://github.com/deunix-educ/aventuriers-des-mots.git
synced 2026-10-13 02:11:58 +02:00
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 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://dwfv2ipp087np"
|
||||
path="res://.godot/imported/ce1_cedille_dictee_02.ogg-73f9911fa2b7714b3f55d92b66623b7e.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/audio/dictations/ce1_cedille_dictee_02.ogg"
|
||||
dest_files=["res://.godot/imported/ce1_cedille_dictee_02.ogg-73f9911fa2b7714b3f55d92b66623b7e.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://byjf2bqmuoagv"
|
||||
path="res://.godot/imported/ce1_cedille_dictee_03.ogg-2c32435b472153a974b331067c09e665.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/audio/dictations/ce1_cedille_dictee_03.ogg"
|
||||
dest_files=["res://.godot/imported/ce1_cedille_dictee_03.ogg-2c32435b472153a974b331067c09e665.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://c62jcqms3ukxy"
|
||||
path="res://.godot/imported/ce1_m_mbp_dictee_02.ogg-f8e113eb7b73b6f437637b57c7a4d46b.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/audio/dictations/ce1_m_mbp_dictee_02.ogg"
|
||||
dest_files=["res://.godot/imported/ce1_m_mbp_dictee_02.ogg-f8e113eb7b73b6f437637b57c7a4d46b.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://ce6adfsld1w1f"
|
||||
path="res://.godot/imported/ce1_s_ss_dictee_02.ogg-768c28f2e08978c61c4d60bbfa125412.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/audio/dictations/ce1_s_ss_dictee_02.ogg"
|
||||
dest_files=["res://.godot/imported/ce1_s_ss_dictee_02.ogg-768c28f2e08978c61c4d60bbfa125412.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
Binary file not shown.
@@ -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
|
||||
@@ -0,0 +1,59 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080">
|
||||
<defs><linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#6EC6F0"/><stop offset="1" stop-color="#D8F1FA"/></linearGradient><linearGradient id="sea" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3FA7D6"/><stop offset="1" stop-color="#1F78B4"/></linearGradient><linearGradient id="sand" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F6DFA4"/><stop offset="1" stop-color="#E6C479"/></linearGradient><radialGradient id="halo"><stop offset="0" stop-color="#FFF6C2" stop-opacity="0.9"/><stop offset="1" stop-color="#FFF6C2" stop-opacity="0"/></radialGradient></defs>
|
||||
<rect width="1920" height="1080" fill="url(#sky)"/>
|
||||
<circle cx="1500" cy="190" r="230" fill="url(#halo)"/><circle cx="1500" cy="190" r="86" fill="#FFE27A"/>
|
||||
<g fill="#FFFFFF" opacity="0.92"><ellipse cx="300" cy="170" rx="110.0" ry="34.0"/><ellipse cx="370.0" cy="152.0" rx="70.0" ry="30.0"/><ellipse cx="240.0" cy="158.0" rx="60.0" ry="26.0"/></g>
|
||||
<g fill="#FFFFFF" opacity="0.92"><ellipse cx="820" cy="110" rx="88.0" ry="27.200000000000003"/><ellipse cx="876.0" cy="95.6" rx="56.0" ry="24.0"/><ellipse cx="772.0" cy="100.4" rx="48.0" ry="20.8"/></g>
|
||||
<g fill="#FFFFFF" opacity="0.92"><ellipse cx="1180" cy="260" rx="77.0" ry="23.799999999999997"/><ellipse cx="1229.0" cy="247.4" rx="49.0" ry="21.0"/><ellipse cx="1138.0" cy="251.6" rx="42.0" ry="18.2"/></g>
|
||||
<rect y="560" width="1920" height="360" fill="url(#sea)"/>
|
||||
<polyline points="-40,598 40,582 120,598 200,582 280,598 360,582 440,598 520,582 600,598 680,582 760,598 840,582 920,598 1000,582 1080,598 1160,582 1240,598 1320,582 1400,598 1480,582 1560,598 1640,582 1720,598 1800,582 1880,598 1960,582" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.25" stroke-linejoin="round"/>
|
||||
<polyline points="-40,606 40,622 120,606 200,622 280,606 360,622 440,606 520,622 600,606 680,622 760,606 840,622 920,606 1000,622 1080,606 1160,622 1240,606 1320,622 1400,606 1480,622 1560,606 1640,622 1720,606 1800,622 1880,606 1960,622" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.27" stroke-linejoin="round"/>
|
||||
<polyline points="-40,646 40,630 120,646 200,630 280,646 360,630 440,646 520,630 600,646 680,630 760,646 840,630 920,646 1000,630 1080,646 1160,630 1240,646 1320,630 1400,646 1480,630 1560,646 1640,630 1720,646 1800,630 1880,646 1960,630" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.29" stroke-linejoin="round"/>
|
||||
<polyline points="-40,654 40,670 120,654 200,670 280,654 360,670 440,654 520,670 600,654 680,670 760,654 840,670 920,654 1000,670 1080,654 1160,670 1240,654 1320,670 1400,654 1480,670 1560,654 1640,670 1720,654 1800,670 1880,654 1960,670" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.31" stroke-linejoin="round"/>
|
||||
<polyline points="-40,694 40,678 120,694 200,678 280,694 360,678 440,694 520,678 600,694 680,678 760,694 840,678 920,694 1000,678 1080,694 1160,678 1240,694 1320,678 1400,694 1480,678 1560,694 1640,678 1720,694 1800,678 1880,694 1960,678" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.33" stroke-linejoin="round"/>
|
||||
<polyline points="-40,702 40,718 120,702 200,718 280,702 360,718 440,702 520,718 600,702 680,718 760,702 840,718 920,702 1000,718 1080,702 1160,718 1240,702 1320,718 1400,702 1480,718 1560,702 1640,718 1720,702 1800,718 1880,702 1960,718" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.35" stroke-linejoin="round"/>
|
||||
<polyline points="-40,742 40,726 120,742 200,726 280,742 360,726 440,742 520,726 600,742 680,726 760,742 840,726 920,742 1000,726 1080,742 1160,726 1240,742 1320,726 1400,742 1480,726 1560,742 1640,726 1720,742 1800,726 1880,742 1960,726" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.37" stroke-linejoin="round"/>
|
||||
<polyline points="-40,750 40,766 120,750 200,766 280,750 360,766 440,750 520,766 600,750 680,766 760,750 840,766 920,750 1000,766 1080,750 1160,766 1240,750 1320,766 1400,750 1480,766 1560,750 1640,766 1720,750 1800,766 1880,750 1960,766" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.39" stroke-linejoin="round"/>
|
||||
<polyline points="-40,790 40,774 120,790 200,774 280,790 360,774 440,790 520,774 600,790 680,774 760,790 840,774 920,790 1000,774 1080,790 1160,774 1240,790 1320,774 1400,790 1480,774 1560,790 1640,774 1720,790 1800,774 1880,790 1960,774" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.41" stroke-linejoin="round"/>
|
||||
<polyline points="-40,798 40,814 120,798 200,814 280,798 360,814 440,798 520,814 600,798 680,814 760,798 840,814 920,798 1000,814 1080,798 1160,814 1240,798 1320,814 1400,798 1480,814 1560,798 1640,814 1720,798 1800,814 1880,798 1960,814" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.43" stroke-linejoin="round"/>
|
||||
<polyline points="-40,838 40,822 120,838 200,822 280,838 360,822 440,838 520,822 600,838 680,822 760,838 840,822 920,838 1000,822 1080,838 1160,822 1240,838 1320,822 1400,838 1480,822 1560,838 1640,822 1720,838 1800,822 1880,838 1960,822" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.45" stroke-linejoin="round"/>
|
||||
<polyline points="-40,846 40,862 120,846 200,862 280,846 360,862 440,846 520,862 600,846 680,862 760,846 840,862 920,846 1000,862 1080,846 1160,862 1240,846 1320,862 1400,846 1480,862 1560,846 1640,862 1720,846 1800,862 1880,846 1960,862" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.47" stroke-linejoin="round"/>
|
||||
<polyline points="-40,886 40,870 120,886 200,870 280,886 360,870 440,886 520,870 600,886 680,870 760,886 840,870 920,886 1000,870 1080,886 1160,870 1240,886 1320,870 1400,886 1480,870 1560,886 1640,870 1720,886 1800,870 1880,886 1960,870" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.49" stroke-linejoin="round"/>
|
||||
<polyline points="-40,894 40,910 120,894 200,910 280,894 360,910 440,894 520,910 600,894 680,910 760,894 840,910 920,894 1000,910 1080,894 1160,910 1240,894 1320,910 1400,894 1480,910 1560,894 1640,910 1720,894 1800,910 1880,894 1960,910" fill="none" stroke="#FFFFFF" stroke-width="3" opacity="0.51" stroke-linejoin="round"/>
|
||||
<g transform="translate(560,500)"><path d="M0 70 L190 70 L160 110 L30 110 Z" fill="#B5651D"/><path d="M95 0 L95 70 L20 70 Z" fill="#FFFFFF"/><path d="M105 14 L105 70 L170 70 Z" fill="#F25F5C"/><rect x="92" y="-6" width="6" height="76" fill="#6B3F14"/></g>
|
||||
<path d="M0 860 Q480 800 960 840 T1920 810 L1920 1080 L0 1080 Z" fill="url(#sand)"/>
|
||||
<path d="M0 880 Q480 820 960 860 T1920 830" fill="none" stroke="#FFFFFF" stroke-width="10" opacity="0.7"/>
|
||||
<g transform="translate(200,900) scale(1.1)"><path d="M0 0 Q35.0 -150 70 -300" fill="none" stroke="#8B5A2B" stroke-width="26" stroke-linecap="round"/><path d="M70 -300 Q-16.602540378443877 -410.0 -94.54482671904336 -360.0" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M70 -300 Q35.79798566743313 -471.5569669100272 5.016172768122942 -412.763114494309" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M70 -300 Q104.20201433256688 -471.5569669100272 134.98382723187706 -412.763114494309" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M70 -300 Q156.60254037844388 -410.0 234.54482671904336 -360.0" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M70 -300 Q168.4807753012208 -315.68925512662975 257.1134730723195 -279.16221867996836" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M70 -300 Q146.6044443118978 -250.00973464388449 215.5484441926058 -222.8654868376153" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><circle cx="62" cy="-292" r="12" fill="#6B3F14"/><circle cx="82" cy="-288" r="12" fill="#6B3F14"/></g>
|
||||
<g transform="translate(1720,880) scale(1.0)"><path d="M0 0 Q-30.0 -150 -60 -300" fill="none" stroke="#8B5A2B" stroke-width="26" stroke-linecap="round"/><path d="M-60 -300 Q-146.60254037844388 -410.0 -224.54482671904336 -360.0" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M-60 -300 Q-94.20201433256688 -471.5569669100272 -124.98382723187706 -412.763114494309" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M-60 -300 Q-25.797985667433117 -471.5569669100272 4.983827231877072 -412.763114494309" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M-60 -300 Q26.602540378443877 -410.0 104.54482671904336 -360.0" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M-60 -300 Q38.4807753012208 -315.68925512662975 127.11347307231952 -279.16221867996836" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M-60 -300 Q16.604444311897808 -250.00973464388449 85.54844419260581 -222.8654868376153" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><circle cx="-68" cy="-292" r="12" fill="#6B3F14"/><circle cx="-48" cy="-288" r="12" fill="#6B3F14"/></g>
|
||||
<g transform="translate(1500,940) scale(0.7)"><path d="M0 0 Q20.0 -150 40 -300" fill="none" stroke="#8B5A2B" stroke-width="26" stroke-linecap="round"/><path d="M40 -300 Q-46.60254037844388 -410.0 -124.54482671904336 -360.0" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M40 -300 Q5.797985667433132 -471.5569669100272 -24.983827231877058 -412.763114494309" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M40 -300 Q74.20201433256688 -471.5569669100272 104.98382723187707 -412.763114494309" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M40 -300 Q126.60254037844388 -410.0 204.54482671904336 -360.0" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M40 -300 Q138.4807753012208 -315.68925512662975 227.11347307231952 -279.16221867996836" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><path d="M40 -300 Q116.60444431189781 -250.00973464388449 185.5484441926058 -222.8654868376153" fill="none" stroke="#2E8B57" stroke-width="22" stroke-linecap="round"/><circle cx="32" cy="-292" r="12" fill="#6B3F14"/><circle cx="52" cy="-288" r="12" fill="#6B3F14"/></g>
|
||||
<g transform="translate(980,830)"><rect x="-4" y="0" width="8" height="150" fill="#6B3F14"/><path d="M-130 0 Q0 -120 130 0 Z" fill="#F25F5C"/><path d="M-130 0 Q-65 -90 0 -85 L0 0 Z" fill="#FFFFFF" opacity="0.9"/></g>
|
||||
<ellipse cx="1305" cy="965" rx="13" ry="9" fill="#FFFFFF" opacity="0.9"/>
|
||||
<ellipse cx="1751" cy="1019" rx="11" ry="8" fill="#FFFFFF" opacity="0.9"/>
|
||||
<ellipse cx="1875" cy="940" rx="9" ry="6" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="990" cy="963" rx="14" ry="10" fill="#FFFFFF" opacity="0.9"/>
|
||||
<ellipse cx="1205" cy="963" rx="8" ry="6" fill="#F4A6B8" opacity="0.9"/>
|
||||
<ellipse cx="865" cy="971" rx="10" ry="7" fill="#E8D2A6" opacity="0.9"/>
|
||||
<ellipse cx="356" cy="918" rx="10" ry="7" fill="#E8D2A6" opacity="0.9"/>
|
||||
<ellipse cx="289" cy="933" rx="8" ry="6" fill="#FFFFFF" opacity="0.9"/>
|
||||
<ellipse cx="458" cy="955" rx="10" ry="7" fill="#F4A6B8" opacity="0.9"/>
|
||||
<ellipse cx="622" cy="980" rx="11" ry="8" fill="#F4A6B8" opacity="0.9"/>
|
||||
<ellipse cx="402" cy="950" rx="14" ry="10" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="74" cy="992" rx="14" ry="10" fill="#F4A6B8" opacity="0.9"/>
|
||||
<ellipse cx="328" cy="967" rx="9" ry="6" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="647" cy="1054" rx="8" ry="6" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="165" cy="979" rx="13" ry="9" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="1014" cy="980" rx="10" ry="7" fill="#E8D2A6" opacity="0.9"/>
|
||||
<ellipse cx="997" cy="945" rx="8" ry="6" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="76" cy="991" rx="14" ry="10" fill="#FFFFFF" opacity="0.9"/>
|
||||
<ellipse cx="1154" cy="1007" rx="13" ry="9" fill="#E8D2A6" opacity="0.9"/>
|
||||
<ellipse cx="1214" cy="902" rx="15" ry="10" fill="#FFFFFF" opacity="0.9"/>
|
||||
<ellipse cx="1479" cy="946" rx="11" ry="8" fill="#FFFFFF" opacity="0.9"/>
|
||||
<ellipse cx="1577" cy="962" rx="15" ry="10" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="1079" cy="990" rx="16" ry="11" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="1618" cy="1018" rx="9" ry="6" fill="#FFB84D" opacity="0.9"/>
|
||||
<ellipse cx="1790" cy="975" rx="8" ry="6" fill="#E8D2A6" opacity="0.9"/>
|
||||
<ellipse cx="216" cy="953" rx="13" ry="9" fill="#FFB84D" opacity="0.9"/>
|
||||
<polygon points="420,964 426,981 445,982 430,993 435,1011 420,1001 405,1011 410,993 395,982 414,981" fill="#F58A5C" stroke="#D96A3A" stroke-width="3"/>
|
||||
<polygon points="1260,994 1266,1011 1285,1012 1270,1023 1275,1041 1260,1031 1245,1041 1250,1023 1235,1012 1254,1011" fill="#F58A5C" stroke="#D96A3A" stroke-width="3"/>
|
||||
<polygon points="1640,954 1646,971 1665,972 1650,983 1655,1001 1640,991 1625,1001 1630,983 1615,972 1634,971" fill="#F58A5C" stroke="#D96A3A" stroke-width="3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
@@ -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
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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 !"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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_]*$" },
|
||||
|
||||
@@ -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_]*$" },
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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 : <tableau suivant> » pour passer d'un tableau à l'autre ; « Revoir le <niveau précédent> » / « Retour au <niveau> » 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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
+1
-1
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user