Added a method to interrupt a running event in ESCEventManager. (#375)

Co-authored-by: StraToN <StraToN@users.noreply.github.com>
This commit is contained in:
Julian Murgia
2021-08-27 08:16:12 +02:00
committed by GitHub
parent 1f28fdc8f3
commit 711cfe9888
10 changed files with 238 additions and 29 deletions

View File

@@ -6,6 +6,9 @@ class_name ESCEventManager
# Emitted when the event did finish running
signal event_finished(event_name, return_code)
# Emitted when the event was interrupted
signal event_interrupted(event_name, return_code)
# A queue of events to run
var events_queue: Array = []
@@ -13,6 +16,9 @@ var events_queue: Array = []
# A list of currently scheduled events
var scheduled_events: Array = []
# Currently running event
var _running_event: ESCEvent
func _ready():
self.pause_mode = Node.PAUSE_MODE_STOP
@@ -21,17 +27,27 @@ func _ready():
# Handle the events queue and scheduled events
func _process(delta: float) -> void:
if events_queue.size() > 0:
var running_event = events_queue.pop_front()
if not running_event.is_connected(
_running_event = events_queue.pop_front()
if not _running_event.is_connected(
"finished", self, "_on_event_finished"
):
running_event.connect(
_running_event.connect(
"finished",
self,
"_on_event_finished",
[running_event]
[_running_event]
)
running_event.run()
if not _running_event.is_connected(
"interrupted", self, "_on_event_finished"
):
_running_event.connect(
"interrupted",
self,
"_on_event_finished",
[_running_event]
)
_running_event.run()
for event in self.scheduled_events:
(event as ESCScheduledEvent).timeout -= delta
if (event as ESCScheduledEvent).timeout <= 0:
@@ -55,9 +71,18 @@ func _on_event_finished(return_code: int, event: ESCEvent) -> void:
"Event %s ended with return code %d" % [event.name, return_code]
)
event.disconnect("finished", self, "_on_event_finished")
event.disconnect("interrupted", self, "_on_event_finished")
_running_event = null
match(return_code):
ESCExecution.RC_CANCEL:
self.scheduled_events = []
self.events_queue = []
return_code = ESCExecution.RC_OK
emit_signal("event_finished", return_code, event.name)
# Interrupt the event currently running.
func interrupt_running_event():
if _running_event == null:
return
_running_event.interrupt()

View File

@@ -6,10 +6,15 @@ class_name ESCStatement
# Emitted when the event did finish running
signal finished(return_code)
# Emitted when the event was interrupted
signal interrupted(return_code)
# The list of ESC commands
var statements: Array = []
# Indicated whether this event was interrupted.
var _is_interrupted: bool = false
# Check wether the statement should be run based on its conditions
func is_valid() -> bool:
@@ -23,6 +28,11 @@ func is_valid() -> bool:
func run() -> int:
var final_rc = ESCExecution.RC_OK
for statement in statements:
if _is_interrupted:
final_rc = ESCExecution.RC_CANCEL
emit_signal("interrupted", final_rc)
return final_rc
if statement.is_valid():
var rc = statement.run()
if rc is GDScriptFunctionState:
@@ -35,3 +45,11 @@ func run() -> int:
emit_signal("finished", final_rc)
return final_rc
# Interrupt the statement in the middle of its execution.
func interrupt():
escoria.logger.info("Interrupting event %s" % str(self))
_is_interrupted = true
for statement in statements:
statement.interrupt()

View File

@@ -52,7 +52,11 @@ func _draw():
#
# - position: Position clicked
func left_click_on_bg(position: Vector2) -> void:
escoria.do("walk", [escoria.main.current_scene.player.global_id, position])
escoria.do(
"walk",
[escoria.main.current_scene.player.global_id, position],
true
)
# Called when the player right clicks on the background
@@ -62,7 +66,11 @@ func left_click_on_bg(position: Vector2) -> void:
#
# - position: Position clicked
func right_click_on_bg(position: Vector2) -> void:
escoria.do("walk", [escoria.main.current_scene.player.global_id, position])
escoria.do(
"walk",
[escoria.main.current_scene.player.global_id, position],
true
)
# Called when the player double clicks on the background
@@ -72,8 +80,11 @@ func right_click_on_bg(position: Vector2) -> void:
#
# - position: Position clicked
func left_double_click_on_bg(position: Vector2) -> void:
escoria.do("walk", [escoria.main.current_scene.player.global_id, position, \
true])
escoria.do(
"walk",
[escoria.main.current_scene.player.global_id, position, true],
true
)
# Called when an element in the scene was focused
# (Needs to be overridden, if supported)
@@ -99,7 +110,11 @@ func element_unfocused() -> void:
# - item_global_id: Global id of the item that was clicked
# - event: The received input event
func left_click_on_item(item_global_id: String, event: InputEvent) -> void:
escoria.do("item_left_click", [item_global_id, event])
escoria.do(
"item_left_click",
[item_global_id, event],
true
)
# Called when an item was right clicked
@@ -110,7 +125,11 @@ func left_click_on_item(item_global_id: String, event: InputEvent) -> void:
# - item_global_id: Global id of the item that was clicked
# - event: The received input event
func right_click_on_item(item_global_id: String, event: InputEvent) -> void:
escoria.do("item_right_click", [item_global_id, event])
escoria.do(
"item_right_click",
[item_global_id, event],
true
)
# Called when an item was double clicked
@@ -124,7 +143,11 @@ func left_double_click_on_item(
item_global_id: String,
event: InputEvent
) -> void:
escoria.do("item_left_click", [item_global_id, event])
escoria.do(
"item_left_click",
[item_global_id, event],
true
)
# Called when an inventory item was left clicked