@dreadwood-types/types 0.1.177 → 0.1.178

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,175 @@
1
+ import type { DiscoveryZone } from './landmarks.js';
2
+ export declare const WESTERN_KINGDOMS_NAME = "The Western Kingdoms";
3
+ /** The strip's open sea round the land: deep water at height 0, walkable as water is (backend placeWesternKingdoms). */
4
+ export declare const WESTERN_SEA_HEIGHT = 0;
5
+ /** Is a world tile inside the Western strip (every row of its columns)? */
6
+ export declare function inWesternStrip(x: number, z: number): boolean;
7
+ /** A world x as a column of the strip (0 at WESTERN_ORIGIN_X), and back. */
8
+ export declare function westernStripX(x: number): number;
9
+ export declare function westernWorldX(stripX: number): number;
10
+ /**
11
+ * The land's box in the strip: 560 x 1248 tiles (James drew it about as tall as today's world and a little narrower;
12
+ * the plan's "about 576 x 1250"), local (0, 0) at world (WESTERN_LAND_X, WESTERN_LAND_Z).
13
+ *
14
+ * The margins are open sea: 80 columns on the strip's west side, so the land stays more than three chunks (the
15
+ * server streams two rings and has no region filter on NPCs, audit risk 5) from the Arcane Realms' land, whose east
16
+ * coast is at x 1509; 64 on the east side to the grid's edge, and 64 rows north and south.
17
+ */
18
+ export declare const WESTERN_LAND_W = 560;
19
+ export declare const WESTERN_LAND_H = 1248;
20
+ export declare const WESTERN_LAND_X: number;
21
+ export declare const WESTERN_LAND_Z = 64;
22
+ /** The land's ground height (plain, flat for the blockout) and the beach ring's two steps down to the sea. */
23
+ export declare const WESTERN_GROUND_HEIGHT = 3;
24
+ export declare const WESTERN_BEACH_HEIGHTS: readonly number[];
25
+ export declare function westernWorld(lx: number, lz: number): {
26
+ x: number;
27
+ z: number;
28
+ };
29
+ export declare function westernLocal(x: number, z: number): {
30
+ x: number;
31
+ z: number;
32
+ };
33
+ export type WesternPolygon = ReadonlyArray<readonly [number, number]>;
34
+ /**
35
+ * The coast, land-local, clockwise from the north-west. A blockout traced from James's marked map
36
+ * (`.cursor/task-plans/2026-10-10-western-kingdoms-island-design/james-vision-marked-map.webp`): one big landmass,
37
+ * roughly the box he drew west of our coast, its long east shore facing our west coast (the impassable join, the red
38
+ * box, is on the paper map, not in the grid). Kept simple and generous; later passes refine it.
39
+ *
40
+ * The one fixed point is the south-east bay (local x 460, z 1040-1076): the train's first stop stands on its west
41
+ * shore (phase 0c's stub, types westernTrain.ts WESTERN_ISLE_*: the platform and rock cap on the land, the causeway
42
+ * running east out into the bay, where the line comes up out of the sea).
43
+ */
44
+ export declare const WESTERN_LAND_OUTLINE: WesternPolygon;
45
+ /**
46
+ * The ice corner: the land's north-east (beside our Frozen North on the paper map, where James wrote "ice area / huge
47
+ * ice mountain"), a ragged diagonal on its south-west side. Land-local; only the part inside the coast is ice. The
48
+ * mountain itself is a later pass (peak and pass inside this polygon).
49
+ */
50
+ export declare const WESTERN_ICE: WesternPolygon;
51
+ /**
52
+ * The x where each edge of `poly` crosses the line z (the even-odd rule), sorted. Paired up they are the polygon's
53
+ * spans on that line: [x0, x1), [x2, x3), ...
54
+ */
55
+ export declare function polygonCrossings(poly: WesternPolygon, z: number): number[];
56
+ /** Is the tile (lx, lz) inside `poly`? Tested at the tile's centre, so a vertex on x 460 keeps tile 459 and not 460. */
57
+ export declare function inWesternPolygon(lx: number, lz: number, poly: WesternPolygon): boolean;
58
+ /**
59
+ * The land's tiles on local row lz, as inclusive [first, last] column runs (tile centres inside the coast). The
60
+ * backend lays the land row by row from these instead of testing 700,000 tiles against the polygon one by one.
61
+ */
62
+ export declare function westernLandRowSpans(lz: number): Array<[number, number]>;
63
+ /** Is a WORLD tile on the land (inside the coast)? */
64
+ export declare function inWesternLand(x: number, z: number): boolean;
65
+ /** Is a WORLD tile in the north-east ice corner (on the land and inside WESTERN_ICE)? */
66
+ export declare function inWesternIce(x: number, z: number): boolean;
67
+ /**
68
+ * Named tiles for the admin Teleport panel and the smokes (world tiles, each a plain ground tile the blockout lays).
69
+ * The first stop's platform is phase 0c's stub (types westernTrain.ts WESTERN_ISLE_STAND).
70
+ */
71
+ export declare const WESTERN_LANDING_BEACH: {
72
+ x: number;
73
+ z: number;
74
+ };
75
+ export declare const WESTERN_ICE_STAND: {
76
+ x: number;
77
+ z: number;
78
+ };
79
+ export declare const WESTERN_HEARTLAND_STAND: {
80
+ x: number;
81
+ z: number;
82
+ };
83
+ export declare const WESTERN_WEST_COAST_STAND: {
84
+ x: number;
85
+ z: number;
86
+ };
87
+ /**
88
+ * The land's discovery zone, in the world frame (types expandedContracts.ts INSERTED_DISCOVERY_ZONES, the same shape
89
+ * as Hope Town's and Ringstone's): the whole land's box, so arriving anywhere on it names the Western Kingdoms on the
90
+ * Discovered card and the far-teleport cover. The places a later phase builds get their own smaller zones listed
91
+ * BEFORE this one (discoveryZoneAt takes the first match).
92
+ */
93
+ export declare const WESTERN_KINGDOMS_DISCOVERY_ZONE: DiscoveryZone;
94
+ /** The land's chart (types dungeonCharts.ts DUNGEON_CHARTS, served by backend /dungeon-maps): the land and a ring of sea. */
95
+ export declare const WESTERN_CHART_ID = "western-kingdoms";
96
+ export declare const WESTERN_CHART_MARGIN = 8;
97
+ /**
98
+ * James's decision 2 (2026-10-10): the join between our west coast and the Western Kingdoms cannot be crossed on foot,
99
+ * and our own west cliffs SHOW why: the stump of an old dwarven viaduct that once carried the line west, two arches still
100
+ * standing on the Northwest Battlefield's south grass at Calverton's latitude (the red box on his marked map), its last
101
+ * span snapped off over the cliff, and the shattered stones of it on the shore. Beyond the cliff the frontend draws the
102
+ * rest (WesternVista: the broken piers marching out into the sea, the far coast and the ice mountain on the horizon);
103
+ * none of that is tiles.
104
+ *
105
+ * Built from the Sundered Span's Blender kit (quest-workshop spanlib: spanpier, spanbay, spanbrokena and the fallen
106
+ * stones) at WESTERN_BREACH_SCALE, standing east-west (facing 'n', so a piece's `across` runs along x) with its deck at
107
+ * WESTERN_BREACH_DECK_METRES above the sea whatever the ground under it (the client seats it by that, not by the tile).
108
+ * Walkable-safe: the piers and the broken end block their tiles, the deck is never a walk surface (no tile is laid at
109
+ * its height and nothing climbs to it), and the sea cliff's crag rocks (x 2-3, blocked all along our west edge) stay
110
+ * blocked under the broken end, so nothing new can be walked past; the arches' openings stay open ground (walk under
111
+ * them north to south).
112
+ */
113
+ export declare const WESTERN_BREACH_Z = 650;
114
+ /** The tiles the breach pass clears and dresses (world tiles, overworld). */
115
+ export declare const WESTERN_BREACH_BOX: {
116
+ readonly minX: 0;
117
+ readonly maxX: 26;
118
+ readonly minZ: 638;
119
+ readonly maxZ: 662;
120
+ };
121
+ /**
122
+ * The shattered pass: the rows where our sea cliff's crag rocks (the tall rock wall along x 2-3, blocked all along the
123
+ * west edge) are gone, broken away where the line ran out onto the viaduct, so from the grass the sea and the far shore
124
+ * show through the gap. The cliff's tiles stay blocked: a gap to look through, never a way down.
125
+ */
126
+ export declare const WESTERN_BREACH_GAP: {
127
+ readonly minZ: 641;
128
+ readonly maxZ: 659;
129
+ };
130
+ /** The cliff's columns (the crag rocks stand on x 2 and 3; x 0-1 is the sea). */
131
+ export declare const WESTERN_CLIFF_MAX_X = 3;
132
+ /** The span kit is built for a road bridge eleven tiles wide; the line's viaduct is drawn at this share of it. */
133
+ export declare const WESTERN_BREACH_SCALE = 0.7;
134
+ /** The viaduct's deck above the sea (metres): the kit's piers reach 5.4 below their deck at full size, so its feet are in the ground. */
135
+ export declare const WESTERN_BREACH_DECK_METRES = 3.7;
136
+ /** The span kit's paving above its model origin at full size (quest-workshop spanlib DECK; the client's spanPaving drop). */
137
+ export declare const SPAN_KIT_DECK_METRES = 5.4;
138
+ export type WesternBreachPiece = {
139
+ id: string;
140
+ /** The span kit model and its facing (`<model>-<facing>`). */
141
+ style: string;
142
+ x: number;
143
+ z: number;
144
+ scale: number;
145
+ /** A piece of the viaduct itself (seated by its deck), not a fallen stone or a post. */
146
+ viaduct: boolean;
147
+ };
148
+ /**
149
+ * West to east from the cliff: the snapped-off span over the cliff edge and the sea, then pier, arch, pier, arch, pier,
150
+ * eight tiles between pier centres (the kit's ten at full size, near enough at 0.7 that each arch bears on its piers).
151
+ */
152
+ export declare const WESTERN_BREACH_PIECES: readonly WesternBreachPiece[];
153
+ /** Is an entity id one of the breach's pieces (the client seats and scales them by WESTERN_BREACH_PIECES)? */
154
+ export declare function westernBreachPiece(id: string): WesternBreachPiece | undefined;
155
+ /**
156
+ * The tiles the viaduct blocks: under each pier and under the broken span, the rows its depth covers. The arches'
157
+ * spans between the piers stay open ground.
158
+ */
159
+ export declare const WESTERN_BREACH_BLOCKED: ReadonlyArray<readonly [number, number]>;
160
+ /** Where to stand to see it: on the grass south-east of the arches, looking west along them to the sea. */
161
+ export declare const WESTERN_BREACH_STAND: {
162
+ readonly x: 16;
163
+ readonly z: 664;
164
+ };
165
+ /**
166
+ * The far shore as seen from ours (the frontend's WesternVista, no tiles): it is drawn west of x 0 from anywhere on our
167
+ * west coast between these rows, the Battlefield's snow line to the Hope Beach fields, within this many tiles of the
168
+ * edge.
169
+ */
170
+ export declare const WESTERN_VISTA_ROWS: {
171
+ readonly minZ: 470;
172
+ readonly maxZ: 1120;
173
+ };
174
+ export declare const WESTERN_VISTA_REACH_X = 150;
175
+ //# sourceMappingURL=westernKingdoms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"westernKingdoms.d.ts","sourceRoot":"","sources":["../src/westernKingdoms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * The Western Kingdoms (James, 2026-10-10): a landmass as big as today's world, drawn WEST of our coast on his marked
3
+ * map (design id `western-kingdoms-vision`), reached only by the dwarven train. Plan:
4
+ * `.cursor/task-plans/2026-10-10-west-land-build-plan.md`, option C2 (James said yes to every recommendation).
5
+ *
6
+ * Where it lives: its own strip of the grid, the grid's last region, east of the Arcane strip (constants.ts
7
+ * WESTERN_ORIGIN_X, WESTERN_CHUNKS_X, WESTERN_STRIP_WIDTH, WESTERN_END_X; worldRegionAt answers 'western'). Nothing in
8
+ * the overworld, the underground or the Arcane strip moved, so no save migrates and WORLD_REVISION is unchanged. The
9
+ * strip is the full grid height (rows are shared across the grid).
10
+ *
11
+ * Phase 0a: the strip exists and is open sea. Phase 1a (this version): the land's OUTLINE, a blockout traced from the
12
+ * marked map, in ZONE-LOCAL tiles with one origin (WESTERN_LAND_X/Z, westernWorld/westernLocal, the Arcane Realms'
13
+ * pattern), so the land can later be moved (a wider strip, or real columns after an x insert) by changing its origin.
14
+ * Any hash a later pass uses must read LOCAL coordinates for the same reason. Backend placeWesternKingdoms lays it as
15
+ * plain ground: grass, the snow of the north-east ice corner, a beach ring; nothing on it yet.
16
+ */
17
+ import { WESTERN_END_X, WESTERN_ORIGIN_X } from './constants.js';
18
+ // Not constants.ts GRID_HEIGHT: that is the generator frame's (1248 rows); the public, final grid is layout 2's.
19
+ import { EXPANDED_WORLD_HEIGHT as GRID_HEIGHT } from './starterExpansion.js';
20
+ export const WESTERN_KINGDOMS_NAME = 'The Western Kingdoms';
21
+ /** The strip's open sea round the land: deep water at height 0, walkable as water is (backend placeWesternKingdoms). */
22
+ export const WESTERN_SEA_HEIGHT = 0;
23
+ /** Is a world tile inside the Western strip (every row of its columns)? */
24
+ export function inWesternStrip(x, z) {
25
+ return x >= WESTERN_ORIGIN_X && x < WESTERN_END_X && z >= 0 && z < GRID_HEIGHT;
26
+ }
27
+ /** A world x as a column of the strip (0 at WESTERN_ORIGIN_X), and back. */
28
+ export function westernStripX(x) {
29
+ return x - WESTERN_ORIGIN_X;
30
+ }
31
+ export function westernWorldX(stripX) {
32
+ return WESTERN_ORIGIN_X + stripX;
33
+ }
34
+ /* ------------------------------------------------------------------ *
35
+ * The land's frame (phase 1a)
36
+ * ------------------------------------------------------------------ */
37
+ /**
38
+ * The land's box in the strip: 560 x 1248 tiles (James drew it about as tall as today's world and a little narrower;
39
+ * the plan's "about 576 x 1250"), local (0, 0) at world (WESTERN_LAND_X, WESTERN_LAND_Z).
40
+ *
41
+ * The margins are open sea: 80 columns on the strip's west side, so the land stays more than three chunks (the
42
+ * server streams two rings and has no region filter on NPCs, audit risk 5) from the Arcane Realms' land, whose east
43
+ * coast is at x 1509; 64 on the east side to the grid's edge, and 64 rows north and south.
44
+ */
45
+ export const WESTERN_LAND_W = 560;
46
+ export const WESTERN_LAND_H = 1248;
47
+ export const WESTERN_LAND_X = WESTERN_ORIGIN_X + 80;
48
+ export const WESTERN_LAND_Z = 64;
49
+ /** The land's ground height (plain, flat for the blockout) and the beach ring's two steps down to the sea. */
50
+ export const WESTERN_GROUND_HEIGHT = 3;
51
+ export const WESTERN_BEACH_HEIGHTS = [1, 2];
52
+ export function westernWorld(lx, lz) {
53
+ return { x: WESTERN_LAND_X + lx, z: WESTERN_LAND_Z + lz };
54
+ }
55
+ export function westernLocal(x, z) {
56
+ return { x: x - WESTERN_LAND_X, z: z - WESTERN_LAND_Z };
57
+ }
58
+ /**
59
+ * The coast, land-local, clockwise from the north-west. A blockout traced from James's marked map
60
+ * (`.cursor/task-plans/2026-10-10-western-kingdoms-island-design/james-vision-marked-map.webp`): one big landmass,
61
+ * roughly the box he drew west of our coast, its long east shore facing our west coast (the impassable join, the red
62
+ * box, is on the paper map, not in the grid). Kept simple and generous; later passes refine it.
63
+ *
64
+ * The one fixed point is the south-east bay (local x 460, z 1040-1076): the train's first stop stands on its west
65
+ * shore (phase 0c's stub, types westernTrain.ts WESTERN_ISLE_*: the platform and rock cap on the land, the causeway
66
+ * running east out into the bay, where the line comes up out of the sea).
67
+ */
68
+ export const WESTERN_LAND_OUTLINE = [
69
+ // North coast.
70
+ [28, 34], [110, 12], [205, 26], [300, 4], [410, 18], [505, 6], [552, 40],
71
+ // East coast, facing our west coast across the sea.
72
+ [560, 150], [544, 290], [558, 430], [538, 560], [556, 700], [540, 830], [552, 950],
73
+ // The south-east bay and the first stop's shore (x 460 from z 1040 to 1076).
74
+ [520, 1010], [470, 1030], [460, 1040], [460, 1076], [486, 1110], [528, 1150], [536, 1200], [500, 1236],
75
+ // South coast.
76
+ [400, 1246], [300, 1232], [190, 1248], [90, 1236], [20, 1210],
77
+ // West coast.
78
+ [8, 1080], [22, 940], [4, 800], [18, 640], [2, 480], [16, 320], [0, 180],
79
+ ];
80
+ /**
81
+ * The ice corner: the land's north-east (beside our Frozen North on the paper map, where James wrote "ice area / huge
82
+ * ice mountain"), a ragged diagonal on its south-west side. Land-local; only the part inside the coast is ice. The
83
+ * mountain itself is a later pass (peak and pass inside this polygon).
84
+ */
85
+ export const WESTERN_ICE = [
86
+ [250, -16], [576, -16], [576, 760], [470, 720], [400, 640], [330, 560], [270, 430], [240, 250],
87
+ ];
88
+ /**
89
+ * The x where each edge of `poly` crosses the line z (the even-odd rule), sorted. Paired up they are the polygon's
90
+ * spans on that line: [x0, x1), [x2, x3), ...
91
+ */
92
+ export function polygonCrossings(poly, z) {
93
+ const xs = [];
94
+ for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {
95
+ const [xi, zi] = poly[i];
96
+ const [xj, zj] = poly[j];
97
+ if ((zi > z) !== (zj > z))
98
+ xs.push(xi + ((z - zi) * (xj - xi)) / (zj - zi));
99
+ }
100
+ return xs.sort((a, b) => a - b);
101
+ }
102
+ /** Is the tile (lx, lz) inside `poly`? Tested at the tile's centre, so a vertex on x 460 keeps tile 459 and not 460. */
103
+ export function inWesternPolygon(lx, lz, poly) {
104
+ const cx = lx + 0.5;
105
+ let inside = false;
106
+ for (const x of polygonCrossings(poly, lz + 0.5)) {
107
+ if (x > cx)
108
+ break;
109
+ inside = !inside;
110
+ }
111
+ return inside;
112
+ }
113
+ /**
114
+ * The land's tiles on local row lz, as inclusive [first, last] column runs (tile centres inside the coast). The
115
+ * backend lays the land row by row from these instead of testing 700,000 tiles against the polygon one by one.
116
+ */
117
+ export function westernLandRowSpans(lz) {
118
+ const xs = polygonCrossings(WESTERN_LAND_OUTLINE, lz + 0.5);
119
+ const spans = [];
120
+ for (let k = 0; k + 1 < xs.length; k += 2) {
121
+ const first = Math.max(0, Math.ceil(xs[k] - 0.5));
122
+ const last = Math.min(WESTERN_LAND_W - 1, Math.ceil(xs[k + 1] - 0.5) - 1);
123
+ if (last >= first)
124
+ spans.push([first, last]);
125
+ }
126
+ return spans;
127
+ }
128
+ /** Is a WORLD tile on the land (inside the coast)? */
129
+ export function inWesternLand(x, z) {
130
+ const l = westernLocal(x, z);
131
+ if (l.x < 0 || l.z < 0 || l.x >= WESTERN_LAND_W || l.z >= WESTERN_LAND_H)
132
+ return false;
133
+ return inWesternPolygon(l.x, l.z, WESTERN_LAND_OUTLINE);
134
+ }
135
+ /** Is a WORLD tile in the north-east ice corner (on the land and inside WESTERN_ICE)? */
136
+ export function inWesternIce(x, z) {
137
+ if (!inWesternLand(x, z))
138
+ return false;
139
+ const l = westernLocal(x, z);
140
+ return inWesternPolygon(l.x, l.z, WESTERN_ICE);
141
+ }
142
+ /**
143
+ * Named tiles for the admin Teleport panel and the smokes (world tiles, each a plain ground tile the blockout lays).
144
+ * The first stop's platform is phase 0c's stub (types westernTrain.ts WESTERN_ISLE_STAND).
145
+ */
146
+ export const WESTERN_LANDING_BEACH = westernWorld(466, 1092);
147
+ export const WESTERN_ICE_STAND = westernWorld(470, 300);
148
+ export const WESTERN_HEARTLAND_STAND = westernWorld(200, 640);
149
+ export const WESTERN_WEST_COAST_STAND = westernWorld(40, 700);
150
+ /**
151
+ * The land's discovery zone, in the world frame (types expandedContracts.ts INSERTED_DISCOVERY_ZONES, the same shape
152
+ * as Hope Town's and Ringstone's): the whole land's box, so arriving anywhere on it names the Western Kingdoms on the
153
+ * Discovered card and the far-teleport cover. The places a later phase builds get their own smaller zones listed
154
+ * BEFORE this one (discoveryZoneAt takes the first match).
155
+ */
156
+ export const WESTERN_KINGDOMS_DISCOVERY_ZONE = {
157
+ id: 'western-kingdoms',
158
+ label: WESTERN_KINGDOMS_NAME,
159
+ coordinateFrame: 'world',
160
+ minX: WESTERN_LAND_X,
161
+ maxX: WESTERN_LAND_X + WESTERN_LAND_W - 1,
162
+ minZ: WESTERN_LAND_Z,
163
+ maxZ: WESTERN_LAND_Z + WESTERN_LAND_H - 1,
164
+ };
165
+ /** The land's chart (types dungeonCharts.ts DUNGEON_CHARTS, served by backend /dungeon-maps): the land and a ring of sea. */
166
+ export const WESTERN_CHART_ID = 'western-kingdoms';
167
+ export const WESTERN_CHART_MARGIN = 8;
168
+ /* ------------------------------------------------------------------ *
169
+ * Our side of the join: the broken viaduct (phase 1b, 2026-10-10)
170
+ * ------------------------------------------------------------------ */
171
+ /**
172
+ * James's decision 2 (2026-10-10): the join between our west coast and the Western Kingdoms cannot be crossed on foot,
173
+ * and our own west cliffs SHOW why: the stump of an old dwarven viaduct that once carried the line west, two arches still
174
+ * standing on the Northwest Battlefield's south grass at Calverton's latitude (the red box on his marked map), its last
175
+ * span snapped off over the cliff, and the shattered stones of it on the shore. Beyond the cliff the frontend draws the
176
+ * rest (WesternVista: the broken piers marching out into the sea, the far coast and the ice mountain on the horizon);
177
+ * none of that is tiles.
178
+ *
179
+ * Built from the Sundered Span's Blender kit (quest-workshop spanlib: spanpier, spanbay, spanbrokena and the fallen
180
+ * stones) at WESTERN_BREACH_SCALE, standing east-west (facing 'n', so a piece's `across` runs along x) with its deck at
181
+ * WESTERN_BREACH_DECK_METRES above the sea whatever the ground under it (the client seats it by that, not by the tile).
182
+ * Walkable-safe: the piers and the broken end block their tiles, the deck is never a walk surface (no tile is laid at
183
+ * its height and nothing climbs to it), and the sea cliff's crag rocks (x 2-3, blocked all along our west edge) stay
184
+ * blocked under the broken end, so nothing new can be walked past; the arches' openings stay open ground (walk under
185
+ * them north to south).
186
+ */
187
+ export const WESTERN_BREACH_Z = 650;
188
+ /** The tiles the breach pass clears and dresses (world tiles, overworld). */
189
+ export const WESTERN_BREACH_BOX = { minX: 0, maxX: 26, minZ: 638, maxZ: 662 };
190
+ /**
191
+ * The shattered pass: the rows where our sea cliff's crag rocks (the tall rock wall along x 2-3, blocked all along the
192
+ * west edge) are gone, broken away where the line ran out onto the viaduct, so from the grass the sea and the far shore
193
+ * show through the gap. The cliff's tiles stay blocked: a gap to look through, never a way down.
194
+ */
195
+ export const WESTERN_BREACH_GAP = { minZ: 641, maxZ: 659 };
196
+ /** The cliff's columns (the crag rocks stand on x 2 and 3; x 0-1 is the sea). */
197
+ export const WESTERN_CLIFF_MAX_X = 3;
198
+ /** The span kit is built for a road bridge eleven tiles wide; the line's viaduct is drawn at this share of it. */
199
+ export const WESTERN_BREACH_SCALE = 0.7;
200
+ /** The viaduct's deck above the sea (metres): the kit's piers reach 5.4 below their deck at full size, so its feet are in the ground. */
201
+ export const WESTERN_BREACH_DECK_METRES = 3.7;
202
+ /** The span kit's paving above its model origin at full size (quest-workshop spanlib DECK; the client's spanPaving drop). */
203
+ export const SPAN_KIT_DECK_METRES = 5.4;
204
+ const breachPiece = (id, model, x, z, viaduct = true, facing = 'n') => ({
205
+ id: `western-breach-${id}`,
206
+ style: `${model}-${facing}`,
207
+ x,
208
+ z,
209
+ scale: viaduct ? WESTERN_BREACH_SCALE : 1,
210
+ viaduct,
211
+ });
212
+ /**
213
+ * West to east from the cliff: the snapped-off span over the cliff edge and the sea, then pier, arch, pier, arch, pier,
214
+ * eight tiles between pier centres (the kit's ten at full size, near enough at 0.7 that each arch bears on its piers).
215
+ */
216
+ export const WESTERN_BREACH_PIECES = [
217
+ breachPiece('broken', 'spanbrokena', 2, WESTERN_BREACH_Z),
218
+ breachPiece('pier-1', 'spanpier', 5, WESTERN_BREACH_Z),
219
+ breachPiece('arch-1', 'spanbay', 9, WESTERN_BREACH_Z),
220
+ breachPiece('pier-2', 'spanpier', 13, WESTERN_BREACH_Z),
221
+ breachPiece('arch-2', 'spanbay', 17, WESTERN_BREACH_Z),
222
+ breachPiece('pier-3', 'spanpier', 21, WESTERN_BREACH_Z),
223
+ // The shattered stones: off the broken end and along the shore, clear of the arches' openings.
224
+ breachPiece('stone-large', 'spanstonelarge', 6, 659, false, 'e'),
225
+ breachPiece('keystone', 'spankeystone', 9, 644, false, 'e'),
226
+ breachPiece('stone-medium', 'spanstonemedium', 4, 643, false, 'e'),
227
+ breachPiece('stone-small', 'spanstonesmall', 8, 657, false, 'e'),
228
+ breachPiece('stone-small-2', 'spanstonesmall', 24, 656, false, 'e'),
229
+ // Two of the line's own posts on the landward side: the way west is the train now.
230
+ breachPiece('signpost', 'westsignpost', 17, 661, false, 's'),
231
+ breachPiece('waymarker', 'westwaymarker', 25, 643, false, 's'),
232
+ ];
233
+ /** Is an entity id one of the breach's pieces (the client seats and scales them by WESTERN_BREACH_PIECES)? */
234
+ export function westernBreachPiece(id) {
235
+ return id.startsWith('western-breach-') ? WESTERN_BREACH_PIECES.find((p) => p.id === id) : undefined;
236
+ }
237
+ /** The rows a viaduct piece covers at its scale (the kit's piers and the broken span are 14.46 deep at full size). */
238
+ const BREACH_DEEP_TILES = Math.ceil((14.46 * WESTERN_BREACH_SCALE) / 2);
239
+ /** The kit's widths at full size, along the viaduct (x). */
240
+ const BREACH_ACROSS_METRES = { spanpier: 3.5, spanbrokena: 4.71 };
241
+ /**
242
+ * The tiles the viaduct blocks: under each pier and under the broken span, the rows its depth covers. The arches'
243
+ * spans between the piers stay open ground.
244
+ */
245
+ export const WESTERN_BREACH_BLOCKED = (() => {
246
+ const out = [];
247
+ for (const p of WESTERN_BREACH_PIECES) {
248
+ const model = p.style.split('-')[0];
249
+ const across = BREACH_ACROSS_METRES[model];
250
+ if (!p.viaduct || across === undefined)
251
+ continue;
252
+ const half = (across * p.scale) / 2;
253
+ const cx = p.x + 0.5;
254
+ for (let x = Math.floor(cx - half + 0.25); x <= Math.floor(cx + half - 0.25); x++) {
255
+ for (let z = p.z - BREACH_DEEP_TILES + 1; z <= p.z + BREACH_DEEP_TILES - 1; z++)
256
+ out.push([x, z]);
257
+ }
258
+ }
259
+ return out;
260
+ })();
261
+ /** Where to stand to see it: on the grass south-east of the arches, looking west along them to the sea. */
262
+ export const WESTERN_BREACH_STAND = { x: 16, z: 664 };
263
+ /**
264
+ * The far shore as seen from ours (the frontend's WesternVista, no tiles): it is drawn west of x 0 from anywhere on our
265
+ * west coast between these rows, the Battlefield's snow line to the Hope Beach fields, within this many tiles of the
266
+ * edge.
267
+ */
268
+ export const WESTERN_VISTA_ROWS = { minZ: 470, maxZ: 1120 };
269
+ export const WESTERN_VISTA_REACH_X = 150;
270
+ //# sourceMappingURL=westernKingdoms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"westernKingdoms.js","sourceRoot":"","sources":["../src/westernKingdoms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,iHAAiH;AACjH,OAAO,EAAE,qBAAqB,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAE5D,wHAAwH;AACxH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,OAAO,CAAC,IAAI,gBAAgB,IAAI,CAAC,GAAG,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;AACjF,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,GAAG,gBAAgB,CAAC;AAC9B,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,gBAAgB,GAAG,MAAM,CAAC;AACnC,CAAC;AAED;;wEAEwE;AAExE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,GAAG,EAAE,CAAC;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,8GAA8G;AAC9G,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,qBAAqB,GAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE/D,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,EAAU;IACjD,OAAO,EAAE,CAAC,EAAE,cAAc,GAAG,EAAE,EAAE,CAAC,EAAE,cAAc,GAAG,EAAE,EAAE,CAAC;AAC5D,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC;AAC1D,CAAC;AAID;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,eAAe;IACf,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;IACxE,oDAAoD;IACpD,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IAClF,6EAA6E;IAC7E,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;IACtG,eAAe;IACf,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC;IAC7D,cAAc;IACd,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;CACzE,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;CAC/F,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoB,EAAE,CAAS;IAC9D,MAAM,EAAE,GAAa,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC9D,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC1B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC1B,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;YAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAE,EAAU,EAAE,IAAoB;IAC3E,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IACpB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE;YAAE,MAAM;QAClB,MAAM,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,MAAM,EAAE,GAAG,gBAAgB,CAAC,oBAAoB,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC;IAC5D,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,IAAI,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc;QAAE,OAAO,KAAK,CAAC;IACvF,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC1D,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAkB;IAC5D,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,qBAAqB;IAC5B,eAAe,EAAE,OAAO;IACxB,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,cAAc,GAAG,cAAc,GAAG,CAAC;IACzC,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,cAAc,GAAG,cAAc,GAAG,CAAC;CAC1C,CAAC;AAEF,6HAA6H;AAC7H,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC;;wEAEwE;AAExE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAW,CAAC;AACvF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAW,CAAC;AACpE,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,kHAAkH;AAClH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,yIAAyI;AACzI,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,6HAA6H;AAC7H,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAaxC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,CAAS,EAAE,CAAS,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,GAAG,GAAG,EAAsB,EAAE,CAAC,CAAC;IAC1H,EAAE,EAAE,kBAAkB,EAAE,EAAE;IAC1B,KAAK,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE;IAC3B,CAAC;IACD,CAAC;IACD,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO;CACR,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACzD,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACtD,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACrD,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,CAAC;IACvD,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,CAAC;IACtD,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,CAAC;IACvD,+FAA+F;IAC/F,WAAW,CAAC,aAAa,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAChE,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAC3D,WAAW,CAAC,cAAc,EAAE,iBAAiB,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAClE,WAAW,CAAC,aAAa,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAChE,WAAW,CAAC,eAAe,EAAE,gBAAgB,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IACnE,mFAAmF;IACnF,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAC5D,WAAW,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;CAC/D,CAAC;AAEF,8GAA8G;AAC9G,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvG,CAAC;AAED,sHAAsH;AACtH,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,4DAA4D;AAC5D,MAAM,oBAAoB,GAAqC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAEpG;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA6C,CAAC,GAAG,EAAE;IACpF,MAAM,GAAG,GAAqC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACjD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClF,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,EAAE,CAAC;AAEL,2GAA2G;AAC3G,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAW,CAAC;AAE/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAW,CAAC;AACrE,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC"}
@@ -56,8 +56,71 @@ export declare const WESTERN_TUNNEL_STAND: {
56
56
  readonly x: number;
57
57
  readonly z: number;
58
58
  };
59
+ /**
60
+ * PHASE 0c SPIKE (2026-10-10, plan `.cursor/task-plans/2026-10-10-western-phase0c.md`; parent
61
+ * `2026-10-10-west-land-build-plan.md`): a stub of the Western Isle's halt in the Western Kingdoms' strip, to measure
62
+ * the train's jump into a new region. NOT the designed first stop: a copy of the home station's layout translated into
63
+ * the strip's open sea (the platform, the gap row with its step plates, the sea kerb, the line, the portal in a rock
64
+ * cap), with a short causeway straight off its east end into the sea. The train's third leg ('isle') runs from the
65
+ * causeway's sea end west past the platform into the cap, then wraps to the home causeway's sea end.
66
+ *
67
+ * Because the stub is the docked layout moved by (WESTERN_ISLE_SHIFT_X, WESTERN_ISLE_SHIFT_Z), a train standing at
68
+ * the isle stop has every docked tile exactly that far from its world tile: the step plates, doorways and platform
69
+ * edge tiles line up as at home (westernStopSteps maps them through the leg, so a later stop need not be a copy).
70
+ */
71
+ export declare const WESTERN_ISLE_SHIFT_X = 1970;
72
+ export declare const WESTERN_ISLE_SHIFT_Z = -32;
73
+ export declare const WESTERN_ISLE_TRACK_Z: number;
74
+ /** The stub's causeway, the last 22 tiles of the line, stepping down to the waterline (its sea end the leg's x0). */
75
+ export declare const WESTERN_ISLE_SEA_END_X = 2097;
76
+ export declare const WESTERN_ISLE_CAUSEWAY: {
77
+ readonly minX: number;
78
+ readonly maxX: 2097;
79
+ readonly minZ: number;
80
+ readonly maxZ: number;
81
+ };
82
+ export declare function westernIsleCausewayHeight(x: number): number;
83
+ type Box = {
84
+ minX: number;
85
+ maxX: number;
86
+ minZ: number;
87
+ maxZ: number;
88
+ };
89
+ export declare const WESTERN_ISLE_PLATFORM: Box;
90
+ export declare const WESTERN_ISLE_PLATFORM_PIECES: (readonly [number, number])[];
91
+ export declare const WESTERN_ISLE_GAP_ROW: {
92
+ readonly minX: number;
93
+ readonly maxX: number;
94
+ readonly z: number;
95
+ };
96
+ export declare const WESTERN_ISLE_SEA_KERB: {
97
+ readonly minX: number;
98
+ readonly maxX: number;
99
+ readonly z: number;
100
+ };
101
+ /** The rock cap the line runs into (the home knoll's box, moved), and the portal on its east face. */
102
+ export declare const WESTERN_ISLE_KNOLL: Box;
103
+ export declare const WESTERN_ISLE_MOUTH: {
104
+ readonly x: number;
105
+ readonly z: number;
106
+ readonly style: "westportal-e";
107
+ };
108
+ export declare const WESTERN_ISLE_MOUTH_ID = "western-isle-spike-mouth";
109
+ /** The stub's ground: the knoll's west foot to the causeway's start, a few rows round the station (all laid on the strip's sea). */
110
+ export declare const WESTERN_ISLE_LAND: {
111
+ readonly minX: number;
112
+ readonly maxX: number;
113
+ readonly minZ: number;
114
+ readonly maxZ: number;
115
+ };
116
+ /** Where an admin /tp lands on the stub: the platform's middle. */
117
+ export declare const WESTERN_ISLE_STAND: {
118
+ readonly x: number;
119
+ readonly z: number;
120
+ };
121
+ export declare function inWesternIsleStub(x: number, z: number): boolean;
59
122
  export type WesternTrainSegment = {
60
- id: 'surface' | 'tunnel';
123
+ id: 'surface' | 'tunnel' | 'isle';
61
124
  /** The first c on this leg and how many tiles it runs. */
62
125
  c0: number;
63
126
  length: number;
@@ -68,6 +131,8 @@ export type WesternTrainSegment = {
68
131
  dz: number;
69
132
  };
70
133
  export declare const WESTERN_TRAIN_SEGMENTS: readonly WesternTrainSegment[];
134
+ /** c of the nose when the train stands at the isle stub (the nose on the platform's west end, as at home). */
135
+ export declare const WESTERN_ISLE_STOP_C: number;
71
136
  export declare const WESTERN_TRAIN_CIRCUIT_LENGTH: number;
72
137
  /** c of the nose when the train stands at the platform (loco's nose at x 30). */
73
138
  export declare const WESTERN_TRAIN_PLATFORM_C: number;
@@ -133,6 +198,11 @@ export declare const WESTERN_TRAIN_ALIGHT_MOVING_TEXT = "The train is moving. Wa
133
198
  * platform in the strip on this bore, reached from the city by a stair or lift (a cave entrance in the city's south
134
199
  * quarter, the way the Rat Tunnel is reached), placed when that stair is built.
135
200
  */
201
+ /**
202
+ * `steps`: the stop has its own step plates on its own platform (westernStopSteps): riders step off there and people
203
+ * on that platform board there, while the train stands with its doors open. The home platform's plates are the docked
204
+ * rake's own (WESTERN_STEPS) and need no flag.
205
+ */
136
206
  export type WesternTrainStop = {
137
207
  id: string;
138
208
  name: string;
@@ -140,6 +210,7 @@ export type WesternTrainStop = {
140
210
  dwellMs: number;
141
211
  enabled: boolean;
142
212
  note: string;
213
+ steps?: boolean;
143
214
  };
144
215
  export declare const WESTERN_TRAIN_STOPS: readonly WesternTrainStop[];
145
216
  /** Duration (ms) of a run of D tiles from a stop to a stop: up to speed, cruise, slow to a stand. */
@@ -206,4 +277,36 @@ export declare function westernPlatformTileNear(x: number): {
206
277
  x: number;
207
278
  y: number;
208
279
  };
280
+ /**
281
+ * One step plate of a stop with its own platform: the home plate's docked tiles carried by the leg to where the train
282
+ * stands at that stop. `x`/`z` the plate's world tile, `platform` the world tile a rider steps down to, `doorway` the
283
+ * DOCKED tile someone boarding there is put on (their tile is always kept in the docked frame aboard).
284
+ */
285
+ export type WesternStopStep = {
286
+ stopId: string;
287
+ car: string;
288
+ id: string;
289
+ x: number;
290
+ z: number;
291
+ platform: {
292
+ x: number;
293
+ y: number;
294
+ };
295
+ doorway: {
296
+ x: number;
297
+ y: number;
298
+ };
299
+ };
300
+ export declare function westernStopSteps(stop: WesternTrainStop): WesternStopStep[];
301
+ /** Every running stop's own plates (not the home platform's). */
302
+ export declare const WESTERN_STOP_STEPS: readonly WesternStopStep[];
303
+ export declare function westernStopStepAt(x: number, z: number): WesternStopStep | null;
304
+ export declare function westernStopStepById(id: string | undefined): WesternStopStep | null;
305
+ /** The train standing at a stop (not the home platform) at `nowMs`, or null. */
306
+ export declare function westernTrainAtStop(nowMs: number, stopId: string): WesternTrainState | null;
307
+ /** The train at a stop with its doors open (more than the shut time to go), or null. */
308
+ export declare function westernStopDoorsOpen(nowMs: number, stopId: string): WesternTrainState | null;
309
+ /** Why a stop's plates refuse at `nowMs`. */
310
+ export declare function westernStopNoBoardingText(nowMs: number, stopId: string): string;
311
+ export {};
209
312
  //# sourceMappingURL=westernTrain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"westernTrain.d.ts","sourceRoot":"","sources":["../src/westernTrain.ts"],"names":[],"mappings":"AAwCA,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;AAMlF,uGAAuG;AACvG,eAAO,MAAM,oBAAoB,QAA8B,CAAC;AAChE,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,QAA8D,CAAC;AAChG,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,QAAkD,CAAC;AACzF,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,gHAAgH;AAChH,eAAO,MAAM,sBAAsB;;;;;CAKzB,CAAC;AACX,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAGnE;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACnF,eAAO,MAAM,mBAAmB,EAAE,SAAS,gBAAgB,EAgBvD,CAAC;AAEL,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEpE;AAMD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAyB,CAAC;AACvD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,2BAA2B,IAA0B,CAAC;AACnE,+GAA+G;AAC/G,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AACX,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAG7D;AACD,+GAA+G;AAC/G,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,wEAAwE;AACxE,eAAO,MAAM,oBAAoB;;;CAA8F,CAAC;AAEhI,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,SAAS,GAAG,QAAQ,CAAC;IACzB,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,SAAS,mBAAmB,EAGhE,CAAC;AACF,eAAO,MAAM,4BAA4B,QAA2D,CAAC;AACrG,iFAAiF;AACjF,eAAO,MAAM,wBAAwB,QAA2C,CAAC;AAMjF,2GAA2G;AAC3G,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAGvE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AACD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAIpE;AACD,4GAA4G;AAC5G,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAIlH;AACD,iGAAiG;AACjG,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAGzH;AACD,wHAAwH;AACxH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpF;AACD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAErE;AACD,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAG/G;AACD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWzG;AAMD,6FAA6F;AAC7F,eAAO,MAAM,sBAAsB,QAAiC,CAAC;AACrE,uGAAuG;AACvG,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,uFAAuF;AACvF,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,6FAA6F;AAC7F,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,kCAAkC,OAAQ,CAAC;AACxD,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAChE,eAAO,MAAM,6BAA6B,qDAAqD,CAAC;AAChG,eAAO,MAAM,gCAAgC,2CAA2C,CAAC;AACzF,eAAO,MAAM,gCAAgC,8DAA8D,CAAC;AAE5G;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACxH,eAAO,MAAM,mBAAmB,EAAE,SAAS,gBAAgB,EAK1D,CAAC;AAEF,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AACD,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAS1E;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7H,6GAA6G;AAC7G,wBAAgB,qBAAqB,CAAC,KAAK,GAAE,SAAS,gBAAgB,EAAwB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,eAAe,EAAE,CAAA;CAAE,CAc5I;AAED,eAAO,MAAM,sBAAsB,QAAoB,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,iBAAiB,CAAC;IACzB,oDAAoD;IACpD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AASF,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,SAAS;aA5C0C,MAAM;UAAQ,eAAe,EAAE;CA4C7D,GAAG,iBAAiB,CA6BjG;AAED,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAM9E;AACD,0EAA0E;AAC1E,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/D;AACD,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAShE;AACD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUjE;AAED,gGAAgG;AAChG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO9D;AACD,gGAAgG;AAChG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED,4GAA4G;AAC5G,eAAO,MAAM,0BAA0B;;;CAAqD,CAAC;AAC7F,yHAAyH;AACzH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAI3E"}
1
+ {"version":3,"file":"westernTrain.d.ts","sourceRoot":"","sources":["../src/westernTrain.ts"],"names":[],"mappings":"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"}