From 84c84d3a0fdf1e8472bdbce873a13e1dceb68520 Mon Sep 17 00:00:00 2001 From: Duncan Brown Date: Mon, 21 Mar 2022 22:30:16 -0400 Subject: [PATCH] fix: makes the loading process more consistent by using all ESC commands; also fixes issue caused by loaded save games not executing :setup or :ready, thereby preventing proper room switching in this case --- .../game/core-scripts/esc/esc_room_manager.gd | 38 ++++++++++++------- .../save_data/esc_save_manager.gd | 20 ++++++---- .../game/scenes/inventory/inventory_ui.gd | 2 + 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/addons/escoria-core/game/core-scripts/esc/esc_room_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_room_manager.gd index bbb28ecc..3cae60b1 100644 --- a/addons/escoria-core/game/core-scripts/esc/esc_room_manager.gd +++ b/addons/escoria-core/game/core-scripts/esc/esc_room_manager.gd @@ -270,14 +270,16 @@ func init_room(room: ESCRoom) -> void: # # - room: The ESCRoom to be initialized for use. func _perform_script_events(room: ESCRoom): - if escoria.event_manager.is_channel_free(escoria.event_manager.CHANNEL_FRONT) \ - or ( - not escoria.event_manager.is_channel_free(escoria.event_manager.CHANNEL_FRONT) \ - and not escoria.event_manager.get_running_event( + # If we're loading from a saved game, we don't want to run :setup or :ready + # as it could potentially alter the loaded save state; however, we still need + # to swap the scene in since it would ordinarily happen between :setup and + # :ready. Fun, huh? + if not escoria.event_manager.is_channel_free(escoria.event_manager.CHANNEL_FRONT) \ + and escoria.event_manager.get_running_event( escoria.event_manager.CHANNEL_FRONT - ).name == escoria.event_manager.EVENT_LOAD - ): - + ).name == escoria.event_manager.EVENT_LOAD: + _make_new_room_visible(room) + else: # If the room was loaded from change_scene and automatic transitions # are not disabled, do the transition out now if room.enabled_automatic_transitions \ @@ -326,13 +328,7 @@ func _perform_script_events(room: ESCRoom): # Switch the rooms (resources are freed at end of change_scene and in # clear_scene). - - if room != escoria.main.current_scene: - escoria.main.current_scene.visible = false - #escoria.main.current_scene.z_index = -100 - - room.visible = true - #room.z_index = 0 + _make_new_room_visible(room) if room.enabled_automatic_transitions \ or ( @@ -393,6 +389,20 @@ func _perform_script_events(room: ESCRoom): ) +# Switches the visibility of the "old" room and the "new" room. +# +# #### Parameters +# +# - room: The ESCRoom to be made visible in place of the current one. +func _make_new_room_visible(room: ESCRoom) -> void: + if is_instance_valid(escoria.main.current_scene) and room != escoria.main.current_scene: + escoria.main.current_scene.visible = false + #escoria.main.current_scene.z_index = -100 + + room.visible = true + #room.z_index = 0 + + # Runs the script event from the script attached, if any. # # #### Parameters 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 e4f680f1..ccf4d522 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 @@ -32,6 +32,7 @@ var _set_active: SetActiveCommand var _set_interactive: SetInteractiveCommand var _teleport_pos: TeleportPosCommand var _set_angle: SetAngleCommand +var _set_global: SetGlobalCommand var _set_state: SetStateCommand var _stop_snd: StopSndCommand var _play_snd: PlaySndCommand @@ -51,6 +52,7 @@ func _init(): _set_interactive = SetInteractiveCommand.new() _teleport_pos = TeleportPosCommand.new() _set_angle = SetAngleCommand.new() + _set_global = SetGlobalCommand.new() _set_state = SetStateCommand.new() _stop_snd = StopSndCommand.new() _play_snd = PlaySndCommand.new() @@ -279,14 +281,6 @@ func load_game(id: int): ESCCommand.new("%s pause" % _hide_menu.get_command_name()) ) - ## GLOBALS - for k in save_game.globals.keys(): - escoria.globals_manager.set_global( - k, - save_game.globals[k], - true - ) - ## ROOM load_statements.append( ESCCommand.new("%s %s false" % @@ -297,6 +291,16 @@ func load_game(id: int): ) ) + ## GLOBALS + for k in save_game.globals.keys(): + ESCCommand.new("%s %s %s" % + [ + _set_global.get_command_name(), + k, + save_game.globals[k] + ] + ) + ## OBJECTS for object_global_id in save_game.objects.keys(): if escoria.object_manager.has(object_global_id) and \ diff --git a/addons/escoria-core/game/scenes/inventory/inventory_ui.gd b/addons/escoria-core/game/scenes/inventory/inventory_ui.gd index de243c15..9633c40b 100644 --- a/addons/escoria-core/game/scenes/inventory/inventory_ui.gd +++ b/addons/escoria-core/game/scenes/inventory/inventory_ui.gd @@ -54,6 +54,7 @@ func add_new_item_by_id(item_id: String) -> void: item_id, ResourceLoader.load(inventory_file).instance() ), + null, true ) else: @@ -79,6 +80,7 @@ func add_new_item_by_id(item_id: String) -> void: item_id, inventory_item_button ), + null, true )