diff options
Diffstat (limited to 'addons/escoria-core/game/core-scripts/save_data')
4 files changed, 75 insertions, 13 deletions
diff --git a/addons/escoria-core/game/core-scripts/save_data/esc_save_manager.gd b/addons/escoria-core/game/core-scripts/save_data/esc_save_manager.gd index ec78fe4..9b4ba24 100644 --- a/addons/escoria-core/game/core-scripts/save_data/esc_save_manager.gd +++ b/addons/escoria-core/game/core-scripts/save_data/esc_save_manager.gd @@ -48,15 +48,18 @@ var _add_inventory: InventoryAddCommand var _transition: TransitionCommand var _hide_menu: HideMenuCommand var _camera_set_target: CameraSetTargetCommand +var _camera_set_limits: CameraSetLimitsCommand var _change_scene: ChangeSceneCommand var _enable_terrain: EnableTerrainCommand var _set_active: SetActiveCommand var _set_active_if_exists: SetActiveIfExistsCommand +var _set_animations: SetAnimationsCommand var _set_interactive: SetInteractiveCommand var _set_item_custom_data: SetItemCustomDataCommand var _teleport_pos: TeleportPosCommand var _set_direction: SetDirectionCommand var _set_global: SetGlobalCommand +var _set_speed: SetSpeedCommand var _set_state: SetStateCommand var _stop_snd: StopSndCommand var _play_snd: PlaySndCommand @@ -81,6 +84,7 @@ func _init(): _transition = TransitionCommand.new() _hide_menu = HideMenuCommand.new() _camera_set_target = CameraSetTargetCommand.new() + _camera_set_limits = CameraSetLimitsCommand.new() _change_scene = ChangeSceneCommand.new() _enable_terrain = EnableTerrainCommand.new() _set_active = SetActiveCommand.new() @@ -88,8 +92,10 @@ func _init(): _set_interactive = SetInteractiveCommand.new() _set_item_custom_data = SetItemCustomDataCommand.new() _teleport_pos = TeleportPosCommand.new() + _set_animations = SetAnimationsCommand.new() _set_direction = SetDirectionCommand.new() _set_global = SetGlobalCommand.new() + _set_speed = SetSpeedCommand.new() _set_state = SetStateCommand.new() _stop_snd = StopSndCommand.new() _play_snd = PlaySndCommand.new() @@ -297,6 +303,9 @@ func load_game(id: int): ) return + # Stop all musics and sounds + escoria.main.stop_all_sounds() + # Disconnect all trigger areas in the current room so that they don't # trigger after room is loaded (eg: when player was in a trigger area, # trigger_out won't fire after loading the game) @@ -318,14 +327,12 @@ func load_game(id: int): "Loading savegame %s" % str(id) ) is_loading_game = true - escoria.current_state = escoria.GAME_STATE.LOADING + escoria.current_state = escoria.GameState.LOADING var save_game: ESCSaveGame = ResourceLoader.load(save_file_path) escoria.settings_manager.load_settings_from_dict(save_game.settings) - escoria.settings_manager.load_settings_from_dict(save_game.settings) - var plugin_config = ConfigFile.new() plugin_config.load("res://addons/escoria-core/plugin.cfg") var escoria_version = plugin_config.get_value("plugin", "version") @@ -385,11 +392,22 @@ func load_game(id: int): # Set save manager "is_loading_game" var to false since we're now done # Hide main and pause menus - escoria.game_scene.hide_main_menu() + escoria.game_scene.hide_main_menu() # THIS SETS escoria.current_state = DEFAULT !! escoria.game_scene.unpause_game() + escoria.current_state = escoria.GameState.LOADING + escoria.room_manager.change_scene_to_file(save_game.main.current_scene_filename, false) + # Pop sound and music data from the savegame + var sound_music_saved_data: Dictionary = {} + for object_id in save_game.objects: + if object_id in ESCObjectManager.RESERVED_OBJECTS: + sound_music_saved_data[object_id] = save_game.objects[object_id] + for object_id in sound_music_saved_data: + save_game.objects.erase(object_id) + + # Load the object _load_savegame_objects(save_game.objects) escoria.globals_manager.clear() @@ -397,7 +415,10 @@ func load_game(id: int): _load_savegame_inventory(save_game.inventory) _load_savegame_terrain_navpolys(save_game.terrain_navpolys) _load_savegame_events(save_game.events) - _transition.run(["", "in", 1.0]) + await _transition.run(["", "in", 1.0]) + + # Music and sound resume + _load_savegame_objects(sound_music_saved_data) escoria.set_game_paused(false) @@ -405,7 +426,7 @@ func load_game(id: int): escoria.action_manager.clear_current_tool() escoria.inputs_manager.input_mode = escoria.inputs_manager.INPUT_ALL is_loading_game = false - escoria.current_state = escoria.GAME_STATE.DEFAULT + escoria.current_state = escoria.GameState.DEFAULT emit_signal("game_finished_loading") @@ -425,12 +446,19 @@ func load_game(id: int): func _load_savegame_objects(savegame_objects: Dictionary): for object_id in savegame_objects: var saved_object_data = savegame_objects[object_id] - if object_id in ESCObjectManager.RESERVED_OBJECTS: # Sound players only atm + if object_id in ESCObjectManager.RESERVED_OBJECTS: + # Sound players only atm + # Sounds and music to be resumed after transition if saved_object_data.has("state") \ and saved_object_data["state"] in ["off", "default"]: _stop_snd.run([object_id]) else: - _play_snd.run([saved_object_data["state"], object_id, saved_object_data["playback_position"]]) + var playback_position: float = 0.0 + if ESCProjectSettingsManager.get_setting( + ESCProjectSettingsManager.SAVE_SOUNDS_PLAYBACK_POSITION + ) and saved_object_data.has("playback_position"): + playback_position = saved_object_data["playback_position"] + _play_snd.run([saved_object_data["state"], object_id, playback_position]) else: if object_id == escoria.main.current_scene.global_id: _load_room_objects(object_id, saved_object_data) @@ -450,8 +478,15 @@ func _load_savegame_objects(savegame_objects: Dictionary): func _load_room_objects(room_id: String, objects_dictionary: Dictionary): escoria.logger.info(self, "Loading room '%s'" % room_id) + var camera_loaded_data = null + if objects_dictionary.has(escoria.object_manager.CAMERA): + camera_loaded_data = objects_dictionary[escoria.object_manager.CAMERA] + objects_dictionary.erase(escoria.object_manager.CAMERA) for object_id in objects_dictionary: _load_object(object_id, objects_dictionary[object_id], room_id) + # Then load camera + if camera_loaded_data != null: + _load_object(escoria.object_manager.CAMERA, camera_loaded_data, room_id) escoria.logger.info(self, "Finished loading room '%s'" % room_id) @@ -468,10 +503,17 @@ func _load_room_objects(room_id: String, objects_dictionary: Dictionary): ## #### Returns[br] ## [br] ## Returns nothing. -func _load_object(object_id: String, object_dictionary: Dictionary, room_id: String): +func _load_object(object_id: String, object_dictionary: Dictionary, _room_id: String): escoria.logger.info(self, "Loading object '%s'" % object_id) if object_id == ESCObjectManager.CAMERA: + if object_dictionary.has("limit_id"): + escoria.main.restore_camera_limit_for_room_global_id( + _room_id, + object_dictionary["limit_id"] + ) + else: + escoria.main.clear_camera_limit_id_for_room_global_id(_room_id) _camera_set_target.run([0, object_dictionary["target"]]) else: # Active @@ -482,6 +524,17 @@ func _load_object(object_id: String, object_dictionary: Dictionary, room_id: Str if object_dictionary.has("interactive") and _set_interactive.validate([object_id, object_dictionary["interactive"]]): _set_interactive.run([object_id, object_dictionary["interactive"]]) + # Animations + if object_dictionary.has("animations_resource_path") and _set_animations.validate([object_id, object_dictionary["animations_resource_path"]]): + _set_animations.run([object_id, object_dictionary["animations_resource_path"]]) + if object_dictionary.has("current_animation")\ + and _set_state.validate([ + object_id, + object_dictionary["current_animation"], + true + ]): + _set_state.run([object_id, object_dictionary["current_animation"], true]) + # State if object_dictionary.has("state") and _set_state.validate([object_id, object_dictionary["state"], true]): _set_state.run([object_id, object_dictionary["state"], true]) @@ -494,6 +547,10 @@ func _load_object(object_id: String, object_dictionary: Dictionary, room_id: Str object_dictionary["global_transform"].origin.y ]) + # Speed + if object_dictionary.has("speed"): + _set_speed.run([object_id, object_dictionary["speed"]]) + # Orientation if object_dictionary.has("last_dir"): _set_direction.run([object_id, int(object_dictionary["last_dir"]), 0.0]) @@ -590,7 +647,7 @@ func _load_savegame_events(savegame_events: Dictionary): sched_event.object ) escoria.event_manager.schedule_event( - script.events[sched_event.event_name], + script.get_event_with_target(sched_event.event_name), sched_event.timeout, sched_event.object ) @@ -609,7 +666,7 @@ func _load_savegame_events(savegame_events: Dictionary): ## #### Returns[br] ## [br] ## Returns nothing. -func _ensure_directory_exists(dir: String) -> void: +func _ensure_directory_exists(_dir: String) -> void: if not DirAccess.dir_exists_absolute(save_folder): var return_code = DirAccess.make_dir_absolute(save_folder) diff --git a/addons/escoria-core/game/core-scripts/save_data/esc_savegame.gd b/addons/escoria-core/game/core-scripts/save_data/esc_savegame.gd index b49ea0e..e8cd39d 100644 --- a/addons/escoria-core/game/core-scripts/save_data/esc_savegame.gd +++ b/addons/escoria-core/game/core-scripts/save_data/esc_savegame.gd @@ -1,6 +1,6 @@ ## Resource used for holding savegames data. -extends Resource class_name ESCSaveGame +extends Resource ## Access key for the main data last_scene_global_id. const MAIN_LAST_SCENE_GLOBAL_ID_KEY = "last_scene_global_id" diff --git a/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd b/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd index ccc3d1e..d899601 100644 --- a/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd +++ b/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd @@ -1,8 +1,8 @@ ## Resource holding game settings. Note that we call directly to ProjectSettings ## for instance variable initialization since this class is instantiated from ## escoria.gd. -extends Resource class_name ESCSaveSettings +extends Resource ## Version of ESCORIA Framework. @export var escoria_version: String diff --git a/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd b/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd index 18d4247..71eca78 100644 --- a/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd +++ b/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd @@ -293,3 +293,8 @@ func save_settings(): self, "There was an issue writing settings %s" % save_path ) + + +## Returns a custom setting by key or an optional default value. Returns null if not found and no default value is defined. +func get_custom_setting(key: String, default_value = null): + return custom_settings.get(key, default_value) |
