From ac763fef97116b7356a1e059b47fee5b63e1b30c Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 5 Mar 2026 08:41:09 +0100 Subject: [PATCH] feat(engine): live server visual tests and gauntlet snapshot replay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add live server lifecycle to tests/run-visual (start/stop server per scenario, parse LISTENING:{port}). Add MessagePack snapshot replay to visual_capture.gd via Protocol.decode_snapshot() — exercises the full client pipeline from wire bytes to rendered fog. Three replay scenarios (hub_spawn, fog_theater, hub_after_movement) plus one live scenario (fog_live_hub). Add gen_gauntlet_fixtures.rs to produce .msgpack fixtures from the Gauntlet test world. Add max_diff_pct threshold to visual-diff. Makefile: add fixtures-gauntlet target, fix build-client double-import, preserve .godot cache in clean. Co-Authored-By: Claude Opus 4.6 --- Makefile | 10 +- client/tests/visual_capture.gd | 78 + client/tests/visual_capture.gd.uid | 1 + client/tests/visual_scenarios.gd | 11 + client/tests/visual_scenarios.gd.uid | 1 + server/tests/gen_gauntlet_fixtures.rs | 185 + tests/fixtures/gauntlet-t164-snapshot.json | 2895 ++++++++++++++++ tests/fixtures/gauntlet/fog_theater.json | 3029 +++++++++++++++++ tests/fixtures/gauntlet/fog_theater.msgpack | Bin 0 -> 20343 bytes .../fixtures/gauntlet/hub_after_movement.json | 1079 ++++++ .../gauntlet/hub_after_movement.msgpack | Bin 0 -> 7116 bytes tests/fixtures/gauntlet/hub_spawn.json | 1607 +++++++++ tests/fixtures/gauntlet/hub_spawn.msgpack | Bin 0 -> 10674 bytes tests/run-visual | 95 + tests/visual.json | 21 + tooling/visual-diff | 31 +- 16 files changed, 9034 insertions(+), 9 deletions(-) create mode 100644 client/tests/visual_capture.gd.uid create mode 100644 client/tests/visual_scenarios.gd.uid create mode 100644 server/tests/gen_gauntlet_fixtures.rs create mode 100644 tests/fixtures/gauntlet-t164-snapshot.json create mode 100644 tests/fixtures/gauntlet/fog_theater.json create mode 100644 tests/fixtures/gauntlet/fog_theater.msgpack create mode 100644 tests/fixtures/gauntlet/hub_after_movement.json create mode 100644 tests/fixtures/gauntlet/hub_after_movement.msgpack create mode 100644 tests/fixtures/gauntlet/hub_spawn.json create mode 100644 tests/fixtures/gauntlet/hub_spawn.msgpack diff --git a/Makefile b/Makefile index e8080ffe9..99471422b 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ GODOT := $(shell command -v godot4 2>/dev/null || command -v godot 2>/dev/null) db-backup db-install validate-content content-ron check-fact-ids setup-hooks \ pre-pr pre-pr-lint pre-pr-build pre-pr-test pre-pr-validate pre-pr-fixtures \ pre-pr-server pre-pr-client pre-pr-content \ - fixtures-client golden-diff golden-update \ + fixtures-client fixtures-gauntlet golden-diff golden-update \ checklist-validate checklist-generate \ perf-baseline debug-schedule \ test-ipc-fixtures test-ipc-protocol test-ipc-integration test-ipc-benchmark \ @@ -110,6 +110,9 @@ build-server: build-client: @test -n "$(GODOT)" || { echo "Godot not found. Run 'make setup' first."; exit 1; } + @# First import may error on theme/font loading before the import scan completes. + @# Run twice: first pass generates imports silently, second pass validates clean. + @$(GODOT) --headless --path client --import --quit 2>/dev/null || true $(GODOT) --headless --path client --import --quit # --- Run --- @@ -144,6 +147,9 @@ test-server: fixtures: cd server && cargo test --test gen_fixtures -- --ignored +fixtures-gauntlet: + cd server && cargo test --test gen_gauntlet_fixtures -- --ignored + fixtures-client: @test -n "$(GODOT)" || { echo "Godot not found. Run 'make setup' first."; exit 1; } @echo "Generating GDScript fixtures for Rust decoder..." @@ -347,5 +353,5 @@ content-ron: clean: cd server && cargo clean || true rm -rf .cache/* - rm -rf client/.godot/* client/reports + rm -rf client/reports @echo "Clean complete." diff --git a/client/tests/visual_capture.gd b/client/tests/visual_capture.gd index 8e9f4550e..60c4bf6aa 100644 --- a/client/tests/visual_capture.gd +++ b/client/tests/visual_capture.gd @@ -24,6 +24,7 @@ var _flow: String = "" var _interval: float = 3.0 var _list_mode: bool = false var _config: Dictionary = {} +var _is_live: bool = false func _init(): @@ -73,6 +74,19 @@ func _run(): return var main_node = main_scene.instantiate() + + # Live mode: configure server port BEFORE main.gd._ready() calls connect_to_sim() + _is_live = OS.get_environment("SR_LIVE") == "1" + if _is_live: + var sim_bridge := root.get_node("/root/SimBridge") + var port_env := OS.get_environment("SR_PORT") + if port_env.is_empty(): + push_error("visual_capture: SR_LIVE=1 but SR_PORT not set") + quit(1) + return + sim_bridge.server_port = int(port_env) + print("visual_capture: live mode — server port %d" % sim_bridge.server_port) + root.add_child(main_node) # Wait for NoiseTexture2D async generation @@ -92,6 +106,36 @@ func _run(): for i in range(settle_count): await process_frame + # Live mode: wait for server connection and first snapshot + if _is_live: + var sim_bridge := root.get_node("/root/SimBridge") + var game_state := root.get_node("/root/GameState") + print("visual_capture: waiting for server connection...") + var max_frames := 300 # 5 seconds at 60fps + var waited := 0 + while sim_bridge.state != sim_bridge.ConnectionState.CONNECTED: + if sim_bridge.state == sim_bridge.ConnectionState.ERROR: + push_error("visual_capture: server connection failed") + quit(1) + return + await process_frame + waited += 1 + if waited >= max_frames: + push_error("visual_capture: connection timeout after %d frames" % waited) + quit(1) + return + print("visual_capture: connected after %d frames" % waited) + # Wait for first snapshot from server + waited = 0 + while game_state.current_tick == 0: + await process_frame + waited += 1 + if waited >= max_frames: + push_error("visual_capture: no snapshot after %d frames" % waited) + quit(1) + return + print("visual_capture: first snapshot tick=%d (%d frames)" % [game_state.current_tick, waited]) + if not _scenario.is_empty(): await _run_scenario(main_node) elif not _flow.is_empty(): @@ -123,6 +167,40 @@ func _run_scenario(_main_node: Node) -> void: # Post-tick setup (e.g. zone tint patching) _scenarios.post_setup(_scenario, root) + # Replay snapshot: inject a real server snapshot through the FULL client pipeline. + # Loads MessagePack bytes (exact wire format from server), decodes via Protocol.gd, + # then applies through GameState → FogState → shader — same path as live game. + var replay_path: String = scenario_cfg.get("replay_snapshot", "") + if not replay_path.is_empty(): + var project_root := ProjectSettings.globalize_path("res://") + var repo_root := project_root.rstrip("/").get_base_dir() + var abs_path := repo_root.path_join(replay_path) + var rf := FileAccess.open(abs_path, FileAccess.READ) + if rf == null: + push_error("visual_capture: cannot open replay snapshot %s" % abs_path) + quit(1) + return + var replay_bytes := rf.get_buffer(rf.get_length()) + rf.close() + # Decode through Protocol.decode_snapshot() — same as live IPC receive path. + # This exercises: msgpack decode → entity decode → tile_kind→type mapping → etc. + var replay_data: Variant = Protocol.decode_snapshot(replay_bytes) + if replay_data == null or not replay_data is Dictionary: + push_error("visual_capture: Protocol.decode_snapshot failed for %s" % abs_path) + quit(1) + return + print("visual_capture: replaying %s (%d bytes, tick=%s, %d tiles)" % [ + replay_path, replay_bytes.size(), + str(replay_data.get("tick", "?")), + replay_data.get("visible_tiles", []).size()]) + var game_state := root.get_node("/root/GameState") + var fog_state := root.get_node("/root/FogState") + game_state.apply_snapshot(replay_data) + fog_state.update_from_state() + # Extra frames for fog uniform propagation + for i in range(4): + await process_frame + # Extra frames for state propagation + viewport texture lag await process_frame await process_frame diff --git a/client/tests/visual_capture.gd.uid b/client/tests/visual_capture.gd.uid new file mode 100644 index 000000000..1719ae961 --- /dev/null +++ b/client/tests/visual_capture.gd.uid @@ -0,0 +1 @@ +uid://pd1qpgxiodig diff --git a/client/tests/visual_scenarios.gd b/client/tests/visual_scenarios.gd index 0732fe0f4..3ba3d001b 100644 --- a/client/tests/visual_scenarios.gd +++ b/client/tests/visual_scenarios.gd @@ -83,6 +83,17 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: sim_bridge.harness.player_pos = Vector2i(11, 9) sim_bridge.harness.process_input("Interact") + "fog_live_replay", "fog_theater_replay", "fog_boundary_replay": + # Replay real server snapshots via MessagePack → Protocol.decode_snapshot(). + # Setup handled by visual_capture.gd (reads replay_snapshot from config). + pass + + "fog_live_hub": + # Live server connection — Hub spawn position. + # No setup needed: server starts in --test-mode with Gauntlet, + # player spawns at Hub (50,58). Captures real fog pipeline output. + pass + _: push_warning("VisualScenarios: unknown scenario '%s'" % scenario_name) return false diff --git a/client/tests/visual_scenarios.gd.uid b/client/tests/visual_scenarios.gd.uid new file mode 100644 index 000000000..ec6c64605 --- /dev/null +++ b/client/tests/visual_scenarios.gd.uid @@ -0,0 +1 @@ +uid://dna10a0ln5pd0 diff --git a/server/tests/gen_gauntlet_fixtures.rs b/server/tests/gen_gauntlet_fixtures.rs new file mode 100644 index 000000000..9daf1abe5 --- /dev/null +++ b/server/tests/gen_gauntlet_fixtures.rs @@ -0,0 +1,185 @@ +//! Generate snapshot fixtures from the Gauntlet test world (D-030 full pipeline). +//! +//! Runs the full Gauntlet simulation pipeline — same code path as --test-mode — +//! then serializes ObserverSnapshots to both MessagePack (wire format) and JSON +//! (human-readable debug) for client-side visual testing. +//! +//! The .msgpack files are the actual wire-format bytes the server sends over IPC. +//! Client visual tests load them via Protocol.decode_snapshot() → GameState.apply_snapshot(), +//! exercising the exact same pipeline as the live game. +//! +//! The .json files are for human inspection only. +//! +//! Run with: cargo test --test gen_gauntlet_fixtures -- --ignored +//! Or: make fixtures-gauntlet +//! +//! Output: tests/fixtures/gauntlet/*.{msgpack,json} (relative to repo root) + +use settled_reach_server::bridge::types::*; +use settled_reach_server::bridge::{BridgePlugin, SnapshotBuffer}; +use settled_reach_server::knowledge::KnowledgePlugin; +use settled_reach_server::npc::NpcPlugin; +use settled_reach_server::perception::vision_cone::Facing; +use settled_reach_server::simulation::movement::{PlayerCharacter, TilePosition}; +use settled_reach_server::simulation::rng::SimRng; +use settled_reach_server::simulation::SimulationPlugin; +use settled_reach_server::test_world; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use serde_json::Value; +use std::collections::BTreeMap; +use std::fs; +use std::path::Path; + +const SEED: u64 = 42; +const FIXTURE_DIR: &str = "../tests/fixtures/gauntlet"; + +/// Build a deterministic Gauntlet simulation app. +/// Identical to what the server runs in --test-mode. +fn build_gauntlet(seed: u64) -> App { + let mut app = App::new(); + app.add_plugins(SimulationPlugin); + app.add_plugins(BridgePlugin); + app.add_plugins(KnowledgePlugin); + app.add_plugins(NpcPlugin); + app.insert_resource(SimRng::new(seed)); + + test_world::setup_gauntlet(&mut app); + + app +} + +/// Teleport the player to a specific position and facing. +/// Directly modifies ECS components — same effect as PlayerAction::Teleport +/// but without needing a target room action. +fn teleport_player(app: &mut App, pos: TilePosition, facing: Facing) { + let player = { + let mut query = app + .world_mut() + .query_filtered::>(); + query.single(app.world()).expect("player entity must exist") + }; + app.world_mut() + .entity_mut(player) + .insert((pos, facing)); +} + +/// Run N ticks, feeding inputs each tick, return the last snapshot. +fn run_ticks(app: &mut App, inputs: &[Vec]) -> ObserverSnapshot { + let mut last_snapshot: Option = None; + + for tick_inputs in inputs { + { + let mut queue = app + .world_mut() + .resource_mut::(); + for input in tick_inputs { + queue.push(input.clone()); + } + } + + app.update(); + + let buffer = app.world().resource::(); + if let Some(snapshot) = &buffer.snapshot { + last_snapshot = Some(snapshot.clone()); + } + } + + last_snapshot.expect("no snapshot produced") +} + +/// Recursively sort all object keys for deterministic JSON output. +fn sort_json_keys(value: &Value) -> Value { + match value { + Value::Object(map) => { + let sorted: BTreeMap = map + .iter() + .map(|(k, v)| (k.clone(), sort_json_keys(v))) + .collect(); + Value::Object(sorted.into_iter().collect()) + } + Value::Array(arr) => Value::Array(arr.iter().map(sort_json_keys).collect()), + other => other.clone(), + } +} + +fn write_fixture(name: &str, snapshot: &ObserverSnapshot) { + let dir = Path::new(env!("CARGO_MANIFEST_DIR")).join(FIXTURE_DIR); + fs::create_dir_all(&dir).expect("create fixture dir"); + + // MessagePack — exact wire-format bytes the server sends over IPC. + // Client visual tests load these via Protocol.decode_snapshot(). + let msgpack = rmp_serde::to_vec_named(snapshot).expect("serialize to MessagePack"); + let msgpack_path = dir.join(format!("{}.msgpack", name)); + fs::write(&msgpack_path, &msgpack).expect("write msgpack fixture"); + + // JSON — human-readable debug companion (not loaded by tests). + let value: Value = serde_json::to_value(snapshot).expect("serialize to JSON"); + let sorted = sort_json_keys(&value); + let json = serde_json::to_string_pretty(&sorted).expect("format JSON") + "\n"; + let json_path = dir.join(format!("{}.json", name)); + fs::write(&json_path, &json).expect("write json fixture"); + + eprintln!( + "Wrote {} ({} bytes msgpack, {} bytes json, {} visible_tiles, {} entities)", + name, + msgpack.len(), + json.len(), + snapshot.visible_tiles.len(), + snapshot.entities.len(), + ); +} + +#[test] +#[ignore] // Run manually: cargo test --test gen_gauntlet_fixtures -- --ignored +fn generate_gauntlet_snapshot_fixtures() { + // --- Hub (default spawn position) --- + // Player at (50, 58) facing North — tests fog rendering at the starting location. + // This is the exact state a new player sees on connect. + { + let mut app = build_gauntlet(SEED); + // Run 3 idle ticks to stabilize (cognitive delay, vision cone init) + let inputs: Vec> = vec![vec![], vec![], vec![]]; + let snapshot = run_ticks(&mut app, &inputs); + write_fixture("hub_spawn", &snapshot); + } + + // --- Fog Theater (observer position) --- + // Player at (56, 18) facing South — large open room with NPCs at varying distances. + // Tests visibility cone, fog layers, and distance-based fog rendering. + { + let mut app = build_gauntlet(SEED); + let fog_theater = test_world::constants::FOG_THEATER; + teleport_player(&mut app, fog_theater.observer, fog_theater.observer_facing); + let inputs: Vec> = vec![vec![], vec![], vec![]]; + let snapshot = run_ticks(&mut app, &inputs); + write_fixture("fog_theater", &snapshot); + } + + // --- Hub after movement (explored tiles + visible tiles differ) --- + // Player moves south from hub, creating a mix of explored-but-not-visible + // and currently-visible tiles — the exact fog boundary condition. + { + let mut app = build_gauntlet(SEED); + let inputs: Vec> = vec![ + vec![], + vec![PlayerInput { + tick: 1, + action: PlayerAction::MoveSouth, + }], + vec![PlayerInput { + tick: 2, + action: PlayerAction::MoveSouth, + }], + vec![PlayerInput { + tick: 3, + action: PlayerAction::MoveSouth, + }], + vec![], // idle — snapshot has explored + visible tiles that differ + ]; + let snapshot = run_ticks(&mut app, &inputs); + write_fixture("hub_after_movement", &snapshot); + } +} diff --git a/tests/fixtures/gauntlet-t164-snapshot.json b/tests/fixtures/gauntlet-t164-snapshot.json new file mode 100644 index 000000000..57a97cad8 --- /dev/null +++ b/tests/fixtures/gauntlet-t164-snapshot.json @@ -0,0 +1,2895 @@ +{ + "conversation_ended": [], + "conversation_events": [], + "current_dialogue": null, + "current_monologue": null, + "decode_errors": 0, + "dialogue_response": null, + "entities": [ + { + "entity_id": 0, + "kind": { + "data": null, + "variant": "Player" + }, + "observation": "Visible", + "relationship": "Known", + "visibility": "Forward", + "x": 16.5, + "y": 16.5, + "z": 0 + }, + { + "entity_id": 3, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 18.5, + "y": 14.5, + "z": 0 + }, + { + "entity_id": 4, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 5, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 6, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 7, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 8, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 9, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 10, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 11, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 12, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 13, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 14, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 15, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 16, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 17, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 18, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 19, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 20, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 21, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 22, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 23, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 24, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 25, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + }, + { + "entity_id": 26, + "kind": { + "data": null, + "variant": "Npc" + }, + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 0.5, + "y": 0.5, + "z": 0 + } + ], + "examine_result": null, + "game_time": { + "day": 0, + "day_phase": "Morning", + "tick_rate": "Paused", + "time_of_day": 16 + }, + "nearby_interactions": [ + { + "distance": 3, + "entity_id": 1, + "entity_type": "Npc", + "verbs": [ + { + "available": true, + "kind": "ExamineNpc", + "label": "Examine NPC", + "priority": 1 + } + ] + }, + { + "distance": 4, + "entity_id": 2, + "entity_type": "Npc", + "verbs": [ + { + "available": true, + "kind": "ExamineNpc", + "label": "Examine NPC", + "priority": 1 + } + ] + }, + { + "distance": 4, + "entity_id": 3, + "entity_type": "Npc", + "verbs": [ + { + "available": true, + "kind": "ExamineNpc", + "label": "Examine NPC", + "priority": 1 + } + ] + } + ], + "pending_recognitions": [], + "player_facing": "North", + "player_inventory": [], + "player_knowledge": null, + "player_stance": "Walk", + "poi_list": [], + "save_result": null, + "stationary_ticks": null, + "tick": 164, + "version": 17, + "visible_tiles": [ + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": -1, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": 0, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": 1, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": 2, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": 3, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": 4, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": 5, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": -1, + "y": 6, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 0, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 0, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 0, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 0, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 0, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 0, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 0, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 0, + "y": 6, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 1, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 1, + "y": 7, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 2, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 2, + "y": 7, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 3, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 3, + "y": 8, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 4, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 4, + "y": 9, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 5, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 5, + "y": 9, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 6, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 6, + "y": 10, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 7, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 7, + "y": 10, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 8, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 8, + "y": 11, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 9, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 9, + "y": 11, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 10, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 10, + "y": 12, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 11, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 11, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 12, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 13, + "y": 14, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 14, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 14, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 14, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 14, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 14, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 14, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 14, + "y": 14, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 15, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 15, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 15, + "y": 14, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 15, + "y": 15, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 16, + "y": 14, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 16, + "y": 15, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 16, + "y": 16, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 17, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 17, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 17, + "y": 14, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 17, + "y": 15, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 18, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 18, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 18, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 18, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 18, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 18, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 18, + "y": 14, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 13, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 19, + "y": 14, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 20, + "y": 13, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 21, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 12, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 21, + "y": 13, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 22, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 11, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 22, + "y": 12, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 23, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 23, + "y": 11, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 24, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 10, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 24, + "y": 11, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 25, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 25, + "y": 10, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 26, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 9, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 26, + "y": 10, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 27, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 27, + "y": 9, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 28, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 8, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 28, + "y": 9, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 29, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 7, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 29, + "y": 8, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 30, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 30, + "y": 7, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 31, + "y": -1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 0, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 1, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 2, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 3, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 4, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 5, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 6, + "z": 0 + }, + { + "type": "floor", + "visibility": "Forward", + "x": 31, + "y": 7, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": -1, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": 0, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": 1, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": 2, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": 3, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": 4, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": 5, + "z": 0 + }, + { + "type": "wall", + "visibility": "Forward", + "x": 32, + "y": 6, + "z": 0 + } + ], + "zone_id": null +} \ No newline at end of file diff --git a/tests/fixtures/gauntlet/fog_theater.json b/tests/fixtures/gauntlet/fog_theater.json new file mode 100644 index 000000000..89e2209bb --- /dev/null +++ b/tests/fixtures/gauntlet/fog_theater.json @@ -0,0 +1,3029 @@ +{ + "blocked_entities": [ + 1, + 2, + 3, + 4, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76 + ], + "character_pressure": { + "exposure": 0, + "institutional": 0, + "mood": null, + "relationship": 0, + "total": 0 + }, + "conversation_ended": [], + "conversation_events": [], + "current_monologue": { + "duration_seconds": 5.0, + "id": "recognition_02", + "text": "Those footsteps... I've heard that pattern before." + }, + "dialogue_response": null, + "entities": [ + { + "entity_id": 0, + "kind": "Player", + "observation": "Visible", + "relationship": "Known", + "visibility": "Forward", + "x": 56.5, + "y": 18.5, + "z": 0 + }, + { + "entity_id": 5, + "kind": "Npc", + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 56.5, + "y": 22.5, + "z": 0 + }, + { + "entity_id": 8, + "kind": "Npc", + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 68.5, + "y": 28.5, + "z": 0 + } + ], + "follow_state": null, + "game_time": { + "day": 0, + "day_phase": "Morning", + "tick_rate": "Full", + "time_of_day": 0 + }, + "nearby_interactions": [ + { + "contradicted": false, + "distance": 4, + "entity_id": 5, + "entity_type": "Npc", + "object_type": null, + "verbs": [ + { + "available": true, + "kind": "ExamineNpc", + "label": "Examine NPC", + "priority": 1 + } + ] + } + ], + "pending_recognitions": [ + { + "entity_id": 5, + "remaining_ticks": 4, + "total_delay_ticks": 6, + "x": 56.5, + "y": 22.5, + "z": 0 + }, + { + "entity_id": 8, + "remaining_ticks": 4, + "total_delay_ticks": 6, + "x": 68.5, + "y": 28.5, + "z": 0 + } + ], + "player_facing": "South", + "player_inventory": [], + "player_stance": "Walk", + "poi_list": [], + "rng_seed": 42, + "scan_events": [], + "sound_events": [], + "state_hash": 8686526522907766805, + "tick": 2, + "triangle_crisis_events": [], + "version": 17, + "visible_tiles": [ + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 36, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 36, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 36, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 37, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 37, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 37, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 37, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 38, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 38, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 38, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 38, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 39, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 39, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 39, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 39, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 40, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 41, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 42, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 43, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 44, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 45, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 46, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 47, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 48, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 49, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 50, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 51, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 52, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 20, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 53, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 20, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 54, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 19, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 20, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 55, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 18, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 19, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 20, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 56, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 19, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 20, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 57, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 20, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 58, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 20, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 59, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 60, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 21, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 61, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 61, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 22, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 62, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 62, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 63, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 63, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 23, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 64, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 64, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 65, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 65, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 24, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 66, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 66, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 67, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 67, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 25, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 68, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 68, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 26, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 69, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 69, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 70, + "y": 27, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 70, + "y": 28, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 70, + "y": 29, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 70, + "y": 30, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 70, + "y": 31, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 70, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 70, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 70, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 70, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 71, + "y": 32, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 71, + "y": 33, + "z": 0, + "zone_id": 1 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 71, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 71, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 72, + "y": 33, + "z": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 72, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 72, + "y": 35, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 73, + "y": 34, + "z": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 73, + "y": 35, + "z": 0 + } + ] +} diff --git a/tests/fixtures/gauntlet/fog_theater.msgpack b/tests/fixtures/gauntlet/fog_theater.msgpack new file mode 100644 index 0000000000000000000000000000000000000000..1630a75e70ed067475944cd594e12baf05d20c51 GIT binary patch literal 20343 zcmb{4+ix7z9l-Go1bV-43E_^p1_GE6?)O}XAis1*@s9zUv~Dd zErqg5i~PEkI_=G0wK1D4gl?TKg!ew`CrxK_^kcV}>5l$qga32~b4eA}ep-}yn$K>G zP`6C#urjrnW#)Aot61C@Bj7f@lDPwrByneW@+85O%>&- zr0kz9LzdJmrkYC!t8eDTseH4Tu0pvqes%2^Baww|x4358Ek6DF79YJe=qdWX=YZ3qX|J~u-c=g$6R9UFL*faaVaQVJrb0?d0g%8e{xOB96t5aD~lxy!6 zd0>b4Y^l4Hn%GT^W}R)n)&0Zfj@{7C4~P=WLWyOe;+OS+S{6zy3ni9?ieJ`&VRL)@ zv`}KkD6ttRu^FiN&3I6421;xON^Ay7Yz8WRGaec?x5bx%5@qqr{L=V#p{lWRw^(Dt^e1sUf4pkWpgDC^2M|7&1x>86}2{5<^DC5Bbor*&qKT zqr~%%5^11B8YqzlN~D1jX`nw63L@P z@+gr!N+gepPyTroFG|FV67ix$yeJVbO2ms2@uEb$C=oA8#ETN~qC~u?_;_DX@uEb$ zC=oA8#ETN~qC~tX5id%_ixTmoM7$^wFG|FVijVh2l_5%Gh!Pp1M20AlAxdP35*eaI zhA5FCN@R!<8KUAdd`V@95*eaIhA5FCN@R!<8KOjnD3KvbWQYefO21=xX5^11z zO=IWp@}cgI{0GtZhs&sY+NrIJ@7?X<@oy&byN^dyswj~vN~DSssiH)xD3K~kq>2)$ zqC~1Fkt#~0ifW%K7q?FJsEQ6HqC<)3P$D{%hz=#9Ly726B07|a4ke;PwU3UATSs?H zMTZj6p+s~j5gkfIhZ51DM06+-9ZE!p649aBN5{pjqdTthL5X}&A|I5<2PN`BiF{BZ zAC$-kCGtVF&xea!=kuz{2PN`BiF{BZAC$-kCGtUud{81El*k9wJ|8Y_ozDps0!oB{ z5+R^O2q+N(N`!zCA)rJEsP-XnaqAGKT8wnZ2{)i!Cwe8c>p-uBcAe*ykQgV665~XP zaiZFflZ#uA^EI^ylvo6+{UW%y-6Ht6jn`X$oUM!7e+u5Y^`|)5VtM2A_z+y%?tMSW zLsCw2>{nigGU<&^@%r$CuMY#eX7lp7V0AMHqw~4e`{~w^VtZFP!fd+w@V)WrU}sJ& zCktsFxMDR+rbD)Q`GtwM-afuQDAS_k#IQXZ$x@Q?_gVNiM}++<^y=>DjW3?<6?t7I z{j^ty{=Y8t7R!?Rb{C4g$cov;@SDG+{lAr=SIp*|S61ZRLx)%Duv~wB_-AuP6((ki zqOR&Ns3s>TCr%z%3KMgzt3OfCCH2H0saae;F&$=#GEAQDFLH9)=uIl#Fz;8Fj{LdP z`E(HSKBuR3x80@s!}gunac0@y%dn87qx0A}4y-p{?Y&SJb&_@a9Ea9yy>#uiH`sY3 zS(`Vw&`*=`7VyEU0cWg*i_=-|VTJUaQEub!BC?e&vyy!n%}Rk4`!-dp$jgzXxgTer1)mtXw& zn=j`5&_8{4rpU75RF_ifaPi~bTrz5l6Y2&mqFOA&`|DwOP>g=+oJ;eHL+BPq6G^hp zHx85Qtd4iIv$9YW{fp}*J6(m)Ke#?9(r!kGr~grxX_C)!%v!JHn7Qh!k9uZ&>n?}p R&3(4~`+t7^>;E3w_dopP20H)% literal 0 HcmV?d00001 diff --git a/tests/fixtures/gauntlet/hub_after_movement.json b/tests/fixtures/gauntlet/hub_after_movement.json new file mode 100644 index 000000000..db60759b9 --- /dev/null +++ b/tests/fixtures/gauntlet/hub_after_movement.json @@ -0,0 +1,1079 @@ +{ + "blocked_entities": [ + 1, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76 + ], + "character_pressure": { + "exposure": 0, + "institutional": 0, + "mood": null, + "relationship": 0, + "total": 0 + }, + "conversation_ended": [], + "conversation_events": [], + "current_monologue": null, + "dialogue_response": null, + "entities": [ + { + "entity_id": 0, + "kind": "Player", + "observation": "Visible", + "relationship": "Known", + "visibility": "Forward", + "x": 50.5, + "y": 60.5, + "z": 0 + }, + { + "entity_id": 3, + "kind": "Object", + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 50.5, + "y": 68.5, + "z": 0 + } + ], + "follow_state": null, + "game_time": { + "day": 0, + "day_phase": "Morning", + "tick_rate": "Full", + "time_of_day": 0 + }, + "nearby_interactions": [], + "pending_recognitions": [ + { + "entity_id": 3, + "remaining_ticks": 3, + "total_delay_ticks": 6, + "x": 50.5, + "y": 68.5, + "z": 0 + } + ], + "player_facing": "South", + "player_inventory": [], + "player_stance": "Walk", + "poi_list": [], + "rng_seed": 42, + "scan_events": [], + "sound_events": [], + "state_hash": 15450425815579635895, + "tick": 4, + "triangle_crisis_events": [], + "version": 17, + "visible_tiles": [ + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 40, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 41, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 42, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 43, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 44, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 45, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 46, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 62, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 47, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 62, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 48, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 61, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 62, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 49, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 60, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 61, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 62, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 50, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 61, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 62, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 51, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 62, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 52, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 62, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 53, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 54, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 63, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 55, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 64, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 56, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 57, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 65, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 58, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 59, + "y": 68, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 66, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 67, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 68, + "z": 0, + "zone_id": 0 + } + ] +} diff --git a/tests/fixtures/gauntlet/hub_after_movement.msgpack b/tests/fixtures/gauntlet/hub_after_movement.msgpack new file mode 100644 index 0000000000000000000000000000000000000000..44294b99140f08d1c0d642450862f60fcd65d365 GIT binary patch literal 7116 zcmbW6NpBoQ7={}X!oGwp?2wSv*_?fIHYYJ8CISfoH(E8_<(bOVRE?^7YPNSaP>Kt+;WQe4g3V&Ze!snj!eB5PrE%&*Y`c|%*F3t(Wd^mbY5Arv6rc& zxqhZDS~AX5OMdrDD)MNyyo~KwT>dhHA91@OyzF1K&L~r#DWTYjO!h`PTF0F(^U?C_)CPa2b1x{A{=kP=rEIghEh+ zLQsT4P~i&qQ3^p33PBMHK@kc;5eh+tE8Jh?XTm>)poq^dC_+3aLOdu!JSajusBrOv zlz32tcu<6RP=t6;gm_Sdcu?Wu4;1<7@J~D_;(G#$hzk@E7bqewP()myh`2z7$91sC zhr;6mMT88B2pJR+GAJTsP(;X}h>$@MA%hAJ`4ANsC?YOUL|mYVxIhtcfg<7pMZ^Uv zJg&o(cu<6RP=t6;gm_Sdcu<6RP~qZ_P~t%m;z1GOK@s9X5#m7+;z5OrKT0VCMJNPC zC`8U+WY#AShx$P~ig({f_}3`L92qHRoFm3LNi_k;2tbwwO#h zkyPDDcOmIGhZZJoS!1=WcjV&lZD~?eIoQYESb@Lb=O89J@g+N^meeeAbKKy9&mXEh?+rDGxu7TZq_U_w1 zc;Min!$*!DJAUHisiD(n&Yn9zeBt7ykxxFod}Z{rId3}#4_`X$PGZqVIbU@}%QtU7 zeAA>d?aqx^t?fjNMk|wxx08k_)uHxkV+-GL^80By*|z0XG_Qhgm#4Z}9UY^IYuvkk?eFHd+Xw&r E2diG@xc~qF literal 0 HcmV?d00001 diff --git a/tests/fixtures/gauntlet/hub_spawn.json b/tests/fixtures/gauntlet/hub_spawn.json new file mode 100644 index 000000000..dbae3424d --- /dev/null +++ b/tests/fixtures/gauntlet/hub_spawn.json @@ -0,0 +1,1607 @@ +{ + "blocked_entities": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76 + ], + "character_pressure": { + "exposure": 0, + "institutional": 0, + "mood": null, + "relationship": 0, + "total": 0 + }, + "conversation_ended": [], + "conversation_events": [], + "current_monologue": null, + "dialogue_response": null, + "entities": [ + { + "entity_id": 0, + "kind": "Player", + "observation": "Visible", + "relationship": "Known", + "visibility": "Forward", + "x": 50.5, + "y": 58.5, + "z": 0 + }, + { + "entity_id": 1, + "kind": "Object", + "observation": "Visible", + "relationship": "Unknown", + "visibility": "Forward", + "x": 50.5, + "y": 48.5, + "z": 0 + } + ], + "follow_state": null, + "game_time": { + "day": 0, + "day_phase": "Morning", + "tick_rate": "Full", + "time_of_day": 0 + }, + "nearby_interactions": [], + "pending_recognitions": [ + { + "entity_id": 1, + "remaining_ticks": 4, + "total_delay_ticks": 6, + "x": 50.5, + "y": 48.5, + "z": 0 + } + ], + "player_facing": "North", + "player_inventory": [], + "player_stance": "Walk", + "poi_list": [], + "rng_seed": 42, + "scan_events": [], + "sound_events": [], + "state_hash": 3925209675202732823, + "tick": 2, + "triangle_crisis_events": [], + "version": 17, + "visible_tiles": [ + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 39, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 40, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 40, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 41, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 41, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 42, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 42, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 43, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 43, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 44, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 44, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 45, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 45, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 46, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 46, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 47, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 47, + "y": 56, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 48, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 48, + "y": 56, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 49, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 56, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 49, + "y": 57, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 50, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 56, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 57, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 50, + "y": 58, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 51, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 56, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 51, + "y": 57, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 52, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 52, + "y": 56, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 53, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 53, + "y": 56, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 54, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 54, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 55, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 55, + "y": 55, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 56, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 56, + "y": 54, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 57, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 57, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 58, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 58, + "y": 53, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 59, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Floor", + "visibility": "Forward", + "x": 59, + "y": 52, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 47, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 48, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 49, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 50, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 51, + "z": 0, + "zone_id": 0 + }, + { + "tile_kind": "Wall", + "visibility": "Forward", + "x": 60, + "y": 52, + "z": 0, + "zone_id": 0 + } + ] +} diff --git a/tests/fixtures/gauntlet/hub_spawn.msgpack b/tests/fixtures/gauntlet/hub_spawn.msgpack new file mode 100644 index 0000000000000000000000000000000000000000..602ad74bf5ddad1371604b0b081718f58210827a GIT binary patch literal 10674 zcmbW-$x|F<9LDiB#<(wW!+nn=WMN+ujiRCkw~Ko0>gj$NI@8nd)Z0D4J-8{w;ockP?cqrslZ>GT}1~&-0Me?{BZCxnNut+w|mW9*31<8|9#C z{5-CjA8tfJ!`m!A_3fNr{AGhb{MvkwndX<)rEyx`D3I@h+^o*jlVrP=1P$Z-xgg{p z*S@kYpWlBi%Y!sDtKSDn<<`Gn7N-j)&8=%Juk$g^W0U>z(?;vlh95`X%F^BGE1tK~ zxI2B757)faN}NW&e$#r$&4oCNOK}qCjpmGXi-C)_oJoS5A10fRYiqNqT}(G^DKl=N z^=k9GLL}zEBknu!i0K25__}n}gn6e&G`~$N|M!sX*0+}wStcgC=lywoWvO?i(a%rO z=55K5FD-t$BA}#s&8DVEU=Ix_Xiz~z3L5SjomPSXbqr!{Cb8BXj1Sc@iMFa^6m3<< zEZVA(P6-}WXOsv*LWC$GLX;38N{A38MA)Z92ofSh2@#@%2vI_WC@sR#?zekZ2_7T_ zj}n4M3BjX;;88;GC?WWBO7I{dc$5%4N(de$1dkGeM`^*2b^m*EUa1Qt)P)l2LJ4)D zgt|~dT_~Y0lvdYx_a$FYN(KofqlA)CLdhthWRy@cN+=m6l#CKe?pI0%2_>V1l2Jm* zD4}GOP%=s=86}jA(n_A_{`Y@CnFdIh21=L)N|**pm|LJ5OH34=ljgF*>|LJ5N!Ri*(FrhyWsffA;H5~hI?rhyWsffA;H z5~hI?rZJ{W10+lXB}@Y)OamoM10_rYB}@Y)OamoMV_Yd2B$SL2N=6AKqlA)CLdhth zWRy@cN+@|kDH$Y`j1o#l2_>V1l2Jm*D4}GOQ1YZw7f7fJCDery>Ou*1p@h0nLS0iz z@E{?0ln^{h2p%N_j}n4M3Bg}ff(Hq~qlDm5LhvXdc$5(QB_%>o#|V#HT!A_!*ba3J zupR1{Upv$>zQgEFY64f{q%O^k3&Pfg-11IXcaB>-ziLyP*mB+M{$4X_#NnRrOlZp~ z2YH;*{e1nui@c-fa=$rK4dUVykVChyk{#d4Z5||k#3f#1@1+wvQ5>`$!24!3-qP%D zW?_)}ra1r0mT#338&*u@?;io)^Jb6TfBbE%~meeLx(-hAurcTTmSF^bZUU4UdeDjZaKYUA*+(`mqRf#oLEpOd}I5Z_U{xv5P);i@Djo9nJ?ubR0L< z_$jiwGe54IrJ5~1^S0wO<9@MT1QsOTp*uuxt(AzkTD3OXU3Vmv858xb*KF)3ah5Ot kk-IoZ%NziPjtj+X|GT=`dbH2I<@{e`jZ@{`(v6;f0Q0}tRR910 literal 0 HcmV?d00001 diff --git a/tests/run-visual b/tests/run-visual index 24ee6fb32..74ed830a9 100755 --- a/tests/run-visual +++ b/tests/run-visual @@ -25,6 +25,14 @@ MODE="golden" # golden | screenshot | movie | update TARGET="" INTERVAL="" +# Server state for live scenarios +SERVER_BIN="" +SERVER_PID="" +SERVER_PORT="" + +# Cleanup server on exit +trap '[[ -n "${SERVER_PID:-}" ]] && kill "$SERVER_PID" 2>/dev/null; wait "$SERVER_PID" 2>/dev/null || true' EXIT + # -- Parse args ---------------------------------------------------------------- while [[ $# -gt 0 ]]; do @@ -102,12 +110,84 @@ xvfb_capture() { fi } +# -- Server lifecycle (live scenarios) ----------------------------------------- + +# Check if a scenario has "live": true in config +is_live_scenario() { + python3 -c " +import json, sys +c = json.load(open('${CONFIG}')) +s = c.get('scenarios', {}).get('${1}', {}) +sys.exit(0 if s.get('live') else 1) +" +} + +# Build server binary (once, cached) +ensure_server_built() { + if [[ -n "$SERVER_BIN" ]]; then return 0; fi + echo " Building server for live visual tests..." + (cd "$ROOT/server" && cargo build --bin settled-reach-server 2>&1) || { + echo "Error: server build failed" >&2 + return 1 + } + SERVER_BIN="$ROOT/server/target/debug/settled-reach-server" +} + +# Start server with --test-mode --port 0, parse LISTENING:{port} +start_server() { + local stdout_log + stdout_log=$(mktemp) + "$SERVER_BIN" --test-mode --port 0 >"$stdout_log" 2>/dev/null & + SERVER_PID=$! + + local attempts=0 + while [[ $attempts -lt 150 ]]; do + if ! kill -0 "$SERVER_PID" 2>/dev/null; then + echo " Error: server exited unexpectedly" >&2 + rm -f "$stdout_log" + SERVER_PID="" + return 1 + fi + if grep -q "^LISTENING:" "$stdout_log" 2>/dev/null; then + SERVER_PORT=$(sed -n 's/^LISTENING://p' "$stdout_log") + rm -f "$stdout_log" + echo " Server started: pid=$SERVER_PID port=$SERVER_PORT" + return 0 + fi + sleep 0.1 + attempts=$((attempts + 1)) + done + + echo " Error: no LISTENING signal after 15s" >&2 + kill "$SERVER_PID" 2>/dev/null || true + rm -f "$stdout_log" + SERVER_PID="" + return 1 +} + +# Stop server (called after each live capture; server may have exited on disconnect) +stop_server() { + if [[ -n "$SERVER_PID" ]]; then + kill "$SERVER_PID" 2>/dev/null || true + wait "$SERVER_PID" 2>/dev/null || true + SERVER_PID="" + SERVER_PORT="" + fi +} + # -- Screenshot mode ----------------------------------------------------------- if [[ "$MODE" == "screenshot" ]]; then mkdir -p "$CACHE_DIR" echo "Capturing scenario: $TARGET" + if is_live_scenario "$TARGET"; then + ensure_server_built || exit 2 + start_server || exit 2 + export SR_LIVE=1 SR_PORT="$SERVER_PORT" + fi godot_capture --scenario "$TARGET" "$CACHE_DIR" + stop_server + unset SR_LIVE SR_PORT 2>/dev/null || true PNG="$CACHE_DIR/$TARGET.png" if [[ -f "$PNG" ]]; then echo "Screenshot: $PNG ($(stat -c%s "$PNG" 2>/dev/null || stat -f%z "$PNG") bytes)" @@ -162,12 +242,27 @@ for scenario in "${SCENARIOS[@]}"; do TOTAL=$((TOTAL + 1)) echo "--- $scenario ---" + # Start server for live scenarios + IS_LIVE=false + if is_live_scenario "$scenario"; then + IS_LIVE=true + ensure_server_built || { FAILED=$((FAILED + 1)); continue; } + start_server || { FAILED=$((FAILED + 1)); continue; } + export SR_LIVE=1 SR_PORT="$SERVER_PORT" + fi + # Capture set +e CAPTURE_OUT=$(xvfb_capture --scenario "$scenario" "$CACHE_DIR" 2>&1) CAPTURE_RC=$? set -e + # Stop server after capture (server exits on client disconnect anyway) + if [[ "$IS_LIVE" == "true" ]]; then + unset SR_LIVE SR_PORT 2>/dev/null || true + stop_server + fi + CAPTURED="$CACHE_DIR/$scenario.png" if [[ $CAPTURE_RC -ne 0 ]] || [[ ! -f "$CAPTURED" ]]; then diff --git a/tests/visual.json b/tests/visual.json index be5f52007..4d7e92772 100644 --- a/tests/visual.json +++ b/tests/visual.json @@ -2,6 +2,7 @@ "resolution": [960, 540], "settle_frames": 30, "tolerance": 5, + "max_diff_pct": 0.5, "golden_dir": "client/tests/golden/visual", "scenarios": { "fog_3state": { @@ -47,6 +48,26 @@ "cursor_menu": { "ticks": 3, "description": "Cursor rendering over dialogue option" + }, + "fog_live_replay": { + "ticks": 1, + "description": "Replay real server hub snapshot — full pipeline fog test", + "replay_snapshot": "tests/fixtures/gauntlet/hub_spawn.msgpack" + }, + "fog_theater_replay": { + "ticks": 1, + "description": "Replay Fog Theater — large room with NPCs at varying distances", + "replay_snapshot": "tests/fixtures/gauntlet/fog_theater.msgpack" + }, + "fog_boundary_replay": { + "ticks": 1, + "description": "Replay hub after movement — explored/visible tile boundary", + "replay_snapshot": "tests/fixtures/gauntlet/hub_after_movement.msgpack" + }, + "fog_live_hub": { + "ticks": 10, + "live": true, + "description": "Live server: Hub spawn fog — real pipeline regression test" } }, "flows": { diff --git a/tooling/visual-diff b/tooling/visual-diff index c1a9c7fa0..8b1d913a1 100755 --- a/tooling/visual-diff +++ b/tooling/visual-diff @@ -239,18 +239,22 @@ def compare( # --------------------------------------------------------------------------- -def load_tolerance(config_path: Path | None) -> int: - """Read tolerance from config JSON, return DEFAULT_TOLERANCE on failure.""" +def load_config(config_path: Path | None) -> dict: + """Read visual test config, return dict with tolerance and max_diff_pct.""" if config_path is None: config_path = DEFAULT_CONFIG + defaults = {"tolerance": DEFAULT_TOLERANCE, "max_diff_pct": 0.0} if not config_path.exists(): - return DEFAULT_TOLERANCE + return defaults try: with open(config_path) as f: data = json.load(f) - return int(data.get("tolerance", DEFAULT_TOLERANCE)) + return { + "tolerance": int(data.get("tolerance", DEFAULT_TOLERANCE)), + "max_diff_pct": float(data.get("max_diff_pct", 0.0)), + } except (json.JSONDecodeError, ValueError, OSError): - return DEFAULT_TOLERANCE + return defaults # --------------------------------------------------------------------------- @@ -270,6 +274,12 @@ def main() -> int: default=None, help="Per-channel pixel tolerance (default: from config or 5)", ) + parser.add_argument( + "--max-diff-pct", + type=float, + default=None, + help="Max allowed diff percentage (default: from config or 0.0)", + ) parser.add_argument( "--diff-output", default=None, @@ -282,9 +292,11 @@ def main() -> int: ) args = parser.parse_args() - # Resolve tolerance: CLI > config > fallback + # Resolve settings: CLI > config > fallback config_path = Path(args.config) if args.config else None - tolerance = args.tolerance if args.tolerance is not None else load_tolerance(config_path) + cfg = load_config(config_path) + tolerance = args.tolerance if args.tolerance is not None else cfg["tolerance"] + max_diff_pct = args.max_diff_pct if args.max_diff_pct is not None else cfg["max_diff_pct"] # Read images try: @@ -322,6 +334,11 @@ def main() -> int: return 0 pct = diff_count / total * 100 + + if pct <= max_diff_pct: + print(f"PASS: {diff_count} of {total} pixels differ ({pct:.1f}%, within {max_diff_pct}% threshold)") + return 0 + print(f"FAIL: {diff_count} of {total} pixels differ ({pct:.1f}%)") if args.diff_output and diff_buf: