@dreadwood-types/types 0.1.44 → 0.1.46

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 (85) hide show
  1. package/dist/areaTransitions.d.ts +1 -1
  2. package/dist/areaTransitions.d.ts.map +1 -1
  3. package/dist/areaTransitions.js +28 -0
  4. package/dist/areaTransitions.js.map +1 -1
  5. package/dist/bank.d.ts +2 -1
  6. package/dist/bank.d.ts.map +1 -1
  7. package/dist/bank.js +2 -1
  8. package/dist/bank.js.map +1 -1
  9. package/dist/blacksmithing.d.ts +16 -1
  10. package/dist/blacksmithing.d.ts.map +1 -1
  11. package/dist/blacksmithing.js +221 -0
  12. package/dist/blacksmithing.js.map +1 -1
  13. package/dist/bloodRiver.d.ts +115 -0
  14. package/dist/bloodRiver.d.ts.map +1 -0
  15. package/dist/bloodRiver.js +252 -0
  16. package/dist/bloodRiver.js.map +1 -0
  17. package/dist/brokenRoad.d.ts +103 -0
  18. package/dist/brokenRoad.d.ts.map +1 -0
  19. package/dist/brokenRoad.js +167 -0
  20. package/dist/brokenRoad.js.map +1 -0
  21. package/dist/capital.d.ts +270 -0
  22. package/dist/capital.d.ts.map +1 -0
  23. package/dist/capital.js +306 -0
  24. package/dist/capital.js.map +1 -0
  25. package/dist/clientConfig.d.ts +34 -2
  26. package/dist/clientConfig.d.ts.map +1 -1
  27. package/dist/clientConfig.js +26 -2
  28. package/dist/clientConfig.js.map +1 -1
  29. package/dist/constants.d.ts +145 -9
  30. package/dist/constants.d.ts.map +1 -1
  31. package/dist/constants.js +302 -8
  32. package/dist/constants.js.map +1 -1
  33. package/dist/cooking.d.ts +21 -0
  34. package/dist/cooking.d.ts.map +1 -1
  35. package/dist/cooking.js +52 -26
  36. package/dist/cooking.js.map +1 -1
  37. package/dist/dreadwoodsZones.d.ts +15 -1
  38. package/dist/dreadwoodsZones.d.ts.map +1 -1
  39. package/dist/dreadwoodsZones.js +63 -0
  40. package/dist/dreadwoodsZones.js.map +1 -1
  41. package/dist/equipment.d.ts +16 -1
  42. package/dist/equipment.d.ts.map +1 -1
  43. package/dist/equipment.js +61 -0
  44. package/dist/equipment.js.map +1 -1
  45. package/dist/groundItems.d.ts +5 -0
  46. package/dist/groundItems.d.ts.map +1 -1
  47. package/dist/groundItems.js +12 -1
  48. package/dist/groundItems.js.map +1 -1
  49. package/dist/index.d.ts +5 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +5 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/landmarks.d.ts +600 -104
  54. package/dist/landmarks.d.ts.map +1 -1
  55. package/dist/landmarks.js +803 -105
  56. package/dist/landmarks.js.map +1 -1
  57. package/dist/messages.d.ts +146 -11
  58. package/dist/messages.d.ts.map +1 -1
  59. package/dist/messages.js +4 -0
  60. package/dist/messages.js.map +1 -1
  61. package/dist/mineCave.d.ts +71 -0
  62. package/dist/mineCave.d.ts.map +1 -0
  63. package/dist/mineCave.js +39 -0
  64. package/dist/mineCave.js.map +1 -0
  65. package/dist/mining.d.ts +16 -5
  66. package/dist/mining.d.ts.map +1 -1
  67. package/dist/mining.js +24 -5
  68. package/dist/mining.js.map +1 -1
  69. package/dist/quests.d.ts +3 -1
  70. package/dist/quests.d.ts.map +1 -1
  71. package/dist/quests.js +18 -1
  72. package/dist/quests.js.map +1 -1
  73. package/dist/travel.d.ts +66 -0
  74. package/dist/travel.d.ts.map +1 -0
  75. package/dist/travel.js +91 -0
  76. package/dist/travel.js.map +1 -0
  77. package/dist/woodwork.d.ts +128 -13
  78. package/dist/woodwork.d.ts.map +1 -1
  79. package/dist/woodwork.js +253 -19
  80. package/dist/woodwork.js.map +1 -1
  81. package/dist/xp.d.ts +7 -0
  82. package/dist/xp.d.ts.map +1 -1
  83. package/dist/xp.js +7 -0
  84. package/dist/xp.js.map +1 -1
  85. package/package.json +1 -1
@@ -0,0 +1,252 @@
1
+ import { DEADLANDS_GATE_X, DEADLANDS_MAX_X, DEADLANDS_MIN_X, DEADLANDS_MAX_Z, DEADLANDS_MIN_Z, } from './zones.js';
2
+ /**
3
+ * The Blood River and the dragon ground at the heart of the Dreadwoods.
4
+ *
5
+ * The river crosses the whole square: in under the west wall, east through
6
+ * the middle of the woods, out under the east wall. A branch breaks off it
7
+ * at the centre and runs north through a ring of crag into the Blood Lake,
8
+ * where the dragons live. The west gate sits just under the river, so the
9
+ * way in from the west walks the south bank all the way to the crossing.
10
+ *
11
+ * This file is the geometry contract, like brokenRoad.ts: the backend carves
12
+ * water and lays the ground from these helpers, the client tints the water
13
+ * and the map from the same bounds, and the zone descriptor and admin links
14
+ * read the same tiles. All coordinates are world tiles.
15
+ */
16
+ /** The river's base line, south of the dragon ring, north of the mine. */
17
+ export const BLOOD_RIVER_BASE_Z = 480;
18
+ /**
19
+ * Meander amplitude ramps in over this many tiles from each wall, so the
20
+ * river meets the west wall dead on BLOOD_RIVER_BASE_Z and the west gate
21
+ * ("just under the river") can be a fixed constant.
22
+ */
23
+ const RIVER_MEANDER_RAMP = 26;
24
+ /** Centre line of the west-east run at column x. */
25
+ export function bloodRiverCenterZ(x) {
26
+ const t = x - DEADLANDS_MIN_X;
27
+ const fromWest = Math.min(1, Math.max(0, (x - DEADLANDS_MIN_X) / RIVER_MEANDER_RAMP));
28
+ const fromEast = Math.min(1, Math.max(0, (DEADLANDS_MAX_X - x) / RIVER_MEANDER_RAMP));
29
+ const amp = Math.min(fromWest, fromEast);
30
+ const sweep = Math.sin(t * 0.055) * 4 + Math.sin(t * 0.021 + 1.7) * 3;
31
+ return BLOOD_RIVER_BASE_Z + Math.round(amp * sweep);
32
+ }
33
+ /** Half-width of the run at column x: mostly 3 tiles wide, pooling to 5. */
34
+ export function bloodRiverHalfWidth(x) {
35
+ return Math.sin((x - DEADLANDS_MIN_X) * 0.043 + 0.9) > 0.55 ? 2 : 1;
36
+ }
37
+ /* ------------------------------------------------------------------ *
38
+ * Ragged edges. A run drawn as |z - centre| <= halfWidth is a stripe
39
+ * with ruler edges and the lake's radius function is a smooth blob, and
40
+ * both read as painted on. Every outline below is jittered by up to 0.8
41
+ * of a tile from one per-tile hash, so single tiles are bitten out of
42
+ * the edge or added to it. It lives here, not in the carve, so the map,
43
+ * the minimap and the shader gate see the same tiles the server carved.
44
+ * ------------------------------------------------------------------ */
45
+ /** Deterministic per-tile noise shared by every consumer of this file. */
46
+ export function bloodHash(x, z) {
47
+ let h = (x * 374761393 + z * 668265263) | 0;
48
+ h = Math.imul(h ^ (h >>> 13), 1274126177);
49
+ return (h ^ (h >>> 16)) >>> 0;
50
+ }
51
+ /** Outline jitter for one tile, -0.8..0.8 tiles; positive pushes the water out. */
52
+ function edgeJitter(x, z) {
53
+ return ((bloodHash(x * 7 + 3, z * 13 + 5) % 1000) / 1000) * 1.6 - 0.8;
54
+ }
55
+ /**
56
+ * Columns whose edges stay ruled: the crossing's landings, the branch
57
+ * mouth and the runs up to the walls, where a bitten tile would leave a
58
+ * deck end in the water or a bank tile in the gate.
59
+ */
60
+ function riverEdgeHolds(x) {
61
+ return (Math.abs(x - BLOOD_BRIDGE_X) <= BLOOD_BRIDGE_HALF_W + 1 ||
62
+ Math.abs(x - BLOOD_BRANCH_BASE_X) <= 5 ||
63
+ x <= DEADLANDS_MIN_X + 3 ||
64
+ x >= DEADLANDS_MAX_X - 3);
65
+ }
66
+ /** True on a water tile of the main west-east run. */
67
+ export function inBloodRiver(x, z) {
68
+ if (x <= DEADLANDS_MIN_X || x >= DEADLANDS_MAX_X)
69
+ return false;
70
+ if (z <= DEADLANDS_MIN_Z || z >= DEADLANDS_MAX_Z)
71
+ return false;
72
+ const edge = bloodRiverHalfWidth(x) + 0.5 - Math.abs(z - bloodRiverCenterZ(x));
73
+ return edge + (riverEdgeHolds(x) ? 0 : edgeJitter(x, z)) > 0;
74
+ }
75
+ /* ------------------------------------------------------------------ *
76
+ * The north branch: off the main run and up into the lake.
77
+ * ------------------------------------------------------------------ */
78
+ export const BLOOD_BRANCH_BASE_X = DEADLANDS_GATE_X + 14;
79
+ /** Centre line of the branch at row z. */
80
+ export function bloodBranchCenterX(z) {
81
+ const t = z - 400;
82
+ return BLOOD_BRANCH_BASE_X + Math.round(Math.sin(t * 0.11) * 2 + Math.sin(t * 0.31 + 0.8) * 1.2);
83
+ }
84
+ export const BLOOD_BRANCH_HALF_W = 1;
85
+ /* ------------------------------------------------------------------ *
86
+ * The Blood Lake, dead centre of the woods.
87
+ * ------------------------------------------------------------------ */
88
+ export const BLOOD_LAKE_CX = 462;
89
+ export const BLOOD_LAKE_CZ = 407;
90
+ /** Organic radius by bearing: one blob, lobed like the concept sheet. */
91
+ function bloodLakeRadius(theta) {
92
+ return 16.5 + 4.2 * Math.sin(3 * theta + 1.3) + 2.6 * Math.sin(7 * theta + 0.6);
93
+ }
94
+ export function inBloodLake(x, z) {
95
+ const dx = (x - BLOOD_LAKE_CX) / 1.15;
96
+ const dz = z - BLOOD_LAKE_CZ;
97
+ const d = Math.hypot(dx, dz);
98
+ if (d > 25)
99
+ return false;
100
+ return bloodLakeRadius(Math.atan2(dz, dx)) - d + edgeJitter(x + 5, z + 7) > 0;
101
+ }
102
+ /* ------------------------------------------------------------------ *
103
+ * The dragon ring: the crag wall that encloses the lake ground.
104
+ * Centre and half-extents shared with the 'blood-lake' NPC zone.
105
+ * ------------------------------------------------------------------ */
106
+ export const DRAGON_RING_CX = 463;
107
+ export const DRAGON_RING_CZ = 414;
108
+ export const DRAGON_RING_RX = 52;
109
+ export const DRAGON_RING_RZ = 44;
110
+ /** Normalised radial distance from the ring centre: 1 is the ring line. */
111
+ export function dragonRingRadial(x, z) {
112
+ const dx = (x - DRAGON_RING_CX) / DRAGON_RING_RX;
113
+ const dz = (z - DRAGON_RING_CZ) / DRAGON_RING_RZ;
114
+ return Math.sqrt(dx * dx + dz * dz);
115
+ }
116
+ /** Where the ring's south arc sits at column x (for pillars and the gap). */
117
+ export function dragonRingSouthZ(x) {
118
+ const dx = (x - DRAGON_RING_CX) / DRAGON_RING_RX;
119
+ const inside = Math.max(0, 1 - dx * dx);
120
+ return DRAGON_RING_CZ + Math.round(DRAGON_RING_RZ * Math.sqrt(inside));
121
+ }
122
+ /** The walk-in gap on the south arc, flanked by the ruined pillars. */
123
+ export const DRAGON_GATE_PATH_X = DEADLANDS_GATE_X - 11; // 452
124
+ export const DRAGON_GATE_MIN_X = DRAGON_GATE_PATH_X - 4;
125
+ export const DRAGON_GATE_MAX_X = DRAGON_GATE_PATH_X + 4;
126
+ /** The river gap on the south arc, where the branch runs out to the river. */
127
+ export const DRAGON_RIVER_GAP_MIN_X = BLOOD_BRANCH_BASE_X - 6;
128
+ export const DRAGON_RIVER_GAP_MAX_X = BLOOD_BRANCH_BASE_X + 6;
129
+ /** True where the ring must stay open (the gate, and the branch water). */
130
+ export function inDragonRingGap(x, z) {
131
+ if (z <= DRAGON_RING_CZ)
132
+ return false;
133
+ return ((x >= DRAGON_GATE_MIN_X && x <= DRAGON_GATE_MAX_X) ||
134
+ (x >= DRAGON_RIVER_GAP_MIN_X && x <= DRAGON_RIVER_GAP_MAX_X));
135
+ }
136
+ /* ------------------------------------------------------------------ *
137
+ * Crossings and roads.
138
+ * ------------------------------------------------------------------ */
139
+ /** The main crossing: a three-plank bridge on the gate path's own axis. */
140
+ export const BLOOD_BRIDGE_X = DRAGON_GATE_PATH_X;
141
+ export const BLOOD_BRIDGE_HALF_W = 1;
142
+ /** The small crossing inside the ring, over the branch east of the path. */
143
+ export const BRANCH_BRIDGE_Z = 446;
144
+ export const BRANCH_BRIDGE_HALF_D = 1;
145
+ /** South-bank road rows: the river's edge plus this offset, two rows deep. */
146
+ export const RIVER_ROAD_BANK_OFFSET = 2;
147
+ /**
148
+ * The Dirt the way uses, as opposed to the Dirt of the banks: the south-bank
149
+ * road from the west gate to the crossing, the crossing's axis up to the
150
+ * ring gap, and inside the ring the gate path down to the lake, the fork
151
+ * east over the inner crossing and the spur up to the quarry. The backend
152
+ * lays these; the client keeps a track's colour on them where the bank
153
+ * soil around them goes dark.
154
+ */
155
+ export function onBloodRiverRoad(x, z) {
156
+ if (x >= DEADLANDS_MIN_X && x <= BLOOD_BRIDGE_X + BLOOD_BRIDGE_HALF_W) {
157
+ const edge = bloodRiverCenterZ(x) + bloodRiverHalfWidth(x) + RIVER_ROAD_BANK_OFFSET;
158
+ if (z === edge || z === edge + 1)
159
+ return true;
160
+ }
161
+ if (Math.abs(x - DRAGON_GATE_PATH_X) <= BLOOD_BRIDGE_HALF_W) {
162
+ const edge = bloodRiverCenterZ(x) + bloodRiverHalfWidth(x) + RIVER_ROAD_BANK_OFFSET;
163
+ const gateSide = x - DRAGON_GATE_PATH_X <= 0 || z > dragonRingSouthZ(DRAGON_GATE_PATH_X);
164
+ if (gateSide && z >= BLOOD_LAKE_CZ + 12 && z <= edge + 1)
165
+ return true;
166
+ }
167
+ if ((z === BRANCH_BRIDGE_Z || z === BRANCH_BRIDGE_Z + 1) && x > DRAGON_GATE_PATH_X && x <= 490) {
168
+ return true;
169
+ }
170
+ return (x === 489 || x === 490) && z >= DRAGON_QUARRY.z + 4 && z <= BRANCH_BRIDGE_Z;
171
+ }
172
+ /* ------------------------------------------------------------------ *
173
+ * The west gate: the third way into the woods, just under the river.
174
+ * ------------------------------------------------------------------ */
175
+ /**
176
+ * Well north of the frost wall (NORTHERN_WALL_Z is 450), so the gate is
177
+ * reached through the wall's own gate and the ice country beyond it, not
178
+ * from the goblin side. It stood just under the river (BLOOD_RIVER_BASE_Z
179
+ * + 6 = 486) until 2026-09-18; a wall road inside the west wall now runs
180
+ * from the gate down to the river road (bloodRiver.ts, step 4).
181
+ */
182
+ export const DREADWOODS_WEST_GATE_Z = 410;
183
+ export const DREADWOODS_WEST_GATE_HALF_W = 2;
184
+ export function inDreadwoodsWestGate(x, z) {
185
+ return (x === DEADLANDS_MIN_X &&
186
+ Math.abs(z - DREADWOODS_WEST_GATE_Z) <= DREADWOODS_WEST_GATE_HALF_W);
187
+ }
188
+ /* ------------------------------------------------------------------ *
189
+ * The dragons and their ground.
190
+ * ------------------------------------------------------------------ */
191
+ /** Nests on the western rise, each a clutch of eggs in a stone bowl. */
192
+ export const DRAGON_NESTS = [
193
+ { x: 427, z: 399 },
194
+ { x: 424, z: 415 },
195
+ { x: 437, z: 389 },
196
+ ];
197
+ /** The looted quarry camp on the east side, under the dragons' banner. */
198
+ export const DRAGON_QUARRY = { x: 499, z: 406 };
199
+ /**
200
+ * Where the dragons stand. The old one holds the lake's south shore where
201
+ * the path arrives; the rest keep the nests and the quarry. Scale is the
202
+ * visual size sent to clients: the old one is half again the others.
203
+ */
204
+ export const DRAGON_SPAWNS = [
205
+ { x: 470, z: 430, scale: 4.4 },
206
+ { x: 430, z: 402, scale: 3.2 },
207
+ { x: 428, z: 417, scale: 3.1 },
208
+ { x: 437, z: 392, scale: 3.2 },
209
+ { x: 498, z: 409, scale: 3.3 },
210
+ { x: 455, z: 441, scale: 3.0 },
211
+ ];
212
+ /* ------------------------------------------------------------------ *
213
+ * Blood water: one helper for the 3D tint, the minimap and the paper
214
+ * map, so they cannot drift. Painters call isBloodWater(tileX, tileZ).
215
+ * The AABB is the cheap shader gate; it is wider than the water itself
216
+ * because only water meshes use the water material.
217
+ * ------------------------------------------------------------------ */
218
+ /**
219
+ * Chart and 3D mid-tone. Deep and shallow sit either side for depth. Dark
220
+ * on purpose: the sheet is blood, near black in the body and only a
221
+ * little brighter where it meets the bank, and the 3D tile colour under
222
+ * the water has to agree with the shader or the bank corners bleed pink.
223
+ */
224
+ export const BLOOD_WATER_COLOR = '#7a1014';
225
+ export const BLOOD_WATER_COLOR_DEEP = '#26040a';
226
+ export const BLOOD_WATER_COLOR_SHALLOW = '#861a1e';
227
+ export const BLOOD_WATER_BOUNDS = {
228
+ minX: DEADLANDS_MIN_X + 1,
229
+ maxX: DEADLANDS_MAX_X - 1,
230
+ minZ: BLOOD_LAKE_CZ - 28,
231
+ maxZ: BLOOD_RIVER_BASE_Z + 14,
232
+ };
233
+ /** True on a water tile of the north branch, lake to the main run. */
234
+ export function inBloodBranch(x, z) {
235
+ if (x <= DEADLANDS_MIN_X || x >= DEADLANDS_MAX_X)
236
+ return false;
237
+ if (z < BLOOD_LAKE_CZ - 4 || z > BLOOD_RIVER_BASE_Z + 12)
238
+ return false;
239
+ const bx = bloodBranchCenterX(z);
240
+ // The branch ends where the run's own water begins (its edges are held
241
+ // ruled at the mouth, so the two always touch).
242
+ if (z >= bloodRiverCenterZ(bx) - bloodRiverHalfWidth(bx))
243
+ return false;
244
+ const edge = BLOOD_BRANCH_HALF_W + 0.5 - Math.abs(x - bx);
245
+ const holds = Math.abs(z - BRANCH_BRIDGE_Z) <= BRANCH_BRIDGE_HALF_D + 1;
246
+ return edge + (holds ? 0 : edgeJitter(x + 11, z + 17)) > 0;
247
+ }
248
+ /** True where Dreadwoods water is blood, not the default blue. */
249
+ export function isBloodWater(x, z) {
250
+ return inBloodLake(x, z) || inBloodRiver(x, z) || inBloodBranch(x, z);
251
+ }
252
+ //# sourceMappingURL=bloodRiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bloodRiver.js","sourceRoot":"","sources":["../src/bloodRiver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /** The stockade: a circle of sharpened logs, its gap on the road side. */
2
+ export declare const BROKEN_ROAD_CAMP: {
3
+ readonly x: number;
4
+ readonly z: number;
5
+ readonly r: 8;
6
+ };
7
+ /** The road's east-west axis: the gap, the fork and the arch all sit on it. */
8
+ export declare const BROKEN_ROAD_AXIS_Z: number;
9
+ /** Half-width of the track: three tiles wide, a country road not a street. */
10
+ export declare const BROKEN_ROAD_HALF_W = 1;
11
+ /** The broken arch: one column past the zone's east edge, pillars two rows either side of the axis. */
12
+ export declare const BROKEN_ROAD_ARCH: {
13
+ readonly x: number;
14
+ readonly z: number;
15
+ readonly pillarDz: 2;
16
+ };
17
+ /** Where the road splits: the camp arm runs on west, the bypass leaves north-west. */
18
+ export declare const BROKEN_ROAD_FORK: {
19
+ readonly x: number;
20
+ readonly z: number;
21
+ };
22
+ /** The signpost stands in the crook of the fork, off both arms. */
23
+ export declare const BROKEN_ROAD_SIGNPOST: {
24
+ readonly x: number;
25
+ readonly z: number;
26
+ };
27
+ /** The ruined tower on its mound, north-east of the camp. */
28
+ export declare const BROKEN_ROAD_TOWER: {
29
+ readonly x: number;
30
+ readonly z: number;
31
+ readonly moundR: 2;
32
+ };
33
+ /** The wrecked cart and its barrel, off the bypass to the west. */
34
+ export declare const BROKEN_ROAD_WRECK: {
35
+ readonly x: number;
36
+ readonly z: number;
37
+ };
38
+ export declare const BROKEN_ROAD_WRECK_BARREL: {
39
+ readonly x: number;
40
+ readonly z: number;
41
+ };
42
+ /** The two tents inside the stockade, and the side each door faces (degrees, 0 = +x). */
43
+ export declare const BROKEN_ROAD_TENTS: readonly {
44
+ x: number;
45
+ z: number;
46
+ faceDeg: number;
47
+ }[];
48
+ /** The fire in the middle of the camp. */
49
+ export declare const BROKEN_ROAD_CAMPFIRE: {
50
+ readonly x: number;
51
+ readonly z: number;
52
+ };
53
+ /**
54
+ * Where the Dreadwoods Bronze Chest stands: three sites two to three tiles
55
+ * inside the logs, so it is always behind the stockade and never in a tent.
56
+ * The chest rota picks one and moves on when it is taken or fades.
57
+ */
58
+ export declare const BROKEN_ROAD_CHEST_CAMPS: readonly {
59
+ x: number;
60
+ z: number;
61
+ }[];
62
+ /** How long the Dreadwoods Bronze Chest stays before fading out and relocating. */
63
+ export declare const DREADWOODS_CAMP_CHEST_LIFETIME_MS = 120000;
64
+ /** Rune banners: one beside the arch, one at the camp gap. */
65
+ export declare const BROKEN_ROAD_BANNERS: readonly {
66
+ x: number;
67
+ z: number;
68
+ }[];
69
+ /**
70
+ * The track's centrelines, in walking order from the gate. Each polyline is
71
+ * rasterised three wide (BROKEN_ROAD_HALF_W either side of every centreline
72
+ * tile), which on the diagonal arm gives a ragged edge that suits a track
73
+ * nobody has mended.
74
+ */
75
+ export declare const BROKEN_ROAD_CENTRELINES: readonly (readonly {
76
+ x: number;
77
+ z: number;
78
+ }[])[];
79
+ /** Every tile of the track, keyed "x,z". Built once. */
80
+ export declare function brokenRoadTiles(): ReadonlyMap<string, {
81
+ x: number;
82
+ z: number;
83
+ }>;
84
+ export declare function onBrokenRoad(x: number, z: number): boolean;
85
+ /** The three-wide opening in the logs where the road goes in. */
86
+ export declare function inBrokenRoadCampGap(x: number, z: number): boolean;
87
+ /**
88
+ * The stockade's tiles, each with the yaw (radians, about +y) that lays its
89
+ * logs along the ring. Eight-connected, so the ring is sealed to a walker who
90
+ * cannot cut a diagonal between two blocked tiles, and the gap is the only
91
+ * way through.
92
+ */
93
+ export declare function brokenRoadPalisadeTiles(): readonly {
94
+ x: number;
95
+ z: number;
96
+ yaw: number;
97
+ }[];
98
+ export declare function onBrokenRoadPalisade(x: number, z: number): boolean;
99
+ /** Inside the logs: the camp floor, gap included. */
100
+ export declare function inBrokenRoadCamp(x: number, z: number): boolean;
101
+ /** The tower's footprint and its mound. */
102
+ export declare function onBrokenRoadMound(x: number, z: number): boolean;
103
+ //# sourceMappingURL=brokenRoad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brokenRoad.d.ts","sourceRoot":"","sources":["../src/brokenRoad.ts"],"names":[],"mappings":"AAqBA,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB;aAAK,CAAC;aAAW,CAAC;aAAe,CAAC,EAAE,CAAC;CAAW,CAAC;AAE9E,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,QAAqB,CAAC;AAErD,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,uGAAuG;AACvG,eAAO,MAAM,gBAAgB;aAAK,CAAC;aAAyB,CAAC;aAAsB,QAAQ,EAAE,CAAC;CAAW,CAAC;AAE1G,sFAAsF;AACtF,eAAO,MAAM,gBAAgB;aAAK,CAAC;aAAgB,CAAC;CAA+B,CAAC;AAEpF,mEAAmE;AACnE,eAAO,MAAM,oBAAoB;aAAK,CAAC;aAAgB,CAAC;CAAmC,CAAC;AAE5F,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB;aAAK,CAAC;aAAgB,CAAC;aAAgB,MAAM,EAAE,CAAC;CAAW,CAAC;AAE1F,mEAAmE;AACnE,eAAO,MAAM,iBAAiB;aAAK,CAAC;aAAgB,CAAC;CAAwB,CAAC;AAC9E,eAAO,MAAM,wBAAwB;aAAK,CAAC;aAAgB,CAAC;CAAwB,CAAC;AAErF,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,EAAE,SAAS;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAGjF,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB;aAAK,CAAC;aAAsB,CAAC;CAA+B,CAAC;AAE9F;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAItE,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,iCAAiC,SAAU,CAAC;AAEzD,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,EAAE,SAAS;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAGlE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,CAAC,SAAS;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAmBnF,CAAC;AAIF,wDAAwD;AACxD,wBAAgB,eAAe,IAAI,WAAW,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/E;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAGjE;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,SAAS;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAmB1F;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAK9D;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/D"}
@@ -0,0 +1,167 @@
1
+ import { DEADLANDS_GATE_X, DEADLANDS_MAX_Z } from './zones.js';
2
+ import { dreadwoodsNpcZone } from './dreadwoodsZones.js';
3
+ /**
4
+ * The Broken Road: the geometry hung off the 'broken-road' zone descriptor.
5
+ *
6
+ * Everything here is shared between the backend dresser (brokenRoad.ts in
7
+ * the backend lays the track and the stockade from it), the camp-chest
8
+ * rota (the crook faction's camps are the tiles inside the palisade), the
9
+ * smoke script and the client (which tints the track). One source, so the
10
+ * road the server walks you along is the road the client draws.
11
+ *
12
+ * Laid out from James' concept sheet: a rutted track runs in from the gate
13
+ * axis, through a broken stone arch at the zone's east edge, west to a fork
14
+ * with a signpost; one arm runs straight on into a crook camp behind a ring
15
+ * of sharpened logs, the other bends north-west round the stockade and
16
+ * fades out in the ash past a wrecked cart. A ruined tower stands on a low
17
+ * mound north-east of the camp. Lower z is north.
18
+ */
19
+ const zone = dreadwoodsNpcZone('broken-road');
20
+ /** The stockade: a circle of sharpened logs, its gap on the road side. */
21
+ export const BROKEN_ROAD_CAMP = { x: zone.cx, z: zone.cz + 1, r: 8 };
22
+ /** The road's east-west axis: the gap, the fork and the arch all sit on it. */
23
+ export const BROKEN_ROAD_AXIS_Z = BROKEN_ROAD_CAMP.z;
24
+ /** Half-width of the track: three tiles wide, a country road not a street. */
25
+ export const BROKEN_ROAD_HALF_W = 1;
26
+ /** The broken arch: one column past the zone's east edge, pillars two rows either side of the axis. */
27
+ export const BROKEN_ROAD_ARCH = { x: zone.cx + zone.rx + 1, z: BROKEN_ROAD_AXIS_Z, pillarDz: 2 };
28
+ /** Where the road splits: the camp arm runs on west, the bypass leaves north-west. */
29
+ export const BROKEN_ROAD_FORK = { x: zone.cx + 21, z: BROKEN_ROAD_AXIS_Z };
30
+ /** The signpost stands in the crook of the fork, off both arms. */
31
+ export const BROKEN_ROAD_SIGNPOST = { x: zone.cx + 16, z: BROKEN_ROAD_AXIS_Z - 4 };
32
+ /** The ruined tower on its mound, north-east of the camp. */
33
+ export const BROKEN_ROAD_TOWER = { x: zone.cx + 22, z: zone.cz - 11, moundR: 2 };
34
+ /** The wrecked cart and its barrel, off the bypass to the west. */
35
+ export const BROKEN_ROAD_WRECK = { x: zone.cx - 22, z: zone.cz - 4 };
36
+ export const BROKEN_ROAD_WRECK_BARREL = { x: zone.cx - 20, z: zone.cz - 3 };
37
+ /** The two tents inside the stockade, and the side each door faces (degrees, 0 = +x). */
38
+ export const BROKEN_ROAD_TENTS = [
39
+ { x: BROKEN_ROAD_CAMP.x - 4, z: BROKEN_ROAD_CAMP.z - 4, faceDeg: 315 },
40
+ { x: BROKEN_ROAD_CAMP.x - 4, z: BROKEN_ROAD_CAMP.z + 4, faceDeg: 45 },
41
+ ];
42
+ /** The fire in the middle of the camp. */
43
+ export const BROKEN_ROAD_CAMPFIRE = { x: BROKEN_ROAD_CAMP.x, z: BROKEN_ROAD_CAMP.z };
44
+ /**
45
+ * Where the Dreadwoods Bronze Chest stands: three sites two to three tiles
46
+ * inside the logs, so it is always behind the stockade and never in a tent.
47
+ * The chest rota picks one and moves on when it is taken or fades.
48
+ */
49
+ export const BROKEN_ROAD_CHEST_CAMPS = [
50
+ { x: BROKEN_ROAD_CAMP.x, z: BROKEN_ROAD_CAMP.z - 5 },
51
+ { x: BROKEN_ROAD_CAMP.x, z: BROKEN_ROAD_CAMP.z + 5 },
52
+ { x: BROKEN_ROAD_CAMP.x - 5, z: BROKEN_ROAD_CAMP.z },
53
+ ];
54
+ /** How long the Dreadwoods Bronze Chest stays before fading out and relocating. */
55
+ export const DREADWOODS_CAMP_CHEST_LIFETIME_MS = 120_000;
56
+ /** Rune banners: one beside the arch, one at the camp gap. */
57
+ export const BROKEN_ROAD_BANNERS = [
58
+ { x: BROKEN_ROAD_ARCH.x + 1, z: BROKEN_ROAD_ARCH.z - BROKEN_ROAD_ARCH.pillarDz },
59
+ { x: BROKEN_ROAD_CAMP.x + BROKEN_ROAD_CAMP.r + 1, z: BROKEN_ROAD_AXIS_Z - 3 },
60
+ ];
61
+ /**
62
+ * The track's centrelines, in walking order from the gate. Each polyline is
63
+ * rasterised three wide (BROKEN_ROAD_HALF_W either side of every centreline
64
+ * tile), which on the diagonal arm gives a ragged edge that suits a track
65
+ * nobody has mended.
66
+ */
67
+ export const BROKEN_ROAD_CENTRELINES = [
68
+ // The gate stub: up the gate axis from just inside the wall to the axis row.
69
+ [
70
+ { x: DEADLANDS_GATE_X, z: DEADLANDS_MAX_Z - 1 },
71
+ { x: DEADLANDS_GATE_X, z: BROKEN_ROAD_AXIS_Z },
72
+ ],
73
+ // The spur: west along the axis, under the arch, past the fork, through the
74
+ // gap and onto the camp floor.
75
+ [
76
+ { x: DEADLANDS_GATE_X, z: BROKEN_ROAD_AXIS_Z },
77
+ { x: BROKEN_ROAD_CAMP.x + BROKEN_ROAD_CAMP.r - 2, z: BROKEN_ROAD_AXIS_Z },
78
+ ],
79
+ // The bypass: north-west off the fork, round the top of the stockade, out west.
80
+ [
81
+ { x: BROKEN_ROAD_FORK.x, z: BROKEN_ROAD_AXIS_Z },
82
+ { x: BROKEN_ROAD_FORK.x - 5, z: BROKEN_ROAD_AXIS_Z - 8 },
83
+ { x: BROKEN_ROAD_FORK.x - 11, z: BROKEN_ROAD_AXIS_Z - 10 },
84
+ { x: zone.cx - 24, z: BROKEN_ROAD_AXIS_Z - 10 },
85
+ ],
86
+ ];
87
+ let roadTiles = null;
88
+ /** Every tile of the track, keyed "x,z". Built once. */
89
+ export function brokenRoadTiles() {
90
+ if (roadTiles)
91
+ return roadTiles;
92
+ const tiles = new Map();
93
+ const stamp = (x, z) => {
94
+ for (let dz = -BROKEN_ROAD_HALF_W; dz <= BROKEN_ROAD_HALF_W; dz++) {
95
+ for (let dx = -BROKEN_ROAD_HALF_W; dx <= BROKEN_ROAD_HALF_W; dx++) {
96
+ const key = `${x + dx},${z + dz}`;
97
+ if (!tiles.has(key))
98
+ tiles.set(key, { x: x + dx, z: z + dz });
99
+ }
100
+ }
101
+ };
102
+ for (const line of BROKEN_ROAD_CENTRELINES) {
103
+ for (let i = 0; i + 1 < line.length; i++) {
104
+ const a = line[i];
105
+ const b = line[i + 1];
106
+ const steps = Math.max(1, Math.max(Math.abs(b.x - a.x), Math.abs(b.z - a.z)) * 2);
107
+ for (let s = 0; s <= steps; s++) {
108
+ const t = s / steps;
109
+ stamp(Math.round(a.x + (b.x - a.x) * t), Math.round(a.z + (b.z - a.z) * t));
110
+ }
111
+ }
112
+ }
113
+ roadTiles = tiles;
114
+ return tiles;
115
+ }
116
+ export function onBrokenRoad(x, z) {
117
+ return brokenRoadTiles().has(`${x},${z}`);
118
+ }
119
+ /** The three-wide opening in the logs where the road goes in. */
120
+ export function inBrokenRoadCampGap(x, z) {
121
+ return x >= BROKEN_ROAD_CAMP.x + BROKEN_ROAD_CAMP.r - 1 && x <= BROKEN_ROAD_CAMP.x + BROKEN_ROAD_CAMP.r + 1 &&
122
+ Math.abs(z - BROKEN_ROAD_AXIS_Z) <= BROKEN_ROAD_HALF_W;
123
+ }
124
+ let palisade = null;
125
+ /**
126
+ * The stockade's tiles, each with the yaw (radians, about +y) that lays its
127
+ * logs along the ring. Eight-connected, so the ring is sealed to a walker who
128
+ * cannot cut a diagonal between two blocked tiles, and the gap is the only
129
+ * way through.
130
+ */
131
+ export function brokenRoadPalisadeTiles() {
132
+ if (palisade)
133
+ return palisade;
134
+ const seen = new Set();
135
+ const out = [];
136
+ const steps = 72;
137
+ for (let i = 0; i < steps; i++) {
138
+ const a = (i / steps) * Math.PI * 2;
139
+ const x = Math.round(BROKEN_ROAD_CAMP.x + Math.cos(a) * BROKEN_ROAD_CAMP.r);
140
+ const z = Math.round(BROKEN_ROAD_CAMP.z + Math.sin(a) * BROKEN_ROAD_CAMP.r);
141
+ const key = `${x},${z}`;
142
+ if (seen.has(key) || inBrokenRoadCampGap(x, z))
143
+ continue;
144
+ seen.add(key);
145
+ // The log line runs along the tangent. A prop authored along local +x is
146
+ // yawed by -a so that +x points along the tangent (-sin a, cos a) in world
147
+ // x/z; the extra quarter turn makes the tangent, not the radius, the line.
148
+ out.push({ x, z, yaw: -(a + Math.PI / 2) });
149
+ }
150
+ palisade = out;
151
+ return out;
152
+ }
153
+ export function onBrokenRoadPalisade(x, z) {
154
+ return brokenRoadPalisadeTiles().some((t) => t.x === x && t.z === z);
155
+ }
156
+ /** Inside the logs: the camp floor, gap included. */
157
+ export function inBrokenRoadCamp(x, z) {
158
+ const dx = x - BROKEN_ROAD_CAMP.x;
159
+ const dz = z - BROKEN_ROAD_CAMP.z;
160
+ const inner = BROKEN_ROAD_CAMP.r - 1;
161
+ return dx * dx + dz * dz <= inner * inner + 0.5 && !onBrokenRoadPalisade(x, z);
162
+ }
163
+ /** The tower's footprint and its mound. */
164
+ export function onBrokenRoadMound(x, z) {
165
+ return Math.max(Math.abs(x - BROKEN_ROAD_TOWER.x), Math.abs(z - BROKEN_ROAD_TOWER.z)) <= BROKEN_ROAD_TOWER.moundR;
166
+ }
167
+ //# sourceMappingURL=brokenRoad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brokenRoad.js","sourceRoot":"","sources":["../src/brokenRoad.ts"],"names":[],"mappings":"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"}