summaryrefslogtreecommitdiff
path: root/addons/escoria-core/game/core-scripts/save_data
diff options
context:
space:
mode:
Diffstat (limited to 'addons/escoria-core/game/core-scripts/save_data')
-rw-r--r--addons/escoria-core/game/core-scripts/save_data/esc_save_manager.gd79
-rw-r--r--addons/escoria-core/game/core-scripts/save_data/esc_savegame.gd2
-rw-r--r--addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd2
-rw-r--r--addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd5
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)