Big refactor: Fix plugin issues when disabling/reenabling plugins (#598)
Co-authored-by: balloonpopper <5151242+balloonpopper@users.noreply.github.com> Co-authored-by: Duncan Brown <duncan@prometheussoftware.ca>
This commit is contained in:
@@ -142,7 +142,7 @@ func _calculate_movement(delta: float):
|
||||
#
|
||||
# - angle: the angle X axis and object's facing direction.
|
||||
func _perform_walk_orientation(angle: float):
|
||||
last_dir = _get_dir_deg(escoria.utils.get_deg_from_rad(angle),
|
||||
last_dir = _get_dir_deg(ESCUtils.get_deg_from_rad(angle),
|
||||
parent.animations)
|
||||
|
||||
var animation_player: ESCAnimationPlayer = \
|
||||
@@ -158,15 +158,10 @@ func _perform_walk_orientation(angle: float):
|
||||
elif current_animation != animation_to_play and \
|
||||
not animation_player.has_animation(animation_to_play):
|
||||
current_animation = animation_to_play
|
||||
escoria.logger.report_warnings(
|
||||
"movable.gd:_process()",
|
||||
[
|
||||
"Character %s has no animation %s "
|
||||
% [parent.global_id, animation_to_play],
|
||||
"Bypassing missing animation and " +
|
||||
"proceed movement."
|
||||
],
|
||||
true
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Character %s has no animation %s\nBypassing the missing animation and movement command."
|
||||
% [parent.global_id, animation_to_play]
|
||||
)
|
||||
|
||||
is_mirrored = parent.animations.directions[last_dir].mirrored
|
||||
@@ -181,21 +176,21 @@ func teleport(target: Node) -> void:
|
||||
if target.has_method("get_interact_position"):
|
||||
parent.global_position = target.get_interact_position()
|
||||
escoria.logger.info(
|
||||
"Object %s is teleported at position %s" % [
|
||||
target.name,
|
||||
parent.global_position
|
||||
]
|
||||
self,
|
||||
"Object %s is teleported to position %s."
|
||||
% [target.name, parent.global_position]
|
||||
)
|
||||
elif "position" in target:
|
||||
escoria.logger.info(
|
||||
"Object %s teleported at position %s" %
|
||||
[parent.global_id, str(target.global_position)]
|
||||
self,
|
||||
"Object %s teleported to position %s."
|
||||
% [parent.global_id, str(target.global_position)]
|
||||
)
|
||||
parent.global_position = target.global_position
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"ESCMovable#teleport()",
|
||||
["Couldn't understand how to manage teleport Target %s" % target]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Target %s could not be teleported. Please configure the interact position parameter or create a child ESCLocation node." % target
|
||||
)
|
||||
|
||||
|
||||
@@ -206,8 +201,9 @@ func teleport(target: Node) -> void:
|
||||
# - target: Vector2 target position to teleport to
|
||||
func teleport_to(target: Vector2) -> void:
|
||||
escoria.logger.info(
|
||||
"Object %s teleported to position %s" %
|
||||
[parent.global_id, str(target)]
|
||||
self,
|
||||
"Object %s teleported to position %s."
|
||||
% [parent.global_id, str(target)]
|
||||
)
|
||||
parent.global_position = target
|
||||
|
||||
@@ -287,14 +283,16 @@ func walk_stop(pos: Vector2) -> void:
|
||||
|
||||
if walk_context.target_object:
|
||||
escoria.logger.debug(
|
||||
"%s arrived at %s" % [
|
||||
self,
|
||||
"%s arrived at %s." % [
|
||||
parent.global_id,
|
||||
walk_context.target_object.global_id
|
||||
]
|
||||
)
|
||||
else:
|
||||
escoria.logger.debug(
|
||||
"%s arrived at %s" % [
|
||||
self,
|
||||
"%s arrived at %s." % [
|
||||
parent.global_id,
|
||||
walk_context.target_position
|
||||
]
|
||||
@@ -311,7 +309,8 @@ func update_terrain(on_event_finished_name = null) -> void:
|
||||
if !parent.terrain or parent.terrain == null \
|
||||
or !is_instance_valid(parent.terrain):
|
||||
return
|
||||
if on_event_finished_name != null and on_event_finished_name != escoria.event_manager.EVENT_SETUP:
|
||||
if on_event_finished_name != null \
|
||||
and on_event_finished_name != ESCEventManager.EVENT_SETUP:
|
||||
return
|
||||
if parent.get("is_exit"):
|
||||
return
|
||||
@@ -376,9 +375,9 @@ func _get_dir_deg(deg: int, animations: ESCAnimationResource) -> int:
|
||||
|
||||
# It's an error to have the animations misconfigured
|
||||
if dir == -1:
|
||||
escoria.logger.report_errors(
|
||||
"esc_movable.gd:_get_dir_deg()",
|
||||
["No direction found for " + str(deg)]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No animation has been configured for angle %s." + str(deg)
|
||||
)
|
||||
|
||||
return dir
|
||||
@@ -414,9 +413,9 @@ func _is_angle_in_interval(
|
||||
# - wait float Wait this amount of seconds until continuing with turning around
|
||||
func set_angle(deg: int, wait: float = 0.0) -> void:
|
||||
if deg < 0 or deg > 360:
|
||||
escoria.logger.report_errors(
|
||||
"movable.gd:set_angle()",
|
||||
["Invalid degree to turn to " + str(deg)]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid degree to turn to : %s. Valid angles are between 0 and 360." % str(deg)
|
||||
)
|
||||
moved = true
|
||||
|
||||
@@ -490,15 +489,15 @@ func _get_angle() -> int:
|
||||
# Integer: -1 (anti-clockwise), 1 (clockwise) or 0 (no movement needed).
|
||||
func get_shortest_way_to_dir(current_dir: int, target_dir: int) -> int:
|
||||
if current_dir < 0 or current_dir > parent.animations.dir_angles.size() - 1:
|
||||
escoria.logger.report_errors(
|
||||
"esc_movable.gd:get_shortest_way_to_dir()",
|
||||
["Invalid direction (current_dir) %s" % str(current_dir)]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid direction (current_dir) %s" % str(current_dir)
|
||||
)
|
||||
|
||||
if target_dir < 0 or target_dir > parent.animations.dir_angles.size() - 1:
|
||||
escoria.logger.report_errors(
|
||||
"esc_movable.gd:get_shortest_way_to_dir()",
|
||||
["Invalid direction (target_dir) %s " % str(target_dir)]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid direction (target_dir) %s " % str(target_dir)
|
||||
)
|
||||
|
||||
if current_dir == target_dir:
|
||||
|
||||
@@ -22,6 +22,10 @@ extends ESCBaseCommand
|
||||
class_name AcceptInputCommand
|
||||
|
||||
|
||||
# The list of supported input types
|
||||
const SUPPORTED_INPUT_TYPES = ["ALL", "NONE", "SKIP"]
|
||||
|
||||
|
||||
# Return the descriptor of the arguments of this command
|
||||
func configure() -> ESCCommandArgumentDescriptor:
|
||||
return ESCCommandArgumentDescriptor.new(
|
||||
@@ -36,13 +40,16 @@ func validate(arguments: Array):
|
||||
if not .validate(arguments):
|
||||
return false
|
||||
|
||||
if not arguments[0] in ["ALL", "NONE", "SKIP"]:
|
||||
escoria.logger.report_errors(
|
||||
"accept_input: invalid parameter",
|
||||
[
|
||||
"%s is not a valid parameter value (ALL, NONE, SKIP)" %\
|
||||
arguments[0]
|
||||
]
|
||||
if not arguments[0] in SUPPORTED_INPUT_TYPES:
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid parameter. %s is not a valid parameter value." +
|
||||
"Should be one of %s"
|
||||
% [
|
||||
get_command_name(),
|
||||
arguments[0],
|
||||
str(SUPPORTED_INPUT_TYPES)
|
||||
]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -30,11 +30,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"anim: invalid object",
|
||||
[
|
||||
"Object with global id %s not found." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -56,9 +55,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -31,11 +31,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"anim_block.gd:validate",
|
||||
[
|
||||
"Object with global id %s not found." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -62,9 +61,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -48,20 +48,25 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"camera_push: invalid object",
|
||||
[
|
||||
"Object global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not arguments[2] in SUPPORTED_TRANSITIONS:
|
||||
escoria.logger.report_errors(
|
||||
"camera_shift: invalid transition type",
|
||||
[
|
||||
"Transition type {t_type} is not one of the accepted types : {allowed_types}".format(
|
||||
{"t_type":arguments[2],"allowed_types":SUPPORTED_TRANSITIONS})
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
(
|
||||
"[{command_name}]: invalid transition type. Transition type {t_type} " +
|
||||
"is not one of the accepted types : {allowed_types}"
|
||||
).format(
|
||||
{
|
||||
"command_name":get_command_name(),
|
||||
"t_type":arguments[2],
|
||||
"allowed_types":SUPPORTED_TRANSITIONS
|
||||
}
|
||||
)
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -74,16 +79,14 @@ func run(command_params: Array) -> int:
|
||||
.push(
|
||||
escoria.object_manager.get_object(command_params[0]).node,
|
||||
command_params[1],
|
||||
Tween.new().get("TRANS_%s" % command_params[2])
|
||||
ClassDB.class_get_integer_constant("Tween", "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"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -33,14 +33,14 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if escoria.main.current_scene.camera_limits.size() < arguments[0]:
|
||||
escoria.logger.report_errors(
|
||||
"camera_set_limits: invalid limits id",
|
||||
[
|
||||
"Limit id %d is bigger than limits array size %d" % [
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid limits id. Camera limit id (%d) is larger than the number of limits defined in this scene (%d)."
|
||||
% [
|
||||
get_command_name(),
|
||||
arguments[0],
|
||||
escoria.main.current_scene.camera_limits.size()
|
||||
]
|
||||
]
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -55,9 +55,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -36,9 +36,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -32,11 +32,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"camera_set_target: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Invalid object: Object with global id %s not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -55,9 +54,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -40,9 +40,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -30,11 +30,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if arguments[0] < 0:
|
||||
escoria.logger.report_errors(
|
||||
"camera_set_zoom_height: invalid height",
|
||||
[
|
||||
"Can't zoom to a negative height %d" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid height. Can't zoom to a negative height (%d)."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -53,9 +52,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -49,7 +49,7 @@ func run(command_params: Array) -> int:
|
||||
command_params[1]
|
||||
),
|
||||
command_params[2],
|
||||
Tween.new().get("TRANS_%s" % command_params[3])
|
||||
ClassDB.class_get_integer_constant("Tween", "TRANS_%s" % command_params[3])
|
||||
)
|
||||
return ESCExecution.RC_OK
|
||||
|
||||
@@ -59,12 +59,18 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not arguments[3] in SUPPORTED_TRANSITIONS:
|
||||
escoria.logger.report_errors(
|
||||
"camera_shift: invalid transition type",
|
||||
[
|
||||
"Transition type {t_type} is not one of the accepted types : {allowed_types}".format(
|
||||
{"t_type":arguments[3],"allowed_types":SUPPORTED_TRANSITIONS})
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
(
|
||||
"[{command_name}]: invalid transition type" +
|
||||
"Transition type {t_type} is not one of the accepted types : {allowed_types}"
|
||||
).format(
|
||||
{
|
||||
"command_name": get_command_name(),
|
||||
"t_type":arguments[3],
|
||||
"allowed_types":SUPPORTED_TRANSITIONS
|
||||
}
|
||||
)
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -73,9 +79,7 @@ func validate(arguments: Array):
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -31,22 +31,24 @@ func validate(arguments: Array) -> bool:
|
||||
return false
|
||||
|
||||
if not ResourceLoader.exists(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"change_scene: Invalid scene",
|
||||
["Scene %s was not found" % arguments[0]]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Invalid scene. Scene %s was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not ResourceLoader.exists(
|
||||
escoria.project_settings_manager.get_setting(escoria.project_settings_manager.GAME_SCENE)
|
||||
ESCProjectSettingsManager.get_setting(ESCProjectSettingsManager.GAME_SCENE)
|
||||
):
|
||||
escoria.logger.report_errors(
|
||||
"change_scene: Game scene not found",
|
||||
[
|
||||
"The path set in 'ui/game_scene' was not found: %s" % \
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_SCENE
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Game scene not found. The path set in 'ui/game_scene' was not found: %s."
|
||||
% [
|
||||
get_command_name(),
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE
|
||||
)
|
||||
]
|
||||
]
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -56,10 +58,14 @@ func validate(arguments: Array) -> bool:
|
||||
# Run the command
|
||||
func run(command_params: Array) -> int:
|
||||
escoria.logger.info(
|
||||
"Changing scene to %s (enable_automatic_transition = %s)" % [
|
||||
command_params[0], # scene file
|
||||
command_params[1] # enable_automatic_transition
|
||||
])
|
||||
self,
|
||||
"[%s] Changing scene to %s (enable_automatic_transition = %s)."
|
||||
% [
|
||||
get_command_name(),
|
||||
command_params[0], # scene file
|
||||
command_params[1] # enable_automatic_transition
|
||||
]
|
||||
)
|
||||
|
||||
escoria.room_manager.change_scene(command_params[0], command_params[1])
|
||||
|
||||
@@ -68,9 +74,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -35,24 +35,23 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"custom: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
elif not escoria.object_manager.get_object(arguments[0]).node.has_node(
|
||||
arguments[1]
|
||||
):
|
||||
escoria.logger.report_errors(
|
||||
"custom: invalid node",
|
||||
[
|
||||
"Object with global id %s has no node %s" % [
|
||||
arguments[0],
|
||||
arguments[1],
|
||||
]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid node. Object with global id %s has no child node called %s."
|
||||
% [
|
||||
get_command_name(),
|
||||
arguments[0],
|
||||
arguments[1],
|
||||
]
|
||||
)
|
||||
return false
|
||||
elif not escoria.object_manager.get_object(arguments[0]).node\
|
||||
@@ -62,15 +61,15 @@ func validate(arguments: Array):
|
||||
.has_method(
|
||||
arguments[2]
|
||||
):
|
||||
escoria.logger.report_errors(
|
||||
"custom: invalid function",
|
||||
[
|
||||
"Object with global id %s and node %s has no function %s" % [
|
||||
arguments[0],
|
||||
arguments[1],
|
||||
arguments[2],
|
||||
]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid function. Object with global id %s and node %s has no function called %s."
|
||||
% [
|
||||
get_command_name(),
|
||||
arguments[0],
|
||||
arguments[1],
|
||||
arguments[2],
|
||||
]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -84,7 +83,7 @@ func run(command_params: Array) -> int:
|
||||
# Global variables can be substituted into the command arguments by wrapping the global
|
||||
# name in braces.
|
||||
for loop in command_params[3].size():
|
||||
command_params[3][loop] = escoria.esc_compiler.replace_globals(command_params[3][loop])
|
||||
command_params[3][loop] = escoria.globals_manager.replace_globals(command_params[3][loop])
|
||||
|
||||
object.node.get_node(command_params[1]).call(
|
||||
command_params[2],
|
||||
@@ -95,9 +94,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
get_command_name(),
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -27,11 +27,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.globals_manager.get_global(arguments[0]) is int:
|
||||
escoria.logger.report_errors(
|
||||
"dec_global: invalid global",
|
||||
[
|
||||
"Global %s didn't have an integer value." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid global. Global %s isn't an integer value."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -36,11 +36,10 @@ func run(command_params: Array) -> int:
|
||||
escoria.room_terrain.current_active_navigation_instance.enabled = true
|
||||
return ESCExecution.RC_OK
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"EnableTerrainCommand.run: Can not find terrain node",
|
||||
[
|
||||
"Terrain node %s could not be found" % name
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Can not find terrain node. Terrain node %s could not be found."
|
||||
% [get_command_name(), name]
|
||||
)
|
||||
return ESCExecution.RC_ERROR
|
||||
|
||||
|
||||
@@ -34,11 +34,9 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not arguments[0] in ["main", "pause"]:
|
||||
escoria.logger.report_errors(
|
||||
"hide_menu: invalid menu ",
|
||||
[
|
||||
"menu %s is invalid" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: menu %s is invalid." % [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -27,19 +27,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.globals_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"inc_global: invalid global",
|
||||
[
|
||||
"Global %s does not exist." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid global. Global %s does not exist."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not escoria.globals_manager.get_global(arguments[0]) is int:
|
||||
escoria.logger.report_errors(
|
||||
"inc_global: invalid global",
|
||||
[
|
||||
"Global %s didn't have an integer value." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid global. Global %s isn't an integer value."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -28,11 +28,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if arguments[0].begins_with("i/"):
|
||||
escoria.logger.report_errors(
|
||||
"inventory_add: invalid item name",
|
||||
[
|
||||
"Item name %s cannot start with 'i/'." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid item name. Item name %s cannot start with 'i/'."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -33,15 +33,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"play_snd: invalid sound player",
|
||||
["Sound player %s not registered" % arguments[1]]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid sound player. Sound player %s not registered."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
if not ResourceLoader.exists(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"play_snd: invalid parameter",
|
||||
["File %s not found" % arguments[0]]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid parameter. File %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
_snd_player = arguments[1]
|
||||
|
||||
@@ -24,7 +24,7 @@ func configure() -> ESCCommandArgumentDescriptor:
|
||||
# Run the command
|
||||
func run(command_params: Array) -> int:
|
||||
# Replace the names of any globals in "{ }" with their value
|
||||
print(escoria.esc_compiler.replace_globals(command_params[0]))
|
||||
print(escoria.globals_manager.replace_globals(command_params[0]))
|
||||
return ESCExecution.RC_OK
|
||||
|
||||
|
||||
|
||||
@@ -31,39 +31,31 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"queue_event.gd:validate",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Object with global id %s not found." % arguments[0]
|
||||
)
|
||||
return false
|
||||
var node = escoria.object_manager.get_object(
|
||||
arguments[0]
|
||||
).node
|
||||
if not "esc_script" in node or node.esc_script == "":
|
||||
escoria.logger.report_errors(
|
||||
"queue_event.gd:validate",
|
||||
[
|
||||
"Object with global id %s has no ESC script" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Object with global id %s has no ESC script." % arguments[0]
|
||||
)
|
||||
return false
|
||||
var esc_script = escoria.esc_compiler.load_esc_file(node.esc_script)
|
||||
if not arguments[1] in esc_script.events:
|
||||
escoria.logger.report_errors(
|
||||
"queue_event.gd:validate",
|
||||
[
|
||||
"Event with name %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Event with name %s not found." % arguments[1]
|
||||
)
|
||||
return false
|
||||
if arguments[3] and not escoria.event_manager.is_channel_free(arguments[2]):
|
||||
escoria.logger.report_errors(
|
||||
"queue_event.gd:validate",
|
||||
[
|
||||
"The queue %s doesn't accept a new event." % arguments[2]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"The queue %s doesn't accept a new event." % arguments[2]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -28,9 +28,10 @@ func validate(arguments: Array) -> bool:
|
||||
return false
|
||||
|
||||
if not ResourceLoader.exists(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"queue_resource: Invalid resource",
|
||||
["Resource %s was not found" % arguments[0]]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Invalid resource. Resource %s was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -64,21 +64,18 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"anim: invalid object",
|
||||
[
|
||||
"Object with global id %s not found." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Invalid object: Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if ProjectSettings.get_setting("escoria/ui/default_dialog_type") == "" \
|
||||
if ESCProjectSettingsManager.get_setting(ESCProjectSettingsManager.DEFAULT_DIALOG_TYPE) == "" \
|
||||
and arguments[2] == "":
|
||||
escoria.logger.report_errors(
|
||||
"say()",
|
||||
[
|
||||
"Project setting 'escoria/ui/default_dialog_type' is not set.",
|
||||
"Please set a default dialog type."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Project setting '%s' is not set. Please set a default dialog type."
|
||||
% [get_command_name(), ESCProjectSettingsManager.DEFAULT_DIALOG_TYPE]
|
||||
)
|
||||
return true
|
||||
|
||||
@@ -91,17 +88,15 @@ func run(command_params: Array) -> int:
|
||||
escoria.current_state = escoria.GAME_STATE.DIALOG
|
||||
|
||||
if !escoria.dialog_player:
|
||||
escoria.logger.report_errors(
|
||||
"No dialog player registered",
|
||||
[
|
||||
"No dialog player was registered and the say command was" +
|
||||
"encountered."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: No dialog player was registered and the say command was encountered."
|
||||
% get_command_name()
|
||||
)
|
||||
return ESCExecution.RC_ERROR
|
||||
|
||||
# Replace the names of any globals in "{ }" with their value
|
||||
command_params[1] = escoria.esc_compiler.replace_globals(command_params[1])
|
||||
command_params[1] = escoria.globals_manager.replace_globals(command_params[1])
|
||||
|
||||
escoria.dialog_player.say(
|
||||
command_params[0],
|
||||
@@ -115,9 +110,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
"say",
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -32,23 +32,22 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"sched_event: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
elif not escoria.object_manager.get_object(arguments[1]).events\
|
||||
.has(arguments[2]):
|
||||
escoria.logger.report_errors(
|
||||
"sched_event: invalid object event",
|
||||
[
|
||||
"Object with global id %s has no event %s" % [
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object event. Object with global id %s has no event %s."
|
||||
% [
|
||||
get_command_name(),
|
||||
arguments[1],
|
||||
arguments[2],
|
||||
]
|
||||
]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -28,11 +28,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"set_active: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -33,11 +33,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"set_angle: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -60,4 +59,3 @@ func run(command_params: Array) -> int:
|
||||
func interrupt():
|
||||
# Do nothing
|
||||
pass
|
||||
|
||||
|
||||
@@ -27,19 +27,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"set_animations: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not ResourceLoader.exists(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"set_animations: invalid animations",
|
||||
[
|
||||
"The animation resource %s was not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid animation resource. The animation resource %s was not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -27,11 +27,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"set_interactive: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -26,11 +26,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"set_speed: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -34,11 +34,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"set_state: invalid object",
|
||||
[
|
||||
"Object %s not found." % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object. Object %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -31,11 +31,9 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not arguments[0] in ["main", "pause"]:
|
||||
escoria.logger.report_errors(
|
||||
"show_menu: invalid menu ",
|
||||
[
|
||||
"menu %s is invalid" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: menu %s is invalid." % [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -35,19 +35,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"slide: invalid first object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid first object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"slide: invalid second object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid second object. Object with global id %s not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -80,6 +78,8 @@ func _slide_object(
|
||||
|
||||
var tween = Tween.new()
|
||||
(escoria.main as Node).add_child(tween)
|
||||
|
||||
tween.connect("tween_completed", self, "_on_tween_completed")
|
||||
|
||||
var duration = source.node.position.distance_to(
|
||||
destination.node.position
|
||||
@@ -115,3 +115,7 @@ func run(command_params: Array) -> int:
|
||||
func interrupt():
|
||||
for tween in _tweens:
|
||||
tween.stop_all()
|
||||
|
||||
|
||||
func _on_tween_completed(tween: Tween):
|
||||
tween.queue_free()
|
||||
|
||||
@@ -31,27 +31,24 @@ func validate(arguments: Array):
|
||||
|
||||
if arguments[0].empty() \
|
||||
or arguments[0] in escoria.object_manager.RESERVED_OBJECTS:
|
||||
escoria.logger.report_errors(
|
||||
"spawn: invalid global_id",
|
||||
[
|
||||
"global_id %s is invalid" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: global_id (%s) is invalid. The global_id was either empty or is reserved."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not ResourceLoader.exists(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"spawn: invalid scene path",
|
||||
[
|
||||
"Scene with path %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Invalid scene path: %s not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
if arguments[3] and not escoria.object_manager.has(arguments[3]):
|
||||
escoria.logger.report_errors(
|
||||
"spawn: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[3]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid object: Object with global id %s not found."
|
||||
% [get_command_name(), arguments[3]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -83,11 +80,10 @@ func run(command_params: Array) -> int:
|
||||
command_params[2]
|
||||
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"spawn: Invalid scene",
|
||||
[
|
||||
"Failed loading scene %s" % command_params[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: Invalid scene. Failed to load scene %s."
|
||||
% [get_command_name(), command_params[1]]
|
||||
)
|
||||
|
||||
return ESCExecution.RC_OK
|
||||
|
||||
@@ -35,9 +35,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"stop_snd: invalid sound player",
|
||||
["Sound player %s not registered" % arguments[0]]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid sound player. Sound player %s not registered."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
_snd_player = arguments[0]
|
||||
|
||||
@@ -28,19 +28,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"teleport: invalid first object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid first object. Object to teleport with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"teleport: invalid second object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid second object. Destination location to teleport to with global id %s not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -28,11 +28,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"teleport_pos: invalid first object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid first object. Object to teleport with global id %s not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -30,19 +30,18 @@ func validate(arguments: Array):
|
||||
|
||||
if not escoria.main.scene_transition.has_transition(arguments[0]) \
|
||||
and not arguments[0].empty():
|
||||
escoria.logger.report_errors(
|
||||
"transition: argument invalid",
|
||||
[
|
||||
"transition with name '%s' doesn't exist" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: argument invalid. Transition with name '%s' doesn't exist."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not arguments[1] in ["in", "out"]:
|
||||
escoria.logger.report_errors(
|
||||
"transition: argument invalid",
|
||||
[
|
||||
"'in' or 'out' expected, but got '%s'" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: argument invalid" +
|
||||
"Transition type 'in' or 'out' expected, but '%s' was provided."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -58,19 +57,27 @@ func run(command_params: Array) -> int:
|
||||
)
|
||||
|
||||
if transition_id == ESCTransitionPlayer.TRANSITION_ID_INSTANT:
|
||||
escoria.logger.debug("Performing instant transition.")
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Performing instant transition."
|
||||
)
|
||||
escoria.main.scene_transition.reset_shader_cutoff()
|
||||
return ESCExecution.RC_OK
|
||||
|
||||
escoria.logger.debug("Starting transition #%s [%s, %s]"
|
||||
% [transition_id, command_params[0], command_params[1]])
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Starting transition #%s [%s, %s]."
|
||||
% [transition_id, command_params[0], command_params[1]]
|
||||
)
|
||||
while yield(
|
||||
escoria.main.scene_transition,
|
||||
"transition_done"
|
||||
) != transition_id:
|
||||
pass
|
||||
escoria.logger.debug("Ending transition #%s [%s, %s]"
|
||||
% [transition_id, command_params[0], command_params[1]])
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Ending transition #%s [%s, %s]."
|
||||
% [transition_id, command_params[0], command_params[1]])
|
||||
return ESCExecution.RC_OK
|
||||
|
||||
|
||||
|
||||
@@ -35,19 +35,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"turn_to: invalid object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: The object to turn with global id %s was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"turn_to: invalid target object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: The object to turn towards with global id %s was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
return true
|
||||
@@ -65,9 +63,7 @@ func run(command_params: Array) -> int:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.report_warnings(
|
||||
"turn_to",
|
||||
[
|
||||
"Interrupt() function not implemented"
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"[%s] interrupt() function not implemented." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -30,12 +30,10 @@ func validate(arguments: Array):
|
||||
|
||||
# We can't wait for 0 or fewer seconds, now, can we?
|
||||
if arguments[0] <= 0.0:
|
||||
escoria.logger.report_errors(
|
||||
"wait: argument invalid",
|
||||
[
|
||||
"%ss is an invalid amount of time to wait." % arguments[0],
|
||||
"Time to wait must be positive."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: argument invalid. %s is an invalid amount of time to wait (must be positive)."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
|
||||
|
||||
@@ -38,19 +38,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"walk: invalid first object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid first object. The object with global id %s to make walk was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"walk: invalid second object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
": invalid second object. The object to walk to with global id %s was not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
|
||||
|
||||
@@ -38,19 +38,17 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"walk_block: invalid first object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid first object. The object to make walk with global id %s was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
if not escoria.object_manager.has(arguments[1]):
|
||||
escoria.logger.report_errors(
|
||||
"walk_block: invalid second object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid second object. The object to walk to with global id %s was not found."
|
||||
% [get_command_name(), arguments[1]]
|
||||
)
|
||||
return false
|
||||
|
||||
|
||||
@@ -37,11 +37,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"walk_to_pos: invalid first object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid first object. The object to make walk with global id %s was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
|
||||
|
||||
@@ -37,11 +37,10 @@ func validate(arguments: Array):
|
||||
return false
|
||||
|
||||
if not escoria.object_manager.has(arguments[0]):
|
||||
escoria.logger.report_errors(
|
||||
"walk_to_pos_block: invalid first object",
|
||||
[
|
||||
"Object with global id %s not found" % arguments[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"[%s]: invalid first object. The object to make walk with global id %s was not found."
|
||||
% [get_command_name(), arguments[0]]
|
||||
)
|
||||
return false
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Manages currently carried out actions
|
||||
extends Object
|
||||
extends Resource
|
||||
class_name ESCActionManager
|
||||
|
||||
|
||||
@@ -90,12 +90,10 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
||||
|
||||
# Check moving object.
|
||||
if not escoria.object_manager.has(params[0]):
|
||||
escoria.logger.report_errors(
|
||||
"esc_action_manager.gd:do()",
|
||||
[
|
||||
"Walk action requested on nonexisting " + \
|
||||
"object: %s " % params[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Walk action requested for nonexisting object: %s."
|
||||
% params[0]
|
||||
)
|
||||
return
|
||||
|
||||
@@ -104,12 +102,10 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
||||
|
||||
if params[1] is String:
|
||||
if not escoria.object_manager.has(params[1]):
|
||||
escoria.logger.report_errors(
|
||||
"esc_action_manager.gd:do()",
|
||||
[
|
||||
"Walk action requested to nonexisting " + \
|
||||
"object: %s " % params[1]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Walk action requested to nonexisting destination object: %s."
|
||||
% params[1]
|
||||
)
|
||||
return
|
||||
|
||||
@@ -122,8 +118,8 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
||||
ACTION.ITEM_LEFT_CLICK:
|
||||
if params[0] is String:
|
||||
escoria.logger.info(
|
||||
"esc_action_manager.do(): item_left_click on item ",
|
||||
[params[0]]
|
||||
self,
|
||||
"item_left_click on item %s." % params[0]
|
||||
)
|
||||
|
||||
if can_interrupt:
|
||||
@@ -135,8 +131,8 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
||||
ACTION.ITEM_RIGHT_CLICK:
|
||||
if params[0] is String:
|
||||
escoria.logger.info(
|
||||
"esc_action_manager.do(): item_right_click on item ",
|
||||
[params[0]]
|
||||
self,
|
||||
"item_right_click on item %s." % params[0]
|
||||
)
|
||||
|
||||
if can_interrupt:
|
||||
@@ -149,10 +145,13 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
||||
var trigger_id = params[0]
|
||||
var object_id = params[1]
|
||||
var trigger_in_verb = params[2]
|
||||
escoria.logger.info("esc_action_manager.do(): trigger_in %s by %s" % [
|
||||
trigger_id,
|
||||
object_id
|
||||
])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"trigger_in on trigger %s activated by %s." % [
|
||||
trigger_id,
|
||||
object_id
|
||||
]
|
||||
)
|
||||
escoria.event_manager.queue_event(
|
||||
escoria.object_manager.get_object(trigger_id).events[
|
||||
trigger_in_verb
|
||||
@@ -163,10 +162,13 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
||||
var trigger_id = params[0]
|
||||
var object_id = params[1]
|
||||
var trigger_out_verb = params[2]
|
||||
escoria.logger.info("esc_action_manager.do(): trigger_out %s by %s" % [
|
||||
trigger_id,
|
||||
object_id
|
||||
])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"trigger_out on trigger %s activated by %s." % [
|
||||
trigger_id,
|
||||
object_id
|
||||
]
|
||||
)
|
||||
escoria.event_manager.queue_event(
|
||||
escoria.object_manager.get_object(trigger_id).events[
|
||||
trigger_out_verb
|
||||
@@ -174,8 +176,10 @@ func do(action: int, params: Array = [], can_interrupt: bool = false) -> void:
|
||||
)
|
||||
|
||||
_:
|
||||
escoria.logger.report_warnings("esc_action_manager.gd:do()",
|
||||
["Action received:", action, "with params ", params])
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Action received: %s with params %s.", [action, params]
|
||||
)
|
||||
elif escoria.current_state == escoria.GAME_STATE.WAIT:
|
||||
pass
|
||||
|
||||
@@ -237,7 +241,10 @@ func _activate(
|
||||
target: ESCObject,
|
||||
combine_with: ESCObject = null
|
||||
) -> int:
|
||||
escoria.logger.info("Activated action %s on %s" % [action, target])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Activated action %s on %s." % [action, target]
|
||||
)
|
||||
|
||||
# If we're using an action which item requires to combine
|
||||
if target.node is ESCItem\
|
||||
@@ -314,16 +321,16 @@ func _activate(
|
||||
("Reason: %s's item interaction " +\
|
||||
"is one-way.") % combine_with.global_id
|
||||
)
|
||||
escoria.logger.report_warnings(
|
||||
"ESCActionManager.activate: Invalid action",
|
||||
errors
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Invalid action" + str(errors)
|
||||
)
|
||||
emit_signal("action_finished")
|
||||
return ESCExecution.RC_ERROR
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"ESCActionManager.activate: Invalid action on item",
|
||||
[
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Invalid action on item: " +
|
||||
(
|
||||
"Trying to combine object %s with %s, "+
|
||||
"but %s is not in inventory."
|
||||
@@ -332,7 +339,6 @@ func _activate(
|
||||
combine_with.global_id,
|
||||
combine_with.global_id
|
||||
]
|
||||
]
|
||||
)
|
||||
emit_signal("action_finished")
|
||||
return ESCExecution.RC_ERROR
|
||||
@@ -344,16 +350,15 @@ func _activate(
|
||||
)
|
||||
return ESCExecution.RC_OK
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"ESCActionManager.activate: Invalid action on item",
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Invalid action on item" +
|
||||
"Trying to run action %s on object %s, " %
|
||||
[
|
||||
"Trying to run %s on object %s, " %
|
||||
[
|
||||
action,
|
||||
target.node.global_id
|
||||
]
|
||||
+ "but item must be in inventory."
|
||||
action,
|
||||
target.node.global_id
|
||||
]
|
||||
+ "but item must be in inventory."
|
||||
)
|
||||
|
||||
if target.events.has(action):
|
||||
@@ -372,14 +377,13 @@ func _activate(
|
||||
emit_signal("action_finished")
|
||||
return event_returned[0]
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"ESCActionManager.activate: Invalid action",
|
||||
[
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Invalid action: " +
|
||||
"Event for action %s on object %s not found." % [
|
||||
action,
|
||||
target.global_id
|
||||
]
|
||||
]
|
||||
)
|
||||
emit_signal("action_finished")
|
||||
return ESCExecution.RC_ERROR
|
||||
@@ -428,12 +432,10 @@ func perform_walk(
|
||||
moving_obj.node.walk_to(target_position, walk_context)
|
||||
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"esc_controller.gd:perform_walk()",
|
||||
[
|
||||
"Function expected either a Vector2 or ESCObject type " + \
|
||||
"for destination parameter. Actual was: %s " % destination
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Function expected either a Vector2 or ESCObject type " + \
|
||||
"for destination parameter. Destination provided was: %s." % destination
|
||||
)
|
||||
return
|
||||
|
||||
@@ -472,7 +474,10 @@ func perform_inputevent_on_object(
|
||||
In this case, perform the default_action on the item.
|
||||
"""
|
||||
|
||||
escoria.logger.info("%s left-clicked with event " % obj.global_id, [event])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"%s left-clicked with event %s." % [obj.global_id, event]
|
||||
)
|
||||
|
||||
var event_flags = 0
|
||||
var has_current_action: bool = false
|
||||
@@ -620,8 +625,10 @@ func _walk_towards_object(
|
||||
var dont_interact: bool = false
|
||||
|
||||
if obj == null || obj.node == null:
|
||||
escoria.logger.report_errors("esc_action_manager.gd:_walk_towards_object",
|
||||
["obj or obj.node not populated."])
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"walk_towards_object error. obj or obj.node not populated."
|
||||
)
|
||||
var interact_position = obj.node.get_interact_position()
|
||||
# If clicked object is interactive, get destination position from it.
|
||||
if escoria.object_manager.get_object(obj.global_id).interactive:
|
||||
@@ -645,7 +652,10 @@ func _walk_towards_object(
|
||||
escoria.main.current_scene.player.walk_to(destination_position,
|
||||
walk_context)
|
||||
|
||||
escoria.logger.debug("Player walking to destination. Yielding.")
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Player walking to destination. Yielding."
|
||||
)
|
||||
|
||||
# Wait for the player to arrive before continuing with action.
|
||||
var context: ESCWalkContext = yield(
|
||||
@@ -654,11 +664,16 @@ func _walk_towards_object(
|
||||
)
|
||||
|
||||
if context.target_object != obj:
|
||||
escoria.logger.debug("Original walk context target does not match " \
|
||||
+ "yielded walk context. Likely interrutped walk.")
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Original walk context target does not match " \
|
||||
+ "yielded walk context. Likely interrutped walk.")
|
||||
return
|
||||
|
||||
escoria.logger.info("Context arrived: %s" % context)
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Context arrived: %s." % context
|
||||
)
|
||||
|
||||
# Confirm that reached item was the one user clicked in the first place.
|
||||
# Don't interact if that is not the case.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A registry of ESC command objects
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCCommandRegistry
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ var registry: Dictionary = {}
|
||||
# - command_name: Name of command to load
|
||||
# **Returns** The command object
|
||||
func load_command(command_name: String) -> ESCBaseCommand:
|
||||
for command_directory in escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.COMMAND_DIRECTORIES
|
||||
for command_directory in ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.COMMAND_DIRECTORIES
|
||||
):
|
||||
if ResourceLoader.exists("%s/%s.gd" % [command_directory, command_name]):
|
||||
registry[command_name] = load(
|
||||
@@ -26,12 +26,10 @@ func load_command(command_name: String) -> ESCBaseCommand:
|
||||
).new()
|
||||
return registry[command_name]
|
||||
|
||||
escoria.logger.report_errors(
|
||||
"ESCCommandRegistry.load_command: Command not found",
|
||||
[
|
||||
"No command class could be found for command %s" %
|
||||
command_name
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No command class could be found for command %s."
|
||||
% command_name
|
||||
)
|
||||
|
||||
return null
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Compiler of the ESC language
|
||||
extends Object
|
||||
extends Resource
|
||||
class_name ESCCompiler
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ var _current_indent = 0
|
||||
|
||||
func _init():
|
||||
# Assure command list preference
|
||||
# (we use ProjectSettings instead of escoria.project_settings_manager
|
||||
# (we use ProjectSettings instead of ESCProjectSettingsManager
|
||||
# here because this is called from escoria._init())
|
||||
if not ProjectSettings.has_setting(COMMAND_DIRECTORIES):
|
||||
ProjectSettings.set_setting(COMMAND_DIRECTORIES, [
|
||||
@@ -90,7 +90,7 @@ func _init():
|
||||
|
||||
# Load an ESC file from a file resource
|
||||
func load_esc_file(path: String) -> ESCScript:
|
||||
escoria.logger.debug("Parsing file %s" % path)
|
||||
escoria.logger.debug(self, "Parsing file %s." % path)
|
||||
if File.new().file_exists(path):
|
||||
var file = File.new()
|
||||
file.open(path, File.READ)
|
||||
@@ -99,12 +99,9 @@ func load_esc_file(path: String) -> ESCScript:
|
||||
lines.append(file.get_line())
|
||||
return self.compile(lines, path)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
path,
|
||||
[
|
||||
"Can not find ESC file",
|
||||
"File %s could not be found" % path
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Can not find ESC file: file %s could not be found." % path
|
||||
)
|
||||
return null
|
||||
|
||||
@@ -128,20 +125,29 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
|
||||
while lines.size() > 0:
|
||||
var line = lines.pop_front().strip_edges(false, true)
|
||||
escoria.logger.trace("Parsing line %s" % line)
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Parsing line %s." % line
|
||||
)
|
||||
if _comment_regex.search(line) or _empty_regex.search(line):
|
||||
# Ignore comments and empty lines
|
||||
escoria.logger.trace("Line is empty or a comment. Skipping.")
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Line is empty or a comment. Skipping."
|
||||
)
|
||||
continue
|
||||
var indent = \
|
||||
escoria.utils.get_re_group(
|
||||
ESCUtils.get_re_group(
|
||||
_indent_regex.search(line),
|
||||
INDENT_REGEX_GROUP
|
||||
).length()
|
||||
|
||||
if _event_regex.search(line):
|
||||
var event = ESCEvent.new(line)
|
||||
escoria.logger.trace("Line is the event %s" % event.name)
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Line is the event %s." % event.name
|
||||
)
|
||||
var event_lines = []
|
||||
while lines.size() > 0:
|
||||
var next_line = lines.pop_front()
|
||||
@@ -152,14 +158,18 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
break
|
||||
if event_lines.size() > 0:
|
||||
escoria.logger.trace(
|
||||
"Compiling the next %d lines into the event" % \
|
||||
self,
|
||||
"Compiling the next %d lines into the event." % \
|
||||
event_lines.size()
|
||||
)
|
||||
event.statements = self._compile(event_lines, path)
|
||||
returned.append(event)
|
||||
elif _group_regex.search(line):
|
||||
var group = ESCGroup.new(line)
|
||||
escoria.logger.trace("Line is a group")
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Line is a group."
|
||||
)
|
||||
var group_lines = []
|
||||
while lines.size() > 0:
|
||||
var next_line = lines.pop_front()
|
||||
@@ -167,7 +177,7 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
_empty_regex.search(next_line):
|
||||
continue
|
||||
var next_line_indent = \
|
||||
escoria.utils.get_re_group(
|
||||
ESCUtils.get_re_group(
|
||||
_indent_regex.search(next_line),
|
||||
INDENT_REGEX_GROUP
|
||||
).length()
|
||||
@@ -178,7 +188,8 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
break
|
||||
if group_lines.size() > 0:
|
||||
escoria.logger.trace(
|
||||
"Compiling the next %d lines into the group" % \
|
||||
self,
|
||||
"Compiling the next %d lines into the group." % \
|
||||
group_lines.size()
|
||||
)
|
||||
group.statements = self._compile(group_lines, path)
|
||||
@@ -186,7 +197,10 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
elif _dialog_regex.search(line):
|
||||
var dialog = ESCDialog.new()
|
||||
dialog.load_string(line)
|
||||
escoria.logger.trace("Line is a dialog")
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Line is a dialog."
|
||||
)
|
||||
var dialog_lines = []
|
||||
while lines.size() > 0:
|
||||
var next_line = lines.pop_front()
|
||||
@@ -195,7 +209,7 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
continue
|
||||
var end_line = _dialog_end_regex.search(next_line)
|
||||
if end_line and \
|
||||
escoria.utils.get_re_group(
|
||||
ESCUtils.get_re_group(
|
||||
end_line,
|
||||
INDENT_REGEX_GROUP
|
||||
).length() == indent:
|
||||
@@ -204,7 +218,8 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
dialog_lines.append(next_line)
|
||||
if dialog_lines.size() > 0:
|
||||
escoria.logger.trace(
|
||||
"Compiling the next %d lines into the dialog" % \
|
||||
self,
|
||||
"Compiling the next %d lines into the dialog." % \
|
||||
dialog_lines.size()
|
||||
)
|
||||
dialog.options = self._compile(dialog_lines, path)
|
||||
@@ -215,7 +230,8 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
var dialog_option = ESCDialogOption.new()
|
||||
dialog_option.load_string(line)
|
||||
escoria.logger.trace(
|
||||
"Line is the dialog option %s" % \
|
||||
self,
|
||||
"Line is the dialog option %s." % \
|
||||
dialog_option.option
|
||||
)
|
||||
var dialog_option_lines = []
|
||||
@@ -225,7 +241,7 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
_empty_regex.search(next_line):
|
||||
continue
|
||||
var next_line_indent = \
|
||||
escoria.utils.get_re_group(
|
||||
ESCUtils.get_re_group(
|
||||
_indent_regex.search(next_line),
|
||||
INDENT_REGEX_GROUP
|
||||
).length()
|
||||
@@ -236,8 +252,9 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
break
|
||||
if dialog_option_lines.size() > 0:
|
||||
escoria.logger.trace(
|
||||
"Compiling the next %d lines into the event" % \
|
||||
dialog_option_lines.size()
|
||||
self,
|
||||
"Compiling the next %d lines into the event."
|
||||
% dialog_option_lines.size()
|
||||
)
|
||||
dialog_option.statements = self._compile(dialog_option_lines, path)
|
||||
returned.append(dialog_option)
|
||||
@@ -246,34 +263,19 @@ func _compile(lines: Array, path: String = "") -> Array:
|
||||
if command.command_exists():
|
||||
returned.append(command)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
path,
|
||||
[
|
||||
"Invalid command detected: %s" % command.name,
|
||||
"Command implementation not found in any command directory"
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Command \"%s\" cannot be found under folder %s.\nPlease confirm setting \"%s\" is set to the folder where ESC commands are stored."
|
||||
% [
|
||||
command.name,
|
||||
ProjectSettings.get_setting(COMMAND_DIRECTORIES),
|
||||
ESCProjectSettingsManager.COMMAND_DIRECTORIES
|
||||
]
|
||||
)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
path,
|
||||
[
|
||||
"Invalid ESC line detected",
|
||||
"Line couldn't be compiled: %s" % line
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid ESC line detected.\nLine couldn't be compiled: %s."
|
||||
% line
|
||||
)
|
||||
return returned
|
||||
|
||||
# Look to see if any globals (names in braces) should be interpreted
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * string: Text to log
|
||||
func replace_globals(string: String) -> String:
|
||||
for result in _globals_regex.search_all(string):
|
||||
var globresult = escoria.globals_manager.get_global(
|
||||
str(result.get_string())
|
||||
)
|
||||
string = string.replace(
|
||||
"{" + result.get_string() + "}", str(globresult)
|
||||
)
|
||||
return string
|
||||
|
||||
@@ -88,16 +88,14 @@ func _process(delta: float) -> void:
|
||||
_running_events[channel_name] = \
|
||||
events_queue[channel_name].pop_front()
|
||||
escoria.logger.debug(
|
||||
"esc_event_manager",
|
||||
[
|
||||
"Popping event '%s' from background queue %s" % [
|
||||
_running_events[channel_name].name,
|
||||
channel_name,
|
||||
],
|
||||
"from source %s" % _running_events[channel_name].source \
|
||||
if not _running_events[channel_name].source.empty()
|
||||
else "(unknown)",
|
||||
]
|
||||
self,
|
||||
"Popping event '%s' from background queue %s " % [
|
||||
_running_events[channel_name].name,
|
||||
channel_name,
|
||||
] +
|
||||
"to source %s." % _running_events[channel_name].source \
|
||||
if not _running_events[channel_name].source.empty()
|
||||
else "(unknown)"
|
||||
)
|
||||
if not _running_events[channel_name].is_connected(
|
||||
"finished", self, "_on_event_finished"
|
||||
@@ -174,28 +172,22 @@ func queue_event_from_esc(script_object: ESCScript, event: String,
|
||||
return ESCExecution.RC_WONT_QUEUE
|
||||
|
||||
if channel == CHANNEL_FRONT:
|
||||
escoria.event_manager.queue_event(script_object.events[event])
|
||||
queue_event(script_object.events[event])
|
||||
else:
|
||||
escoria.event_manager.queue_background_event(
|
||||
queue_background_event(
|
||||
channel,
|
||||
script_object.events[event]
|
||||
)
|
||||
if block:
|
||||
if channel == CHANNEL_FRONT:
|
||||
var rc = yield(escoria.event_manager, "event_finished")
|
||||
var rc = yield(self, "event_finished")
|
||||
while rc[1] != event:
|
||||
rc = yield(escoria.event_manager, "event_finished")
|
||||
rc = yield(self, "event_finished")
|
||||
return rc
|
||||
else:
|
||||
var rc = yield(
|
||||
escoria.event_manager,
|
||||
"background_event_finished"
|
||||
)
|
||||
var rc = yield(self, "background_event_finished")
|
||||
while rc[1] != event and rc[2] != channel:
|
||||
rc = yield(
|
||||
escoria.event_manager,
|
||||
"background_event_finished"
|
||||
)
|
||||
rc = yield(self, "background_event_finished")
|
||||
return rc
|
||||
|
||||
return ESCExecution.RC_OK
|
||||
@@ -208,6 +200,7 @@ func queue_event_from_esc(script_object: ESCScript, event: String,
|
||||
func queue_event(event: ESCEvent, force: bool = false) -> void:
|
||||
if _changing_scene and not force:
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Changing scenes. Won't queue event '%s'." % event.name
|
||||
)
|
||||
return
|
||||
@@ -222,18 +215,22 @@ func queue_event(event: ESCEvent, force: bool = false) -> void:
|
||||
var message = "Event '%s' is already the most-recently queued event in channel '%s'." + \
|
||||
" Won't be queued again."
|
||||
|
||||
escoria.logger.debug(message % [event.name, CHANNEL_FRONT])
|
||||
escoria.logger.debug(self, message % [event.name, CHANNEL_FRONT])
|
||||
return
|
||||
elif _is_event_running(event, CHANNEL_FRONT):
|
||||
# Don't queue the same event if it's already running.
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Event %s already running in channel '%s'. Won't be queued."
|
||||
% [event.name, CHANNEL_FRONT]
|
||||
)
|
||||
|
||||
return
|
||||
|
||||
escoria.logger.debug("Queueing %s in channel %s." % [event.name, CHANNEL_FRONT])
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Queueing event %s in channel %s." % [event.name, CHANNEL_FRONT]
|
||||
)
|
||||
self.events_queue[CHANNEL_FRONT].append(event)
|
||||
|
||||
|
||||
@@ -266,11 +263,12 @@ func queue_background_event(channel_name: String, event: ESCEvent) -> void:
|
||||
var message = "Event '%s' is already the most-recently queued event in channel '%s'." + \
|
||||
" Won't be queued again."
|
||||
|
||||
escoria.logger.debug(message % [event.name, channel_name])
|
||||
escoria.logger.debug(self, message % [event.name, channel_name])
|
||||
return
|
||||
elif _is_event_running(event, CHANNEL_FRONT):
|
||||
# Don't queue the same event if it's already running.
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Event %s already running in channel '%s'. Won't be queued."
|
||||
% [event.name, channel_name]
|
||||
)
|
||||
@@ -287,8 +285,10 @@ func queue_background_event(channel_name: String, event: ESCEvent) -> void:
|
||||
func interrupt(exceptions: PoolStringArray = []) -> void:
|
||||
for channel_name in _running_events.keys():
|
||||
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])
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Interrupting running event %s in channel %s..."
|
||||
% [_running_events[channel_name].name, channel_name])
|
||||
_running_events[channel_name].interrupt()
|
||||
_channels_state[channel_name] = true
|
||||
|
||||
@@ -298,8 +298,10 @@ func interrupt(exceptions: PoolStringArray = []) -> void:
|
||||
if event.name in exceptions:
|
||||
continue
|
||||
|
||||
escoria.logger.debug("Interrupting queued event %s in channel %s..."
|
||||
% [event.name, channel_name])
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Interrupting queued event %s in channel %s..."
|
||||
% [event.name, channel_name])
|
||||
event.interrupt()
|
||||
|
||||
events_queue[channel_name].clear()
|
||||
@@ -334,7 +336,10 @@ func get_running_event(name: String) -> ESCEvent:
|
||||
# #### Parameterse
|
||||
# - value: boolean value to set _changing_scene to
|
||||
func set_changing_scene(p_is_changing_scene: bool) -> void:
|
||||
escoria.logger.trace("Setting _changing_scene to %s." % p_is_changing_scene)
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Setting _changing_scene to %s." % p_is_changing_scene
|
||||
)
|
||||
|
||||
_changing_scene = p_is_changing_scene
|
||||
|
||||
@@ -353,17 +358,16 @@ func set_changing_scene(p_is_changing_scene: bool) -> void:
|
||||
func _on_event_finished(finished_statement: ESCStatement, return_code: int, channel_name: String) -> void:
|
||||
var event = _running_events[channel_name]
|
||||
if not event:
|
||||
escoria.logger.report_warnings(
|
||||
"esc_event_manager.gd:_on_event_finished()",
|
||||
[
|
||||
"Event %s finished without being in _running_events[%s]"
|
||||
% [finished_statement.name, channel_name]
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Event %s finished without being in _running_events[%s]."
|
||||
% [finished_statement.name, channel_name]
|
||||
)
|
||||
return
|
||||
|
||||
escoria.logger.debug(
|
||||
"Event %s ended with return code %d" % [event.name, return_code]
|
||||
self,
|
||||
"Event %s ended with return code %d." % [event.name, return_code]
|
||||
)
|
||||
|
||||
var event_flags = event.flags
|
||||
|
||||
@@ -16,6 +16,13 @@ export(Dictionary) var _globals = {}
|
||||
# Registry of globals that are to be reserved for internal use only.
|
||||
var _reserved_globals: Dictionary = {}
|
||||
|
||||
# Use look-ahead/behind to capture the term in braces
|
||||
var globals_regex: RegEx = RegEx.new()
|
||||
|
||||
# Constructor
|
||||
func _init():
|
||||
globals_regex.compile("(?<=\\{)(.*)(?=\\})")
|
||||
|
||||
|
||||
# Check if a global was registered
|
||||
#
|
||||
@@ -35,11 +42,11 @@ func has(key: String) -> bool:
|
||||
# - value: The initial value (optional)
|
||||
func register_reserved_global(key: String, value = null) -> void:
|
||||
if key in _reserved_globals:
|
||||
escoria.logger.report_errors(
|
||||
"ESCGlobalsManager.register_reserved_global: Can not override reserved global",
|
||||
[
|
||||
"Global key %s is already registered as reserved" % key
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Can not override reserved global: Global key %s is already " +
|
||||
"registered as reserved."
|
||||
% key
|
||||
)
|
||||
var old_value = _globals[key] if _globals.has(key) else ""
|
||||
_reserved_globals[key] = value
|
||||
@@ -86,11 +93,9 @@ func filter(pattern: String) -> Dictionary:
|
||||
# - value: The new value
|
||||
func set_global(key: String, value, ignore_reserved: bool = false) -> void:
|
||||
if key in _reserved_globals and not ignore_reserved:
|
||||
escoria.logger.report_errors(
|
||||
"ESCGlobalsManager.set_global: Can not override reserved global",
|
||||
[
|
||||
"Global key %s is reserved and can not be overridden" % key
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Global key %s is reserved and can not be overridden." % key
|
||||
)
|
||||
|
||||
emit_signal(
|
||||
@@ -102,7 +107,6 @@ func set_global(key: String, value, ignore_reserved: bool = false) -> void:
|
||||
_globals[key] = value
|
||||
|
||||
|
||||
|
||||
# Set all globals that match the pattern to the value
|
||||
# Check out [the Godot docs](https://docs.godotengine.org/en/stable/classes/class_string.html#class-string-method-match)
|
||||
# for the pattern format
|
||||
@@ -117,6 +121,24 @@ func set_global_wildcard(pattern: String, value) -> void:
|
||||
self.set_global(global_key, value)
|
||||
|
||||
|
||||
# Look to see if any globals (names in braces) should be interpreted
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * string: Text in which to replace globals
|
||||
#
|
||||
# *Returns* the provided string with globals variables replaced with their values
|
||||
func replace_globals(string: String) -> String:
|
||||
for result in globals_regex.search_all(string):
|
||||
var globresult = escoria.globals_manager.get_global(
|
||||
str(result.get_string())
|
||||
)
|
||||
string = string.replace(
|
||||
"{" + result.get_string() + "}", str(globresult)
|
||||
)
|
||||
return string
|
||||
|
||||
|
||||
# Save the state of globals in the savegame.
|
||||
#
|
||||
# #### Parameters
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A manager for inventory objects
|
||||
extends Object
|
||||
extends Resource
|
||||
class_name ESCInventoryManager
|
||||
|
||||
|
||||
@@ -31,11 +31,10 @@ func items_in_inventory() -> Array:
|
||||
# - item: Inventory item id
|
||||
func remove_item(item: String):
|
||||
if not inventory_has(item):
|
||||
escoria.logger.report_errors(
|
||||
"ESCInventoryManager.remove_item: Error removing inventory item",
|
||||
[
|
||||
"Trying to remove non-existent item %s" % item
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Error removing inventory item: " +
|
||||
"Trying to remove non-existent item %s." % item
|
||||
)
|
||||
else:
|
||||
escoria.globals_manager.set_global("i/%s" % item, false)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A manager for ESC objects
|
||||
extends Node
|
||||
extends Resource
|
||||
class_name ESCObjectManager
|
||||
|
||||
|
||||
@@ -69,15 +69,6 @@ func _init() -> void:
|
||||
current_room_key = ESCRoomObjectsKey.new()
|
||||
|
||||
|
||||
# Make active objects in current room visible
|
||||
func _process(_delta):
|
||||
for room in room_objects:
|
||||
if room.is_reserved or _is_current_room(room):
|
||||
for object in room.objects:
|
||||
if (object as ESCObject).node:
|
||||
(object as ESCObject).node.visible = (object as ESCObject).active
|
||||
|
||||
|
||||
# Updates which object manager room is to be treated as the currently active one.
|
||||
#
|
||||
# #### Parameters
|
||||
@@ -85,12 +76,10 @@ func _process(_delta):
|
||||
# - room: Room to register the object with in the object manager
|
||||
func set_current_room(room: ESCRoom) -> void:
|
||||
if room == null:
|
||||
escoria.logger.report_errors(
|
||||
"ESCObjectManager:set_current_room()",
|
||||
[
|
||||
"Unable to set current room: No valid room specified.",
|
||||
"Please pass in a valid ESCRoom as an argument to the method."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Unable to set current room: No room was specified.\n" +
|
||||
"Please pass in a valid ESCRoom as an argument to the method."
|
||||
)
|
||||
|
||||
current_room_key.room_global_id = room.global_id
|
||||
@@ -111,13 +100,11 @@ func register_object(object: ESCObject, room: ESCRoom = null, force: bool = fals
|
||||
if object.global_id.empty():
|
||||
object.global_id = str(object.node.get_path()).split("/root/", false)[0]
|
||||
object.node.global_id = object.global_id
|
||||
escoria.logger.report_warnings(
|
||||
"ESCObjectManager:register_object()",
|
||||
[
|
||||
"Registering ESCObject %s with empty global_id." % object.name,
|
||||
"Using node's full path as global_id: %s"
|
||||
% object.node.global_id
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Registering ESCObject %s with empty global_id." % object.name +
|
||||
"Using node's full path as global_id: %s"
|
||||
% object.node.global_id
|
||||
)
|
||||
|
||||
# If this is a reserved object, let's make sure it's in the right place.
|
||||
@@ -139,28 +126,25 @@ func register_object(object: ESCObject, room: ESCRoom = null, force: bool = fals
|
||||
|
||||
if not room_key.is_valid():
|
||||
# This condition should very likely never happen.
|
||||
escoria.logger.report_errors(
|
||||
"ESCObjectManager:register_object()",
|
||||
[
|
||||
"No room was specified to register object with, and no current room is properly set.",
|
||||
"Please either pass in a valid ESCRoom to this method, or " + \
|
||||
"call set_current_room() with a valid ESCRoom first."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No room was specified to register object with, and no current room is properly set.\n" +
|
||||
"Please either pass in a valid ESCRoom to this method, or " + \
|
||||
"call set_current_room() with a valid ESCRoom first."
|
||||
)
|
||||
else:
|
||||
room_key.room_global_id = room.global_id
|
||||
room_key.room_instance_id = room.get_instance_id()
|
||||
|
||||
if not force and _object_exists_in_room(object, room_key):
|
||||
escoria.logger.report_errors(
|
||||
"ESCObjectManager:register_object()",
|
||||
[
|
||||
"Object with global id %s in room (%s, %s) already registered" %
|
||||
[
|
||||
object.global_id,
|
||||
room_key.room_global_id,
|
||||
room_key.room_instance_id
|
||||
]
|
||||
if not force and _object_exists_in_room(object, room_key) \
|
||||
and _object_state_in_room_is_default(object, room_key):
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Object with global id '%s' in room %s already registered from node path %s."
|
||||
% [
|
||||
object.global_id,
|
||||
room_key.room_global_id,
|
||||
get_object(object.global_id, room).node.get_path()
|
||||
]
|
||||
)
|
||||
return
|
||||
@@ -213,17 +197,15 @@ func register_object(object: ESCObject, room: ESCRoom = null, force: bool = fals
|
||||
# If object state is not STATE_DEFAULT, save it in manager's object states
|
||||
if object.state != ESCObject.STATE_DEFAULT:
|
||||
if get_object(object.global_id) == null:
|
||||
escoria.logger.report_errors(
|
||||
"ESCObjectManager:register_object()",
|
||||
[
|
||||
"Object with global id %s in room (%s, %s) not found in Object Manager" %
|
||||
[
|
||||
object.global_id,
|
||||
room_key.room_global_id,
|
||||
room_key.room_instance_id
|
||||
]
|
||||
]
|
||||
)
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Object with global id %s in room (%s, %s) not found in Object Manager."
|
||||
% [
|
||||
object.global_id,
|
||||
room_key.room_global_id,
|
||||
room_key.room_instance_id
|
||||
]
|
||||
)
|
||||
else:
|
||||
get_object(object.global_id).state = object.state
|
||||
|
||||
@@ -235,7 +217,6 @@ func register_object(object: ESCObject, room: ESCRoom = null, force: bool = fals
|
||||
room_container.room_instance_id = room_key.room_instance_id
|
||||
room_container.is_reserved = false
|
||||
room_container.objects = objects
|
||||
|
||||
room_objects.push_back(room_container)
|
||||
|
||||
|
||||
@@ -256,8 +237,9 @@ func has(global_id: String, room: ESCRoom = null) -> bool:
|
||||
var room_key: ESCRoomObjectsKey
|
||||
|
||||
if room == null:
|
||||
escoria.logger.trace("ESCObjectManager.has(): No room specified." \
|
||||
+ " Defaulting to current room."
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"No room specified. Defaulting to current room."
|
||||
)
|
||||
|
||||
room_key = current_room_key
|
||||
@@ -284,20 +266,19 @@ func get_object(global_id: String, room: ESCRoom = null) -> ESCObject:
|
||||
if reserved_objects_container.objects.has(global_id):
|
||||
return reserved_objects_container.objects[global_id]
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"ESCObjectManager:get_object()",
|
||||
[
|
||||
"Reserved object with global id %s not found in object manager!"
|
||||
% global_id
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Reserved object with global id %s not found in object manager!"
|
||||
% global_id
|
||||
)
|
||||
return null
|
||||
|
||||
var room_key: ESCRoomObjectsKey
|
||||
|
||||
if room == null:
|
||||
escoria.logger.trace("ESCObjectManager.has(): No room specified." \
|
||||
+ " Defaulting to current room."
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"No room specified. Defaulting to current room."
|
||||
)
|
||||
|
||||
room_key = current_room_key
|
||||
@@ -307,13 +288,11 @@ func get_object(global_id: String, room: ESCRoom = null) -> ESCObject:
|
||||
room_key.room_instance_id = room.get_instance_id()
|
||||
|
||||
if not _room_exists(room_key):
|
||||
escoria.logger.report_warnings(
|
||||
"ESCObjectManager:get_object()",
|
||||
[
|
||||
"Specified room is empty/not found.",
|
||||
"Object with global id %s in room instance (%s, %s) not found"
|
||||
% [global_id, room_key.room_global_id, room_key.room_instance_id]
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Specified room is empty/not found.\n" +
|
||||
"Object with global id %s in room instance (%s, %s) not found."
|
||||
% [global_id, room_key.room_global_id, room_key.room_instance_id]
|
||||
)
|
||||
return null
|
||||
|
||||
@@ -322,12 +301,10 @@ func get_object(global_id: String, room: ESCRoom = null) -> ESCObject:
|
||||
if objects.has(global_id):
|
||||
return objects[global_id]
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"ESCObjectManager:get_object()",
|
||||
[
|
||||
"Object with global id %s in room instance (%s, %s) not found"
|
||||
% [global_id, room_key.room_global_id, room_key.room_instance_id]
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Object with global id %s in room instance (%s, %s) not found."
|
||||
% [global_id, room_key.room_global_id, room_key.room_instance_id]
|
||||
)
|
||||
return null
|
||||
|
||||
@@ -344,23 +321,22 @@ func unregister_object(object: ESCObject, room_key: ESCRoomObjectsKey) -> void:
|
||||
# called as part of an objectd's forced registration and the object not
|
||||
# yet being managed.
|
||||
escoria.logger.debug(
|
||||
"ESCObjectManager:unregister_object(): Unable to unregister object.",
|
||||
[
|
||||
"Object with global ID %s room (%s, %s) not found. If this was" %
|
||||
[
|
||||
"?" if object == null else object.global_id,
|
||||
room_key.room_global_id,
|
||||
room_key.room_instance_id
|
||||
],
|
||||
"part of a 'forced' registration, ignore this warning."
|
||||
]
|
||||
self,
|
||||
"Unable to unregister object.\n" +
|
||||
"Object with global ID %s room (%s, %s) not found. If this was "
|
||||
% [
|
||||
"?" if object == null else object.global_id,
|
||||
room_key.room_global_id,
|
||||
room_key.room_instance_id
|
||||
] +
|
||||
"part of a 'forced' registration, ignore this warning."
|
||||
)
|
||||
|
||||
return
|
||||
|
||||
var room_objects = _get_room_objects_objects(room_key)
|
||||
|
||||
if escoria.inventory_manager.inventory_has(object.global_id):
|
||||
if not escoria.is_quitting and escoria.inventory_manager.inventory_has(object.global_id):
|
||||
# Re-instance the node if it is an item present in inventory; that is,
|
||||
# re-register it with the new current room.
|
||||
if object.node != null:
|
||||
@@ -393,11 +369,9 @@ func unregister_object_by_global_id(global_id: String, room_key: ESCRoomObjectsK
|
||||
# - p_savegame: The savegame resource
|
||||
func save_game(p_savegame: ESCSaveGame) -> void:
|
||||
if not current_room_key.is_valid() or not _room_exists(current_room_key):
|
||||
escoria.logger.report_errors(
|
||||
"ESCObjectManager:save_game()",
|
||||
[
|
||||
"No current room specified or found."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No current room specified or found."
|
||||
)
|
||||
|
||||
var objects: Dictionary = _get_room_objects_objects(current_room_key)
|
||||
@@ -430,13 +404,11 @@ func get_start_location() -> ESCLocation:
|
||||
and object.node.is_start_location:
|
||||
return object
|
||||
|
||||
escoria.logger.report_warnings(
|
||||
"ESCObjectManager:get_start_location()",
|
||||
[
|
||||
"Room has no ESCLocation node with 'is_start_location' enabled.",
|
||||
"Player will be set at position (0,0) by default."
|
||||
]
|
||||
)
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Room has no ESCLocation node with 'is_start_location' enabled. " +
|
||||
"Player will be set at position (0,0)."
|
||||
)
|
||||
return null
|
||||
|
||||
|
||||
@@ -486,11 +458,9 @@ func _room_exists(room_key: ESCRoomObjectsKey) -> bool:
|
||||
# **Returns** True iff object exists in the object manager entry specified by room_key.
|
||||
func _object_exists_in_room(object: ESCObject, room_key: ESCRoomObjectsKey) -> bool:
|
||||
if object == null:
|
||||
escoria.logger.report_warnings(
|
||||
"ESCObjectManager:_object_exists_in_room()",
|
||||
[
|
||||
"Cannot check for null objects."
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Cannot check room for \"null\" objects."
|
||||
)
|
||||
|
||||
return false
|
||||
@@ -503,6 +473,30 @@ func _object_exists_in_room(object: ESCObject, room_key: ESCRoomObjectsKey) -> b
|
||||
return false
|
||||
|
||||
|
||||
# Checks whether the specified object's state is "default" in the specified object manager entry.
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# - object: The object to check for existence.
|
||||
# - room_key: The key representing the desired room in the object manager array.
|
||||
# **Returns** True if object's state is "default" in the object manager entry specified by room_key.
|
||||
func _object_state_in_room_is_default(object: ESCObject, room_key: ESCRoomObjectsKey) -> bool:
|
||||
if object == null:
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Cannot check room for \"null\" objects."
|
||||
)
|
||||
|
||||
return false
|
||||
|
||||
for room_container in room_objects:
|
||||
if _compare_container_to_key(room_container, room_key) \
|
||||
and room_container.objects.get(object.global_id).state == ESCObject.STATE_DEFAULT:
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
|
||||
# Returns the objects currently being managed in the object manager entry specified
|
||||
# by the specified room key.
|
||||
#
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extends Object
|
||||
extends Resource
|
||||
class_name ESCRoomManager
|
||||
|
||||
|
||||
@@ -86,14 +86,12 @@ func change_scene(room_path: String, enable_automatic_transitions: bool) -> void
|
||||
|
||||
# Check if game scene was loaded
|
||||
if not escoria.game_scene:
|
||||
escoria.logger.report_errors(
|
||||
"ESCRoomManager.change_scene: Failed loading game scene",
|
||||
[
|
||||
"Failed loading scene %s" % \
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_SCENE
|
||||
)
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Failed loading game scene %s." % \
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE
|
||||
)
|
||||
)
|
||||
|
||||
if escoria.main.current_scene \
|
||||
@@ -106,9 +104,12 @@ func change_scene(room_path: String, enable_automatic_transitions: bool) -> void
|
||||
var room_scene = res_room.instance()
|
||||
if room_scene:
|
||||
if enable_automatic_transitions \
|
||||
and escoria.event_manager.get_running_event(escoria.event_manager.CHANNEL_FRONT) != null \
|
||||
and escoria.event_manager.get_running_event(escoria.event_manager.CHANNEL_FRONT).name \
|
||||
== escoria.event_manager.EVENT_ROOM_SELECTOR:
|
||||
and escoria.event_manager.get_running_event(
|
||||
escoria.event_manager.CHANNEL_FRONT
|
||||
) != null \
|
||||
and escoria.event_manager.get_running_event(
|
||||
escoria.event_manager.CHANNEL_FRONT
|
||||
).name == escoria.event_manager.EVENT_ROOM_SELECTOR:
|
||||
room_scene.enabled_automatic_transitions = true
|
||||
else:
|
||||
room_scene.enabled_automatic_transitions = enable_automatic_transitions
|
||||
@@ -138,11 +139,9 @@ func change_scene(room_path: String, enable_automatic_transitions: bool) -> void
|
||||
|
||||
escoria.inputs_manager.hotspot_focused = ""
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"ESCRoomManager.change_scene: Failed loading room scene",
|
||||
[
|
||||
"Failed loading scene %s" % room_path
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Failed loading room scene %s." % room_path
|
||||
)
|
||||
|
||||
|
||||
@@ -154,11 +153,9 @@ func change_scene(room_path: String, enable_automatic_transitions: bool) -> void
|
||||
# - room: The ESCRoom to be initialized for use.
|
||||
func init_room(room: ESCRoom) -> void:
|
||||
if not is_instance_valid(room) || room == null:
|
||||
escoria.logger.report_errors(
|
||||
"ESCRoomManager.init_room: No valid room specified",
|
||||
[
|
||||
"No valid room was specified for initialization."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No valid room was specified for initialization."
|
||||
)
|
||||
|
||||
if room.camera_limits.empty():
|
||||
@@ -189,12 +186,11 @@ func init_room(room: ESCRoom) -> void:
|
||||
# player by the same number of pixels when they're at the terrain edge and
|
||||
# move them when it shouldn't.
|
||||
if room.position != Vector2(0,0):
|
||||
escoria.logger.report_errors(
|
||||
"ESCRoomManager.init_room: Room node not at (0,0)",
|
||||
[
|
||||
"The room node's coordinates must be (0,0) instead of %s." % room.position
|
||||
]
|
||||
)
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"The room node's coordinates must be (0,0) instead of %s."
|
||||
% room.position
|
||||
)
|
||||
|
||||
_perform_script_events(room)
|
||||
|
||||
@@ -217,8 +213,8 @@ func _perform_script_events(room: ESCRoom) -> void:
|
||||
"%s %s out" %
|
||||
[
|
||||
_transition.get_command_name(),
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DEFAULT_TRANSITION
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_TRANSITION
|
||||
)
|
||||
],
|
||||
"%s 0.1" % _wait.get_command_name()
|
||||
@@ -286,7 +282,9 @@ func _perform_script_events(room: ESCRoom) -> void:
|
||||
escoria.main.finish_current_scene_init(room)
|
||||
|
||||
# Add new camera to scene being prepared.
|
||||
var new_player_camera: ESCCamera = escoria.resource_cache.get_resource(escoria.CAMERA_SCENE_PATH).instance()
|
||||
var new_player_camera: ESCCamera = escoria.resource_cache.get_resource(
|
||||
escoria.CAMERA_SCENE_PATH
|
||||
).instance()
|
||||
new_player_camera.register()
|
||||
room.player_camera = new_player_camera
|
||||
|
||||
@@ -360,8 +358,8 @@ func _perform_script_events(room: ESCRoom) -> void:
|
||||
command_strings.append("%s %s in" %
|
||||
[
|
||||
_transition.get_command_name(),
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DEFAULT_TRANSITION
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_TRANSITION
|
||||
)
|
||||
]
|
||||
)
|
||||
@@ -432,12 +430,10 @@ func _run_script_event(event_name: String, room: ESCRoom):
|
||||
|
||||
if room.compiled_script.events.has(event_name):
|
||||
escoria.logger.debug(
|
||||
"esc_room:_run_script_event",
|
||||
[
|
||||
"Queuing room script event %s" % event_name,
|
||||
"Composed of %s statements" %
|
||||
room.compiled_script.events[event_name].statements.size()
|
||||
]
|
||||
self,
|
||||
"Queuing room script event %s " % event_name +
|
||||
"composed of %s statements."
|
||||
% room.compiled_script.events[event_name].statements.size()
|
||||
)
|
||||
escoria.event_manager.queue_event(room.compiled_script.events[event_name], true)
|
||||
return true
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# A base class for every ESC command.
|
||||
# Extending classes have to override the configure and run function
|
||||
extends Node
|
||||
extends Resource
|
||||
class_name ESCBaseCommand
|
||||
|
||||
|
||||
@@ -22,7 +22,10 @@ func _init() -> void:
|
||||
|
||||
# Return the descriptor of the arguments of this command
|
||||
func configure() -> ESCCommandArgumentDescriptor:
|
||||
escoria.logger.error("Command %s did not override configure." % get_command_name())
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Command %s did not override configure. Please implement a configure() function." % get_command_name()
|
||||
)
|
||||
return ESCCommandArgumentDescriptor.new()
|
||||
|
||||
|
||||
@@ -33,7 +36,10 @@ func validate(arguments: Array) -> bool:
|
||||
|
||||
# Run the command
|
||||
func run(command_params: Array) -> int:
|
||||
escoria.logger.error("Command %s did not override run." % get_command_name())
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Command %s did not override run. Please implement a run() function." % get_command_name()
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -44,4 +50,7 @@ func get_command_name() -> String:
|
||||
|
||||
# Function called when the command is interrupted.
|
||||
func interrupt():
|
||||
escoria.logger.trace("Command %s did not override interrupt." % get_command_name())
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Command %s did not override interrupt. Please implement an interrupt() function." % get_command_name()
|
||||
)
|
||||
|
||||
@@ -28,15 +28,15 @@ func _init(command_string):
|
||||
if command_regex.search(command_string):
|
||||
for result in command_regex.search_all(command_string):
|
||||
if "name" in result.names:
|
||||
self.name = escoria.utils.get_re_group(result, "name")
|
||||
self.name = ESCUtils.get_re_group(result, "name")
|
||||
if "parameters" in result.names:
|
||||
# Split parameters by whitespace but allow quoted
|
||||
# parameters
|
||||
var quote_open = false
|
||||
var parameter_values = PoolStringArray([])
|
||||
var parsed_parameters = \
|
||||
escoria.utils.sanitize_whitespace(
|
||||
escoria.utils.get_re_group(
|
||||
ESCUtils.sanitize_whitespace(
|
||||
ESCUtils.get_re_group(
|
||||
result,
|
||||
"parameters"
|
||||
).strip_edges()
|
||||
@@ -66,7 +66,7 @@ func _init(command_string):
|
||||
else:
|
||||
parameters.append(parameter)
|
||||
if "conditions" in result.names:
|
||||
for condition in escoria.utils.get_re_group(
|
||||
for condition in ESCUtils.get_re_group(
|
||||
result,
|
||||
"conditions"
|
||||
).split(","):
|
||||
@@ -74,22 +74,20 @@ func _init(command_string):
|
||||
ESCCondition.new(condition.strip_edges())
|
||||
)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"Invalid command detected: %s" % command_string,
|
||||
[
|
||||
"Command regexp didn't match"
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid command detected: %s\nCommand regexp didn't match."
|
||||
% command_string
|
||||
)
|
||||
|
||||
|
||||
# Check, if conditions match
|
||||
func is_valid() -> bool:
|
||||
if not command_exists():
|
||||
escoria.logger.report_errors(
|
||||
"Invalid command detected: %s" % self.name,
|
||||
[
|
||||
"Command implementation not found in any command directory"
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid command detected: %s" % self.name +
|
||||
"Command implementation not found in any command directory."
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -100,8 +98,8 @@ func is_valid() -> bool:
|
||||
#
|
||||
# *Returns* True if the command exists, else false.
|
||||
func command_exists() -> bool:
|
||||
for base_path in escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.COMMAND_DIRECTORIES
|
||||
for base_path in ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.COMMAND_DIRECTORIES
|
||||
):
|
||||
var command_path = "%s/%s.gd" % [
|
||||
base_path.trim_suffix("/"),
|
||||
@@ -124,14 +122,18 @@ func run() -> int:
|
||||
)
|
||||
|
||||
if command_object.validate(prepared_arguments):
|
||||
escoria.logger.debug("Running command %s with parameters %s" % [
|
||||
self.name,
|
||||
prepared_arguments
|
||||
])
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Running command %s with parameters %s."
|
||||
% [self.name, prepared_arguments]
|
||||
)
|
||||
var rc = command_object.run(prepared_arguments)
|
||||
if rc is GDScriptFunctionState:
|
||||
rc = yield(rc, "completed")
|
||||
escoria.logger.debug("[%s] Return code: %d" % [self.name, rc])
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"[%s] Return code: %d." % [self.name, rc]
|
||||
)
|
||||
return rc
|
||||
else:
|
||||
return ESCExecution.RC_ERROR
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# The descriptor of the arguments of an ESC command
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCCommandArgumentDescriptor
|
||||
|
||||
# As the get_type command was deprecated with Godot 2.x w we need a way to determine
|
||||
@@ -71,7 +71,7 @@ func prepare_arguments(arguments: Array) -> Array:
|
||||
# appear at the very end of a command's argument list.
|
||||
varargs.append(arguments[index])
|
||||
else:
|
||||
complete_arguments[index] = escoria.utils.get_typed_value(
|
||||
complete_arguments[index] = ESCUtils.get_typed_value(
|
||||
arguments[index],
|
||||
types[index]
|
||||
)
|
||||
@@ -98,22 +98,20 @@ func validate(command: String, arguments: Array) -> bool:
|
||||
if required_args_count < min_args:
|
||||
var verb = "was" if required_args_count == 1 else "were"
|
||||
|
||||
escoria.logger.report_errors(
|
||||
"ESCCommandArgumentDescriptor:validate()",
|
||||
[
|
||||
"Invalid arguments for command %s" % command,
|
||||
"Arguments didn't match minimum size {num}: Only {args} {verb} found" \
|
||||
.format({"num":self.min_args,"args":required_args_count,"verb":verb})
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid arguments for command %s. " % command +
|
||||
"Arguments didn't match minimum size {num}: Only {args} {verb} found." \
|
||||
.format({"num":self.min_args,"args":required_args_count,"verb":verb})
|
||||
)
|
||||
|
||||
if arguments.size() > self.max_args and not has_varargs:
|
||||
escoria.logger.report_errors(
|
||||
"ESCCommandArgumentDescriptor:validate()",
|
||||
[
|
||||
"Invalid arguments for command %s" % command,
|
||||
"Maximum number of arguments ({num}) exceeded: {args}".format({"num":self.max_args,"args":arguments})
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid arguments for command %s" % command +
|
||||
"Maximum number of arguments ({num}) exceeded: {args}.".format(
|
||||
{"num":self.max_args,"args":arguments}
|
||||
)
|
||||
)
|
||||
|
||||
for index in range(arguments.size()):
|
||||
@@ -140,17 +138,17 @@ func validate(command: String, arguments: Array) -> bool:
|
||||
for type in self.types[types_index]:
|
||||
allowed_types += GODOT_TYPE_LIST[type] + " or "
|
||||
allowed_types = allowed_types.substr(0, allowed_types.length() - 3) + "]"
|
||||
escoria.logger.report_errors(
|
||||
"Argument type did not match descriptor for command \"%s\"" %
|
||||
command,
|
||||
[
|
||||
"Argument %d (\"%s\") is of type %s. Expected %s" % [
|
||||
index,
|
||||
arguments[index],
|
||||
GODOT_TYPE_LIST[typeof(arguments[index])],
|
||||
allowed_types
|
||||
]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Argument type did not match descriptor for command \"%s\"\n"
|
||||
% command +
|
||||
"Argument %d (\"%s\") is of type %s. Expected %s."
|
||||
% [
|
||||
index,
|
||||
arguments[index],
|
||||
GODOT_TYPE_LIST[typeof(arguments[index])],
|
||||
allowed_types
|
||||
]
|
||||
)
|
||||
return true
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A condition to run a command
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCCondition
|
||||
|
||||
|
||||
@@ -56,24 +56,24 @@ func _init(comparison_string: String):
|
||||
if "is_negated" in result.names:
|
||||
self.negated = true
|
||||
if "comparison" in result.names:
|
||||
match escoria.utils.get_re_group(result, "comparison"):
|
||||
match ESCUtils.get_re_group(result, "comparison"):
|
||||
"eq": self.comparison = COMPARISON_EQ
|
||||
"gt": self.comparison = COMPARISON_GT
|
||||
"lt": self.comparison = COMPARISON_LT
|
||||
_: escoria.logger.report_errors(
|
||||
"Invalid comparison type detected: %s" %
|
||||
comparison_string,
|
||||
[
|
||||
_:
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid comparison type detected: %s" %
|
||||
comparison_string +
|
||||
"Comparison type %s unknown" %
|
||||
escoria.utils.get_re_group(
|
||||
ESCUtils.get_re_group(
|
||||
result,
|
||||
"comparison"
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
if "comparison_value" in result.names:
|
||||
self.comparison_value = escoria.utils.get_typed_value(
|
||||
escoria.utils.get_re_group(
|
||||
self.comparison_value = ESCUtils.get_typed_value(
|
||||
ESCUtils.get_re_group(
|
||||
result,
|
||||
"comparison_value"
|
||||
)
|
||||
@@ -83,13 +83,12 @@ func _init(comparison_string: String):
|
||||
if "is_activity" in result.names:
|
||||
self.comparison = COMPARISON_ACTIVITY
|
||||
if "flag" in result.names:
|
||||
self.flag = escoria.utils.get_re_group(result, "flag")
|
||||
self.flag = ESCUtils.get_re_group(result, "flag")
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"Invalid comparison detected: %s" % comparison_string,
|
||||
[
|
||||
"Comparison regexp didn't match"
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid comparison detected: %s\nComparison regexp didn't match."
|
||||
% comparison_string
|
||||
)
|
||||
|
||||
|
||||
@@ -98,6 +97,7 @@ func run() -> bool:
|
||||
var global_name = self.flag
|
||||
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
COMPARISON_DESCRIPTION[self.comparison] % [
|
||||
"inventory item" if self.inventory else "global value",
|
||||
self.flag,
|
||||
@@ -138,6 +138,7 @@ func run() -> bool:
|
||||
return_value = not return_value
|
||||
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"It is" if return_value else "It isn't"
|
||||
)
|
||||
|
||||
|
||||
@@ -38,37 +38,36 @@ func load_string(dialog_string: String):
|
||||
if dialog_regex.search(dialog_string):
|
||||
for result in dialog_regex.search_all(dialog_string):
|
||||
if "avatar" in result.names:
|
||||
self.avatar = escoria.utils.get_re_group(result, "avatar")
|
||||
self.avatar = ESCUtils.get_re_group(result, "avatar")
|
||||
if "timeout" in result.names:
|
||||
self.timeout = int(
|
||||
escoria.utils.get_re_group(result, "timeout")
|
||||
ESCUtils.get_re_group(result, "timeout")
|
||||
)
|
||||
if "timeout_option" in result.names:
|
||||
self.timeout_option = int(
|
||||
escoria.utils.get_re_group(result, "timeout_option")
|
||||
ESCUtils.get_re_group(result, "timeout_option")
|
||||
)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"Invalid dialog detected: %s" % dialog_string,
|
||||
[
|
||||
"Dialog regexp didn't match"
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid dialog detected: %s\nDialog regexp didn't match."
|
||||
% dialog_string
|
||||
)
|
||||
|
||||
|
||||
# Check if dialog is valid
|
||||
func is_valid() -> bool:
|
||||
if self.avatar != "-" and not ResourceLoader.exists(self.avatar):
|
||||
escoria.logger.report_errors(
|
||||
"Avatar scene not found: %s" % self.avatar,
|
||||
[]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Avatar scene not found: %s." % self.avatar
|
||||
)
|
||||
return false
|
||||
if self.timeout_option > self.options.size() \
|
||||
or self.timeout_option < 0:
|
||||
escoria.logger.report_errors(
|
||||
"Invalid timeout_option parameter given: %d" % self.timeout_option,
|
||||
[]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid timeout_option parameter given: %d." % self.timeout_option
|
||||
)
|
||||
return false
|
||||
|
||||
@@ -77,7 +76,10 @@ func is_valid() -> bool:
|
||||
|
||||
# Run this dialog
|
||||
func run():
|
||||
escoria.logger.debug("Starting dialog")
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Starting dialog."
|
||||
)
|
||||
escoria.current_state = escoria.GAME_STATE.DIALOG
|
||||
if !escoria.dialog_player:
|
||||
escoria.dialog_player = escoria.main.current_scene.get_node(
|
||||
|
||||
@@ -30,13 +30,13 @@ func load_string(option_string: String):
|
||||
var _trans_key = ""
|
||||
if "trans_key" in result.names:
|
||||
_trans_key = "%s:" % \
|
||||
escoria.utils.get_re_group(result, "trans_key")
|
||||
ESCUtils.get_re_group(result, "trans_key")
|
||||
self.option = "%s%s" % [
|
||||
_trans_key,
|
||||
escoria.utils.get_re_group(result, "option")
|
||||
ESCUtils.get_re_group(result, "option")
|
||||
]
|
||||
if "conditions" in result.names:
|
||||
for condition_text in escoria.utils.get_re_group(
|
||||
for condition_text in ESCUtils.get_re_group(
|
||||
result,
|
||||
"conditions"
|
||||
).split(","):
|
||||
@@ -44,11 +44,10 @@ func load_string(option_string: String):
|
||||
ESCCondition.new(condition_text.strip_edges())
|
||||
)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"Invalid dialog option detected: %s" % option_string,
|
||||
[
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid dialog option detected: %s." % option_string,
|
||||
"Dialog option regexp didn't match"
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -60,10 +60,10 @@ func _init(event_string: String):
|
||||
if event_regex.search(event_string):
|
||||
for result in event_regex.search_all(event_string):
|
||||
if "name" in result.names:
|
||||
self.name = escoria.utils.get_re_group(result, "name") \
|
||||
self.name = ESCUtils.get_re_group(result, "name") \
|
||||
.strip_edges()
|
||||
if "flags" in result.names:
|
||||
var _flags = escoria.utils.get_re_group(
|
||||
var _flags = ESCUtils.get_re_group(
|
||||
result,
|
||||
"flags"
|
||||
).strip_edges().split(" ")
|
||||
@@ -76,17 +76,19 @@ func _init(event_string: String):
|
||||
if "NO_SAVE" in _flags:
|
||||
self.flags |= FLAG_NO_SAVE
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"Invalid event detected: %s" % event_string,
|
||||
[
|
||||
"Event regexp didn't match"
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid event detected: %s\nEvent regexp didn't match."
|
||||
% event_string
|
||||
)
|
||||
|
||||
|
||||
# Execute this statement and return its return code
|
||||
func run() -> int:
|
||||
reset_interrupt()
|
||||
escoria.logger.debug("Event %s started" % name)
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Event %s started." % name
|
||||
)
|
||||
return .run()
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Basic features and informations about ESC executions
|
||||
extends Object
|
||||
extends Resource
|
||||
class_name ESCExecution
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ func _init(group_string: String):
|
||||
if group_regex.search(group_string):
|
||||
for result in group_regex.search_all(group_string):
|
||||
if "conditions" in result.names:
|
||||
for condition in escoria.utils.get_re_group(
|
||||
for condition in ESCUtils.get_re_group(
|
||||
result,
|
||||
"conditions"
|
||||
).split(","):
|
||||
@@ -28,9 +28,8 @@ func _init(group_string: String):
|
||||
ESCCondition.new(condition.strip_edges())
|
||||
)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"Invalid group detected: %s" % group_string,
|
||||
[
|
||||
"Group regexp didn't match"
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Invalid group detected: %s\nGroup regexp didn't match."
|
||||
% group_string
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
extends Reference
|
||||
# An object handled in Escoria
|
||||
extends Node
|
||||
class_name ESCObject
|
||||
|
||||
|
||||
@@ -50,23 +50,23 @@ func set_state(p_state: String, immediate: bool = false):
|
||||
if animation_node.has_animation(p_state):
|
||||
if immediate:
|
||||
escoria.logger.debug(
|
||||
"State \"%s\" set. Matching immediate animation executing." % [
|
||||
p_state
|
||||
]
|
||||
self,
|
||||
"State \"%s\" set. Matching immediate animation executing."
|
||||
% p_state
|
||||
)
|
||||
animation_node.seek_end(p_state)
|
||||
else:
|
||||
escoria.logger.debug(
|
||||
"State \"%s\" set. Matching non-immediate animation executing." % [
|
||||
p_state
|
||||
]
|
||||
self,
|
||||
"State \"%s\" set. Matching non-immediate animation executing."
|
||||
% p_state
|
||||
)
|
||||
animation_node.play(p_state)
|
||||
else:
|
||||
escoria.logger.debug(
|
||||
"State \"%s\" set. No matching animation found." % [
|
||||
p_state
|
||||
]
|
||||
self,
|
||||
"State \"%s\" set. No matching animation found."
|
||||
% p_state
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# An event that is scheduled to run later
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCScheduledEvent
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A compiled ESC script
|
||||
extends Object
|
||||
extends Resource
|
||||
class_name ESCScript
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A statement in an ESC file
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCStatement
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ class_name ESCStatement
|
||||
signal finished(event, return_code)
|
||||
|
||||
# Emitted when the event was interrupted
|
||||
signal interrupted(return_code)
|
||||
signal interrupted(event, return_code)
|
||||
|
||||
|
||||
# The list of ESC commands
|
||||
@@ -35,7 +35,7 @@ func run() -> int:
|
||||
if _is_interrupted:
|
||||
final_rc = ESCExecution.RC_INTERRUPTED
|
||||
statement.interrupt()
|
||||
emit_signal("interrupted", final_rc)
|
||||
emit_signal("interrupted", self, final_rc)
|
||||
return final_rc
|
||||
|
||||
if statement.is_valid():
|
||||
@@ -43,9 +43,8 @@ func run() -> int:
|
||||
if rc is GDScriptFunctionState:
|
||||
rc = yield(rc, "completed")
|
||||
escoria.logger.debug(
|
||||
"esc_statement",
|
||||
["Statement (%s) was completed."
|
||||
% statement]
|
||||
self,
|
||||
"Statement (%s) was completed." % statement
|
||||
)
|
||||
if rc == ESCExecution.RC_REPEAT:
|
||||
return self.run()
|
||||
@@ -59,11 +58,10 @@ func run() -> int:
|
||||
|
||||
# Interrupt the statement in the middle of its execution.
|
||||
func interrupt():
|
||||
escoria.logger.info("Interrupting event %s (%s)" % \
|
||||
[
|
||||
self.name if "name" in self else "group",
|
||||
str(self)
|
||||
]
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Interrupting event %s (%s)."
|
||||
% [self.name if "name" in self else "group", str(self)]
|
||||
)
|
||||
_is_interrupted = true
|
||||
for statement in statements:
|
||||
|
||||
@@ -96,7 +96,7 @@ func _ready():
|
||||
|
||||
# Handle debugging visualizations
|
||||
func _draw():
|
||||
if !Engine.is_editor_hint():
|
||||
if not Engine.is_editor_hint():
|
||||
return
|
||||
if editor_debug_mode == EDITOR_GAME_DEBUG_DISPLAY.NONE:
|
||||
return
|
||||
@@ -131,12 +131,9 @@ func do_walk(destination, params: Array = [], can_interrupt: bool = false) -> vo
|
||||
|
||||
# Check moving object.
|
||||
if not escoria.object_manager.has(params[0]):
|
||||
escoria.logger.report_errors(
|
||||
"esc_game.gd:do_walk()",
|
||||
[
|
||||
"Walk action requested on nonexisting " + \
|
||||
"object: %s " % params[0]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Walk action requested on nonexisting object: %s." % params[0]
|
||||
)
|
||||
return
|
||||
|
||||
@@ -145,12 +142,9 @@ func do_walk(destination, params: Array = [], can_interrupt: bool = false) -> vo
|
||||
|
||||
if destination is String:
|
||||
if not escoria.object_manager.has(destination):
|
||||
escoria.logger.report_errors(
|
||||
"esc_game.gd:do_walk()",
|
||||
[
|
||||
"Walk action requested to nonexisting " + \
|
||||
"object: %s " % destination
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Walk action requested to nonexisting object: %s." % destination
|
||||
)
|
||||
return
|
||||
|
||||
@@ -436,8 +430,8 @@ func show_crash_popup(files: Array = []) -> void:
|
||||
var files_to_send: String = ""
|
||||
for file in files:
|
||||
files_to_send += "- %s\n" % file
|
||||
crash_popup.dialog_text = tr(escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.CRASH_MESSAGE)
|
||||
crash_popup.dialog_text = tr(ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.CRASH_MESSAGE)
|
||||
) % files_to_send
|
||||
crash_popup.popup_centered()
|
||||
escoria.set_game_paused(true)
|
||||
@@ -451,9 +445,9 @@ func escoria_hide_ui():
|
||||
if ui_parent_control_node != null and not ui_parent_control_node.is_empty():
|
||||
(get_node(ui_parent_control_node) as Control).visible = false
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"esc_game.gd#escoria_hide_ui",
|
||||
["UI parent Control node not defined!"]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"UI parent Control node not defined!"
|
||||
)
|
||||
|
||||
|
||||
@@ -463,9 +457,9 @@ func escoria_show_ui():
|
||||
if ui_parent_control_node != null and not ui_parent_control_node.is_empty():
|
||||
(get_node(ui_parent_control_node) as Control).visible = true
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"esc_game.gd#escoria_show_ui",
|
||||
["UI parent Control node not defined!"]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"UI parent Control node not defined!"
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -323,7 +323,10 @@ func _unhandled_input(input_event: InputEvent) -> void:
|
||||
|
||||
if event is InputEventMouseButton and event.is_pressed():
|
||||
if not escoria.current_state == escoria.GAME_STATE.DEFAULT:
|
||||
escoria.logger.info("Game state doesn't accept interactions")
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Current game state doesn't accept interactions."
|
||||
)
|
||||
return
|
||||
var p = get_global_mouse_position()
|
||||
if _is_in_shape(p):
|
||||
@@ -367,8 +370,9 @@ func get_animation_player() -> Node:
|
||||
child is AnimationPlayer:
|
||||
player_node_path = child.get_path()
|
||||
if not has_node(player_node_path):
|
||||
escoria.logger.warning(
|
||||
"Can not find node at path %s" % player_node_path
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Can not find animation_player node at path %s for %s." % [player_node_path, global_id]
|
||||
)
|
||||
else:
|
||||
_animation_player = ESCAnimationPlayer.new(
|
||||
@@ -394,7 +398,9 @@ func get_interact_position() -> Vector2:
|
||||
interact_position = collision.global_position
|
||||
|
||||
if multiple_positions_found:
|
||||
escoria.logger.warning("Multiple ESClocations found to walk to for object " +
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Multiple ESClocations found to walk to for object " +
|
||||
"%s. Last one will be used." % global_id)
|
||||
return interact_position
|
||||
|
||||
@@ -500,7 +506,8 @@ func get_sprite() -> Node:
|
||||
_sprite_node = child
|
||||
if _sprite_node == null:
|
||||
escoria.logger.error(
|
||||
"No sprite node found in the scene %s" % get_path()
|
||||
self,
|
||||
"No sprite node found in the scene %s." % get_path()
|
||||
)
|
||||
return _sprite_node
|
||||
|
||||
@@ -579,7 +586,11 @@ func update_idle():
|
||||
# global position of the player
|
||||
func get_camera_node():
|
||||
if has_node(camera_node):
|
||||
escoria.logger.debug("Camera node found - directing camera to the camera_node on " + global_id)
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Camera node found - directing camera to the camera_node on %s."
|
||||
% global_id
|
||||
)
|
||||
return get_node(camera_node)
|
||||
return self
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A cache for resources
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCResourceCache
|
||||
|
||||
var thread: Thread
|
||||
@@ -138,7 +138,7 @@ func get_resource(path):
|
||||
return res
|
||||
else:
|
||||
_unlock("return")
|
||||
# We can't use escoria.project_settings_manager here since this method
|
||||
# We can't use ESCProjectSettingsManager here since this method
|
||||
# can be called from escoria._init()
|
||||
if not ProjectSettings.get_setting("escoria/platform/skip_cache"):
|
||||
var res = ResourceLoader.load(path)
|
||||
|
||||
@@ -60,7 +60,10 @@ func _enter_tree():
|
||||
# name of this node if it's not set manually
|
||||
func _ready():
|
||||
# Might as well just check here.
|
||||
if get_parent() == get_tree().root and ProjectSettings.get_setting("application/run/main_scene") != self.filename:
|
||||
if get_parent() == get_tree().root \
|
||||
and ESCProjectSettingsManager.get_setting(
|
||||
"application/run/main_scene"
|
||||
) != self.filename:
|
||||
is_run_directly = true
|
||||
|
||||
escoria.room_manager.init_room(self)
|
||||
@@ -85,7 +88,9 @@ func _draw():
|
||||
# Draw lines for camera limits
|
||||
for i in camera_limits.size():
|
||||
draw_rect(camera_limits[i], camera_limits_colors[i], false, 10.0)
|
||||
var default_font = Control.new().get_font("font")
|
||||
var temp_control = Control.new()
|
||||
var default_font = temp_control.get_font("font")
|
||||
temp_control.queue_free()
|
||||
|
||||
draw_string(default_font, Vector2(camera_limits[i].position.x + 30,
|
||||
camera_limits[i].position.y + 30), str(i), camera_limits_colors[i])
|
||||
|
||||
@@ -64,20 +64,16 @@ func _ready():
|
||||
if n is NavigationPolygonInstance:
|
||||
if n.enabled:
|
||||
if !Engine.is_editor_hint() and navigation_enabled_found:
|
||||
escoria.logger.report_errors(
|
||||
"ESCTerrain:_ready()",
|
||||
[
|
||||
"Multiple NavigationPolygonInstances enabled " + \
|
||||
"at the same time."
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Multiple NavigationPolygonInstances enabled " + \
|
||||
"at the same time."
|
||||
)
|
||||
elif Engine.is_editor_hint():
|
||||
escoria.logger.report_warnings(
|
||||
"ESCTerrain:_ready()",
|
||||
[
|
||||
"Multiple NavigationPolygonInstances enabled " + \
|
||||
"at the same time."
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Multiple NavigationPolygonInstances enabled " + \
|
||||
"at the same time."
|
||||
)
|
||||
navigation_enabled_found = true
|
||||
current_active_navigation_instance = n
|
||||
|
||||
@@ -85,6 +85,7 @@ func set_debug_mode(p_debug_mode: bool):
|
||||
else:
|
||||
if debug_texturerect_node:
|
||||
remove_child(debug_texturerect_node)
|
||||
debug_texturerect_node.queue_free()
|
||||
|
||||
|
||||
# Set the first target of the label.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# The walk context describes the target of a walk command and if that command
|
||||
# should be executed fast
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCWalkContext
|
||||
|
||||
|
||||
|
||||
@@ -1,325 +0,0 @@
|
||||
# Logging framework for Escoria
|
||||
extends Object
|
||||
class_name ESCLogger
|
||||
|
||||
# Log file format
|
||||
const LOG_FILE_FORMAT: String = "log_%s_%s.log"
|
||||
|
||||
|
||||
# The path of the ESC file that was reported last (used for removing
|
||||
# duplicate warnings
|
||||
var warning_path: String
|
||||
|
||||
# Log file handler
|
||||
var log_file: File
|
||||
|
||||
# Crash save filename
|
||||
var crash_savegame_filename
|
||||
|
||||
# Did we crash already?
|
||||
onready var crashed = false
|
||||
|
||||
# Valid log levels
|
||||
enum { LOG_ERROR, LOG_WARNING, LOG_INFO, LOG_DEBUG, LOG_TRACE }
|
||||
|
||||
|
||||
# A map of log level names to log level ints
|
||||
var _level_map: Dictionary = {
|
||||
"ERROR": LOG_ERROR,
|
||||
"WARNING": LOG_WARNING,
|
||||
"INFO": LOG_INFO,
|
||||
"DEBUG": LOG_DEBUG,
|
||||
"TRACE": LOG_TRACE,
|
||||
}
|
||||
|
||||
|
||||
# Logger constructor
|
||||
func _init():
|
||||
# Open logfile in write mode
|
||||
log_file = File.new()
|
||||
|
||||
# this is left alone as this constructor is called from escoria.gd's own
|
||||
# constructor
|
||||
var log_file_path = ProjectSettings.get_setting(
|
||||
"escoria/debug/log_file_path"
|
||||
)
|
||||
var date = OS.get_datetime()
|
||||
log_file_path = log_file_path.plus_file(LOG_FILE_FORMAT % [
|
||||
str(date["year"]) + str(date["month"]) + str(date["day"]),
|
||||
str(date["hour"]) + str(date["minute"]) + str(date["second"])
|
||||
])
|
||||
log_file.open(
|
||||
log_file_path,
|
||||
File.WRITE
|
||||
)
|
||||
|
||||
|
||||
# Log a trace message
|
||||
#
|
||||
# Global variables can be substituted into the text by wrapping the global
|
||||
# name in braces.
|
||||
# e.g. trace "There are {coin_count} coins remaining".
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * string: Text to log
|
||||
# * args: Additional information
|
||||
func trace(string: String, args = []):
|
||||
if _get_log_level() >= LOG_TRACE and !crashed:
|
||||
var argsstr = str(args) if !args.empty() else ""
|
||||
string = escoria.esc_compiler.replace_globals(string)
|
||||
_log("(T)\t" + string + " \t" + argsstr)
|
||||
|
||||
|
||||
# Log a debug message
|
||||
#
|
||||
# Global variables can be substituted into the text by wrapping the global
|
||||
# name in braces.
|
||||
# e.g. debug "There are {coin_count} coins remaining".
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * string: Text to log
|
||||
# * args: Additional information
|
||||
func debug(string: String, args = []):
|
||||
if _get_log_level() >= LOG_DEBUG and !crashed:
|
||||
string = escoria.esc_compiler.replace_globals(string)
|
||||
var argsstr = str(args) if !args.empty() else ""
|
||||
_log("(D)\t" + string + " \t" + argsstr)
|
||||
|
||||
# Log an info message
|
||||
#
|
||||
# Global variables can be substituted into the text by wrapping the global
|
||||
# name in braces.
|
||||
# e.g. info "There are {coin_count} coins remaining".
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * string: Text to log
|
||||
# * args: Additional information
|
||||
func info(string: String, args = []):
|
||||
if _get_log_level() >= LOG_INFO and !crashed:
|
||||
var argsstr = []
|
||||
if !args.empty():
|
||||
for arg in args:
|
||||
if arg is Array:
|
||||
for p in arg:
|
||||
argsstr.append(p.global_id)
|
||||
else:
|
||||
argsstr.append(str(arg))
|
||||
string = escoria.esc_compiler.replace_globals(string)
|
||||
_log("(I)\t" + string + " \t" + str(argsstr))
|
||||
|
||||
|
||||
# Log a warning message
|
||||
#
|
||||
# Global variables can be substituted into the text by wrapping the global
|
||||
# name in braces.
|
||||
# e.g. warning "There are {coin_count} coins remaining".
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * string: Text to log
|
||||
# * args: Additional information
|
||||
func warning(string: String, args = []):
|
||||
if _get_log_level() >= LOG_WARNING and !crashed:
|
||||
var argsstr = str(args) if !args.empty() else ""
|
||||
string = escoria.esc_compiler.replace_globals(string)
|
||||
_log("(W)\t" + string + " \t" + argsstr, true)
|
||||
|
||||
if escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.TERMINATE_ON_WARNINGS
|
||||
):
|
||||
_perform_stack_trace_log()
|
||||
crashed = true
|
||||
|
||||
var files = "- %s" % log_file.get_path_absolute()
|
||||
var message = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.CRASH_MESSAGE
|
||||
) % files
|
||||
|
||||
_log(message, true)
|
||||
escoria.set_game_paused(true)
|
||||
escoria.main.current_scene.game.show_crash_popup(
|
||||
[log_file.get_path_absolute()]
|
||||
)
|
||||
assert(false)
|
||||
|
||||
|
||||
# Log an error message
|
||||
#
|
||||
# Global variables can be substituted into the text by wrapping the global
|
||||
# name in braces.
|
||||
# e.g. error "There are {coin_count} coins remaining".
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * string: Text to log
|
||||
# * args: Additional information
|
||||
func error(string: String, args = [], do_savegame: bool = true):
|
||||
if _get_log_level() >= LOG_ERROR and !crashed:
|
||||
var argsstr = str(args) if !args.empty() else ""
|
||||
string = escoria.esc_compiler.replace_globals(string)
|
||||
_log("(E)\t" + string + " \t" + argsstr, true)
|
||||
|
||||
if escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.TERMINATE_ON_ERRORS
|
||||
):
|
||||
_perform_stack_trace_log()
|
||||
crashed = true
|
||||
if do_savegame:
|
||||
_perform_save_game_log()
|
||||
|
||||
var files_to_send: Array = [
|
||||
log_file.get_path_absolute().get_base_dir().plus_file(
|
||||
escoria.save_manager.crash_savegame_filename.get_file()
|
||||
),
|
||||
log_file.get_path_absolute()
|
||||
]
|
||||
|
||||
var files = "- %s\n- %s" % files_to_send
|
||||
var message = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.CRASH_MESSAGE
|
||||
) % files
|
||||
|
||||
_log(message, true)
|
||||
escoria.set_game_paused(true)
|
||||
|
||||
if is_instance_valid(escoria.main.current_scene):
|
||||
escoria.main.current_scene.game.show_crash_popup(files_to_send)
|
||||
|
||||
assert(false)
|
||||
|
||||
|
||||
# Log a warning message about an ESC file
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * p_path: Path to the file
|
||||
# * warnings: Array of warnings to put out
|
||||
# * report_once: Additional messages about the same file will be ignored
|
||||
func report_warnings(p_path: String, warnings: Array, report_once = false) -> void:
|
||||
var warning_is_reported = false
|
||||
if p_path == warning_path:
|
||||
warning_is_reported = true
|
||||
|
||||
if !warning_is_reported:
|
||||
var text = "Warnings in file "+p_path+"\n"
|
||||
for w in warnings:
|
||||
if w is Array:
|
||||
text += str(w)+"\n"
|
||||
else:
|
||||
text += w+"\n"
|
||||
warning(text)
|
||||
|
||||
if report_once:
|
||||
warning_is_reported = true
|
||||
|
||||
|
||||
# Log an error message about an ESC file
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * p_path: Path to the file
|
||||
# * errors: Array of errors to put out
|
||||
func report_errors(p_path: String, errors: Array) -> void:
|
||||
var text = "Errors in file "+p_path+"\n"
|
||||
for e in errors:
|
||||
if e is Array:
|
||||
text += str(e)+"\n"
|
||||
else:
|
||||
text += e+"\n"
|
||||
error(text)
|
||||
|
||||
|
||||
# Write message:
|
||||
# - in logfile
|
||||
# - in stdout, or stderr if err is true.
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * message: Message to log
|
||||
# * err: if true, write in stderr
|
||||
func _log(message:String, err: bool = false):
|
||||
message = "ESC {0} {1}".format([_formatted_date(), message])
|
||||
|
||||
if err:
|
||||
printerr(message)
|
||||
else:
|
||||
print(message)
|
||||
_write_logfile(message)
|
||||
|
||||
|
||||
# Returns the current date/time, as a string
|
||||
# formatted for logging. E.g. 2022-04-19T16:10:39
|
||||
func _formatted_date() -> String:
|
||||
var info = OS.get_datetime()
|
||||
info["year"] = "%04d" % info["year"]
|
||||
info["month"] = "%02d" % info["month"]
|
||||
info["day"] = "%02d" % info["day"]
|
||||
info["hour"] = "%02d" % info["hour"]
|
||||
info["minute"] = "%02d" % info["minute"]
|
||||
info["second"] = "%02d" % info["second"]
|
||||
|
||||
return "{year}-{month}-{day}T{hour}:{minute}:{second}".format(info)
|
||||
|
||||
|
||||
# Returns the currently set log level
|
||||
# **Returns** Log level as set in the configuration
|
||||
func _get_log_level() -> int:
|
||||
return _level_map[escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.LOG_LEVEL
|
||||
)]
|
||||
|
||||
|
||||
# Creates a savegame file and save it in output log location
|
||||
func _perform_save_game_log():
|
||||
_log("Performing emergency savegame.")
|
||||
var error = escoria.save_manager.save_game_crash()
|
||||
if error == OK:
|
||||
_log(
|
||||
"Emergency savegame created successfully in folder: %s" %
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.LOG_FILE_PATH
|
||||
)
|
||||
)
|
||||
else:
|
||||
_log("Emergency savegame creation failed!", false)
|
||||
|
||||
|
||||
# Logs and writes the stack trace into stdout and log file.
|
||||
func _perform_stack_trace_log():
|
||||
_log("Stack trace:")
|
||||
print_stack()
|
||||
_write_stack_logfile()
|
||||
|
||||
|
||||
# Write a message in the output logfile
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * message: Message to write
|
||||
func _write_logfile(message: String) -> void:
|
||||
if log_file.is_open():
|
||||
log_file.store_string(message + "\n")
|
||||
|
||||
|
||||
# Write the stacktrace in the output logfile
|
||||
func _write_stack_logfile():
|
||||
var frame_number = 0
|
||||
for stack in get_stack().slice(2, get_stack().size()):
|
||||
_write_logfile(
|
||||
"Frame %s - %s:%s in function '%s'" % [
|
||||
str(frame_number),
|
||||
stack["source"],
|
||||
stack["line"],
|
||||
stack["function"],
|
||||
]
|
||||
)
|
||||
frame_number += 1
|
||||
|
||||
|
||||
# Close the log file cleanly
|
||||
func close_logs():
|
||||
_log("Closing logs peacefully.")
|
||||
log_file.close()
|
||||
@@ -1,6 +1,6 @@
|
||||
# Base class for all migration version scripts. Extending scripts should be
|
||||
# named like the version they migrate the savegame to. (e.g. 1.0.0.gd, 1.0.1.gd)
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCMigration
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Class that handles migrations between different game or escoria versions
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCMigrationManager
|
||||
|
||||
|
||||
@@ -29,10 +29,11 @@ func migrate(
|
||||
to: String,
|
||||
versions_directory: String
|
||||
) -> ESCSaveGame:
|
||||
escoria.logger.info("Migrating from version %s to %s" % [
|
||||
from,
|
||||
to
|
||||
])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Migrating savegame from version %s to version %s."
|
||||
% [from, to]
|
||||
)
|
||||
|
||||
var from_info = version_regex.search(from)
|
||||
var to_info = version_regex.search(to)
|
||||
@@ -49,14 +50,11 @@ func migrate(
|
||||
wrong_version = true
|
||||
|
||||
if wrong_version:
|
||||
escoria.logger.report_errors(
|
||||
"esc_migration_manager:migrate",
|
||||
[
|
||||
"Can not migrate savegame from version %s to version %s" % [
|
||||
from,
|
||||
to
|
||||
]
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Can not migrate savegame from version %s to version %s." +
|
||||
" \"To\" version must be later than \"from\" version."
|
||||
% [from, to]
|
||||
)
|
||||
|
||||
var versions = _find_versions(versions_directory, from, to)
|
||||
@@ -67,13 +65,14 @@ func migrate(
|
||||
for version in versions:
|
||||
var migration_script = load(version).new()
|
||||
if not migration_script is ESCMigration:
|
||||
escoria.logger.report_errors(
|
||||
"esc_migration_manager:migrate",
|
||||
[
|
||||
"File %s is not a valid migration script" % version
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"File %s is not a valid migration script." % version
|
||||
)
|
||||
escoria.logger.debug("Migrating using %s" % version)
|
||||
escoria.logger.debug(
|
||||
self,
|
||||
"Migrating savegame to version %s." % version
|
||||
)
|
||||
(migration_script as ESCMigration).set_savegame(savegame)
|
||||
(migration_script as ESCMigration).migrate()
|
||||
savegame = (migration_script as ESCMigration).get_savegame()
|
||||
@@ -90,7 +89,10 @@ func migrate(
|
||||
# - to: End version to check
|
||||
# **Returns** A list of version scripts
|
||||
func _find_versions(directory: String, from: String, to: String) -> Array:
|
||||
escoria.logger.trace("Searching directory %s" % directory)
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Searching directory %s." % directory
|
||||
)
|
||||
var versions = []
|
||||
var dir = Directory.new()
|
||||
dir.open(directory)
|
||||
@@ -106,7 +108,10 @@ func _find_versions(directory: String, from: String, to: String) -> Array:
|
||||
to
|
||||
)
|
||||
elif regex_result and _version_between(version, from, to):
|
||||
escoria.logger.trace("Found fitting migration script %s" % version)
|
||||
escoria.logger.trace(
|
||||
self,
|
||||
"Found compatible savegame migration script for version %s." % version
|
||||
)
|
||||
versions.append(
|
||||
directory.plus_file(file_name)
|
||||
)
|
||||
|
||||
102
addons/escoria-core/game/core-scripts/plugins/escoria_plugin.gd
Normal file
102
addons/escoria-core/game/core-scripts/plugins/escoria_plugin.gd
Normal file
@@ -0,0 +1,102 @@
|
||||
class_name EscoriaPlugin
|
||||
|
||||
# Register a user interface. This should be called in a deferred way
|
||||
# from the addon's _enter_tree.
|
||||
#
|
||||
# #### Parameters
|
||||
# - plugin: the plugin that registers
|
||||
# - game_scene: Path to the game scene extending ESCGame
|
||||
#
|
||||
# *Returns* a boolean indicating whether the ui could be successfully registered
|
||||
static func register_ui(plugin: EditorPlugin, game_scene: String) -> bool:
|
||||
if not plugin.get_editor_interface().is_plugin_enabled(
|
||||
Escoria.ESCORIA_CORE_PLUGIN_NAME
|
||||
):
|
||||
push_error("Escoria Core must be enabled.")
|
||||
return false
|
||||
|
||||
var game_scene_setting_value = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE
|
||||
)
|
||||
|
||||
if not game_scene_setting_value in [
|
||||
"",
|
||||
game_scene
|
||||
]:
|
||||
push_error("Can't register user interface because user interface %s is registered."
|
||||
% game_scene_setting_value
|
||||
)
|
||||
return false
|
||||
ESCProjectSettingsManager.set_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE,
|
||||
game_scene
|
||||
)
|
||||
return true
|
||||
|
||||
# Deregister a user interface
|
||||
#
|
||||
# #### Parameters
|
||||
# - game_scene: Path to the game scene extending ESCGame
|
||||
static func deregister_ui(game_scene: String):
|
||||
# If the currently configured game scene is not the one we're disabling, exit now.
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE
|
||||
) != game_scene:
|
||||
return
|
||||
|
||||
ESCProjectSettingsManager.set_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE,
|
||||
""
|
||||
)
|
||||
|
||||
|
||||
# Register a dialog manager addon. This should be called in a deferred way
|
||||
# from the addon's _enter_tree.
|
||||
#
|
||||
# #### Parameters
|
||||
# - plugin: the plugin that registers
|
||||
# - manager_class: Path to the manager class script
|
||||
#
|
||||
# *Returns* a boolean value indicating whether the dialog manager was registered
|
||||
static func register_dialog_manager(plugin: EditorPlugin, manager_class: String) -> bool:
|
||||
if not plugin.get_editor_interface().is_plugin_enabled(
|
||||
Escoria.ESCORIA_CORE_PLUGIN_NAME
|
||||
):
|
||||
push_error("Escoria Core must be enabled.")
|
||||
return false
|
||||
|
||||
var dialog_managers: Array = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS
|
||||
)
|
||||
|
||||
if manager_class in dialog_managers:
|
||||
return true
|
||||
|
||||
dialog_managers.push_back(manager_class)
|
||||
|
||||
ESCProjectSettingsManager.set_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS,
|
||||
dialog_managers
|
||||
)
|
||||
|
||||
return true
|
||||
|
||||
# Deregister a dialog manager addon
|
||||
#
|
||||
# #### Parameters
|
||||
# - manager_class: Path to the manager class script
|
||||
static func deregister_dialog_manager(manager_class: String):
|
||||
var dialog_managers: Array = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS
|
||||
)
|
||||
|
||||
# If the dialog manager we're removing in not in the registered list, return quietly.
|
||||
if not manager_class in dialog_managers:
|
||||
return
|
||||
|
||||
dialog_managers.erase(manager_class)
|
||||
|
||||
ESCProjectSettingsManager.set_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS,
|
||||
dialog_managers
|
||||
)
|
||||
@@ -1,5 +1,5 @@
|
||||
# Describes a resource for use in the resource cache
|
||||
extends Object
|
||||
extends Resource
|
||||
class_name ESCResourceDescriptor
|
||||
|
||||
|
||||
|
||||
@@ -76,9 +76,9 @@ func get_saves_list() -> Dictionary:
|
||||
var save_game_res: Resource = load(save_path)
|
||||
|
||||
if save_game_res == null:
|
||||
escoria.logger.report_warnings(
|
||||
"esc_save_manager.gd",
|
||||
["Savegame file %s is corrupted. Skipping." % save_path]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Savegame file %s is corrupted. Skipping." % save_path
|
||||
)
|
||||
else:
|
||||
var save_game_data = {
|
||||
@@ -91,12 +91,10 @@ func get_saves_list() -> Dictionary:
|
||||
if matches != null and matches.get_string("slotnumber") != null:
|
||||
saves[int(matches.get_string("slotnumber"))] = save_game_data
|
||||
else:
|
||||
escoria.logger.report_warnings(
|
||||
"esc_save_manager.gd",
|
||||
[
|
||||
"Savegame file %s contains valid data but doesn't match filename format %s. Skipping."
|
||||
% [save_path, regex.get_pattern()]
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Savegame file %s contains valid data but doesn't match filename format %s. Skipping."
|
||||
% [save_path, regex.get_pattern()]
|
||||
)
|
||||
nextfile = dirsave.get_next()
|
||||
return saves
|
||||
@@ -121,8 +119,9 @@ func save_game_exists(id: int) -> bool:
|
||||
func save_game(id: int, p_savename: String):
|
||||
if not save_enabled:
|
||||
escoria.logger.debug(
|
||||
"esc_save_manager.gd",
|
||||
["Save requested while saving is not possible. Save canceled."])
|
||||
self,
|
||||
"Save requested while saving is not possible. Save cancelled."
|
||||
)
|
||||
return
|
||||
|
||||
var save_game := _do_save_game(p_savename)
|
||||
@@ -134,9 +133,9 @@ func save_game(id: int, p_savename: String):
|
||||
var save_path = save_folder.plus_file(SAVE_NAME_TEMPLATE % id)
|
||||
var error: int = ResourceSaver.save(save_path, save_game)
|
||||
if error != OK:
|
||||
escoria.logger.report_errors(
|
||||
"esc_save_manager.gd",
|
||||
["There was an issue writing the save %s to %s" % [id, save_path]]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"There was an issue writing savegame number %s to %s." % [id, save_path]
|
||||
)
|
||||
|
||||
|
||||
@@ -153,8 +152,8 @@ func save_game_crash():
|
||||
|
||||
var save_game := _do_save_game("Crash %s" % datetime_string)
|
||||
|
||||
var save_file_path: String = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.LOG_FILE_PATH
|
||||
var save_file_path: String = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.LOG_FILE_PATH
|
||||
)
|
||||
crash_savegame_filename = save_file_path.plus_file(
|
||||
CRASH_SAVE_NAME_TEMPLATE % [
|
||||
@@ -167,10 +166,11 @@ func save_game_crash():
|
||||
|
||||
var error: int = ResourceSaver.save(crash_savegame_filename, save_game)
|
||||
if error != OK:
|
||||
escoria.logger.report_errors(
|
||||
"esc_save_manager.gd",
|
||||
["There was an issue writing the crash save to %s"
|
||||
% crash_savegame_filename])
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"There was an issue writing the crash save to %s."
|
||||
% crash_savegame_filename
|
||||
)
|
||||
return error
|
||||
|
||||
|
||||
@@ -185,8 +185,8 @@ func _do_save_game(p_savename: String) -> ESCSaveGame:
|
||||
plugin_config.load("res://addons/escoria-core/plugin.cfg")
|
||||
save_game.escoria_version = plugin_config.get_value("plugin", "version")
|
||||
|
||||
save_game.game_version = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_VERSION
|
||||
save_game.game_version = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_VERSION
|
||||
)
|
||||
save_game.name = p_savename
|
||||
|
||||
@@ -216,14 +216,16 @@ func load_game(id: int):
|
||||
var save_file_path: String = save_folder.plus_file(SAVE_NAME_TEMPLATE % id)
|
||||
var file: File = File.new()
|
||||
if not file.file_exists(save_file_path):
|
||||
escoria.logger.report_errors(
|
||||
"esc_save_manager.gd:load_game()",
|
||||
["Save file %s doesn't exist" % save_file_path])
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Save file %s doesn't exist." % save_file_path
|
||||
)
|
||||
return
|
||||
|
||||
escoria.logger.info(
|
||||
"esc_save_manager.gd:load_game()",
|
||||
["Loading savegame %s" % str(id)])
|
||||
self,
|
||||
"Loading savegame %s." % str(id)
|
||||
)
|
||||
|
||||
var save_game: ESCSaveGame = ResourceLoader.load(save_file_path)
|
||||
|
||||
@@ -243,21 +245,21 @@ func load_game(id: int):
|
||||
)
|
||||
|
||||
# Migrate savegame through game versions
|
||||
if escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_VERSION
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_VERSION
|
||||
) != save_game.game_version \
|
||||
and escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_MIGRATION_PATH
|
||||
and ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_MIGRATION_PATH
|
||||
) != "":
|
||||
var migration_manager: ESCMigrationManager = ESCMigrationManager.new()
|
||||
save_game = migration_manager.migrate(
|
||||
save_game,
|
||||
save_game.game_version,
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_VERSION
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_VERSION
|
||||
),
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_MIGRATION_PATH
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_MIGRATION_PATH
|
||||
)
|
||||
)
|
||||
|
||||
@@ -271,8 +273,8 @@ func load_game(id: int):
|
||||
"%s %s out" %
|
||||
[
|
||||
_transition.get_command_name(),
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DEFAULT_TRANSITION
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_TRANSITION
|
||||
)]
|
||||
)
|
||||
)
|
||||
@@ -391,8 +393,8 @@ func load_game(id: int):
|
||||
"%s %s in" %
|
||||
[
|
||||
_transition.get_command_name(),
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DEFAULT_TRANSITION
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_TRANSITION
|
||||
)]
|
||||
)
|
||||
)
|
||||
@@ -402,9 +404,7 @@ func load_game(id: int):
|
||||
escoria.set_game_paused(false)
|
||||
|
||||
escoria.event_manager.queue_event(load_event)
|
||||
escoria.logger.debug(
|
||||
"esc_save_manager.gd:load_game()",
|
||||
["Load event queued."])
|
||||
escoria.logger.debug(self, "Load event queued.")
|
||||
|
||||
|
||||
# Save the game settings in the settings file.
|
||||
@@ -432,9 +432,9 @@ func save_settings():
|
||||
var save_path = settings_folder.plus_file(SETTINGS_TEMPLATE)
|
||||
var error: int = ResourceSaver.save(save_path, settings_res)
|
||||
if error != OK:
|
||||
escoria.logger.report_errors(
|
||||
escoria.logger.error(
|
||||
"esc_save_manager.gd:save_settings()",
|
||||
["There was an issue writing settings %s" % save_path])
|
||||
["There was an issue writing settings file %s." % save_path])
|
||||
|
||||
|
||||
# Load the game settings from the settings file
|
||||
@@ -444,10 +444,11 @@ func load_settings() -> Resource:
|
||||
settings_folder.plus_file(SETTINGS_TEMPLATE)
|
||||
var file: File = File.new()
|
||||
if not file.file_exists(save_settings_path):
|
||||
escoria.logger.report_warnings(
|
||||
"esc_save_manager.gd:load_settings()",
|
||||
["Settings file %s doesn't exist" % save_settings_path,
|
||||
"Setting default settings."])
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Settings file %s doesn't exist. Using default settings."
|
||||
% save_settings_path
|
||||
)
|
||||
save_settings()
|
||||
|
||||
return load(save_settings_path)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# A set of common utilities
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCUtils
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ class_name ESCUtils
|
||||
#
|
||||
# - rad_angle: Angle in radians
|
||||
# **Returns** Degrees
|
||||
func get_deg_from_rad(rad_angle: float):
|
||||
static func get_deg_from_rad(rad_angle: float):
|
||||
var deg = rad2deg(rad_angle)
|
||||
if deg >= 360.0:
|
||||
deg = clamp(deg, 0.0, 360.0)
|
||||
@@ -25,7 +25,7 @@ func get_deg_from_rad(rad_angle: float):
|
||||
# - re_match: The RegExMatch object
|
||||
# - group: The name of the group
|
||||
# **Returns** The value of the named regex group in the match
|
||||
func get_re_group(re_match: RegExMatch, group: String) -> String:
|
||||
static func get_re_group(re_match: RegExMatch, group: String) -> String:
|
||||
if group in re_match.names:
|
||||
return re_match.strings[re_match.names[group]]
|
||||
else:
|
||||
@@ -39,7 +39,7 @@ func get_re_group(re_match: RegExMatch, group: String) -> String:
|
||||
# - value: The original value
|
||||
# - type_hint: The type it should be
|
||||
# **Returns** The typed value according to the type inference
|
||||
func get_typed_value(value: String, type_hint = []):
|
||||
static func get_typed_value(value: String, type_hint = []):
|
||||
var regex_bool = RegEx.new()
|
||||
regex_bool.compile("^true|false$")
|
||||
var regex_float = RegEx.new()
|
||||
@@ -68,7 +68,7 @@ func get_typed_value(value: String, type_hint = []):
|
||||
#
|
||||
# - value: String to work on
|
||||
# **Returns** the string with sanitized whitespaces
|
||||
func sanitize_whitespace(value: String) -> String:
|
||||
static func sanitize_whitespace(value: String) -> String:
|
||||
var tab_regex = RegEx.new()
|
||||
tab_regex.compile("\\t")
|
||||
var double_regex = RegEx.new()
|
||||
|
||||
195
addons/escoria-core/game/esc_autoload.gd
Normal file
195
addons/escoria-core/game/esc_autoload.gd
Normal file
@@ -0,0 +1,195 @@
|
||||
# This is Escoria's singleton script.
|
||||
# It holds accessors to some utils, such as Escoria's logger.
|
||||
|
||||
extends Node
|
||||
|
||||
|
||||
# Signal sent when Escoria is paused
|
||||
signal paused
|
||||
|
||||
# Signal sent when Escoria is resumed from pause
|
||||
signal resumed
|
||||
|
||||
|
||||
# Current game state
|
||||
# * DEFAULT: Common game function
|
||||
# * DIALOG: Game is playing a dialog
|
||||
# * WAIT: Game is waiting
|
||||
enum GAME_STATE {
|
||||
DEFAULT,
|
||||
DIALOG,
|
||||
WAIT
|
||||
}
|
||||
|
||||
|
||||
# Audio bus indices.
|
||||
const BUS_MASTER = "Master"
|
||||
const BUS_SFX = "SFX"
|
||||
const BUS_MUSIC = "Music"
|
||||
const BUS_SPEECH = "Speech"
|
||||
|
||||
# Path to camera scene
|
||||
const CAMERA_SCENE_PATH = "res://addons/escoria-core/game/scenes/camera_player/camera.tscn"
|
||||
|
||||
|
||||
# Logger class
|
||||
const Logger = preload("res://addons/escoria-core/game/esc_logger.gd")
|
||||
|
||||
|
||||
# Logger instance
|
||||
var logger = Logger.ESCLoggerFile.new()
|
||||
|
||||
# ESC Compiler
|
||||
var esc_compiler = ESCCompiler.new()
|
||||
|
||||
# ESC Object Manager
|
||||
var object_manager = ESCObjectManager.new()
|
||||
|
||||
# ESC Room Manager
|
||||
var room_manager = ESCRoomManager.new()
|
||||
|
||||
# Terrain of the current room
|
||||
var room_terrain
|
||||
|
||||
# The inventory manager instance
|
||||
var inventory_manager: ESCInventoryManager
|
||||
|
||||
# The action manager instance
|
||||
var action_manager: ESCActionManager
|
||||
|
||||
# ESC Event manager instance
|
||||
var event_manager: ESCEventManager
|
||||
|
||||
# ESC globals registry instance
|
||||
var globals_manager: ESCGlobalsManager
|
||||
|
||||
# ESC command registry instance
|
||||
var command_registry: ESCCommandRegistry
|
||||
|
||||
# Resource cache handler
|
||||
var resource_cache: ESCResourceCache
|
||||
|
||||
# Dialog player instantiator. This instance is called directly for dialogs.
|
||||
var dialog_player: ESCDialogPlayer
|
||||
|
||||
# Inventory scene
|
||||
var inventory
|
||||
|
||||
# These are settings that the player can affect and save/load later
|
||||
var settings: ESCSaveSettings
|
||||
|
||||
# The main scene
|
||||
var main
|
||||
|
||||
# The escoria inputs manager
|
||||
var inputs_manager: ESCInputsManager
|
||||
|
||||
# Savegames and settings manager
|
||||
var save_manager: ESCSaveManager
|
||||
|
||||
# The game scene loaded
|
||||
var game_scene: ESCGame
|
||||
|
||||
# The main player camera
|
||||
var player_camera: ESCCamera
|
||||
|
||||
# The compiled start script loaded from ProjectSettings
|
||||
# escoria/main/game_start_script
|
||||
var start_script: ESCScript
|
||||
|
||||
# Whether we ran a room directly from editor, not a full game
|
||||
var is_direct_room_run: bool = false
|
||||
|
||||
# Whether we're quitting the game
|
||||
var is_quitting: bool = false
|
||||
|
||||
|
||||
# The game resolution
|
||||
onready var game_size = get_viewport().size
|
||||
|
||||
# The current state of the game
|
||||
onready var current_state = GAME_STATE.DEFAULT
|
||||
|
||||
|
||||
# Ready function
|
||||
func _ready():
|
||||
# We check if we run the full game or a room scene directly
|
||||
if not get_tree().current_scene is ESCMain:
|
||||
# Running a room scene. We need to instantiate the main scene ourselves
|
||||
# so that the Escoria scene is created and managers are instanced as well.
|
||||
is_direct_room_run = true
|
||||
var main_scene = preload("res://addons/escoria-core/game/main_scene.tscn").instance()
|
||||
add_child(main_scene)
|
||||
|
||||
|
||||
# Get the Escoria node. That node gives access to the Escoria scene that's
|
||||
# instanced by the main_scene (if full game is run) or by this autoload if
|
||||
# room is run directly.
|
||||
func get_escoria():
|
||||
# We check if we run the full game or a room scene directly
|
||||
if get_tree().current_scene is ESCMain:
|
||||
return get_node("/root/main_scene").escoria_node
|
||||
else:
|
||||
return get_node("main_scene").escoria_node
|
||||
|
||||
|
||||
# Pauses or unpause the game
|
||||
#
|
||||
# #### Parameters
|
||||
# - p_paused: if true, pauses the game. If false, unpauses the game.
|
||||
func set_game_paused(p_paused: bool):
|
||||
if p_paused:
|
||||
emit_signal("paused")
|
||||
else:
|
||||
emit_signal("resumed")
|
||||
|
||||
var scene_tree = get_tree()
|
||||
|
||||
if is_instance_valid(scene_tree):
|
||||
scene_tree.paused = p_paused
|
||||
|
||||
|
||||
# Apply the loaded settings
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * p_settings: Loaded settings
|
||||
func apply_settings(p_settings: ESCSaveSettings) -> void:
|
||||
if not Engine.is_editor_hint():
|
||||
escoria.logger.info(self, "******* settings loaded")
|
||||
if p_settings != null:
|
||||
settings = p_settings
|
||||
else:
|
||||
settings = ESCSaveSettings.new()
|
||||
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_MASTER),
|
||||
linear2db(settings.master_volume)
|
||||
)
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_SFX),
|
||||
linear2db(settings.sfx_volume)
|
||||
)
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_MUSIC),
|
||||
linear2db(settings.music_volume)
|
||||
)
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_SPEECH),
|
||||
linear2db(settings.speech_volume)
|
||||
)
|
||||
TranslationServer.set_locale(settings.text_lang)
|
||||
|
||||
game_scene.apply_custom_settings(settings.custom_settings)
|
||||
|
||||
|
||||
# Called from main menu's "new game" button
|
||||
func new_game():
|
||||
get_escoria().new_game()
|
||||
|
||||
|
||||
# Called from main menu's "quit" button
|
||||
func quit():
|
||||
is_quitting = true
|
||||
get_escoria().quit()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Escoria inputs manager
|
||||
# Catches, handles and distributes input events for the game
|
||||
extends Node
|
||||
extends Resource
|
||||
class_name ESCInputsManager
|
||||
|
||||
|
||||
@@ -166,7 +166,10 @@ func clear_stack():
|
||||
# - position: Position of the click
|
||||
func _on_left_click_on_bg(position: Vector2) -> void:
|
||||
if input_mode == INPUT_ALL and hotspot_focused.empty():
|
||||
escoria.logger.info("Left click on background at ", [str(position)])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Left click on background at %s." % str(position)
|
||||
)
|
||||
escoria.main.current_scene.game.left_click_on_bg(position)
|
||||
|
||||
|
||||
@@ -178,7 +181,8 @@ func _on_left_click_on_bg(position: Vector2) -> void:
|
||||
func _on_double_left_click_on_bg(position: Vector2) -> void:
|
||||
if input_mode == INPUT_ALL and hotspot_focused.empty():
|
||||
escoria.logger.info(
|
||||
"Double left click on background at %s" % str(position)
|
||||
self,
|
||||
"Double left click on background at %s." % str(position)
|
||||
)
|
||||
escoria.main.current_scene.game.left_double_click_on_bg(position)
|
||||
|
||||
@@ -190,7 +194,10 @@ func _on_double_left_click_on_bg(position: Vector2) -> void:
|
||||
# - position: Position of the click
|
||||
func _on_right_click_on_bg(position: Vector2) -> void:
|
||||
if input_mode == INPUT_ALL and hotspot_focused.empty():
|
||||
escoria.logger.info("Right click on background at ", [str(position)])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Right click on background at %s." % str(position)
|
||||
)
|
||||
escoria.main.current_scene.game.right_click_on_bg(position)
|
||||
|
||||
|
||||
@@ -205,7 +212,8 @@ func _on_mouse_left_click_inventory_item(
|
||||
event: InputEvent
|
||||
) -> void:
|
||||
escoria.logger.info(
|
||||
"Inventory item left clicked %s " % inventory_item_global_id
|
||||
self,
|
||||
"Inventory item %s left clicked." % inventory_item_global_id
|
||||
)
|
||||
escoria.main.current_scene.game.left_click_on_inventory_item(
|
||||
inventory_item_global_id,
|
||||
@@ -225,7 +233,8 @@ func _on_mouse_right_click_inventory_item(
|
||||
) -> void:
|
||||
if input_mode == INPUT_ALL:
|
||||
escoria.logger.info(
|
||||
"Inventory item right clicked %s" % inventory_item_global_id
|
||||
self,
|
||||
"Inventory item %s right clicked." % inventory_item_global_id
|
||||
)
|
||||
escoria.main.current_scene.game.right_click_on_inventory_item(
|
||||
inventory_item_global_id,
|
||||
@@ -245,7 +254,8 @@ func _on_mouse_double_left_click_inventory_item(
|
||||
) -> void:
|
||||
if input_mode == INPUT_ALL:
|
||||
escoria.logger.info(
|
||||
"Inventory item double left clicked %s" % inventory_item_global_id
|
||||
self,
|
||||
"Inventory item %s double left clicked." % inventory_item_global_id
|
||||
)
|
||||
escoria.main.current_scene.game.left_double_click_on_inventory_item(
|
||||
inventory_item_global_id,
|
||||
@@ -261,7 +271,8 @@ func _on_mouse_double_left_click_inventory_item(
|
||||
# that is hovered
|
||||
func _on_mouse_entered_inventory_item(inventory_item_global_id: String) -> void:
|
||||
escoria.logger.info(
|
||||
"Inventory item focused %s" % inventory_item_global_id
|
||||
self,
|
||||
"Inventory item %s focused." % inventory_item_global_id
|
||||
)
|
||||
escoria.main.current_scene.game.inventory_item_focused(
|
||||
inventory_item_global_id
|
||||
@@ -270,7 +281,10 @@ func _on_mouse_entered_inventory_item(inventory_item_global_id: String) -> void:
|
||||
|
||||
# The mouse exited an inventory item
|
||||
func _on_mouse_exited_inventory_item() -> void:
|
||||
escoria.logger.info("Inventory item unfocused")
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Inventory item unfocused."
|
||||
)
|
||||
escoria.main.current_scene.game.inventory_item_unfocused()
|
||||
|
||||
|
||||
@@ -280,7 +294,10 @@ func _on_mouse_exited_inventory_item() -> void:
|
||||
#
|
||||
# - item: The Escoria item hovered
|
||||
func _on_mouse_entered_item(item: ESCItem) -> void:
|
||||
escoria.logger.info("Item focused: ", [item.global_id])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Item focused: %s" % item.global_id
|
||||
)
|
||||
_clean_hover_stack()
|
||||
|
||||
if not hover_stack.empty():
|
||||
@@ -301,7 +318,10 @@ func _on_mouse_entered_item(item: ESCItem) -> void:
|
||||
#
|
||||
# - item: The Escoria item hovered
|
||||
func _on_mouse_exited_item(item: ESCItem) -> void:
|
||||
escoria.logger.info("Item unfocused: ", [item.global_id])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Item unfocused: %s" % item.global_id
|
||||
)
|
||||
_hover_stack_erase_item(item)
|
||||
if hover_stack.empty():
|
||||
hotspot_focused = ""
|
||||
@@ -320,7 +340,10 @@ func _on_mouse_exited_item(item: ESCItem) -> void:
|
||||
func _on_mouse_left_clicked_item(item: ESCItem, event: InputEvent) -> void:
|
||||
if input_mode == INPUT_ALL:
|
||||
if hover_stack.empty() or hover_stack.back() == item:
|
||||
escoria.logger.info("Item left clicked", [item.global_id, event])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Item %s left clicked with event %s." % [item.global_id, event]
|
||||
)
|
||||
hotspot_focused = item.global_id
|
||||
escoria.main.current_scene.game.left_click_on_item(
|
||||
item.global_id,
|
||||
@@ -339,7 +362,10 @@ func _on_mouse_left_double_clicked_item(
|
||||
event: InputEvent
|
||||
) -> void:
|
||||
if input_mode == INPUT_ALL:
|
||||
escoria.logger.info("Item left double clicked", [item.global_id, event])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Item %s left double clicked with event %s." % [item.global_id, event]
|
||||
)
|
||||
hotspot_focused = item.global_id
|
||||
escoria.main.current_scene.game.left_double_click_on_item(
|
||||
item.global_id,
|
||||
@@ -355,7 +381,10 @@ func _on_mouse_left_double_clicked_item(
|
||||
# - event: The input event from the click
|
||||
func _on_mouse_right_clicked_item(item: ESCItem, event: InputEvent) -> void:
|
||||
if input_mode == INPUT_ALL:
|
||||
escoria.logger.info("Item right clicked", [item.global_id, event])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Item %s right clicked with event %s." % [item.global_id, event]
|
||||
)
|
||||
hotspot_focused = item.global_id
|
||||
escoria.main.current_scene.game.right_click_on_item(
|
||||
item.global_id,
|
||||
195
addons/escoria-core/game/esc_logger.gd
Normal file
195
addons/escoria-core/game/esc_logger.gd
Normal file
@@ -0,0 +1,195 @@
|
||||
class ESCLoggerBase:
|
||||
# Perform emergency savegame
|
||||
signal perform_emergency_savegame
|
||||
|
||||
# Valid log levels
|
||||
enum { LOG_ERROR, LOG_WARNING, LOG_INFO, LOG_DEBUG, LOG_TRACE }
|
||||
|
||||
# Log file format
|
||||
const LOG_FILE_FORMAT: String = "log_%s_%s.log"
|
||||
|
||||
# A map of log level names to log level ints
|
||||
var _level_map: Dictionary = {
|
||||
"ERROR": LOG_ERROR,
|
||||
"WARNING": LOG_WARNING,
|
||||
"INFO": LOG_INFO,
|
||||
"DEBUG": LOG_DEBUG,
|
||||
"TRACE": LOG_TRACE,
|
||||
}
|
||||
|
||||
# Configured log level
|
||||
var _log_level: int
|
||||
|
||||
|
||||
# Constructor
|
||||
func _init():
|
||||
_log_level = _level_map[ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.LOG_LEVEL
|
||||
).to_upper()]
|
||||
|
||||
|
||||
func formatted_message(context: String, msg: String, letter: String) -> String:
|
||||
return "ESC ({0}) {1} {2}: {3}".format([_formatted_date(), letter, context, msg])
|
||||
|
||||
|
||||
func trace(owner: Object, msg: String):
|
||||
var context = owner.get_script().resource_path.get_file()
|
||||
print(formatted_message(context, msg, "T"))
|
||||
|
||||
|
||||
# Debug log
|
||||
func debug(owner: Object, msg: String):
|
||||
var context = owner.get_script().resource_path.get_file()
|
||||
print(formatted_message(context, msg, "D"))
|
||||
|
||||
|
||||
func info(owner: Object, msg: String):
|
||||
var context = owner.get_script().resource_path.get_file()
|
||||
print(formatted_message(context, msg, "I"))
|
||||
|
||||
|
||||
# Warning log
|
||||
func warn(owner: Object, msg: String):
|
||||
var context = owner.get_script().resource_path.get_file()
|
||||
print(formatted_message(context, msg, "W"))
|
||||
push_warning(formatted_message(context, msg, "W"))
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.TERMINATE_ON_WARNINGS
|
||||
):
|
||||
assert(false)
|
||||
escoria.get_tree().quit()
|
||||
|
||||
|
||||
# Error log
|
||||
func error(owner: Object, msg: String):
|
||||
var context = owner.get_script().resource_path.get_file()
|
||||
printerr(formatted_message(context, msg, "E"))
|
||||
push_error(formatted_message(context, msg, "E"))
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.TERMINATE_ON_ERRORS
|
||||
):
|
||||
assert(false)
|
||||
escoria.get_tree().quit()
|
||||
|
||||
|
||||
func get_log_level() -> int:
|
||||
return _log_level
|
||||
|
||||
func _formatted_date():
|
||||
var info = OS.get_datetime()
|
||||
info["year"] = "%04d" % info["year"]
|
||||
info["month"] = "%02d" % info["month"]
|
||||
info["day"] = "%02d" % info["day"]
|
||||
info["hour"] = "%02d" % info["hour"]
|
||||
info["minute"] = "%02d" % info["minute"]
|
||||
info["second"] = "%02d" % info["second"]
|
||||
return "{year}-{month}-{day}T{hour}:{minute}:{second}".format(info)
|
||||
|
||||
|
||||
# A logger that logs to the terminal and to a log file.
|
||||
class ESCLoggerFile extends ESCLoggerBase:
|
||||
# Log file handler
|
||||
var log_file: File
|
||||
|
||||
# Constructor
|
||||
func _init():
|
||||
# Open logfile in write mode
|
||||
log_file = File.new()
|
||||
|
||||
# This is left alone as this constructor is called from escoria.gd's own
|
||||
# constructor
|
||||
var log_file_path = ProjectSettings.get_setting(
|
||||
ESCProjectSettingsManager.LOG_FILE_PATH
|
||||
)
|
||||
var date = OS.get_datetime()
|
||||
log_file_path = log_file_path.plus_file(LOG_FILE_FORMAT % [
|
||||
str(date["year"]) + str(date["month"]) + str(date["day"]),
|
||||
str(date["hour"]) + str(date["minute"]) + str(date["second"])
|
||||
])
|
||||
log_file.open(
|
||||
log_file_path,
|
||||
File.WRITE
|
||||
)
|
||||
|
||||
func trace(owner: Object, msg: String):
|
||||
if _log_level >= LOG_TRACE:
|
||||
_log_to_file(owner, msg, "T")
|
||||
.trace(owner, msg)
|
||||
|
||||
# Debug log
|
||||
func debug(owner: Object, msg: String):
|
||||
if _log_level >= LOG_DEBUG:
|
||||
_log_to_file(owner, msg, "D")
|
||||
.debug(owner, msg)
|
||||
|
||||
func info(owner: Object, msg: String):
|
||||
if _log_level >= LOG_INFO:
|
||||
_log_to_file(owner, msg, "I")
|
||||
.info(owner, msg)
|
||||
|
||||
# Warning log
|
||||
func warn(owner: Object, msg: String):
|
||||
if _log_level >= LOG_WARNING:
|
||||
_log_to_file(owner, msg, "W")
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.TERMINATE_ON_WARNINGS
|
||||
):
|
||||
_log_stack_trace_to_file(owner)
|
||||
print_stack()
|
||||
close_logs()
|
||||
.warn(owner, msg)
|
||||
|
||||
# Error log
|
||||
func error(owner: Object, msg: String):
|
||||
if _log_level >= LOG_ERROR:
|
||||
_log_to_file(owner, msg, "E")
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.TERMINATE_ON_ERRORS
|
||||
):
|
||||
_log_stack_trace_to_file(owner)
|
||||
print_stack()
|
||||
close_logs()
|
||||
.error(owner, msg)
|
||||
|
||||
|
||||
# Close the log file cleanly
|
||||
func close_logs():
|
||||
print("Closing logs peacefully.")
|
||||
_log_line_to_file("Closing logs peacefully.")
|
||||
log_file.close()
|
||||
|
||||
|
||||
func _log_to_file(owner: Object, msg: String, letter: String):
|
||||
if log_file.is_open():
|
||||
var context = ""
|
||||
if owner != null:
|
||||
context = owner.get_script().resource_path.get_file()
|
||||
log_file.store_string(formatted_message(context, msg, letter) + "\n")
|
||||
|
||||
func _log_line_to_file(msg: String):
|
||||
if log_file.is_open():
|
||||
log_file.store_string(msg + "\n")
|
||||
|
||||
func _log_stack_trace_to_file(owner: Object):
|
||||
var frame_number = 0
|
||||
for stack in get_stack().slice(2, get_stack().size()):
|
||||
_log_line_to_file(
|
||||
"Frame %s - %s:%s in function '%s'" % [
|
||||
str(frame_number),
|
||||
stack["source"],
|
||||
stack["line"],
|
||||
stack["function"],
|
||||
]
|
||||
)
|
||||
frame_number += 1
|
||||
|
||||
|
||||
# A simple logger that logs to terminal using debug() function
|
||||
class ESCLoggerVerbose extends ESCLoggerBase:
|
||||
func _init():
|
||||
pass
|
||||
|
||||
func debug(owner: Object, msg: String):
|
||||
var context = owner.get_script().resource_path.get_file()
|
||||
print(context, ": ", msg)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Registers and allows access to Escoria-specific project settings.
|
||||
extends Node
|
||||
extends Resource
|
||||
class_name ESCProjectSettingsManager
|
||||
|
||||
|
||||
@@ -75,14 +75,13 @@ const MAX_TIME_TO_DISAPPEAR = "%s/%s/max_time_to_disappear" % [_ESCORIA_SETTINGS
|
||||
# - name: Name of the project setting
|
||||
# - default: Default value
|
||||
# - info: Property info for the setting
|
||||
func register_setting(name: String, default, info: Dictionary) -> void:
|
||||
if not ProjectSettings.has_setting(name):
|
||||
ProjectSettings.set_setting(
|
||||
name,
|
||||
default
|
||||
)
|
||||
info.name = name
|
||||
ProjectSettings.add_property_info(info)
|
||||
static func register_setting(name: String, default, info: Dictionary) -> void:
|
||||
ProjectSettings.set_setting(
|
||||
name,
|
||||
default
|
||||
)
|
||||
info.name = name
|
||||
ProjectSettings.add_property_info(info)
|
||||
|
||||
|
||||
# Retrieves the specified project setting.
|
||||
@@ -92,11 +91,10 @@ func register_setting(name: String, default, info: Dictionary) -> void:
|
||||
# - key: Project setting name.
|
||||
#
|
||||
# *Returns* the value of the project setting located with key.
|
||||
func get_setting(key: String):
|
||||
static func get_setting(key: String):
|
||||
if not ProjectSettings.has_setting(key):
|
||||
escoria.logger.report_errors("project_settings_manager.gd",
|
||||
["Parameter %s is not set!" % key]
|
||||
)
|
||||
push_error("Parameter %s is not set!" % key)
|
||||
assert(false)
|
||||
|
||||
return ProjectSettings.get_setting(key)
|
||||
|
||||
@@ -107,7 +105,7 @@ func get_setting(key: String):
|
||||
#
|
||||
# - key: Project setting name.
|
||||
# - value: Project setting value.
|
||||
func set_setting(key: String, value) -> void:
|
||||
static func set_setting(key: String, value) -> void:
|
||||
ProjectSettings.set_setting(key, value)
|
||||
|
||||
|
||||
@@ -118,5 +116,5 @@ func set_setting(key: String, value) -> void:
|
||||
# - key: Project setting name.
|
||||
#
|
||||
# *Returns* true iff the project setting exists.
|
||||
func has_setting(key: String) -> bool:
|
||||
static func has_setting(key: String) -> bool:
|
||||
return ProjectSettings.has_setting(key)
|
||||
@@ -3,166 +3,98 @@ tool
|
||||
extends Node
|
||||
class_name Escoria
|
||||
|
||||
|
||||
# Signal sent when Escoria is paused
|
||||
signal paused
|
||||
|
||||
# Signal sent when Escoria is resumed from pause
|
||||
signal resumed
|
||||
# Signal sent when pause menu has to be displayed
|
||||
signal request_pause_menu
|
||||
|
||||
|
||||
# Current game state
|
||||
# * DEFAULT: Common game function
|
||||
# * DIALOG: Game is playing a dialog
|
||||
# * WAIT: Game is waiting
|
||||
enum GAME_STATE {
|
||||
DEFAULT,
|
||||
DIALOG,
|
||||
WAIT
|
||||
}
|
||||
# Name of the Escoria core plugin
|
||||
const ESCORIA_CORE_PLUGIN_NAME: String = "escoria-core"
|
||||
|
||||
|
||||
# Audio bus indices.
|
||||
const BUS_MASTER = "Master"
|
||||
const BUS_SFX = "SFX"
|
||||
const BUS_MUSIC = "Music"
|
||||
const BUS_SPEECH = "Speech"
|
||||
|
||||
const CAMERA_SCENE_PATH = "res://addons/escoria-core/game/scenes/camera_player/camera.tscn"
|
||||
|
||||
|
||||
# Logger used
|
||||
var logger: ESCLogger
|
||||
|
||||
# Several utilities
|
||||
var utils: ESCUtils
|
||||
|
||||
# The inventory manager instance
|
||||
var inventory_manager: ESCInventoryManager
|
||||
|
||||
# The action manager instance
|
||||
var action_manager: ESCActionManager
|
||||
|
||||
# ESC compiler instance
|
||||
var esc_compiler: ESCCompiler
|
||||
|
||||
# ESC Event manager instance
|
||||
var event_manager: ESCEventManager
|
||||
|
||||
# ESC globals registry instance
|
||||
var globals_manager: ESCGlobalsManager
|
||||
|
||||
# ESC room manager instance
|
||||
var room_manager: ESCRoomManager
|
||||
|
||||
# ESC object manager instance
|
||||
var object_manager: ESCObjectManager
|
||||
|
||||
# ESC project settings manager instance
|
||||
var project_settings_manager: ESCProjectSettingsManager
|
||||
|
||||
# ESC command registry instance
|
||||
var command_registry: ESCCommandRegistry
|
||||
|
||||
# Resource cache handler
|
||||
var resource_cache: ESCResourceCache
|
||||
|
||||
# Terrain of the current room
|
||||
var room_terrain
|
||||
|
||||
# Dialog player instantiator. This instance is called directly for dialogs.
|
||||
var dialog_player: ESCDialogPlayer
|
||||
|
||||
# Inventory scene
|
||||
var inventory
|
||||
|
||||
# These are settings that the player can affect and save/load later
|
||||
var settings: ESCSaveSettings
|
||||
|
||||
# The game resolution
|
||||
onready var game_size = get_viewport().size
|
||||
|
||||
# The main scene
|
||||
onready var main = $main
|
||||
|
||||
# The current state of the game
|
||||
onready var current_state = GAME_STATE.DEFAULT
|
||||
|
||||
# The escoria inputs manager
|
||||
var inputs_manager: ESCInputsManager
|
||||
|
||||
# Savegames and settings manager
|
||||
var save_manager: ESCSaveManager
|
||||
|
||||
# The game scene loaded
|
||||
var game_scene: ESCGame
|
||||
|
||||
# The main player camera
|
||||
var player_camera: ESCCamera
|
||||
|
||||
# The compiled start script loaded from ProjectSettings
|
||||
# escoria/main/game_start_script
|
||||
var start_script: ESCScript
|
||||
|
||||
|
||||
# Initialize various objects
|
||||
func _init():
|
||||
self.logger = ESCLogger.new()
|
||||
self.utils = ESCUtils.new()
|
||||
self.inventory_manager = ESCInventoryManager.new()
|
||||
self.action_manager = ESCActionManager.new()
|
||||
self.event_manager = ESCEventManager.new()
|
||||
self.globals_manager = ESCGlobalsManager.new()
|
||||
self.add_child(self.event_manager)
|
||||
self.object_manager = ESCObjectManager.new()
|
||||
self.command_registry = ESCCommandRegistry.new()
|
||||
self.esc_compiler = ESCCompiler.new()
|
||||
self.resource_cache = ESCResourceCache.new()
|
||||
self.resource_cache.start()
|
||||
self.save_manager = ESCSaveManager.new()
|
||||
self.inputs_manager = ESCInputsManager.new()
|
||||
self.room_manager = ESCRoomManager.new()
|
||||
self.project_settings_manager = ESCProjectSettingsManager.new()
|
||||
escoria.inventory_manager = ESCInventoryManager.new()
|
||||
escoria.action_manager = ESCActionManager.new()
|
||||
escoria.event_manager = ESCEventManager.new()
|
||||
escoria.globals_manager = ESCGlobalsManager.new()
|
||||
add_child(escoria.event_manager)
|
||||
escoria.object_manager = ESCObjectManager.new()
|
||||
escoria.command_registry = ESCCommandRegistry.new()
|
||||
escoria.resource_cache = ESCResourceCache.new()
|
||||
escoria.resource_cache.start()
|
||||
escoria.save_manager = ESCSaveManager.new()
|
||||
escoria.inputs_manager = ESCInputsManager.new()
|
||||
escoria.settings = ESCSaveSettings.new()
|
||||
|
||||
settings = ESCSaveSettings.new()
|
||||
|
||||
if self.project_settings_manager.get_setting(self.project_settings_manager.GAME_SCENE) == "":
|
||||
logger.report_errors("escoria.gd",
|
||||
["Project setting '%s' is not set!" % self.project_settings_manager.GAME_SCENE]
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE
|
||||
).empty():
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Project setting '%s' is not set!" % ESCProjectSettingsManager.GAME_SCENE
|
||||
)
|
||||
else:
|
||||
game_scene = resource_cache.get_resource(
|
||||
self.project_settings_manager.get_setting(self.project_settings_manager.GAME_SCENE)
|
||||
escoria.game_scene = escoria.resource_cache.get_resource(
|
||||
ESCProjectSettingsManager.get_setting(ESCProjectSettingsManager.GAME_SCENE)
|
||||
).instance()
|
||||
|
||||
print("ESC {0}".format([get_script().get_path()]))
|
||||
|
||||
|
||||
# Load settings
|
||||
func _ready():
|
||||
_handle_direct_scene_run()
|
||||
|
||||
settings = save_manager.load_settings()
|
||||
apply_settings(settings)
|
||||
room_manager.register_reserved_globals()
|
||||
inputs_manager.register_core()
|
||||
if self.project_settings_manager.get_setting(self.project_settings_manager.GAME_START_SCRIPT).empty():
|
||||
logger.report_errors("escoria.gd",
|
||||
[
|
||||
"Project setting '%s' is not set!" % self.project_settings_manager.GAME_START_SCRIPT
|
||||
])
|
||||
start_script = self.esc_compiler.load_esc_file(
|
||||
self.project_settings_manager.get_setting(self.project_settings_manager.GAME_START_SCRIPT)
|
||||
escoria.settings = escoria.save_manager.load_settings()
|
||||
escoria.apply_settings(escoria.settings)
|
||||
escoria.room_manager.register_reserved_globals()
|
||||
escoria.inputs_manager.register_core()
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_START_SCRIPT
|
||||
).empty():
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Project setting '%s' is not set!"
|
||||
% ESCProjectSettingsManager.GAME_START_SCRIPT
|
||||
)
|
||||
escoria.start_script = escoria.esc_compiler.load_esc_file(
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.GAME_START_SCRIPT
|
||||
)
|
||||
)
|
||||
|
||||
escoria.main = main
|
||||
|
||||
_perform_plugins_checks()
|
||||
|
||||
|
||||
func _notification(what):
|
||||
# Verifies that the game is configured with required plugin(s).
|
||||
# If a required plugin is missing (or disabled) we stop immediately.
|
||||
func _perform_plugins_checks():
|
||||
if ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS
|
||||
).empty():
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No dialog manager configured. Please add a dialog manager plugin."
|
||||
)
|
||||
|
||||
|
||||
# Manage notifications received from OS
|
||||
#
|
||||
# #### Parameters
|
||||
# - what: the notification constant received (usually defined in MainLoop)
|
||||
func _notification(what: int):
|
||||
match what:
|
||||
MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
|
||||
escoria.logger.close_logs()
|
||||
escoria.is_quitting = true
|
||||
get_tree().quit()
|
||||
MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST:
|
||||
escoria.logger.close_logs()
|
||||
escoria.is_quitting = true
|
||||
get_tree().quit()
|
||||
|
||||
|
||||
@@ -173,69 +105,22 @@ func init():
|
||||
# Don't show the UI until we're ready in order to avoid a sometimes-noticeable
|
||||
# blink. The UI will be "shown" later via a visibility update to the first room.
|
||||
escoria.game_scene.escoria_hide_ui()
|
||||
run_event_from_script(start_script, self.event_manager.EVENT_INIT)
|
||||
|
||||
|
||||
# Called by Main menu "start new game"
|
||||
func new_game():
|
||||
run_event_from_script(start_script, self.event_manager.EVENT_NEW_GAME)
|
||||
|
||||
|
||||
# Apply the loaded settings
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# * p_settings: Loaded settings
|
||||
func apply_settings(p_settings: ESCSaveSettings) -> void:
|
||||
if not Engine.is_editor_hint():
|
||||
logger.info("******* settings loaded")
|
||||
if p_settings != null:
|
||||
settings = p_settings
|
||||
else:
|
||||
settings = ESCSaveSettings.new()
|
||||
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_MASTER),
|
||||
linear2db(settings.master_volume)
|
||||
)
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_SFX),
|
||||
linear2db(settings.sfx_volume)
|
||||
)
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_MUSIC),
|
||||
linear2db(settings.music_volume)
|
||||
)
|
||||
AudioServer.set_bus_volume_db(
|
||||
AudioServer.get_bus_index(BUS_SPEECH),
|
||||
linear2db(settings.speech_volume)
|
||||
)
|
||||
TranslationServer.set_locale(settings.text_lang)
|
||||
|
||||
game_scene.apply_custom_settings(settings.custom_settings)
|
||||
run_event_from_script(escoria.start_script, escoria.event_manager.EVENT_INIT)
|
||||
pass
|
||||
|
||||
|
||||
# Input function to manage specific input keys
|
||||
func _input(event):
|
||||
if InputMap.has_action(ESCInputsManager.ESC_SHOW_DEBUG_PROMPT) \
|
||||
and event.is_action_pressed(ESCInputsManager.ESC_SHOW_DEBUG_PROMPT):
|
||||
escoria.main.get_node("layers/debug_layer/esc_prompt_popup").popup()
|
||||
|
||||
|
||||
# Pauses or unpause the game
|
||||
#
|
||||
# #### Parameters
|
||||
# - p_paused: if true, pauses the game. If false, unpauses the game.
|
||||
func set_game_paused(p_paused: bool):
|
||||
if p_paused:
|
||||
emit_signal("paused")
|
||||
else:
|
||||
emit_signal("resumed")
|
||||
# - event: the input event to manage.
|
||||
func _input(event: InputEvent):
|
||||
if InputMap.has_action(ESCInputsManager.ESC_SHOW_DEBUG_PROMPT) \
|
||||
and event.is_action_pressed(ESCInputsManager.ESC_SHOW_DEBUG_PROMPT):
|
||||
main.get_node("layers/debug_layer/esc_prompt_popup").popup()
|
||||
|
||||
var scene_tree = get_tree()
|
||||
|
||||
if is_instance_valid(scene_tree):
|
||||
scene_tree.paused = p_paused
|
||||
if event.is_action_pressed("ui_cancel"):
|
||||
emit_signal("request_pause_menu")
|
||||
pass
|
||||
|
||||
|
||||
# Runs the event "event_name" from the "script" ESC script.
|
||||
@@ -246,121 +131,27 @@ func set_game_paused(p_paused: bool):
|
||||
# - event_name: Name of the event to run
|
||||
func run_event_from_script(script: ESCScript, event_name: String):
|
||||
if script == null:
|
||||
logger.report_errors(
|
||||
"escoria.gd:run_event_from_script()",
|
||||
["Requested action %s on unloaded script %s" % [event_name, script],
|
||||
"Please load the ESC script using esc_compiler.load_esc_file()."]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Requested action %s on unloaded script %s." % [event_name, script] +
|
||||
"Please load the ESC script using esc_compiler.load_esc_file()."
|
||||
)
|
||||
event_manager.queue_event(script.events[event_name])
|
||||
var rc = yield(event_manager, "event_finished")
|
||||
escoria.event_manager.queue_event(script.events[event_name])
|
||||
var rc = yield(escoria.event_manager, "event_finished")
|
||||
while rc[1] != event_name:
|
||||
rc = yield(event_manager, "event_finished")
|
||||
rc = yield(escoria.event_manager, "event_finished")
|
||||
|
||||
if rc[0] != ESCExecution.RC_OK:
|
||||
self.logger.report_errors(
|
||||
"Start event of the start script returned unsuccessful: %d" % rc[0],
|
||||
[]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Start event of the start script returned unsuccessful: %d." % rc[0]
|
||||
)
|
||||
return
|
||||
|
||||
|
||||
# Register a user interface. This should be called in a deferred way
|
||||
# from the addon's _enter_tree.
|
||||
#
|
||||
# #### Parameters
|
||||
# - game_scene: Path to the game scene extending ESCGame
|
||||
func register_ui(game_scene: String):
|
||||
var game_scene_setting_value = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_SCENE
|
||||
)
|
||||
|
||||
if not game_scene_setting_value in [
|
||||
"",
|
||||
game_scene
|
||||
]:
|
||||
logger.report_errors(
|
||||
"escoria.gd:register_ui()",
|
||||
[
|
||||
"Can't register user interface because %s is registered" % \
|
||||
game_scene_setting_value
|
||||
]
|
||||
)
|
||||
escoria.project_settings_manager.set_setting(
|
||||
escoria.project_settings_manager.GAME_SCENE,
|
||||
game_scene
|
||||
)
|
||||
|
||||
|
||||
# Deregister a user interface
|
||||
#
|
||||
# #### Parameters
|
||||
# - game_scene: Path to the game scene extending ESCGame
|
||||
func deregister_ui(game_scene: String):
|
||||
var game_scene_setting_value = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.GAME_SCENE
|
||||
)
|
||||
|
||||
if game_scene_setting_value != game_scene:
|
||||
logger.report_errors(
|
||||
"escoria.gd:deregister_ui()",
|
||||
[
|
||||
(
|
||||
"Can't deregister user interface %s because it " +
|
||||
"is not registered."
|
||||
) % game_scene_setting_value
|
||||
]
|
||||
)
|
||||
escoria.project_settings_manager.set_setting(
|
||||
escoria.project_settings_manager.GAME_SCENE,
|
||||
""
|
||||
)
|
||||
|
||||
|
||||
# Register a dialog manager addon. This should be called in a deferred way
|
||||
# from the addon's _enter_tree.
|
||||
#
|
||||
# #### Parameters
|
||||
# - manager_class: Path to the manager class script
|
||||
func register_dialog_manager(manager_class: String):
|
||||
var dialog_managers: Array = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DIALOG_MANAGERS
|
||||
)
|
||||
|
||||
if manager_class in dialog_managers:
|
||||
return
|
||||
|
||||
dialog_managers.push_back(manager_class)
|
||||
|
||||
escoria.project_settings_manager.set_setting(
|
||||
escoria.project_settings_manager.DIALOG_MANAGERS,
|
||||
dialog_managers
|
||||
)
|
||||
|
||||
|
||||
# Deregister a dialog manager addon
|
||||
#
|
||||
# #### Parameters
|
||||
# - manager_class: Path to the manager class script
|
||||
func deregister_dialog_manager(manager_class: String):
|
||||
var dialog_managers: Array = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DIALOG_MANAGERS
|
||||
)
|
||||
|
||||
if not manager_class in dialog_managers:
|
||||
logger.report_warnings(
|
||||
"escoria.gd:deregister_dialog_manager()",
|
||||
[
|
||||
"Dialog manager %s is not registered" % manager_class
|
||||
]
|
||||
)
|
||||
return
|
||||
|
||||
dialog_managers.erase(manager_class)
|
||||
|
||||
escoria.project_settings_manager.set_setting(
|
||||
escoria.project_settings_manager.DIALOG_MANAGERS,
|
||||
dialog_managers
|
||||
)
|
||||
# Called from escoria autoload to start a new game.
|
||||
func new_game():
|
||||
run_event_from_script(escoria.start_script, escoria.event_manager.EVENT_NEW_GAME)
|
||||
|
||||
|
||||
# Function called to quit the game.
|
||||
@@ -370,19 +161,8 @@ func quit():
|
||||
|
||||
# Handle anything necessary if the game started a scene directly.
|
||||
func _handle_direct_scene_run() -> void:
|
||||
var current_scene_root: Node = get_tree().get_current_scene()
|
||||
|
||||
if current_scene_root == null:
|
||||
# there's no 'current scene'
|
||||
# e.g. you're opening escoria.tscn from the editor
|
||||
return
|
||||
|
||||
if current_scene_root.filename == ProjectSettings.get_setting('application/run/main_scene'):
|
||||
# This is a normal, full-game run, so there's nothing to do.
|
||||
return
|
||||
|
||||
if current_scene_root is ESCRoom:
|
||||
escoria.object_manager.set_current_room(current_scene_root)
|
||||
if escoria.is_direct_room_run:
|
||||
escoria.object_manager.set_current_room(get_tree().get_current_scene())
|
||||
|
||||
|
||||
# Used by game.gd to determine whether the game scene is ready to take inputs
|
||||
@@ -393,5 +173,5 @@ func _handle_direct_scene_run() -> void:
|
||||
# *Returns*
|
||||
# true if game scene is ready for inputs
|
||||
func is_ready_for_inputs() -> bool:
|
||||
return escoria.main.current_scene and escoria.main.current_scene.game \
|
||||
and escoria.main.current_scene.game.room_ready_for_inputs
|
||||
return main.current_scene and main.current_scene.game \
|
||||
and main.current_scene.game.room_ready_for_inputs
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
[ext_resource path="res://addons/escoria-core/game/main.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/escoria-core/game/escoria.gd" type="Script" id=3]
|
||||
|
||||
[node name="escoria" type="Node"]
|
||||
[node name="escoria_scene" type="Node"]
|
||||
pause_mode = 2
|
||||
script = ExtResource( 3 )
|
||||
|
||||
|
||||
@@ -31,6 +31,10 @@ func _ready() -> void:
|
||||
$layers/wait_timer.connect("timeout", self, "_on_wait_finished")
|
||||
|
||||
|
||||
func _exit_tree():
|
||||
$layers/curtain.remove_child(scene_transition)
|
||||
scene_transition.queue_free()
|
||||
|
||||
# Set current scene
|
||||
#
|
||||
# #### Parameters
|
||||
@@ -38,7 +42,10 @@ func _ready() -> void:
|
||||
# - p_scene: Scene to set
|
||||
func set_scene(p_scene: Node) -> void:
|
||||
if !p_scene:
|
||||
escoria.logger.report_errors("main", ["Trying to set empty scene"])
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Can't change to an empty scene. Please specify the scene name."
|
||||
)
|
||||
|
||||
previous_scene = current_scene
|
||||
|
||||
@@ -130,13 +137,11 @@ func set_camera_limits(camera_limit_id: int = 0, scene: Node = current_scene) ->
|
||||
var limits = {}
|
||||
var last_available_camera_limit = scene.camera_limits.size() - 1
|
||||
if camera_limit_id > last_available_camera_limit:
|
||||
escoria.logger.report_errors(
|
||||
"main.gd:set_camera_limits()",
|
||||
[
|
||||
"Camera limit %d requested. Last available camera limit is %d." % [
|
||||
camera_limit_id,
|
||||
last_available_camera_limit
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Camera limit %d requested. Last available camera limit is %d." % [
|
||||
camera_limit_id,
|
||||
last_available_camera_limit
|
||||
]
|
||||
)
|
||||
var scene_camera_limits = scene.camera_limits[camera_limit_id]
|
||||
@@ -151,15 +156,16 @@ func set_camera_limits(camera_limit_id: int = 0, scene: Node = current_scene) ->
|
||||
# to stick centered on the background
|
||||
if area.size.x == 0 or area.size.y == 0 \
|
||||
or area.size < get_viewport().size:
|
||||
escoria.logger.report_warnings(
|
||||
"main.gd:set_camera_limits()",
|
||||
[
|
||||
"No limit area! Using viewport."
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Defined camera is smaller than the viewport. Using viewport size."
|
||||
)
|
||||
area.size = get_viewport().size
|
||||
|
||||
escoria.logger.info("Setting camera limits from scene ", [area])
|
||||
escoria.logger.info(
|
||||
self,
|
||||
"Setting camera limits from scene " + area
|
||||
)
|
||||
limits = ESCCameraLimits.new(
|
||||
area.position.x,
|
||||
area.position.x + area.size.x,
|
||||
@@ -176,8 +182,8 @@ func set_camera_limits(camera_limit_id: int = 0, scene: Node = current_scene) ->
|
||||
scene_camera_limits.size.y
|
||||
)
|
||||
escoria.logger.info(
|
||||
"Setting camera limits from parameter ",
|
||||
[scene_camera_limits]
|
||||
self,
|
||||
"Setting camera limits using configured parameters " + str(scene_camera_limits)
|
||||
)
|
||||
|
||||
escoria.object_manager.get_object(
|
||||
|
||||
@@ -14,8 +14,6 @@ script = ExtResource( 1 )
|
||||
[node name="curtain" type="CanvasLayer" parent="layers"]
|
||||
layer = 20
|
||||
|
||||
[node name="menu" type="CanvasLayer" parent="layers"]
|
||||
|
||||
[node name="wait_timer" type="Timer" parent="layers"]
|
||||
|
||||
[node name="debug_layer" type="CanvasLayer" parent="layers"]
|
||||
|
||||
@@ -1,9 +1,17 @@
|
||||
# Main_scene is the entry point for Godot Engine.
|
||||
# This scene sets up the main menu scene to load.
|
||||
extends Node
|
||||
class_name ESCMain
|
||||
|
||||
var escoria_node: Escoria
|
||||
|
||||
|
||||
# Start the main menu
|
||||
func _ready():
|
||||
escoria.init()
|
||||
|
||||
escoria.logger.info(self, "Escoria starts...")
|
||||
|
||||
escoria_node = preload("res://addons/escoria-core/game/escoria.tscn").instance()
|
||||
add_child(escoria_node)
|
||||
|
||||
if not escoria.is_direct_room_run:
|
||||
escoria_node.init()
|
||||
|
||||
@@ -23,6 +23,12 @@ func _ready():
|
||||
_tween.connect("tween_all_completed", self, "_target_reached")
|
||||
|
||||
|
||||
func _exit_tree():
|
||||
remove_child(_tween)
|
||||
if is_instance_valid(_tween):
|
||||
_tween.queue_free()
|
||||
|
||||
|
||||
# Update the position if the followed target is moving
|
||||
func _process(_delta):
|
||||
if is_instance_valid(_follow_target) and not _tween.is_active() and _follow_target.has_moved():
|
||||
@@ -103,20 +109,19 @@ func set_target(p_target, p_time : float = 0.0):
|
||||
_resolve_target_and_zoom(p_target)
|
||||
|
||||
escoria.logger.info(
|
||||
"Current camera position = %s " % str(self.global_position)
|
||||
self,
|
||||
"Current camera position = %s." % str(self.global_position)
|
||||
)
|
||||
|
||||
if p_time == 0.0:
|
||||
self.global_position = _target
|
||||
else:
|
||||
if _tween.is_active():
|
||||
escoria.logger.report_warnings(
|
||||
"esc_camera.gd:set_target()",
|
||||
[
|
||||
"Tween is still active: %f/%f" % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Tween is still active: %f seconds of %f completed." % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
)
|
||||
_tween.emit_signal("tween_completed")
|
||||
@@ -140,9 +145,9 @@ func set_target(p_target, p_time : float = 0.0):
|
||||
# - p_time: Number of seconds for the camera to reach the zoom level
|
||||
func set_camera_zoom(p_zoom_level: float, p_time: float):
|
||||
if p_zoom_level <= 0.0:
|
||||
escoria.logger.report_errors(
|
||||
"esc_camera.gd:set_camera_zoom()",
|
||||
["Tried to set negative or zero zoom level"]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Tried to set negative or zero zoom level."
|
||||
)
|
||||
|
||||
_zoom_target = Vector2(1, 1) * p_zoom_level
|
||||
@@ -151,13 +156,11 @@ func set_camera_zoom(p_zoom_level: float, p_time: float):
|
||||
self.zoom = _zoom_target
|
||||
else:
|
||||
if _tween.is_active():
|
||||
escoria.logger.report_warnings(
|
||||
"esc_camera.gd:set_camera_zoom()",
|
||||
[
|
||||
"Tween is still active: %f/%f" % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Tween is still active: %f/%f" % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
)
|
||||
_tween.emit_signal("tween_completed")
|
||||
@@ -199,13 +202,11 @@ func push(p_target, p_time: float = 0.0, p_type: int = 0):
|
||||
self.zoom = _zoom_target
|
||||
else:
|
||||
if _tween.is_active():
|
||||
escoria.logger.report_warnings(
|
||||
"esc_camera.gd:push()",
|
||||
[
|
||||
"Tween is still active: %f/%f" % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Tween is still active: %f seconds of %f completed." % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
)
|
||||
_tween.emit_signal("tween_completed", null, null)
|
||||
@@ -251,15 +252,13 @@ func shift(p_target: Vector2, p_time: float, p_type: int):
|
||||
_target = new_pos
|
||||
|
||||
if _tween.is_active():
|
||||
escoria.logger.report_warnings(
|
||||
"esc_camera.gd:set_camera_zoom()",
|
||||
[
|
||||
"Tween is still active: %f/%f" % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
]
|
||||
)
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Tween is still active: %f seconds of %f completed." % [
|
||||
_tween.tell(),
|
||||
_tween.get_runtime()
|
||||
]
|
||||
)
|
||||
_tween.emit_signal("tween_completed")
|
||||
|
||||
_tween.interpolate_property(
|
||||
@@ -276,6 +275,3 @@ func shift(p_target: Vector2, p_time: float, p_type: int):
|
||||
|
||||
func _target_reached():
|
||||
_tween.stop_all()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Describes a bounding box that limits the camera movement in the scene
|
||||
extends Object
|
||||
extends Reference
|
||||
class_name ESCCameraLimits
|
||||
|
||||
|
||||
|
||||
@@ -26,9 +26,15 @@ func set_dialog(new_dialog: ESCDialog) -> void:
|
||||
|
||||
# Show the dialog chooser UI
|
||||
func show_chooser() -> void:
|
||||
escoria.logger.error("Dialog chooser did not implement the show method.")
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Dialog chooser does not implement the show method."
|
||||
)
|
||||
|
||||
|
||||
# Hide the dialog chooser UI
|
||||
func hide_chooser() -> void:
|
||||
escoria.logger.error("Dialog chooser did not implement the hide method.")
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Dialog chooser does not implement the hide method."
|
||||
)
|
||||
|
||||
@@ -62,8 +62,8 @@ func _input(event):
|
||||
# *Returns* The path to the matching voice file
|
||||
func _get_voice_file(key: String, start: String = "") -> String:
|
||||
if start == "":
|
||||
start = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.SPEECH_FOLDER
|
||||
start = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.SPEECH_FOLDER
|
||||
)
|
||||
var _dir = Directory.new()
|
||||
if _dir.open(start) == OK:
|
||||
@@ -80,8 +80,8 @@ func _get_voice_file(key: String, start: String = "") -> String:
|
||||
else:
|
||||
if file_name == "%s.%s.import" % [
|
||||
key,
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.SPEECH_EXTENSION
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.SPEECH_EXTENSION
|
||||
)
|
||||
]:
|
||||
return start.plus_file(file_name.trim_suffix(".import"))
|
||||
@@ -98,12 +98,12 @@ func _get_voice_file(key: String, start: String = "") -> String:
|
||||
# - text: Text to say
|
||||
func say(character: String, type: String, text: String) -> void:
|
||||
if type == "":
|
||||
type = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DEFAULT_DIALOG_TYPE
|
||||
type = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_DIALOG_TYPE
|
||||
)
|
||||
is_speaking = true
|
||||
for _manager_class in escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DIALOG_MANAGERS
|
||||
for _manager_class in ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS
|
||||
):
|
||||
if ResourceLoader.exists(_manager_class):
|
||||
var _manager: ESCDialogManager = load(_manager_class).new()
|
||||
@@ -113,22 +113,18 @@ func say(character: String, type: String, text: String) -> void:
|
||||
_dialog_manager = null
|
||||
|
||||
if _dialog_manager == null:
|
||||
escoria.logger.report_errors(
|
||||
"esc_dialog_player.gd:say",
|
||||
[
|
||||
"No dialog manager supports the type %s" % type
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No dialog manager called %s configured." % type
|
||||
)
|
||||
|
||||
_dialog_manager.connect("say_finished", self, "_on_say_finished", [], CONNECT_ONESHOT)
|
||||
|
||||
var matches = _keytext_regex.search(text)
|
||||
if not matches:
|
||||
escoria.logger.report_errors(
|
||||
"esc_dialog_player.gd:say",
|
||||
[
|
||||
"Unexpected text encountered %s" % text
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Unexpected text encountered : %s." % text
|
||||
)
|
||||
var key = matches.get_string("key")
|
||||
if matches.get_string("key") != "":
|
||||
@@ -136,11 +132,9 @@ func say(character: String, type: String, text: String) -> void:
|
||||
matches.get_string("key")
|
||||
)
|
||||
if _speech_resource == "":
|
||||
escoria.logger.report_warnings(
|
||||
"esc_dialog_player.gd:say",
|
||||
[
|
||||
"Unable to find voice file with key '%s'." % matches.get_string("key")
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Unable to find voice file with key '%s'." % matches.get_string("key")
|
||||
)
|
||||
else:
|
||||
(
|
||||
@@ -153,11 +147,9 @@ func say(character: String, type: String, text: String) -> void:
|
||||
# Only update the text if the translated text was found; otherwise, raise
|
||||
# a warning and use the original, untranslated text.
|
||||
if translated_text == matches.get_string("key"):
|
||||
escoria.logger.report_warnings(
|
||||
"esc_dialog_player.gd:say",
|
||||
[
|
||||
"Unable to find translation key '%s'. Using untranslated text." % matches.get_string("key")
|
||||
]
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"Unable to find translation key '%s'. Using untranslated text." % matches.get_string("key")
|
||||
)
|
||||
text = matches.get_string("text")
|
||||
else:
|
||||
@@ -165,8 +157,8 @@ func say(character: String, type: String, text: String) -> void:
|
||||
else:
|
||||
text = matches.get_string("text")
|
||||
|
||||
_dialog_manager.say(self, character, text, type)
|
||||
|
||||
_dialog_manager.say(self, character, text, type)
|
||||
|
||||
# Handles the end of a say function after it has emitted say_finished.
|
||||
func _on_say_finished():
|
||||
@@ -189,15 +181,15 @@ func speedup() -> void:
|
||||
# - dialog: The dialog to start
|
||||
func start_dialog_choices(dialog: ESCDialog, type: String = "simple"):
|
||||
if dialog.options.empty():
|
||||
escoria.logger.report_errors(
|
||||
"esc_dialog_player.gd:start_dialog_choices()",
|
||||
["Received answers array was empty."]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Received dialog options array was empty."
|
||||
)
|
||||
|
||||
var _dialog_chooser_ui: ESCDialogManager = null
|
||||
|
||||
for _manager_class in escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DIALOG_MANAGERS
|
||||
for _manager_class in ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS
|
||||
):
|
||||
if ResourceLoader.exists(_manager_class):
|
||||
var _manager: ESCDialogManager = load(_manager_class).new()
|
||||
@@ -205,11 +197,9 @@ func start_dialog_choices(dialog: ESCDialog, type: String = "simple"):
|
||||
_dialog_chooser_ui = _manager
|
||||
|
||||
if _dialog_chooser_ui == null:
|
||||
escoria.logger.report_errors(
|
||||
"esc_dialog_player.gd: Unknown chooser type",
|
||||
[
|
||||
"No dialog manager supports the chooser type %s" % type
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"No dialog manager supports the chooser type %s." % type
|
||||
)
|
||||
|
||||
_dialog_chooser_ui.choose(self, dialog)
|
||||
|
||||
@@ -17,9 +17,9 @@ var items_ids_in_inventory: Dictionary = {}
|
||||
# listen when a global has changed
|
||||
func _ready():
|
||||
if inventory_ui_container == null or inventory_ui_container.is_empty():
|
||||
escoria.logger.report_errors(
|
||||
self.get_path(),
|
||||
["Items container is empty."]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Inventory items container is empty."
|
||||
)
|
||||
return
|
||||
|
||||
@@ -43,8 +43,8 @@ func add_new_item_by_id(item_id: String) -> void:
|
||||
if not escoria.object_manager.has(item_id) or not is_instance_valid( \
|
||||
escoria.object_manager.get_object(item_id).node):
|
||||
var inventory_file = "%s/%s.tscn" % [
|
||||
escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.ITEMS_AUTOREGISTER_PATH
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.ITEMS_AUTOREGISTER_PATH
|
||||
).trim_suffix("/"),
|
||||
item_id
|
||||
]
|
||||
@@ -58,11 +58,21 @@ func add_new_item_by_id(item_id: String) -> void:
|
||||
true
|
||||
)
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"inventory_ui.gd:add_new_item_by_id()",
|
||||
[
|
||||
"Item global id '%s' does not exist." % item_id
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
(
|
||||
"Item global id '%s' is not registered because the item's scene file was not found.\n"
|
||||
+ "Attempted scene file path: %s.\n"
|
||||
+ "Please ensure that the '%s' project setting points at **your inventory items folder** (current is: \"%s\")."
|
||||
)
|
||||
% [
|
||||
item_id,
|
||||
inventory_file,
|
||||
ESCProjectSettingsManager.ITEMS_AUTOREGISTER_PATH,
|
||||
ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.ITEMS_AUTOREGISTER_PATH
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
var inventory_item = ESCInventoryItem.new(
|
||||
@@ -90,7 +100,10 @@ func add_new_item_by_id(item_id: String) -> void:
|
||||
# remove item fromInventory UI using its id set in its scene
|
||||
func remove_item_by_id(item_id: String) -> void:
|
||||
if items_ids_in_inventory.has(item_id):
|
||||
var item_inventory_button = items_ids_in_inventory[item_id]
|
||||
var item_inventory = items_ids_in_inventory[item_id]
|
||||
var item_inventory_button = get_node(
|
||||
inventory_ui_container
|
||||
).get_inventory_button(item_inventory)
|
||||
|
||||
if item_inventory_button.is_connected(
|
||||
"mouse_left_inventory_item",
|
||||
@@ -143,7 +156,7 @@ func remove_item_by_id(item_id: String) -> void:
|
||||
"_on_mouse_exited_inventory_item"
|
||||
)
|
||||
|
||||
get_node(inventory_ui_container).remove_item(item_inventory_button)
|
||||
get_node(inventory_ui_container).remove_item(item_inventory)
|
||||
items_ids_in_inventory.erase(item_id)
|
||||
|
||||
|
||||
@@ -158,10 +171,7 @@ func _on_escoria_global_changed(global: String, old_value, new_value) -> void:
|
||||
else:
|
||||
remove_item_by_id(item[0])
|
||||
else:
|
||||
escoria.logger.report_errors(
|
||||
"inventory_ui.gd:_on_escoria_global_changed()",
|
||||
[
|
||||
"Global must contain only one item name.",
|
||||
"(received: %s)" % global
|
||||
]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"Global must contain only one item name (received: %s)." % global
|
||||
)
|
||||
|
||||
@@ -44,9 +44,9 @@ func set_state(p_state: String, p_force: bool = false) -> void:
|
||||
resource.loop_end = resource.mix_rate * resource.get_length()
|
||||
elif "loop" in resource:
|
||||
resource.loop = true
|
||||
if escoria.project_settings_manager.has_setting(escoria.project_settings_manager.MUSIC_VOLUME):
|
||||
stream.volume_db = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.MUSIC_VOLUME
|
||||
if ESCProjectSettingsManager.has_setting(ESCProjectSettingsManager.MUSIC_VOLUME):
|
||||
stream.volume_db = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.MUSIC_VOLUME
|
||||
)
|
||||
stream.play()
|
||||
|
||||
|
||||
@@ -43,9 +43,9 @@ func set_state(p_state: String, p_force: bool = false):
|
||||
resource.loop_mode = AudioStreamSample.LOOP_DISABLED
|
||||
elif "loop" in resource:
|
||||
resource.loop = false
|
||||
if escoria.project_settings_manager.has_setting(escoria.project_settings_manager.SFX_VOLUME):
|
||||
stream.volume_db = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.SFX_VOLUME
|
||||
if ESCProjectSettingsManager.has_setting(ESCProjectSettingsManager.SFX_VOLUME):
|
||||
stream.volume_db = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.SFX_VOLUME
|
||||
)
|
||||
stream.play()
|
||||
|
||||
|
||||
@@ -67,14 +67,14 @@ func transition(
|
||||
_tween.connect("tween_all_completed", self, "_on_tween_completed")
|
||||
|
||||
if transition_name.empty():
|
||||
transition_name = escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.DEFAULT_TRANSITION
|
||||
transition_name = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_TRANSITION
|
||||
)
|
||||
|
||||
if not has_transition(transition_name):
|
||||
escoria.logger.report_errors(
|
||||
"transition: Transition %s not found" % transition_name,
|
||||
[]
|
||||
escoria.logger.error(
|
||||
self,
|
||||
"transition: Transition %s not found" % transition_name
|
||||
)
|
||||
|
||||
# If this is an "instant" transition, we need to set the alpha of the base
|
||||
@@ -122,8 +122,8 @@ func transition(
|
||||
#
|
||||
# *Returns* the full path to the shader or an empty string, if it can't be found
|
||||
func get_transition(name: String) -> String:
|
||||
for directory in escoria.project_settings_manager.get_setting(
|
||||
escoria.project_settings_manager.TRANSITION_PATHS
|
||||
for directory in ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.TRANSITION_PATHS
|
||||
):
|
||||
if ResourceLoader.exists(directory.plus_file("%s.material" % name)):
|
||||
return directory.plus_file("%s.material" % name)
|
||||
@@ -154,5 +154,5 @@ func _on_tween_completed():
|
||||
if not _was_canceled:
|
||||
_tween.stop_all()
|
||||
_tween.remove_all()
|
||||
escoria.logger.debug("Transition %s done." % str(transition_id))
|
||||
escoria.logger.debug(self, "Transition %s done." % str(transition_id))
|
||||
emit_signal("transition_done", transition_id)
|
||||
|
||||
@@ -2,41 +2,28 @@
|
||||
tool
|
||||
extends EditorPlugin
|
||||
|
||||
|
||||
# The path to node 'escoria'.
|
||||
const ESCORIA: String = "/root/escoria"
|
||||
|
||||
|
||||
# Reference to "escoria" singleton instance.
|
||||
var escoria_instance: Node = null
|
||||
|
||||
|
||||
# Returns the 'escoria' singleton/autoload.
|
||||
#
|
||||
# *Returns*
|
||||
# The escoria singleton.
|
||||
func _get_escoria():
|
||||
if not is_instance_valid(escoria_instance):
|
||||
escoria_instance = get_node(ESCORIA)
|
||||
if not is_instance_valid(escoria_instance):
|
||||
printerr(
|
||||
"Escoria could not load the 'escoria' singleton/autoload.\n",
|
||||
"Please try to disable and re-enable 'Escoria' plugin."
|
||||
)
|
||||
|
||||
return escoria_instance
|
||||
# The warning popup displayed on escoria-core enabling.
|
||||
var popup_info: AcceptDialog
|
||||
|
||||
|
||||
# Virtual function called when plugin is enabled.
|
||||
func _enable_plugin():
|
||||
func enable_plugin():
|
||||
add_autoload_singleton(
|
||||
"escoria",
|
||||
"res://addons/escoria-core/game/escoria.tscn"
|
||||
"res://addons/escoria-core/game/esc_autoload.gd"
|
||||
)
|
||||
|
||||
# Prepare settings
|
||||
set_escoria_main_settings()
|
||||
set_escoria_debug_settings()
|
||||
set_escoria_ui_settings()
|
||||
set_escoria_sound_settings()
|
||||
set_escoria_platform_settings()
|
||||
|
||||
# Add input actions in InputMap
|
||||
InputMap.add_action(_get_escoria().inputs_manager.SWITCH_ACTION_VERB)
|
||||
InputMap.add_action(_get_escoria().inputs_manager.ESC_SHOW_DEBUG_PROMPT)
|
||||
# if not InputMap.has_action(ESCInputsManager.SWITCH_ACTION_VERB):
|
||||
# InputMap.add_action(ESCInputsManager.SWITCH_ACTION_VERB)
|
||||
# if not InputMap.has_action(ESCInputsManager.ESC_SHOW_DEBUG_PROMPT):
|
||||
# InputMap.add_action(ESCInputsManager.ESC_SHOW_DEBUG_PROMPT)
|
||||
|
||||
# Define standard settings
|
||||
ProjectSettings.set_setting(
|
||||
@@ -49,92 +36,103 @@ func _enable_plugin():
|
||||
"res://addons/escoria-core/default_bus_layout.tres"
|
||||
)
|
||||
|
||||
popup_info = AcceptDialog.new()
|
||||
popup_info.dialog_text = """You enabled escoria-core plugin.
|
||||
|
||||
Please ignore error messages in Output console and reload your project using
|
||||
Godot editor's "Project / Reload Current Project" menu.
|
||||
"""
|
||||
popup_info.connect("confirmed", self, "_on_warning_popup_confirmed", [], CONNECT_ONESHOT)
|
||||
add_child(popup_info)
|
||||
popup_info.popup_centered()
|
||||
|
||||
|
||||
func _on_warning_popup_confirmed():
|
||||
popup_info.queue_free()
|
||||
|
||||
|
||||
# Virtual function called when plugin is disabled.
|
||||
func _disable_plugin():
|
||||
InputMap.erase_action(_get_escoria().inputs_manager.SWITCH_ACTION_VERB)
|
||||
InputMap.erase_action(_get_escoria().inputs_manager.ESC_SHOW_DEBUG_PROMPT)
|
||||
func disable_plugin():
|
||||
remove_autoload_singleton("escoria")
|
||||
# if InputMap.has_action(ESCInputsManager.SWITCH_ACTION_VERB):
|
||||
# InputMap.erase_action(ESCInputsManager.SWITCH_ACTION_VERB)
|
||||
# if InputMap.has_action(ESCInputsManager.SWITCH_ACTION_VERB):
|
||||
# InputMap.erase_action(ESCInputsManager.SWITCH_ACTION_VERB)
|
||||
|
||||
|
||||
# Setup Escoria
|
||||
func _enter_tree():
|
||||
_enable_plugin()
|
||||
|
||||
pass
|
||||
|
||||
|
||||
func _ready():
|
||||
# Prepare settings
|
||||
set_escoria_main_settings()
|
||||
set_escoria_debug_settings()
|
||||
set_escoria_ui_settings()
|
||||
set_escoria_sound_settings()
|
||||
set_escoria_platform_settings()
|
||||
ProjectSettings.save()
|
||||
ProjectSettings.save_custom("escoria.godot")
|
||||
|
||||
|
||||
# Prepare the settings in the Escoria UI category
|
||||
func set_escoria_ui_settings():
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.DEFAULT_DIALOG_TYPE,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_DIALOG_TYPE,
|
||||
"",
|
||||
{
|
||||
"type": TYPE_STRING
|
||||
}
|
||||
)
|
||||
print("DEFAULT DIALOG TYPE RESET !!!")
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.GAME_SCENE,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.GAME_SCENE,
|
||||
"",
|
||||
{
|
||||
"name": _get_escoria().project_settings_manager.GAME_SCENE,
|
||||
"name": ESCProjectSettingsManager.GAME_SCENE,
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_FILE,
|
||||
"hint_string": "*.tscn, *.scn"
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.ITEMS_AUTOREGISTER_PATH,
|
||||
"res://game/items/escitems/",
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.ITEMS_AUTOREGISTER_PATH,
|
||||
"res://game/items/inventory/",
|
||||
{
|
||||
"name": _get_escoria().project_settings_manager.ITEMS_AUTOREGISTER_PATH,
|
||||
"name": ESCProjectSettingsManager.ITEMS_AUTOREGISTER_PATH,
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_DIR
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.DEFAULT_TRANSITION,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.DEFAULT_TRANSITION,
|
||||
"curtain",
|
||||
{
|
||||
"name": _get_escoria().project_settings_manager.DEFAULT_TRANSITION,
|
||||
"name": ESCProjectSettingsManager.DEFAULT_TRANSITION,
|
||||
"type": TYPE_STRING
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.TRANSITION_PATHS,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.TRANSITION_PATHS,
|
||||
[
|
||||
"res://addons/escoria-core/game/scenes/transitions/shaders/"
|
||||
],
|
||||
{
|
||||
"name": _get_escoria().project_settings_manager.TRANSITION_PATHS,
|
||||
"name": ESCProjectSettingsManager.TRANSITION_PATHS,
|
||||
"type": TYPE_STRING_ARRAY,
|
||||
"hint": PROPERTY_HINT_DIR
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.INVENTORY_ITEM_SIZE,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.INVENTORY_ITEM_SIZE,
|
||||
Vector2(72, 72),
|
||||
{
|
||||
"name": _get_escoria().project_settings_manager.INVENTORY_ITEM_SIZE,
|
||||
"name": ESCProjectSettingsManager.INVENTORY_ITEM_SIZE,
|
||||
"type": TYPE_VECTOR2
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.DIALOG_MANAGERS,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.DIALOG_MANAGERS,
|
||||
[],
|
||||
{
|
||||
"type": TYPE_STRING_ARRAY
|
||||
@@ -144,16 +142,16 @@ func set_escoria_ui_settings():
|
||||
|
||||
# Prepare the settings in the Escoria main category
|
||||
func set_escoria_main_settings():
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.GAME_VERSION,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.GAME_VERSION,
|
||||
"",
|
||||
{
|
||||
"type": TYPE_STRING
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.GAME_START_SCRIPT,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.GAME_START_SCRIPT,
|
||||
"",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -162,16 +160,16 @@ func set_escoria_main_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.FORCE_QUIT,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.FORCE_QUIT,
|
||||
true,
|
||||
{
|
||||
"type": TYPE_BOOL
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.COMMAND_DIRECTORIES,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.COMMAND_DIRECTORIES,
|
||||
[
|
||||
"res://addons/escoria-core/game/core-scripts/esc/commands"
|
||||
],
|
||||
@@ -180,8 +178,8 @@ func set_escoria_main_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.TEXT_LANG,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.TEXT_LANG,
|
||||
TranslationServer.get_locale(),
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -189,8 +187,8 @@ func set_escoria_main_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.VOICE_LANG,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.VOICE_LANG,
|
||||
TranslationServer.get_locale(),
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -198,8 +196,8 @@ func set_escoria_main_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SAVEGAMES_PATH,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SAVEGAMES_PATH,
|
||||
"user://saves/",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -207,8 +205,8 @@ func set_escoria_main_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SETTINGS_PATH,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SETTINGS_PATH,
|
||||
"user://",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -216,8 +214,8 @@ func set_escoria_main_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.GAME_MIGRATION_PATH,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.GAME_MIGRATION_PATH,
|
||||
"",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -228,42 +226,42 @@ func set_escoria_main_settings():
|
||||
|
||||
# Prepare the settings in the Escoria debug category
|
||||
func set_escoria_debug_settings():
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.TERMINATE_ON_WARNINGS,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.TERMINATE_ON_WARNINGS,
|
||||
false,
|
||||
{
|
||||
"type": TYPE_BOOL
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.TERMINATE_ON_ERRORS,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.TERMINATE_ON_ERRORS,
|
||||
true,
|
||||
{
|
||||
"type": TYPE_BOOL
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.DEVELOPMENT_LANG,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.DEVELOPMENT_LANG,
|
||||
"en",
|
||||
{
|
||||
"type": TYPE_STRING
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.LOG_LEVEL,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.LOG_LEVEL,
|
||||
"ERROR",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": "ERROR,WARNING,INFO,DEBUG"
|
||||
"hint_string": "ERROR,WARNING,INFO,DEBUG,TRACE"
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.LOG_FILE_PATH,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.LOG_FILE_PATH,
|
||||
"user://",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -271,8 +269,8 @@ func set_escoria_debug_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.LOG_FILE_PATH,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.CRASH_MESSAGE,
|
||||
"We're sorry, but the game crashed. Please send us the " +
|
||||
"following files:\n\n%s",
|
||||
{
|
||||
@@ -281,28 +279,28 @@ func set_escoria_debug_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.ENABLE_ROOM_SELECTOR,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.ENABLE_ROOM_SELECTOR,
|
||||
false,
|
||||
{
|
||||
"type": TYPE_BOOL
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.ROOM_SELECTOR_ROOM_DIR,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.ROOM_SELECTOR_ROOM_DIR,
|
||||
"",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_DIR
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
|
||||
# Prepare the settings in the Escoria sound settings
|
||||
func set_escoria_sound_settings():
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.MASTER_VOLUME,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.MASTER_VOLUME,
|
||||
1,
|
||||
{
|
||||
"type": TYPE_REAL,
|
||||
@@ -311,8 +309,8 @@ func set_escoria_sound_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.MUSIC_VOLUME,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.MUSIC_VOLUME,
|
||||
1,
|
||||
{
|
||||
"type": TYPE_REAL,
|
||||
@@ -321,8 +319,8 @@ func set_escoria_sound_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SFX_VOLUME,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SFX_VOLUME,
|
||||
1,
|
||||
{
|
||||
"type": TYPE_REAL,
|
||||
@@ -331,8 +329,8 @@ func set_escoria_sound_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SPEECH_VOLUME,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SPEECH_VOLUME,
|
||||
1,
|
||||
{
|
||||
"type": TYPE_REAL,
|
||||
@@ -341,16 +339,16 @@ func set_escoria_sound_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SPEECH_ENABLED,
|
||||
1,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SPEECH_ENABLED,
|
||||
true,
|
||||
{
|
||||
"type": TYPE_BOOL
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SPEECH_FOLDER,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SPEECH_FOLDER,
|
||||
"res://speech",
|
||||
{
|
||||
"type": TYPE_STRING,
|
||||
@@ -358,8 +356,8 @@ func set_escoria_sound_settings():
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SPEECH_EXTENSION,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SPEECH_EXTENSION,
|
||||
"ogg",
|
||||
{
|
||||
"type": TYPE_STRING
|
||||
@@ -374,16 +372,16 @@ func set_escoria_platform_settings():
|
||||
# scenes.
|
||||
# If set to true, all generic scenes (UI, inventory, etc) will be loaded
|
||||
# as any other scene.
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SKIP_CACHE,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SKIP_CACHE,
|
||||
false,
|
||||
{
|
||||
"type": TYPE_BOOL
|
||||
}
|
||||
)
|
||||
|
||||
_get_escoria().project_settings_manager.register_setting(
|
||||
_get_escoria().project_settings_manager.SKIP_CACHE_MOBILE,
|
||||
register_setting(
|
||||
ESCProjectSettingsManager.SKIP_CACHE_MOBILE,
|
||||
true,
|
||||
{
|
||||
"type": TYPE_BOOL
|
||||
@@ -391,7 +389,18 @@ func set_escoria_platform_settings():
|
||||
)
|
||||
|
||||
|
||||
# Uninstall plugin
|
||||
func _exit_tree():
|
||||
_disable_plugin()
|
||||
|
||||
# Register a new project setting if it hasn't been defined already
|
||||
#
|
||||
# #### Parameters
|
||||
#
|
||||
# - name: Name of the project setting
|
||||
# - default: Default value
|
||||
# - info: Property info for the setting
|
||||
static func register_setting(name: String, default, info: Dictionary) -> void:
|
||||
if not ProjectSettings.has_setting(name):
|
||||
ProjectSettings.set_setting(
|
||||
name,
|
||||
default
|
||||
)
|
||||
info.name = name
|
||||
ProjectSettings.add_property_info(info)
|
||||
|
||||
@@ -29,3 +29,16 @@ func remove_item(inventory_item: ESCInventoryItem):
|
||||
if c is ESCInventoryButton and c.global_id == inventory_item.global_id:
|
||||
remove_child(c)
|
||||
c.queue_free()
|
||||
|
||||
|
||||
# Return an Inventory button from the container, using an ESCInventoryItem
|
||||
#
|
||||
# #### Parameters
|
||||
# - inventory_item: Inventory item to return the button node from
|
||||
func get_inventory_button(inventory_item: ESCInventoryItem) -> ESCInventoryButton:
|
||||
var inventory_button = null
|
||||
for c in get_children():
|
||||
if c.global_id == inventory_item.global_id:
|
||||
inventory_button = c
|
||||
break
|
||||
return inventory_button
|
||||
|
||||
@@ -24,6 +24,7 @@ func _ready() -> void:
|
||||
$VBoxContainer/MarginContainer/options/flags
|
||||
for child in _flags_container.get_children():
|
||||
_flags_container.remove_child(child)
|
||||
child.queue_free()
|
||||
|
||||
_loaded_languages = []
|
||||
|
||||
@@ -38,7 +39,6 @@ func _ready() -> void:
|
||||
_flags_container.add_child(_lang)
|
||||
_lang.connect("gui_input", self, "_on_language_input", [lang])
|
||||
|
||||
|
||||
# Show the options
|
||||
func show():
|
||||
backup_settings = escoria.settings.duplicate()
|
||||
|
||||
@@ -12,12 +12,12 @@ var _options_paths = []
|
||||
|
||||
# Build up the list of rooms
|
||||
func _ready():
|
||||
var rooms_folder = ProjectSettings.get_setting(
|
||||
"escoria/debug/room_selector_room_dir"
|
||||
var rooms_folder = ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.ROOM_SELECTOR_ROOM_DIR
|
||||
)
|
||||
if rooms_folder == "" or \
|
||||
not ProjectSettings.get_setting(
|
||||
"escoria/debug/enable_room_selector"
|
||||
not ESCProjectSettingsManager.get_setting(
|
||||
ESCProjectSettingsManager.ENABLE_ROOM_SELECTOR
|
||||
):
|
||||
return
|
||||
var dir = Directory.new()
|
||||
@@ -44,8 +44,10 @@ func _ready():
|
||||
])
|
||||
|
||||
else:
|
||||
escoria.logger.report_warnings("room_select.gd:_ready()",
|
||||
["A problem occurred while opening rooms folder."])
|
||||
escoria.logger.warn(
|
||||
self,
|
||||
"A problem occurred while opening rooms folder %s." % str(path)
|
||||
)
|
||||
|
||||
|
||||
# Switch to the selected room
|
||||
|
||||
Reference in New Issue
Block a user