class_name Skills ## Skilltree: Erfahrung sind die verdienten Münzen, je Level ein Skillpunkt, Punkte kaufen Stufen ## der Skills in vier Ästen (PATHS). Jeder Ast ist ein Pfad: der nächste Skill öffnet, sobald der ## davor mindestens eine Stufe hat. Münzen kaufen keine Punkte. const BRANCHES: Array[String] = ["Glück", "Wirtschaft", "Kraft", "Weisheit"] ## Ast -> Skills in Pfadreihenfolge (oben nach unten). const PATHS := { "Glück": ["packglueck", "garantie"], "Wirtschaft": ["packpreis", "muenzen", "staub"], "Kraft": ["zaeh", "stark"], "Weisheit": ["gratisziehen", "startmana", "sparsam"], } ## id -> Name, Höchststufe, Text. const SKILLS := { "packglueck": {"name": "Packglück", "max": 3, "text": "Seltenere Karten in Boostern"}, "garantie": {"name": "Garantie", "max": 1, "text": "Mindestens eine Super Rare je Booster"}, "packpreis": {"name": "Händler", "max": 3, "text": "Booster werden billiger"}, "muenzen": {"name": "Münzsegen", "max": 3, "text": "Mehr Münzen nach jedem Kampf"}, "staub": {"name": "Staubsammler", "max": 3, "text": "Mehr Staub aus Doppelten und Zerlegen"}, "zaeh": {"name": "Zäh", "max": 3, "text": "Eigene Karten haben mehr Leben"}, "stark": {"name": "Stark", "max": 3, "text": "Eigene Karten haben mehr Angriff"}, "gratisziehen": {"name": "Freies Ziehen", "max": 1, "text": "Zweites Ziehen je Zug auch gratis"}, "startmana": {"name": "Starker Start", "max": 1, "text": "Mehr Mana im ersten Zug"}, "sparsam": {"name": "Sparsam", "max": 3, "text": "Teure Karten kosten 1 Mana weniger"}, } ## Diese Skills geben ein Merkmal (Game.PERKS) im Kampf. const PERK_OF := {"gratisziehen": "ziehen_gratis", "startmana": "start_energie"} ## Packglück je Stufe: Common gibt ab, die höheren Stufen gewinnen. const LUCK_SHIFT := {"Common": -8.0, "Rare": 3.0, "Super Rare": 2.0, "Ultra Rare": 2.0, "Ultimate Rare": 1.0} ## Erfahrung, die Level n verlangt: 100, 300, 600, 1000, 1500 … (50 · n · (n + 1)). static func xp_for_level(n: int) -> int: return 50 * n * (n + 1) ## Level zu einer Erfahrung. static func level_for(xp: int) -> int: var n := 0 while xp >= xp_for_level(n + 1): n += 1 return n static func in_branch(branch: String) -> Array: return PATHS[branch] ## Der Skill davor im Pfad, "" für den ersten eines Astes. static func previous(id: String) -> String: for b in PATHS: var i: int = PATHS[b].find(id) if i > 0: return PATHS[b][i - 1] return "" ## Sparsam: ab diesen Kosten ist eine Karte 1 Mana billiger (Stufe 1 ab 7, 2 ab 5, 3 ab 3); 99 = nie. static func cheap_from(rank: int) -> int: return 9 - 2 * rank if rank > 0 else 99 ## Mindestseltenheit je Booster: Rare, mit Garantie Super Rare. static func pack_floor(garantie: int) -> String: return "Super Rare" if garantie > 0 else "Rare" ## Boosterchancen je Stufe (Reihenfolge Cards.RARITIES) mit Packglück luck. static func pack_weights(luck: int) -> PackedFloat32Array: var out := PackedFloat32Array() for rar in Cards.RARITIES: out.append(float(Profile.RARITY_WEIGHTS[rar]) + luck * float(LUCK_SHIFT[rar])) return out ## Konkrete Wirkung eines Skills auf einer Stufe, als Text. static func effect(id: String, rank: int) -> String: match id: "packglueck": var w := pack_weights(rank) return TranslationServer.translate("Chancen %d/%d/%d/%d/%d %%") % [int(w[0]), int(w[1]), int(w[2]), int(w[3]), int(w[4])] "garantie": return TranslationServer.translate("Super Rare je Pack sicher" if rank > 0 else "Rare je Pack sicher") "staub": return TranslationServer.translate("+%d %% Staub") % (25 * rank) "muenzen": return TranslationServer.translate("+%d %% Münzen") % (10 * rank) "packpreis": return TranslationServer.translate("Neutral %d, Element %d") % [roundi(Profile.BOOSTER_COST * (1.0 - 0.1 * rank)), roundi(Profile.ELEMENT_BOOSTER_COST * (1.0 - 0.1 * rank))] "zaeh": return TranslationServer.translate("+%d Leben") % rank "stark": return TranslationServer.translate("+%d Angriff") % rank "gratisziehen": return TranslationServer.translate("zwei Karten je Zug gratis" if rank > 0 else "eine Karte je Zug gratis") "startmana": return TranslationServer.translate("erster Zug: %d Mana") % (Game.START_MANA + (2 if rank > 0 else 0)) "sparsam": return TranslationServer.translate("ab %d Mana 1 billiger") % cheap_from(rank) if rank > 0 else TranslationServer.translate("voller Preis") return ""