2025-09-23 15:10:45 +02:00
|
|
|
class_name EnemyHurtbox extends Area2D
|
2025-09-16 14:59:40 +02:00
|
|
|
|
2025-10-15 16:00:47 +02:00
|
|
|
# HP Management
|
2025-09-16 14:59:40 +02:00
|
|
|
@export var max_hp : int
|
2025-10-15 16:00:47 +02:00
|
|
|
@onready var hp = max_hp :
|
|
|
|
|
set(new_hp):
|
|
|
|
|
if new_hp > max_hp:
|
|
|
|
|
new_hp = max_hp
|
|
|
|
|
if new_hp < 0 :
|
|
|
|
|
new_hp = 0
|
|
|
|
|
hp = new_hp
|
|
|
|
|
if hp == 0:
|
|
|
|
|
die()
|
2025-09-23 13:36:19 +02:00
|
|
|
@export var flash_duration = 0.2
|
2025-09-18 03:09:00 +02:00
|
|
|
@export var canvasItem : CanvasItem
|
|
|
|
|
@export var flashColor : Color = Color(1.5, 1.5, 1.5)
|
2025-10-15 16:00:47 +02:00
|
|
|
|
|
|
|
|
# Instance-Specific Damage Cooldown
|
2025-09-23 15:10:45 +02:00
|
|
|
@export var id_block_time = 0.12
|
2025-09-23 13:36:19 +02:00
|
|
|
var blocked_damage_ids : Array[int] = []
|
2025-09-16 14:59:40 +02:00
|
|
|
|
2025-09-23 15:10:45 +02:00
|
|
|
signal damage_taken(damage, dir, id)
|
2025-09-16 14:59:40 +02:00
|
|
|
signal died
|
|
|
|
|
|
2025-10-15 16:00:47 +02:00
|
|
|
# Reset Hit Flash
|
|
|
|
|
func _on_flash_ended():
|
|
|
|
|
if canvasItem != null:
|
2025-09-18 03:09:00 +02:00
|
|
|
canvasItem.modulate = Color(1,1,1)
|
2025-09-16 14:59:40 +02:00
|
|
|
|
2025-10-02 15:08:59 +02:00
|
|
|
func hurt(damage : int, dir : Vector2 = Vector2.ZERO, id : int = -1) -> bool:
|
2025-09-23 13:36:19 +02:00
|
|
|
if not id in blocked_damage_ids:
|
|
|
|
|
block_id(id)
|
2025-09-18 03:09:00 +02:00
|
|
|
if canvasItem != null: canvasItem.modulate = flashColor
|
2025-10-17 12:54:05 +02:00
|
|
|
if has_node("FlashTimer"): $FlashTimer.start(flash_duration)
|
2025-10-15 16:00:47 +02:00
|
|
|
hp -= damage
|
2025-09-23 15:10:45 +02:00
|
|
|
damage_taken.emit(damage, dir, id)
|
2025-10-02 15:08:59 +02:00
|
|
|
return true
|
|
|
|
|
return false
|
2025-09-23 13:36:19 +02:00
|
|
|
|
2025-10-15 16:00:47 +02:00
|
|
|
# When taking damage, prevent damage from that instance for id_block_time.
|
2025-09-23 13:36:19 +02:00
|
|
|
func block_id(id : int):
|
|
|
|
|
blocked_damage_ids.append(id)
|
|
|
|
|
await get_tree().create_timer(id_block_time).timeout
|
|
|
|
|
var id_pos = blocked_damage_ids.find(id)
|
|
|
|
|
if not id_pos == -1: blocked_damage_ids.remove_at(id_pos)
|
|
|
|
|
|
2025-09-16 14:59:40 +02:00
|
|
|
func die():
|
|
|
|
|
died.emit()
|
2025-09-18 18:10:44 +02:00
|
|
|
|
|
|
|
|
func destroy():
|
2025-10-15 16:00:47 +02:00
|
|
|
hurt(10 * max_hp)
|