saumwacht-godot/scripts/luneraria/ui/components/hp_bar.gd
Martin Stickelbroeck 1b540f2a55 G3 (Zwischenstand): neues Ingame-HUD; Projekt wechselt nach Unity
Nicht abgenommen: Nach dem ersten Spieltest wurde entschieden, Champions of
Luneraria nach Unity 6 zu portieren. Dieser Stand ist die Referenz für das
HUD im Unity-Projekt (../luneraria-unity).

- HUD neu aus Komponenten mit eigenem Theme, Porträts aus den echten Modellen
  (einmal gerendert, zwischengespeichert), Lane-Übersicht mit deterministischer
  Bedrohung aus öffentlichem Zustand, Bossgrotte, nächste Welle, Ereignisse,
  Minimap mit zusammengefassten Armeen, Held/Items/Talente, Einheitendetails,
  Angriffschampions, Bereit-Sperre, UI-Größe, Team-Formen statt nur Farben
- Privatsphäre über LuneHudModel: fremdes Gold und fremde Entwürfe erscheinen nie
- Keine Regeländerung: Regeln 91/91, M2 73/73, Netz 43/43; verify_g3 715/715;
  verify_m1 38/38 und verify_m2 14/14 mit angepassten UI-Treibern
- Spieltest bis Welle 8 über die echte Oberfläche, Befunde in G3-HUD.md
- HELDEN-KONZEPT.md: vom Projektinhaber vorgegebene Helden (nicht umgesetzt)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 19:59:55 +02:00

41 lines
1.3 KiB
GDScript

class_name LuneHpBar
extends Control
## Thin value bar drawn directly: dark track, fill, a top highlight and optional ticks.
var fraction: float = 1.0:
set(value):
value = clampf(value, 0.0, 1.0)
if absf(value - fraction) > .0005:
fraction = value
queue_redraw()
var fill: Color = LuneUiTheme.GOOD:
set(value):
if value != fill:
fill = value
queue_redraw()
var ticks: int = 0
var track: Color = Color(0, 0, 0, .55)
func _init() -> void:
mouse_filter = Control.MOUSE_FILTER_IGNORE
custom_minimum_size = Vector2(60, 6)
func _draw() -> void:
var rect := Rect2(Vector2.ZERO, size)
draw_rect(rect, track)
if fraction > 0.0:
var filled := Rect2(Vector2.ZERO, Vector2(maxf(1.0, size.x * fraction), size.y))
draw_rect(filled, fill)
draw_line(Vector2(0, .5), Vector2(filled.size.x, .5), Color(1, 1, 1, .28), 1.0)
for index: int in range(1, ticks):
var x: float = roundf(size.x * float(index) / float(ticks))
draw_line(Vector2(x, 0), Vector2(x, size.y), Color(0, 0, 0, .45), 1.0)
draw_rect(rect, Color(1, 1, 1, .12), false, 1.0)
## Green above 60 %, amber above 30 %, red below; the team colour when given.
static func health_color(value: float, base: Color = LuneUiTheme.GOOD) -> Color:
if value > .6:
return base
if value > .3:
return LuneUiTheme.WARN
return LuneUiTheme.DANGER