extends "res://tests/basis.gd" ## Solopartie headless: Münzen, Genau, Topf, Zählen, Stufe, Tipp-Schranke. ## Die Bots werden zu "Menschen" ohne Peer gemacht - dann wartet der Host ## auf unsere Eingaben, und der Ablauf ist steuerbar. var game: Node func _ready() -> void: add_child(preload("res://scenes/main.tscn").instantiate()) await get_tree().process_frame Net.start_singleplayer("Tester", 3, 2) _lauf() func _menschen() -> void: for i in [1, 2, 3]: game.seats[i].ai = false func _lauf() -> void: await _warte(func(): game = _find(get_tree().root, "Game"); return game != null, 20.0) await _warte(func(): return game.phase == "bid", 40.0) var me: int = game.local_seat var hud: Node = game.hud _pruef("Stufe aus der Konfiguration", DiceAI.stufe == 2) _pruef("Jeder startet mit einer Münze", game.hand[me].size() == 1 and game.hand[1].size() == 1) _menschen() # --- Zugbindung game.hand[1] = ["peek"] await game._do_play(1, "peek", 0) _pruef("Gegner wirft nicht am fremden Zug", game.hand[1] == ["peek"] and game.topf.is_empty()) game.hand[me] = ["count"] await game._do_play(me, "count", 0) _pruef("Zählen ohne Ansage abgelehnt", game.hand[me].has("count")) # --- Wirkungen beider Seiten game.bid = {"seat": 1, "count": 1, "face": 4} var n4: int = game._count_face(4) await game._wirkung(me, "count", 0, false) var f: Array = game.gezaehlt[me][4] _pruef("Zählen: Fenster enthält die Wahrheit", int(f[0]) <= n4 and n4 <= int(f[1]) and int(f[1]) - int(f[0]) == 2) await game._wirkung(me, "count", 0, true) f = game.gezaehlt[me][4] _pruef("Zählen: Wappen ist exakt", int(f[0]) == n4 and int(f[1]) == n4) await game._wirkung(me, "set_face", 0, true) _pruef("Falschspiel dreht zwei Würfel auf die Ansage", game.host_values[me].count(4) >= 2) await game._wirkung(me, "gain_die", 0, true) _pruef("Nachschub mit Wappen: neuer Würfel ist 6", game.host_values[me].size() == 6 and game.host_values[me][5] == 6) await game._wirkung(me, "bid_up", 0, true) _pruef("Erhöhen mit Wappen: +2", int(game.bid.count) == 3 and game.verlauf.back().erhoeht) await game._wirkung(me, "gag", 0, false) _pruef("Maulkorb trifft den Nächsten", game.must_bid.get(1, false) and not game.must_bid.get(2, false)) await game._wirkung(me, "peek", 0, true) _pruef("Spähen mit Wappen: zwei je Gegner", game.peeked[me][1].size() == 2) game.bid = {} game.must_bid.clear() # --- Topf: Deckel und Übertrag game.topf.clear() game.hand[me] = ["gag", "gag", "gag", "gag", "gag", "gag", "gag"] for i in 7: await game._do_play(me, "gag", 0) _pruef("Topf höchstens %d" % BoosterDB.TOPF_MAX, game.topf.size() == BoosterDB.TOPF_MAX) _pruef("Rausfallen steht im Protokoll", game.log_lines.any(func(z): return "vom Tisch" in z)) game.hand[2] = ["peek", "peek"] game._topf_an(2) _pruef("Gewinner nimmt bis zum Limit, Rest bleibt", game.hand[2].size() == BoosterDB.HANDLIMIT and game.topf.size() == BoosterDB.TOPF_MAX - 2) game.topf.clear() game.must_bid.clear() # --- Protokoll und Tipp-Schranke im HUD game._push_state() await get_tree().create_timer(0.3).timeout _pruef("Protokoll kommt im HUD an", hud.log_box.get_child_count() > 0) hud._touch = true var geworfen := [] hud.booster_chosen.connect(func(id, _t): geworfen.append(id)) game.hand[me] = ["peek"] game._push_state() await get_tree().create_timer(0.3).timeout hud._pick("peek") _pruef("Handy: erster Tipp wirft nicht", geworfen.is_empty()) hud._pick("peek") _pruef("Handy: zweiter Tipp wirft", geworfen == ["peek"]) hud._touch = false await get_tree().create_timer(2.5).timeout # --- Genau-Treffer: Ansager verliert, Rufer bekommt einen game.must_bid.clear() var n3: int = game._count_face(3) if n3 == 0: game._set_die(me, 0, 3) n3 = 1 var vorher: Array = [] for i in 4: vorher.append(int(game.seats[i].count)) game._do_bid(me, n3, 3) await _warte(func(): return game.turn == 1, 5.0) game._do_exact(1) await _warte(func(): return game.phase == "reveal", 5.0) _pruef("Etappe 1: noch nicht gezählt", int(game.reveal_total) == -1) await _warte(func(): return int(game.reveal_total) >= 0, 3.0) _pruef("Etappe 2: gezählt", int(game.reveal_total) == n3) await _warte(func(): return game.banner.begins_with("Genau!"), 3.0) await _warte(func(): return game.phase != "reveal", 8.0) _pruef("Genau: Ansager -1, Rufer +1, Rest gleich", int(game.seats[me].count) == vorher[0] - 1 and int(game.seats[1].count) == vorher[1] + 1 and int(game.seats[2].count) == vorher[2] and int(game.seats[3].count) == vorher[3]) _pruef("Rufer beginnt", game.starter == 1) # --- Genau daneben await _warte(func(): return game.phase == "bid", 20.0) _menschen() await _warte(func(): return game.turn == 1, 5.0) var n5: int = game._count_face(5) game._do_bid(1, mini(n5 + 2, game._total_dice()), 5) await _warte(func(): return game.turn == 2, 5.0) var c2: int = game.seats[2].count game._do_exact(2) await _warte(func(): return game.banner.begins_with("Daneben"), 8.0) await _warte(func(): return game.phase != "reveal", 8.0) _pruef("Genau daneben: nur der Rufer verliert", int(game.seats[2].count) == c2 - 1) _fertig()