@dreadwood-types/types 0.1.266 → 0.1.267

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.
@@ -0,0 +1,301 @@
1
+ /**
2
+ * THE HEARTWOOD HUNT (proposal A7 in the backend's AREA_PROPOSALS.md, 2026-10-14; early-game program track T74; levels 24-32).
3
+ * Every three hours a great heartwood tree rises somewhere in the Rotwood Grove for 15 minutes. Cutting it needs Woodwork (24+),
4
+ * and the Rotwood Ent's brood of moss wolves comes for the cutters, so Combat matters just as much: the people who cut AND the people
5
+ * who guard share a podium, in the Grove, where other players can attack and nobody heals (the Dreadwoods' no-healing rule).
6
+ *
7
+ * Everything here is pure: the clock, the places, the scoring, the prizes and the saved state, so the server, a test and the login line
8
+ * agree. Round n starts at `n * HUNT_PERIOD_MS + HUNT_OFFSET_MS`, so a restart, a deploy or a second server agree on the round and the
9
+ * tree's place without saving anything. The offset keeps it clear of Ringstone's fights (the 3-hour marks plus 0, 60 and 90 minutes)
10
+ * and of the Fishing Derby (even hours at :40).
11
+ *
12
+ * The scoring is built against collusion and farming (abuse-first):
13
+ * - only OWN actions score: a successful cut of the tree, a kill of the round's own brood. A player kill, a death or a trade scores
14
+ * nothing, so an ambush at the tree takes cuts from nobody and a friend cannot be fed points;
15
+ * - each side is capped (16 cuts, 8 brood kills) so no one can run away with the board, and past the cut cap a cut still helps the
16
+ * tree fall, which is the shared goal;
17
+ * - one place per ACCOUNT (a shared account or an alt takes no second prize), a minimum score to be paid at all, a podium only when
18
+ * three different accounts qualified AND the tree fell, and at most four paid rounds per account per UTC day;
19
+ * - ties go to whoever reached the score first, then the character key, so the order is total;
20
+ * - prizes are Woodwork XP, Explorer XP and logs: no coins, nothing that outclasses the gated 41+ gear.
21
+ *
22
+ * Amounts are PLACEHOLDERS for the balance pass, done last with James.
23
+ */
24
+ import type { LanternWakeBox } from './lanternWake.js';
25
+ /** Time from one round's start to the next. */
26
+ export declare const HUNT_PERIOD_MS: number;
27
+ /** Round n starts this long after the n-th period mark (Ringstone fights start at 0, 60 and 90 minutes; the Derby at :40 of even hours). */
28
+ export declare const HUNT_OFFSET_MS: number;
29
+ /** How long the heartwood stands. */
30
+ export declare const HUNT_ROUND_MS: number;
31
+ /** How long the result board stays up after the round. */
32
+ export declare const HUNT_RESULTS_MS: number;
33
+ /** The warning before the round starts, and the warning before it ends. */
34
+ export declare const HUNT_SOON_MS: number;
35
+ export declare const HUNT_LAST_MS: number;
36
+ /** idle (nothing announced), soon, open, last (final minutes), results (the board is up). */
37
+ export type HuntStage = 'idle' | 'soon' | 'open' | 'last' | 'results';
38
+ export declare const HUNT_STAGES: readonly HuntStage[];
39
+ export declare function isHuntStage(s: unknown): s is HuntStage;
40
+ export declare function huntStartOf(slot: number): number;
41
+ export declare function huntEndOf(slot: number): number;
42
+ export type HuntClock = {
43
+ /** The round this stage is about: the open or just-finished one, else the next to start. */
44
+ slot: number;
45
+ stage: HuntStage;
46
+ /** Time to this round's start (0 once it has begun). */
47
+ msToStart: number;
48
+ /** Time to this round's end (0 once it is over). */
49
+ msToEnd: number;
50
+ };
51
+ export declare function huntClockAt(now: number): HuntClock;
52
+ /** True while the tree stands and cuts and brood kills count. */
53
+ export declare function huntIsOpen(stage: HuntStage): boolean;
54
+ /** The next round to start strictly after `now` (for the login line): its slot and start. */
55
+ export declare function huntNextRound(now: number): {
56
+ slot: number;
57
+ startsAt: number;
58
+ };
59
+ /** The UTC day a time falls in (the daily paid-rounds cap resets at midnight UTC). */
60
+ export declare function huntDayOf(now: number): number;
61
+ /**
62
+ * Where the heartwood can rise (world tiles, inside the Grove's clearing, clear of every prop and of the Ent's path; the backend
63
+ * smoke pins each one standable with a standable ring round it). Five places, the tree never in the same one twice running.
64
+ */
65
+ export declare const HUNT_SPOTS: readonly {
66
+ id: string;
67
+ x: number;
68
+ z: number;
69
+ label: string;
70
+ }[];
71
+ /** The place of a round. Consecutive rounds never share one (the step is 2 inside a block of five rounds and 3 across a block edge). */
72
+ export declare function huntSpotFor(slot: number): (typeof HUNT_SPOTS)[number];
73
+ /** The tree: an ash (the ladder's level-30 wood) drawn large; the server places it while a round is on and takes it away after. */
74
+ export declare const HUNT_TREE_ID = "hh-tree";
75
+ export declare const HUNT_TREE_STYLE = "ash";
76
+ export declare const HUNT_TREE_SCALE = 1.8;
77
+ /** Woodwork needed to take a swing at the heartwood. */
78
+ export declare const HUNT_MIN_WOODWORK = 24;
79
+ /** The tree's level in the felling roll (types woodwork.ts woodcutSuccessChance): between alder (25) and ash (30). */
80
+ export declare const HUNT_TREE_LEVEL = 28;
81
+ /** Successful cuts, from everyone together, that fell the heartwood. PLACEHOLDER. */
82
+ export declare const HUNT_TREE_CUTS = 90;
83
+ /** The log a cut yields (alder is the Woodwork ladder's level-25 wood: a placeholder for rotwood), and how many a player gets per round. */
84
+ export declare const HUNT_CUT_LOG = "alderwood";
85
+ export declare const HUNT_LOGS_PER_PLAYER = 12;
86
+ /** Woodwork XP for a scored cut. */
87
+ export declare const HUNT_CUT_XP = 30;
88
+ export declare const HUNT_CUT_POINTS = 2;
89
+ export declare const HUNT_KILL_POINTS = 3;
90
+ /** Past these a cut or a kill still helps (the tree still falls) but scores nothing more. */
91
+ export declare const HUNT_CUT_CAP = 16;
92
+ export declare const HUNT_KILL_CAP = 8;
93
+ /** The least score that counts as having taken part (3 cuts, or 2 kills). Below it: no prize, no mark. */
94
+ export declare const HUNT_MIN_SCORE = 6;
95
+ /** Podium prizes need at least this many different accounts above the minimum, and the tree felled. */
96
+ export declare const HUNT_MIN_HUNTERS = 3;
97
+ /** Paid rounds per account per UTC day (alts and shared accounts cannot farm every round of the day). */
98
+ export declare const HUNT_DAILY_PAID_ROUNDS = 4;
99
+ export declare function huntScore(cuts: number, kills: number): number;
100
+ export type HuntEntry = {
101
+ /** characterId. */
102
+ key: string;
103
+ /** The account, so one account's characters cannot all take prizes. Empty when unknown (then the key stands in). */
104
+ account: string;
105
+ name: string;
106
+ /** Successful cuts and brood kills this round (uncapped; the score caps them). */
107
+ cuts: number;
108
+ kills: number;
109
+ /** Logs already handed over this round (capped per player). */
110
+ logs: number;
111
+ /** When the score last rose (ties go to whoever reached the score first). */
112
+ at: number;
113
+ };
114
+ export declare function huntEntryScore(e: Pick<HuntEntry, 'cuts' | 'kills'>): number;
115
+ type Who = {
116
+ key: string;
117
+ account: string;
118
+ name: string;
119
+ };
120
+ /** One successful cut by this character. `gaveLog` is true when a log went to the bag. Returns a new entry (the old is untouched). */
121
+ export declare function huntWithCut(entry: HuntEntry | undefined, who: Who, gaveLog: boolean, at: number): HuntEntry;
122
+ /** One brood kill by this character. */
123
+ export declare function huntWithKill(entry: HuntEntry | undefined, who: Who, at: number): HuntEntry;
124
+ /** Does a log still go to this character's bag (before the cut that would give it)? */
125
+ export declare function huntLogDue(entry: HuntEntry | undefined): boolean;
126
+ export declare function huntQualifies(e: HuntEntry): boolean;
127
+ /**
128
+ * The ranking: higher score first, then whoever reached it first, then the key (a total order a test can pin). One place per ACCOUNT:
129
+ * of an account's characters only the best-placed one is listed. Entries below the minimum score are not ranked.
130
+ */
131
+ export declare function huntRanking(entries: readonly HuntEntry[]): HuntEntry[];
132
+ /** The 1-based place of a character in the ranking (ranked entries only), or 0. */
133
+ export declare function huntPlaceOf(entries: readonly HuntEntry[], key: string): number;
134
+ export type HuntRibbon = 'red' | 'blue' | 'bronze';
135
+ export declare const HUNT_RIBBON_LABEL: Readonly<Record<HuntRibbon, string>>;
136
+ /** PLACEHOLDER prizes by place (felled tree only): Woodwork XP, Explorer XP and ash logs. */
137
+ export declare const HUNT_PODIUM_PRIZES: readonly {
138
+ woodworkXp: number;
139
+ explorerXp: number;
140
+ ash: number;
141
+ }[];
142
+ /** Everyone paid who qualified. A tree that stood to the end halves the XP and gives no logs. */
143
+ export declare const HUNT_PARTICIPATION: {
144
+ readonly woodworkXp: 120;
145
+ readonly explorerXp: 20;
146
+ readonly alder: 2;
147
+ };
148
+ /** Ledger marks (types explorerLedger.ts `hunt` page) a result can write. */
149
+ export declare const HUNT_MARK_ENTERED = "hunt:entered";
150
+ export declare const HUNT_MARK_FELLED = "hunt:felled";
151
+ export declare const HUNT_MARK_CUTTER = "hunt:cutter";
152
+ export declare const HUNT_MARK_GUARD = "hunt:guard";
153
+ export declare const HUNT_MARK_RIBBON: Readonly<Record<HuntRibbon, string>>;
154
+ export type HuntItem = {
155
+ kind: string;
156
+ qty: number;
157
+ };
158
+ /** What one character is owed for a round. */
159
+ export type HuntPrize = {
160
+ woodworkXp: number;
161
+ explorerXp: number;
162
+ items: HuntItem[];
163
+ /** Ledger marks to write. */
164
+ marks: string[];
165
+ /** The chat line they are told. */
166
+ text: string;
167
+ };
168
+ /** The paid-rounds record: per account, the day and how many rounds were paid that day. */
169
+ export type HuntPaid = Record<string, {
170
+ day: number;
171
+ n: number;
172
+ }>;
173
+ /** Paid rounds this account has had on this UTC day. */
174
+ export declare function huntPaidToday(paid: HuntPaid, account: string, day: number): number;
175
+ /** The record after one more paid round for these accounts (old days dropped). Returns a new object. */
176
+ export declare function huntWithPaid(paid: HuntPaid, accounts: readonly string[], day: number): HuntPaid;
177
+ export type HuntPrizeInput = {
178
+ felled: boolean;
179
+ paid: HuntPaid;
180
+ day: number;
181
+ };
182
+ /**
183
+ * Everything a finished round pays, by character key. One prize per account (the ranking lists an account once). An account that has
184
+ * had its four paid rounds today is skipped (the podium moves up to the next account). Pure, so a restart that finalises a round late
185
+ * pays exactly what the clock-time finalise would have.
186
+ */
187
+ export declare function huntPrizes(entries: readonly HuntEntry[], input: HuntPrizeInput): Map<string, HuntPrize>;
188
+ /** The world chat line for a finished round. */
189
+ export declare function huntResultLine(entries: readonly HuntEntry[], felled: boolean): string;
190
+ export declare const HUNT_NAME = "Heartwood Hunt";
191
+ /** The world chat line for a stage (idle and results have none: the results line is built from the standings). */
192
+ export declare function huntChatLine(stage: HuntStage, slot: number): string | null;
193
+ /** The login line's piece about the hunt. */
194
+ export declare function huntTodayText(now: number): string;
195
+ /** What /hunt tells a player. */
196
+ export declare function huntStatusLines(clock: HuntClock, entries: readonly HuntEntry[], myKey: string | null, cutsDone: number, now: number): string[];
197
+ /**
198
+ * The Rotwood Ent's brood: moss wolves (the Grove's own kind), sent in waves while the tree stands. Levels follow the hunters' average
199
+ * Combat, clamped; the count follows how many are at the tree. PLACEHOLDERS.
200
+ */
201
+ export declare const HUNT_BROOD: {
202
+ readonly kind: "mosswolf";
203
+ readonly idPrefix: "hh-";
204
+ readonly firstWave: 3;
205
+ readonly waveEveryMs: 40000;
206
+ readonly perExtraHunter: 1;
207
+ readonly waveMax: 7;
208
+ readonly aliveCap: 14;
209
+ /** Wolves come out of the dead wood this far from the tree. */
210
+ readonly spawnMin: 6;
211
+ readonly spawnMax: 9;
212
+ readonly aggroRadius: 10;
213
+ readonly leashRadius: 16;
214
+ readonly minLevel: 22;
215
+ readonly maxLevel: 32;
216
+ /** A hunter is "at the tree" this close. */
217
+ readonly nearTree: 12;
218
+ readonly aggroText: "A wolf of the Ent's brood bursts from the roots at you!";
219
+ };
220
+ /** How many wolves a wave brings: the first wave is fixed; later ones grow with the hunters at the tree. */
221
+ export declare function huntWaveSize(wave: number, hunters: number): number;
222
+ /** The brood's level for a party's average Combat. */
223
+ export declare function huntBroodLevel(avgCombat: number): number;
224
+ /**
225
+ * The Ent's grasp, the mini-boss telegraph: the roots under the heartwood heave. A chat line goes out `HUNT_GRASP.leadMs` ahead
226
+ * naming the tiles; whoever is still within `radius` of the tree when it lands takes the blow, whoever stepped out takes nothing.
227
+ * (The real mini-boss, a drawn ground ring and a Sapling Ent, are logged as upgrades.)
228
+ */
229
+ export declare const HUNT_GRASP: {
230
+ readonly everyMs: 50000;
231
+ readonly leadMs: 3000;
232
+ readonly radius: 2;
233
+ /** Raw damage before armour: PLACEHOLDER. */
234
+ readonly damage: 14;
235
+ readonly warn: "The roots under the heartwood heave! Step away from the trunk!";
236
+ readonly hit: "The Ent's roots lash up and seize you!";
237
+ readonly dodged: "You step clear as the roots slam down.";
238
+ };
239
+ /** Who stands within `radius` (Chebyshev) of the centre. */
240
+ export declare function huntInGrasp<T extends {
241
+ x: number;
242
+ y: number;
243
+ }>(centre: {
244
+ x: number;
245
+ z: number;
246
+ }, players: readonly T[], radius?: number): T[];
247
+ export declare const FORESTER_NAME = "Forester Imre Thorne";
248
+ export declare const FORESTER_ID = "forester";
249
+ /** The forester's lean-to camp on the way into the Grove, just south of the Grove's path end (z 400): a PvP-off pocket (types safePockets.ts). */
250
+ export declare const HEARTWOOD_CAMP: LanternWakeBox;
251
+ export declare const FORESTER_SPOT: {
252
+ readonly x: 330;
253
+ readonly z: number;
254
+ readonly faceX: 330;
255
+ readonly faceZ: number;
256
+ };
257
+ /** The camp's placard. */
258
+ export declare const HEARTWOOD_CAMP_SIGN = "The Forester's Camp. No fighting inside the lanterns. A heartwood rises in the Rotwood Grove, north, every three hours (Woodwork 24 to cut it). The Grove is PvP ground.";
259
+ export type HeartwoodCampProp = {
260
+ id: string;
261
+ kind: 'dreadprop' | 'campfire' | 'barrel' | 'lantern' | 'signpost';
262
+ style: string;
263
+ x: number;
264
+ z: number;
265
+ scale?: number;
266
+ };
267
+ /** Stand-in pieces from the Dreadwoods kit (logged as an upgrade): a tent, the fire, crates, a barrel, lanterns and a sign. */
268
+ export declare const HEARTWOOD_CAMP_PIECES: readonly HeartwoodCampProp[];
269
+ export declare const HEARTWOOD_CAMP_ENTER = "You step into the forester's camp. Nobody can attack you here, and the Grove's wolves do not come this far.";
270
+ export declare const HEARTWOOD_CAMP_LEAVE = "You step out of the forester's camp. This is Dreadwoods ground again: other players can attack you.";
271
+ export type HuntSave = {
272
+ v: 1;
273
+ /** The round the entries belong to (-1 = none). */
274
+ slot: number;
275
+ /** The stage last announced for `announced.slot`. */
276
+ announced: {
277
+ slot: number;
278
+ stage: HuntStage;
279
+ } | null;
280
+ /** True once `slot`'s results have been worked out and paid or queued. */
281
+ finalized: boolean;
282
+ /** True once the tree has fallen this round (the round ends there). */
283
+ felled: boolean;
284
+ /** Successful cuts so far this round, from everyone. */
285
+ cutsDone: number;
286
+ /** Brood waves sent this round. */
287
+ waves: number;
288
+ entries: HuntEntry[];
289
+ /** Prizes for characters who were offline when the round ended, by characterId. */
290
+ pending: Record<string, HuntPrize[]>;
291
+ /** Paid rounds per account per UTC day. */
292
+ paid: HuntPaid;
293
+ };
294
+ export declare function emptyHuntSave(): HuntSave;
295
+ /** At most this many prizes wait for one character, and entries are never more than this many. */
296
+ export declare const HUNT_PENDING_MAX = 5;
297
+ export declare const HUNT_MAX_ENTRIES = 1000;
298
+ /** A saved state, checked field by field (it comes from the database); anything wrong gives the empty state. */
299
+ export declare function parseHuntSave(raw: unknown): HuntSave;
300
+ export {};
301
+ //# sourceMappingURL=heartwoodHunt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartwoodHunt.d.ts","sourceRoot":"","sources":["../src/heartwoodHunt.ts"],"names":[],"mappings":"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"}