@dreadwood-types/types 0.1.364 → 0.1.366
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/areaGates.d.ts.map +1 -1
- package/dist/areaGates.js +16 -0
- package/dist/areaGates.js.map +1 -1
- package/dist/attackableNpcs.d.ts.map +1 -1
- package/dist/attackableNpcs.js +2 -0
- package/dist/attackableNpcs.js.map +1 -1
- package/dist/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/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +2 -0
- package/dist/legacy.d.ts.map +1 -1
- package/dist/legacy.js +2 -0
- package/dist/legacy.js.map +1 -1
- package/dist/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 +29 -0
- package/dist/quests.js.map +1 -1
- package/dist/serpentStones.d.ts +316 -0
- package/dist/serpentStones.d.ts.map +1 -0
- package/dist/serpentStones.js +340 -0
- package/dist/serpentStones.js.map +1 -0
- package/dist/serpentStonesQuestDef.d.ts +22 -0
- package/dist/serpentStonesQuestDef.d.ts.map +1 -0
- package/dist/serpentStonesQuestDef.js +132 -0
- package/dist/serpentStonesQuestDef.js.map +1 -0
- package/dist/storyQuests.d.ts +3 -1
- package/dist/storyQuests.d.ts.map +1 -1
- package/dist/storyQuests.js +21 -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';
|
|
@@ -1349,6 +1351,25 @@ export const QUEST_META = {
|
|
|
1349
1351
|
category: 'side',
|
|
1350
1352
|
art: { item: 'steelbar' },
|
|
1351
1353
|
}),
|
|
1354
|
+
// The Serpent Stones (serpentStonesQuestDef.ts, 2026-10-19): the Coil on the Dwarf Road's east floor, levels 31-40.
|
|
1355
|
+
theOrderOfStones: storyMeta('theOrderOfStones', {
|
|
1356
|
+
title: 'The Order of Stones',
|
|
1357
|
+
description: "Rubbing-Clerk Corin Tave wants a warm rubbing of each of the Coil's seven slabs. A slab warms only when it is touched in the Sun Plaque's order, and a wrong touch wakes two serpents.",
|
|
1358
|
+
category: 'side',
|
|
1359
|
+
art: { item: 'coal' },
|
|
1360
|
+
}),
|
|
1361
|
+
theSerpentsMouth: storyMeta('theSerpentsMouth', {
|
|
1362
|
+
title: "The Serpent's Mouth",
|
|
1363
|
+
description: "Slab-Reader Ysolde Marrow thinks the seven slabs are a key. Warm the whole Coil in one run, in the Sun Plaque's order, and stand before the Serpent's Mouth in the cliff when it opens. Needs The Order of Stones.",
|
|
1364
|
+
category: 'side',
|
|
1365
|
+
art: { item: 'silverbar' },
|
|
1366
|
+
}),
|
|
1367
|
+
oldBasaltback: storyMeta('oldBasaltback', {
|
|
1368
|
+
title: 'Old Basaltback',
|
|
1369
|
+
description: "Pass Scout Wynne Hale wants Old Basaltback put down: the huge basalt-plated serpent coiled round the cache in the vault behind the Serpent's Mouth. His Coil Slam is told a turn ahead. Then open the cache. Needs The Serpent's Mouth.",
|
|
1370
|
+
category: 'side',
|
|
1371
|
+
art: { item: 'steelbar' },
|
|
1372
|
+
}),
|
|
1352
1373
|
// Gannet Point (gannetPointQuestDef.ts, 2026-10-18): the wooded headland south of Lantern Wake, levels 22-28.
|
|
1353
1374
|
readingTheTide: storyMeta('readingTheTide', {
|
|
1354
1375
|
title: 'Reading the Tide',
|
|
@@ -1582,10 +1603,18 @@ export const QUEST_META = {
|
|
|
1582
1603
|
cloudberriesForHask: storyMeta('cloudberriesForHask', ROAD_TABLE_META.cloudberriesForHask),
|
|
1583
1604
|
charWithJuniper: storyMeta('charWithJuniper', ROAD_TABLE_META.charWithJuniper),
|
|
1584
1605
|
theLongRoadSupper: storyMeta('theLongRoadSupper', ROAD_TABLE_META.theLongRoadSupper),
|
|
1606
|
+
// Woodwork 31-40 (timberErrands.ts, wave 3).
|
|
1607
|
+
spokesForTheSpur: storyMeta('spokesForTheSpur', TIMBER_ERRAND_META.spokesForTheSpur),
|
|
1608
|
+
aWheelForThePass: storyMeta('aWheelForThePass', TIMBER_ERRAND_META.aWheelForThePass),
|
|
1609
|
+
duckboardsForTheRim: storyMeta('duckboardsForTheRim', TIMBER_ERRAND_META.duckboardsForTheRim),
|
|
1610
|
+
stavesForTheFletcher: storyMeta('stavesForTheFletcher', TIMBER_ERRAND_META.stavesForTheFletcher),
|
|
1611
|
+
casksForTheGalley: storyMeta('casksForTheGalley', TIMBER_ERRAND_META.casksForTheGalley),
|
|
1585
1612
|
// Fenwick's War Camp drill chain (warCampDrill.ts, T108).
|
|
1586
1613
|
warCampLongLane: storyMeta('warCampLongLane', WAR_CAMP_META.warCampLongLane),
|
|
1587
1614
|
warCampFallIn: storyMeta('warCampFallIn', WAR_CAMP_META.warCampFallIn),
|
|
1588
1615
|
warCampIronDrill: storyMeta('warCampIronDrill', WAR_CAMP_META.warCampIronDrill),
|
|
1616
|
+
// Edda Fenn's Marksmen Range (marksmenRange.ts, wave 3).
|
|
1617
|
+
marksmenThreeLanes: storyMeta('marksmenThreeLanes', MARKSMEN_QUEST_META.marksmenThreeLanes),
|
|
1589
1618
|
// Contract work 21-30 (wardensBounty.ts, T103).
|
|
1590
1619
|
wardensCrowWrit: storyMeta('wardensCrowWrit', WARDENS_WRIT_META.wardensCrowWrit),
|
|
1591
1620
|
wardensCoastWrit: storyMeta('wardensCoastWrit', WARDENS_WRIT_META.wardensCoastWrit),
|