Elemente, Kombos, Fallen, KI mit Vorausschau, Kampagne, Hotseat und Netzwerk, Werkstatt, Erfolge, Tagesaufgaben, Tests und Exporte. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QPgKvy5W9WRNFHjkm5QsHx
93 lines
3.6 KiB
GDScript
93 lines
3.6 KiB
GDScript
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))
|