71 lines
2.0 KiB
GDScript
71 lines
2.0 KiB
GDScript
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()
|