Visual overhaul: theme, illustrations, redesigned screens (0.3.0)

Phase "habillage" of the post-0.1.0 plan. Rendering was reviewed on real
screenshots (new tools/screenshot.gd, `make screenshot`), which also
caught and fixed map markers overlapping and truncated titles.

- Global Godot theme (Atkinson Hyperlegible font, cream/green/gold
  palette, raised buttons, rounded cards, thick keyboard focus).
- Original vector art: forest/marsh backdrops, Plume the owl, stars,
  exercise-type icons, correct/try-again icons, 10 collection items.
- Redesigned world map (markers as cards with icon, title and stars,
  responsive layout), profile screens, mission intro, exercise host,
  rule/feedback panels, reward screen and collection grid.
- Motion helper (pop-in, fade) honouring an animations setting.
- Settings: animations flag; base window 1152x648 with canvas_items.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Denis Defolie
2026-10-11 22:36:43 +02:00
parent ebe2dbe3ed
commit 97a065879c
93 changed files with 2596 additions and 197 deletions
+1
View File
@@ -29,6 +29,7 @@ theme_override_constants/separation = 16
[node name="InstructionLabel" type="Label" parent="Margin/VBox"]
unique_name_in_owner = true
theme_type_variation = &"Emphasis"
layout_mode = 2
autowrap_mode = 2
+3
View File
@@ -29,6 +29,7 @@ var _pending_outcome := ""
@onready var _exercise_container: Control = %ExerciseContainer
@onready var _overlay_container: Control = %OverlayContainer
@onready var _progress_label: Label = %ProgressLabel
@onready var _progress_pill: Control = %ProgressPill
@onready var _abandon_button: Button = %AbandonButton
@onready var _abandon_confirm_dialog: ConfirmationDialog = %AbandonConfirmDialog
@@ -64,6 +65,7 @@ func _ready() -> void:
_rule = ExerciseEngine.get_rule(_mission["rule_id"])
_skill_id = _rule.get("skill", "")
_current_difficulty = ProgressManager.next_difficulty_for_skill(_skill_id, 1)
$Backdrop.kind = "marsh" if _rule.get("level", "CE1") == "CE2" else "forest"
_show_rule_panel()
@@ -114,6 +116,7 @@ func _load_next_exercise() -> void:
## peut faire redonner le meme exercice d'une mission a l'autre tentative :
## sans ce repere, ca ressemble a un blocage plutot qu'a une progression.
func _update_progress_label() -> void:
_progress_pill.visible = true
_progress_label.text = "%s %d/%d" % [
UIText.get_text("exercise_host.progress_label"), _completed_count + 1, MISSION_LENGTH
]
+38 -5
View File
@@ -1,6 +1,7 @@
[gd_scene load_steps=2 format=3]
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scenes/exercises/exercise_host.gd" id="1"]
[ext_resource type="PackedScene" path="res://scenes/ui/backdrop.tscn" id="backdrop"]
[node name="ExerciseHost" type="Control"]
layout_mode = 3
@@ -11,12 +12,36 @@ grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1")
[node name="Backdrop" parent="." instance=ExtResource("backdrop")]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
unique_name_in_owner = true
[node name="ContentCard" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 24.0
offset_top = 64.0
offset_right = -24.0
offset_bottom = -24.0
grow_horizontal = 2
grow_vertical = 2
[node name="ExerciseContainer" type="Control" parent="."]
unique_name_in_owner = true
layout_mode = 1
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = 48.0
offset_left = 40.0
offset_top = 76.0
offset_right = -40.0
offset_bottom = -36.0
grow_horizontal = 2
grow_vertical = 2
@@ -33,7 +58,7 @@ mouse_filter = 2
[node name="HeaderBar" type="MarginContainer" parent="."]
layout_mode = 1
anchor_right = 1.0
offset_bottom = 48.0
offset_bottom = 56.0
grow_horizontal = 2
theme_override_constants/margin_left = 16
theme_override_constants/margin_top = 8
@@ -45,16 +70,24 @@ layout_mode = 2
[node name="AbandonButton" type="Button" parent="HeaderBar/HBox"]
unique_name_in_owner = true
theme_type_variation = &"SecondaryButton"
layout_mode = 2
[node name="Spacer" type="Control" parent="HeaderBar/HBox"]
layout_mode = 2
size_flags_horizontal = 3
[node name="ProgressLabel" type="Label" parent="HeaderBar/HBox"]
[node name="ProgressPill" type="PanelContainer" parent="HeaderBar/HBox"]
unique_name_in_owner = true
visible = false
theme_type_variation = &"Pill"
layout_mode = 2
horizontal_alignment = 2
[node name="ProgressLabel" type="Label" parent="HeaderBar/HBox/ProgressPill"]
unique_name_in_owner = true
theme_type_variation = &"Emphasis"
layout_mode = 2
horizontal_alignment = 1
[node name="AbandonConfirmDialog" type="ConfirmationDialog" parent="."]
unique_name_in_owner = true
+2 -1
View File
@@ -21,7 +21,8 @@ func load_exercise(exercise: Dictionary) -> void:
for i in answers.size():
var button := Button.new()
button.text = answers[i]
button.custom_minimum_size = Vector2(0, 56)
button.custom_minimum_size = Vector2(0, 64)
button.add_theme_font_size_override("font_size", 28)
button.pressed.connect(_on_answer_pressed.bind(i))
_answers_box.add_child(button)
+2 -1
View File
@@ -29,6 +29,7 @@ theme_override_constants/separation = 16
[node name="InstructionLabel" type="Label" parent="Margin/VBox"]
unique_name_in_owner = true
theme_type_variation = &"Emphasis"
layout_mode = 2
autowrap_mode = 2
@@ -36,7 +37,7 @@ autowrap_mode = 2
unique_name_in_owner = true
layout_mode = 2
autowrap_mode = 2
theme_override_font_sizes/font_size = 24
theme_type_variation = &"CardTitle"
[node name="AnswersBox" type="VBoxContainer" parent="Margin/VBox"]
unique_name_in_owner = true
+3
View File
@@ -33,6 +33,9 @@ func load_exercise(exercise: Dictionary) -> void:
var button := Button.new()
button.text = tokens[i]["text"]
button.toggle_mode = true
button.theme_type_variation = &"SecondaryButton"
button.custom_minimum_size = Vector2(0, 60)
button.add_theme_font_size_override("font_size", 30)
button.toggled.connect(_on_token_toggled.bind(i))
_tokens_box.add_child(button)
@@ -29,6 +29,7 @@ theme_override_constants/separation = 16
[node name="InstructionLabel" type="Label" parent="Margin/VBox"]
unique_name_in_owner = true
theme_type_variation = &"Emphasis"
layout_mode = 2
autowrap_mode = 2