@dreadwood-types/types 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +43 -0
  2. package/dist/appearance.d.ts +80 -0
  3. package/dist/appearance.d.ts.map +1 -0
  4. package/dist/appearance.js +319 -0
  5. package/dist/appearance.js.map +1 -0
  6. package/dist/bank.d.ts +15 -0
  7. package/dist/bank.d.ts.map +1 -0
  8. package/dist/bank.js +45 -0
  9. package/dist/bank.js.map +1 -0
  10. package/dist/clientConfig.d.ts +103 -0
  11. package/dist/clientConfig.d.ts.map +1 -0
  12. package/dist/clientConfig.js +209 -0
  13. package/dist/clientConfig.js.map +1 -0
  14. package/dist/constants.d.ts +205 -0
  15. package/dist/constants.d.ts.map +1 -0
  16. package/dist/constants.js +713 -0
  17. package/dist/constants.js.map +1 -0
  18. package/dist/cooking.d.ts +26 -0
  19. package/dist/cooking.d.ts.map +1 -0
  20. package/dist/cooking.js +41 -0
  21. package/dist/cooking.js.map +1 -0
  22. package/dist/equipment.d.ts +47 -0
  23. package/dist/equipment.d.ts.map +1 -0
  24. package/dist/equipment.js +186 -0
  25. package/dist/equipment.js.map +1 -0
  26. package/dist/goblinCave.d.ts +112 -0
  27. package/dist/goblinCave.d.ts.map +1 -0
  28. package/dist/goblinCave.js +69 -0
  29. package/dist/goblinCave.js.map +1 -0
  30. package/dist/groundItems.d.ts +17 -0
  31. package/dist/groundItems.d.ts.map +1 -0
  32. package/dist/groundItems.js +104 -0
  33. package/dist/groundItems.js.map +1 -0
  34. package/dist/index.d.ts +16 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +16 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/landmarks.d.ts +366 -0
  39. package/dist/landmarks.d.ts.map +1 -0
  40. package/dist/landmarks.js +584 -0
  41. package/dist/landmarks.js.map +1 -0
  42. package/dist/messages.d.ts +723 -0
  43. package/dist/messages.d.ts.map +1 -0
  44. package/dist/messages.js +38 -0
  45. package/dist/messages.js.map +1 -0
  46. package/dist/nameFilter.d.ts +8 -0
  47. package/dist/nameFilter.d.ts.map +1 -0
  48. package/dist/nameFilter.js +94 -0
  49. package/dist/nameFilter.js.map +1 -0
  50. package/dist/quests.d.ts +63 -0
  51. package/dist/quests.d.ts.map +1 -0
  52. package/dist/quests.js +233 -0
  53. package/dist/quests.js.map +1 -0
  54. package/dist/torches.d.ts +7 -0
  55. package/dist/torches.d.ts.map +1 -0
  56. package/dist/torches.js +11 -0
  57. package/dist/torches.js.map +1 -0
  58. package/dist/woodwork.d.ts +206 -0
  59. package/dist/woodwork.d.ts.map +1 -0
  60. package/dist/woodwork.js +365 -0
  61. package/dist/woodwork.js.map +1 -0
  62. package/dist/xp.d.ts +74 -0
  63. package/dist/xp.d.ts.map +1 -0
  64. package/dist/xp.js +126 -0
  65. package/dist/xp.js.map +1 -0
  66. package/dist/zones.d.ts +30 -0
  67. package/dist/zones.d.ts.map +1 -0
  68. package/dist/zones.js +143 -0
  69. package/dist/zones.js.map +1 -0
  70. package/package.json +36 -0
package/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # @dreadwood-types/types
2
+
3
+ Public wire protocol and client-safe constants for Dreadwoods.
4
+
5
+ ## Publish (once)
6
+
7
+ Org on npm: `@dreadwood-types`. Package must exist before Render can use `npm ci` without cloning this repo.
8
+
9
+ ```bash
10
+ npm login
11
+ npm publish
12
+ ```
13
+
14
+ Verify: `npm view @dreadwood-types/types version` should print `0.1.0`.
15
+
16
+ ## Install (published)
17
+
18
+ After publish, consumers on Render or CI install from the registry:
19
+
20
+ ```bash
21
+ npm install @dreadwood-types/types@^0.1.0
22
+ ```
23
+
24
+ ## Local monorepo
25
+
26
+ Backend, frontend, and website depend on the sibling repo via `file:../dreadwoods-types`.
27
+ From the workspace root:
28
+
29
+ ```powershell
30
+ # After npm install in at least one consumer (or if npm is broken on your machine):
31
+ .\scripts\setup-local-types.ps1
32
+ ```
33
+
34
+ Or manually:
35
+
36
+ ```bash
37
+ cd dreadwoods-types
38
+ npm install # or use tsc from a sibling node_modules
39
+ npm run build
40
+ cd ../dreadwoods-backend && npm install
41
+ ```
42
+
43
+ Publishes `dist/` with TypeScript declarations. Contains message types, tile enums, and display constants only — no server simulation logic.
@@ -0,0 +1,80 @@
1
+ export type CharacterSex = 'male' | 'female';
2
+ export type HairStyleId = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;
3
+ export declare const HAIR_STYLE_IDS: HairStyleId[];
4
+ export type HeadPresetId = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
5
+ export declare const HEAD_PRESET_IDS: HeadPresetId[];
6
+ export type BodyTypeId = 'slim' | 'average' | 'athletic' | 'stocky';
7
+ export declare const BODY_TYPE_IDS: BodyTypeId[];
8
+ export type EyebrowStyleId = 0 | 1;
9
+ export declare const EYEBROW_STYLE_IDS: EyebrowStyleId[];
10
+ export type FacialHairId = 0 | 1;
11
+ export declare const FACIAL_HAIR_IDS: FacialHairId[];
12
+ /**
13
+ * Modular outfit worn over the base body. Sex-neutral: the part list for each
14
+ * sex is resolved from the outfit manifest at render time
15
+ * (public/assets/models/outfits/manifest.json, built by scripts/build-outfits.mjs).
16
+ *
17
+ * `null` means no outfit — the character renders with the legacy painted-on
18
+ * top/trousers/boots zones instead.
19
+ */
20
+ export type OutfitId = 'peasant' | 'ranger';
21
+ export declare const OUTFIT_IDS: OutfitId[];
22
+ export declare const OUTFIT_LABELS: Record<OutfitId, string>;
23
+ export type CharacterAppearance = {
24
+ sex: CharacterSex;
25
+ /**
26
+ * Optional so that omitting it means "no outfit" — the character keeps the
27
+ * legacy painted-on look. That is the safe default for the many NPC
28
+ * appearance literals that predate the outfit system.
29
+ */
30
+ outfit?: OutfitId | null;
31
+ hairStyle: HairStyleId;
32
+ headPreset: HeadPresetId;
33
+ bodyType: BodyTypeId;
34
+ eyebrowStyle: EyebrowStyleId;
35
+ facialHair: FacialHairId;
36
+ hairColor: string;
37
+ beardColor: string;
38
+ browColor: string;
39
+ topColor: string;
40
+ trousersColor: string;
41
+ skinTone: string;
42
+ bootColor: string;
43
+ handsColor: string;
44
+ eyeColor: string;
45
+ };
46
+ export declare const HAIR_STYLE_LABELS: Record<HairStyleId, string>;
47
+ export declare const BODY_TYPE_LABELS: Record<BodyTypeId, string>;
48
+ export declare const EYEBROW_STYLE_LABELS: Record<EyebrowStyleId, string>;
49
+ export declare const FACIAL_HAIR_LABELS: Record<FacialHairId, string>;
50
+ export declare const HEAD_PRESET_LABELS: Record<HeadPresetId, string>;
51
+ export declare const COLOR_PRESETS: readonly ['#f6d7c3', '#e8b98a', '#c98a5c', '#8d5524', '#3b2214', '#1a1a1a', '#2b2b2b', '#2c3340', '#dfe7ef', '#1f1812', '#3d6b4f', '#2f4d7a', '#8b3a3a', '#c4a35a', '#c65d2e', '#6b4d8f', '#e8e4dc', '#5a6673', '#2e8b6e', '#7fa8c9', '#a8742f', '#4a2c1a', '#f2c14e', '#c9502e', '#7d6f52', '#5c4a34', '#8a7a5c', '#6b6152'];
52
+ export declare const EYE_COLOR_PRESETS: readonly ['#2a1a10', '#4a2c1a', '#7a5230', '#a8742f', '#3d6b4f', '#2e8b6e', '#3b6ea5', '#7fa8c9', '#5a6673', '#6b4d8f', '#1a1a1a', '#c4a35a'];
53
+ /**
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
56
+ * hunting for the believable entries among greens and purples.
57
+ */
58
+ export declare const SKIN_TONE_PRESETS: readonly ['#f7e2d2', '#f2d4bd', '#ebc4a5', '#e0b088', '#d19a6f', '#bf8459', '#a86d45', '#8f5734', '#754427', '#5c341c', '#452614', '#311b0e'];
59
+ /** Natural hair only, ordered fair to black, with greys and reds grouped. */
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. */
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
+ 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
+ export declare const EYE_COLORS: readonly ["#2a1a10", "#4a2c1a", "#7a5230", "#a8742f", "#3d6b4f", "#2e8b6e", "#3b6ea5", "#7fa8c9", "#5a6673", "#6b4d8f", "#1a1a1a", "#c4a35a"];
65
+ export declare const SKIN_TONES: readonly ["#f7e2d2", "#f2d4bd", "#ebc4a5", "#e0b088", "#d19a6f", "#bf8459", "#a86d45", "#8f5734", "#754427", "#5c341c", "#452614", "#311b0e"];
66
+ export declare const HAIR_COLORS: readonly ["#efe3c2", "#e2c684", "#c9a04e", "#b8862f", "#8f5a20", "#6d4320", "#523118", "#3a2211", "#241510", "#12100f", "#c1512a", "#8f3a20", "#b9b3a6", "#e6e3dc"];
67
+ export declare const TOP_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"];
68
+ export declare const TROUSER_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"];
69
+ export declare const BOOT_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"];
70
+ export declare const HANDS_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"];
71
+ export type HslColor = {
72
+ h: number;
73
+ s: number;
74
+ l: number;
75
+ };
76
+ export declare function hexToHsl(hex: string): HslColor;
77
+ export declare function hslToHex(h: number, s: number, l: number): string;
78
+ export declare function defaultAppearance(sex?: CharacterSex): CharacterAppearance;
79
+ export declare function normalizeAppearance(raw: unknown): CharacterAppearance;
80
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,319 @@
1
+ export const HAIR_STYLE_IDS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
2
+ export const HEAD_PRESET_IDS = [0, 1, 2, 3, 4, 5, 6, 7];
3
+ export const BODY_TYPE_IDS = ['slim', 'average', 'athletic', 'stocky'];
4
+ export const EYEBROW_STYLE_IDS = [0, 1];
5
+ export const FACIAL_HAIR_IDS = [0, 1];
6
+ export const OUTFIT_IDS = ['peasant', 'ranger'];
7
+ export const OUTFIT_LABELS = {
8
+ peasant: 'Peasant',
9
+ ranger: 'Ranger',
10
+ };
11
+ export const HAIR_STYLE_LABELS = {
12
+ 0: 'Parted',
13
+ 1: 'Parted+',
14
+ 2: 'Long',
15
+ 3: 'Buns',
16
+ 4: 'Buzz',
17
+ 5: 'Buzz+',
18
+ 6: 'Long soft',
19
+ 7: 'Crop',
20
+ 8: 'Twin buns',
21
+ 9: 'Full buns',
22
+ 10: 'Side part',
23
+ 11: 'Long+',
24
+ };
25
+ export const BODY_TYPE_LABELS = {
26
+ slim: 'Slim',
27
+ average: 'Average',
28
+ athletic: 'Athletic',
29
+ stocky: 'Stocky',
30
+ };
31
+ export const EYEBROW_STYLE_LABELS = {
32
+ 0: 'Straight',
33
+ 1: 'Arched',
34
+ };
35
+ export const FACIAL_HAIR_LABELS = {
36
+ 0: 'None',
37
+ 1: 'Beard',
38
+ };
39
+ export const HEAD_PRESET_LABELS = {
40
+ 0: 'Round',
41
+ 1: 'Oval',
42
+ 2: 'Square',
43
+ 3: 'Heart',
44
+ 4: 'Angular',
45
+ 5: 'Broad',
46
+ 6: 'Narrow',
47
+ 7: 'Chiseled',
48
+ };
49
+ export const COLOR_PRESETS = [
50
+ '#f6d7c3',
51
+ '#e8b98a',
52
+ '#c98a5c',
53
+ '#8d5524',
54
+ '#3b2214',
55
+ '#1a1a1a',
56
+ '#2b2b2b',
57
+ '#2c3340',
58
+ '#dfe7ef',
59
+ '#1f1812',
60
+ '#3d6b4f',
61
+ '#2f4d7a',
62
+ '#8b3a3a',
63
+ '#c4a35a',
64
+ '#c65d2e',
65
+ '#6b4d8f',
66
+ '#e8e4dc',
67
+ '#5a6673',
68
+ '#2e8b6e',
69
+ '#7fa8c9',
70
+ '#a8742f',
71
+ '#4a2c1a',
72
+ '#f2c14e',
73
+ '#c9502e',
74
+ '#7d6f52',
75
+ '#5c4a34',
76
+ '#8a7a5c',
77
+ '#6b6152',
78
+ ];
79
+ export const EYE_COLOR_PRESETS = [
80
+ '#2a1a10',
81
+ '#4a2c1a',
82
+ '#7a5230',
83
+ '#a8742f',
84
+ '#3d6b4f',
85
+ '#2e8b6e',
86
+ '#3b6ea5',
87
+ '#7fa8c9',
88
+ '#5a6673',
89
+ '#6b4d8f',
90
+ '#1a1a1a',
91
+ '#c4a35a',
92
+ ];
93
+ /**
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
96
+ * hunting for the believable entries among greens and purples.
97
+ */
98
+ export const SKIN_TONE_PRESETS = [
99
+ '#f7e2d2',
100
+ '#f2d4bd',
101
+ '#ebc4a5',
102
+ '#e0b088',
103
+ '#d19a6f',
104
+ '#bf8459',
105
+ '#a86d45',
106
+ '#8f5734',
107
+ '#754427',
108
+ '#5c341c',
109
+ '#452614',
110
+ '#311b0e',
111
+ ];
112
+ /** Natural hair only, ordered fair to black, with greys and reds grouped. */
113
+ export const HAIR_COLOR_PRESETS = [
114
+ '#efe3c2',
115
+ '#e2c684',
116
+ '#c9a04e',
117
+ '#b8862f',
118
+ '#8f5a20',
119
+ '#6d4320',
120
+ '#523118',
121
+ '#3a2211',
122
+ '#241510',
123
+ '#12100f',
124
+ '#c1512a',
125
+ '#8f3a20',
126
+ '#b9b3a6',
127
+ '#e6e3dc',
128
+ ];
129
+ /** Muted, hard-wearing cloth and leather — adventurer kit, not carnival. */
130
+ export const CLOTH_COLOR_PRESETS = [
131
+ '#e8e4dc',
132
+ '#b9b2a2',
133
+ '#8a7a5c',
134
+ '#6b6152',
135
+ '#5c4a34',
136
+ '#4a2c1a',
137
+ '#3b2214',
138
+ '#2b2b2b',
139
+ '#1f1812',
140
+ '#3d6b4f',
141
+ '#2e6b52',
142
+ '#4a5a3a',
143
+ '#2f4d7a',
144
+ '#3b6ea5',
145
+ '#5a6673',
146
+ '#8b3a3a',
147
+ '#a8452e',
148
+ '#c4a35a',
149
+ '#a8742f',
150
+ '#6b4d8f',
151
+ ];
152
+ export const COLOR_PALETTE = CLOTH_COLOR_PRESETS;
153
+ export const EYE_COLORS = EYE_COLOR_PRESETS;
154
+ export const SKIN_TONES = SKIN_TONE_PRESETS;
155
+ export const HAIR_COLORS = HAIR_COLOR_PRESETS;
156
+ export const TOP_COLORS = CLOTH_COLOR_PRESETS;
157
+ export const TROUSER_COLORS = CLOTH_COLOR_PRESETS;
158
+ export const BOOT_COLORS = CLOTH_COLOR_PRESETS;
159
+ export const HANDS_COLORS = CLOTH_COLOR_PRESETS;
160
+ function clamp01(n) {
161
+ return Math.min(1, Math.max(0, n));
162
+ }
163
+ export function hexToHsl(hex) {
164
+ const raw = hex.replace('#', '');
165
+ if (!/^[0-9a-fA-F]{6}$/.test(raw))
166
+ return { h: 0, s: 0, l: 0.5 };
167
+ const r = parseInt(raw.slice(0, 2), 16) / 255;
168
+ const g = parseInt(raw.slice(2, 4), 16) / 255;
169
+ const b = parseInt(raw.slice(4, 6), 16) / 255;
170
+ const max = Math.max(r, g, b);
171
+ const min = Math.min(r, g, b);
172
+ const l = (max + min) / 2;
173
+ if (max === min)
174
+ return { h: 0, s: 0, l };
175
+ const d = max - min;
176
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
177
+ let h = 0;
178
+ if (max === r)
179
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
180
+ else if (max === g)
181
+ h = ((b - r) / d + 2) / 6;
182
+ else
183
+ h = ((r - g) / d + 4) / 6;
184
+ return { h, s, l };
185
+ }
186
+ function hueToRgb(p, q, t) {
187
+ let tt = t;
188
+ if (tt < 0)
189
+ tt += 1;
190
+ if (tt > 1)
191
+ tt -= 1;
192
+ if (tt < 1 / 6)
193
+ return p + (q - p) * 6 * tt;
194
+ if (tt < 1 / 2)
195
+ return q;
196
+ if (tt < 2 / 3)
197
+ return p + (q - p) * (2 / 3 - tt) * 6;
198
+ return p;
199
+ }
200
+ export function hslToHex(h, s, l) {
201
+ const hh = ((h % 1) + 1) % 1;
202
+ const ss = clamp01(s);
203
+ const ll = clamp01(l);
204
+ let r;
205
+ let g;
206
+ let b;
207
+ if (ss === 0) {
208
+ r = g = b = ll;
209
+ }
210
+ else {
211
+ const q = ll < 0.5 ? ll * (1 + ss) : ll + ss - ll * ss;
212
+ const p = 2 * ll - q;
213
+ r = hueToRgb(p, q, hh + 1 / 3);
214
+ g = hueToRgb(p, q, hh);
215
+ b = hueToRgb(p, q, hh - 1 / 3);
216
+ }
217
+ const to = (n) => Math.round(clamp01(n) * 255)
218
+ .toString(16)
219
+ .padStart(2, '0');
220
+ return `#${to(r)}${to(g)}${to(b)}`;
221
+ }
222
+ export function defaultAppearance(sex = 'male') {
223
+ if (sex === 'female') {
224
+ return {
225
+ sex: 'female',
226
+ outfit: null,
227
+ hairStyle: 2,
228
+ headPreset: 3,
229
+ bodyType: 'average',
230
+ eyebrowStyle: 1,
231
+ facialHair: 0,
232
+ hairColor: '#c1512a',
233
+ beardColor: '#c1512a',
234
+ browColor: '#c1512a',
235
+ topColor: '#3d6b4f',
236
+ trousersColor: '#3b2214',
237
+ skinTone: '#f2d4bd',
238
+ bootColor: '#4a2c1a',
239
+ handsColor: '#f2d4bd',
240
+ eyeColor: '#3b6ea5',
241
+ };
242
+ }
243
+ return {
244
+ sex: 'male',
245
+ outfit: null,
246
+ hairStyle: 0,
247
+ headPreset: 1,
248
+ bodyType: 'average',
249
+ eyebrowStyle: 0,
250
+ facialHair: 0,
251
+ hairColor: '#241510',
252
+ beardColor: '#241510',
253
+ browColor: '#241510',
254
+ topColor: '#4a5a3a',
255
+ trousersColor: '#3b2214',
256
+ skinTone: '#e0b088',
257
+ bootColor: '#4a2c1a',
258
+ handsColor: '#e0b088',
259
+ eyeColor: '#3b6ea5',
260
+ };
261
+ }
262
+ export function normalizeAppearance(raw) {
263
+ if (!raw || typeof raw !== 'object')
264
+ return defaultAppearance();
265
+ const a = raw;
266
+ const sex = a.sex === 'female' ? 'female' : 'male';
267
+ const base = defaultAppearance(sex);
268
+ const hairStyle = HAIR_STYLE_IDS.includes(a.hairStyle)
269
+ ? a.hairStyle
270
+ : base.hairStyle;
271
+ const headPreset = HEAD_PRESET_IDS.includes(a.headPreset)
272
+ ? a.headPreset
273
+ : base.headPreset;
274
+ const eyebrowStyle = EYEBROW_STYLE_IDS.includes(a.eyebrowStyle)
275
+ ? a.eyebrowStyle
276
+ : base.eyebrowStyle;
277
+ let facialHair = 0;
278
+ if (sex !== 'female') {
279
+ facialHair = FACIAL_HAIR_IDS.includes(a.facialHair)
280
+ ? a.facialHair
281
+ : hairStyle === 1 || hairStyle === 5 || hairStyle === 11
282
+ ? 1
283
+ : 0;
284
+ }
285
+ const pick = (v, fallback) => typeof v === 'string' && /^#[0-9a-fA-F]{6}$/.test(v) ? v : fallback;
286
+ const skinTone = pick(a.skinTone, base.skinTone);
287
+ const hairColor = pick(a.hairColor, base.hairColor);
288
+ return {
289
+ sex,
290
+ // Preserved deliberately. Every player-facing path runs through this
291
+ // function, so a field that is not copied here is silently discarded —
292
+ // which would leave players undressed while NPCs (who bypass
293
+ // normalisation) rendered correctly.
294
+ outfit: OUTFIT_IDS.includes(a.outfit) ? a.outfit : null,
295
+ hairStyle,
296
+ headPreset,
297
+ bodyType: 'average',
298
+ eyebrowStyle,
299
+ facialHair,
300
+ hairColor,
301
+ beardColor: pick(a.beardColor, hairColor),
302
+ browColor: pick(a.browColor, hairColor),
303
+ topColor: pick(a.topColor, base.topColor),
304
+ trousersColor: pick(a.trousersColor, base.trousersColor),
305
+ skinTone,
306
+ // 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
308
+ // socks. Real boot geometry arrives with outfits, so the choice has to
309
+ // survive; without this every outfitted character wears flesh-coloured
310
+ // leather. Characters saved before this change still carry a skin-toned
311
+ // bootColor, which stays correct for them precisely because they are barefoot.
312
+ bootColor: pick(a.bootColor, base.bootColor),
313
+ // Hands stay tied to skin: this drives the bare-hand zone and the
314
+ // procedural mitten hands. Gloves override it later via applyWornGear.
315
+ handsColor: skinTone,
316
+ eyeColor: pick(a.eyeColor, base.eyeColor),
317
+ };
318
+ }
319
+ //# sourceMappingURL=appearance.js.map
@@ -0,0 +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,EAAE,SAAS;QACnB,YAAY;QACZ,UAAU;QACV,SAAS;QACT,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC;QACzC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC;QACvC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;QACzC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC;QACxD,QAAQ;QACR,yEAAyE;QACzE,wEAAwE;QACxE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,+EAA+E;QAC/E,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;QAC5C,kEAAkE;QAClE,uEAAuE;QACvE,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;KAC1C,CAAC;AACJ,CAAC"}
package/dist/bank.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import type { InventorySlot } from './messages.js';
2
+ export declare const BANK_TAB_COUNT = 6;
3
+ export declare const BANK_SLOTS_PER_TAB = 20;
4
+ export declare const BANK_MOVE_MAX = 50;
5
+ export declare const BANK_QTY_PRESETS: readonly [1, 5, 10, 50];
6
+ export declare const BANK_RANGE = 3;
7
+ export type BankSlot = InventorySlot;
8
+ export type BankTab = Array<BankSlot | null>;
9
+ export type BankState = {
10
+ tabs: BankTab[];
11
+ };
12
+ export declare function emptyBankTab(): BankTab;
13
+ export declare function emptyBank(): BankState;
14
+ export declare function normalizeBank(raw: unknown): BankState;
15
+ //# sourceMappingURL=bank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bank.d.ts","sourceRoot":"","sources":["../src/bank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,gBAAgB,YAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAU,CAAC;AACxD,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC;AACrC,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAE5C,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CA0BrD"}
package/dist/bank.js ADDED
@@ -0,0 +1,45 @@
1
+ export const BANK_TAB_COUNT = 6;
2
+ export const BANK_SLOTS_PER_TAB = 20;
3
+ export const BANK_MOVE_MAX = 50;
4
+ export const BANK_QTY_PRESETS = [1, 5, 10, 50];
5
+ export const BANK_RANGE = 3;
6
+ export function emptyBankTab() {
7
+ return Array.from({ length: BANK_SLOTS_PER_TAB }, () => null);
8
+ }
9
+ export function emptyBank() {
10
+ return { tabs: Array.from({ length: BANK_TAB_COUNT }, () => emptyBankTab()) };
11
+ }
12
+ export function normalizeBank(raw) {
13
+ const empty = emptyBank();
14
+ if (!raw || typeof raw !== 'object')
15
+ return empty;
16
+ const tabsRaw = raw.tabs;
17
+ if (!Array.isArray(tabsRaw))
18
+ return empty;
19
+ const tabs = empty.tabs.map((fallback, ti) => {
20
+ const src = tabsRaw[ti];
21
+ if (!Array.isArray(src))
22
+ return fallback;
23
+ const tab = emptyBankTab();
24
+ for (let i = 0; i < BANK_SLOTS_PER_TAB; i++) {
25
+ const slot = src[i];
26
+ if (!slot || typeof slot !== 'object')
27
+ continue;
28
+ const kind = slot.kind;
29
+ const qty = slot.qty;
30
+ if (typeof kind !== 'string' || !kind)
31
+ continue;
32
+ if (typeof qty !== 'number' || !Number.isFinite(qty) || qty < 1)
33
+ continue;
34
+ const precision = slot.precision;
35
+ tab[i] = {
36
+ kind,
37
+ qty: Math.floor(qty),
38
+ ...(typeof precision === 'number' && Number.isFinite(precision) ? { precision } : {}),
39
+ };
40
+ }
41
+ return tab;
42
+ });
43
+ return { tabs };
44
+ }
45
+ //# sourceMappingURL=bank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bank.js","sourceRoot":"","sources":["../src/bank.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAU,CAAC;AACxD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAM5B,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,OAAO,GAAI,GAA0B,CAAC,IAAI,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,IAAI,GAAc,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE;QACtD,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;QACzC,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAChD,MAAM,IAAI,GAAI,IAA2B,CAAC,IAAI,CAAC;YAC/C,MAAM,GAAG,GAAI,IAA0B,CAAC,GAAG,CAAC;YAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI;gBAAE,SAAS;YAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;gBAAE,SAAS;YAC1E,MAAM,SAAS,GAAI,IAAgC,CAAC,SAAS,CAAC;YAC9D,GAAG,CAAC,CAAC,CAAC,GAAG;gBACP,IAAI;gBACJ,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;gBACpB,GAAG,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtF,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,103 @@
1
+ export declare const CAMERA_ZOOM_MIN = 8;
2
+ export declare const CAMERA_ZOOM_MAX = 24;
3
+ /**
4
+ * Slightly elevated 3/4 view: character and ground ahead, not RTS top-down
5
+ * (old default 14) and not cramped over-the-shoulder.
6
+ */
7
+ export declare const CAMERA_ZOOM_DEFAULT = 11;
8
+ /**
9
+ * Radians from the horizon. ~0.92 is a 3/4 look-down; 1.42 was nearly
10
+ * straight top-down.
11
+ */
12
+ export declare const CAMERA_PITCH_DEFAULT = 0.92;
13
+ export declare const CAMERA_PITCH_MIN = 0.35;
14
+ export declare const CAMERA_PITCH_MAX = 1.48;
15
+ /**
16
+ * Bump when the default view changes so old saved bird's-eye zooms migrate.
17
+ * Saved configs with a lower revision get the new pitch/zoom pair.
18
+ */
19
+ export declare const CAMERA_VIEW_REVISION = 3;
20
+ export declare const CHAT_WIDTH_MIN = 200;
21
+ export declare const CHAT_WIDTH_MAX = 640;
22
+ export declare const CHAT_WIDTH_DEFAULT = 340;
23
+ export declare const CHAT_HEIGHT_MIN = 64;
24
+ export declare const CHAT_HEIGHT_MAX = 420;
25
+ export declare const CHAT_HEIGHT_DEFAULT = 112;
26
+ /** Compact / phone chat has no resize grip; keep the log short by default. */
27
+ export declare const CHAT_HEIGHT_COMPACT_DEFAULT = 72;
28
+ /** Match MeshHud compact chat and the HUD CSS breakpoint. */
29
+ export declare const CHAT_COMPACT_MAX_WIDTH = 720;
30
+ export declare const CHAT_FONT_SIZE_MIN = 9;
31
+ export declare const CHAT_FONT_SIZE_MAX = 18;
32
+ export declare const CHAT_FONT_SIZE_DEFAULT = 12;
33
+ export declare const HUD_BAR_SIZE_MIN = 32;
34
+ export declare const HUD_BAR_SIZE_MAX = 64;
35
+ export declare const HUD_BAR_SIZE_DEFAULT = 38;
36
+ export declare const QUEST_LOG_POS_UNSET = -1;
37
+ export declare const PANEL_POS_UNSET = -1;
38
+ /** 5th panel swatch (see THEME_PANEL_SWATCHES in the client's ui/colors.ts). */
39
+ export declare const THEME_PANEL_DEFAULT = "#2e2620";
40
+ export declare const THEME_INK_DEFAULT = "#f2f5e9";
41
+ export type ClientConfig = {
42
+ showNames: boolean;
43
+ showHealth: boolean;
44
+ hideRoofs: boolean;
45
+ hideAvatar: boolean;
46
+ soundEnabled: boolean;
47
+ musicEnabled: boolean;
48
+ minimapZoom: number;
49
+ cameraZoom: number;
50
+ cameraViewRevision: number;
51
+ chat: {
52
+ width: number;
53
+ height: number;
54
+ fontSize: number;
55
+ };
56
+ questLog: {
57
+ x: number;
58
+ y: number;
59
+ };
60
+ playerCard: {
61
+ x: number;
62
+ y: number;
63
+ };
64
+ theme: {
65
+ panel: string;
66
+ ink: string;
67
+ };
68
+ hudBarSize: number;
69
+ };
70
+ export type PartialClientConfig = {
71
+ showNames?: boolean;
72
+ showHealth?: boolean;
73
+ hideRoofs?: boolean;
74
+ hideAvatar?: boolean;
75
+ soundEnabled?: boolean;
76
+ musicEnabled?: boolean;
77
+ minimapZoom?: number;
78
+ cameraZoom?: number;
79
+ cameraViewRevision?: number;
80
+ chat?: {
81
+ width?: number;
82
+ height?: number;
83
+ fontSize?: number;
84
+ };
85
+ questLog?: {
86
+ x?: number;
87
+ y?: number;
88
+ };
89
+ playerCard?: {
90
+ x?: number;
91
+ y?: number;
92
+ };
93
+ theme?: {
94
+ panel?: string;
95
+ ink?: string;
96
+ };
97
+ hudBarSize?: number;
98
+ };
99
+ export declare function clampHudBarSize(size: number): number;
100
+ export declare function defaultClientConfig(): ClientConfig;
101
+ export declare function normalizeClientConfig(raw: unknown): ClientConfig;
102
+ export declare function mergeClientConfig(current: ClientConfig, patch: PartialClientConfig | null | undefined): ClientConfig;
103
+ //# sourceMappingURL=clientConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clientConfig.d.ts","sourceRoot":"","sources":["../src/clientConfig.ts"],"names":[],"mappings":"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"}