scopedvr-map-editor/tests/test_spawn_yaw.gd
2026-11-01 19:34:05 +01:00

59 lines
2.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends SceneTree
## Blickrichtung an Spawn-Punkten und Conquest-Zonen (optionales Feld yaw_deg).
## Ausführen: godot --headless --path . --script res://tests/test_spawn_yaw.gd
var failures := 0
func _check(cond: bool, label: String) -> void:
if not cond:
failures += 1
print("FAIL: ", label)
func _fwd(deg: float) -> Vector2:
var r := deg_to_rad(deg)
return Vector2(-sin(r), -cos(r))
func _init() -> void:
SpawnOps.edit_set = ModusKatalog.SPAWN_SET_BASE
var doc := SvmapDocument.create_new("Blick", 512.0, "mittag")
var p := SpawnOps.add_zone(doc, 0, -50.0, 0.0)
var pid := str(p["id"])
_check(not SpawnOps.has_yaw(p), "neuer Punkt ohne Feld (alte Karten bleiben gleich)")
# Standard: zur Kartenmitte (0,0) — von -50 aus also nach +X.
_check(_fwd(SpawnOps.effective_yaw(doc, p)).distance_to(Vector2(1, 0)) < 0.01, "Standard zeigt zur Mitte")
_check(SpawnOps.set_point_yaw(doc, 0, pid, 450.0), "setzen")
_check(is_equal_approx(float(p["yaw_deg"]), 90.0), "normalisiert auf 0–360")
SpawnOps.set_point_yaw(doc, 0, pid, null)
_check(not p.has("yaw_deg"), "null räumt das Feld weg")
_check(not SpawnOps.set_point_yaw(doc, 0, "gibtsnicht", 1.0), "unbekannte ID")
# Spiegeln: die Blickrichtung muss wirklich gespiegelt sein.
for yaw in [0.0, 30.0, 135.0, 290.0]:
var f := _fwd(yaw)
_check(_fwd(SymmetryCore.mirror_facing(SymmetryCore.Mode.AXIS_X, yaw)).distance_to(Vector2(-f.x, f.y)) < 0.01, "Achse X %d" % int(yaw))
_check(_fwd(SymmetryCore.mirror_facing(SymmetryCore.Mode.AXIS_Z, yaw)).distance_to(Vector2(f.x, -f.y)) < 0.01, "Achse Z %d" % int(yaw))
_check(_fwd(SymmetryCore.mirror_facing(SymmetryCore.Mode.POINT, yaw)).distance_to(-f) < 0.01, "Punkt %d" % int(yaw))
# Zwilling erbt und folgt.
var doc2 := SvmapDocument.create_new("Blick2", 512.0, "mittag")
var a := SpawnOps.add_zone(doc2, 0, -40.0, 10.0)
SpawnOps.write_yaw(a, 30.0)
var tool_script := load("res://core/editor/spawn_tool.gd")
tool_script.spawn_mirror_add(doc2, 0, str(a["id"]), SymmetryCore.Mode.POINT)
var twin_id: String = tool_script.spawn_mirror_partner(doc2, str(a["id"]))
var twin: Dictionary = tool_script._spawn_point_of(doc2, 1, twin_id)
_check(is_equal_approx(float(twin.get("yaw_deg", -1.0)), 210.0), "Zwilling schaut gespiegelt")
tool_script.spawn_mirror_yaw(doc2, str(a["id"]), null, SymmetryCore.Mode.POINT)
_check(not twin.has("yaw_deg"), "Standard gilt auch für den Zwilling")
# Prüfung: Unsinn wird abgelehnt, das Feld selbst nicht.
var bounds: Dictionary = doc["bounds"]
var zone := {"id": "Z1", "pos": [0.0, 0.0, 0.0], "radius_m": 12.0, "yaw_deg": 45.0}
_check(ModusKatalog._validate_zone_list([zone], "V22", "Zone", bounds).is_empty(), "Zone mit yaw_deg gültig")
zone["yaw_deg"] = "Norden"
_check(not ModusKatalog._validate_zone_list([zone], "V22", "Zone", bounds).is_empty(), "Zone mit Text-yaw abgelehnt")
print("ALL OK" if failures == 0 else "FAILED: %d" % failures)
quit(0 if failures == 0 else 1)