fix: iterating on method outlined in ticket; blocks events/commands from being queued during scene changes, which should prevent stray/untimely events from being queued for an old room when in a new room
This commit is contained in:
committed by
Julian Murgia
parent
64ac7654f4
commit
acfb3d9ddd
@@ -82,7 +82,7 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
|||||||
match action:
|
match action:
|
||||||
ACTION.BACKGROUND_CLICK:
|
ACTION.BACKGROUND_CLICK:
|
||||||
if can_interrupt:
|
if can_interrupt:
|
||||||
escoria.event_manager.interrupt_running_event()
|
escoria.event_manager.interrupt()
|
||||||
|
|
||||||
var walk_fast = false
|
var walk_fast = false
|
||||||
if params.size() > 2:
|
if params.size() > 2:
|
||||||
@@ -127,7 +127,7 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
|||||||
)
|
)
|
||||||
|
|
||||||
if can_interrupt:
|
if can_interrupt:
|
||||||
escoria.event_manager.interrupt_running_event()
|
escoria.event_manager.interrupt()
|
||||||
|
|
||||||
var item = escoria.object_manager.get_object(params[0])
|
var item = escoria.object_manager.get_object(params[0])
|
||||||
self.perform_inputevent_on_object(item, params[1])
|
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:
|
if can_interrupt:
|
||||||
escoria.event_manager.interrupt_running_event()
|
escoria.event_manager.interrupt()
|
||||||
|
|
||||||
var item = escoria.object_manager.get_object(params[0])
|
var item = escoria.object_manager.get_object(params[0])
|
||||||
self.perform_inputevent_on_object(item, params[1], true)
|
self.perform_inputevent_on_object(item, params[1], true)
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ func _process(delta: float) -> void:
|
|||||||
for channel_name in events_queue.keys():
|
for channel_name in events_queue.keys():
|
||||||
channel_yielding = _yielding.get(channel_name, false)
|
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
|
continue
|
||||||
if is_channel_free(channel_name):
|
if is_channel_free(channel_name):
|
||||||
_channels_state[channel_name] = false
|
_channels_state[channel_name] = false
|
||||||
@@ -230,6 +230,7 @@ func queue_event(event: ESCEvent, force: bool = false) -> void:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
escoria.logger.debug("Queueing %s in channel %s." % [event.name, CHANNEL_FRONT])
|
||||||
self.events_queue[CHANNEL_FRONT].append(event)
|
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)
|
events_queue[channel_name].append(event)
|
||||||
|
|
||||||
|
|
||||||
# Interrupt the events currently running.
|
# Interrupt the events currently running and any that are pending.
|
||||||
#
|
#
|
||||||
# #### Parameters
|
# #### Parameters
|
||||||
# - exceptions: an optional list of events which should be left running
|
# - exceptions: an optional list of events which should be left running or queued
|
||||||
func interrupt_running_event(exceptions: PoolStringArray = []):
|
func interrupt(exceptions: PoolStringArray = []) -> void:
|
||||||
for channel_name in _running_events.keys():
|
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()
|
_running_events[channel_name].interrupt()
|
||||||
_channels_state[channel_name] = true
|
_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.
|
# Clears the event queues.
|
||||||
func clear_event_queue():
|
func clear_event_queue():
|
||||||
@@ -316,13 +331,14 @@ func get_running_event(name: String) -> ESCEvent:
|
|||||||
# #### Parameterse
|
# #### Parameterse
|
||||||
# - value: boolean value to set _changing_scene to
|
# - value: boolean value to set _changing_scene to
|
||||||
func set_changing_scene(value: bool) -> void:
|
func set_changing_scene(value: bool) -> void:
|
||||||
|
escoria.logger.trace("Setting _changing_scene to %s." % value)
|
||||||
|
|
||||||
_changing_scene = value
|
_changing_scene = value
|
||||||
|
|
||||||
# If we're changing scenes, interrupt any (other) running events and purge
|
# If we're changing scenes, interrupt any (other) running events and purge
|
||||||
# all event queues.
|
# all event queues.
|
||||||
if value:
|
if value:
|
||||||
clear_event_queue()
|
interrupt([EVENT_INIT, EVENT_EXIT_SCENE, _change_scene.get_command_name()])
|
||||||
interrupt_running_event([_change_scene.get_command_name()])
|
|
||||||
|
|
||||||
|
|
||||||
# The event finished running
|
# The event finished running
|
||||||
|
|||||||
@@ -309,6 +309,10 @@ func _perform_script_events(room: ESCRoom) -> void:
|
|||||||
|
|
||||||
yielded = true
|
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:
|
if room.player:
|
||||||
escoria.object_manager.get_object(escoria.object_manager.CAMERA).node.set_target(room.player)
|
escoria.object_manager.get_object(escoria.object_manager.CAMERA).node.set_target(room.player)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user