diff --git a/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd index d93dd9b5..704fda2d 100644 --- a/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd +++ b/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd @@ -82,7 +82,7 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void: match action: ACTION.BACKGROUND_CLICK: if can_interrupt: - escoria.event_manager.interrupt_running_event() + escoria.event_manager.interrupt() var walk_fast = false if params.size() > 2: @@ -127,7 +127,7 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void: ) if can_interrupt: - escoria.event_manager.interrupt_running_event() + escoria.event_manager.interrupt() var item = escoria.object_manager.get_object(params[0]) self.perform_inputevent_on_object(item, params[1]) @@ -140,7 +140,7 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void: ) if can_interrupt: - escoria.event_manager.interrupt_running_event() + escoria.event_manager.interrupt() var item = escoria.object_manager.get_object(params[0]) self.perform_inputevent_on_object(item, params[1], true) diff --git a/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd index b8ce6769..d0f3e95a 100644 --- a/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd +++ b/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd @@ -78,7 +78,7 @@ func _process(delta: float) -> void: for channel_name in events_queue.keys(): channel_yielding = _yielding.get(channel_name, false) - if events_queue[channel_name].size() == 0 or channel_yielding or _changing_scene: + if events_queue[channel_name].size() == 0 or channel_yielding: continue if is_channel_free(channel_name): _channels_state[channel_name] = false @@ -230,6 +230,7 @@ func queue_event(event: ESCEvent, force: bool = false) -> void: return + escoria.logger.debug("Queueing %s in channel %s." % [event.name, CHANNEL_FRONT]) self.events_queue[CHANNEL_FRONT].append(event) @@ -276,16 +277,30 @@ func queue_background_event(channel_name: String, event: ESCEvent) -> void: events_queue[channel_name].append(event) -# Interrupt the events currently running. +# Interrupt the events currently running and any that are pending. # # #### Parameters -# - exceptions: an optional list of events which should be left running -func interrupt_running_event(exceptions: PoolStringArray = []): +# - exceptions: an optional list of events which should be left running or queued +func interrupt(exceptions: PoolStringArray = []) -> void: for channel_name in _running_events.keys(): - if _running_events[channel_name] != null and not channel_name in exceptions: + if _running_events[channel_name] != null and not _running_events[channel_name].name in exceptions: + escoria.logger.debug("Interrupting running event %s in channel %s..." + % [_running_events[channel_name].name, channel_name]) _running_events[channel_name].interrupt() _channels_state[channel_name] = true + for channel_name in events_queue.keys(): + if events_queue[channel_name] != null: + for event in events_queue[channel_name]: + if event.name in exceptions: + continue + + escoria.logger.debug("Interrupting queued event %s in channel %s..." + % [event.name, channel_name]) + event.interrupt() + + events_queue[channel_name].clear() + # Clears the event queues. func clear_event_queue(): @@ -316,13 +331,14 @@ func get_running_event(name: String) -> ESCEvent: # #### Parameterse # - value: boolean value to set _changing_scene to func set_changing_scene(value: bool) -> void: + escoria.logger.trace("Setting _changing_scene to %s." % value) + _changing_scene = value # If we're changing scenes, interrupt any (other) running events and purge # all event queues. if value: - clear_event_queue() - interrupt_running_event([_change_scene.get_command_name()]) + interrupt([EVENT_INIT, EVENT_EXIT_SCENE, _change_scene.get_command_name()]) # The event finished running 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 f2f4f437..dd0abbec 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 @@ -309,6 +309,10 @@ func _perform_script_events(room: ESCRoom) -> void: yielded = true + # As far as the event manager is concerned, we're done changing scenes and + # so should resume allowing events to be queued and processed. + escoria.event_manager.set_changing_scene(false) + if room.player: escoria.object_manager.get_object(escoria.object_manager.CAMERA).node.set_target(room.player)