extends CharacterBody3D class_name Enemy signal died @onready var death_vfx_packed : PackedScene = preload("res://VFX/death_particles.tscn") @onready var sad_vfx_packed : PackedScene = preload("res://VFX/sad_particles.tscn") @export var speed : int = 1 @export var base_attack_damage : int = 1 @export var max_life : int = 5 @export var money : int = 5 var health : int = 0 : set(value): health = value if health >= max_life and is_alive: death() @onready var path : PathFollow3D = get_parent() @onready var healthBar : ProgressBar = $HealthBar3D/SubViewport/HealthBar2D @onready var progress : float : get(): return $"..".progress var attack_target : Node3D var is_alive : bool = true func _ready() -> void: healthBar.value = health healthBar.max_value = max_life func _physics_process(delta: float) -> void: if !is_alive: return if attack_target: attack() else: path.progress += speed * delta func take_damage(damage : int) -> void: health += damage healthBar.visible = true healthBar.value = health func attack(): if $AttackCooldown.is_stopped(): $AttackCooldown.start() attack_target.take_damage(base_attack_damage) func death() -> void: is_alive = false died.emit() Game.money += money $Sprite3D.visible = false var death_vfx : CPUParticles3D = death_vfx_packed.instantiate() get_tree().current_scene.add_child(death_vfx) death_vfx.global_position = global_position path.queue_free() func _on_attack_range_body_entered(body: Node3D) -> void: if body is TheCube: attack_target = body func _on_attack_range_body_exited(body: Node3D) -> void: if body is TheCube: attack_target = null