update
This commit is contained in:
@@ -1,35 +1,18 @@
|
||||
class_name DeckGen
|
||||
## Ladenangebot und Gegner (ausgelagert aus den Spielregeln).
|
||||
## Es gibt keine Decks: jeder kauft jede Runde aus seinem eigenen Laden.
|
||||
## Der gemeinsame Stapel (jede Karte dreimal) und Gegner.
|
||||
|
||||
# Abnehmende Resonanz je Anzahl gleichelementiger Partner (Index = Partner).
|
||||
const RESONANCE_STEPS := [0, 1, 2, 3, 3]
|
||||
const COPIES := 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))
|
||||
## Frisch gemischter Stapel; das Ende des Arrays ist oben.
|
||||
static func deck(r: RandomNumberGenerator) -> Array:
|
||||
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)]
|
||||
for c in Cards.all():
|
||||
for i in COPIES:
|
||||
out.append(c)
|
||||
Game.shuffle(out, r)
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user