class_name HotseatScreen extends Control ## Lokal zu mehreren am selben Rechner: Spielerzahl, KI-Zahl und Decks wählen. var app var n_humans := 2 var n_ai := 0 var deck_choice: Array = [] # je Mensch: Slot-Index oder -1 für Zufallsdeck var human_buttons: Array = [] var ai_buttons: Array = [] var deck_rows: VBoxContainer var b_start: Button var hint: Label func _ready() -> void: var col := Style.column(self, 760, 40, 10) Style.clabel(col, "Lokal zu mehreren", 36, Style.GOLD, "center", true) Style.clabel(col, "Alle spielen am selben Rechner und reichen die Maus weiter. Jeder gegen jeden, ohne Münzen.", 16, Style.MUTED) Style.spacer(col, 10) Style.clabel(col, "Spieler", 20, Style.TEXT, "center", true) var hr := Style.row(col, 10) hr.alignment = BoxContainer.ALIGNMENT_CENTER for n in range(2, 5): human_buttons.append(Style.cbutton(hr, "%d Spieler" % n, Vector2(150, 44), func(): set_humans(n))) Style.clabel(col, "KI-Gegner", 20, Style.TEXT, "center", true) var ar := Style.row(col, 10) ar.alignment = BoxContainer.ALIGNMENT_CENTER for n in range(0, 5): ai_buttons.append(Style.cbutton(ar, "%d KI" % n if n > 0 else "keine KI", Vector2(120, 44), func(): set_ai(n))) Style.spacer(col, 6) Style.clabel(col, "Decks", 20, Style.TEXT, "center", true) deck_rows = VBoxContainer.new() deck_rows.add_theme_constant_override("separation", 6) col.add_child(deck_rows) Style.spacer(col, 6) hint = Style.clabel(col, "", 15, Style.ORANGE) var br := Style.row(col, 20) br.alignment = BoxContainer.ALIGNMENT_CENTER b_start = Style.cbutton(br, "Start", Vector2(200, 48), start, Color("285a3c")) Style.cbutton(br, "Zurück", Vector2(160, 48), func(): app.show_screen(MenuScreen.new())) for i in 4: deck_choice.append(-1) var p: Profile = app.profile if p.deck_valid()[0]: deck_choice[0] = p.active_deck refresh() func _input(event: InputEvent) -> void: if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE: app.show_screen(MenuScreen.new()) func set_humans(n: int) -> void: n_humans = n n_ai = mini(n_ai, Game.MAX_OPPONENTS + 1 - n_humans) refresh() func set_ai(n: int) -> void: n_ai = n refresh() func valid_slots() -> Array: var out := [] for i in Profile.DECK_SLOTS: if app.profile.deck_valid(i)[0]: out.append(i) return out func refresh() -> void: var p: Profile = app.profile for i in human_buttons.size(): human_buttons[i].disabled = (i + 2) == n_humans for i in ai_buttons.size(): ai_buttons[i].disabled = i == n_ai or n_humans + i > Game.MAX_OPPONENTS + 1 Style.clear(deck_rows) var slots := valid_slots() for h in n_humans: var r := Style.row(deck_rows, 12) r.alignment = BoxContainer.ALIGNMENT_CENTER Style.clabel(r, "Spieler %d" % (h + 1), 16, Style.TEXT, "right", true, 140) var ob := OptionButton.new() ob.custom_minimum_size = Vector2(340, 36) ob.add_item("Zufallsdeck", -1) for slot in slots: var elems := Game.deck_elements(p.deck_cards(slot)) ob.add_item("%s (%s)" % [p.deck_name(slot), ", ".join(elems)], slot) ob.select(ob.get_item_index(deck_choice[h]) if deck_choice[h] >= 0 and slots.has(deck_choice[h]) else 0) var idx := h ob.item_selected.connect(func(i: int): deck_choice[idx] = ob.get_item_id(i)) r.add_child(ob) hint.text = "%d am Tisch" % (n_humans + n_ai) func start() -> void: var p: Profile = app.profile var r := Game.make_rng() var decks := [] for h in n_humans: var slot: int = deck_choice[h] if slot >= 0 and p.deck_valid(slot)[0]: decks.append(p.deck_cards(slot)) else: var pool: Array = Cards.ELEMENTS.duplicate() Game.shuffle(pool, r) decks.append(Game.build_opponent_deck(r, [pool[0], pool[1]])) app.show_screen(BattleScreen.hotseat(decks, n_ai))