Files
elements-autochess/tests/Probe2.gd
2026-09-16 12:09:33 +02:00

144 lines
4.2 KiB
GDScript

extends Node3D
## Zweiter Durchlauf: Element-Auswahl, 3-Star, grosser Kampf, Spielende.
var main: Node3D
var out_dir := "user://shots"
var shot_no := 0
func _ready() -> void:
var args := OS.get_cmdline_user_args()
if args.size() > 0:
out_dir = args[0]
DirAccess.make_dir_recursive_absolute(out_dir)
main = load("res://scenes/Main.tscn").instantiate()
add_child(main)
_run()
func _wait(s: float) -> void:
await get_tree().create_timer(s).timeout
func _shot(n: String) -> void:
await RenderingServer.frame_post_draw
shot_no += 1
get_viewport().get_texture().get_image().save_png("%s/%02d_%s.png" % [out_dir, shot_no, n])
print("SHOT ", n)
func _run() -> void:
await _wait(0.5)
main._start_game()
main.game.timer_enabled = false
var p: PlayerState = main.game.human
# 1) Spezialisierung beim Kauf.
p.gold = 200
main._on_buy(0, false)
await _wait(0.4)
print("Picker sichtbar: ", main.picker.visible)
await _shot("kauf_spezialisierung")
main.picker.hide()
main.picker_cb.call(Data.Element.FEUER)
await _wait(0.2)
print("Gekauft: ", p.bench[0].display_name())
p.move_slot({"kind": "bench", "index": 0}, {"kind": "board", "hex": Vector2i(3, 1)})
main._refresh()
await _wait(0.2)
print("Aufgestellt: ", p.board.get(Vector2i(3, 1)).display_name())
# 2) Bis 3-Star aufwerten.
for i in 2:
p.bench[i] = Avatar.new(Data.Role.DPS, [Data.Element.FEUER] as Array[int], 1)
p.upgrade(Vector2i(3, 1), Data.Element.WIND, main.game.pool)
for i in 3:
p.bench[i] = Avatar.new(Data.Role.DPS, [Data.Element.FEUER] as Array[int], 1)
for i in range(3, 6):
p.bench[i] = Avatar.new(Data.Role.TANK, [Data.Element.WIND] as Array[int], 1)
main.sel_slot = {"kind": "board", "hex": Vector2i(3, 1)}
main._refresh()
await _wait(0.3)
print("3-Star möglich: ", p.can_upgrade(Vector2i(3, 1)))
await _shot("dreistern_bereit")
p.upgrade(Vector2i(3, 1), Data.Element.BLITZ, main.game.pool)
main._refresh()
var a: Avatar = p.board[Vector2i(3, 1)]
print("3-Star: ", a.display_name(), " star=", a.star, " hp=", int(a.base_stats()["hp"]))
await _wait(0.3)
await _shot("dreistern")
# 3) Grosses Team für einen sichtbaren Kampf.
main.game.round_no = 14
p.level = 9
var setup := [
[Vector2i(2, 0), Data.Role.TANK, Data.Element.ERDE],
[Vector2i(4, 0), Data.Role.TANK, Data.Element.ERDE],
[Vector2i(2, 1), Data.Role.DPS, Data.Element.FEUER],
[Vector2i(4, 1), Data.Role.DPS, Data.Element.FEUER],
[Vector2i(3, 3), Data.Role.HEILER, Data.Element.WASSER],
[Vector2i(2, 3), Data.Role.HEILER, Data.Element.EIS],
[Vector2i(5, 2), Data.Role.DPS, Data.Element.WIND],
]
for e in setup:
var av := Avatar.new(e[1], [e[2]] as Array[int], 1)
p.board[e[0]] = av
main.game.human.unlock(e[2])
main._refresh()
await _wait(0.3)
print("Traits: ", p.trait_counts(), " Kombis: ", p.active_combos().size())
await _shot("volles_team")
main._on_ready()
await _wait(1.5)
await _shot("grosser_kampf")
main.combat_speed = 4.0
await _wait(3.0)
await _shot("kampf_spaeter")
if main.game.phase == Game.Phase.COMBAT:
main._on_ready()
await _wait(0.4)
print("Ergebnis: ", main.game.last_round_log)
# 4) Bis zum Spielende durchlaufen.
var guard := 0
while main.game.phase != Game.Phase.GAMEOVER and guard < 120:
var ai := BotAI.new()
ai.setup(main.game.rand)
if main.game.human.alive:
ai.take_turn(main.game.human, main.game.pool, main.game.rand)
main._on_ready()
if main.game.phase == Game.Phase.COMBAT:
main.game.skip_combat()
guard += 1
main._refresh()
await _wait(0.5)
print("Spielende nach Runde ", main.game.round_no,
" Platz des Spielers: ", main.game.human.placement)
await _shot("spielende")
# 5) Neustart über den Knopf im Overlay.
var btn := _find_button(main.overlay, "Neues Spiel")
print("Neustart-Knopf gefunden: ", btn != null)
if btn != null:
btn.pressed.emit()
await _wait(0.5)
print("Nach Neustart: Runde ", main.game.round_no, " Leben ", main.game.human.hp,
" Spieler ", main.game.players.size(), " Overlay ", main.overlay)
await _shot("neustart")
print("PROBE2 FERTIG")
get_tree().quit()
func _find_button(node: Node, text: String) -> Button:
if node == null:
return null
for c in node.get_children():
if c is Button and c.text == text:
return c
var r := _find_button(c, text)
if r != null:
return r
return null