update
Tests / headless (push) Waiting to run
Tests / fenster-schnell (push) Waiting to run
Tests / fenster-voll (push) Skipped
Tests / balance (push) Skipped

This commit is contained in:
team3 committed 2026-10-15 17:16:01 +02:00
1 parent 1d563b9eec
commit 04fe9716e8
22 files changed
+764 -151

No files matched your search

+40 -2
View File
@@ -30,9 +30,14 @@ static func element_deck(element: String) -> Array:
## je Kosten so viele wie CURVE vorgibt, zufällig gewählt. Was über dem Deckel fehlt, füllen die
## erlaubten Kosten reihum von billig nach teuer auf.
static func curve_deck(element: String, r: RandomNumberGenerator, max_cost: int = 10) -> Array:
return curve_pick(Cards.all().filter(func(c): return c.elements[0] == element), r, max_cost)
## Wählt aus cards (Karten) nach der Manakurve bis max_cost, siehe curve_deck; liefert IDs.
static func curve_pick(cards: Array, r: RandomNumberGenerator, max_cost: int) -> Array:
var by_cost := {}
for c in Cards.all():
if c.elements[0] == element and c.cost <= max_cost:
for c in cards:
if c.cost <= max_cost:
if not by_cost.has(c.cost):
by_cost[c.cost] = []
by_cost[c.cost].append(c.id)
@@ -56,6 +61,39 @@ static func curve_deck(element: String, r: RandomNumberGenerator, max_cost: int
return out
## Stapel mit Effektkarten (Kapitel 6 bis 10): wie curve_deck, aber jede Karte trägt keyword_count
## Eigenschaften. Zur Wahl stehen alle Grundkarten des Elements mit jeder Eigenschaftskombination,
## deren Kosten (Cards.cost_with) unter max_cost bleiben; die gewählten werden registriert (IDs g_…).
static func effect_deck(element: String, r: RandomNumberGenerator, max_cost: int, keyword_count: int) -> Array:
var pool := {}
for b in Cards.all():
if b.elements[0] != element:
continue
for combo in combos(Array(Cards.KEYWORDS), keyword_count):
var kws := Cards.KEYWORDS.filter(func(k): return k in combo)
var short := "".join(kws.map(func(k): return k.substr(0, 1)))
var c := Cards.custom("g_%s_%s" % [b.id, short], b.name, b.elements, b.attack, b.health, kws)
c.name_en = b.name_en
pool[c.id] = c
var out := curve_pick(pool.values(), r, max_cost)
for id in out:
Cards.register(pool[id])
return out
## Alle Teilmengen von items mit k Einträgen, in der Reihenfolge von items.
static func combos(items: Array, k: int) -> Array:
if k == 0:
return [[]]
var out := []
for i in items.size():
for rest in combos(items.slice(i + 1), k - 1):
var combo := [items[i]]
combo.append_array(rest)
out.append(combo)
return out
## Füllt deck aus pool (Karten-IDs) bis limit auf, die wertvollsten zuerst (Card.value in der Stufe
## aus levels: ID -> Stufe); bei gleichem Wert zuerst, was der Manakurve (CURVE, auf limit
## skaliert) noch fehlt, dann die billigeren, dann nach ID; nichts doppelt.