class_name EnergyComponent extends Node signal energy_changed(current: int, maximum: int) @export var maximum := 10 @export var current := 0 func _ready() -> void: _emit_changed() func set_values(next_current: int, next_maximum: int) -> void: maximum = max(1, next_maximum) current = clampi(next_current, 0, maximum) _emit_changed() func set_current(next_current: int) -> void: var clamped := clampi(next_current, 0, maximum) if clamped == current: return current = clamped _emit_changed() func change(delta: int) -> void: set_current(current + delta) func spend(cost: float) -> bool: var int_cost := int(ceil(cost)) if int_cost <= 0: return true if current < int_cost: return false set_current(current - int_cost) return true func _emit_changed() -> void: energy_changed.emit(current, maximum) _event_bus().emit_signal("player_energy_changed", float(current), float(maximum)) func _event_bus() -> Node: var root := get_tree().root var bus := root.get_node_or_null("EventBus") if bus == null: bus = load("res://autoload/event_bus.gd").new() bus.name = "EventBus" root.add_child(bus) return bus