@dreadwood-types/types 0.1.1 → 0.1.2
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 +1 -1
- package/dist/appearance.d.ts +4 -4
- package/dist/appearance.d.ts.map +1 -1
- package/dist/appearance.js +8 -5
- package/dist/appearance.js.map +1 -1
- package/dist/constants.d.ts +7 -7
- package/dist/constants.js +11 -11
- package/dist/cooking.d.ts +1 -1
- package/dist/cooking.js +1 -1
- package/dist/equipment.js +1 -1
- package/dist/groundItems.d.ts +1 -1
- package/dist/groundItems.js +1 -1
- package/dist/landmarks.d.ts +32 -32
- package/dist/landmarks.js +33 -33
- package/dist/messages.d.ts +7 -7
- package/dist/quests.d.ts +3 -3
- package/dist/quests.js +5 -5
- package/dist/woodwork.d.ts +8 -8
- package/dist/woodwork.js +9 -9
- package/dist/xp.d.ts +1 -1
- package/dist/xp.js +1 -1
- package/package.json +1 -1
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
|
|
43
|
+
Publishes `dist/` with TypeScript declarations. Contains message types, tile enums, and display constants only - no server simulation logic.
|
package/dist/appearance.d.ts
CHANGED
|
@@ -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
|
|
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"
|
|
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
|
|
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
|
|
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"];
|
package/dist/appearance.d.ts.map
CHANGED
|
@@ -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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"}
|
package/dist/appearance.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
package/dist/appearance.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appearance.js","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,cAAc,GAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAIpF,MAAM,CAAC,MAAM,eAAe,GAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAIxE,MAAM,CAAC,MAAM,aAAa,GAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAIrF,MAAM,CAAC,MAAM,iBAAiB,GAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAI1D,MAAM,CAAC,MAAM,eAAe,GAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAYtD,MAAM,CAAC,MAAM,UAAU,GAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;CACjB,CAAC;AA0BF,MAAM,CAAC,MAAM,iBAAiB,GAAgC;IAC5D,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,WAAW;IACd,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,OAAO;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAA+B;IAC1D,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAmC;IAClE,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,QAAQ;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAiC;IAC9D,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,OAAO;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAiC;IAC9D,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,UAAU;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACD,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACD,CAAC;AAEX,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACD,CAAC;AAEX,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AACjD,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAIhD,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACjE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1C,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,GAAG,KAAK,CAAC;QAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAClD,IAAI,GAAG,KAAK,CAAC;QAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;;QACzC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC;QAAE,EAAE,IAAI,CAAC,CAAC;IACpB,IAAI,EAAE,GAAG,CAAC;QAAE,EAAE,IAAI,CAAC,CAAC;IACpB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IAC5C,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACtD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAS,CAAC;IACd,IAAI,CAAS,CAAC;IACd,IAAI,CAAS,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACb,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;SACzB,QAAQ,CAAC,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtB,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAG,GAAiB,MAAM;IAC1D,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO;YACL,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,SAAS;YACnB,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,SAAS;YACxB,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,SAAS;SACpB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,EAAE,MAAM;QACX,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,SAAS;QACnB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,SAAS;QACnB,aAAa,EAAE,SAAS;QACxB,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,iBAAiB,EAAE,CAAC;IAChE,MAAM,CAAC,GAAG,GAAmC,CAAC;IAC9C,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAwB,CAAC;QACnE,CAAC,CAAE,CAAC,CAAC,SAAyB;QAC9B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;IACnB,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,UAA0B,CAAC;QACvE,CAAC,CAAE,CAAC,CAAC,UAA2B;QAChC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IACpB,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,YAA8B,CAAC;QAC/E,CAAC,CAAE,CAAC,CAAC,YAA+B;QACpC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;IACtB,IAAI,UAAU,GAAiB,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,UAA0B,CAAC;YACjE,CAAC,CAAE,CAAC,CAAC,UAA2B;YAChC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,EAAE;gBACtD,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,CAAC;IACV,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,QAAgB,EAAE,EAAE,CAC5C,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpD,OAAO;QACL,GAAG;QACH,qEAAqE;QACrE,uEAAuE;QACvE,6DAA6D;QAC7D,qCAAqC;QACrC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAkB,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,MAAmB,CAAC,CAAC,CAAC,IAAI;QACjF,SAAS;QACT,UAAU;QACV,QAAQ
|
|
1
|
+
{"version":3,"file":"appearance.js","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
@@ -18,7 +18,7 @@ export type FoodInfo = {
|
|
|
18
18
|
* perch restored nearly half a health bar. With health now scaling to ~62 at
|
|
19
19
|
* level 15 and ~107 at level 30, the old values healed a rounding error and
|
|
20
20
|
* food would have stopped being a meaningful resource at the exact point the
|
|
21
|
-
* fights got hard. Raw fish still hurt
|
|
21
|
+
* fights got hard. Raw fish still hurt - the penalty is unchanged in spirit,
|
|
22
22
|
* just scaled to match.
|
|
23
23
|
*/
|
|
24
24
|
export declare const FOOD_INFO: Record<string, FoodInfo>;
|
package/dist/cooking.js
CHANGED
|
@@ -18,7 +18,7 @@ export const CAMPFIRE_COOK_RANGE = 3;
|
|
|
18
18
|
* perch restored nearly half a health bar. With health now scaling to ~62 at
|
|
19
19
|
* level 15 and ~107 at level 30, the old values healed a rounding error and
|
|
20
20
|
* food would have stopped being a meaningful resource at the exact point the
|
|
21
|
-
* fights got hard. Raw fish still hurt
|
|
21
|
+
* fights got hard. Raw fish still hurt - the penalty is unchanged in spirit,
|
|
22
22
|
* just scaled to match.
|
|
23
23
|
*/
|
|
24
24
|
export const FOOD_INFO = {
|
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
|
|
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 },
|
package/dist/groundItems.d.ts
CHANGED
|
@@ -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
|
|
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[];
|
package/dist/groundItems.js
CHANGED
|
@@ -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
|
|
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 = [];
|
package/dist/landmarks.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
182
|
-
* hollow, its own cavern, and a return exit
|
|
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"
|
|
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
|
|
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 N
|
|
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 east
|
|
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_*
|
|
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
|
-
* N
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
191
|
-
* hollow, its own cavern, and a return exit
|
|
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"
|
|
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]
|
|
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
|
|
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 N
|
|
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 east
|
|
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_*
|
|
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
|
-
* N
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
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 = [
|
package/dist/messages.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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'
|
|
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
|
|
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.',
|
package/dist/woodwork.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|