P23-03: 生活の観察

This commit is contained in:
Agent Control Runner
2026-10-16 19:18:11 +09:00
parent 26f60095bf
commit 059c2f743b
6 changed files with 285 additions and 4 deletions
+26
View File
@@ -100,6 +100,31 @@ func repair28_geometry() -> void:
func _initialize() -> void:
call_deferred("run")
func repair36_labels() -> void:
var view := WorldPreview.new()
var members: Array[String] = ["guest/a", "guest/b", "guest/c"]
var identities: Array[Dictionary] = []
for key: String in members:
identities.append({&"key": key, &"id": key.trim_prefix("guest/"), &"state": 0, &"cell": Vector3i.ZERO, &"mode": &"idle"})
var queue := {&"at": Vector2(40,40), &"text": "待ち3人(他3人)", &"cell": Vector3i.ZERO, &"members": members.duplicate(), &"visible_count": 0, &"overflow": members.size()}
var aggregate := {&"at": queue[&"at"], &"text": "+3", &"members": identities.duplicate(true), &"drawn_keys": []}
var model := {&"cabins": [], &"badges": [], &"landing_badges": [queue], &"actor_aggregations": [aggregate]}
var blocked := Rect2(100,100,20,20)
model[&"cabins"] = [{&"rect": blocked, &"badge_at": Vector2(200,200), &"badge": "EV", &"badge_rect": view._readable_badge_rect(Vector2(200,200), "EV")}]
model[&"shaft_footprint"] = []
var region: Dictionary = view._life_landing_region({&"bounds": blocked, &"transit": false}, Vector3i.ZERO, model)
expect(region.get(&"no_lane", false) and region[&"badge_at"] == queue[&"at"], "lane-less stranded actor uses hidden queue anchor")
view._resolve_observation_labels(model)
expect(not view._readable_badge_rect(queue[&"at"], queue[&"text"]).intersection(view._readable_badge_rect(aggregate[&"at"], aggregate[&"text"])).has_area(), "hidden queue and stranded aggregate labels do not overlap")
expect(queue[&"text"] == "待ち3人(他3人)" and aggregate[&"text"] == "+3", "complete counts remain readable")
expect(queue[&"members"] == members and aggregate[&"members"] == identities and aggregate[&"drawn_keys"].is_empty(), "label placement preserves member identities and visibility")
expect(queue[&"at"] == queue[&"anchor"] and aggregate[&"anchor"] == queue[&"anchor"], "uncontested queue keeps anchor and stranded anchor remains recorded")
var solitary := {&"at": Vector2(400,400), &"text": "+1"}
model[&"actor_aggregations"] = [solitary]
view._resolve_observation_labels(model)
expect(solitary[&"at"] == solitary[&"anchor"] and solitary[&"displaced_by"].is_empty(), "uncontested label stays at anchor")
view.free()
func expect(value: bool, message: String) -> void:
checks += 1
if not value:
@@ -118,6 +143,7 @@ func run() -> void:
var clock: Variant = root.get_node("GameClock")
clock.set_paused(true)
repair28_geometry()
repair36_labels()
# Isolated real typed components test state labels, without claiming gameplay.
var labels: Dictionary = {}
for state: int in FacilityInstance.State.values():