Merge pull request #64 from Excello-Recherche-Education/dynamic-number-of-lessons

Dynamic allocation of lessons by garden to fill the brain
This commit is contained in:
Adrien Ufferte
2025-08-18 13:23:14 +02:00
committed by GitHub
2 changed files with 38 additions and 21 deletions
+29 -15
View File
@@ -385,6 +385,25 @@ func _ready() -> void:
static func compute_lessons_distribution(total_lessons: int, garden_layouts: Array[GardenLayout]) -> Array[int]:
Logger.debug("compute_lessons_distribution: total_lessons = %s, garden_layouts count = %s" % [str(total_lessons), str(garden_layouts.size())])
var distribution: Array[int] = []
var lessons_left: int = total_lessons
var gardens_left: int = garden_layouts.size()
for layout_index: int in range(garden_layouts.size()):
var max_lessons: int = garden_layouts[layout_index].lesson_buttons.size()
var lessons_for_garden: int = 0
if gardens_left > 0:
lessons_for_garden = int(ceil(float(lessons_left) / float(gardens_left)))
lessons_for_garden = min(lessons_for_garden, max_lessons)
if lessons_for_garden > lessons_left:
lessons_for_garden = lessons_left
distribution.append(lessons_for_garden)
lessons_left -= lessons_for_garden
gardens_left -= 1
return distribution
func _process(_delta: float) -> void:
locked_line.position.x = - scroll_container.scroll_horizontal
unlocked_line.position.x = - scroll_container.scroll_horizontal
@@ -537,7 +556,8 @@ func _set_up_lessons() -> void:
var lesson_ind: int = 1
for garden_ind: int in range(garden_parent.get_child_count()):
var garden_control: Garden = garden_parent.get_child(garden_ind)
for index: int in range(garden_control.lesson_button_controls.size()):
var button_count: int = garden_control.garden_layout.lesson_buttons.size()
for index: int in range(button_count):
if not lesson_ind in lessons:
break
garden_control.set_lesson_label(index, lessons[lesson_ind][0].grapheme as String)
@@ -561,26 +581,20 @@ func add_gardens() -> void:
for child: Node in garden_parent.get_children():
child.free()
# Adds the gardens needed from the layout configuration
var current_lesson_count: int = 0
var distribution: Array[int] = compute_lessons_distribution(lessons.size(), gardens_layout.gardens)
var garden_index: int = 0
for garden_layout: GardenLayout in gardens_layout.gardens:
for layout_index: int in range(gardens_layout.gardens.size()):
var garden_layout: GardenLayout = gardens_layout.gardens[layout_index]
var garden: Garden = GARDEN_SCENE.instantiate()
garden_parent.add_child(garden)
garden.garden_index = garden_index
garden_index += 1
for index: int in range(garden_layout.lesson_buttons.size()):
if current_lesson_count >= lessons.size():
garden_layout.lesson_buttons.resize(index)
break
current_lesson_count += 1
var lessons_for_garden: int = distribution[layout_index]
garden_layout.lesson_buttons.resize(lessons_for_garden)
garden.garden_layout = garden_layout
# Don't add empty gardens
if current_lesson_count >= lessons.size():
break
func set_up_path() -> void:
+9 -6
View File
@@ -65,25 +65,29 @@ const KALULU := preload("res://sources/minigames/base/kalulu.gd")
@onready var help_speech: AudioStream = Database.load_external_sound(Database.get_kalulu_speech_path("brain_screen", "help"))
static func _compute_lessons_distribution(total_lessons: int, garden_layouts: Array[GardenLayout]) -> Array[int]:
return Gardens.compute_lessons_distribution(total_lessons, garden_layouts)
func _ready() -> void:
UserDataManager.start_synchronization_timer()
for index: int in range(garden_buttons.size()):
garden_buttons[index].pressed.connect(_on_garden_button_pressed.bind(index))
var lesson_ind: int = 1
var distribution: Array[int] = _compute_lessons_distribution(Database.get_lessons_count(), gardens_layout.gardens)
for index: int in range(gardens_layout.gardens.size()):
var can_emit: bool = true
if UserDataManager.student_progression.unlocks.has(lesson_ind) and UserDataManager.student_progression.unlocks[lesson_ind]["look_and_learn"] != StudentProgression.Status.Locked:
if distribution[index] > 0 and UserDataManager.student_progression.unlocks.has(lesson_ind) and UserDataManager.student_progression.unlocks[lesson_ind]["look_and_learn"] != StudentProgression.Status.Locked:
garden_buttons[index].disabled = false
garden_buttons[index].self_modulate = unlocked_colors[index]
else:
garden_buttons[index].disabled = true
garden_buttons[index].self_modulate = locked_color
can_emit = false
var emitting: bool = false
for _index2: int in range(gardens_layout.gardens[index].lesson_buttons.size()):
for _index2: int in range(distribution[index]):
if can_emit and not emitting:
emitting = false
for game: StudentProgression.Status in UserDataManager.student_progression.unlocks[lesson_ind]["games"]:
@@ -93,8 +97,7 @@ func _ready() -> void:
lesson_ind += 1
particles[index].emitting = emitting
await OpeningCurtain.open()
if not UserDataManager.is_speech_played("brain"):