@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.
- package/dist/attackableNpcs.d.ts.map +1 -1
- package/dist/attackableNpcs.js +2 -0
- package/dist/attackableNpcs.js.map +1 -1
- package/dist/blacksmithing.d.ts.map +1 -1
- package/dist/blacksmithing.js +4 -0
- package/dist/blacksmithing.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/fishingReaches.d.ts.map +1 -1
- package/dist/fishingReaches.js +9 -0
- package/dist/fishingReaches.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +4 -0
- package/dist/legacy.d.ts.map +1 -1
- package/dist/legacy.js +4 -0
- package/dist/legacy.js.map +1 -1
- package/dist/marksmenRange.d.ts +219 -0
- package/dist/marksmenRange.d.ts.map +1 -0
- package/dist/marksmenRange.js +280 -0
- package/dist/marksmenRange.js.map +1 -0
- package/dist/quests.d.ts.map +1 -1
- package/dist/quests.js +41 -0
- package/dist/quests.js.map +1 -1
- package/dist/saltgrassDens.d.ts +110 -0
- package/dist/saltgrassDens.d.ts.map +1 -0
- package/dist/saltgrassDens.js +170 -0
- package/dist/saltgrassDens.js.map +1 -0
- package/dist/saltgrassDowns.d.ts +295 -0
- package/dist/saltgrassDowns.d.ts.map +1 -0
- package/dist/saltgrassDowns.js +304 -0
- package/dist/saltgrassDowns.js.map +1 -0
- package/dist/saltgrassDrove.d.ts +111 -0
- package/dist/saltgrassDrove.d.ts.map +1 -0
- package/dist/saltgrassDrove.js +97 -0
- package/dist/saltgrassDrove.js.map +1 -0
- package/dist/saltgrassQuestDef.d.ts +35 -0
- package/dist/saltgrassQuestDef.d.ts.map +1 -0
- package/dist/saltgrassQuestDef.js +252 -0
- package/dist/saltgrassQuestDef.js.map +1 -0
- package/dist/storyQuests.d.ts +3 -1
- package/dist/storyQuests.d.ts.map +1 -1
- package/dist/storyQuests.js +25 -0
- package/dist/storyQuests.js.map +1 -1
- package/dist/timberErrands.d.ts +33 -0
- package/dist/timberErrands.d.ts.map +1 -0
- package/dist/timberErrands.js +192 -0
- package/dist/timberErrands.js.map +1 -0
- package/dist/timberGoods.d.ts +43 -0
- package/dist/timberGoods.d.ts.map +1 -0
- package/dist/timberGoods.js +58 -0
- package/dist/timberGoods.js.map +1 -0
- package/dist/woodwork.d.ts.map +1 -1
- package/dist/woodwork.js +11 -0
- package/dist/woodwork.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE MARKSMEN RANGE (wave 3, 2026-10-19; dreadwoods-backend/COVERAGE_1_40.md section 6, "Held back for wave 3"): a dedicated Archery trainer past the War Camp's
|
|
3
|
+
* long butts. Archery 30-40 had one trainer, the three butts of the War Camp drill ground (warCampDrill.ts), and nothing that is more than a butt. This is a
|
|
4
|
+
* fenced yard on the open snow NORTH of the garrison camp (nothing else stands there; the wolves keep to the east side), a few steps from the camp's hearth, with
|
|
5
|
+
* no gate to open and no bank (a bank is a trip back to a town):
|
|
6
|
+
*
|
|
7
|
+
* - THREE LANES (12, 18 and 22 tiles), each a drill target on the Beacon Ledge's and the War Camp's pattern (a band of Archery levels, a firing tile of its own,
|
|
8
|
+
* no chained bow lent: an archer at 30 owns a bow);
|
|
9
|
+
* - the RANGE-MASTER, Edda Fenn, who runs a TIMED ROUND: sixty seconds from the first arrow, one arrow a drill beat at the lane you choose, each scored by the
|
|
10
|
+
* lane (the near lane is easy and pays one point, the far lane is hard and pays three; skill and level move the odds), a gold, silver or bronze mark for the
|
|
11
|
+
* total, paid once an hour per player (so a better round is always free but pays nothing more that hour), and a SCOREBOARD of the week's five best rounds that
|
|
12
|
+
* she reads out and the world remembers across a restart;
|
|
13
|
+
* - one quest of hers, Three Lanes, that walks a new arrival down all three.
|
|
14
|
+
*
|
|
15
|
+
* Every number is a WORLD tile (x east, z south). Every level, count, point and prize is a PLACEHOLDER for the balance pass (James, 2026-10-12: balance last).
|
|
16
|
+
* Nothing here is 41+: the top of every band is 40. Drawn from the camp's own winter kit as stand-ins (backend upgrades list `marksmen-*`).
|
|
17
|
+
*/
|
|
18
|
+
import type { StoryQuestDef } from './storyQuests.js';
|
|
19
|
+
export declare const MARKSMEN_RANGE_NAME = "The Marksmen Range";
|
|
20
|
+
export declare const MARKSMEN_MASTER_NAME = "Range-Master Edda Fenn";
|
|
21
|
+
export declare const MARKSMEN_MASTER_ID = "mrange-master";
|
|
22
|
+
/** The fence line (the yard's outside); the yard is levelled to one height with the camp's and eased three tiles into the land. */
|
|
23
|
+
export declare const MARKSMEN_FENCE_BOX: {
|
|
24
|
+
readonly minX: 108;
|
|
25
|
+
readonly maxX: 141;
|
|
26
|
+
readonly minZ: 444;
|
|
27
|
+
readonly maxZ: 472;
|
|
28
|
+
};
|
|
29
|
+
export declare const MARKSMEN_HEIGHT = 2;
|
|
30
|
+
export declare const MARKSMEN_EASE = 3;
|
|
31
|
+
/** The gap in the south fence (five tiles of palisade left out; the spears' footprint closes the two outer ones, so three are walkable: x 119-121) and the cleared lane from it to the camp's north edge. */
|
|
32
|
+
export declare const MARKSMEN_GATE: {
|
|
33
|
+
readonly z: 472;
|
|
34
|
+
readonly minX: 118;
|
|
35
|
+
readonly maxX: 122;
|
|
36
|
+
};
|
|
37
|
+
export declare const MARKSMEN_GATE_OPEN: {
|
|
38
|
+
readonly minX: 119;
|
|
39
|
+
readonly maxX: 121;
|
|
40
|
+
};
|
|
41
|
+
export declare const MARKSMEN_LANE_IN: {
|
|
42
|
+
readonly minX: 118;
|
|
43
|
+
readonly maxX: 122;
|
|
44
|
+
readonly minZ: 473;
|
|
45
|
+
readonly maxZ: 477;
|
|
46
|
+
};
|
|
47
|
+
/** Where a player is told to stand to start (just inside the gate). */
|
|
48
|
+
export declare const MARKSMEN_STAND: {
|
|
49
|
+
readonly x: 120;
|
|
50
|
+
readonly z: 470;
|
|
51
|
+
};
|
|
52
|
+
/** Every lane is shot from this row, the targets stand 12, 18 and 22 tiles north of it. */
|
|
53
|
+
export declare const MARKSMEN_FIRING_Z = 468;
|
|
54
|
+
/** The Range-Master stands on the firing line between the first two lanes, facing the targets. */
|
|
55
|
+
export declare const MARKSMEN_MASTER_SPOT: {
|
|
56
|
+
readonly x: 119;
|
|
57
|
+
readonly z: 469;
|
|
58
|
+
readonly faceX: 119;
|
|
59
|
+
readonly faceZ: 462;
|
|
60
|
+
readonly leash: 1;
|
|
61
|
+
};
|
|
62
|
+
export declare function inMarksmenRange(x: number, z: number, pad?: number): boolean;
|
|
63
|
+
/** Distance in tiles from the fence box (0 inside it); the backend levels the ground within a few tiles of it. */
|
|
64
|
+
export declare function marksmenEdgeDistance(x: number, z: number): number;
|
|
65
|
+
/** Is this tile in the cleared lane from the camp to the gate? */
|
|
66
|
+
export declare function inMarksmenLaneIn(x: number, z: number): boolean;
|
|
67
|
+
export declare const MARKSMEN_LANE_ID_PREFIX = "mrange-lane-";
|
|
68
|
+
export declare const MARKSMEN_MIN_ARCHERY = 30;
|
|
69
|
+
export type MarksmenBand = {
|
|
70
|
+
min: number;
|
|
71
|
+
max: number;
|
|
72
|
+
xp: number;
|
|
73
|
+
};
|
|
74
|
+
export type MarksmenLane = {
|
|
75
|
+
id: string;
|
|
76
|
+
x: number;
|
|
77
|
+
z: number;
|
|
78
|
+
/** The firing tile of the lane. */
|
|
79
|
+
fx: number;
|
|
80
|
+
fz: number;
|
|
81
|
+
/** Tiles from the firing tile to the target. */
|
|
82
|
+
distance: number;
|
|
83
|
+
/** Points a hit scores in a timed round. */
|
|
84
|
+
points: number;
|
|
85
|
+
/** The chance a shot at Archery 30 lands; each Archery level above adds MARKSMEN_HIT_PER_LEVEL. */
|
|
86
|
+
base: number;
|
|
87
|
+
/** The practice band: the lane teaches from `min` to `max` at `xp` a beat (every beat, as the War Camp's butts do). */
|
|
88
|
+
band: MarksmenBand;
|
|
89
|
+
};
|
|
90
|
+
/** One band per lane (the War Camp's pattern): the near lane stops paying at 36, the middle at 38, the far one at 40, and the farther the lane the more a beat pays. */
|
|
91
|
+
export declare const MARKSMEN_LANES: readonly MarksmenLane[];
|
|
92
|
+
export declare function marksmenLaneAt(x: number, z: number): MarksmenLane | undefined;
|
|
93
|
+
export declare function marksmenLaneById(id: string | undefined | null): MarksmenLane | undefined;
|
|
94
|
+
export declare function isMarksmenLaneId(id: string | undefined | null): boolean;
|
|
95
|
+
/** The archery band of a lane, or null when the id is not one (the backend's archeryTargetBand reads this). */
|
|
96
|
+
export declare function marksmenLaneBand(id: string | undefined | null): MarksmenBand | null;
|
|
97
|
+
/** The round runs this long from the first arrow. */
|
|
98
|
+
export declare const MARKSMEN_ROUND_MS = 60000;
|
|
99
|
+
/** A round taken and never started is forgotten after this long. */
|
|
100
|
+
export declare const MARKSMEN_SESSION_TTL_MS: number;
|
|
101
|
+
export declare const MARKSMEN_HIT_PER_LEVEL = 0.012;
|
|
102
|
+
export declare const MARKSMEN_HIT_MIN = 0.1;
|
|
103
|
+
export declare const MARKSMEN_HIT_MAX = 0.95;
|
|
104
|
+
/** The chance one arrow lands in a lane: the lane's base at Archery 30, a little more for each level above, clamped. */
|
|
105
|
+
export declare function marksmenHitChance(archery: number, lane: Pick<MarksmenLane, 'base'>): number;
|
|
106
|
+
/** Points one arrow scores: the lane's points on a hit (roll under the chance), nothing on a miss. */
|
|
107
|
+
export declare function marksmenArrowScore(archery: number, lane: Pick<MarksmenLane, 'base' | 'points'>, roll: number): number;
|
|
108
|
+
export type MarksmenPlacing = 'gold' | 'silver' | 'bronze' | 'none';
|
|
109
|
+
export declare const MARKSMEN_TIERS: {
|
|
110
|
+
readonly gold: 48;
|
|
111
|
+
readonly silver: 38;
|
|
112
|
+
readonly bronze: 28;
|
|
113
|
+
};
|
|
114
|
+
export declare function marksmenPlacing(total: number): MarksmenPlacing;
|
|
115
|
+
export type MarksmenPrize = {
|
|
116
|
+
coins: number;
|
|
117
|
+
archeryXp: number;
|
|
118
|
+
explorerXp: number;
|
|
119
|
+
};
|
|
120
|
+
export declare const MARKSMEN_PRIZES: Readonly<Record<MarksmenPlacing, MarksmenPrize>>;
|
|
121
|
+
/** A placing pays once a window per player; another round is always free but pays nothing more in the window. */
|
|
122
|
+
export declare const MARKSMEN_PRIZE_WINDOW_MS: number;
|
|
123
|
+
export declare const MARKSMEN_BOARD_SIZE = 5;
|
|
124
|
+
export declare const MARKSMEN_BOARD_TIMER_KEY = "marksmen-range";
|
|
125
|
+
export type MarksmenRow = {
|
|
126
|
+
name: string;
|
|
127
|
+
score: number;
|
|
128
|
+
at: number;
|
|
129
|
+
};
|
|
130
|
+
export type MarksmenSave = {
|
|
131
|
+
week: string;
|
|
132
|
+
rows: MarksmenRow[];
|
|
133
|
+
};
|
|
134
|
+
/** The UTC ISO week a moment falls in, "2026-W43": the board starts again each Monday. */
|
|
135
|
+
export declare function marksmenWeekKey(nowMs: number): string;
|
|
136
|
+
export declare function emptyMarksmenSave(nowMs: number): MarksmenSave;
|
|
137
|
+
/** The board as the world saved it, or a fresh one: nothing unreadable is trusted. */
|
|
138
|
+
export declare function parseMarksmenSave(raw: unknown, nowMs: number): MarksmenSave;
|
|
139
|
+
/** Best first; a tie goes to whoever scored it first. */
|
|
140
|
+
export declare function rankMarksmenRows(rows: readonly MarksmenRow[]): MarksmenRow[];
|
|
141
|
+
/**
|
|
142
|
+
* A finished round goes on the board: one place per name (only a better round replaces a worse one), a new week starts a fresh board, and a score of nothing
|
|
143
|
+
* is never written. Returns the new board and whether this round changed it.
|
|
144
|
+
*/
|
|
145
|
+
export declare function recordMarksmenScore(save: MarksmenSave, name: string, score: number, nowMs: number): {
|
|
146
|
+
save: MarksmenSave;
|
|
147
|
+
changed: boolean;
|
|
148
|
+
place: number;
|
|
149
|
+
};
|
|
150
|
+
/** 1-based place on a board, or 0 when not on it. */
|
|
151
|
+
export declare function marksmenPlaceOf(rows: readonly MarksmenRow[], name: string): number;
|
|
152
|
+
export declare function marksmenBoardText(save: MarksmenSave): string;
|
|
153
|
+
/** npc_action ids the Range-Master answers (the client sends them on untouched). */
|
|
154
|
+
export declare const MARKSMEN_ACTION_PREFIX = "mrange:";
|
|
155
|
+
export declare const MARKSMEN_ACTIONS: {
|
|
156
|
+
readonly begin: "mrange:begin";
|
|
157
|
+
readonly board: "mrange:board";
|
|
158
|
+
readonly stop: "mrange:stop";
|
|
159
|
+
};
|
|
160
|
+
export declare const MARKSMEN_OPTION_LABELS: Readonly<Record<string, string>>;
|
|
161
|
+
/** What the range says (the customer's words, not the code's). */
|
|
162
|
+
export declare const MARKSMEN_LINES: {
|
|
163
|
+
readonly tooEarly: "These lanes want a steadier draw than yours. Practise on the War Camp butts or the Beacon Ledge until your Archery reaches the figure on the sign.";
|
|
164
|
+
readonly capped: "This lane has nothing more to teach you. Try the next one along, or run a timed round for the board.";
|
|
165
|
+
readonly allCapped: "The range has nothing more to teach you. Run a timed round for the board, or find a real target.";
|
|
166
|
+
readonly start: "You nock a practice arrow and draw on the target, a long way up the yard.";
|
|
167
|
+
readonly noBow: "You need a bow in hand to shoot the range.";
|
|
168
|
+
readonly needArchery: "The range is for archers of Archery 30 and over. Practise on the War Camp butts first.";
|
|
169
|
+
readonly inFight: "Finish your fight first.";
|
|
170
|
+
readonly alreadyRunning: "Your round is on. Shoot any lane, and the minute is out when the last arrow is.";
|
|
171
|
+
readonly stopped: "Round called off. Nothing is scored and nothing is paid.";
|
|
172
|
+
readonly noRound: "You have no round running.";
|
|
173
|
+
readonly waiting: "Round entered. The minute starts with your first arrow: take a firing mark and shoot any lane.";
|
|
174
|
+
};
|
|
175
|
+
export declare const MARKSMEN_RULES_TEXT: string;
|
|
176
|
+
export type MarksmenFolk = {
|
|
177
|
+
readonly id: string;
|
|
178
|
+
readonly name: string;
|
|
179
|
+
readonly place: string;
|
|
180
|
+
readonly x: number;
|
|
181
|
+
readonly z: number;
|
|
182
|
+
readonly faceX: number;
|
|
183
|
+
readonly faceZ: number;
|
|
184
|
+
readonly leash: number;
|
|
185
|
+
readonly speak: string;
|
|
186
|
+
readonly extras: ReadonlyArray<{
|
|
187
|
+
readonly id: string;
|
|
188
|
+
readonly label: string;
|
|
189
|
+
readonly say: string;
|
|
190
|
+
}>;
|
|
191
|
+
};
|
|
192
|
+
export declare const MARKSMEN_FOLK: ReadonlyArray<MarksmenFolk>;
|
|
193
|
+
export declare function marksmenFolkByName(name: string | undefined): MarksmenFolk | null;
|
|
194
|
+
export declare function marksmenFolkById(id: string | undefined): MarksmenFolk | null;
|
|
195
|
+
export type MarksmenPiece = {
|
|
196
|
+
id: string;
|
|
197
|
+
kind: string;
|
|
198
|
+
style: string;
|
|
199
|
+
x: number;
|
|
200
|
+
z: number;
|
|
201
|
+
};
|
|
202
|
+
/** The fence: the camp's own spear palisade on every tile of the box's edge, but the gap in the south run. */
|
|
203
|
+
export declare function marksmenFence(): MarksmenPiece[];
|
|
204
|
+
/** The yard's working pieces: the lane targets (real `yardprop` entities the archery drill reads), backstops, firing marks, rack, water, braziers and the sign. */
|
|
205
|
+
export declare const MARKSMEN_STATIONS: readonly MarksmenPiece[];
|
|
206
|
+
export declare const MARKSMEN_QUEST_IDS: readonly ["marksmenThreeLanes"];
|
|
207
|
+
export type MarksmenQuestId = (typeof MARKSMEN_QUEST_IDS)[number];
|
|
208
|
+
export declare const MARKSMEN_QUEST_GIVER_TEXT = "Range-Master Edda Fenn keeps The Marksmen Range, the fenced yard just north of the garrison camp beyond the Northern Gate.";
|
|
209
|
+
export declare const MARKSMEN_QUESTS: Readonly<Record<MarksmenQuestId, StoryQuestDef>>;
|
|
210
|
+
export declare const MARKSMEN_QUEST_META: Readonly<Record<MarksmenQuestId, {
|
|
211
|
+
title: string;
|
|
212
|
+
description: string;
|
|
213
|
+
category: 'combat';
|
|
214
|
+
art: {
|
|
215
|
+
item: string;
|
|
216
|
+
};
|
|
217
|
+
}>>;
|
|
218
|
+
export declare const MARKSMEN_GIVER_PLACES: Readonly<Record<MarksmenQuestId, string>>;
|
|
219
|
+
//# sourceMappingURL=marksmenRange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marksmenRange.d.ts","sourceRoot":"","sources":["../src/marksmenRange.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
// ---- Where ---------------------------------------------------------------------------------------------------------------------------------
|
|
2
|
+
export const MARKSMEN_RANGE_NAME = 'The Marksmen Range';
|
|
3
|
+
export const MARKSMEN_MASTER_NAME = 'Range-Master Edda Fenn';
|
|
4
|
+
export const MARKSMEN_MASTER_ID = 'mrange-master';
|
|
5
|
+
/** The fence line (the yard's outside); the yard is levelled to one height with the camp's and eased three tiles into the land. */
|
|
6
|
+
export const MARKSMEN_FENCE_BOX = { minX: 108, maxX: 141, minZ: 444, maxZ: 472 };
|
|
7
|
+
export const MARKSMEN_HEIGHT = 2;
|
|
8
|
+
export const MARKSMEN_EASE = 3;
|
|
9
|
+
/** The gap in the south fence (five tiles of palisade left out; the spears' footprint closes the two outer ones, so three are walkable: x 119-121) and the cleared lane from it to the camp's north edge. */
|
|
10
|
+
export const MARKSMEN_GATE = { z: 472, minX: 118, maxX: 122 };
|
|
11
|
+
export const MARKSMEN_GATE_OPEN = { minX: 119, maxX: 121 };
|
|
12
|
+
export const MARKSMEN_LANE_IN = { minX: 118, maxX: 122, minZ: 473, maxZ: 477 };
|
|
13
|
+
/** Where a player is told to stand to start (just inside the gate). */
|
|
14
|
+
export const MARKSMEN_STAND = { x: 120, z: 470 };
|
|
15
|
+
/** Every lane is shot from this row, the targets stand 12, 18 and 22 tiles north of it. */
|
|
16
|
+
export const MARKSMEN_FIRING_Z = 468;
|
|
17
|
+
/** The Range-Master stands on the firing line between the first two lanes, facing the targets. */
|
|
18
|
+
export const MARKSMEN_MASTER_SPOT = { x: 119, z: 469, faceX: 119, faceZ: 462, leash: 1 };
|
|
19
|
+
export function inMarksmenRange(x, z, pad = 0) {
|
|
20
|
+
const b = MARKSMEN_FENCE_BOX;
|
|
21
|
+
return x >= b.minX - pad && x <= b.maxX + pad && z >= b.minZ - pad && z <= b.maxZ + pad;
|
|
22
|
+
}
|
|
23
|
+
/** Distance in tiles from the fence box (0 inside it); the backend levels the ground within a few tiles of it. */
|
|
24
|
+
export function marksmenEdgeDistance(x, z) {
|
|
25
|
+
const b = MARKSMEN_FENCE_BOX;
|
|
26
|
+
return Math.hypot(Math.max(b.minX - x, 0, x - b.maxX), Math.max(b.minZ - z, 0, z - b.maxZ));
|
|
27
|
+
}
|
|
28
|
+
/** Is this tile in the cleared lane from the camp to the gate? */
|
|
29
|
+
export function inMarksmenLaneIn(x, z) {
|
|
30
|
+
const b = MARKSMEN_LANE_IN;
|
|
31
|
+
return x >= b.minX && x <= b.maxX && z >= b.minZ && z <= b.maxZ;
|
|
32
|
+
}
|
|
33
|
+
// ---- The lanes -------------------------------------------------------------------------------------------------------------------------------
|
|
34
|
+
export const MARKSMEN_LANE_ID_PREFIX = 'mrange-lane-';
|
|
35
|
+
export const MARKSMEN_MIN_ARCHERY = 30;
|
|
36
|
+
/** One band per lane (the War Camp's pattern): the near lane stops paying at 36, the middle at 38, the far one at 40, and the farther the lane the more a beat pays. */
|
|
37
|
+
export const MARKSMEN_LANES = [
|
|
38
|
+
{ id: 'mrange-lane-1', x: 115, z: 456, fx: 115, fz: MARKSMEN_FIRING_Z, distance: 12, points: 1, base: 0.85, band: { min: 30, max: 36, xp: 11 } },
|
|
39
|
+
{ id: 'mrange-lane-2', x: 124, z: 450, fx: 124, fz: MARKSMEN_FIRING_Z, distance: 18, points: 2, base: 0.62, band: { min: 30, max: 38, xp: 13 } },
|
|
40
|
+
{ id: 'mrange-lane-3', x: 133, z: 446, fx: 133, fz: MARKSMEN_FIRING_Z, distance: 22, points: 3, base: 0.42, band: { min: 30, max: 40, xp: 15 } },
|
|
41
|
+
];
|
|
42
|
+
export function marksmenLaneAt(x, z) {
|
|
43
|
+
return MARKSMEN_LANES.find((l) => l.x === x && l.z === z);
|
|
44
|
+
}
|
|
45
|
+
export function marksmenLaneById(id) {
|
|
46
|
+
return typeof id === 'string' ? MARKSMEN_LANES.find((l) => l.id === id) : undefined;
|
|
47
|
+
}
|
|
48
|
+
export function isMarksmenLaneId(id) {
|
|
49
|
+
return !!marksmenLaneById(id);
|
|
50
|
+
}
|
|
51
|
+
/** The archery band of a lane, or null when the id is not one (the backend's archeryTargetBand reads this). */
|
|
52
|
+
export function marksmenLaneBand(id) {
|
|
53
|
+
const l = marksmenLaneById(id);
|
|
54
|
+
return l ? { ...l.band } : null;
|
|
55
|
+
}
|
|
56
|
+
// ---- The timed round ---------------------------------------------------------------------------------------------------------------------
|
|
57
|
+
/** The round runs this long from the first arrow. */
|
|
58
|
+
export const MARKSMEN_ROUND_MS = 60_000;
|
|
59
|
+
/** A round taken and never started is forgotten after this long. */
|
|
60
|
+
export const MARKSMEN_SESSION_TTL_MS = 5 * 60_000;
|
|
61
|
+
export const MARKSMEN_HIT_PER_LEVEL = 0.012;
|
|
62
|
+
export const MARKSMEN_HIT_MIN = 0.1;
|
|
63
|
+
export const MARKSMEN_HIT_MAX = 0.95;
|
|
64
|
+
/** The chance one arrow lands in a lane: the lane's base at Archery 30, a little more for each level above, clamped. */
|
|
65
|
+
export function marksmenHitChance(archery, lane) {
|
|
66
|
+
const raw = lane.base + (Math.max(1, archery) - MARKSMEN_MIN_ARCHERY) * MARKSMEN_HIT_PER_LEVEL;
|
|
67
|
+
return Math.min(MARKSMEN_HIT_MAX, Math.max(MARKSMEN_HIT_MIN, raw));
|
|
68
|
+
}
|
|
69
|
+
/** Points one arrow scores: the lane's points on a hit (roll under the chance), nothing on a miss. */
|
|
70
|
+
export function marksmenArrowScore(archery, lane, roll) {
|
|
71
|
+
return roll < marksmenHitChance(archery, lane) ? lane.points : 0;
|
|
72
|
+
}
|
|
73
|
+
export const MARKSMEN_TIERS = { gold: 48, silver: 38, bronze: 28 };
|
|
74
|
+
export function marksmenPlacing(total) {
|
|
75
|
+
if (total >= MARKSMEN_TIERS.gold)
|
|
76
|
+
return 'gold';
|
|
77
|
+
if (total >= MARKSMEN_TIERS.silver)
|
|
78
|
+
return 'silver';
|
|
79
|
+
if (total >= MARKSMEN_TIERS.bronze)
|
|
80
|
+
return 'bronze';
|
|
81
|
+
return 'none';
|
|
82
|
+
}
|
|
83
|
+
export const MARKSMEN_PRIZES = {
|
|
84
|
+
gold: { coins: 120, archeryXp: 420, explorerXp: 140 },
|
|
85
|
+
silver: { coins: 80, archeryXp: 280, explorerXp: 80 },
|
|
86
|
+
bronze: { coins: 50, archeryXp: 160, explorerXp: 0 },
|
|
87
|
+
none: { coins: 10, archeryXp: 40, explorerXp: 0 },
|
|
88
|
+
};
|
|
89
|
+
/** A placing pays once a window per player; another round is always free but pays nothing more in the window. */
|
|
90
|
+
export const MARKSMEN_PRIZE_WINDOW_MS = 60 * 60_000;
|
|
91
|
+
// ---- The scoreboard --------------------------------------------------------------------------------------------------------------------------
|
|
92
|
+
export const MARKSMEN_BOARD_SIZE = 5;
|
|
93
|
+
export const MARKSMEN_BOARD_TIMER_KEY = 'marksmen-range';
|
|
94
|
+
/** The UTC ISO week a moment falls in, "2026-W43": the board starts again each Monday. */
|
|
95
|
+
export function marksmenWeekKey(nowMs) {
|
|
96
|
+
const d = new Date(nowMs);
|
|
97
|
+
const day = (d.getUTCDay() + 6) % 7; // Monday 0
|
|
98
|
+
const thursday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() - day + 3));
|
|
99
|
+
const yearStart = Date.UTC(thursday.getUTCFullYear(), 0, 1);
|
|
100
|
+
const week = Math.floor((thursday.getTime() - yearStart) / 86_400_000 / 7) + 1;
|
|
101
|
+
return `${thursday.getUTCFullYear()}-W${String(week).padStart(2, '0')}`;
|
|
102
|
+
}
|
|
103
|
+
export function emptyMarksmenSave(nowMs) {
|
|
104
|
+
return { week: marksmenWeekKey(nowMs), rows: [] };
|
|
105
|
+
}
|
|
106
|
+
/** The board as the world saved it, or a fresh one: nothing unreadable is trusted. */
|
|
107
|
+
export function parseMarksmenSave(raw, nowMs) {
|
|
108
|
+
const fresh = emptyMarksmenSave(nowMs);
|
|
109
|
+
if (!raw || typeof raw !== 'object')
|
|
110
|
+
return fresh;
|
|
111
|
+
const r = raw;
|
|
112
|
+
if (r.week !== fresh.week || !Array.isArray(r.rows))
|
|
113
|
+
return fresh;
|
|
114
|
+
const rows = [];
|
|
115
|
+
for (const row of r.rows.slice(0, 50)) {
|
|
116
|
+
const q = row;
|
|
117
|
+
if (!q || typeof q.name !== 'string' || !q.name || typeof q.score !== 'number' || !Number.isFinite(q.score) || q.score <= 0 || typeof q.at !== 'number')
|
|
118
|
+
continue;
|
|
119
|
+
rows.push({ name: q.name.slice(0, 40), score: Math.floor(q.score), at: q.at });
|
|
120
|
+
}
|
|
121
|
+
return { week: fresh.week, rows: rankMarksmenRows(rows) };
|
|
122
|
+
}
|
|
123
|
+
/** Best first; a tie goes to whoever scored it first. */
|
|
124
|
+
export function rankMarksmenRows(rows) {
|
|
125
|
+
return [...rows].sort((a, b) => b.score - a.score || a.at - b.at).slice(0, MARKSMEN_BOARD_SIZE);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* A finished round goes on the board: one place per name (only a better round replaces a worse one), a new week starts a fresh board, and a score of nothing
|
|
129
|
+
* is never written. Returns the new board and whether this round changed it.
|
|
130
|
+
*/
|
|
131
|
+
export function recordMarksmenScore(save, name, score, nowMs) {
|
|
132
|
+
const base = save.week === marksmenWeekKey(nowMs) ? save : emptyMarksmenSave(nowMs);
|
|
133
|
+
if (score <= 0)
|
|
134
|
+
return { save: base, changed: base !== save, place: 0 };
|
|
135
|
+
const mine = base.rows.find((r) => r.name === name);
|
|
136
|
+
if (mine && mine.score >= score)
|
|
137
|
+
return { save: base, changed: base !== save, place: marksmenPlaceOf(base.rows, name) };
|
|
138
|
+
const rows = rankMarksmenRows([...base.rows.filter((r) => r.name !== name), { name, score, at: nowMs }]);
|
|
139
|
+
const place = marksmenPlaceOf(rows, name);
|
|
140
|
+
return { save: { week: base.week, rows }, changed: true, place };
|
|
141
|
+
}
|
|
142
|
+
/** 1-based place on a board, or 0 when not on it. */
|
|
143
|
+
export function marksmenPlaceOf(rows, name) {
|
|
144
|
+
const i = rows.findIndex((r) => r.name === name);
|
|
145
|
+
return i < 0 ? 0 : i + 1;
|
|
146
|
+
}
|
|
147
|
+
export function marksmenBoardText(save) {
|
|
148
|
+
if (!save.rows.length)
|
|
149
|
+
return "Nobody has put a round on this week's board yet. Sixty seconds and a steady hand will do it.";
|
|
150
|
+
return `This week's best rounds: ${save.rows.map((r, i) => `${i + 1}. ${r.name} ${r.score}`).join(', ')}. The board starts again each Monday.`;
|
|
151
|
+
}
|
|
152
|
+
// ---- The Range-Master's menu --------------------------------------------------------------------------------------------------------------
|
|
153
|
+
/** npc_action ids the Range-Master answers (the client sends them on untouched). */
|
|
154
|
+
export const MARKSMEN_ACTION_PREFIX = 'mrange:';
|
|
155
|
+
export const MARKSMEN_ACTIONS = {
|
|
156
|
+
begin: 'mrange:begin',
|
|
157
|
+
board: 'mrange:board',
|
|
158
|
+
stop: 'mrange:stop',
|
|
159
|
+
};
|
|
160
|
+
export const MARKSMEN_OPTION_LABELS = {
|
|
161
|
+
[MARKSMEN_ACTIONS.begin]: 'Run a timed round',
|
|
162
|
+
[MARKSMEN_ACTIONS.board]: "This week's board",
|
|
163
|
+
[MARKSMEN_ACTIONS.stop]: 'Call off my round',
|
|
164
|
+
};
|
|
165
|
+
/** What the range says (the customer's words, not the code's). */
|
|
166
|
+
export const MARKSMEN_LINES = {
|
|
167
|
+
tooEarly: 'These lanes want a steadier draw than yours. Practise on the War Camp butts or the Beacon Ledge until your Archery reaches the figure on the sign.',
|
|
168
|
+
capped: 'This lane has nothing more to teach you. Try the next one along, or run a timed round for the board.',
|
|
169
|
+
allCapped: 'The range has nothing more to teach you. Run a timed round for the board, or find a real target.',
|
|
170
|
+
start: 'You nock a practice arrow and draw on the target, a long way up the yard.',
|
|
171
|
+
noBow: 'You need a bow in hand to shoot the range.',
|
|
172
|
+
needArchery: `The range is for archers of Archery ${MARKSMEN_MIN_ARCHERY} and over. Practise on the War Camp butts first.`,
|
|
173
|
+
inFight: 'Finish your fight first.',
|
|
174
|
+
alreadyRunning: 'Your round is on. Shoot any lane, and the minute is out when the last arrow is.',
|
|
175
|
+
stopped: 'Round called off. Nothing is scored and nothing is paid.',
|
|
176
|
+
noRound: 'You have no round running.',
|
|
177
|
+
waiting: 'Round entered. The minute starts with your first arrow: take a firing mark and shoot any lane.',
|
|
178
|
+
};
|
|
179
|
+
export const MARKSMEN_RULES_TEXT = `A timed round is ${MARKSMEN_ROUND_MS / 1000} seconds from your first arrow, one arrow a beat at whichever lane you choose. The near lane (12 steps) scores 1 a hit and is easy, the middle (18) scores 2, the far lane (22) scores 3 and is hard; every Archery level over ${MARKSMEN_MIN_ARCHERY} helps. ${MARKSMEN_TIERS.gold} takes gold, ${MARKSMEN_TIERS.silver} silver, ${MARKSMEN_TIERS.bronze} bronze, paid once an hour. The week's five best rounds go on my board.`;
|
|
180
|
+
export const MARKSMEN_FOLK = [
|
|
181
|
+
{
|
|
182
|
+
id: MARKSMEN_MASTER_ID,
|
|
183
|
+
name: MARKSMEN_MASTER_NAME,
|
|
184
|
+
place: `${MARKSMEN_RANGE_NAME}, north of the War Camp`,
|
|
185
|
+
x: MARKSMEN_MASTER_SPOT.x, z: MARKSMEN_MASTER_SPOT.z, faceX: MARKSMEN_MASTER_SPOT.faceX, faceZ: MARKSMEN_MASTER_SPOT.faceZ, leash: MARKSMEN_MASTER_SPOT.leash,
|
|
186
|
+
speak: "Edda Fenn, range-master. Fenwick's long butts teach you to hit a thing that stands still. I teach you to hit it when it matters: three lanes, a minute on the clock, and a board with the week's best names on it. Bring your own bow.",
|
|
187
|
+
extras: [
|
|
188
|
+
{ id: 'rules', label: 'The rules', say: MARKSMEN_RULES_TEXT },
|
|
189
|
+
{ id: 'lanes', label: 'The lanes', say: 'Three lanes up the yard: twelve steps, eighteen and twenty-two. Each teaches from Archery 30; the near one stops teaching at 36, the middle at 38 and the far one at 40. A round is scored on top of the practice.' },
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
export function marksmenFolkByName(name) {
|
|
194
|
+
return name ? MARKSMEN_FOLK.find((p) => p.name === name) ?? null : null;
|
|
195
|
+
}
|
|
196
|
+
export function marksmenFolkById(id) {
|
|
197
|
+
return id ? MARKSMEN_FOLK.find((p) => p.id === id) ?? null : null;
|
|
198
|
+
}
|
|
199
|
+
/** The fence: the camp's own spear palisade on every tile of the box's edge, but the gap in the south run. */
|
|
200
|
+
export function marksmenFence() {
|
|
201
|
+
const b = MARKSMEN_FENCE_BOX;
|
|
202
|
+
const out = [];
|
|
203
|
+
for (let x = b.minX; x <= b.maxX; x++) {
|
|
204
|
+
out.push({ id: `mrange-fence-n-${x}`, kind: 'barricade', style: 'winter-spears', x, z: b.minZ });
|
|
205
|
+
if (x < MARKSMEN_GATE.minX || x > MARKSMEN_GATE.maxX)
|
|
206
|
+
out.push({ id: `mrange-fence-s-${x}`, kind: 'barricade', style: 'winter-spears', x, z: b.maxZ });
|
|
207
|
+
}
|
|
208
|
+
for (let z = b.minZ + 1; z <= b.maxZ - 1; z++) {
|
|
209
|
+
out.push({ id: `mrange-fence-w-${z}`, kind: 'barricade', style: 'winter-spears', x: b.minX, z });
|
|
210
|
+
out.push({ id: `mrange-fence-e-${z}`, kind: 'barricade', style: 'winter-spears', x: b.maxX, z });
|
|
211
|
+
}
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
/** The yard's working pieces: the lane targets (real `yardprop` entities the archery drill reads), backstops, firing marks, rack, water, braziers and the sign. */
|
|
215
|
+
export const MARKSMEN_STATIONS = [
|
|
216
|
+
...MARKSMEN_LANES.map((l) => ({ id: l.id, kind: 'yardprop', style: 'butt', x: l.x, z: l.z })),
|
|
217
|
+
...MARKSMEN_LANES.map((l, i) => ({ id: `mrange-backstop-${i + 1}`, kind: 'yardprop', style: 'trainingbackstop', x: l.x, z: l.z - 1 })),
|
|
218
|
+
...MARKSMEN_LANES.map((l, i) => ({ id: `mrange-line-${i + 1}`, kind: 'flowers', style: 'trainingline', x: l.fx, z: l.fz })),
|
|
219
|
+
{ id: 'mrange-rack', kind: 'yardprop', style: 'trainingrack', x: 111, z: 466 },
|
|
220
|
+
{ id: 'mrange-water', kind: 'yardprop', style: 'trainingwater', x: 111, z: 469 },
|
|
221
|
+
{ id: 'mrange-lantern-1', kind: 'lantern', style: 'winter-brazier', x: 110, z: 471 },
|
|
222
|
+
{ id: 'mrange-lantern-2', kind: 'lantern', style: 'winter-brazier', x: 139, z: 471 },
|
|
223
|
+
{ id: 'mrange-lantern-3', kind: 'lantern', style: 'winter-brazier', x: 139, z: 446 },
|
|
224
|
+
{ id: 'mrange-sign', kind: 'signpost', style: 'placard-ew-Marksmen Range: Archery 30-40, three lanes, timed rounds, ask the Range-Master', x: 123, z: 471 },
|
|
225
|
+
];
|
|
226
|
+
// ---- The Range-Master's quest -------------------------------------------------------------------------------------------------------------
|
|
227
|
+
export const MARKSMEN_QUEST_IDS = ['marksmenThreeLanes'];
|
|
228
|
+
const EDDA = { kind: 'resident', name: MARKSMEN_MASTER_NAME };
|
|
229
|
+
const RANGE_AT = { x: MARKSMEN_STAND.x, z: MARKSMEN_STAND.z, label: MARKSMEN_RANGE_NAME };
|
|
230
|
+
export const MARKSMEN_QUEST_GIVER_TEXT = `Range-Master Edda Fenn keeps ${MARKSMEN_RANGE_NAME}, the fenced yard just north of the garrison camp beyond the Northern Gate.`;
|
|
231
|
+
export const MARKSMEN_QUESTS = {
|
|
232
|
+
marksmenThreeLanes: {
|
|
233
|
+
giver: EDDA,
|
|
234
|
+
requires: {
|
|
235
|
+
skill: { skill: 'archery', level: MARKSMEN_MIN_ARCHERY },
|
|
236
|
+
refuse: `The range is for steady hands. Come back at Archery ${MARKSMEN_MIN_ARCHERY}, with your own bow.`,
|
|
237
|
+
},
|
|
238
|
+
offer: "New archers walk in, loose a handful at the near lane, call it a day and go home with a story. That is not a range, that is a hat on a post. Put an arrow in each of my three lanes, near to far, and learn what twenty-two steps does to a draw.",
|
|
239
|
+
accept: `Go in at the gate on the south side of the yard, take a firing mark on the line and shoot each of the three lanes up the yard, 12, 18 and 22 steps. Your own bow in hand (Archery ${MARKSMEN_MIN_ARCHERY}).`,
|
|
240
|
+
decline: 'Then the lanes stay clean, and I stay bored.',
|
|
241
|
+
steps: [
|
|
242
|
+
{
|
|
243
|
+
kind: 'shoot',
|
|
244
|
+
targets: MARKSMEN_LANES.map((l) => l.id),
|
|
245
|
+
qty: MARKSMEN_LANES.length,
|
|
246
|
+
targetLabel: 'Lane',
|
|
247
|
+
label: 'Shoot all three lanes of the Marksmen Range',
|
|
248
|
+
hint: "In the Marksmen Range north of the War Camp, stand on a firing mark on the line and click a target. The farther the lane the harder it is, and the longer it keeps teaching.",
|
|
249
|
+
notices: [
|
|
250
|
+
'The arrow thuds into the near target. Twelve steps, and it flew true. One.',
|
|
251
|
+
'The middle lane takes it low and left. Eighteen steps, and the cold bites the draw. Two.',
|
|
252
|
+
'The far target shudders. Twenty-two steps: that is a long way to be right. Three.',
|
|
253
|
+
],
|
|
254
|
+
at: RANGE_AT,
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
kind: 'talk',
|
|
258
|
+
npc: EDDA,
|
|
259
|
+
label: 'Tell Range-Master Edda Fenn the lanes are holed',
|
|
260
|
+
hint: 'Edda Fenn stands on the firing line of the Marksmen Range, just inside the gate.',
|
|
261
|
+
say: `Three lanes, three holes, no bandaids needed. Now you know the range. Run a timed round with me when you want your name on the board: ${MARKSMEN_ROUND_MS / 1000} seconds, and the far lane pays the most for those who can hit it.`,
|
|
262
|
+
},
|
|
263
|
+
],
|
|
264
|
+
done: 'That is a proper arrival. Take this, and try for the board.',
|
|
265
|
+
after: 'The board has room for five. It has never had enough.',
|
|
266
|
+
rewards: { coins: 700, xp: { archery: 2600, explorer: 1800 } },
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
export const MARKSMEN_QUEST_META = {
|
|
270
|
+
marksmenThreeLanes: {
|
|
271
|
+
title: 'Three Lanes',
|
|
272
|
+
description: `Range-Master Edda Fenn wants an arrow in each of the three lanes of the Marksmen Range, near to far. Needs Archery ${MARKSMEN_MIN_ARCHERY}.`,
|
|
273
|
+
category: 'combat',
|
|
274
|
+
art: { item: 'oakbow' },
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
export const MARKSMEN_GIVER_PLACES = {
|
|
278
|
+
marksmenThreeLanes: MARKSMEN_QUEST_GIVER_TEXT,
|
|
279
|
+
};
|
|
280
|
+
//# sourceMappingURL=marksmenRange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marksmenRange.js","sourceRoot":"","sources":["../src/marksmenRange.ts"],"names":[],"mappings":"AAmBA,+IAA+I;AAE/I,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAElD,mIAAmI;AACnI,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAW,CAAC;AAC1F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,6MAA6M;AAC7M,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAW,CAAC;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAW,CAAC;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAW,CAAC;AACxF,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAW,CAAC;AAC1D,2FAA2F;AAC3F,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,kGAAkG;AAClG,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAElG,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS,EAAE,GAAG,GAAG,CAAC;IAC3D,MAAM,CAAC,GAAG,kBAAkB,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;AAC1F,CAAC;AACD,kHAAkH;AAClH,MAAM,UAAU,oBAAoB,CAAC,CAAS,EAAE,CAAS;IACvD,MAAM,CAAC,GAAG,kBAAkB,CAAC;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9F,CAAC;AACD,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,CAAS;IACnD,MAAM,CAAC,GAAG,gBAAgB,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,iJAAiJ;AAEjJ,MAAM,CAAC,MAAM,uBAAuB,GAAG,cAAc,CAAC;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAmBvC,wKAAwK;AACxK,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAChJ,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAChJ,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;CACjJ,CAAC;AACF,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5D,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,EAA6B;IAC5D,OAAO,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtF,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,EAA6B;IAC5D,OAAO,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC;AACD,+GAA+G;AAC/G,MAAM,UAAU,gBAAgB,CAAC,EAA6B;IAC5D,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED,6IAA6I;AAE7I,qDAAqD;AACrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,oEAAoE;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,MAAM,CAAC;AAClD,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC,wHAAwH;AACxH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAgC;IACjF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,GAAG,sBAAsB,CAAC;IAC/F,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC;AACD,sGAAsG;AACtG,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,IAA2C,EAAE,IAAY;IAC3G,OAAO,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAGD,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAW,CAAC;AAC5E,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,KAAK,IAAI,cAAc,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IAChD,IAAI,KAAK,IAAI,cAAc,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IACpD,IAAI,KAAK,IAAI,cAAc,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAqD;IAC/E,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;IACrD,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE;IACrD,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IACpD,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;CAClD,CAAC;AACF,iHAAiH;AACjH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,MAAM,CAAC;AAEpD,iJAAiJ;AAEjJ,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AAIzD,0FAA0F;AAC1F,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;IAChD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/E,OAAO,GAAG,QAAQ,CAAC,cAAc,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1E,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACpD,CAAC;AACD,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,GAAY,EAAE,KAAa;IAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,CAAC,GAAG,GAAyC,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,GAAkC,CAAC;QAC7C,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;YAAE,SAAS;QAClK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5D,CAAC;AACD,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,IAA4B;IAC3D,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAClG,CAAC;AACD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAkB,EAAE,IAAY,EAAE,KAAa,EAAE,KAAa;IAChG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACpF,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACpD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;IACxH,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC;AACD,qDAAqD;AACrD,MAAM,UAAU,eAAe,CAAC,IAA4B,EAAE,IAAY;IACxE,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,IAAkB;IAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,8FAA8F,CAAC;IAC7H,OAAO,4BAA4B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uCAAuC,CAAC;AACjJ,CAAC;AAED,8IAA8I;AAE9I,oFAAoF;AACpF,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,aAAa;CACX,CAAC;AACX,MAAM,CAAC,MAAM,sBAAsB,GAAqC;IACtE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,mBAAmB;IAC7C,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,mBAAmB;IAC7C,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,mBAAmB;CAC7C,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,oJAAoJ;IAC9J,MAAM,EAAE,sGAAsG;IAC9G,SAAS,EAAE,kGAAkG;IAC7G,KAAK,EAAE,2EAA2E;IAClF,KAAK,EAAE,4CAA4C;IACnD,WAAW,EAAE,uCAAuC,oBAAoB,kDAAkD;IAC1H,OAAO,EAAE,0BAA0B;IACnC,cAAc,EAAE,iFAAiF;IACjG,OAAO,EAAE,0DAA0D;IACnE,OAAO,EAAE,4BAA4B;IACrC,OAAO,EAAE,gGAAgG;CACjG,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAC9B,oBAAoB,iBAAiB,GAAG,IAAI,kOAAkO,oBAAoB,WAAW,cAAc,CAAC,IAAI,gBAAgB,cAAc,CAAC,MAAM,YAAY,cAAc,CAAC,MAAM,yEAAyE,CAAC;AAeld,MAAM,CAAC,MAAM,aAAa,GAAgC;IACxD;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,GAAG,mBAAmB,yBAAyB;QACtD,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK;QAC7J,KAAK,EAAE,wOAAwO;QAC/O,MAAM,EAAE;YACN,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,mBAAmB,EAAE;YAC7D,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,oNAAoN,EAAE;SAC/P;KACF;CACF,CAAC;AACF,MAAM,UAAU,kBAAkB,CAAC,IAAwB;IACzD,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,EAAsB;IACrD,OAAO,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAMD,8GAA8G;AAC9G,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,GAAG,kBAAkB,CAAC;IAC7B,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzJ,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjG,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mKAAmK;AACnK,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACzD,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5G,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrJ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1I,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC9E,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAChF,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IACpF,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IACpF,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IACpF,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2FAA2F,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;CAC5J,CAAC;AAEF,8IAA8I;AAE9I,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,oBAAoB,CAAU,CAAC;AAGlE,MAAM,IAAI,GAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;AAC3E,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAW,CAAC;AACnG,MAAM,CAAC,MAAM,yBAAyB,GAAG,gCAAgC,mBAAmB,6EAA6E,CAAC;AAE1K,MAAM,CAAC,MAAM,eAAe,GAAqD;IAC/E,kBAAkB,EAAE;QAClB,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE;YACR,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE;YACxD,MAAM,EAAE,uDAAuD,oBAAoB,sBAAsB;SAC1G;QACD,KAAK,EACH,mPAAmP;QACrP,MAAM,EAAE,qLAAqL,oBAAoB,IAAI;QACrN,OAAO,EAAE,8CAA8C;QACvD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,EAAE,cAAc,CAAC,MAAM;gBAC1B,WAAW,EAAE,MAAM;gBACnB,KAAK,EAAE,6CAA6C;gBACpD,IAAI,EAAE,8KAA8K;gBACpL,OAAO,EAAE;oBACP,4EAA4E;oBAC5E,0FAA0F;oBAC1F,mFAAmF;iBACpF;gBACD,EAAE,EAAE,QAAQ;aACb;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,IAAI;gBACT,KAAK,EAAE,iDAAiD;gBACxD,IAAI,EAAE,kFAAkF;gBACxF,GAAG,EAAE,yIAAyI,iBAAiB,GAAG,IAAI,oEAAoE;aAC3O;SACF;QACD,IAAI,EAAE,6DAA6D;QACnE,KAAK,EAAE,uDAAuD;QAC9D,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;KAC/D;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAE5B;IACF,kBAAkB,EAAE;QAClB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,sHAAsH,oBAAoB,GAAG;QAC1J,QAAQ,EAAE,QAAQ;QAClB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACxB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAA8C;IAC9E,kBAAkB,EAAE,yBAAyB;CAC9C,CAAC"}
|
package/dist/quests.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quests.d.ts","sourceRoot":"","sources":["../src/quests.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkD,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"quests.d.ts","sourceRoot":"","sources":["../src/quests.ts"],"names":[],"mappings":"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"}
|
package/dist/quests.js
CHANGED
|
@@ -19,7 +19,9 @@ import { NOBLE_INTRIGUE_META } from './nobleIntrigue.js';
|
|
|
19
19
|
import { CLOISTER_ROUND_META } from './cloisterRound.js';
|
|
20
20
|
import { THAW_FISHING_META } from './thawFishing.js';
|
|
21
21
|
import { ROAD_TABLE_META } from './longRoadTable.js';
|
|
22
|
+
import { TIMBER_ERRAND_META } from './timberErrands.js';
|
|
22
23
|
import { WAR_CAMP_META } from './warCampDrill.js';
|
|
24
|
+
import { MARKSMEN_QUEST_META } from './marksmenRange.js';
|
|
23
25
|
import { WARDENS_WRIT_META } from './wardensBounty.js';
|
|
24
26
|
import { EARLY_WRIT_META } from './earlyWrits.js';
|
|
25
27
|
import { BORDER_JOB_META } from './borderJobs.js';
|
|
@@ -1442,6 +1444,37 @@ export const QUEST_META = {
|
|
|
1442
1444
|
category: 'side',
|
|
1443
1445
|
art: { item: 'ashwood' },
|
|
1444
1446
|
}),
|
|
1447
|
+
// Saltgrass Downs (saltgrassQuestDef.ts, 2026-10-18): the open sheep country east of Riversend Halt, levels 14-24.
|
|
1448
|
+
theFirstDrove: storyMeta('theFirstDrove', {
|
|
1449
|
+
title: 'The First Drove',
|
|
1450
|
+
description: 'Head Drover Hob Marlowe needs six ewes walked from the high pasture pens to the Riversend Fold before the wool buyer comes. Open a pen gate, keep the flock close on the drove road through the wolves and the rustlers, and read the Count Board at the fold.',
|
|
1451
|
+
category: 'side',
|
|
1452
|
+
art: { item: 'wool' },
|
|
1453
|
+
}),
|
|
1454
|
+
fleeceAndFang: storyMeta('fleeceAndFang', {
|
|
1455
|
+
title: 'Fleece and Fang',
|
|
1456
|
+
description: 'Shepherd Tilly Ashworth finds torn fleece on the gorse every morning. Look over the three tufts along wolf country\'s south edge and put down five downs wolves.',
|
|
1457
|
+
category: 'side',
|
|
1458
|
+
art: { item: 'wolfpelt' },
|
|
1459
|
+
}),
|
|
1460
|
+
saltForThePot: storyMeta('saltForThePot', {
|
|
1461
|
+
title: 'Salt for the Pot',
|
|
1462
|
+
description: 'Cook Dilys Ferris wants sea salt raked from the Salt Pans (Foraging 9) and tide snapper off the Eastshore pegs (Fishing 14), and two grilled snapper cooked at a fire. She buys food; she does not sell it.',
|
|
1463
|
+
category: 'side',
|
|
1464
|
+
art: { item: 'cookedtidesnapper' },
|
|
1465
|
+
}),
|
|
1466
|
+
theRustlersCut: storyMeta('theRustlersCut', {
|
|
1467
|
+
title: "The Rustlers' Cut",
|
|
1468
|
+
description: 'Bounty Steward Cass Roper wants the three cut hurdles at the rustlers\' camp looked over and four rustlers put down, so the drovers know the Downs are watched.',
|
|
1469
|
+
category: 'side',
|
|
1470
|
+
art: { item: 'ironbar' },
|
|
1471
|
+
}),
|
|
1472
|
+
greybackOfTheDowns: storyMeta('greybackOfTheDowns', {
|
|
1473
|
+
title: 'Greyback',
|
|
1474
|
+
description: "Lookout Jem Harker has watched one grey wolf for three summers. Light the beacon basket on the Lookout Mound and put Greyback down on his stony knoll. His Pounce is told a full turn ahead: step out of the ring. Needs The First Drove.",
|
|
1475
|
+
category: 'side',
|
|
1476
|
+
art: { item: 'wolfpelt' },
|
|
1477
|
+
}),
|
|
1445
1478
|
// Greenwood Wilds (greenwoodQuest.ts): the Western Kingdoms' wild stretch between Brindlecross and Riversend.
|
|
1446
1479
|
// The Long Winter (longWinter.ts, T75): Heron's Rest, Millbrook, Hask's cabin and the Bear Floes camp, levels 30-40.
|
|
1447
1480
|
// The Dwarf Hold hub (dwarfHoldHub.ts, T93): six quests from the smith, the cook, the archivist and Warden Thrida, levels 28-38.
|
|
@@ -1551,10 +1584,18 @@ export const QUEST_META = {
|
|
|
1551
1584
|
cloudberriesForHask: storyMeta('cloudberriesForHask', ROAD_TABLE_META.cloudberriesForHask),
|
|
1552
1585
|
charWithJuniper: storyMeta('charWithJuniper', ROAD_TABLE_META.charWithJuniper),
|
|
1553
1586
|
theLongRoadSupper: storyMeta('theLongRoadSupper', ROAD_TABLE_META.theLongRoadSupper),
|
|
1587
|
+
// Woodwork 31-40 (timberErrands.ts, wave 3).
|
|
1588
|
+
spokesForTheSpur: storyMeta('spokesForTheSpur', TIMBER_ERRAND_META.spokesForTheSpur),
|
|
1589
|
+
aWheelForThePass: storyMeta('aWheelForThePass', TIMBER_ERRAND_META.aWheelForThePass),
|
|
1590
|
+
duckboardsForTheRim: storyMeta('duckboardsForTheRim', TIMBER_ERRAND_META.duckboardsForTheRim),
|
|
1591
|
+
stavesForTheFletcher: storyMeta('stavesForTheFletcher', TIMBER_ERRAND_META.stavesForTheFletcher),
|
|
1592
|
+
casksForTheGalley: storyMeta('casksForTheGalley', TIMBER_ERRAND_META.casksForTheGalley),
|
|
1554
1593
|
// Fenwick's War Camp drill chain (warCampDrill.ts, T108).
|
|
1555
1594
|
warCampLongLane: storyMeta('warCampLongLane', WAR_CAMP_META.warCampLongLane),
|
|
1556
1595
|
warCampFallIn: storyMeta('warCampFallIn', WAR_CAMP_META.warCampFallIn),
|
|
1557
1596
|
warCampIronDrill: storyMeta('warCampIronDrill', WAR_CAMP_META.warCampIronDrill),
|
|
1597
|
+
// Edda Fenn's Marksmen Range (marksmenRange.ts, wave 3).
|
|
1598
|
+
marksmenThreeLanes: storyMeta('marksmenThreeLanes', MARKSMEN_QUEST_META.marksmenThreeLanes),
|
|
1558
1599
|
// Contract work 21-30 (wardensBounty.ts, T103).
|
|
1559
1600
|
wardensCrowWrit: storyMeta('wardensCrowWrit', WARDENS_WRIT_META.wardensCrowWrit),
|
|
1560
1601
|
wardensCoastWrit: storyMeta('wardensCoastWrit', WARDENS_WRIT_META.wardensCoastWrit),
|