class_name QuestSprite extends Control @onready var lifebar : TextureProgressBar = $LifeBar var life : int = 1 var max_life : int = 1 var energy : int = 1 var max_energy : int = 1 var level : int = 1 var exp : int = 0 var reset_position : Vector2 var melee_range : float = 100 @export var stats : StatBlock var gold : int = 0 @onready var anim_player : AnimationPlayer = $AnimationPlayer signal died(killer :QuestSprite) signal action_complete(requeue : bool) signal busy() signal arrived() func position_reset() -> void: var tween = create_tween() #TODO: Vary movement animations? tween.tween_callback(anim_player.play.bind("running")) tween.tween_property(self, "position", reset_position,.75) if reset_position.x < position.x: $Sprite.flip_h = true tween.tween_property($Sprite, "flip_h", false, 0) tween.tween_callback(anim_player.play.bind("idle")) tween.tween_callback(arrived.emit) func approach(target, offset) -> void: var tween = create_tween() if target.position.x > position.x: #TODO: Switch facing direction offset = -offset #TODO: Vary movement animations? tween.tween_callback(anim_player.play.bind("running")) var target_position = target.position + Vector2(offset, 0) tween.tween_property(self, "position", target_position,.75) if target_position.x < position.x: $Sprite.flip_h = true tween.tween_property($Sprite, "flip_h", false, 0) tween.tween_callback(anim_player.play.bind("idle")) tween.tween_callback(arrived.emit) func attack(target : QuestSprite) -> void: print("Attack by %s to %s" % [name, target.name]) target.take_damage(self, 10) action_complete.emit(true) func take_damage(source : QuestSprite, amount : int) -> void: busy.emit() life = clampi(life - amount, 0, max_life) lifebar.value = life * 100 / max_life if life == 0: print("%s killed %s!" % [source.name, name]) die(source) else: print("%s hit %s for %d damage!" % [source.name, name, amount]) action_complete.emit(false) func die(killer : QuestSprite) -> void: died.emit(killer) queue_free()