diff --git a/export_presets.cfg b/export_presets.cfg index 072a88f9..920dad68 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -38,7 +38,7 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=58 +version/code=70 version/name="" package/unique_name="org.godotengine.kalulu" package/name="Kalulu" diff --git a/resources/gardens/garden.gd b/resources/gardens/garden.gd index 8eeacd31..44f9b3ee 100644 --- a/resources/gardens/garden.gd +++ b/resources/gardens/garden.gd @@ -42,6 +42,9 @@ func get_button_size() -> Vector2: func set_garden_layout(p_garden_layout: GardenLayout) -> void: + if not p_garden_layout: + Log.error("Garden: Cannot set garden layout because it is null") + return garden_layout = p_garden_layout set_flowers(garden_layout.flowers) set_background(garden_layout.color) diff --git a/resources/user/student_progression.gd b/resources/user/student_progression.gd index 605d258a..4f119eae 100644 --- a/resources/user/student_progression.gd +++ b/resources/user/student_progression.gd @@ -32,6 +32,8 @@ func _init() -> void: func init_unlocks() -> void: if not unlocks: unlocks = {} # Triggers ensure_data_integrity(), that will fill the default values + else: + unlocks = unlocks # Force ensure_data_integrity() _sanitize_boss_progression() # Verify the lessons diff --git a/sources/gardens/gardens.gd b/sources/gardens/gardens.gd index 686b784f..c7eee05e 100644 --- a/sources/gardens/gardens.gd +++ b/sources/gardens/gardens.gd @@ -91,6 +91,14 @@ var scroll_end_base_width: float = 0.0 @onready var help_few_plants_speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path("gardens_screen", "help_few_plants")) @onready var help_many_plants_speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path("gardens_screen", "help_many_plants")) + +func _init() -> void: + Log.trace("Gardens: _init()") + + +func _enter_tree() -> void: + Log.trace("Gardens: _enter_tree()") + #region Data loading and progression func _load_lessons_from_database() -> void: diff --git a/sources/menus/login/login.gd b/sources/menus/login/login.gd index e8efa57f..53cdd49c 100644 --- a/sources/menus/login/login.gd +++ b/sources/menus/login/login.gd @@ -65,7 +65,9 @@ func _on_code_keyboard_password_entered(password: String) -> void: kalulu_button.hide() await kalulu.play_kalulu_speech(right_password_speech) await OpeningCurtain.close() + Log.trace("LoginScreen: Start loading next scene %s" % NEXT_SCENE_PATH) get_tree().change_scene_to_file(NEXT_SCENE_PATH) + Log.trace("LoginScreen: End loading next scene") else: Log.warn("LoginScreen: Unknown student code entered (length=%d)" % password.length()) kalulu_button.hide() @@ -120,5 +122,8 @@ func _on_version_label_gui_input(event: InputEvent) -> void: Log.info("LoginScreen: Developer click threshold reached, opening Developer Settings") dev_click_count = 0 await OpeningCurtain.close() - DeveloperSettings.return_path = get_tree().current_scene.scene_file_path + var current_scene: Node = get_tree().current_scene + if not current_scene: + Log.error("LoginScreen: Developer Settings returning scene will be main menu because current scene is null") + DeveloperSettings.return_path = current_scene.scene_file_path if current_scene else "" get_tree().change_scene_to_file(DEVELOPER_SCENE_PATH) diff --git a/sources/menus/main/main_menu.gd b/sources/menus/main/main_menu.gd index 2fcbcea1..a136fa83 100644 --- a/sources/menus/main/main_menu.gd +++ b/sources/menus/main/main_menu.gd @@ -83,5 +83,8 @@ func _on_version_label_gui_input(event: InputEvent) -> void: if dev_click_count >= DEV_CLICK_THRESHOLD: dev_click_count = 0 await OpeningCurtain.close() - DeveloperSettings.return_path = get_tree().current_scene.scene_file_path + var current_scene: Node = get_tree().current_scene + if not current_scene: + Log.error("MainMenu: Developer Settings returning scene will be main menu because current scene is null") + DeveloperSettings.return_path = current_scene.scene_file_path if current_scene else "" get_tree().change_scene_to_file(DEVELOPER_SCENE_PATH) diff --git a/sources/menus/settings/developer_settings.gd b/sources/menus/settings/developer_settings.gd index 310bd023..7e04af94 100644 --- a/sources/menus/settings/developer_settings.gd +++ b/sources/menus/settings/developer_settings.gd @@ -129,6 +129,8 @@ func _on_filters_changed(checked: bool, index: int) -> void: func _on_back_button_pressed() -> void: await OpeningCurtain.close() + if return_path == "": + return_path = "res://sources/menus/main/main_menu.tscn" get_tree().change_scene_to_file(return_path) diff --git a/sources/utils/autoloads/music_manager.gd b/sources/utils/autoloads/music_manager.gd index 40b74586..033d8ad2 100644 --- a/sources/utils/autoloads/music_manager.gd +++ b/sources/utils/autoloads/music_manager.gd @@ -26,7 +26,16 @@ func _on_music_player_finished() -> void: func play(track: Track) -> void: + if track < 0 or track >= Track.size(): + Log.warn("MusicManager: Cannot play %d because this key is out of Track range" % track) + return Log.trace("MusicManager: Requested play for track \"%s\"" % str(Track.keys()[track])) + if track >= TRACKS.size(): + Log.warn("MusicManager: Cannot play %d because this key is out of TRACKS range" % track) + return + if TRACKS[track] == null: + Log.warn("MusicManager: Cannot play %d because it is null" % track) + return music_player.stream = TRACKS[track] music_player.play() diff --git a/sources/utils/autoloads/user_data_manager.gd b/sources/utils/autoloads/user_data_manager.gd index 5cdb1e8d..ce9b9838 100644 --- a/sources/utils/autoloads/user_data_manager.gd +++ b/sources/utils/autoloads/user_data_manager.gd @@ -269,6 +269,9 @@ func student_exists(code: String) -> bool: if not teacher_settings: Log.trace("UserDataManager: StudentExists: Function failed because of invalid teacher_settings") return false + if not teacher_settings.students.has(_device_settings.device_id): + Log.warn("UserDataManager: StudentExists: Function failed because of device ID %d not in students dictionary" % _device_settings.device_id) + return false var students: Array[StudentData] = teacher_settings.students[_device_settings.device_id] as Array[StudentData] if students: for stud: StudentData in students: @@ -284,6 +287,9 @@ func login_student(code: String) -> bool: if not teacher_settings: Log.warn("UserDataManager: LoginStudent: Function failed because of invalid teacher_settings") return false + if not teacher_settings.students.has(_device_settings.device_id): + Log.warn("UserDataManager: LoginStudent: Function failed because of device ID %d not in students dictionary" % _device_settings.device_id) + return false var students: Array[StudentData] = teacher_settings.students[_device_settings.device_id] as Array[StudentData] if students: