update
This commit is contained in:
105
tests/shots.gd
105
tests/shots.gd
@@ -21,61 +21,78 @@ func _ready() -> void:
|
||||
await knipse("01_intro")
|
||||
|
||||
main.ui.schliessen()
|
||||
main.player.global_position = Vector3(0, 3.0, 26.0)
|
||||
main.player.global_position = Vector3(0, 4.0, 34.0)
|
||||
main.player.yaw = 0.0
|
||||
main.player.pitch = -0.10
|
||||
await warte(20)
|
||||
main.player.pitch = -0.14
|
||||
Game.time_h = 10.0
|
||||
await warte(30)
|
||||
await knipse("02_traumwelt")
|
||||
|
||||
main.player.global_position = Vector3(-24, 2.0, 4.0)
|
||||
main.player.yaw = 0.0
|
||||
main.player.pitch = -0.02
|
||||
main.player.global_position = Vector3(0, 12.0, 30.0)
|
||||
main.player.pitch = -0.5
|
||||
await warte(20)
|
||||
await knipse("03_bibliothek_aussen")
|
||||
await knipse("03_traumdorf_ueberblick")
|
||||
|
||||
Game.teleport_lock = 0.0
|
||||
main.player.global_position = Vector3(0, -299.0, 2.0)
|
||||
var haus := Orte.center(DreamDB.PLACES, "haus_ailen")
|
||||
main.player.global_position = haus + Vector3(0, 2.0, 12.0)
|
||||
main.player.yaw = 0.0
|
||||
main.player.pitch = -0.12
|
||||
await warte(30)
|
||||
await knipse("04_bibliothek_innen")
|
||||
main.player.pitch = -0.18
|
||||
await warte(20)
|
||||
await knipse("04_haus_aussen")
|
||||
|
||||
main.ui.technik_panel("pomodoro")
|
||||
# ein Wesen in seinem Haus
|
||||
var ailen: Bewohner = null
|
||||
for w in main.welt.bewohner:
|
||||
if w.data["id"] == "ailen":
|
||||
ailen = w
|
||||
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.0
|
||||
if ailen.place == "haus_ailen" and ailen._path.is_empty():
|
||||
break
|
||||
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("05_haus_innen")
|
||||
|
||||
main.ui.journal_panel("techniken")
|
||||
await warte(6)
|
||||
await knipse("05_technik_hinweise")
|
||||
await knipse("06_journal_techniken")
|
||||
main.ui.schliessen()
|
||||
|
||||
Game.learn("pomodoro")
|
||||
Game.learn("zerlegen")
|
||||
Game.learn("box_atmung")
|
||||
|
||||
main.player.global_position = Vector3(90, -299.0, 2.0)
|
||||
main.player.yaw = 0.0
|
||||
main.player.pitch = -0.08
|
||||
await warte(20)
|
||||
await knipse("06_missionshalle")
|
||||
|
||||
main.ui.mission_panel("lena")
|
||||
main.ui.journal_panel("missionen")
|
||||
await warte(6)
|
||||
await knipse("07_mission_panel")
|
||||
await knipse("07_journal_missionen")
|
||||
main.ui.schliessen()
|
||||
Game.accept_mission("lena")
|
||||
|
||||
main.ui.kodex_panel()
|
||||
await warte(6)
|
||||
await knipse("08_kodex")
|
||||
main.ui.schliessen()
|
||||
|
||||
Game.teleport_lock = 0.0
|
||||
main.player.global_position = Vector3(-90, -299.0, 5.0)
|
||||
# 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.1
|
||||
main.player.pitch = -0.20
|
||||
await warte(20)
|
||||
await knipse("08b_meditation")
|
||||
main.ui.vertiefen_panel()
|
||||
await warte(6)
|
||||
await knipse("08c_vertiefen")
|
||||
main.ui.schliessen()
|
||||
await knipse("08_lichtung")
|
||||
|
||||
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("09_tor_zur_erde")
|
||||
|
||||
main._erde()
|
||||
Game.time_h = 10.5
|
||||
@@ -84,16 +101,16 @@ func _ready() -> void:
|
||||
main.player.pitch = -0.62
|
||||
main.player.yaw = 0.0
|
||||
await warte(20)
|
||||
await knipse("09_erde_uebersicht")
|
||||
await knipse("10_erde_uebersicht")
|
||||
|
||||
var lena: Human = null
|
||||
var lena: Bewohner = null
|
||||
for m in main.welt.humans:
|
||||
if m.data["id"] == "lena":
|
||||
lena = m
|
||||
for i in range(900):
|
||||
main._process(0.05)
|
||||
for k in main.welt.get_children():
|
||||
if k is Human:
|
||||
if k is Bewohner:
|
||||
k._process(0.05)
|
||||
Game.time_h = 10.5
|
||||
if lena.place == "haus_lena" and lena._path.is_empty():
|
||||
@@ -102,27 +119,27 @@ func _ready() -> void:
|
||||
main.player.yaw = PI
|
||||
main.player.pitch = -0.15
|
||||
await warte(20)
|
||||
await knipse("10_lena_zoegert")
|
||||
await knipse("11_lena_zoegert")
|
||||
|
||||
main.ui.anwenden_panel(lena)
|
||||
await warte(6)
|
||||
await knipse("11_anwenden")
|
||||
await knipse("12_anwenden")
|
||||
main.ui._anwenden("pomodoro")
|
||||
await warte(25)
|
||||
await knipse("12_reaktion")
|
||||
await knipse("13_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 Human:
|
||||
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("13_cafe_mittag")
|
||||
await knipse("14_cafe_mittag")
|
||||
|
||||
Game.time_h = 22.5
|
||||
await warte(40)
|
||||
@@ -130,7 +147,7 @@ func _ready() -> void:
|
||||
main.player.yaw = 0.0
|
||||
main.player.pitch = -0.5
|
||||
await warte(20)
|
||||
await knipse("14_nacht")
|
||||
await knipse("15_nacht")
|
||||
|
||||
print("Screenshots: %d" % n)
|
||||
print("Ordner: %s" % ProjectSettings.globalize_path(OUT))
|
||||
|
||||
326
tests/verify.gd
326
tests/verify.gd
@@ -23,8 +23,9 @@ func _ready() -> void:
|
||||
await get_tree().process_frame
|
||||
|
||||
await test_start()
|
||||
await test_bibliothek()
|
||||
await test_gebaeude_betreten()
|
||||
await test_journal()
|
||||
await test_traumdorf()
|
||||
await test_haus_betreten()
|
||||
await test_mission_annehmen()
|
||||
await test_reise_zur_erde()
|
||||
await test_tagesablauf()
|
||||
@@ -32,7 +33,8 @@ func _ready() -> void:
|
||||
await test_geist()
|
||||
await test_technik_anwenden()
|
||||
await test_mission_abschliessen()
|
||||
await test_ui_panels()
|
||||
await test_techniken_verbessern_sich()
|
||||
await test_journal_ueberall()
|
||||
await test_steuerung()
|
||||
|
||||
print("\n=========================================")
|
||||
@@ -57,10 +59,23 @@ func schritte(n: int, dt: float = 0.05, zeit: float = -1.0) -> void:
|
||||
if welt().has_method("_process"):
|
||||
welt()._process(dt)
|
||||
for kind in welt().get_children():
|
||||
if kind is Human:
|
||||
if kind is Bewohner:
|
||||
kind._process(dt)
|
||||
|
||||
|
||||
func laufe(von: Vector3, yaw: float, frames: int) -> Vector3:
|
||||
main.player.set_mode(Player.Mode.TRAUM)
|
||||
main.player.look_enabled = true
|
||||
main.player.global_position = von
|
||||
main.player.velocity = Vector3.ZERO
|
||||
main.player.yaw = yaw
|
||||
Input.action_press("vor")
|
||||
for i in range(frames):
|
||||
await get_tree().physics_frame
|
||||
Input.action_release("vor")
|
||||
return main.player.global_position
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
|
||||
func test_start() -> void:
|
||||
@@ -71,31 +86,31 @@ func test_start() -> void:
|
||||
p(welt() is DreamWorld, "Startwelt ist die Traumwelt")
|
||||
p(main.player != null and main.player.mode == Player.Mode.TRAUM, "Spieler läuft (kein Geist)")
|
||||
var inter := get_tree().get_nodes_in_group("interactable")
|
||||
p(inter.size() == 12 + 4 + 1 + 1,
|
||||
"18 Interaktionspunkte (12 Techniken, 4 Missionen, Meditation, Tor) — gefunden: %d" % inter.size())
|
||||
p(inter.size() == 1 and inter[0].get_meta("kind") == "erde",
|
||||
"Einzige Interaktion in der Traumwelt ist das Tor zur Erde (%d)" % inter.size())
|
||||
p(Game.einsicht == 3, "Startkapital 3 Einsicht")
|
||||
p(Game.known.is_empty(), "Noch keine Technik gelernt")
|
||||
|
||||
|
||||
func test_bibliothek() -> void:
|
||||
abschnitt("Techniken lernen (Bibliothek)")
|
||||
func test_journal() -> void:
|
||||
abschnitt("Journal")
|
||||
for t in TechDB.LIST:
|
||||
var vollstaendig: bool = t["was"] != "" and t["wann"] != "" and t["warum"] != ""
|
||||
if not vollstaendig:
|
||||
p(false, "Technik %s hat alle drei Hinweise" % t["id"])
|
||||
p(true, "Alle %d Techniken tragen Was/Wann/Warum" % TechDB.LIST.size())
|
||||
|
||||
# Über den echten Interaktionsweg: Spieler an ein Pult stellen
|
||||
var ziel: Node3D = null
|
||||
for n in get_tree().get_nodes_in_group("interactable"):
|
||||
if n.get_meta("kind") == "technik" and n.get_meta("arg") == "pomodoro":
|
||||
ziel = n
|
||||
p(ziel != null, "Pult für die Pomodoro-Technik existiert")
|
||||
main.player.global_position = ziel.global_position + Vector3(0, 0.5, 1.0)
|
||||
main._process(0.05)
|
||||
p(main._fokus == ziel, "Spieler erfasst das Pult als Fokus")
|
||||
main._interagieren()
|
||||
p(ui().offen and ui()._kind == "technik", "Technik-Panel öffnet sich")
|
||||
ui().journal_panel("techniken")
|
||||
p(ui().offen and ui()._kind == "journal", "Journal öffnet sich")
|
||||
var knoepfe := 0
|
||||
for c in ui()._content.get_children():
|
||||
if c is Button:
|
||||
knoepfe += 1
|
||||
p(knoepfe >= TechDB.LIST.size(), "Jede der %d Techniken hat einen Knopf (%d)" %
|
||||
[TechDB.LIST.size(), knoepfe])
|
||||
ui().journal_panel("missionen")
|
||||
p(ui()._journal_seite == "missionen" and ui()._content.get_child_count() > 0,
|
||||
"Missionsseite baut auf")
|
||||
ui().schliessen()
|
||||
|
||||
p(Game.learn("pomodoro"), "Pomodoro gelernt")
|
||||
@@ -111,51 +126,96 @@ func test_bibliothek() -> void:
|
||||
Game.known["pomodoro"] = 0
|
||||
|
||||
|
||||
func test_gebaeude_betreten() -> void:
|
||||
abschnitt("Gebäude betreten")
|
||||
var vorher: Vector3 = main.player.global_position
|
||||
main.player.global_position = Vector3(-24, 1.0, -4.0)
|
||||
Game.teleport_lock = 0.0
|
||||
for i in range(12):
|
||||
await get_tree().physics_frame
|
||||
main.player.global_position = Vector3(-24, 1.0, -9.0)
|
||||
for i in range(20):
|
||||
await get_tree().physics_frame
|
||||
var drin: bool = main.player.global_position.y < -250.0
|
||||
p(drin, "Tür der Bibliothek versetzt in den Innenraum (y=%.1f)" % main.player.global_position.y)
|
||||
func test_traumdorf() -> void:
|
||||
abschnitt("Traumwesen leben ihren Tag")
|
||||
var wesen: Array = welt().bewohner
|
||||
p(wesen.size() == 4, "Vier Wesen wohnen in der Traumwelt (%d)" % wesen.size())
|
||||
|
||||
# drinnen stehen die Pulte
|
||||
var innen_pulte := 0
|
||||
for n in get_tree().get_nodes_in_group("interactable"):
|
||||
if n.get_meta("kind") == "technik" and n.global_position.y < -250.0:
|
||||
innen_pulte += 1
|
||||
p(innen_pulte == 12, "12 Technik-Pulte stehen im Innenraum (%d)" % innen_pulte)
|
||||
var haeuser := 0
|
||||
for key in DreamDB.PLACES:
|
||||
var s: Array = DreamDB.PLACES[key]["size"]
|
||||
if s[0] > 0.0:
|
||||
haeuser += 1
|
||||
p(haeuser == 4, "Es gibt vier Häuser (%d)" % haeuser)
|
||||
|
||||
Game.teleport_lock = 0.0
|
||||
main.player.global_position = Vector3(0, -299.0, 6.0)
|
||||
for i in range(10):
|
||||
await get_tree().physics_frame
|
||||
main.player.global_position = Vector3(0, -299.0, 12.0)
|
||||
for i in range(20):
|
||||
await get_tree().physics_frame
|
||||
p(main.player.global_position.y > -100.0,
|
||||
"Ausgang bringt zurück nach draußen (y=%.1f)" % main.player.global_position.y)
|
||||
main.player.global_position = vorher
|
||||
var eigene: Dictionary = {}
|
||||
for w in wesen:
|
||||
var haus := "haus_" + str(w.data["id"])
|
||||
p(DreamDB.PLACES.has(haus), "%s hat ein eigenes Haus (%s)" % [w.data["name"], haus])
|
||||
eigene[haus] = true
|
||||
var kommt_vor := false
|
||||
for e in w.data["routine"]:
|
||||
if e[1] == haus:
|
||||
kommt_vor = true
|
||||
p(kommt_vor, "Die Routine von %s führt ins eigene Haus" % w.data["name"])
|
||||
p(eigene.size() == 4, "Jedes Wesen hat ein anderes Haus")
|
||||
|
||||
var luecken := 0
|
||||
for w in wesen:
|
||||
for h in range(24):
|
||||
var r: Array = w._routine_at(float(h) + 0.5)
|
||||
if not DreamDB.PLACES.has(r[0]) or not Orte.ACTIVITY_TEXT.has(r[1]):
|
||||
luecken += 1
|
||||
p(luecken == 0, "Alle vier haben rund um die Uhr Ort und Tätigkeit")
|
||||
|
||||
# Ein voller Tag am Stück: niemand bleibt hängen
|
||||
Game.time_h = 0.0
|
||||
Game.day = 1
|
||||
var besucht: Dictionary = {}
|
||||
for w in wesen:
|
||||
besucht[w.data["id"]] = {}
|
||||
for i in range(9000):
|
||||
schritte(1)
|
||||
for w in wesen:
|
||||
if w._path.is_empty():
|
||||
besucht[w.data["id"]][w.place] = true
|
||||
if Game.time_h >= 23.5:
|
||||
break
|
||||
var alle_ok := true
|
||||
for w in wesen:
|
||||
var soll: Dictionary = {}
|
||||
for e in w.data["routine"]:
|
||||
soll[e[1]] = true
|
||||
var ist: int = besucht[w.data["id"]].size()
|
||||
if ist < soll.size():
|
||||
alle_ok = false
|
||||
p(false, "%s erreichte nur %d von %d Stationen" % [w.data["name"], ist, soll.size()])
|
||||
p(alle_ok, "Über einen ganzen Tag erreicht jedes Wesen jede Station seiner Routine")
|
||||
|
||||
var zuhause := 0
|
||||
schritte(20, 0.05, 1.0)
|
||||
for w in wesen:
|
||||
var r: Array = w._routine_at(1.0)
|
||||
if w.place == r[0]:
|
||||
zuhause += 1
|
||||
p(zuhause == 4, "Um 01:00 sind alle vier an ihrem Nachtplatz (%d)" % zuhause)
|
||||
|
||||
|
||||
func test_haus_betreten() -> void:
|
||||
abschnitt("Orte betreten")
|
||||
var haus := Orte.center(DreamDB.PLACES, "haus_ailen")
|
||||
var tuer := Orte.door(DreamDB.PLACES, "haus_ailen")
|
||||
|
||||
var ziel: Vector3 = await laufe(tuer + Vector3(0, 1.0, 1.5), 0.0, 80)
|
||||
var drin: bool = absf(ziel.x - haus.x) < 6.0 and absf(ziel.z - haus.z) < 5.0
|
||||
p(drin, "Durch die Tür läuft man ins Haus (Ziel %.1f / %.1f, Haus %.1f / %.1f)" %
|
||||
[ziel.x, ziel.z, haus.x, haus.z])
|
||||
|
||||
# Die Wand hält
|
||||
var vor_wand := haus + Vector3(-11.0, 1.0, 0)
|
||||
var gestoppt: Vector3 = await laufe(vor_wand, -PI * 0.5, 80)
|
||||
p(gestoppt.x < haus.x - 5.5,
|
||||
"Die Seitenwand hält den Spieler auf (x = %.1f, Wand bei %.1f)" %
|
||||
[gestoppt.x, haus.x - 6.0])
|
||||
|
||||
main.player.set_mode(Player.Mode.TRAUM)
|
||||
main.player.global_position = (welt() as DreamWorld).spawn
|
||||
|
||||
|
||||
func test_mission_annehmen() -> void:
|
||||
abschnitt("Mission annehmen")
|
||||
var ziel: Node3D = null
|
||||
for n in get_tree().get_nodes_in_group("interactable"):
|
||||
if n.get_meta("kind") == "mission" and n.get_meta("arg") == "lena":
|
||||
ziel = n
|
||||
p(ziel != null, "Stele für Lena Vogt existiert")
|
||||
Game.teleport_lock = 1.0
|
||||
main.player.global_position = ziel.global_position + Vector3(0, 0, 1.2)
|
||||
main._process(0.05)
|
||||
p(main._fokus == ziel, "Stele wird als Fokus erkannt")
|
||||
main._interagieren()
|
||||
p(ui().offen and ui()._kind == "mission", "Missions-Panel öffnet sich")
|
||||
ui().journal_panel("missionen")
|
||||
p(ui().offen and ui()._journal_seite == "missionen", "Missionsseite des Journals offen")
|
||||
ui().schliessen()
|
||||
p(Game.accept_mission("lena"), "Mission Lena angenommen")
|
||||
p(Game.active_mission == "lena", "Mission ist aktiv")
|
||||
@@ -180,7 +240,7 @@ func test_reise_zur_erde() -> void:
|
||||
|
||||
func test_tagesablauf() -> void:
|
||||
abschnitt("Tagesablauf der Menschen")
|
||||
var lena: Human = null
|
||||
var lena: Bewohner = null
|
||||
for m in welt().humans:
|
||||
if m.data["id"] == "lena":
|
||||
lena = m
|
||||
@@ -188,7 +248,7 @@ func test_tagesablauf() -> void:
|
||||
|
||||
schritte(30, 0.05, 2.0)
|
||||
p(lena.activity == "schlaeft", "Um 02:00 schläft Lena (%s)" % lena.activity)
|
||||
p(lena.global_position.distance_to(HumanDB.place_center("haus_lena")) < 4.0,
|
||||
p(lena.global_position.distance_to(Orte.center(HumanDB.PLACES, "haus_lena")) < 4.0,
|
||||
"Sie schläft in ihrem Atelier")
|
||||
|
||||
var gewandert := false
|
||||
@@ -199,9 +259,6 @@ func test_tagesablauf() -> void:
|
||||
break
|
||||
p(gewandert, "Um 08:00 geht Lena ins Café und kommt dort an")
|
||||
p(lena.activity == "essen", "Im Café isst sie (%s)" % lena.activity)
|
||||
p(lena.global_position.distance_to(HumanDB.place_center("cafe")) < 4.0,
|
||||
"Sie steht im Café (Abstand %.1f)" %
|
||||
lena.global_position.distance_to(HumanDB.place_center("cafe")))
|
||||
|
||||
var daheim := false
|
||||
for i in range(600):
|
||||
@@ -212,53 +269,57 @@ func test_tagesablauf() -> void:
|
||||
p(daheim, "Um 10:00 ist sie zurück im Atelier")
|
||||
p(lena.activity == "zoegert", "Dort zögert sie vor der Arbeit (%s)" % lena.activity)
|
||||
|
||||
# alle vier haben zu jeder Stunde einen definierten Ort
|
||||
var luecken := 0
|
||||
for m in welt().humans:
|
||||
for h in range(24):
|
||||
var r: Array = m._routine_at(float(h) + 0.5)
|
||||
if not HumanDB.PLACES.has(r[0]) or not HumanDB.ACTIVITY_TEXT.has(r[1]):
|
||||
if not HumanDB.PLACES.has(r[0]) or not Orte.ACTIVITY_TEXT.has(r[1]):
|
||||
luecken += 1
|
||||
p(luecken == 0, "Alle 4 Menschen haben rund um die Uhr Ort und Tätigkeit")
|
||||
|
||||
# ein voller Tag am Stück, mit echter Uhr: niemand bleibt hängen
|
||||
Game.time_h = 0.0
|
||||
var besuchte: Dictionary = {}
|
||||
Game.day = 1
|
||||
var besucht: Dictionary = {}
|
||||
for m in welt().humans:
|
||||
besuchte[m.data["id"]] = {}
|
||||
for i in range(7200):
|
||||
besucht[m.data["id"]] = {}
|
||||
for i in range(9000):
|
||||
schritte(1)
|
||||
for m in welt().humans:
|
||||
if m._path.is_empty():
|
||||
besuchte[m.data["id"]][m.place] = true
|
||||
if Game.time_h >= 23.5 and Game.day >= 1:
|
||||
besucht[m.data["id"]][m.place] = true
|
||||
if Game.time_h >= 23.5:
|
||||
break
|
||||
var alle_ok := true
|
||||
for m in welt().humans:
|
||||
var orte: int = besuchte[m.data["id"]].size()
|
||||
var soll: Dictionary = {}
|
||||
for e in m.data["routine"]:
|
||||
soll[e[1]] = true
|
||||
if orte < soll.size():
|
||||
var ist: int = besucht[m.data["id"]].size()
|
||||
if ist < soll.size():
|
||||
alle_ok = false
|
||||
p(false, "%s erreichte nur %d von %d Orten" % [m.data["name"], orte, soll.size()])
|
||||
p(false, "%s erreichte nur %d von %d Stationen" % [m.data["name"], ist, soll.size()])
|
||||
p(alle_ok, "Über einen ganzen Tag erreicht jeder Mensch jede Station seiner Routine")
|
||||
|
||||
|
||||
func test_wege_machbar() -> void:
|
||||
abschnitt("Wege passen in die Zeitfenster")
|
||||
_wege_pruefen("Erde", HumanDB.PLACES, HumanDB.LIST)
|
||||
_wege_pruefen("Traumwelt", DreamDB.PLACES, DreamDB.LIST)
|
||||
|
||||
|
||||
func _wege_pruefen(welt_name: String, places: Dictionary, liste: Array) -> void:
|
||||
var sek_pro_stunde := Game.DAY_SECONDS / 24.0
|
||||
var alles_ok := true
|
||||
var engste := 999.0
|
||||
var engste_text := ""
|
||||
for m in HumanDB.LIST:
|
||||
for m in liste:
|
||||
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 dauer := _weg_laenge(von, nach) / Human.GEHTEMPO
|
||||
var dauer := _weg_laenge(places, von, nach) / Bewohner.GEHTEMPO
|
||||
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]))
|
||||
var fenster := slot_h * sek_pro_stunde
|
||||
@@ -270,13 +331,13 @@ func test_wege_machbar() -> void:
|
||||
engste = fenster - dauer
|
||||
engste_text = ("%s: %s -> %s (%.0f s Weg, %.0f s Fenster)"
|
||||
% [m["name"], von, nach, dauer, fenster])
|
||||
p(alles_ok, "Jeder Weg passt in sein Zeitfenster — engster Fall: " + engste_text)
|
||||
p(alles_ok, "%s — jeder Weg passt, engster Fall: %s" % [welt_name, engste_text])
|
||||
|
||||
|
||||
func _weg_laenge(von: String, nach: String) -> float:
|
||||
var pts: Array = HumanDB.route(von, nach, Vector3.ZERO)
|
||||
func _weg_laenge(places: Dictionary, von: String, nach: String) -> float:
|
||||
var pts: Array = Orte.route(places, von, nach, Vector3.ZERO)
|
||||
var l := 0.0
|
||||
var pos := HumanDB.place_center(von)
|
||||
var pos := Orte.center(places, von)
|
||||
for pt in pts:
|
||||
l += pos.distance_to(pt)
|
||||
pos = pt
|
||||
@@ -293,11 +354,10 @@ func test_geist() -> void:
|
||||
main.player.velocity = Vector3(6, 0, 0)
|
||||
for i in range(30):
|
||||
await get_tree().physics_frame
|
||||
p(main.player.global_position.x > vor.x, "Der Geist bewegt sich frei durch den Raum")
|
||||
p(main.player.global_position.x > 0.5, "Der Geist bewegt sich frei durch den Raum")
|
||||
p(absf(main.player.global_position.y - 8.0) < 0.5, "Ohne Schwerkraft fällt er nicht")
|
||||
|
||||
# keiner der Menschen reagiert auf ihn
|
||||
var lena: Human = welt().humans[0]
|
||||
var lena: Bewohner = welt().humans[0]
|
||||
var davor: Vector3 = lena.global_position
|
||||
main.player.global_position = lena.global_position + Vector3(0, 1, 0.5)
|
||||
schritte(10)
|
||||
@@ -306,18 +366,18 @@ func test_geist() -> void:
|
||||
|
||||
func test_technik_anwenden() -> void:
|
||||
abschnitt("Techniken anwenden — Erfolgschance")
|
||||
var lena: Human = null
|
||||
var lena: Bewohner = null
|
||||
for m in welt().humans:
|
||||
if m.data["id"] == "lena":
|
||||
lena = m
|
||||
|
||||
Game.time_h = 9.5
|
||||
for i in range(900):
|
||||
schritte(1)
|
||||
schritte(1, 0.05, 10.2)
|
||||
if lena.place == "haus_lena" and lena._path.is_empty():
|
||||
break
|
||||
p(lena.activity == "zoegert", "Lena zögert gerade")
|
||||
|
||||
main.player.set_mode(Player.Mode.GEIST)
|
||||
main.player.global_position = lena.global_position + Vector3(0, 1.0, 1.5)
|
||||
main._process(0.05)
|
||||
p(main._fokus_mensch == lena, "Der Geist erfasst Lena in Reichweite")
|
||||
@@ -329,27 +389,23 @@ func test_technik_anwenden() -> void:
|
||||
var s1: float = Game.evaluate("pomodoro", "lena", "zoegert", false)["chance"]
|
||||
Game.known["pomodoro"] = 28
|
||||
var s5: float = Game.evaluate("pomodoro", "lena", "zoegert", false)["chance"]
|
||||
p(Game.skill_of("pomodoro") == 5, "Pomodoro auf Stufe 5 gebracht")
|
||||
p(s5 > s1, "Höherer Skill = höhere Erfolgschance (%.0f%% -> %.0f%%)" % [s1 * 100, s5 * 100])
|
||||
Game.known["pomodoro"] = 0
|
||||
|
||||
var passend: Dictionary = Game.evaluate("pomodoro", "lena", "zoegert", false)
|
||||
var unpassend: Dictionary = Game.evaluate("pomodoro", "lena", "essen", false)
|
||||
p(passend["moment"] and not unpassend["moment"], "Moment-Erkennung: zögert ja, isst nein")
|
||||
p(passend["chance"] > unpassend["chance"],
|
||||
"Passender Moment erhöht die Chance (%.0f%% > %.0f%%)" %
|
||||
[passend["chance"] * 100, unpassend["chance"] * 100])
|
||||
p(passend["tag"], "Pomodoro trifft Lenas Thema Prokrastination")
|
||||
p(passend["chance"] > unpassend["chance"], "Passender Moment erhöht die Chance")
|
||||
p(passend["tag"], "Pomodoro trifft Lenas Thema Aufschieben")
|
||||
var falsches_thema: Dictionary = Game.evaluate("pomodoro", "mira", "zoegert", false)
|
||||
p(not falsches_thema["tag"], "Bei Mira trifft Pomodoro das Thema nicht")
|
||||
p(passend["chance"] > falsches_thema["chance"], "Passendes Thema erhöht die Chance")
|
||||
|
||||
var blockiert: Dictionary = Game.evaluate("pomodoro", "lena", "schlaeft", false)
|
||||
p(blockiert["blocked"], "Schlafende Menschen sind nicht erreichbar")
|
||||
var wehrt: Dictionary = Game.evaluate("pomodoro", "lena", "zoegert", true)
|
||||
p(wehrt["chance"] < passend["chance"], "Wer abblockt, ist schwerer zu erreichen")
|
||||
var ungelernt: Dictionary = Game.evaluate("nein_sagen", "lena", "zoegert", false)
|
||||
p(ungelernt["blocked"], "Ungelernte Techniken lassen sich nicht anwenden")
|
||||
p(Game.evaluate("pomodoro", "lena", "schlaeft", false)["blocked"],
|
||||
"Schlafende Menschen sind nicht erreichbar")
|
||||
p(Game.evaluate("pomodoro", "lena", "zoegert", true)["chance"] < passend["chance"],
|
||||
"Wer abblockt, ist schwerer zu erreichen")
|
||||
p(Game.evaluate("nein_sagen", "lena", "zoegert", false)["blocked"],
|
||||
"Ungelernte Techniken lassen sich nicht anwenden")
|
||||
|
||||
var vorher_p: float = Game.mission_progress("lena")
|
||||
var res := Game.apply_technique("pomodoro", "lena", "zoegert", false)
|
||||
@@ -360,7 +416,6 @@ func test_technik_anwenden() -> void:
|
||||
p(Game.mission_progress("lena") == vorher_p, "Misserfolg bringt keinen Fortschritt")
|
||||
p(Game.known["pomodoro"] > 0, "Jede Anwendung bringt Erfahrung")
|
||||
|
||||
# Wiederholung derselben Technik wirkt schwächer
|
||||
Game.progress["lena"] = 0.0
|
||||
Game.used.clear()
|
||||
Game.known["pomodoro"] = 28
|
||||
@@ -390,34 +445,69 @@ func test_mission_abschliessen() -> void:
|
||||
p(Game.active_mission == "", "Aktive Mission wurde freigegeben")
|
||||
p(Game.einsicht == einsicht_vorher + 3, "Abschluss bringt 3 Einsicht")
|
||||
schritte(3)
|
||||
var lena: Human = welt().humans[0]
|
||||
var lena: Bewohner = welt().humans[0]
|
||||
p(lena.beschriftung().contains("erfüllt"), "Lena zeigt sichtbar den erfüllten Traum")
|
||||
|
||||
|
||||
func test_ui_panels() -> void:
|
||||
abschnitt("Oberfläche")
|
||||
ui().kodex_panel()
|
||||
p(ui().offen and ui()._content.get_child_count() > 0, "Kodex zeigt gelernte Techniken")
|
||||
func test_techniken_verbessern_sich() -> void:
|
||||
abschnitt("Techniken verbessern sich durch Anwendung")
|
||||
Game.einsicht = 2
|
||||
p(Game.learn("reframing"), "Technik im Journal gelernt")
|
||||
p(Game.skill_of("reframing") == 1, "Start auf Stufe 1")
|
||||
var einsicht_vorher := Game.einsicht
|
||||
var anwendungen := 0
|
||||
while Game.skill_of("reframing") < 3 and anwendungen < 60:
|
||||
Game.apply_technique("reframing", "mira", "gruebelt", false)
|
||||
anwendungen += 1
|
||||
p(Game.skill_of("reframing") >= 3,
|
||||
"Nach %d Anwendungen von allein auf Stufe %d" % [anwendungen, Game.skill_of("reframing")])
|
||||
p(Game.einsicht == einsicht_vorher, "Das kostet keine Einsicht")
|
||||
|
||||
var vor_xp: int = Game.known["reframing"]
|
||||
var res := Game.apply_technique("reframing", "mira", "essen", false)
|
||||
p(Game.known["reframing"] > vor_xp,
|
||||
"Auch ein %s bringt Erfahrung" % ("Erfolg" if res["success"] else "Fehlversuch"))
|
||||
|
||||
var xp_vor: int = Game.known["reframing"]
|
||||
p(Game.deepen("reframing"), "Vertiefen im Journal funktioniert")
|
||||
p(Game.known["reframing"] == xp_vor + 3, "Vertiefen bringt 3 EP")
|
||||
p(Game.einsicht == einsicht_vorher - 1, "Vertiefen kostet 1 Einsicht")
|
||||
|
||||
|
||||
func test_journal_ueberall() -> void:
|
||||
abschnitt("Journal ist immer dabei")
|
||||
p(InputMap.has_action("journal"), "Eigene Aktion für das Journal")
|
||||
var tasten: Array = []
|
||||
for ev in InputMap.action_get_events("journal"):
|
||||
tasten.append(ev.physical_keycode)
|
||||
p(tasten.has(KEY_J) and tasten.has(KEY_TAB), "Auf J und Tab gelegt")
|
||||
|
||||
p(main.auf_erde, "Test läuft auf der Erde")
|
||||
ui().journal_panel()
|
||||
p(ui().offen, "Journal öffnet auf der Erde")
|
||||
ui().schliessen()
|
||||
ui().vertiefen_panel()
|
||||
p(ui()._content.get_child_count() > 0, "Meditationskammer listet Techniken")
|
||||
|
||||
main._traumwelt()
|
||||
await get_tree().process_frame
|
||||
ui().journal_panel()
|
||||
p(ui().offen, "Journal öffnet auch in der Traumwelt")
|
||||
ui().schliessen()
|
||||
var e_vor := Game.einsicht
|
||||
p(Game.deepen("pomodoro"), "Vertiefen funktioniert")
|
||||
p(Game.einsicht == e_vor - 1, "Vertiefen kostet 1 Einsicht")
|
||||
ui().mission_panel("bruno")
|
||||
p(ui()._content.get_child_count() > 0, "Missions-Panel für Bruno baut auf")
|
||||
ui().schliessen()
|
||||
ui().anwenden_panel(welt().humans[1])
|
||||
p(ui()._content.get_child_count() > 0, "Anwenden-Panel für Bruno baut auf")
|
||||
ui().schliessen()
|
||||
p(main._fokus == null or true, "HUD bleibt fehlerfrei")
|
||||
|
||||
# Traumwesen sind keine Missionsziele
|
||||
var wesen: Bewohner = welt().bewohner[0]
|
||||
main.player.set_mode(Player.Mode.TRAUM)
|
||||
main.player.global_position = wesen.global_position + Vector3(0, 1.0, 1.2)
|
||||
main._process(0.05)
|
||||
p(main._fokus_mensch == null, "Traumwesen lassen sich nicht mit Techniken bearbeiten")
|
||||
p(not wesen.mit_mission, "Sie tragen keine Missionsmarkierung")
|
||||
p(wesen.beschriftung().contains(str(wesen.data["rolle"])),
|
||||
"Ihre Beschriftung nennt Name und Rolle: %s" % wesen.beschriftung().replace("\n", " / "))
|
||||
|
||||
|
||||
func test_steuerung() -> void:
|
||||
abschnitt("Steuerung")
|
||||
var aktionen := ["vor", "zurueck", "links", "rechts", "steigen", "sinken",
|
||||
"interagieren", "kodex"]
|
||||
"interagieren", "journal"]
|
||||
var alle := true
|
||||
for a in aktionen:
|
||||
if not InputMap.has_action(a) or InputMap.action_get_events(a).is_empty():
|
||||
@@ -425,7 +515,7 @@ func test_steuerung() -> void:
|
||||
p(false, "Aktion '%s' ist belegt" % a)
|
||||
p(alle, "Alle acht Steuerungsaktionen sind mit Tasten belegt")
|
||||
|
||||
main.ui.schliessen()
|
||||
ui().schliessen()
|
||||
main.player.look_enabled = true
|
||||
main.player.set_mode(Player.Mode.GEIST)
|
||||
main.player.global_position = Vector3(0, 8.0, 0)
|
||||
|
||||
Reference in New Issue
Block a user