From 7bd475a76abba7ddcfbd1af93cd259318c4fc53a Mon Sep 17 00:00:00 2001 From: Adrien Ufferte Date: Fri, 12 Dec 2025 11:56:01 +0100 Subject: [PATCH] Dynamic flower size depending on minigames completion --- resources/gardens/garden.gd | 7 ++ sources/gardens/gardens.gd | 145 ++++++++++++++---------------------- 2 files changed, 63 insertions(+), 89 deletions(-) diff --git a/resources/gardens/garden.gd b/resources/gardens/garden.gd index de955939..9c522963 100644 --- a/resources/gardens/garden.gd +++ b/resources/gardens/garden.gd @@ -21,6 +21,7 @@ const FLOWER_Z_INDEX: int = 1 var flowers: Array[GardenLayout.Flower] = [] var flowers_sizes: Array[FlowerSizes] = [] +var flowers_visible: Array[bool] = [] var color: Color var current_progression: float = 0.0 var max_progression: float = 0.0 @@ -50,8 +51,10 @@ func set_garden_layout(p_garden_layout: GardenLayout) -> void: func set_flowers(p_flowers: Array[GardenLayout.Flower], default_size: FlowerSizes = FlowerSizes.NOT_STARTED) -> void: flowers = p_flowers flowers_sizes = [] + flowers_visible = [] for _i: int in range(flowers.size()): flowers_sizes.append(default_size) + flowers_visible.append(true) _ensure_flower_controls_count(flowers.size()) update_flowers() @@ -62,6 +65,10 @@ func update_flowers() -> void: break var flower: GardenLayout.Flower = flowers[index] var flower_scene: TextureRect = flower_controls[index] + var flower_is_visible: bool = index < flowers_visible.size() and flowers_visible[index] + flower_scene.visible = flower_is_visible + if not flower_is_visible: + continue var flower_size: String = FlowerSizes.keys()[flowers_sizes[index]] flower_size = flower_size.to_lower() flower_scene.texture = load(FLOWER_PATH_MODEL % [flower.color+1, flower.type+1, flower_size]) diff --git a/sources/gardens/gardens.gd b/sources/gardens/gardens.gd index 94f8829d..f12c7d7c 100644 --- a/sources/gardens/gardens.gd +++ b/sources/gardens/gardens.gd @@ -39,6 +39,7 @@ var current_lesson_number: int = -1 var current_garden: Garden var current_button_global_position: Vector2 = Vector2.ZERO var current_button: LessonButton +var lesson_to_flower_index: Dictionary = {} @onready var garden_parent: HBoxContainer = %GardenParent @onready var locked_line: Line2D = $ScrollContainer/LockedLine @@ -96,6 +97,8 @@ func _ready() -> void: _lock() + lesson_to_flower_index.clear() + # Transition variables # # The maximum unlocked lesson by the player @@ -104,9 +107,6 @@ func _ready() -> void: # Defines if the last played minigame or lookandlearn is of the last available lesson var is_current_lesson: bool = transition_data and transition_data.current_lesson_number == max_unlocked_lesson - # Defines if a look and learn was just completed - var is_look_and_learn_completed: bool = transition_data.has("look_and_learn_completed") and transition_data.look_and_learn_completed - # Defines if a minigame was just completed var is_minigame_completed: bool = transition_data.has("minigame_completed") and transition_data.minigame_completed @@ -129,78 +129,37 @@ func _ready() -> void: var button: LessonButton = garden_control.get_lesson_buttons()[index] if not lesson_ind in lessons: button.set_disabled(true) + if index < garden_control.flowers_visible.size(): + garden_control.flowers_visible[index] = false continue - # Adds the max progression of the look and learn - garden_control.max_progression += 2.0 - - if UserDataManager.student_progression.unlocks[lesson_ind]["look_and_learn"] >= StudentProgression.Status.Unlocked: - match UserDataManager.student_progression.unlocks[lesson_ind]["look_and_learn"]: - StudentProgression.Status.Unlocked: - garden_control.current_progression += 1.0 - StudentProgression.Status.Completed: - garden_control.current_progression += 2.0 - button.set_disabled(false) - else: - button.set_disabled(true) + lesson_to_flower_index[lesson_ind] = {"garden": garden_control, "index": index} + var lesson_unlocks: Dictionary = UserDataManager.student_progression.unlocks[lesson_ind] + var is_lesson_unlocked: bool = lesson_unlocks["look_and_learn"] != StudentProgression.Status.Locked + button.set_disabled(not is_lesson_unlocked) + if index < garden_control.flowers_visible.size(): + garden_control.flowers_visible[index] = is_lesson_unlocked # If we just unlocked the new lesson, leave the button disabled if new_lesson_unlocked and lesson_ind == max_unlocked_lesson: button.set_disabled(true) - # Remove the completion if the look and learn was just completed for the first time - if is_look_and_learn_completed and is_first_clear: - garden_control.current_progression -= 1 - if not(new_lesson_unlocked and lesson_ind == max_unlocked_lesson - 1): button.completed = UserDataManager.student_progression.is_lesson_completed(lesson_ind) - # Handles progression of the minigames - for game_index: int in range(3): - garden_control.max_progression += 2.0 - match UserDataManager.student_progression.unlocks[lesson_ind]["games"][game_index]: - StudentProgression.Status.Unlocked: - garden_control.current_progression += 1.0 - StudentProgression.Status.Completed: - garden_control.current_progression += 2.0 - - # Remove the completion if the minigame was just completed for the first time - if lesson_ind == max_unlocked_lesson and is_first_clear and is_minigame_completed and transition_data.has("minigame_number") and transition_data.minigame_number == game_index: - garden_control.current_progression -= 1 + var completed_minigames: int = _count_completed_minigames(lesson_ind) + if is_current_lesson and is_first_clear and is_minigame_completed and transition_data.has("minigame_number") and transition_data.minigame_number < (lesson_unlocks["games"] as Array).size(): + if lesson_unlocks["games"][transition_data.minigame_number] == StudentProgression.Status.Completed: + completed_minigames = max(0, completed_minigames - 1) + + if index < garden_control.flowers_sizes.size(): + garden_control.flowers_sizes[index] = _get_flower_size_for_completion(completed_minigames) lesson_ind += 1 - # Handles the flowers - var total_flowers: float = garden_control.get_progress_ratio() * garden_control.flower_controls.size() * 3.0 - var flower_ind: int = 0 - - while total_flowers > 0 and flower_ind < garden_control.flower_controls.size(): - if total_flowers >= 3.0: - garden_control.flowers_sizes[flower_ind] = Garden.FlowerSizes.LARGE - total_flowers -= 3.0 - elif total_flowers >= 2.0: - garden_control.flowers_sizes[flower_ind] = Garden.FlowerSizes.MEDIUM - total_flowers -= 2.0 - elif total_flowers >= 1.0: - garden_control.flowers_sizes[flower_ind] = Garden.FlowerSizes.SMALL - total_flowers -= 1.0 - flower_ind += 1 garden_control.update_flowers() - - # Handles the path - var curve: Curve2D = Curve2D.new() - var max_lesson: int = UserDataManager.student_progression.get_max_unlocked_lesson_index() - if not new_lesson_unlocked: - max_lesson += 1 - - for index: int in range(max_lesson): - curve.add_point(points[index][0] as Vector2, points[index][1] as Vector2, points[index][2] as Vector2) - unlocked_line.points = curve.get_baked_points() - - line_particles.global_position = unlocked_line.points[unlocked_line.points.size()-1] - #endregion - + #region Scroll # Scrolls to the right garden @@ -253,35 +212,24 @@ func _ready() -> void: #region Flowers animation # Play the flowers animation if needed - if is_current_lesson and is_first_clear: + if is_current_lesson and is_first_clear and is_minigame_completed and transition_data.has("current_lesson_number"): # Wait a bit before any action to smooth the animations await get_tree().create_timer(1).timeout + var lesson_number: int = transition_data.current_lesson_number as int + var flower_info: Dictionary = lesson_to_flower_index.get(lesson_number, {}) + if flower_info and flower_info.has("garden") and flower_info.has("index"): + var target_garden: Garden = flower_info.garden + var target_index: int = flower_info.index + var new_completed_count: int = _count_completed_minigames(lesson_number) + var target_size: Garden.FlowerSizes = _get_flower_size_for_completion(new_completed_count) + var current_size: Garden.FlowerSizes = target_garden.flowers_sizes[target_index] + target_garden.flowers_visible[target_index] = true + + if target_size != current_size: - # Calculate the progression of the garden - current_garden.current_progression += 1 - - var unlocks_ratio: float = current_garden.current_progression / current_garden.max_progression - var total_flowers: float = unlocks_ratio * current_garden.flower_controls.size() * 3.0 - var flower_ind: int = 0 - while total_flowers > 0 and flower_ind < current_garden.flower_controls.size(): - var play_animation: bool = false - if total_flowers >= 3.0 and current_garden.flowers_sizes[flower_ind] != Garden.FlowerSizes.LARGE: - current_garden.flowers_sizes[flower_ind] = Garden.FlowerSizes.LARGE - total_flowers -= 3.0 - play_animation = true - elif total_flowers >= 2.0 and current_garden.flowers_sizes[flower_ind] != Garden.FlowerSizes.MEDIUM: - current_garden.flowers_sizes[flower_ind] = Garden.FlowerSizes.MEDIUM - total_flowers -= 2.0 - play_animation = true - elif total_flowers >= 1.0 and current_garden.flowers_sizes[flower_ind] != Garden.FlowerSizes.SMALL: - current_garden.flowers_sizes[flower_ind] = Garden.FlowerSizes.SMALL - total_flowers -= 1.0 - play_animation = true - - if play_animation: var flower_vfx: FlowerVFX = FLOWER_VFX.instantiate() - current_garden.flower_controls[flower_ind].add_child(flower_vfx) + target_garden.flower_controls[target_index].add_child(flower_vfx) flower_vfx.anchor_bottom = 0.5 flower_vfx.anchor_top = 0.5 flower_vfx.anchor_left = 0.5 @@ -289,10 +237,8 @@ func _ready() -> void: flower_vfx.play() await get_tree().create_timer(0.5).timeout - current_garden.update_flowers() - - flower_ind += 1 - + target_garden.flowers_sizes[target_index] = target_size + target_garden.update_flowers() #endregion # Wait a bit before any action to smooth the animations @@ -304,7 +250,7 @@ func _ready() -> void: #region New lesson unlocked if new_lesson_unlocked: - + var max_lesson: int = UserDataManager.student_progression.get_max_unlocked_lesson_index() # Close the layout await get_tree().create_timer(2).timeout await _close_minigames_layout() @@ -593,6 +539,27 @@ func _fill_minigame_choice(layout: MinigameLayout, exercise_type: int, status: S layout.pressed.connect(_on_minigame_button_pressed.bind(minigames_scenes[exercise_type-1], minigame_number)) +func _count_completed_minigames(lesson_ind: int) -> int: + if not UserDataManager.student_progression or not UserDataManager.student_progression.unlocks.has(lesson_ind): + return 0 + var completed: int = 0 + for game_status: int in UserDataManager.student_progression.unlocks[lesson_ind]["games"]: + if game_status == StudentProgression.Status.Completed: + completed += 1 + return completed + +func _get_flower_size_for_completion(completed_minigames: int) -> Garden.FlowerSizes: + match completed_minigames: + 1: + return Garden.FlowerSizes.SMALL + 2: + return Garden.FlowerSizes.MEDIUM + 3: + return Garden.FlowerSizes.LARGE + _: + return Garden.FlowerSizes.NOT_STARTED + + func _close_minigames_layout() -> void: if not in_minigame_selection: return