@dreadwood-types/types 0.1.203 → 0.1.205

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 (73) hide show
  1. package/dist/animation.d.ts.map +1 -1
  2. package/dist/animation.js +6 -1
  3. package/dist/animation.js.map +1 -1
  4. package/dist/areaGates.d.ts +77 -8
  5. package/dist/areaGates.d.ts.map +1 -1
  6. package/dist/areaGates.js +219 -15
  7. package/dist/areaGates.js.map +1 -1
  8. package/dist/attackableNpcs.d.ts.map +1 -1
  9. package/dist/attackableNpcs.js +6 -0
  10. package/dist/attackableNpcs.js.map +1 -1
  11. package/dist/bearFloes.d.ts +44 -0
  12. package/dist/bearFloes.d.ts.map +1 -1
  13. package/dist/bearFloes.js +56 -4
  14. package/dist/bearFloes.js.map +1 -1
  15. package/dist/bounty.d.ts +1 -1
  16. package/dist/bounty.js +1 -1
  17. package/dist/cellsBelow.d.ts +5 -4
  18. package/dist/cellsBelow.d.ts.map +1 -1
  19. package/dist/cellsBelow.js +5 -4
  20. package/dist/cellsBelow.js.map +1 -1
  21. package/dist/constants.d.ts +8 -1
  22. package/dist/constants.d.ts.map +1 -1
  23. package/dist/constants.js +30 -0
  24. package/dist/constants.js.map +1 -1
  25. package/dist/frozenDungeons.d.ts +43 -0
  26. package/dist/frozenDungeons.d.ts.map +1 -0
  27. package/dist/frozenDungeons.js +328 -0
  28. package/dist/frozenDungeons.js.map +1 -0
  29. package/dist/gateLevels.d.ts +19 -0
  30. package/dist/gateLevels.d.ts.map +1 -0
  31. package/dist/gateLevels.js +19 -0
  32. package/dist/gateLevels.js.map +1 -0
  33. package/dist/index.d.ts +2 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/legacy.d.ts +2 -0
  38. package/dist/legacy.d.ts.map +1 -1
  39. package/dist/legacy.js +2 -0
  40. package/dist/legacy.js.map +1 -1
  41. package/dist/ogreFortress.d.ts +30 -1
  42. package/dist/ogreFortress.d.ts.map +1 -1
  43. package/dist/ogreFortress.js +28 -6
  44. package/dist/ogreFortress.js.map +1 -1
  45. package/dist/quests.d.ts.map +1 -1
  46. package/dist/quests.js +2 -1
  47. package/dist/quests.js.map +1 -1
  48. package/dist/storyQuests.d.ts +6 -1
  49. package/dist/storyQuests.d.ts.map +1 -1
  50. package/dist/storyQuests.js +19 -9
  51. package/dist/storyQuests.js.map +1 -1
  52. package/dist/timedRun.js +1 -1
  53. package/dist/timedRun.js.map +1 -1
  54. package/dist/wards.d.ts.map +1 -1
  55. package/dist/wards.js +2 -0
  56. package/dist/wards.js.map +1 -1
  57. package/dist/westernEntrance.d.ts +1 -1
  58. package/dist/westernEntrance.d.ts.map +1 -1
  59. package/dist/westernEntrance.js +2 -1
  60. package/dist/westernEntrance.js.map +1 -1
  61. package/dist/worldEventLayout.d.ts +20 -0
  62. package/dist/worldEventLayout.d.ts.map +1 -0
  63. package/dist/worldEventLayout.js +33 -0
  64. package/dist/worldEventLayout.js.map +1 -0
  65. package/dist/worldEventScaling.d.ts +90 -0
  66. package/dist/worldEventScaling.d.ts.map +1 -0
  67. package/dist/worldEventScaling.js +121 -0
  68. package/dist/worldEventScaling.js.map +1 -0
  69. package/dist/worldEvents.d.ts +97 -4
  70. package/dist/worldEvents.d.ts.map +1 -1
  71. package/dist/worldEvents.js +31 -26
  72. package/dist/worldEvents.js.map +1 -1
  73. package/package.json +2 -2
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The tile helpers every Random World Event's layout is written with (moved out of worldEvents.ts on 2026-10-12 so the
3
+ * frozen dungeons' defs in frozenDungeons.ts can use them without a circular import): an interior's plot in the
4
+ * underground strip, a local layout inside it, and an entrance site.
5
+ */
6
+ import { UNDERGROUND_ORIGIN_X } from './constants.js';
7
+ /** A node's or a work's tool kind meaning any woodwork tool: a hatchet, an axe, a working saw (woodwork.ts isWoodworkTool). */
8
+ export const EVENT_TOOL_WOODWORK = 'woodworktool';
9
+ export const eventSite = (id, x, z, facing = 's') => ({ id, x, z, facing });
10
+ /**
11
+ * The interiors' plots: three across in the underground strip below the other caves (rows 640-820 were untouched rock
12
+ * on 2026-10-03; the smoke test checks nothing else is carved in them). From row 3 down only column 0 is free rock (the
13
+ * Western Line's bores and tunnel take columns 1-3 from z 820, surveyed 2026-10-12): the frozen dungeons use it.
14
+ */
15
+ const PLOT_W = 64;
16
+ const PLOT_D = 56;
17
+ export function eventPlot(col, row) {
18
+ // 24 tiles clear of the overworld's east edge (x 928), so no grass shows past an interior's rock even from above.
19
+ const minX = UNDERGROUND_ORIGIN_X + 24 + col * 72;
20
+ const minZ = 640 + row * 60;
21
+ return { minX, maxX: minX + PLOT_W - 1, minZ, maxZ: minZ + PLOT_D - 1 };
22
+ }
23
+ /** A local layout's helpers: tiles relative to a corner inside the plot (8 tiles of rock round the sheet's map). */
24
+ export function eventLayout(p) {
25
+ const ox = p.minX + 8;
26
+ const oz = p.minZ + 8;
27
+ return {
28
+ at: (x, z) => ({ x: ox + x, z: oz + z }),
29
+ spot: (x, z, facing) => ({ x: ox + x, z: oz + z, facing }),
30
+ rect: (x0, z0, x1, z1) => ({ minX: ox + x0, maxX: ox + x1, minZ: oz + z0, maxZ: oz + z1 }),
31
+ };
32
+ }
33
+ //# sourceMappingURL=worldEventLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worldEventLayout.js","sourceRoot":"","sources":["../src/worldEventLayout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD,+HAA+H;AAC/H,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,CAAS,EAAE,CAAS,EAAE,SAA2B,GAAG,EAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAEtI;;;;GAIG;AACH,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW;IAChD,kHAAkH;IAClH,MAAM,IAAI,GAAG,oBAAoB,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IAC5B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,WAAW,CAAC,CAAW;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACtB,OAAO;QACL,EAAE,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,MAAwB,EAAkB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5G,IAAI,EAAE,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;KACrI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Scaled Random World Events: the frozen random-spawn dungeons (frozenDungeons.ts) meet a player at their own level,
3
+ * anywhere from 10 to 40 (James, 2026-10-03, on the frozen sheets: "yes it can scale with level and difficulty", "xp can
4
+ * increase by scale too"; PLAN_1_TO_40.md slice C4, decision D9: the first set piece for levels 10-40).
5
+ *
6
+ * One number drives it: the scale level, the player's combat level held to the band plus the dungeon's difficulty.
7
+ * - Enemies: each stream spawns at the scale level of the party inside plus the stream's own offset, a level either way,
8
+ * held inside the stream's range and the band (never 41+: build focus, `dreadwoods/CLAUDE.md`).
9
+ * - The cache: a line marked `scales` gives more the higher the opener's scale level; a line whose kind holds `{metal}`
10
+ * gives that tier's piece (bronze, iron, steel).
11
+ * - Explorer XP for going in and for the cache grows the same way.
12
+ *
13
+ * EVERY NUMBER HERE IS A PLACEHOLDER for the balance pass (balance is last, PLAN_1_TO_40.md). Change them here only:
14
+ * the dungeons' data and the backend read them, and the tests check the shape (monotonic, inside the band), not values.
15
+ */
16
+ import type { LevelRange, WorldEventDef, WorldEventStream } from './worldEvents.js';
17
+ /** What a scaled dungeon carries (WorldEventDef `scaling`). */
18
+ export type WorldEventScaling = {
19
+ /**
20
+ * 0 is the easiest (Frostpine Trapper Hollow); each step lifts the scale level by
21
+ * SCALED_EVENT_TUNING.levelsPerDifficulty (the Smuggler Grotto above Frostwatch, Shiverbell the hardest).
22
+ */
23
+ difficulty: number;
24
+ };
25
+ /** Every scaled dungeon lives in this band: the gate lets you in at its floor, and nothing in it is ever above its top. */
26
+ export declare const SCALED_EVENT_BAND: LevelRange;
27
+ export type ScaledMetal = 'bronze' | 'iron' | 'steel';
28
+ /** PLACEHOLDERS (balance pass). */
29
+ export declare const SCALED_EVENT_TUNING: {
30
+ /** Scale levels each difficulty step adds. */
31
+ readonly levelsPerDifficulty: 2;
32
+ /** A spawn's level lands this many either side of its aim. */
33
+ readonly spread: 1;
34
+ /** A `scales` loot line gives this much more per scale level above the band's floor (x1 at 10, x2.5 at 40). */
35
+ readonly qtyPerLevel: 0.05;
36
+ /** Explorer XP likewise (x1 at 10, about x2.8 at 40). */
37
+ readonly xpPerLevel: 0.06;
38
+ /**
39
+ * A stream creature's health, as a share of what a creature of its level has anywhere else (npcs.ts
40
+ * npcHealthRangeForLevel): they keep coming, so each one is lighter work than a lone beast of its level (at 36 a full
41
+ * one has about 560 health, and a pair of them at a time wore down a level-60 tester in full Frozen plate, 2026-10-12).
42
+ */
43
+ readonly streamHealthShare: 0.4;
44
+ /** A stream creature's biggest hit per level (the game's creatures hit for about 0.55 of their level). */
45
+ readonly streamHitPerLevel: 0.42;
46
+ /** The metal a `{metal}` line gives, by the opener's scale level (iron from Combat 20, steel from 32: wearable). */
47
+ readonly metalTiers: readonly {
48
+ upTo: number;
49
+ metal: ScaledMetal;
50
+ }[];
51
+ };
52
+ /**
53
+ * A trapper's snare (role 'snare'): the share of the victim's own maximum health it takes (so it bites alike at every
54
+ * level), never less than `minHit`; how long they are held; how near the dungeon's creatures must be to hear it and come.
55
+ * PLACEHOLDERS (balance pass).
56
+ */
57
+ export declare const SNARE_TUNING: {
58
+ readonly healthShare: 0.12;
59
+ readonly minHit: 2;
60
+ readonly holdMs: 2500;
61
+ readonly alertRadius: 7;
62
+ };
63
+ /** The combat level held to the band. */
64
+ export declare function clampToScaledBand(level: number): number;
65
+ /** The scale level for a combat level in this dungeon (its difficulty on top), never past the band's top. */
66
+ export declare function scaledEventLevel(def: Pick<WorldEventDef, 'scaling'>, combat: number): number;
67
+ /**
68
+ * A stream NPC's level in a scaled dungeon: the party's scale level plus the stream's offset, a level either way, held
69
+ * inside the stream's own range and the band.
70
+ */
71
+ export declare function scaledEnemyLevel(def: Pick<WorldEventDef, 'scaling'>, stream: Pick<WorldEventStream, 'levels' | 'levelOffset'>, partyCombat: number, roll: () => number): number;
72
+ /** How much a `scales` loot line is multiplied by at this scale level. */
73
+ export declare function scaledRewardMultiplier(scaleLevel: number): number;
74
+ /** The metal a `{metal}` line gives at this scale level. */
75
+ export declare function scaledMetal(scaleLevel: number): ScaledMetal;
76
+ /** A loot kind with its `{metal}` filled in for this scale level (a plain kind comes back as it is). */
77
+ export declare function scaledLootKind(kind: string, scaleLevel: number): string;
78
+ /** Explorer XP for going in or for the cache, for this player in this dungeon (unscaled events: the def's own). */
79
+ export declare function worldEventXp(def: Pick<WorldEventDef, 'scaling' | 'xp'>, which: 'entry' | 'cache', combat: number): number;
80
+ /**
81
+ * One character's share from a scaled dungeon's cache: each line rolls its chance (`roll` once per line, then once for
82
+ * the quantity), a `scales` line's quantity is multiplied and rounded, a `{metal}` kind takes the opener's tier.
83
+ */
84
+ export declare function rollScaledEventLoot(def: Pick<WorldEventDef, 'scaling' | 'loot'>, combat: number, roll: () => number): {
85
+ kind: string;
86
+ qty: number;
87
+ }[];
88
+ /** The levels a stream can show at in a scaled dungeon, for the guide: its lowest and highest after the band. */
89
+ export declare function scaledStreamLevels(def: Pick<WorldEventDef, 'scaling'>, stream: Pick<WorldEventStream, 'levels' | 'levelOffset'>): LevelRange;
90
+ //# sourceMappingURL=worldEventScaling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worldEventScaling.d.ts","sourceRoot":"","sources":["../src/worldEventScaling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,+DAA+D;AAC/D,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,2HAA2H;AAC3H,eAAO,MAAM,iBAAiB,EAAE,UAAqB,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtD,mCAAmC;AACnC,eAAO,MAAM,mBAAmB;IAC9B,8CAA8C;;IAE9C,8DAA8D;;IAE9D,+GAA+G;;IAE/G,yDAAyD;;IAEzD;;;;OAIG;;IAEH,0GAA0G;;IAE1G,oHAAoH;yBAK/G,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,EAAE;CAC5C,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,yCAAyC;AACzC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,6GAA6G;AAC7G,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,EACnC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,aAAa,CAAC,EACxD,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,MAAM,GACjB,MAAM,CAOR;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAG3D;AAED,wGAAwG;AACxG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,mHAAmH;AACnH,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKzH;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,MAAM,CAAC,EAC5C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,MAAM,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAWjC;AAED,iHAAiH;AACjH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG,UAAU,CAI5I"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Scaled Random World Events: the frozen random-spawn dungeons (frozenDungeons.ts) meet a player at their own level,
3
+ * anywhere from 10 to 40 (James, 2026-10-03, on the frozen sheets: "yes it can scale with level and difficulty", "xp can
4
+ * increase by scale too"; PLAN_1_TO_40.md slice C4, decision D9: the first set piece for levels 10-40).
5
+ *
6
+ * One number drives it: the scale level, the player's combat level held to the band plus the dungeon's difficulty.
7
+ * - Enemies: each stream spawns at the scale level of the party inside plus the stream's own offset, a level either way,
8
+ * held inside the stream's range and the band (never 41+: build focus, `dreadwoods/CLAUDE.md`).
9
+ * - The cache: a line marked `scales` gives more the higher the opener's scale level; a line whose kind holds `{metal}`
10
+ * gives that tier's piece (bronze, iron, steel).
11
+ * - Explorer XP for going in and for the cache grows the same way.
12
+ *
13
+ * EVERY NUMBER HERE IS A PLACEHOLDER for the balance pass (balance is last, PLAN_1_TO_40.md). Change them here only:
14
+ * the dungeons' data and the backend read them, and the tests check the shape (monotonic, inside the band), not values.
15
+ */
16
+ /** Every scaled dungeon lives in this band: the gate lets you in at its floor, and nothing in it is ever above its top. */
17
+ export const SCALED_EVENT_BAND = [10, 40];
18
+ /** PLACEHOLDERS (balance pass). */
19
+ export const SCALED_EVENT_TUNING = {
20
+ /** Scale levels each difficulty step adds. */
21
+ levelsPerDifficulty: 2,
22
+ /** A spawn's level lands this many either side of its aim. */
23
+ spread: 1,
24
+ /** A `scales` loot line gives this much more per scale level above the band's floor (x1 at 10, x2.5 at 40). */
25
+ qtyPerLevel: 0.05,
26
+ /** Explorer XP likewise (x1 at 10, about x2.8 at 40). */
27
+ xpPerLevel: 0.06,
28
+ /**
29
+ * A stream creature's health, as a share of what a creature of its level has anywhere else (npcs.ts
30
+ * npcHealthRangeForLevel): they keep coming, so each one is lighter work than a lone beast of its level (at 36 a full
31
+ * one has about 560 health, and a pair of them at a time wore down a level-60 tester in full Frozen plate, 2026-10-12).
32
+ */
33
+ streamHealthShare: 0.4,
34
+ /** A stream creature's biggest hit per level (the game's creatures hit for about 0.55 of their level). */
35
+ streamHitPerLevel: 0.42,
36
+ /** The metal a `{metal}` line gives, by the opener's scale level (iron from Combat 20, steel from 32: wearable). */
37
+ metalTiers: [
38
+ { upTo: 19, metal: 'bronze' },
39
+ { upTo: 31, metal: 'iron' },
40
+ { upTo: 40, metal: 'steel' },
41
+ ],
42
+ };
43
+ /**
44
+ * A trapper's snare (role 'snare'): the share of the victim's own maximum health it takes (so it bites alike at every
45
+ * level), never less than `minHit`; how long they are held; how near the dungeon's creatures must be to hear it and come.
46
+ * PLACEHOLDERS (balance pass).
47
+ */
48
+ export const SNARE_TUNING = {
49
+ healthShare: 0.12,
50
+ minHit: 2,
51
+ holdMs: 2500,
52
+ alertRadius: 7,
53
+ };
54
+ /** The combat level held to the band. */
55
+ export function clampToScaledBand(level) {
56
+ const [lo, hi] = SCALED_EVENT_BAND;
57
+ return Math.max(lo, Math.min(hi, Math.round(level)));
58
+ }
59
+ /** The scale level for a combat level in this dungeon (its difficulty on top), never past the band's top. */
60
+ export function scaledEventLevel(def, combat) {
61
+ const difficulty = def.scaling?.difficulty ?? 0;
62
+ return clampToScaledBand(clampToScaledBand(combat) + difficulty * SCALED_EVENT_TUNING.levelsPerDifficulty);
63
+ }
64
+ /**
65
+ * A stream NPC's level in a scaled dungeon: the party's scale level plus the stream's offset, a level either way, held
66
+ * inside the stream's own range and the band.
67
+ */
68
+ export function scaledEnemyLevel(def, stream, partyCombat, roll) {
69
+ const spread = SCALED_EVENT_TUNING.spread;
70
+ const aim = scaledEventLevel(def, partyCombat) + (stream.levelOffset ?? 0);
71
+ const level = aim + Math.floor(roll() * (spread * 2 + 1)) - spread;
72
+ const lo = Math.max(SCALED_EVENT_BAND[0], stream.levels[0]);
73
+ const hi = Math.min(SCALED_EVENT_BAND[1], stream.levels[1]);
74
+ return Math.max(lo, Math.min(hi, level));
75
+ }
76
+ /** How much a `scales` loot line is multiplied by at this scale level. */
77
+ export function scaledRewardMultiplier(scaleLevel) {
78
+ return 1 + (clampToScaledBand(scaleLevel) - SCALED_EVENT_BAND[0]) * SCALED_EVENT_TUNING.qtyPerLevel;
79
+ }
80
+ /** The metal a `{metal}` line gives at this scale level. */
81
+ export function scaledMetal(scaleLevel) {
82
+ const level = clampToScaledBand(scaleLevel);
83
+ return SCALED_EVENT_TUNING.metalTiers.find((t) => level <= t.upTo)?.metal ?? 'steel';
84
+ }
85
+ /** A loot kind with its `{metal}` filled in for this scale level (a plain kind comes back as it is). */
86
+ export function scaledLootKind(kind, scaleLevel) {
87
+ return kind.includes('{metal}') ? kind.replace('{metal}', scaledMetal(scaleLevel)) : kind;
88
+ }
89
+ /** Explorer XP for going in or for the cache, for this player in this dungeon (unscaled events: the def's own). */
90
+ export function worldEventXp(def, which, combat) {
91
+ const base = def.xp[which];
92
+ if (!def.scaling)
93
+ return base;
94
+ const level = scaledEventLevel(def, combat);
95
+ return Math.round(base * (1 + (level - SCALED_EVENT_BAND[0]) * SCALED_EVENT_TUNING.xpPerLevel));
96
+ }
97
+ /**
98
+ * One character's share from a scaled dungeon's cache: each line rolls its chance (`roll` once per line, then once for
99
+ * the quantity), a `scales` line's quantity is multiplied and rounded, a `{metal}` kind takes the opener's tier.
100
+ */
101
+ export function rollScaledEventLoot(def, combat, roll) {
102
+ const level = scaledEventLevel(def, combat);
103
+ const mult = scaledRewardMultiplier(level);
104
+ const out = [];
105
+ for (const line of def.loot) {
106
+ if (line.chance < 1 && roll() >= line.chance)
107
+ continue;
108
+ const base = line.min + Math.floor(roll() * (line.max - line.min + 1));
109
+ const qty = line.scales ? Math.round(base * mult) : base;
110
+ if (qty > 0)
111
+ out.push({ kind: scaledLootKind(line.kind, level), qty });
112
+ }
113
+ return out;
114
+ }
115
+ /** The levels a stream can show at in a scaled dungeon, for the guide: its lowest and highest after the band. */
116
+ export function scaledStreamLevels(def, stream) {
117
+ const lo = Math.max(SCALED_EVENT_BAND[0], stream.levels[0], scaledEventLevel(def, SCALED_EVENT_BAND[0]) + (stream.levelOffset ?? 0) - SCALED_EVENT_TUNING.spread);
118
+ const hi = Math.min(SCALED_EVENT_BAND[1], stream.levels[1], scaledEventLevel(def, SCALED_EVENT_BAND[1]) + (stream.levelOffset ?? 0) + SCALED_EVENT_TUNING.spread);
119
+ return [Math.min(lo, hi), hi];
120
+ }
121
+ //# sourceMappingURL=worldEventScaling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worldEventScaling.js","sourceRoot":"","sources":["../src/worldEventScaling.ts"],"names":[],"mappings":"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"}
@@ -18,15 +18,39 @@
18
18
  * Only events with `built` rotate; the others have their sites and plot and wait for their layout (James's order).
19
19
  */
20
20
  import { type NpcKind } from './constants.js';
21
+ import type { WorldEventScaling } from './worldEventScaling.js';
22
+ export { EVENT_TOOL_WOODWORK } from './worldEventLayout.js';
21
23
  /** James's build order (2026-10-03). Cart Ravine and Watch Post Cellar from the first overview are dropped. */
22
- export type WorldEventId = 'copper-prospect' | 'buried-storehouse' | 'reedbed-sinkhole' | 'tidepool-grotto' | 'storm-felled-grove' | 'forgotten-smithy' | 'old-kings-culvert' | 'sunken-wayshrine' | 'goblin-sapper';
24
+ export type StarterEventId = 'copper-prospect' | 'buried-storehouse' | 'reedbed-sinkhole' | 'tidepool-grotto' | 'storm-felled-grove' | 'forgotten-smithy' | 'old-kings-culvert' | 'sunken-wayshrine' | 'goblin-sapper';
25
+ /**
26
+ * The frozen random-spawn dungeons (frozenDungeons.ts, slice C4 of PLAN_1_TO_40.md, 2026-10-12): the same engine, a
27
+ * rotation of their own in the Frozen north, levels 10-40 by scaling. Frostwatch Cellar, the Frozen Shore Smuggler
28
+ * Grotto and Shiverbell Reliquary join this list when they are built (NEXT_STEPS.md, "Frozen random-spawn dungeons").
29
+ */
30
+ export type FrozenDungeonId = 'frostpine-trapper-hollow' | 'kings-road-ice-culvert';
31
+ export type WorldEventId = StarterEventId | FrozenDungeonId;
32
+ export declare const STARTER_EVENT_IDS: readonly StarterEventId[];
33
+ /** The frozen dungeons in the suggested build order (NEXT_STEPS: Trapper Hollow, then the Culvert). */
34
+ export declare const FROZEN_DUNGEON_IDS: readonly FrozenDungeonId[];
23
35
  export declare const WORLD_EVENT_IDS: readonly WorldEventId[];
36
+ /**
37
+ * Which rotation an event is in: the nine starter events turn up round the starter area, the frozen dungeons in the
38
+ * snow. Each region keeps its own count of mouths open at once (WORLD_EVENT_ACTIVE_BY_REGION), so a frozen dungeon
39
+ * never takes a starter slot.
40
+ */
41
+ export type WorldEventRegion = 'starter' | 'frozen';
24
42
  /** Time inside, wall clock (every sheet: "five minutes"). */
25
43
  export declare const WORLD_EVENT_DURATION_MS: number;
26
44
  /** After the first player goes in, how long the mouth stays open for others to follow into the same run. */
27
45
  export declare const WORLD_EVENT_JOIN_WINDOW_MS = 30000;
28
46
  /** Entrances showing across the starter area at once (never two of the same event). */
29
47
  export declare const WORLD_EVENT_ACTIVE_COUNT = 3;
48
+ /**
49
+ * Frozen dungeon mouths showing in the snow at once. PLACEHOLDER for the balance pass: two, so with the two built
50
+ * dungeons both are always somewhere; once all five are built two of five show and the rest wait their turn.
51
+ */
52
+ export declare const FROZEN_DUNGEON_ACTIVE_COUNT = 2;
53
+ export declare const WORLD_EVENT_ACTIVE_BY_REGION: Readonly<Record<WorldEventRegion, number>>;
30
54
  /** How long after one resets before the next entrance turns up, somewhere else. */
31
55
  export declare const WORLD_EVENT_REOPEN_MS: {
32
56
  readonly minMs: 45000;
@@ -66,7 +90,7 @@ export type TileRect = {
66
90
  minZ: number;
67
91
  maxZ: number;
68
92
  };
69
- export type WorldEventPieceRole = 'exit' | 'cache' | 'switch' | 'barrier' | 'sign' | 'decor' | 'node' | 'passage' | 'station';
93
+ export type WorldEventPieceRole = 'exit' | 'cache' | 'switch' | 'barrier' | 'sign' | 'decor' | 'node' | 'passage' | 'station' | 'snare';
70
94
  /** A station piece's kind: the game's own smelting and smithing stations (blacksmithing.ts), not an event kind. */
71
95
  export type WorldEventStation = 'furnace' | 'anvil';
72
96
  export declare const WORLD_EVENT_ROLE_KIND: Readonly<Record<Exclude<WorldEventPieceRole, 'decor' | 'station'>, string>>;
@@ -115,6 +139,28 @@ export type WorldEventPiece = WorldEventSpot & {
115
139
  * dialog as anywhere else, and the event never changes them (no done model, nothing to reset).
116
140
  */
117
141
  station?: WorldEventStation;
142
+ /**
143
+ * A snare (role 'snare', Frostpine Trapper Hollow's sheet: "chop or clear ... snare lines"): armed it is a walkable
144
+ * tile with a wire loop on it; a player who steps on it is caught (held, hurt, and the creatures nearby hear it); a
145
+ * click disarms it first for its Foraging XP. Sprung or disarmed it takes its done model until the reset.
146
+ */
147
+ snare?: WorldEventSnare;
148
+ };
149
+ /**
150
+ * A trapper's snare: what disarming it takes and gives. What a caught player suffers (a share of their own health, so
151
+ * it bites the same at every level, and a hold) is SNARE_TUNING in worldEventScaling.ts, a placeholder for balance.
152
+ */
153
+ export type WorldEventSnare = {
154
+ /** Foraging level to disarm it. */
155
+ level: number;
156
+ /** Foraging XP for a disarm. */
157
+ xp: number;
158
+ /** What a careful disarm gives back (the wire, sometimes). */
159
+ give?: readonly {
160
+ kind: string;
161
+ min: number;
162
+ max: number;
163
+ }[];
118
164
  };
119
165
  /** A switch worked like a node: what it takes, what finishing it gives. */
120
166
  export type WorldEventWork = {
@@ -131,8 +177,6 @@ export type WorldEventWork = {
131
177
  name: string;
132
178
  };
133
179
  };
134
- /** A node's or a work's tool kind meaning any woodwork tool: a hatchet, an axe, a working saw (woodwork.ts isWoodworkTool). */
135
- export declare const EVENT_TOOL_WOODWORK = "woodworktool";
136
180
  /** A quick gather node's yield: each line rolls its own quantity; the done model shows it emptied until it refills. */
137
181
  export type WorldEventNode = {
138
182
  give: readonly {
@@ -215,12 +259,47 @@ export type WorldEventStream = {
215
259
  max: number;
216
260
  aggroText: string;
217
261
  };
262
+ /**
263
+ * A scaled event (the def's `scaling`): this stream's level relative to the scale level (worldEventScaling.ts
264
+ * scaledEnemyLevel), clamped to `levels`. Unscaled events ignore it and lean into `levels` as before.
265
+ */
266
+ levelOffset?: number;
267
+ /** How near a player must come before it goes for them (default: STREAM_AGGRO_RADIUS, or 1 when stationary). */
268
+ aggroRadius?: number;
269
+ /**
270
+ * A caller (the King's Road Ice Culvert's Lookout, "calls nearby rats"): while one of this stream is alive and has a
271
+ * target, every `everyMs` it sends one more of stream `stream` from that stream's nests, up to `max` of them alive
272
+ * above that stream's own cap. Everyone inside hears `text`. Kill the caller and the calling stops.
273
+ */
274
+ calls?: {
275
+ stream: number;
276
+ everyMs: number;
277
+ max: number;
278
+ text: string;
279
+ };
280
+ /**
281
+ * A shooter that keeps its place (the Culvert Lookout's crossbow): every `everyMs` it looses at the nearest player it
282
+ * can see within `range` (a clear line), a hit of up to `share` of its biggest blow, never leaving them below 1
283
+ * health. It is not a fight: the player keeps working (the sluices) under fire, and only a fight beside it (its
284
+ * aggroRadius) is one. A caller with a volley calls while it has someone in its sights.
285
+ */
286
+ volley?: {
287
+ range: number;
288
+ everyMs: number;
289
+ share: number;
290
+ };
218
291
  };
292
+ /**
293
+ * One line of a cache's loot. In a scaled event (the def's `scaling`) a line with `scales` has its quantity multiplied
294
+ * by the reward multiplier for the opener's level, and a `kind` holding `{metal}` takes the metal of the opener's tier
295
+ * (worldEventScaling.ts: `{metal}helmet` is a bronze, iron or steel helmet).
296
+ */
219
297
  export type WorldEventLoot = {
220
298
  kind: string;
221
299
  min: number;
222
300
  max: number;
223
301
  chance: number;
302
+ scales?: boolean;
224
303
  };
225
304
  /** Quick ore seams (orerock): the metal is the seam's style, `:cluster` draws the sheet's ore cluster model. */
226
305
  export type WorldEventSeam = {
@@ -230,6 +309,16 @@ export type WorldEventSeam = {
230
309
  };
231
310
  export type WorldEventDef = {
232
311
  id: WorldEventId;
312
+ /** Which rotation it is in (default 'starter'). */
313
+ region?: WorldEventRegion;
314
+ /** How long a run lasts (default WORLD_EVENT_DURATION_MS): each frozen dungeon has its own (James, 2026-10-03). */
315
+ durationMs?: number;
316
+ /**
317
+ * Scaled to the player (James, 2026-10-03: "yes it can scale with level and difficulty", "xp can increase by scale
318
+ * too"): enemy levels, cache rewards and Explorer XP from the player's combat level and the dungeon's difficulty
319
+ * (worldEventScaling.ts). Entry XP is paid once per character per dungeon, ever (`discoveredZones`), not per mouth.
320
+ */
321
+ scaling?: WorldEventScaling;
233
322
  /** The sheet's name. */
234
323
  label: string;
235
324
  /** What the HUD timer and short notices call it. */
@@ -358,4 +447,8 @@ export declare function rollWorldEventLoot(def: WorldEventDef, roll: () => numbe
358
447
  * level 1-3 rats and a level-9 character the top of the range), with a little spread.
359
448
  */
360
449
  export declare function worldEventSpawnLevel(range: LevelRange, partyCombat: number, roll: () => number): number;
450
+ /** How long a run in this event lasts (each frozen dungeon has its own; the starter events five minutes). */
451
+ export declare function worldEventDurationMs(def: Pick<WorldEventDef, 'durationMs'>): number;
452
+ /** Which rotation the event is in. */
453
+ export declare function worldEventRegion(def: Pick<WorldEventDef, 'region'>): WorldEventRegion;
361
454
  //# sourceMappingURL=worldEvents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worldEvents.d.ts","sourceRoot":"","sources":["../src/worldEvents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worldEvents.d.ts","sourceRoot":"","sources":["../src/worldEvents.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,10 @@
18
18
  * Only events with `built` rotate; the others have their sites and plot and wait for their layout (James's order).
19
19
  */
20
20
  import { UNDERGROUND_ORIGIN_X } from './constants.js';
21
- export const WORLD_EVENT_IDS = [
21
+ import { EVENT_TOOL_WOODWORK, eventLayout as layout, eventPlot as plot, eventSite as site } from './worldEventLayout.js';
22
+ import { FROSTPINE_TRAPPER_HOLLOW, KINGS_ROAD_ICE_CULVERT } from './frozenDungeons.js';
23
+ export { EVENT_TOOL_WOODWORK } from './worldEventLayout.js';
24
+ export const STARTER_EVENT_IDS = [
22
25
  'copper-prospect',
23
26
  'buried-storehouse',
24
27
  'reedbed-sinkhole',
@@ -29,12 +32,24 @@ export const WORLD_EVENT_IDS = [
29
32
  'sunken-wayshrine',
30
33
  'goblin-sapper',
31
34
  ];
35
+ /** The frozen dungeons in the suggested build order (NEXT_STEPS: Trapper Hollow, then the Culvert). */
36
+ export const FROZEN_DUNGEON_IDS = ['frostpine-trapper-hollow', 'kings-road-ice-culvert'];
37
+ export const WORLD_EVENT_IDS = [...STARTER_EVENT_IDS, ...FROZEN_DUNGEON_IDS];
32
38
  /** Time inside, wall clock (every sheet: "five minutes"). */
33
39
  export const WORLD_EVENT_DURATION_MS = 5 * 60_000;
34
40
  /** After the first player goes in, how long the mouth stays open for others to follow into the same run. */
35
41
  export const WORLD_EVENT_JOIN_WINDOW_MS = 30_000;
36
42
  /** Entrances showing across the starter area at once (never two of the same event). */
37
43
  export const WORLD_EVENT_ACTIVE_COUNT = 3;
44
+ /**
45
+ * Frozen dungeon mouths showing in the snow at once. PLACEHOLDER for the balance pass: two, so with the two built
46
+ * dungeons both are always somewhere; once all five are built two of five show and the rest wait their turn.
47
+ */
48
+ export const FROZEN_DUNGEON_ACTIVE_COUNT = 2;
49
+ export const WORLD_EVENT_ACTIVE_BY_REGION = {
50
+ starter: WORLD_EVENT_ACTIVE_COUNT,
51
+ frozen: FROZEN_DUNGEON_ACTIVE_COUNT,
52
+ };
38
53
  /** How long after one resets before the next entrance turns up, somewhere else. */
39
54
  export const WORLD_EVENT_REOPEN_MS = { minMs: 45_000, maxMs: 120_000 };
40
55
  /** Kinds. Each is a Blender model prop (isModelPropKind): its style is `<model>-<facing>`, its footprint the model's. */
@@ -72,34 +87,12 @@ export const WORLD_EVENT_ROLE_KIND = {
72
87
  node: EVENT_NODE_KIND,
73
88
  // A passage is clicked like a switch; the backend tells them apart by the piece's role.
74
89
  passage: EVENT_SWITCH_KIND,
90
+ // A snare is clicked (to disarm it) like a switch, and walked over (its footprint is walkable).
91
+ snare: EVENT_SWITCH_KIND,
75
92
  };
76
- /** A node's or a work's tool kind meaning any woodwork tool: a hatchet, an axe, a working saw (woodwork.ts isWoodworkTool). */
77
- export const EVENT_TOOL_WOODWORK = 'woodworktool';
78
93
  /** How far above a deck piece's water tile its walkers stand (world units: one height step and a little). */
79
94
  export const EVENT_DECK_LIFT = 0.5;
80
- const site = (id, x, z, facing = 's') => ({ id, x, z, facing });
81
- /**
82
- * The interiors' plots: three across and three deep in the underground strip below the other caves (rows 640-820
83
- * were untouched rock on 2026-10-03; the smoke test checks nothing else is carved in them).
84
- */
85
- const PLOT_W = 64;
86
- const PLOT_D = 56;
87
- function plot(col, row) {
88
- // 24 tiles clear of the overworld's east edge (x 928), so no grass shows past an interior's rock even from above.
89
- const minX = UNDERGROUND_ORIGIN_X + 24 + col * 72;
90
- const minZ = 640 + row * 60;
91
- return { minX, maxX: minX + PLOT_W - 1, minZ, maxZ: minZ + PLOT_D - 1 };
92
- }
93
- /** A local layout's helpers: tiles relative to a corner inside the plot (8 tiles of rock round the sheet's map). */
94
- function layout(p) {
95
- const ox = p.minX + 8;
96
- const oz = p.minZ + 8;
97
- return {
98
- at: (x, z) => ({ x: ox + x, z: oz + z }),
99
- spot: (x, z, facing) => ({ x: ox + x, z: oz + z, facing }),
100
- rect: (x0, z0, x1, z1) => ({ minX: ox + x0, maxX: ox + x1, minZ: oz + z0, maxZ: oz + z1 }),
101
- };
102
- }
95
+ // The plots, the layouts and the sites: worldEventLayout.ts (eventPlot, eventLayout, eventSite).
103
96
  /** The event signage boards (the kit sheet), each placed where it helps. */
104
97
  const SIGN_TEXT = {
105
98
  timer: 'Five minutes. Whatever you are doing when the time is up, you are put back outside, logged in or not.',
@@ -936,6 +929,8 @@ export const WORLD_EVENTS = {
936
929
  'storm-felled-grove': STORM_FELLED_GROVE,
937
930
  'forgotten-smithy': FORGOTTEN_SMITHY,
938
931
  'old-kings-culvert': OLD_KINGS_CULVERT,
932
+ 'frostpine-trapper-hollow': FROSTPINE_TRAPPER_HOLLOW,
933
+ 'kings-road-ice-culvert': KINGS_ROAD_ICE_CULVERT,
939
934
  'sunken-wayshrine': {
940
935
  built: true,
941
936
  id: 'sunken-wayshrine',
@@ -1139,6 +1134,8 @@ export function worldEventModelInfo(model, entityId) {
1139
1134
  if (p.model === model)
1140
1135
  return { name: p.name, verb: p.verb };
1141
1136
  if (p.doneModel === model) {
1137
+ if (p.role === 'snare')
1138
+ return { name: `${p.name} (sprung)`, verb: 'Examine', open: true };
1142
1139
  return { name: p.name, verb: p.role === 'barrier' ? 'Walk past' : p.verb, open: true, ...(p.deck ? { deckLift: EVENT_DECK_LIFT } : {}) };
1143
1140
  }
1144
1141
  }
@@ -1178,4 +1175,12 @@ export function worldEventSpawnLevel(range, partyCombat, roll) {
1178
1175
  const level = centre + Math.floor(roll() * 3) - 1;
1179
1176
  return Math.max(lo, Math.min(hi, level));
1180
1177
  }
1178
+ /** How long a run in this event lasts (each frozen dungeon has its own; the starter events five minutes). */
1179
+ export function worldEventDurationMs(def) {
1180
+ return def.durationMs ?? WORLD_EVENT_DURATION_MS;
1181
+ }
1182
+ /** Which rotation the event is in. */
1183
+ export function worldEventRegion(def) {
1184
+ return def.region ?? 'starter';
1185
+ }
1181
1186
  //# sourceMappingURL=worldEvents.js.map