@dreadwood-types/types 0.1.365 → 0.1.367
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 +5 -0
- package/dist/campKitchens.js.map +1 -1
- package/dist/campTraders.d.ts.map +1 -1
- package/dist/campTraders.js +13 -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 +2 -1
- package/dist/expandedContracts.js.map +1 -1
- package/dist/hopeFair.d.ts +282 -0
- package/dist/hopeFair.d.ts.map +1 -0
- package/dist/hopeFair.js +451 -0
- package/dist/hopeFair.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 +2 -0
- package/dist/legacy.d.ts.map +1 -1
- package/dist/legacy.js +2 -0
- package/dist/legacy.js.map +1 -1
- package/dist/quests.d.ts.map +1 -1
- package/dist/quests.js +19 -0
- package/dist/quests.js.map +1 -1
- package/dist/serpentStones.d.ts +316 -0
- package/dist/serpentStones.d.ts.map +1 -0
- package/dist/serpentStones.js +340 -0
- package/dist/serpentStones.js.map +1 -0
- package/dist/serpentStonesQuestDef.d.ts +22 -0
- package/dist/serpentStonesQuestDef.d.ts.map +1 -0
- package/dist/serpentStonesQuestDef.js +132 -0
- package/dist/serpentStonesQuestDef.js.map +1 -0
- package/dist/storyQuests.d.ts +1 -1
- package/dist/storyQuests.d.ts.map +1 -1
- package/dist/storyQuests.js +18 -0
- package/dist/storyQuests.js.map +1 -1
- package/package.json +43 -43
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { dwarfRailX } from './dwarfRoad.js';
|
|
2
|
+
export const SS_ID = 'the-serpent-stones';
|
|
3
|
+
export const SS_NAME = 'The Serpent Stones';
|
|
4
|
+
export const SS_LEVELS = { min: 31, max: 40 };
|
|
5
|
+
/** The rows of the enclosure: the north wall, the open strip, the south wall. */
|
|
6
|
+
export const SS_NORTH_WALL = { minZ: 431, maxZ: 433 };
|
|
7
|
+
export const SS_SOUTH_WALL = { minZ: 490, maxZ: 491 };
|
|
8
|
+
export const SS_STRIP_ROWS = { minZ: SS_NORTH_WALL.maxZ + 1, maxZ: SS_SOUTH_WALL.minZ - 1 };
|
|
9
|
+
/** The box the placer works in (everything in it east of the fence that is not open ground is rock). */
|
|
10
|
+
export const SS_BOX = { minX: 1872, maxX: 1924, minZ: SS_NORTH_WALL.minZ, maxZ: SS_SOUTH_WALL.maxZ };
|
|
11
|
+
/** The fence's line at a row: two tiles east of the rail. */
|
|
12
|
+
export function ssFenceLine(z) {
|
|
13
|
+
return dwarfRailX(z) + 2;
|
|
14
|
+
}
|
|
15
|
+
/** The fence's tiles at a row: the line at this row and at the rows either side, so a step in the line leaves no diagonal gap. */
|
|
16
|
+
export function ssFenceSpan(z) {
|
|
17
|
+
const xs = [ssFenceLine(z - 1), ssFenceLine(z), ssFenceLine(z + 1)];
|
|
18
|
+
return { minX: Math.min(...xs), maxX: Math.max(...xs) };
|
|
19
|
+
}
|
|
20
|
+
/** The Lean-to Gate: the one gap in the fence (the fence line is x 1877 on these rows and the rows either side). */
|
|
21
|
+
export const SS_DOOR = { x: 1877, minZ: 484, maxZ: 486 };
|
|
22
|
+
export const inSsDoor = (x, z) => z >= SS_DOOR.minZ && z <= SS_DOOR.maxZ && x >= ssFenceSpan(z).minX && x <= ssFenceSpan(z).maxX;
|
|
23
|
+
/** The Mouth's face: the cliff stands flat at this column on these rows, the jaws in the middle. */
|
|
24
|
+
export const SS_MOUTH_FACE = { x: 1905, minZ: 437, maxZ: 445 };
|
|
25
|
+
/** The east edge of the open strip at a row (the cliff cut back to a lazy line; flat at the Mouth's face). */
|
|
26
|
+
export function ssEastEdge(z) {
|
|
27
|
+
if (z >= SS_MOUTH_FACE.minZ && z <= SS_MOUTH_FACE.maxZ)
|
|
28
|
+
return SS_MOUTH_FACE.x;
|
|
29
|
+
return 1904 + Math.round(2 * Math.sin(z / 9));
|
|
30
|
+
}
|
|
31
|
+
/** The Serpent's Mouth: the jaws through the cliff, the walk gate's band (solid for everyone until the Coil is warm). */
|
|
32
|
+
export const SS_MOUTH_BAND = { minX: SS_MOUTH_FACE.x + 1, maxX: SS_MOUTH_FACE.x + 2, minZ: 440, maxZ: 442 };
|
|
33
|
+
/** The vault: a cave in the rock behind the Mouth, shut in all round. */
|
|
34
|
+
export const SS_VAULT = { minX: SS_MOUTH_BAND.maxX + 1, maxX: 1919, minZ: 435, maxZ: 447 };
|
|
35
|
+
export const SS_MOUTH_GATE_ID = 'serpent-mouth';
|
|
36
|
+
export const inSsBoxOf = (b, x, z, pad = 0) => x >= b.minX - pad && x <= b.maxX + pad && z >= b.minZ - pad && z <= b.maxZ + pad;
|
|
37
|
+
export const inSsVault = (x, z) => inSsBoxOf(SS_VAULT, x, z);
|
|
38
|
+
export const inSsMouthBand = (x, z) => inSsBoxOf(SS_MOUTH_BAND, x, z);
|
|
39
|
+
/** The open strip inside the fence (the door's tiles not included). */
|
|
40
|
+
export function inSsStrip(x, z) {
|
|
41
|
+
if (z < SS_STRIP_ROWS.minZ || z > SS_STRIP_ROWS.maxZ)
|
|
42
|
+
return false;
|
|
43
|
+
return x > ssFenceSpan(z).maxX && x <= ssEastEdge(z);
|
|
44
|
+
}
|
|
45
|
+
/** The whole enclosure: the strip, the door, the Mouth and the vault. */
|
|
46
|
+
export function inSsSite(x, z) {
|
|
47
|
+
return inSsStrip(x, z) || inSsDoor(x, z) || inSsMouthBand(x, z) || inSsVault(x, z);
|
|
48
|
+
}
|
|
49
|
+
/** Is this tile one the placer lays as rock or fence (east of the fence's west edge, in the box, not open)? West of the fence the valley stays. */
|
|
50
|
+
export function isSsSolid(x, z) {
|
|
51
|
+
if (!inSsBoxOf(SS_BOX, x, z))
|
|
52
|
+
return false;
|
|
53
|
+
if (x < ssFenceSpan(z).minX)
|
|
54
|
+
return false;
|
|
55
|
+
return !inSsSite(x, z);
|
|
56
|
+
}
|
|
57
|
+
/** Is this tile the fence (blocked, drawn as iron rail fence) rather than rock? */
|
|
58
|
+
export function isSsFence(x, z) {
|
|
59
|
+
if (z < SS_NORTH_WALL.minZ || z > SS_SOUTH_WALL.maxZ || inSsDoor(x, z))
|
|
60
|
+
return false;
|
|
61
|
+
const s = ssFenceSpan(z);
|
|
62
|
+
return x >= s.minX && x <= s.maxX;
|
|
63
|
+
}
|
|
64
|
+
/** Reader's Lean-to's ground at the strip's south end, inside the gate. */
|
|
65
|
+
export const SS_CAMP_BOX = { minX: 1879, maxX: 1902, minZ: 478, maxZ: 489 };
|
|
66
|
+
/** The warm-slab basking ground (the Serpent Stones den, dwarfRoadDens.ts, whose box stays as it was). */
|
|
67
|
+
export const SS_BASKING_BOX = { minX: 1884, maxX: 1894, minZ: 440, maxZ: 460 };
|
|
68
|
+
/** The seven slabs, south (by the camp) to north (by the Mouth), each with its glyph. */
|
|
69
|
+
export const SS_SLABS = [
|
|
70
|
+
{ glyph: 'sun', name: 'Sun-gold Slab', colour: 'sun-gold', x: 1893, z: 474 },
|
|
71
|
+
{ glyph: 'ember', name: 'Ember-red Slab', colour: 'ember-red', x: 1897, z: 468 },
|
|
72
|
+
{ glyph: 'moss', name: 'Moss-green Slab', colour: 'moss-green', x: 1899, z: 462 },
|
|
73
|
+
{ glyph: 'river', name: 'River-blue Slab', colour: 'river-blue', x: 1895, z: 456 },
|
|
74
|
+
{ glyph: 'bone', name: 'Bone-white Slab', colour: 'bone-white', x: 1890, z: 450 },
|
|
75
|
+
{ glyph: 'slate', name: 'Slate-violet Slab', colour: 'slate-violet', x: 1891, z: 444 },
|
|
76
|
+
{ glyph: 'ash', name: 'Ash-black Slab', colour: 'ash-black', x: 1897, z: 439 },
|
|
77
|
+
];
|
|
78
|
+
export const SS_GLYPHS = SS_SLABS.map((s) => s.glyph);
|
|
79
|
+
export const SS_PROP = {
|
|
80
|
+
slab: 'ssslab',
|
|
81
|
+
slabWarm: 'ssslabwarm',
|
|
82
|
+
plaque: 'ssplaque',
|
|
83
|
+
mouth: 'ssmouth',
|
|
84
|
+
mouthOpen: 'ssmouthopen',
|
|
85
|
+
cache: 'sscache',
|
|
86
|
+
board: 'ssrubbings',
|
|
87
|
+
};
|
|
88
|
+
export const ssSlabId = (g) => `ss-slab-${g}`;
|
|
89
|
+
export const ssSlabStyle = (g, warm) => `${warm ? SS_PROP.slabWarm : SS_PROP.slab}:${g}`;
|
|
90
|
+
/** The glyph a slab's style names (cool or warm), or null. */
|
|
91
|
+
export function ssSlabGlyph(style) {
|
|
92
|
+
const m = /^ssslab(?:warm)?:([a-z]+)$/.exec(style ?? '');
|
|
93
|
+
return m && SS_GLYPHS.includes(m[1]) ? m[1] : null;
|
|
94
|
+
}
|
|
95
|
+
export const ssSlabByGlyph = (g) => SS_SLABS.find((s) => s.glyph === g);
|
|
96
|
+
export const SS_PLAQUE = { id: 'ss-sun-plaque', x: 1888, z: 477, style: `${SS_PROP.plaque}:1` };
|
|
97
|
+
/** The Mouth's prop stands on the strip in front of the jaws (clicked to read it); its style swaps shut and open. */
|
|
98
|
+
export const SS_MOUTH = { id: 'ss-mouth', x: SS_MOUTH_FACE.x, z: 441, style: `${SS_PROP.mouth}:1` };
|
|
99
|
+
export const SS_MOUTH_OPEN_STYLE = `${SS_PROP.mouthOpen}:1`;
|
|
100
|
+
export const SS_CACHE = { id: 'ss-vault-cache', x: 1917, z: 441, style: `${SS_PROP.cache}:1` };
|
|
101
|
+
export const SS_RUBBINGS = { id: 'ss-rubbings', x: 1884, z: 481, style: `${SS_PROP.board}:1` };
|
|
102
|
+
export const SS_SLAB_PROPS = SS_SLABS.map((s) => ({ id: ssSlabId(s.glyph), x: s.x, z: s.z, style: ssSlabStyle(s.glyph, false) }));
|
|
103
|
+
export const SS_QUEST_PROPS = [...SS_SLAB_PROPS, SS_PLAQUE, SS_MOUTH, SS_CACHE, SS_RUBBINGS];
|
|
104
|
+
/** How long the Mouth stays open after the seventh slab warms; then the slabs cool, the Mouth shuts and a new order is drawn. */
|
|
105
|
+
export const SS_OPEN_MS = 10 * 60_000;
|
|
106
|
+
/** A Coil left half warm this long since its last right touch cools by itself (a player who walked off mid-puzzle never locks it). */
|
|
107
|
+
export const SS_IDLE_COOL_MS = 5 * 60_000;
|
|
108
|
+
/** One wrong touch per player in this long (a second within it is refused, so the Coil cannot be woken by clicking). */
|
|
109
|
+
export const SS_WRONG_COOLDOWN_MS = 10_000;
|
|
110
|
+
/** A wrong touch wakes this many stone serpents at the toucher; never more than SS_WOKEN_CAP stand at once. They sink back after SS_WOKEN_LIFE_MS. */
|
|
111
|
+
export const SS_WOKEN_PER_WRONG = 2;
|
|
112
|
+
export const SS_WOKEN_CAP = 4;
|
|
113
|
+
export const SS_WOKEN_LIFE_MS = 120_000;
|
|
114
|
+
export const SS_WOKEN_ID_PREFIX = 'ssw-';
|
|
115
|
+
export const SS_WOKEN_LEVELS = [33, 37];
|
|
116
|
+
export const SS_WOKEN_NAME = 'Woken Serpent';
|
|
117
|
+
/** A run's order: the seven glyphs shuffled by `roll` (Math.random in the game, a seeded roll in tests). */
|
|
118
|
+
export function ssDrawOrder(roll) {
|
|
119
|
+
const order = [...SS_GLYPHS];
|
|
120
|
+
for (let k = order.length - 1; k > 0; k--) {
|
|
121
|
+
const j = Math.floor(roll() * (k + 1));
|
|
122
|
+
[order[k], order[j]] = [order[j], order[k]];
|
|
123
|
+
}
|
|
124
|
+
return order;
|
|
125
|
+
}
|
|
126
|
+
const glyphColour = (g) => ssSlabByGlyph(g).colour;
|
|
127
|
+
/** What the Sun Plaque says: this run's order, and how many are warm. */
|
|
128
|
+
export function ssPlaqueText(order, warm) {
|
|
129
|
+
const list = order.map((g, i) => `${i + 1} ${glyphColour(g)}`).join(', ');
|
|
130
|
+
const progress = warm === 0 ? 'None of the slabs is warm yet.' : warm >= order.length ? 'All seven are warm and the Mouth is open.' : `${warm} of the seven ${warm === 1 ? 'is' : 'are'} warm: the next is ${glyphColour(order[warm])}.`;
|
|
131
|
+
return `The Sun Plaque is painted with seven serpent glyphs in a row. This run's order: ${list}. ${progress} Touch a wrong slab and the Coil wakes.`;
|
|
132
|
+
}
|
|
133
|
+
export const SS_TEXT = {
|
|
134
|
+
warm: (name) => `The ${name} warms under your hand and its glyph glows.`,
|
|
135
|
+
wrong: 'Wrong slab! The Coil wakes: every slab goes cold, the ground heaves and two stone serpents rise out of it. Read the Sun Plaque and start again.',
|
|
136
|
+
allWarm: "The seventh slab warms. A long grinding runs up the Coil and in the cliff the Serpent's Mouth opens its jaws: the vault is open for ten minutes.",
|
|
137
|
+
held: "All seven slabs are warm and the Serpent's Mouth is open. They will cool when it shuts.",
|
|
138
|
+
already: 'That slab is warm already. Read the Sun Plaque for the next one.',
|
|
139
|
+
cool: 'The slab is still settling after the Coil woke. Give it a moment.',
|
|
140
|
+
cooled: 'The slabs have cooled while nobody touched them. A new order is painted on the Sun Plaque.',
|
|
141
|
+
closing: "The Serpent's Mouth grinds shut and the slabs cool. A new order is painted on the Sun Plaque.",
|
|
142
|
+
mouthShut: "The Serpent's Mouth is shut fast: a carved serpent head in the cliff with its jaws closed. Warm the seven slabs in the Sun Plaque's order and it opens.",
|
|
143
|
+
mouthOpen: "The Serpent's Mouth stands open onto the vault. It shuts ten minutes after it opened.",
|
|
144
|
+
cacheShut: 'The cache is behind the Mouth, and the Mouth is shut.',
|
|
145
|
+
cacheGuarded: 'Old Basaltback is coiled round the cache. You will not get a hand on it while he stands.',
|
|
146
|
+
cacheTaken: 'You have had your share of this run. The cache is empty for you until the Coil is woken again.',
|
|
147
|
+
cacheOpen: 'You lever up the lid of the vault cache and take your share.',
|
|
148
|
+
rubbings: 'A chalk board of rubbings from the slabs: seven glyphs, a serpent head on each, and under them a note in a careful hand. "The order changes every run. The plaque never lies. Do not touch a slab you have not read."',
|
|
149
|
+
};
|
|
150
|
+
/** The vault cache: coins and bars of your metal tier, coal and arrows, now and then a piece of your tier (the scaled events' table, rollScaledEventLoot). No food. */
|
|
151
|
+
export const SS_VAULT_LOOT = [
|
|
152
|
+
{ kind: 'coins', min: 120, max: 240, chance: 1, scales: true },
|
|
153
|
+
{ kind: '{metal}bar', min: 2, max: 4, chance: 0.9, scales: true },
|
|
154
|
+
{ kind: 'coal', min: 3, max: 6, chance: 0.6, scales: true },
|
|
155
|
+
{ kind: 'silverbar', min: 1, max: 1, chance: 0.2 },
|
|
156
|
+
{ kind: '{metal}arrow', min: 10, max: 20, chance: 0.4, scales: true },
|
|
157
|
+
{ kind: '{metal}helmet', min: 1, max: 1, chance: 0.04 },
|
|
158
|
+
{ kind: '{metal}shield', min: 1, max: 1, chance: 0.03 },
|
|
159
|
+
];
|
|
160
|
+
/** Explorer XP the first time a player warms the whole Coil in a run, and for the cache. */
|
|
161
|
+
export const SS_XP = { coil: 260, cache: 180 };
|
|
162
|
+
// ---- Old Basaltback -----------------------------------------------------------------------------------------------------------------------
|
|
163
|
+
export const BASALTBACK_KIND = 'basaltback';
|
|
164
|
+
export const BASALTBACK_NAME = 'Old Basaltback';
|
|
165
|
+
export const BASALTBACK = {
|
|
166
|
+
id: 'ss-basaltback-1',
|
|
167
|
+
x: 1914,
|
|
168
|
+
z: 441,
|
|
169
|
+
leash: 3,
|
|
170
|
+
/** Level 39 (sheet 6): the top of the band, never 41+. */
|
|
171
|
+
level: [39, 39],
|
|
172
|
+
maxHit: 31,
|
|
173
|
+
/** A mini-boss's hide: much thicker than the level's ordinary health. */
|
|
174
|
+
healthScale: 2.5,
|
|
175
|
+
/** Drawn bigger than a Stone Serpent (the same model, scaled). */
|
|
176
|
+
scale: 2.6,
|
|
177
|
+
note: 'A huge stone serpent with a ridge of black basalt plates down his back, coiled round the cache in the vault behind the Serpent\'s Mouth. Passive until struck. Every fourth blow he rears and a ring is painted on the vault floor round him, a turn ahead: step clear of it and the Coil Slam goes wide. Back six to eight minutes after he falls.',
|
|
178
|
+
};
|
|
179
|
+
export const BASALTBACK_RESPAWN_MS = { minMs: 360_000, maxMs: 480_000 };
|
|
180
|
+
export const BASALTBACK_PACE = { speed: 0.6, idleChance: 0.8, pause: [5, 12] };
|
|
181
|
+
/** Placeholders for the balance pass: coins, steel, coal, and a chance at a silver or gold bar. No food. */
|
|
182
|
+
export const BASALTBACK_DROPS = [
|
|
183
|
+
{ itemKind: 'coins', chance: 1, minQty: 520, maxQty: 1040 },
|
|
184
|
+
{ itemKind: 'steelbar', chance: 1, minQty: 1, maxQty: 3 },
|
|
185
|
+
{ itemKind: 'coal', chance: 1, minQty: 4, maxQty: 7 },
|
|
186
|
+
{ itemKind: 'silverbar', chance: 0.35, minQty: 1, maxQty: 1 },
|
|
187
|
+
{ itemKind: 'goldbar', chance: 0.2, minQty: 1, maxQty: 1 },
|
|
188
|
+
];
|
|
189
|
+
/** The model the client draws him with until he has one (the Stone Serpent's, at BASALTBACK.scale). */
|
|
190
|
+
export const BASALTBACK_STAND_IN = 'stoneserpent';
|
|
191
|
+
const kit = (id, model, x, z, scale) => ({ id, kind: 'dreadmodel', style: `${model}-s`, x, z, ...(scale ? { scale } : {}) });
|
|
192
|
+
const lamp = (id, x, z) => kit(id, 'townlantern1x1', x, z);
|
|
193
|
+
/** Reader's Lean-to: the canvas lean-to, the rubbing table, the tripod, the stone range, the Bounty Board, crates. No bank. */
|
|
194
|
+
export const SS_CAMP_PIECES = [
|
|
195
|
+
kit('ss-leanto', 'hcshelter', 1882, 486),
|
|
196
|
+
kit('ss-rubbing-table', 'hbbench', 1886, 483),
|
|
197
|
+
kit('ss-tripod', 'evhandwinch', 1891, 481),
|
|
198
|
+
kit('ss-range', 'towncookhouse5x3', 1897, 486),
|
|
199
|
+
kit('ss-crates', 'hbcrates', 1901, 481),
|
|
200
|
+
kit('ss-cratestack', 'evcratestack', 1890, 488),
|
|
201
|
+
kit('ss-sacks', 'hubsack', 1880, 479),
|
|
202
|
+
{ id: 'ss-barrel', kind: 'barrel', style: 'barrel', x: 1902, z: 484, scale: 1 },
|
|
203
|
+
{ id: 'ss-stove', kind: 'stove', style: '', x: 1896, z: 483 },
|
|
204
|
+
{ id: 'ss-fire', kind: 'campfire', style: 'beach-pit', x: 1890, z: 484, scale: 1 },
|
|
205
|
+
{ id: 'ss-board', kind: 'bountyboard', style: 'wall-s', x: 1880, z: 482 },
|
|
206
|
+
lamp('ss-lamp-gate-n', 1879, 483),
|
|
207
|
+
lamp('ss-lamp-gate-s', 1879, 487),
|
|
208
|
+
lamp('ss-lamp-plaque', 1886, 476),
|
|
209
|
+
lamp('ss-lamp-mouth', 1903, 437),
|
|
210
|
+
];
|
|
211
|
+
/** The basking ground's warm boulders (east of the den, dressing) and the vault's lamps and stores. */
|
|
212
|
+
export const SS_SITE_PIECES = [
|
|
213
|
+
{ id: 'ss-bask-1', kind: 'rock', style: 'boulder', x: 1899, z: 446, scale: 1.2 },
|
|
214
|
+
{ id: 'ss-bask-2', kind: 'rock', style: 'boulder', x: 1901, z: 452, scale: 1.0 },
|
|
215
|
+
{ id: 'ss-bask-3', kind: 'rock', style: 'boulder', x: 1900, z: 457, scale: 1.3 },
|
|
216
|
+
{ id: 'ss-bask-4', kind: 'rock', style: 'boulder', x: 1886, z: 465, scale: 0.9 },
|
|
217
|
+
{ id: 'ss-bask-5', kind: 'rock', style: 'boulder', x: 1902, z: 470, scale: 1.1 },
|
|
218
|
+
kit('ss-vault-lamp-n', 'evstorelamp', 1913, 436),
|
|
219
|
+
kit('ss-vault-lamp-s', 'evstorelamp', 1913, 446),
|
|
220
|
+
kit('ss-vault-stock', 'evforemancache', 1918, 445),
|
|
221
|
+
];
|
|
222
|
+
/** The signs (the placard signpost). */
|
|
223
|
+
export const SS_SIGNS = [
|
|
224
|
+
{ id: 'ss-sign-gate', x: 1875, z: 483, text: "The Serpent Stones and Reader's Lean-to. Seven slabs, one order, read off the Sun Plaque. Touch a wrong one and the stones wake. Combat 31+. The cook buys what you cook and sells no supper." },
|
|
225
|
+
{ id: 'ss-sign-coil', x: 1886, z: 472, text: "THE COIL. The Sun Plaque shows this run's order. Touch the slabs in it and each one warms. A wrong touch cools them all and wakes two serpents. All seven warm open the Serpent's Mouth in the cliff for ten minutes." },
|
|
226
|
+
];
|
|
227
|
+
/** The five people of sheet 8, by their EXACT names (sheet 6's "Ventmapper Isolde Pryce" is not one of them). */
|
|
228
|
+
export const SS_FOLK_NAMES = {
|
|
229
|
+
reader: 'Slab-Reader Ysolde Marrow',
|
|
230
|
+
surveyor: 'Surveyor Kettil Brandt',
|
|
231
|
+
scout: 'Pass Scout Wynne Hale',
|
|
232
|
+
clerk: 'Rubbing-Clerk Corin Tave',
|
|
233
|
+
cook: 'Cook Hesper Dunmore',
|
|
234
|
+
};
|
|
235
|
+
const CAMP_PLACE = "Reader's Lean-to, at the Serpent Stones on the Dwarf Road";
|
|
236
|
+
/** The four residents (named residents on the default look, stationary): the cook is in campTraders.ts. */
|
|
237
|
+
export const SS_FOLK = [
|
|
238
|
+
{
|
|
239
|
+
id: 'ss-reader',
|
|
240
|
+
name: SS_FOLK_NAMES.reader,
|
|
241
|
+
place: CAMP_PLACE,
|
|
242
|
+
x: 1886, z: 479, faceX: 1888, faceZ: 477, leash: 1,
|
|
243
|
+
speak: "Ysolde Marrow. I read stones. These seven were laid by someone who wanted them woken in one order and no other, and they paint that order on the Sun Plaque fresh every time. Read it, touch them in it, and do not touch one you have not read.",
|
|
244
|
+
extras: [{ id: 'coil', label: 'The Coil', say: "Each slab warms under your hand when it is the right one. A wrong one cools them all, and the ground does not like it: two serpents come up out of it at whoever touched. Bring friends to keep them off you. All seven warm and the Mouth in the cliff opens for ten minutes." }],
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
id: 'ss-surveyor',
|
|
248
|
+
name: SS_FOLK_NAMES.surveyor,
|
|
249
|
+
place: CAMP_PLACE,
|
|
250
|
+
x: 1891, z: 479, faceX: 1891, faceZ: 481, leash: 1,
|
|
251
|
+
speak: "Kettil Brandt, surveyor for the Western Line. I came to measure a strip of grass for a siding and found a puzzle with teeth on it. The slabs lie in an S down the strip, south to north, and the cliff at the north end has a face carved in it. I fenced the lot so the carts stop running over my tripod.",
|
|
252
|
+
extras: [{ id: 'fence', label: 'The fence', say: "There is one gate, by the lean-to, across the road from the Pass-Road Camp. The rest is fence, cliff and rock. The Goat Terraces are north of the wall and the Goat Stair south of it, and neither is any of my business." }],
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
id: 'ss-scout',
|
|
256
|
+
name: SS_FOLK_NAMES.scout,
|
|
257
|
+
place: CAMP_PLACE,
|
|
258
|
+
x: 1899, z: 479, faceX: 1899, faceZ: 474, leash: 1,
|
|
259
|
+
speak: "Wynne Hale, pass scout. I have been into the vault once, behind the Mouth. There is a cache in there and something coiled round it as long as a cart road: plated in black basalt, and old. They call him Old Basaltback. He did not move until I hit him, and then I wished I had not.",
|
|
260
|
+
extras: [{ id: 'basaltback', label: 'Old Basaltback', say: "He is passive until struck. Every fourth blow he rears up and a ring is painted on the floor round him, a turn ahead. Step out of the ring and the slam goes wide. You will not get at the cache while he stands." }],
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
id: 'ss-clerk',
|
|
264
|
+
name: SS_FOLK_NAMES.clerk,
|
|
265
|
+
place: CAMP_PLACE,
|
|
266
|
+
x: 1883, z: 484, faceX: 1886, faceZ: 483, leash: 1,
|
|
267
|
+
speak: "Corin Tave, rubbing-clerk. Paper, charcoal and a steady hand. I take a rubbing of every glyph that warms, for Ysolde's book. Seven serpent heads: sun-gold, ember-red, moss-green, river-blue, bone-white, slate-violet and ash-black. The board behind me has the lot.",
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
export function ssFolkByName(name) {
|
|
271
|
+
return name ? SS_FOLK.find((p) => p.name === name) ?? null : null;
|
|
272
|
+
}
|
|
273
|
+
/** The camp's cook, who lives in CAMP_TRADERS (campTraders.ts) beside the other camps' cooks. */
|
|
274
|
+
export const SS_COOK = { id: 'camp-serpent-stones', name: SS_FOLK_NAMES.cook, x: 1896, z: 489, faceX: 1897, faceZ: 486 };
|
|
275
|
+
/** Standable tiles for teleports, smokes and the helper. */
|
|
276
|
+
export const SS_STANDS = {
|
|
277
|
+
road: { x: 1872, z: 485 },
|
|
278
|
+
gate: { x: 1880, z: 485 },
|
|
279
|
+
camp: { x: 1892, z: 482 },
|
|
280
|
+
plaque: { x: 1888, z: 475 },
|
|
281
|
+
coil: { x: 1893, z: 460 },
|
|
282
|
+
basking: { x: 1889, z: 448 },
|
|
283
|
+
mouth: { x: 1902, z: 441 },
|
|
284
|
+
vault: { x: 1911, z: 441 },
|
|
285
|
+
north: { x: 1895, z: 435 },
|
|
286
|
+
};
|
|
287
|
+
export const SS_PLACE_TEXT = "The Serpent Stones are a fenced strip of grass on the Dwarf Road's east floor, between the rail and the canyon's east cliff, north of the Avalanche Chute. The Lean-to Gate, across the road from the Pass-Road Camp, is the one way in. Inside, Reader's Lean-to is a little survey camp with a rubbing table, a chalk board of rubbings, a stone range whose cook buys what you cook, and a Bounty Board; there is no bank.";
|
|
288
|
+
export const SS_COIL_TEXT = "THE COIL: seven great slabs lie along the strip in an S-curve, each carved with a serpent head glyph in its own colour. The Sun Plaque at the Coil's foot shows the order for this run, drawn afresh every run. Touch the slabs in that order and each warms; touch a wrong one and they all cool and two stone serpents rise at you. All seven warm open the Serpent's Mouth in the cliff for ten minutes, onto a vault with a cache that pays by your metal tier, once each per run, and Old Basaltback (level 39) coiled round it. Nothing in it heals and nothing in the cache is food.";
|
|
289
|
+
/** The names the hover and the guide give each quest prop. */
|
|
290
|
+
export const SS_QUEST_PROP_NAMES = {
|
|
291
|
+
...Object.fromEntries(SS_SLABS.flatMap((s) => [[ssSlabStyle(s.glyph, false), s.name], [ssSlabStyle(s.glyph, true), `${s.name} (warm)`]])),
|
|
292
|
+
[SS_PLAQUE.style]: 'Sun Plaque',
|
|
293
|
+
[SS_MOUTH.style]: "The Serpent's Mouth (shut)",
|
|
294
|
+
[SS_MOUTH_OPEN_STYLE]: "The Serpent's Mouth",
|
|
295
|
+
[SS_CACHE.style]: 'Vault Cache',
|
|
296
|
+
[SS_RUBBINGS.style]: 'Board of Rubbings',
|
|
297
|
+
};
|
|
298
|
+
/** The verb on the hover for each prop. */
|
|
299
|
+
export const SS_PROP_VERBS = {
|
|
300
|
+
[SS_PROP.slab]: 'Touch', [SS_PROP.slabWarm]: 'Inspect', [SS_PROP.plaque]: 'Read', [SS_PROP.mouth]: 'Inspect', [SS_PROP.mouthOpen]: 'Inspect',
|
|
301
|
+
[SS_PROP.cache]: 'Open', [SS_PROP.board]: 'Read',
|
|
302
|
+
};
|
|
303
|
+
const SLAB_STAND_IN = {
|
|
304
|
+
sun: ['evsymbolsun', 'evsymbolsunlit'], ember: ['evsymbolsun', 'evsymbolsunlit'],
|
|
305
|
+
moss: ['evsymbolriver', 'evsymbolriverlit'], river: ['evsymbolriver', 'evsymbolriverlit'],
|
|
306
|
+
bone: ['evsymbolcrown', 'evsymbolcrownlit'], slate: ['evsymbolcrown', 'evsymbolcrownlit'], ash: ['evsymbolcrown', 'evsymbolcrownlit'],
|
|
307
|
+
};
|
|
308
|
+
/** The model a Serpent Stones quest prop draws with (the Sunken Wayshrine's symbol stones as stand-ins, upgrades row `serpent-stones-slabs`), or null. */
|
|
309
|
+
export function serpentStonesPropModel(prop, style) {
|
|
310
|
+
if (prop === SS_PROP.slab || prop === SS_PROP.slabWarm) {
|
|
311
|
+
const g = ssSlabGlyph(style);
|
|
312
|
+
const pair = g ? SLAB_STAND_IN[g] : SLAB_STAND_IN.sun;
|
|
313
|
+
return prop === SS_PROP.slabWarm ? pair[1] : pair[0];
|
|
314
|
+
}
|
|
315
|
+
if (prop === SS_PROP.plaque)
|
|
316
|
+
return 'evsymbolrelief';
|
|
317
|
+
if (prop === SS_PROP.mouth)
|
|
318
|
+
return 'evchaingateclosed';
|
|
319
|
+
if (prop === SS_PROP.mouthOpen)
|
|
320
|
+
return 'evchaingateopen';
|
|
321
|
+
if (prop === SS_PROP.cache)
|
|
322
|
+
return 'evsupplyvault';
|
|
323
|
+
if (prop === SS_PROP.board)
|
|
324
|
+
return 'landingpost';
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
/** Does this prop belong to the Serpent Stones (the backend's click handler owns it)? */
|
|
328
|
+
export function isSerpentStonesProp(style) {
|
|
329
|
+
const prop = (style ?? '').split(':')[0];
|
|
330
|
+
return Object.values(SS_PROP).includes(prop);
|
|
331
|
+
}
|
|
332
|
+
// ---- Places -------------------------------------------------------------------------------------------------------------------------------
|
|
333
|
+
/** Reader's Lean-to and the vault (inserted ahead of the Dwarf Road's den zones, expandedContracts.ts). */
|
|
334
|
+
export const SS_DISCOVERY_ZONES = [
|
|
335
|
+
{ id: 'readers-lean-to', label: "Reader's Lean-to", coordinateFrame: 'world', ...SS_CAMP_BOX },
|
|
336
|
+
{ id: 'serpent-vault', label: "The Serpent's Vault", coordinateFrame: 'world', ...SS_VAULT },
|
|
337
|
+
];
|
|
338
|
+
/** The Coil: the strip round the den (inserted after the Dwarf Road's den zones, so the den's own "The Serpent Stones" wins inside its box). */
|
|
339
|
+
export const SS_COIL_DISCOVERY_ZONE = { id: 'the-coil', label: 'The Coil', coordinateFrame: 'world', minX: 1879, maxX: 1907, minZ: SS_STRIP_ROWS.minZ, maxZ: SS_STRIP_ROWS.maxZ };
|
|
340
|
+
//# sourceMappingURL=serpentStones.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serpentStones.js","sourceRoot":"","sources":["../src/serpentStones.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Serpent Stones' three quests (2026-10-19; serpentStones.ts), levels 31-40, on the Coil itself:
|
|
3
|
+
*
|
|
4
|
+
* The Order of Stones (Rubbing-Clerk Corin Tave, Combat 31): warm each of the seven slabs at least once (a slab counts when it warms in the Sun
|
|
5
|
+
* Plaque's order, in any run), then bring the rubbings back.
|
|
6
|
+
* The Serpent's Mouth (Slab-Reader Ysolde Marrow, Combat 33, after The Order of Stones): warm the whole Coil and go up to the open Mouth, then tell her.
|
|
7
|
+
* Old Basaltback (Pass Scout Wynne Hale, Combat 36, after The Serpent's Mouth): put down Old Basaltback in the vault and open the cache he guards.
|
|
8
|
+
*
|
|
9
|
+
* Kept in their own file and entered in storyQuests.ts STORY_QUESTS. Types only from storyQuests.ts (no runtime import, so there is no cycle).
|
|
10
|
+
* Rewards are placeholders for the balance pass (James, 2026-10-12: balance last).
|
|
11
|
+
*/
|
|
12
|
+
import type { StoryQuestDef, StoryNpcRef } from './storyQuests.js';
|
|
13
|
+
export declare const SS_READER: StoryNpcRef;
|
|
14
|
+
export declare const SS_SCOUT: StoryNpcRef;
|
|
15
|
+
export declare const SS_CLERK: StoryNpcRef;
|
|
16
|
+
export declare const ORDER_OF_STONES_COMBAT_LEVEL = 31;
|
|
17
|
+
export declare const SERPENTS_MOUTH_COMBAT_LEVEL = 33;
|
|
18
|
+
export declare const BASALTBACK_COMBAT_LEVEL = 36;
|
|
19
|
+
export declare const ORDER_OF_STONES_QUEST: StoryQuestDef;
|
|
20
|
+
export declare const SERPENTS_MOUTH_QUEST: StoryQuestDef;
|
|
21
|
+
export declare const OLD_BASALTBACK_QUEST: StoryQuestDef;
|
|
22
|
+
//# sourceMappingURL=serpentStonesQuestDef.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serpentStonesQuestDef.d.ts","sourceRoot":"","sources":["../src/serpentStonesQuestDef.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAInE,eAAO,MAAM,SAAS,aAA4B,CAAC;AACnD,eAAO,MAAM,QAAQ,aAA2B,CAAC;AACjD,eAAO,MAAM,QAAQ,aAA2B,CAAC;AAEjD,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAC/C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAc1C,eAAO,MAAM,qBAAqB,EAAE,aAmCnC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,aAoClC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,aA6ClC,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { BASALTBACK_KIND, SS_CACHE, SS_FOLK_NAMES, SS_MOUTH_OPEN_STYLE, SS_PROP, SS_SLABS, ssSlabStyle } from './serpentStones.js';
|
|
2
|
+
const ref = (name) => ({ kind: 'resident', name });
|
|
3
|
+
export const SS_READER = ref(SS_FOLK_NAMES.reader);
|
|
4
|
+
export const SS_SCOUT = ref(SS_FOLK_NAMES.scout);
|
|
5
|
+
export const SS_CLERK = ref(SS_FOLK_NAMES.clerk);
|
|
6
|
+
export const ORDER_OF_STONES_COMBAT_LEVEL = 31;
|
|
7
|
+
export const SERPENTS_MOUTH_COMBAT_LEVEL = 33;
|
|
8
|
+
export const BASALTBACK_COMBAT_LEVEL = 36;
|
|
9
|
+
const COMBAT_CHOICE = ['strength', 'archery', 'precision'];
|
|
10
|
+
const SLAB_NOTES = {
|
|
11
|
+
sun: 'The sun-gold glyph warms first under the charcoal. You take the rubbing before the heat goes out of it.',
|
|
12
|
+
ember: 'The ember-red serpent bares its teeth on the paper. The slab is warm as a hearthstone.',
|
|
13
|
+
moss: 'Moss has got into the moss-green glyph, and the rubbing comes up green at the edges.',
|
|
14
|
+
river: 'The river-blue serpent is carved with a fish in its jaws. You rub it twice to be sure.',
|
|
15
|
+
bone: 'The bone-white glyph is the plainest of the seven and the deepest cut.',
|
|
16
|
+
slate: 'The slate-violet serpent has its eyes shut. The rubbing makes it look asleep.',
|
|
17
|
+
ash: 'The ash-black glyph is worn almost smooth. You rub it hard, and the head comes up out of the paper.',
|
|
18
|
+
};
|
|
19
|
+
export const ORDER_OF_STONES_QUEST = {
|
|
20
|
+
giver: SS_CLERK,
|
|
21
|
+
requires: {
|
|
22
|
+
combat: ORDER_OF_STONES_COMBAT_LEVEL,
|
|
23
|
+
refuse: `The Coil wakes for anyone who touches it wrong, and what comes up out of the ground is no friend to a beginner. Come back at Combat ${ORDER_OF_STONES_COMBAT_LEVEL}.`,
|
|
24
|
+
},
|
|
25
|
+
offer: "I need a rubbing of every glyph, taken warm, for Ysolde's book. A cold slab gives a smudge. The slabs only warm in the order on the Sun Plaque, and it changes every run, so it is slow work. Will you take my paper and charcoal out to the Coil?",
|
|
26
|
+
accept: 'Read the Sun Plaque at the foot of the Coil, by the lean-to. Touch the slabs in its order and each one warms; every slab that warms under your hand is a rubbing. A wrong touch cools them all and wakes two serpents, so go carefully. Seven glyphs, any runs it takes. Then bring the paper back.',
|
|
27
|
+
decline: 'Then the book waits. It has waited four hundred years.',
|
|
28
|
+
steps: [
|
|
29
|
+
{
|
|
30
|
+
kind: 'touch',
|
|
31
|
+
prop: SS_PROP.slab,
|
|
32
|
+
qty: SS_SLABS.length,
|
|
33
|
+
label: 'Take a warm rubbing of each of the seven slabs',
|
|
34
|
+
hint: "The Coil runs north up the strip from the Sun Plaque. Read the plaque for this run's order, then touch the slabs in it: each slab that warms counts.",
|
|
35
|
+
notices: Object.fromEntries(SS_SLABS.map((s) => [ssSlabStyle(s.glyph, false), SLAB_NOTES[s.glyph]])),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
kind: 'talk',
|
|
39
|
+
npc: SS_CLERK,
|
|
40
|
+
label: 'Bring the rubbings to Rubbing-Clerk Corin Tave',
|
|
41
|
+
hint: "Corin Tave works at the rubbing table in Reader's Lean-to, inside the Lean-to Gate.",
|
|
42
|
+
say: 'Seven serpents, and not a smudge among them. Ysolde will want to see these. Take the fee, and keep your charcoal.',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
done: 'Seven warm rubbings, every one clean. Here is the clerk\'s fee.',
|
|
46
|
+
after: 'The rubbings are on the board. People stop to look at them.',
|
|
47
|
+
rewards: {
|
|
48
|
+
coins: 2400,
|
|
49
|
+
xp: { explorer: 3400 },
|
|
50
|
+
choiceXp: { qty: 2800, skills: COMBAT_CHOICE },
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
export const SERPENTS_MOUTH_QUEST = {
|
|
54
|
+
giver: SS_READER,
|
|
55
|
+
requires: {
|
|
56
|
+
quest: 'theOrderOfStones',
|
|
57
|
+
combat: SERPENTS_MOUTH_COMBAT_LEVEL,
|
|
58
|
+
refuse: `Take Corin's rubbings first: I will not send anyone to wake the whole Coil who has not read every slab. Finish The Order of Stones, and come back at Combat ${SERPENTS_MOUTH_COMBAT_LEVEL}.`,
|
|
59
|
+
},
|
|
60
|
+
offer: 'The rubbings say what I thought: the seven together are a key. Warm them all in one run, in the plaque\'s order, and the face in the cliff at the north end opens its jaws. I have never seen it open. I would like someone to stand in front of it and tell me I am right.',
|
|
61
|
+
accept: "Read the Sun Plaque, then warm all seven in its order in one run. A wrong touch cools the lot and wakes two serpents at you, so bring someone to keep them off. When the seventh warms, the Serpent's Mouth opens in the cliff north-east of the Coil for ten minutes. Go up to it, look in, and come back.",
|
|
62
|
+
decline: 'Then the Mouth stays shut, and I go on guessing.',
|
|
63
|
+
steps: [
|
|
64
|
+
{
|
|
65
|
+
kind: 'touch',
|
|
66
|
+
prop: SS_PROP.mouthOpen,
|
|
67
|
+
qty: 1,
|
|
68
|
+
label: "Warm the whole Coil and go up to the open Serpent's Mouth",
|
|
69
|
+
hint: "Warm all seven slabs in the Sun Plaque's order in one run, then click the Serpent's Mouth in the cliff north-east of the Coil while it stands open.",
|
|
70
|
+
notices: { [SS_MOUTH_OPEN_STYLE]: 'The jaws of the carved serpent stand wide open, and behind them a short cut runs into the rock: a vault, and something very large breathing in it.' },
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
kind: 'talk',
|
|
74
|
+
npc: SS_READER,
|
|
75
|
+
label: 'Tell Slab-Reader Ysolde Marrow the Mouth opened',
|
|
76
|
+
hint: "Ysolde Marrow stands by the Sun Plaque, at the south end of the Coil in Reader's Lean-to.",
|
|
77
|
+
say: 'Open. Four hundred years shut and it opened for you. Then the vault is real, and so is whatever Wynne saw in it. Take this, and go and talk to her.',
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
done: 'The Mouth opened and the book has its last page. Here is the reader\'s thanks.',
|
|
81
|
+
after: 'I go and look at the Mouth every morning. It has not opened for me yet.',
|
|
82
|
+
rewards: {
|
|
83
|
+
coins: 3000,
|
|
84
|
+
xp: { explorer: 4000 },
|
|
85
|
+
choiceXp: { qty: 3600, skills: COMBAT_CHOICE },
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
export const OLD_BASALTBACK_QUEST = {
|
|
89
|
+
giver: SS_SCOUT,
|
|
90
|
+
requires: {
|
|
91
|
+
quest: 'theSerpentsMouth',
|
|
92
|
+
combat: BASALTBACK_COMBAT_LEVEL,
|
|
93
|
+
refuse: `I only talk about the vault with someone who has opened it. Do Ysolde's work first, and come back at Combat ${BASALTBACK_COMBAT_LEVEL}.`,
|
|
94
|
+
},
|
|
95
|
+
offer: "You have seen the Mouth open. Behind it is the vault, and coiled round the cache in the vault is Old Basaltback: a stone serpent as long as a cart road, plated in black basalt. I hit him once and ran. Will you finish what I started, and open that cache?",
|
|
96
|
+
accept: "Open the Mouth, go into the vault and strike him. He is passive until struck. Every fourth blow he rears and a dark ring spreads on the floor round him, a turn ahead: step out of the ring and the Coil Slam goes wide. Nothing in there heals you, so bring your own food. When he is down, open the cache, then come back.",
|
|
97
|
+
decline: 'Then he keeps the cache, and I keep my distance.',
|
|
98
|
+
steps: [
|
|
99
|
+
{
|
|
100
|
+
kind: 'kill',
|
|
101
|
+
npcKinds: [BASALTBACK_KIND],
|
|
102
|
+
qty: 1,
|
|
103
|
+
npcLabel: 'Old Basaltback',
|
|
104
|
+
label: 'Put down Old Basaltback',
|
|
105
|
+
hint: "Old Basaltback (level 39) is coiled round the cache in the vault behind the Serpent's Mouth. A dark ring warns you before his Coil Slam: step clear of it.",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
kind: 'touch',
|
|
109
|
+
prop: SS_PROP.cache,
|
|
110
|
+
qty: 1,
|
|
111
|
+
label: 'Open the vault cache',
|
|
112
|
+
hint: "The cache is at the back of the vault behind the Serpent's Mouth. It opens only while the Mouth is open and Old Basaltback is down.",
|
|
113
|
+
notices: { [SS_CACHE.style]: 'The lid comes up with a grind of stone. Under the dust, the cache is full.' },
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
kind: 'talk',
|
|
117
|
+
npc: SS_SCOUT,
|
|
118
|
+
label: 'Tell Pass Scout Wynne Hale the vault is opened',
|
|
119
|
+
hint: "Wynne Hale stands at the north edge of Reader's Lean-to, looking up the Coil.",
|
|
120
|
+
say: 'Down, and the cache open. I owe you a drink and the pass owes you more. Take the steel: it was going to buy me a bigger spear.',
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
done: 'Old Basaltback is down and the vault is opened. Here is the scout\'s share, and the steel.',
|
|
124
|
+
after: 'He will be back. They always come back to a warm stone.',
|
|
125
|
+
rewards: {
|
|
126
|
+
coins: 3800,
|
|
127
|
+
items: [{ kind: 'steelbar', qty: 2 }],
|
|
128
|
+
xp: { explorer: 4600 },
|
|
129
|
+
choiceXp: { qty: 4600, skills: COMBAT_CHOICE },
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=serpentStonesQuestDef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serpentStonesQuestDef.js","sourceRoot":"","sources":["../src/serpentStonesQuestDef.ts"],"names":[],"mappings":"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"}
|
package/dist/storyQuests.d.ts
CHANGED
|
@@ -429,7 +429,7 @@ export type StoryQuestDef = {
|
|
|
429
429
|
after: string;
|
|
430
430
|
rewards: StoryReward;
|
|
431
431
|
};
|
|
432
|
-
export type StoryQuestId = 'fredsLetter' | 'beagleBirthday' | 'wilsonBigCatch' | 'smithsApprentice' | 'spiderHollowEggs' | 'harbourThief' | 'coldFeet' | 'livoniasDiary' | 'charcoalBurner' | 'iceCuttersKey' | 'hopeWreck' | 'firstSteps' | 'trappersLine' | 'gristForTheMill' | 'shearingDay' | 'dryBarrels' | 'freshLinen' | 'troubleOnTheRoad' | 'everyRoadPays' | 'maribelsLog' | 'mammothRoad' | 'marigoldsStrongbox' | 'tansysCauldron' | 'poulticesForTheLine' | 'frostbiteSalve' | 'cellsBelow' | 'breakingTheIronjaw' | 'floeWatch' | 'samsSecretBait' | 'travellersTonic' | 'bountyHuntersBrew' | 'corvinsRecipes' | 'hogWild' | 'fiveArches' | 'theNewGate' | 'hettiesSails' | 'geeseInTheWheat' | 'nyesStrays' | 'nyesPup' | 'missingShipment' | 'wrensHoney' | 'harvestSupper' | 'goatLookout' | 'jettyPot' | 'theLostGoat' | 'theScarecrowsHat' | 'theHatchetHandle' | 'stonesThatWhisper' | 'crowTrouble' | 'tamsinsLostBasket' | 'theLeakingSluice' | 'haresInTheBeans' | 'whatWokeOldGnasher' | 'theMissingMule' | 'theFallenLimb' | 'troubleOnTheSnareLine' | 'oldTusk' | 'shinyTrouble' | 'nestOfThieves' | 'matterOfWeight' | 'ledgerInTheDust' | 'brokenSignal' | 'flagsAgainstTheWind' | 'bellForTheBeacon' | 'shellGame' | 'brokenExtraction' | 'underTheWhiteStone' | 'silentBells' | 'webInTheReeds' | 'brokenTrestle' | 'matriarchOfTheMere' | 'peatAndSnapper' | 'theBlueDoor' | 'lanternsOfTheRing' | 'theMissingFolios' | 'theRuneboundWarden' | 'lightAtGullhook' | 'lostOnTheTide' | 'salvageRights' | 'theBeaconStair' | 'theLampSnuffer' | 'theColdSignal' | 'gunsOfTheWindbreak' | 'salvageAtTheCleft' | 'theWinchLine' | 'theDarkKeeper' | 'passRoadMarks' | 'chocksForTheSpur' | 'goldForTheGantry' | 'eyesOnTheDens' | 'theRailEater' | 'chartingTheVents' | 'slagAndSilver' | 'lostInTheAsh' | 'scoutingTheBasin' | 'theAshmaw' | 'markingTheLanes' | 'pennantIrons' | 'theLiftCrewsPacks' | 'readingTheRing' | 'oldThunderhorn' | 'readingTheTide' | 'weightsForTheNets' | 'halesLamp' | 'countingGannets' | 'oldSkerrywing' | 'readTheTally' | 'lightTheChain' | 'eyesOnThePass' | 'gateHinges' | 'theHollowWatchman' | 'freshSign' | 'spruceAndAsh' | 'aHoundGoneAstray' | 'snaresInTheDark' | 'theRangersTrial' | 'theFirstDrove' | 'fleeceAndFang' | 'saltForThePot' | 'theRustlersCut' | 'greybackOfTheDowns' | 'saltOnTheWind' | 'theLostNets' | 'theBeaconsLastOil' | 'fuelForTheKilns' | 'theWashingPools' | 'raidersOnTheRim' | 'cracksInTheCut' | 'ironForTheHoists' | 'theMarkerCairns' | 'theNorthLedge' | 'reedsForTheRoofs' | 'theFerryErrand' | 'marshFish' | 'oldGreyneck' | 'wreckSalvage' | 'deadMensDig' | 'theFiveBells' | 'skullIsleHunt' | 'reevesNotices' | 'strawAndSteel' | 'supperForTheMuster' | 'aSmithsOrder' | 'planksForTheHall' | 'theNightWatch' | 'marketDayRush' | 'theCaravanRun' | 'surveyorsLine' | 'anchorsInTheIce' | 'acrossTheThaw' | 'theWraithOfTheFall' | 'theStuckWheel' | 'boarsInTheBeans' | 'wennasTonic' | 'aDozenLoaves' | 'theLostCart' | 'theMissingTollMoney' | 'lightTheBeacon' | 'birdsInTheHops' | 'grandfatherGull' | 'lostSupplies' | 'herbalRemedies' | 'fieldShrineMystery' | 'theFirstBeacon' | 'troubleAtCrossing' | 'gullsMap' | 'gullsLowWater' | 'readingTheRed' | 'theLowFord' | 'nightOfTheRedMoon' | 'theSurge' | 'tideOfBlood' | 'gullsFortRook' | 'theCrookedGull' | 'theGuardedJetty' | 'clearingTheAnchorage' | 'theCaptainsStash' | 'theDampNote' | 'thePaleRibs' | 'feathersOnTheCliff' | 'theTideBoard' | 'theTideBroker' | 'gatewardenRounds' | 'strongerBridge' | 'raidersOfTheRedWaste' | 'greenwardensGlade' | 'clearTheLine' | 'ticketsPlease' | 'coalForTheLine' | 'nightMail' | 'emberSeals' | 'cinderAndAsh' | 'crackedBell' | 'crowsOnTheRope' | 'lampsForTheChapel' | 'wardensKey' | 'sextonsLantern' | 'namesOnTheStones' | 'threeBraziers' | 'theTombWarden' | 'sealTheCrypt' | 'tollsAndTallies' | 'theMissingPayroll' | 'whisperInTheReeds' | 'theCaptainsCellar' | 'readingTheEbb' | 'theCrabWarren' | 'theReevesCache' | 'eyesOnTheFarBank' | 'suppliesForTheLine' | 'sappersSpan' | 'holdTheLine' | 'warchiefsHold' | SkillQuestId | LongWinterQuestId | HeartwoodQuestId | IronjawWatchQuestId | DelversLadderId | MiningQuestId | SnowForagingId | BrewersQuestId | LongRoadBrewId | NobleIntrigueId | CloisterRoundId | ThawFishingId | RoadTableId | TimberErrandId | MarksmenQuestId | WarCampQuestId | WardensWritId | EarlyWritId | BorderJobId | WoodsJobId | QuarryQuestId | HopeBrewId | EarlyBrewId | ProspectingId | CapitalQuestId | CapitalShopQuestId | HoldHubQuestId | VoyageQuestId | FishCookQuestId | ReachQuestId | MammothTableId | BayPetQuestId;
|
|
432
|
+
export type StoryQuestId = 'fredsLetter' | 'beagleBirthday' | 'wilsonBigCatch' | 'smithsApprentice' | 'spiderHollowEggs' | 'harbourThief' | 'coldFeet' | 'livoniasDiary' | 'charcoalBurner' | 'iceCuttersKey' | 'hopeWreck' | 'firstSteps' | 'trappersLine' | 'gristForTheMill' | 'shearingDay' | 'dryBarrels' | 'freshLinen' | 'troubleOnTheRoad' | 'everyRoadPays' | 'maribelsLog' | 'mammothRoad' | 'marigoldsStrongbox' | 'tansysCauldron' | 'poulticesForTheLine' | 'frostbiteSalve' | 'cellsBelow' | 'breakingTheIronjaw' | 'floeWatch' | 'samsSecretBait' | 'travellersTonic' | 'bountyHuntersBrew' | 'corvinsRecipes' | 'hogWild' | 'fiveArches' | 'theNewGate' | 'hettiesSails' | 'geeseInTheWheat' | 'nyesStrays' | 'nyesPup' | 'missingShipment' | 'wrensHoney' | 'harvestSupper' | 'goatLookout' | 'jettyPot' | 'theLostGoat' | 'theScarecrowsHat' | 'theHatchetHandle' | 'stonesThatWhisper' | 'crowTrouble' | 'tamsinsLostBasket' | 'theLeakingSluice' | 'haresInTheBeans' | 'whatWokeOldGnasher' | 'theMissingMule' | 'theFallenLimb' | 'troubleOnTheSnareLine' | 'oldTusk' | 'shinyTrouble' | 'nestOfThieves' | 'matterOfWeight' | 'ledgerInTheDust' | 'brokenSignal' | 'flagsAgainstTheWind' | 'bellForTheBeacon' | 'shellGame' | 'brokenExtraction' | 'underTheWhiteStone' | 'silentBells' | 'webInTheReeds' | 'brokenTrestle' | 'matriarchOfTheMere' | 'peatAndSnapper' | 'theBlueDoor' | 'lanternsOfTheRing' | 'theMissingFolios' | 'theRuneboundWarden' | 'lightAtGullhook' | 'lostOnTheTide' | 'salvageRights' | 'theBeaconStair' | 'theLampSnuffer' | 'theColdSignal' | 'gunsOfTheWindbreak' | 'salvageAtTheCleft' | 'theWinchLine' | 'theDarkKeeper' | 'passRoadMarks' | 'chocksForTheSpur' | 'goldForTheGantry' | 'eyesOnTheDens' | 'theRailEater' | 'chartingTheVents' | 'slagAndSilver' | 'lostInTheAsh' | 'scoutingTheBasin' | 'theAshmaw' | 'markingTheLanes' | 'pennantIrons' | 'theLiftCrewsPacks' | 'readingTheRing' | 'oldThunderhorn' | 'theOrderOfStones' | 'theSerpentsMouth' | 'oldBasaltback' | 'readingTheTide' | 'weightsForTheNets' | 'halesLamp' | 'countingGannets' | 'oldSkerrywing' | 'readTheTally' | 'lightTheChain' | 'eyesOnThePass' | 'gateHinges' | 'theHollowWatchman' | 'freshSign' | 'spruceAndAsh' | 'aHoundGoneAstray' | 'snaresInTheDark' | 'theRangersTrial' | 'theFirstDrove' | 'fleeceAndFang' | 'saltForThePot' | 'theRustlersCut' | 'greybackOfTheDowns' | 'saltOnTheWind' | 'theLostNets' | 'theBeaconsLastOil' | 'fuelForTheKilns' | 'theWashingPools' | 'raidersOnTheRim' | 'cracksInTheCut' | 'ironForTheHoists' | 'theMarkerCairns' | 'theNorthLedge' | 'reedsForTheRoofs' | 'theFerryErrand' | 'marshFish' | 'oldGreyneck' | 'wreckSalvage' | 'deadMensDig' | 'theFiveBells' | 'skullIsleHunt' | 'reevesNotices' | 'strawAndSteel' | 'supperForTheMuster' | 'aSmithsOrder' | 'planksForTheHall' | 'theNightWatch' | 'marketDayRush' | 'theCaravanRun' | 'surveyorsLine' | 'anchorsInTheIce' | 'acrossTheThaw' | 'theWraithOfTheFall' | 'theStuckWheel' | 'boarsInTheBeans' | 'wennasTonic' | 'aDozenLoaves' | 'theLostCart' | 'theMissingTollMoney' | 'lightTheBeacon' | 'birdsInTheHops' | 'grandfatherGull' | 'lostSupplies' | 'herbalRemedies' | 'fieldShrineMystery' | 'theFirstBeacon' | 'troubleAtCrossing' | 'gullsMap' | 'gullsLowWater' | 'readingTheRed' | 'theLowFord' | 'nightOfTheRedMoon' | 'theSurge' | 'tideOfBlood' | 'gullsFortRook' | 'theCrookedGull' | 'theGuardedJetty' | 'clearingTheAnchorage' | 'theCaptainsStash' | 'theDampNote' | 'thePaleRibs' | 'feathersOnTheCliff' | 'theTideBoard' | 'theTideBroker' | 'gatewardenRounds' | 'strongerBridge' | 'raidersOfTheRedWaste' | 'greenwardensGlade' | 'clearTheLine' | 'ticketsPlease' | 'coalForTheLine' | 'nightMail' | 'emberSeals' | 'cinderAndAsh' | 'crackedBell' | 'crowsOnTheRope' | 'lampsForTheChapel' | 'wardensKey' | 'sextonsLantern' | 'namesOnTheStones' | 'threeBraziers' | 'theTombWarden' | 'sealTheCrypt' | 'tollsAndTallies' | 'theMissingPayroll' | 'whisperInTheReeds' | 'theCaptainsCellar' | 'readingTheEbb' | 'theCrabWarren' | 'theReevesCache' | 'eyesOnTheFarBank' | 'suppliesForTheLine' | 'sappersSpan' | 'holdTheLine' | 'warchiefsHold' | SkillQuestId | LongWinterQuestId | HeartwoodQuestId | IronjawWatchQuestId | DelversLadderId | MiningQuestId | SnowForagingId | BrewersQuestId | LongRoadBrewId | NobleIntrigueId | CloisterRoundId | ThawFishingId | RoadTableId | TimberErrandId | MarksmenQuestId | WarCampQuestId | WardensWritId | EarlyWritId | BorderJobId | WoodsJobId | QuarryQuestId | HopeBrewId | EarlyBrewId | ProspectingId | CapitalQuestId | CapitalShopQuestId | HoldHubQuestId | VoyageQuestId | FishCookQuestId | ReachQuestId | MammothTableId | BayPetQuestId;
|
|
433
433
|
export declare const STORY_QUEST_IDS: readonly StoryQuestId[];
|
|
434
434
|
/** The npc_action id for a story choice. */
|
|
435
435
|
export declare const STORY_CHOICE_PREFIX = "story:";
|