class_name OpponentSelectScreen extends Control ## Einzelspieler: Schwierigkeit, Gegnerzahl und Vorschau der Gegner (Element, Stärke). var app var rating_label: Label var tip_label: Label var diff_buttons := {} var previews := {} # n -> Array von Game.Player var preview_labels := {} var b_tip: Button func _ready() -> void: var col := Style.column(self, 1000, 30, 10) Style.clabel(col, "Einzelspieler", 36, Style.GOLD, "center", true) Style.clabel(col, "Jeder kämpft gegen jeden, alle nach denselben Regeln mit %d Leben. Du gewinnst, wenn alle anderen besiegt sind." % Game.START_LIFE, 15, Style.MUTED) Style.clabel(col, "Schwierigkeit", 20, Style.TEXT, "center", true) var dr := Style.row(col, 10) dr.alignment = BoxContainer.ALIGNMENT_CENTER for key in ["leicht", "normal", "schwer"]: var k: String = key diff_buttons[k] = Style.cbutton(dr, Profile.DIFFICULTIES[k].name, Vector2(150, 40), func(): set_difficulty(k)) rating_label = Style.clabel(col, "", 14, Style.MUTED) var tr_row := Style.row(col, 10) tr_row.alignment = BoxContainer.ALIGNMENT_CENTER tip_label = Style.clabel(tr_row, "", 14, Style.GOLD, "right", false, 520) b_tip = Style.cbutton(tr_row, "Übernehmen", Vector2(140, 32), take_tip) Style.spacer(col, 2) for i in range(1, Game.MAX_OPPONENTS + 1): var n := i var r := Style.row(col, 16) r.alignment = BoxContainer.ALIGNMENT_CENTER Style.cbutton(r, "%d Gegner" % n, Vector2(150, 46), func(): start(n), Color("285a3c")) var info := ("Duell" if n == 1 else "%d am Tisch" % (n + 1)) + " · %d Münzen" % Profile.REWARD_WIN[n] Style.clabel(r, info, 13, Style.MUTED, "left", false, 150) preview_labels[n] = Style.clabel(r, "", 13, Style.TEXT, "left", false, 600) Style.spacer(col, 4) var br := Style.row(col, 16) br.alignment = BoxContainer.ALIGNMENT_CENTER Style.cbutton(br, "Neu würfeln", Vector2(150, 40), func(): refresh(true)) Style.cbutton(br, "Zurück", Vector2(150, 40), func(): app.show_screen(MenuScreen.new())) refresh(true) func set_difficulty(key: String) -> void: app.profile.settings.difficulty = key app.save() refresh(true) func take_tip() -> void: var tip: String = app.profile.suggest_difficulty() if tip != "": set_difficulty(tip) func start(n: int) -> void: app.show_screen(BattleScreen.against(previews[n])) ## Baut die Gegner für jede Anzahl vor und zeigt Element und Stärke; der Kampf nutzt genau diese. func refresh(reroll: bool = false) -> void: var p: Profile = app.profile var d := p.difficulty() for key in diff_buttons: var b: Button = diff_buttons[key] var active: bool = key == p.settings.difficulty b.add_theme_stylebox_override("normal", Style.box(Color("285a3c") if active else Style.PANEL_LIGHT, 8, Style.GOLD if active else Style.MUTED, 2)) b.add_theme_stylebox_override("hover", Style.box(Style.lighter(Color("285a3c") if active else Style.PANEL_LIGHT), 8, Style.GOLD if active else Style.MUTED, 2)) var arche: String = tr("schwache Archetypen") if d.tier == "leicht" else (tr("starke Archetypen") if d.tier == "schwer" else tr("alle Archetypen")) rating_label.text = tr("Deine Deckstärke %.1f · Gegnerdecks %.1f · %s · Münzen x%.2f · KI: %s") % [ p.deck_rating(), p.target_rating(), arche, d.reward, tr("Vorausschau") if d.smart else tr("einfach")] var tip := p.suggest_difficulty() tip_label.text = (tr("Tipp: %s") % (("%d Siege in Folge, versuche %s" % [p.records.streak, Profile.DIFFICULTIES[tip].name]) if p.records.streak >= 3 else ("%d Niederlagen in Folge, versuche %s" % [p.records.loss_streak, Profile.DIFFICULTIES[tip].name]))) if tip != "" else "" b_tip.visible = tip != "" if reroll: var r := Game.make_rng() for n in range(1, Game.MAX_OPPONENTS + 1): var opps := [] for i in n: opps.append(Game.random_opponent(r, i + 1, Game.START_LIFE, p.target_rating(), str(d.tier))) previews[n] = opps for n in previews: var parts: Array[String] = [] for o in previews[n]: parts.append("%s (%.1f)" % [o.title, Game.deck_rating(o.deck)]) preview_labels[n].text = ", ".join(parts) func _input(event: InputEvent) -> void: if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE: app.show_screen(MenuScreen.new())