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)