Files
mmo/scripts/components/shield.gd
Marek Lenczewski 04749104a0 update
2026-03-30 22:56:58 +02:00

58 lines
1.8 KiB
GDScript

extends Node
@export var stats: EntityStats
var max_shield: float
var regen_delay: float
var regen_time: float
var current_shield: float
var regen_timer := 0.0
var base_max_shield: float
func _ready() -> void:
max_shield = stats.max_shield
base_max_shield = max_shield
regen_delay = stats.shield_regen_delay
regen_time = stats.shield_regen_time
current_shield = max_shield
EventBus.role_changed.connect(_on_role_changed)
func _process(delta: float) -> void:
if max_shield <= 0:
return
if current_shield < max_shield:
regen_timer += delta
if regen_timer >= regen_delay:
current_shield += (max_shield / regen_time) * delta
if current_shield >= max_shield:
current_shield = max_shield
EventBus.shield_regenerated.emit(get_parent())
EventBus.shield_changed.emit(get_parent(), current_shield, max_shield)
func _on_role_changed(_player: Node, _role_type: int) -> void:
if get_parent() != _player:
return
var role: Node = get_parent().get_node_or_null("Role")
if not role:
return
var ability_set: AbilitySet = role.get_ability_set()
if not ability_set:
return
max_shield = base_max_shield
for ability in ability_set.abilities:
if ability and ability.type == Ability.Type.PASSIVE and ability.passive_stat == "shield":
max_shield = base_max_shield * (1.0 + ability.damage / 100.0)
current_shield = min(current_shield, max_shield)
EventBus.shield_changed.emit(get_parent(), current_shield, max_shield)
func absorb(amount: float) -> float:
if current_shield <= 0:
return amount
regen_timer = 0.0
var absorbed: float = min(amount, current_shield)
current_shield -= absorbed
if current_shield <= 0:
EventBus.shield_broken.emit(get_parent())
EventBus.shield_changed.emit(get_parent(), current_shield, max_shield)
return amount - absorbed