@dreadwood-types/types 0.1.228 → 0.1.229

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.
Files changed (45) hide show
  1. package/dist/areaGates.d.ts.map +1 -1
  2. package/dist/areaGates.js +18 -0
  3. package/dist/areaGates.js.map +1 -1
  4. package/dist/attackableNpcs.d.ts.map +1 -1
  5. package/dist/attackableNpcs.js +8 -0
  6. package/dist/attackableNpcs.js.map +1 -1
  7. package/dist/bossSignatures.d.ts +1 -1
  8. package/dist/bossSignatures.d.ts.map +1 -1
  9. package/dist/bossSignatures.js +6 -0
  10. package/dist/bossSignatures.js.map +1 -1
  11. package/dist/constants.d.ts +6 -1
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js.map +1 -1
  14. package/dist/dwarfRoad.d.ts +226 -0
  15. package/dist/dwarfRoad.d.ts.map +1 -0
  16. package/dist/dwarfRoad.js +246 -0
  17. package/dist/dwarfRoad.js.map +1 -0
  18. package/dist/dwarfRoadQuest.d.ts +36 -0
  19. package/dist/dwarfRoadQuest.d.ts.map +1 -0
  20. package/dist/dwarfRoadQuest.js +34 -0
  21. package/dist/dwarfRoadQuest.js.map +1 -0
  22. package/dist/dwarfRoadQuestDef.d.ts +7 -0
  23. package/dist/dwarfRoadQuestDef.d.ts.map +1 -0
  24. package/dist/dwarfRoadQuestDef.js +51 -0
  25. package/dist/dwarfRoadQuestDef.js.map +1 -0
  26. package/dist/dwarfRoadWildlife.d.ts +55 -0
  27. package/dist/dwarfRoadWildlife.d.ts.map +1 -0
  28. package/dist/dwarfRoadWildlife.js +88 -0
  29. package/dist/dwarfRoadWildlife.js.map +1 -0
  30. package/dist/expandedContracts.d.ts.map +1 -1
  31. package/dist/expandedContracts.js +2 -1
  32. package/dist/expandedContracts.js.map +1 -1
  33. package/dist/index.d.ts +4 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/quests.d.ts.map +1 -1
  38. package/dist/quests.js +7 -0
  39. package/dist/quests.js.map +1 -1
  40. package/dist/storyQuests.d.ts +1 -1
  41. package/dist/storyQuests.d.ts.map +1 -1
  42. package/dist/storyQuests.js +10 -0
  43. package/dist/storyQuests.js.map +1 -1
  44. package/dist/westernKingdoms.js +1 -1
  45. package/package.json +43 -43
@@ -0,0 +1,226 @@
1
+ /**
2
+ * THE DWARF ROAD (Western heartland stop 6, levels 30-40, free; design sheet `western-heartland-6-dwarf-road`; plan
3
+ * `.cursor/task-plans/2026-10-14-t2-west-b.md`; heartland claims on the board `2026-10-14-early-game-program.md`): a mountain pass
4
+ * that follows the dwarven railway north from Riversend Halt towards the dwarves' underground station. The hardest 1-40 ground:
5
+ * a canyon of blocked rock with the road and a rail line down its floor, the Dwarf Beck's River Crossing, the Old Quarry, the
6
+ * Avalanche Chute, the Cart Run (runaway mine carts), the Cliffside Pass and, at its north end, the Gate Court where the Iron
7
+ * Warden stands before the sealed Dwarf Pass.
8
+ *
9
+ * Where: NORTH of Riversend Halt, in the box below, reached by Riversend's North Path (it leaves that box at (1878, 871)). The land
10
+ * is the blockout's flat grass at height 3 (westernKingdoms.ts); the canyon is a ridge of blocked stone laid round the valley's
11
+ * floor: a mountain mass of blocked rock (dwarfMassHalf either side, rows DWARF_RIDGE_ROWS) with the valley cut out of it, the
12
+ * box's rows below that rock outside the valley too, and a WALL of four rows across the whole land at the north (DWARF_WALL_ROWS), so
13
+ * the only way north is the road, and through the wall only the gate. No new train stop: the
14
+ * circuit v2 is frozen, the rail line is dressing (and the carts' own track).
15
+ *
16
+ * The sealed Dwarf Pass is the standard gate (areaGates.ts `dwarf-pass`: a walk gate in the mass's north wall, Combat 41 and
17
+ * the quest "The Dwarf Pass", not in the game yet): nothing 41+ is built behind it; the land north of the wall stays open grass
18
+ * nobody can reach.
19
+ *
20
+ * Every number is a WORLD tile. The models are kit stand-ins (named in `DWARF_ROAD_PIECES`) until Blender builds exist.
21
+ */
22
+ import type { LanternWakeBox, LanternWakePiece, LanternWakePoint } from './lanternWake.js';
23
+ export declare const DWARF_ROAD_NAME = "The Dwarf Road";
24
+ export declare const DWARF_ROAD_ID = "dwarf-road";
25
+ /** The levels the road's creatures and boss run (sheet 6: 30-40). */
26
+ export declare const DWARF_ROAD_LEVELS: {
27
+ readonly min: 30;
28
+ readonly max: 40;
29
+ };
30
+ /** The road's discovery zone and ground box. */
31
+ export declare const DWARF_ROAD_BOX: LanternWakeBox;
32
+ /** The ridge's north wall: rock across the whole land at these rows, but for the pass's gap (the gate's band). */
33
+ export declare const DWARF_WALL_ROWS: {
34
+ readonly minZ: 296;
35
+ readonly maxZ: 299;
36
+ };
37
+ /** Rows of the canyon's rock mass: rock outside the valley, out to dwarfMassHalf either side of the valley's centre. */
38
+ export declare const DWARF_RIDGE_ROWS: {
39
+ readonly minZ: 300;
40
+ readonly maxZ: 655;
41
+ };
42
+ /** How far the rock mass reaches either side of the valley's centre at a row (a ragged range, 54 to 78 tiles). */
43
+ export declare function dwarfMassHalf(z: number): number;
44
+ /** Is this tile in the rock mass's reach (the valley is cut out of it by the callers)? Wall rows reach across the whole land. */
45
+ export declare function inDwarfMass(x: number, z: number): boolean;
46
+ /** The rock's height above the plain (flat 3) and its noise: a cliff a player cannot climb. */
47
+ export declare const DWARF_RIDGE_HEIGHT = 10;
48
+ /** The valley's centre line (the road and the rail follow it): a lazy S down the box. */
49
+ export declare function dwarfRoadCentre(z: number): number;
50
+ /** The Cart Run: a corridor five tiles wide (the centre column +-2) with ledge alcoves in its walls. */
51
+ export declare const DWARF_CART_RUN: {
52
+ readonly minZ: 560;
53
+ readonly maxZ: 660;
54
+ readonly half: 2;
55
+ };
56
+ /** The valley's half width at a row (the floor is the centre +- this). */
57
+ export declare function dwarfValleyHalf(z: number): number;
58
+ /** The ledges in the Cart Run's walls (alcoves 3 deep beyond the corridor, 3 rows each), alternating west and east. */
59
+ export declare const DWARF_CART_LEDGES: ReadonlyArray<{
60
+ id: string;
61
+ z: number;
62
+ side: 'w' | 'e';
63
+ }>;
64
+ /** Is this tile in a ledge alcove? (beyond the corridor's half width, 3 deep, the ledge's row +- 1) */
65
+ export declare function inDwarfLedge(x: number, z: number): boolean;
66
+ /** The Old Quarry's bay: an alcove in the east wall (open floor of the valley). */
67
+ export declare const DWARF_QUARRY: LanternWakeBox;
68
+ /** The Gate Court: the stone court before the sealed doors, where the Iron Warden stands. */
69
+ export declare const DWARF_COURT: {
70
+ readonly cz: 322;
71
+ readonly radius: 15;
72
+ };
73
+ export declare function dwarfCourtCentre(): {
74
+ x: number;
75
+ z: number;
76
+ };
77
+ export declare function inDwarfCourt(x: number, z: number, pad?: number): boolean;
78
+ /** Is this tile on the valley's walkable floor? (the corridor, the ledges, the quarry bay and the court) */
79
+ export declare function inDwarfValley(x: number, z: number): boolean;
80
+ /** The Dwarf Beck: three tiles of water running east across the valley to the cliff and down into Riversend's river at (1914, 871). */
81
+ export declare const DWARF_BECK: {
82
+ pts: readonly LanternWakePoint[];
83
+ half: number;
84
+ };
85
+ /** The timber bridge where the road crosses the Beck (deck 5 along the road, 3 across). */
86
+ export declare const DWARF_BRIDGE: {
87
+ readonly id: "dr-bridge";
88
+ readonly model: "hbfordbridge";
89
+ readonly facing: "s";
90
+ readonly x: number;
91
+ readonly z: 834;
92
+ };
93
+ /** The three road rows across the Beck under the bridge, laid as sand (walkable). */
94
+ export declare function inDwarfFordRows(x: number, z: number): boolean;
95
+ export declare function inDwarfBeck(x: number, z: number): boolean;
96
+ /** The road (the centre line sampled every 10 rows, laid as Path five wide), from Riversend's North Path to the Gate Court. */
97
+ export declare const DWARF_ROAD_PATH: {
98
+ id: string;
99
+ w: number;
100
+ pts: readonly LanternWakePoint[];
101
+ };
102
+ /** The rail line beside the road: one rail tile a row, 5 east of the centre; through the Cart Run it IS the centre column. */
103
+ export declare function dwarfRailX(z: number): number;
104
+ export declare const DWARF_RAIL_ROWS: {
105
+ readonly minZ: 330;
106
+ readonly maxZ: 858;
107
+ };
108
+ /** Carts run from the top of the Cart Run to its foot (rows grow southwards), then wait and run again. */
109
+ export declare const DWARF_CARTS: {
110
+ readonly count: 3;
111
+ readonly speed: 5.5;
112
+ readonly offsetMs: 9000;
113
+ readonly pauseMs: 10000;
114
+ };
115
+ export declare const DWARF_CART_RUN_MS: number;
116
+ export declare const DWARF_CART_CYCLE_MS: number;
117
+ /**
118
+ * Where cart `i` is at `nowMs`: its row, or null while it waits at the top (hidden: the server parks it there). The carts are
119
+ * offset by `offsetMs` so they come one after another, and everyone sees the same carts (no per player state).
120
+ */
121
+ export declare function dwarfCartRow(i: number, nowMs: number): number | null;
122
+ /** The tile where cart `i` waits (the top of the run, off the corridor in the quarry siding is not needed: it stands at the top). */
123
+ export declare const DWARF_CART_PARK_ROW: number;
124
+ /** A cart hits a player in the corridor within these (the corridor is five wide: ledges are the only safe ground). */
125
+ export declare const DWARF_CART_HIT: {
126
+ readonly dx: 2;
127
+ readonly dz: 1;
128
+ };
129
+ /** The share of a player's full health a cart takes; it never kills (a hit leaves at least 1 health). */
130
+ export declare const DWARF_CART_DAMAGE_SHARE = 0.3;
131
+ /** The same player is not hit by the same cart twice within this (ms). */
132
+ export declare const DWARF_CART_HIT_COOLDOWN_MS = 3500;
133
+ export declare const DWARF_CART_NPC_KIND: "runawaycart";
134
+ export declare const DWARF_CART_NAME = "Runaway Mine Cart";
135
+ export declare const DWARF_CART_WARNING = "A mine cart tears loose at the top of the Cart Run and comes rumbling down the line. Get to a ledge!";
136
+ export declare const DWARF_CART_HIT_TEXT = "The runaway cart smashes into you and bowls you aside.";
137
+ /** Whether a tile is in the corridor a cart sweeps (the run's rows, the centre +- the hit width). */
138
+ export declare function inDwarfCartLane(x: number, z: number): boolean;
139
+ /**
140
+ * The road's pieces (kit models, or the stand-in named): the Old Quarry's camp and ore, the supply crates, the track cranes and
141
+ * the sealed doors. Dwarven lamps stand along the road.
142
+ */
143
+ export declare const DWARF_ROAD_PIECES: readonly LanternWakePiece[];
144
+ export declare const DWARF_RUN_FOOT_BUFFER_NOTE = "The foot buffer closes the line: the carts are caught there and hauled back up.";
145
+ /** The Dwarf Pass: the sealed doors in the north wall (the gate's band is the gap between the pillars). */
146
+ export declare const DWARF_PASS_GAP = 4;
147
+ export declare function dwarfPassBand(): {
148
+ minX: number;
149
+ maxX: number;
150
+ minZ: number;
151
+ maxZ: number;
152
+ };
153
+ /**
154
+ * The doors' piece: the mine entrance model, standing just BEYOND the gap (north of the wall, in the land the gate keeps): a piece
155
+ * in the band would block its tiles in the shared grid and the gate could not seal them (map.ts sealWalkGates skips blocked tiles).
156
+ */
157
+ export declare const DWARF_PASS_DOORS: {
158
+ readonly id: "dr-pass-doors";
159
+ readonly model: "evmineentrance";
160
+ readonly facing: "s";
161
+ readonly x: number;
162
+ readonly z: 293;
163
+ };
164
+ export declare const DWARF_PASS_NAME = "The Dwarf Pass";
165
+ /** The signs (the placard signpost). */
166
+ export declare const DWARF_ROAD_SIGNS: ReadonlyArray<{
167
+ id: string;
168
+ x: number;
169
+ z: number;
170
+ text: string;
171
+ }>;
172
+ /** Standable tiles (admin teleports, smokes): one for each place. */
173
+ export declare const DWARF_ROAD_STAND: {
174
+ readonly x: 1878;
175
+ readonly z: 862;
176
+ };
177
+ export declare const DWARF_ROAD_STANDS: {
178
+ readonly south: {
179
+ readonly x: 1878;
180
+ readonly z: 862;
181
+ };
182
+ readonly crossing: {
183
+ readonly x: number;
184
+ readonly z: 826;
185
+ };
186
+ readonly quarry: {
187
+ readonly x: 1918;
188
+ readonly z: 706;
189
+ };
190
+ readonly runTop: {
191
+ readonly x: number;
192
+ readonly z: 552;
193
+ };
194
+ readonly ledge: {
195
+ readonly x: number;
196
+ readonly z: 610;
197
+ };
198
+ readonly runFoot: {
199
+ readonly x: number;
200
+ readonly z: 672;
201
+ };
202
+ readonly chute: {
203
+ readonly x: number;
204
+ readonly z: 520;
205
+ };
206
+ readonly court: {
207
+ readonly x: number;
208
+ readonly z: 332;
209
+ };
210
+ readonly gate: {
211
+ readonly x: number;
212
+ readonly z: 306;
213
+ };
214
+ };
215
+ /** The discovery zone (types expandedContracts.ts INSERTED_DISCOVERY_ZONES, ahead of the land's own). */
216
+ export declare const DWARF_ROAD_DISCOVERY_ZONE: {
217
+ minX: number;
218
+ maxX: number;
219
+ minZ: number;
220
+ maxZ: number;
221
+ id: string;
222
+ label: string;
223
+ coordinateFrame: "world";
224
+ };
225
+ export declare function inDwarfRoadBox(x: number, z: number, pad?: number): boolean;
226
+ //# sourceMappingURL=dwarfRoad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dwarfRoad.d.ts","sourceRoot":"","sources":["../src/dwarfRoad.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ export const DWARF_ROAD_NAME = 'The Dwarf Road';
2
+ export const DWARF_ROAD_ID = 'dwarf-road';
3
+ /** The levels the road's creatures and boss run (sheet 6: 30-40). */
4
+ export const DWARF_ROAD_LEVELS = { min: 30, max: 40 };
5
+ /** The road's discovery zone and ground box. */
6
+ export const DWARF_ROAD_BOX = { minX: 1796, maxX: 1935, minZ: 288, maxZ: 869 };
7
+ /** The ridge's north wall: rock across the whole land at these rows, but for the pass's gap (the gate's band). */
8
+ export const DWARF_WALL_ROWS = { minZ: 296, maxZ: 299 };
9
+ /** Rows of the canyon's rock mass: rock outside the valley, out to dwarfMassHalf either side of the valley's centre. */
10
+ export const DWARF_RIDGE_ROWS = { minZ: 300, maxZ: 655 };
11
+ /** How far the rock mass reaches either side of the valley's centre at a row (a ragged range, 54 to 78 tiles). */
12
+ export function dwarfMassHalf(z) {
13
+ return 66 + Math.round(8 * Math.sin(z / 23) + 4 * Math.sin(z / 9.7));
14
+ }
15
+ /** Is this tile in the rock mass's reach (the valley is cut out of it by the callers)? Wall rows reach across the whole land. */
16
+ export function inDwarfMass(x, z) {
17
+ if (z >= DWARF_WALL_ROWS.minZ && z <= DWARF_WALL_ROWS.maxZ)
18
+ return true;
19
+ if (z < DWARF_RIDGE_ROWS.minZ || z > DWARF_RIDGE_ROWS.maxZ)
20
+ return false;
21
+ return Math.abs(x - dwarfRoadCentre(z)) <= dwarfMassHalf(z);
22
+ }
23
+ /** The rock's height above the plain (flat 3) and its noise: a cliff a player cannot climb. */
24
+ export const DWARF_RIDGE_HEIGHT = 10;
25
+ // ---- The valley ------------------------------------------------------------------------------------------------------------
26
+ /** The valley's centre line (the road and the rail follow it): a lazy S down the box. */
27
+ export function dwarfRoadCentre(z) {
28
+ return Math.round(1880 + 14 * Math.sin((869 - z) / 70));
29
+ }
30
+ /** The Cart Run: a corridor five tiles wide (the centre column +-2) with ledge alcoves in its walls. */
31
+ export const DWARF_CART_RUN = { minZ: 560, maxZ: 660, half: 2 };
32
+ /** How many rows the valley takes to narrow into (or widen out of) the Cart Run. */
33
+ const RUN_EASE = 14;
34
+ function baseHalf(z) {
35
+ return Math.round(26 + 6 * Math.sin((869 - z) / 45 + 1));
36
+ }
37
+ /** The valley's half width at a row (the floor is the centre +- this). */
38
+ export function dwarfValleyHalf(z) {
39
+ const base = baseHalf(z);
40
+ const R = DWARF_CART_RUN;
41
+ if (z >= R.minZ && z <= R.maxZ)
42
+ return R.half;
43
+ const away = z < R.minZ ? R.minZ - z : z - R.maxZ;
44
+ if (away >= RUN_EASE)
45
+ return base;
46
+ const t = away / RUN_EASE;
47
+ const s = t * t * (3 - 2 * t);
48
+ return Math.max(R.half, Math.round(R.half + (base - R.half) * s));
49
+ }
50
+ /** The ledges in the Cart Run's walls (alcoves 3 deep beyond the corridor, 3 rows each), alternating west and east. */
51
+ export const DWARF_CART_LEDGES = [570, 580, 590, 600, 610, 620, 630, 640, 650].map((z, i) => ({ id: `dr-ledge-${i + 1}`, z, side: i % 2 === 0 ? 'w' : 'e' }));
52
+ /** Is this tile in a ledge alcove? (beyond the corridor's half width, 3 deep, the ledge's row +- 1) */
53
+ export function inDwarfLedge(x, z) {
54
+ for (const l of DWARF_CART_LEDGES) {
55
+ if (Math.abs(z - l.z) > 1)
56
+ continue;
57
+ const dx = x - dwarfRoadCentre(z);
58
+ const R = DWARF_CART_RUN;
59
+ if (l.side === 'w' ? dx <= -(R.half + 1) && dx >= -(R.half + 3) : dx >= R.half + 1 && dx <= R.half + 3)
60
+ return true;
61
+ }
62
+ return false;
63
+ }
64
+ /** The Old Quarry's bay: an alcove in the east wall (open floor of the valley). */
65
+ export const DWARF_QUARRY = { minX: 1912, maxX: 1930, minZ: 690, maxZ: 732 };
66
+ /** The Gate Court: the stone court before the sealed doors, where the Iron Warden stands. */
67
+ export const DWARF_COURT = { cz: 322, radius: 15 };
68
+ export function dwarfCourtCentre() {
69
+ return { x: dwarfRoadCentre(DWARF_COURT.cz), z: DWARF_COURT.cz };
70
+ }
71
+ export function inDwarfCourt(x, z, pad = 0) {
72
+ const c = dwarfCourtCentre();
73
+ return Math.hypot(x - c.x, z - c.z) <= DWARF_COURT.radius + pad;
74
+ }
75
+ /** Is this tile on the valley's walkable floor? (the corridor, the ledges, the quarry bay and the court) */
76
+ export function inDwarfValley(x, z) {
77
+ // The wall's rows are rock but for the pass's gap (the gate's band: open ground the gate shuts).
78
+ if (z >= DWARF_WALL_ROWS.minZ && z <= DWARF_WALL_ROWS.maxZ) {
79
+ const b = dwarfPassBand();
80
+ return x >= b.minX && x <= b.maxX;
81
+ }
82
+ if (z < DWARF_RIDGE_ROWS.minZ || z > DWARF_ROAD_BOX.maxZ)
83
+ return false;
84
+ if (inDwarfCourt(x, z))
85
+ return true;
86
+ if (z >= DWARF_QUARRY.minZ && z <= DWARF_QUARRY.maxZ && x >= DWARF_QUARRY.minX && x <= DWARF_QUARRY.maxX)
87
+ return true;
88
+ if (inDwarfLedge(x, z))
89
+ return true;
90
+ return Math.abs(x - dwarfRoadCentre(z)) <= dwarfValleyHalf(z);
91
+ }
92
+ // ---- The Dwarf Beck and the River Crossing -----------------------------------------------------------------------------------
93
+ /** The Dwarf Beck: three tiles of water running east across the valley to the cliff and down into Riversend's river at (1914, 871). */
94
+ export const DWARF_BECK = {
95
+ pts: [[1800, 826], [1830, 830], [1872, 832], [1900, 836], [1914, 846], [1914, 869]],
96
+ half: 1,
97
+ };
98
+ function distSeg(x, z, a, b) {
99
+ const dx = b[0] - a[0], dz = b[1] - a[1], len2 = dx * dx + dz * dz;
100
+ const u = len2 ? Math.max(0, Math.min(1, ((x - a[0]) * dx + (z - a[1]) * dz) / len2)) : 0;
101
+ return Math.hypot(x - (a[0] + u * dx), z - (a[1] + u * dz));
102
+ }
103
+ function inBeckRaw(x, z) {
104
+ const p = DWARF_BECK.pts;
105
+ for (let i = 0; i + 1 < p.length; i++)
106
+ if (distSeg(x, z, p[i], p[i + 1]) <= DWARF_BECK.half + 0.5)
107
+ return true;
108
+ return false;
109
+ }
110
+ /** The timber bridge where the road crosses the Beck (deck 5 along the road, 3 across). */
111
+ export const DWARF_BRIDGE = { id: 'dr-bridge', model: 'hbfordbridge', facing: 's', x: dwarfRoadCentre(834), z: 834 };
112
+ /** The three road rows across the Beck under the bridge, laid as sand (walkable). */
113
+ export function inDwarfFordRows(x, z) {
114
+ return Math.abs(x - DWARF_BRIDGE.x) <= 3 && inBeckRaw(x, z);
115
+ }
116
+ export function inDwarfBeck(x, z) {
117
+ return inBeckRaw(x, z) && !inDwarfFordRows(x, z);
118
+ }
119
+ // ---- The road and the rail ---------------------------------------------------------------------------------------------------
120
+ /** The road (the centre line sampled every 10 rows, laid as Path five wide), from Riversend's North Path to the Gate Court. */
121
+ export const DWARF_ROAD_PATH = {
122
+ id: 'dwarf-road',
123
+ w: 5,
124
+ pts: (() => {
125
+ const pts = [[1878, 870]];
126
+ for (let z = 860; z >= DWARF_COURT.cz; z -= 10)
127
+ pts.push([dwarfRoadCentre(z), z]);
128
+ pts.push([dwarfRoadCentre(302), 302]);
129
+ return pts;
130
+ })(),
131
+ };
132
+ /** The rail line beside the road: one rail tile a row, 5 east of the centre; through the Cart Run it IS the centre column. */
133
+ export function dwarfRailX(z) {
134
+ const R = DWARF_CART_RUN;
135
+ return dwarfRoadCentre(z) + (z >= R.minZ - 6 && z <= R.maxZ + 6 ? 0 : 5);
136
+ }
137
+ export const DWARF_RAIL_ROWS = { minZ: 330, maxZ: 858 };
138
+ // ---- The runaway mine carts -----------------------------------------------------------------------------------------------------
139
+ /** Carts run from the top of the Cart Run to its foot (rows grow southwards), then wait and run again. */
140
+ export const DWARF_CARTS = { count: 3, speed: 5.5, offsetMs: 9000, pauseMs: 10000 };
141
+ export const DWARF_CART_RUN_MS = Math.round(((DWARF_CART_RUN.maxZ - DWARF_CART_RUN.minZ) / DWARF_CARTS.speed) * 1000);
142
+ export const DWARF_CART_CYCLE_MS = DWARF_CART_RUN_MS + DWARF_CARTS.pauseMs;
143
+ /**
144
+ * Where cart `i` is at `nowMs`: its row, or null while it waits at the top (hidden: the server parks it there). The carts are
145
+ * offset by `offsetMs` so they come one after another, and everyone sees the same carts (no per player state).
146
+ */
147
+ export function dwarfCartRow(i, nowMs) {
148
+ const t = (((nowMs - i * DWARF_CARTS.offsetMs) % DWARF_CART_CYCLE_MS) + DWARF_CART_CYCLE_MS) % DWARF_CART_CYCLE_MS;
149
+ if (t >= DWARF_CART_RUN_MS)
150
+ return null;
151
+ return DWARF_CART_RUN.minZ + Math.floor((t / 1000) * DWARF_CARTS.speed);
152
+ }
153
+ /** The tile where cart `i` waits (the top of the run, off the corridor in the quarry siding is not needed: it stands at the top). */
154
+ export const DWARF_CART_PARK_ROW = DWARF_CART_RUN.minZ - 3;
155
+ /** A cart hits a player in the corridor within these (the corridor is five wide: ledges are the only safe ground). */
156
+ export const DWARF_CART_HIT = { dx: 2, dz: 1 };
157
+ /** The share of a player's full health a cart takes; it never kills (a hit leaves at least 1 health). */
158
+ export const DWARF_CART_DAMAGE_SHARE = 0.3;
159
+ /** The same player is not hit by the same cart twice within this (ms). */
160
+ export const DWARF_CART_HIT_COOLDOWN_MS = 3500;
161
+ export const DWARF_CART_NPC_KIND = 'runawaycart';
162
+ export const DWARF_CART_NAME = 'Runaway Mine Cart';
163
+ export const DWARF_CART_WARNING = 'A mine cart tears loose at the top of the Cart Run and comes rumbling down the line. Get to a ledge!';
164
+ export const DWARF_CART_HIT_TEXT = 'The runaway cart smashes into you and bowls you aside.';
165
+ /** Whether a tile is in the corridor a cart sweeps (the run's rows, the centre +- the hit width). */
166
+ export function inDwarfCartLane(x, z) {
167
+ const R = DWARF_CART_RUN;
168
+ return z >= R.minZ && z <= R.maxZ && Math.abs(x - dwarfRoadCentre(z)) <= DWARF_CART_HIT.dx;
169
+ }
170
+ // ---- Pieces, signs, stands -------------------------------------------------------------------------------------------------------
171
+ const lamp = (x, z) => ({ id: `dr-lamp-${x}-${z}`, model: 'townlantern1x1', facing: 's', x, z });
172
+ const qc = (z) => dwarfRoadCentre(z);
173
+ /**
174
+ * The road's pieces (kit models, or the stand-in named): the Old Quarry's camp and ore, the supply crates, the track cranes and
175
+ * the sealed doors. Dwarven lamps stand along the road.
176
+ */
177
+ export const DWARF_ROAD_PIECES = [
178
+ // The Old Quarry: a foreman's tent, the ore pile, tools and crates, a cart on its own siding.
179
+ { id: 'dr-quarry-tent', model: 'drtent', standIn: 'hcshelter', facing: 'w', x: 1918, z: 700 },
180
+ { id: 'dr-quarry-tent-2', model: 'drtent', standIn: 'hcshelter', facing: 'w', x: 1918, z: 716 },
181
+ { id: 'dr-quarry-ore-1', model: 'evoreiron', facing: 's', x: 1924, z: 696 },
182
+ { id: 'dr-quarry-ore-2', model: 'evoreiron', facing: 's', x: 1926, z: 698 },
183
+ { id: 'dr-quarry-ore-3', model: 'evorecopper', facing: 's', x: 1927, z: 722 },
184
+ { id: 'dr-quarry-ore-4', model: 'evoretin', facing: 's', x: 1925, z: 726 },
185
+ { id: 'dr-quarry-rack', model: 'evtoolrack', facing: 's', x: 1914, z: 708 },
186
+ { id: 'dr-quarry-crates', model: 'evcratestack', facing: 's', x: 1922, z: 708 },
187
+ { id: 'dr-quarry-sacks', model: 'hubsack', facing: 's', x: 1923, z: 710 },
188
+ { id: 'dr-quarry-cart', model: 'hbtinkerwagon', facing: 's', x: 1924, z: 714 },
189
+ { id: 'dr-quarry-fire', model: 'evwatchbrazier', facing: 's', x: 1915, z: 712 },
190
+ // The River Crossing: a lamp either side and a stack of timber.
191
+ { id: 'dr-crossing-planks', model: 'evsplittimber', facing: 's', x: 1860, z: 842 },
192
+ // The Avalanche Chute: a rockfall of timber and rubble with a gap left for the road.
193
+ { id: 'dr-chute-rubble-1', model: 'hbrubble', facing: 's', x: qc(528) + 8, z: 528 },
194
+ { id: 'dr-chute-rubble-2', model: 'hbrubble', facing: 's', x: qc(522) - 8, z: 522 },
195
+ { id: 'dr-chute-rubble-3', model: 'hbrubble', facing: 's', x: qc(514) + 9, z: 514 },
196
+ // The Cart Run's ends: the top buffer and the foot buffer.
197
+ { id: 'dr-run-top-buffer', model: 'evrailbuffer', facing: 's', x: qc(556), z: 556 },
198
+ { id: 'dr-run-foot-buffer', model: 'evrailbuffer', facing: 'n', x: qc(664), z: 664 },
199
+ // Lamps along the road, every 30 rows (not in the Cart Run's corridor).
200
+ ...[840, 800, 760, 720, 690, 540, 500, 470, 440, 410, 380, 350].map((z) => lamp(qc(z) + 4, z)),
201
+ // The Gate Court: braziers either side of the doors.
202
+ { id: 'dr-gate-brazier-w', model: 'evwatchbrazierlit', facing: 's', x: qc(306) - 8, z: 306 },
203
+ { id: 'dr-gate-brazier-e', model: 'evwatchbrazierlit', facing: 's', x: qc(306) + 8, z: 306 },
204
+ ];
205
+ export const DWARF_RUN_FOOT_BUFFER_NOTE = 'The foot buffer closes the line: the carts are caught there and hauled back up.';
206
+ /** The Dwarf Pass: the sealed doors in the north wall (the gate's band is the gap between the pillars). */
207
+ export const DWARF_PASS_GAP = 4;
208
+ export function dwarfPassBand() {
209
+ const x = dwarfRoadCentre(DWARF_WALL_ROWS.minZ + 2);
210
+ return { minX: x - DWARF_PASS_GAP, maxX: x + DWARF_PASS_GAP, minZ: DWARF_WALL_ROWS.minZ, maxZ: DWARF_WALL_ROWS.maxZ };
211
+ }
212
+ /**
213
+ * The doors' piece: the mine entrance model, standing just BEYOND the gap (north of the wall, in the land the gate keeps): a piece
214
+ * in the band would block its tiles in the shared grid and the gate could not seal them (map.ts sealWalkGates skips blocked tiles).
215
+ */
216
+ export const DWARF_PASS_DOORS = { id: 'dr-pass-doors', model: 'evmineentrance', facing: 's', x: dwarfRoadCentre(298), z: 293 };
217
+ export const DWARF_PASS_NAME = 'The Dwarf Pass';
218
+ /** The signs (the placard signpost). */
219
+ export const DWARF_ROAD_SIGNS = [
220
+ { id: 'dr-sign-south', x: 1888, z: 864, text: 'The Dwarf Road. Riversend Halt is south. The hardest ground on the line: Combat 30+, and mind the carts.' },
221
+ { id: 'dr-sign-crossing', x: 1890, z: 842, text: 'Dwarf Beck. The bridge is sound; the dwarves who built it were not afraid of water. Or wolves.' },
222
+ { id: 'dr-sign-quarry', x: 1904, z: 702, text: 'Old Quarry. The foreman is in his tent. Take only what you can carry, and nothing from the carts.' },
223
+ { id: 'dr-sign-run', x: 1880 - 6, z: 680, text: 'CART RUN AHEAD. Carts come down without warning. Ledges every ten paces, east and west. Do not stand on the rails.' },
224
+ { id: 'dr-sign-chute', x: 1890, z: 546, text: 'Avalanche Chute. The rocks come down when they like.' },
225
+ { id: 'dr-sign-court', x: 1882, z: 350, text: 'Gate Court. The doors beyond are the Dwarf Pass: sealed to all but those the dwarves have tried.' },
226
+ ];
227
+ /** Standable tiles (admin teleports, smokes): one for each place. */
228
+ export const DWARF_ROAD_STAND = { x: 1878, z: 862 };
229
+ export const DWARF_ROAD_STANDS = {
230
+ south: DWARF_ROAD_STAND,
231
+ crossing: { x: dwarfRoadCentre(826), z: 826 },
232
+ quarry: { x: 1918, z: 706 },
233
+ runTop: { x: dwarfRoadCentre(552), z: 552 },
234
+ ledge: { x: dwarfRoadCentre(610) - 4, z: 610 },
235
+ runFoot: { x: dwarfRoadCentre(672), z: 672 },
236
+ chute: { x: dwarfRoadCentre(520), z: 520 },
237
+ court: { x: dwarfRoadCentre(332), z: 332 },
238
+ gate: { x: dwarfRoadCentre(306), z: 306 },
239
+ };
240
+ /** The discovery zone (types expandedContracts.ts INSERTED_DISCOVERY_ZONES, ahead of the land's own). */
241
+ export const DWARF_ROAD_DISCOVERY_ZONE = { id: DWARF_ROAD_ID, label: DWARF_ROAD_NAME, coordinateFrame: 'world', ...DWARF_ROAD_BOX };
242
+ export function inDwarfRoadBox(x, z, pad = 0) {
243
+ const b = DWARF_ROAD_BOX;
244
+ return x >= b.minX - pad && x <= b.maxX + pad && z >= b.minZ - pad && z <= b.maxZ + pad;
245
+ }
246
+ //# sourceMappingURL=dwarfRoad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dwarfRoad.js","sourceRoot":"","sources":["../src/dwarfRoad.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * CLEAR THE LINE, the Dwarf Road's quest (slice 7, 2026-10-14; plan `.cursor/task-plans/2026-10-14-t2-west-b.md`; design sheet
3
+ * `western-heartland-6-dwarf-road`, "The Runaway Mine Cart"): Foreman Durrik Slate at the Old Quarry wants the dwarven line made
4
+ * safe: put down the Stone Serpents on the Beck, the Iron Beetles gnawing the sleepers, inspect the three faults that set the carts
5
+ * running (the top switch, a cracked brace on a ledge in the Cart Run, the foot buffer), clear the Rock Crawlers off the Avalanche
6
+ * Chute, thin the Track Hounds, and put down the Iron Warden in the Gate Court for his core.
7
+ *
8
+ * Every number is a WORLD tile.
9
+ */
10
+ import type { LanternWakeQuestProp } from './lanternWakeQuests.js';
11
+ export declare const DWARF_QUEST_ID = "clearTheLine";
12
+ export declare const DWARF_QUEST_NAME = "Clear the Line";
13
+ export declare const DWARF_QUEST_COMBAT_LEVEL = 30;
14
+ export declare const DR_PROP: {
15
+ readonly line: "drline";
16
+ };
17
+ export declare const DR_LINE_SWITCH: LanternWakeQuestProp;
18
+ export declare const DR_LINE_BRACE: LanternWakeQuestProp;
19
+ export declare const DR_LINE_BUFFER: LanternWakeQuestProp;
20
+ export declare const DWARF_QUEST_PROPS: readonly LanternWakeQuestProp[];
21
+ /** The model a Dwarf Road quest prop draws with (frontend quest-prop models that already exist), or null if not one of them. */
22
+ export declare function dwarfRoadPropModel(prop: string, style?: string): string | null;
23
+ export declare const DWARF_QUEST_PROP_NAMES: Readonly<Record<string, string>>;
24
+ /** Arriving inside the Gate Court counts. */
25
+ export declare function dwarfCourtArea(): {
26
+ minX: number;
27
+ maxX: number;
28
+ minZ: number;
29
+ maxZ: number;
30
+ };
31
+ export declare function dwarfCourtAt(): {
32
+ x: number;
33
+ z: number;
34
+ label: string;
35
+ };
36
+ //# sourceMappingURL=dwarfRoadQuest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dwarfRoadQuest.d.ts","sourceRoot":"","sources":["../src/dwarfRoadQuest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAC7C,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AACjD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,eAAO,MAAM,OAAO;;CAA8B,CAAC;AACnD,eAAO,MAAM,cAAc,EAAE,oBAAsH,CAAC;AACpJ,eAAO,MAAM,aAAa,EAAE,oBAAoH,CAAC;AACjJ,eAAO,MAAM,cAAc,EAAE,oBAAsH,CAAC;AACpJ,eAAO,MAAM,iBAAiB,EAAE,SAAS,oBAAoB,EAAoD,CAAC;AAElH,gIAAgI;AAChI,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9E;AACD,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAInE,CAAC;AAEF,6CAA6C;AAC7C,wBAAgB,cAAc,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAG3F;AACD,wBAAgB,YAAY,IAAI;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAGtE"}
@@ -0,0 +1,34 @@
1
+ import { DWARF_COURT, dwarfCourtCentre, dwarfRoadCentre } from './dwarfRoad.js';
2
+ export const DWARF_QUEST_ID = 'clearTheLine';
3
+ export const DWARF_QUEST_NAME = 'Clear the Line';
4
+ export const DWARF_QUEST_COMBAT_LEVEL = 30;
5
+ export const DR_PROP = { line: 'drline' };
6
+ export const DR_LINE_SWITCH = { id: 'dr-quest-switch', x: dwarfRoadCentre(548) + 4, z: 548, style: `${DR_PROP.line}:switch` };
7
+ export const DR_LINE_BRACE = { id: 'dr-quest-brace', x: dwarfRoadCentre(610) - 5, z: 610, style: `${DR_PROP.line}:brace` };
8
+ export const DR_LINE_BUFFER = { id: 'dr-quest-buffer', x: dwarfRoadCentre(672) + 3, z: 672, style: `${DR_PROP.line}:buffer` };
9
+ export const DWARF_QUEST_PROPS = [DR_LINE_BUFFER, DR_LINE_BRACE, DR_LINE_SWITCH];
10
+ /** The model a Dwarf Road quest prop draws with (frontend quest-prop models that already exist), or null if not one of them. */
11
+ export function dwarfRoadPropModel(prop, style) {
12
+ if (prop !== DR_PROP.line)
13
+ return null;
14
+ if (style === DR_LINE_SWITCH.style)
15
+ return 'questsalvage';
16
+ if (style === DR_LINE_BRACE.style)
17
+ return 'questbrokenfence';
18
+ return 'questturnipcrate';
19
+ }
20
+ export const DWARF_QUEST_PROP_NAMES = {
21
+ [DR_LINE_SWITCH.style]: 'Jammed Line Switch',
22
+ [DR_LINE_BRACE.style]: 'Cracked Ledge Brace',
23
+ [DR_LINE_BUFFER.style]: 'Split Foot Buffer',
24
+ };
25
+ /** Arriving inside the Gate Court counts. */
26
+ export function dwarfCourtArea() {
27
+ const c = dwarfCourtCentre();
28
+ return { minX: c.x - 10, maxX: c.x + 10, minZ: c.z - 8, maxZ: c.z + 12 };
29
+ }
30
+ export function dwarfCourtAt() {
31
+ const c = dwarfCourtCentre();
32
+ return { x: c.x, z: c.z + DWARF_COURT.radius - 6, label: 'the Gate Court' };
33
+ }
34
+ //# sourceMappingURL=dwarfRoadQuest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dwarfRoadQuest.js","sourceRoot":"","sources":["../src/dwarfRoadQuest.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC;AACnD,MAAM,CAAC,MAAM,cAAc,GAAyB,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;AACpJ,MAAM,CAAC,MAAM,aAAa,GAAyB,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;AACjJ,MAAM,CAAC,MAAM,cAAc,GAAyB,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;AACpJ,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,cAAc,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;AAElH,gIAAgI;AAChI,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,KAAc;IAC7D,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,KAAK,KAAK,cAAc,CAAC,KAAK;QAAE,OAAO,cAAc,CAAC;IAC1D,IAAI,KAAK,KAAK,aAAa,CAAC,KAAK;QAAE,OAAO,kBAAkB,CAAC;IAC7D,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AACD,MAAM,CAAC,MAAM,sBAAsB,GAAqC;IACtE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,oBAAoB;IAC5C,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,qBAAqB;IAC5C,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,mBAAmB;CAC5C,CAAC;AAEF,6CAA6C;AAC7C,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC;IAC7B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;AAC3E,CAAC;AACD,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC;IAC7B,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Clear the Line as a story quest (slice 7; see dwarfRoadQuest.ts). Its own file, one line in storyQuests.ts STORY_QUESTS; types only
3
+ * from storyQuests.ts. Rewards are proposals for the balance pass: 1600 coins, three steel bars, Explorer XP and a Combat choice.
4
+ */
5
+ import type { StoryQuestDef } from './storyQuests.js';
6
+ export declare const CLEAR_THE_LINE_QUEST: StoryQuestDef;
7
+ //# sourceMappingURL=dwarfRoadQuestDef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dwarfRoadQuestDef.d.ts","sourceRoot":"","sources":["../src/dwarfRoadQuestDef.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQtD,eAAO,MAAM,oBAAoB,EAAE,aAgDlC,CAAC"}