class_name HudOverlay extends Control ## Zeichnet Lebens- und Manabalken, Rolle und Sterne über die 3D-Einheiten. var board: BoardView3D = null var _font: Font func _ready() -> void: _font = ThemeDB.fallback_font mouse_filter = Control.MOUSE_FILTER_IGNORE set_process(true) func _process(_delta: float) -> void: queue_redraw() func _draw() -> void: if board == null or board.camera == null: return var cam := board.camera for d in board.draw_units: var world: Vector3 = d["pos"] if cam.is_position_behind(world): continue var head := cam.unproject_position(world + Vector3(0.0, 1.35, 0.0)) var foot := cam.unproject_position(world + Vector3(0.0, 0.05, 0.0)) var a: Avatar = d["avatar"] var side: int = d["side"] # Balkenbreite nach Entfernung, damit nahe Einheiten größer wirken. var bw: float = clampf(absf(foot.y - head.y) * 0.85, 26.0, 70.0) var bx := head.x - bw * 0.5 var by := head.y - 4.0 draw_rect(Rect2(bx - 1.0, by - 1.0, bw + 2.0, 8.0), Color(0.05, 0.05, 0.07, 0.85)) draw_rect(Rect2(bx, by, bw * clampf(d["hp"], 0.0, 1.0), 6.0), Color(0.35, 0.85, 0.42) if side == 0 else Color(0.92, 0.38, 0.38)) if d["mana"] > 0.0: draw_rect(Rect2(bx, by + 7.0, bw, 4.0), Color(0.05, 0.05, 0.07, 0.85)) draw_rect(Rect2(bx, by + 7.0, bw * clampf(d["mana"], 0.0, 1.0), 4.0), Color(0.35, 0.62, 0.95)) # Sterne for s in a.star: draw_circle(Vector2(bx + bw * 0.5 - 7.0 + 7.0 * float(s), by - 7.0), 2.6, Color(1.0, 0.85, 0.25)) # Rolle draw_string(_font, Vector2(bx + bw + 4.0, by + 7.0), Data.ROLE_SHORT[a.role], HORIZONTAL_ALIGNMENT_LEFT, -1, 13, Color(0.9, 0.9, 0.95, 0.9)) if d["cast"]: draw_arc(foot, bw * 0.55, 0.0, TAU, 24, Color(1.0, 0.95, 0.5, 0.9), 2.5)