Files
elements-autochess/scripts/core/Avatar.gd
2026-08-29 11:42:54 +02:00

126 lines
3.3 KiB
GDScript

class_name Avatar
extends RefCounted
## Eine Einheit. Elemente sind leer, solange der Avatar elementlos ist.
static var _next_id := 1
var id: int
var role: int = Data.Role.DPS
var elements: Array[int] = []
var star: int = 1
var invested: int = 0 ## bezahltes Gold (für Verkaufswert)
func _init(p_role: int = Data.Role.DPS, p_elements: Array[int] = [], p_star: int = 1) -> void:
id = _next_id
_next_id += 1
role = p_role
elements = p_elements.duplicate()
star = p_star
func is_elementless() -> bool:
return elements.is_empty()
func primary_element() -> int:
return elements[0] if not elements.is_empty() else -1
func has_element(e: int) -> bool:
return elements.has(e)
func display_name() -> String:
if elements.is_empty():
return "Neutral-" + Data.ROLE_NAMES[role]
var parts := []
for e in elements:
parts.append(Data.ELEMENT_NAMES[e])
return "/".join(parts) + "-" + Data.ROLE_NAMES[role]
func color() -> Color:
if elements.is_empty():
return Data.NONE_COLOR
return Data.ELEMENT_COLORS[elements[0]]
func price() -> int:
return Data.PRICE_NONE if elements.is_empty() else Data.PRICE_ELEMENT
## Was zum nächsten Stern fehlt: {element: anzahl}. Leer = maximal.
func upgrade_cost() -> Dictionary:
if star >= Data.MAX_STAR or elements.is_empty():
return {}
var cost := {}
if star == 1:
# 3 Avatare gesamt: der Basis-Avatar zählt mit, also 2 weitere.
cost[elements[0]] = 2
else:
# 2-Star -> 3-Star: je 3 Avatare pro vorhandenem Element.
for e in elements:
cost[e] = 3
return cost
func base_stats() -> Dictionary:
var b: Dictionary = Data.ROLE_STATS[role]
var mult: float = Data.STAR_MULT[star - 1]
var ebonus := 1.0 + Data.ELEMENT_STAT_BONUS * float(maxi(0, elements.size() - 1))
return {
"hp": b["hp"] * mult * ebonus,
"atk": b["atk"] * mult * ebonus,
"armor": b["armor"],
"aspd": b["aspd"],
"range": b["range"],
"mana": b["mana"],
}
func duplicate_avatar() -> Avatar:
var a := Avatar.new(role, elements, star)
a.invested = invested
return a
## Beschreibung der Fähigkeit, abhängig von Rolle, Stern und Elementen.
func ability_text() -> String:
var s := ""
match role:
Data.Role.TANK:
s = "Schild %d für 4s" % int(base_stats()["atk"] * (3.0 + 0.5 * float(star - 1)))
if star >= 2:
s += ", spottet 3 Gegner"
if star >= 3:
s += ", 25% Reflexion"
Data.Role.DPS:
s = "%d Schaden aufs Ziel" % int(base_stats()["atk"] * (3.0 + 0.3 * float(star - 1)))
if star == 2:
s += " + Splash auf Nachbarn"
elif star >= 3:
s += " + Fläche (Radius 2)"
Data.Role.HEILER:
var amount := int(base_stats()["atk"] * (3.0 - 0.25 * float(star - 1)))
if star == 1:
s = "heilt schwächsten Verbündeten um %d" % amount
elif star == 2:
s = "heilt 3 Verbündete um %d" % amount
else:
s = "heilt alle um %d und schildet" % amount
var extra := []
for i in elements.size():
var scale := "" if i == 0 else " (halb)"
match elements[i]:
Data.Element.FEUER: extra.append("Brand" + scale)
Data.Element.WASSER: extra.append("Mana + stärkere Heilung" + scale)
Data.Element.WIND: extra.append("Tempo-Schub" + scale)
Data.Element.BLITZ: extra.append("Kettenblitz" + scale)
Data.Element.ERDE: extra.append("Betäubung" + scale)
Data.Element.EIS: extra.append("Verlangsamung" + scale)
if not extra.is_empty():
s += "\nElemente: " + ", ".join(extra)
return s