class_name EnergyBar extends HBoxContainer @export var segment_count := 10 var segments: Array[Panel] = [] func _ready() -> void: _build_segments() _event_bus().connect("player_energy_changed", refresh) func refresh(current: float, maximum: float) -> void: if segments.is_empty(): _build_segments() var filled := clampi(int(round(current)), 0, min(segment_count, int(maximum))) for index: int in range(segments.size()): segments[index].modulate = Color(1.0, 1.0, 1.0, 1.0 if index < filled else 0.35) func _build_segments() -> void: if not segments.is_empty(): return for child: Node in get_children(): var panel := child as Panel if panel != null: segments.append(panel) if segments.size() >= segment_count: return for index: int in range(segments.size(), segment_count): var panel := Panel.new() panel.custom_minimum_size = Vector2(23, 16) panel.modulate = Color(1.0, 1.0, 1.0, 0.35) panel.add_theme_stylebox_override("panel", _make_segment_style()) add_child(panel) segments.append(panel) func _make_segment_style() -> StyleBoxFlat: var style := StyleBoxFlat.new() style.bg_color = Color(0.18, 0.66, 0.95, 1.0) style.border_width_left = 1 style.border_width_top = 1 style.border_width_right = 1 style.border_width_bottom = 1 style.border_color = Color(0.66, 0.92, 1.0, 0.9) return style 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