36 lines
1.6 KiB
GDScript
36 lines
1.6 KiB
GDScript
class_name DeckGen
|
|
## Ladenangebot und Gegner (ausgelagert aus den Spielregeln).
|
|
## Es gibt keine Decks: jeder kauft jede Runde aus seinem eigenen Laden.
|
|
|
|
# Abnehmende Resonanz je Anzahl gleichelementiger Partner (Index = Partner).
|
|
const RESONANCE_STEPS := [0, 1, 2, 3, 3]
|
|
|
|
|
|
## Karten, die im Laden auftauchen dürfen: höchstens Einkommen plus eins teuer,
|
|
## bei gesetzten Elementen nur aus diesen.
|
|
static func pool(income: int, elements: Array = []) -> Array:
|
|
var limit := income + 1
|
|
return Cards.all().filter(func(c):
|
|
return c.cost <= limit and (elements.is_empty() or c.elements.all(func(e): return e in elements)))
|
|
|
|
|
|
## Angebot des Ladens: n zufällige Karten (Wiederholungen erlaubt, wie in TFT).
|
|
## Mindestens eine Karte ist vom Einkommen allein bezahlbar, sonst wäre der Zug tot.
|
|
static func shop_cards(r: RandomNumberGenerator, income: int, elements: Array = [], n: int = Game.SHOP_SIZE) -> Array:
|
|
var p := pool(income, elements)
|
|
if p.is_empty():
|
|
p = pool(Game.MAX_ENERGY, elements)
|
|
assert(not p.is_empty(), "kein Angebot für " + str(elements))
|
|
var out := []
|
|
for i in n:
|
|
out.append(p[r.randi_range(0, p.size() - 1)])
|
|
var cheap := p.filter(func(c): return c.cost <= income)
|
|
if not cheap.is_empty() and not out.any(func(c): return c.cost <= income):
|
|
out[r.randi_range(0, out.size() - 1)] = cheap[r.randi_range(0, cheap.size() - 1)]
|
|
return out
|
|
|
|
|
|
## Gegner mit eigenem Laden über alle Elemente.
|
|
static func random_opponent(life: int = Game.START_LIFE) -> Game.Player:
|
|
return Game.Player.new("Gegner", false, life)
|