TowerDefense/enemies/enemy.gd

75 lines
1.6 KiB
GDScript3
Raw Normal View History

2025-03-26 18:55:43 +01:00
extends CharacterBody3D
class_name Enemy
2025-04-02 18:02:13 +02:00
@onready var death_vfx_packed : PackedScene = preload("res://VFX/death_particles.tscn")
@onready var sad_vfx_packed : PackedScene = preload("res://VFX/sad_particles.tscn")
2025-03-26 18:55:43 +01:00
@export var speed : int = 2
@export var base_attack_damage : int = 1
2025-04-02 18:02:13 +02:00
@export var max_life : int = 10
2025-06-18 12:19:43 +02:00
@export var money : int = 50
2025-04-02 18:02:13 +02:00
var health : int = 0 :
2025-03-26 18:55:43 +01:00
set(value):
health = value
2025-04-02 18:02:13 +02:00
if health >= max_life and is_alive:
2025-03-26 18:55:43 +01:00
death()
@onready var Path : PathFollow3D = get_parent()
2025-04-02 18:02:13 +02:00
var attack_target : Node3D :
set(value):
attack_target = value
if value:
movement_stop = true
else:
movement_stop = false
2025-03-26 18:55:43 +01:00
var is_alive : bool = true
var movement_stop : bool = false
2025-03-26 18:55:43 +01:00
2025-04-02 18:02:13 +02:00
func _ready() -> void:
$HealthBar3D.set_up(health, max_life)
2025-03-26 18:55:43 +01:00
func _physics_process(delta: float) -> void:
2025-04-02 18:02:13 +02:00
if !is_alive:
return
if not movement_stop:
Path.set_progress(Path.get_progress() + speed * delta)
2025-06-18 12:19:43 +02:00
if attack_target:
attack()
2025-03-26 18:55:43 +01:00
func take_damage(damage : int) -> void:
2025-04-02 18:02:13 +02:00
health += damage
$HealthBar3D.update(health)
2025-03-26 18:55:43 +01:00
func attack():
if $AttackCooldown.is_stopped():
$AttackCooldown.start()
attack_target.take_damage(base_attack_damage)
2025-03-26 18:55:43 +01:00
func death() -> void:
is_alive = false
2025-08-20 00:58:53 +02:00
GameManager.enemies_alive -= 1
2025-06-18 12:19:43 +02:00
EventBus.money_received.emit(money)
2025-04-02 18:02:13 +02:00
$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
2025-03-26 18:55:43 +01:00
Path.queue_free()
func _on_attack_range_body_entered(body: Node3D) -> void:
if body is TheCube:
attack_target = body
2025-06-18 12:19:43 +02:00
func _on_attack_range_body_exited(body: Node3D) -> void:
if body is TheCube:
attack_target = null