@dreadwood-types/types 0.1.311 → 0.1.313
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/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/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 +4 -1
- package/dist/expandedContracts.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -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/northWilds.d.ts +2 -2
- package/dist/northWilds.d.ts.map +1 -1
- package/dist/northWilds.js +3 -0
- package/dist/northWilds.js.map +1 -1
- package/dist/quests.d.ts.map +1 -1
- package/dist/quests.js +25 -0
- package/dist/quests.js.map +1 -1
- package/dist/shaleTeeth.js +1 -1
- package/dist/shaleTeeth.js.map +1 -1
- package/dist/storyQuests.d.ts +1 -1
- package/dist/storyQuests.d.ts.map +1 -1
- package/dist/storyQuests.js +16 -0
- package/dist/storyQuests.js.map +1 -1
- package/dist/storyWindows.d.ts +1 -1
- package/dist/storyWindows.d.ts.map +1 -1
- package/dist/storyWindows.js +6 -1
- package/dist/storyWindows.js.map +1 -1
- package/dist/thawCrossing.d.ts +248 -0
- package/dist/thawCrossing.d.ts.map +1 -0
- package/dist/thawCrossing.js +330 -0
- package/dist/thawCrossing.js.map +1 -0
- package/dist/thawCrossingQuestDef.d.ts +38 -0
- package/dist/thawCrossingQuestDef.d.ts.map +1 -0
- package/dist/thawCrossingQuestDef.js +192 -0
- package/dist/thawCrossingQuestDef.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyWindows.d.ts","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storyWindows.d.ts","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AACrG,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAA4E,CAAC;AAE7H,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAS3E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS9E;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1E"}
|
package/dist/storyWindows.js
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { SEA_GROTTO_TIDE_CYCLE_MS, isSaltmarkLampLit, isSeaGrottoLowWater, seaGrottoTideLine } from './gullsLowWater.js';
|
|
8
8
|
import { BLOOD_TIDE_CYCLE_MS, bloodTideLine, isBloodLow, isBloodMoon, isRedLow } from './tideOfBlood.js';
|
|
9
|
-
|
|
9
|
+
import { THAW_ICE_CYCLE_MS, isThawIceHolding, thawIceLine } from './thawCrossing.js';
|
|
10
|
+
export const STORY_WINDOWS = ['low-tide', 'night', 'blood-low', 'blood-moon', 'red-low', 'ice-hold'];
|
|
10
11
|
export function storyWindowOpen(window, nowMs) {
|
|
11
12
|
switch (window) {
|
|
12
13
|
case 'low-tide': return isSeaGrottoLowWater(nowMs);
|
|
@@ -14,6 +15,7 @@ export function storyWindowOpen(window, nowMs) {
|
|
|
14
15
|
case 'blood-low': return isBloodLow(nowMs);
|
|
15
16
|
case 'blood-moon': return isBloodMoon(nowMs);
|
|
16
17
|
case 'red-low': return isRedLow(nowMs);
|
|
18
|
+
case 'ice-hold': return isThawIceHolding(nowMs);
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
@@ -28,6 +30,7 @@ export function storyWindowInstance(window, nowMs) {
|
|
|
28
30
|
case 'red-low': return Math.floor(nowMs / BLOOD_TIDE_CYCLE_MS);
|
|
29
31
|
case 'night':
|
|
30
32
|
case 'blood-moon': return Math.floor((nowMs + 6 * 3_600_000) / 86_400_000);
|
|
33
|
+
case 'ice-hold': return Math.floor(nowMs / THAW_ICE_CYCLE_MS);
|
|
31
34
|
}
|
|
32
35
|
}
|
|
33
36
|
/** The line added after a step's `wait` when its window is shut ('' when there is nothing to add). */
|
|
@@ -36,6 +39,8 @@ export function storyWindowLine(window, nowMs) {
|
|
|
36
39
|
return seaGrottoTideLine(nowMs);
|
|
37
40
|
if (window === 'blood-low' || window === 'red-low')
|
|
38
41
|
return bloodTideLine(nowMs);
|
|
42
|
+
if (window === 'ice-hold')
|
|
43
|
+
return thawIceLine(nowMs);
|
|
39
44
|
return '';
|
|
40
45
|
}
|
|
41
46
|
//# sourceMappingURL=storyWindows.js.map
|
package/dist/storyWindows.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyWindows.js","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzH,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"storyWindows.js","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzH,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrF,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAE7H,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,KAAa;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACnD,KAAK,OAAO,CAAC,CAAC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,KAAK,WAAW,CAAC,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3C,KAAK,YAAY,CAAC,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,UAAU,CAAC,CAAC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,KAAa;IACpE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,wBAAwB,CAAC,CAAC;QACrE,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,CAAC;QAC/D,KAAK,OAAO,CAAC;QACb,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,CAAC;QAC3E,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,iBAAiB,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,KAAa;IAChE,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAChF,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THAW CROSSING (coverage slice 11, T107, 2026-10-14; plan `.cursor/task-plans/2026-10-14-t107-thaw-crossing.md`; levels 30-38). The Thaw
|
|
3
|
+
* Gorge (x 236-244, z 64-174) had no quest and no fight over 11,000 tiles: three smashed spans (a personal Woodwork 30 repair each, woodwork.ts)
|
|
4
|
+
* and nothing to say why anyone crosses. This adds, with no existing coordinate moved:
|
|
5
|
+
*
|
|
6
|
+
* - the SURVEYORS' CAMP on the west bank (where the Frozen road brings a player): Chief Surveyor Ottoline Keane and Rope-Master Bram
|
|
7
|
+
* Tolliver (named residents), Camp Cook Peg Ashby (campTraders), a Bounty Board, a furnace, an anvil, a workbench and a fire, four
|
|
8
|
+
* gorge-wall seams (silver, gold, iron) and the ice gauge post;
|
|
9
|
+
* - the RIM LEDGE, five ice anchors on the west rim touched IN ORDER while the ice holds (a ten-minute wall clock, like the Sea Grotto's tide:
|
|
10
|
+
* frost, creak, thaw, freeze); a wrong anchor, or the ice letting go, throws you back to the ledge's head;
|
|
11
|
+
* - the east bank beyond a mended span: Scout Isolde Frayne at the east end, and THE THAW WRAITH on the Thaw Fall's east lip (a boss of
|
|
12
|
+
* level 36 whose Thaw Shear is told a full turn ahead and dodged by stepping clear);
|
|
13
|
+
* - three DENS of existing kinds on the east bank (Drift Hollow, Meltwater Shelf, Cairn Scrub), told apart by id and handled by the north's
|
|
14
|
+
* den machinery (northWilds.ts): each hunts only a player standing inside its own box, and none lies within 30 tiles of the camp.
|
|
15
|
+
*
|
|
16
|
+
* The four quests are in thawCrossingQuestDef.ts. EVERY NUMBER HERE (levels, counts, pay, timings) IS A PLACEHOLDER for the balance pass
|
|
17
|
+
* (James, 2026-10-12: balance last). 41+ stays behind its gates: nothing here is above level 38 and nothing opens a gate. Every position is
|
|
18
|
+
* a WORLD tile (x east, z south). Models are stand-ins from the kit, logged in dreadwoods-backend/upgrades. No Foraging here: the Thaw
|
|
19
|
+
* banks' herbs are T103's (snowForaging.ts: marigold at x 247 z 130-210, lichen at x 214-220 z 124-212), and the camp's box keeps clear of them.
|
|
20
|
+
*/
|
|
21
|
+
import type { DiscoveryZone } from './landmarks.js';
|
|
22
|
+
import type { NorthWildsSite } from './northWilds.js';
|
|
23
|
+
export type ThawBox = {
|
|
24
|
+
readonly minX: number;
|
|
25
|
+
readonly maxX: number;
|
|
26
|
+
readonly minZ: number;
|
|
27
|
+
readonly maxZ: number;
|
|
28
|
+
};
|
|
29
|
+
export type ThawProp = {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly kind: 'dreadmodel' | 'dreadprop' | 'campfire' | 'barrel' | 'bountyboard' | 'furnace' | 'anvil' | 'workbench' | 'orerock';
|
|
32
|
+
readonly style: string;
|
|
33
|
+
readonly x: number;
|
|
34
|
+
readonly z: number;
|
|
35
|
+
readonly scale?: number;
|
|
36
|
+
};
|
|
37
|
+
export type ThawQuestProp = {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly x: number;
|
|
40
|
+
readonly z: number;
|
|
41
|
+
readonly style: string;
|
|
42
|
+
};
|
|
43
|
+
export declare const THAW_CROSSING_NAME = "Thaw Crossing";
|
|
44
|
+
export declare const THAW_CAMP_NAME = "The Surveyors' Camp";
|
|
45
|
+
export declare const THAW_LEDGE_NAME = "The Rim Ledge";
|
|
46
|
+
export declare const THAW_LIP_NAME = "The Thaw Fall's East Lip";
|
|
47
|
+
/** The camp: flat, on the west bank's snow (height 3), kept clear of T103's lichen spots (216,124) (220,146) and (214,168). */
|
|
48
|
+
export declare const THAW_CAMP_BOX: ThawBox;
|
|
49
|
+
export declare const THAW_CAMP_HEIGHT = 3;
|
|
50
|
+
export declare const THAW_CAMP_EASE = 3;
|
|
51
|
+
/** The west rim north to south: the anchors' strip, beside the trail (x 231-233 is Path, x 234 snow, x 235 the blocked rim stone). */
|
|
52
|
+
export declare const THAW_LEDGE_BOX: ThawBox;
|
|
53
|
+
/** The east lip of the Thaw Fall: the wraith's ground, a grass slope from height 4 (x 246) down to 0. */
|
|
54
|
+
export declare const THAW_LIP_BOX: ThawBox;
|
|
55
|
+
export declare const THAW_STANDS: {
|
|
56
|
+
/** Where the Frozen road meets the camp (the trail beside its east edge). */
|
|
57
|
+
readonly gate: {
|
|
58
|
+
readonly x: 232;
|
|
59
|
+
readonly z: 135;
|
|
60
|
+
};
|
|
61
|
+
readonly camp: {
|
|
62
|
+
readonly x: 224;
|
|
63
|
+
readonly z: 135;
|
|
64
|
+
};
|
|
65
|
+
/** The head of the Rim Ledge: where a slip throws you back to. */
|
|
66
|
+
readonly ledge: {
|
|
67
|
+
readonly x: 233;
|
|
68
|
+
readonly z: 146;
|
|
69
|
+
};
|
|
70
|
+
/** The west end of the first span (z 113). */
|
|
71
|
+
readonly span1West: {
|
|
72
|
+
readonly x: 233;
|
|
73
|
+
readonly z: 113;
|
|
74
|
+
};
|
|
75
|
+
/** The east end of the first span, where the scout waits. */
|
|
76
|
+
readonly span1East: {
|
|
77
|
+
readonly x: 249;
|
|
78
|
+
readonly z: 118;
|
|
79
|
+
};
|
|
80
|
+
readonly lip: {
|
|
81
|
+
readonly x: 250;
|
|
82
|
+
readonly z: 98;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
/** The three dens' hunting boxes (northWilds sites below): the verify links and tests read them. */
|
|
86
|
+
export declare const THAW_DEN_BOXES: {
|
|
87
|
+
readonly driftHollow: {
|
|
88
|
+
readonly minX: 280;
|
|
89
|
+
readonly maxX: 304;
|
|
90
|
+
readonly minZ: 146;
|
|
91
|
+
readonly maxZ: 170;
|
|
92
|
+
};
|
|
93
|
+
readonly meltwaterShelf: {
|
|
94
|
+
readonly minX: 262;
|
|
95
|
+
readonly maxX: 286;
|
|
96
|
+
readonly minZ: 182;
|
|
97
|
+
readonly maxZ: 206;
|
|
98
|
+
};
|
|
99
|
+
readonly cairnScrub: {
|
|
100
|
+
readonly minX: 296;
|
|
101
|
+
readonly maxX: 318;
|
|
102
|
+
readonly minZ: 196;
|
|
103
|
+
readonly maxZ: 222;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
export declare function inThawBox(b: ThawBox, x: number, z: number, pad?: number): boolean;
|
|
107
|
+
/** Ten minutes: hard frost 4, creak 1, thaw 4, refreeze 1. The ice holds an anchor in the first five. */
|
|
108
|
+
export declare const THAW_ICE_CYCLE_MS = 600000;
|
|
109
|
+
export type ThawIcePhase = 'frost' | 'creak' | 'thaw' | 'freeze';
|
|
110
|
+
export declare function thawIce(nowMs: number): {
|
|
111
|
+
phase: ThawIcePhase;
|
|
112
|
+
msUntilHold: number;
|
|
113
|
+
msLeftHold: number;
|
|
114
|
+
};
|
|
115
|
+
/** The ice holds an anchor through the frost and the creak; it lets go in the thaw and is not trusted in the freeze. */
|
|
116
|
+
export declare const isThawIceHolding: (nowMs: number) => boolean;
|
|
117
|
+
/** The gauge post's line (readable any time, quest or not). */
|
|
118
|
+
export declare function thawIceLine(nowMs: number): string;
|
|
119
|
+
/** Camp pieces: two tents, a table, stores, a bench, a banner and lanterns, all stand-ins from the kit. Stations are below. */
|
|
120
|
+
export declare const THAW_CAMP_PIECES: readonly ThawProp[];
|
|
121
|
+
/** The working stations (the skills' own kinds): a fire, the board, a furnace, an anvil, a workbench, and the gorge wall's four seams. */
|
|
122
|
+
export declare const THAW_CAMP_STATIONS: readonly ThawProp[];
|
|
123
|
+
export declare const THAW_SEAMS: readonly ThawProp[];
|
|
124
|
+
export declare const THAW_SIGNS: readonly {
|
|
125
|
+
readonly id: string;
|
|
126
|
+
readonly x: number;
|
|
127
|
+
readonly z: number;
|
|
128
|
+
readonly style: string;
|
|
129
|
+
}[];
|
|
130
|
+
export declare const THAW_FOLK_NAMES: {
|
|
131
|
+
readonly chief: "Chief Surveyor Ottoline Keane";
|
|
132
|
+
readonly rope: "Rope-Master Bram Tolliver";
|
|
133
|
+
readonly scout: "Scout Isolde Frayne";
|
|
134
|
+
};
|
|
135
|
+
export type ThawFolk = {
|
|
136
|
+
readonly id: string;
|
|
137
|
+
readonly name: string;
|
|
138
|
+
readonly place: string;
|
|
139
|
+
readonly x: number;
|
|
140
|
+
readonly z: number;
|
|
141
|
+
readonly faceX: number;
|
|
142
|
+
readonly faceZ: number;
|
|
143
|
+
readonly leash: number;
|
|
144
|
+
readonly speak: string;
|
|
145
|
+
readonly extras?: ReadonlyArray<{
|
|
146
|
+
readonly id: string;
|
|
147
|
+
readonly label: string;
|
|
148
|
+
readonly say: string;
|
|
149
|
+
}>;
|
|
150
|
+
};
|
|
151
|
+
export declare const THAW_FOLK: ReadonlyArray<ThawFolk>;
|
|
152
|
+
export declare function thawFolkByName(name: string | null | undefined): ThawFolk | null;
|
|
153
|
+
export declare function thawFolkById(id: string | null | undefined): ThawFolk | null;
|
|
154
|
+
/** The camp's cook: a CampTrader entry (campTraders.ts adds it to CAMP_TRADERS), a counter of existing food at the other counters' prices. */
|
|
155
|
+
export declare const THAW_CAMP_COOK: {
|
|
156
|
+
readonly id: "camp-thaw";
|
|
157
|
+
readonly name: "Peg Ashby";
|
|
158
|
+
readonly place: "the cook tent at the Surveyors' Camp, Thaw Crossing";
|
|
159
|
+
readonly x: 226;
|
|
160
|
+
readonly z: 137;
|
|
161
|
+
readonly faceX: 225;
|
|
162
|
+
readonly faceZ: 136;
|
|
163
|
+
readonly leash: 1;
|
|
164
|
+
readonly shopTitle: "Peg's Survey Pot";
|
|
165
|
+
readonly stock: readonly [{
|
|
166
|
+
readonly kind: "bread";
|
|
167
|
+
readonly price: 20;
|
|
168
|
+
}, {
|
|
169
|
+
readonly kind: "cookedtrout";
|
|
170
|
+
readonly price: 40;
|
|
171
|
+
}, {
|
|
172
|
+
readonly kind: "cookedchar";
|
|
173
|
+
readonly price: 46;
|
|
174
|
+
}, {
|
|
175
|
+
readonly kind: "cookedsalmon";
|
|
176
|
+
readonly price: 65;
|
|
177
|
+
}];
|
|
178
|
+
readonly buys: {};
|
|
179
|
+
readonly speak: "Peg Ashby. I feed the survey and the survey keeps the wolves off my pot. Sit by the fire; the ice never forgets who comes in from the cold.";
|
|
180
|
+
readonly trade: "Bread, trout, char and salmon, all hot. The east bank has wolves and a wraith and nobody selling anything, so eat before you cross.";
|
|
181
|
+
};
|
|
182
|
+
export declare const TC_PROP: {
|
|
183
|
+
readonly stake: "tcstake";
|
|
184
|
+
readonly anchor: "tcanchor";
|
|
185
|
+
readonly gauge: "tcgauge";
|
|
186
|
+
readonly pin: "tcpin";
|
|
187
|
+
};
|
|
188
|
+
/** The Surveyors' Line: three stakes along the west rim, from the first span's approach down to the head of the ledge. */
|
|
189
|
+
export declare const TC_STAKE_A: ThawQuestProp;
|
|
190
|
+
export declare const TC_STAKE_B: ThawQuestProp;
|
|
191
|
+
export declare const TC_STAKE_C: ThawQuestProp;
|
|
192
|
+
/** Anchors in the Ice: five anchors on the rim strip, five tiles apart, set lowest first (north to south). */
|
|
193
|
+
export declare const TC_ANCHORS: readonly ThawQuestProp[];
|
|
194
|
+
export declare const TC_ANCHOR_ORDER: readonly string[];
|
|
195
|
+
/** The ice gauge by the camp's east edge: tells the ice any time. */
|
|
196
|
+
export declare const TC_GAUGE: ThawQuestProp;
|
|
197
|
+
/** Across the Thaw: the survey pin on the east bank, a short walk from the first span's east end. */
|
|
198
|
+
export declare const TC_PIN_EAST: ThawQuestProp;
|
|
199
|
+
export declare const THAW_QUEST_PROPS: readonly ThawQuestProp[];
|
|
200
|
+
export declare function thawPropModel(prop: string): string | null;
|
|
201
|
+
export declare const THAW_QUEST_PROP_NAMES: Readonly<Record<string, string>>;
|
|
202
|
+
/** The idle line for a prop clicked when the quest does not want it (the gauge says the ice any time). */
|
|
203
|
+
export declare function thawCrossingPropIdleLine(prop: string, nowMs: number): string | null;
|
|
204
|
+
/** Story effect: a wrong anchor, or the ice letting go, throws you back to the head of the ledge (backend world.ts applyStoryEffect). */
|
|
205
|
+
export declare const THAW_SLIP_EFFECT = "thaw-slip";
|
|
206
|
+
export declare const THAW_SLIP_TEXT = "The line goes slack and you slide down the ice. You fetch up at the head of the ledge, wet and annoyed, with the anchors to set again.";
|
|
207
|
+
export declare const THAW_WRAITH_KIND = "thawwraith";
|
|
208
|
+
export declare const THAW_WRAITH_NAME = "The Thaw Wraith";
|
|
209
|
+
export declare const THAW_WRAITH_LEVEL = 36;
|
|
210
|
+
export declare const THAW_WRAITH_HEALTH_SCALE = 2;
|
|
211
|
+
export declare const THAW_WRAITH_MAX_HIT = 25;
|
|
212
|
+
export declare const THAW_WRAITH_SCALE = 1.15;
|
|
213
|
+
export declare const THAW_WRAITH_RESPAWN_MS: number;
|
|
214
|
+
export declare const THAW_WRAITH_SPAWN: {
|
|
215
|
+
readonly x: 250;
|
|
216
|
+
readonly z: 98;
|
|
217
|
+
readonly leash: 4;
|
|
218
|
+
};
|
|
219
|
+
export declare const THAW_WRAITH_NOTE = "A drowned surveyor's shape, wound in meltwater and frost, who rises from the Thaw Fall's pool onto the east lip. Every fourth blow is the Thaw Shear: she lifts both hands, a pale ring of ice spreads across the bank a full turn ahead, and the blow lands twice as hard on anyone still inside it. Step out of the ring and the Shear misses. Passive until struck.";
|
|
220
|
+
export declare const THAW_WRAITH_PACE: {
|
|
221
|
+
speed: number;
|
|
222
|
+
idleChance: number;
|
|
223
|
+
pause: readonly [4, 9];
|
|
224
|
+
};
|
|
225
|
+
/** Existing goods only: placeholders for the balance pass. */
|
|
226
|
+
export declare const THAW_WRAITH_DROPS: readonly {
|
|
227
|
+
itemKind: string;
|
|
228
|
+
chance: number;
|
|
229
|
+
minQty: number;
|
|
230
|
+
maxQty: number;
|
|
231
|
+
}[];
|
|
232
|
+
export declare const THAW_DEN_SITES: readonly NorthWildsSite[];
|
|
233
|
+
/** The discovery zones (types expandedContracts.ts INSERTED_DISCOVERY_ZONES): the camp, the ledge, the lip and the three dens. */
|
|
234
|
+
export declare const THAW_CROSSING_ZONES: ReadonlyArray<{
|
|
235
|
+
readonly id: string;
|
|
236
|
+
readonly label: string;
|
|
237
|
+
readonly box: ThawBox;
|
|
238
|
+
}>;
|
|
239
|
+
export declare const THAW_CROSSING_ZONE_IDS: readonly string[];
|
|
240
|
+
export declare const THAW_CROSSING_DISCOVERY_ZONES: readonly DiscoveryZone[];
|
|
241
|
+
/** The paper-map labels (three: the dens take theirs from their zones). */
|
|
242
|
+
export declare const THAW_MAP_LABELS: readonly {
|
|
243
|
+
readonly x: number;
|
|
244
|
+
readonly z: number;
|
|
245
|
+
readonly label: string;
|
|
246
|
+
}[];
|
|
247
|
+
export declare const THAW_PLACE_TEXT = "Thaw Crossing is the Thaw Gorge's two banks. The Surveyors' Camp stands on the west bank, a short walk south of the Thaw Bridge, beside the Frozen road: a cook, a Bounty Board, a forge and the survey's people. The Rim Ledge runs south from it along the west rim to the second span. The east bank beyond the first span (Woodwork 30 to mend it) holds the Thaw Fall's east lip, where the Thaw Wraith rises, and three dens: Drift Hollow, Meltwater Shelf and Cairn Scrub.";
|
|
248
|
+
//# sourceMappingURL=thawCrossing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thawCrossing.d.ts","sourceRoot":"","sources":["../src/thawCrossing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { INN_BREAD_PRICE } from './tavern.js';
|
|
2
|
+
export const THAW_CROSSING_NAME = 'Thaw Crossing';
|
|
3
|
+
export const THAW_CAMP_NAME = "The Surveyors' Camp";
|
|
4
|
+
export const THAW_LEDGE_NAME = 'The Rim Ledge';
|
|
5
|
+
export const THAW_LIP_NAME = "The Thaw Fall's East Lip";
|
|
6
|
+
// ---- The ground -------------------------------------------------------------------------------------------------------------------
|
|
7
|
+
/** The camp: flat, on the west bank's snow (height 3), kept clear of T103's lichen spots (216,124) (220,146) and (214,168). */
|
|
8
|
+
export const THAW_CAMP_BOX = { minX: 218, maxX: 230, minZ: 127, maxZ: 143 };
|
|
9
|
+
export const THAW_CAMP_HEIGHT = 3;
|
|
10
|
+
export const THAW_CAMP_EASE = 3;
|
|
11
|
+
/** The west rim north to south: the anchors' strip, beside the trail (x 231-233 is Path, x 234 snow, x 235 the blocked rim stone). */
|
|
12
|
+
export const THAW_LEDGE_BOX = { minX: 231, maxX: 236, minZ: 146, maxZ: 172 };
|
|
13
|
+
/** The east lip of the Thaw Fall: the wraith's ground, a grass slope from height 4 (x 246) down to 0. */
|
|
14
|
+
export const THAW_LIP_BOX = { minX: 246, maxX: 262, minZ: 92, maxZ: 106 };
|
|
15
|
+
export const THAW_STANDS = {
|
|
16
|
+
/** Where the Frozen road meets the camp (the trail beside its east edge). */
|
|
17
|
+
gate: { x: 232, z: 135 },
|
|
18
|
+
camp: { x: 224, z: 135 },
|
|
19
|
+
/** The head of the Rim Ledge: where a slip throws you back to. */
|
|
20
|
+
ledge: { x: 233, z: 146 },
|
|
21
|
+
/** The west end of the first span (z 113). */
|
|
22
|
+
span1West: { x: 233, z: 113 },
|
|
23
|
+
/** The east end of the first span, where the scout waits. */
|
|
24
|
+
span1East: { x: 249, z: 118 },
|
|
25
|
+
lip: { x: 250, z: 98 },
|
|
26
|
+
};
|
|
27
|
+
/** The three dens' hunting boxes (northWilds sites below): the verify links and tests read them. */
|
|
28
|
+
export const THAW_DEN_BOXES = {
|
|
29
|
+
driftHollow: { minX: 280, maxX: 304, minZ: 146, maxZ: 170 },
|
|
30
|
+
meltwaterShelf: { minX: 262, maxX: 286, minZ: 182, maxZ: 206 },
|
|
31
|
+
cairnScrub: { minX: 296, maxX: 318, minZ: 196, maxZ: 222 },
|
|
32
|
+
};
|
|
33
|
+
export function inThawBox(b, x, z, pad = 0) {
|
|
34
|
+
return x >= b.minX - pad && x <= b.maxX + pad && z >= b.minZ - pad && z <= b.maxZ + pad;
|
|
35
|
+
}
|
|
36
|
+
// ---- The ice clock (a pure function of the UTC wall clock: the same for everyone and every restart, nothing saved) ---------------------
|
|
37
|
+
/** Ten minutes: hard frost 4, creak 1, thaw 4, refreeze 1. The ice holds an anchor in the first five. */
|
|
38
|
+
export const THAW_ICE_CYCLE_MS = 600_000;
|
|
39
|
+
const ICE_EDGES = [
|
|
40
|
+
[0, 'frost'],
|
|
41
|
+
[240_000, 'creak'],
|
|
42
|
+
[300_000, 'thaw'],
|
|
43
|
+
[540_000, 'freeze'],
|
|
44
|
+
];
|
|
45
|
+
const ICE_HOLD_END_MS = 300_000;
|
|
46
|
+
export function thawIce(nowMs) {
|
|
47
|
+
const t = ((nowMs % THAW_ICE_CYCLE_MS) + THAW_ICE_CYCLE_MS) % THAW_ICE_CYCLE_MS;
|
|
48
|
+
let phase = 'frost';
|
|
49
|
+
for (const [from, p] of ICE_EDGES)
|
|
50
|
+
if (t >= from)
|
|
51
|
+
phase = p;
|
|
52
|
+
const holding = t < ICE_HOLD_END_MS;
|
|
53
|
+
return { phase, msUntilHold: holding ? 0 : THAW_ICE_CYCLE_MS - t, msLeftHold: holding ? ICE_HOLD_END_MS - t : 0 };
|
|
54
|
+
}
|
|
55
|
+
/** The ice holds an anchor through the frost and the creak; it lets go in the thaw and is not trusted in the freeze. */
|
|
56
|
+
export const isThawIceHolding = (nowMs) => thawIce(nowMs).msLeftHold > 0;
|
|
57
|
+
function iceWait(ms) {
|
|
58
|
+
const s = Math.max(1, Math.round(ms / 1000));
|
|
59
|
+
return s >= 90 ? `about ${Math.round(s / 60)} minutes` : `about ${s} seconds`;
|
|
60
|
+
}
|
|
61
|
+
/** The gauge post's line (readable any time, quest or not). */
|
|
62
|
+
export function thawIceLine(nowMs) {
|
|
63
|
+
const t = thawIce(nowMs);
|
|
64
|
+
if (t.phase === 'frost')
|
|
65
|
+
return `The gauge post is white with hard frost: the ice holds, ${iceWait(t.msLeftHold)} before it begins to creak.`;
|
|
66
|
+
if (t.phase === 'creak')
|
|
67
|
+
return `The gauge post is creaking and the frost on it is going grey: the ice will let go in ${iceWait(t.msLeftHold)}.`;
|
|
68
|
+
if (t.phase === 'thaw')
|
|
69
|
+
return `The gauge post is running with meltwater. Nothing will hold in the ice. Hard frost in ${iceWait(t.msUntilHold)}.`;
|
|
70
|
+
return `The gauge post is stiffening as the meltwater freezes again. Hard frost in ${iceWait(t.msUntilHold)}.`;
|
|
71
|
+
}
|
|
72
|
+
// ---- The camp ----------------------------------------------------------------------------------------------------------------------
|
|
73
|
+
/** Camp pieces: two tents, a table, stores, a bench, a banner and lanterns, all stand-ins from the kit. Stations are below. */
|
|
74
|
+
export const THAW_CAMP_PIECES = [
|
|
75
|
+
{ id: 'tc-tent-survey', kind: 'dreadprop', style: 'tent-face90', x: 222, z: 131 },
|
|
76
|
+
{ id: 'tc-tent-cook', kind: 'dreadprop', style: 'tent-face0', x: 227, z: 140 },
|
|
77
|
+
{ id: 'tc-table', kind: 'dreadmodel', style: 'hbbench-s', x: 222, z: 135 },
|
|
78
|
+
{ id: 'tc-crates', kind: 'dreadmodel', style: 'hbcrates-s', x: 219, z: 134 },
|
|
79
|
+
{ id: 'tc-woodpile', kind: 'dreadmodel', style: 'woodpile-s', x: 225, z: 142 },
|
|
80
|
+
{ id: 'tc-planks', kind: 'dreadmodel', style: 'plankstack-s', x: 219, z: 142 },
|
|
81
|
+
{ id: 'tc-banner', kind: 'dreadprop', style: 'banner', x: 230, z: 129 },
|
|
82
|
+
{ id: 'tc-barrel', kind: 'barrel', style: 'barrel', x: 229, z: 142, scale: 1 },
|
|
83
|
+
{ id: 'tc-lantern-n', kind: 'dreadmodel', style: 'townlantern1x1-s', x: 230, z: 128 },
|
|
84
|
+
{ id: 'tc-lantern-s', kind: 'dreadmodel', style: 'townlantern1x1-s', x: 230, z: 142 },
|
|
85
|
+
{ id: 'tc-lantern-w', kind: 'dreadmodel', style: 'townlantern1x1-s', x: 218, z: 137 },
|
|
86
|
+
];
|
|
87
|
+
/** The working stations (the skills' own kinds): a fire, the board, a furnace, an anvil, a workbench, and the gorge wall's four seams. */
|
|
88
|
+
export const THAW_CAMP_STATIONS = [
|
|
89
|
+
{ id: 'tc-fire', kind: 'campfire', style: '', x: 225, z: 136 },
|
|
90
|
+
{ id: 'tc-board', kind: 'bountyboard', style: 'wall-s', x: 228, z: 131 },
|
|
91
|
+
{ id: 'tc-furnace', kind: 'furnace', style: '', x: 220, z: 139 },
|
|
92
|
+
{ id: 'tc-anvil', kind: 'anvil', style: '', x: 222, z: 139 },
|
|
93
|
+
{ id: 'tc-bench', kind: 'workbench', style: 'face0', x: 219, z: 137 },
|
|
94
|
+
// The cut face at the camp's north edge: two silver (Mining 33), one gold (Mining 30) and one iron.
|
|
95
|
+
{ id: 'tc-seam-silver-1', kind: 'orerock', style: 'silver', x: 220, z: 128 },
|
|
96
|
+
{ id: 'tc-seam-silver-2', kind: 'orerock', style: 'silver', x: 223, z: 128 },
|
|
97
|
+
{ id: 'tc-seam-gold-1', kind: 'orerock', style: 'gold', x: 226, z: 128 },
|
|
98
|
+
{ id: 'tc-seam-iron-1', kind: 'orerock', style: 'iron', x: 229, z: 128 },
|
|
99
|
+
];
|
|
100
|
+
export const THAW_SEAMS = THAW_CAMP_STATIONS.filter((s) => s.kind === 'orerock');
|
|
101
|
+
export const THAW_SIGNS = [
|
|
102
|
+
{ id: 'tc-sign-camp', x: 234, z: 138, style: "placard-The Surveyors' Camp: cook, Bounty Board, forge. North: the Thaw Bridge. South: the Rim Ledge. Combat 30+" },
|
|
103
|
+
{ id: 'tc-sign-ledge', x: 234, z: 143, style: 'fingerpost-The Rim Ledge|The Surveyors\' Camp' },
|
|
104
|
+
{ id: 'tc-sign-span', x: 234, z: 120, style: 'fingerpost-The Thaw Bridge (Woodwork 30 to mend)|The Surveyors\' Camp' },
|
|
105
|
+
];
|
|
106
|
+
// ---- The people ----------------------------------------------------------------------------------------------------------------------
|
|
107
|
+
export const THAW_FOLK_NAMES = {
|
|
108
|
+
chief: 'Chief Surveyor Ottoline Keane',
|
|
109
|
+
rope: 'Rope-Master Bram Tolliver',
|
|
110
|
+
scout: 'Scout Isolde Frayne',
|
|
111
|
+
};
|
|
112
|
+
export const THAW_FOLK = [
|
|
113
|
+
{
|
|
114
|
+
id: 'tc-chief',
|
|
115
|
+
name: THAW_FOLK_NAMES.chief,
|
|
116
|
+
place: "the Surveyors' Camp, Thaw Crossing",
|
|
117
|
+
x: 224, z: 133, faceX: 222, faceZ: 133, leash: 1,
|
|
118
|
+
speak: "Ottoline Keane, chief surveyor. The Crown wants a road from the Frozen rim across the Thaw to Millbrook, and the gorge wants otherwise. Three spans lie smashed over the water, and nobody has measured the gorge since the fall was a trickle. That is my business and, if you can stand the cold, yours.",
|
|
119
|
+
extras: [
|
|
120
|
+
{ id: 'gorge', label: 'The gorge', say: "The Thaw comes in from the sea behind the rock, drops eight fathoms at the Fall and runs south under three broken spans. The first is at the bridge north of here, the second south of the Rim Ledge, the third by the Dreadwoods wall. Mending one takes ash, pine and spruce and a joiner's hands (Woodwork 30)." },
|
|
121
|
+
{ id: 'ice', label: 'The ice', say: "The rim freezes hard and thaws soft, on a ten-minute turn you can set a watch by. The gauge post at the camp's east edge tells you where it stands. Anchors hold in the frost and the creak; in the thaw they slip." },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: 'tc-rope',
|
|
126
|
+
name: THAW_FOLK_NAMES.rope,
|
|
127
|
+
place: "the Surveyors' Camp, Thaw Crossing",
|
|
128
|
+
x: 221, z: 137, faceX: 220, faceZ: 139, leash: 1,
|
|
129
|
+
speak: "Bram Tolliver, rope-master. Iron anchors, hemp line and a good deal of swearing. If it holds a surveyor over the gorge, I made it, and if it didn't, I told them so.",
|
|
130
|
+
extras: [
|
|
131
|
+
{ id: 'anchors', label: 'The anchors', say: "Five anchors, driven into the rim in a line from the ledge's head to the second span. Set them in order, lowest first, while the ice holds. Reach for the wrong one, or dawdle into the thaw, and the line goes slack and throws you back to the head of the ledge. Nothing worse." },
|
|
132
|
+
{ id: 'forge', label: 'The forge', say: "There is a furnace, an anvil and a bench by my tent, free to anyone doing the Crown's work. Iron anchors want iron bars: Blacksmithing to smelt them, a pickaxe to find the ore." },
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: 'tc-scout',
|
|
137
|
+
name: THAW_FOLK_NAMES.scout,
|
|
138
|
+
place: 'the east end of the Thaw Bridge, Thaw Crossing',
|
|
139
|
+
x: 250, z: 118, faceX: 248, faceZ: 116, leash: 1,
|
|
140
|
+
speak: "Isolde Frayne, scout for the survey. I cross by the first span when it is mended, so I get the east bank all to myself and the things that live on it. The wolves keep to the hollows. The wraith keeps to the Fall.",
|
|
141
|
+
extras: [
|
|
142
|
+
{ id: 'east', label: 'The east bank', say: "Frost wolves den in Drift Hollow, south-east. A pair of polar bears came down off the ice onto the Meltwater Shelf, and the remnants of someone's army camp in the Cairn Scrub. None of them come near the span. The wraith, though, rises from the Fall's pool and keeps the lip." },
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
export function thawFolkByName(name) {
|
|
147
|
+
return name ? THAW_FOLK.find((p) => p.name === name) ?? null : null;
|
|
148
|
+
}
|
|
149
|
+
export function thawFolkById(id) {
|
|
150
|
+
return id ? THAW_FOLK.find((p) => p.id === id) ?? null : null;
|
|
151
|
+
}
|
|
152
|
+
/** The camp's cook: a CampTrader entry (campTraders.ts adds it to CAMP_TRADERS), a counter of existing food at the other counters' prices. */
|
|
153
|
+
export const THAW_CAMP_COOK = {
|
|
154
|
+
id: 'camp-thaw',
|
|
155
|
+
name: 'Peg Ashby',
|
|
156
|
+
place: "the cook tent at the Surveyors' Camp, Thaw Crossing",
|
|
157
|
+
x: 226, z: 137, faceX: 225, faceZ: 136, leash: 1,
|
|
158
|
+
shopTitle: "Peg's Survey Pot",
|
|
159
|
+
stock: [
|
|
160
|
+
{ kind: 'bread', price: INN_BREAD_PRICE },
|
|
161
|
+
{ kind: 'cookedtrout', price: 40 },
|
|
162
|
+
{ kind: 'cookedchar', price: 46 },
|
|
163
|
+
{ kind: 'cookedsalmon', price: 65 },
|
|
164
|
+
],
|
|
165
|
+
buys: {},
|
|
166
|
+
speak: "Peg Ashby. I feed the survey and the survey keeps the wolves off my pot. Sit by the fire; the ice never forgets who comes in from the cold.",
|
|
167
|
+
trade: 'Bread, trout, char and salmon, all hot. The east bank has wolves and a wraith and nobody selling anything, so eat before you cross.',
|
|
168
|
+
};
|
|
169
|
+
// ---- The quest props ----------------------------------------------------------------------------------------------------------------
|
|
170
|
+
export const TC_PROP = { stake: 'tcstake', anchor: 'tcanchor', gauge: 'tcgauge', pin: 'tcpin' };
|
|
171
|
+
/** The Surveyors' Line: three stakes along the west rim, from the first span's approach down to the head of the ledge. */
|
|
172
|
+
export const TC_STAKE_A = { id: 'tc-quest-stake-a', x: 234, z: 116, style: `${TC_PROP.stake}:a` };
|
|
173
|
+
export const TC_STAKE_B = { id: 'tc-quest-stake-b', x: 234, z: 130, style: `${TC_PROP.stake}:b` };
|
|
174
|
+
export const TC_STAKE_C = { id: 'tc-quest-stake-c', x: 234, z: 145, style: `${TC_PROP.stake}:c` };
|
|
175
|
+
/** Anchors in the Ice: five anchors on the rim strip, five tiles apart, set lowest first (north to south). */
|
|
176
|
+
export const TC_ANCHORS = [150, 155, 160, 165, 170].map((z, i) => ({ id: `tc-quest-anchor-${i + 1}`, x: 234, z, style: `${TC_PROP.anchor}:${i + 1}` }));
|
|
177
|
+
export const TC_ANCHOR_ORDER = TC_ANCHORS.map((a) => a.style);
|
|
178
|
+
/** The ice gauge by the camp's east edge: tells the ice any time. */
|
|
179
|
+
export const TC_GAUGE = { id: 'tc-quest-gauge', x: 229, z: 135, style: `${TC_PROP.gauge}:post` };
|
|
180
|
+
/** Across the Thaw: the survey pin on the east bank, a short walk from the first span's east end. */
|
|
181
|
+
export const TC_PIN_EAST = { id: 'tc-quest-pin-east', x: 248, z: 116, style: `${TC_PROP.pin}:east` };
|
|
182
|
+
export const THAW_QUEST_PROPS = [TC_STAKE_A, TC_STAKE_B, TC_STAKE_C, ...TC_ANCHORS, TC_GAUGE, TC_PIN_EAST];
|
|
183
|
+
export function thawPropModel(prop) {
|
|
184
|
+
if (prop === TC_PROP.anchor)
|
|
185
|
+
return 'lwropepost';
|
|
186
|
+
if (prop === TC_PROP.stake || prop === TC_PROP.pin || prop === TC_PROP.gauge)
|
|
187
|
+
return 'townwaypost1x1';
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
export const THAW_QUEST_PROP_NAMES = {
|
|
191
|
+
[TC_STAKE_A.style]: 'Survey Stake (bridge approach)',
|
|
192
|
+
[TC_STAKE_B.style]: 'Survey Stake (camp)',
|
|
193
|
+
[TC_STAKE_C.style]: 'Survey Stake (ledge head)',
|
|
194
|
+
...Object.fromEntries(TC_ANCHORS.map((a, i) => [a.style, `Ice Anchor ${i + 1}`])),
|
|
195
|
+
[TC_GAUGE.style]: 'Ice Gauge Post',
|
|
196
|
+
[TC_PIN_EAST.style]: 'East Survey Pin',
|
|
197
|
+
};
|
|
198
|
+
/** The idle line for a prop clicked when the quest does not want it (the gauge says the ice any time). */
|
|
199
|
+
export function thawCrossingPropIdleLine(prop, nowMs) {
|
|
200
|
+
if (prop === TC_PROP.gauge)
|
|
201
|
+
return thawIceLine(nowMs);
|
|
202
|
+
if (prop === TC_PROP.stake)
|
|
203
|
+
return 'A survey stake, red-banded and iced over. Chief Surveyor Keane sets them; her quest The Surveyors\' Line asks for them.';
|
|
204
|
+
if (prop === TC_PROP.anchor)
|
|
205
|
+
return `An ice anchor on the Rim Ledge. ${thawIceLine(nowMs)}`;
|
|
206
|
+
if (prop === TC_PROP.pin)
|
|
207
|
+
return 'The survey pin on the east bank, driven in where the first span lands. It matters to Chief Surveyor Keane\'s quest Across the Thaw.';
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
/** Story effect: a wrong anchor, or the ice letting go, throws you back to the head of the ledge (backend world.ts applyStoryEffect). */
|
|
211
|
+
export const THAW_SLIP_EFFECT = 'thaw-slip';
|
|
212
|
+
export const THAW_SLIP_TEXT = 'The line goes slack and you slide down the ice. You fetch up at the head of the ledge, wet and annoyed, with the anchors to set again.';
|
|
213
|
+
// ---- The Thaw Wraith (new kind on the frost revenant look) -------------------------------------------------------------------------
|
|
214
|
+
export const THAW_WRAITH_KIND = 'thawwraith';
|
|
215
|
+
export const THAW_WRAITH_NAME = 'The Thaw Wraith';
|
|
216
|
+
export const THAW_WRAITH_LEVEL = 36;
|
|
217
|
+
export const THAW_WRAITH_HEALTH_SCALE = 2.0;
|
|
218
|
+
export const THAW_WRAITH_MAX_HIT = 25;
|
|
219
|
+
export const THAW_WRAITH_SCALE = 1.15;
|
|
220
|
+
export const THAW_WRAITH_RESPAWN_MS = 8 * 60_000;
|
|
221
|
+
export const THAW_WRAITH_SPAWN = { x: 250, z: 98, leash: 4 };
|
|
222
|
+
export const THAW_WRAITH_NOTE = "A drowned surveyor's shape, wound in meltwater and frost, who rises from the Thaw Fall's pool onto the east lip. Every fourth blow is the Thaw Shear: she lifts both hands, a pale ring of ice spreads across the bank a full turn ahead, and the blow lands twice as hard on anyone still inside it. Step out of the ring and the Shear misses. Passive until struck.";
|
|
223
|
+
export const THAW_WRAITH_PACE = { speed: 0.9, idleChance: 0.7, pause: [4, 9] };
|
|
224
|
+
/** Existing goods only: placeholders for the balance pass. */
|
|
225
|
+
export const THAW_WRAITH_DROPS = [
|
|
226
|
+
{ itemKind: 'coins', chance: 1, minQty: 600, maxQty: 1000 },
|
|
227
|
+
{ itemKind: 'silver', chance: 0.6, minQty: 1, maxQty: 2 },
|
|
228
|
+
{ itemKind: 'coal', chance: 0.7, minQty: 3, maxQty: 6 },
|
|
229
|
+
{ itemKind: 'ironbar', chance: 0.4, minQty: 1, maxQty: 2 },
|
|
230
|
+
];
|
|
231
|
+
// ---- The east bank's dens (northWilds.ts consumes these) ----------------------------------------------------------------------------
|
|
232
|
+
const wolfDrops = [
|
|
233
|
+
{ itemKind: 'wolfpelt', chance: 0.6, minQty: 1, maxQty: 1 },
|
|
234
|
+
{ itemKind: 'wolffang', chance: 0.25, minQty: 1, maxQty: 1 },
|
|
235
|
+
{ itemKind: 'coins', chance: 0.6, minQty: 40, maxQty: 140 },
|
|
236
|
+
];
|
|
237
|
+
const foxDrops = [
|
|
238
|
+
{ itemKind: 'foxtail', chance: 0.8, minQty: 1, maxQty: 1 },
|
|
239
|
+
{ itemKind: 'foxpelt', chance: 0.35, minQty: 1, maxQty: 1 },
|
|
240
|
+
{ itemKind: 'coins', chance: 0.4, minQty: 20, maxQty: 80 },
|
|
241
|
+
];
|
|
242
|
+
const bearDrops = [
|
|
243
|
+
{ itemKind: 'coins', chance: 1, minQty: 120, maxQty: 320 },
|
|
244
|
+
{ itemKind: 'rawfrostpike', chance: 0.25, minQty: 1, maxQty: 1 },
|
|
245
|
+
];
|
|
246
|
+
const remnantDrops = [
|
|
247
|
+
{ itemKind: 'coins', chance: 1, minQty: 60, maxQty: 220 },
|
|
248
|
+
{ itemKind: 'snare', chance: 0.25, minQty: 1, maxQty: 2 },
|
|
249
|
+
{ itemKind: 'wolfpelt', chance: 0.1, minQty: 1, maxQty: 1 },
|
|
250
|
+
];
|
|
251
|
+
export const THAW_DEN_SITES = [
|
|
252
|
+
{
|
|
253
|
+
id: 'drift-hollow',
|
|
254
|
+
label: 'Drift Hollow',
|
|
255
|
+
town: "the Surveyors' Camp",
|
|
256
|
+
box: THAW_DEN_BOXES.driftHollow,
|
|
257
|
+
stand: { x: 278, z: 158 },
|
|
258
|
+
blurb: 'A snow-filled hollow in the east bank grass where the frost wolves have come down off the Thaw and the foxes run the drifts.',
|
|
259
|
+
groups: [
|
|
260
|
+
{
|
|
261
|
+
kind: 'frostwolf', level: [31, 34], maxHit: 20, healthScale: 1.05, aggro: 6, leashRadius: 14,
|
|
262
|
+
notice: 'A frost wolf comes up out of the hollow, breath smoking!', respawnMs: { minMs: 100_000, maxMs: 160_000 },
|
|
263
|
+
pace: { speed: 1.6, idleChance: 0.45, pause: [2, 6] },
|
|
264
|
+
spots: [{ x: 286, z: 150, leash: 5 }, { x: 295, z: 154, leash: 5 }, { x: 289, z: 162, leash: 5 }, { x: 299, z: 164, leash: 5 }],
|
|
265
|
+
drops: wolfDrops,
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
kind: 'snowfox', level: [30, 32], maxHit: 12, healthScale: 0.8, aggro: 4, leashRadius: 10,
|
|
269
|
+
notice: 'A hollow fox streaks out of the drift at you!', respawnMs: { minMs: 80_000, maxMs: 130_000 },
|
|
270
|
+
pace: { speed: 2.0, idleChance: 0.4, pause: [1, 4] },
|
|
271
|
+
spots: [{ x: 298, z: 150, leash: 5 }, { x: 284, z: 166, leash: 5 }],
|
|
272
|
+
drops: foxDrops,
|
|
273
|
+
},
|
|
274
|
+
],
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: 'meltwater-shelf',
|
|
278
|
+
label: 'Meltwater Shelf',
|
|
279
|
+
town: "the Surveyors' Camp",
|
|
280
|
+
box: THAW_DEN_BOXES.meltwaterShelf,
|
|
281
|
+
stand: { x: 260, z: 194 },
|
|
282
|
+
blurb: 'A wet grey shelf on the east bank where two polar bears have come ashore off the Thaw, nowhere near the Bear Floes.',
|
|
283
|
+
groups: [
|
|
284
|
+
{
|
|
285
|
+
kind: 'polarbear', level: [34, 36], maxHit: 22, healthScale: 1, aggro: 6, leashRadius: 16,
|
|
286
|
+
notice: 'A polar bear rises out of the meltwater and comes for you!', respawnMs: { minMs: 150_000, maxMs: 210_000 },
|
|
287
|
+
pace: { speed: 0.9, idleChance: 0.55, pause: [2, 7] },
|
|
288
|
+
spots: [{ x: 270, z: 190, leash: 7 }, { x: 279, z: 199, leash: 7 }],
|
|
289
|
+
drops: bearDrops,
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
id: 'cairn-scrub',
|
|
295
|
+
label: 'Cairn Scrub',
|
|
296
|
+
town: "the Surveyors' Camp",
|
|
297
|
+
box: THAW_DEN_BOXES.cairnScrub,
|
|
298
|
+
stand: { x: 294, z: 209 },
|
|
299
|
+
blurb: "What is left of someone's road gang, camped in the scrub among the cairns the first survey left: hard men who took the Crown's pay and kept the road.",
|
|
300
|
+
groups: [
|
|
301
|
+
{
|
|
302
|
+
kind: 'hijacker', level: [33, 36], maxHit: 22, healthScale: 1, aggro: 5, leashRadius: 14,
|
|
303
|
+
notice: 'A scrub remnant yells and comes at you from the cairns!', respawnMs: { minMs: 90_000, maxMs: 140_000 },
|
|
304
|
+
pace: { speed: 1, idleChance: 0.6, pause: [2, 6] },
|
|
305
|
+
spots: [{ x: 302, z: 202, leash: 3 }, { x: 310, z: 206, leash: 3 }, { x: 305, z: 214, leash: 3 }, { x: 313, z: 216, leash: 3 }],
|
|
306
|
+
drops: remnantDrops,
|
|
307
|
+
},
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
];
|
|
311
|
+
// ---- Places, labels, guide text -------------------------------------------------------------------------------------------------------
|
|
312
|
+
/** The discovery zones (types expandedContracts.ts INSERTED_DISCOVERY_ZONES): the camp, the ledge, the lip and the three dens. */
|
|
313
|
+
export const THAW_CROSSING_ZONES = [
|
|
314
|
+
{ id: 'thaw-surveyors-camp', label: THAW_CAMP_NAME, box: THAW_CAMP_BOX },
|
|
315
|
+
{ id: 'thaw-rim-ledge', label: THAW_LEDGE_NAME, box: THAW_LEDGE_BOX },
|
|
316
|
+
{ id: 'thaw-east-lip', label: THAW_LIP_NAME, box: THAW_LIP_BOX },
|
|
317
|
+
{ id: 'drift-hollow', label: 'Drift Hollow', box: THAW_DEN_BOXES.driftHollow },
|
|
318
|
+
{ id: 'meltwater-shelf', label: 'Meltwater Shelf', box: THAW_DEN_BOXES.meltwaterShelf },
|
|
319
|
+
{ id: 'cairn-scrub', label: 'Cairn Scrub', box: THAW_DEN_BOXES.cairnScrub },
|
|
320
|
+
];
|
|
321
|
+
export const THAW_CROSSING_ZONE_IDS = THAW_CROSSING_ZONES.map((z) => z.id);
|
|
322
|
+
export const THAW_CROSSING_DISCOVERY_ZONES = THAW_CROSSING_ZONES.map((z) => ({ id: z.id, label: z.label, coordinateFrame: 'world', ...z.box }));
|
|
323
|
+
/** The paper-map labels (three: the dens take theirs from their zones). */
|
|
324
|
+
export const THAW_MAP_LABELS = [
|
|
325
|
+
{ x: 224, z: 135, label: THAW_CAMP_NAME },
|
|
326
|
+
{ x: 233, z: 160, label: THAW_LEDGE_NAME },
|
|
327
|
+
{ x: 252, z: 99, label: 'East Lip' },
|
|
328
|
+
];
|
|
329
|
+
export const THAW_PLACE_TEXT = "Thaw Crossing is the Thaw Gorge's two banks. The Surveyors' Camp stands on the west bank, a short walk south of the Thaw Bridge, beside the Frozen road: a cook, a Bounty Board, a forge and the survey's people. The Rim Ledge runs south from it along the west rim to the second span. The east bank beyond the first span (Woodwork 30 to mend it) holds the Thaw Fall's east lip, where the Thaw Wraith rises, and three dens: Drift Hollow, Meltwater Shelf and Cairn Scrub.";
|
|
330
|
+
//# sourceMappingURL=thawCrossing.js.map
|