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>
41 lines
1.7 KiB
GDScript
41 lines
1.7 KiB
GDScript
class_name LuneTowerIndicator
|
|
extends Control
|
|
## One building as a symbol in the team's shape language (round = Blau, angular = Rot) with
|
|
## its HP as a bar underneath. Destroyed buildings remain as a hollow outline with a cross.
|
|
|
|
var team: int = 0
|
|
var tier: String = "outer"
|
|
var alive: bool = true
|
|
var fraction: float = 1.0
|
|
var attackable: bool = false
|
|
|
|
func _init() -> void:
|
|
mouse_filter = Control.MOUSE_FILTER_PASS
|
|
custom_minimum_size = Vector2(22, 27)
|
|
|
|
func set_state(is_alive: bool, hp_fraction: float, is_attackable: bool) -> bool:
|
|
var value: float = snappedf(clampf(hp_fraction, 0.0, 1.0), .01)
|
|
if is_alive == alive and is_equal_approx(value, fraction) and is_attackable == attackable:
|
|
return false
|
|
alive = is_alive
|
|
fraction = value
|
|
attackable = is_attackable
|
|
queue_redraw()
|
|
return true
|
|
|
|
func _draw() -> void:
|
|
var edge: float = minf(size.x, size.y - 5.0)
|
|
var box := Rect2(Vector2((size.x - edge) * .5, 0), Vector2(edge, edge))
|
|
var tint: Color = LuneUiTheme.team_color(team)
|
|
var shape: String = "shape_%d" % clampi(team, 0, 1)
|
|
if alive:
|
|
LuneGlyphs.draw(self, shape, box, LuneUiTheme.TEAM_DARK[clampi(team, 0, 1)].lightened(.1))
|
|
LuneGlyphs.draw(self, shape, box.grow(-edge * .08), Color(tint, .35))
|
|
LuneGlyphs.draw(self, "ancient" if tier == "core" else "tower", box.grow(-edge * .24), Color("f4efe4"))
|
|
var bar := Rect2(Vector2(box.position.x + 1, size.y - 3), Vector2(box.size.x - 2, 3))
|
|
draw_rect(bar, Color(0, 0, 0, .6))
|
|
draw_rect(Rect2(bar.position, Vector2(bar.size.x * fraction, bar.size.y)), LuneHpBar.health_color(fraction, tint))
|
|
else:
|
|
var outline := Color(.5, .52, .55, .8)
|
|
LuneGlyphs.draw(self, shape, box, Color(0, 0, 0, .35))
|
|
LuneGlyphs.draw(self, "close", box.grow(-edge * .18), outline)
|