106 lines
3.1 KiB
GDScript
106 lines
3.1 KiB
GDScript
extends CanvasLayer
|
|
|
|
const _GOLD := Color(1.00, 0.78, 0.22)
|
|
const _CREAM := Color(0.93, 0.88, 0.72)
|
|
|
|
const _BAR_W: float = 1260.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" % [maxi(_current_hp, 0), _max_hp]
|
|
## for hp display in numbers write %d / %d
|
|
|
|
|
|
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", 30)
|
|
_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)
|