diff --git a/assets/audio/dictations/ce2_a_a_dictee_01.ogg b/assets/audio/dictations/ce2_a_a_dictee_01.ogg new file mode 100644 index 0000000..0caa4a3 Binary files /dev/null and b/assets/audio/dictations/ce2_a_a_dictee_01.ogg differ diff --git a/assets/audio/dictations/ce2_a_a_dictee_01.ogg.import b/assets/audio/dictations/ce2_a_a_dictee_01.ogg.import new file mode 100644 index 0000000..5220b4f --- /dev/null +++ b/assets/audio/dictations/ce2_a_a_dictee_01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cac04iyqc1t1d" +path="res://.godot/imported/ce2_a_a_dictee_01.ogg-e75c5a7b7f5c34495d4a76625d08f94c.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_a_a_dictee_01.ogg" +dest_files=["res://.godot/imported/ce2_a_a_dictee_01.ogg-e75c5a7b7f5c34495d4a76625d08f94c.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_a_a_dictee_02.ogg b/assets/audio/dictations/ce2_a_a_dictee_02.ogg new file mode 100644 index 0000000..a71a267 Binary files /dev/null and b/assets/audio/dictations/ce2_a_a_dictee_02.ogg differ diff --git a/assets/audio/dictations/ce2_a_a_dictee_02.ogg.import b/assets/audio/dictations/ce2_a_a_dictee_02.ogg.import new file mode 100644 index 0000000..6fd4e53 --- /dev/null +++ b/assets/audio/dictations/ce2_a_a_dictee_02.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://de57q0b2bfly3" +path="res://.godot/imported/ce2_a_a_dictee_02.ogg-49749cc8c1cfef4640132ce7647c19fd.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_a_a_dictee_02.ogg" +dest_files=["res://.godot/imported/ce2_a_a_dictee_02.ogg-49749cc8c1cfef4640132ce7647c19fd.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_a_a_dictee_03.ogg b/assets/audio/dictations/ce2_a_a_dictee_03.ogg new file mode 100644 index 0000000..ed20a04 Binary files /dev/null and b/assets/audio/dictations/ce2_a_a_dictee_03.ogg differ diff --git a/assets/audio/dictations/ce2_a_a_dictee_03.ogg.import b/assets/audio/dictations/ce2_a_a_dictee_03.ogg.import new file mode 100644 index 0000000..dec1ddc --- /dev/null +++ b/assets/audio/dictations/ce2_a_a_dictee_03.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bg6ibneb5aaiy" +path="res://.godot/imported/ce2_a_a_dictee_03.ogg-80a2255c95c28802233d735380aad83f.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_a_a_dictee_03.ogg" +dest_files=["res://.godot/imported/ce2_a_a_dictee_03.ogg-80a2255c95c28802233d735380aad83f.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_et_est_dictee_01.ogg b/assets/audio/dictations/ce2_et_est_dictee_01.ogg new file mode 100644 index 0000000..68f237c Binary files /dev/null and b/assets/audio/dictations/ce2_et_est_dictee_01.ogg differ diff --git a/assets/audio/dictations/ce2_et_est_dictee_01.ogg.import b/assets/audio/dictations/ce2_et_est_dictee_01.ogg.import new file mode 100644 index 0000000..967f547 --- /dev/null +++ b/assets/audio/dictations/ce2_et_est_dictee_01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://c054inea2nemu" +path="res://.godot/imported/ce2_et_est_dictee_01.ogg-0a747dd75ce3de470d038d5249d93be6.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_et_est_dictee_01.ogg" +dest_files=["res://.godot/imported/ce2_et_est_dictee_01.ogg-0a747dd75ce3de470d038d5249d93be6.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_et_est_dictee_02.ogg b/assets/audio/dictations/ce2_et_est_dictee_02.ogg new file mode 100644 index 0000000..85032a7 Binary files /dev/null and b/assets/audio/dictations/ce2_et_est_dictee_02.ogg differ diff --git a/assets/audio/dictations/ce2_et_est_dictee_02.ogg.import b/assets/audio/dictations/ce2_et_est_dictee_02.ogg.import new file mode 100644 index 0000000..622b7b0 --- /dev/null +++ b/assets/audio/dictations/ce2_et_est_dictee_02.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://b046v1bf323rd" +path="res://.godot/imported/ce2_et_est_dictee_02.ogg-068fce5c46dc6aa533b76dc1eb1917a4.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_et_est_dictee_02.ogg" +dest_files=["res://.godot/imported/ce2_et_est_dictee_02.ogg-068fce5c46dc6aa533b76dc1eb1917a4.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_et_est_dictee_03.ogg b/assets/audio/dictations/ce2_et_est_dictee_03.ogg new file mode 100644 index 0000000..fab7dbe Binary files /dev/null and b/assets/audio/dictations/ce2_et_est_dictee_03.ogg differ diff --git a/assets/audio/dictations/ce2_et_est_dictee_03.ogg.import b/assets/audio/dictations/ce2_et_est_dictee_03.ogg.import new file mode 100644 index 0000000..f01cacf --- /dev/null +++ b/assets/audio/dictations/ce2_et_est_dictee_03.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cra7otuuf1km3" +path="res://.godot/imported/ce2_et_est_dictee_03.ogg-bb5fadb44e691dfe913e94cd201c004d.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_et_est_dictee_03.ogg" +dest_files=["res://.godot/imported/ce2_et_est_dictee_03.ogg-bb5fadb44e691dfe913e94cd201c004d.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_on_ont_dictee_01.ogg b/assets/audio/dictations/ce2_on_ont_dictee_01.ogg new file mode 100644 index 0000000..5e37130 Binary files /dev/null and b/assets/audio/dictations/ce2_on_ont_dictee_01.ogg differ diff --git a/assets/audio/dictations/ce2_on_ont_dictee_01.ogg.import b/assets/audio/dictations/ce2_on_ont_dictee_01.ogg.import new file mode 100644 index 0000000..7ebdc45 --- /dev/null +++ b/assets/audio/dictations/ce2_on_ont_dictee_01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cf1rob4wh51cj" +path="res://.godot/imported/ce2_on_ont_dictee_01.ogg-a02b64756036308373c17ae7026536e4.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_on_ont_dictee_01.ogg" +dest_files=["res://.godot/imported/ce2_on_ont_dictee_01.ogg-a02b64756036308373c17ae7026536e4.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_on_ont_dictee_02.ogg b/assets/audio/dictations/ce2_on_ont_dictee_02.ogg new file mode 100644 index 0000000..f25ae04 Binary files /dev/null and b/assets/audio/dictations/ce2_on_ont_dictee_02.ogg differ diff --git a/assets/audio/dictations/ce2_on_ont_dictee_02.ogg.import b/assets/audio/dictations/ce2_on_ont_dictee_02.ogg.import new file mode 100644 index 0000000..833d038 --- /dev/null +++ b/assets/audio/dictations/ce2_on_ont_dictee_02.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bd8dacvr2g65k" +path="res://.godot/imported/ce2_on_ont_dictee_02.ogg-35c46d7ff9cad84a68318b3927056213.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_on_ont_dictee_02.ogg" +dest_files=["res://.godot/imported/ce2_on_ont_dictee_02.ogg-35c46d7ff9cad84a68318b3927056213.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_on_ont_dictee_03.ogg b/assets/audio/dictations/ce2_on_ont_dictee_03.ogg new file mode 100644 index 0000000..61e7339 Binary files /dev/null and b/assets/audio/dictations/ce2_on_ont_dictee_03.ogg differ diff --git a/assets/audio/dictations/ce2_on_ont_dictee_03.ogg.import b/assets/audio/dictations/ce2_on_ont_dictee_03.ogg.import new file mode 100644 index 0000000..5157c01 --- /dev/null +++ b/assets/audio/dictations/ce2_on_ont_dictee_03.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://ba81mc8cxsn57" +path="res://.godot/imported/ce2_on_ont_dictee_03.ogg-9283d407dd0877768d192ec944378743.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_on_ont_dictee_03.ogg" +dest_files=["res://.godot/imported/ce2_on_ont_dictee_03.ogg-9283d407dd0877768d192ec944378743.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_son_sont_dictee_01.ogg b/assets/audio/dictations/ce2_son_sont_dictee_01.ogg new file mode 100644 index 0000000..77921d0 Binary files /dev/null and b/assets/audio/dictations/ce2_son_sont_dictee_01.ogg differ diff --git a/assets/audio/dictations/ce2_son_sont_dictee_01.ogg.import b/assets/audio/dictations/ce2_son_sont_dictee_01.ogg.import new file mode 100644 index 0000000..8d39396 --- /dev/null +++ b/assets/audio/dictations/ce2_son_sont_dictee_01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dbg6wmr18jq3q" +path="res://.godot/imported/ce2_son_sont_dictee_01.ogg-95a5f4cb5fd4f211d09d13db2d02d575.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_son_sont_dictee_01.ogg" +dest_files=["res://.godot/imported/ce2_son_sont_dictee_01.ogg-95a5f4cb5fd4f211d09d13db2d02d575.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_son_sont_dictee_02.ogg b/assets/audio/dictations/ce2_son_sont_dictee_02.ogg new file mode 100644 index 0000000..50614fb Binary files /dev/null and b/assets/audio/dictations/ce2_son_sont_dictee_02.ogg differ diff --git a/assets/audio/dictations/ce2_son_sont_dictee_02.ogg.import b/assets/audio/dictations/ce2_son_sont_dictee_02.ogg.import new file mode 100644 index 0000000..12db1f8 --- /dev/null +++ b/assets/audio/dictations/ce2_son_sont_dictee_02.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://biadxbqjmyiy5" +path="res://.godot/imported/ce2_son_sont_dictee_02.ogg-9834d789d13a637e16ac2a3b23a088b2.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_son_sont_dictee_02.ogg" +dest_files=["res://.godot/imported/ce2_son_sont_dictee_02.ogg-9834d789d13a637e16ac2a3b23a088b2.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/dictations/ce2_son_sont_dictee_03.ogg b/assets/audio/dictations/ce2_son_sont_dictee_03.ogg new file mode 100644 index 0000000..f92f055 Binary files /dev/null and b/assets/audio/dictations/ce2_son_sont_dictee_03.ogg differ diff --git a/assets/audio/dictations/ce2_son_sont_dictee_03.ogg.import b/assets/audio/dictations/ce2_son_sont_dictee_03.ogg.import new file mode 100644 index 0000000..171da4d --- /dev/null +++ b/assets/audio/dictations/ce2_son_sont_dictee_03.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dw86r4ojpclqe" +path="res://.godot/imported/ce2_son_sont_dictee_03.ogg-ba13de9e25817aaee2363e5c935ace5f.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/dictations/ce2_son_sont_dictee_03.ogg" +dest_files=["res://.godot/imported/ce2_son_sont_dictee_03.ogg-ba13de9e25817aaee2363e5c935ace5f.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/autoload/exercise_engine.gd b/autoload/exercise_engine.gd index 0f6bf4a..db1f1f0 100644 --- a/autoload/exercise_engine.gd +++ b/autoload/exercise_engine.gd @@ -34,6 +34,16 @@ func get_missions() -> Array[Dictionary]: return missions +## Missions dont la regle appartient au niveau scolaire demande (le niveau +## d'une mission est celui de sa regle, pas un champ de plus a tenir a jour). +func get_missions_for_level(level: String) -> Array[Dictionary]: + var missions: Array[Dictionary] = [] + for mission in get_missions(): + if get_rule(mission["rule_id"]).get("level", "") == level: + missions.append(mission) + return missions + + func get_mission(mission_id: String) -> Dictionary: return _missions.get(mission_id, {}) diff --git a/autoload/progress_manager.gd b/autoload/progress_manager.gd index 8a623e9..9748e3c 100644 --- a/autoload/progress_manager.gd +++ b/autoload/progress_manager.gd @@ -54,6 +54,11 @@ func get_skill_state(skill_id: String) -> Dictionary: return skills.get(skill_id, ReviewScheduler.initial_state()) +## Niveau scolaire du profil courant ("CE1" par defaut si aucun profil charge). +func school_level() -> String: + return _current_save.get("school_level", "CE1") + + func current_save() -> Dictionary: return _current_save diff --git a/data/curriculum/ce2_homophones_grammaticaux.json b/data/curriculum/ce2_homophones_grammaticaux.json new file mode 100644 index 0000000..726a165 --- /dev/null +++ b/data/curriculum/ce2_homophones_grammaticaux.json @@ -0,0 +1,13 @@ +{ + "level": "CE2", + "region_id": "marais_des_homophones", + "chapter_id": "homophones_grammaticaux", + "title": "Les homophones grammaticaux", + "rule_ids": [ + "regle_homophone_a_a", + "regle_homophone_et_est", + "regle_homophone_son_sont", + "regle_homophone_on_ont" + ], + "review_status": "draft" +} diff --git a/data/dictations/ce2_a_a_dictee_01.json b/data/dictations/ce2_a_a_dictee_01.json new file mode 100644 index 0000000..a84ee30 --- /dev/null +++ b/data/dictations/ce2_a_a_dictee_01.json @@ -0,0 +1,30 @@ +{ + "id": "ce2_a_a_dictee_01", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_a_a" + ], + "difficulty": 1, + "target_text": "Léa a un chat.", + "words": [ + { + "text": "Léa", + "expects_capital": true + }, + { + "text": "a", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "un" + }, + { + "text": "chat." + } + ], + "audio_id": "ce2_a_a_dictee_01", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_a_a_dictee_02.json b/data/dictations/ce2_a_a_dictee_02.json new file mode 100644 index 0000000..902aa2a --- /dev/null +++ b/data/dictations/ce2_a_a_dictee_02.json @@ -0,0 +1,33 @@ +{ + "id": "ce2_a_a_dictee_02", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_a_a" + ], + "difficulty": 2, + "target_text": "Nous allons à la piscine.", + "words": [ + { + "text": "Nous", + "expects_capital": true + }, + { + "text": "allons" + }, + { + "text": "à", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "la" + }, + { + "text": "piscine." + } + ], + "audio_id": "ce2_a_a_dictee_02", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_a_a_dictee_03.json b/data/dictations/ce2_a_a_dictee_03.json new file mode 100644 index 0000000..278d045 --- /dev/null +++ b/data/dictations/ce2_a_a_dictee_03.json @@ -0,0 +1,40 @@ +{ + "id": "ce2_a_a_dictee_03", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_a_a" + ], + "difficulty": 3, + "target_text": "Papa a donné un cadeau à Léa.", + "words": [ + { + "text": "Papa", + "expects_capital": true + }, + { + "text": "a", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "donné" + }, + { + "text": "un" + }, + { + "text": "cadeau" + }, + { + "text": "à", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "Léa." + } + ], + "audio_id": "ce2_a_a_dictee_03", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_et_est_dictee_01.json b/data/dictations/ce2_et_est_dictee_01.json new file mode 100644 index 0000000..f34a315 --- /dev/null +++ b/data/dictations/ce2_et_est_dictee_01.json @@ -0,0 +1,30 @@ +{ + "id": "ce2_et_est_dictee_01", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_et_est" + ], + "difficulty": 1, + "target_text": "Le chat est noir.", + "words": [ + { + "text": "Le", + "expects_capital": true + }, + { + "text": "chat" + }, + { + "text": "est", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "noir." + } + ], + "audio_id": "ce2_et_est_dictee_01", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_et_est_dictee_02.json b/data/dictations/ce2_et_est_dictee_02.json new file mode 100644 index 0000000..1d833a9 --- /dev/null +++ b/data/dictations/ce2_et_est_dictee_02.json @@ -0,0 +1,33 @@ +{ + "id": "ce2_et_est_dictee_02", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_et_est" + ], + "difficulty": 2, + "target_text": "Paul et Marie jouent ensemble.", + "words": [ + { + "text": "Paul", + "expects_capital": true + }, + { + "text": "et", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "Marie" + }, + { + "text": "jouent" + }, + { + "text": "ensemble." + } + ], + "audio_id": "ce2_et_est_dictee_02", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_et_est_dictee_03.json b/data/dictations/ce2_et_est_dictee_03.json new file mode 100644 index 0000000..8dbc802 --- /dev/null +++ b/data/dictations/ce2_et_est_dictee_03.json @@ -0,0 +1,37 @@ +{ + "id": "ce2_et_est_dictee_03", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_et_est" + ], + "difficulty": 3, + "target_text": "Mon frère est petit et blond.", + "words": [ + { + "text": "Mon", + "expects_capital": true + }, + { + "text": "frère" + }, + { + "text": "est", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "petit" + }, + { + "text": "et", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "blond." + } + ], + "audio_id": "ce2_et_est_dictee_03", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_on_ont_dictee_01.json b/data/dictations/ce2_on_ont_dictee_01.json new file mode 100644 index 0000000..4b243ba --- /dev/null +++ b/data/dictations/ce2_on_ont_dictee_01.json @@ -0,0 +1,27 @@ +{ + "id": "ce2_on_ont_dictee_01", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_on_ont" + ], + "difficulty": 1, + "target_text": "On joue dehors.", + "words": [ + { + "text": "On", + "expects_capital": true, + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "joue" + }, + { + "text": "dehors." + } + ], + "audio_id": "ce2_on_ont_dictee_01", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_on_ont_dictee_02.json b/data/dictations/ce2_on_ont_dictee_02.json new file mode 100644 index 0000000..1bf5c99 --- /dev/null +++ b/data/dictations/ce2_on_ont_dictee_02.json @@ -0,0 +1,30 @@ +{ + "id": "ce2_on_ont_dictee_02", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_on_ont" + ], + "difficulty": 2, + "target_text": "Les enfants ont faim.", + "words": [ + { + "text": "Les", + "expects_capital": true + }, + { + "text": "enfants" + }, + { + "text": "ont", + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "faim." + } + ], + "audio_id": "ce2_on_ont_dictee_02", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_on_ont_dictee_03.json b/data/dictations/ce2_on_ont_dictee_03.json new file mode 100644 index 0000000..9e2ded6 --- /dev/null +++ b/data/dictations/ce2_on_ont_dictee_03.json @@ -0,0 +1,46 @@ +{ + "id": "ce2_on_ont_dictee_03", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_on_ont" + ], + "difficulty": 3, + "target_text": "Les enfants ont sommeil et on lit une histoire.", + "words": [ + { + "text": "Les", + "expects_capital": true + }, + { + "text": "enfants" + }, + { + "text": "ont", + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "sommeil" + }, + { + "text": "et" + }, + { + "text": "on", + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "lit" + }, + { + "text": "une" + }, + { + "text": "histoire." + } + ], + "audio_id": "ce2_on_ont_dictee_03", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_son_sont_dictee_01.json b/data/dictations/ce2_son_sont_dictee_01.json new file mode 100644 index 0000000..c45c99b --- /dev/null +++ b/data/dictations/ce2_son_sont_dictee_01.json @@ -0,0 +1,30 @@ +{ + "id": "ce2_son_sont_dictee_01", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_son_sont" + ], + "difficulty": 1, + "target_text": "Les chats sont gentils.", + "words": [ + { + "text": "Les", + "expects_capital": true + }, + { + "text": "chats" + }, + { + "text": "sont", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "gentils." + } + ], + "audio_id": "ce2_son_sont_dictee_01", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_son_sont_dictee_02.json b/data/dictations/ce2_son_sont_dictee_02.json new file mode 100644 index 0000000..a9ec8f7 --- /dev/null +++ b/data/dictations/ce2_son_sont_dictee_02.json @@ -0,0 +1,30 @@ +{ + "id": "ce2_son_sont_dictee_02", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_son_sont" + ], + "difficulty": 2, + "target_text": "Paul range son cartable.", + "words": [ + { + "text": "Paul", + "expects_capital": true + }, + { + "text": "range" + }, + { + "text": "son", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "cartable." + } + ], + "audio_id": "ce2_son_sont_dictee_02", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/dictations/ce2_son_sont_dictee_03.json b/data/dictations/ce2_son_sont_dictee_03.json new file mode 100644 index 0000000..44c65d0 --- /dev/null +++ b/data/dictations/ce2_son_sont_dictee_03.json @@ -0,0 +1,40 @@ +{ + "id": "ce2_son_sont_dictee_03", + "level": "CE2", + "domain": "orthographe", + "rule_ids": [ + "regle_homophone_son_sont" + ], + "difficulty": 3, + "target_text": "Léa et Paul sont dans son jardin.", + "words": [ + { + "text": "Léa", + "expects_capital": true + }, + { + "text": "et" + }, + { + "text": "Paul" + }, + { + "text": "sont", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "dans" + }, + { + "text": "son", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "jardin." + } + ], + "audio_id": "ce2_son_sont_dictee_03", + "audio_provisional": true, + "accepted_variants": [], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_correction_01.json b/data/exercises/ce2/ce2_a_a_correction_01.json new file mode 100644 index 0000000..81bb917 --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_correction_01.json @@ -0,0 +1,45 @@ +{ + "id": "ce2_a_a_correction_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Le", + "correct": true + }, + { + "text": "chat", + "correct": true + }, + { + "text": "à", + "correct": false, + "expected": "a", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "faim", + "correct": true + }, + { + "text": "ce", + "correct": true + }, + { + "text": "soir.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_correction_02.json b/data/exercises/ce2/ce2_a_a_correction_02.json new file mode 100644 index 0000000..b37241a --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_correction_02.json @@ -0,0 +1,41 @@ +{ + "id": "ce2_a_a_correction_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Nous", + "correct": true + }, + { + "text": "allons", + "correct": true + }, + { + "text": "a", + "correct": false, + "expected": "à", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "la", + "correct": true + }, + { + "text": "piscine.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » ne convient pas ici : c'est le petit mot « à », avec un accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_correction_03.json b/data/exercises/ce2/ce2_a_a_correction_03.json new file mode 100644 index 0000000..0839f4a --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_correction_03.json @@ -0,0 +1,45 @@ +{ + "id": "ce2_a_a_correction_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Mon", + "correct": true + }, + { + "text": "voisin", + "correct": true + }, + { + "text": "à", + "correct": false, + "expected": "a", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "un", + "correct": true + }, + { + "text": "grand", + "correct": true + }, + { + "text": "jardin.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_correction_04.json b/data/exercises/ce2/ce2_a_a_correction_04.json new file mode 100644 index 0000000..399a7e3 --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_correction_04.json @@ -0,0 +1,49 @@ +{ + "id": "ce2_a_a_correction_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 3, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Marie", + "correct": true + }, + { + "text": "pense", + "correct": true + }, + { + "text": "a", + "correct": false, + "expected": "à", + "rule_id": "regle_homophone_a_a" + }, + { + "text": "son", + "correct": true + }, + { + "text": "ami", + "correct": true + }, + { + "text": "depuis", + "correct": true + }, + { + "text": "hier.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avait ». Relis la phrase en entier avant d'essayer.", + "explanation": "« avait » ne convient pas ici : c'est le petit mot « à », avec un accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_01.json b/data/exercises/ce2/ce2_a_a_qcm_01.json new file mode 100644 index 0000000..72c5c5b --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_01.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Léa ... un chat.", + "answers": [ + "a", + "à" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_02.json b/data/exercises/ce2/ce2_a_a_qcm_02.json new file mode 100644 index 0000000..578ea1c --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_02.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Nous allons ... la plage.", + "answers": [ + "a", + "à" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » ne convient pas ici : c'est le petit mot « à », avec un accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_03.json b/data/exercises/ce2/ce2_a_a_qcm_03.json new file mode 100644 index 0000000..49b6d67 --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_03.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le chien ... faim.", + "answers": [ + "a", + "à" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_04.json b/data/exercises/ce2/ce2_a_a_qcm_04.json new file mode 100644 index 0000000..2b7ae06 --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_04.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Tom joue ... la balle.", + "answers": [ + "a", + "à" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » ne convient pas ici : c'est le petit mot « à », avec un accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_05.json b/data/exercises/ce2/ce2_a_a_qcm_05.json new file mode 100644 index 0000000..2473c10 --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_05.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_05", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Mon frère ... un vélo rouge.", + "answers": [ + "a", + "à" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_06.json b/data/exercises/ce2/ce2_a_a_qcm_06.json new file mode 100644 index 0000000..0809bcc --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_06.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_06", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Elle donne un bonbon ... sa sœur.", + "answers": [ + "a", + "à" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avait ».", + "explanation": "« avait » ne convient pas ici : c'est le petit mot « à », avec un accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_07.json b/data/exercises/ce2/ce2_a_a_qcm_07.json new file mode 100644 index 0000000..bc5e34a --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_07.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_07", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Ma sœur ... mangé toute la tarte.", + "answers": [ + "a", + "à" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avait ». Relis la phrase en entier avant d'essayer.", + "explanation": "« avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_a_a_qcm_08.json b/data/exercises/ce2/ce2_a_a_qcm_08.json new file mode 100644 index 0000000..dfc219e --- /dev/null +++ b/data/exercises/ce2/ce2_a_a_qcm_08.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_a_a_qcm_08", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_a_a", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Il commence ... lire un livre.", + "answers": [ + "a", + "à" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avait ». Relis la phrase en entier avant d'essayer.", + "explanation": "« avait » ne convient pas ici : c'est le petit mot « à », avec un accent.", + "review_tags": [ + "homophone", + "a_a" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_correction_01.json b/data/exercises/ce2/ce2_et_est_correction_01.json new file mode 100644 index 0000000..d40a124 --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_correction_01.json @@ -0,0 +1,45 @@ +{ + "id": "ce2_et_est_correction_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Le", + "correct": true + }, + { + "text": "chien", + "correct": true + }, + { + "text": "et", + "correct": false, + "expected": "est", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "gentil", + "correct": true + }, + { + "text": "avec", + "correct": true + }, + { + "text": "moi.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » convient ici : c'est le verbe être, on écrit « est ».", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_correction_02.json b/data/exercises/ce2/ce2_et_est_correction_02.json new file mode 100644 index 0000000..9dd8b9f --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_correction_02.json @@ -0,0 +1,41 @@ +{ + "id": "ce2_et_est_correction_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Paul", + "correct": true + }, + { + "text": "est", + "correct": false, + "expected": "et", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "Marie", + "correct": true + }, + { + "text": "jouent", + "correct": true + }, + { + "text": "ensemble.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots.", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_correction_03.json b/data/exercises/ce2/ce2_et_est_correction_03.json new file mode 100644 index 0000000..89eafbb --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_correction_03.json @@ -0,0 +1,53 @@ +{ + "id": "ce2_et_est_correction_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Ma", + "correct": true + }, + { + "text": "sœur", + "correct": true + }, + { + "text": "et", + "correct": false, + "expected": "est", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "très", + "correct": true + }, + { + "text": "fière", + "correct": true + }, + { + "text": "de", + "correct": true + }, + { + "text": "son", + "correct": true + }, + { + "text": "dessin.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » convient ici : c'est le verbe être, on écrit « est ».", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_correction_04.json b/data/exercises/ce2/ce2_et_est_correction_04.json new file mode 100644 index 0000000..2c99f00 --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_correction_04.json @@ -0,0 +1,53 @@ +{ + "id": "ce2_et_est_correction_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 3, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Le", + "correct": true + }, + { + "text": "lapin", + "correct": true + }, + { + "text": "mange", + "correct": true + }, + { + "text": "une", + "correct": true + }, + { + "text": "carotte", + "correct": true + }, + { + "text": "est", + "correct": false, + "expected": "et", + "rule_id": "regle_homophone_et_est" + }, + { + "text": "un", + "correct": true + }, + { + "text": "chou.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « était ». Relis la phrase en entier avant d'essayer.", + "explanation": "« était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots.", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_01.json b/data/exercises/ce2/ce2_et_est_qcm_01.json new file mode 100644 index 0000000..a84309f --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_01.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le chat ... noir.", + "answers": [ + "et", + "est" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » convient ici : c'est le verbe être, on écrit « est ».", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_02.json b/data/exercises/ce2/ce2_et_est_qcm_02.json new file mode 100644 index 0000000..1f6778a --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_02.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Un chat ... un chien jouent.", + "answers": [ + "et", + "est" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots.", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_03.json b/data/exercises/ce2/ce2_et_est_qcm_03.json new file mode 100644 index 0000000..060bccd --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_03.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Ma maison ... grande.", + "answers": [ + "et", + "est" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » convient ici : c'est le verbe être, on écrit « est ».", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_04.json b/data/exercises/ce2/ce2_et_est_qcm_04.json new file mode 100644 index 0000000..3cf65ba --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_04.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Je mange du pain ... du fromage.", + "answers": [ + "et", + "est" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots.", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_05.json b/data/exercises/ce2/ce2_et_est_qcm_05.json new file mode 100644 index 0000000..b3acff1 --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_05.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_05", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Papa ... maman sont partis.", + "answers": [ + "et", + "est" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots.", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_06.json b/data/exercises/ce2/ce2_et_est_qcm_06.json new file mode 100644 index 0000000..7f532f3 --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_06.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_06", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le gâteau ... sur la table.", + "answers": [ + "et", + "est" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « était ».", + "explanation": "« était » convient ici : c'est le verbe être, on écrit « est ».", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_07.json b/data/exercises/ce2/ce2_et_est_qcm_07.json new file mode 100644 index 0000000..fc2ee4d --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_07.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_07", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Mon petit frère ... très content de son cadeau.", + "answers": [ + "et", + "est" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « était ». Relis la phrase en entier avant d'essayer.", + "explanation": "« était » convient ici : c'est le verbe être, on écrit « est ».", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_et_est_qcm_08.json b/data/exercises/ce2/ce2_et_est_qcm_08.json new file mode 100644 index 0000000..7aebbd9 --- /dev/null +++ b/data/exercises/ce2/ce2_et_est_qcm_08.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_et_est_qcm_08", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_et_est", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le chat dort sur le canapé ... le chien dort sur le tapis.", + "answers": [ + "et", + "est" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « était ». Relis la phrase en entier avant d'essayer.", + "explanation": "« était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots.", + "review_tags": [ + "homophone", + "et_est" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_correction_01.json b/data/exercises/ce2/ce2_on_ont_correction_01.json new file mode 100644 index 0000000..986016a --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_correction_01.json @@ -0,0 +1,45 @@ +{ + "id": "ce2_on_ont_correction_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Les", + "correct": true + }, + { + "text": "chats", + "correct": true + }, + { + "text": "on", + "correct": false, + "expected": "ont", + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "peur", + "correct": true + }, + { + "text": "du", + "correct": true + }, + { + "text": "chien.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » convient ici : c'est le verbe avoir, on écrit « ont ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_correction_02.json b/data/exercises/ce2/ce2_on_ont_correction_02.json new file mode 100644 index 0000000..db85e5d --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_correction_02.json @@ -0,0 +1,41 @@ +{ + "id": "ce2_on_ont_correction_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Ont", + "correct": false, + "expected": "On", + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "joue", + "correct": true + }, + { + "text": "dans", + "correct": true + }, + { + "text": "la", + "correct": true + }, + { + "text": "cour.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_correction_03.json b/data/exercises/ce2/ce2_on_ont_correction_03.json new file mode 100644 index 0000000..8a77b9d --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_correction_03.json @@ -0,0 +1,45 @@ +{ + "id": "ce2_on_ont_correction_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Mes", + "correct": true + }, + { + "text": "cousins", + "correct": true + }, + { + "text": "on", + "correct": false, + "expected": "ont", + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "un", + "correct": true + }, + { + "text": "grand", + "correct": true + }, + { + "text": "chien.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » convient ici : c'est le verbe avoir, on écrit « ont ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_correction_04.json b/data/exercises/ce2/ce2_on_ont_correction_04.json new file mode 100644 index 0000000..e8ef06b --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_correction_04.json @@ -0,0 +1,57 @@ +{ + "id": "ce2_on_ont_correction_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 3, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Le", + "correct": true + }, + { + "text": "soir,", + "correct": true + }, + { + "text": "ont", + "correct": false, + "expected": "on", + "rule_id": "regle_homophone_on_ont" + }, + { + "text": "lit", + "correct": true + }, + { + "text": "une", + "correct": true + }, + { + "text": "histoire", + "correct": true + }, + { + "text": "à", + "correct": true + }, + { + "text": "la", + "correct": true + }, + { + "text": "maison.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « avaient », ou par « il ». Relis la phrase en entier avant d'essayer.", + "explanation": "« avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_01.json b/data/exercises/ce2/ce2_on_ont_qcm_01.json new file mode 100644 index 0000000..1c4825a --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_01.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "... joue dehors.", + "answers": [ + "On", + "Ont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_02.json b/data/exercises/ce2/ce2_on_ont_qcm_02.json new file mode 100644 index 0000000..e493fe5 --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_02.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les enfants ... faim.", + "answers": [ + "on", + "ont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » convient ici : c'est le verbe avoir, on écrit « ont ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_03.json b/data/exercises/ce2/ce2_on_ont_qcm_03.json new file mode 100644 index 0000000..c5f3b39 --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_03.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Ce soir, ... mange des pâtes.", + "answers": [ + "on", + "ont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_04.json b/data/exercises/ce2/ce2_on_ont_qcm_04.json new file mode 100644 index 0000000..ca82d61 --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_04.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les chiens ... soif.", + "answers": [ + "on", + "ont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » convient ici : c'est le verbe avoir, on écrit « ont ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_05.json b/data/exercises/ce2/ce2_on_ont_qcm_05.json new file mode 100644 index 0000000..8b768ab --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_05.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_05", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Paul et Léa ... un nouveau vélo.", + "answers": [ + "on", + "ont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » convient ici : c'est le verbe avoir, on écrit « ont ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_06.json b/data/exercises/ce2/ce2_on_ont_qcm_06.json new file mode 100644 index 0000000..30a20db --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_06.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_06", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "À la récréation, ... saute à la corde.", + "answers": [ + "on", + "ont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avaient », ou par « il ».", + "explanation": "« avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_07.json b/data/exercises/ce2/ce2_on_ont_qcm_07.json new file mode 100644 index 0000000..57bf2c2 --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_07.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_07", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les enfants de ma classe ... fini leur travail.", + "answers": [ + "on", + "ont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « avaient », ou par « il ». Relis la phrase en entier avant d'essayer.", + "explanation": "« avaient » convient ici : c'est le verbe avoir, on écrit « ont ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_on_ont_qcm_08.json b/data/exercises/ce2/ce2_on_ont_qcm_08.json new file mode 100644 index 0000000..12f13af --- /dev/null +++ b/data/exercises/ce2/ce2_on_ont_qcm_08.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_on_ont_qcm_08", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_on_ont", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Quand il pleut, ... reste à la maison.", + "answers": [ + "on", + "ont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « avaient », ou par « il ». Relis la phrase en entier avant d'essayer.", + "explanation": "« avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ».", + "review_tags": [ + "homophone", + "on_ont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_correction_01.json b/data/exercises/ce2/ce2_son_sont_correction_01.json new file mode 100644 index 0000000..107f3dd --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_correction_01.json @@ -0,0 +1,45 @@ +{ + "id": "ce2_son_sont_correction_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Les", + "correct": true + }, + { + "text": "oiseaux", + "correct": true + }, + { + "text": "son", + "correct": false, + "expected": "sont", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "dans", + "correct": true + }, + { + "text": "le", + "correct": true + }, + { + "text": "nid.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » convient ici : c'est le verbe être, on écrit « sont ».", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_correction_02.json b/data/exercises/ce2/ce2_son_sont_correction_02.json new file mode 100644 index 0000000..896cb38 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_correction_02.json @@ -0,0 +1,37 @@ +{ + "id": "ce2_son_sont_correction_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 1, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Paul", + "correct": true + }, + { + "text": "mange", + "correct": true + }, + { + "text": "sont", + "correct": false, + "expected": "son", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "pain.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom.", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_correction_03.json b/data/exercises/ce2/ce2_son_sont_correction_03.json new file mode 100644 index 0000000..3b2083c --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_correction_03.json @@ -0,0 +1,45 @@ +{ + "id": "ce2_son_sont_correction_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 2, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Mes", + "correct": true + }, + { + "text": "voisins", + "correct": true + }, + { + "text": "son", + "correct": false, + "expected": "sont", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "partis", + "correct": true + }, + { + "text": "ce", + "correct": true + }, + { + "text": "matin.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » convient ici : c'est le verbe être, on écrit « sont ».", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_correction_04.json b/data/exercises/ce2/ce2_son_sont_correction_04.json new file mode 100644 index 0000000..83c3531 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_correction_04.json @@ -0,0 +1,49 @@ +{ + "id": "ce2_son_sont_correction_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 3, + "type": "sentence_correction", + "instruction": "Touche le mot qui contient une erreur, puis corrige-le.", + "tokens": [ + { + "text": "Ma", + "correct": true + }, + { + "text": "sœur", + "correct": true + }, + { + "text": "cherche", + "correct": true + }, + { + "text": "sont", + "correct": false, + "expected": "son", + "rule_id": "regle_homophone_son_sont" + }, + { + "text": "petit", + "correct": true + }, + { + "text": "chien", + "correct": true + }, + { + "text": "noir.", + "correct": true + } + ], + "hint": "Essaie de remplacer par « étaient », ou par « mon ». Relis la phrase en entier avant d'essayer.", + "explanation": "« étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom.", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_01.json b/data/exercises/ce2/ce2_son_sont_qcm_01.json new file mode 100644 index 0000000..f858bfb --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_01.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_01", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les chats ... gentils.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » convient ici : c'est le verbe être, on écrit « sont ».", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_02.json b/data/exercises/ce2/ce2_son_sont_qcm_02.json new file mode 100644 index 0000000..da52cb5 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_02.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_02", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Léa mange ... gâteau.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom.", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_03.json b/data/exercises/ce2/ce2_son_sont_qcm_03.json new file mode 100644 index 0000000..fdc1cb5 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_03.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_03", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les fleurs ... belles.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » convient ici : c'est le verbe être, on écrit « sont ».", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_04.json b/data/exercises/ce2/ce2_son_sont_qcm_04.json new file mode 100644 index 0000000..14601e9 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_04.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_04", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 1, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Paul range ... cartable.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom.", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_05.json b/data/exercises/ce2/ce2_son_sont_qcm_05.json new file mode 100644 index 0000000..1d84a16 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_05.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_05", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Mes amis ... en retard.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » convient ici : c'est le verbe être, on écrit « sont ».", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_06.json b/data/exercises/ce2/ce2_son_sont_qcm_06.json new file mode 100644 index 0000000..ad7dcc8 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_06.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_06", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 2, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Le chien boit dans ... bol.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « étaient », ou par « mon ».", + "explanation": "« étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom.", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_07.json b/data/exercises/ce2/ce2_son_sont_qcm_07.json new file mode 100644 index 0000000..abdd708 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_07.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_07", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Les enfants de la classe ... allés à la piscine.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 1, + "hint": "Essaie de remplacer par « étaient », ou par « mon ». Relis la phrase en entier avant d'essayer.", + "explanation": "« étaient » convient ici : c'est le verbe être, on écrit « sont ».", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/exercises/ce2/ce2_son_sont_qcm_08.json b/data/exercises/ce2/ce2_son_sont_qcm_08.json new file mode 100644 index 0000000..594e8a8 --- /dev/null +++ b/data/exercises/ce2/ce2_son_sont_qcm_08.json @@ -0,0 +1,23 @@ +{ + "id": "ce2_son_sont_qcm_08", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "rule_id": "regle_homophone_son_sont", + "difficulty": 3, + "type": "multiple_choice", + "instruction": "Choisis le bon mot.", + "question": "Marie a perdu ... joli stylo bleu.", + "answers": [ + "son", + "sont" + ], + "correct_answer": 0, + "hint": "Essaie de remplacer par « étaient », ou par « mon ». Relis la phrase en entier avant d'essayer.", + "explanation": "« étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom.", + "review_tags": [ + "homophone", + "son_sont" + ], + "review_status": "draft" +} diff --git a/data/localization/fr.json b/data/localization/fr.json index fd7baf0..634882d 100644 --- a/data/localization/fr.json +++ b/data/localization/fr.json @@ -17,6 +17,9 @@ "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.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", diff --git a/data/missions/mission_10_gue_petits_mots.json b/data/missions/mission_10_gue_petits_mots.json new file mode 100644 index 0000000..d64bcbc --- /dev/null +++ b/data/missions/mission_10_gue_petits_mots.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_10_gue_petits_mots", + "title": "Le gué des petits mots", + "narrative_context": "Pour traverser le gué, il faut poser le bon petit mot sur chaque pierre : « a » ou « à » ? Fais le test du remplacement avant de choisir.", + "rule_id": "regle_homophone_a_a", + "exercise_type": "multiple_choice", + "map_position": { + "x": 0.12, + "y": 0.15 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_11_moulin_pales.json b/data/missions/mission_11_moulin_pales.json new file mode 100644 index 0000000..6a3b0e9 --- /dev/null +++ b/data/missions/mission_11_moulin_pales.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_11_moulin_pales", + "title": "Le moulin aux pales mélangées", + "narrative_context": "Les pales du moulin portent des mots, mais un « a » et un « à » se sont échangés. Trouve l'intrus et remets-le en place.", + "rule_id": "regle_homophone_a_a", + "exercise_type": "sentence_correction", + "map_position": { + "x": 0.12, + "y": 0.5 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_12_grotte_resonante.json b/data/missions/mission_12_grotte_resonante.json new file mode 100644 index 0000000..b803bf8 --- /dev/null +++ b/data/missions/mission_12_grotte_resonante.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_12_grotte_resonante", + "title": "La grotte résonante", + "narrative_context": "La grotte te répète une phrase, une seule fois. Écoute bien et écris-la en pensant à tes petits mots.", + "rule_id": "regle_homophone_a_a", + "exercise_type": "dictation", + "map_position": { + "x": 0.12, + "y": 0.85 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_13_pont_levis.json b/data/missions/mission_13_pont_levis.json new file mode 100644 index 0000000..f42acae --- /dev/null +++ b/data/missions/mission_13_pont_levis.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_13_pont_levis", + "title": "Le pont-levis des mots", + "narrative_context": "Le pont-levis ne s'abaisse que si tu choisis le bon mot : « et » ou « est » ? Essaie de remplacer par « était ».", + "rule_id": "regle_homophone_et_est", + "exercise_type": "multiple_choice", + "map_position": { + "x": 0.375, + "y": 0.15 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_14_tour_horloge.json b/data/missions/mission_14_tour_horloge.json new file mode 100644 index 0000000..caa8b47 --- /dev/null +++ b/data/missions/mission_14_tour_horloge.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_14_tour_horloge", + "title": "La tour de l'horloge", + "narrative_context": "Les aiguilles de l'horloge sont déréglées : un « et » et un « est » ont changé de place. Remets-les d'aplomb.", + "rule_id": "regle_homophone_et_est", + "exercise_type": "sentence_correction", + "map_position": { + "x": 0.375, + "y": 0.5 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_15_source_chantante.json b/data/missions/mission_15_source_chantante.json new file mode 100644 index 0000000..9ba6ea6 --- /dev/null +++ b/data/missions/mission_15_source_chantante.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_15_source_chantante", + "title": "La source chantante", + "narrative_context": "La source chante une phrase, une seule fois. Écoute-la bien et écris exactement ce qu'elle chante.", + "rule_id": "regle_homophone_et_est", + "exercise_type": "dictation", + "map_position": { + "x": 0.375, + "y": 0.85 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_16_verger_bons_choix.json b/data/missions/mission_16_verger_bons_choix.json new file mode 100644 index 0000000..40c6d55 --- /dev/null +++ b/data/missions/mission_16_verger_bons_choix.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_16_verger_bons_choix", + "title": "Le verger des bons choix", + "narrative_context": "Dans le verger, chaque fruit attend son étiquette : « son » ou « sont » ? Aide le jardinier à ne pas se tromper.", + "rule_id": "regle_homophone_son_sont", + "exercise_type": "multiple_choice", + "map_position": { + "x": 0.625, + "y": 0.15 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_17_serre_etiquettes.json b/data/missions/mission_17_serre_etiquettes.json new file mode 100644 index 0000000..612ee7e --- /dev/null +++ b/data/missions/mission_17_serre_etiquettes.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_17_serre_etiquettes", + "title": "La serre aux étiquettes", + "narrative_context": "Dans la serre, des étiquettes ont été mal posées. Repère celle qui ne va pas et remplace-la par la bonne.", + "rule_id": "regle_homophone_son_sont", + "exercise_type": "sentence_correction", + "map_position": { + "x": 0.625, + "y": 0.5 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_18_fontaine_murmures.json b/data/missions/mission_18_fontaine_murmures.json new file mode 100644 index 0000000..a7870b2 --- /dev/null +++ b/data/missions/mission_18_fontaine_murmures.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_18_fontaine_murmures", + "title": "La fontaine aux murmures", + "narrative_context": "La fontaine murmure une phrase, une seule fois. Tends l'oreille et écris-la sans faute.", + "rule_id": "regle_homophone_son_sont", + "exercise_type": "dictation", + "map_position": { + "x": 0.625, + "y": 0.85 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_19_foire_petits_mots.json b/data/missions/mission_19_foire_petits_mots.json new file mode 100644 index 0000000..b6382f4 --- /dev/null +++ b/data/missions/mission_19_foire_petits_mots.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_19_foire_petits_mots", + "title": "La foire aux petits mots", + "narrative_context": "À la foire, un jeu demande de choisir entre « on » et « ont ». Fais le test du remplacement pour gagner !", + "rule_id": "regle_homophone_on_ont", + "exercise_type": "multiple_choice", + "map_position": { + "x": 0.88, + "y": 0.15 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_20_atelier_conteur.json b/data/missions/mission_20_atelier_conteur.json new file mode 100644 index 0000000..869d91d --- /dev/null +++ b/data/missions/mission_20_atelier_conteur.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_20_atelier_conteur", + "title": "L'atelier du conteur", + "narrative_context": "Dans l'atelier, une histoire a des mots échangés. Trouve le mot qui ne va pas et corrige-le.", + "rule_id": "regle_homophone_on_ont", + "exercise_type": "sentence_correction", + "map_position": { + "x": 0.88, + "y": 0.5 + }, + "review_status": "draft" +} diff --git a/data/missions/mission_21_colline_echos.json b/data/missions/mission_21_colline_echos.json new file mode 100644 index 0000000..d8f6aba --- /dev/null +++ b/data/missions/mission_21_colline_echos.json @@ -0,0 +1,12 @@ +{ + "mission_id": "mission_21_colline_echos", + "title": "La colline aux échos", + "narrative_context": "La colline répète une phrase, une seule fois. Écoute bien et écris-la en entier.", + "rule_id": "regle_homophone_on_ont", + "exercise_type": "dictation", + "map_position": { + "x": 0.88, + "y": 0.85 + }, + "review_status": "draft" +} diff --git a/data/rules/regle_homophone_a_a.json b/data/rules/regle_homophone_a_a.json new file mode 100644 index 0000000..1e390da --- /dev/null +++ b/data/rules/regle_homophone_a_a.json @@ -0,0 +1,9 @@ +{ + "rule_id": "regle_homophone_a_a", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "statement": "Pour choisir entre « a » et « à », essaie de remplacer par « avait ». Si ça marche, c'est le verbe avoir : on écrit « a » sans accent. Sinon, on écrit « à » avec un accent.", + "example": "Léa a un chat. Léa va à la plage.", + "review_status": "draft" +} diff --git a/data/rules/regle_homophone_et_est.json b/data/rules/regle_homophone_et_est.json new file mode 100644 index 0000000..4dee53a --- /dev/null +++ b/data/rules/regle_homophone_et_est.json @@ -0,0 +1,9 @@ +{ + "rule_id": "regle_homophone_et_est", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "statement": "Pour choisir entre « et » et « est », essaie de remplacer par « était ». Si ça marche, c'est le verbe être : on écrit « est ». Sinon, c'est « et », qui relie deux mots.", + "example": "Le chat est noir et blanc.", + "review_status": "draft" +} diff --git a/data/rules/regle_homophone_on_ont.json b/data/rules/regle_homophone_on_ont.json new file mode 100644 index 0000000..1a2239b --- /dev/null +++ b/data/rules/regle_homophone_on_ont.json @@ -0,0 +1,9 @@ +{ + "rule_id": "regle_homophone_on_ont", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "statement": "Pour choisir entre « on » et « ont », essaie de remplacer par « avaient ». Si ça marche, c'est le verbe avoir : on écrit « ont ». Sinon, on peut remplacer par « il » : on écrit « on ».", + "example": "Les enfants ont faim. On mange des pommes.", + "review_status": "draft" +} diff --git a/data/rules/regle_homophone_son_sont.json b/data/rules/regle_homophone_son_sont.json new file mode 100644 index 0000000..a06f42f --- /dev/null +++ b/data/rules/regle_homophone_son_sont.json @@ -0,0 +1,9 @@ +{ + "rule_id": "regle_homophone_son_sont", + "level": "CE2", + "domain": "orthographe", + "skill": "homophones_grammaticaux", + "statement": "Pour choisir entre « son » et « sont », essaie de remplacer par « étaient ». Si ça marche, c'est le verbe être : on écrit « sont ». Sinon, on peut remplacer par « mon » : on écrit « son ».", + "example": "Les chats sont gentils. Paul range son cartable.", + "review_status": "draft" +} diff --git a/docs/review/content-review.md b/docs/review/content-review.md index 8c401d1..15d3a35 100644 --- a/docs/review/content-review.md +++ b/docs/review/content-review.md @@ -188,6 +188,378 @@ Genere automatiquement depuis `data/` par `tools/generate_content_review.py`. Ne - Audio : provisoire - Statut : draft +## regle_homophone_a_a (CE2, orthographe) + +**Enonce** : Pour choisir entre « a » et « à », essaie de remplacer par « avait ». Si ça marche, c'est le verbe avoir : on écrit « a » sans accent. Sinon, on écrit « à » avec un accent. + +**Exemple** : Léa a un chat. Léa va à la plage. + +**Statut** : draft + +### Choix multiples + +- **ce2_a_a_qcm_01** (difficulte 1) : Léa ... un chat. + - Reponses : a, à + - Reponse attendue : a + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent. + - Statut : draft +- **ce2_a_a_qcm_02** (difficulte 1) : Nous allons ... la plage. + - Reponses : a, à + - Reponse attendue : à + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » ne convient pas ici : c'est le petit mot « à », avec un accent. + - Statut : draft +- **ce2_a_a_qcm_03** (difficulte 1) : Le chien ... faim. + - Reponses : a, à + - Reponse attendue : a + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent. + - Statut : draft +- **ce2_a_a_qcm_04** (difficulte 1) : Tom joue ... la balle. + - Reponses : a, à + - Reponse attendue : à + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » ne convient pas ici : c'est le petit mot « à », avec un accent. + - Statut : draft +- **ce2_a_a_qcm_05** (difficulte 2) : Mon frère ... un vélo rouge. + - Reponses : a, à + - Reponse attendue : a + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent. + - Statut : draft +- **ce2_a_a_qcm_06** (difficulte 2) : Elle donne un bonbon ... sa sœur. + - Reponses : a, à + - Reponse attendue : à + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » ne convient pas ici : c'est le petit mot « à », avec un accent. + - Statut : draft +- **ce2_a_a_qcm_07** (difficulte 3) : Ma sœur ... mangé toute la tarte. + - Reponses : a, à + - Reponse attendue : a + - Indice : Essaie de remplacer par « avait ». Relis la phrase en entier avant d'essayer. + - Explication : « avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent. + - Statut : draft +- **ce2_a_a_qcm_08** (difficulte 3) : Il commence ... lire un livre. + - Reponses : a, à + - Reponse attendue : à + - Indice : Essaie de remplacer par « avait ». Relis la phrase en entier avant d'essayer. + - Explication : « avait » ne convient pas ici : c'est le petit mot « à », avec un accent. + - Statut : draft + +### Corrections de phrase + +- **ce2_a_a_correction_01** (difficulte 1) : Le chat [à -> a] faim ce soir. + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent. + - Statut : draft +- **ce2_a_a_correction_02** (difficulte 1) : Nous allons [a -> à] la piscine. + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » ne convient pas ici : c'est le petit mot « à », avec un accent. + - Statut : draft +- **ce2_a_a_correction_03** (difficulte 2) : Mon voisin [à -> a] un grand jardin. + - Indice : Essaie de remplacer par « avait ». + - Explication : « avait » convient ici : c'est le verbe avoir, on écrit « a » sans accent. + - Statut : draft +- **ce2_a_a_correction_04** (difficulte 3) : Marie pense [a -> à] son ami depuis hier. + - Indice : Essaie de remplacer par « avait ». Relis la phrase en entier avant d'essayer. + - Explication : « avait » ne convient pas ici : c'est le petit mot « à », avec un accent. + - Statut : draft + +### Dictees + +- **ce2_a_a_dictee_01** : Léa a un chat. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_a_a_dictee_02** : Nous allons à la piscine. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_a_a_dictee_03** : Papa a donné un cadeau à Léa. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft + +## regle_homophone_et_est (CE2, orthographe) + +**Enonce** : Pour choisir entre « et » et « est », essaie de remplacer par « était ». Si ça marche, c'est le verbe être : on écrit « est ». Sinon, c'est « et », qui relie deux mots. + +**Exemple** : Le chat est noir et blanc. + +**Statut** : draft + +### Choix multiples + +- **ce2_et_est_qcm_01** (difficulte 1) : Le chat ... noir. + - Reponses : et, est + - Reponse attendue : est + - Indice : Essaie de remplacer par « était ». + - Explication : « était » convient ici : c'est le verbe être, on écrit « est ». + - Statut : draft +- **ce2_et_est_qcm_02** (difficulte 1) : Un chat ... un chien jouent. + - Reponses : et, est + - Reponse attendue : et + - Indice : Essaie de remplacer par « était ». + - Explication : « était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots. + - Statut : draft +- **ce2_et_est_qcm_03** (difficulte 1) : Ma maison ... grande. + - Reponses : et, est + - Reponse attendue : est + - Indice : Essaie de remplacer par « était ». + - Explication : « était » convient ici : c'est le verbe être, on écrit « est ». + - Statut : draft +- **ce2_et_est_qcm_04** (difficulte 1) : Je mange du pain ... du fromage. + - Reponses : et, est + - Reponse attendue : et + - Indice : Essaie de remplacer par « était ». + - Explication : « était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots. + - Statut : draft +- **ce2_et_est_qcm_05** (difficulte 2) : Papa ... maman sont partis. + - Reponses : et, est + - Reponse attendue : et + - Indice : Essaie de remplacer par « était ». + - Explication : « était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots. + - Statut : draft +- **ce2_et_est_qcm_06** (difficulte 2) : Le gâteau ... sur la table. + - Reponses : et, est + - Reponse attendue : est + - Indice : Essaie de remplacer par « était ». + - Explication : « était » convient ici : c'est le verbe être, on écrit « est ». + - Statut : draft +- **ce2_et_est_qcm_07** (difficulte 3) : Mon petit frère ... très content de son cadeau. + - Reponses : et, est + - Reponse attendue : est + - Indice : Essaie de remplacer par « était ». Relis la phrase en entier avant d'essayer. + - Explication : « était » convient ici : c'est le verbe être, on écrit « est ». + - Statut : draft +- **ce2_et_est_qcm_08** (difficulte 3) : Le chat dort sur le canapé ... le chien dort sur le tapis. + - Reponses : et, est + - Reponse attendue : et + - Indice : Essaie de remplacer par « était ». Relis la phrase en entier avant d'essayer. + - Explication : « était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots. + - Statut : draft + +### Corrections de phrase + +- **ce2_et_est_correction_01** (difficulte 1) : Le chien [et -> est] gentil avec moi. + - Indice : Essaie de remplacer par « était ». + - Explication : « était » convient ici : c'est le verbe être, on écrit « est ». + - Statut : draft +- **ce2_et_est_correction_02** (difficulte 1) : Paul [est -> et] Marie jouent ensemble. + - Indice : Essaie de remplacer par « était ». + - Explication : « était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots. + - Statut : draft +- **ce2_et_est_correction_03** (difficulte 2) : Ma sœur [et -> est] très fière de son dessin. + - Indice : Essaie de remplacer par « était ». + - Explication : « était » convient ici : c'est le verbe être, on écrit « est ». + - Statut : draft +- **ce2_et_est_correction_04** (difficulte 3) : Le lapin mange une carotte [est -> et] un chou. + - Indice : Essaie de remplacer par « était ». Relis la phrase en entier avant d'essayer. + - Explication : « était » ne convient pas ici, mais « et puis » convient : c'est « et », qui relie deux mots. + - Statut : draft + +### Dictees + +- **ce2_et_est_dictee_01** : Le chat est noir. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_et_est_dictee_02** : Paul et Marie jouent ensemble. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_et_est_dictee_03** : Mon frère est petit et blond. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft + +## regle_homophone_on_ont (CE2, orthographe) + +**Enonce** : Pour choisir entre « on » et « ont », essaie de remplacer par « avaient ». Si ça marche, c'est le verbe avoir : on écrit « ont ». Sinon, on peut remplacer par « il » : on écrit « on ». + +**Exemple** : Les enfants ont faim. On mange des pommes. + +**Statut** : draft + +### Choix multiples + +- **ce2_on_ont_qcm_01** (difficulte 1) : ... joue dehors. + - Reponses : On, Ont + - Reponse attendue : On + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ». + - Statut : draft +- **ce2_on_ont_qcm_02** (difficulte 1) : Les enfants ... faim. + - Reponses : on, ont + - Reponse attendue : ont + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » convient ici : c'est le verbe avoir, on écrit « ont ». + - Statut : draft +- **ce2_on_ont_qcm_03** (difficulte 1) : Ce soir, ... mange des pâtes. + - Reponses : on, ont + - Reponse attendue : on + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ». + - Statut : draft +- **ce2_on_ont_qcm_04** (difficulte 1) : Les chiens ... soif. + - Reponses : on, ont + - Reponse attendue : ont + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » convient ici : c'est le verbe avoir, on écrit « ont ». + - Statut : draft +- **ce2_on_ont_qcm_05** (difficulte 2) : Paul et Léa ... un nouveau vélo. + - Reponses : on, ont + - Reponse attendue : ont + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » convient ici : c'est le verbe avoir, on écrit « ont ». + - Statut : draft +- **ce2_on_ont_qcm_06** (difficulte 2) : À la récréation, ... saute à la corde. + - Reponses : on, ont + - Reponse attendue : on + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ». + - Statut : draft +- **ce2_on_ont_qcm_07** (difficulte 3) : Les enfants de ma classe ... fini leur travail. + - Reponses : on, ont + - Reponse attendue : ont + - Indice : Essaie de remplacer par « avaient », ou par « il ». Relis la phrase en entier avant d'essayer. + - Explication : « avaient » convient ici : c'est le verbe avoir, on écrit « ont ». + - Statut : draft +- **ce2_on_ont_qcm_08** (difficulte 3) : Quand il pleut, ... reste à la maison. + - Reponses : on, ont + - Reponse attendue : on + - Indice : Essaie de remplacer par « avaient », ou par « il ». Relis la phrase en entier avant d'essayer. + - Explication : « avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ». + - Statut : draft + +### Corrections de phrase + +- **ce2_on_ont_correction_01** (difficulte 1) : Les chats [on -> ont] peur du chien. + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » convient ici : c'est le verbe avoir, on écrit « ont ». + - Statut : draft +- **ce2_on_ont_correction_02** (difficulte 1) : [Ont -> On] joue dans la cour. + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ». + - Statut : draft +- **ce2_on_ont_correction_03** (difficulte 2) : Mes cousins [on -> ont] un grand chien. + - Indice : Essaie de remplacer par « avaient », ou par « il ». + - Explication : « avaient » convient ici : c'est le verbe avoir, on écrit « ont ». + - Statut : draft +- **ce2_on_ont_correction_04** (difficulte 3) : Le soir, [ont -> on] lit une histoire à la maison. + - Indice : Essaie de remplacer par « avaient », ou par « il ». Relis la phrase en entier avant d'essayer. + - Explication : « avaient » ne convient pas ici, mais « il » convient : c'est le pronom « on ». + - Statut : draft + +### Dictees + +- **ce2_on_ont_dictee_01** : On joue dehors. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_on_ont_dictee_02** : Les enfants ont faim. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_on_ont_dictee_03** : Les enfants ont sommeil et on lit une histoire. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft + +## regle_homophone_son_sont (CE2, orthographe) + +**Enonce** : Pour choisir entre « son » et « sont », essaie de remplacer par « étaient ». Si ça marche, c'est le verbe être : on écrit « sont ». Sinon, on peut remplacer par « mon » : on écrit « son ». + +**Exemple** : Les chats sont gentils. Paul range son cartable. + +**Statut** : draft + +### Choix multiples + +- **ce2_son_sont_qcm_01** (difficulte 1) : Les chats ... gentils. + - Reponses : son, sont + - Reponse attendue : sont + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » convient ici : c'est le verbe être, on écrit « sont ». + - Statut : draft +- **ce2_son_sont_qcm_02** (difficulte 1) : Léa mange ... gâteau. + - Reponses : son, sont + - Reponse attendue : son + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom. + - Statut : draft +- **ce2_son_sont_qcm_03** (difficulte 1) : Les fleurs ... belles. + - Reponses : son, sont + - Reponse attendue : sont + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » convient ici : c'est le verbe être, on écrit « sont ». + - Statut : draft +- **ce2_son_sont_qcm_04** (difficulte 1) : Paul range ... cartable. + - Reponses : son, sont + - Reponse attendue : son + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom. + - Statut : draft +- **ce2_son_sont_qcm_05** (difficulte 2) : Mes amis ... en retard. + - Reponses : son, sont + - Reponse attendue : sont + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » convient ici : c'est le verbe être, on écrit « sont ». + - Statut : draft +- **ce2_son_sont_qcm_06** (difficulte 2) : Le chien boit dans ... bol. + - Reponses : son, sont + - Reponse attendue : son + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom. + - Statut : draft +- **ce2_son_sont_qcm_07** (difficulte 3) : Les enfants de la classe ... allés à la piscine. + - Reponses : son, sont + - Reponse attendue : sont + - Indice : Essaie de remplacer par « étaient », ou par « mon ». Relis la phrase en entier avant d'essayer. + - Explication : « étaient » convient ici : c'est le verbe être, on écrit « sont ». + - Statut : draft +- **ce2_son_sont_qcm_08** (difficulte 3) : Marie a perdu ... joli stylo bleu. + - Reponses : son, sont + - Reponse attendue : son + - Indice : Essaie de remplacer par « étaient », ou par « mon ». Relis la phrase en entier avant d'essayer. + - Explication : « étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom. + - Statut : draft + +### Corrections de phrase + +- **ce2_son_sont_correction_01** (difficulte 1) : Les oiseaux [son -> sont] dans le nid. + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » convient ici : c'est le verbe être, on écrit « sont ». + - Statut : draft +- **ce2_son_sont_correction_02** (difficulte 1) : Paul mange [sont -> son] pain. + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom. + - Statut : draft +- **ce2_son_sont_correction_03** (difficulte 2) : Mes voisins [son -> sont] partis ce matin. + - Indice : Essaie de remplacer par « étaient », ou par « mon ». + - Explication : « étaient » convient ici : c'est le verbe être, on écrit « sont ». + - Statut : draft +- **ce2_son_sont_correction_04** (difficulte 3) : Ma sœur cherche [sont -> son] petit chien noir. + - Indice : Essaie de remplacer par « étaient », ou par « mon ». Relis la phrase en entier avant d'essayer. + - Explication : « étaient » ne convient pas ici, mais « mon » convient : c'est « son », qui accompagne un nom. + - Statut : draft + +### Dictees + +- **ce2_son_sont_dictee_01** : Les chats sont gentils. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_son_sont_dictee_02** : Paul range son cartable. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft +- **ce2_son_sont_dictee_03** : Léa et Paul sont dans son jardin. + - Variantes acceptees : aucune + - Audio : provisoire + - Statut : draft + ## regle_pluriel_nom (CE1, grammaire) **Enonce** : Le plus souvent, on forme le pluriel d'un nom en ajoutant un -s a la fin du mot. diff --git a/docs/specs/decisions.md b/docs/specs/decisions.md index 34cb164..e8e3ad4 100644 --- a/docs/specs/decisions.md +++ b/docs/specs/decisions.md @@ -244,3 +244,13 @@ Ajouts à l'arborescence proposée : **Correction** : les 9 missions sont replacées sur une grille régulière 3x3 (x, y ∈ {0.15, 0.5, 0.85}), avec un écart de 0.35 entre positions adjacentes — largement supérieur à la largeur/hauteur des marqueurs rapportée à la fenêtre par défaut. Les trois missions historiques (`mission_01` à `_03`) sont déplacées elles aussi, pas seulement les nouvelles, pour que la grille soit cohérente partout plutôt que patchée au cas par cas. **Garde-fou** : nouveau test headless (`tests/data/test_mission_positions.gd`) qui échoue si deux missions ont un écart fractionnel inférieur à 0.3 sur les deux axes — ne remplace pas une vérification visuelle (l'écart réel en pixels dépend de la taille de fenêtre réelle, non fixée), mais attrape la classe d'erreur qui vient de se produire avant qu'elle ne soit signalée à la main. + +## 27. Chapitre CE2 « homophones grammaticaux » et carte par niveau + +**Décision** : le chapitre CE2 est traité avec les mêmes directives que le CE1 (point 25), sans question préalable (autorisation explicite de ne s'arrêter que sur une contradiction de la spécification ou un changement du format des données/sauvegardes — aucun des deux ici : `school_level` existait déjà dans la sauvegarde, `skills` accepte tout identifiant de compétence, aucun schéma modifié). + +**Contenu** (tout en `review_status: draft`, accents corrects, un seul niveau d'orthographe `orthographe`) : quatre règles `regle_homophone_a_a` (a/à), `regle_homophone_et_est` (et/est), `regle_homophone_son_sont` (son/sont), `regle_homophone_on_ont` (on/ont), chacune avec son test de substitution dans l'énoncé, l'indice et l'explication (« avait », « était », « étaient »/« mon », « avaient »/« il »). Compétence commune `homophones_grammaticaux` (même granularité que `accord_groupe_nominal` au CE1). Par règle : 8 choix multiples, 4 corrections de phrase, 3 dictées (3 par règle et non 3 par chapitre, comme au CE1, pour que chaque mission de dictée ait de quoi varier) ; 3 missions par règle (12 au total, `mission_10` à `mission_21`). Audio des 12 dictées généré avec Piper (point 20). `data/curriculum/ce2_homophones_grammaticaux.json` ajouté (région `marais_des_homophones`, toujours non consommé par le moteur). + +**Carte par niveau** : 21 missions sur une seule carte ne tiennent pas (marqueurs de 160 px sur 1152 px). `ExerciseEngine.get_missions_for_level()` filtre sur le niveau de la règle de la mission (pas de champ supplémentaire dans les missions), `ProgressManager.school_level()` expose le niveau du profil, et `world_map` n'affiche que les missions du niveau du profil. Le cahier des charges (« un enfant de CE2 qui rencontre une difficulté sur une notion de CE1 pourra revenir à un entraînement adapté ») est respecté par un bouton « Revoir le CE1 » / « Retour au CE2 » visible uniquement pour un profil CE2. Un profil CE1 ne voit pas le CE2. Disposition CE2 : grille 4 colonnes (une par règle) × 3 lignes (QCM, correction, dictée) ; le test d'écart (point 26) vérifie maintenant chaque niveau séparément. + +**Non vérifié** : rendu de la carte CE2 (12 marqueurs), du bouton de bascule, et écoute des 12 voix — voir `docs/testing/manual-checklist.md`. Les textes plus anciens du CE1 (indices/explications) n'ont pas d'accents ; non corrigé ici, à traiter à part. diff --git a/docs/testing/manual-checklist.md b/docs/testing/manual-checklist.md index ddcedd5..1926a82 100644 --- a/docs/testing/manual-checklist.md +++ b/docs/testing/manual-checklist.md @@ -16,6 +16,7 @@ Tout ce qui suit ne peut pas être vérifié sans écran (rendu, mise en page, a 10. Mission « Le pont des phrases » (correction de phrase) : toucher un mot le fait apparaître comme sélectionné (état visuel distinct, pas seulement une couleur) ; un champ de saisie apparaît sous le mot sélectionné ; toucher à nouveau le mot fait disparaître le champ. 11. Mission « La clairière de l'écho » (dictée) : à l'arrivée sur l'exercice, la voix de synthèse doit se faire entendre automatiquement ; le bouton « Réécouter » la rejoue sans planter ; le badge « Voix provisoire » est visible ; la zone de saisie accepte le texte et les accents. Le rappel « N'oublie pas : une majuscule au début de la phrase et un point à la fin ! » doit être visible (point 22 de `decisions.md`) ; taper le texte sans majuscule ou sans point final doit être refusé, avec l'erreur correspondante. 12. Après 3 exercices, écran de récompense avec le nombre d'étoiles, puis retour à la carte. +12ter. Profil **CE2** : la carte affiche « Le marais des homophones » avec 12 lieux (4 colonnes × 3 lignes, sans chevauchement) et un bouton « Revoir le CE1 » qui bascule sur les 9 lieux CE1 (et « Retour au CE2 » revient) ; un profil CE1 n'a pas ce bouton (point 27 de `decisions.md`). Jamais vu à l'écran. Jouer une mission de chaque règle CE2 (a/à, et/est, son/sont, on/ont), dont une dictée : voix claire, rappel majuscule/point visible. 12bis. Répéter rapidement les points 8-12 sur une mission de chacune des deux nouvelles règles (« La ruche qui se multiplie » pour le pluriel du nom, « Le sentier des bons compagnons » pour l'accord du déterminant) : jamais vu à l'écran, seulement validé en headless (point 25 de `decisions.md`). 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. Depuis la sélection de profil, supprimer un profil : une confirmation explicite doit apparaître avant la suppression effective ; annuler doit ne rien supprimer. diff --git a/scenes/world/world_map.gd b/scenes/world/world_map.gd index 68a23ff..ae134d9 100644 --- a/scenes/world/world_map.gd +++ b/scenes/world/world_map.gd @@ -1,31 +1,52 @@ extends Control -## Carte des missions. Le prototype initial (cahier des charges §15) se -## limitait a trois lieux ; le perimetre a ete etendu au-dela (voir -## docs/specs/decisions.md, point 25) pour couvrir plus d'une regle par -## chapitre. 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. +## Carte des missions du niveau scolaire du profil. Le prototype initial +## (cahier des charges §15) se limitait a trois lieux ; le perimetre a ete +## 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. Un profil CE2 +## peut basculer sur la carte CE1 pour revoir les notions precedentes. const MARKER_HALF_WIDTH := 80.0 const MARKER_HALF_HEIGHT := 36.0 +var _viewed_level := "CE1" + @onready var _title_label: Label = %TitleLabel @onready var _map_area: Control = %MapArea +@onready var _level_toggle_button: Button = %LevelToggleButton func _ready() -> void: - _title_label.text = UIText.get_text("world_map.title") + _viewed_level = ProgressManager.school_level() + _level_toggle_button.visible = _viewed_level == "CE2" + _level_toggle_button.pressed.connect(_on_level_toggle_pressed) + _refresh() + + +func _refresh() -> void: + var title_key := "world_map.title_ce2" if _viewed_level == "CE2" else "world_map.title" + _title_label.text = UIText.get_text(title_key) + var toggle_key := ( + "world_map.review_ce1_button" if _viewed_level == "CE2" else "world_map.back_to_ce2_button" + ) + _level_toggle_button.text = UIText.get_text(toggle_key) _populate_missions() func _populate_missions() -> void: for child in _map_area.get_children(): + _map_area.remove_child(child) child.queue_free() - for mission: Dictionary in ExerciseEngine.get_missions(): + for mission: Dictionary in ExerciseEngine.get_missions_for_level(_viewed_level): _map_area.add_child(_build_marker(mission)) +func _on_level_toggle_pressed() -> void: + _viewed_level = "CE1" if _viewed_level == "CE2" else "CE2" + _refresh() + + func _build_marker(mission: Dictionary) -> Control: var button := Button.new() button.text = "%s\n%s" % [mission["title"], _status_label_for(mission)] diff --git a/scenes/world/world_map.tscn b/scenes/world/world_map.tscn index a07d3ed..e41eb2a 100644 --- a/scenes/world/world_map.tscn +++ b/scenes/world/world_map.tscn @@ -41,6 +41,11 @@ unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 3 +[node name="LevelToggleButton" type="Button" parent="VBox"] +unique_name_in_owner = true +layout_mode = 2 +custom_minimum_size = Vector2(0, 48) + [node name="Guide" type="Control" parent="VBox" instance=ExtResource("2")] unique_name_in_owner = true layout_mode = 2 diff --git a/tests/data/test_mission_positions.gd b/tests/data/test_mission_positions.gd index b04e66b..7acd8e6 100644 --- a/tests/data/test_mission_positions.gd +++ b/tests/data/test_mission_positions.gd @@ -1,28 +1,32 @@ extends GutTest ## Garde-fou contre le chevauchement de marqueurs sur la carte (signale ## manuellement : "La clairiere" et "La cabane" se chevauchaient, voir -## docs/specs/decisions.md). scenes/world/world_map.gd place chaque marqueur -## a une position fractionnelle (map_position.x/y de data/missions/*.json) ; -## sans ecart suffisant entre deux missions, leurs boutons se recouvrent a -## l'ecran. Verifie l'ecart plutot que le rendu reel (non testable sans -## ecran), avec une marge volontairement un peu permissive par rapport a la -## grille 0.35 utilisee dans les donnees. +## docs/specs/decisions.md, point 26). scenes/world/world_map.gd place chaque +## marqueur a une position fractionnelle (map_position.x/y de +## data/missions/*.json) ; sans ecart suffisant entre deux missions affichees +## ensemble (meme niveau), leurs boutons se recouvrent a l'ecran. Verifie +## l'ecart plutot que le rendu reel (non testable sans ecran), a la +## resolution par defaut (1152 px de large : 0.2 = 230 px pour des +## marqueurs de 160 px ; 0.3 de hauteur pour des marqueurs de 72 px). -const MIN_FRACTIONAL_GAP := 0.3 +const MIN_GAP_X := 0.2 +const MIN_GAP_Y := 0.3 -func test_mission_markers_do_not_overlap() -> void: - var missions := ExerciseEngine.get_missions() - 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_FRACTIONAL_GAP or dy >= MIN_FRACTIONAL_GAP, - ( - "%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_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] + ), + ) diff --git a/tests/exercises/test_exercise_engine.gd b/tests/exercises/test_exercise_engine.gd index ccfd600..4faa105 100644 --- a/tests/exercises/test_exercise_engine.gd +++ b/tests/exercises/test_exercise_engine.gd @@ -15,11 +15,18 @@ 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(), 9) + assert_eq(missions.size(), 21) 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")) assert_true(ids.has("mission_09_rocher_qui_repete")) + assert_true(ids.has("mission_21_colline_echos")) + + +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("CE2").size(), 12) + assert_eq(ExerciseEngine.get_missions_for_level("CM1").size(), 0) func test_get_mission_returns_the_requested_mission() -> void: diff --git a/tests/world/test_world_map.gd b/tests/world/test_world_map.gd new file mode 100644 index 0000000..a78f5ff --- /dev/null +++ b/tests/world/test_world_map.gd @@ -0,0 +1,45 @@ +extends GutTest +## La carte n'affiche que les missions du niveau du profil ; un profil CE2 peut +## basculer sur la carte CE1 pour revoir les notions precedentes (point 27 de +## docs/specs/decisions.md). + +var _profile_id: String = "" + + +func after_each() -> void: + ProfileManager.delete_profile(_profile_id) + + +func _open_map_for(level: String) -> Control: + _profile_id = ProfileManager.create_profile("Test", level) + ProfileManager.select_profile(_profile_id) + var map: Control = load("res://scenes/world/world_map.tscn").instantiate() + add_child_autofree(map) + return map + + +func test_ce1_profile_sees_only_ce1_missions_and_no_toggle() -> void: + var map := _open_map_for("CE1") + await wait_process_frames(1) + + assert_eq(map.get_node("%MapArea").get_child_count(), 9) + assert_false(map.get_node("%LevelToggleButton").visible) + + +func test_ce2_profile_sees_ce2_missions_and_can_review_ce1() -> void: + var map := _open_map_for("CE2") + 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")) + 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")) + + toggle.pressed.emit() + await wait_process_frames(1) + assert_eq(map.get_node("%MapArea").get_child_count(), 12) diff --git a/tests/world/test_world_map.gd.uid b/tests/world/test_world_map.gd.uid new file mode 100644 index 0000000..03e1ae3 --- /dev/null +++ b/tests/world/test_world_map.gd.uid @@ -0,0 +1 @@ +uid://b07gkjubhbj8w