diff --git a/addons/escoria-core/game/core-scripts/esc_animation_player.gd b/addons/escoria-core/game/core-scripts/esc_animation_player.gd index f3df06e6c..05b443728 100644 --- a/addons/escoria-core/game/core-scripts/esc_animation_player.gd +++ b/addons/escoria-core/game/core-scripts/esc_animation_player.gd @@ -4,6 +4,7 @@ extends Node class_name ESCAnimationPlayer +# Emitted when the animation finsihed playing signal animation_finished(name) @@ -19,6 +20,9 @@ var _animated_sprite: AnimatedSprite # Wether the player node is of type AnimationPlayer (just for convenience) var _is_animation_player: bool = false +# Currently running animation +var _current_animation: String = "" + # Create a new animation player # @@ -32,6 +36,23 @@ func _init(node: Node): _animation_player = node else: _animated_sprite = node + node.add_child(self) + + +# Connect animation signals +func _ready() -> void: + if _is_animation_player: + _player_node.connect( + "animation_finished", + self, + "_on_animation_finished" + ) + else: + _player_node.connect( + "animation_finished", + self, + "_on_animation_finished_animated_sprite" + ) # Return the currently playing animation @@ -70,29 +91,11 @@ func stop(): # - name: The animation name to play # - backwards: Play backwards func play(name: String, backwards: bool = false): - if _player_node.is_connected( - "animation_finished", - self, - "_on_animation_finished" - ): - _player_node.disconnect( - "animation_finished", - self, - "_on_animation_finished" - ) if _is_animation_player: - _player_node.connect( - "animation_finished", - self, - "_on_animation_finished" - ) + _animation_player.seek(0) else: - _player_node.connect( - "animation_finished", - self, - "_on_animation_finished", - [name] - ) + _animated_sprite.frame = 0 + _current_animation = name if backwards and _is_animation_player: _animation_player.play_backwards(name) elif backwards: @@ -151,6 +154,14 @@ func get_length(name: String) -> float: _animated_sprite.frames.get_animation_speed(name) +# Return true if the ESCAnimationPlayer node is valid, ie. it has a valid player +# node. +# **Returns: true if the ESCAnimationPlayer has a valid player node, +# else false** +func is_valid() -> bool: + return _player_node != null and _player_node is Node + + # Transport the animation_finished signal # # #### Parameters @@ -159,16 +170,11 @@ func get_length(name: String) -> float: func _on_animation_finished(name: String): if _is_animation_player and not _animation_player.get_animation(name).loop: _animation_player.stop() - _animation_player.seek(0) elif not _animated_sprite.frames.get_animation_loop(name): _animated_sprite.stop() - _animated_sprite.frame = 0 emit_signal("animation_finished", name) -# Return true if the ESCAnimationPlayer node is valid, ie. it has a valid player -# node. -# **Returns: true if the ESCAnimationPlayer has a valid player node, -# else false** -func is_valid() -> bool: - return _player_node != null and _player_node is Node +# Special signal handler for animated sprites +func _on_animation_finished_animated_sprite(): + _on_animation_finished(_current_animation) diff --git a/addons/escoria-core/game/core-scripts/log/esc_logger.gd b/addons/escoria-core/game/core-scripts/log/esc_logger.gd index 1088e95dc..3764c2444 100644 --- a/addons/escoria-core/game/core-scripts/log/esc_logger.gd +++ b/addons/escoria-core/game/core-scripts/log/esc_logger.gd @@ -208,6 +208,10 @@ func report_errors(p_path: String, errors: Array) -> void: # * message: Message to log # * err: if true, write in stderr func _log(message:String, err: bool = false): + var info = OS.get_datetime() + info["message"] = message + message = "{year}-{month}-{day}T{hour}{minute}{second} {message}" \ + .format(info) if err: printerr(message) else: diff --git a/addons/escoria-core/game/main.gd b/addons/escoria-core/game/main.gd index 98a77c451..0ce054448 100644 --- a/addons/escoria-core/game/main.gd +++ b/addons/escoria-core/game/main.gd @@ -61,9 +61,10 @@ func clear_scene() -> void: if escoria.game_scene.get_parent() == current_scene: current_scene.remove_child(escoria.game_scene) - + current_scene.get_parent().remove_child(current_scene) - current_scene.free() + + current_scene.queue_free() current_scene = null