@dreadwood-types/types 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -40,4 +40,4 @@ npm run build
40
40
  cd ../dreadwoods-backend && npm install
41
41
  ```
42
42
 
43
- Publishes `dist/` with TypeScript declarations. Contains message types, tile enums, and display constants only no server simulation logic.
43
+ Publishes `dist/` with TypeScript declarations. Contains message types, tile enums, and display constants only - no server simulation logic.
@@ -14,7 +14,7 @@ export declare const FACIAL_HAIR_IDS: FacialHairId[];
14
14
  * sex is resolved from the outfit manifest at render time
15
15
  * (public/assets/models/outfits/manifest.json, built by scripts/build-outfits.mjs).
16
16
  *
17
- * `null` means no outfit the character renders with the legacy painted-on
17
+ * `null` means no outfit - the character renders with the legacy painted-on
18
18
  * top/trousers/boots zones instead.
19
19
  */
20
20
  export type OutfitId = 'peasant' | 'ranger';
@@ -23,7 +23,7 @@ export declare const OUTFIT_LABELS: Record<OutfitId, string>;
23
23
  export type CharacterAppearance = {
24
24
  sex: CharacterSex;
25
25
  /**
26
- * Optional so that omitting it means "no outfit" the character keeps the
26
+ * Optional so that omitting it means "no outfit" - the character keeps the
27
27
  * legacy painted-on look. That is the safe default for the many NPC
28
28
  * appearance literals that predate the outfit system.
29
29
  */
@@ -52,13 +52,13 @@ export declare const COLOR_PRESETS: readonly ['#f6d7c3', '#e8b98a', '#c98a5c', '
52
52
  export declare const EYE_COLOR_PRESETS: readonly ['#2a1a10', '#4a2c1a', '#7a5230', '#a8742f', '#3d6b4f', '#2e8b6e', '#3b6ea5', '#7fa8c9', '#5a6673', '#6b4d8f', '#1a1a1a', '#c4a35a'];
53
53
  /**
54
54
  * Skin runs as an even light-to-dark ramp rather than sharing the generic
55
- * colour bag picking a skin tone should feel like moving along a scale, not
55
+ * colour bag - picking a skin tone should feel like moving along a scale, not
56
56
  * hunting for the believable entries among greens and purples.
57
57
  */
58
58
  export declare const SKIN_TONE_PRESETS: readonly ['#f7e2d2', '#f2d4bd', '#ebc4a5', '#e0b088', '#d19a6f', '#bf8459', '#a86d45', '#8f5734', '#754427', '#5c341c', '#452614', '#311b0e'];
59
59
  /** Natural hair only, ordered fair to black, with greys and reds grouped. */
60
60
  export declare const HAIR_COLOR_PRESETS: readonly ['#efe3c2', '#e2c684', '#c9a04e', '#b8862f', '#8f5a20', '#6d4320', '#523118', '#3a2211', '#241510', '#12100f', '#c1512a', '#8f3a20', '#b9b3a6', '#e6e3dc'];
61
- /** Muted, hard-wearing cloth and leather adventurer kit, not carnival. */
61
+ /** Muted, hard-wearing cloth and leather - adventurer kit, not carnival. */
62
62
  export declare const CLOTH_COLOR_PRESETS: readonly ['#e8e4dc', '#b9b2a2', '#8a7a5c', '#6b6152', '#5c4a34', '#4a2c1a', '#3b2214', '#2b2b2b', '#1f1812', '#3d6b4f', '#2e6b52', '#4a5a3a', '#2f4d7a', '#3b6ea5', '#5a6673', '#8b3a3a', '#a8452e', '#c4a35a', '#a8742f', '#6b4d8f'];
63
63
  export declare const COLOR_PALETTE: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"];
64
64
  export declare const EYE_COLORS: readonly ["#2a1a10", "#4a2c1a", "#7a5230", "#a8742f", "#3d6b4f", "#2e8b6e", "#3b6ea5", "#7fa8c9", "#5a6673", "#6b4d8f", "#1a1a1a", "#c4a35a"];
@@ -1 +1 @@
1
- {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
@@ -92,7 +92,7 @@ export const EYE_COLOR_PRESETS = [
92
92
  ];
93
93
  /**
94
94
  * Skin runs as an even light-to-dark ramp rather than sharing the generic
95
- * colour bag picking a skin tone should feel like moving along a scale, not
95
+ * colour bag - picking a skin tone should feel like moving along a scale, not
96
96
  * hunting for the believable entries among greens and purples.
97
97
  */
98
98
  export const SKIN_TONE_PRESETS = [
@@ -126,7 +126,7 @@ export const HAIR_COLOR_PRESETS = [
126
126
  '#b9b3a6',
127
127
  '#e6e3dc',
128
128
  ];
129
- /** Muted, hard-wearing cloth and leather adventurer kit, not carnival. */
129
+ /** Muted, hard-wearing cloth and leather - adventurer kit, not carnival. */
130
130
  export const CLOTH_COLOR_PRESETS = [
131
131
  '#e8e4dc',
132
132
  '#b9b2a2',
@@ -274,6 +274,9 @@ export function normalizeAppearance(raw) {
274
274
  const eyebrowStyle = EYEBROW_STYLE_IDS.includes(a.eyebrowStyle)
275
275
  ? a.eyebrowStyle
276
276
  : base.eyebrowStyle;
277
+ const bodyType = BODY_TYPE_IDS.includes(a.bodyType)
278
+ ? a.bodyType
279
+ : base.bodyType;
277
280
  let facialHair = 0;
278
281
  if (sex !== 'female') {
279
282
  facialHair = FACIAL_HAIR_IDS.includes(a.facialHair)
@@ -288,13 +291,13 @@ export function normalizeAppearance(raw) {
288
291
  return {
289
292
  sex,
290
293
  // Preserved deliberately. Every player-facing path runs through this
291
- // function, so a field that is not copied here is silently discarded
294
+ // function, so a field that is not copied here is silently discarded -
292
295
  // which would leave players undressed while NPCs (who bypass
293
296
  // normalisation) rendered correctly.
294
297
  outfit: OUTFIT_IDS.includes(a.outfit) ? a.outfit : null,
295
298
  hairStyle,
296
299
  headPreset,
297
- bodyType: 'average',
300
+ bodyType,
298
301
  eyebrowStyle,
299
302
  facialHair,
300
303
  hairColor,
@@ -304,7 +307,7 @@ export function normalizeAppearance(raw) {
304
307
  trousersColor: pick(a.trousersColor, base.trousersColor),
305
308
  skinTone,
306
309
  // Boots were pinned to skinTone back when "boots" meant the painted foot
307
- // zone of a bare body tinting them anything else produced odd-looking
310
+ // zone of a bare body - tinting them anything else produced odd-looking
308
311
  // socks. Real boot geometry arrives with outfits, so the choice has to
309
312
  // survive; without this every outfitted character wears flesh-coloured
310
313
  // leather. Characters saved before this change still carry a skin-toned
@@ -1 +1 @@
1
- {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export declare const PLAYER_NAME_MIN = 2;
6
6
  export declare const PLAYER_NAME_MAX = 24;
7
7
  export declare function sanitizePlayerName(raw: string): string;
8
8
  /**
9
- * Pet names go through the same rules as player names the claim dialog
9
+ * Pet names go through the same rules as player names - the claim dialog
10
10
  * already validates with `playerNameError`, so the server must apply the same
11
11
  * pair or a hand-crafted packet could park arbitrary text over someone's head.
12
12
  * Returns null for anything unusable rather than throwing, since this also runs
@@ -37,7 +37,7 @@ export declare const MAP_HEIGHT: number;
37
37
  /**
38
38
  * Extra columns east of the overworld for underground interiors (Rat Tunnel
39
39
  * rooms, forest-den caverns). Generated and playable, but not on the paper
40
- * map the chart is WORLD_WIDTH × WORLD_HEIGHT.
40
+ * map - the chart is WORLD_WIDTH × WORLD_HEIGHT.
41
41
  */
42
42
  export declare const UNDERGROUND_CHUNKS_X = 8;
43
43
  export declare const UNDERGROUND_ORIGIN_X: number;
@@ -114,14 +114,14 @@ export declare function chunksAround(cx: number, cz: number, radius: number): Ch
114
114
  export declare function localIndex(lx: number, lz: number): number;
115
115
  export declare function isWalkableSurface(surface: SurfaceType): boolean;
116
116
  export declare function entityBlocksWalk(kind: EntityKind): boolean;
117
- /** Dungeon room-gate visual states mirrors ranch gate open/closed styling. */
117
+ /** Dungeon room-gate visual states - mirrors ranch gate open/closed styling. */
118
118
  export declare function isDungeonDoorOpen(style: string | undefined): boolean;
119
119
  /**
120
120
  * A dungeon gate the viewing player has earned the right to open, but which is
121
121
  * still physically DOWN.
122
122
  *
123
123
  * Unlocking used to swap the style straight to `-open`, so a gate you had
124
- * cleared was simply drawn permanently winched up there was never a moment of
124
+ * cleared was simply drawn permanently winched up - there was never a moment of
125
125
  * opening it, and nobody else saw anything happen. `-ready` keeps the
126
126
  * portcullis closed and lets the client mark it as openable (a glow), so the
127
127
  * open is an action with an animation and a sound rather than a state you
@@ -130,7 +130,7 @@ export declare function isDungeonDoorOpen(style: string | undefined): boolean;
130
130
  export declare function isDungeonGateReady(style: string | undefined): boolean;
131
131
  /** Goblin cell gates share personal dungeon crossing, not shared fence toggles. */
132
132
  export declare function isGoblinPrisonDoorStyle(style: string | undefined): boolean;
133
- /** Dungeon wall torch lantern entity with a `torch-*` facing style. */
133
+ /** Dungeon wall torch - lantern entity with a `torch-*` facing style. */
134
134
  export declare function isWallTorchStyle(style: string | undefined): boolean;
135
135
  export type FenceGateInfo = {
136
136
  kind: 'gate' | 'gate-wide' | 'gate-prison';
@@ -153,7 +153,7 @@ export declare function isRanchGateOpen(style: string | undefined): boolean;
153
153
  *
154
154
  * The door is deliberately **not** a passage blocker. Hut repair is per-player
155
155
  * (see World.entityForPlayer, which rewrites the style per viewer off
156
- * `player.storageHutRepaired`), so the door state is per-player too and the
156
+ * `player.storageHutRepaired`), so the door state is per-player too - and the
157
157
  * walkability grid is global, so a per-player door cannot gate it without one
158
158
  * player's door blocking another player's path. Unrepaired players still see
159
159
  * the abandoned wreck (no enter icon); repaired players use the door portal.
@@ -191,7 +191,7 @@ export declare function boulderFootprintRadius(style: string | undefined, scale:
191
191
  export declare function blockingFootprintRadius(kind: EntityKind, style: string | undefined, scale: number | undefined): number;
192
192
  export declare function isCaveTunnelExitStyle(style: string | undefined): boolean;
193
193
  export declare function isGoblinCaveStyle(style: string | undefined): boolean;
194
- /** Tiny animal-dug hole in the woods not the Base Camp Suspicious hole. */
194
+ /** Tiny animal-dug hole in the woods - not the Base Camp Suspicious hole. */
195
195
  export declare function isAnimalDenStyle(style: string | undefined): boolean;
196
196
  /** Crawl-out hole inside a forest den cavern. */
197
197
  export declare function isDenExitStyle(style: string | undefined): boolean;
package/dist/constants.js CHANGED
@@ -17,7 +17,7 @@ export function sanitizePlayerName(raw) {
17
17
  return raw.trim().replace(/\s+/g, ' ').slice(0, PLAYER_NAME_MAX);
18
18
  }
19
19
  /**
20
- * Pet names go through the same rules as player names the claim dialog
20
+ * Pet names go through the same rules as player names - the claim dialog
21
21
  * already validates with `playerNameError`, so the server must apply the same
22
22
  * pair or a hand-crafted packet could park arbitrary text over someone's head.
23
23
  * Returns null for anything unusable rather than throwing, since this also runs
@@ -64,7 +64,7 @@ export const MAP_HEIGHT = WORLD_HEIGHT;
64
64
  /**
65
65
  * Extra columns east of the overworld for underground interiors (Rat Tunnel
66
66
  * rooms, forest-den caverns). Generated and playable, but not on the paper
67
- * map the chart is WORLD_WIDTH × WORLD_HEIGHT.
67
+ * map - the chart is WORLD_WIDTH × WORLD_HEIGHT.
68
68
  */
69
69
  export const UNDERGROUND_CHUNKS_X = 8;
70
70
  export const UNDERGROUND_ORIGIN_X = WORLD_WIDTH;
@@ -215,7 +215,7 @@ export function entityBlocksWalk(kind) {
215
215
  kind === 'packstable' ||
216
216
  kind === 'rabbithutch');
217
217
  }
218
- /** Dungeon room-gate visual states mirrors ranch gate open/closed styling. */
218
+ /** Dungeon room-gate visual states - mirrors ranch gate open/closed styling. */
219
219
  export function isDungeonDoorOpen(style) {
220
220
  // Dungeon gates retain their room id in the style (`gate1-open` etc.) so
221
221
  // the renderer can select the right model. Treat all of those as open, as
@@ -227,7 +227,7 @@ export function isDungeonDoorOpen(style) {
227
227
  * still physically DOWN.
228
228
  *
229
229
  * Unlocking used to swap the style straight to `-open`, so a gate you had
230
- * cleared was simply drawn permanently winched up there was never a moment of
230
+ * cleared was simply drawn permanently winched up - there was never a moment of
231
231
  * opening it, and nobody else saw anything happen. `-ready` keeps the
232
232
  * portcullis closed and lets the client mark it as openable (a glow), so the
233
233
  * open is an action with an animation and a sound rather than a state you
@@ -240,7 +240,7 @@ export function isDungeonGateReady(style) {
240
240
  export function isGoblinPrisonDoorStyle(style) {
241
241
  return typeof style === 'string' && /^goblin-prison-(north|south)(?:-ready)?$/.test(style);
242
242
  }
243
- /** Dungeon wall torch lantern entity with a `torch-*` facing style. */
243
+ /** Dungeon wall torch - lantern entity with a `torch-*` facing style. */
244
244
  export function isWallTorchStyle(style) {
245
245
  return typeof style === 'string' && style.startsWith('torch');
246
246
  }
@@ -294,7 +294,7 @@ export function isRanchGateOpen(style) {
294
294
  *
295
295
  * The door is deliberately **not** a passage blocker. Hut repair is per-player
296
296
  * (see World.entityForPlayer, which rewrites the style per viewer off
297
- * `player.storageHutRepaired`), so the door state is per-player too and the
297
+ * `player.storageHutRepaired`), so the door state is per-player too - and the
298
298
  * walkability grid is global, so a per-player door cannot gate it without one
299
299
  * player's door blocking another player's path. Unrepaired players still see
300
300
  * the abandoned wreck (no enter icon); repaired players use the door portal.
@@ -315,7 +315,7 @@ export function isGateInteractable(kind, style) {
315
315
  // interaction so players can read why the route is blocked.
316
316
  if (kind === 'dungeondoor')
317
317
  return true;
318
- // Only once it has been repaired a wrecked hut has no door to swing.
318
+ // Only once it has been repaired - a wrecked hut has no door to swing.
319
319
  if (kind === 'storagehut')
320
320
  return isStorageHutRepairedStyle(style);
321
321
  return false;
@@ -538,7 +538,7 @@ export function blockingFootprintRadius(kind, style, scale) {
538
538
  return 3;
539
539
  // Imported buildings (barn, chicken coop, stable): treated as solid
540
540
  // exteriors, not the hollow-wall-ring-with-door system the procedural
541
- // farmhut/beachhut/storagehut buildings use nothing in the game requires
541
+ // farmhut/beachhut/storagehut buildings use - nothing in the game requires
542
542
  // walking inside these specifically (the stablemaster NPC already stands
543
543
  // just outside the old stable's door, not in its interior).
544
544
  if (kind === 'packbarn' || kind === 'packstable')
@@ -561,7 +561,7 @@ const CAVE_ENTRANCE_FORWARD = 2;
561
561
  // The mesh's cliff/boulder backdrop (see caveEntrance.ts) renders several tiles
562
562
  // deep behind the doorway and out to the sides. Base Camp's original entrance
563
563
  // is dug into the mountain rim, so that backdrop happens to sit over terrain
564
- // that's already unwalkable but forest animal dens and the dungeon exit use a
564
+ // that's already unwalkable - but forest animal dens and the dungeon exit use a
565
565
  // compact footprint so the tiny hole doesn't block a huge patch of woods.
566
566
  const CAVE_ENTRANCE_BACK = 4;
567
567
  const CAVE_ENTRANCE_HALF_WIDTH = 4;
@@ -591,7 +591,7 @@ export function isCaveTunnelExitStyle(style) {
591
591
  export function isGoblinCaveStyle(style) {
592
592
  return style === 'goblin-burrow' || style?.startsWith('goblin-return') === true;
593
593
  }
594
- /** Tiny animal-dug hole in the woods not the Base Camp Suspicious hole. */
594
+ /** Tiny animal-dug hole in the woods - not the Base Camp Suspicious hole. */
595
595
  export function isAnimalDenStyle(style) {
596
596
  return typeof style === 'string' && style.startsWith('den-');
597
597
  }
@@ -671,7 +671,7 @@ export function visitBlockedWalkOffsets(kind, style, scale, visit, doorFacing =
671
671
  const buildingFp = buildingFootprintExtents(kind, scale, style);
672
672
  if (buildingFp.radiusX > 0 && buildingFp.radiusZ > 0) {
673
673
  // Hollow buildings: only the wall ring is solid. The origin is interior
674
- // floor blocking it sealed the storage hut so you could never stand inside.
674
+ // floor - blocking it sealed the storage hut so you could never stand inside.
675
675
  for (let dz = -buildingFp.radiusZ; dz <= buildingFp.radiusZ; dz++) {
676
676
  for (let dx = -buildingFp.radiusX; dx <= buildingFp.radiusX; dx++) {
677
677
  if (!buildingWallBlocksOffset(dx, dz, buildingFp, doorFacing))
package/dist/cooking.d.ts CHANGED
@@ -4,6 +4,14 @@ export type CookingRecipe = {
4
4
  level: number;
5
5
  xp: number;
6
6
  };
7
+ /**
8
+ * Cooking XP is derived from the recipe's level, not hand-set. The old flat
9
+ * 30-70 per cook levelled the skill absurdly fast (two cooked crabs = level 2).
10
+ * `level * 5` keeps it in step with combat's `enemy level * 6` and scales
11
+ * sensibly into the higher recipes.
12
+ */
13
+ export declare const COOKING_XP_PER_LEVEL = 5;
14
+ export declare function cookingXpForLevel(level: number): number;
7
15
  export declare const COOKING_RECIPES: readonly CookingRecipe[];
8
16
  export declare function cookingRecipeForInput(input: string): CookingRecipe | null;
9
17
  export declare const COOK_INTERVAL_MS = 1000;
@@ -18,7 +26,7 @@ export type FoodInfo = {
18
26
  * perch restored nearly half a health bar. With health now scaling to ~62 at
19
27
  * level 15 and ~107 at level 30, the old values healed a rounding error and
20
28
  * food would have stopped being a meaningful resource at the exact point the
21
- * fights got hard. Raw fish still hurt the penalty is unchanged in spirit,
29
+ * fights got hard. Raw fish still hurt - the penalty is unchanged in spirit,
22
30
  * just scaled to match.
23
31
  */
24
32
  export declare const FOOD_INFO: Record<string, FoodInfo>;
@@ -1 +1 @@
1
- {"version":3,"file":"cooking.d.ts","sourceRoot":"","sources":["../src/cooking.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAOnD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAEzE;AAED,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAa9C,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEzD"}
1
+ {"version":3,"file":"cooking.d.ts","sourceRoot":"","sources":["../src/cooking.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAMD,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAOnD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAEzE;AAED,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAa9C,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEzD"}
package/dist/cooking.js CHANGED
@@ -1,10 +1,23 @@
1
+ /**
2
+ * Cooking XP is derived from the recipe's level, not hand-set. The old flat
3
+ * 30-70 per cook levelled the skill absurdly fast (two cooked crabs = level 2).
4
+ * `level * 5` keeps it in step with combat's `enemy level * 6` and scales
5
+ * sensibly into the higher recipes.
6
+ */
7
+ export const COOKING_XP_PER_LEVEL = 5;
8
+ export function cookingXpForLevel(level) {
9
+ return Math.max(COOKING_XP_PER_LEVEL, Math.round(level * COOKING_XP_PER_LEVEL));
10
+ }
11
+ function cookingRecipe(input, output, level) {
12
+ return { input, output, level, xp: cookingXpForLevel(level) };
13
+ }
1
14
  export const COOKING_RECIPES = [
2
- { input: 'crabmeat', output: 'cookedcrab', level: 1, xp: 30 },
3
- { input: 'rawbass', output: 'cookedbass', level: 1, xp: 40 },
4
- { input: 'frog', output: 'cookedfroglegs', level: 1, xp: 35 },
5
- { input: 'rawrabbit', output: 'cookedrabbit', level: 5, xp: 45 },
6
- { input: 'rawtench', output: 'cookedtench', level: 20, xp: 55 },
7
- { input: 'rawperch', output: 'cookedperch', level: 7, xp: 70 },
15
+ cookingRecipe('crabmeat', 'cookedcrab', 1),
16
+ cookingRecipe('rawbass', 'cookedbass', 1),
17
+ cookingRecipe('frog', 'cookedfroglegs', 1),
18
+ cookingRecipe('rawrabbit', 'cookedrabbit', 5),
19
+ cookingRecipe('rawtench', 'cookedtench', 20),
20
+ cookingRecipe('rawperch', 'cookedperch', 7),
8
21
  ];
9
22
  export function cookingRecipeForInput(input) {
10
23
  return COOKING_RECIPES.find((r) => r.input === input) ?? null;
@@ -18,7 +31,7 @@ export const CAMPFIRE_COOK_RANGE = 3;
18
31
  * perch restored nearly half a health bar. With health now scaling to ~62 at
19
32
  * level 15 and ~107 at level 30, the old values healed a rounding error and
20
33
  * food would have stopped being a meaningful resource at the exact point the
21
- * fights got hard. Raw fish still hurt the penalty is unchanged in spirit,
34
+ * fights got hard. Raw fish still hurt - the penalty is unchanged in spirit,
22
35
  * just scaled to match.
23
36
  */
24
37
  export const FOOD_INFO = {
@@ -1 +1 @@
1
- {"version":3,"file":"cooking.js","sourceRoot":"","sources":["../src/cooking.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IAC7D,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IAC5D,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IAC7D,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IAChE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAC/D,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;CAC/D,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAMrC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAA6B;IACjD,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACrB,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACvB,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACvB,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IAC1B,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IAC1B,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACrB,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACxB,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACtB,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACtB,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;CAC1B,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"cooking.js","sourceRoot":"","sources":["../src/cooking.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,oBAAoB,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,MAAc,EAAE,KAAa;IACjE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,aAAa,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IACzC,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;IAC7C,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,CAAC;IAC5C,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAMrC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAA6B;IACjD,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACrB,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACvB,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACvB,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IAC1B,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IAC1B,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACrB,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACxB,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACtB,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;IACtB,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;CAC1B,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC"}
package/dist/equipment.js CHANGED
@@ -21,7 +21,7 @@ export const EQUIP_INFO = {
21
21
  foldingsaw: { slot: 'weapon', armour: 0, damageMin: 0, damageMax: 1 },
22
22
  hatchet: { slot: 'weapon', armour: 0, damageMin: 1, damageMax: 2 },
23
23
  woodenclub: { slot: 'weapon', armour: 0, damageMin: 2, damageMax: 3, masteryRequirement: 6 },
24
- // Livonia's Pine Club her 5% drop. Sits between the wooden club (2-3 @ 6)
24
+ // Livonia's Pine Club - her 5% drop. Sits between the wooden club (2-3 @ 6)
25
25
  // Livonia's rare club is the high-damage melee drop. The Poplar Spear is a
26
26
  // lower-damage crafted reach weapon, not a later direct-damage upgrade.
27
27
  livoniapineclub: { slot: 'weapon', armour: 0, damageMin: 4, damageMax: 5, masteryRequirement: 10 },
@@ -1,7 +1,7 @@
1
1
  export declare const GROUND_ITEM_KINDS: readonly string[];
2
2
  /**
3
3
  * Item kinds that should never show a "Drop" action, e.g. because dropping them would
4
- * softlock progression. Empty by default every known item is droppable unless a kind
4
+ * softlock progression. Empty by default - every known item is droppable unless a kind
5
5
  * is explicitly listed here for a specific, documented reason.
6
6
  */
7
7
  export declare const UNDROPPABLE_ITEM_KINDS: readonly string[];
@@ -75,7 +75,7 @@ export const GROUND_ITEM_KINDS = [
75
75
  const GROUND_ITEM_KIND_SET = new Set(GROUND_ITEM_KINDS);
76
76
  /**
77
77
  * Item kinds that should never show a "Drop" action, e.g. because dropping them would
78
- * softlock progression. Empty by default every known item is droppable unless a kind
78
+ * softlock progression. Empty by default - every known item is droppable unless a kind
79
79
  * is explicitly listed here for a specific, documented reason.
80
80
  */
81
81
  export const UNDROPPABLE_ITEM_KINDS = [];
@@ -15,7 +15,7 @@ export declare const BASECAMP_GATE_LOCAL_Z = 26;
15
15
  export declare const BASECAMP_GATE_HALF = 5;
16
16
  export declare const BASECAMP_WALL_X = 604;
17
17
  /**
18
- * Single-column rocky enclave on Base Camp's west face the thin cliff/shore
18
+ * Single-column rocky enclave on Base Camp's west face - the thin cliff/shore
19
19
  * where the battlefield lake meets camp. Not a filled gray slab.
20
20
  */
21
21
  export declare const BASECAMP_ENCLAVE_X = 604;
@@ -27,7 +27,7 @@ export declare const BASECAMP_CAVE_LOCAL_Z = 26;
27
27
  export declare const BASECAMP_FAR_SIDE_X: number;
28
28
  export declare const BASECAMP_FAR_SIDE_LOCAL_Z = 26;
29
29
  /**
30
- * Anne's cottage a longer walk north of the east road, halfway between
30
+ * Anne's cottage - a longer walk north of the east road, halfway between
31
31
  * Crossroads and Base Camp. Lower local Z is north (toward WORLD_NORTH_PAD).
32
32
  * Stays west of BASECAMP_WALL_X so it never touches the mountain wall.
33
33
  */
@@ -39,7 +39,7 @@ export declare const ANNES_ZONE_NORTH = 16;
39
39
  export declare const ANNES_ZONE_SOUTH = 22;
40
40
  /**
41
41
  * Small vestigial mud alcove right behind the Suspicious hole mouth at Base
42
- * Camp kept only as set dressing for the doorway. The real Rat Tunnel
42
+ * Camp - kept only as set dressing for the doorway. The real Rat Tunnel
43
43
  * dungeon lives far away in its own dedicated underground zone (see below);
44
44
  * the Base Camp Suspicious hole teleports players there. Forest animal dens
45
45
  * are separate tiny caverns, not extra doors into this dungeon.
@@ -51,10 +51,10 @@ export declare const RAT_TUNNEL_RZ = 5;
51
51
  export declare const SUSPICIOUS_HOLE_RETURN_X: number;
52
52
  export declare const SUSPICIOUS_HOLE_RETURN_LOCAL_Z = 26;
53
53
  /**
54
- * Rat Tunnel dungeon a genuinely separate underground zone carved into an
54
+ * Rat Tunnel dungeon - a genuinely separate underground zone carved into an
55
55
  * off-map strip east of the overworld (x >= UNDERGROUND_ORIGIN_X), so the
56
56
  * rooms are never painted as surface geography on the paper map. The
57
- * Suspicious hole doesn't lead into a pocket behind itself it teleports
57
+ * Suspicious hole doesn't lead into a pocket behind itself - it teleports
58
58
  * players into this dedicated 5-room dungeon (forest animal dens do not).
59
59
  * Room 1 has a crawl-out back to Base Camp so players are not trapped in the
60
60
  * pit; the portal at the far end of Room 5 is the dungeon-clear exit.
@@ -67,24 +67,24 @@ export declare const SUSPICIOUS_HOLE_RETURN_LOCAL_Z = 26;
67
67
  */
68
68
  export declare const DUNGEON_CENTER_X: number;
69
69
  /**
70
- * ROOM SCALE deliberately tight.
70
+ * ROOM SCALE - deliberately tight.
71
71
  *
72
72
  * The first build made every room a field: Room 4 was 53x44 tiles and Room 1
73
73
  * and 3 were 41 wide, on a map where a character occupies one tile. Crossing
74
- * the boss room took ~45 steps, and no amount of scenery could fill that every
74
+ * the boss room took ~45 steps, and no amount of scenery could fill that - every
75
75
  * dressing pass read as litter scattered on an empty plain. These are roughly
76
76
  * half the old linear dimensions (about a quarter of the floor area), which is
77
77
  * the range a dungeon crawl actually wants: you can see both walls, scenery
78
78
  * reaches you, and a fight fills the space instead of rattling around in it.
79
79
  *
80
- * Encounter room sizes still scale with what happens in them the boss cavern
80
+ * Encounter room sizes still scale with what happens in them - the boss cavern
81
81
  * is the largest, the exit vestibule barely more than a landing.
82
82
  */
83
83
  export declare const DUNGEON_ROOM_HALF_W = 14;
84
84
  /** The giant-rat warren is deliberately tighter than the human encounter rooms. */
85
85
  export declare const DUNGEON_GIANT_RAT_ROOM_HALF_W = 11;
86
86
  export declare const DUNGEON_BOSS_HALF_W = 17;
87
- /** Exit vestibule a landing, not a hall. */
87
+ /** Exit vestibule - a landing, not a hall. */
88
88
  export declare const DUNGEON_VESTIBULE_HALF_W = 9;
89
89
  /** Entry guardroom, tighter than the mid-dungeon encounter rooms. */
90
90
  export declare const DUNGEON_GUARDROOM_HALF_W = 12;
@@ -97,7 +97,7 @@ export declare const DUNGEON_CORRIDOR_HALF_W = 3;
97
97
  */
98
98
  export declare const DUNGEON_ROOM1_MIN_Z = 60;
99
99
  export declare const DUNGEON_ROOM1_MAX_Z = 82;
100
- /** Rat-pit centre in Room 1 mirrors DUNGEON_ROOM2_PIT_Z for the arena below. */
100
+ /** Rat-pit centre in Room 1 - mirrors DUNGEON_ROOM2_PIT_Z for the arena below. */
101
101
  export declare const DUNGEON_ROOM1_PIT_Z: number;
102
102
  export declare const DUNGEON_ROOM2_MIN_Z = 99;
103
103
  export declare const DUNGEON_ROOM2_MAX_Z = 125;
@@ -113,7 +113,7 @@ export declare const DUNGEON_MIN_X: number;
113
113
  export declare const DUNGEON_MAX_X: number;
114
114
  export declare const DUNGEON_MIN_Z = 60;
115
115
  export declare const DUNGEON_MAX_Z = 246;
116
- /** Room-gate doorway rows the door sits on the entrance wall of the room being unlocked. */
116
+ /** Room-gate doorway rows - the door sits on the entrance wall of the room being unlocked. */
117
117
  export declare const DUNGEON_GATE1_Z = 99;
118
118
  export declare const DUNGEON_GATE2_Z = 142;
119
119
  export declare const DUNGEON_GATE3_Z = 185;
@@ -124,7 +124,7 @@ export declare const DUNGEON_EXIT_PORTAL_X: number;
124
124
  export declare const DUNGEON_EXIT_PORTAL_Z: number;
125
125
  /**
126
126
  * Crawl-out in Room 1 (rat pit), flush with the north wall and facing south
127
- * into the pit. Same `exit-*` interact/teleport as Room 5 returns to the
127
+ * into the pit. Same `exit-*` interact/teleport as Room 5 - returns to the
128
128
  * Suspicious hole approach at Base Camp. Compact footprint; keep the two
129
129
  * tiles in front standable so logout restore can slide off the blocked door.
130
130
  */
@@ -148,7 +148,7 @@ export declare const DUNGEON_WALL_MARGIN = 8;
148
148
  /**
149
149
  * How far the solid rock is actually PAINTED, as opposed to how far the dungeon
150
150
  * zone reaches. The camera looks down at ~53 degrees, so a 5-unit wall only
151
- * hides about four tiles of whatever is behind it with the old 8-tile margin
151
+ * hides about four tiles of whatever is behind it - with the old 8-tile margin
152
152
  * the overworld's grass and sky were plainly visible over the dungeon walls.
153
153
  * The apron is a cheap fix: keep painting rock until the far fog (62 units)
154
154
  * swallows it. It deliberately does NOT widen `inDungeonZone`, which gates
@@ -167,25 +167,25 @@ export type ForestDenSite = {
167
167
  cavernX: number;
168
168
  cavernZ: number;
169
169
  };
170
- /** Tight animal-dug hollow a handful of tiles, not a mystery hall. */
170
+ /** Tight animal-dug hollow - a handful of tiles, not a mystery hall. */
171
171
  export declare const FOREST_DEN_RX = 4;
172
172
  export declare const FOREST_DEN_RZ = 3;
173
173
  export declare const FOREST_DEN_WALL = 2;
174
174
  export declare const FOREST_DEN_EXPLORER_XP = 50;
175
175
  /**
176
176
  * Rat caves scattered through the woods. Same idea as the old extra Suspicious
177
- * holes they look like small rocky cave mouths, each with its own cramped
177
+ * holes - they look like small rocky cave mouths, each with its own cramped
178
178
  * cavern, not extra doors into the Rat Tunnel.
179
179
  */
180
180
  /**
181
- * Every site here is fully built by world generation cleared entrance
182
- * hollow, its own cavern, and a return exit but only FOREST_DEN_ACTIVE_COUNT
181
+ * Every site here is fully built by world generation - cleared entrance
182
+ * hollow, its own cavern, and a return exit - but only FOREST_DEN_ACTIVE_COUNT
183
183
  * of them show a cave mouth at any one time (see World.denEntranceActive).
184
184
  * Crawling out of a den retires that mouth and opens a different site, so the
185
185
  * dens move around the woods instead of being permanent scenery.
186
186
  *
187
187
  * There used to be 13 permanently-open mouths, which is why they read as
188
- * "everywhere" you could not cross the forest without tripping over one.
188
+ * "everywhere" - you could not cross the forest without tripping over one.
189
189
  * Keeping the full list (rather than deleting sites) is what gives the
190
190
  * relocation somewhere to move *to*; the count below is the dial for how
191
191
  * often you actually meet one.
@@ -205,7 +205,7 @@ export declare const DUNGEON_ROOM_SPAWNS: Record<DungeonRoomId, {
205
205
  z: number;
206
206
  }[]>;
207
207
  /**
208
- * Northwest battlefield north pad west of the Deadlands, inland of west cliffs.
208
+ * Northwest battlefield - north pad west of the Deadlands, inland of west cliffs.
209
209
  * World Z decreases toward the north wilderness; farm approaches from the south.
210
210
  * East edge meets the Deadlands west border. The lake continues east of this pad
211
211
  * (see BATTLEFIELD_LAKE_EAST_X).
@@ -219,7 +219,7 @@ export declare const BATTLEFIELD_MAX_LOCAL_Z: number;
219
219
  /**
220
220
  * Lake between soldier (south / farmward) and goblin (north) camps.
221
221
  * Water blocks walking; the battlefield crossing is the long bridge once repaired.
222
- * Thick NS band on the pad, then the same Z band continues east through the
222
+ * Thick N-S band on the pad, then the same Z band continues east through the
223
223
  * corridor south of the Deadlands, past the west-face enclave, until it meets
224
224
  * the SE high-rock row.
225
225
  */
@@ -233,7 +233,7 @@ export declare function isDeadlandsSouthWallClearance(x: number, z: number): boo
233
233
  /**
234
234
  * One-tile high-rock / crag row on the SW corner of remaining Base Camp land
235
235
  * (south of the lake). Same X as the thin west-face enclave; the lake band at
236
- * this X is water so the eastwest sheet can continue.
236
+ * this X is water so the east-west sheet can continue.
237
237
  */
238
238
  export declare const BATTLEFIELD_LAKE_SW_ROCK_X = 604;
239
239
  export declare const BATTLEFIELD_LAKE_SW_ROCK_MIN_Z: number;
@@ -251,14 +251,14 @@ export declare const BATTLEFIELD_LAKE_SE_ROCK_MAX_Z: number;
251
251
  */
252
252
  export declare const BATTLEFIELD_LAKE_EAST_X: number;
253
253
  export declare const BATTLEFIELD_LAKE_MID_Z: number;
254
- /** @deprecated Use BATTLEFIELD_LAKE_* kept for older imports. */
254
+ /** @deprecated Use BATTLEFIELD_LAKE_* - kept for older imports. */
255
255
  export declare const BATTLEFIELD_CONTESTED_MIN_Z = 666;
256
256
  /** @deprecated Use BATTLEFIELD_LAKE_* */
257
257
  export declare const BATTLEFIELD_CONTESTED_MAX_Z = 698;
258
258
  /** @deprecated Use BATTLEFIELD_LAKE_* */
259
259
  export declare const BATTLEFIELD_CONTESTED_MID_Z: number;
260
260
  /**
261
- * NS bridge across the lake (world X).
261
+ * N-S bridge across the lake (world X).
262
262
  * Anchored on the original battlefield mid-X so expanding east to the Deadlands
263
263
  * lengthens the water sheet without sliding the crossing.
264
264
  */
@@ -270,7 +270,7 @@ export declare const BATTLEFIELD_BRIDGE_HALF_W = 1;
270
270
  *
271
271
  * The lake now runs from the west cliffs to the SE rock row, while the
272
272
  * bridge sits at x 91, so an unconstrained spot could land far down the new
273
- * east shore a long walk, and on the wrong side of the map from the crossing.
273
+ * east shore - a long walk, and on the wrong side of the map from the crossing.
274
274
  */
275
275
  export declare const BATTLEFIELD_FISHING_MAX_BRIDGE_DX = 16;
276
276
  /**
@@ -282,18 +282,18 @@ export declare const BATTLEFIELD_BRIDGE_GAP_MAX_Z: number;
282
282
  /** Inclusive smashed mid-span the unrepaired player still sees as wreckage. */
283
283
  export declare function isBattlefieldBridgeGapTile(x: number, z: number): boolean;
284
284
  /**
285
- * Single clickable crossing icon centre of the gap (x 91, z 682), not every
285
+ * Single clickable crossing icon - centre of the gap (x 91, z 682), not every
286
286
  * plank and not the intact approaches.
287
287
  */
288
288
  export declare function isBattlefieldBridgeTravelIconTile(x: number, z: number): boolean;
289
289
  /**
290
290
  * Chebyshev tiles from a travel-through target (bridge crossing icon, dungeon
291
291
  * pit gate). Those tiles are water or blocked, and the last intact plank is two
292
- * steps from the icon range 1 would demand standing on the gap itself.
292
+ * steps from the icon - range 1 would demand standing on the gap itself.
293
293
  */
294
294
  export declare const TRAVEL_THROUGH_RANGE = 4;
295
295
  /**
296
- * Rupert Row's dock a short wooden pier on the south shore west of the bridge,
296
+ * Rupert Row's dock - a short wooden pier on the south shore west of the bridge,
297
297
  * with his rowboat tied at the water end.
298
298
  */
299
299
  export declare const RUPERT_ROW_PIER_X: number;
@@ -306,7 +306,7 @@ export declare const RUPERT_ROW_SPAWN_Z: number;
306
306
  export declare const BATTLEFIELD_CAMP_CLEAR_RADIUS = 6;
307
307
  export declare const BATTLEFIELD_NPCS_PER_CAMP = 4;
308
308
  /**
309
- * Goblin camps run denser than soldier camps. Goblins are the grind target
309
+ * Goblin camps run denser than soldier camps. Goblins are the grind target -
310
310
  * at 2 per camp a player working a camp spent most of the trip walking between
311
311
  * camps waiting on respawns, which is what made the battlefield feel empty.
312
312
  * Soldiers now hold their camps in force too, so both sides read as active
@@ -315,7 +315,7 @@ export declare const BATTLEFIELD_NPCS_PER_CAMP = 4;
315
315
  export declare const BATTLEFIELD_GOBLINS_PER_CAMP = 6;
316
316
  /** How long a faction camp chest stays before fading out and relocating. */
317
317
  export declare const BATTLEFIELD_CAMP_CHEST_LIFETIME_MS = 60000;
318
- /** Soldier camps closer to the farm (higher world Z), south of the lake. */
318
+ /** Soldier camps - closer to the farm (higher world Z), south of the lake. */
319
319
  export declare const BATTLEFIELD_SOLDIER_CAMPS: readonly {
320
320
  x: number;
321
321
  z: number;
@@ -325,13 +325,13 @@ export declare const BATTLEFIELD_CAPTAIN_CAMP: {
325
325
  readonly x: 119;
326
326
  readonly z: 734;
327
327
  };
328
- /** Goblin camps farther wilderness (lower world Z), north of the lake. */
328
+ /** Goblin camps - farther wilderness (lower world Z), north of the lake. */
329
329
  export declare const BATTLEFIELD_GOBLIN_CAMPS: readonly {
330
330
  x: number;
331
331
  z: number;
332
332
  }[];
333
333
  /**
334
- * Cultivated cabbage plots on the soldier shore between lake and camps.
334
+ * Cultivated cabbage plots on the soldier shore - between lake and camps.
335
335
  * Filled as neat soil rows (not sparse scatter).
336
336
  */
337
337
  export declare const BATTLEFIELD_CABBAGE_PLOTS: readonly {
@@ -359,7 +359,7 @@ export type WorldMapLandmark = {
359
359
  };
360
360
  /**
361
361
  * Paper-map labels. Keep this list in lockstep with named places in this file
362
- * and `DISCOVERY_ZONES` the in-game map and the public website chart both
362
+ * and `DISCOVERY_ZONES` - the in-game map and the public website chart both
363
363
  * paint from here. Village is not a labelled stop.
364
364
  */
365
365
  export declare const WORLD_MAP_LANDMARKS: readonly WorldMapLandmark[];
package/dist/landmarks.js CHANGED
@@ -17,7 +17,7 @@ export const BASECAMP_GATE_LOCAL_Z = BASECAMP_CENTER_LOCAL_Z;
17
17
  export const BASECAMP_GATE_HALF = 5;
18
18
  export const BASECAMP_WALL_X = 604;
19
19
  /**
20
- * Single-column rocky enclave on Base Camp's west face the thin cliff/shore
20
+ * Single-column rocky enclave on Base Camp's west face - the thin cliff/shore
21
21
  * where the battlefield lake meets camp. Not a filled gray slab.
22
22
  */
23
23
  export const BASECAMP_ENCLAVE_X = BASECAMP_WALL_X;
@@ -29,7 +29,7 @@ export const BASECAMP_CAVE_LOCAL_Z = BASECAMP_CENTER_LOCAL_Z;
29
29
  export const BASECAMP_FAR_SIDE_X = BASECAMP_CAVE_X + 30;
30
30
  export const BASECAMP_FAR_SIDE_LOCAL_Z = BASECAMP_CAVE_LOCAL_Z;
31
31
  /**
32
- * Anne's cottage a longer walk north of the east road, halfway between
32
+ * Anne's cottage - a longer walk north of the east road, halfway between
33
33
  * Crossroads and Base Camp. Lower local Z is north (toward WORLD_NORTH_PAD).
34
34
  * Stays west of BASECAMP_WALL_X so it never touches the mountain wall.
35
35
  */
@@ -41,7 +41,7 @@ export const ANNES_ZONE_NORTH = 16;
41
41
  export const ANNES_ZONE_SOUTH = 22;
42
42
  /**
43
43
  * Small vestigial mud alcove right behind the Suspicious hole mouth at Base
44
- * Camp kept only as set dressing for the doorway. The real Rat Tunnel
44
+ * Camp - kept only as set dressing for the doorway. The real Rat Tunnel
45
45
  * dungeon lives far away in its own dedicated underground zone (see below);
46
46
  * the Base Camp Suspicious hole teleports players there. Forest animal dens
47
47
  * are separate tiny caverns, not extra doors into this dungeon.
@@ -53,10 +53,10 @@ export const RAT_TUNNEL_RZ = 5;
53
53
  export const SUSPICIOUS_HOLE_RETURN_X = BASECAMP_CAVE_X - 3;
54
54
  export const SUSPICIOUS_HOLE_RETURN_LOCAL_Z = BASECAMP_CAVE_LOCAL_Z;
55
55
  /**
56
- * Rat Tunnel dungeon a genuinely separate underground zone carved into an
56
+ * Rat Tunnel dungeon - a genuinely separate underground zone carved into an
57
57
  * off-map strip east of the overworld (x >= UNDERGROUND_ORIGIN_X), so the
58
58
  * rooms are never painted as surface geography on the paper map. The
59
- * Suspicious hole doesn't lead into a pocket behind itself it teleports
59
+ * Suspicious hole doesn't lead into a pocket behind itself - it teleports
60
60
  * players into this dedicated 5-room dungeon (forest animal dens do not).
61
61
  * Room 1 has a crawl-out back to Base Camp so players are not trapped in the
62
62
  * pit; the portal at the far end of Room 5 is the dungeon-clear exit.
@@ -69,24 +69,24 @@ export const SUSPICIOUS_HOLE_RETURN_LOCAL_Z = BASECAMP_CAVE_LOCAL_Z;
69
69
  */
70
70
  export const DUNGEON_CENTER_X = UNDERGROUND_ORIGIN_X + CHUNK_SIZE * 4;
71
71
  /**
72
- * ROOM SCALE deliberately tight.
72
+ * ROOM SCALE - deliberately tight.
73
73
  *
74
74
  * The first build made every room a field: Room 4 was 53x44 tiles and Room 1
75
75
  * and 3 were 41 wide, on a map where a character occupies one tile. Crossing
76
- * the boss room took ~45 steps, and no amount of scenery could fill that every
76
+ * the boss room took ~45 steps, and no amount of scenery could fill that - every
77
77
  * dressing pass read as litter scattered on an empty plain. These are roughly
78
78
  * half the old linear dimensions (about a quarter of the floor area), which is
79
79
  * the range a dungeon crawl actually wants: you can see both walls, scenery
80
80
  * reaches you, and a fight fills the space instead of rattling around in it.
81
81
  *
82
- * Encounter room sizes still scale with what happens in them the boss cavern
82
+ * Encounter room sizes still scale with what happens in them - the boss cavern
83
83
  * is the largest, the exit vestibule barely more than a landing.
84
84
  */
85
85
  export const DUNGEON_ROOM_HALF_W = 14;
86
86
  /** The giant-rat warren is deliberately tighter than the human encounter rooms. */
87
87
  export const DUNGEON_GIANT_RAT_ROOM_HALF_W = 11;
88
88
  export const DUNGEON_BOSS_HALF_W = 17;
89
- /** Exit vestibule a landing, not a hall. */
89
+ /** Exit vestibule - a landing, not a hall. */
90
90
  export const DUNGEON_VESTIBULE_HALF_W = 9;
91
91
  /** Entry guardroom, tighter than the mid-dungeon encounter rooms. */
92
92
  export const DUNGEON_GUARDROOM_HALF_W = 12;
@@ -99,7 +99,7 @@ export const DUNGEON_CORRIDOR_HALF_W = 3;
99
99
  */
100
100
  export const DUNGEON_ROOM1_MIN_Z = 60;
101
101
  export const DUNGEON_ROOM1_MAX_Z = 82;
102
- /** Rat-pit centre in Room 1 mirrors DUNGEON_ROOM2_PIT_Z for the arena below. */
102
+ /** Rat-pit centre in Room 1 - mirrors DUNGEON_ROOM2_PIT_Z for the arena below. */
103
103
  export const DUNGEON_ROOM1_PIT_Z = Math.round((DUNGEON_ROOM1_MIN_Z + DUNGEON_ROOM1_MAX_Z) / 2);
104
104
  export const DUNGEON_ROOM2_MIN_Z = 99;
105
105
  export const DUNGEON_ROOM2_MAX_Z = 125;
@@ -115,7 +115,7 @@ export const DUNGEON_MIN_X = DUNGEON_CENTER_X - DUNGEON_BOSS_HALF_W;
115
115
  export const DUNGEON_MAX_X = DUNGEON_CENTER_X + DUNGEON_BOSS_HALF_W;
116
116
  export const DUNGEON_MIN_Z = DUNGEON_ROOM1_MIN_Z;
117
117
  export const DUNGEON_MAX_Z = DUNGEON_ROOM5_MAX_Z;
118
- /** Room-gate doorway rows the door sits on the entrance wall of the room being unlocked. */
118
+ /** Room-gate doorway rows - the door sits on the entrance wall of the room being unlocked. */
119
119
  export const DUNGEON_GATE1_Z = DUNGEON_ROOM2_MIN_Z;
120
120
  export const DUNGEON_GATE2_Z = DUNGEON_ROOM3_MIN_Z;
121
121
  export const DUNGEON_GATE3_Z = DUNGEON_ROOM4_MIN_Z;
@@ -126,7 +126,7 @@ export const DUNGEON_EXIT_PORTAL_X = DUNGEON_CENTER_X;
126
126
  export const DUNGEON_EXIT_PORTAL_Z = DUNGEON_ROOM5_MAX_Z - 6;
127
127
  /**
128
128
  * Crawl-out in Room 1 (rat pit), flush with the north wall and facing south
129
- * into the pit. Same `exit-*` interact/teleport as Room 5 returns to the
129
+ * into the pit. Same `exit-*` interact/teleport as Room 5 - returns to the
130
130
  * Suspicious hole approach at Base Camp. Compact footprint; keep the two
131
131
  * tiles in front standable so logout restore can slide off the blocked door.
132
132
  */
@@ -150,7 +150,7 @@ export const DUNGEON_WALL_MARGIN = 8;
150
150
  /**
151
151
  * How far the solid rock is actually PAINTED, as opposed to how far the dungeon
152
152
  * zone reaches. The camera looks down at ~53 degrees, so a 5-unit wall only
153
- * hides about four tiles of whatever is behind it with the old 8-tile margin
153
+ * hides about four tiles of whatever is behind it - with the old 8-tile margin
154
154
  * the overworld's grass and sky were plainly visible over the dungeon walls.
155
155
  * The apron is a cheap fix: keep painting rock until the far fog (62 units)
156
156
  * swallows it. It deliberately does NOT widen `inDungeonZone`, which gates
@@ -163,7 +163,7 @@ export function inDungeonZone(x, z) {
163
163
  z >= DUNGEON_MIN_Z - DUNGEON_WALL_MARGIN &&
164
164
  z <= DUNGEON_MAX_Z + DUNGEON_WALL_MARGIN);
165
165
  }
166
- /** Tight animal-dug hollow a handful of tiles, not a mystery hall. */
166
+ /** Tight animal-dug hollow - a handful of tiles, not a mystery hall. */
167
167
  export const FOREST_DEN_RX = 4;
168
168
  export const FOREST_DEN_RZ = 3;
169
169
  export const FOREST_DEN_WALL = 2;
@@ -183,18 +183,18 @@ function forestDenSite(id, entranceX, entranceLocalZ, facing, cavernIndex) {
183
183
  }
184
184
  /**
185
185
  * Rat caves scattered through the woods. Same idea as the old extra Suspicious
186
- * holes they look like small rocky cave mouths, each with its own cramped
186
+ * holes - they look like small rocky cave mouths, each with its own cramped
187
187
  * cavern, not extra doors into the Rat Tunnel.
188
188
  */
189
189
  /**
190
- * Every site here is fully built by world generation cleared entrance
191
- * hollow, its own cavern, and a return exit but only FOREST_DEN_ACTIVE_COUNT
190
+ * Every site here is fully built by world generation - cleared entrance
191
+ * hollow, its own cavern, and a return exit - but only FOREST_DEN_ACTIVE_COUNT
192
192
  * of them show a cave mouth at any one time (see World.denEntranceActive).
193
193
  * Crawling out of a den retires that mouth and opens a different site, so the
194
194
  * dens move around the woods instead of being permanent scenery.
195
195
  *
196
196
  * There used to be 13 permanently-open mouths, which is why they read as
197
- * "everywhere" you could not cross the forest without tripping over one.
197
+ * "everywhere" - you could not cross the forest without tripping over one.
198
198
  * Keeping the full list (rather than deleting sites) is what gives the
199
199
  * relocation somewhere to move *to*; the count below is the dial for how
200
200
  * often you actually meet one.
@@ -280,7 +280,7 @@ function room1RatSpawnSpots() {
280
280
  const cx = DUNGEON_CENTER_X;
281
281
  const minZ = DUNGEON_ROOM1_MIN_Z;
282
282
  const maxZ = DUNGEON_ROOM1_MAX_Z;
283
- // [dx, depth fraction] keep clear of the wall ring (±12) and gate approaches.
283
+ // [dx, depth fraction] - keep clear of the wall ring (±12) and gate approaches.
284
284
  const offsets = [
285
285
  [-9, 0.22],
286
286
  [0, 0.22],
@@ -312,7 +312,7 @@ export const DUNGEON_ROOM_SPAWNS = {
312
312
  4: roomSpawnSpots(DUNGEON_ROOM4_MIN_Z, DUNGEON_ROOM4_MAX_Z, 1),
313
313
  };
314
314
  /**
315
- * Northwest battlefield north pad west of the Deadlands, inland of west cliffs.
315
+ * Northwest battlefield - north pad west of the Deadlands, inland of west cliffs.
316
316
  * World Z decreases toward the north wilderness; farm approaches from the south.
317
317
  * East edge meets the Deadlands west border. The lake continues east of this pad
318
318
  * (see BATTLEFIELD_LAKE_EAST_X).
@@ -327,7 +327,7 @@ export const BATTLEFIELD_MAX_LOCAL_Z = BATTLEFIELD_MAX_WORLD_Z - WORLD_NORTH_PAD
327
327
  /**
328
328
  * Lake between soldier (south / farmward) and goblin (north) camps.
329
329
  * Water blocks walking; the battlefield crossing is the long bridge once repaired.
330
- * Thick NS band on the pad, then the same Z band continues east through the
330
+ * Thick N-S band on the pad, then the same Z band continues east through the
331
331
  * corridor south of the Deadlands, past the west-face enclave, until it meets
332
332
  * the SE high-rock row.
333
333
  */
@@ -345,7 +345,7 @@ export function isDeadlandsSouthWallClearance(x, z) {
345
345
  /**
346
346
  * One-tile high-rock / crag row on the SW corner of remaining Base Camp land
347
347
  * (south of the lake). Same X as the thin west-face enclave; the lake band at
348
- * this X is water so the eastwest sheet can continue.
348
+ * this X is water so the east-west sheet can continue.
349
349
  */
350
350
  export const BATTLEFIELD_LAKE_SW_ROCK_X = BASECAMP_ENCLAVE_X;
351
351
  export const BATTLEFIELD_LAKE_SW_ROCK_MIN_Z = BATTLEFIELD_LAKE_MAX_Z + 1;
@@ -363,14 +363,14 @@ export const BATTLEFIELD_LAKE_SE_ROCK_MAX_Z = WORLD_NORTH_PAD + 1;
363
363
  */
364
364
  export const BATTLEFIELD_LAKE_EAST_X = BATTLEFIELD_LAKE_SE_ROCK_X - 1;
365
365
  export const BATTLEFIELD_LAKE_MID_Z = Math.floor((BATTLEFIELD_LAKE_MIN_Z + BATTLEFIELD_LAKE_MAX_Z) / 2);
366
- /** @deprecated Use BATTLEFIELD_LAKE_* kept for older imports. */
366
+ /** @deprecated Use BATTLEFIELD_LAKE_* - kept for older imports. */
367
367
  export const BATTLEFIELD_CONTESTED_MIN_Z = BATTLEFIELD_LAKE_MIN_Z;
368
368
  /** @deprecated Use BATTLEFIELD_LAKE_* */
369
369
  export const BATTLEFIELD_CONTESTED_MAX_Z = BATTLEFIELD_LAKE_MAX_Z;
370
370
  /** @deprecated Use BATTLEFIELD_LAKE_* */
371
371
  export const BATTLEFIELD_CONTESTED_MID_Z = BATTLEFIELD_LAKE_MID_Z;
372
372
  /**
373
- * NS bridge across the lake (world X).
373
+ * N-S bridge across the lake (world X).
374
374
  * Anchored on the original battlefield mid-X so expanding east to the Deadlands
375
375
  * lengthens the water sheet without sliding the crossing.
376
376
  */
@@ -382,7 +382,7 @@ export const BATTLEFIELD_BRIDGE_HALF_W = 1;
382
382
  *
383
383
  * The lake now runs from the west cliffs to the SE rock row, while the
384
384
  * bridge sits at x 91, so an unconstrained spot could land far down the new
385
- * east shore a long walk, and on the wrong side of the map from the crossing.
385
+ * east shore - a long walk, and on the wrong side of the map from the crossing.
386
386
  */
387
387
  export const BATTLEFIELD_FISHING_MAX_BRIDGE_DX = 16;
388
388
  /**
@@ -398,7 +398,7 @@ export function isBattlefieldBridgeGapTile(x, z) {
398
398
  z <= BATTLEFIELD_BRIDGE_GAP_MAX_Z);
399
399
  }
400
400
  /**
401
- * Single clickable crossing icon centre of the gap (x 91, z 682), not every
401
+ * Single clickable crossing icon - centre of the gap (x 91, z 682), not every
402
402
  * plank and not the intact approaches.
403
403
  */
404
404
  export function isBattlefieldBridgeTravelIconTile(x, z) {
@@ -407,11 +407,11 @@ export function isBattlefieldBridgeTravelIconTile(x, z) {
407
407
  /**
408
408
  * Chebyshev tiles from a travel-through target (bridge crossing icon, dungeon
409
409
  * pit gate). Those tiles are water or blocked, and the last intact plank is two
410
- * steps from the icon range 1 would demand standing on the gap itself.
410
+ * steps from the icon - range 1 would demand standing on the gap itself.
411
411
  */
412
412
  export const TRAVEL_THROUGH_RANGE = 4;
413
413
  /**
414
- * Rupert Row's dock a short wooden pier on the south shore west of the bridge,
414
+ * Rupert Row's dock - a short wooden pier on the south shore west of the bridge,
415
415
  * with his rowboat tied at the water end.
416
416
  */
417
417
  export const RUPERT_ROW_PIER_X = BATTLEFIELD_BRIDGE_X - BATTLEFIELD_BRIDGE_HALF_W - 11;
@@ -424,7 +424,7 @@ export const RUPERT_ROW_SPAWN_Z = RUPERT_ROW_PIER_Z;
424
424
  export const BATTLEFIELD_CAMP_CLEAR_RADIUS = 6;
425
425
  export const BATTLEFIELD_NPCS_PER_CAMP = 4;
426
426
  /**
427
- * Goblin camps run denser than soldier camps. Goblins are the grind target
427
+ * Goblin camps run denser than soldier camps. Goblins are the grind target -
428
428
  * at 2 per camp a player working a camp spent most of the trip walking between
429
429
  * camps waiting on respawns, which is what made the battlefield feel empty.
430
430
  * Soldiers now hold their camps in force too, so both sides read as active
@@ -433,7 +433,7 @@ export const BATTLEFIELD_NPCS_PER_CAMP = 4;
433
433
  export const BATTLEFIELD_GOBLINS_PER_CAMP = 6;
434
434
  /** How long a faction camp chest stays before fading out and relocating. */
435
435
  export const BATTLEFIELD_CAMP_CHEST_LIFETIME_MS = 60_000;
436
- /** Soldier camps closer to the farm (higher world Z), south of the lake. */
436
+ /** Soldier camps - closer to the farm (higher world Z), south of the lake. */
437
437
  export const BATTLEFIELD_SOLDIER_CAMPS = [
438
438
  { x: 22, z: 720 },
439
439
  { x: 48, z: 714 },
@@ -452,7 +452,7 @@ export const BATTLEFIELD_SOLDIER_CAMPS = [
452
452
  ];
453
453
  /** The large central soldier camp is commanded by the Battlefield Captain. */
454
454
  export const BATTLEFIELD_CAPTAIN_CAMP = { x: 119, z: 734 };
455
- /** Goblin camps farther wilderness (lower world Z), north of the lake. */
455
+ /** Goblin camps - farther wilderness (lower world Z), north of the lake. */
456
456
  export const BATTLEFIELD_GOBLIN_CAMPS = [
457
457
  { x: 30, z: 654 },
458
458
  { x: 58, z: 648 },
@@ -466,7 +466,7 @@ export const BATTLEFIELD_GOBLIN_CAMPS = [
466
466
  { x: 128, z: 656 },
467
467
  ];
468
468
  /**
469
- * Cultivated cabbage plots on the soldier shore between lake and camps.
469
+ * Cultivated cabbage plots on the soldier shore - between lake and camps.
470
470
  * Filled as neat soil rows (not sparse scatter).
471
471
  */
472
472
  export const BATTLEFIELD_CABBAGE_PLOTS = [
@@ -563,7 +563,7 @@ function discoveryZoneCenter(id) {
563
563
  }
564
564
  /**
565
565
  * Paper-map labels. Keep this list in lockstep with named places in this file
566
- * and `DISCOVERY_ZONES` the in-game map and the public website chart both
566
+ * and `DISCOVERY_ZONES` - the in-game map and the public website chart both
567
567
  * paint from here. Village is not a labelled stop.
568
568
  */
569
569
  export const WORLD_MAP_LANDMARKS = [
@@ -52,7 +52,7 @@ export type PlayerPublic = {
52
52
  /**
53
53
  * Which tackle the fishing pose should show. Pond fishing is a scoop net;
54
54
  * lake fishing (perch/tench) is the small rod, which previously also drew a
55
- * net so casting for perch looked like scooping frogs.
55
+ * net - so casting for perch looked like scooping frogs.
56
56
  */
57
57
  fishingGear?: 'net' | 'rod';
58
58
  /**
@@ -121,7 +121,7 @@ export type ItemAction = 'eat' | 'drop' | 'equip' | 'unequip';
121
121
  /**
122
122
  * A shop listing a player can buy. Normally costed in gold via `price`, but a
123
123
  * listing can instead be a barter (e.g. Wilson's rod-for-maggots trade) by
124
- * setting `costKind`/`costQty` to an item cost `price` is ignored then.
124
+ * setting `costKind`/`costQty` to an item cost - `price` is ignored then.
125
125
  */
126
126
  export type ShopBuyEntry = {
127
127
  kind: string;
@@ -136,7 +136,7 @@ export type ShopSellEntry = {
136
136
  };
137
137
  export type JoinRejectedReason = 'name_taken' | 'invalid_name';
138
138
  /**
139
- * `reward` is for "you just gained something" moments landing a fish, and
139
+ * `reward` is for "you just gained something" moments - landing a fish, and
140
140
  * anything else worth a beat of celebration. Distinct from `quiet` (which is a
141
141
  * plain grey chat line and was where catches used to land, so they slid past
142
142
  * unnoticed) and from the default gold notice, which is used for routine
@@ -348,7 +348,7 @@ export type ClientMessage =
348
348
  type: 'duel_cancel';
349
349
  }
350
350
  /**
351
- * Claims the rescued beagle, or renames one already claimed the same
351
+ * Claims the rescued beagle, or renames one already claimed - the same
352
352
  * message either way, since "name your beagle" and "rename your beagle" are
353
353
  * the same operation to the server.
354
354
  */
@@ -373,7 +373,7 @@ export type ClientMessage =
373
373
  };
374
374
  /** Crash/error diagnostics pushed from client to server so they land in server logs
375
375
  * instead of only a phone's on-device console (which on TikTok can miss early boot
376
- * output see crashDiagnostics.ts on the client). Best-effort, not persisted server-side. */
376
+ * output - see crashDiagnostics.ts on the client). Best-effort, not persisted server-side. */
377
377
  export type ClientErrorReport = {
378
378
  reason: string;
379
379
  message?: string;
@@ -660,7 +660,7 @@ export type ServerMessage = {
660
660
  damage: number;
661
661
  health: number;
662
662
  healthMax: number;
663
- /** Ranged attack flavor client renders a projectile instead of a melee punch. */
663
+ /** Ranged attack flavor - client renders a projectile instead of a melee punch. */
664
664
  projectile?: 'blueberry' | 'arrow';
665
665
  } | {
666
666
  type: 'combat_end';
@@ -714,7 +714,7 @@ export type ServerMessage = {
714
714
  name: string | null;
715
715
  out: boolean;
716
716
  }
717
- /** Someone patted their beagle shown over that owner's pet, not your own. */
717
+ /** Someone patted their beagle - shown over that owner's pet, not your own. */
718
718
  | {
719
719
  type: 'companion_speech';
720
720
  ownerId: string;
package/dist/quests.d.ts CHANGED
@@ -34,7 +34,7 @@ export declare const RANGER_SAW_EXPLORER_XP = 25;
34
34
  export declare const ANNE_FOXES_NEEDED = 20;
35
35
  /** Matches Debbie's skill-XP grant; Mastery is the Weapon Mastery pool (`precisionXp`). */
36
36
  export declare const ANNE_FOXES_MASTERY_XP = 100;
37
- /** Same as Clark's Chores foxes are found by foraging tracks. */
37
+ /** Same as Clark's Chores - foxes are found by foraging tracks. */
38
38
  export declare const ANNE_FOXES_FORAGING_XP = 120;
39
39
  /** Same as Clark's Chores / Debbie. */
40
40
  export declare const ANNE_FOXES_EXPLORER_XP = 80;
@@ -44,9 +44,9 @@ export declare const CARRIAGE_REPAIR_WOODWORK_XP = 150;
44
44
  export declare const CARRIAGE_DRIVER_EXPLORER_XP = 60;
45
45
  export declare const CARRIAGE_RIDE_BASECAMP_COST = 10;
46
46
  export declare const CARRIAGE_RIDE_FARM_COST = 5;
47
- /** Lil Beach is the starting shore same short hop as the farm, priced to match. */
47
+ /** Lil Beach is the starting shore - same short hop as the farm, priced to match. */
48
48
  export declare const CARRIAGE_RIDE_BEACH_COST = 5;
49
- /** Sold at the stable counter; never enters the bag it hitches to the carriage. */
49
+ /** Sold at the stable counter; never enters the bag - it hitches to the carriage. */
50
50
  export declare const CARRIAGE_HORSE_KIND = "carriagehorse";
51
51
  /** Stable Master sells a draft horse so the carriage can actually run. */
52
52
  export declare const CARRIAGE_HORSE_COST = 200;
package/dist/quests.js CHANGED
@@ -26,7 +26,7 @@ export const RANGER_SAW_EXPLORER_XP = 25;
26
26
  export const ANNE_FOXES_NEEDED = 20;
27
27
  /** Matches Debbie's skill-XP grant; Mastery is the Weapon Mastery pool (`precisionXp`). */
28
28
  export const ANNE_FOXES_MASTERY_XP = 100;
29
- /** Same as Clark's Chores foxes are found by foraging tracks. */
29
+ /** Same as Clark's Chores - foxes are found by foraging tracks. */
30
30
  export const ANNE_FOXES_FORAGING_XP = 120;
31
31
  /** Same as Clark's Chores / Debbie. */
32
32
  export const ANNE_FOXES_EXPLORER_XP = 80;
@@ -36,9 +36,9 @@ export const CARRIAGE_REPAIR_WOODWORK_XP = 150;
36
36
  export const CARRIAGE_DRIVER_EXPLORER_XP = 60;
37
37
  export const CARRIAGE_RIDE_BASECAMP_COST = 10;
38
38
  export const CARRIAGE_RIDE_FARM_COST = 5;
39
- /** Lil Beach is the starting shore same short hop as the farm, priced to match. */
39
+ /** Lil Beach is the starting shore - same short hop as the farm, priced to match. */
40
40
  export const CARRIAGE_RIDE_BEACH_COST = 5;
41
- /** Sold at the stable counter; never enters the bag it hitches to the carriage. */
41
+ /** Sold at the stable counter; never enters the bag - it hitches to the carriage. */
42
42
  export const CARRIAGE_HORSE_KIND = 'carriagehorse';
43
43
  /** Stable Master sells a draft horse so the carriage can actually run. */
44
44
  export const CARRIAGE_HORSE_COST = 200;
@@ -48,7 +48,7 @@ export const CAPTAINS_ORDERS_GOBLINS_NEEDED = 30;
48
48
  export const BERNIE_BUBBLE_MS = 4000;
49
49
  export const QUEST_META = {
50
50
  lostBeagle: {
51
- // QuestId stays 'lostBeagle' it is persisted on character documents and
51
+ // QuestId stays 'lostBeagle' - it is persisted on character documents and
52
52
  // threaded through the wire protocol. Only the player-facing copy changed,
53
53
  // to match Bernie being a dog rather than a beagle specifically.
54
54
  title: 'The Lost Dog',
@@ -177,7 +177,7 @@ export const QUEST_META = {
177
177
  },
178
178
  findRimdel: {
179
179
  title: 'Find Rimdel',
180
- description: "You freed Rimdel from the goblin prison in the Goblin Cave. He told you he's headed to the capital of the Upper Kingdoms seek him out if you ever make it there.",
180
+ description: "You freed Rimdel from the goblin prison in the Goblin Cave. He told you he's headed to the capital of the Upper Kingdoms - seek him out if you ever make it there.",
181
181
  giverNpcKind: 'rimdel',
182
182
  objectives: {
183
183
  active: 'Find Rimdel at the capital in the Upper Kingdoms.',
@@ -36,7 +36,7 @@ export declare const CARRIAGE_STYLE_FIXED = "carriage";
36
36
  export declare const CARRIAGE_STYLE_DRIVEN = "driven";
37
37
  /** Hired driver plus owned draft horse hitched to the shafts. */
38
38
  export declare const CARRIAGE_STYLE_HITCHED = "hitched";
39
- /** Northwest battlefield lake bridge a modest early Woodwork project. */
39
+ /** Northwest battlefield lake bridge - a modest early Woodwork project. */
40
40
  export declare const BATTLEFIELD_BRIDGE_REPAIR_COST: Array<{
41
41
  kind: string;
42
42
  qty: number;
@@ -76,7 +76,7 @@ export declare const STORAGE_HUT_REPAIR_COST: Array<{
76
76
  kind: string;
77
77
  qty: number;
78
78
  }>;
79
- /** Buildable from the start birch arrows are a level 1 recipe and need it. */
79
+ /** Buildable from the start - birch arrows are a level 1 recipe and need it. */
80
80
  export declare const WORKBENCH_BUILD_WOODWORK_LEVEL = 1;
81
81
  export declare const WORKBENCH_BUILD_COST: Array<{
82
82
  kind: string;
@@ -85,7 +85,7 @@ export declare const WORKBENCH_BUILD_COST: Array<{
85
85
  export declare const NETTLES_KIND = "nettles";
86
86
  /** Legacy item id retained so existing inventories remain valid; shown as Sharp Stone. */
87
87
  export declare const SHARP_ROCK_KIND = "sharprock";
88
- /** Common cobble chipped from ordinary scenery rocks not the rare knapped sharp stone. */
88
+ /** Common cobble chipped from ordinary scenery rocks - not the rare knapped sharp stone. */
89
89
  export declare const STONE_KIND = "stone";
90
90
  export declare const SPRUCE_ARROW_KIND = "sprucearrow";
91
91
  export declare const CARVING_KNIFE_KIND = "carvingknife";
@@ -110,7 +110,7 @@ export type WoodworkRecipe = {
110
110
  export declare const WOODWORK_RECIPES: WoodworkRecipe[];
111
111
  export declare function woodworkRecipe(id: string): WoodworkRecipe | null;
112
112
  export declare const NETTLES_FORAGING_LEVEL = 1;
113
- /** Ordinary scenery rocks pebbles, default stones, boulders. Crags are cliff faces. */
113
+ /** Ordinary scenery rocks - pebbles, default stones, boulders. Crags are cliff faces. */
114
114
  export declare const STONE_FORAGING_LEVEL = 1;
115
115
  export declare const SHARP_ROCK_FORAGING_LEVEL = 5;
116
116
  /** Inspect rotten farm food or battlefield rotten meat for maggots. */
@@ -124,7 +124,7 @@ export declare const PERCH_FISHING_LEVEL = 7;
124
124
  export declare const POND_FISHING_LEVEL = 1;
125
125
  /**
126
126
  * Odds a cast lands its fish. Used to be a flat 0.5 regardless of skill, so
127
- * Fishing level bought you nothing at the rod the only thing it gated was
127
+ * Fishing level bought you nothing at the rod - the only thing it gated was
128
128
  * whether tench were castable at all.
129
129
  *
130
130
  * Now a cast starts unreliable at the level that unlocks the fish and improves
@@ -161,7 +161,7 @@ export declare const CAVE_ENTRANCE_EXPLORER_LEVEL = 5;
161
161
  export declare function isFoxTrackEndStyle(style: string | undefined): boolean;
162
162
  export declare const CHICKEN_FEATHER_YIELD_MIN = 1;
163
163
  export declare const CHICKEN_FEATHER_YIELD_MAX = 3;
164
- /** Same odds as picking a fight with a seagull worth its feathers sometimes it isn't peaceful. */
164
+ /** Same odds as picking a fight with a seagull worth its feathers - sometimes it isn't peaceful. */
165
165
  export declare const CHICKEN_ATTACK_CHANCE = 0.1;
166
166
  export declare const CHICKEN_PECK_DAMAGE_MIN = 1;
167
167
  export declare const CHICKEN_PECK_DAMAGE_MAX = 3;
@@ -186,11 +186,11 @@ export declare const CARVING_KNIFE_PRICE = 50;
186
186
  * so patches are genuinely hunted rather than stumbled over.
187
187
  */
188
188
  export declare const NETTLES_MIN_SPACING = 105;
189
- /** Sharp rock is the long hunt roughly ten minutes of searching. */
189
+ /** Sharp rock is the long hunt - roughly ten minutes of searching. */
190
190
  export declare const SHARP_ROCK_MIN_SPACING = 260;
191
191
  /**
192
192
  * Earthworm casts are a rare, world-scale forage node (like the beach worm
193
- * poo casts), not a per-tile density roll only this many exist at once,
193
+ * poo casts), not a per-tile density roll - only this many exist at once,
194
194
  * anywhere in the world.
195
195
  */
196
196
  export declare const EARTHWORM_CAST_COUNT = 3;
package/dist/woodwork.js CHANGED
@@ -36,7 +36,7 @@ export const CARRIAGE_STYLE_FIXED = 'carriage';
36
36
  export const CARRIAGE_STYLE_DRIVEN = 'driven';
37
37
  /** Hired driver plus owned draft horse hitched to the shafts. */
38
38
  export const CARRIAGE_STYLE_HITCHED = 'hitched';
39
- /** Northwest battlefield lake bridge a modest early Woodwork project. */
39
+ /** Northwest battlefield lake bridge - a modest early Woodwork project. */
40
40
  export const BATTLEFIELD_BRIDGE_REPAIR_COST = [
41
41
  { kind: BIRCH_WOOD_KIND, qty: 30 },
42
42
  { kind: POPLAR_WOOD_KIND, qty: 20 },
@@ -99,7 +99,7 @@ export const STORAGE_HUT_REPAIR_WOODWORK_LEVEL = 5;
99
99
  export const STORAGE_HUT_REPAIR_COST = [
100
100
  { kind: BIRCH_WOOD_KIND, qty: 20 },
101
101
  ];
102
- /** Buildable from the start birch arrows are a level 1 recipe and need it. */
102
+ /** Buildable from the start - birch arrows are a level 1 recipe and need it. */
103
103
  export const WORKBENCH_BUILD_WOODWORK_LEVEL = 1;
104
104
  export const WORKBENCH_BUILD_COST = [
105
105
  { kind: BIRCH_WOOD_KIND, qty: 40 },
@@ -107,7 +107,7 @@ export const WORKBENCH_BUILD_COST = [
107
107
  export const NETTLES_KIND = 'nettles';
108
108
  /** Legacy item id retained so existing inventories remain valid; shown as Sharp Stone. */
109
109
  export const SHARP_ROCK_KIND = 'sharprock';
110
- /** Common cobble chipped from ordinary scenery rocks not the rare knapped sharp stone. */
110
+ /** Common cobble chipped from ordinary scenery rocks - not the rare knapped sharp stone. */
111
111
  export const STONE_KIND = 'stone';
112
112
  export const SPRUCE_ARROW_KIND = 'sprucearrow';
113
113
  export const CARVING_KNIFE_KIND = 'carvingknife';
@@ -211,7 +211,7 @@ export function woodworkRecipe(id) {
211
211
  return WOODWORK_RECIPES.find((r) => r.id === id) ?? null;
212
212
  }
213
213
  export const NETTLES_FORAGING_LEVEL = 1;
214
- /** Ordinary scenery rocks pebbles, default stones, boulders. Crags are cliff faces. */
214
+ /** Ordinary scenery rocks - pebbles, default stones, boulders. Crags are cliff faces. */
215
215
  export const STONE_FORAGING_LEVEL = 1;
216
216
  export const SHARP_ROCK_FORAGING_LEVEL = 5;
217
217
  /** Inspect rotten farm food or battlefield rotten meat for maggots. */
@@ -225,7 +225,7 @@ export const PERCH_FISHING_LEVEL = 7;
225
225
  export const POND_FISHING_LEVEL = 1;
226
226
  /**
227
227
  * Odds a cast lands its fish. Used to be a flat 0.5 regardless of skill, so
228
- * Fishing level bought you nothing at the rod the only thing it gated was
228
+ * Fishing level bought you nothing at the rod - the only thing it gated was
229
229
  * whether tench were castable at all.
230
230
  *
231
231
  * Now a cast starts unreliable at the level that unlocks the fish and improves
@@ -235,7 +235,7 @@ export const POND_FISHING_LEVEL = 1;
235
235
  * their first tench four casts in five.
236
236
  */
237
237
  /*
238
- * Retuned after play: 0.25 at the unlock level made early fishing a slog
238
+ * Retuned after play: 0.25 at the unlock level made early fishing a slog -
239
239
  * with a 3s cast that is ~12s a fish before the XP cut is even felt. The
240
240
  * scaling is the point, not the punishment, so the floor now sits just under
241
241
  * the old flat 0.5 and the ceiling is comfortably above it.
@@ -289,7 +289,7 @@ export function isFoxTrackEndStyle(style) {
289
289
  }
290
290
  export const CHICKEN_FEATHER_YIELD_MIN = 1;
291
291
  export const CHICKEN_FEATHER_YIELD_MAX = 3;
292
- /** Same odds as picking a fight with a seagull worth its feathers sometimes it isn't peaceful. */
292
+ /** Same odds as picking a fight with a seagull worth its feathers - sometimes it isn't peaceful. */
293
293
  export const CHICKEN_ATTACK_CHANCE = 0.1;
294
294
  export const CHICKEN_PECK_DAMAGE_MIN = 1;
295
295
  export const CHICKEN_PECK_DAMAGE_MAX = 3;
@@ -314,11 +314,11 @@ export const CARVING_KNIFE_PRICE = 50;
314
314
  * so patches are genuinely hunted rather than stumbled over.
315
315
  */
316
316
  export const NETTLES_MIN_SPACING = 105;
317
- /** Sharp rock is the long hunt roughly ten minutes of searching. */
317
+ /** Sharp rock is the long hunt - roughly ten minutes of searching. */
318
318
  export const SHARP_ROCK_MIN_SPACING = 260;
319
319
  /**
320
320
  * Earthworm casts are a rare, world-scale forage node (like the beach worm
321
- * poo casts), not a per-tile density roll only this many exist at once,
321
+ * poo casts), not a per-tile density roll - only this many exist at once,
322
322
  * anywhere in the world.
323
323
  */
324
324
  export const EARTHWORM_CAST_COUNT = 3;
package/dist/xp.d.ts CHANGED
@@ -33,7 +33,7 @@ export declare function maxHealthForLevel(combatLevel: number): number;
33
33
  * Replaces a subtractive soak (`damage - random(0..armour)`), which had a nasty
34
34
  * cliff: once armour approached the attacker's max hit, damage collapsed toward
35
35
  * zero, so two points either way swung survival from a few minutes to over half
36
- * an hour. Measured, not guessed see scripts/sim-combat.ts.
36
+ * an hour. Measured, not guessed - see scripts/sim-combat.ts.
37
37
  *
38
38
  * A ratio curve has none of that. It gives diminishing returns, never reaches
39
39
  * immunity, and stays predictable to tune.
package/dist/xp.js CHANGED
@@ -66,7 +66,7 @@ export function maxHealthForLevel(combatLevel) {
66
66
  * Replaces a subtractive soak (`damage - random(0..armour)`), which had a nasty
67
67
  * cliff: once armour approached the attacker's max hit, damage collapsed toward
68
68
  * zero, so two points either way swung survival from a few minutes to over half
69
- * an hour. Measured, not guessed see scripts/sim-combat.ts.
69
+ * an hour. Measured, not guessed - see scripts/sim-combat.ts.
70
70
  *
71
71
  * A ratio curve has none of that. It gives diminishing returns, never reaches
72
72
  * immunity, and stays predictable to tune.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreadwood-types/types",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Public wire protocol and client-safe constants for Dreadwoods",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",