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:
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user