diff --git a/art/zones/rusty-creek/blockout/rcz-0-0.png b/art/zones/rusty-creek/blockout/rcz-0-0.png index 1e5145a..e4447f4 100644 Binary files a/art/zones/rusty-creek/blockout/rcz-0-0.png and b/art/zones/rusty-creek/blockout/rcz-0-0.png differ diff --git a/art/zones/rusty-creek/blockout/rcz-1-0.png b/art/zones/rusty-creek/blockout/rcz-1-0.png index 2b98798..5d009e3 100644 Binary files a/art/zones/rusty-creek/blockout/rcz-1-0.png and b/art/zones/rusty-creek/blockout/rcz-1-0.png differ diff --git a/art/zones/rusty-creek/blockout/rcz-2-0.png b/art/zones/rusty-creek/blockout/rcz-2-0.png index 048bc83..b51673b 100644 Binary files a/art/zones/rusty-creek/blockout/rcz-2-0.png and b/art/zones/rusty-creek/blockout/rcz-2-0.png differ diff --git a/art/zones/rusty-creek/boards.json b/art/zones/rusty-creek/boards.json new file mode 100644 index 0000000..9d12a66 --- /dev/null +++ b/art/zones/rusty-creek/boards.json @@ -0,0 +1,139 @@ +{ + "name": "Rusty Creek zone – grow boards", + "readme": "Routes for growing the creek's level row sideways from the approved start chunk (grow_stage.py).", + "model": "gpt-image-2.5-sunburst", + "size": "2160x720", + "style": "LOOK: continue the finished art exactly - detailed hi-bit pixel art with a fine 2-pixel grain, warm autumn palette, low golden morning light: the rusty blue-green riveted railway girder, ivy-covered concrete piers, autumn trees and hazy campus buildings behind, the cement creek path with its grey pipe railing, the stone bank wall, the calm creek with reflections. Strict side view, an architect's elevation: everything runs parallel to the screen, nothing recedes. The hero is about 114 px tall here: a railing is about 50 px, a doorway about 120 px, a ladder rung step about 12 px. TONE: secret horror - calm and pretty first. No text, no logos, no UI.", + "people": "No people, no animals, no plush toys and no characters of any kind: this is an empty stage the game puts its characters into.", + "boards": [ + { + "id": "rcz-0-1", + "inputs": [], + "prompt": "The approved start chunk (cut from the #227 concept); only features are painted into it.", + "route": { + "walk": [ + [ + [ + 0, + 522 + ], + [ + 2160, + 522 + ] + ] + ], + "water": [ + [ + 0, + 600, + 2160, + 720 + ] + ], + "ladder": [ + [ + 300, + 214, + 390, + 522 + ] + ] + } + }, + { + "id": "rcz-1-1", + "inputs": [], + "prompt": "The cement creek path with its grey pipe railing continues at the same height, the stone bank wall under it, the calm creek with reflections along the bottom, the railway girder on its piers continues across the top, autumn trees and hazy campus buildings behind. One more concrete pier with ivy holds the girder near the middle; a steel ladder climbs that pier from the path up to the girder's maintenance walk. A park bench on the path near the right edge.", + "route": { + "walk": [ + [ + [ + 0, + 522 + ], + [ + 2160, + 522 + ] + ] + ], + "water": [ + [ + 0, + 600, + 2160, + 720 + ] + ], + "ladder": [ + [ + 1090, + 0, + 1120, + 522 + ] + ], + "structure": [ + [ + 1800, + 470, + 1950, + 522 + ] + ] + } + }, + { + "id": "rcz-2-1", + "inputs": [], + "prompt": "The cement creek path with its grey pipe railing continues at the same height, the stone bank wall under it, the calm creek with reflections along the bottom, the railway girder on its piers continues across the top, autumn trees and hazy campus buildings behind. A park bench on the path near the left edge. Below the path, a round concrete culvert mouth opens in the bank wall at the water line, a caged bulkhead lamp glowing inside. Near the right edge a steel ladder climbs a pier up to the girder, and a round manhole shaft with a ladder drops from the path down into the dark.", + "route": { + "walk": [ + [ + [ + 0, + 522 + ], + [ + 2160, + 522 + ] + ] + ], + "water": [ + [ + 0, + 600, + 2160, + 720 + ] + ], + "structure": [ + [ + 150, + 470, + 300, + 522 + ] + ], + "hollow": [ + [ + 330, + 542, + 490, + 640 + ] + ], + "ladder": [ + [ + 1700, + 214, + 1810, + 522 + ] + ] + } + } + ] +} diff --git a/art/zones/rusty-creek/collision/rcz-0-0.collision.json b/art/zones/rusty-creek/collision/rcz-0-0.collision.json index 902b921..5227caa 100644 --- a/art/zones/rusty-creek/collision/rcz-0-0.collision.json +++ b/art/zones/rusty-creek/collision/rcz-0-0.collision.json @@ -1,72 +1,655 @@ { "chunk": "rcz-0-0", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 ], - "walk": [], - "slide": [], - "oneWay": [ + "walk": [ [ [ - 240, - 408 + 80, + 327 ], [ - 1176, - 408 + 128, + 327 + ], + [ + 176, + 327 + ], + [ + 224, + 327 + ], + [ + 272, + 327 + ], + [ + 280, + 331 + ], + [ + 288, + 334 + ], + [ + 296, + 338 + ], + [ + 304, + 342 + ] + ], + [ + [ + 132, + 522 + ], + [ + 148, + 523 + ], + [ + 172, + 524 + ], + [ + 180, + 524 + ], + [ + 228, + 524 + ], + [ + 276, + 524 + ], + [ + 324, + 524 + ], + [ + 372, + 524 + ], + [ + 420, + 524 + ], + [ + 468, + 524 + ], + [ + 516, + 524 + ], + [ + 564, + 524 + ], + [ + 612, + 524 + ], + [ + 644, + 525 + ], + [ + 660, + 525 + ], + [ + 684, + 526 + ], + [ + 708, + 526 + ], + [ + 740, + 527 + ], + [ + 756, + 527 + ], + [ + 772, + 528 + ], + [ + 780, + 528 + ] + ], + [ + [ + 360, + 206 + ], + [ + 408, + 206 + ], + [ + 440, + 207 + ], + [ + 456, + 207 + ], + [ + 472, + 208 + ], + [ + 496, + 209 + ], + [ + 504, + 209 + ], + [ + 520, + 210 + ], + [ + 544, + 210 ] ], [ [ - 1272, - 360 + 2092, + 57 + ], + [ + 2100, + 56 + ], + [ + 2124, + 55 + ], + [ + 2132, + 54 + ], + [ + 2140, + 54 + ], + [ + 2156, + 53 ], [ 2160, - 360 + 53 ] ], [ [ - 1560, - 192 + 412, + 0 + ], + [ + 460, + 0 + ], + [ + 508, + 0 + ], + [ + 556, + 0 + ], + [ + 604, + 0 + ], + [ + 652, + 0 + ], + [ + 676, + 0 + ] + ], + [ + [ + 544, + 193 ], [ - 1980, + 552, 192 + ], + [ + 560, + 191 + ], + [ + 568, + 190 + ], + [ + 584, + 189 + ], + [ + 592, + 188 + ], + [ + 600, + 187 + ], + [ + 608, + 186 + ], + [ + 624, + 185 + ], + [ + 632, + 184 + ], + [ + 640, + 183 + ], + [ + 648, + 181 + ], + [ + 656, + 179 + ], + [ + 664, + 177 + ], + [ + 672, + 175 + ], + [ + 680, + 173 + ], + [ + 688, + 171 + ], + [ + 696, + 162 + ], + [ + 704, + 154 + ] + ], + [ + [ + 676, + 21 + ], + [ + 724, + 21 + ], + [ + 772, + 21 + ], + [ + 820, + 21 + ], + [ + 868, + 21 + ], + [ + 916, + 21 + ], + [ + 964, + 21 + ], + [ + 1012, + 21 + ], + [ + 1060, + 21 + ], + [ + 1108, + 21 + ], + [ + 1156, + 21 + ], + [ + 1204, + 21 + ], + [ + 1252, + 21 + ], + [ + 1300, + 21 + ], + [ + 1348, + 21 + ], + [ + 1396, + 21 + ], + [ + 1444, + 21 + ], + [ + 1492, + 21 + ], + [ + 1540, + 21 + ], + [ + 1588, + 21 + ], + [ + 1612, + 20 + ], + [ + 1636, + 20 + ], + [ + 1652, + 19 + ], + [ + 1676, + 18 + ], + [ + 1684, + 18 + ], + [ + 1704, + 18 + ] + ], + [ + [ + 880, + 471 + ], + [ + 896, + 472 + ], + [ + 920, + 473 + ], + [ + 928, + 473 + ], + [ + 976, + 473 + ], + [ + 1024, + 473 + ], + [ + 1072, + 473 + ], + [ + 1120, + 473 + ], + [ + 1136, + 473 + ] + ], + [ + [ + 1136, + 456 + ], + [ + 1144, + 454 + ], + [ + 1152, + 453 + ], + [ + 1160, + 451 + ], + [ + 1168, + 449 + ], + [ + 1176, + 448 + ], + [ + 1184, + 446 + ], + [ + 1200, + 447 + ], + [ + 1224, + 448 + ], + [ + 1232, + 448 + ], + [ + 1280, + 448 + ], + [ + 1328, + 448 + ], + [ + 1376, + 448 + ], + [ + 1400, + 447 + ], + [ + 1408, + 447 + ] + ], + [ + [ + 1440, + 287 + ], + [ + 1488, + 287 + ], + [ + 1536, + 287 + ], + [ + 1584, + 287 + ], + [ + 1632, + 287 + ], + [ + 1680, + 287 + ], + [ + 1728, + 287 + ], + [ + 1776, + 287 + ], + [ + 1824, + 287 + ], + [ + 1872, + 287 + ], + [ + 1920, + 287 + ], + [ + 1968, + 287 + ], + [ + 2016, + 287 + ], + [ + 2064, + 287 + ], + [ + 2112, + 287 + ], + [ + 2160, + 287 + ] + ], + [ + [ + 1704, + 0 + ], + [ + 1752, + 0 + ], + [ + 1800, + 0 + ], + [ + 1848, + 0 + ], + [ + 1896, + 0 + ], + [ + 1916, + 0 + ] + ], + [ + [ + 1916, + 21 + ], + [ + 1940, + 22 + ], + [ + 1964, + 22 + ], + [ + 2012, + 22 + ], + [ + 2044, + 23 + ], + [ + 2060, + 23 + ], + [ + 2092, + 23 ] ] ], + "slide": [], + "oneWay": [], "climb": [ { - "x": 512, - "y": 408, - "w": 32, - "h": 312, - "kind": "ladder" - }, - { - "x": 1604, - "y": 192, - "w": 32, - "h": 168, - "kind": "ladder" + "x": 1619, + "y": 23, + "w": 33, + "h": 697, + "kind": "ladder", + "id": "rcz-0-0-ladder-1" } ], "solid": [], "noGo": [], "hazard": [], - "interact": [ - { - "id": "rcz-0-0-glint", - "kind": "secret", - "x": 1920, - "y": 152, - "w": 40, - "h": 40, - "note": "a glint at the high girder's end" - } - ] + "interact": [], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-0-1.collision.json b/art/zones/rusty-creek/collision/rcz-0-1.collision.json index 188dd67..d41eb89 100644 --- a/art/zones/rusty-creek/collision/rcz-0-1.collision.json +++ b/art/zones/rusty-creek/collision/rcz-0-1.collision.json @@ -1,6 +1,6 @@ { "chunk": "rcz-0-1", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 @@ -9,41 +9,21 @@ [ [ 0, - 480 + 522 ], [ - 1080, - 480 - ] - ], - [ - [ - 1080, - 528 - ], - [ - 1944, - 528 - ] - ], - [ - [ - 1200, - 528 - ], - [ - 1824, - 528 + 2160, + 522 ] ], [ [ - 1944, - 552 + 0, + 62 ], [ 2160, - 552 + 62 ] ] ], @@ -51,49 +31,25 @@ "oneWay": [], "climb": [ { - "x": 512, - "y": 0, - "w": 32, - "h": 480, - "kind": "ladder" - }, - { - "x": 512, - "y": 480, - "w": 32, - "h": 240, - "kind": "ladder" - } - ], - "solid": [ - { - "x": 0, - "y": 0, - "w": 24, - "h": 720, - "kind": "wall" + "x": 330, + "y": 54, + "w": 42, + "h": 468, + "kind": "ladder", + "id": "rcz-0-1-pier-ladder" } ], + "solid": [], "noGo": [ { - "x": 1200, - "y": 558, - "w": 624, - "h": 162, - "kind": "water", - "note": "water: never floor" + "x": 0, + "y": 600, + "w": 2160, + "h": 120, + "kind": "water" } ], "hazard": [], - "interact": [ - { - "id": "rcz-0-1-bench", - "kind": "rest", - "x": 458, - "y": 430, - "w": 140, - "h": 50, - "note": "a bench on the creek path \u2013 sit, the music settles" - } - ] + "interact": [], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-0-2.collision.json b/art/zones/rusty-creek/collision/rcz-0-2.collision.json index 63139a2..2eaaae1 100644 --- a/art/zones/rusty-creek/collision/rcz-0-2.collision.json +++ b/art/zones/rusty-creek/collision/rcz-0-2.collision.json @@ -1,6 +1,6 @@ { "chunk": "rcz-0-2", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 @@ -9,126 +9,234 @@ [ [ 0, - 624 + 196 ], [ - 720, - 624 + 16, + 197 + ], + [ + 40, + 198 + ], + [ + 48, + 198 + ], + [ + 56, + 198 ] ], [ + [ + 0, + 164 + ], + [ + 32, + 163 + ], + [ + 48, + 163 + ], + [ + 88, + 162 + ], + [ + 96, + 162 + ], + [ + 144, + 162 + ], + [ + 192, + 162 + ], + [ + 240, + 162 + ], + [ + 288, + 162 + ], + [ + 336, + 162 + ], + [ + 384, + 162 + ], + [ + 432, + 162 + ], + [ + 480, + 162 + ], + [ + 528, + 162 + ], + [ + 576, + 162 + ], + [ + 624, + 162 + ], + [ + 672, + 162 + ], [ 720, - 600 + 162 ], [ - 1488, - 600 - ] - ], - [ + 768, + 162 + ], + [ + 816, + 162 + ], + [ + 864, + 162 + ], + [ + 912, + 162 + ], + [ + 960, + 162 + ], + [ + 1008, + 162 + ], + [ + 1056, + 162 + ], + [ + 1104, + 162 + ], + [ + 1152, + 162 + ], + [ + 1200, + 162 + ], + [ + 1248, + 162 + ], + [ + 1296, + 162 + ], + [ + 1344, + 162 + ], + [ + 1392, + 162 + ], + [ + 1440, + 162 + ], [ 1488, - 648 + 162 ], [ - 2160, - 648 - ] - ] - ], - "slide": [], - "oneWay": [ - [ + 1536, + 162 + ], [ - 240, - 384 + 1584, + 162 ], [ - 1176, - 384 - ] - ], - [ + 1632, + 162 + ], [ - 1272, - 432 + 1680, + 162 ], [ - 2160, - 432 - ] - ], - [ + 1728, + 162 + ], + [ + 1776, + 162 + ], + [ + 1824, + 162 + ], + [ + 1872, + 162 + ], + [ + 1920, + 162 + ], + [ + 1968, + 162 + ], + [ + 2016, + 162 + ], + [ + 2064, + 162 + ], [ - 1560, - 480 + 2112, + 162 ], [ - 1980, - 480 + 2160, + 162 ] ] ], - "climb": [ - { - "x": 776, - "y": 384, - "w": 32, - "h": 216, - "kind": "ladder" - }, - { - "x": 1664, - "y": 432, - "w": 32, - "h": 216, - "kind": "ladder" - }, - { - "x": 1736, - "y": 480, - "w": 32, - "h": 168, - "kind": "ladder" - }, - { - "x": 512, - "y": 0, - "w": 32, - "h": 624, - "kind": "ladder" - } - ], - "solid": [ - { - "x": 0, - "y": 0, - "w": 24, - "h": 720, - "kind": "wall" - } - ], + "slide": [], + "oneWay": [], + "climb": [], + "solid": [], "noGo": [ { "x": 0, - "y": 0, + "y": 331, "w": 2160, - "h": 150, - "kind": "water", - "note": "water: never floor" + "h": 389, + "kind": "water" } ], "hazard": [], - "interact": [ - { - "id": "rcz-0-2-lamp", - "kind": "secret", - "x": 240, - "y": 564, - "w": 60, - "h": 60, - "note": "a lit service room: lockers, a desk, a hanging lamp" - } - ] + "interact": [], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-1-0.collision.json b/art/zones/rusty-creek/collision/rcz-1-0.collision.json index 9e60197..69c3ca3 100644 --- a/art/zones/rusty-creek/collision/rcz-1-0.collision.json +++ b/art/zones/rusty-creek/collision/rcz-1-0.collision.json @@ -1,72 +1,813 @@ { "chunk": "rcz-1-0", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 ], - "walk": [], - "slide": [], - "oneWay": [ + "walk": [ [ [ 0, - 360 + 60 ], [ - 840, - 360 + 48, + 60 + ], + [ + 80, + 59 + ], + [ + 96, + 59 + ], + [ + 144, + 59 + ] + ], + [ + [ + 0, + 648 + ], + [ + 24, + 647 + ], + [ + 48, + 647 + ], + [ + 72, + 646 + ], + [ + 96, + 646 + ], + [ + 144, + 646 + ], + [ + 192, + 646 + ], + [ + 240, + 648 + ], + [ + 248, + 650 + ], + [ + 256, + 652 + ], + [ + 264, + 655 + ], + [ + 272, + 657 + ], + [ + 280, + 659 + ], + [ + 288, + 659 + ], + [ + 336, + 659 + ], + [ + 384, + 659 + ], + [ + 432, + 659 + ], + [ + 480, + 659 + ], + [ + 528, + 659 + ], + [ + 576, + 659 + ], + [ + 624, + 659 + ], + [ + 672, + 660 + ], + [ + 680, + 661 ] ], [ + [ + 164, + 333 + ], + [ + 180, + 332 + ], + [ + 204, + 331 + ], + [ + 212, + 331 + ], + [ + 260, + 331 + ], + [ + 308, + 331 + ], + [ + 356, + 331 + ], + [ + 404, + 331 + ], + [ + 452, + 331 + ], + [ + 500, + 331 + ], + [ + 548, + 331 + ], + [ + 596, + 331 + ], + [ + 644, + 331 + ], + [ + 692, + 331 + ], + [ + 740, + 331 + ], + [ + 788, + 331 + ], + [ + 836, + 331 + ], + [ + 884, + 331 + ], + [ + 932, + 331 + ], + [ + 980, + 331 + ], + [ + 1028, + 331 + ], + [ + 1076, + 331 + ], + [ + 1124, + 331 + ], + [ + 1172, + 331 + ], + [ + 1220, + 331 + ], + [ + 1268, + 331 + ], + [ + 1316, + 331 + ], + [ + 1364, + 331 + ], + [ + 1412, + 331 + ], + [ + 1460, + 331 + ], + [ + 1508, + 331 + ], + [ + 1556, + 331 + ], + [ + 1604, + 331 + ], + [ + 1652, + 331 + ], + [ + 1700, + 331 + ], + [ + 1724, + 332 + ], + [ + 1748, + 332 + ], + [ + 1796, + 332 + ], + [ + 1828, + 331 + ], + [ + 1844, + 331 + ], + [ + 1860, + 331 + ] + ], + [ + [ + 264, + 0 + ], + [ + 312, + 0 + ], + [ + 360, + 0 + ], + [ + 408, + 0 + ], + [ + 456, + 0 + ], + [ + 504, + 0 + ], + [ + 552, + 0 + ], + [ + 600, + 0 + ], + [ + 648, + 0 + ], + [ + 696, + 0 + ], + [ + 744, + 0 + ], + [ + 792, + 0 + ], + [ + 840, + 0 + ], + [ + 888, + 0 + ], [ 936, - 456 + 0 + ], + [ + 984, + 0 + ], + [ + 1032, + 0 + ], + [ + 1080, + 0 + ], + [ + 1128, + 0 + ], + [ + 1176, + 0 + ], + [ + 1224, + 0 + ], + [ + 1272, + 0 + ], + [ + 1320, + 0 + ], + [ + 1368, + 0 + ], + [ + 1416, + 0 + ], + [ + 1464, + 0 + ], + [ + 1512, + 0 + ], + [ + 1560, + 0 + ], + [ + 1608, + 0 + ], + [ + 1656, + 0 + ], + [ + 1704, + 0 + ], + [ + 1752, + 0 + ], + [ + 1800, + 0 + ], + [ + 1848, + 0 + ], + [ + 1896, + 0 + ], + [ + 1944, + 0 + ], + [ + 1992, + 0 + ], + [ + 2040, + 0 + ], + [ + 2088, + 0 + ], + [ + 2136, + 0 ], [ 2160, - 456 + 0 ] ], [ [ - 336, - 192 + 264, + 163 + ], + [ + 312, + 163 + ], + [ + 360, + 163 + ], + [ + 408, + 163 + ], + [ + 432, + 162 + ], + [ + 456, + 162 + ], + [ + 504, + 162 + ], + [ + 520, + 161 + ], + [ + 544, + 160 + ], + [ + 552, + 160 + ], + [ + 600, + 160 + ], + [ + 648, + 160 + ], + [ + 696, + 160 + ], + [ + 744, + 160 + ], + [ + 760, + 161 + ], + [ + 768, + 162 + ], + [ + 776, + 162 + ] + ], + [ + [ + 868, + 536 + ], + [ + 916, + 536 + ], + [ + 964, + 536 + ], + [ + 1012, + 536 + ], + [ + 1060, + 536 + ], + [ + 1108, + 536 + ], + [ + 1156, + 536 + ], + [ + 1204, + 536 + ], + [ + 1252, + 536 ], [ - 756, - 192 + 1300, + 536 + ], + [ + 1348, + 536 + ], + [ + 1396, + 536 + ], + [ + 1444, + 536 + ], + [ + 1492, + 536 + ], + [ + 1540, + 536 + ], + [ + 1588, + 536 + ], + [ + 1612, + 536 + ] + ], + [ + [ + 968, + 186 + ], + [ + 984, + 185 + ], + [ + 1008, + 184 + ], + [ + 1016, + 184 + ], + [ + 1064, + 184 + ], + [ + 1112, + 184 + ], + [ + 1160, + 184 + ], + [ + 1208, + 184 + ], + [ + 1256, + 184 + ], + [ + 1304, + 184 + ], + [ + 1352, + 184 + ], + [ + 1400, + 184 + ], + [ + 1448, + 184 + ], + [ + 1496, + 184 + ], + [ + 1544, + 184 + ], + [ + 1592, + 184 + ], + [ + 1640, + 184 + ], + [ + 1688, + 184 + ], + [ + 1736, + 184 + ], + [ + 1784, + 184 + ], + [ + 1832, + 184 + ], + [ + 1840, + 185 + ] + ], + [ + [ + 1628, + 659 + ], + [ + 1644, + 658 + ], + [ + 1668, + 657 + ], + [ + 1676, + 657 + ], + [ + 1700, + 658 + ], + [ + 1724, + 658 + ], + [ + 1736, + 658 + ] + ], + [ + [ + 2084, + 658 + ], + [ + 2132, + 658 + ], + [ + 2160, + 658 + ] + ], + [ + [ + 1736, + 605 + ], + [ + 1784, + 605 + ], + [ + 1832, + 605 + ], + [ + 1880, + 605 + ], + [ + 1928, + 605 + ], + [ + 1976, + 605 + ], + [ + 2024, + 605 + ], + [ + 2084, + 605 + ] + ], + [ + [ + 1912, + 378 + ], + [ + 1960, + 378 + ], + [ + 2008, + 378 + ], + [ + 2056, + 378 + ], + [ + 2104, + 378 + ], + [ + 2152, + 378 + ], + [ + 2160, + 378 ] ] ], + "slide": [], + "oneWay": [], "climb": [ { - "x": 1088, - "y": 456, - "w": 32, - "h": 264, - "kind": "ladder" - }, - { - "x": 380, - "y": 192, - "w": 32, - "h": 168, - "kind": "ladder" + "x": 1878, + "y": 22, + "w": 19, + "h": 698, + "kind": "ladder", + "id": "rcz-1-0-ladder-0" } ], "solid": [], "noGo": [], "hazard": [], - "interact": [ - { - "id": "rcz-1-0-glint", - "kind": "secret", - "x": 696, - "y": 152, - "w": 40, - "h": 40, - "note": "a glint at the high girder's end" - } - ] + "interact": [], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-1-1.collision.json b/art/zones/rusty-creek/collision/rcz-1-1.collision.json index 339130d..eaa129a 100644 --- a/art/zones/rusty-creek/collision/rcz-1-1.collision.json +++ b/art/zones/rusty-creek/collision/rcz-1-1.collision.json @@ -1,6 +1,6 @@ { "chunk": "rcz-1-1", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 @@ -9,31 +9,21 @@ [ [ 0, - 552 + 522 ], [ - 1728, - 552 - ] - ], - [ - [ - 336, - 552 - ], - [ - 936, - 552 + 2160, + 522 ] ], [ [ - 1728, - 528 + 0, + 63 ], [ 2160, - 528 + 63 ] ] ], @@ -41,34 +31,25 @@ "oneWay": [], "climb": [ { - "x": 1088, - "y": 0, - "w": 32, - "h": 552, - "kind": "ladder" + "x": 1062, + "y": 55, + "w": 44, + "h": 467, + "kind": "ladder", + "id": "rcz-1-1-pier-ladder" } ], "solid": [], "noGo": [ { - "x": 336, - "y": 582, - "w": 600, - "h": 138, - "kind": "water", - "note": "water: never floor" + "x": 0, + "y": 600, + "w": 2160, + "h": 120, + "kind": "water" } ], "hazard": [], - "interact": [ - { - "id": "rcz-1-1-bench", - "kind": "rest", - "x": 1874, - "y": 478, - "w": 140, - "h": 50, - "note": "a bench on the creek path \u2013 sit, the music settles" - } - ] + "interact": [], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-1-2.collision.json b/art/zones/rusty-creek/collision/rcz-1-2.collision.json index a96c0d0..ff80072 100644 --- a/art/zones/rusty-creek/collision/rcz-1-2.collision.json +++ b/art/zones/rusty-creek/collision/rcz-1-2.collision.json @@ -1,6 +1,6 @@ { "chunk": "rcz-1-2", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 @@ -9,111 +9,53 @@ [ [ 0, - 648 + 197 ], [ - 768, - 648 - ] - ], - [ - [ - 768, - 648 + 1960, + 197 ], [ - 1368, - 648 - ] - ], - [ - [ - 1368, - 648 - ], - [ - 2016, - 648 - ] - ], - [ - [ - 2016, - 624 + 2050, + 270 ], [ 2160, - 624 + 278 ] ] ], "slide": [], - "oneWay": [ - [ - [ - 0, - 432 - ], - [ - 840, - 432 - ] - ], - [ - [ - 936, - 336 - ], - [ - 2160, - 336 - ] - ], - [ - [ - 336, - 480 - ], - [ - 756, - 480 - ] - ] - ], + "oneWay": [], "climb": [ { - "x": 440, - "y": 432, - "w": 32, + "x": 896, + "y": 0, + "w": 18, "h": 216, - "kind": "ladder" + "kind": "ladder", + "id": "rcz-1-2-ladder-4" }, { - "x": 1064, - "y": 336, - "w": 32, - "h": 312, - "kind": "ladder" - }, - { - "x": 440, - "y": 480, - "w": 32, - "h": 168, - "kind": "ladder" + "x": 1249, + "y": 0, + "w": 18, + "h": 217, + "kind": "ladder", + "id": "rcz-1-2-ladder-5" } ], "solid": [], "noGo": [ { "x": 0, - "y": 0, + "y": 584, "w": 2160, - "h": 150, - "kind": "water", - "note": "water: never floor" + "h": 136, + "kind": "water" } ], "hazard": [], - "interact": [] + "interact": [], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-2-0.collision.json b/art/zones/rusty-creek/collision/rcz-2-0.collision.json index 0b2a3fc..d1ab40d 100644 --- a/art/zones/rusty-creek/collision/rcz-2-0.collision.json +++ b/art/zones/rusty-creek/collision/rcz-2-0.collision.json @@ -1,82 +1,647 @@ { "chunk": "rcz-2-0", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 ], - "walk": [], - "slide": [], - "oneWay": [ + "walk": [ [ [ 0, - 456 + 0 + ], + [ + 48, + 0 + ], + [ + 96, + 0 + ], + [ + 144, + 0 + ], + [ + 192, + 0 + ], + [ + 228, + 0 + ] + ], + [ + [ + 0, + 378 + ], + [ + 48, + 378 + ], + [ + 96, + 378 + ], + [ + 168, + 378 + ] + ], + [ + [ + 120, + 550 + ], + [ + 128, + 544 + ], + [ + 136, + 539 + ], + [ + 144, + 534 + ], + [ + 152, + 528 + ], + [ + 160, + 522 + ], + [ + 168, + 517 + ], + [ + 216, + 517 + ], + [ + 224, + 518 + ], + [ + 248, + 519 + ], + [ + 256, + 520 + ], + [ + 264, + 520 + ], + [ + 272, + 526 + ] + ], + [ + [ + 228, + 66 + ], + [ + 276, + 66 + ], + [ + 324, + 66 + ], + [ + 372, + 66 + ], + [ + 420, + 66 + ], + [ + 448, + 66 + ] + ], + [ + [ + 644, + 66 + ], + [ + 692, + 66 + ], + [ + 740, + 66 + ], + [ + 788, + 66 + ], + [ + 836, + 66 ], [ - 624, - 456 + 884, + 66 + ], + [ + 932, + 66 + ], + [ + 980, + 66 + ], + [ + 1028, + 66 + ], + [ + 1076, + 66 ] ], [ [ - 672, - 480 + 168, + 302 + ], + [ + 216, + 302 + ], + [ + 248, + 303 + ], + [ + 264, + 303 + ], + [ + 312, + 303 + ], + [ + 360, + 303 + ], + [ + 408, + 303 + ], + [ + 456, + 303 + ], + [ + 504, + 303 ], [ - 1320, - 480 + 552, + 303 + ], + [ + 576, + 302 + ], + [ + 600, + 302 + ], + [ + 632, + 302 ] ], [ [ - 1368, - 432 + 448, + 0 + ], + [ + 496, + 0 + ], + [ + 544, + 0 ], [ - 1944, - 432 + 592, + 0 + ], + [ + 644, + 0 ] ], [ + [ + 696, + 371 + ], + [ + 704, + 372 + ], + [ + 728, + 373 + ], + [ + 736, + 374 + ], + [ + 744, + 374 + ], + [ + 752, + 375 + ], + [ + 768, + 376 + ], + [ + 776, + 377 + ], [ 792, - 264 + 378 + ], + [ + 840, + 378 + ], + [ + 888, + 378 + ], + [ + 936, + 378 + ], + [ + 984, + 378 + ], + [ + 1032, + 378 + ], + [ + 1040, + 377 + ], + [ + 1056, + 376 + ], + [ + 1064, + 375 + ], + [ + 1080, + 374 + ] + ], + [ + [ + 1076, + 0 + ], + [ + 1124, + 0 + ], + [ + 1172, + 0 + ], + [ + 1180, + 7 + ], + [ + 1188, + 14 + ], + [ + 1196, + 20 + ], + [ + 1204, + 27 ], [ 1212, - 264 + 34 + ], + [ + 1220, + 41 + ], + [ + 1228, + 45 + ], + [ + 1236, + 49 + ], + [ + 1244, + 54 + ], + [ + 1252, + 58 + ], + [ + 1260, + 62 + ], + [ + 1268, + 66 + ], + [ + 1316, + 66 + ], + [ + 1364, + 66 + ], + [ + 1392, + 66 + ] + ], + [ + [ + 1392, + 0 + ], + [ + 1440, + 0 + ], + [ + 1488, + 0 + ], + [ + 1536, + 0 + ], + [ + 1584, + 0 + ], + [ + 1632, + 0 + ], + [ + 1640, + 0 + ] + ], + [ + [ + 1420, + 444 + ], + [ + 1436, + 445 + ], + [ + 1460, + 446 + ], + [ + 1468, + 446 + ], + [ + 1484, + 447 + ], + [ + 1508, + 448 + ], + [ + 1516, + 448 + ], + [ + 1532, + 449 + ], + [ + 1556, + 450 + ], + [ + 1564, + 450 + ], + [ + 1580, + 451 + ], + [ + 1604, + 452 + ], + [ + 1612, + 452 + ], + [ + 1660, + 452 + ], + [ + 1708, + 452 + ], + [ + 1756, + 452 + ], + [ + 1804, + 452 + ], + [ + 1852, + 452 + ], + [ + 1900, + 452 + ], + [ + 1948, + 452 + ], + [ + 1956, + 451 + ], + [ + 1964, + 450 + ], + [ + 1972, + 448 + ], + [ + 1980, + 447 + ], + [ + 1988, + 446 + ], + [ + 1996, + 445 + ], + [ + 2004, + 446 + ], + [ + 2020, + 447 + ], + [ + 2028, + 448 + ], + [ + 2044, + 449 + ], + [ + 2052, + 450 + ], + [ + 2068, + 451 + ], + [ + 2076, + 452 + ], + [ + 2092, + 453 + ], + [ + 2108, + 452 + ], + [ + 2132, + 451 + ], + [ + 2140, + 451 + ], + [ + 2156, + 450 + ], + [ + 2160, + 450 + ] + ], + [ + [ + 1652, + 90 + ], + [ + 1700, + 90 + ], + [ + 1748, + 90 + ], + [ + 1796, + 90 + ], + [ + 1844, + 90 + ], + [ + 1892, + 90 + ], + [ + 1940, + 90 + ], + [ + 1988, + 90 + ], + [ + 2036, + 90 + ], + [ + 2084, + 90 ] ] ], + "slide": [], + "oneWay": [], "climb": [ { - "x": 1736, - "y": 432, - "w": 32, - "h": 288, - "kind": "ladder" - }, - { - "x": 836, - "y": 264, - "w": 32, - "h": 216, - "kind": "ladder" + "x": 708, + "y": 65, + "w": 34, + "h": 655, + "kind": "ladder", + "id": "rcz-2-0-ladder-1" } ], "solid": [], "noGo": [], "hazard": [], - "interact": [ - { - "id": "rcz-2-0-glint", - "kind": "secret", - "x": 1152, - "y": 224, - "w": 40, - "h": 40, - "note": "a glint at the high girder's end" - } - ] + "interact": [], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-2-1.collision.json b/art/zones/rusty-creek/collision/rcz-2-1.collision.json index 8d90396..8b0d1c1 100644 --- a/art/zones/rusty-creek/collision/rcz-2-1.collision.json +++ b/art/zones/rusty-creek/collision/rcz-2-1.collision.json @@ -1,6 +1,6 @@ { "chunk": "rcz-2-1", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 @@ -9,41 +9,21 @@ [ [ 0, - 528 + 522 ], [ - 576, - 528 - ] - ], - [ - [ - 576, - 504 - ], - [ - 1968, - 504 - ] - ], - [ - [ - 672, - 504 - ], - [ - 1296, - 504 + 2160, + 522 ] ], [ [ - 1968, - 504 + 0, + 65 ], [ 2160, - 504 + 65 ] ] ], @@ -51,58 +31,36 @@ "oneWay": [], "climb": [ { - "x": 1736, - "y": 0, - "w": 32, - "h": 504, - "kind": "ladder" - }, - { - "x": 1688, - "y": 504, - "w": 32, - "h": 216, - "kind": "ladder" - } - ], - "solid": [ - { - "x": 2136, - "y": 0, - "w": 24, - "h": 720, - "kind": "wall" + "x": 1706, + "y": 57, + "w": 50, + "h": 465, + "kind": "ladder", + "id": "rcz-2-1-pier-ladder" } ], + "solid": [], "noGo": [ { - "x": 672, - "y": 534, - "w": 624, - "h": 186, - "kind": "water", - "note": "water: never floor" + "x": 0, + "y": 600, + "w": 2160, + "h": 120, + "kind": "water" } ], "hazard": [], "interact": [ { - "id": "rcz-2-1-chest", - "kind": "secret", - "x": 382, - "y": 488, - "w": 60, - "h": 40, - "note": "a culvert mouth in the bank, a lamp inside" - }, - { - "id": "rcz-2-1-bench", - "kind": "rest", - "x": 218, - "y": 478, - "w": 140, - "h": 50, - "note": "a bench on the creek path \u2013 sit, the music settles" + "x": 340, + "y": 446, + "w": 130, + "h": 76, + "kind": "door", + "id": "culvert", + "to": "drain-door", + "note": "The lit culvert mouth in the bank: down into the drains." } - ] + ], + "spawn": [] } diff --git a/art/zones/rusty-creek/collision/rcz-2-2.collision.json b/art/zones/rusty-creek/collision/rcz-2-2.collision.json index 5a442e3..2775c7e 100644 --- a/art/zones/rusty-creek/collision/rcz-2-2.collision.json +++ b/art/zones/rusty-creek/collision/rcz-2-2.collision.json @@ -1,6 +1,6 @@ { "chunk": "rcz-2-2", - "state": "anomaly", + "state": "clean", "size": [ 2160, 720 @@ -9,126 +9,603 @@ [ [ 0, - 624 + 283 ], [ - 576, - 624 + 48, + 283 + ], + [ + 64, + 284 + ], + [ + 88, + 285 + ], + [ + 96, + 285 + ], + [ + 104, + 282 + ], + [ + 112, + 279 + ], + [ + 120, + 276 ] ], [ [ - 576, - 624 + 212, + 236 + ], + [ + 244, + 235 + ], + [ + 260, + 235 ], [ - 1248, - 624 + 268, + 236 + ], + [ + 276, + 238 + ], + [ + 284, + 239 + ], + [ + 292, + 240 + ], + [ + 300, + 242 + ], + [ + 308, + 243 + ], + [ + 324, + 242 + ], + [ + 336, + 242 ] ], [ [ - 1248, - 648 + 336, + 233 ], [ - 2160, - 648 - ] - ] - ], - "slide": [], - "oneWay": [ - [ + 352, + 234 + ], [ - 0, - 336 + 376, + 235 + ], + [ + 384, + 235 + ], + [ + 432, + 235 + ], + [ + 440, + 233 + ], + [ + 448, + 231 + ], + [ + 456, + 228 + ], + [ + 464, + 226 + ], + [ + 472, + 224 + ], + [ + 480, + 222 + ], + [ + 528, + 222 + ], + [ + 576, + 222 + ], + [ + 584, + 224 + ], + [ + 592, + 225 + ], + [ + 600, + 227 + ], + [ + 608, + 229 + ], + [ + 616, + 230 ], [ 624, - 336 + 232 + ], + [ + 632, + 234 + ], + [ + 640, + 237 + ], + [ + 648, + 240 + ], + [ + 664, + 242 ] ], [ [ - 672, - 312 + 664, + 234 + ], + [ + 696, + 233 + ], + [ + 712, + 233 + ], + [ + 720, + 234 + ], + [ + 728, + 236 + ], + [ + 736, + 238 ], [ - 1320, - 312 + 744, + 239 + ], + [ + 752, + 240 + ], + [ + 760, + 242 + ], + [ + 772, + 242 ] ], [ [ - 1368, - 336 + 772, + 232 + ], + [ + 804, + 233 + ], + [ + 820, + 233 + ], + [ + 868, + 233 + ], + [ + 916, + 233 + ], + [ + 964, + 233 + ], + [ + 988, + 232 + ], + [ + 1012, + 232 + ], + [ + 1060, + 232 + ], + [ + 1108, + 232 + ], + [ + 1156, + 232 + ], + [ + 1204, + 232 + ], + [ + 1252, + 232 + ], + [ + 1260, + 234 + ], + [ + 1268, + 235 + ], + [ + 1276, + 237 + ], + [ + 1284, + 239 + ], + [ + 1292, + 240 + ], + [ + 1300, + 242 + ], + [ + 1308, + 240 + ], + [ + 1316, + 239 + ], + [ + 1324, + 238 + ], + [ + 1332, + 236 + ], + [ + 1340, + 234 ], [ - 1944, - 336 + 1348, + 233 + ], + [ + 1372, + 234 + ], + [ + 1396, + 234 + ], + [ + 1404, + 233 + ], + [ + 1412, + 232 + ], + [ + 1428, + 231 + ], + [ + 1436, + 230 + ], + [ + 1444, + 229 + ], + [ + 1452, + 228 + ], + [ + 1460, + 226 + ], + [ + 1468, + 225 + ], + [ + 1476, + 224 + ], + [ + 1484, + 222 + ], + [ + 1492, + 221 + ], + [ + 1540, + 221 + ], + [ + 1588, + 221 + ], + [ + 1596, + 224 + ], + [ + 1604, + 227 + ], + [ + 1612, + 230 + ], + [ + 1620, + 232 + ], + [ + 1628, + 235 + ], + [ + 1636, + 238 + ], + [ + 1644, + 237 + ], + [ + 1652, + 236 + ], + [ + 1668, + 235 + ], + [ + 1676, + 234 + ], + [ + 1684, + 233 + ], + [ + 1700, + 232 + ], + [ + 1724, + 231 + ], + [ + 1732, + 231 + ], + [ + 1740, + 233 + ], + [ + 1748, + 235 + ], + [ + 1756, + 236 + ], + [ + 1764, + 238 + ], + [ + 1772, + 240 + ], + [ + 1780, + 242 + ], + [ + 1788, + 240 + ], + [ + 1796, + 239 + ], + [ + 1804, + 238 + ], + [ + 1812, + 236 + ], + [ + 1820, + 234 + ], + [ + 1828, + 233 + ], + [ + 1852, + 232 + ], + [ + 1876, + 232 + ], + [ + 1908, + 231 + ], + [ + 1924, + 231 + ], + [ + 1948, + 232 + ], + [ + 1972, + 232 + ], + [ + 1988, + 233 + ], + [ + 1996, + 234 + ], + [ + 2020, + 235 + ], + [ + 2028, + 236 + ], + [ + 2044, + 237 + ], + [ + 2052, + 238 + ], + [ + 2068, + 239 + ], + [ + 2076, + 240 + ], + [ + 2100, + 241 + ], + [ + 2108, + 242 + ], + [ + 2116, + 242 + ], + [ + 2124, + 240 + ], + [ + 2132, + 239 + ], + [ + 2140, + 237 + ], + [ + 2148, + 235 + ], + [ + 2156, + 234 + ], + [ + 2160, + 233 ] ] ], - "climb": [ - { - "x": 320, - "y": 336, - "w": 32, - "h": 288, - "kind": "ladder" - }, - { - "x": 872, - "y": 312, - "w": 32, - "h": 312, - "kind": "ladder" - }, - { - "x": 1856, - "y": 336, - "w": 32, - "h": 312, - "kind": "ladder" - }, - { - "x": 1688, - "y": 0, - "w": 32, - "h": 648, - "kind": "ladder" - } - ], - "solid": [ - { - "x": 2136, - "y": 0, - "w": 24, - "h": 720, - "kind": "wall" - } - ], + "slide": [], + "oneWay": [], + "climb": [], + "solid": [], "noGo": [ { "x": 0, - "y": 0, + "y": 612, "w": 2160, - "h": 150, - "kind": "water", - "note": "water: never floor" + "h": 108, + "kind": "water" } ], "hazard": [], "interact": [ { - "id": "rcz-2-2-lamp", - "kind": "secret", - "x": 1860, - "y": 588, - "w": 60, - "h": 60, - "note": "a lit service room: lockers, a desk, a hanging lamp" + "x": 340, + "y": 159, + "w": 130, + "h": 76, + "kind": "door", + "id": "drain-door", + "to": "culvert", + "note": "Back up through the culvert to the creek path." } - ] + ], + "spawn": [] } diff --git a/art/zones/rusty-creek/images/rcz-0-0.png b/art/zones/rusty-creek/images/rcz-0-0.png new file mode 100644 index 0000000..ffb1458 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-0-0.png differ diff --git a/art/zones/rusty-creek/images/rcz-0-1.png b/art/zones/rusty-creek/images/rcz-0-1.png new file mode 100644 index 0000000..c4e3c86 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-0-1.png differ diff --git a/art/zones/rusty-creek/images/rcz-0-2.png b/art/zones/rusty-creek/images/rcz-0-2.png new file mode 100644 index 0000000..d7978b1 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-0-2.png differ diff --git a/art/zones/rusty-creek/images/rcz-1-0.png b/art/zones/rusty-creek/images/rcz-1-0.png new file mode 100644 index 0000000..fecfbc1 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-1-0.png differ diff --git a/art/zones/rusty-creek/images/rcz-1-1.png b/art/zones/rusty-creek/images/rcz-1-1.png new file mode 100644 index 0000000..d51ae86 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-1-1.png differ diff --git a/art/zones/rusty-creek/images/rcz-1-2.png b/art/zones/rusty-creek/images/rcz-1-2.png new file mode 100644 index 0000000..851ff85 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-1-2.png differ diff --git a/art/zones/rusty-creek/images/rcz-2-0.png b/art/zones/rusty-creek/images/rcz-2-0.png new file mode 100644 index 0000000..a2571b6 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-2-0.png differ diff --git a/art/zones/rusty-creek/images/rcz-2-1.png b/art/zones/rusty-creek/images/rcz-2-1.png new file mode 100644 index 0000000..6bf1919 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-2-1.png differ diff --git a/art/zones/rusty-creek/images/rcz-2-2.png b/art/zones/rusty-creek/images/rcz-2-2.png new file mode 100644 index 0000000..b9ec391 Binary files /dev/null and b/art/zones/rusty-creek/images/rcz-2-2.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-0.00-sky.png b/art/zones/rusty-creek/masks/rcz-0-0.00-sky.png new file mode 100644 index 0000000..ac6a675 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-0.00-sky.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-0.01-far.png b/art/zones/rusty-creek/masks/rcz-0-0.01-far.png new file mode 100644 index 0000000..f7ff52a Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-0.01-far.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-0.02-mid.png b/art/zones/rusty-creek/masks/rcz-0-0.02-mid.png new file mode 100644 index 0000000..00b9938 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-0.02-mid.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-0.04-water.png b/art/zones/rusty-creek/masks/rcz-0-0.04-water.png new file mode 100644 index 0000000..a6bc2d8 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-0.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-0.05-play.png b/art/zones/rusty-creek/masks/rcz-0-0.05-play.png new file mode 100644 index 0000000..da27bf6 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-0.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-0.07-foreground.png b/art/zones/rusty-creek/masks/rcz-0-0.07-foreground.png new file mode 100644 index 0000000..d876044 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-0.07-foreground.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-1.00-sky.png b/art/zones/rusty-creek/masks/rcz-0-1.00-sky.png new file mode 100644 index 0000000..da877b8 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-1.00-sky.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-1.01-far.png b/art/zones/rusty-creek/masks/rcz-0-1.01-far.png new file mode 100644 index 0000000..d03b98b Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-1.01-far.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-1.02-mid.png b/art/zones/rusty-creek/masks/rcz-0-1.02-mid.png new file mode 100644 index 0000000..6a17988 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-1.02-mid.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-1.04-water.png b/art/zones/rusty-creek/masks/rcz-0-1.04-water.png new file mode 100644 index 0000000..c950aef Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-1.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-1.05-play.png b/art/zones/rusty-creek/masks/rcz-0-1.05-play.png new file mode 100644 index 0000000..3500ca5 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-1.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-1.07-foreground.png b/art/zones/rusty-creek/masks/rcz-0-1.07-foreground.png new file mode 100644 index 0000000..5ff79f8 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-1.07-foreground.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-2.04-water.png b/art/zones/rusty-creek/masks/rcz-0-2.04-water.png new file mode 100644 index 0000000..7395f42 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-2.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-0-2.05-play.png b/art/zones/rusty-creek/masks/rcz-0-2.05-play.png new file mode 100644 index 0000000..5b40f76 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-0-2.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-0.00-sky.png b/art/zones/rusty-creek/masks/rcz-1-0.00-sky.png new file mode 100644 index 0000000..e33a85e Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-0.00-sky.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-0.01-far.png b/art/zones/rusty-creek/masks/rcz-1-0.01-far.png new file mode 100644 index 0000000..78c52cf Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-0.01-far.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-0.02-mid.png b/art/zones/rusty-creek/masks/rcz-1-0.02-mid.png new file mode 100644 index 0000000..3d2638a Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-0.02-mid.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-0.04-water.png b/art/zones/rusty-creek/masks/rcz-1-0.04-water.png new file mode 100644 index 0000000..beeb610 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-0.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-0.05-play.png b/art/zones/rusty-creek/masks/rcz-1-0.05-play.png new file mode 100644 index 0000000..c642c33 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-0.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-0.07-foreground.png b/art/zones/rusty-creek/masks/rcz-1-0.07-foreground.png new file mode 100644 index 0000000..986329e Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-0.07-foreground.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-1.00-sky.png b/art/zones/rusty-creek/masks/rcz-1-1.00-sky.png new file mode 100644 index 0000000..d0f3c54 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-1.00-sky.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-1.01-far.png b/art/zones/rusty-creek/masks/rcz-1-1.01-far.png new file mode 100644 index 0000000..620288d Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-1.01-far.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-1.02-mid.png b/art/zones/rusty-creek/masks/rcz-1-1.02-mid.png new file mode 100644 index 0000000..02a0589 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-1.02-mid.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-1.04-water.png b/art/zones/rusty-creek/masks/rcz-1-1.04-water.png new file mode 100644 index 0000000..84d5c6e Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-1.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-1.05-play.png b/art/zones/rusty-creek/masks/rcz-1-1.05-play.png new file mode 100644 index 0000000..9359a9c Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-1.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-1.07-foreground.png b/art/zones/rusty-creek/masks/rcz-1-1.07-foreground.png new file mode 100644 index 0000000..1bb4196 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-1.07-foreground.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-2.04-water.png b/art/zones/rusty-creek/masks/rcz-1-2.04-water.png new file mode 100644 index 0000000..73c99be Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-2.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-1-2.05-play.png b/art/zones/rusty-creek/masks/rcz-1-2.05-play.png new file mode 100644 index 0000000..004d506 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-1-2.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-0.00-sky.png b/art/zones/rusty-creek/masks/rcz-2-0.00-sky.png new file mode 100644 index 0000000..2b1ec29 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-0.00-sky.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-0.01-far.png b/art/zones/rusty-creek/masks/rcz-2-0.01-far.png new file mode 100644 index 0000000..c7980af Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-0.01-far.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-0.02-mid.png b/art/zones/rusty-creek/masks/rcz-2-0.02-mid.png new file mode 100644 index 0000000..2b03539 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-0.02-mid.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-0.04-water.png b/art/zones/rusty-creek/masks/rcz-2-0.04-water.png new file mode 100644 index 0000000..2b5039f Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-0.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-0.05-play.png b/art/zones/rusty-creek/masks/rcz-2-0.05-play.png new file mode 100644 index 0000000..96e5c0f Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-0.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-0.07-foreground.png b/art/zones/rusty-creek/masks/rcz-2-0.07-foreground.png new file mode 100644 index 0000000..7e2acf1 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-0.07-foreground.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-1.00-sky.png b/art/zones/rusty-creek/masks/rcz-2-1.00-sky.png new file mode 100644 index 0000000..c0b0bf4 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-1.00-sky.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-1.01-far.png b/art/zones/rusty-creek/masks/rcz-2-1.01-far.png new file mode 100644 index 0000000..53cd23e Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-1.01-far.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-1.02-mid.png b/art/zones/rusty-creek/masks/rcz-2-1.02-mid.png new file mode 100644 index 0000000..32d97e4 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-1.02-mid.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-1.04-water.png b/art/zones/rusty-creek/masks/rcz-2-1.04-water.png new file mode 100644 index 0000000..d897bb3 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-1.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-1.05-play.png b/art/zones/rusty-creek/masks/rcz-2-1.05-play.png new file mode 100644 index 0000000..daa609f Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-1.05-play.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-1.07-foreground.png b/art/zones/rusty-creek/masks/rcz-2-1.07-foreground.png new file mode 100644 index 0000000..7cc33fc Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-1.07-foreground.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-2.04-water.png b/art/zones/rusty-creek/masks/rcz-2-2.04-water.png new file mode 100644 index 0000000..3fa7fd5 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-2.04-water.png differ diff --git a/art/zones/rusty-creek/masks/rcz-2-2.05-play.png b/art/zones/rusty-creek/masks/rcz-2-2.05-play.png new file mode 100644 index 0000000..ce362c3 Binary files /dev/null and b/art/zones/rusty-creek/masks/rcz-2-2.05-play.png differ diff --git a/art/zones/rusty-creek/previews/gate.json b/art/zones/rusty-creek/previews/gate.json new file mode 100644 index 0000000..5b3f2dc --- /dev/null +++ b/art/zones/rusty-creek/previews/gate.json @@ -0,0 +1,503 @@ +{ + "rcz-0-0": { + "guide": { + "value": 8.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 78.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.885, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 1.0, + "limit": 4.0, + "pass": true + }, + "period": { + "value": 0.416, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.635, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.398, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 1.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-1-0": { + "value": 6.13, + "limit": 15.297, + "pass": true + }, + "seam rcz-0-1": { + "value": 9.006, + "limit": 25.885, + "pass": true + } + }, + "rcz-1-0": { + "guide": { + "value": 13.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 126.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.958, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 8.0, + "limit": 4.0, + "pass": true, + "waived": "Alexander, 25 Oct: kept. The repeated 48 px blocks all sit on the riveted girder flanges (y 24-48): real rivets repeat at a fixed pitch, it is not the model copying a patch." + }, + "period": { + "value": 0.452, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.659, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.411, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 1.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-0-0": { + "value": 6.13, + "limit": 15.297, + "pass": true + }, + "seam rcz-2-0": { + "value": 12.087, + "limit": 13.839, + "pass": true + }, + "seam rcz-1-1": { + "value": 15.956, + "limit": 30.885, + "pass": true + } + }, + "rcz-2-0": { + "guide": { + "value": 28.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 63.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.9, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 6.0, + "limit": 4.0, + "pass": true, + "waived": "Alexander, 25 Oct: kept. The repeated 48 px blocks all sit on the riveted girder flanges (y 24-48): real rivets repeat at a fixed pitch, it is not the model copying a patch." + }, + "period": { + "value": 0.392, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.676, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.447, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 1.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-1-0": { + "value": 12.087, + "limit": 13.839, + "pass": true + }, + "seam rcz-2-1": { + "value": 18.955, + "limit": 36.344, + "pass": true + } + }, + "rcz-0-1": { + "guide": { + "value": 6.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 54.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.994, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 2.0, + "limit": 4.0, + "pass": true + }, + "period": { + "value": 0.165, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 1.218, + "limit": 2.5, + "pass": true + }, + "palette": { + "value": 0.169, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 1.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-1-1": { + "value": 14.069, + "limit": 14.449, + "pass": true + }, + "seam rcz-0-0": { + "value": 9.006, + "limit": 25.885, + "pass": true + }, + "seam rcz-0-2": { + "value": 0.0, + "limit": 15.133, + "pass": true + } + }, + "rcz-1-1": { + "guide": { + "value": 45.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 73.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.997, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 1.0, + "limit": 4.0, + "pass": true + }, + "period": { + "value": 0.16, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.955, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.241, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 2.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-0-1": { + "value": 14.069, + "limit": 14.449, + "pass": true + }, + "seam rcz-2-1": { + "value": 8.998, + "limit": 15.0, + "pass": true + }, + "seam rcz-1-0": { + "value": 15.956, + "limit": 30.885, + "pass": true + }, + "seam rcz-1-2": { + "value": 5.788, + "limit": 23.439, + "pass": true + } + }, + "rcz-2-1": { + "guide": { + "value": 43.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 738.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.961, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 1.0, + "limit": 4.0, + "pass": true + }, + "period": { + "value": 0.31, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.871, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.303, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 3.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-1-1": { + "value": 8.998, + "limit": 15.0, + "pass": true + }, + "seam rcz-2-0": { + "value": 18.955, + "limit": 36.344, + "pass": true + }, + "seam rcz-2-2": { + "value": 3.081, + "limit": 44.672, + "pass": true + } + }, + "rcz-0-2": { + "guide": { + "value": 5.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 32.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.79, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 1.0, + "limit": 4.0, + "pass": true + }, + "period": { + "value": 0.099, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.818, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.275, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 1.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-1-2": { + "value": 11.2, + "limit": 24.904, + "pass": true + }, + "seam rcz-0-1": { + "value": 0.0, + "limit": 15.133, + "pass": true + } + }, + "rcz-1-2": { + "guide": { + "value": 8.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 399.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.752, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 1.0, + "limit": 4.0, + "pass": true + }, + "period": { + "value": 0.112, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.837, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.331, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 3.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-0-2": { + "value": 11.2, + "limit": 24.904, + "pass": true + }, + "seam rcz-2-2": { + "value": 13.746, + "limit": 24.264, + "pass": true + }, + "seam rcz-1-1": { + "value": 5.788, + "limit": 23.439, + "pass": true + } + }, + "rcz-2-2": { + "guide": { + "value": 74.0, + "limit": 600.0, + "pass": true + }, + "hole": { + "value": 2223.0, + "limit": 10000.0, + "pass": true + }, + "route": { + "value": 0.762, + "limit": 0.6, + "pass": true + }, + "repeat": { + "value": 1.0, + "limit": 4.0, + "pass": true + }, + "period": { + "value": 0.119, + "limit": 0.6, + "pass": true + }, + "grain": { + "value": 0.824, + "limit": 0.6, + "pass": true + }, + "palette": { + "value": 0.319, + "limit": 0.55, + "pass": true + }, + "text": { + "value": 1.0, + "limit": 5.0, + "pass": true + }, + "seam rcz-1-2": { + "value": 13.746, + "limit": 24.264, + "pass": true + }, + "seam rcz-2-1": { + "value": 3.081, + "limit": 44.672, + "pass": true + } + }, + "pass": true +} diff --git a/art/zones/rusty-creek/previews/grown-collision.png b/art/zones/rusty-creek/previews/grown-collision.png new file mode 100644 index 0000000..fecd7d3 Binary files /dev/null and b/art/zones/rusty-creek/previews/grown-collision.png differ diff --git a/art/zones/rusty-creek/previews/grown.png b/art/zones/rusty-creek/previews/grown.png new file mode 100644 index 0000000..d30f6bc Binary files /dev/null and b/art/zones/rusty-creek/previews/grown.png differ diff --git a/art/zones/rusty-creek/world.json b/art/zones/rusty-creek/world.json index aa1f96a..c34babc 100644 --- a/art/zones/rusty-creek/world.json +++ b/art/zones/rusty-creek/world.json @@ -17,7 +17,7 @@ "row": 0, "band": "above", "role": "the bridge and the rust maze", - "brief": "High above the creek: the railway bridge deck and the rust maze grown from it - long rusty blue-green girder beams with rivets, ladders between them, wide gaps of open morning sky over hazy campus buildings and trees. Grey beams are long rusty girders of the rust maze in the open morning sky; keep the sky wide and calm \u2013 most of the image is sky.", + "brief": "High above the creek: the railway bridge deck and the rust maze grown from it - long rusty blue-green girder beams with rivets, ladders between them, wide gaps of open morning sky over hazy campus buildings and trees. Grey beams are long rusty girders of the rust maze in the open morning sky; keep the sky wide and calm – most of the image is sky.", "interact": [ { "id": "rcz-0-0-glint", @@ -36,7 +36,7 @@ "row": 0, "band": "above", "role": "the bridge and the rust maze", - "brief": "High above the creek: the railway bridge deck and the rust maze grown from it - long rusty blue-green girder beams with rivets, ladders between them, wide gaps of open morning sky over hazy campus buildings and trees. Grey beams are long rusty girders of the rust maze in the open morning sky; keep the sky wide and calm \u2013 most of the image is sky.", + "brief": "High above the creek: the railway bridge deck and the rust maze grown from it - long rusty blue-green girder beams with rivets, ladders between them, wide gaps of open morning sky over hazy campus buildings and trees. Grey beams are long rusty girders of the rust maze in the open morning sky; keep the sky wide and calm – most of the image is sky.", "interact": [ { "id": "rcz-1-0-glint", @@ -55,7 +55,7 @@ "row": 0, "band": "above", "role": "the bridge and the rust maze", - "brief": "High above the creek: the railway bridge deck and the rust maze grown from it - long rusty blue-green girder beams with rivets, ladders between them, wide gaps of open morning sky over hazy campus buildings and trees. Grey beams are long rusty girders of the rust maze in the open morning sky; keep the sky wide and calm \u2013 most of the image is sky.", + "brief": "High above the creek: the railway bridge deck and the rust maze grown from it - long rusty blue-green girder beams with rivets, ladders between them, wide gaps of open morning sky over hazy campus buildings and trees. Grey beams are long rusty girders of the rust maze in the open morning sky; keep the sky wide and calm – most of the image is sky.", "interact": [ { "id": "rcz-2-0-glint", @@ -83,7 +83,7 @@ "y": 430, "w": 140, "h": 50, - "note": "a bench on the creek path \u2013 sit, the music settles" + "note": "a bench on the creek path – sit, the music settles" } ] }, @@ -102,7 +102,7 @@ "y": 478, "w": 140, "h": 50, - "note": "a bench on the creek path \u2013 sit, the music settles" + "note": "a bench on the creek path – sit, the music settles" } ] }, @@ -112,7 +112,7 @@ "row": 1, "band": "level", "role": "the creek path", - "brief": "The creek at water level: the cement creek path with a railing and benches, steps, ivy-covered stone bridge piers, the calm creek with reflections, reeds at the bank. A steel footbridge on posts crosses the creek where the guide shows it. An embankment rises where the guide's brown mound is; the purple room in it is a culvert mouth with a bulkhead lamp and a small locker \u2013 a secret, built and lit, never a cave. A park bench stands on the cement creek path.", + "brief": "The creek at water level: the cement creek path with a railing and benches, steps, ivy-covered stone bridge piers, the calm creek with reflections, reeds at the bank. A steel footbridge on posts crosses the creek where the guide shows it. An embankment rises where the guide's brown mound is; the purple room in it is a culvert mouth with a bulkhead lamp and a small locker – a secret, built and lit, never a cave. A park bench stands on the cement creek path.", "interact": [ { "id": "rcz-2-1-chest", @@ -130,7 +130,7 @@ "y": 478, "w": 140, "h": 50, - "note": "a bench on the creek path \u2013 sit, the music settles" + "note": "a bench on the creek path – sit, the music settles" } ] }, @@ -183,24 +183,12 @@ } }, "links": [ - { - "a": "rcz-0-0", - "b": "rcz-0-1", - "by": "shaft", - "at": 528 - }, { "a": "rcz-0-0", "b": "rcz-1-0", "by": "door", "at": 360 }, - { - "a": "rcz-0-1", - "b": "rcz-0-2", - "by": "shaft", - "at": 528 - }, { "a": "rcz-0-1", "b": "rcz-1-1", @@ -213,12 +201,6 @@ "by": "door", "at": 648 }, - { - "a": "rcz-1-0", - "b": "rcz-1-1", - "by": "shaft", - "at": 1104 - }, { "a": "rcz-1-0", "b": "rcz-2-0", @@ -237,17 +219,47 @@ "by": "door", "at": 624 }, + { + "a": "rcz-0-0", + "b": "rcz-0-1", + "by": "shaft", + "note": "the maze's ladders onto the girder deck" + }, + { + "a": "rcz-1-0", + "b": "rcz-1-1", + "by": "shaft", + "note": "the maze's ladders onto the girder deck" + }, { "a": "rcz-2-0", "b": "rcz-2-1", "by": "shaft", - "at": 1752 + "note": "the maze's ladders onto the girder deck" + }, + { + "a": "rcz-0-1", + "b": "rcz-0-1", + "by": "ladder", + "note": "the pier ladder: path <-> girder deck" + }, + { + "a": "rcz-1-1", + "b": "rcz-1-1", + "by": "ladder", + "note": "the pier ladder: path <-> girder deck" + }, + { + "a": "rcz-2-1", + "b": "rcz-2-1", + "by": "ladder", + "note": "the pier ladder: path <-> girder deck" }, { "a": "rcz-2-1", "b": "rcz-2-2", - "by": "shaft", - "at": 1704 + "by": "door", + "note": "the culvert <-> the drain door" } ], "anomaly": { @@ -307,12 +319,12 @@ { "chunk": "rcz-0-1", "kind": "rest", - "note": "a bench on the creek path \u2013 sit, the music settles" + "note": "a bench on the creek path – sit, the music settles" }, { "chunk": "rcz-1-1", "kind": "rest", - "note": "a bench on the creek path \u2013 sit, the music settles" + "note": "a bench on the creek path – sit, the music settles" }, { "chunk": "rcz-2-1", @@ -322,7 +334,7 @@ { "chunk": "rcz-2-1", "kind": "rest", - "note": "a bench on the creek path \u2013 sit, the music settles" + "note": "a bench on the creek path – sit, the music settles" }, { "chunk": "rcz-0-2", @@ -334,5 +346,6 @@ "kind": "secret", "note": "a lit service room: lockers, a desk, a hanging lamp" } - ] + ], + "traced": "Collision traced from the painting (25 Oct): the level row measured, the bands above and below from their depth keys; the band above's blockout redrawn from it (the kept rust maze)." } diff --git a/art/zones/rusty-creek/zone.json b/art/zones/rusty-creek/zone.json index 7f62680..ed37407 100644 --- a/art/zones/rusty-creek/zone.json +++ b/art/zones/rusty-creek/zone.json @@ -16,11 +16,9 @@ "anomaly": "art/locations/rusty-creek-stacked/anomaly.png", "clean": "art/locations/rusty-creek-stacked/clean.png" }, - "inputs": [ - "repo:art/direction/images/style-master-preview.png" - ], + "inputs": [], "model": "gpt-image-2.5-sunburst", - "style": "LOOK: detailed hi-bit pixel art with a fine 2-pixel grain in the warm palette and first light of the first image (Rusty Creek): rusty blue-green steel girders and rail bridges, ivy on stone piers, a cement creek path with railings, the calm creek with reflections, campus buildings and trees behind in hazy layers. Strict side view, an architect's elevation: everything runs parallel to the screen, nothing recedes. The hero is about 76 px tall in this image, so a doorway is about 110 px tall and a ladder rung step about 12 px. TONE: secret horror - calm and pretty first. No text, no logos, no UI.", + "style": "LOOK: continue the finished art exactly - detailed hi-bit pixel art with a fine 2-pixel grain, warm autumn palette, low golden morning light: the rusty blue-green riveted railway girder, ivy-covered concrete piers, autumn trees and hazy campus buildings behind, the cement creek path with its grey pipe railing, the stone bank wall, the calm creek with reflections. Strict side view, an architect's elevation: everything runs parallel to the screen, nothing recedes. The hero is about 114 px tall here: a railing is about 50 px, a doorway about 120 px, a ladder rung step about 12 px. TONE: secret horror - calm and pretty first. No text, no logos, no UI.", "people": "No people, no animals, no plush toys and no characters of any kind: this is an empty stage the game puts its characters into.", "vocabulary": { "above": "high above the creek: the railway bridge deck and the rust maze grown from it - long rusty blue-green girder beams with rivets, ladders between them, wide gaps of open morning sky over hazy campus buildings and trees", @@ -35,7 +33,7 @@ }, "count": 3 }, - "note_inputs": "Paint inputs are the style master only (docs/09: a whole concept as a look reference gets copied, layout and all; #182: 'zone-a as a reference = zone-a's layout').", + "note_inputs": "No look image: every chunk grows from approved art (the start chunk). Painting a flat guide with any look image copied that image - the style master (the creek itself), the Hidden Garden plate, a swatch sheet - and a guide alone gave a generic harbour; all four takes ignored the guide (25 Oct, docs/09).", "words": { "roles": { "above": "the bridge and the rust maze", @@ -55,5 +53,30 @@ "hollow": "The purple room is a warm lit service room with lockers, a desk and a hanging lamp, built in concrete and tile.", "above": "Grey beams are long rusty girders of the rust maze in the open morning sky; keep the sky wide and calm – most of the image is sky." } + }, + "start": { + "chunk": "rcz-0-1", + "from": "art/locations/rusty-creek-stacked/clean-preview.png", + "box": [ + 8, + 16, + 2168, + 736 + ], + "note": "The level row starts from the #227 concept's level band, cut 1:1 (the concept is at game scale: railing ≈ 50 px). Approved by Alexander, 25 Oct; every other chunk grows from it." + }, + "gate": { + "waive": [ + { + "chunk": "rcz-1-0", + "check": "repeat", + "why": "Alexander, 25 Oct: kept. The repeated 48 px blocks all sit on the riveted girder flanges (y 24-48): real rivets repeat at a fixed pitch, it is not the model copying a patch." + }, + { + "chunk": "rcz-2-0", + "check": "repeat", + "why": "Alexander, 25 Oct: kept. The repeated 48 px blocks all sit on the riveted girder flanges (y 24-48): real rivets repeat at a fixed pitch, it is not the model copying a patch." + } + ] } } diff --git a/docs/09-ART-PIPELINE.md b/docs/09-ART-PIPELINE.md index 3d8c0b7..31dbba8 100644 --- a/docs/09-ART-PIPELINE.md +++ b/docs/09-ART-PIPELINE.md @@ -99,7 +99,13 @@ What the proof taught (rules now): - `complete` does the same for the garden's far and mid, quilted again by `region` (level row only); - a room without sky takes `atmosphere.json` `indoor`: walls and floors stay still, weeds sway, water ripples gently; - `whole` paints again when its painting has a flat-black void (`black_void`, over 600 px). Checked layer by layer in debug mode, hg-3-1's back wall had a made-up black pipe mouth behind a girder (25 Oct). -- **Rusty Creek goes through the same pipeline (#157):** `art/zones/rusty-creek/zone.json` from the stacked direction (#227), and `world_map.py`'s 3×3 map and blockout (seed 157). A zone names its own places in `zone.json` `"words"`: the creek has culverts and service rooms, never caves. First paint take (25 Oct, 9 calls): every chunk came back as the style master. The style master *is* Rusty Creek, so a "look only" reference that shows the very place being painted gets copied, guide and all. A zone's look reference must never be a picture of that zone; for the creek, either grow from its own approved plates (the Hidden Garden method) or paint with a reference of another place. +- **Rusty Creek goes through the same pipeline (#157), grown from one cut of its concept** (`art/zones/rusty-creek/`, `scripts/zones/rusty_creek_zone.py`): + - **Painting a flat guide never holds its layout.** Four takes on one chunk (25 Oct): the style master as the look (it *is* the creek) came back as the style master; the Hidden Garden's plate came back as the garden; a sheet of material swatches came back as the swatches stitched into a scene; the guide alone came back as a generic harbour. Whatever image goes in is copied, and the guide is ignored. So a zone needs a **start chunk** made another way, and everything else grows from it. + - **The start chunk is a 1:1 cut of the concept** (`zone.json` `"start"`): the #227 concept's preview is drawn at game scale (its railing ≈ 50 px ≈ 1 m), so its level band is the creek path, the railway girder and the water as they will be played. Approved by Alexander; `"inputs"` is then empty – the growing art is the look. + - **Sideways** with `grow_stage.py` and the zone's `boards.json` routes. It keeps the path, the girder and the light continuous, but smooths features away: piers, a culvert and ladders are painted back as **feature windows**. A ladder needs a narrow window (110 px); in a wide one the model drops it. + - **Up and down** with `world_paint.py grow`, then joins. An up/down join may move what it should keep: with 110 rows each side it shifted the railway girder to a different height in each chunk (the gate's seam check did not see it). `join … --only up-down --half 150,44` stops the window 44 rows into the lower chunk, above the girder. Where the model still left the maze's posts and the tree line hanging over a strip of sky, they were carried down to the flange column by column with their own pixels. + - **Collision:** the level row is measured (path, girder deck, pier ladders, the culvert door over the drain door); the bands above and below are traced from their depth keys. A traced climb is a ladder only where both ends meet a floor (pillars and pipes key like rungs). Where pillars stand in front of a deck, the tracer breaks it: those floors are measured (`MEASURED`). A dead end got a painted steel stair, so the drains can be walked back. Underground, the flooded bottom is no-go. + - **The kept maze:** the band above came out denser than its map's two beams; Alexander kept it, so its blockout is redrawn from its traced floors and ladders and the gate's route check measures against what is walked. Its repeat check fails on riveted girder flanges – real rivet pitch – and is waived in `zone.json` `"gate"` with that reason (`world_gate.py` prints WAIVED, keeps the value). - **Played, the underground has to read (Alexander's playtest, 25 Oct):** the cellar's door was a purple box beside its painted door, a ladder ran up into the ceiling girder, the upper floor had a gap under a pillar, the hero walked in front of the steel pillars and off the row's open end, the prologue's guide followed him down and walked in the air, and nothing moved. The fixes are rules now: - **What the trace gets wrong is measured** (`hidden_garden_proof.py` `MEASURED`): a floor that runs behind pillars is one floor; a ladder runs between the floors it joins, never past them; a door's box is on its painted door (a door pair is joined by id, not by x). - **Columns the hero passes are in front of him:** `06-pillars` (z 6 like `06-near`, but still – the near strip sways), a measured mask per chunk (`PILLARS`), drawn over the actors. diff --git a/scripts/depth_layers.py b/scripts/depth_layers.py index ffd2616..8fc06e2 100644 --- a/scripts/depth_layers.py +++ b/scripts/depth_layers.py @@ -177,7 +177,7 @@ def art_for(region: Path, chunk: str) -> Image.Image: # A world zone chunk away from pond level reads the same seven colours differently (docs/09 "World pipeline"). BAND_KEY = { - "below": ("THIS CHUNK is underground, under the pond: ONLY the deep water at the very top and its surface " + "below": ("THIS CHUNK is underground, under the pond or the creek: ONLY the deep water at the very top and its surface " "hanging as a ceiling are navy - never a dark room, a doorway, a shadow or the dark behind the arches; " "every floor, ledge, step and the top of every girder you can walk on, as a solid band down from its " "walking surface, is red; everything behind you - the back walls, the dark insides of the rooms and " diff --git a/scripts/test_rusty_creek_zone.py b/scripts/test_rusty_creek_zone.py new file mode 100644 index 0000000..830f788 --- /dev/null +++ b/scripts/test_rusty_creek_zone.py @@ -0,0 +1,56 @@ +"""The Rusty Creek zone's committed collision (#157): walked both ways, the culvert paired with the drain door, the +level row on its path and the railway girder's deck.""" +import json +import sys +import unittest +from pathlib import Path + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +sys.path.insert(0, str(HERE / "zones")) +import rusty_creek_zone as rc # noqa: E402 +import world_map as wm # noqa: E402 + + +def committed() -> tuple[dict, dict]: + world = json.loads((rc.ZONE / "world.json").read_text(encoding="utf-8")) + grid = {cid: (c["col"], c["row"]) for cid, c in world["chunks"].items()} + collisions = {cid: json.loads((rc.ZONE / "collision" / f"{cid}.collision.json").read_text(encoding="utf-8")) + for cid in grid} + return grid, collisions + + +class RustyCreekZoneTests(unittest.TestCase): + def test_every_surface_is_reachable_and_leavable(self): + grid, collisions = committed() + self.assertEqual(wm.check(rc.graph(collisions, grid)), []) + + def test_the_culvert_and_the_drain_door_lead_to_each_other(self): + _, collisions = committed() + culvert = next(i for i in collisions["rcz-2-1"]["interact"] if i["id"] == "culvert") + drain = next(i for i in collisions["rcz-2-2"]["interact"] if i["id"] == "drain-door") + self.assertEqual((culvert["to"], drain["to"]), ("drain-door", "culvert")) + self.assertEqual(culvert["x"], drain["x"]) # straight above each other: the graph joins them across the seam + + def test_the_level_row_walks_the_path_and_the_girder_deck(self): + _, collisions = committed() + for col in range(3): + cid = f"rcz-{col}-1" + ys = sorted({line[0][1] for line in collisions[cid]["walk"]}) + self.assertEqual(ys, sorted([rc.PATH, rc.girder_top(cid)])) + ladder = collisions[cid]["climb"][0] + self.assertLessEqual(ladder["y"], rc.girder_top(cid)) # up onto the deck + self.assertEqual(ladder["y"] + ladder["h"], rc.PATH) # down to the path + + def test_a_ladder_needs_a_floor_or_the_next_row_at_both_ends(self): + _, collisions = committed() + for cid in ("rcz-0-2", "rcz-1-2", "rcz-2-2"): + for c in collisions[cid]["climb"]: + ends = (c["y"], c["y"] + c["h"]) + floors = [p[1] for line in collisions[cid]["walk"] for p in line] + for y in ends: + self.assertTrue(y in (0, rc.H) or any(abs(f - y) <= 32 for f in floors), (cid, c)) + + +if __name__ == "__main__": + unittest.main() diff --git a/scripts/test_world_gate.py b/scripts/test_world_gate.py index d8d4bcc..5d2c38f 100644 --- a/scripts/test_world_gate.py +++ b/scripts/test_world_gate.py @@ -163,3 +163,11 @@ def test_hole_fails_on_an_empty_repaint_window_only(): assert wg.check_hole(img)["pass"] img[100:250, 100:300] = 0 # 30 000 px: an empty window assert not wg.check_hole(img)["pass"] + + +def test_waive_passes_only_the_named_check_and_keeps_its_value(): + report = {"a": {"repeat": wg.result(8, 4, False), "seam b": wg.result(30, 14, False)}, "pass": False} + out = wg.waive(report, [{"chunk": "a", "check": "repeat", "why": "rivets"}]) + assert out["a"]["repeat"] == {"value": 8.0, "limit": 4.0, "pass": True, "waived": "rivets"} + assert not out["a"]["seam b"]["pass"] and not out["pass"] + assert wg.waive(out, [{"chunk": "a", "check": "seam b", "why": "x"}])["pass"] diff --git a/scripts/world_gate.py b/scripts/world_gate.py index 4282eac..e8e81f9 100644 --- a/scripts/world_gate.py +++ b/scripts/world_gate.py @@ -397,13 +397,25 @@ def gate(grid: dict[str, tuple[int, int]], images: Path, concept: np.ndarray | d return report +def waive(report: dict, waivers: list[dict]) -> dict: + """Mark checks Alexander accepted as they are (zone.json "gate": {"waive": [{"chunk", "check", "why"}]}): the check + still runs and keeps its value, it passes as WAIVED with the reason. Only a named chunk's named check.""" + for w in waivers: + r = report.get(w["chunk"], {}).get(w["check"]) + if r is not None and not r["pass"]: + r.update({"pass": True, "waived": w["why"]}) + report["pass"] = all(r["pass"] for cid, checks in report.items() if cid != "pass" for r in checks.values()) + return report + + def show(report: dict) -> None: """One line per chunk per check.""" for cid, checks in report.items(): if cid == "pass": continue for name, r in checks.items(): - print(f"{cid:>10} {name:<18} {'PASS' if r['pass'] else 'FAIL'} {r['value']:>10g} (limit {r['limit']:g})") + verdict = "WAIVED" if r.get("waived") else "PASS" if r["pass"] else "FAIL" + print(f"{cid:>10} {name:<18} {verdict:<6} {r['value']:>10g} (limit {r['limit']:g})") print("gate:", "PASS" if report["pass"] else "FAIL") @@ -447,6 +459,8 @@ def main(argv: list[str] | None = None) -> int: under = (whole, whole[whole.shape[0] // 2:]) # grain against the whole, palette against the maze concept = {cid: under if c.get("band") == "below" else concept for cid, c in world["chunks"].items()} report = gate(grid, images, concept, blockouts, args.chunks) + if args.zone and (zone / "zone.json").exists(): + report = waive(report, json.loads((zone / "zone.json").read_text(encoding="utf-8")).get("gate", {}).get("waive", [])) show(report) out.parent.mkdir(parents=True, exist_ok=True) out.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8") diff --git a/scripts/world_paint.py b/scripts/world_paint.py index 886490f..cdcb509 100644 --- a/scripts/world_paint.py +++ b/scripts/world_paint.py @@ -5,13 +5,15 @@ python scripts/world_paint.py join art/zones/ [--only left-right|up-down] [--row N] python scripts/world_paint.py feature art/zones/ --box x0,y0,x1,y1 --brief "…" # a story detail python scripts/world_paint.py settle art/zones/ --row N [--up] # up/down seams: colour only + python scripts/world_paint.py join art/zones/ --only up-down --pair a,b --half 150,44 --brief "…" + # the window stops 44 rows into b python scripts/world_paint.py join art/zones/ --only left-right --pair a,b --half 480,160 --brief "…" # two different rooms: paint the passage python scripts/world_paint.py accept art/zones/ [ids …] paint – the model edits each chunk's flat guide (blockout/.png) under a fully open mask, so the walk lines, -ladders, water and rooms stay where the blockout put them; the concept and the style master come along as the -LOOK only. The first chunk at pond level is painted alone and then goes with every other chunk as the palette +ladders, water and rooms stay where the blockout put them; the zone's look reference (zone.json "inputs", never +a picture of the zone itself) comes along as the LOOK only. The first chunk at pond level is painted alone and then goes with every other chunk as the palette anchor, so the zone is one place. Chunks after the anchor are painted in parallel. join – one 2160×720 canvas per seam: the two halves that meet, the window across the seam repainted, then joined back to the old art along min-error cuts on both sides (grow_stage.min_cut). Left/right seams first, then up/down @@ -51,8 +53,8 @@ "walk into; the pale blue is open air for sky, far trees and mid trees. Never draw the guide's flat colours, " "its lines or its hard rectangle edges: everything becomes natural, overgrown, painted scenery. The layout comes " "ONLY from the guide: where the guide is open air, paint open air - do not add girders, platforms, ponds or " - "rooms the guide does not have. The second image is the game's style master: the LOOK only - palette, light, " - "materials, the fine 2-pixel grain - never its content, layout or scale. " + "rooms the guide does not have. The second image is the zone's look reference (zone.json \"inputs\"): the LOOK only - " + "palette, light, materials, the fine 2-pixel grain - never its content, layout or scale. " "{anchor}\n\nWHAT IS HERE: {brief}") ANCHOR = ("The last image is a neighbouring chunk of the same zone, already painted: the same palette, light, grain " "and level of detail, so the two read as one place.") @@ -275,7 +277,9 @@ def join_one(zone: dict, a: Image.Image, b: Image.Image, kind: str, name: str, h canvas = Image.new("RGB", (W, H)) canvas.paste(a.crop((0, H // 2, W, H)), (0, 0)) canvas.paste(b.crop((0, 0, W, H // 2)), (0, H // 2)) - box, where = (0, H // 2 - BAND, W, H // 2 + BAND), "along a horizontal line across the middle, above and below" + # (above, below) keeps the window off something below that must not move (a railway girder's top edge) + above, below = half if isinstance(half, tuple) else (BAND, BAND) + box, where = (0, H // 2 - above, W, H // 2 + below), "along a horizontal line across the middle, above and below" parts = [JOIN.format(where=where)] + ([TRANSITION.format(brief=brief)] if brief else []) + ([f"WHAT IS HERE: {here}"] if here else []) prompt = "\n\n".join(parts + [zone["style"], zone["people"]]) painted = call(name, prompt, canvas, window_mask((W, H), box), zone["inputs"][:1], zone) @@ -409,7 +413,7 @@ def main() -> None: parser.add_argument("--brief", help="feature: what to paint in the window; join: the passage between two rooms") parser.add_argument("--pair", help="join: only this seam, a,b") parser.add_argument("--half", default=str(HALF), help="join: px repainted on each side of a left/right seam, " - "or left,right") + "or left,right; an up/down seam takes above,below") parser.add_argument("--up", action="store_true", help="settle: fade the row into the chunk below it") args = parser.parse_args() zone = args.zone if args.zone.is_absolute() else ROOT / args.zone diff --git a/scripts/zones/hidden_garden_proof.py b/scripts/zones/hidden_garden_proof.py index a6998ce..bed4fbd 100644 --- a/scripts/zones/hidden_garden_proof.py +++ b/scripts/zones/hidden_garden_proof.py @@ -327,11 +327,11 @@ def finds(cid: str, col: int, walk: list) -> list[dict]: return out -def key_bands(cid: str): +def key_bands(cid: str, zone: Path = ZONE): """The chunk's depth key (depth_layers.py key) as an H x W array of band names, or None before it exists.""" import numpy as np import depth_layers as dl - path = ROOT / "tmp" / "boards" / ZONE.name / f"{cid}--depth.png" + path = ROOT / "tmp" / "boards" / zone.name / f"{cid}--depth.png" if not path.exists(): return None key = Image.open(path).resize((W, H), Image.Resampling.NEAREST) @@ -412,7 +412,7 @@ def seabed(bands, col: int) -> list[list[int]]: JUMP = 88 # the highest ledge a held jump reaches (collision_check RISE); 88-120 px faces block and can't be jumped -def walkable(cid: str, lines: list, climbs: list[dict]) -> list: +def walkable(cid: str, lines: list, climbs: list[dict], zone: Path = ZONE) -> list: """The traced floors as the hero's body meets them (body.ts, collision_check.py): - a floor ending less than EDGE px from the chunk's edge goes on to the edge (rooms join at the seams); - never on water: a point with water under the feet (the zone's water mask) sinks to the ground under it; @@ -432,8 +432,8 @@ def y_at(line, x): return next((a[1] + (b[1] - a[1]) * (x - a[0]) / max(1, b[0] - a[0]) for a, b in zip(line, line[1:]) if a[0] <= x <= b[0]), None) - water = ZONE / "masks" / f"{cid}.04-water.png" - play = ZONE / "masks" / f"{cid}.05-play.png" + water = zone / "masks" / f"{cid}.04-water.png" + play = zone / "masks" / f"{cid}.05-play.png" if water.exists(): wet = np.asarray(Image.open(water).getchannel("A")) > 128 solid = np.asarray(Image.open(play).getchannel("A")) > 128 if play.exists() else np.zeros_like(wet) diff --git a/scripts/zones/rusty_creek_zone.py b/scripts/zones/rusty_creek_zone.py new file mode 100644 index 0000000..2069fe7 --- /dev/null +++ b/scripts/zones/rusty_creek_zone.py @@ -0,0 +1,197 @@ +"""Rusty Creek as a zone (#157, docs/09 "World pipeline"): 3 x 3 chunks grown from one start chunk cut 1:1 from the +#227 concept's level band – the rust maze above, the creek path, the drains below. Writes every chunk's collision, +re-traces the band above's blockout from its painting, and checks that the whole grid can be walked both ways. + + python scripts/zones/rusty_creek_zone.py + +The level row's collision is measured from the art (the concept's path and the railway girder are straight); the +band above and the band below are traced from their depth keys (depth_layers.py key / masks --all), with the same +rules as the Hidden Garden's underground (hidden_garden_proof.py). The band above is the rust maze Alexander kept +over its two-beam map (25 Oct): its blockout is redrawn from the traced floors and ladders, so the artifact gate's +route check measures the painting against what is walked. +""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path + +from PIL import Image + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import hidden_garden_proof as hg # noqa: E402 +import world_map as wm # noqa: E402 + +ROOT = Path(__file__).resolve().parents[2] +ZONE = ROOT / "art" / "zones" / "rusty-creek" +W, H = 2160, 720 +BODY = 76 +PATH = 522 # the cement creek path behind the railing (the concept's level band, 1:1) +WATER = 600 # the creek's surface: no-go below +# The pier ladders painted into the level row (feature windows, 25 Oct): x0, x1 per chunk. +PIER_LADDERS = {0: (330, 372), 1: (1062, 1106), 2: (1706, 1756)} +CULVERT = (340, 470) # rcz-2-1: the lit culvert mouth in the bank – the way down into the drains +# Measured where the tracer can't read the art: rcz-1-2's catwalk end and the steel stair painted down from it to the +# stone ledge by the outfall (a feature window, 25 Oct), so the drains can be walked back from rcz-2-2. From x on, +# the traced floors are replaced by this line (the tracer broke the deck wherever a pillar stands in front of it). +MEASURED = {"rcz-1-2": (0, [[0, 197], [1960, 197], [2050, 270], [2160, 278]])} # pillars stand in front of the deck + + +# The railway girder's top flange per level chunk, measured on the sky/girder edge before the maze's posts and the +# tree line were carried down onto it (25 Oct): the girder is straight, the chunks differ by a few px. +GIRDER_TOP = {"rcz-0-1": 62, "rcz-1-1": 63, "rcz-2-1": 65} + + +def girder_top(cid: str) -> int: + return GIRDER_TOP[cid] + + +def empty(cid: str) -> dict: + return {"chunk": cid, "state": "clean", "size": [W, H], "walk": [], "slide": [], "oneWay": [], "climb": [], + "solid": [], "noGo": [], "hazard": [], "interact": [], "spawn": []} + + +def level(col: int) -> dict: + """The creek path, the railway girder's deck (its maintenance walk) and a ladder up each pier between them.""" + cid = f"rcz-{col}-1" + data, top = empty(cid), girder_top(cid) + data["walk"] = [[[0, PATH], [W, PATH]], [[0, top], [W, top]]] + x0, x1 = PIER_LADDERS[col] + data["climb"] = [hg.box(x0, top - 8, x1, PATH, kind="ladder", id=f"{cid}-pier-ladder")] + data["noGo"] = [hg.box(0, WATER, W, H, kind="water")] + if col == 2: + data["interact"].append(hg.box(CULVERT[0], PATH - BODY, CULVERT[1], PATH, kind="door", id="culvert", + to="drain-door", note="The lit culvert mouth in the bank: down into the drains.")) + return data + + +def traced(cid: str, row: int) -> dict: + """A grown band's floors and ladders from its depth key (stage 7).""" + data, bands = empty(cid), hg.key_bands(cid, ZONE) + if bands is None: + raise SystemExit(f"{cid}: no depth key – run depth_layers.py key art/zones/rusty-creek {cid}") + steps = hg.ladders(bands) + lines = hg.headroom(hg.floors(bands, steps, 0 if row == 0 else 24)) + # a ladder that reaches the band's bottom edge (above) or top edge (below) goes on into the next row + data["climb"] = [hg.box(x0, 0 if row == 2 and top < 40 else top, x1, H if row == 0 and bottom > H - 40 else bottom, + kind="ladder", id=f"{cid}-ladder-{n}") for n, (x0, x1, top, bottom) in enumerate(steps)] + data["walk"] = hg.walkable(cid, lines, data["climb"], ZONE) + if row == 2: # the drains are flooded at the bottom: the water there is no-go (you're put back on the last floor) + wet = (bands == "water").mean(1) > 0.5 + y = H + while y > 0 and wet[y - 1]: + y -= 1 + if y < H: + data["noGo"] = [hg.box(0, y, W, H, kind="water")] + if cid in MEASURED: + x, line = MEASURED[cid] + data["walk"] = [l for l in data["walk"] if l[0][0] < x] + [line] + data["walk"] = [[p for p in l if p[0] <= x] if l is not data["walk"][-1] else l for l in data["walk"]] + data["walk"] = [l for l in data["walk"] if len(l) > 1] + # The key marks pillars and pipes with brick rows or brackets like rungs: a climb is a ladder only where both its + # ends meet a floor, or the chunk edge that leads on to the next row. + def meets(x0: int, x1: int, y: int) -> bool: + return any(abs(hg_y - y) <= 32 for line in data["walk"] for a, b in zip(line, line[1:]) + if a[0] <= x1 and b[0] >= x0 for hg_y in (a[1], b[1])) + data["climb"] = [c for c in data["climb"] + if (meets(c["x"], c["x"] + c["w"], c["y"]) or c["y"] == 0) + and (meets(c["x"], c["x"] + c["w"], c["y"] + c["h"]) or c["y"] + c["h"] == H)] + return data + + +def drain_door(data: dict) -> None: + """rcz-2-2: the door under the culvert, on the floor nearest the top there.""" + x = sum(CULVERT) // 2 + y = hg.floor_at(data["walk"], x, "top") + data["interact"].append(hg.box(CULVERT[0], y - BODY, CULVERT[1], y, kind="door", id="drain-door", to="culvert", + note="Back up through the culvert to the creek path.")) + + +def graph(collisions: dict[str, dict], grid: dict[str, tuple[int, int]]) -> dict: + """The collision files as world_map reads a world. A door pair is a ladder between the doors' floors (the culvert + sits straight over the drain door): the upper door's box runs down to its chunk's bottom, the lower one's up + from its chunk's top, so world_map joins them across the seam.""" + chunks = {} + for cid, data in collisions.items(): + col, row = grid[cid] + climb = [[b["x"], b["y"], b["x"] + b["w"], b["y"] + b["h"]] for b in data["climb"]] + for door in (b for b in data["interact"] if b.get("kind") == "door"): + climb.append([door["x"], door["y"], door["x"] + door["w"], H] if door["id"] == "culvert" else + [door["x"], 0, door["x"] + door["w"], door["y"] + door["h"]]) + if row == 1: # the girder deck meets the ladders of the maze standing on it + top = data["walk"][1][0][1] + for other, (c, r) in grid.items(): + if c == col and r == 0: + climb += [[b["x"], 0, b["x"] + b["w"], top] for b in collisions[other]["climb"] + if b["y"] + b["h"] >= H - 2] + chunks[cid] = {"id": cid, "col": col, "row": row, "band": "level" if row == 1 else "other", + "walk": [[a, b] for line in data["walk"] for a, b in zip(line, line[1:])], + "oneWay": data["oneWay"], "deck": [], "climb": climb, + "solid": [[b["x"], b["y"], b["x"] + b["w"], b["y"] + b["h"]] for b in data["solid"]]} + return {"chunks": chunks} + + +def reachable_only(collisions: dict[str, dict], grid: dict[str, tuple[int, int]]) -> int: + """Drop traced walk segments nobody can reach or leave (a beam high in the maze with no ladder to it is + scenery). The level row is measured, never dropped. Returns how many segments went.""" + bad = {(p.split()[0], int(p.split()[3].split("-")[0]), int(p.split()[5].rstrip(":"))) + for p in wm.check(graph(collisions, grid)) if p.split()[1] == "walk"} + gone = 0 + for cid, data in collisions.items(): + if grid[cid][1] == 1: + continue + ox, oy = grid[cid][0] * W, grid[cid][1] * H + lines = [] + for line in data["walk"]: + run = [line[0]] + for a, b in zip(line, line[1:]): + if (cid, ox + a[0], oy + a[1]) in bad: + gone += 1 + if len(run) > 1: + lines.append(run) + run = [b] + else: + run.append(b) + if len(run) > 1: + lines.append(run) + data["walk"] = lines + return gone + + +def blockout(data: dict) -> Image.Image: + """The band above's guide redrawn from its traced floors and ladders (world_map.guide's colours).""" + ch = {"band": "above", "ground": [], "mound": [], "water": [], "hollow": [], "structure": [], "deck": [], + "climb": [[b["x"], b["y"], b["x"] + b["w"], b["y"] + b["h"]] for b in data["climb"]], + "walk": data["walk"], "oneWay": data["oneWay"]} + return wm.guide(ch) + + +def main() -> None: + world = json.loads((ZONE / "world.json").read_text(encoding="utf-8")) + grid = {cid: (c["col"], c["row"]) for cid, c in world["chunks"].items()} + collisions = {cid: level(col) if row == 1 else traced(cid, row) for cid, (col, row) in grid.items()} + drain_door(collisions["rcz-2-2"]) + gone = reachable_only(collisions, grid) + (ZONE / "collision").mkdir(exist_ok=True) + for cid, data in collisions.items(): + (ZONE / "collision" / f"{cid}.collision.json").write_text(json.dumps(data, indent=1) + "\n", encoding="utf-8") + if grid[cid][1] == 0: + blockout(data).save(ZONE / "blockout" / f"{cid}.png") + world["links"] = [link for link in world["links"] if link["by"] == "door" and grid[link["a"]][1] == grid[link["b"]][1]] + world["links"] += [{"a": f"rcz-{c}-0", "b": f"rcz-{c}-1", "by": "shaft", "note": "the maze's ladders onto the girder deck"} + for c in range(3)] + world["links"] += [{"a": f"rcz-{c}-1", "b": f"rcz-{c}-1", "by": "ladder", "note": "the pier ladder: path <-> girder deck"} + for c in range(3)] + world["links"].append({"a": "rcz-2-1", "b": "rcz-2-2", "by": "door", "note": "the culvert <-> the drain door"}) + world["traced"] = ("Collision traced from the painting (25 Oct): the level row measured, the bands above and below " + "from their depth keys; the band above's blockout redrawn from it (the kept rust maze).") + (ZONE / "world.json").write_text(json.dumps(world, indent=1, ensure_ascii=False) + "\n", encoding="utf-8") + problems = wm.check(graph(collisions, grid)) + print(f"rusty-creek: collision for {len(collisions)} chunks ({gone} unreachable floor segments dropped); " + + ("every surface reachable and leavable" if not problems else f"{len(problems)} problems, e.g. {problems[:4]}")) + + +if __name__ == "__main__": + main()