Elemente, Kombos, Fallen, KI mit Vorausschau, Kampagne, Hotseat und Netzwerk, Werkstatt, Erfolge, Tagesaufgaben, Tests und Exporte. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QPgKvy5W9WRNFHjkm5QsHx
112 lines
4.0 KiB
GDScript
112 lines
4.0 KiB
GDScript
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))
|