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(index: int, life: int = Game.START_LIFE) -> Game.Player: return Game.Player.new("Gegner %d" % index, false, life, "Magier")