class_name CampaignScreen extends Control var app var chapter := 1 var perk_box: OptionButton func _ready() -> void: var p: Profile = app.profile chapter = 2 if p.campaign_stage >= Campaign.STAGES.size() else 1 build() func build() -> void: Style.clear(self) var p: Profile = app.profile var col := Style.column(self, 1000, 16, 5) Style.clabel(col, "Kampagne", 34, Style.GOLD, "center", true) var tabs := Style.row(col, 10) tabs.alignment = BoxContainer.ALIGNMENT_CENTER var b1 := Style.cbutton(tabs, "Kapitel 1", Vector2(160, 36), func(): set_chapter(1), Color("285a3c") if chapter == 1 else null) var b2 := Style.cbutton(tabs, "Kapitel 2", Vector2(160, 36), func(): set_chapter(2), Color("285a3c") if chapter == 2 else null) b2.disabled = p.campaign_stage < Campaign.STAGES.size() if p.perk_unlocked(): var pr := Style.row(tabs, 8) Style.clabel(pr, "Dein Merkmal:", 15, Style.MUTED, "right", false, 110) perk_box = OptionButton.new() perk_box.custom_minimum_size = Vector2(300, 36) perk_box.add_item("keins") var keys: Array = Game.PERKS.keys() for k in keys: perk_box.add_item(Game.PERKS[k]) perk_box.select(keys.find(p.perk) + 1 if p.perk != "" else 0) perk_box.item_selected.connect(func(i: int): p.perk = "" if i == 0 else keys[i - 1] app.save()) pr.add_child(perk_box) Style.clabel(col, "Zehn Magier je Kapitel. Jede Stufe bringt mehr Gegner an den Tisch. Bosse haben Merkmale (★)." if chapter == 1 else "Die Magier kehren mit zwei Merkmalen und größerem Gefolge zurück.", 14, Style.MUTED) var offset := 0 if chapter == 1 else Campaign.STAGES.size() for k in Campaign.STAGES.size(): var i := offset + k var st := Campaign.stage(i) var done := i < p.campaign_stage var next := i == p.campaign_stage var panel := PanelContainer.new() panel.add_theme_stylebox_override("panel", Style.box(Style.PANEL if not done else Style.darker(Style.PANEL, 0.8), 6, Style.GOLD if next else null, 2 if next else 0)) col.add_child(panel) var r := Style.row(panel, 10) r.custom_minimum_size = Vector2(0, 50) Style.clabel(r, str(i + 1), 18, Style.GOLD if next else Style.MUTED, "center", true, 36) Style.clabel(r, "%s · %s" % [st.name, st.title], 16, Style.TEXT if not done else Style.MUTED, "left", true, 290) var dots := Control.new() dots.custom_minimum_size = Vector2(50, 0) dots.mouse_filter = Control.MOUSE_FILTER_IGNORE var elems: Array = st.elements dots.draw.connect(func(): for m in elems.size(): dots.draw_circle(Vector2(10 + m * 18, dots.size.y / 2), 7, Cards.ELEMENT_COLORS[elems[m]])) r.add_child(dots) var extra: int = mini(st.extra, Game.MAX_OPPONENTS - 1) var table: String = "Duell" if extra == 0 else "%d am Tisch" % (extra + 2) var perks_text: String = ", ".join(st.perks.map(func(pk): return Game.PERKS[pk])) Style.clabel(r, "%s · %d Münzen\n★ %s" % [table, st.reward, perks_text], 12, Style.MUTED, "left", false, 360) if done: Style.clabel(r, "abgeschlossen", 13, Style.GREEN, "right", false, 100) Style.cbutton(r, "Wiederholen", Vector2(130, 36), _start.bind(i)) elif next: Style.clabel(r, "", 13, Style.GREEN, "right", false, 100) Style.cbutton(r, "Kämpfen", Vector2(130, 36), _start.bind(i), Color("285a3c")) else: Style.clabel(r, "", 13, Style.GREEN, "right", false, 100) var b := Style.cbutton(r, "Gesperrt", Vector2(130, 36), func(): pass) b.disabled = true if p.campaign_stage >= Campaign.total(): Style.clabel(col, "Beide Kapitel abgeschlossen. Der Archimagier ist endgültig besiegt!", 16, Style.GREEN, "center", true) var br := Style.row(col) br.alignment = BoxContainer.ALIGNMENT_CENTER Style.cbutton(br, "Zurück", Vector2(160, 40), func(): app.show_screen(MenuScreen.new())) func set_chapter(c: int) -> void: chapter = c build() func _start(stage: int) -> void: app.show_screen(BattleScreen.new(0, stage)) func _input(event: InputEvent) -> void: if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE: app.show_screen(MenuScreen.new())