extends Node func _process(delta: float) -> void: for entity in Stats.entities: if not is_instance_valid(entity): continue var data: Dictionary = Stats.entities[entity] if not data["alive"]: continue var max_shield: float = data["max_shield"] if max_shield <= 0: continue var shield: float = data["shield"] if shield < max_shield: data["shield_regen_timer"] += delta if data["shield_regen_timer"] >= data["shield_regen_delay"]: var regen_rate: float = max_shield / data["shield_regen_time"] shield += regen_rate * delta if shield >= max_shield: shield = max_shield EventBus.shield_regenerated.emit(entity) data["shield"] = shield EventBus.shield_changed.emit(entity, shield, max_shield) func absorb(entity: Node, amount: float) -> float: var shield: float = Stats.get_stat(entity, "shield") if shield == null or shield <= 0: return amount Stats.set_stat(entity, "shield_regen_timer", 0.0) var absorbed: float = min(amount, shield) shield -= absorbed Stats.set_stat(entity, "shield", shield) var max_shield: float = Stats.get_stat(entity, "max_shield") if shield <= 0: EventBus.shield_broken.emit(entity) EventBus.shield_changed.emit(entity, shield, max_shield) return amount - absorbed