93 lines
4.8 KiB
GDScript
93 lines
4.8 KiB
GDScript
class_name Campaign
|
|
## Kampagne: zehn Kapitel mit je zehn benannten Magiern, der zehnte ist der Boss. Kapitel 1 spielt
|
|
## neutrale Karten, Kapitel 2 bis 5 je ein Element; Kapitel 6 bis 10 wiederholen die Elemente mit
|
|
## Effektkarten (Eigenschaften, DeckGen.effect_deck). Jeder Gegner spielt 30 Karten seines Elements
|
|
## nach Manakurve mit steigendem Kostendeckel (COST_CAP), in der Stufe seines Kapitels (rarity_of).
|
|
## Mit jedem offenen Kapitel der ersten Runde gibt es den Booster seines Elements
|
|
## (Profile.booster_unlocked); nach Kapitel 5 öffnet die Werkstatt (Profile.workshop_unlocked).
|
|
|
|
const STAGES_PER_CHAPTER := 10
|
|
const ROUNDS := 2 # Runde 1: Grundkarten (Kapitel 1 bis 5), Runde 2: Effektkarten (6 bis 10)
|
|
const CHAPTER_ELEMENTS: Array[String] = [Cards.NEUTRAL, "Feuer", "Wasser", "Luft", "Erde"]
|
|
const NAMES: Array[String] = ["Fenn", "Mara", "Borin", "Liska", "Vulkar", "Nyx", "Ignis", "Thalassa", "Zephyra", "Archimagier"]
|
|
const TITLES := {
|
|
"Neutral": ["Kobold-Zähmer", "Wanderhexe", "Steinfaust", "Pfadfinderin", "Söldnerfürst", "Schattenruferin", "Grauer Priester", "Händlerkönigin", "Stahlkaiserin", "Meister der Lehre"],
|
|
"Feuer": ["Flammenzähmer", "Glutweberin", "Schmiedefaust", "Funkenläuferin", "Herr der Lava", "Aschenruferin", "Inferno-Priester", "Glutkönigin", "Flammenkaiserin", "Meister des Feuers"],
|
|
"Wasser": ["Gezeitenzähmer", "Gezeitenhexe", "Eisfaust", "Nebelläuferin", "Herr der Brandung", "Regenruferin", "Tiefsee-Priester", "Tiefseekönigin", "Flutkaiserin", "Meister des Wassers"],
|
|
"Luft": ["Windzähmer", "Wolkenhexe", "Sturmfaust", "Windläuferin", "Herr der Böen", "Sturmruferin", "Himmelspriester", "Wolkenkönigin", "Blitzkaiserin", "Meister der Lüfte"],
|
|
"Erde": ["Wurzelzähmer", "Moorhexe", "Felsenfaust", "Hügelläuferin", "Herr der Schluchten", "Bebenruferin", "Erzpriester", "Kristallkönigin", "Bergkaiserin", "Meister der Erde"],
|
|
}
|
|
const LIFE := [22, 22, 24, 24, 24, 26, 26, 26, 28, 28]
|
|
## Höchste Kartenkosten im Stapel je Stufe eines Kapitels.
|
|
const COST_CAP: Array[int] = [3, 4, 4, 5, 5, 6, 7, 8, 9, 10]
|
|
## Merkmale je Stufe: das erste nach dieser Liste, weitere je drei Plätze dahinter.
|
|
const PERK_ORDER: Array[String] = ["feuer_angriff", "leben_35", "wesen_angriff", "ziehen_gratis", "wesen_leben", "extra_mana", "kein_nachteil", "alle_flink", "alle_flink", "start_energie"]
|
|
|
|
|
|
static func chapters() -> int:
|
|
return CHAPTER_ELEMENTS.size() * ROUNDS
|
|
|
|
|
|
static func total() -> int:
|
|
return STAGES_PER_CHAPTER * chapters()
|
|
|
|
|
|
static func chapter(stage: int) -> int:
|
|
return stage / STAGES_PER_CHAPTER + 1
|
|
|
|
|
|
static func element_of(chapter_no: int) -> String:
|
|
return CHAPTER_ELEMENTS[(chapter_no - 1) % CHAPTER_ELEMENTS.size()]
|
|
|
|
|
|
## Merkmale je Gegner: eins, ab Kapitel 3 zwei, ab Kapitel 5 drei.
|
|
static func perk_count(chapter_no: int) -> int:
|
|
return mini(3, (chapter_no + 1) / 2)
|
|
|
|
|
|
## Eigenschaften je Gegnerkarte: Kapitel 1 bis 5 keine, 6 und 7 eine, ab 8 zwei.
|
|
static func keyword_count(chapter_no: int) -> int:
|
|
if chapter_no <= CHAPTER_ELEMENTS.size():
|
|
return 0
|
|
return 1 if chapter_no <= CHAPTER_ELEMENTS.size() + 2 else 2
|
|
|
|
|
|
## Stufe i: Name, Titel, Leben, Belohnung (Kapitel 1: 100 bis 300, Boss 500; je Kapitel 250 mehr),
|
|
## Merkmale und Element.
|
|
static func stage(i: int) -> Dictionary:
|
|
var c := chapter(i)
|
|
var k := i % STAGES_PER_CHAPTER
|
|
var perks: Array = []
|
|
for n in perk_count(c):
|
|
perks.append(PERK_ORDER[(k + 3 * n) % STAGES_PER_CHAPTER])
|
|
var base := 100 + 250 * (c - 1)
|
|
var title: String = TITLES[element_of(c)][k] + (" II" if c > CHAPTER_ELEMENTS.size() else "")
|
|
return {"name": NAMES[k], "title": title, "life": LIFE[k],
|
|
"reward": base + (400 if k == STAGES_PER_CHAPTER - 1 else 50 * (k / 2)),
|
|
"perks": perks, "element": element_of(c), "max_cost": COST_CAP[k], "keywords": keyword_count(c)}
|
|
|
|
|
|
## Gegner einer Stufe: Leben und Merkmale der Stufe, 30 Karten seines Elements nach Manakurve bis
|
|
## max_cost (ab Kapitel 6 Effektkarten), in der Stufe des Kapitels (rarity_of).
|
|
static func opponent(stage_index: int, r: RandomNumberGenerator = null) -> Game.Player:
|
|
var st := stage(stage_index)
|
|
var boss := Game.Player.new(st.name, false, int(st.life), st.title)
|
|
boss.perks = Array(st.perks)
|
|
if r == null:
|
|
r = Game.make_rng()
|
|
if int(st.keywords) > 0:
|
|
boss.deck = DeckGen.effect_deck(st.element, r, int(st.max_cost), int(st.keywords))
|
|
else:
|
|
boss.deck = DeckGen.curve_deck(st.element, r, int(st.max_cost))
|
|
for id in boss.deck:
|
|
boss.looks[id] = rarity_of(chapter(stage_index))
|
|
return boss
|
|
|
|
|
|
## Seltenheitsstufe der Gegnerkarten: Kapitel 1 und 2 Common, dann je Kapitel eine höher bis Ultra
|
|
## Rare; Kapitel 6 bis 9 Ultra Rare, Kapitel 10 Ultimate Rare.
|
|
static func rarity_of(chapter_no: int) -> int:
|
|
if chapter_no >= chapters():
|
|
return Cards.RARITIES.size() - 1
|
|
return mini(3, maxi(0, chapter_no - 2))
|