@dreadwood-types/types 0.1.360 → 0.1.362
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/areaGates.d.ts.map +1 -1
- package/dist/areaGates.js +16 -0
- package/dist/areaGates.js.map +1 -1
- package/dist/attackableNpcs.d.ts.map +1 -1
- package/dist/attackableNpcs.js +2 -0
- package/dist/attackableNpcs.js.map +1 -1
- package/dist/bossSignatures.d.ts +1 -1
- package/dist/bossSignatures.d.ts.map +1 -1
- package/dist/bossSignatures.js +6 -0
- package/dist/bossSignatures.js.map +1 -1
- package/dist/campKitchens.d.ts.map +1 -1
- package/dist/campKitchens.js +4 -0
- package/dist/campKitchens.js.map +1 -1
- package/dist/campTraders.d.ts.map +1 -1
- package/dist/campTraders.js +3 -0
- package/dist/campTraders.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/expandedContracts.d.ts.map +1 -1
- package/dist/expandedContracts.js +5 -1
- package/dist/expandedContracts.js.map +1 -1
- package/dist/fishingReaches.d.ts.map +1 -1
- package/dist/fishingReaches.js +8 -0
- package/dist/fishingReaches.js.map +1 -1
- package/dist/gannetPoint.d.ts +276 -0
- package/dist/gannetPoint.d.ts.map +1 -0
- package/dist/gannetPoint.js +374 -0
- package/dist/gannetPoint.js.map +1 -0
- package/dist/gannetPointDens.d.ts +110 -0
- package/dist/gannetPointDens.d.ts.map +1 -0
- package/dist/gannetPointDens.js +161 -0
- package/dist/gannetPointDens.js.map +1 -0
- package/dist/gannetPointQuestDef.d.ts +32 -0
- package/dist/gannetPointQuestDef.d.ts.map +1 -0
- package/dist/gannetPointQuestDef.js +235 -0
- package/dist/gannetPointQuestDef.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +3 -0
- package/dist/legacy.d.ts.map +1 -1
- package/dist/legacy.js +3 -0
- package/dist/legacy.js.map +1 -1
- package/dist/quests.d.ts.map +1 -1
- package/dist/quests.js +31 -0
- package/dist/quests.js.map +1 -1
- package/dist/storyQuests.d.ts +1 -1
- package/dist/storyQuests.d.ts.map +1 -1
- package/dist/storyQuests.js +17 -0
- package/dist/storyQuests.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { CAMP_COOK_BUYS } from './shopFood.js';
|
|
2
|
+
export const GANNET_ID = 'gannet-point';
|
|
3
|
+
export const GANNET_POINT_NAME = 'Gannet Point';
|
|
4
|
+
export const GANNET_CAMP_NAME = 'Tideway Camp';
|
|
5
|
+
export const GANNET_BAR_NAME = 'The Gannet Bar';
|
|
6
|
+
/** The Combat level the Bar's walk gate asks (the stack's birds dive from a height); the tide is asked after it (backend world.ts). */
|
|
7
|
+
export const GANNET_BAR_COMBAT_LEVEL = 22;
|
|
8
|
+
export const GANNET_GATE_ID = 'gannet-tidewalk';
|
|
9
|
+
export const GANNET_STACK_NAME = 'Gannet Stack';
|
|
10
|
+
export const GANNET_LIGHT_NAME = "Hale's Light";
|
|
11
|
+
// ---- The ground ---------------------------------------------------------------------------------------------------------------------
|
|
12
|
+
/** The whole claim (no other place's box overlaps it; the test proves it against the established claims). */
|
|
13
|
+
export const GANNET_CLAIM = { minX: 1960, maxX: 2175, minZ: 1197, maxZ: 1343 };
|
|
14
|
+
/** The headland itself (the umbrella discovery zone): the land above the sea, from the cove's road to the south shore. */
|
|
15
|
+
export const GANNET_POINT_BOX = { minX: 1976, maxX: 2152, minZ: 1197, maxZ: 1312 };
|
|
16
|
+
/** Tideway Camp. */
|
|
17
|
+
export const GANNET_CAMP_BOX = { minX: 2032, maxX: 2062, minZ: 1254, maxZ: 1284 };
|
|
18
|
+
/** Gannet Stack and the sea round it. */
|
|
19
|
+
export const GANNET_STACK_BOX = { minX: 2008, maxX: 2028, minZ: 1326, maxZ: 1342 };
|
|
20
|
+
/** The Gannet Bar, the causeway's whole length (the shore foot to the stack), three tiles wide. */
|
|
21
|
+
export const GANNET_BAR_BOX = { minX: 2017, maxX: 2019, minZ: 1308, maxZ: 1328 };
|
|
22
|
+
/** The part of the Bar the walk gate holds shut (the open foot and the stack's landing are left clear on both sides). */
|
|
23
|
+
export const GANNET_BAR_BAND = { minX: 2017, maxX: 2019, minZ: 1310, maxZ: 1326 };
|
|
24
|
+
/** The stack: a rock a few tiles across with a grassy top. */
|
|
25
|
+
export const GANNET_STACK = { cx: 2018, cz: 1334, radius: 6 };
|
|
26
|
+
/** The land above the sea is flat grass at this height here. */
|
|
27
|
+
export const GANNET_LAND_HEIGHT = 3;
|
|
28
|
+
/** The bar lies just above the sea (a wet shingle bank) and the stack's rim and top are a little higher. */
|
|
29
|
+
export const GANNET_BAR_HEIGHT = 1;
|
|
30
|
+
export const GANNET_STACK_RIM_HEIGHT = 2;
|
|
31
|
+
export const GANNET_STACK_TOP_HEIGHT = 3;
|
|
32
|
+
export const gpInBox = (b, x, z, pad = 0) => x >= b.minX - pad && x <= b.maxX + pad && z >= b.minZ - pad && z <= b.maxZ + pad;
|
|
33
|
+
export const inGannetBar = (x, z) => gpInBox(GANNET_BAR_BOX, x, z);
|
|
34
|
+
export const inGannetBand = (x, z) => gpInBox(GANNET_BAR_BAND, x, z);
|
|
35
|
+
/** Tiles of the stack's own ground (a disc). */
|
|
36
|
+
export function inGannetStack(x, z, pad = 0) {
|
|
37
|
+
const dx = x - GANNET_STACK.cx;
|
|
38
|
+
const dz = z - GANNET_STACK.cz;
|
|
39
|
+
return dx * dx + dz * dz <= (GANNET_STACK.radius + pad) * (GANNET_STACK.radius + pad);
|
|
40
|
+
}
|
|
41
|
+
/** The tide sweeps whoever stands on the Bar or the stack when the sea returns. */
|
|
42
|
+
export const onGannetBarOrStack = (x, z) => inGannetBar(x, z) || inGannetStack(x, z, 1);
|
|
43
|
+
/** Paths (world polylines, width in tiles), laid as dirt on the grass. They start at the cove's shore and fan out from the camp. */
|
|
44
|
+
export const GANNET_PATHS = [
|
|
45
|
+
{ id: 'point-road', w: 3, pts: [[2118, 1197], [2112, 1222], [2094, 1244], [2064, 1262]] },
|
|
46
|
+
{ id: 'bar-road', w: 2, pts: [[2046, 1284], [2032, 1298], [2018, 1307]] },
|
|
47
|
+
{ id: 'light-road', w: 2, pts: [[2034, 1274], [2010, 1280], [1998, 1288]] },
|
|
48
|
+
{ id: 'cliff-road', w: 2, pts: [[2062, 1280], [2076, 1292], [2092, 1298]] },
|
|
49
|
+
{ id: 'shore-road', w: 2, pts: [[2064, 1262], [2098, 1266], [2126, 1268], [2143, 1266]] },
|
|
50
|
+
{ id: 'shelf-road', w: 2, pts: [[2112, 1262], [2132, 1256], [2146, 1250]] },
|
|
51
|
+
];
|
|
52
|
+
// ---- THE TIDEWALK: the Gannet Bar's tide (a pure function of the UTC wall clock: the same for everyone and every restart, nothing saved) -----------------
|
|
53
|
+
/**
|
|
54
|
+
* Three minutes. The sea stands HIGH over the Bar for 45 s (the bell is silent), EBBS for 45 s (the bell tolls once and a pale line of wet sand shows
|
|
55
|
+
* down the Bar: it will open), lies LOW for 75 s (the Bar is open) and FLOODS for the last 15 s (the bell tolls again: the sea is coming back). The
|
|
56
|
+
* Bar is walkable for 90 s of the 180: the low water and the flood together.
|
|
57
|
+
*/
|
|
58
|
+
export const GANNET_TIDE_CYCLE_MS = 180_000;
|
|
59
|
+
const EDGES = [
|
|
60
|
+
[0, 'high'],
|
|
61
|
+
[45_000, 'ebb'],
|
|
62
|
+
[90_000, 'low'],
|
|
63
|
+
[165_000, 'flood'],
|
|
64
|
+
];
|
|
65
|
+
const OPEN_FROM_MS = 90_000;
|
|
66
|
+
export function gannetTide(nowMs) {
|
|
67
|
+
const t = ((nowMs % GANNET_TIDE_CYCLE_MS) + GANNET_TIDE_CYCLE_MS) % GANNET_TIDE_CYCLE_MS;
|
|
68
|
+
let phase = 'high';
|
|
69
|
+
for (const [from, p] of EDGES)
|
|
70
|
+
if (t >= from)
|
|
71
|
+
phase = p;
|
|
72
|
+
const open = t >= OPEN_FROM_MS;
|
|
73
|
+
return {
|
|
74
|
+
phase,
|
|
75
|
+
msUntilOpen: open ? 0 : OPEN_FROM_MS - t,
|
|
76
|
+
msLeftOpen: open ? GANNET_TIDE_CYCLE_MS - t : 0,
|
|
77
|
+
msUntilHigh: GANNET_TIDE_CYCLE_MS - t,
|
|
78
|
+
cycle: Math.floor(nowMs / GANNET_TIDE_CYCLE_MS),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** The Bar can be walked out on: the low water and the flood (the sea is still falling back or just turning). */
|
|
82
|
+
export const isGannetBarOpen = (nowMs) => gannetTide(nowMs).phase === 'low' || gannetTide(nowMs).phase === 'flood';
|
|
83
|
+
/** The sea is over the Bar: the high water and the ebb, when anyone still out there is carried back to the shore. */
|
|
84
|
+
export const isGannetBarSea = (nowMs) => !isGannetBarOpen(nowMs);
|
|
85
|
+
/** "about 3 minutes" / "about 40 seconds". */
|
|
86
|
+
export function gannetWait(ms) {
|
|
87
|
+
const s = Math.max(1, Math.round(ms / 1000));
|
|
88
|
+
return s >= 90 ? `about ${Math.round(s / 60)} minutes` : `about ${s} seconds`;
|
|
89
|
+
}
|
|
90
|
+
/** The bell post's line (readable any time, quest or not). */
|
|
91
|
+
export function gannetTideLine(nowMs) {
|
|
92
|
+
const t = gannetTide(nowMs);
|
|
93
|
+
if (t.phase === 'low')
|
|
94
|
+
return `The mark on the bell post is dry to its lowest line and a pale strip of wet sand runs the length of the Bar: it is open, with ${gannetWait(t.msLeftOpen)} before the sea comes back.`;
|
|
95
|
+
if (t.phase === 'flood')
|
|
96
|
+
return `The bell has tolled: the sea is turning. The Bar closes in ${gannetWait(t.msLeftOpen)}, so get off it now, or the tide will carry you ashore.`;
|
|
97
|
+
if (t.phase === 'ebb')
|
|
98
|
+
return `The sea is falling off the Bar and a pale line of wet sand is showing. The Bar opens in ${gannetWait(t.msUntilOpen)}.`;
|
|
99
|
+
return `High water: the sea is over the Bar and the bell is silent. It opens in ${gannetWait(t.msUntilOpen)}.`;
|
|
100
|
+
}
|
|
101
|
+
export const GANNET_BELL_EBB_TEXT = 'The tide bell tolls once at the camp post. The sea is falling off the Gannet Bar: it opens in about 45 seconds.';
|
|
102
|
+
export const GANNET_BELL_FLOOD_TEXT = 'The tide bell tolls twice. The sea is turning on the Gannet Bar: get off it in the next fifteen seconds or the tide will carry you ashore.';
|
|
103
|
+
export const GANNET_BAR_SHUT_TEXT = 'The sea is over the Gannet Bar and the stack is cut off.';
|
|
104
|
+
export const GANNET_SWEPT_TEXT = 'The sea comes back over the Bar and lifts you off your feet. It carries you in and sets you down on the shingle, soaked and unhurt, with everything you carried.';
|
|
105
|
+
// ---- Stands ---------------------------------------------------------------------------------------------------------------------------
|
|
106
|
+
export const GANNET_STANDS = {
|
|
107
|
+
/** Where the point road leaves the cove's shore (open ground). */
|
|
108
|
+
road: { x: 2116, z: 1202 },
|
|
109
|
+
camp: { x: 2048, z: 1272 },
|
|
110
|
+
bellPost: { x: 2047, z: 1266 },
|
|
111
|
+
board: { x: 2051, z: 1262 },
|
|
112
|
+
/** The Bar's shore foot (outside the gate) and the stack (inside it). */
|
|
113
|
+
barFoot: { x: 2018, z: 1304 },
|
|
114
|
+
stack: { x: 2018, z: 1331 },
|
|
115
|
+
/** Just outside each den's box (the dens hunt only inside their own ground). */
|
|
116
|
+
light: { x: 2030, z: 1280 },
|
|
117
|
+
cliffs: { x: 2076, z: 1286 },
|
|
118
|
+
shelf: { x: 2112, z: 1268 },
|
|
119
|
+
pegs: { x: 2143, z: 1266 },
|
|
120
|
+
plaza: { x: 2140, z: 1236 },
|
|
121
|
+
};
|
|
122
|
+
/** Where the tide sets a swept player down: the shingle at the Bar's foot. */
|
|
123
|
+
export const GANNET_SWEPT_TO = { x: 2018, z: 1303 };
|
|
124
|
+
const kitp = (id, model, x, z, facing = 's', scale) => ({
|
|
125
|
+
id: `gp-${id}`, kind: 'dreadmodel', style: `${model}-${facing}`, x, z, ...(scale ? { scale } : {}),
|
|
126
|
+
});
|
|
127
|
+
/** Tideway Camp: the racks, the boat on its trestles, the cookhouse, the stores and the board. */
|
|
128
|
+
export const GANNET_CAMP_PIECES = [
|
|
129
|
+
kitp('cookhouse', 'towncookhouse5x3', 2056, 1262),
|
|
130
|
+
kitp('smoke-racks-a', 'meatrack', 2038, 1260),
|
|
131
|
+
kitp('smoke-racks-b', 'meatrack', 2038, 1264),
|
|
132
|
+
kitp('smoker', 'smoker', 2042, 1262),
|
|
133
|
+
kitp('net-rack-a', 'hbnetrack', 2037, 1270),
|
|
134
|
+
kitp('net-rack-b', 'hbnetrack', 2037, 1274),
|
|
135
|
+
kitp('net-heap', 'evnetheap', 2041, 1272),
|
|
136
|
+
kitp('boat', 'pbrowboat', 2052, 1278),
|
|
137
|
+
kitp('trestle-a', 'trestletable', 2052, 1281),
|
|
138
|
+
kitp('stores', 'suppliesshed', 2042, 1280),
|
|
139
|
+
kitp('crates-a', 'hbsupplycrates', 2046, 1281),
|
|
140
|
+
kitp('crates-b', 'evstorecrates', 2058, 1274),
|
|
141
|
+
kitp('crab-pots', 'evcrabpots', 2059, 1277),
|
|
142
|
+
kitp('sacks', 'hubsack', 2060, 1271),
|
|
143
|
+
kitp('lamp-nw', 'townlantern1x1', 2034, 1257),
|
|
144
|
+
kitp('lamp-ne', 'townlantern1x1', 2060, 1257),
|
|
145
|
+
kitp('lamp-se', 'townlantern1x1', 2060, 1282),
|
|
146
|
+
kitp('lamp-sw', 'townlantern1x1', 2036, 1282),
|
|
147
|
+
kitp('driftwood-a', 'beachdriftwood', 2044, 1286),
|
|
148
|
+
kitp('driftwood-b', 'beachdriftwood', 2050, 1285),
|
|
149
|
+
kitp('driftwood-c', 'beachdriftwood', 2056, 1286),
|
|
150
|
+
{ id: 'gp-barrel', kind: 'barrel', style: 'barrel', x: 2047, z: 1257, scale: 1 },
|
|
151
|
+
{ id: 'gp-stove', kind: 'stove', style: '', x: 2056, z: 1266 },
|
|
152
|
+
{ id: 'gp-fire', kind: 'campfire', style: 'beach-pit', x: 2048, z: 1270, scale: 1 },
|
|
153
|
+
{ id: 'gp-board', kind: 'bountyboard', style: 'wall-s', x: 2051, z: 1258 },
|
|
154
|
+
];
|
|
155
|
+
/** The tide bell post's stand-in pole (the bell itself is the quest prop `gpbell`, below). */
|
|
156
|
+
export const GANNET_BELL_POST_PIECE = kitp('bell-post', 'townwaypost1x1', 2045, 1266);
|
|
157
|
+
/** Hale's Light: a ruined lamp tower on the south-west shore, the ruins of its keeper's wall and heaps of wreckage. */
|
|
158
|
+
export const GANNET_LIGHT_PIECES = [
|
|
159
|
+
kitp('light-tower', 'lwbeacontower', 2000, 1284),
|
|
160
|
+
kitp('light-wall-a', 'hbruinwall', 1994, 1290),
|
|
161
|
+
kitp('light-wall-b', 'hbruinwall', 1995, 1290),
|
|
162
|
+
kitp('light-wall-c', 'hbruinwall', 2005, 1291),
|
|
163
|
+
kitp('light-wall-d', 'hbruinwall', 2006, 1291),
|
|
164
|
+
kitp('light-rubble-a', 'hbrubble', 1998, 1291),
|
|
165
|
+
kitp('light-rubble-b', 'hbrubble', 2003, 1278),
|
|
166
|
+
kitp('light-wreck', 'wreckedboat', 1990, 1296),
|
|
167
|
+
kitp('light-crates', 'hbcrates', 2010, 1288),
|
|
168
|
+
kitp('light-driftwood-a', 'beachdriftwood', 1996, 1298),
|
|
169
|
+
kitp('light-driftwood-b', 'beachdriftwood', 2008, 1298),
|
|
170
|
+
];
|
|
171
|
+
/** Gannet Cliffs: nest ledges along the south shore. */
|
|
172
|
+
export const GANNET_CLIFF_PIECES = [
|
|
173
|
+
...[2068, 2074, 2080, 2086, 2092, 2098].map((x, i) => kitp(`nest-${i + 1}`, 'brnest', x, 1296 + (i % 2) * 3)),
|
|
174
|
+
kitp('cliff-rock-a', 'lwseastackb', 2070, 1305),
|
|
175
|
+
kitp('cliff-rock-b', 'lwseastackc', 2096, 1303),
|
|
176
|
+
kitp('cliff-rock-c', 'lwseastacka', 2083, 1306),
|
|
177
|
+
];
|
|
178
|
+
/** The rock-hopper shelf on the east shore: rock pools and crab pots. */
|
|
179
|
+
export const GANNET_SHELF_PIECES = [
|
|
180
|
+
kitp('shelf-pool-a', 'rockpool', 2146, 1256),
|
|
181
|
+
kitp('shelf-pool-b', 'rockpool', 2142, 1270),
|
|
182
|
+
kitp('shelf-pool-c', 'rockpool', 2131, 1280),
|
|
183
|
+
kitp('shelf-pots', 'evcrabpots', 2140, 1262),
|
|
184
|
+
kitp('shelf-driftwood', 'beachdriftwood', 2138, 1266),
|
|
185
|
+
];
|
|
186
|
+
/** The stack: the nest hoard chest and the nests on its grassy top, and sea stacks standing off it in the water. */
|
|
187
|
+
export const GANNET_STACK_PIECES = [
|
|
188
|
+
kitp('stack-chest', 'pchestsea', 2018, 1338),
|
|
189
|
+
kitp('stack-nest-a', 'brnest', 2014, 1332),
|
|
190
|
+
kitp('stack-nest-b', 'brnest', 2022, 1331),
|
|
191
|
+
kitp('stack-nest-c', 'brnest', 2015, 1337),
|
|
192
|
+
kitp('stack-nest-d', 'brnest', 2021, 1336),
|
|
193
|
+
kitp('stack-rock-a', 'lwseastackb', 2005, 1334),
|
|
194
|
+
kitp('stack-rock-b', 'lwseastackc', 2031, 1338),
|
|
195
|
+
];
|
|
196
|
+
/** Marker posts down both edges of the Bar's shore foot and stack landing (the Bar's middle is quest props). */
|
|
197
|
+
export const GANNET_MARKER_PIECES = [
|
|
198
|
+
kitp('post-foot-w', 'landingpost', 2016, 1308),
|
|
199
|
+
kitp('post-foot-e', 'landingpost', 2020, 1308),
|
|
200
|
+
kitp('post-stack-w', 'landingpost', 2016, 1328),
|
|
201
|
+
kitp('post-stack-e', 'landingpost', 2020, 1328),
|
|
202
|
+
];
|
|
203
|
+
/** Signs (the placard signpost). Player text: written for a customer. */
|
|
204
|
+
export const GANNET_SIGNS = [
|
|
205
|
+
{ id: 'gp-sign-road', x: 2113, z: 1204, text: 'Gannet Point. Tideway Camp, five fishing pegs, nesting cliffs and a ruined lamp tower. Combat 22+. No bank here: banks are in towns.' },
|
|
206
|
+
{ id: 'gp-sign-camp', x: 2052, z: 1255, text: 'Tideway Camp. A cook who buys what you cook, a Bounty Board and the tide bell. The Gannet Bar to the stack opens for ninety seconds of every three minutes: listen for the bell.' },
|
|
207
|
+
{ id: 'gp-sign-bar', x: 2014, z: 1305, text: 'THE GANNET BAR. Under the sea most of the time. A pale strip of wet sand and the bell mean it is opening. When the bell tolls twice, get off: the tide carries you ashore, soaked but unhurt.' },
|
|
208
|
+
{ id: 'gp-sign-light', x: 2012, z: 1284, text: "Hale's Light. The wreckers who once showed false lights from this tower still keep it. Keep to the road unless you mean to fight." },
|
|
209
|
+
{ id: 'gp-sign-cliffs', x: 2066, z: 1292, text: 'Gannet Cliffs. Nesting birds on every ledge. They fight only when struck, and they strike hard.' },
|
|
210
|
+
];
|
|
211
|
+
export const GANNET_FOLK_NAMES = {
|
|
212
|
+
netmender: 'Net-Mender Bryn Tolley',
|
|
213
|
+
lampkeeper: 'Lamp-Keeper Orla Fenwick',
|
|
214
|
+
cook: 'Cook Pru Hallow',
|
|
215
|
+
tidewarden: 'Tide-Warden Corin Sale',
|
|
216
|
+
boatwright: 'Boatwright Sam Keel',
|
|
217
|
+
gullwatcher: 'Gull-Watcher Ada Mercer',
|
|
218
|
+
};
|
|
219
|
+
const CAMP_PLACE = 'Tideway Camp, Gannet Point';
|
|
220
|
+
/** The five residents (named residents on the default look, stationary): the cook is a camp trader (below). */
|
|
221
|
+
export const GANNET_FOLK = [
|
|
222
|
+
{
|
|
223
|
+
id: 'gp-netmender',
|
|
224
|
+
name: GANNET_FOLK_NAMES.netmender,
|
|
225
|
+
place: CAMP_PLACE,
|
|
226
|
+
x: 2039, z: 1272, faceX: 2037, faceZ: 1272, leash: 1,
|
|
227
|
+
speak: "Bryn Tolley, net-mender. The nets on these racks have been mended more times than the boat has been patched. Rock samphire in the pickle, tide snapper for the weights, and I am forever short of both. Fish the pegs, cast and wait: the shore feeds anyone who is patient.",
|
|
228
|
+
extras: [
|
|
229
|
+
{ id: 'pegs', label: 'The pegs', say: "Five pegs round the point: three on the east shore by the crab shelf and two along the south shore. Tide snapper bite there from Fishing 14, and conger from Fishing 30 off the far ones. Bring a heavy rod and lugworms for the conger." },
|
|
230
|
+
{ id: 'samphire', label: 'Rock samphire', say: "It grows on the shore sand, in the salt spray, and it wants Foraging 24 to pick without bruising it. A pinch in the net pickle keeps the gulls off the catch." },
|
|
231
|
+
],
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
id: 'gp-lampkeeper',
|
|
235
|
+
name: GANNET_FOLK_NAMES.lampkeeper,
|
|
236
|
+
place: CAMP_PLACE,
|
|
237
|
+
x: 2034, z: 1278, faceX: 2032, faceZ: 1285, leash: 1,
|
|
238
|
+
speak: "Orla Fenwick. I kept the lamp at Hale's Light before the wreckers took it. They set false lights along the shingle and called the ships in onto the rocks, and when the Crown stopped caring they stayed. The tower is still theirs.",
|
|
239
|
+
extras: [
|
|
240
|
+
{ id: 'light', label: "Hale's Light", say: "South-west along the shore, on the point of rock. The wreckers have hounds, and three of their false lamps are still lit along the shingle. Put those out and the ships will see the real light again." },
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 'gp-tidewarden',
|
|
245
|
+
name: GANNET_FOLK_NAMES.tidewarden,
|
|
246
|
+
place: CAMP_PLACE,
|
|
247
|
+
x: 2047, z: 1268, faceX: 2046, faceZ: 1266, leash: 1,
|
|
248
|
+
speak: "Corin Sale, Tide-Warden. I ring the bell at this post when the sea starts to fall off the Gannet Bar. Three minutes a round: forty-five high, forty-five ebbing, seventy-five low and fifteen turning. Ninety seconds in all that the Bar will bear you.",
|
|
249
|
+
extras: [
|
|
250
|
+
{ id: 'bar', label: 'The Gannet Bar', say: "The shingle bar out to the stack. Under the sea most of the time. When a pale strip of wet sand shows down it, and the bell tolls once, it is opening. When the bell tolls twice, you have fifteen seconds. If you are still out there when the sea returns, the tide lifts you and sets you down on the shore, soaked and unhurt. It never drowns anyone: it only sends you back." },
|
|
251
|
+
{ id: 'stack', label: 'The stack', say: "Gannet Stack. The matriarch nests on top, Old Skerrywing: a huge, scarred bird that has seen off every egg-hunter on this coast. Her dive is told a turn ahead by a pale ring on the rock. Step out of it and she misses." },
|
|
252
|
+
],
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
id: 'gp-boatwright',
|
|
256
|
+
name: GANNET_FOLK_NAMES.boatwright,
|
|
257
|
+
place: CAMP_PLACE,
|
|
258
|
+
x: 2051, z: 1275, faceX: 2052, faceZ: 1278, leash: 1,
|
|
259
|
+
speak: "Sam Keel, boatwright. That hull on the trestles has been on its trestles for three winters and I am still not happy with the keel. There is no way off the point by water: the wreckers hold the next cove, and the Bar goes only to the stack.",
|
|
260
|
+
extras: [
|
|
261
|
+
{ id: 'boat', label: 'The boat', say: "She was a good boat once. The tide took her moorings in the autumn gale and cast her up on the shingle. I mean to put her back in the water, one plank at a time, and I have never once been out of timber." },
|
|
262
|
+
],
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
id: 'gp-gullwatcher',
|
|
266
|
+
name: GANNET_FOLK_NAMES.gullwatcher,
|
|
267
|
+
place: CAMP_PLACE,
|
|
268
|
+
x: 2061, z: 1276, faceX: 2062, faceZ: 1280, leash: 1,
|
|
269
|
+
speak: "Ada Mercer. I count the gannets on the cliffs every spring and every autumn, and there are fewer each year. The hounds from Hale's Light worry the ledges, and the wreckers take the eggs. Somebody should count them honestly.",
|
|
270
|
+
extras: [
|
|
271
|
+
{ id: 'cliffs', label: 'Gannet Cliffs', say: "The ledges along the south shore, east of the Bar. The birds fight only when struck, and a gannet's beak is a spear. Take them one at a time and keep your back to the sea." },
|
|
272
|
+
],
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
export function gannetFolkByName(name) {
|
|
276
|
+
return name ? GANNET_FOLK.find((p) => p.name === name) ?? null : null;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The camp's cook: a CampTrader (campTraders.ts adds it) and a camp kitchen (campKitchens.ts) with a daily order. The counter sells NO food (shopFood.ts);
|
|
280
|
+
* the cook BUYS what players cook.
|
|
281
|
+
*/
|
|
282
|
+
export const GANNET_COOK = {
|
|
283
|
+
id: 'camp-gannet',
|
|
284
|
+
name: GANNET_FOLK_NAMES.cook,
|
|
285
|
+
place: 'the cookhouse, Tideway Camp, Gannet Point',
|
|
286
|
+
x: 2056, z: 1264, faceX: 2054, faceZ: 1268, leash: 1,
|
|
287
|
+
shopTitle: "Pru's Cookhouse",
|
|
288
|
+
stock: [],
|
|
289
|
+
buys: { ...CAMP_COOK_BUYS },
|
|
290
|
+
speak: "Cook Pru Hallow. I feed the net-menders and whoever else wanders in off the shingle. The pot is on, the smoke racks are full and I have not sold a meal in my life: I buy what you cook, and I pay better than the market does.",
|
|
291
|
+
trade: "I sell no suppers: the pegs are forty paces off and the shore feeds anyone who will stand and wait. Bring me tide snapper and conger you cooked yourself and I will buy them. Ask me what I want cooked today.",
|
|
292
|
+
};
|
|
293
|
+
// ---- Quest props -----------------------------------------------------------------------------------------------------------------------
|
|
294
|
+
export const GP_PROP = { bell: 'gpbell', mark: 'gpmark', lamp: 'gplamp', nest: 'gpnest' };
|
|
295
|
+
/** The tide bell on its post at the camp (a quest prop: it reads out the tide whenever it is clicked). */
|
|
296
|
+
export const GP_BELL = { id: 'gp-quest-bell', x: 2046, z: 1266, style: `${GP_PROP.bell}:post` };
|
|
297
|
+
/** The Tide-Warden's three marks: the shore foot of the Bar, its middle (on the gate's band) and the stack. */
|
|
298
|
+
export const GP_MARK_FOOT = { id: 'gp-quest-mark-foot', x: 2019, z: 1309, style: `${GP_PROP.mark}:foot` };
|
|
299
|
+
export const GP_MARK_MID = { id: 'gp-quest-mark-mid', x: 2019, z: 1318, style: `${GP_PROP.mark}:mid` };
|
|
300
|
+
export const GP_MARK_STACK = { id: 'gp-quest-mark-stack', x: 2020, z: 1331, style: `${GP_PROP.mark}:stack` };
|
|
301
|
+
/** The wreckers' three false lamps along the shingle below Hale's Light. */
|
|
302
|
+
export const GP_LAMP_A = { id: 'gp-quest-lamp-a', x: 1992, z: 1297, style: `${GP_PROP.lamp}:a` };
|
|
303
|
+
export const GP_LAMP_B = { id: 'gp-quest-lamp-b', x: 2002, z: 1299, style: `${GP_PROP.lamp}:b` };
|
|
304
|
+
export const GP_LAMP_C = { id: 'gp-quest-lamp-c', x: 2014, z: 1298, style: `${GP_PROP.lamp}:c` };
|
|
305
|
+
/** The gull-watcher's four nest counts on the cliffs. */
|
|
306
|
+
export const GP_NEST_A = { id: 'gp-quest-nest-a', x: 2069, z: 1293, style: `${GP_PROP.nest}:a` };
|
|
307
|
+
export const GP_NEST_B = { id: 'gp-quest-nest-b', x: 2077, z: 1296, style: `${GP_PROP.nest}:b` };
|
|
308
|
+
export const GP_NEST_C = { id: 'gp-quest-nest-c', x: 2089, z: 1294, style: `${GP_PROP.nest}:c` };
|
|
309
|
+
export const GP_NEST_D = { id: 'gp-quest-nest-d', x: 2097, z: 1296, style: `${GP_PROP.nest}:d` };
|
|
310
|
+
export const GANNET_QUEST_PROPS = [
|
|
311
|
+
GP_BELL, GP_MARK_FOOT, GP_MARK_MID, GP_MARK_STACK, GP_LAMP_A, GP_LAMP_B, GP_LAMP_C, GP_NEST_A, GP_NEST_B, GP_NEST_C, GP_NEST_D,
|
|
312
|
+
];
|
|
313
|
+
export const GANNET_QUEST_PROP_NAMES = {
|
|
314
|
+
[GP_BELL.style]: 'Tide Bell',
|
|
315
|
+
[GP_MARK_FOOT.style]: "Tide-Warden's Mark (the foot)",
|
|
316
|
+
[GP_MARK_MID.style]: "Tide-Warden's Mark (the middle of the Bar)",
|
|
317
|
+
[GP_MARK_STACK.style]: "Tide-Warden's Mark (the stack)",
|
|
318
|
+
[GP_LAMP_A.style]: "Wreckers' False Lamp",
|
|
319
|
+
[GP_LAMP_B.style]: "Wreckers' False Lamp",
|
|
320
|
+
[GP_LAMP_C.style]: "Wreckers' False Lamp",
|
|
321
|
+
[GP_NEST_A.style]: 'Nest Count (first ledge)',
|
|
322
|
+
[GP_NEST_B.style]: 'Nest Count (second ledge)',
|
|
323
|
+
[GP_NEST_C.style]: 'Nest Count (third ledge)',
|
|
324
|
+
[GP_NEST_D.style]: 'Nest Count (fourth ledge)',
|
|
325
|
+
};
|
|
326
|
+
/** The model a Gannet Point quest prop draws with (frontend models that already exist), or null if not one of them. */
|
|
327
|
+
export function gannetPropModel(prop) {
|
|
328
|
+
if (prop === GP_PROP.bell)
|
|
329
|
+
return 'lwropepost';
|
|
330
|
+
if (prop === GP_PROP.mark)
|
|
331
|
+
return 'landingpost';
|
|
332
|
+
if (prop === GP_PROP.lamp)
|
|
333
|
+
return 'questlantern';
|
|
334
|
+
if (prop === GP_PROP.nest)
|
|
335
|
+
return 'questclue';
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
/** The idle line for a prop clicked when the quest does not want it (the bell reads the tide any time). */
|
|
339
|
+
export function gannetPropIdleLine(prop, nowMs) {
|
|
340
|
+
if (prop === GP_PROP.bell)
|
|
341
|
+
return gannetTideLine(nowMs);
|
|
342
|
+
if (prop === GP_PROP.mark)
|
|
343
|
+
return `A tarred post with the tide lines cut in it. ${gannetTideLine(nowMs)}`;
|
|
344
|
+
if (prop === GP_PROP.lamp)
|
|
345
|
+
return "One of the wreckers' false lamps, a lantern in a tin hood set on a stake to look like a harbour light. Lamp-Keeper Orla Fenwick wants them put out.";
|
|
346
|
+
if (prop === GP_PROP.nest)
|
|
347
|
+
return "A ledge of gannet nests whitened with droppings. Gull-Watcher Ada Mercer counts every one each season.";
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
// ---- Fish and herbs --------------------------------------------------------------------------------------------------------------------
|
|
351
|
+
/** Rock samphire on the shore sand (types potionMaking.ts samphire, Foraging 24): placed by the backend on the nearest sand tile. */
|
|
352
|
+
export const GANNET_SAMPHIRE_SPOTS = [
|
|
353
|
+
{ x: 2148, z: 1246 },
|
|
354
|
+
{ x: 2150, z: 1258 },
|
|
355
|
+
{ x: 2146, z: 1267 },
|
|
356
|
+
{ x: 2135, z: 1278 },
|
|
357
|
+
{ x: 2095, z: 1301 },
|
|
358
|
+
{ x: 2000, z: 1305 },
|
|
359
|
+
];
|
|
360
|
+
// ---- Places ----------------------------------------------------------------------------------------------------------------------------
|
|
361
|
+
export const GANNET_PLACE_TEXT = `${GANNET_POINT_NAME} is the wooded headland south of Lantern Wake's tide pools and Crab Beach, for levels 22 to 28: walk down the shore from the cove past the tide pools. ${GANNET_CAMP_NAME} above the shingle is a fishermen's camp with a cook who buys what you cook (it sells no food), a Bounty Board and the tide bell. Five pegs on the east shore and the south shore fish tide snapper from Fishing 14 and conger from Fishing 30, and rock samphire grows on the shore sand (Foraging 24). ${GANNET_LIGHT_NAME} is a ruined lamp tower held by wreckers and coast hounds, and Gannet Cliffs and the Rock-Hopper Shelf hold gannets and reef crabs. ${GANNET_BAR_NAME} runs out to ${GANNET_STACK_NAME} and is under the sea most of a three minute tide: it opens for ninety seconds, told by the tide bell at the camp post and a pale strip of wet sand; if you are still on it when the sea returns, the tide carries you ashore, soaked and unhurt. On the stack nests Old Skerrywing, a huge scarred gannet and the point's mini-boss. There is no bank here: banks are in towns.`;
|
|
362
|
+
/** The discovery zones, smallest first: the stack, the camp, the dens (gannetPointDens.ts), then the headland. */
|
|
363
|
+
export const GANNET_STACK_DISCOVERY_ZONE = { id: 'gannet-stack', label: GANNET_STACK_NAME, coordinateFrame: 'world', ...GANNET_STACK_BOX };
|
|
364
|
+
export const GANNET_CAMP_DISCOVERY_ZONE = { id: 'tideway-camp', label: GANNET_CAMP_NAME, coordinateFrame: 'world', ...GANNET_CAMP_BOX };
|
|
365
|
+
export const GANNET_UMBRELLA_DISCOVERY_ZONE = { id: GANNET_ID, label: GANNET_POINT_NAME, coordinateFrame: 'world', ...GANNET_POINT_BOX };
|
|
366
|
+
/** The paper-map labels. */
|
|
367
|
+
export const GANNET_MAP_LABELS = [
|
|
368
|
+
{ x: 2048, z: 1262, label: GANNET_CAMP_NAME },
|
|
369
|
+
{ x: 2018, z: 1318, label: GANNET_BAR_NAME },
|
|
370
|
+
{ x: 2018, z: 1334, label: GANNET_STACK_NAME },
|
|
371
|
+
{ x: 2000, z: 1284, label: GANNET_LIGHT_NAME },
|
|
372
|
+
{ x: 2082, z: 1298, label: 'Gannet Cliffs' },
|
|
373
|
+
];
|
|
374
|
+
//# sourceMappingURL=gannetPoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gannetPoint.js","sourceRoot":"","sources":["../src/gannetPoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GANNET POINT'S DENS AND OLD SKERRYWING (2026-10-18; gannetPoint.ts has the place). Four dens of EXISTING kinds (the coast's cliff gulls, reef crabs, coast
|
|
3
|
+
* hounds and island raiders, here the "wreckers"), scaled to levels 22-27, in the pattern of Ashfall's dens (ashfallDens.ts): a creature of a den is told apart
|
|
4
|
+
* from the same kind elsewhere by its id (`gpd-<site>-<kind>-<n>`), the backend rolls its level, hit, drops, respawn and aggro from THIS file, and it hunts only
|
|
5
|
+
* a player standing INSIDE its own den's box and gives up at its leash. A den needs no new model, name, icon or guide row.
|
|
6
|
+
*
|
|
7
|
+
* OLD SKERRYWING is the stack's mini-boss (level 28): a huge scarred gannet matriarch that has seen off every egg-hunter on this coast. Passive until struck.
|
|
8
|
+
* Every fourth blow she wheels up and folds into her Dive: a pale ring spreads on the rock under her a full turn ahead; step out of its reach and it misses
|
|
9
|
+
* (the E8 step-clear counter, bossSignatures.ts `skerry-dive`). Drawn as the Grandfather Gull's gull model at a larger scale until a model of her own exists
|
|
10
|
+
* (upgrades row `skerrywing-model`).
|
|
11
|
+
*
|
|
12
|
+
* Nothing here is 41+. Every number is a PLACEHOLDER for the balance pass. World tiles (x east, z south).
|
|
13
|
+
*/
|
|
14
|
+
import type { LanternWakeBox } from './lanternWake.js';
|
|
15
|
+
import type { DiscoveryZone } from './landmarks.js';
|
|
16
|
+
export type GannetDenKind = 'cliffgull' | 'reefcrab' | 'coasthound' | 'isleraider';
|
|
17
|
+
export type GannetDenSiteId = 'gannet-cliffs' | 'hales-light' | 'hopper-shelf' | 'gannet-stack';
|
|
18
|
+
export type GannetDenSpot = {
|
|
19
|
+
readonly x: number;
|
|
20
|
+
readonly z: number;
|
|
21
|
+
readonly leash: number;
|
|
22
|
+
};
|
|
23
|
+
export type GannetDenGroup = {
|
|
24
|
+
readonly kind: GannetDenKind;
|
|
25
|
+
readonly level: readonly [number, number];
|
|
26
|
+
readonly maxHit: number;
|
|
27
|
+
readonly healthScale: number;
|
|
28
|
+
readonly aggro: number;
|
|
29
|
+
readonly leashRadius: number;
|
|
30
|
+
readonly notice: string;
|
|
31
|
+
readonly respawnMs: {
|
|
32
|
+
readonly minMs: number;
|
|
33
|
+
readonly maxMs: number;
|
|
34
|
+
};
|
|
35
|
+
readonly pace: {
|
|
36
|
+
readonly speed: number;
|
|
37
|
+
readonly idleChance: number;
|
|
38
|
+
readonly pause: readonly [number, number];
|
|
39
|
+
};
|
|
40
|
+
readonly spots: readonly GannetDenSpot[];
|
|
41
|
+
readonly drops: readonly {
|
|
42
|
+
readonly itemKind: string;
|
|
43
|
+
readonly chance: number;
|
|
44
|
+
readonly minQty: number;
|
|
45
|
+
readonly maxQty: number;
|
|
46
|
+
}[];
|
|
47
|
+
};
|
|
48
|
+
export type GannetDenSite = {
|
|
49
|
+
readonly id: GannetDenSiteId;
|
|
50
|
+
readonly label: string;
|
|
51
|
+
readonly box: LanternWakeBox;
|
|
52
|
+
/** Where the guide and the verify link send a player: open ground on the den's edge nearest the road. */
|
|
53
|
+
readonly stand: {
|
|
54
|
+
readonly x: number;
|
|
55
|
+
readonly z: number;
|
|
56
|
+
};
|
|
57
|
+
readonly blurb: string;
|
|
58
|
+
readonly groups: readonly GannetDenGroup[];
|
|
59
|
+
};
|
|
60
|
+
export declare const GANNET_DEN_SITES: readonly GannetDenSite[];
|
|
61
|
+
export declare const GANNET_DEN_SITE_IDS: readonly GannetDenSiteId[];
|
|
62
|
+
export declare function inGannetDenBox(box: LanternWakeBox, x: number, z: number): boolean;
|
|
63
|
+
/** The den whose box holds this tile, or null. The boxes never overlap (scripts/gannet-point-test.mjs). */
|
|
64
|
+
export declare function gannetDenSiteAt(x: number, z: number): GannetDenSite | null;
|
|
65
|
+
/** A den creature's server id: `gpd-<site>-<kind>-<n>`. */
|
|
66
|
+
export declare const GANNET_DEN_ID_PREFIX = "gpd-";
|
|
67
|
+
export declare function gannetDenId(site: GannetDenSiteId, kind: GannetDenKind, n: number): string;
|
|
68
|
+
/** The site and group an id names, or null for any other creature. */
|
|
69
|
+
export declare function parseGannetDenId(id: string): {
|
|
70
|
+
site: GannetDenSite;
|
|
71
|
+
group: GannetDenGroup;
|
|
72
|
+
} | null;
|
|
73
|
+
export declare const SKERRYWING_KIND = "skerrywing";
|
|
74
|
+
export declare const SKERRYWING_NAME = "Old Skerrywing";
|
|
75
|
+
export declare const SKERRYWING: {
|
|
76
|
+
readonly id: "gpd-skerrywing-1";
|
|
77
|
+
readonly x: 2018;
|
|
78
|
+
readonly z: 1335;
|
|
79
|
+
readonly leash: 4;
|
|
80
|
+
readonly level: readonly [number, number];
|
|
81
|
+
readonly maxHit: 22;
|
|
82
|
+
/** A mini-boss's hide: much thicker than the level's ordinary health. */
|
|
83
|
+
readonly healthScale: 2.2;
|
|
84
|
+
/** Drawn bigger than the gull she wears (the same model, scaled). */
|
|
85
|
+
readonly scale: 2.6;
|
|
86
|
+
/** The stack is her aggro ground (the stack's box). */
|
|
87
|
+
readonly aggro: 6;
|
|
88
|
+
readonly notice: "Old Skerrywing lifts her scarred wings off the nest and glares at you.";
|
|
89
|
+
readonly note: "A huge scarred gannet matriarch that has seen off every egg-hunter on this coast. Passive until struck. Every fourth blow she wheels up and folds into her Dive: a pale ring spreads on the rock under her a full turn ahead, and if you step out of its reach the dive goes wide. Back six to eight minutes after she falls.";
|
|
90
|
+
};
|
|
91
|
+
export declare const SKERRYWING_RESPAWN_MS: {
|
|
92
|
+
readonly minMs: 360000;
|
|
93
|
+
readonly maxMs: 480000;
|
|
94
|
+
};
|
|
95
|
+
export declare const SKERRYWING_PACE: {
|
|
96
|
+
readonly speed: 0.9;
|
|
97
|
+
readonly idleChance: 0.7;
|
|
98
|
+
readonly pause: readonly [number, number];
|
|
99
|
+
};
|
|
100
|
+
/** Placeholders for the balance pass: coins, feathers, a little steel and a chance of a silver or gold bar from the hoard. */
|
|
101
|
+
export declare const SKERRYWING_DROPS: readonly {
|
|
102
|
+
itemKind: string;
|
|
103
|
+
chance: number;
|
|
104
|
+
minQty: number;
|
|
105
|
+
maxQty: number;
|
|
106
|
+
}[];
|
|
107
|
+
/** The model the client draws her with until she has one (the Grandfather Gull's, at SKERRYWING.scale). */
|
|
108
|
+
export declare const SKERRYWING_STAND_IN = "grandfathergull";
|
|
109
|
+
export declare const GANNET_DISCOVERY_ZONES: readonly DiscoveryZone[];
|
|
110
|
+
//# sourceMappingURL=gannetPointDens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gannetPointDens.d.ts","sourceRoot":"","sources":["../src/gannetPointDens.ts"],"names":[],"mappings":"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"}
|