@dreadwood-types/types 0.1.317 → 0.1.319

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/campKitchens.d.ts.map +1 -1
  2. package/dist/campKitchens.js +4 -0
  3. package/dist/campKitchens.js.map +1 -1
  4. package/dist/campTraders.d.ts.map +1 -1
  5. package/dist/campTraders.js +3 -0
  6. package/dist/campTraders.js.map +1 -1
  7. package/dist/dailyHooks.d.ts.map +1 -1
  8. package/dist/dailyHooks.js +6 -0
  9. package/dist/dailyHooks.js.map +1 -1
  10. package/dist/expandedContracts.d.ts.map +1 -1
  11. package/dist/expandedContracts.js +4 -1
  12. package/dist/expandedContracts.js.map +1 -1
  13. package/dist/explorerLedger.d.ts +7 -1
  14. package/dist/explorerLedger.d.ts.map +1 -1
  15. package/dist/explorerLedger.js +15 -0
  16. package/dist/explorerLedger.js.map +1 -1
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/legacy.d.ts +2 -0
  22. package/dist/legacy.d.ts.map +1 -1
  23. package/dist/legacy.js +2 -0
  24. package/dist/legacy.js.map +1 -1
  25. package/dist/millstreamHamlet.d.ts +302 -0
  26. package/dist/millstreamHamlet.d.ts.map +1 -0
  27. package/dist/millstreamHamlet.js +364 -0
  28. package/dist/millstreamHamlet.js.map +1 -0
  29. package/dist/millstreamQuestDef.d.ts +42 -0
  30. package/dist/millstreamQuestDef.d.ts.map +1 -0
  31. package/dist/millstreamQuestDef.js +252 -0
  32. package/dist/millstreamQuestDef.js.map +1 -0
  33. package/dist/quests.d.ts.map +1 -1
  34. package/dist/quests.js +31 -0
  35. package/dist/quests.js.map +1 -1
  36. package/dist/storyQuests.d.ts +1 -1
  37. package/dist/storyQuests.d.ts.map +1 -1
  38. package/dist/storyQuests.js +18 -0
  39. package/dist/storyQuests.js.map +1 -1
  40. package/dist/storyWindows.d.ts +1 -1
  41. package/dist/storyWindows.d.ts.map +1 -1
  42. package/dist/storyWindows.js +6 -1
  43. package/dist/storyWindows.js.map +1 -1
  44. package/dist/timberConvoy.d.ts +282 -0
  45. package/dist/timberConvoy.d.ts.map +1 -0
  46. package/dist/timberConvoy.js +547 -0
  47. package/dist/timberConvoy.js.map +1 -0
  48. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- export type StoryWindow = 'low-tide' | 'night' | 'blood-low' | 'blood-moon' | 'red-low' | 'ice-hold';
1
+ export type StoryWindow = 'low-tide' | 'night' | 'blood-low' | 'blood-moon' | 'red-low' | 'ice-hold' | 'mill-flow';
2
2
  export declare const STORY_WINDOWS: readonly StoryWindow[];
3
3
  export declare function storyWindowOpen(window: StoryWindow, nowMs: number): boolean;
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"storyWindows.d.ts","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AACrG,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAA4E,CAAC;AAE7H,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAS3E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS9E;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1E"}
1
+ {"version":3,"file":"storyWindows.d.ts","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AACnH,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAAyF,CAAC;AAE1I,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAU3E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM1E"}
@@ -7,7 +7,8 @@
7
7
  import { SEA_GROTTO_TIDE_CYCLE_MS, isSaltmarkLampLit, isSeaGrottoLowWater, seaGrottoTideLine } from './gullsLowWater.js';
8
8
  import { BLOOD_TIDE_CYCLE_MS, bloodTideLine, isBloodLow, isBloodMoon, isRedLow } from './tideOfBlood.js';
9
9
  import { THAW_ICE_CYCLE_MS, isThawIceHolding, thawIceLine } from './thawCrossing.js';
10
- export const STORY_WINDOWS = ['low-tide', 'night', 'blood-low', 'blood-moon', 'red-low', 'ice-hold'];
10
+ import { MILL_FLOW_CYCLE_MS, isMillFlowing, millRaceLine } from './millstreamHamlet.js';
11
+ export const STORY_WINDOWS = ['low-tide', 'night', 'blood-low', 'blood-moon', 'red-low', 'ice-hold', 'mill-flow'];
11
12
  export function storyWindowOpen(window, nowMs) {
12
13
  switch (window) {
13
14
  case 'low-tide': return isSeaGrottoLowWater(nowMs);
@@ -16,6 +17,7 @@ export function storyWindowOpen(window, nowMs) {
16
17
  case 'blood-moon': return isBloodMoon(nowMs);
17
18
  case 'red-low': return isRedLow(nowMs);
18
19
  case 'ice-hold': return isThawIceHolding(nowMs);
20
+ case 'mill-flow': return isMillFlowing(nowMs);
19
21
  }
20
22
  }
21
23
  /**
@@ -31,6 +33,7 @@ export function storyWindowInstance(window, nowMs) {
31
33
  case 'night':
32
34
  case 'blood-moon': return Math.floor((nowMs + 6 * 3_600_000) / 86_400_000);
33
35
  case 'ice-hold': return Math.floor(nowMs / THAW_ICE_CYCLE_MS);
36
+ case 'mill-flow': return Math.floor(nowMs / MILL_FLOW_CYCLE_MS);
34
37
  }
35
38
  }
36
39
  /** The line added after a step's `wait` when its window is shut ('' when there is nothing to add). */
@@ -41,6 +44,8 @@ export function storyWindowLine(window, nowMs) {
41
44
  return bloodTideLine(nowMs);
42
45
  if (window === 'ice-hold')
43
46
  return thawIceLine(nowMs);
47
+ if (window === 'mill-flow')
48
+ return millRaceLine(nowMs);
44
49
  return '';
45
50
  }
46
51
  //# sourceMappingURL=storyWindows.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storyWindows.js","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzH,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrF,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAE7H,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,KAAa;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACnD,KAAK,OAAO,CAAC,CAAC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,KAAK,WAAW,CAAC,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3C,KAAK,YAAY,CAAC,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,UAAU,CAAC,CAAC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,KAAa;IACpE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,wBAAwB,CAAC,CAAC;QACrE,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,CAAC;QAC/D,KAAK,OAAO,CAAC;QACb,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,CAAC;QAC3E,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,iBAAiB,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,KAAa;IAChE,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAChF,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"storyWindows.js","sourceRoot":"","sources":["../src/storyWindows.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzH,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGxF,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAE1I,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,KAAa;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACnD,KAAK,OAAO,CAAC,CAAC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,KAAK,WAAW,CAAC,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3C,KAAK,YAAY,CAAC,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,UAAU,CAAC,CAAC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAChD,KAAK,WAAW,CAAC,CAAC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,KAAa;IACpE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,wBAAwB,CAAC,CAAC;QACrE,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,CAAC;QAC/D,KAAK,OAAO,CAAC;QACb,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,CAAC;QAC3E,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,iBAAiB,CAAC,CAAC;QAC9D,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,KAAa;IAChE,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAChF,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * THE TIMBER CONVOY (coverage slice 11, track T123, 2026-10-15; levels 21-30, a Dreadwoods woods feature): six times a day, in daylight, the
3
+ * forester's crew rolls a loaded timber wagon out of the camp (a PvP-off pocket at the Rotwood Grove's southern edge) and walks it down the
4
+ * woods to the Gallowmere road head. It takes eight minutes. The wagon is an NPC, not a prize: nobody can rob it. Players may ESCORT it, and
5
+ * the woods' wolves come for it as it goes, so an escort that stays close and cuts the wolves down is what gets it there whole.
6
+ *
7
+ * Everything here is pure: the clock, the route, the wagon's tile and health, the scoring, the prizes, the chat lines and the saved state, so
8
+ * the server, a test and the login line agree. It is the Beacon Night pattern (beaconNight.ts) and the Heartwood Hunt's collusion-safe scoring
9
+ * (heartwoodHunt.ts), with the Redcap patrol's clock-read timing (tollRoad.ts):
10
+ * - the clock is READ off the wall clock, never rolled or stored: six starts a day at 04:17, 07:17, 10:17, 13:17, 16:17 and 19:17 UTC, picked so
11
+ * that no ring fight, lair awakening, Heartwood Hunt, Fishing Derby round, Redcap patrol or Beacon Night comes close (the test checks 300
12
+ * days of every clock). The wagon's tile is a pure function of the clock along the route, so a restart, a deploy or a second server agree
13
+ * on where it is without saving anything;
14
+ * - only OWN actions score: time spent within reach of the wagon (small, capped, and on its own never enough to be paid) and kills of this
15
+ * convoy's own wolves (the `tc-` ids) made near the wagon. A player kill, a death or a trade scores nothing, so ambushing an escort in the
16
+ * PvP woods takes points from nobody and a friend cannot be fed points;
17
+ * - one place per ACCOUNT, a minimum score to be paid at all, a podium only when the wagon ARRIVED and three different accounts qualified,
18
+ * and at most four paid convoys 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 and Explorer XP and alder and ash logs: no coins, nothing that outclasses the gated 41+ gear. Escorts are paid at
21
+ * arrival (a wagon that is wrecked pays half the XP and no logs; a void convoy pays nothing).
22
+ *
23
+ * Amounts are PLACEHOLDERS for the balance pass, done last with James. The wolves are the Heartwood brood's own kind (mosswolf).
24
+ */
25
+ export declare const CONVOY_NAME = "Timber Convoy";
26
+ /** The six starts, in minutes after UTC midnight: 04:17, 07:17, 10:17, 13:17, 16:17 and 19:17 (daylight; the test checks them against every other clock). */
27
+ export declare const CONVOY_START_MINUTES: readonly number[];
28
+ export declare const CONVOY_PER_DAY: number;
29
+ /** How long the wagon takes from the camp to the road head. */
30
+ export declare const CONVOY_TRAVEL_MS: number;
31
+ /** How long the unloading stays up after the wagon arrives (the wagon stands at the road head and the standings are up). */
32
+ export declare const CONVOY_RESULTS_MS: number;
33
+ /** The loading time before the start, and the warning before the end. */
34
+ export declare const CONVOY_SOON_MS: number;
35
+ export declare const CONVOY_LAST_MS: number;
36
+ /** idle (nothing announced), soon (the wagon is being loaded at the camp), open (on the road), last (the final minute), results. */
37
+ export type ConvoyStage = 'idle' | 'soon' | 'open' | 'last' | 'results';
38
+ export declare const CONVOY_STAGES: readonly ConvoyStage[];
39
+ export declare function isConvoyStage(s: unknown): s is ConvoyStage;
40
+ /** The start of slot `slot` (slot = day * 6 + the start's index; any integer, negative included). */
41
+ export declare function convoyStartOf(slot: number): number;
42
+ export declare function convoyEndOf(slot: number): number;
43
+ export type ConvoyClock = {
44
+ /** The convoy this stage is about: the open or just-finished one, else the next to start. */
45
+ slot: number;
46
+ stage: ConvoyStage;
47
+ /** Time to this convoy's start (0 once it has begun). */
48
+ msToStart: number;
49
+ /** Time to this convoy's arrival (0 once it is over). */
50
+ msToEnd: number;
51
+ };
52
+ export declare function convoyClockAt(now: number): ConvoyClock;
53
+ /** True while the wagon is on the road and presence and wolf kills count. */
54
+ export declare function convoyIsOpen(stage: ConvoyStage): boolean;
55
+ /** True from the loading (soon) until the unloading ends (results): the wagon is on the ground. */
56
+ export declare function convoyWagonOut(stage: ConvoyStage): boolean;
57
+ /** The next convoy to start strictly after `now` (for the login line). */
58
+ export declare function convoyNextRound(now: number): {
59
+ slot: number;
60
+ startsAt: number;
61
+ };
62
+ /** The UTC day a time falls in (the daily paid-convoys cap resets at midnight UTC). */
63
+ export declare function convoyDayOf(now: number): number;
64
+ /**
65
+ * The road, in world tiles: from the forester's camp (the PvP-off pocket x 324-336, z 404-412) down through the woods to the Gallowmere road
66
+ * head. Surveyed 2026-10-15 with the backend's pathfinder: every tile of every straight run is standable and every step is a legal step (the
67
+ * backend smoke walks it). 165 tiles, so the wagon plods at about one tile every three seconds.
68
+ */
69
+ export declare const CONVOY_ROUTE: readonly {
70
+ x: number;
71
+ z: number;
72
+ }[];
73
+ /** The route's length in tiles (Chebyshev, the walking metric). */
74
+ export declare const CONVOY_ROUTE_LENGTH: number;
75
+ /** The tile `d` tiles along the route (clamped to both ends). The same rounding the backend smoke walks. */
76
+ export declare function convoyTileAtDistance(d: number): {
77
+ x: number;
78
+ z: number;
79
+ };
80
+ /** How far along the road the wagon is for convoy `slot` at `now`, 0 to 1 (0 while it loads, 1 once it has arrived). Pure: no stored position. */
81
+ export declare function convoyProgress(slot: number, now: number): number;
82
+ /** The wagon's tile for convoy `slot` at `now`. */
83
+ export declare function convoyWagonTile(slot: number, now: number): {
84
+ x: number;
85
+ z: number;
86
+ };
87
+ export declare const CONVOY_START_PLACE = "the forester's camp";
88
+ export declare const CONVOY_END_PLACE = "the Gallowmere road head";
89
+ /** The wagon: a tame pony NPC (the existing `penpony` kind) named for the cargo; never a fight, never attackable. Upgrade row: its own cart model. */
90
+ export declare const CONVOY_WAGON: {
91
+ readonly id: "tc-wagon";
92
+ readonly kind: "penpony";
93
+ readonly name: "Timber wagon";
94
+ readonly healthMax: 100;
95
+ /** Health lost per second for each wolf standing within `atWagon` tiles of it. */
96
+ readonly drainPerWolfPerSec: 0.8;
97
+ readonly atWagon: 2;
98
+ /** The wagon arrived "whole" with at least this much health left (a Ledger line). */
99
+ readonly intact: 70;
100
+ /** The server steps the wagon towards its clock tile; further behind than this, it is put on the tile (a blocked step never strands it). */
101
+ readonly snapBehind: 4;
102
+ /** Missing from the world this long (removed by something else, nowhere to stand), the convoy is void. */
103
+ readonly missingVoidMs: 20000;
104
+ };
105
+ /** The wagon's health after `dtMs` with `wolvesAtWagon` wolves on it, never below 0. Pure. */
106
+ export declare function convoyHealthAfter(health: number, dtMs: number, wolvesAtWagon: number): number;
107
+ /**
108
+ * The woods' wolves that come for the wagon: the Heartwood brood's kind, ids `tc-`, sent in waves while somebody is near the wagon. Levels
109
+ * follow the escorts' average Combat, clamped; the count follows how many escorts are near. They go for an escort in reach, and for the wagon
110
+ * when nobody is in reach. No drops (no farming a convoy for fur). PLACEHOLDERS.
111
+ */
112
+ export declare const CONVOY_WOLVES: {
113
+ readonly kind: "mosswolf";
114
+ readonly idPrefix: "tc-";
115
+ readonly name: "Ambush wolf";
116
+ readonly firstWave: 2;
117
+ readonly firstWaveAfterMs: 25000;
118
+ readonly waveEveryMs: 40000;
119
+ readonly perExtraEscort: 1;
120
+ readonly waveMax: 6;
121
+ readonly aliveCap: 10;
122
+ /** Wolves come out of the trees this far from the wagon. */
123
+ readonly spawnMin: 9;
124
+ readonly spawnMax: 12;
125
+ readonly aggroRadius: 8;
126
+ readonly leashRadius: 24;
127
+ readonly minLevel: 21;
128
+ readonly maxLevel: 30;
129
+ /** An escort is "near" this close to the wagon (a wave grows with them, and the first wave waits for one). */
130
+ readonly nearWagon: 22;
131
+ /** A player under this Combat is not locked on to (they may still walk beside the wagon, which is the safe job). */
132
+ readonly aggroCombat: 18;
133
+ readonly aggroText: "A wolf bursts out of the trees at you!";
134
+ };
135
+ /** How many wolves a wave brings: the first wave is fixed; later ones grow with the escorts near the wagon. */
136
+ export declare function convoyWaveSize(wave: number, escorts: number): number;
137
+ /** The wolves' level for a party's average Combat. */
138
+ export declare function convoyWolfLevel(avgCombat: number): number;
139
+ /** One presence point for each stretch this long spent within `CONVOY_ESCORT_REACH` of the wagon. */
140
+ export declare const CONVOY_PRESENCE_EVERY_MS = 20000;
141
+ export declare const CONVOY_ESCORT_REACH = 8;
142
+ export declare const CONVOY_PRESENCE_POINTS = 1;
143
+ export declare const CONVOY_KILL_POINTS = 3;
144
+ /** Past these a stretch or a kill still helps the wagon (a dead wolf is a dead wolf) but scores nothing more. Presence alone never reaches the minimum. */
145
+ export declare const CONVOY_PRESENCE_CAP = 5;
146
+ export declare const CONVOY_KILL_CAP = 10;
147
+ /** The least score that counts as having escorted (2 wolves, or 1 wolf and 3 stretches). Presence alone (at most 5) is never enough. */
148
+ export declare const CONVOY_MIN_SCORE = 6;
149
+ /** Podium prizes need at least this many different accounts above the minimum, and the wagon arrived. */
150
+ export declare const CONVOY_MIN_ESCORTS = 3;
151
+ /** Paid convoys per account per UTC day (alts and shared accounts cannot farm every wagon of the day). */
152
+ export declare const CONVOY_DAILY_PAID = 4;
153
+ /** A wolf kill counts only for a player this close to the wagon (a wolf kited across the woods scores nothing). */
154
+ export declare const CONVOY_KILL_REACH = 20;
155
+ export declare function convoyScore(presence: number, kills: number): number;
156
+ export type ConvoyEntry = {
157
+ /** characterId. */
158
+ key: string;
159
+ /** The account, so one account's characters cannot all take prizes. Empty when unknown (then the key stands in). */
160
+ account: string;
161
+ name: string;
162
+ /** Stretches spent beside the wagon and wolf kills this convoy (uncapped; the score caps them). */
163
+ presence: number;
164
+ kills: number;
165
+ /** When the score last rose (ties go to whoever reached the score first). */
166
+ at: number;
167
+ };
168
+ export declare function convoyEntryScore(e: Pick<ConvoyEntry, 'presence' | 'kills'>): number;
169
+ type Who = {
170
+ key: string;
171
+ account: string;
172
+ name: string;
173
+ };
174
+ /** One stretch beside the wagon by this character. Returns a new entry (the old is untouched). */
175
+ export declare function convoyWithPresence(entry: ConvoyEntry | undefined, who: Who, at: number): ConvoyEntry;
176
+ /** One wolf kill by this character. */
177
+ export declare function convoyWithKill(entry: ConvoyEntry | undefined, who: Who, at: number): ConvoyEntry;
178
+ export declare function convoyQualifies(e: ConvoyEntry): boolean;
179
+ /**
180
+ * The ranking: higher score first, then whoever reached it first, then the key (a total order a test can pin). One place per ACCOUNT:
181
+ * of an account's characters only the best-placed one is listed. Entries below the minimum score are not ranked.
182
+ */
183
+ export declare function convoyRanking(entries: readonly ConvoyEntry[]): ConvoyEntry[];
184
+ /** The 1-based place of a character in the ranking (ranked entries only), or 0. */
185
+ export declare function convoyPlaceOf(entries: readonly ConvoyEntry[], key: string): number;
186
+ export type ConvoyRibbon = 'red' | 'blue' | 'bronze';
187
+ export declare const CONVOY_RIBBON_LABEL: Readonly<Record<ConvoyRibbon, string>>;
188
+ /** PLACEHOLDER podium prizes by place (an arrived wagon only), on top of the participation prize. */
189
+ export declare const CONVOY_PODIUM_PRIZES: readonly {
190
+ woodworkXp: number;
191
+ explorerXp: number;
192
+ ash: number;
193
+ }[];
194
+ /** Everyone paid who qualified. A wagon that was wrecked halves the XP and gives no logs. */
195
+ export declare const CONVOY_PARTICIPATION: {
196
+ readonly woodworkXp: 100;
197
+ readonly explorerXp: 20;
198
+ readonly alder: 3;
199
+ };
200
+ export declare const CONVOY_ALDER_KIND = "alderwood";
201
+ export declare const CONVOY_ASH_KIND = "ashwood";
202
+ /** Ledger marks (types explorerLedger.ts `convoy` page) a result can write. */
203
+ export declare const CONVOY_MARK_ENTERED = "convoy:entered";
204
+ export declare const CONVOY_MARK_ARRIVED = "convoy:arrived";
205
+ export declare const CONVOY_MARK_WHOLE = "convoy:whole";
206
+ export declare const CONVOY_MARK_GUARD = "convoy:guard";
207
+ export declare const CONVOY_MARK_RIBBON: Readonly<Record<ConvoyRibbon, string>>;
208
+ export type ConvoyItem = {
209
+ kind: string;
210
+ qty: number;
211
+ };
212
+ /** What one character is owed for a convoy. */
213
+ export type ConvoyPrize = {
214
+ woodworkXp: number;
215
+ explorerXp: number;
216
+ items: ConvoyItem[];
217
+ /** Ledger marks to write. */
218
+ marks: string[];
219
+ /** The chat line they are told. */
220
+ text: string;
221
+ };
222
+ /** The paid-convoys record: per account, the day and how many convoys were paid that day. */
223
+ export type ConvoyPaid = Record<string, {
224
+ day: number;
225
+ n: number;
226
+ }>;
227
+ /** Paid convoys this account has had on this UTC day. */
228
+ export declare function convoyPaidToday(paid: ConvoyPaid, account: string, day: number): number;
229
+ /** The record after one more paid convoy for these accounts (old days dropped). Returns a new object. */
230
+ export declare function convoyWithPaid(paid: ConvoyPaid, accounts: readonly string[], day: number): ConvoyPaid;
231
+ /** How a convoy ended: on the road ('none'), the wagon got there ('arrived'), the wolves broke it ('wrecked'), or nobody can say ('void'). */
232
+ export type ConvoyOutcome = 'none' | 'arrived' | 'wrecked' | 'void';
233
+ export type ConvoyPrizeInput = {
234
+ outcome: ConvoyOutcome;
235
+ health: number;
236
+ paid: ConvoyPaid;
237
+ day: number;
238
+ };
239
+ /**
240
+ * Everything a finished convoy pays, by character key. One prize per account (the ranking lists an account once). An account that has had its
241
+ * paid convoys today is skipped (the podium moves up to the next account). A void convoy pays nothing. Pure, so a restart that finalises a
242
+ * convoy late pays exactly what the clock-time finalise would have.
243
+ */
244
+ export declare function convoyPrizes(entries: readonly ConvoyEntry[], input: ConvoyPrizeInput): Map<string, ConvoyPrize>;
245
+ /** The world chat line for a finished convoy. */
246
+ export declare function convoyResultLine(entries: readonly ConvoyEntry[], outcome: ConvoyOutcome, health: number): string;
247
+ /** The world chat line for a stage (idle and results have none: the results line is built from the standings). */
248
+ export declare function convoyChatLine(stage: ConvoyStage): string | null;
249
+ /** The login line's piece about the Timber Convoy. */
250
+ export declare function convoyTodayText(now: number): string;
251
+ /** What /convoy tells a player. */
252
+ export declare function convoyStatusLines(clock: ConvoyClock, entries: readonly ConvoyEntry[], myKey: string | null, health: number, now: number): string[];
253
+ export type ConvoySave = {
254
+ v: 1;
255
+ /** The convoy the entries belong to (-1 = none). */
256
+ slot: number;
257
+ /** The stage last announced for `announced.slot`. */
258
+ announced: {
259
+ slot: number;
260
+ stage: ConvoyStage;
261
+ } | null;
262
+ /** True once `slot`'s results have been worked out and paid or queued. */
263
+ finalized: boolean;
264
+ /** The wagon's health now (while it is on the road), and how the convoy ended. */
265
+ health: number;
266
+ outcome: ConvoyOutcome;
267
+ /** Wolf waves sent this convoy. */
268
+ waves: number;
269
+ entries: ConvoyEntry[];
270
+ /** Prizes for characters who were offline when the convoy ended, by characterId. */
271
+ pending: Record<string, ConvoyPrize[]>;
272
+ /** Paid convoys per account per UTC day. */
273
+ paid: ConvoyPaid;
274
+ };
275
+ export declare function emptyConvoySave(): ConvoySave;
276
+ /** At most this many prizes wait for one character, and entries are never more than this many. */
277
+ export declare const CONVOY_PENDING_MAX = 5;
278
+ export declare const CONVOY_MAX_ENTRIES = 1000;
279
+ /** A saved state, checked field by field (it comes from the database); anything wrong gives the empty state. */
280
+ export declare function parseConvoySave(raw: unknown): ConvoySave;
281
+ export {};
282
+ //# sourceMappingURL=timberConvoy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timberConvoy.d.ts","sourceRoot":"","sources":["../src/timberConvoy.ts"],"names":[],"mappings":"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"}