fix: manage clearing of current_action when action is interrupted (#584)

* fix: manage clearing of current_action when action is interrupted
* fix: repairs change_scene, add comments and new RC_INTERRUPTED code
* fix: manage ESC commands interruptions, even if running
This commit is contained in:
Julian Murgia
2022-05-01 12:48:02 +02:00
committed by GitHub
parent c21a7b1a23
commit b8983b8b42
58 changed files with 466 additions and 28 deletions

View File

@@ -59,3 +59,9 @@ func run(command_params: Array) -> int:
escoria.inputs_manager.input_mode = mode
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -52,3 +52,13 @@ func run(command_params: Array) -> int:
else:
animator.play(anim_id)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -58,3 +58,13 @@ func run(command_params: Array) -> int:
while animation_finished != anim_id:
animation_finished = yield(animator, "animation_finished")
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -77,3 +77,13 @@ func run(command_params: Array) -> int:
Tween.new().get("TRANS_%s" % command_params[2])
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -51,3 +51,13 @@ func validate(arguments: Array):
func run(command_params: Array) -> int:
escoria.main.set_camera_limits(command_params[0])
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -32,3 +32,13 @@ func run(command_params: Array) -> int:
command_params[0]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -51,3 +51,13 @@ func run(command_params: Array) -> int:
command_params[0]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -36,3 +36,13 @@ func run(command_params: Array) -> int:
command_params[1]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -49,3 +49,13 @@ func run(command_params: Array) -> int:
command_params[1]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -69,3 +69,13 @@ func validate(arguments: Array):
return false
return true
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -64,3 +64,13 @@ func run(command_params: Array) -> int:
escoria.room_manager.change_scene(command_params[0], command_params[1])
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -83,3 +83,13 @@ func run(command_params: Array) -> int:
command_params[3]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
get_command_name(),
[
"Interrupt() function not implemented"
]
)

View File

@@ -45,3 +45,9 @@ func run(command_params: Array) -> int:
command_params[1]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -43,3 +43,9 @@ func run(command_params: Array) -> int:
]
)
return ESCExecution.RC_ERROR
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -77,3 +77,9 @@ func run(command_params: Array) -> int:
pass
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -53,3 +53,9 @@ func run(command_params: Array) -> int:
command_params[1]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -42,3 +42,9 @@ func validate(arguments: Array):
func run(command_params: Array) -> int:
escoria.inventory_manager.add_item(command_params[0])
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -26,3 +26,9 @@ func configure() -> ESCCommandArgumentDescriptor:
func run(command_params: Array) -> int:
escoria.inventory_manager.remove_item(command_params[0])
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -14,6 +14,10 @@ extends ESCBaseCommand
class_name PlaySndCommand
# The specified sound player
var _snd_player: String
# Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new(
@@ -40,6 +44,7 @@ func validate(arguments: Array):
["File %s not found" % arguments[0]]
)
return false
_snd_player = arguments[1]
return true
@@ -49,3 +54,8 @@ func run(command_params: Array) -> int:
command_params[0]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.object_manager.get_object(_snd_player).node.set_state("off")

View File

@@ -26,3 +26,9 @@ func run(command_params: Array) -> int:
# Replace the names of any globals in "{ }" with their value
print(escoria.logger.replace_globals(command_params[0]))
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -82,3 +82,9 @@ func run(arguments: Array) -> int:
arguments[2], # channel name
arguments[3] # whether to block
)
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -43,3 +43,9 @@ func run(command_params: Array) -> int:
command_params[1]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -32,3 +32,9 @@ func run(command_params: Array) -> int:
rnd
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -20,3 +20,9 @@ func configure() -> ESCCommandArgumentDescriptor:
# Run the command
func run(command_params: Array) -> int:
return ESCExecution.RC_CANCEL
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -111,3 +111,13 @@ func run(command_params: Array) -> int:
yield(escoria.dialog_player, "say_finished")
escoria.current_state = escoria.GAME_STATE.DEFAULT
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
"say",
[
"Interrupt() function not implemented"
]
)

View File

@@ -62,3 +62,9 @@ func run(command_params: Array) -> int:
command_params[0]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -43,3 +43,9 @@ func run(command_params: Array) -> int:
escoria.object_manager.get_object(command_params[0]).active = \
command_params[1]
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -33,3 +33,9 @@ func run(command_params: Array) -> int:
escoria.object_manager.get_object(command_params[0]).active = \
command_params[1]
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -55,3 +55,9 @@ func run(command_params: Array) -> int:
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -68,3 +68,9 @@ func run(command_params: Array) -> int:
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -33,3 +33,9 @@ func run(command_params: Array) -> int:
command_params[2]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -30,3 +30,9 @@ func run(command_params: Array) -> int:
command_params[1]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -27,3 +27,9 @@ func run(command_params: Array) -> int:
else:
escoria.main.current_scene.game.hide_ui()
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -42,3 +42,9 @@ func run(command_params: Array) -> int:
escoria.object_manager.get_object(command_params[0]).interactive = \
command_params[1]
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -40,3 +40,9 @@ func run(command_params: Array) -> int:
(escoria.object_manager.get_object(command_params[0]).node as ESCItem).\
set_speed(command_params[1])
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -51,3 +51,9 @@ func run(command_params: Array) -> int:
command_params[2]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -81,3 +81,9 @@ func run(command_params: Array) -> int:
escoria.game_scene.pause_game()
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -109,3 +109,9 @@ func run(command_params: Array) -> int:
command_params[2]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
for tween in _tweens:
tween.stop_all()

View File

@@ -25,3 +25,8 @@ func run(command_params: Array) -> int:
)
yield(tween, "tween_all_completed")
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
.interrupt()

View File

@@ -91,3 +91,9 @@ func run(command_params: Array) -> int:
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -19,3 +19,9 @@ func configure() -> ESCCommandArgumentDescriptor:
# Run the command
func run(command_params: Array) -> int:
return ESCExecution.RC_CANCEL
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -13,6 +13,13 @@ extends ESCBaseCommand
class_name StopSndCommand
# The specified sound player
var _snd_player: String
# The previous sound state, saved for interrupting
var previous_snd_state: String
# Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new(
@@ -30,15 +37,24 @@ func validate(arguments: Array):
if not escoria.object_manager.has(arguments[0]):
escoria.logger.report_errors(
"stop_snd: invalid sound player",
["Sound player %s not registered" % arguments[1]]
["Sound player %s not registered" % arguments[0]]
)
return false
_snd_player = arguments[0]
return true
# Run the command
func run(command_params: Array) -> int:
previous_snd_state = escoria.object_manager.get_object(command_params[0]).node.state
escoria.object_manager.get_object(command_params[0]).node.set_state(
"off"
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.object_manager.get_object(_snd_player).node.set_state(
previous_snd_state
)

View File

@@ -53,3 +53,9 @@ func run(command_params: Array) -> int:
escoria.object_manager.get_object(command_params[1]).node
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -44,3 +44,9 @@ func run(command_params: Array) -> int:
Vector2(int(command_params[1]), int(command_params[2]))
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -72,3 +72,9 @@ func run(command_params: Array) -> int:
escoria.logger.debug("Ending transition #%s [%s, %s]"
% [transition_id, command_params[0], command_params[1]])
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
# Do nothing
pass

View File

@@ -61,3 +61,13 @@ func run(command_params: Array) -> int:
command_params[2]
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
escoria.logger.report_warnings(
"turn_to",
[
"Interrupt() function not implemented"
]
)

View File

@@ -10,6 +10,9 @@
extends ESCBaseCommand
class_name WaitCommand
# Timer to wait for
var timer: Timer
# Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor:
@@ -40,5 +43,15 @@ func validate(arguments: Array):
# Run the command
func run(command_params: Array) -> int:
yield(escoria.get_tree().create_timer(float(command_params[0])), "timeout")
timer = Timer.new()
timer.wait_time = float(command_params[0])
escoria.add_child(timer)
timer.start()
yield(timer, "timeout")
escoria.remove_child(timer)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
timer.emit_signal("timeout")

View File

@@ -16,6 +16,13 @@ extends ESCBaseCommand
class_name WalkCommand
# Walking object
var walking_object_node: ESCItem
# Target object
var target_object_node: ESCObject
# Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new(
@@ -46,6 +53,11 @@ func validate(arguments: Array):
]
)
return false
walking_object_node = (escoria.object_manager.get_object(
arguments[0]).node as ESCItem
)
target_object_node = escoria.object_manager.get_object(arguments[1])
return true
@@ -56,3 +68,8 @@ func run(command_params: Array) -> int:
command_params
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
walking_object_node.stop_walking_now()

View File

@@ -16,6 +16,13 @@ extends ESCBaseCommand
class_name WalkBlockCommand
# Walking object
var walking_object_node: ESCItem
# Target object
var target_object_node: ESCObject
# Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new(
@@ -46,6 +53,11 @@ func validate(arguments: Array):
]
)
return false
walking_object_node = (escoria.object_manager.get_object(
arguments[0]).node as ESCItem
)
target_object_node = escoria.object_manager.get_object(arguments[1])
return true
@@ -55,8 +67,11 @@ func run(command_params: Array) -> int:
escoria.action_manager.ACTION.BACKGROUND_CLICK,
command_params
)
yield(
(escoria.object_manager.get_object(command_params[0]).node as ESCItem),
"arrived"
)
yield(walking_object_node, "arrived")
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
if not walking_object_node is ESCPlayer:
walking_object_node.stop_walking_now()

View File

@@ -18,6 +18,10 @@ extends ESCBaseCommand
class_name WalkToPosCommand
# Walking object
var walking_object_node: ESCItem
# Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new(
@@ -40,6 +44,10 @@ func validate(arguments: Array):
]
)
return false
walking_object_node = (escoria.object_manager.get_object(
arguments[0]).node as ESCItem
)
return true
@@ -50,3 +58,9 @@ func run(command_params: Array) -> int:
Vector2(command_params[1], command_params[2]), command_params[3]
])
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
if not walking_object_node is ESCPlayer:
walking_object_node.stop_walking_now()

View File

@@ -18,6 +18,10 @@ extends ESCBaseCommand
class_name WalkToPosBlockCommand
# Walking object
var walking_object_node: ESCItem
# Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new(
@@ -40,6 +44,10 @@ func validate(arguments: Array):
]
)
return false
walking_object_node = (escoria.object_manager.get_object(
arguments[0]).node as ESCItem
)
return true
@@ -54,3 +62,9 @@ func run(command_params: Array) -> int:
"arrived"
)
return ESCExecution.RC_OK
# Function called when the command is interrupted.
func interrupt():
if not walking_object_node is ESCPlayer:
walking_object_node.stop_walking_now()

View File

@@ -280,7 +280,9 @@ func _on_event_finished(finished_statement: ESCStatement, return_code: int, chan
if event_flags & ESCEvent.FLAG_NO_SAVE:
escoria.save_manager.save_enabled = true
# If the return code was RC_CANCEL due to an event finishing with "stop" command for example
# we convert it to RC_OK so that other processed waiting for RC_OK can carry on.
if return_code == ESCExecution.RC_CANCEL:
return_code = ESCExecution.RC_OK

View File

@@ -133,3 +133,19 @@ func run() -> int:
return rc
else:
return ESCExecution.RC_ERROR
# This function interrupts the command. If it was not started, it will not run.
# If it had already started, the execution will be considered as finished
# immediately and finish. If it was already finished, nothing will happen.
func interrupt():
_is_interrupted = true
var command = escoria.command_registry.get_command(self.name)
if command.has_method("interrupt"):
command.interrupt()
# Override of built-in _to_string function to display the statement.
func _to_string() -> String:
return "Command %s with parameters: %s" % [name, str(parameters)]

View File

@@ -5,7 +5,9 @@ class_name ESCExecution
# Return codes handled by events
# * RC_OK: Event run okay
# * RC_CANCEL: Cancel all scheduled and queued events
# * RC_CANCEL: Cancel all scheduled and queued events. This return code tells the Event Manager
# that no execution is required for this command (such as "stop" and "repeat")
# * RC_ERROR: Error running a command
# * RC_REPEAT: Repeat the current scope from the beginning
enum {RC_OK, RC_CANCEL, RC_ERROR, RC_REPEAT}
# * RC_INTERRUPTED: Event was interrupted
enum {RC_OK, RC_CANCEL, RC_ERROR, RC_REPEAT, RC_INTERRUPTED}

View File

@@ -13,9 +13,6 @@ signal interrupted(return_code)
# The list of ESC commands
var statements: Array = []
# Indicates whether this event was finished.
var is_finished: bool = false
# The source of this statement, e.g. an ESC script or a class.
var source: String = ""
@@ -36,7 +33,8 @@ func run() -> int:
var final_rc = ESCExecution.RC_OK
for statement in statements:
if _is_interrupted:
final_rc = ESCExecution.RC_CANCEL
final_rc = ESCExecution.RC_INTERRUPTED
statement.interrupt()
emit_signal("interrupted", final_rc)
return final_rc
@@ -49,11 +47,8 @@ func run() -> int:
["Statement (%s) was completed."
% statement]
)
statement.is_finished = true
if rc == ESCExecution.RC_REPEAT:
return self.run()
elif rc == ESCExecution.RC_OK:
statement.is_finished = true
elif rc != ESCExecution.RC_OK:
final_rc = rc
break
@@ -72,14 +67,7 @@ func interrupt():
)
_is_interrupted = true
for statement in statements:
if statement.is_finished:
var name = statement.name if "name" in statement else "group"
escoria.logger.debug(
"event manager",
["Event %s (%s) is already finished. Won't interrupt."
% [name, str(statement)]]
)
else:
if statement.has_method("interrupt"):
statement.interrupt()

View File

@@ -461,6 +461,20 @@ func walk_to(pos: Vector2, p_walk_context: ESCWalkContext = null) -> void:
_movable.walk_to(pos, p_walk_context)
# Stop the movable node immediately and remain where it is at this moment,
# or teleport it directly at destination position if 'to_target' is true.
#
# #### Parameters
#
# - to_target: if true, the movable node is teleport directly at its target
# destination
func stop_walking_now(to_target: bool = false) -> void:
var where: Vector2 = position
if to_target:
where = _movable.walk_destination
_movable.walk_stop(where)
# Set the moving speed
#
# #### Parameters

View File

@@ -397,5 +397,6 @@ func _on_action_finished() -> void:
tooltip.clear()
func _on_event_done(_return_code: int, _event_name: String):
escoria.action_manager.clear_current_action()
verbs_menu.unselect_actions()
if _return_code == ESCExecution.RC_OK:
escoria.action_manager.clear_current_action()
verbs_menu.unselect_actions()

View File

@@ -372,8 +372,9 @@ func _on_action_finished():
$mouse_layer/verbs_menu.iterate_actions_cursor(0)
func _on_event_done(_return_code: int, _event_name: String):
escoria.action_manager.clear_current_action()
$mouse_layer/verbs_menu.clear_tool_texture()
if _return_code == ESCExecution.RC_OK:
escoria.action_manager.clear_current_action()
$mouse_layer/verbs_menu.clear_tool_texture()
func _on_MenuButton_pressed() -> void: