extends Node var main: Node3D func _ready() -> void: seed(20240) main = load("res://scenes/main.tscn").instantiate() add_child(main) await get_tree().process_frame main.ui.schliessen() main._erde() await get_tree().process_frame # B: engste Wege mit Türen und Treppen var liste: Array = [] for m in HumanDB.LIST: var r: Array = m["routine"] for i in range(r.size()): var von: String = String(r[i - 1][1]) if i > 0 else String(r[r.size() - 1][1]) var nach: String = String(r[i][1]) if von == nach: continue var pts: Array = Orte.route_voll(HumanDB.PLACES, von, nach, Vector3.ZERO, m.get("etage", {}), HumanDB.NETZ, HumanDB.ANKER) var l := 0.0 var pos := Orte.center(HumanDB.PLACES, von) + Vector3(0, Orte.hoehe(int(m.get("etage", {}).get(von, 0))), 0) for pt in pts: l += pos.distance_to(pt) pos = pt var slot_h: float = (float(r[i + 1][0]) - float(r[i][0])) if i + 1 < r.size() else (24.0 - float(r[i][0])) liste.append([slot_h * 15.0 - l / 8.0, "%s %s->%s %.1fs / %.0fs" % [m["name"], von, nach, l / 8.0, slot_h * 15.0]]) liste.sort_custom(func(a, b): return a[0] < b[0]) for k in range(6): print("ENG %s" % liste[k][1]) # C: Treppe hoch, was blockiert? var sp: Player = main.player var oben: Bewohner = null for m in main.welt.humans: if m.etage(str(m.data["heim"])) > 0: oben = m break var heim := str(oben.data["heim"]) var pl: Dictionary = HumanDB.PLACES[heim] print("HAUS %s size=%s dir=%s etagen=%d" % [heim, str(pl["size"]), pl["dir"], Orte.etagen(HumanDB.PLACES, heim)]) var t1 := Orte.treppe(HumanDB.PLACES, heim, 1) var stufen: Array = Orte.treppen_lauf(HumanDB.PLACES, heim, 0) sp.global_position = (stufen[0] as Vector3) + Vector3(0, 0.3, 0) sp.velocity = Vector3.ZERO var lauf: Vector3 = stufen[1] - stufen[0] lauf.y = 0.0 sp.yaw = atan2(-lauf.x, -lauf.z) Input.action_press("vor") var hoechste := 0.0 for i in range(70): await get_tree().physics_frame hoechste = maxf(hoechste, sp.global_position.y) if i % 10 == 9 or i == 69: var k := sp.get_last_slide_collision() var txt := "-" if k != null and k.get_collider() != null: var body: Node = k.get_collider() var mi: Node = body.get_parent() txt = "%s pos=%s size=%s normal=%s" % [mi.name, str(mi.global_position), str((mi as MeshInstance3D).mesh.get("size")) if mi is MeshInstance3D else "?", str(k.get_normal())] print("TREPPE f=%d pos=%s y=%.2f koll=%s" % [i, str(sp.global_position), sp.global_position.y, txt]) Input.action_release("vor") print("TREPPE hoechste=%.2f t1=%s" % [hoechste, str(t1)]) # E: Verfolgung -- wo reißt die Leine? var mensch: Bewohner = main.welt.humans[0] sp.global_position = mensch.global_position + Vector3(0, 0.3, 0) sp.velocity = Vector3.ZERO sp.folgt = mensch var weiteste := 0.0 for i in range(2400): await get_tree().physics_frame var d := sp.global_position.distance_to(mensch.global_position) if d > weiteste: weiteste = d if d > 6.0 and i % 5 == 0: var k := sp.get_last_slide_collision() var txt := "-" if k != null and k.get_collider() != null: var mi: Node = (k.get_collider() as Node).get_parent() txt = "%s pos=%s" % [mi.name, str(mi.global_position)] print("LEINE f=%d d=%.1f geist=%s mensch=%s ort=%s pfad=%d koll=%s" % [i, d, str(sp.global_position), str(mensch.global_position), mensch.place, mensch._path.size(), txt]) print("LEINE weiteste=%.1f" % weiteste) # D: wieder anhängen sp.folgt = null sp.global_position = mensch.global_position + Vector3(0, 1.5, 2.0) sp.velocity = Vector3.ZERO main._process(0.05) print("ANHAENGEN fokus_mensch=%s fokus=%s d=%.2f geist=%s mensch=%s auf_erde=%s offen=%s" % [ str(main._fokus_mensch), str(main._fokus), sp.global_position.distance_to(mensch.global_position + Vector3(0, 1, 0)), str(sp.global_position), str(mensch.global_position), str(main.auf_erde), str(main.ui.offen)]) get_tree().quit()