update
This commit is contained in:
38
scripts/systems/shield_system.gd
Normal file
38
scripts/systems/shield_system.gd
Normal file
@@ -0,0 +1,38 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user