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))