68 lines
2.5 KiB
GDScript
68 lines
2.5 KiB
GDScript
class_name ElementView
|
|
extends Control
|
|
## Elementzähler der eigenen Seite, mittig: je Element zweimal das Symbol seines Sondereffekts in
|
|
## der Elementfarbe, leuchtend je offenem eigenen Wesen (beide: Effekt aktiv), daneben in der
|
|
## Elementfarbe das Mana der bisher ausgespielten Karten (je Game.ELEMENT_MANA gibt es +1 Angriff).
|
|
|
|
const ENTRY_W := 180.0
|
|
|
|
var own := {} # offene eigene Wesen je Element
|
|
var played := {} # ausgespielte Karten je Element
|
|
|
|
|
|
func _init(rect: Rect2) -> void:
|
|
position = rect.position
|
|
size = rect.size
|
|
mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
for e in Cards.ELEMENTS:
|
|
own[e] = 0
|
|
played[e] = 0
|
|
|
|
|
|
func update_from(_g: Game, me: Game.Player) -> void:
|
|
for e in Cards.ELEMENTS:
|
|
own[e] = me.element_count(e) if me != null else 0
|
|
played[e] = int(me.played.get(e, 0)) if me != null else 0
|
|
queue_redraw()
|
|
|
|
|
|
func paired(e: String) -> bool:
|
|
return int(own.get(e, 0)) >= Game.ELEMENT_PAIR
|
|
|
|
|
|
func bonus(e: String) -> int:
|
|
return int(played.get(e, 0)) / Game.ELEMENT_MANA
|
|
|
|
|
|
## Der Inhalt als Text (Tests, Protokoll): Element offen/gespielt, dazu Effekt und Bonus.
|
|
func text() -> String:
|
|
var parts: Array[String] = []
|
|
for e in Cards.ELEMENTS:
|
|
var s := "%s %d/%d" % [tr(e), int(own.get(e, 0)), int(played.get(e, 0))]
|
|
if paired(e):
|
|
s += " (%s)" % tr(Cards.ELEMENT_KEYWORD[e])
|
|
if bonus(e) > 0:
|
|
s += " (+%d)" % bonus(e)
|
|
parts.append(s)
|
|
return " · ".join(parts)
|
|
|
|
|
|
func _draw() -> void:
|
|
var x0 := (size.x - ENTRY_W * Cards.ELEMENTS.size()) / 2
|
|
var cy := size.y / 2
|
|
for i in Cards.ELEMENTS.size():
|
|
var e: String = Cards.ELEMENTS[i]
|
|
var col: Color = Cards.ELEMENT_COLORS[e]
|
|
var active := paired(e) or bonus(e) > 0
|
|
var px := x0 + i * ENTRY_W + 10
|
|
Style.text(self, tr(e), 13, Style.TEXT if active else Style.MUTED, Vector2(px, cy), "midleft", active)
|
|
px += Style.FONT_BOLD.get_string_size(tr(e), HORIZONTAL_ALIGNMENT_LEFT, -1, Style.fs(13)).x + 10
|
|
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, cy), 8, Style.lighter(col, 0.45) if filled else Color(col, 0.3))
|
|
px += Game.ELEMENT_PAIR * 24 + 8
|
|
Style.text(self, str(int(played.get(e, 0))), 15, Style.lighter(col, 0.45), Vector2(px, cy), "midleft", true)
|
|
px += 20
|
|
if bonus(e) > 0:
|
|
Style.text(self, "+%d" % bonus(e), 12, Style.GREEN, Vector2(px, cy), "midleft", true)
|