Trying to make the gardens layout cached
This commit is contained in:
@@ -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)])
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user