Files
pirate-dice/test_cli.gd
2026-09-16 12:09:47 +02:00

82 lines
3.1 KiB
GDScript

extends Node
const ORT := "/tmp/claude-1000/-home-arbeit-projects-pirate-dice/00de2cf5-7327-4fce-b543-2b4db6d3b775/scratchpad"
var game: Node
var rolle := ""
var runden := 0
var wuerfe := 0
var genau := 0
var _letzte_phase := ""
var _rng := RandomNumberGenerator.new()
func _ready() -> void:
Engine.time_scale = 8.0
_rng.randomize()
rolle = OS.get_cmdline_user_args()[0]
add_child(preload("res://scenes/main.tscn").instantiate())
await get_tree().create_timer(0.3).timeout
_lauf()
func _find(n: Node, w: String) -> Node:
if n.name == w: return n
for c in n.get_children():
var r := _find(c, w)
if r != null: return r
return null
func _warte(cond: Callable, sek: float) -> bool:
var t := 0.0
while t < sek:
if cond.call(): return true
await get_tree().create_timer(0.1).timeout
t += 0.1
return false
func _lauf() -> void:
if rolle == "host":
Net.create_room("Host")
await _warte(func(): return Net.room_code != "", 40.0)
var f := FileAccess.open(ORT + "/code.txt", FileAccess.WRITE)
f.store_string(Net.room_code); f.close()
await _warte(func(): return Net.lobby.size() >= 2, 80.0)
Net.request_start(1, 1)
else:
await _warte(func(): return FileAccess.file_exists(ORT + "/code.txt"), 80.0)
await get_tree().create_timer(0.5).timeout
Net.join_room(FileAccess.get_file_as_string(ORT + "/code.txt").strip_edges(), "Gast")
await _warte(func(): game = _find(get_tree().root, "Game"); return game != null, 120.0)
if game == null:
print("%s: kein Spiel" % rolle); get_tree().quit(1); return
var t := 0.0
var gewartet := 0.0
while t < 4400.0 and is_instance_valid(game) and game.phase != "over":
await get_tree().create_timer(0.2).timeout; t += 0.2
if not is_instance_valid(game): break
if game.phase != _letzte_phase:
_letzte_phase = game.phase
if game.phase == "roll": runden += 1
var me: int = game.local_seat
if game.phase != "bid" or game.turn != me or not game.seats[me].alive:
gewartet = 0.0; continue
gewartet += 0.2
if gewartet < 0.6: continue
var hand: Array = game.hand.get(me, [])
if not hand.is_empty() and (not BoosterDB.needs_bid(hand[0]) or not game.bid.is_empty()) and _rng.randf() < 0.7:
game._on_booster_chosen(hand[0], 0)
wuerfe += 1
await get_tree().create_timer(2.5).timeout
if not is_instance_valid(game) or game.turn != me or game.phase != "bid": continue
var total := 0
for s in game.seats: total += int(s.count)
var a: Dictionary = DiceAI.choose_action(game.my_values, total, game.bid, false, _rng)
if a.type == "challenge" and not game.bid.is_empty() and _rng.randf() < 0.3:
a = {"type": "exact"}
match a.type:
"bid": game._on_bid_pressed(int(a.count), int(a.face))
"challenge": game._on_challenge_pressed()
"exact":
game._on_exact_pressed(); genau += 1
gewartet = -2.0
if is_instance_valid(game):
print("%s: Ende %s '%s' Platz=%d Runden=%d Wuerfe=%d Genau=%d" % [rolle, game.phase, game.banner, game.local_seat, runden, wuerfe, genau])
for i in game.seats.size():
print("%s: Platz %d %s count=%d alive=%s" % [rolle, i, game.seats[i].name, game.seats[i].count, game.seats[i].alive])
else:
print("%s: Spiel weg, Runden=%d" % [rolle, runden])
get_tree().quit()