class_name CreatureView extends Control ## Zeichnet ein Wesen auf dem Feld. Bleibt über Zustandsänderungen bestehen (für Animationen). signal clicked(view: CreatureView) signal hover(card: Cards.Card, entered: bool) var creature: Game.Creature var border = null var width := 2 var flash := false # kurz rot: wurde gerade angegriffen var slot: Vector2 # Zielposition im Raster var busy := false # wird gerade animiert (kein Neupositionieren) func _init(cr: Game.Creature, sz: Vector2, b = null, w: int = 2) -> void: creature = cr border = b width = w custom_minimum_size = sz size = sz pivot_offset = sz / 2 mouse_filter = Control.MOUSE_FILTER_STOP mouse_entered.connect(func(): hover.emit(creature.card, true)) mouse_exited.connect(func(): hover.emit(creature.card, false)) func _gui_input(event: InputEvent) -> void: if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: accept_event() clicked.emit(self) func _draw() -> void: var rect := Rect2(Vector2.ZERO, size) var small := size.x < 100 var mini := size.x < 60 Style.fill_elements(self, rect, creature.card.elements, 6) var bcol: Color = border if border != null else Cards.RARITY_COLORS[creature.card.rarity] if flash: bcol = Style.RED Style.border(self, rect, bcol, 4 if flash else width, 6) if mini: _draw_mini() return var fs := 11 if small else 13 var nm := Style.fit(creature.name, true, fs, size.x - 6) Style.text(self, nm, fs, Style.TEXT, Vector2(size.x / 2, 4), "midtop", true) var badges: Array[String] = [] if creature.taunt(): badges.append("Wächter") if creature.shield: badges.append("Schild") if creature.attacks_per_turn() == 2: badges.append("x2") if creature.frozen: badges.append("Eis") if creature.resonance > 0: badges.append("Resonanz") var y := 18.0 if small else 22.0 for b in badges: Style.text(self, b, 10 if small else 12, Color("ebebf5"), Vector2(size.x / 2, y), "midtop") y += 12 if small else 15 var f := 16 if small else 20 var atk_col := Style.GREEN if creature.resonance > 0 else Style.YELLOW Style.text(self, str(creature.power()), f, atk_col, Vector2(6, size.y - 4), "bottomleft", true) var hp_col := Style.RED if creature.health < creature.max_health else Color("ffc8c8") Style.text(self, str(creature.health), f, hp_col, Vector2(size.x - 6, size.y - 4), "bottomright", true) if creature.frozen: draw_rect(rect, Color(0.55, 0.78, 1.0, 0.35)) ## Sehr kleine Kacheln (4 oder 5 Gegner): nur Kürzel und Werte, Details per Vorschau oder Lupe. func _draw_mini() -> void: var letters: Array[String] = [] if creature.taunt(): letters.append("W") if creature.shield: letters.append("S") if creature.attacks_per_turn() == 2: letters.append("2") if creature.frozen: letters.append("E") if creature.resonance > 0: letters.append("R") Style.text(self, " ".join(letters), 10, Color("ebebf5"), Vector2(size.x / 2, 3), "midtop", true) var atk_col := Style.GREEN if creature.resonance > 0 else Style.YELLOW Style.text(self, str(creature.power()), 13, atk_col, Vector2(4, size.y - 2), "bottomleft", true) var hp_col := Style.RED if creature.health < creature.max_health else Color("ffc8c8") Style.text(self, str(creature.health), 13, hp_col, Vector2(size.x - 4, size.y - 2), "bottomright", true) if creature.frozen: draw_rect(Rect2(Vector2.ZERO, size), Color(0.55, 0.78, 1.0, 0.35))