diff --git a/README.md b/README.md index 0c8c8a0..1ae2814 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,9 @@ filing cabinet. Falling Down, scored by payroll. **Seven sites** (Scranton branch, Pawnee city hall, a hacker house, a windowless IT basement, a greengrocer where everything is soft except the bottles, the Backrooms — where the walls are procedurally generated and everything you're there to destroy is invisible until you coat it in extinguisher powder, some of -which you breathe, and the real Monster Robot Party shop — imported live from the -storefront's own database, bins, genre labels and all) and **four modes** (Cubicle Hell, the Gauntlet, Total Destruction, Against the +which you breathe, and the real Monster Robot Party shop — all four of its +rooms, imported live from the storefront's own database and stitched together by its own +portal graph, bins, genre labels and all) and **four modes** (Cubicle Hell, the Gauntlet, Total Destruction, Against the Clock). Sites are data, not code — see `game/scripts/Levels.gd`. Design, built and planned, lives in [`LANES/LANE7-cubicle-hell.md`](LANES/LANE7-cubicle-hell.md). diff --git a/game/README.md b/game/README.md index 22b840d..7cc7ab5 100644 --- a/game/README.md +++ b/game/README.md @@ -30,10 +30,10 @@ Mac-first (Apple Silicon / Metal), **Godot 4.7**, **Jolt** physics. | **digits · arrows · ENTER · SPACE** | while working: type · move cell · commit · the other thing | | **B · R** | rain 500 bodies (stress gate) · reset the office | -## The six sites +## The seven sites `scripts/Floorplan.gd` builds a workplace from a **data spec**; `scripts/Levels.gd` holds -six of them. A site is a Dictionary — bounds, palette, walls with doors and glazing, +seven of them. A site is a Dictionary — bounds, palette, walls with doors and glazing, window runs, ceiling style, light grid and style, slabs, props, desk clusters, chairs, smashables, gauntlet records-area and spawn — so a new one is authorable in minutes and a generator can later emit the same structure. @@ -49,7 +49,7 @@ generator can later emit the same structure. | **MONSTER ROBOT PARTY** | timber, white, shop pink | the real shop, **imported from the live storefront** — see below | `dev/probe_levels.gd` builds every one and reports residual motion after a full second. -All six must read `0.00 m/s`. +All seven must read `0.00 m/s`. ### THE GREENGROCER — soft things @@ -270,10 +270,17 @@ data — so `tools/import_store.py` reads the real shop and emits | | | |---|---| -| room | 6.66 m × 9.51 m, 2.89 m ceiling — the actual floor | -| racks | 35, across 21 archetypes | -| bins | 278, each carrying its **real genre label** (`HARD TRANCE`, `$12-$15 EURO/ITALO HOUSE`) | -| stock | **21,159 records** | +| rooms | **four**, stitched by the shop's own portal graph — 12.96 m × 15.41 m all up | +| racks | 36, across 21 archetypes | +| bins | 325, each carrying its **real genre label** (`HARD TRANCE`, `$12-$15 EURO/ITALO HOUSE`) | +| stock | **24,024 records** | + +The shop is `hiphop-room ↔ entry-hall ↔ shop-floor ↔ back-room`. Only two of those hold +stock; the entry hall and the back room are empty, and that is exactly why they are worth +importing — they are the connective tissue, the run-up, and the only floor in the building +big enough to get an office chair up to speed. Each portal pair is the same doorway seen +from both sides, so the importer places every room by making its portal land on its +neighbour's, then emits the interior walls with a gap at each doorway. **The shop's schema is the cascade.** `virtual_crate.rack_id` already records which rack holds which bin, so every bin arrives frozen and `supported_by` its rack — knock a rack diff --git a/game/assets/store/shop_floor.json b/game/assets/store/shop_floor.json index 7f2dd91..2818b6c 100644 --- a/game/assets/store/shop_floor.json +++ b/game/assets/store/shop_floor.json @@ -1,23 +1,147 @@ { - "_source": "/tmp/scene_probe.json", + "_source": "/tmp/scenes", "_note": "GENERATED by tools/import_store.py from the live shop. Do not hand-edit.", "room": { - "w": 6.66, - "d": 9.51, - "h": 2.89 + "w": 12.96, + "d": 15.41, + "h": 2.93 }, + "rooms": [ + { + "id": 2, + "name": "shop-floor", + "at": [ + -0.18, + -1.805 + ], + "size": [ + 6.66, + 9.51 + ] + }, + { + "id": 4, + "name": "entry-hall", + "at": [ + -0.18, + -7.705 + ], + "size": [ + 6.5, + 5.9 + ] + }, + { + "id": 7, + "name": "back-room", + "at": [ + -4.68, + 3.785 + ], + "size": [ + 4.5, + 3.9 + ] + }, + { + "id": 3, + "name": "hiphop-room", + "at": [ + -6.48, + -7.255 + ], + "size": [ + 6.39, + 9.2 + ] + } + ], "counts": { - "racks": 35, - "crates": 278, - "stock_records": 21159, + "rooms": 4, + "racks": 36, + "crates": 325, + "stock_records": 24024, "slabs": 6 }, "spawn": { "at": [ - -0.23, - 2.84 + 3.07, + -4.75 ] }, + "walls": [ + { + "a": "x", + "at": -0.18, + "from": -1.805, + "to": 7.705, + "door": 5.085 + }, + { + "a": "z", + "at": -1.805, + "from": -0.18, + "to": 6.48, + "door": 0.945 + }, + { + "a": "x", + "at": -0.18, + "from": -7.705, + "to": -1.805, + "door": -3.105 + }, + { + "a": "x", + "at": 6.32, + "from": -7.705, + "to": -1.805 + }, + { + "a": "z", + "at": -1.805, + "from": -0.18, + "to": 6.32, + "door": 0.945 + }, + { + "a": "x", + "at": -4.68, + "from": 3.785, + "to": 7.685 + }, + { + "a": "x", + "at": -0.18, + "from": 3.785, + "to": 7.685, + "door": 5.085 + }, + { + "a": "z", + "at": 3.785, + "from": -4.68, + "to": -0.18 + }, + { + "a": "x", + "at": -0.09, + "from": -7.255, + "to": 1.945 + }, + { + "a": "z", + "at": -7.255, + "from": -6.48, + "to": -0.09 + }, + { + "a": "z", + "at": 1.945, + "from": -6.48, + "to": -0.09 + } + ], "slabs": [ { "size": [ @@ -26,9 +150,9 @@ 1.95 ], "at": [ - -3.33, + -0.18, 0.87, - -4.705 + -1.755 ], "mat": "wood" }, @@ -39,9 +163,9 @@ 0.05 ], "at": [ - 0.51, + 3.66, 1.61, - -4.755 + -1.805 ], "mat": "wood" }, @@ -52,9 +176,9 @@ 0.32 ], "at": [ - -3.33, + -0.18, 2.58, - -1.135 + 1.815 ], "mat": "trim" }, @@ -65,9 +189,9 @@ 0.32 ], "at": [ - -3.33, + -0.18, 2.58, - 1.785 + 4.735 ], "mat": "trim" }, @@ -78,9 +202,9 @@ 0.48 ], "at": [ - -1.43, + 1.72, 0.87, - -4.755 + -1.805 ], "mat": "wood" }, @@ -91,9 +215,9 @@ 0.05 ], "at": [ - -1.68, + 1.47, 2.1, - -4.755 + -1.805 ], "mat": "wood" } @@ -103,8 +227,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - 1.07, - 0.301 + 4.22, + 3.251 ], "sit_on": 0.02, "yaw": 0.0, @@ -120,8 +244,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - -0.43, - 0.165 + 2.72, + 3.115 ], "sit_on": 0.02, "yaw": 0.0, @@ -137,8 +261,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - 1.07, - -1.717 + 4.22, + 1.233 ], "sit_on": 0.02, "yaw": 0.0, @@ -154,8 +278,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - -1.93, - -1.855 + 1.22, + 1.095 ], "sit_on": 0.02, "yaw": 0.0, @@ -171,8 +295,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - -3.087, - -4.255 + 0.14, + -1.305 ], "sit_on": 0.0, "yaw": 0.0, @@ -188,8 +312,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - -3.29, - 0.485 + -0.14, + 3.435 ], "sit_on": 0.0, "yaw": 0.0, @@ -205,8 +329,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - -3.159, - -0.815 + -0.009, + 2.135 ], "sit_on": 0.0, "yaw": 0.0, @@ -222,8 +346,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - -1.97, - 0.165 + 1.18, + 3.115 ], "sit_on": 0.02, "yaw": 0.0, @@ -239,8 +363,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - 3.004, - -4.255 + 6.154, + -1.305 ], "sit_on": 0.0, "yaw": 0.0, @@ -256,8 +380,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - -3.29, - -2.555 + -0.14, + 0.395 ], "sit_on": 0.0, "yaw": 0.0, @@ -273,8 +397,8 @@ "glb": "store-column-white", "kind": "steel", "at": [ - 0.93, - 4.285 + 4.08, + 7.235 ], "sit_on": 0.0, "yaw": 0.0, @@ -290,8 +414,8 @@ "glb": "store-column-white", "kind": "steel", "at": [ - -1.27, - 4.285 + 1.88, + 7.235 ], "sit_on": 0.0, "yaw": 0.0, @@ -307,8 +431,8 @@ "glb": "store-station", "kind": "wood", "at": [ - -2.15, - 4.245 + 1.0, + 7.195 ], "sit_on": 0.0, "yaw": 0.0, @@ -324,8 +448,8 @@ "glb": "store-station", "kind": "wood", "at": [ - -3.33, - 2.965 + -0.18, + 5.915 ], "sit_on": 0.0, "yaw": 0.0, @@ -341,8 +465,8 @@ "glb": "store-trolley", "kind": "steel", "at": [ - -3.33, - 3.885 + -0.18, + 6.835 ], "sit_on": 0.0, "yaw": 0.0, @@ -358,8 +482,8 @@ "glb": "store-column-white", "kind": "steel", "at": [ - -3.31, - 1.785 + -0.16, + 4.735 ], "sit_on": 0.0, "yaw": 0.0, @@ -375,8 +499,8 @@ "glb": "store-column-white", "kind": "steel", "at": [ - -3.461, - -1.135 + -0.311, + 1.815 ], "sit_on": 0.0, "yaw": 0.0, @@ -392,8 +516,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - -0.43, - -1.855 + 2.72, + 1.095 ], "sit_on": 0.02, "yaw": 0.0, @@ -409,8 +533,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - 1.937, - -4.225 + 5.087, + -1.275 ], "sit_on": 0.0, "yaw": 0.0, @@ -426,8 +550,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - 2.884, - -2.712 + 6.034, + 0.238 ], "sit_on": 0.0, "yaw": 0.0, @@ -443,8 +567,8 @@ "glb": "store-aircon", "kind": "steel", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -460,8 +584,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - 2.62, - 1.816 + 5.77, + 4.766 ], "sit_on": 0.0, "yaw": 0.0, @@ -477,8 +601,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - -1.73, - -3.655 + 1.42, + -0.705 ], "sit_on": 0.02, "yaw": 0.0, @@ -494,8 +618,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - 1.567, - -3.139 + 4.716, + -0.189 ], "sit_on": 0.02, "yaw": 3.1416, @@ -511,8 +635,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - 2.58, - 0.295 + 5.73, + 3.246 ], "sit_on": 0.0, "yaw": 0.0, @@ -528,8 +652,8 @@ "glb": "store-rack-wide", "kind": "wood", "at": [ - 3.135, - 3.355 + 6.285, + 6.305 ], "sit_on": 0.0, "yaw": 1.5708, @@ -545,8 +669,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -3.534, - -4.755 + -0.384, + -1.921 ], "sit_on": 0.0, "yaw": 0.0, @@ -562,8 +686,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - 2.51, - 4.285 + 5.66, + 7.235 ], "sit_on": 0.0, "yaw": 3.1416, @@ -579,8 +703,8 @@ "glb": "store-rack-long", "kind": "wood", "at": [ - 2.58, - -1.2 + 5.73, + 1.75 ], "sit_on": 0.0, "yaw": 0.0, @@ -592,12 +716,131 @@ "id": "r21", "name": "big-4x4x4-02" }, + { + "glb": "store-rack-wide", + "kind": "wood", + "at": [ + -3.08, + -2.086 + ], + "sit_on": 0.0, + "yaw": 0.0, + "fit": [ + 2.87, + 2.6, + 3.37 + ], + "id": "r51", + "name": "hh-dj-booth" + }, + { + "glb": "store-rack-wide", + "kind": "wood", + "at": [ + -6.48, + -7.255 + ], + "sit_on": 0.0, + "yaw": 0.0, + "fit": [ + 6.27, + 2.6, + 2.67 + ], + "id": "r52", + "name": "hh-cyclorama" + }, + { + "glb": "store-rack-wide", + "kind": "wood", + "at": [ + -6.43, + -4.255 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.77, + 0.05, + 3.03 + ], + "id": "r53", + "name": "hh-bench-1-wall" + }, + { + "glb": "store-rack-wide", + "kind": "wood", + "at": [ + -5.18, + -4.155 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 1.07, + 0.05, + 1.47 + ], + "id": "r54", + "name": "hh-bench-2-table" + }, + { + "glb": "store-rack-wide", + "kind": "wood", + "at": [ + -6.33, + -0.805 + ], + "sit_on": 0.4, + "yaw": 0.0, + "fit": [ + 0.77, + 0.05, + 1.12 + ], + "id": "r55", + "name": "hh-bench-3-coffee" + }, + { + "glb": "store-rack-wide", + "kind": "wood", + "at": [ + -3.53, + 0.026 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 1.47, + 0.05, + 0.77 + ], + "id": "r56", + "name": "hh-bench-4-booth" + }, + { + "glb": "store-rack-wide", + "kind": "wood", + "at": [ + -0.322, + -1.539 + ], + "sit_on": 0.0, + "yaw": 3.1416, + "fit": [ + 0.34, + 1.25, + 0.37 + ], + "id": "r44", + "name": "mos-japhop" + }, { "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.07, - 0.301 + 4.22, + 3.251 ], "sit_on": 0.02, "yaw": 0.0, @@ -613,8 +856,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.07, - 0.301 + 4.22, + 3.251 ], "sit_on": 0.02, "yaw": 0.0, @@ -630,8 +873,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - -0.419 + 4.025, + 2.531 ], "sit_on": 0.25, "yaw": 0.0, @@ -647,8 +890,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - -0.419 + 4.415, + 2.531 ], "sit_on": 0.25, "yaw": 0.0, @@ -664,8 +907,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - -0.059 + 4.025, + 2.891 ], "sit_on": 0.25, "yaw": 0.0, @@ -682,8 +925,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - -0.059 + 4.415, + 2.891 ], "sit_on": 0.25, "yaw": 0.0, @@ -700,8 +943,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - 0.301 + 4.025, + 3.251 ], "sit_on": 0.25, "yaw": 0.0, @@ -718,8 +961,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - 0.301 + 4.415, + 3.251 ], "sit_on": 0.25, "yaw": 0.0, @@ -736,8 +979,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - 0.661 + 4.025, + 3.611 ], "sit_on": 0.25, "yaw": 0.0, @@ -754,8 +997,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - 0.661 + 4.415, + 3.611 ], "sit_on": 0.25, "yaw": 0.0, @@ -772,8 +1015,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - 1.021 + 4.025, + 3.971 ], "sit_on": 0.25, "yaw": 0.0, @@ -790,8 +1033,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - 1.021 + 4.415, + 3.971 ], "sit_on": 0.25, "yaw": 0.0, @@ -808,8 +1051,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - -0.419 + 4.025, + 2.531 ], "sit_on": 0.78, "yaw": 0.0, @@ -826,8 +1069,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - -0.419 + 4.415, + 2.531 ], "sit_on": 0.78, "yaw": 0.0, @@ -844,8 +1087,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - -0.059 + 4.025, + 2.891 ], "sit_on": 0.78, "yaw": 0.0, @@ -862,8 +1105,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - -0.059 + 4.415, + 2.891 ], "sit_on": 0.78, "yaw": 0.0, @@ -880,8 +1123,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - 0.301 + 4.025, + 3.251 ], "sit_on": 0.78, "yaw": 0.0, @@ -898,8 +1141,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - 0.301 + 4.415, + 3.251 ], "sit_on": 0.78, "yaw": 0.0, @@ -916,8 +1159,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - 0.661 + 4.025, + 3.611 ], "sit_on": 0.78, "yaw": 0.0, @@ -934,8 +1177,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - 0.661 + 4.415, + 3.611 ], "sit_on": 0.78, "yaw": 0.0, @@ -952,8 +1195,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - 1.021 + 4.025, + 3.971 ], "sit_on": 0.78, "yaw": 0.0, @@ -970,8 +1213,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - 1.021 + 4.415, + 3.971 ], "sit_on": 0.78, "yaw": 0.0, @@ -988,8 +1231,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - -0.555 + 2.525, + 2.395 ], "sit_on": 0.25, "yaw": 0.0, @@ -1005,8 +1248,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - -0.555 + 2.915, + 2.395 ], "sit_on": 0.25, "yaw": 0.0, @@ -1023,8 +1266,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - -0.195 + 2.525, + 2.755 ], "sit_on": 0.25, "yaw": 0.0, @@ -1041,8 +1284,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - -0.195 + 2.915, + 2.755 ], "sit_on": 0.25, "yaw": 0.0, @@ -1059,8 +1302,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - 0.165 + 2.525, + 3.115 ], "sit_on": 0.25, "yaw": 0.0, @@ -1077,8 +1320,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - 0.165 + 2.915, + 3.115 ], "sit_on": 0.25, "yaw": 0.0, @@ -1094,8 +1337,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - 0.525 + 2.525, + 3.475 ], "sit_on": 0.25, "yaw": 0.0, @@ -1112,8 +1355,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - 0.525 + 2.915, + 3.475 ], "sit_on": 0.25, "yaw": 0.0, @@ -1130,8 +1373,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - 0.885 + 2.525, + 3.835 ], "sit_on": 0.25, "yaw": 0.0, @@ -1148,8 +1391,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - 0.885 + 2.915, + 3.835 ], "sit_on": 0.25, "yaw": 0.0, @@ -1166,8 +1409,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - -0.555 + 2.525, + 2.395 ], "sit_on": 0.78, "yaw": 0.0, @@ -1184,8 +1427,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - -0.555 + 2.915, + 2.395 ], "sit_on": 0.78, "yaw": 0.0, @@ -1202,8 +1445,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - -0.195 + 2.525, + 2.755 ], "sit_on": 0.78, "yaw": 0.0, @@ -1220,8 +1463,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - -0.195 + 2.915, + 2.755 ], "sit_on": 0.78, "yaw": 0.0, @@ -1238,8 +1481,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - 0.165 + 2.525, + 3.115 ], "sit_on": 0.78, "yaw": 0.0, @@ -1256,8 +1499,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - 0.165 + 2.915, + 3.115 ], "sit_on": 0.78, "yaw": 0.0, @@ -1274,8 +1517,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - 0.525 + 2.525, + 3.475 ], "sit_on": 0.78, "yaw": 0.0, @@ -1292,8 +1535,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - 0.525 + 2.915, + 3.475 ], "sit_on": 0.78, "yaw": 0.0, @@ -1310,8 +1553,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - 0.885 + 2.525, + 3.835 ], "sit_on": 0.78, "yaw": 0.0, @@ -1328,8 +1571,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - 0.885 + 2.915, + 3.835 ], "sit_on": 0.78, "yaw": 0.0, @@ -1346,8 +1589,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - -2.437 + 4.025, + 0.513 ], "sit_on": 0.25, "yaw": 0.0, @@ -1364,8 +1607,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - -2.437 + 4.415, + 0.513 ], "sit_on": 0.25, "yaw": 0.0, @@ -1382,8 +1625,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - -2.077 + 4.025, + 0.873 ], "sit_on": 0.25, "yaw": 0.0, @@ -1400,8 +1643,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - -2.077 + 4.415, + 0.873 ], "sit_on": 0.25, "yaw": 0.0, @@ -1418,8 +1661,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - -1.717 + 4.025, + 1.233 ], "sit_on": 0.25, "yaw": 0.0, @@ -1436,8 +1679,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - -1.717 + 4.415, + 1.233 ], "sit_on": 0.25, "yaw": 0.0, @@ -1454,8 +1697,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - -1.357 + 4.025, + 1.593 ], "sit_on": 0.25, "yaw": 0.0, @@ -1472,8 +1715,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - -1.357 + 4.415, + 1.593 ], "sit_on": 0.25, "yaw": 0.0, @@ -1490,8 +1733,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.875, - -0.997 + 4.025, + 1.953 ], "sit_on": 0.25, "yaw": 0.0, @@ -1508,8 +1751,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.265, - -0.997 + 4.415, + 1.953 ], "sit_on": 0.25, "yaw": 0.0, @@ -1526,8 +1769,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - -2.437 + 4.025, + 0.513 ], "sit_on": 0.78, "yaw": 0.0, @@ -1544,8 +1787,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - -2.437 + 4.415, + 0.513 ], "sit_on": 0.78, "yaw": 0.0, @@ -1562,8 +1805,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - -2.077 + 4.025, + 0.873 ], "sit_on": 0.78, "yaw": 0.0, @@ -1580,8 +1823,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - -2.077 + 4.415, + 0.873 ], "sit_on": 0.78, "yaw": 0.0, @@ -1598,8 +1841,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - -1.717 + 4.025, + 1.233 ], "sit_on": 0.78, "yaw": 0.0, @@ -1616,8 +1859,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - -1.717 + 4.415, + 1.233 ], "sit_on": 0.78, "yaw": 0.0, @@ -1634,8 +1877,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - -1.357 + 4.025, + 1.593 ], "sit_on": 0.78, "yaw": 0.0, @@ -1652,8 +1895,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - -1.357 + 4.415, + 1.593 ], "sit_on": 0.78, "yaw": 0.0, @@ -1670,8 +1913,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.875, - -0.997 + 4.025, + 1.953 ], "sit_on": 0.78, "yaw": 0.0, @@ -1688,8 +1931,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.265, - -0.997 + 4.415, + 1.953 ], "sit_on": 0.78, "yaw": 0.0, @@ -1706,8 +1949,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.125, - -2.575 + 1.025, + 0.375 ], "sit_on": 0.25, "yaw": 0.0, @@ -1724,8 +1967,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.735, - -2.575 + 1.415, + 0.375 ], "sit_on": 0.25, "yaw": 0.0, @@ -1742,8 +1985,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.125, - -2.215 + 1.025, + 0.735 ], "sit_on": 0.25, "yaw": 0.0, @@ -1760,8 +2003,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.735, - -2.215 + 1.415, + 0.735 ], "sit_on": 0.25, "yaw": 0.0, @@ -1777,8 +2020,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.125, - -1.855 + 1.025, + 1.095 ], "sit_on": 0.25, "yaw": 0.0, @@ -1795,8 +2038,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.735, - -1.855 + 1.415, + 1.095 ], "sit_on": 0.25, "yaw": 0.0, @@ -1813,8 +2056,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.125, - -1.495 + 1.025, + 1.455 ], "sit_on": 0.25, "yaw": 0.0, @@ -1831,8 +2074,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.735, - -1.495 + 1.415, + 1.455 ], "sit_on": 0.25, "yaw": 0.0, @@ -1849,8 +2092,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.125, - -1.135 + 1.025, + 1.815 ], "sit_on": 0.25, "yaw": 0.0, @@ -1867,8 +2110,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.735, - -1.135 + 1.415, + 1.815 ], "sit_on": 0.25, "yaw": 0.0, @@ -1885,8 +2128,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.125, - -2.575 + 1.025, + 0.375 ], "sit_on": 0.78, "yaw": 0.0, @@ -1903,8 +2146,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.735, - -2.575 + 1.415, + 0.375 ], "sit_on": 0.78, "yaw": 0.0, @@ -1921,8 +2164,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.125, - -2.215 + 1.025, + 0.735 ], "sit_on": 0.78, "yaw": 0.0, @@ -1939,8 +2182,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.735, - -2.215 + 1.415, + 0.735 ], "sit_on": 0.78, "yaw": 0.0, @@ -1957,8 +2200,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.125, - -1.855 + 1.025, + 1.095 ], "sit_on": 0.78, "yaw": 0.0, @@ -1975,8 +2218,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.735, - -1.855 + 1.415, + 1.095 ], "sit_on": 0.78, "yaw": 0.0, @@ -1993,8 +2236,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.125, - -1.495 + 1.025, + 1.455 ], "sit_on": 0.78, "yaw": 0.0, @@ -2011,8 +2254,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.735, - -1.495 + 1.415, + 1.455 ], "sit_on": 0.78, "yaw": 0.0, @@ -2029,8 +2272,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.125, - -1.135 + 1.025, + 1.815 ], "sit_on": 0.78, "yaw": 0.0, @@ -2047,8 +2290,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.735, - -1.135 + 1.415, + 1.815 ], "sit_on": 0.78, "yaw": 0.0, @@ -2065,8 +2308,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -4.84 + 0.14, + -1.89 ], "sit_on": 0.44, "yaw": 0.0, @@ -2083,8 +2326,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -4.45 + 0.14, + -1.5 ], "sit_on": 0.44, "yaw": 0.0, @@ -2101,8 +2344,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -4.06 + 0.14, + -1.11 ], "sit_on": 0.44, "yaw": 0.0, @@ -2119,8 +2362,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -3.67 + 0.14, + -0.72 ], "sit_on": 0.44, "yaw": 0.0, @@ -2137,8 +2380,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -4.84 + 0.14, + -1.89 ], "sit_on": 0.02, "yaw": 0.0, @@ -2155,8 +2398,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -4.45 + 0.14, + -1.5 ], "sit_on": 0.02, "yaw": 0.0, @@ -2173,8 +2416,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -4.06 + 0.14, + -1.11 ], "sit_on": 0.02, "yaw": 0.0, @@ -2191,8 +2434,8 @@ "glb": "store-tub-black", "kind": "plastic", "at": [ - -3.087, - -3.67 + 0.14, + -0.72 ], "sit_on": 0.02, "yaw": 0.0, @@ -2209,8 +2452,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - 0.052 + -0.14, + 3.002 ], "sit_on": 0.53, "yaw": 0.0, @@ -2227,8 +2470,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - 0.485 + -0.14, + 3.435 ], "sit_on": 0.53, "yaw": 0.0, @@ -2245,8 +2488,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - 0.918 + -0.14, + 3.868 ], "sit_on": 0.53, "yaw": 0.0, @@ -2263,8 +2506,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - 0.052 + -0.14, + 3.002 ], "sit_on": 0.02, "yaw": 0.0, @@ -2281,8 +2524,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - 0.485 + -0.14, + 3.435 ], "sit_on": 0.02, "yaw": 0.0, @@ -2298,8 +2541,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - 0.918 + -0.14, + 3.868 ], "sit_on": 0.02, "yaw": 0.0, @@ -2316,8 +2559,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.159, - -1.248 + -0.009, + 1.702 ], "sit_on": 0.53, "yaw": 0.0, @@ -2334,8 +2577,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.159, - -0.815 + -0.009, + 2.135 ], "sit_on": 0.53, "yaw": 0.0, @@ -2352,8 +2595,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.159, - -0.382 + -0.009, + 2.568 ], "sit_on": 0.53, "yaw": 0.0, @@ -2370,8 +2613,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.159, - -1.248 + -0.009, + 1.702 ], "sit_on": 0.02, "yaw": 0.0, @@ -2388,8 +2631,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.159, - -0.815 + -0.009, + 2.135 ], "sit_on": 0.02, "yaw": 0.0, @@ -2405,8 +2648,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.159, - -0.382 + -0.009, + 2.568 ], "sit_on": 0.02, "yaw": 0.0, @@ -2423,8 +2666,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.165, - -0.555 + 0.985, + 2.395 ], "sit_on": 0.25, "yaw": 0.0, @@ -2440,8 +2683,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.775, - -0.555 + 1.375, + 2.395 ], "sit_on": 0.25, "yaw": 0.0, @@ -2457,8 +2700,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.165, - -0.195 + 0.985, + 2.755 ], "sit_on": 0.25, "yaw": 0.0, @@ -2475,8 +2718,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.775, - -0.195 + 1.375, + 2.755 ], "sit_on": 0.25, "yaw": 0.0, @@ -2493,8 +2736,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.165, - 0.165 + 0.985, + 3.115 ], "sit_on": 0.25, "yaw": 0.0, @@ -2511,8 +2754,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.775, - 0.165 + 1.375, + 3.115 ], "sit_on": 0.25, "yaw": 0.0, @@ -2529,8 +2772,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.165, - 0.525 + 0.985, + 3.475 ], "sit_on": 0.25, "yaw": 0.0, @@ -2547,8 +2790,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.775, - 0.525 + 1.375, + 3.475 ], "sit_on": 0.25, "yaw": 0.0, @@ -2565,8 +2808,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.165, - 0.885 + 0.985, + 3.835 ], "sit_on": 0.25, "yaw": 0.0, @@ -2582,8 +2825,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.775, - 0.885 + 1.375, + 3.835 ], "sit_on": 0.25, "yaw": 0.0, @@ -2600,8 +2843,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.165, - -0.555 + 0.985, + 2.395 ], "sit_on": 0.78, "yaw": 0.0, @@ -2618,8 +2861,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.775, - -0.555 + 1.375, + 2.395 ], "sit_on": 0.78, "yaw": 0.0, @@ -2636,8 +2879,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.165, - -0.195 + 0.985, + 2.755 ], "sit_on": 0.78, "yaw": 0.0, @@ -2654,8 +2897,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.775, - -0.195 + 1.375, + 2.755 ], "sit_on": 0.78, "yaw": 0.0, @@ -2672,8 +2915,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.165, - 0.165 + 0.985, + 3.115 ], "sit_on": 0.78, "yaw": 0.0, @@ -2690,8 +2933,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.775, - 0.165 + 1.375, + 3.115 ], "sit_on": 0.78, "yaw": 0.0, @@ -2708,8 +2951,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.165, - 0.525 + 0.985, + 3.475 ], "sit_on": 0.78, "yaw": 0.0, @@ -2726,8 +2969,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.775, - 0.525 + 1.375, + 3.475 ], "sit_on": 0.78, "yaw": 0.0, @@ -2744,8 +2987,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.165, - 0.885 + 0.985, + 3.835 ], "sit_on": 0.78, "yaw": 0.0, @@ -2762,8 +3005,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.775, - 0.885 + 1.375, + 3.835 ], "sit_on": 0.78, "yaw": 0.0, @@ -2780,8 +3023,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 3.004, - -4.775 + 6.154, + -1.825 ], "sit_on": 0.13, "yaw": 0.0, @@ -2798,8 +3041,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 3.004, - -4.255 + 6.154, + -1.305 ], "sit_on": 0.13, "yaw": 0.0, @@ -2816,8 +3059,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 3.004, - -3.735 + 6.154, + -0.785 ], "sit_on": 0.13, "yaw": 0.0, @@ -2834,8 +3077,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 3.004, - -4.84 + 6.154, + -1.89 ], "sit_on": 0.54, "yaw": 0.0, @@ -2852,8 +3095,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 3.004, - -4.45 + 6.154, + -1.5 ], "sit_on": 0.54, "yaw": 0.0, @@ -2870,8 +3113,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 3.004, - -4.06 + 6.154, + -1.11 ], "sit_on": 0.54, "yaw": 0.0, @@ -2888,8 +3131,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 3.004, - -3.67 + 6.154, + -0.72 ], "sit_on": 0.54, "yaw": 0.0, @@ -2906,8 +3149,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - -3.14 + -0.14, + -0.19 ], "sit_on": 0.54, "yaw": 0.0, @@ -2924,8 +3167,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - -2.75 + -0.14, + 0.2 ], "sit_on": 0.54, "yaw": 0.0, @@ -2942,8 +3185,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - -2.36 + -0.14, + 0.59 ], "sit_on": 0.54, "yaw": 0.0, @@ -2960,8 +3203,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - -1.97 + -0.14, + 0.98 ], "sit_on": 0.54, "yaw": 0.0, @@ -2978,8 +3221,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - -3.075 + -0.14, + -0.125 ], "sit_on": 0.13, "yaw": 0.0, @@ -2996,8 +3239,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - -2.555 + -0.14, + 0.395 ], "sit_on": 0.13, "yaw": 0.0, @@ -3014,8 +3257,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.29, - -2.035 + -0.14, + 0.915 ], "sit_on": 0.13, "yaw": 0.0, @@ -3032,8 +3275,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - -2.575 + 2.525, + 0.375 ], "sit_on": 0.25, "yaw": 0.0, @@ -3050,8 +3293,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - -2.575 + 2.915, + 0.375 ], "sit_on": 0.25, "yaw": 0.0, @@ -3068,8 +3311,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - -2.215 + 2.525, + 0.735 ], "sit_on": 0.25, "yaw": 0.0, @@ -3086,8 +3329,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - -2.215 + 2.915, + 0.735 ], "sit_on": 0.25, "yaw": 0.0, @@ -3104,8 +3347,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - -1.855 + 2.525, + 1.095 ], "sit_on": 0.25, "yaw": 0.0, @@ -3121,8 +3364,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - -1.855 + 2.915, + 1.095 ], "sit_on": 0.25, "yaw": 0.0, @@ -3139,8 +3382,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - -1.495 + 2.525, + 1.455 ], "sit_on": 0.25, "yaw": 0.0, @@ -3157,8 +3400,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - -1.495 + 2.915, + 1.455 ], "sit_on": 0.25, "yaw": 0.0, @@ -3175,8 +3418,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.625, - -1.135 + 2.525, + 1.815 ], "sit_on": 0.25, "yaw": 0.0, @@ -3193,8 +3436,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -0.235, - -1.135 + 2.915, + 1.815 ], "sit_on": 0.25, "yaw": 0.0, @@ -3211,8 +3454,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - -2.575 + 2.525, + 0.375 ], "sit_on": 0.78, "yaw": 0.0, @@ -3229,8 +3472,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - -2.575 + 2.915, + 0.375 ], "sit_on": 0.78, "yaw": 0.0, @@ -3247,8 +3490,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - -2.215 + 2.525, + 0.735 ], "sit_on": 0.78, "yaw": 0.0, @@ -3265,8 +3508,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - -2.215 + 2.915, + 0.735 ], "sit_on": 0.78, "yaw": 0.0, @@ -3283,8 +3526,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - -1.855 + 2.525, + 1.095 ], "sit_on": 0.78, "yaw": 0.0, @@ -3301,8 +3544,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - -1.855 + 2.915, + 1.095 ], "sit_on": 0.78, "yaw": 0.0, @@ -3319,8 +3562,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - -1.495 + 2.525, + 1.455 ], "sit_on": 0.78, "yaw": 0.0, @@ -3337,8 +3580,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - -1.495 + 2.915, + 1.455 ], "sit_on": 0.78, "yaw": 0.0, @@ -3355,8 +3598,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.625, - -1.135 + 2.525, + 1.815 ], "sit_on": 0.78, "yaw": 0.0, @@ -3373,8 +3616,8 @@ "glb": "crate", "kind": "wood", "at": [ - -0.235, - -1.135 + 2.915, + 1.815 ], "sit_on": 0.78, "yaw": 0.0, @@ -3391,8 +3634,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 1.352, - -4.225 + 4.502, + -1.275 ], "sit_on": 0.02, "yaw": 0.0, @@ -3409,8 +3652,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.522, - -4.225 + 5.671, + -1.275 ], "sit_on": 0.02, "yaw": 0.0, @@ -3427,8 +3670,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 1.742, - -4.225 + 4.891, + -1.275 ], "sit_on": 0.02, "yaw": 0.0, @@ -3445,8 +3688,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.131, - -4.225 + 5.282, + -1.275 ], "sit_on": 0.02, "yaw": 0.0, @@ -3463,8 +3706,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 1.352, - -4.225 + 4.502, + -1.275 ], "sit_on": 0.44, "yaw": 0.0, @@ -3481,8 +3724,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 1.742, - -4.225 + 4.891, + -1.275 ], "sit_on": 0.44, "yaw": 0.0, @@ -3499,8 +3742,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.131, - -4.225 + 5.282, + -1.275 ], "sit_on": 0.44, "yaw": 0.0, @@ -3517,8 +3760,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.522, - -4.225 + 5.671, + -1.275 ], "sit_on": 0.44, "yaw": 0.0, @@ -3535,8 +3778,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -3.274 + 6.034, + -0.324 ], "sit_on": 0.7, "yaw": 0.0, @@ -3553,8 +3796,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.899 + 6.034, + 0.051 ], "sit_on": 0.7, "yaw": 0.0, @@ -3571,8 +3814,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.524 + 6.034, + 0.426 ], "sit_on": 0.7, "yaw": 0.0, @@ -3589,8 +3832,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.149 + 6.034, + 0.801 ], "sit_on": 0.7, "yaw": 0.0, @@ -3607,8 +3850,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -3.274 + 6.034, + -0.324 ], "sit_on": 0.16, "yaw": 0.0, @@ -3625,8 +3868,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.899 + 6.034, + 0.051 ], "sit_on": 0.16, "yaw": 0.0, @@ -3643,8 +3886,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.524 + 6.034, + 0.426 ], "sit_on": 0.16, "yaw": 0.0, @@ -3661,8 +3904,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.149 + 6.034, + 0.801 ], "sit_on": 0.16, "yaw": 0.0, @@ -3679,8 +3922,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -3.274 + 6.034, + -0.324 ], "sit_on": 1.22, "yaw": 0.0, @@ -3697,8 +3940,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.899 + 6.034, + 0.051 ], "sit_on": 1.22, "yaw": 0.0, @@ -3715,8 +3958,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.524 + 6.034, + 0.426 ], "sit_on": 1.22, "yaw": 0.0, @@ -3733,8 +3976,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.884, - -2.149 + 6.034, + 0.801 ], "sit_on": 1.22, "yaw": 0.0, @@ -3751,8 +3994,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -3769,8 +4012,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -3787,8 +4030,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -3805,8 +4048,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -3823,8 +4066,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -3841,8 +4084,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -3859,8 +4102,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 0.62, - 1.545 + 3.77, + 4.495 ], "sit_on": 2.25, "yaw": 0.0, @@ -3877,8 +4120,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.62, - 1.231 + 5.77, + 4.181 ], "sit_on": 0.54, "yaw": 0.0, @@ -3895,8 +4138,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.62, - 1.621 + 5.77, + 4.571 ], "sit_on": 0.54, "yaw": 0.0, @@ -3913,8 +4156,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.62, - 2.011 + 5.77, + 4.961 ], "sit_on": 0.54, "yaw": 0.0, @@ -3931,8 +4174,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.62, - 2.401 + 5.77, + 5.351 ], "sit_on": 0.54, "yaw": 0.0, @@ -3949,8 +4192,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.62, - 1.296 + 5.77, + 4.246 ], "sit_on": 0.13, "yaw": 0.0, @@ -3967,8 +4210,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.62, - 1.816 + 5.77, + 4.766 ], "sit_on": 0.13, "yaw": 0.0, @@ -3985,8 +4228,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.62, - 2.336 + 5.77, + 5.286 ], "sit_on": 0.13, "yaw": 0.0, @@ -4003,8 +4246,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.73, - -3.655 + 1.42, + -0.705 ], "sit_on": 0.02, "yaw": 0.0, @@ -4020,8 +4263,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.45, - -3.85 + 0.7, + -0.9 ], "sit_on": 0.17, "yaw": 0.0, @@ -4038,8 +4281,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.73, - -3.655 + 1.42, + -0.705 ], "sit_on": 0.02, "yaw": 0.0, @@ -4055,8 +4298,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.09, - -3.85 + 1.06, + -0.9 ], "sit_on": 0.17, "yaw": 0.0, @@ -4073,8 +4316,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.73, - -3.85 + 1.42, + -0.9 ], "sit_on": 0.17, "yaw": 0.0, @@ -4091,8 +4334,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.37, - -3.85 + 1.78, + -0.9 ], "sit_on": 0.17, "yaw": 0.0, @@ -4108,8 +4351,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.01, - -3.85 + 2.14, + -0.9 ], "sit_on": 0.17, "yaw": 0.0, @@ -4125,8 +4368,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.45, - -3.46 + 0.7, + -0.51 ], "sit_on": 0.17, "yaw": 0.0, @@ -4143,8 +4386,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -2.09, - -3.46 + 1.06, + -0.51 ], "sit_on": 0.17, "yaw": 0.0, @@ -4161,8 +4404,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.73, - -3.46 + 1.42, + -0.51 ], "sit_on": 0.17, "yaw": 0.0, @@ -4179,8 +4422,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.37, - -3.46 + 1.78, + -0.51 ], "sit_on": 0.17, "yaw": 0.0, @@ -4196,8 +4439,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - -1.01, - -3.46 + 2.14, + -0.51 ], "sit_on": 0.17, "yaw": 0.0, @@ -4213,8 +4456,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.45, - -3.85 + 0.7, + -0.9 ], "sit_on": 0.9, "yaw": 0.0, @@ -4231,8 +4474,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.09, - -3.85 + 1.06, + -0.9 ], "sit_on": 0.9, "yaw": 0.0, @@ -4249,8 +4492,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.73, - -3.85 + 1.42, + -0.9 ], "sit_on": 0.9, "yaw": 0.0, @@ -4267,8 +4510,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.37, - -3.85 + 1.78, + -0.9 ], "sit_on": 0.9, "yaw": 0.0, @@ -4285,8 +4528,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.01, - -3.85 + 2.14, + -0.9 ], "sit_on": 0.9, "yaw": 0.0, @@ -4302,8 +4545,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.45, - -3.46 + 0.7, + -0.51 ], "sit_on": 0.9, "yaw": 0.0, @@ -4320,8 +4563,8 @@ "glb": "crate", "kind": "wood", "at": [ - -2.09, - -3.46 + 1.06, + -0.51 ], "sit_on": 0.9, "yaw": 0.0, @@ -4338,8 +4581,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.73, - -3.46 + 1.42, + -0.51 ], "sit_on": 0.9, "yaw": 0.0, @@ -4356,8 +4599,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.37, - -3.46 + 1.78, + -0.51 ], "sit_on": 0.9, "yaw": 0.0, @@ -4374,8 +4617,8 @@ "glb": "crate", "kind": "wood", "at": [ - -1.01, - -3.46 + 2.14, + -0.51 ], "sit_on": 0.9, "yaw": 0.0, @@ -4392,8 +4635,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.207, - -3.334 + 4.356, + -0.384 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4410,8 +4653,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.847, - -3.334 + 3.997, + -0.384 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4428,8 +4671,8 @@ "glb": "crate", "kind": "wood", "at": [ - 2.287, - -2.944 + 5.436, + 0.006 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4446,8 +4689,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.926, - -2.944 + 5.077, + 0.006 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4464,8 +4707,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.567, - -2.944 + 4.716, + 0.006 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4482,8 +4725,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.207, - -2.944 + 4.356, + 0.006 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4500,8 +4743,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.847, - -2.944 + 3.997, + 0.006 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4518,8 +4761,8 @@ "glb": "crate", "kind": "wood", "at": [ - 2.287, - -3.334 + 5.436, + -0.384 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4536,8 +4779,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.926, - -3.334 + 5.077, + -0.384 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4554,8 +4797,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.287, - -2.944 + 5.436, + 0.006 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4571,8 +4814,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.926, - -2.944 + 5.077, + 0.006 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4589,8 +4832,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.567, - -2.944 + 4.716, + 0.006 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4607,8 +4850,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.207, - -2.944 + 4.356, + 0.006 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4625,8 +4868,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 0.847, - -2.944 + 3.997, + 0.006 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4643,8 +4886,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.287, - -3.334 + 5.436, + -0.384 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4661,8 +4904,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.926, - -3.334 + 5.077, + -0.384 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4679,8 +4922,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.567, - -3.334 + 4.716, + -0.384 ], "sit_on": 0.17, "yaw": 3.1416, @@ -4697,8 +4940,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.567, - -3.334 + 4.716, + -0.384 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4715,8 +4958,8 @@ "glb": "crate", "kind": "wood", "at": [ - 1.207, - -3.334 + 4.356, + -0.384 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4733,8 +4976,8 @@ "glb": "crate", "kind": "wood", "at": [ - 0.847, - -3.334 + 3.997, + -0.384 ], "sit_on": 0.9, "yaw": 3.1416, @@ -4751,8 +4994,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.483 + 5.73, + 3.433 ], "sit_on": 1.22, "yaw": 0.0, @@ -4769,8 +5012,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.858 + 5.73, + 3.808 ], "sit_on": 1.22, "yaw": 0.0, @@ -4787,8 +5030,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -0.267 + 5.73, + 2.683 ], "sit_on": 1.22, "yaw": 0.0, @@ -4805,8 +5048,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.108 + 5.73, + 3.058 ], "sit_on": 1.22, "yaw": 0.0, @@ -4823,8 +5066,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -0.267 + 5.73, + 2.683 ], "sit_on": 0.16, "yaw": 0.0, @@ -4841,8 +5084,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.108 + 5.73, + 3.058 ], "sit_on": 0.16, "yaw": 0.0, @@ -4858,8 +5101,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.483 + 5.73, + 3.433 ], "sit_on": 0.16, "yaw": 0.0, @@ -4876,8 +5119,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.858 + 5.73, + 3.808 ], "sit_on": 0.16, "yaw": 0.0, @@ -4894,8 +5137,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -0.267 + 5.73, + 2.683 ], "sit_on": 0.7, "yaw": 0.0, @@ -4912,8 +5155,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.108 + 5.73, + 3.058 ], "sit_on": 0.7, "yaw": 0.0, @@ -4930,8 +5173,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.483 + 5.73, + 3.433 ], "sit_on": 0.7, "yaw": 0.0, @@ -4948,8 +5191,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - 0.858 + 5.73, + 3.808 ], "sit_on": 0.7, "yaw": 0.0, @@ -4966,8 +5209,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 3.872 + 6.285, + 6.822 ], "sit_on": 0.05, "yaw": 1.5708, @@ -4984,8 +5227,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 3.527 + 6.285, + 6.478 ], "sit_on": 0.05, "yaw": 1.5708, @@ -5002,8 +5245,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 3.182 + 6.285, + 6.132 ], "sit_on": 0.05, "yaw": 1.5708, @@ -5020,8 +5263,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 2.837 + 6.285, + 5.787 ], "sit_on": 0.05, "yaw": 1.5708, @@ -5038,8 +5281,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 3.872 + 6.285, + 6.822 ], "sit_on": 0.76, "yaw": 1.5708, @@ -5056,8 +5299,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 3.527 + 6.285, + 6.478 ], "sit_on": 0.76, "yaw": 1.5708, @@ -5074,8 +5317,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 3.182 + 6.285, + 6.132 ], "sit_on": 0.76, "yaw": 1.5708, @@ -5092,8 +5335,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.135, - 2.837 + 6.285, + 5.787 ], "sit_on": 0.76, "yaw": 1.5708, @@ -5110,8 +5353,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.661, - -4.755 + -0.511, + -1.921 ], "sit_on": 0.001, "yaw": 0.0, @@ -5128,8 +5371,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.576, - -4.755 + -0.426, + -1.921 ], "sit_on": 0.001, "yaw": 0.0, @@ -5146,8 +5389,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.491, - -4.755 + -0.341, + -1.921 ], "sit_on": 0.001, "yaw": 0.0, @@ -5164,8 +5407,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - -3.406, - -4.755 + -0.256, + -1.921 ], "sit_on": 0.001, "yaw": 0.0, @@ -5182,8 +5425,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.51, - 4.285 + 5.66, + 7.235 ], "sit_on": 0.76, "yaw": 3.1416, @@ -5200,8 +5443,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.262, - 4.285 + 6.412, + 7.235 ], "sit_on": 0.76, "yaw": 3.1416, @@ -5218,8 +5461,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.886, - 4.285 + 6.036, + 7.235 ], "sit_on": 0.76, "yaw": 3.1416, @@ -5236,8 +5479,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.134, - 4.285 + 5.284, + 7.235 ], "sit_on": 0.76, "yaw": 3.1416, @@ -5254,8 +5497,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.758, - 4.285 + 4.908, + 7.235 ], "sit_on": 0.76, "yaw": 3.1416, @@ -5272,8 +5515,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 3.262, - 4.285 + 6.412, + 7.235 ], "sit_on": 0.05, "yaw": 3.1416, @@ -5290,8 +5533,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.886, - 4.285 + 6.036, + 7.235 ], "sit_on": 0.05, "yaw": 3.1416, @@ -5308,8 +5551,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.51, - 4.285 + 5.66, + 7.235 ], "sit_on": 0.05, "yaw": 3.1416, @@ -5326,8 +5569,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 2.134, - 4.285 + 5.284, + 7.235 ], "sit_on": 0.05, "yaw": 3.1416, @@ -5344,8 +5587,8 @@ "glb": "store-crate-blue", "kind": "plastic", "at": [ - 1.758, - 4.285 + 4.908, + 7.235 ], "sit_on": 0.05, "yaw": 3.1416, @@ -5362,8 +5605,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.762 + 5.73, + 1.188 ], "sit_on": 0.16, "yaw": 0.0, @@ -5380,8 +5623,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.387 + 5.73, + 1.563 ], "sit_on": 0.16, "yaw": 0.0, @@ -5397,8 +5640,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.012 + 5.73, + 1.938 ], "sit_on": 0.16, "yaw": 0.0, @@ -5415,8 +5658,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -0.637 + 5.73, + 2.313 ], "sit_on": 0.16, "yaw": 0.0, @@ -5433,8 +5676,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.762 + 5.73, + 1.188 ], "sit_on": 0.7, "yaw": 0.0, @@ -5451,8 +5694,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.387 + 5.73, + 1.563 ], "sit_on": 0.7, "yaw": 0.0, @@ -5469,8 +5712,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.012 + 5.73, + 1.938 ], "sit_on": 0.7, "yaw": 0.0, @@ -5487,8 +5730,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -0.637 + 5.73, + 2.313 ], "sit_on": 0.7, "yaw": 0.0, @@ -5505,8 +5748,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.762 + 5.73, + 1.188 ], "sit_on": 1.22, "yaw": 0.0, @@ -5523,8 +5766,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.387 + 5.73, + 1.563 ], "sit_on": 1.22, "yaw": 0.0, @@ -5541,8 +5784,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -1.012 + 5.73, + 1.938 ], "sit_on": 1.22, "yaw": 0.0, @@ -5559,8 +5802,8 @@ "glb": "store-tub-white", "kind": "plastic", "at": [ - 2.58, - -0.637 + 5.73, + 2.313 ], "sit_on": 1.22, "yaw": 0.0, @@ -5572,6 +5815,852 @@ "frozen": true, "supported_by": "r21", "label": "90s HOUSE" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -5.615 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -5.615 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$5 - $10 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -5.275 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -5.275 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$5 - $10 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -4.935 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -4.935 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$5 - $10 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -4.595 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -4.595 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$5 - $10 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -4.255 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -4.255 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$5 - $10 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -3.915 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -3.915 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$5 - $10 HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -3.575 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\"S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -3.575 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$5 - $10 HIP-HOP 12\"S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -3.235 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\"S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.23, + -3.235 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "$12 - $15 HIP-HOP 12\"S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.63, + -2.895 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r53", + "label": "ELECTRO & OLD-SCHOOL" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.18, + -4.343 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.547, + -4.718 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.18, + -4.718 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -4.813, + -4.718 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.547, + -4.343 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -4.813, + -4.343 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.547, + -3.968 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.18, + -3.968 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -4.813, + -3.968 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.547, + -3.593 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -5.18, + -3.593 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -4.813, + -3.593 + ], + "sit_on": 0.85, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r54", + "label": "$20+ HIP-HOP 12\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.53, + -1.188 + ], + "sit_on": 0.4, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r55", + "label": "R&B" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.13, + -1.188 + ], + "sit_on": 0.4, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r55", + "label": "R&B" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.53, + -0.805 + ], + "sit_on": 0.4, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r55", + "label": "R&B" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.13, + -0.805 + ], + "sit_on": 0.4, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r55", + "label": "R&B" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.53, + -0.422 + ], + "sit_on": 0.4, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r55", + "label": "R&B" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -6.13, + -0.422 + ], + "sit_on": 0.4, + "yaw": 0.0, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r55", + "label": "R&B" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -2.968, + 0.226 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "HIP-HOP LP\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -3.343, + 0.226 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "HIP-HOP LP\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -3.718, + 0.226 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "JAPANESE HIP-HOP" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -4.093, + 0.226 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "INSTRUMENTAL & AUSSIE HIP-HOP" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -2.968, + -0.174 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "HIP-HOP LP\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -3.343, + -0.174 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "HIP-HOP LP\\'S" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -3.718, + -0.174 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "JAPANESE HIP-HOP" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -4.093, + -0.174 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.33, + 0.29, + 0.3 + ], + "frozen": true, + "supported_by": "r56", + "label": "JAPANESE HIP-HOP" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -0.322, + -1.539 + ], + "sit_on": 0.05, + "yaw": 3.1416, + "fit": [ + 0.34, + 0.34, + 0.4 + ], + "frozen": true, + "supported_by": "r44", + "label": "FREESTYLE" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -0.322, + -1.539 + ], + "sit_on": 0.45, + "yaw": 3.1416, + "fit": [ + 0.34, + 0.34, + 0.36 + ], + "frozen": true, + "supported_by": "r44", + "label": "HIP-HOUSE" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -0.322, + -1.539 + ], + "sit_on": 0.85, + "yaw": 3.1416, + "fit": [ + 0.34, + 0.34, + 0.26 + ], + "frozen": true, + "supported_by": "r44", + "label": "HIP-HOUSE" + }, + { + "glb": "store-crate-blue", + "kind": "plastic", + "at": [ + -0.322, + -1.539 + ], + "sit_on": 1.25, + "yaw": 3.1416, + "fit": [ + 0.34, + 0.34, + 0.2 + ], + "frozen": true, + "supported_by": "r44", + "label": "JAPANESE\r\nHIP HOP" } ] } \ No newline at end of file diff --git a/game/dev/probe_store.gd b/game/dev/probe_store.gd index bba7746..48d1d74 100644 --- a/game/dev/probe_store.gd +++ b/game/dev/probe_store.gd @@ -31,6 +31,43 @@ func _initialize() -> void: labelled += 1 print("racks holding bins: %d frozen bins: %d labelled bins: %d" % [ racks.size(), bins.size(), labelled]) + + # --- the four rooms, and that you can actually walk between them ------------------- + var spec: Dictionary = Levels.record_store() + var walls: Array = spec.get("walls", []) + var doors := 0 + for w in walls: + if (w as Dictionary).has("door"): + doors += 1 + print("interior walls: %d, of which %d have a doorway" % [walls.size(), doors]) + if doors < 3: + print("FAIL: the rooms are walled off from each other (need a door per portal)") + quit(1) + return + # spawn must be standing in open air, not inside a wall or a rack + var sp: Vector3 = spec["spawn"]["at"] + var space := main.get_viewport().world_3d.direct_space_state + var q := PhysicsShapeQueryParameters3D.new() + var cap := CapsuleShape3D.new() + cap.radius = 0.34 + cap.height = 1.7 + q.shape = cap + q.transform = Transform3D(Basis.IDENTITY, sp + Vector3(0, 0.9, 0)) + # the player is already standing here — that's the point, not an obstruction + var pl = main.get("_player") + if pl != null: + q.exclude = [(pl as CollisionObject3D).get_rid()] + var blocked := space.intersect_shape(q, 4) + var names := "" + for b in blocked: + var c = b.get("collider") + if c is Node: + names += " " + String((c as Node).name) + print("spawn at %s — %d bodies in the way:%s" % [sp.snappedf(0.01), blocked.size(), names]) + if blocked.size() > 0: + print("FAIL: spawn is inside geometry") + quit(1) + return if racks.is_empty() or bins.is_empty(): print("FAIL: the shop did not import (no racks holding bins)") quit(1) diff --git a/game/scripts/Levels.gd b/game/scripts/Levels.gd index 0a78bc9..83a39c5 100644 --- a/game/scripts/Levels.gd +++ b/game/scripts/Levels.gd @@ -764,6 +764,39 @@ static func record_store() -> Dictionary: "at": Vector3(float(at[0]), float(at[1]), float(at[2])), "mat": String(e.get("mat", "wood"))}) var sp: Array = data.get("spawn", {}).get("at", [0.0, 3.0]) + # The interior walls between the four rooms, with a gap wherever a doorway pierces + # one — the importer derives them from the shop's own portal graph. + var walls: Array = [] + for e in data.get("walls", []): + var wl: Dictionary = {"a": String(e.get("a", "x")), "at": float(e.get("at", 0.0)), + "from": float(e.get("from", 0.0)), "to": float(e.get("to", 0.0))} + if e.has("door"): + wl["door"] = float(e["door"]) + walls.append(wl) + # The street glazing goes on the entry hall's outer wall, because that is the way in. + var windows: Array = [] + for r in data.get("rooms", []): + if not String(r.get("name", "")).begins_with("entry"): + continue + var at: Array = r["at"] + var size: Array = r["size"] + var rx0: float = float(at[0]) + var rz0: float = float(at[1]) + if absf(rz0 - (-dp * 0.5)) < 0.2: + windows.append({"a": "z", "at": -dp * 0.5, "from": rx0 + 0.4, + "to": rx0 + float(size[0]) - 0.4, "y0": 0.6, "y1": 2.3, "blinds": false}) + + # a light every ~3 m across whatever footprint the four rooms came out as + var lx: Array = [] + var lz: Array = [] + var gx: float = -w * 0.5 + 1.6 + while gx < w * 0.5 - 0.6: + lx.append(gx) + gx += 3.0 + var gz: float = -dp * 0.5 + 1.6 + while gz < dp * 0.5 - 0.6: + lz.append(gz) + gz += 3.0 return { "name": "MONSTER ROBOT PARTY", @@ -777,11 +810,9 @@ static func record_store() -> Dictionary: }, "floor_style": "timber", "ceiling": "flat", - "walls": [], - # the shopfront: glazing down the street side, where the window display is - "windows": [{"a": "z", "at": dp * 0.5, "from": -w * 0.5, "to": w * 0.5, - "y0": 0.55, "y1": 2.45, "blinds": false}], - "lights": {"xs": [-1.9, 1.9], "zs": [-3.4, -1.1, 1.2, 3.5], + "walls": walls, + "windows": windows, + "lights": {"xs": lx, "zs": lz, "color": Color(1.0, 0.93, 0.86), "energy": 2.1, "style": "strip", "key_energy": 1.5}, "sun": {"color": Color(1.0, 0.95, 0.88), "energy": 0.9, "rot": Vector3(-38, 14, 0)}, diff --git a/tools/import_store.py b/tools/import_store.py index 292c773..a62a272 100644 --- a/tools/import_store.py +++ b/tools/import_store.py @@ -146,105 +146,177 @@ def audit(pieces, slop=0.004): return sorted(bad, reverse=True) +def stitch(rooms, portals, start): + """Lay every room out in one world by walking the portal graph. + + A portal pair is the same doorway seen from both sides, so placing room B against + room A means making B's portal land exactly on A's. In this shop every pair sits on + parallel walls with opposite facings, which makes each join a pure translation — + anything else would need a rotation, and we say so rather than quietly getting it + wrong. + """ + place = {start: (0.0, 0.0)} + order = [start] + warned = [] + while order: + sid = order.pop(0) + ox, oz = place[sid] + for p in portals.values(): + if p["space_id"] != sid or p["to_space"] in place: + continue + other = portals.get(p["links_to_id"]) + if other is None or other["space_id"] != p["to_space"]: + continue + fa = (p.get("facing_deg") or 0) % 360 + fb = (other.get("facing_deg") or 0) % 360 + if (fa + 180) % 360 != fb: + warned.append((p["id"], other["id"], fa, fb)) + # our portal in world space; theirs must land on it + wx, wz = p["x"] + ox, p["z"] + oz + place[p["to_space"]] = (wx - other["x"], wz - other["z"]) + order.append(p["to_space"]) + return place, warned + + +def room_walls(sid, room, off, portals, bounds, tol=0.08): + """A room's four walls, with a gap wherever a portal pierces one. + + Walls that sit on the level's outer boundary are skipped — Floorplan already builds + the shell from `bounds`, and a second wall in the same plane just z-fights it. + """ + ox, oz = off + x0, z0 = ox, oz + x1, z1 = ox + room["room_width"], oz + room["room_depth"] + bx0, bx1, bz0, bz1 = bounds + mine = [p for p in portals.values() if p["space_id"] == sid] + out = [] + # (axis, at, from, to, which local edge this is) + edges = [("x", x0, z0, z1, ("x", room and 0.0)), ("x", x1, z0, z1, ("x", room["room_width"])), + ("z", z0, x0, x1, ("z", 0.0)), ("z", z1, x0, x1, ("z", room["room_depth"]))] + for axis, at, a, b, (lax, lat) in edges: + if axis == "x" and (abs(at - bx0) < tol or abs(at - bx1) < tol): + continue + if axis == "z" and (abs(at - bz0) < tol or abs(at - bz1) < tol): + continue + w = {"a": axis, "at": round(at, 3), "from": round(a, 3), "to": round(b, 3)} + for p in mine: + # does this portal sit in this wall? compare in the room's local frame + local = p["x"] if lax == "x" else p["z"] + if abs(local - lat) < tol: + w["door"] = round((p["z"] + oz) if axis == "x" else (p["x"] + ox), 3) + break + out.append(w) + return out + + def main(): ap = argparse.ArgumentParser() ap.add_argument("--url", default=URL) - ap.add_argument("--offline") + ap.add_argument("--offline", help="a directory of scene_.json dumps") ap.add_argument("--out", default=str(OUT)) + ap.add_argument("--start", type=int, default=2, help="space id to anchor the layout on") args = ap.parse_args() - d = fetch(args.url, args.offline) - space = d["space"] - W, D, H = space["room_width"], space["room_depth"], space["ceiling_height"] - # The shop's origin is a room CORNER; the game centres bounds on 0. - cx, cz = W / 2.0, D / 2.0 + # --- every room, and the portal graph that joins them ------------------------------ + first = fetch(args.url, f"{args.offline}/scene_{args.start}.json" if args.offline else None) + ids = [s["id"] for s in first.get("spaces", [])] or [first["space"]["id"]] + scenes = {} + for sid in ids: + if sid == args.start: + scenes[sid] = first + elif args.offline: + scenes[sid] = fetch(None, f"{args.offline}/scene_{sid}.json") + else: + scenes[sid] = fetch(f"{args.url}?space={sid}", None) + rooms = {sid: sc["space"] for sid, sc in scenes.items()} + portals = {} + for sc in scenes.values(): + for p in sc["portals"]: + portals[p["id"]] = p - rack_types = {t["id"]: t for t in d["rack_types"]} - crate_types = {c["id"]: c for c in d["crate_types"]} - levels = {} - for l in d["rack_type_levels"]: - levels.setdefault(l["rack_type_id"], {})[l.get("level_index")] = l + place, warned = stitch(rooms, portals, args.start) + for a, b, fa, fb in warned: + print(f"[import_store] WARNING portals {a}/{b} face {fa}/{fb} — not opposite, " + f"the join may need a rotation this importer does not do") + for sid in ids: + if sid not in place: + print(f"[import_store] WARNING space {sid} is not reachable through any portal " + f"— left out of the level") - racks = [r for r in d["racks"] - if r.get("visible") == "y" and r.get("space_id") == space["id"]] - crates_by_rack = {} - for c in d["crates"]: - if c.get("visible") == "y" and c.get("rack_id"): - crates_by_rack.setdefault(c["rack_id"], []).append(c) + # --- the union footprint, recentred on the origin ------------------------------------ + xs = [place[s][0] for s in place] + [place[s][0] + rooms[s]["room_width"] for s in place] + zs = [place[s][1] for s in place] + [place[s][1] + rooms[s]["room_depth"] for s in place] + ux0, ux1, uz0, uz1 = min(xs), max(xs), min(zs), max(zs) + cx, cz = (ux0 + ux1) * 0.5, (uz0 + uz1) * 0.5 + for s in place: + place[s] = (place[s][0] - cx, place[s][1] - cz) + bounds = (ux0 - cx, ux1 - cx, uz0 - cz, uz1 - cz) + ceiling = max(r.get("ceiling_height") or 2.8 for r in rooms.values()) - pieces, slabs, footprints = [], [], [] - n_crates = 0 - stock = 0 + pieces, slabs, footprints, walls = [], [], [], [] + n_crates = stock = 0 - for r in racks: - t = rack_types.get(r["rack_type_id"]) - if not t: - continue - name = t.get("name", "") - x, z = r["pos_x"] - cx, r["pos_z"] - cz - yaw = math.radians(r.get("rotation_y") or 0.0) - tw, th, td = t.get("width", 0.5), t.get("height", 0.5), t.get("depth", 0.5) + for sid in place: + sc = scenes[sid] + off = place[sid] + walls += room_walls(sid, rooms[sid], off, portals, bounds) + rack_types = {t["id"]: t for t in sc["rack_types"]} + crate_types = {c["id"]: c for c in sc["crate_types"]} + racks = [r for r in sc["racks"] + if r.get("visible") == "y" and r.get("space_id") == sid] + crates_by_rack = {} + for c in sc["crates"]: + if c.get("visible") == "y" and c.get("rack_id"): + crates_by_rack.setdefault(c["rack_id"], []).append(c) - if name in AS_SLAB: - # benches, wall shelves and the roof beam: structure, not props - slabs.append({"size": [max(tw, 0.05), max(th, 0.04), max(td, 0.05)], - "at": [round(x, 3), round(max(th, 0.04) / 2.0 + (r.get("pos_y") or 0.0), 3), - round(z, 3)], - "mat": "wood" if "guy" in name or "wall" in name else "trim"}) - continue + for r in racks: + t = rack_types.get(r["rack_type_id"]) + if not t: + continue + name = t.get("name", "") + x, z = r["pos_x"] + off[0], r["pos_z"] + off[1] + yaw = math.radians(r.get("rotation_y") or 0.0) + tw, th, td = t.get("width", 0.5), t.get("height", 0.5), t.get("depth", 0.5) + base = r.get("pos_y") or 0.0 + if name in AS_SLAB: + slabs.append({"size": [max(tw, 0.05), max(th, 0.04), max(td, 0.05)], + "at": [round(x, 3), round(max(th, 0.04) / 2.0 + base, 3), + round(z, 3)], + "mat": "wood" if "guy" in name or "wall" in name else "trim"}) + continue + glb, kind = RACK_GLB.get(name, ("store-rack-wide", "wood")) + pieces.append({"kind_of": "rack", "glb": glb, "kind": kind, + "id": f"r{r['id']}", "x": x, "z": z, "y": base, "yaw": yaw, + "w": 8.0, "room": sid, + "fit": [max(tw, 0.05), max(th, 0.05), max(td, 0.05)], + "name": r.get("name") or name, + "rack": r, "rot": r.get("rotation_y") or 0.0, + "crates": crates_by_rack.get(r["id"], []), + "ctypes": crate_types}) - glb, kind = RACK_GLB.get(name, ("store-rack-wide", "wood")) - rid = f"r{r['id']}" - # "fit": the archetype's REAL dimensions. 21 archetypes share a handful of - # stand-in meshes, so the mesh's own size is a lie — the shop's table is the truth. - # pos_y is the piece's BOTTOM in the shop's data — the same thing sit_on means to - # the game. Without it the ceiling beams, the aircon and the wall shelves all get - # dropped onto the floor, where they stand inside the floor racks. - base = r.get("pos_y") or 0.0 - pieces.append({"kind_of": "rack", "glb": glb, "kind": kind, "id": rid, - "x": x, "z": z, "y": base, "yaw": yaw, "w": 8.0, - "fit": [max(tw, 0.05), max(th, 0.05), max(td, 0.05)], - "name": r.get("name") or name, - "rack": r, "rot": r.get("rotation_y") or 0.0}) - - # Separate the RACKS only, before their bins are placed, so a rack and everything it - # carries move together. Bins are deliberately NOT separated from their own rack: a - # bin sitting in a rack is cargo inside a container, which is what the shop means and - # what the game wants. They spawn frozen, and the overlap audit skips frozen bodies - # precisely because a frozen body cannot be depenetrated across the room. moved = resolve_overlaps(pieces, iters=400) - # A few racks in the real shop are genuinely wedged — three big units in a row that - # cannot all fit without shoving the aisle around. An archetype's width is a NOMINAL - # envelope, so take a centimetre and a half off each side of every rack's footprint: - # invisible at any distance, and it buys the solver the clearance it needs. Heights - # are untouched, so nothing sinks into the floor or leaves the ceiling. INSET = 0.03 for p in pieces: if p["kind_of"] == "rack": p["fit"][0] = max(p["fit"][0] - INSET, 0.05) p["fit"][2] = max(p["fit"][2] - INSET, 0.05) - left = audit(pieces) - for depth, na, nb in left[:6]: - print(f"[import_store] STILL OVERLAPPING {depth * 100:.0f} cm: {na} / {nb}") for p in [p for p in pieces if p["kind_of"] == "rack"]: r = p["rack"] - for c in crates_by_rack.get(r["id"], []): - ct = crate_types.get(c["crate_type_id"], {}) + for c in p["crates"]: + ct = p["ctypes"].get(c["crate_type_id"], {}) cname = ct.get("name", "") if cname in SKIP_CRATE_TYPES: continue - # crate pos is LOCAL to its rack (pos_y already carries the shelf height) lx, lz = rot_y(c.get("pos_x") or 0.0, c.get("pos_z") or 0.0, p["rot"]) cglb, ckind = CRATE_GLB.get(cname, CRATE_DEFAULT) e = {"kind_of": "crate", "glb": cglb, "kind": ckind, "x": p["x"] + lx, "z": p["z"] + lz, "y": (r.get("pos_y") or 0.0) + (c.get("pos_y") or 0.0), - "yaw": p["yaw"], "w": 1.0, + "yaw": p["yaw"], "w": 1.0, "supported_by": p["id"], "room": p["room"], "fit": [max(ct.get("width") or 0.3, 0.05), max(ct.get("height") or 0.3, 0.05), - max(ct.get("depth") or 0.3, 0.05)], - "supported_by": p["id"]} + max(ct.get("depth") or 0.3, 0.05)]} label = (c.get("label_text") or "").strip() if label and label != "---": e["label"] = label @@ -252,10 +324,13 @@ def main(): n_crates += 1 stock += c.get("n_items") or 0 + left = audit([p for p in pieces if p["kind_of"] == "rack"]) + for depth, na, nb in left[:6]: + print(f"[import_store] STILL OVERLAPPING {depth * 100:.0f} cm: {na} / {nb}") + smashables = [] for p in pieces: - e = {"glb": p["glb"], "kind": p["kind"], - "at": [round(p["x"], 3), round(p["z"], 3)], + e = {"glb": p["glb"], "kind": p["kind"], "at": [round(p["x"], 3), round(p["z"], 3)], "sit_on": round(p["y"], 3), "yaw": round(p["yaw"], 4), "fit": [round(v, 3) for v in p["fit"]]} if p["kind_of"] == "rack": @@ -265,51 +340,50 @@ def main(): footprints.append((p["x"], p["z"], max(p["fit"][0], p["fit"][2]) * 0.5 + 0.35)) else: - # frozen + supported: bins don't jitter at spawn (the stillness gate stays - # green) and they go live exactly when their rack does e["frozen"] = True e["supported_by"] = p["supported_by"] if p.get("label"): e["label"] = p["label"] smashables.append(e) - # --- a measured spawn point --------------------------------------------------------- - # 35 racks in a 6.66 x 9.51 room leaves very little open floor, and spawning inside a - # rack is not a level. Scan a grid for the clearest spot in the front half of the shop. - best, best_clear = (0.0, D / 2.0 - 0.9), -1.0 - step = 0.25 - x0, x1 = -cx + 0.6, cx - 0.6 - z0, z1 = -cz + 0.6, cz - 0.6 - gx = x0 - while gx <= x1: - gz = z0 - while gz <= z1: - clear = min(((gx - fx) ** 2 + (gz - fz) ** 2) ** 0.5 - fr - for fx, fz, fr in footprints) if footprints else 9.9 - # prefer the front of the shop (larger z), where the door is - score = clear + (gz + cz) * 0.05 - if clear > 0.55 and score > best_clear: - best_clear, best = score, (gx, gz) - gz += step - gx += step + # --- spawn: the entry hall is where you actually walk in ---------------------------- + hub = None + for sid in place: + if rooms[sid]["name"].startswith("entry"): + hub = sid + if hub is None: + hub = args.start + hx, hz = place[hub] + best = (hx + rooms[hub]["room_width"] * 0.5, hz + rooms[hub]["room_depth"] * 0.5) + best_clear = min((((best[0] - fx) ** 2 + (best[1] - fz) ** 2) ** 0.5 - fr) + for fx, fz, fr in footprints) if footprints else 9.9 out = { - "_source": args.url if not args.offline else args.offline, + "_source": args.offline or args.url, "_note": "GENERATED by tools/import_store.py from the live shop. Do not hand-edit.", - "room": {"w": W, "d": D, "h": H}, - "counts": {"racks": len(racks), "crates": n_crates, "stock_records": stock, - "slabs": len(slabs)}, + "room": {"w": bounds[1] - bounds[0], "d": bounds[3] - bounds[2], "h": ceiling}, + "rooms": [{"id": s, "name": rooms[s]["name"], + "at": [round(place[s][0], 3), round(place[s][1], 3)], + "size": [rooms[s]["room_width"], rooms[s]["room_depth"]]} + for s in place], + "counts": {"rooms": len(place), + "racks": len([p for p in pieces if p["kind_of"] == "rack"]), + "crates": n_crates, "stock_records": stock, "slabs": len(slabs)}, "spawn": {"at": [round(best[0], 2), round(best[1], 2)]}, + "walls": walls, "slabs": slabs, "smashables": smashables, } p = pathlib.Path(args.out) p.write_text(json.dumps(out, indent=1)) - print(f"[import_store] room {W} x {D} x {H}") + print(f"[import_store] {len(place)} rooms stitched: " + + ", ".join(rooms[s]["name"] for s in place)) + print(f"[import_store] footprint {out['room']['w']:.2f} x {out['room']['d']:.2f} x {ceiling}") print(f"[import_store] separation pass moved {moved:.2f} m total") - print(f"[import_store] {len(racks)} racks, {n_crates} crates, {len(slabs)} slabs, " - f"{stock:,} records of stock") - print(f"[import_store] spawn at ({best[0]:.2f}, {best[1]:.2f}), clearance {best_clear:.2f} m") + print(f"[import_store] {out['counts']['racks']} racks, {n_crates} crates, " + f"{len(walls)} interior walls, {stock:,} records of stock") + print(f"[import_store] spawn in {rooms[hub]['name']} at ({best[0]:.2f}, {best[1]:.2f}), " + f"clearance {best_clear:.2f} m") print(f"[import_store] -> {p} ({p.stat().st_size / 1024:.0f} KB)") return 0