@dreadwood-types/types 0.1.45 → 0.1.47
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.
- package/dist/areaTransitions.d.ts +1 -1
- package/dist/areaTransitions.d.ts.map +1 -1
- package/dist/areaTransitions.js +18 -2
- package/dist/areaTransitions.js.map +1 -1
- package/dist/bank.d.ts +2 -1
- package/dist/bank.d.ts.map +1 -1
- package/dist/bank.js +2 -1
- package/dist/bank.js.map +1 -1
- package/dist/blacksmithing.d.ts +16 -1
- package/dist/blacksmithing.d.ts.map +1 -1
- package/dist/blacksmithing.js +221 -0
- package/dist/blacksmithing.js.map +1 -1
- package/dist/bloodRiver.d.ts +115 -0
- package/dist/bloodRiver.d.ts.map +1 -0
- package/dist/bloodRiver.js +252 -0
- package/dist/bloodRiver.js.map +1 -0
- package/dist/brokenRoad.d.ts +103 -0
- package/dist/brokenRoad.d.ts.map +1 -0
- package/dist/brokenRoad.js +167 -0
- package/dist/brokenRoad.js.map +1 -0
- package/dist/capital.d.ts +270 -0
- package/dist/capital.d.ts.map +1 -0
- package/dist/capital.js +306 -0
- package/dist/capital.js.map +1 -0
- package/dist/clientConfig.d.ts +34 -2
- package/dist/clientConfig.d.ts.map +1 -1
- package/dist/clientConfig.js +26 -2
- package/dist/clientConfig.js.map +1 -1
- package/dist/constants.d.ts +131 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +291 -8
- package/dist/constants.js.map +1 -1
- package/dist/dreadwoodsZones.d.ts +15 -1
- package/dist/dreadwoodsZones.d.ts.map +1 -1
- package/dist/dreadwoodsZones.js +63 -0
- package/dist/dreadwoodsZones.js.map +1 -1
- package/dist/equipment.d.ts +16 -1
- package/dist/equipment.d.ts.map +1 -1
- package/dist/equipment.js +61 -0
- package/dist/equipment.js.map +1 -1
- package/dist/groundItems.d.ts +5 -0
- package/dist/groundItems.d.ts.map +1 -1
- package/dist/groundItems.js +11 -1
- package/dist/groundItems.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/landmarks.d.ts +536 -108
- package/dist/landmarks.d.ts.map +1 -1
- package/dist/landmarks.js +754 -103
- package/dist/landmarks.js.map +1 -1
- package/dist/messages.d.ts +109 -10
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +4 -0
- package/dist/messages.js.map +1 -1
- package/dist/mineCave.d.ts +71 -0
- package/dist/mineCave.d.ts.map +1 -0
- package/dist/mineCave.js +39 -0
- package/dist/mineCave.js.map +1 -0
- package/dist/mining.d.ts +16 -5
- package/dist/mining.d.ts.map +1 -1
- package/dist/mining.js +24 -5
- package/dist/mining.js.map +1 -1
- package/dist/travel.d.ts +21 -0
- package/dist/travel.d.ts.map +1 -1
- package/dist/travel.js +23 -3
- package/dist/travel.js.map +1 -1
- package/dist/woodwork.d.ts +103 -12
- package/dist/woodwork.d.ts.map +1 -1
- package/dist/woodwork.js +214 -17
- package/dist/woodwork.js.map +1 -1
- package/dist/xp.d.ts +7 -0
- package/dist/xp.d.ts.map +1 -1
- package/dist/xp.js +7 -0
- package/dist/xp.js.map +1 -1
- package/dist/zones.d.ts +10 -0
- package/dist/zones.d.ts.map +1 -1
- package/dist/zones.js +10 -0
- package/dist/zones.js.map +1 -1
- 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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"}
|