39 lines
1.3 KiB
GDScript
39 lines
1.3 KiB
GDScript
extends Node
|
|
|
|
func _ready() -> void:
|
|
EventBus.damage_requested.connect(_on_damage_requested)
|
|
|
|
func _on_damage_requested(attacker: Node, target: Node, amount: float) -> void:
|
|
var remaining: float = amount
|
|
var shield_system: Node = get_node_or_null("../ShieldSystem")
|
|
if shield_system:
|
|
remaining = shield_system.absorb(target, remaining)
|
|
EventBus.damage_dealt.emit(attacker, target, amount)
|
|
if remaining > 0:
|
|
_apply_damage(target, remaining)
|
|
|
|
func _apply_damage(entity: Node, amount: float) -> void:
|
|
if entity == _get_player():
|
|
var health: float = PlayerData.health - amount
|
|
if health < 0:
|
|
health = 0
|
|
PlayerData.set_health(health)
|
|
elif entity.is_in_group("boss"):
|
|
var health: float = BossData.get_stat(entity, "health") - amount
|
|
if health < 0:
|
|
health = 0
|
|
BossData.set_health(entity, health)
|
|
elif entity.is_in_group("enemies"):
|
|
var health: float = EnemyData.get_stat(entity, "health") - amount
|
|
if health < 0:
|
|
health = 0
|
|
EnemyData.set_health(entity, health)
|
|
elif entity.is_in_group("portals"):
|
|
var health: float = PortalData.get_stat(entity, "health") - amount
|
|
if health < 0:
|
|
health = 0
|
|
PortalData.set_health(entity, health)
|
|
|
|
func _get_player() -> Node:
|
|
return get_tree().get_first_node_in_group("player")
|