@dreadwood-types/types 0.1.363 → 0.1.365

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/attackableNpcs.d.ts.map +1 -1
  2. package/dist/attackableNpcs.js +2 -0
  3. package/dist/attackableNpcs.js.map +1 -1
  4. package/dist/blacksmithing.d.ts.map +1 -1
  5. package/dist/blacksmithing.js +4 -0
  6. package/dist/blacksmithing.js.map +1 -1
  7. package/dist/bossSignatures.d.ts +1 -1
  8. package/dist/bossSignatures.d.ts.map +1 -1
  9. package/dist/bossSignatures.js +6 -0
  10. package/dist/bossSignatures.js.map +1 -1
  11. package/dist/campKitchens.d.ts.map +1 -1
  12. package/dist/campKitchens.js +5 -0
  13. package/dist/campKitchens.js.map +1 -1
  14. package/dist/campTraders.d.ts.map +1 -1
  15. package/dist/campTraders.js +13 -0
  16. package/dist/campTraders.js.map +1 -1
  17. package/dist/constants.d.ts +2 -0
  18. package/dist/constants.d.ts.map +1 -1
  19. package/dist/constants.js.map +1 -1
  20. package/dist/expandedContracts.d.ts.map +1 -1
  21. package/dist/expandedContracts.js +2 -1
  22. package/dist/expandedContracts.js.map +1 -1
  23. package/dist/fishingReaches.d.ts.map +1 -1
  24. package/dist/fishingReaches.js +9 -0
  25. package/dist/fishingReaches.js.map +1 -1
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +7 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/legacy.d.ts +4 -0
  31. package/dist/legacy.d.ts.map +1 -1
  32. package/dist/legacy.js +4 -0
  33. package/dist/legacy.js.map +1 -1
  34. package/dist/marksmenRange.d.ts +219 -0
  35. package/dist/marksmenRange.d.ts.map +1 -0
  36. package/dist/marksmenRange.js +280 -0
  37. package/dist/marksmenRange.js.map +1 -0
  38. package/dist/quests.d.ts.map +1 -1
  39. package/dist/quests.js +41 -0
  40. package/dist/quests.js.map +1 -1
  41. package/dist/saltgrassDens.d.ts +110 -0
  42. package/dist/saltgrassDens.d.ts.map +1 -0
  43. package/dist/saltgrassDens.js +170 -0
  44. package/dist/saltgrassDens.js.map +1 -0
  45. package/dist/saltgrassDowns.d.ts +295 -0
  46. package/dist/saltgrassDowns.d.ts.map +1 -0
  47. package/dist/saltgrassDowns.js +304 -0
  48. package/dist/saltgrassDowns.js.map +1 -0
  49. package/dist/saltgrassDrove.d.ts +111 -0
  50. package/dist/saltgrassDrove.d.ts.map +1 -0
  51. package/dist/saltgrassDrove.js +97 -0
  52. package/dist/saltgrassDrove.js.map +1 -0
  53. package/dist/saltgrassQuestDef.d.ts +35 -0
  54. package/dist/saltgrassQuestDef.d.ts.map +1 -0
  55. package/dist/saltgrassQuestDef.js +252 -0
  56. package/dist/saltgrassQuestDef.js.map +1 -0
  57. package/dist/storyQuests.d.ts +3 -1
  58. package/dist/storyQuests.d.ts.map +1 -1
  59. package/dist/storyQuests.js +25 -0
  60. package/dist/storyQuests.js.map +1 -1
  61. package/dist/timberErrands.d.ts +33 -0
  62. package/dist/timberErrands.d.ts.map +1 -0
  63. package/dist/timberErrands.js +192 -0
  64. package/dist/timberErrands.js.map +1 -0
  65. package/dist/timberGoods.d.ts +43 -0
  66. package/dist/timberGoods.d.ts.map +1 -0
  67. package/dist/timberGoods.js +58 -0
  68. package/dist/timberGoods.js.map +1 -0
  69. package/dist/woodwork.d.ts.map +1 -1
  70. package/dist/woodwork.js +11 -0
  71. package/dist/woodwork.js.map +1 -1
  72. package/package.json +2 -2
@@ -0,0 +1,295 @@
1
+ /**
2
+ * SALTGRASS DOWNS (2026-10-18; plan `.cursor/task-plans/2026-10-18-saltgrass-downs-build.md`; built from the filed sheets `saltgrass-downs-1..7`
3
+ * in the backend's design-references, whose prompt and brief are in `.cursor/task-plans/2026-10-18-sheets-1-40-empty-land/saltgrass-downs/`).
4
+ * The open sheep country east of Riversend Halt, for levels 14-24: a wide, friendly-then-dangerous pasture on the Western land's bare grass, running
5
+ * east to the sea. It had no content at all (COVERAGE_1_40.md 5.2: "the empty land").
6
+ *
7
+ * THE WAY IN (no gate of its own): Riversend's river bends south-west at its east side, so the grass on its east bank is the same ground as the
8
+ * Brindlecross road's south bank. The DROVE LANE leaves the North Road just south of Riversend's old bridge, runs east along the river's south bank, up the
9
+ * strip between the river and Lantern Wake's west ridge, and arrives at the Riversend Fold on the Downs' west edge. The only gate between Hope Beach and
10
+ * the Downs is the one every Western place already has (the Brindle Road pass, Combat 10). Lantern Wake's north ridge (z 950-954) stays solid: the
11
+ * sheet drew a barrier gate to Lantern Wake on the south edge, built here as a CLOSED gate (scenery and a sign), never a way through, so the Brindle
12
+ * Road pass stays the only door to the Western land.
13
+ *
14
+ * THE LAYOUT (box x 1936-2175, z 770-949; every number is a WORLD tile, x east, z south, and a PLACEHOLDER for the balance pass):
15
+ * - the RIVERSEND FOLD (x 1938-1962, z 896-914): a fenced fold on the east bank across the river from Riversend's mill, with the Count Board. Where a drove ends;
16
+ * - DROVERS' REST (x 1994-2036, z 890-928): the safe camp on a low rise: a long sheepfold, a bothy, a cookhouse (the cook BUYS what players cook), a Bounty
17
+ * Board, stores, a signal post, a wool buyer's counter and the sheep wash pool south of it. There is NO bank (banking is earned: towns only);
18
+ * - the HIGH PASTURE PENS (x 1996-2048, z 816-838): three hurdle pens with a gate each, where a drove begins; Shepherd Tilly and her dog Biscuit;
19
+ * - the DROVE ROAD (milestone posts 1 to 6) from the pens east to the shore and back west along the south to the fold;
20
+ * - WOLF COUNTRY (x 2096-2146, z 798-852) and GREYBACK'S DEN on its stony knoll (x 2062-2092, z 796-826); the GORSE WARREN, the RUSTLERS' CAMP and the shore flats;
21
+ * - the LOOKOUT MOUND (x 2052-2068, z 872-888) with a beacon basket, the SALT PANS on the shore (Foraging 9 raking: the game's own `saltpan` patches) and the
22
+ * EASTSHORE pegs (a fishing reach, tide snapper from Fishing 14).
23
+ *
24
+ * THE MECHANIC reuses three things the game already has: Hog Wild's pet that follows you and Nye's led ewe (a drove is six of them, behind you), the
25
+ * Brindlecross sheep fold (the destination), and the Timber Convoy's server-driven tame creatures and ambush wolves. See saltgrassDrove.ts.
26
+ *
27
+ * The models are the kit's own as stand-ins (backend upgrades rows `saltgrass-*`). Nothing 41+ is built.
28
+ */
29
+ import type { LanternWakeBox, LanternWakePoint } from './lanternWake.js';
30
+ import type { DiscoveryZone } from './landmarks.js';
31
+ export declare const SALTGRASS_ID = "saltgrass-downs";
32
+ export declare const SALTGRASS_NAME = "Saltgrass Downs";
33
+ export declare const SALTGRASS_LEVELS: {
34
+ readonly min: 14;
35
+ readonly max: 24;
36
+ };
37
+ /** The whole place. The plan's box started at x 1950; it begins at Riversend's east edge so the fold and the lane's last stretch are inside it. */
38
+ export declare const SALTGRASS_BOX: LanternWakeBox;
39
+ export declare function inSaltgrassBoxOf(b: LanternWakeBox, x: number, z: number, pad?: number): boolean;
40
+ export declare const inSaltgrassBox: (x: number, z: number, pad?: number) => boolean;
41
+ /** Drovers' Rest: the safe camp on a low rise (the ground is flat grass; the camp is trodden earth). */
42
+ export declare const SALTGRASS_CAMP_BOX: LanternWakeBox;
43
+ /** The fold at Riversend: where a drove ends (fenced, the Count Board east of its gate). */
44
+ export declare const SALTGRASS_FOLD_BOX: LanternWakeBox;
45
+ /** The fold's zone, a little wider than its fence so the queue at the gate is in it. */
46
+ export declare const SALTGRASS_FOLD_ZONE_BOX: LanternWakeBox;
47
+ export declare const SALTGRASS_FOLD_GATE: {
48
+ readonly x: 1954;
49
+ readonly minZ: 904;
50
+ readonly maxZ: 906;
51
+ };
52
+ /** The camp's own long sheepfold (scenery and a safe place to see the flock). */
53
+ export declare const SALTGRASS_CAMP_FOLD_BOX: LanternWakeBox;
54
+ export declare const SALTGRASS_CAMP_FOLD_GATE: {
55
+ readonly minX: 2003;
56
+ readonly maxX: 2005;
57
+ readonly z: 915;
58
+ };
59
+ /** The three high pasture pens (hurdle fences, the gate gap on each pen's south side, a gate post in the middle of each gap). */
60
+ export type SaltgrassPen = {
61
+ readonly id: 'one' | 'two' | 'three';
62
+ readonly box: LanternWakeBox;
63
+ readonly gateMinX: number;
64
+ readonly gateMaxX: number;
65
+ readonly gateZ: number;
66
+ readonly sheep: ReadonlyArray<readonly [number, number]>;
67
+ };
68
+ export declare const SALTGRASS_PENS: readonly SaltgrassPen[];
69
+ export declare const SALTGRASS_PENS_BOX: LanternWakeBox;
70
+ /** The drystone wall maze: three E-W runs in the meadow north-west of the camp, gaps alternating west and east. */
71
+ export declare const SALTGRASS_MEADOW_BOX: LanternWakeBox;
72
+ export declare const SALTGRASS_WALL_RUNS: ReadonlyArray<{
73
+ readonly id: string;
74
+ readonly z: number;
75
+ readonly minX: number;
76
+ readonly maxX: number;
77
+ readonly gapMinX: number;
78
+ readonly gapMaxX: number;
79
+ }>;
80
+ /** The lookout mound: concentric steps up to the beacon basket (the flat ground is height 3; the top is 6). */
81
+ export declare const SALTGRASS_LOOKOUT: {
82
+ readonly cx: 2060;
83
+ readonly cz: 880;
84
+ readonly radius: 6;
85
+ readonly top: 6;
86
+ };
87
+ export declare const SALTGRASS_LOOKOUT_BOX: LanternWakeBox;
88
+ export declare function lookoutHeight(x: number, z: number): number | null;
89
+ /** The salt pans on the shore: three shallow beds on a sand apron, raked from their rims (the game's `saltpan` forage patch). */
90
+ export declare const SALTGRASS_PANS_BOX: LanternWakeBox;
91
+ export declare const SALTGRASS_PAN_BEDS: readonly LanternWakeBox[];
92
+ /** The pans' rims, where the crust is raked (forage patches, Foraging 9), and the shell banks on the sand below them. */
93
+ export declare const SALTGRASS_SALT_PATCHES: ReadonlyArray<readonly [number, number]>;
94
+ export declare const SALTGRASS_SHELL_PATCHES: ReadonlyArray<readonly [number, number]>;
95
+ /** The eastshore: the sand strip and the three timber pegs of the fishing reach (fishingReaches.ts `saltgrass-eastshore`, tide snapper from Fishing 14). */
96
+ export declare const SALTGRASS_EASTSHORE_BOX: LanternWakeBox;
97
+ /** The sheep wash pool: a small pond with a sand rim south of the camp (scenery; sheep are washed in it, Hob says). */
98
+ export declare const SALTGRASS_WASH_POOL: {
99
+ readonly cx: 2048;
100
+ readonly cz: 941;
101
+ readonly radius: 3;
102
+ };
103
+ export declare function inWashPool(x: number, z: number): boolean;
104
+ /** The closed barrier gate in the south ridge: Lantern Wake's north ridge (z 950-954) is solid, so this is a gate that does not open (scenery and a sign). */
105
+ export declare const SALTGRASS_RIDGE_GATE: {
106
+ readonly x: 2062;
107
+ readonly z: 947;
108
+ };
109
+ /** The roads (world polylines, width in tiles), laid as Path. The lane starts on the North Road, just south of Riversend's old bridge. */
110
+ export declare const SALTGRASS_PATHS: ReadonlyArray<{
111
+ id: string;
112
+ w: number;
113
+ pts: readonly LanternWakePoint[];
114
+ }>;
115
+ /** One thing laid on the ground: the kit's own kinds and styles, placed by the backend's ground placer. */
116
+ export type SaltgrassProp = {
117
+ readonly id: string;
118
+ readonly kind: 'dreadmodel' | 'dreadprop' | 'campfire' | 'barrel' | 'bountyboard' | 'stove' | 'signpost';
119
+ readonly style: string;
120
+ readonly x: number;
121
+ readonly z: number;
122
+ readonly scale?: number;
123
+ };
124
+ /** The camp's pieces and working stations: a cook's stove and fire, a Bounty Board, stores, a signal post and the long sheepfold's furniture. No bank. */
125
+ export declare const SALTGRASS_CAMP_PIECES: readonly SaltgrassProp[];
126
+ /** A ring of hurdle posts round a box (every tile of its perimeter but the gap), `townfencebit1x1` each. The gap may be on any side. */
127
+ export declare function saltgrassFenceRing(prefix: string, b: LanternWakeBox, gap: {
128
+ minX: number;
129
+ maxX: number;
130
+ minZ: number;
131
+ maxZ: number;
132
+ }): SaltgrassProp[];
133
+ /** Every fence of the place: the camp fold, the three pens and the fold at Riversend. */
134
+ export declare function saltgrassFences(): readonly SaltgrassProp[];
135
+ /** The pens', fold's and wall maze's furniture: hay, troughs, lamps and the drystone runs (a run is 3-wide pieces, none in its gap). */
136
+ export declare const SALTGRASS_FIELD_PIECES: readonly SaltgrassProp[];
137
+ /** The salt pans' rakes and net racks and the pegs' tackle (decor): the rake rack beside each bed. */
138
+ export declare const SALTGRASS_SHORE_PIECES: readonly SaltgrassProp[];
139
+ /** The signs (the placard signpost). One at each milestone of the drove road. */
140
+ export declare const SALTGRASS_SIGNS: ReadonlyArray<{
141
+ readonly id: string;
142
+ readonly x: number;
143
+ readonly z: number;
144
+ readonly text: string;
145
+ }>;
146
+ export type SaltgrassFolk = {
147
+ readonly id: string;
148
+ readonly name: string;
149
+ readonly place: string;
150
+ readonly x: number;
151
+ readonly z: number;
152
+ readonly faceX: number;
153
+ readonly faceZ: number;
154
+ readonly leash: number;
155
+ readonly speak: string;
156
+ readonly extras?: ReadonlyArray<{
157
+ readonly id: string;
158
+ readonly label: string;
159
+ readonly say: string;
160
+ }>;
161
+ /** A counter of their own (the wool buyer's): existing goods only, never food. */
162
+ readonly shop?: {
163
+ readonly title: string;
164
+ readonly stock: ReadonlyArray<{
165
+ readonly kind: string;
166
+ readonly price: number;
167
+ }>;
168
+ readonly buys: Readonly<Record<string, number>>;
169
+ };
170
+ };
171
+ export declare const SALTGRASS_FOLK_NAMES: {
172
+ readonly drover: "Head Drover Hob Marlowe";
173
+ readonly shepherd: "Shepherd Tilly Ashworth";
174
+ readonly steward: "Bounty Steward Cass Roper";
175
+ readonly lookout: "Lookout Jem Harker";
176
+ readonly woolbuyer: "Wool-Buyer Hester Whitlock";
177
+ };
178
+ /** The cook is a counter in campTraders.ts (she BUYS what players cook and sells no food). */
179
+ export declare const SALTGRASS_COOK_NAME = "Cook Dilys Ferris";
180
+ export declare const SALTGRASS_DOG_NAME = "Biscuit";
181
+ /** The five residents (named residents on the default look, stationary), the wool buyer with a counter of her own. */
182
+ export declare const SALTGRASS_FOLK: ReadonlyArray<SaltgrassFolk>;
183
+ export declare function saltgrassFolkByName(name: string | null | undefined): SaltgrassFolk | null;
184
+ /** The camp cook, which lives in CAMP_TRADERS (campTraders.ts) beside the other camps' cooks. */
185
+ export declare const SALTGRASS_COOK: {
186
+ readonly id: "camp-saltgrass";
187
+ readonly name: "Cook Dilys Ferris";
188
+ readonly x: 2006;
189
+ readonly z: 907;
190
+ readonly faceX: 2008;
191
+ readonly faceZ: 904;
192
+ };
193
+ /** Tilly's collie: a sheepdog (an existing kind), not a fight, standing by her. */
194
+ export declare const SALTGRASS_DOG: {
195
+ readonly id: "sg-biscuit";
196
+ readonly name: "Biscuit";
197
+ readonly x: 2014;
198
+ readonly z: 838;
199
+ };
200
+ export declare const SG_PROP: {
201
+ readonly pen: "sgpen";
202
+ readonly board: "sgboard";
203
+ readonly fleece: "sgfleece";
204
+ readonly cut: "sgcut";
205
+ readonly beacon: "sgbeacon";
206
+ };
207
+ export type SgQuestProp = {
208
+ readonly id: string;
209
+ readonly x: number;
210
+ readonly z: number;
211
+ readonly style: string;
212
+ };
213
+ /** The three pen gates (a click opens the pen and gathers a flock) and the Count Board at the Riversend Fold (a click tallies a flock that has arrived). */
214
+ export declare const SG_PEN_ONE: SgQuestProp;
215
+ export declare const SG_PEN_TWO: SgQuestProp;
216
+ export declare const SG_PEN_THREE: SgQuestProp;
217
+ export declare const SG_COUNT_BOARD: SgQuestProp;
218
+ /** Torn fleece at the wolves' kills, along the wolf country's southern edge (Fleece and Fang). */
219
+ export declare const SG_FLEECE_ONE: SgQuestProp;
220
+ export declare const SG_FLEECE_TWO: SgQuestProp;
221
+ export declare const SG_FLEECE_THREE: SgQuestProp;
222
+ /** Cut hurdles at the edge of the rustlers' camp (The Rustlers' Cut). */
223
+ export declare const SG_CUT_ONE: SgQuestProp;
224
+ export declare const SG_CUT_TWO: SgQuestProp;
225
+ export declare const SG_CUT_THREE: SgQuestProp;
226
+ /** The lookout's beacon basket (Greyback). */
227
+ export declare const SG_BEACON: SgQuestProp;
228
+ export declare const SALTGRASS_QUEST_PROPS: readonly SgQuestProp[];
229
+ export declare const SALTGRASS_QUEST_PROP_NAMES: Readonly<Record<string, string>>;
230
+ /** The model a Saltgrass quest prop draws with (frontend quest-prop models that already exist), or null if not one of them. */
231
+ export declare function saltgrassPropModel(prop: string): string | null;
232
+ /** Standable tiles for teleports, smokes and the helper. */
233
+ export declare const SALTGRASS_STANDS: {
234
+ readonly lane: {
235
+ readonly x: 1930;
236
+ readonly z: 985;
237
+ };
238
+ readonly fold: {
239
+ readonly x: 1957;
240
+ readonly z: 908;
241
+ };
242
+ readonly camp: {
243
+ readonly x: 2016;
244
+ readonly z: 917;
245
+ };
246
+ readonly pens: {
247
+ readonly x: 2015;
248
+ readonly z: 845;
249
+ };
250
+ readonly milestone3: {
251
+ readonly x: 2106;
252
+ readonly z: 880;
253
+ };
254
+ readonly wolves: {
255
+ readonly x: 2092;
256
+ readonly z: 860;
257
+ };
258
+ readonly den: {
259
+ readonly x: 2077;
260
+ readonly z: 830;
261
+ };
262
+ readonly warren: {
263
+ readonly x: 2088;
264
+ readonly z: 880;
265
+ };
266
+ readonly rustlers: {
267
+ readonly x: 2100;
268
+ readonly z: 925;
269
+ };
270
+ readonly pans: {
271
+ readonly x: 2129;
272
+ readonly z: 872;
273
+ };
274
+ readonly shore: {
275
+ readonly x: 2148;
276
+ readonly z: 908;
277
+ };
278
+ readonly lookout: {
279
+ readonly x: 2056;
280
+ readonly z: 892;
281
+ };
282
+ readonly wash: {
283
+ readonly x: 2048;
284
+ readonly z: 930;
285
+ };
286
+ readonly ridge: {
287
+ readonly x: 2062;
288
+ readonly z: 943;
289
+ };
290
+ };
291
+ /** What the guide, the verify links and the quest helper say about the place. */
292
+ export declare const SALTGRASS_PLACE_TEXT = "Saltgrass Downs is the open sheep country east of Riversend Halt, for levels 14 to 24, reached on foot from the North Road just south of Riversend's old bridge by the Drove Lane along the river's south bank: the Riversend Fold on its west edge, Drovers' Rest (a cookhouse, a Bounty Board, stores and a wool buyer) on a low rise, three hurdle pens on the high pasture, a wolf country with a den on a stony knoll, the salt pans and the eastshore pegs on the sea. Six people work it. There is no bank on the Downs.";
293
+ export declare const SALTGRASS_CAMP_DISCOVERY_ZONE: DiscoveryZone;
294
+ export declare const SALTGRASS_UMBRELLA_DISCOVERY_ZONE: DiscoveryZone;
295
+ //# sourceMappingURL=saltgrassDowns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saltgrassDowns.d.ts","sourceRoot":"","sources":["../src/saltgrassDowns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,304 @@
1
+ import { SHEARS_KIND, SHEARS_PRICE, WOOL_KIND } from './pasture.js';
2
+ export const SALTGRASS_ID = 'saltgrass-downs';
3
+ export const SALTGRASS_NAME = 'Saltgrass Downs';
4
+ export const SALTGRASS_LEVELS = { min: 14, max: 24 };
5
+ /** The whole place. The plan's box started at x 1950; it begins at Riversend's east edge so the fold and the lane's last stretch are inside it. */
6
+ export const SALTGRASS_BOX = { minX: 1936, maxX: 2175, minZ: 770, maxZ: 949 };
7
+ export function inSaltgrassBoxOf(b, x, z, pad = 0) {
8
+ return x >= b.minX - pad && x <= b.maxX + pad && z >= b.minZ - pad && z <= b.maxZ + pad;
9
+ }
10
+ export const inSaltgrassBox = (x, z, pad = 0) => inSaltgrassBoxOf(SALTGRASS_BOX, x, z, pad);
11
+ // ---- Places ----------------------------------------------------------------------------------------------------------------------------
12
+ /** Drovers' Rest: the safe camp on a low rise (the ground is flat grass; the camp is trodden earth). */
13
+ export const SALTGRASS_CAMP_BOX = { minX: 1994, maxX: 2036, minZ: 890, maxZ: 928 };
14
+ /** The fold at Riversend: where a drove ends (fenced, the Count Board east of its gate). */
15
+ export const SALTGRASS_FOLD_BOX = { minX: 1940, maxX: 1954, minZ: 898, maxZ: 912 };
16
+ /** The fold's zone, a little wider than its fence so the queue at the gate is in it. */
17
+ export const SALTGRASS_FOLD_ZONE_BOX = { minX: 1938, maxX: 1962, minZ: 896, maxZ: 914 };
18
+ export const SALTGRASS_FOLD_GATE = { x: 1954, minZ: 904, maxZ: 906 };
19
+ /** The camp's own long sheepfold (scenery and a safe place to see the flock). */
20
+ export const SALTGRASS_CAMP_FOLD_BOX = { minX: 1996, maxX: 2012, minZ: 915, maxZ: 926 };
21
+ export const SALTGRASS_CAMP_FOLD_GATE = { minX: 2003, maxX: 2005, z: 915 };
22
+ export const SALTGRASS_PENS = [
23
+ { id: 'one', box: { minX: 1998, maxX: 2009, minZ: 822, maxZ: 832 }, gateMinX: 2003, gateMaxX: 2005, gateZ: 832, sheep: [[2001, 826], [2005, 825], [2007, 829]] },
24
+ { id: 'two', box: { minX: 2016, maxX: 2027, minZ: 818, maxZ: 828 }, gateMinX: 2021, gateMaxX: 2023, gateZ: 828, sheep: [[2019, 822], [2023, 821], [2025, 825]] },
25
+ { id: 'three', box: { minX: 2034, maxX: 2045, minZ: 824, maxZ: 834 }, gateMinX: 2039, gateMaxX: 2041, gateZ: 834, sheep: [[2037, 828], [2041, 827], [2043, 831]] },
26
+ ];
27
+ export const SALTGRASS_PENS_BOX = { minX: 1996, maxX: 2048, minZ: 816, maxZ: 838 };
28
+ /** The drystone wall maze: three E-W runs in the meadow north-west of the camp, gaps alternating west and east. */
29
+ export const SALTGRASS_MEADOW_BOX = { minX: 1960, maxX: 1994, minZ: 852, maxZ: 886 };
30
+ export const SALTGRASS_WALL_RUNS = [
31
+ { id: 'wall-a', z: 860, minX: 1962, maxX: 1992, gapMinX: 1962, gapMaxX: 1967 },
32
+ { id: 'wall-b', z: 868, minX: 1962, maxX: 1992, gapMinX: 1987, gapMaxX: 1992 },
33
+ { id: 'wall-c', z: 876, minX: 1962, maxX: 1992, gapMinX: 1962, gapMaxX: 1967 },
34
+ ];
35
+ /** The lookout mound: concentric steps up to the beacon basket (the flat ground is height 3; the top is 6). */
36
+ export const SALTGRASS_LOOKOUT = { cx: 2060, cz: 880, radius: 6, top: 6 };
37
+ export const SALTGRASS_LOOKOUT_BOX = { minX: 2052, maxX: 2068, minZ: 872, maxZ: 888 };
38
+ export function lookoutHeight(x, z) {
39
+ const d = Math.hypot(x - SALTGRASS_LOOKOUT.cx, z - SALTGRASS_LOOKOUT.cz);
40
+ if (d > SALTGRASS_LOOKOUT.radius)
41
+ return null;
42
+ if (d <= 2)
43
+ return SALTGRASS_LOOKOUT.top;
44
+ if (d <= 4)
45
+ return SALTGRASS_LOOKOUT.top - 1;
46
+ return SALTGRASS_LOOKOUT.top - 2;
47
+ }
48
+ /** The salt pans on the shore: three shallow beds on a sand apron, raked from their rims (the game's `saltpan` forage patch). */
49
+ export const SALTGRASS_PANS_BOX = { minX: 2124, maxX: 2152, minZ: 868, maxZ: 896 };
50
+ export const SALTGRASS_PAN_BEDS = [
51
+ { minX: 2130, maxX: 2137, minZ: 874, maxZ: 878 },
52
+ { minX: 2141, maxX: 2148, minZ: 874, maxZ: 878 },
53
+ { minX: 2130, maxX: 2137, minZ: 884, maxZ: 888 },
54
+ ];
55
+ /** The pans' rims, where the crust is raked (forage patches, Foraging 9), and the shell banks on the sand below them. */
56
+ export const SALTGRASS_SALT_PATCHES = [[2133, 880], [2144, 880], [2133, 890], [2139, 872]];
57
+ export const SALTGRASS_SHELL_PATCHES = [[2154, 886], [2155, 898], [2156, 920]];
58
+ /** The eastshore: the sand strip and the three timber pegs of the fishing reach (fishingReaches.ts `saltgrass-eastshore`, tide snapper from Fishing 14). */
59
+ export const SALTGRASS_EASTSHORE_BOX = { minX: 2146, maxX: 2164, minZ: 900, maxZ: 930 };
60
+ /** The sheep wash pool: a small pond with a sand rim south of the camp (scenery; sheep are washed in it, Hob says). */
61
+ export const SALTGRASS_WASH_POOL = { cx: 2048, cz: 941, radius: 3 };
62
+ export function inWashPool(x, z) {
63
+ return Math.hypot(x - SALTGRASS_WASH_POOL.cx, z - SALTGRASS_WASH_POOL.cz) <= SALTGRASS_WASH_POOL.radius;
64
+ }
65
+ /** The closed barrier gate in the south ridge: Lantern Wake's north ridge (z 950-954) is solid, so this is a gate that does not open (scenery and a sign). */
66
+ export const SALTGRASS_RIDGE_GATE = { x: 2062, z: 947 };
67
+ /** The roads (world polylines, width in tiles), laid as Path. The lane starts on the North Road, just south of Riversend's old bridge. */
68
+ export const SALTGRASS_PATHS = [
69
+ { id: 'drove-lane', w: 3, pts: [[1873, 1018], [1900, 1016], [1922, 1008], [1930, 990], [1932, 965], [1940, 940], [1950, 920], [1957, 906]] },
70
+ { id: 'drove-road-out', w: 3, pts: [[2021, 840], [2036, 848], [2052, 846], [2068, 856], [2086, 862], [2096, 872], [2108, 874], [2124, 884], [2134, 898]] },
71
+ { id: 'drove-road-back', w: 3, pts: [[2134, 898], [2128, 912], [2112, 920], [2090, 924], [2070, 930], [2044, 932], [2020, 934], [1994, 934], [1978, 926], [1964, 914], [1957, 906]] },
72
+ { id: 'camp-spur', w: 2, pts: [[2020, 934], [2020, 926], [2016, 916]] },
73
+ { id: 'pens-lane', w: 2, pts: [[2004, 834], [2004, 842], [2021, 842]] },
74
+ { id: 'shore-lane', w: 2, pts: [[2128, 912], [2142, 912], [2154, 910]] },
75
+ { id: 'lookout-lane', w: 2, pts: [[2070, 930], [2064, 906], [2060, 888]] },
76
+ ];
77
+ const kit = (id, model, x, z, facing = 's', scale) => ({ id, kind: 'dreadmodel', style: `${model}-${facing}`, x, z, ...(scale ? { scale } : {}) });
78
+ const lamp = (id, x, z) => kit(id, 'townlantern1x1', x, z);
79
+ /** The camp's pieces and working stations: a cook's stove and fire, a Bounty Board, stores, a signal post and the long sheepfold's furniture. No bank. */
80
+ export const SALTGRASS_CAMP_PIECES = [
81
+ kit('sg-cookhouse', 'towncookhouse5x3', 2008, 897),
82
+ kit('sg-bothy', 'millcottage', 2027, 899),
83
+ { id: 'sg-stove', kind: 'stove', style: '', x: 2008, z: 904 },
84
+ { id: 'sg-fire', kind: 'campfire', style: 'beach-pit', x: 2015, z: 913, scale: 1 },
85
+ { id: 'sg-board', kind: 'bountyboard', style: 'wall-s', x: 2020, z: 909 },
86
+ kit('sg-crates', 'hbcrates', 2030, 905),
87
+ kit('sg-sacks', 'hubsack', 2032, 903),
88
+ kit('sg-cratestack', 'evcratestack', 2031, 911),
89
+ kit('sg-hay-1', 'hbhaybales', 1999, 904),
90
+ kit('sg-hay-2', 'hbhaybales', 1999, 909),
91
+ kit('sg-well', 'townwell1x1', 2020, 921),
92
+ kit('sg-post', 'townwaypost1x1', 2034, 907),
93
+ kit('sg-brazier', 'evwatchbrazierlit', 2034, 903),
94
+ kit('sg-trough', 'sheeptrough', 2004, 922),
95
+ lamp('sg-lamp-nw', 1997, 894),
96
+ lamp('sg-lamp-ne', 2033, 893),
97
+ lamp('sg-lamp-se', 2033, 926),
98
+ lamp('sg-lamp-w', 1997, 912),
99
+ ];
100
+ /** A ring of hurdle posts round a box (every tile of its perimeter but the gap), `townfencebit1x1` each. The gap may be on any side. */
101
+ export function saltgrassFenceRing(prefix, b, gap) {
102
+ const out = [];
103
+ for (let z = b.minZ; z <= b.maxZ; z++) {
104
+ for (let x = b.minX; x <= b.maxX; x++) {
105
+ if (x !== b.minX && x !== b.maxX && z !== b.minZ && z !== b.maxZ)
106
+ continue;
107
+ if (x >= gap.minX && x <= gap.maxX && z >= gap.minZ && z <= gap.maxZ)
108
+ continue;
109
+ out.push(kit(`${prefix}-${x}-${z}`, 'townfencebit1x1', x, z));
110
+ }
111
+ }
112
+ return out;
113
+ }
114
+ /** Every fence of the place: the camp fold, the three pens and the fold at Riversend. */
115
+ export function saltgrassFences() {
116
+ return [
117
+ ...saltgrassFenceRing('sg-cfold', SALTGRASS_CAMP_FOLD_BOX, { minX: SALTGRASS_CAMP_FOLD_GATE.minX, maxX: SALTGRASS_CAMP_FOLD_GATE.maxX, minZ: SALTGRASS_CAMP_FOLD_GATE.z, maxZ: SALTGRASS_CAMP_FOLD_GATE.z }),
118
+ ...SALTGRASS_PENS.flatMap((p) => saltgrassFenceRing(`sg-pen-${p.id}`, p.box, { minX: p.gateMinX, maxX: p.gateMaxX, minZ: p.gateZ, maxZ: p.gateZ })),
119
+ ...saltgrassFenceRing('sg-rfold', SALTGRASS_FOLD_BOX, { minX: SALTGRASS_FOLD_GATE.x, maxX: SALTGRASS_FOLD_GATE.x, minZ: SALTGRASS_FOLD_GATE.minZ, maxZ: SALTGRASS_FOLD_GATE.maxZ }),
120
+ ];
121
+ }
122
+ /** The pens', fold's and wall maze's furniture: hay, troughs, lamps and the drystone runs (a run is 3-wide pieces, none in its gap). */
123
+ export const SALTGRASS_FIELD_PIECES = [
124
+ kit('sg-pen-hay-1', 'hbhaybales', 2000, 824),
125
+ kit('sg-pen-hay-2', 'hbhaybales', 2036, 826),
126
+ kit('sg-pen-trough', 'sheeptrough', 2021, 820),
127
+ kit('sg-rfold-hay', 'hbhaybales', 1943, 901),
128
+ kit('sg-rfold-trough', 'sheeptrough', 1946, 909),
129
+ lamp('sg-rfold-lamp-n', 1957, 899),
130
+ lamp('sg-rfold-lamp-s', 1957, 911),
131
+ ...SALTGRASS_WALL_RUNS.flatMap((r) => {
132
+ const out = [];
133
+ for (let x = r.minX + 1; x <= r.maxX - 1; x += 3) {
134
+ if (x + 1 >= r.gapMinX && x - 1 <= r.gapMaxX)
135
+ continue;
136
+ out.push(kit(`sg-${r.id}-${x}`, 'dhrockwall', x, r.z));
137
+ }
138
+ return out;
139
+ }),
140
+ ];
141
+ /** The salt pans' rakes and net racks and the pegs' tackle (decor): the rake rack beside each bed. */
142
+ export const SALTGRASS_SHORE_PIECES = [
143
+ kit('sg-rake-1', 'toolrack', 2128, 876),
144
+ kit('sg-rake-2', 'toolrack', 2150, 876),
145
+ kit('sg-rake-3', 'toolrack', 2128, 886),
146
+ kit('sg-netrack', 'fishingnetrack', 2152, 912),
147
+ kit('sg-lookout-brazier', 'evwatchbrazierlit', 2057, 884),
148
+ { id: 'sg-ridge-gate', kind: 'dreadmodel', style: 'townfencegate5x1-s', x: SALTGRASS_RIDGE_GATE.x, z: SALTGRASS_RIDGE_GATE.z },
149
+ ];
150
+ /** The signs (the placard signpost). One at each milestone of the drove road. */
151
+ export const SALTGRASS_SIGNS = [
152
+ { id: 'sg-sign-lane', x: 1932, z: 958, text: 'Saltgrass Downs, east of Riversend Halt: sheep country for levels 14 to 24. Drovers bring flocks down the lane to the Riversend Fold. Wolves and rustlers on the high ground.' },
153
+ { id: 'sg-sign-fold', x: 1959, z: 909, text: 'The Riversend Fold. Bring a flock here and read the Count Board: every sheep that reaches the fold is paid for, every lost one is not.' },
154
+ { id: 'sg-sign-camp', x: 2036, z: 931, text: "Drovers' Rest. A cookhouse, a Bounty Board, stores and a wool buyer. There is no bank on the Downs: banks are in the towns." },
155
+ { id: 'sg-sign-pens', x: 2012, z: 842, text: 'The High Pasture Pens. Open a pen gate and six ewes will follow you. Keep them close on the drove road, and keep wolves off them.' },
156
+ { id: 'sg-sign-m1', x: 2024, z: 844, text: 'Drove road, milestone 1 of 6: the High Pasture Pens. Follow the posts east, then back west along the south.' },
157
+ { id: 'sg-sign-m2', x: 2068, z: 859, text: 'Drove road, milestone 2 of 6. Wolf country lies to the north. Walk at the flock\'s pace: a ewe left too far behind bolts.' },
158
+ { id: 'sg-sign-m3', x: 2106, z: 877, text: 'Drove road, milestone 3 of 6: the gorse edge. Wolves cut in from the gorse here. Stand between them and the flock.' },
159
+ { id: 'sg-sign-m4', x: 2136, z: 901, text: 'Drove road, milestone 4 of 6: the salt pans. Rustlers work this stretch. A rustler who reaches a ewe drives it off.' },
160
+ { id: 'sg-sign-m5', x: 2046, z: 929, text: "Drove road, milestone 5 of 6: Drovers' Rest is just north. The road runs west to the fold." },
161
+ { id: 'sg-sign-m6', x: 1961, z: 904, text: 'Drove road, milestone 6 of 6: the Riversend Fold. Take the flock in through the east gate and read the Count Board.' },
162
+ { id: 'sg-sign-wolves', x: 2092, z: 858, text: "Wolf Country. Greyback's Den lies on the stony knoll to the north-west. A big grey wolf, and a bad one. Combat 20 and over." },
163
+ { id: 'sg-sign-pans', x: 2126, z: 880, text: 'The Salt Pans. Rake the pan rims for sea salt (Foraging 9). The pans are shallow: keep to the sand.' },
164
+ { id: 'sg-sign-shore', x: 2150, z: 906, text: 'Eastshore. Three timber pegs for tide snapper (Fishing 14, a small rod and crab meat). Shore crabs on the flats to the north.' },
165
+ { id: 'sg-sign-lookout', x: 2062, z: 890, text: "The Lookout Mound. Jem Harker keeps the beacon basket lit when wolves come down off the high ground." },
166
+ { id: 'sg-sign-ridge', x: 2058, z: 945, text: 'The barrier gate. Lantern Wake lies beyond this ridge, but the rockfall behind the gate has not been cleared. The way to Lantern Wake is by Brindlecross.' },
167
+ ];
168
+ export const SALTGRASS_FOLK_NAMES = {
169
+ drover: 'Head Drover Hob Marlowe',
170
+ shepherd: 'Shepherd Tilly Ashworth',
171
+ steward: 'Bounty Steward Cass Roper',
172
+ lookout: 'Lookout Jem Harker',
173
+ woolbuyer: 'Wool-Buyer Hester Whitlock',
174
+ };
175
+ /** The cook is a counter in campTraders.ts (she BUYS what players cook and sells no food). */
176
+ export const SALTGRASS_COOK_NAME = 'Cook Dilys Ferris';
177
+ export const SALTGRASS_DOG_NAME = 'Biscuit';
178
+ const CAMP_PLACE = "Drovers' Rest, Saltgrass Downs";
179
+ /** The five residents (named residents on the default look, stationary), the wool buyer with a counter of her own. */
180
+ export const SALTGRASS_FOLK = [
181
+ {
182
+ id: 'sg-drover',
183
+ name: SALTGRASS_FOLK_NAMES.drover,
184
+ place: CAMP_PLACE,
185
+ x: 2004, z: 912, faceX: 2004, faceZ: 915, leash: 1,
186
+ speak: 'Hob Marlowe, head drover. Forty years I have walked sheep down off the high pasture to the Riversend fold, and I have lost one in three on a bad year. Six ewes, a road with posts on it and a day of wolves: that is a drove. Open a gate at the High Pasture Pens, walk them home and read the board.',
187
+ extras: [
188
+ { id: 'drove', label: 'The Drove', say: 'Click a pen gate and six ewes come out and follow you, in a line, at their own pace. Keep to the road and keep close: a ewe left behind bolts. Wolves cut in from the gorse and rustlers come for the stragglers. Take the flock in at the Riversend Fold and read the Count Board. A lost ewe is paid for by nobody.' },
189
+ { id: 'wash', label: 'The wash pool', say: 'Every ewe goes through the wash pool in spring. It is cold, it is small and it is the only thing on the Downs that has never bitten anybody.' },
190
+ ],
191
+ },
192
+ {
193
+ id: 'sg-shepherd',
194
+ name: SALTGRASS_FOLK_NAMES.shepherd,
195
+ place: 'the High Pasture Pens, Saltgrass Downs',
196
+ x: 2012, z: 836, faceX: 2012, faceZ: 830, leash: 1,
197
+ speak: 'Tilly Ashworth, shepherd. The high pens are mine, and so is the dog, and the wolves think the pens are theirs. Biscuit is a plain brown-and-white collie with more sense than the rest of us, and she says there are too many grey ones on the ridge this month.',
198
+ extras: [{ id: 'wolves', label: 'The wolves', say: 'Wolf country is the high ground north-east of the road. A wolf takes a lamb off the edge of a flock without breaking stride. Their big grey one has a torn ear and a bad temper, and lives on the stony knoll.' }],
199
+ },
200
+ {
201
+ id: 'sg-steward',
202
+ name: SALTGRASS_FOLK_NAMES.steward,
203
+ place: CAMP_PLACE,
204
+ x: 2020, z: 912, faceX: 2020, faceZ: 909, leash: 1,
205
+ speak: "Cass Roper, bounty steward. The board is at my back and the board is honest, which is more than I can say for the rustlers. They cut hurdles and drive off what runs out, and they take the cut hurdles back to their camp south-east of the road.",
206
+ extras: [{ id: 'rustlers', label: 'The rustlers', say: 'A rustler wears a patched coat, carries a sling and a hooked staff, and knows every gap in every fence on the Downs. They only run if they are hurt, so hurt them.' }],
207
+ },
208
+ {
209
+ id: 'sg-wool-buyer',
210
+ name: SALTGRASS_FOLK_NAMES.woolbuyer,
211
+ place: CAMP_PLACE,
212
+ x: 2029, z: 908, faceX: 2030, faceZ: 905, leash: 1,
213
+ speak: "Hester Whitlock, wool buyer. I buy fleece from anyone with a drover's boots on, and I pay more than Calverton does because I do not have to cart it. The Riversend mill takes all I can send downriver.",
214
+ extras: [{ id: 'wool', label: 'The wool', say: "Nine coins a fleece, two over what Shepherd Tam pays. Shear a pen sheep with shears or take the wool a good drove pays: a ewe that reaches the fold is worth a fleece to me. I sell shears, and no food: that is the cook's business." }],
215
+ shop: { title: "Hester's Wool Counter", stock: [{ kind: SHEARS_KIND, price: SHEARS_PRICE }], buys: { [WOOL_KIND]: 9 } },
216
+ },
217
+ {
218
+ id: 'sg-lookout',
219
+ name: SALTGRASS_FOLK_NAMES.lookout,
220
+ place: 'the Lookout Mound, Saltgrass Downs',
221
+ x: 2060, z: 878, faceX: 2078, faceZ: 862, leash: 1,
222
+ speak: 'Jem Harker, lookout. From up here I can see the whole of the Downs, the sea and every wolf that comes down off the ridge. The beacon basket is for when one comes too close. I light it and the drovers know to bring the flock in.',
223
+ extras: [{ id: 'beacon', label: 'The beacon', say: 'It is a basket of tarred rope on a pole. When I light it the camp can see it from the fold. I have not had cause in a month, which is how I know something is wrong.' }],
224
+ },
225
+ ];
226
+ export function saltgrassFolkByName(name) {
227
+ return name ? SALTGRASS_FOLK.find((p) => p.name === name) ?? null : null;
228
+ }
229
+ /** The camp cook, which lives in CAMP_TRADERS (campTraders.ts) beside the other camps' cooks. */
230
+ export const SALTGRASS_COOK = { id: 'camp-saltgrass', name: SALTGRASS_COOK_NAME, x: 2006, z: 907, faceX: 2008, faceZ: 904 };
231
+ /** Tilly's collie: a sheepdog (an existing kind), not a fight, standing by her. */
232
+ export const SALTGRASS_DOG = { id: 'sg-biscuit', name: SALTGRASS_DOG_NAME, x: 2014, z: 838 };
233
+ // ---- Quest props -----------------------------------------------------------------------------------------------------------------------
234
+ export const SG_PROP = { pen: 'sgpen', board: 'sgboard', fleece: 'sgfleece', cut: 'sgcut', beacon: 'sgbeacon' };
235
+ /** The three pen gates (a click opens the pen and gathers a flock) and the Count Board at the Riversend Fold (a click tallies a flock that has arrived). */
236
+ export const SG_PEN_ONE = { id: 'sg-pen-gate-one', x: 2004, z: 832, style: `${SG_PROP.pen}:one` };
237
+ export const SG_PEN_TWO = { id: 'sg-pen-gate-two', x: 2022, z: 828, style: `${SG_PROP.pen}:two` };
238
+ export const SG_PEN_THREE = { id: 'sg-pen-gate-three', x: 2040, z: 834, style: `${SG_PROP.pen}:three` };
239
+ export const SG_COUNT_BOARD = { id: 'sg-count-board', x: 1958, z: 902, style: `${SG_PROP.board}:count` };
240
+ /** Torn fleece at the wolves' kills, along the wolf country's southern edge (Fleece and Fang). */
241
+ export const SG_FLEECE_ONE = { id: 'sg-fleece-one', x: 2094, z: 846, style: `${SG_PROP.fleece}:one` };
242
+ export const SG_FLEECE_TWO = { id: 'sg-fleece-two', x: 2112, z: 850, style: `${SG_PROP.fleece}:two` };
243
+ export const SG_FLEECE_THREE = { id: 'sg-fleece-three', x: 2134, z: 850, style: `${SG_PROP.fleece}:three` };
244
+ /** Cut hurdles at the edge of the rustlers' camp (The Rustlers' Cut). */
245
+ export const SG_CUT_ONE = { id: 'sg-cut-one', x: 2086, z: 934, style: `${SG_PROP.cut}:one` };
246
+ export const SG_CUT_TWO = { id: 'sg-cut-two', x: 2100, z: 930, style: `${SG_PROP.cut}:two` };
247
+ export const SG_CUT_THREE = { id: 'sg-cut-three', x: 2116, z: 936, style: `${SG_PROP.cut}:three` };
248
+ /** The lookout's beacon basket (Greyback). */
249
+ export const SG_BEACON = { id: 'sg-beacon-basket', x: 2060, z: 880, style: `${SG_PROP.beacon}:basket` };
250
+ export const SALTGRASS_QUEST_PROPS = [
251
+ SG_PEN_ONE, SG_PEN_TWO, SG_PEN_THREE, SG_COUNT_BOARD,
252
+ SG_FLEECE_ONE, SG_FLEECE_TWO, SG_FLEECE_THREE,
253
+ SG_CUT_ONE, SG_CUT_TWO, SG_CUT_THREE,
254
+ SG_BEACON,
255
+ ];
256
+ export const SALTGRASS_QUEST_PROP_NAMES = {
257
+ [SG_PEN_ONE.style]: 'Pen Gate (West Pen)',
258
+ [SG_PEN_TWO.style]: 'Pen Gate (Middle Pen)',
259
+ [SG_PEN_THREE.style]: 'Pen Gate (East Pen)',
260
+ [SG_COUNT_BOARD.style]: 'Flock Count Board',
261
+ [SG_FLEECE_ONE.style]: 'Torn Fleece (West)',
262
+ [SG_FLEECE_TWO.style]: 'Torn Fleece (Middle)',
263
+ [SG_FLEECE_THREE.style]: 'Torn Fleece (East)',
264
+ [SG_CUT_ONE.style]: 'Cut Hurdle (West)',
265
+ [SG_CUT_TWO.style]: 'Cut Hurdle (Middle)',
266
+ [SG_CUT_THREE.style]: 'Cut Hurdle (East)',
267
+ [SG_BEACON.style]: 'Beacon Basket',
268
+ };
269
+ /** The model a Saltgrass quest prop draws with (frontend quest-prop models that already exist), or null if not one of them. */
270
+ export function saltgrassPropModel(prop) {
271
+ if (prop === SG_PROP.pen)
272
+ return 'questbrokenfence';
273
+ if (prop === SG_PROP.board)
274
+ return 'questclue';
275
+ if (prop === SG_PROP.fleece)
276
+ return 'questhogtracks';
277
+ if (prop === SG_PROP.cut)
278
+ return 'questbrokenfence';
279
+ if (prop === SG_PROP.beacon)
280
+ return 'questbeacon';
281
+ return null;
282
+ }
283
+ /** Standable tiles for teleports, smokes and the helper. */
284
+ export const SALTGRASS_STANDS = {
285
+ lane: { x: 1930, z: 985 },
286
+ fold: { x: 1957, z: 908 },
287
+ camp: { x: 2016, z: 917 },
288
+ pens: { x: 2015, z: 845 },
289
+ milestone3: { x: 2106, z: 880 },
290
+ wolves: { x: 2092, z: 860 },
291
+ den: { x: 2077, z: 830 },
292
+ warren: { x: 2088, z: 880 },
293
+ rustlers: { x: 2100, z: 925 },
294
+ pans: { x: 2129, z: 872 },
295
+ shore: { x: 2148, z: 908 },
296
+ lookout: { x: 2056, z: 892 },
297
+ wash: { x: 2048, z: 930 },
298
+ ridge: { x: 2062, z: 943 },
299
+ };
300
+ /** What the guide, the verify links and the quest helper say about the place. */
301
+ export const SALTGRASS_PLACE_TEXT = "Saltgrass Downs is the open sheep country east of Riversend Halt, for levels 14 to 24, reached on foot from the North Road just south of Riversend's old bridge by the Drove Lane along the river's south bank: the Riversend Fold on its west edge, Drovers' Rest (a cookhouse, a Bounty Board, stores and a wool buyer) on a low rise, three hurdle pens on the high pasture, a wolf country with a den on a stony knoll, the salt pans and the eastshore pegs on the sea. Six people work it. There is no bank on the Downs.";
302
+ export const SALTGRASS_CAMP_DISCOVERY_ZONE = { id: 'drovers-rest', label: "Drovers' Rest", coordinateFrame: 'world', ...SALTGRASS_CAMP_BOX };
303
+ export const SALTGRASS_UMBRELLA_DISCOVERY_ZONE = { id: SALTGRASS_ID, label: SALTGRASS_NAME, coordinateFrame: 'world', ...SALTGRASS_BOX };
304
+ //# sourceMappingURL=saltgrassDowns.js.map