Trying to make the gardens layout cached

This commit is contained in:
Adrien Ufferte
2025-12-18 10:25:54 +01:00
parent 50d998e6e8
commit 6c30555509
3 changed files with 62 additions and 8 deletions
+41 -2
View File
@@ -20,6 +20,9 @@ const MAX_POSITION_SEARCH_RADIUS: int = 300
static var lesson_button_half_size: Vector2 = Vector2.ZERO
static var garden_alpha_cache: Dictionary = {}
static var transition_data: Dictionary = {}
static var cached_gardens_layout: GardensLayout
static var cached_layout_session_id: int = -1
static var cached_layout_lessons: int = 0
@export_category("Layout")
@export var gardens_layout: GardensLayout:
@@ -332,7 +335,7 @@ func _play_new_lesson_unlock_sequence() -> void:
func _ready() -> void:
_load_lessons_from_database()
gardens_layout = generate_gardens_layout(lessons.size())
gardens_layout = get_session_layout(lessons.size())
set_gardens_layout(gardens_layout)
_set_up_lessons()
@@ -523,6 +526,42 @@ static func compute_lessons_distribution(total_lessons: int, garden_layouts: Arr
return distribution
static func get_lessons_distribution(total_lessons: int, garden_layouts: Array[GardenLayout]) -> Array[int]:
var distribution: Array[int] = []
var lessons_from_layout: int = 0
var has_cached_distribution: bool = true
for layout: GardenLayout in garden_layouts:
if layout.lesson_buttons.is_empty():
has_cached_distribution = false
break
distribution.append(layout.lesson_buttons.size())
lessons_from_layout += layout.lesson_buttons.size()
if has_cached_distribution and lessons_from_layout == total_lessons:
Log.trace("Gardens: Using lesson distribution from provided layout")
return distribution
if has_cached_distribution:
Log.warn("Gardens: Layout lesson count mismatch (layout lessons: %s, expected: %s), recomputing distribution" % [str(lessons_from_layout), str(total_lessons)])
return compute_lessons_distribution(total_lessons, garden_layouts)
static func get_session_layout(total_lessons: int) -> GardensLayout:
var session_id: int = UserDataManager.get_student_session_id()
var has_cached_layout: bool = cached_gardens_layout != null
var session_changed: bool = cached_layout_session_id != session_id
var lessons_changed: bool = cached_layout_lessons != total_lessons
if session_changed or lessons_changed:
if has_cached_layout:
Log.info("Gardens: Session or lesson count changed, regenerating gardens layout")
cached_gardens_layout = null
if not cached_gardens_layout:
cached_gardens_layout = generate_gardens_layout(total_lessons)
cached_layout_session_id = session_id
cached_layout_lessons = total_lessons
else:
Log.trace("Gardens: Reusing cached layout for session %s" % str(session_id))
return cached_gardens_layout
static func generate_gardens_layout(total_lessons: int) -> GardensLayout:
var layout: GardensLayout = GardensLayout.new()
if total_lessons <= 0:
@@ -809,7 +848,7 @@ func add_gardens() -> void:
for child: Node in garden_parent.get_children():
child.free()
Log.info("Gardens: Computing lesson distribution for new gardens")
var distribution: Array[int] = compute_lessons_distribution(lessons.size(), gardens_layout.gardens)
var distribution: Array[int] = get_lessons_distribution(lessons.size(), gardens_layout.gardens)
var garden_index: int = 0
for layout_index: int in range(gardens_layout.gardens.size()):
Log.trace("Gardens: Preparing garden %s with layout index %s" % [str(garden_index), str(layout_index)])
+2 -6
View File
@@ -62,19 +62,15 @@ const KALULU: GDScript = 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()
if not gardens_layout or gardens_layout.gardens.is_empty():
gardens_layout = Gardens.generate_gardens_layout(Database.get_lessons_count())
gardens_layout = Gardens.get_session_layout(Database.get_lessons_count())
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)
var distribution: Array[int] = Gardens.get_lessons_distribution(Database.get_lessons_count(), gardens_layout.gardens)
for index: int in range(gardens_layout.gardens.size()):
var can_emit: bool = true
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:
@@ -22,6 +22,7 @@ var student: String = "":
_student_remediation = null
_student_confusion_matrix = null
_student_speeches = null
var student_session_id: int = 0
var _device_settings: DeviceSettings
var teacher_settings: TeacherSettings
var student_progression: StudentProgression
@@ -274,6 +275,7 @@ func login_student(code: String) -> bool:
for stud: StudentData in students:
if int(stud.code) == int(code):
student = code
_start_student_session()
(ServerManager as ServerManagerClass).first_login_student()
Log.info("UserDataManager: Student %s logged in" % code)
return true
@@ -290,10 +292,27 @@ func logout_student() -> bool:
Log.warn("UserDataManager: LogoutStudent: Function failed because of invalid teacher_settings")
return false
_start_student_session(true)
student = ""
Log.info("UserDataManager: Student logged out")
return true
func get_student_session_id() -> int:
return student_session_id
func _start_student_session(reset_only: bool = false) -> void:
if reset_only:
student_session_id = 0
return
var rng: RandomNumberGenerator = RandomNumberGenerator.new()
rng.randomize()
student_session_id = rng.randi()
while student_session_id == 0:
student_session_id = rng.randi()
Log.trace("UserDataManager: New student session id %s" % str(student_session_id))
#endregion
#region Device settings