Files
dreamer-game/tests/shots.gd
2026-09-01 13:07:02 +02:00

294 lines
8.0 KiB
GDScript

extends Node
## Fährt das Spiel mit Fenster und legt Screenshots ab, um die Welt
## auch optisch zu prüfen.
const OUT := "user://shots/"
var main: Node3D
var n := 0
func _process(_d: float) -> void:
# Maus des Nutzers nicht einfangen, während die Bilder entstehen
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
func _ready() -> void:
seed(20240)
DirAccess.make_dir_recursive_absolute(ProjectSettings.globalize_path(OUT))
main = load("res://scenes/main.tscn").instantiate()
add_child(main)
await get_tree().process_frame
await get_tree().process_frame
await knipse("01_start")
main.player.global_position = Vector3(0, 6.0, 24.0) # vor dem Hörsaal, Blick ins Dorf
main.player.yaw = 0.0
main.player.pitch = -0.35
Game.time_h = 10.0
await warte(30)
await knipse("02_traumwelt")
main.player.global_position = Vector3(0, 32.0, 14.0) # über der Lichtung
main.player.yaw = 0.0
main.player.pitch = -0.78
await warte(20)
await knipse("03_traumdorf_ueberblick")
# Der Hörsaal ist zu Beginn das einzige Gebäude auf der Insel
var saal_aussen := Orte.center(DreamDB.PLACES, "hoersaal")
main.player.global_position = saal_aussen + Vector3(0, 2.0, -14.0)
main.player.yaw = PI
main.player.pitch = -0.12
await warte(20)
await knipse("04_hoersaal_aussen")
# Wo später die Häuser stehen, ist noch nichts
main.player.global_position = Vector3(-18.0, 8.0, -6.0)
main.player.yaw = -0.9
main.player.pitch = -0.30
await warte(20)
await knipse("05_insel_ohne_haeuser")
# Hörsaal der Wege: hier werden die Techniken gelehrt
var saal := Orte.center(DreamDB.PLACES, "hoersaal")
main.player.global_position = saal + Vector3(0, 1.0, -1.0)
main.player.yaw = PI
main.player.pitch = -0.05
await warte(20)
await knipse("06_hoersaal")
main.ui.lehre_panel()
await warte(6)
await knipse("07_techniken_lernen")
main.ui.schliessen()
Game.learn(str(DreamDB.techniken_von("hoersaal")[0]))
main.ui.journal_panel("techniken")
await warte(6)
await knipse("08_journal_techniken")
main.ui.schliessen()
# Schwarzes Brett an der Lichtung
var brett := Orte.center(DreamDB.PLACES, "lichtung") + Vector3(-6.0, 0, 9.0)
main.player.global_position = brett + Vector3(0, 1.0, 4.0)
main.player.yaw = 0.0
main.player.pitch = -0.02
await warte(20)
await knipse("09_schwarzes_brett")
main.ui.brett_panel()
await warte(6)
await knipse("10_missionen")
main.ui.schliessen()
Game.accept_mission("mensch_0")
main.ui.journal_panel("missionen")
await warte(6)
await knipse("11_journal_missionen")
# Diagnose: erst aufdecken, dann Systeme bauen
Game.erkannt_slots["mensch_0"] = {}
main.ui.systeme_panel("mensch_0")
await warte(6)
await knipse("12_tagesablauf_verdeckt")
var blocker := -1
for nr in range(Game.slots("mensch_0").size()):
Game.beobachten("mensch_0", nr, Game.ERKENNEN_SEK * 2.0)
if Ursachen.ist_blocker(Game.slot_grund("mensch_0", nr)) and blocker < 0:
blocker = nr
main.ui.systeme_panel("mensch_0")
await warte(6)
await knipse("12b_tagesablauf_erkannt")
main.ui.slot_panel("mensch_0", blocker)
await warte(6)
await knipse("13_system_waehlen")
main.ui.schliessen()
# Lichtung, wenn sich die Wesen dort treffen
for i in range(1200):
main._process(0.05)
for k in main.welt.get_children():
if k is Bewohner:
k._process(0.05)
Game.time_h = 19.5
main.player.global_position = Vector3(0.0, 1.0, 22.0)
main.player.yaw = 0.0
main.player.pitch = -0.20
await warte(20)
await knipse("14_dorfplatz_leer")
var tor := Orte.center(DreamDB.PLACES, "tor")
main.player.global_position = tor + Vector3(0, 2.5, 14.0)
main.player.yaw = 0.0
main.player.pitch = -0.12
await warte(20)
await knipse("15_tor_zur_erde")
main._erde()
Game.time_h = 10.5
await warte(40)
main.player.global_position = Vector3(0, 26.0, 42.0)
main.player.pitch = -0.62
main.player.yaw = 0.0
await warte(20)
await knipse("16_erde_uebersicht")
var lena: Bewohner = null
for m in main.welt.humans:
if m.data["id"] == "mensch_0":
lena = m
for i in range(900):
main._process(0.05)
for k in main.welt.get_children():
if k is Bewohner:
k._process(0.05)
Game.time_h = 10.5
if lena.place == "haus_lena" and lena._path.is_empty():
break
main.player.global_position = lena.global_position + Vector3(0, 1.2, -4.5)
main.player.yaw = PI
main.player.pitch = -0.15
await warte(20)
await knipse("17_lena_zoegert")
# Der Traum läuft von allein weiter, solange Systeme stehen
for i in range(4000):
Game.time_h += 0.004
main._process(0.02)
for k in main.welt.get_children():
if k is Bewohner:
k._process(0.05)
main.player.global_position = lena.global_position + Vector3(0, 1.6, -5.5)
main.player.yaw = PI
main.player.pitch = -0.10
await warte(4)
await knipse("18_traum_laeuft")
main.ui.anwenden_panel(lena)
await warte(6)
await knipse("19_vor_ort")
main.ui.schliessen()
Game.cooldown.clear()
var wege: Array = []
for tid in Game.known:
wege.append(str(tid))
if not wege.is_empty():
main.ui._apply_human = lena
main.ui._vor_ort_setzen(str(wege[0]))
await warte(25)
await knipse("20_reaktion")
Game.time_h = 13.5
for i in range(1200):
main._process(0.05)
for k in main.welt.get_children():
if k is Bewohner:
k._process(0.05)
Game.time_h = 13.5
main.player.global_position = Vector3(0, 11.0, -14.0)
main.player.yaw = PI
main.player.pitch = -0.5
await warte(20)
await knipse("21_cafe_mittag")
Game.time_h = 22.5
await warte(40)
main.player.global_position = Vector3(0, 18.0, 34.0)
main.player.yaw = 0.0
main.player.pitch = -0.5
await warte(20)
await knipse("22_nacht")
# Loop 2: ein erfüllter Traum lässt die Insel wachsen
if not Game.completed.has("mensch_0"):
Game.completed.append("mensch_0")
Game.active_mission = ""
Game.welt_erzeugen()
main._traumwelt()
await warte(20)
main.player.global_position = Vector3(-30.0, 26.0, 30.0)
main.player.yaw = 0.7
main.player.pitch = -0.55
Game.time_h = 11.0
await warte(20)
await knipse("23_insel_gewachsen")
var erstes := Orte.center(DreamDB.PLACES, DreamDB.haus_key(0))
var tuer := Orte.door(DreamDB.PLACES, DreamDB.haus_key(0))
var hinein := (erstes - tuer).normalized()
main.player.global_position = erstes - hinein * 2.0 + Vector3(0, 1.0, 0)
main.player.yaw = atan2(-hinein.x, -hinein.z)
main.player.pitch = -0.05
await warte(20)
await knipse("24_erstes_haus")
main.ui.lehre_panel(DreamDB.haus_key(0))
await warte(6)
await knipse("25_neuer_weg")
main.ui.schliessen()
# Neun erfüllte Träume: das Dorf ist über den ersten Ring hinausgewachsen
while Game.completed.size() < 9:
Game.completed.append("traum_%d" % Game.completed.size())
Game.welt_erzeugen()
main._traumwelt()
await warte(20)
main.player.global_position = Vector3(0, 110.0, 70.0)
main.player.yaw = 0.0
main.player.pitch = -0.85
Game.time_h = 12.0
await warte(20)
await knipse("26_insel_vollstaendig")
# Jetzt wohnt jemand hier: die Wesen treffen sich auf der Lichtung
for i in range(1500):
main._process(0.05)
for k in main.welt.get_children():
if k is Bewohner:
k._process(0.05)
Game.time_h = 19.5
main.player.global_position = Vector3(0.0, 1.2, 20.0)
main.player.yaw = 0.0
main.player.pitch = -0.14
await warte(20)
await knipse("27_wesen_am_dorfplatz")
var ailen: Bewohner = null
for w in main.welt.bewohner:
if w.data["id"] == "wesen_0":
ailen = w
for i in range(1200):
main._process(0.05)
for k in main.welt.get_children():
if k is Bewohner:
k._process(0.05)
Game.time_h = 10.0
if ailen != null and ailen.place == DreamDB.haus_key(0) and ailen._path.is_empty():
break
if ailen != null:
main.player.global_position = ailen.global_position + Vector3(3.0, 0.6, 1.2)
main.player.yaw = -PI * 0.32
main.player.pitch = -0.06
await warte(20)
await knipse("28_wesen_im_haus")
print("Screenshots: %d" % n)
print("Ordner: %s" % ProjectSettings.globalize_path(OUT))
get_tree().quit()
func warte(frames: int) -> void:
for i in range(frames):
await get_tree().process_frame
func knipse(bezeichnung: String) -> void:
await RenderingServer.frame_post_draw
var img := get_viewport().get_texture().get_image()
img.save_png(OUT + bezeichnung + ".png")
n += 1
print(" Bild: " + bezeichnung)