class_name ElementView extends Control ## Elementpaare einer Seite als Liste neben ihrem Brett. Es stehen nur Elemente mit offenen Wesen ## da: je Zeile Name, zweimal das Symbol seines Sondereffekts (leuchtend je offenem Wesen, beide: ## Effekt aktiv; Neutral hat keinen) und die Zahl der offenen Wesen. const ROW := 32.0 var own := {} # offene eigene Wesen je Element func _init(rect: Rect2) -> void: position = rect.position size = rect.size mouse_filter = Control.MOUSE_FILTER_IGNORE for e in all(): own[e] = 0 static func all() -> Array: return Cards.ELEMENTS + [Cards.NEUTRAL] func update_from(_g: Game, me: Game.Player) -> void: for e in all(): own[e] = me.element_count(e) if me != null else 0 queue_redraw() func paired(e: String) -> bool: return Cards.ELEMENT_KEYWORD.has(e) and int(own.get(e, 0)) >= Game.ELEMENT_PAIR ## Elemente mit offenen Wesen. func shown() -> Array: return all().filter(func(e): return int(own.get(e, 0)) > 0) ## Der Inhalt als Text (Tests, Protokoll): Element und offene Wesen, dazu der Effekt. func text() -> String: var parts: Array[String] = [] for e in shown(): var s := "%s %d" % [tr(e), int(own.get(e, 0))] if paired(e): s += " (%s)" % tr(Cards.ELEMENT_KEYWORD[e]) parts.append(s) return " ยท ".join(parts) func _draw() -> void: var y := ROW / 2 for e in shown(): var col: Color = Cards.ELEMENT_COLORS[e] var active := paired(e) draw_style_box(Style.box(Color(col, 0.18 if active else 0.1), 6, Color(col, 0.6 if active else 0.0), 1 if active else 0), Rect2(0, y - ROW / 2 + 2, size.x, ROW - 4)) var px := 10.0 Style.text(self, tr(e), 13, Style.TEXT if active else Style.MUTED, Vector2(px, y), "midleft", active) px = 76 if Cards.ELEMENT_KEYWORD.has(e): for k in Game.ELEMENT_PAIR: var filled := k < int(own.get(e, 0)) Style.keyword_icon(self, Cards.ELEMENT_KEYWORD[e], Vector2(px + k * 24 + 10, y), 8, Style.lighter(col, 0.45) if filled else Color(col, 0.3)) px += Game.ELEMENT_PAIR * 24 + 8 Style.text(self, str(int(own.get(e, 0))), 15, Style.lighter(col, 0.45), Vector2(px, y), "midleft", true) y += ROW