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

162 lines
5.2 KiB
GDScript

class_name Data
extends RefCounted
## Statische Spieldaten: Elemente, Rollen, Basiswerte, Traits, Preise.
enum Element { FEUER, WASSER, WIND, BLITZ, ERDE, EIS }
enum Role { TANK, DPS, HEILER }
const ELEMENT_COUNT := 6
const ELEMENT_NAMES := ["Feuer", "Wasser", "Wind", "Blitz", "Erde", "Eis"]
const ELEMENT_COLORS := [
Color(0.92, 0.31, 0.16),
Color(0.18, 0.52, 0.90),
Color(0.48, 0.85, 0.60),
Color(0.96, 0.84, 0.22),
Color(0.62, 0.45, 0.24),
Color(0.66, 0.92, 0.98),
]
const NONE_COLOR := Color(0.62, 0.62, 0.66)
const ROLE_NAMES := ["Tank", "DPS", "Heiler"]
const ROLE_SHORT := ["T", "D", "H"]
# Basiswerte auf 1-Star.
const ROLE_STATS := {
Role.TANK: {"hp": 700.0, "atk": 45.0, "armor": 0.40, "aspd": 0.60, "range": 1, "mana": 80.0},
Role.DPS: {"hp": 450.0, "atk": 65.0, "armor": 0.18, "aspd": 0.80, "range": 3, "mana": 100.0},
Role.HEILER: {"hp": 520.0, "atk": 38.0, "armor": 0.22, "aspd": 0.70, "range": 3, "mana": 90.0},
}
# Multiplikator pro Sternstufe (Index = star - 1).
const STAR_MULT := [1.0, 1.8, 3.24]
const MAX_STAR := 3
# Jedes zusätzliche Element gibt einen kleinen Grundwert-Bonus.
const ELEMENT_STAT_BONUS := 0.06
# --- Oekonomie -------------------------------------------------------------
const START_HP := 100
const BASE_INCOME := 5
const WIN_GOLD := 1
const REROLL_COST := 2
const PRICE_NONE := 1
const PRICE_ELEMENT := 2
## Zinsen: je 10 Gold ein Gold dazu, gedeckelt bei 50 Gold.
const INTEREST_STEP := 10
const INTEREST_MAX := 5
const SHOP_SLOTS := 5
## Je aufgestelltem Element wird ein Shop-Platz zu 25% seltener neutral.
## Multiplikativ, damit Neutral nie ganz verschwindet.
const NEUTRAL_FALLOFF := 0.75
const BENCH_SLOTS := 9
const START_GOLD := 4
# --- Geteilter Pool --------------------------------------------------------
## Alle 8 Spieler teilen sich diesen Vorrat pro Element. Ein 3-Star bindet
## allein 9 Stück, dazu kommt was auf Bänken und Brettern liegt.
## Bei 180 hält der Vorrat eine ganze Partie und kann im Endspiel trotzdem knapp werden.
const POOL_PER_ELEMENT := 180
# --- Board -----------------------------------------------------------------
const BOARD_COLS := 7
const BOARD_ROWS := 4
const MAX_TEAM_SLOTS := 9
# --- Element-Traits --------------------------------------------------------
# steps = Anzahl aufgestellter Einheiten mit diesem Element.
const ELEMENT_TRAITS := {
Element.FEUER: {
"steps": [2, 4, 6],
"desc": ["+12% Angriff", "+26% Angriff", "+48% Angriff"],
"values": [0.12, 0.26, 0.48],
},
Element.WASSER: {
"steps": [2, 4, 6],
"desc": ["+20% Mana", "+40% Mana", "+70% Mana"],
"values": [0.20, 0.40, 0.70],
},
Element.WIND: {
"steps": [2, 4, 6],
"desc": ["+10% Tempo", "+22% Tempo", "+40% Tempo"],
"values": [0.10, 0.22, 0.40],
},
Element.BLITZ: {
"steps": [2, 4, 6],
"desc": ["+15% Krit", "+30% Krit", "+55% Krit"],
"values": [0.15, 0.30, 0.55],
},
Element.ERDE: {
"steps": [2, 4, 6],
"desc": ["+12% Leben", "+26% Leben", "+48% Leben"],
"values": [0.12, 0.26, 0.48],
},
Element.EIS: {
"steps": [2, 4, 6],
"desc": ["Treffer -12% Tempo", "Treffer -22% Tempo", "Treffer -35% Tempo"],
"values": [0.12, 0.22, 0.35],
},
}
# --- Kombi-Traits ----------------------------------------------------------
# Aktiv, wenn beide Elemente mindestens COMBO_MIN Einheiten haben.
const COMBO_MIN := 2
const COMBO_TRAITS := [
{"a": Element.FEUER, "b": Element.WIND, "key": "feuersturm", "name": "Feuersturm", "desc": "Fähigkeiten setzen in Brand"},
{"a": Element.WASSER, "b": Element.EIS, "key": "frost", "name": "Frost", "desc": "Gegner starten 15% langsamer"},
{"a": Element.BLITZ, "b": Element.ERDE, "key": "magnetsturm","name": "Magnetsturm", "desc": "Fähigkeiten betäuben 0.6s"},
{"a": Element.FEUER, "b": Element.ERDE, "key": "magma", "name": "Magma", "desc": "20% Schaden reflektiert"},
{"a": Element.WIND, "b": Element.BLITZ, "key": "sturmfront", "name": "Sturmfront", "desc": "Angriffe springen auf ein 2. Ziel"},
{"a": Element.WASSER, "b": Element.FEUER, "key": "dampf", "name": "Dampf", "desc": "18% Lebensraub"},
]
static func element_name(e: int) -> String:
return ELEMENT_NAMES[e]
static func element_color(e: int) -> Color:
return ELEMENT_COLORS[e]
static func role_name(r: int) -> String:
return ROLE_NAMES[r]
## Aktive Stufe eines Element-Traits (0 = inaktiv, sonst 1..3).
static func trait_tier(element: int, count: int) -> int:
var steps: Array = ELEMENT_TRAITS[element]["steps"]
var tier := 0
for i in steps.size():
if count >= steps[i]:
tier = i + 1
return tier
## Teamgröße wächst mit der Runde.
static func team_slots(round_no: int) -> int:
return mini(3 + int(float(round_no - 1) / 2.0), MAX_TEAM_SLOTS)
## Wahrscheinlichkeit, dass ein Shop-Platz einen neutralen Avatar zeigt.
## Ohne eigene Elemente gibt es nur Neutral.
static func neutral_chance(unlocked_count: int) -> float:
return pow(NEUTRAL_FALLOFF, float(unlocked_count))
## Zinsen auf das gehaltene Gold.
static func interest(gold: int) -> int:
return mini(INTEREST_MAX, int(float(gold) / float(INTEREST_STEP)))
## Streak-Bonusgold (Sieg- oder Niederlagenserie).
static func streak_gold(streak: int) -> int:
var s := absi(streak)
if s >= 5:
return 3
if s == 4:
return 2
if s == 3:
return 1
return 0