@dreadwood-types/types 0.1.269 → 0.1.271

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 (68) hide show
  1. package/dist/attackableNpcs.d.ts.map +1 -1
  2. package/dist/attackableNpcs.js +5 -0
  3. package/dist/attackableNpcs.js.map +1 -1
  4. package/dist/bossSignatures.d.ts +1 -1
  5. package/dist/bossSignatures.d.ts.map +1 -1
  6. package/dist/bossSignatures.js +12 -0
  7. package/dist/bossSignatures.js.map +1 -1
  8. package/dist/bounty.d.ts +2 -2
  9. package/dist/bounty.d.ts.map +1 -1
  10. package/dist/bounty.js +5 -2
  11. package/dist/bounty.js.map +1 -1
  12. package/dist/constants.d.ts +8 -0
  13. package/dist/constants.d.ts.map +1 -1
  14. package/dist/constants.js.map +1 -1
  15. package/dist/explorerLedger.d.ts +2 -1
  16. package/dist/explorerLedger.d.ts.map +1 -1
  17. package/dist/explorerLedger.js +7 -0
  18. package/dist/explorerLedger.js.map +1 -1
  19. package/dist/gravewatch.d.ts +103 -0
  20. package/dist/gravewatch.d.ts.map +1 -0
  21. package/dist/gravewatch.js +80 -0
  22. package/dist/gravewatch.js.map +1 -0
  23. package/dist/gravewatchQuest.d.ts +121 -0
  24. package/dist/gravewatchQuest.d.ts.map +1 -0
  25. package/dist/gravewatchQuest.js +96 -0
  26. package/dist/gravewatchQuest.js.map +1 -0
  27. package/dist/gravewatchQuestDefs.d.ts +11 -0
  28. package/dist/gravewatchQuestDefs.d.ts.map +1 -0
  29. package/dist/gravewatchQuestDefs.js +198 -0
  30. package/dist/gravewatchQuestDefs.js.map +1 -0
  31. package/dist/groundItems.d.ts.map +1 -1
  32. package/dist/groundItems.js +2 -0
  33. package/dist/groundItems.js.map +1 -1
  34. package/dist/index.d.ts +6 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +6 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/legacy.d.ts +3 -0
  39. package/dist/legacy.d.ts.map +1 -1
  40. package/dist/legacy.js +3 -0
  41. package/dist/legacy.js.map +1 -1
  42. package/dist/mireWatch.d.ts +63 -0
  43. package/dist/mireWatch.d.ts.map +1 -0
  44. package/dist/mireWatch.js +43 -0
  45. package/dist/mireWatch.js.map +1 -0
  46. package/dist/quests.d.ts.map +1 -1
  47. package/dist/quests.js +62 -0
  48. package/dist/quests.js.map +1 -1
  49. package/dist/safePockets.d.ts.map +1 -1
  50. package/dist/safePockets.js +16 -0
  51. package/dist/safePockets.js.map +1 -1
  52. package/dist/storyQuests.d.ts +6 -5
  53. package/dist/storyQuests.d.ts.map +1 -1
  54. package/dist/storyQuests.js +35 -0
  55. package/dist/storyQuests.js.map +1 -1
  56. package/dist/storyWindows.d.ts +12 -0
  57. package/dist/storyWindows.d.ts.map +1 -0
  58. package/dist/storyWindows.js +41 -0
  59. package/dist/storyWindows.js.map +1 -0
  60. package/dist/tideOfBlood.d.ts +104 -0
  61. package/dist/tideOfBlood.d.ts.map +1 -0
  62. package/dist/tideOfBlood.js +224 -0
  63. package/dist/tideOfBlood.js.map +1 -0
  64. package/dist/tideOfBloodQuestDef.d.ts +41 -0
  65. package/dist/tideOfBloodQuestDef.d.ts.map +1 -0
  66. package/dist/tideOfBloodQuestDef.js +306 -0
  67. package/dist/tideOfBloodQuestDef.js.map +1 -0
  68. package/package.json +3 -3
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The wall-clock windows a `touch` step can be limited to (storyQuests.ts StoryStep.when). Pure functions of the UTC clock, so the
3
+ * same for every player and every restart, with nothing to save:
4
+ * - `low-tide`: the Sea Grotto's low water (gullsLowWater.ts); `night`: Saltmark Light's lamp hours (18:00 to 06:00 UTC);
5
+ * - `blood-low`: the Blood Mire's low blood (tideOfBlood.ts); `blood-moon`: the lamp night over the Mire; `red-low`: both at once.
6
+ */
7
+ import { SEA_GROTTO_TIDE_CYCLE_MS, isSaltmarkLampLit, isSeaGrottoLowWater, seaGrottoTideLine } from './gullsLowWater.js';
8
+ import { BLOOD_TIDE_CYCLE_MS, bloodTideLine, isBloodLow, isBloodMoon, isRedLow } from './tideOfBlood.js';
9
+ export const STORY_WINDOWS = ['low-tide', 'night', 'blood-low', 'blood-moon', 'red-low'];
10
+ export function storyWindowOpen(window, nowMs) {
11
+ switch (window) {
12
+ case 'low-tide': return isSeaGrottoLowWater(nowMs);
13
+ case 'night': return isSaltmarkLampLit(nowMs);
14
+ case 'blood-low': return isBloodLow(nowMs);
15
+ case 'blood-moon': return isBloodMoon(nowMs);
16
+ case 'red-low': return isRedLow(nowMs);
17
+ }
18
+ }
19
+ /**
20
+ * Which opening of the window `nowMs` is in: a number that changes whenever the window closes and opens again (the tide cycle for the
21
+ * tides, the lamp night for the moon). An ordered touch step keeps the instance it began in with its progress, so progress made in one
22
+ * low, or one night, cannot be carried over a logout into the next (storyQuests.ts onTouch).
23
+ */
24
+ export function storyWindowInstance(window, nowMs) {
25
+ switch (window) {
26
+ case 'low-tide': return Math.floor(nowMs / SEA_GROTTO_TIDE_CYCLE_MS);
27
+ case 'blood-low':
28
+ case 'red-low': return Math.floor(nowMs / BLOOD_TIDE_CYCLE_MS);
29
+ case 'night':
30
+ case 'blood-moon': return Math.floor((nowMs + 6 * 3_600_000) / 86_400_000);
31
+ }
32
+ }
33
+ /** The line added after a step's `wait` when its window is shut ('' when there is nothing to add). */
34
+ export function storyWindowLine(window, nowMs) {
35
+ if (window === 'low-tide')
36
+ return seaGrottoTideLine(nowMs);
37
+ if (window === 'blood-low' || window === 'red-low')
38
+ return bloodTideLine(nowMs);
39
+ return '';
40
+ }
41
+ //# sourceMappingURL=storyWindows.js.map
@@ -0,0 +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;AAGzG,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAEjH,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;IACzC,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;IAC7E,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,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,104 @@
1
+ export declare const TIDE_OF_BLOOD_NAME = "Tide of Blood";
2
+ export declare const BLOOD_TIDE_CYCLE_MS = 720000;
3
+ export type BloodTidePhase = 'high' | 'ebb' | 'low' | 'flood';
4
+ export declare function bloodTide(nowMs: number): {
5
+ phase: BloodTidePhase;
6
+ msUntilLow: number;
7
+ msLeftLow: number;
8
+ };
9
+ export declare const isBloodLow: (nowMs: number) => boolean;
10
+ /** The ford is passable unless the blood is high. */
11
+ export declare const isBloodFordOpen: (nowMs: number) => boolean;
12
+ /** The blood moon hangs over the Mire whenever the lamps are lit (18:00 to 06:00 UTC). */
13
+ export declare const isBloodMoon: (nowMs: number) => boolean;
14
+ /** The red low: the blood at its lowest under the blood moon. */
15
+ export declare const isRedLow: (nowMs: number) => boolean;
16
+ /** The tide gauge's line (readable any time, quest or not). */
17
+ export declare function bloodTideLine(nowMs: number): string;
18
+ /** When the next blood moon begins (the next 18:00 UTC at or after `nowMs`; `nowMs` itself when the lamps are lit). */
19
+ export declare function nextBloodMoonMs(nowMs: number): number;
20
+ export declare const BT_PROP: {
21
+ /** The three tide markers on the rim (Reading the Red). */
22
+ readonly marker: "btmarker";
23
+ /** The five ford posts on the river's north bank, in crossing order (The Low Ford). */
24
+ readonly post: "btpost";
25
+ /** The two rope posts of the personal Blood Ford crossing, one each bank. */
26
+ readonly rope: "btrope";
27
+ /** The three moon braziers on the rim, in lighting order (Night of the Red Moon). */
28
+ readonly brazier: "btbrazier";
29
+ /** The Tide Bell at the first plank walk's foot (Tide of Blood). */
30
+ readonly bell: "btbell";
31
+ /** The tide gauge post by the Watch's gate: tells the tide any time. */
32
+ readonly gauge: "btgauge";
33
+ /** The Watch's lamp-oil cask (Night of the Red Moon): three flasks. */
34
+ readonly oil: "btoil";
35
+ };
36
+ export type BtProp = {
37
+ id: string;
38
+ x: number;
39
+ z: number;
40
+ style: string;
41
+ };
42
+ export declare const BT_MARKERS: readonly BtProp[];
43
+ /** North bank of the Blood River: one tile back from the water's edge (its jitter reaches 0.8 of a tile). */
44
+ export declare function bloodBankZ(x: number, side: 'north' | 'south'): number;
45
+ export declare const BT_FORD_XS: readonly number[];
46
+ export declare const BT_POSTS: readonly BtProp[];
47
+ export declare const BT_POST_ORDER: readonly string[];
48
+ /** The rope posts of the Blood Ford crossing (a click teleports to the other one). */
49
+ export declare const BLOOD_FORD_X = 614;
50
+ export declare const BT_ROPE_NORTH: BtProp;
51
+ export declare const BT_ROPE_SOUTH: BtProp;
52
+ export declare function isBloodFordRopeStyle(style: string | undefined): boolean;
53
+ export declare const BT_BRAZIERS: readonly BtProp[];
54
+ export declare const BT_BRAZIER_ORDER: readonly string[];
55
+ /** The Tide Bell, on the bank at the south foot of the first plank walk (the walk's last tile is MIRE_CX, MIRE_CZ + 4). */
56
+ export declare const BT_BELL: BtProp;
57
+ export declare const BT_GAUGE: BtProp;
58
+ export declare const BT_OIL_CASK: BtProp;
59
+ export declare const BT_QUEST_PROPS: readonly BtProp[];
60
+ /** The model a prop draws with (dreadmodel names; stand-ins from the events kit and the quest set). */
61
+ export declare function tideOfBloodPropModel(prop: string): string | null;
62
+ export declare const TIDE_OF_BLOOD_PROP_NAMES: Readonly<Record<string, string>>;
63
+ /** The idle line for a prop clicked when the quest does not want it (the gauge says the tide any time). */
64
+ export declare function tideOfBloodPropIdleLine(prop: string, nowMs: number): string | null;
65
+ export declare const BLOOD_FORD_QUEST_ID = "theLowFord";
66
+ export declare const BLOOD_FORD_CLOSED_TEXT = "The blood runs too deep at the ford. Wait for it to ebb (the gauge post by the Mire Watch tells the tide).";
67
+ export declare const BLOOD_FORD_LOCKED_TEXT = "You have not learned the ford's marks. Marsh-Warden Odalys Venn at the Mire Watch will teach you (the quest The Low Ford).";
68
+ /** The Bloodtide Elemental's shard (no trader buys one: a lost one drops again from the next one down). */
69
+ export declare const BLOODTIDE_SHARD_KIND = "bloodtideshard";
70
+ export declare const TIDE_OF_BLOOD_ITEM_NAMES: Readonly<Record<string, string>>;
71
+ export declare const MIRE_LEECH_KIND = "mireleech";
72
+ export declare const BLOODTIDE_ELEMENTAL_KIND = "bloodtideelemental";
73
+ export type MireTideKind = typeof MIRE_LEECH_KIND | typeof BLOODTIDE_ELEMENTAL_KIND;
74
+ export declare const MIRE_TIDE_KINDS: readonly MireTideKind[];
75
+ export declare function isMireTideKind(kind: string): kind is MireTideKind;
76
+ export declare const MIRE_TIDE_CREATURES: Readonly<Record<MireTideKind, {
77
+ name: string;
78
+ level: number;
79
+ maxHit: number;
80
+ healthScale: number;
81
+ respawnMs: number;
82
+ aggro: number;
83
+ leash: number;
84
+ text: string;
85
+ note: string;
86
+ }>>;
87
+ /** The elemental stands at the west plank walk's west end; the leeches in and between the pools. */
88
+ export declare const BLOODTIDE_ELEMENTAL_SPOT: {
89
+ readonly x: number;
90
+ readonly z: number;
91
+ readonly leash: 3;
92
+ };
93
+ export declare const MIRE_LEECH_SPOTS: ReadonlyArray<readonly [number, number]>;
94
+ export declare const MIRE_LEECH_LEASH = 3;
95
+ export declare const MIRE_LEECH_PACE: {
96
+ readonly speed: 1.2;
97
+ readonly idleChance: 0.5;
98
+ readonly pause: readonly [2, 6];
99
+ };
100
+ export declare const LEDGER_MIRE_LINES: readonly {
101
+ id: string;
102
+ label: string;
103
+ }[];
104
+ //# sourceMappingURL=tideOfBlood.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tideOfBlood.d.ts","sourceRoot":"","sources":["../src/tideOfBlood.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAIlD,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAU9D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMzG;AACD,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,OAA2C,CAAC;AACvF,qDAAqD;AACrD,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,OAA4C,CAAC;AAC7F,0FAA0F;AAC1F,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,OAAmC,CAAC;AAChF,iEAAiE;AACjE,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,OAAkD,CAAC;AAO5F,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAID,uHAAuH;AACvH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIrD;AAID,eAAO,MAAM,OAAO;IAClB,2DAA2D;;IAE3D,uFAAuF;;IAEvF,6EAA6E;;IAE7E,qFAAqF;;IAErF,oEAAoE;;IAEpE,wEAAwE;;IAExE,uEAAuE;;CAE/D,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAIvC,CAAC;AAEF,6GAA6G;AAC7G,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAIrE;AACD,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAA8B,CAAC;AACvE,eAAO,MAAM,QAAQ,EAAE,SAAS,MAAM,EAA4H,CAAC;AACnK,eAAO,MAAM,aAAa,EAAE,SAAS,MAAM,EAAiC,CAAC;AAE7E,sFAAsF;AACtF,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,aAAa,EAAE,MAAuH,CAAC;AACpJ,eAAO,MAAM,aAAa,EAAE,MAAuH,CAAC;AACpJ,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEvE;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAIxC,CAAC;AACF,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAAoC,CAAC;AAEnF,2HAA2H;AAC3H,eAAO,MAAM,OAAO,EAAE,MAAyF,CAAC;AAChH,eAAO,MAAM,QAAQ,EAAE,MAA2E,CAAC;AAEnG,eAAO,MAAM,WAAW,EAAE,MAA4E,CAAC;AAEvG,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA+G,CAAC;AAE5J,uGAAuG;AACvG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQhE;AAED,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWrE,CAAC;AAEF,2GAA2G;AAC3G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASlF;AAID,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,sBAAsB,+GAA+G,CAAC;AACnJ,eAAO,MAAM,sBAAsB,+HAA+H,CAAC;AAInK,2GAA2G;AAC3G,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAiD,CAAC;AAExH,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAC7D,MAAM,MAAM,YAAY,GAAG,OAAO,eAAe,GAAG,OAAO,wBAAwB,CAAC;AACpF,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAAgD,CAAC;AACpG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,YAAY,CAEjE;AAED,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CACxC,MAAM,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBxK,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,wBAAwB;;;;CAAyD,CAAC;AAC/F,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAErE,CAAC;AACF,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,eAAe;;;;CAAmE,CAAC;AAIhG,eAAO,MAAM,iBAAiB,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAMrE,CAAC"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * TIDE OF BLOOD, the Blood Mire's quest chain (proposal A8 of AREA_PROPOSALS.md, built T73 2026-10-14; plan
3
+ * `.cursor/task-plans/2026-10-14-t73-tide-of-blood.md`). Levels 18-35, inside the PvP Dreadwoods (no healing in a fight).
4
+ *
5
+ * The Mire's blood rises and falls on a cycle that is the wall clock (UTC ms), the same for every player and every restart, with
6
+ * nothing to save (the Sea Grotto's tide, gullsLowWater.ts, is the pattern): 12 minutes, high for 300 s, an ebb of 60 s, LOW for
7
+ * 300 s, a flood of 60 s. The blood moon is the lamp night (18:00-06:00 UTC, Saltmark Light's clock). The finale wants both:
8
+ * the RED LOW, blood low under the blood moon.
9
+ *
10
+ * Marsh-Warden Odalys Venn keeps the Mire Watch, a small palisaded safe pocket east of the mire (SAFE_POCKETS, safePockets.ts): the
11
+ * one place nobody can be attacked, and the exit when a window closes on you. The chain:
12
+ * 1. Reading the Red (Combat 18): the three tide markers on the rim, the boars, the gauge.
13
+ * 2. The Low Ford (Combat 20): five ford posts on the river's north bank touched IN ORDER during the low; then the personal Blood
14
+ * Ford crossing opens (two rope posts, click to cross whenever the blood is not high).
15
+ * 3. Night of the Red Moon (Combat 24): three moon braziers lit in order under the blood moon; six Mire Leeches put down.
16
+ * 4. The Surge (Combat 28): the Bloodtide Elemental at the west plank walk and its Blood Surge (step clear); bring the shard.
17
+ * 5. Tide of Blood (Combat 33): ring the Tide Bell at the plank walk's foot in the red low, then put down the Blood Mire Elemental.
18
+ *
19
+ * Every number is a WORLD tile and every number a placeholder for the balance pass. Stand-ins (kit models, existing rigs) are named
20
+ * in the notes and logged in STAND_INS.
21
+ */
22
+ import { MIRE_CX, MIRE_CZ } from './bloodMire.js';
23
+ import { bloodRiverCenterZ, bloodRiverHalfWidth } from './bloodRiver.js';
24
+ import { isSaltmarkLampLit } from './gullsLowWater.js';
25
+ export const TIDE_OF_BLOOD_NAME = 'Tide of Blood';
26
+ // ---- The blood tide clock ---------------------------------------------------------------------------------------------------
27
+ export const BLOOD_TIDE_CYCLE_MS = 720_000;
28
+ const TIDE_EDGES = [
29
+ [0, 'high'],
30
+ [300_000, 'ebb'],
31
+ [360_000, 'low'],
32
+ [660_000, 'flood'],
33
+ ];
34
+ const LOW_START_MS = 360_000;
35
+ const LOW_END_MS = 660_000;
36
+ export function bloodTide(nowMs) {
37
+ const t = ((nowMs % BLOOD_TIDE_CYCLE_MS) + BLOOD_TIDE_CYCLE_MS) % BLOOD_TIDE_CYCLE_MS;
38
+ let phase = 'high';
39
+ for (const [from, p] of TIDE_EDGES)
40
+ if (t >= from)
41
+ phase = p;
42
+ const msUntilLow = phase === 'low' ? 0 : t < LOW_START_MS ? LOW_START_MS - t : BLOOD_TIDE_CYCLE_MS - t + LOW_START_MS;
43
+ return { phase, msUntilLow, msLeftLow: phase === 'low' ? LOW_END_MS - t : 0 };
44
+ }
45
+ export const isBloodLow = (nowMs) => bloodTide(nowMs).phase === 'low';
46
+ /** The ford is passable unless the blood is high. */
47
+ export const isBloodFordOpen = (nowMs) => bloodTide(nowMs).phase !== 'high';
48
+ /** The blood moon hangs over the Mire whenever the lamps are lit (18:00 to 06:00 UTC). */
49
+ export const isBloodMoon = (nowMs) => isSaltmarkLampLit(nowMs);
50
+ /** The red low: the blood at its lowest under the blood moon. */
51
+ export const isRedLow = (nowMs) => isBloodLow(nowMs) && isBloodMoon(nowMs);
52
+ function waitText(ms) {
53
+ const s = Math.max(1, Math.round(ms / 1000));
54
+ return s >= 90 ? `about ${Math.round(s / 60)} minutes` : `about ${s} seconds`;
55
+ }
56
+ /** The tide gauge's line (readable any time, quest or not). */
57
+ export function bloodTideLine(nowMs) {
58
+ const t = bloodTide(nowMs);
59
+ const moon = isBloodMoon(nowMs) ? ' The blood moon is up.' : '';
60
+ if (t.phase === 'low')
61
+ return `The gauge post stands dry to its lowest red mark: low blood, ${waitText(t.msLeftLow)} left before the flood.${moon}`;
62
+ if (t.phase === 'ebb')
63
+ return `The blood is falling, the posts just awash. Low blood in ${waitText(t.msUntilLow)}.${moon}`;
64
+ if (t.phase === 'flood')
65
+ return `The blood is climbing the posts again. Low blood in ${waitText(t.msUntilLow)}.${moon}`;
66
+ return `High blood: the ford posts are under. Low blood in ${waitText(t.msUntilLow)}.${moon}`;
67
+ }
68
+ // ---- Story step windows (storyWindows.ts reads these) ---------------------------------------------------------------------------
69
+ /** When the next blood moon begins (the next 18:00 UTC at or after `nowMs`; `nowMs` itself when the lamps are lit). */
70
+ export function nextBloodMoonMs(nowMs) {
71
+ if (isBloodMoon(nowMs))
72
+ return nowMs;
73
+ const day = Math.floor(nowMs / 86_400_000) * 86_400_000;
74
+ return day + 18 * 3_600_000;
75
+ }
76
+ // ---- The props (questprop entities, style `<prop>:<which>`) -------------------------------------------------------------------
77
+ export const BT_PROP = {
78
+ /** The three tide markers on the rim (Reading the Red). */
79
+ marker: 'btmarker',
80
+ /** The five ford posts on the river's north bank, in crossing order (The Low Ford). */
81
+ post: 'btpost',
82
+ /** The two rope posts of the personal Blood Ford crossing, one each bank. */
83
+ rope: 'btrope',
84
+ /** The three moon braziers on the rim, in lighting order (Night of the Red Moon). */
85
+ brazier: 'btbrazier',
86
+ /** The Tide Bell at the first plank walk's foot (Tide of Blood). */
87
+ bell: 'btbell',
88
+ /** The tide gauge post by the Watch's gate: tells the tide any time. */
89
+ gauge: 'btgauge',
90
+ /** The Watch's lamp-oil cask (Night of the Red Moon): three flasks. */
91
+ oil: 'btoil',
92
+ };
93
+ export const BT_MARKERS = [
94
+ { id: 'bt-marker-nw', x: 588, z: 509, style: `${BT_PROP.marker}:nw` },
95
+ { id: 'bt-marker-ne', x: 612, z: 509, style: `${BT_PROP.marker}:ne` },
96
+ { id: 'bt-marker-s', x: 600, z: 529, style: `${BT_PROP.marker}:s` },
97
+ ];
98
+ /** North bank of the Blood River: one tile back from the water's edge (its jitter reaches 0.8 of a tile). */
99
+ export function bloodBankZ(x, side) {
100
+ const c = bloodRiverCenterZ(x);
101
+ const hw = bloodRiverHalfWidth(x);
102
+ return side === 'north' ? c - hw - 2 : c + hw + 2;
103
+ }
104
+ export const BT_FORD_XS = [588, 593, 598, 603, 608];
105
+ export const BT_POSTS = BT_FORD_XS.map((x, i) => ({ id: `bt-post-${i + 1}`, x, z: bloodBankZ(x, 'north'), style: `${BT_PROP.post}:${i + 1}` }));
106
+ export const BT_POST_ORDER = BT_POSTS.map((p) => p.style);
107
+ /** The rope posts of the Blood Ford crossing (a click teleports to the other one). */
108
+ export const BLOOD_FORD_X = 614;
109
+ export const BT_ROPE_NORTH = { id: 'bt-rope-north', x: BLOOD_FORD_X, z: bloodBankZ(BLOOD_FORD_X, 'north'), style: `${BT_PROP.rope}:north` };
110
+ export const BT_ROPE_SOUTH = { id: 'bt-rope-south', x: BLOOD_FORD_X, z: bloodBankZ(BLOOD_FORD_X, 'south'), style: `${BT_PROP.rope}:south` };
111
+ export function isBloodFordRopeStyle(style) {
112
+ return !!style && style.startsWith(`${BT_PROP.rope}:`);
113
+ }
114
+ export const BT_BRAZIERS = [
115
+ { id: 'bt-brazier-1', x: 580, z: 518, style: `${BT_PROP.brazier}:1` },
116
+ { id: 'bt-brazier-2', x: 600, z: 506, style: `${BT_PROP.brazier}:2` },
117
+ { id: 'bt-brazier-3', x: 620, z: 518, style: `${BT_PROP.brazier}:3` },
118
+ ];
119
+ export const BT_BRAZIER_ORDER = BT_BRAZIERS.map((p) => p.style);
120
+ /** The Tide Bell, on the bank at the south foot of the first plank walk (the walk's last tile is MIRE_CX, MIRE_CZ + 4). */
121
+ export const BT_BELL = { id: 'bt-bell', x: MIRE_CX + 1, z: MIRE_CZ + 6, style: `${BT_PROP.bell}:tide` };
122
+ export const BT_GAUGE = { id: 'bt-gauge', x: 636, z: 515, style: `${BT_PROP.gauge}:post` };
123
+ export const BT_OIL_CASK = { id: 'bt-oil-cask', x: 644, z: 516, style: `${BT_PROP.oil}:cask` };
124
+ export const BT_QUEST_PROPS = [...BT_MARKERS, ...BT_POSTS, BT_ROPE_NORTH, BT_ROPE_SOUTH, ...BT_BRAZIERS, BT_BELL, BT_GAUGE, BT_OIL_CASK];
125
+ /** The model a prop draws with (dreadmodel names; stand-ins from the events kit and the quest set). */
126
+ export function tideOfBloodPropModel(prop) {
127
+ if (prop === BT_PROP.marker || prop === BT_PROP.post)
128
+ return 'evsteppingstones';
129
+ if (prop === BT_PROP.rope)
130
+ return 'evwatchpost';
131
+ if (prop === BT_PROP.brazier)
132
+ return 'evwatchbrazier';
133
+ if (prop === BT_PROP.bell)
134
+ return 'questbeacon';
135
+ if (prop === BT_PROP.gauge)
136
+ return 'evsigntimer';
137
+ if (prop === BT_PROP.oil)
138
+ return 'blackwakecargo';
139
+ return null;
140
+ }
141
+ export const TIDE_OF_BLOOD_PROP_NAMES = {
142
+ [BT_MARKERS[0].style]: 'Tide Marker (north-west)',
143
+ [BT_MARKERS[1].style]: 'Tide Marker (north-east)',
144
+ [BT_MARKERS[2].style]: 'Tide Marker (south)',
145
+ ...Object.fromEntries(BT_POSTS.map((p, i) => [p.style, `Ford Post ${i + 1}`])),
146
+ [BT_ROPE_NORTH.style]: 'Blood Ford Rope (north bank)',
147
+ [BT_ROPE_SOUTH.style]: 'Blood Ford Rope (south bank)',
148
+ ...Object.fromEntries(BT_BRAZIERS.map((p, i) => [p.style, `Moon Brazier ${i + 1}`])),
149
+ [BT_BELL.style]: 'Tide Bell',
150
+ [BT_GAUGE.style]: 'Tide Gauge',
151
+ [BT_OIL_CASK.style]: "Mire Watch Oil Cask",
152
+ };
153
+ /** The idle line for a prop clicked when the quest does not want it (the gauge says the tide any time). */
154
+ export function tideOfBloodPropIdleLine(prop, nowMs) {
155
+ if (prop === BT_PROP.gauge)
156
+ return bloodTideLine(nowMs);
157
+ if (prop === BT_PROP.marker)
158
+ return 'A weathered tide marker, a red band painted at the high-blood line. The Warden reads these.';
159
+ if (prop === BT_PROP.post)
160
+ return `A ford post, black with old blood. ${bloodTideLine(nowMs)}`;
161
+ if (prop === BT_PROP.brazier)
162
+ return 'A rusted moon brazier on the rim. It wants oil, a quest that asks for it, and the blood moon.';
163
+ if (prop === BT_PROP.bell)
164
+ return 'The Tide Bell, green with age, hung low over the plank walk. It is rung in the red low.';
165
+ if (prop === BT_PROP.rope)
166
+ return 'A rope post at the Blood Ford. Anyone who has learned the ford (the quest The Low Ford) can cross by it whenever the blood is not high.';
167
+ if (prop === BT_PROP.oil)
168
+ return "The Mire Watch's oil cask, for the lamps and the moon braziers.";
169
+ return null;
170
+ }
171
+ // ---- The Blood Ford crossing (personal: only who has finished The Low Ford) --------------------------------------------------------
172
+ export const BLOOD_FORD_QUEST_ID = 'theLowFord';
173
+ export const BLOOD_FORD_CLOSED_TEXT = 'The blood runs too deep at the ford. Wait for it to ebb (the gauge post by the Mire Watch tells the tide).';
174
+ export const BLOOD_FORD_LOCKED_TEXT = "You have not learned the ford's marks. Marsh-Warden Odalys Venn at the Mire Watch will teach you (the quest The Low Ford).";
175
+ // ---- Items and creatures ---------------------------------------------------------------------------------------------------------
176
+ /** The Bloodtide Elemental's shard (no trader buys one: a lost one drops again from the next one down). */
177
+ export const BLOODTIDE_SHARD_KIND = 'bloodtideshard';
178
+ export const TIDE_OF_BLOOD_ITEM_NAMES = { [BLOODTIDE_SHARD_KIND]: 'Bloodtide Shard' };
179
+ export const MIRE_LEECH_KIND = 'mireleech';
180
+ export const BLOODTIDE_ELEMENTAL_KIND = 'bloodtideelemental';
181
+ export const MIRE_TIDE_KINDS = [MIRE_LEECH_KIND, BLOODTIDE_ELEMENTAL_KIND];
182
+ export function isMireTideKind(kind) {
183
+ return MIRE_TIDE_KINDS.includes(kind);
184
+ }
185
+ export const MIRE_TIDE_CREATURES = {
186
+ mireleech: {
187
+ name: 'Mire Leech',
188
+ level: 21,
189
+ maxHit: 12,
190
+ healthScale: 0.9,
191
+ respawnMs: 30_000,
192
+ aggro: 4,
193
+ leash: 12,
194
+ text: 'A Mire Leech uncoils from the mud and humps at you, mouth first.',
195
+ note: 'A fat blood-red leech as long as a forearm that lives in the Mire\'s pools and the mud between them. It goes for anyone who wades near, and the Mire\'s PvP rules and no healing in a fight apply while you fight it.',
196
+ },
197
+ bloodtideelemental: {
198
+ name: 'Bloodtide Elemental',
199
+ level: 28,
200
+ maxHit: 20,
201
+ healthScale: 1.4,
202
+ respawnMs: 4 * 60_000,
203
+ aggro: 6,
204
+ leash: 14,
205
+ text: 'The Bloodtide Elemental rises out of the west pool, shedding blood, and comes for you.',
206
+ note: 'The Mire\'s own tide given a shape: a column of standing blood in the west pool that rises when the blood is high. Every fourth blow is a Blood Surge, announced a full turn ahead: step out of its reach before it lands and it misses. Drops the Bloodtide Shard every time.',
207
+ },
208
+ };
209
+ /** The elemental stands at the west plank walk's west end; the leeches in and between the pools. */
210
+ export const BLOODTIDE_ELEMENTAL_SPOT = { x: MIRE_CX - 18, z: MIRE_CZ + 3, leash: 3 };
211
+ export const MIRE_LEECH_SPOTS = [
212
+ [592, 524], [608, 512], [586, 526], [612, 524], [594, 510], [578, 514], [618, 522],
213
+ ];
214
+ export const MIRE_LEECH_LEASH = 3;
215
+ export const MIRE_LEECH_PACE = { speed: 1.2, idleChance: 0.5, pause: [2, 6] };
216
+ // ---- The Explorer's Ledger page ----------------------------------------------------------------------------------------------------
217
+ export const LEDGER_MIRE_LINES = [
218
+ { id: 'mire:ford', label: 'Crossed the Blood River by the Blood Ford' },
219
+ { id: 'mire:moon', label: 'Lit the moon braziers under the blood moon' },
220
+ { id: 'mire:surge', label: 'Put down the Bloodtide Elemental' },
221
+ { id: 'mire:surge-dodged', label: 'Stepped clear of a Blood Surge' },
222
+ { id: 'mire:bell', label: 'Rang the Tide Bell in the red low' },
223
+ ];
224
+ //# sourceMappingURL=tideOfBlood.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tideOfBlood.js","sourceRoot":"","sources":["../src/tideOfBlood.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * TIDE OF BLOOD as five story quests (T73, 2026-10-14; see tideOfBlood.ts for the story and the clock). Kept in its own file and entered
3
+ * in storyQuests.ts STORY_QUESTS as five lines. Types only from storyQuests.ts (no runtime import, so there is no cycle). Rewards are
4
+ * placeholders for the balance pass; every Combat gate is a placeholder too (the Mire is PvP ground with no healing in a fight).
5
+ */
6
+ import type { StoryQuestDef } from './storyQuests.js';
7
+ export declare const READING_THE_RED_COMBAT = 18;
8
+ export declare const LOW_FORD_COMBAT = 20;
9
+ export declare const RED_MOON_COMBAT = 24;
10
+ export declare const SURGE_COMBAT = 28;
11
+ export declare const TIDE_OF_BLOOD_COMBAT = 33;
12
+ /** The ford's bank (where the helper points and `reach` counts): the river's north bank under the five posts. */
13
+ export declare const LOW_FORD_AREA: {
14
+ readonly minX: 586;
15
+ readonly maxX: 610;
16
+ readonly minZ: 541;
17
+ readonly maxZ: 548;
18
+ };
19
+ export declare const LOW_FORD_AT: {
20
+ readonly x: 598;
21
+ readonly z: number;
22
+ readonly label: "the Blood Ford";
23
+ };
24
+ /** The west plank walk's west end, where the Bloodtide Elemental stands. */
25
+ export declare const SURGE_AREA: {
26
+ readonly minX: 578;
27
+ readonly maxX: 592;
28
+ readonly minZ: 518;
29
+ readonly maxZ: 524;
30
+ };
31
+ export declare const SURGE_AT: {
32
+ readonly x: number;
33
+ readonly z: number;
34
+ readonly label: "the west plank walk";
35
+ };
36
+ export declare const READING_THE_RED_QUEST: StoryQuestDef;
37
+ export declare const LOW_FORD_QUEST: StoryQuestDef;
38
+ export declare const RED_MOON_QUEST: StoryQuestDef;
39
+ export declare const SURGE_QUEST: StoryQuestDef;
40
+ export declare const TIDE_OF_BLOOD_QUEST: StoryQuestDef;
41
+ //# sourceMappingURL=tideOfBloodQuestDef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tideOfBloodQuestDef.d.ts","sourceRoot":"","sources":["../src/tideOfBloodQuestDef.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsBtD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,iHAAiH;AACjH,eAAO,MAAM,aAAa;;;;;CAA0D,CAAC;AACrF,eAAO,MAAM,WAAW;;;;CAAkE,CAAC;AAC3F,4EAA4E;AAC5E,eAAO,MAAM,UAAU;;;;;CAA0D,CAAC;AAClF,eAAO,MAAM,QAAQ;;;;CAA6E,CAAC;AAInG,eAAO,MAAM,qBAAqB,EAAE,aA4DnC,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,aA6D5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,aAkE5B,CAAC;AAIF,eAAO,MAAM,WAAW,EAAE,aAiDzB,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,aAoDjC,CAAC"}