diff --git a/scripts/components/damage.gd b/scripts/components/damage.gd new file mode 100644 index 0000000..bcd6ce5 --- /dev/null +++ b/scripts/components/damage.gd @@ -0,0 +1,7 @@ +class_name DamageComponent +extends Node2D + +@export var damage: float = 0.25 + +func deal_damage(target: HealthComponent): + target.decrease_health(damage) diff --git a/scripts/components/health.gd b/scripts/components/health.gd new file mode 100644 index 0000000..fc09ff3 --- /dev/null +++ b/scripts/components/health.gd @@ -0,0 +1,53 @@ +class_name HealthComponent +extends Node2D + +@export var health: float = 1.0 +@export var max_health: float = 1.0 + +signal on_health_change(delta: float) +signal on_death + +func _get_delta(value: float) -> float: + var old_value = health + return value - old_value + +func set_health(new_value: float): + var delta = _get_delta(new_value) + + if new_value >= max_health: + health = max_health + on_health_change.emit(delta) + return + + health = new_value + + if health <= 0: + on_death.emit() + return + + on_health_change.emit(delta) + +func decrease_health(value: float): + var delta = _get_delta(value) + + health -= value + + if health <= 0: + on_death.emit() + return + + on_health_change.emit(delta) + +func increase_health(value: float): + var delta = _get_delta(value) + + health += value + + if health >= max_health: + health = max_health + on_health_change.emit(delta) + return + + health += value + on_health_change.emit(delta) +