extends CanvasLayer const _GOLD := Color(1.00, 0.78, 0.22) const _CREAM := Color(0.93, 0.88, 0.72) const _BAR_W: float = 260.0 const _BAR_H: float = 18.0 const _BAR_BG: Color = Color(0.12, 0.04, 0.04, 0.88) const _BAR_FILL: Color = Color(0.65, 0.08, 0.06) const _BAR_ENRAGE: Color = Color(0.90, 0.32, 0.06) var _bear: Node = null var _fill: ColorRect = null var _label: Label = null var _max_hp: int = 1 var _current_hp: int = 1 func _ready() -> void: layer = 10 _build_ui() _find_bear.call_deferred() func _find_bear() -> void: var bears := get_tree().get_nodes_in_group(&"bear") if bears.is_empty(): return _bear = bears[0] _bear.health_changed.connect(_on_health_changed) _bear.killed.connect(_on_bear_killed) var max_hp := int(DP.f("bear_max_hp")) _on_health_changed(_bear.get_hp(), max_hp) func _on_health_changed(current: int, max_hp: int) -> void: _current_hp = current _max_hp = max_hp _update_bar() func _on_bear_killed() -> void: _current_hp = 0 _update_bar() func _update_bar() -> void: if _fill == null: return var frac := 0.0 if _max_hp <= 0 else clampf(float(_current_hp) / float(_max_hp), 0.0, 1.0) _fill.size.x = _BAR_W * frac var enrage_frac: float = DP.f("bear_enrage_frac") _fill.color = _BAR_FILL.lerp(_BAR_ENRAGE, 1.0 - frac / enrage_frac if frac < enrage_frac else 0.0) if _label != null: _label.text = "BEAR %d / %d" % [maxi(_current_hp, 0), _max_hp] func _build_ui() -> void: var panel := PanelContainer.new() panel.add_theme_stylebox_override( "panel", UiTheme.plaque(UiTheme.LEATHER, UiTheme.BORDER, 4, 14.0, 8.0)) panel.anchor_left = 0.5 panel.anchor_right = 0.5 panel.anchor_top = 0.0 panel.anchor_bottom = 0.0 panel.grow_horizontal = Control.GROW_DIRECTION_BOTH panel.offset_top = 16.0 panel.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(panel) var col := VBoxContainer.new() col.add_theme_constant_override("separation", 5) col.mouse_filter = Control.MOUSE_FILTER_IGNORE panel.add_child(col) _label = Label.new() _label.text = "BEAR" _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _label.add_theme_font_override("font", UiFonts.body()) _label.add_theme_color_override("font_color", _GOLD) _label.add_theme_color_override("font_outline_color", Color(0, 0, 0, 0.85)) _label.add_theme_constant_override("outline_size", 3) _label.add_theme_font_size_override("font_size", 13) _label.mouse_filter = Control.MOUSE_FILTER_IGNORE col.add_child(_label) var bar_bg := PanelContainer.new() bar_bg.custom_minimum_size = Vector2(_BAR_W, _BAR_H) bar_bg.clip_contents = true var bg_style := StyleBoxFlat.new() bg_style.bg_color = _BAR_BG bg_style.set_corner_radius_all(4) bg_style.corner_detail = 4 bg_style.border_width_bottom = 2 bg_style.border_color = Color(UiTheme.GOLD.r, UiTheme.GOLD.g, UiTheme.GOLD.b, 0.35) bar_bg.add_theme_stylebox_override("panel", bg_style) bar_bg.mouse_filter = Control.MOUSE_FILTER_IGNORE col.add_child(bar_bg) _fill = ColorRect.new() _fill.color = _BAR_FILL _fill.size = Vector2(_BAR_W, _BAR_H) _fill.mouse_filter = Control.MOUSE_FILTER_IGNORE bar_bg.add_child(_fill)