d2r-saver 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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +126 -0
  3. package/data/data.json +1 -0
  4. package/data/strings.json +1 -0
  5. package/dist/core/binary-reader.d.ts +43 -0
  6. package/dist/core/binary-reader.d.ts.map +1 -0
  7. package/dist/core/binary-reader.js +130 -0
  8. package/dist/core/binary-reader.js.map +1 -0
  9. package/dist/core/binary-writer.d.ts +49 -0
  10. package/dist/core/binary-writer.d.ts.map +1 -0
  11. package/dist/core/binary-writer.js +156 -0
  12. package/dist/core/binary-writer.js.map +1 -0
  13. package/dist/core/checksum.d.ts +28 -0
  14. package/dist/core/checksum.d.ts.map +1 -0
  15. package/dist/core/checksum.js +62 -0
  16. package/dist/core/checksum.js.map +1 -0
  17. package/dist/core/huffman.d.ts +22 -0
  18. package/dist/core/huffman.d.ts.map +1 -0
  19. package/dist/core/huffman.js +66 -0
  20. package/dist/core/huffman.js.map +1 -0
  21. package/dist/core/index.d.ts +5 -0
  22. package/dist/core/index.d.ts.map +1 -0
  23. package/dist/core/index.js +5 -0
  24. package/dist/core/index.js.map +1 -0
  25. package/dist/formats/d2i-reader.d.ts +53 -0
  26. package/dist/formats/d2i-reader.d.ts.map +1 -0
  27. package/dist/formats/d2i-reader.js +208 -0
  28. package/dist/formats/d2i-reader.js.map +1 -0
  29. package/dist/formats/d2i-writer.d.ts +63 -0
  30. package/dist/formats/d2i-writer.d.ts.map +1 -0
  31. package/dist/formats/d2i-writer.js +229 -0
  32. package/dist/formats/d2i-writer.js.map +1 -0
  33. package/dist/formats/d2s-reader.d.ts +104 -0
  34. package/dist/formats/d2s-reader.d.ts.map +1 -0
  35. package/dist/formats/d2s-reader.js +257 -0
  36. package/dist/formats/d2s-reader.js.map +1 -0
  37. package/dist/formats/d2s-writer.d.ts +52 -0
  38. package/dist/formats/d2s-writer.d.ts.map +1 -0
  39. package/dist/formats/d2s-writer.js +407 -0
  40. package/dist/formats/d2s-writer.js.map +1 -0
  41. package/dist/formats/detect.d.ts +18 -0
  42. package/dist/formats/detect.d.ts.map +1 -0
  43. package/dist/formats/detect.js +40 -0
  44. package/dist/formats/detect.js.map +1 -0
  45. package/dist/formats/index.d.ts +8 -0
  46. package/dist/formats/index.d.ts.map +1 -0
  47. package/dist/formats/index.js +8 -0
  48. package/dist/formats/index.js.map +1 -0
  49. package/dist/formats/item-parser.d.ts +97 -0
  50. package/dist/formats/item-parser.d.ts.map +1 -0
  51. package/dist/formats/item-parser.js +627 -0
  52. package/dist/formats/item-parser.js.map +1 -0
  53. package/dist/formats/item-writer.d.ts +55 -0
  54. package/dist/formats/item-writer.d.ts.map +1 -0
  55. package/dist/formats/item-writer.js +514 -0
  56. package/dist/formats/item-writer.js.map +1 -0
  57. package/dist/game-data/game-data.d.ts +90 -0
  58. package/dist/game-data/game-data.d.ts.map +1 -0
  59. package/dist/game-data/game-data.js +355 -0
  60. package/dist/game-data/game-data.js.map +1 -0
  61. package/dist/game-data/index.d.ts +4 -0
  62. package/dist/game-data/index.d.ts.map +1 -0
  63. package/dist/game-data/index.js +3 -0
  64. package/dist/game-data/index.js.map +1 -0
  65. package/dist/game-data/loader.d.ts +23 -0
  66. package/dist/game-data/loader.d.ts.map +1 -0
  67. package/dist/game-data/loader.js +32 -0
  68. package/dist/game-data/loader.js.map +1 -0
  69. package/dist/game-data/types.d.ts +428 -0
  70. package/dist/game-data/types.d.ts.map +1 -0
  71. package/dist/game-data/types.js +10 -0
  72. package/dist/game-data/types.js.map +1 -0
  73. package/dist/index.d.ts +166 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +197 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/inventory/dimensions.d.ts +42 -0
  78. package/dist/inventory/dimensions.d.ts.map +1 -0
  79. package/dist/inventory/dimensions.js +30 -0
  80. package/dist/inventory/dimensions.js.map +1 -0
  81. package/dist/inventory/grid.d.ts +53 -0
  82. package/dist/inventory/grid.d.ts.map +1 -0
  83. package/dist/inventory/grid.js +117 -0
  84. package/dist/inventory/grid.js.map +1 -0
  85. package/dist/inventory/index.d.ts +4 -0
  86. package/dist/inventory/index.d.ts.map +1 -0
  87. package/dist/inventory/index.js +4 -0
  88. package/dist/inventory/index.js.map +1 -0
  89. package/dist/inventory/placement.d.ts +68 -0
  90. package/dist/inventory/placement.d.ts.map +1 -0
  91. package/dist/inventory/placement.js +90 -0
  92. package/dist/inventory/placement.js.map +1 -0
  93. package/dist/items/index.d.ts +7 -0
  94. package/dist/items/index.d.ts.map +1 -0
  95. package/dist/items/index.js +7 -0
  96. package/dist/items/index.js.map +1 -0
  97. package/dist/items/item-dto.d.ts +47 -0
  98. package/dist/items/item-dto.d.ts.map +1 -0
  99. package/dist/items/item-dto.js +124 -0
  100. package/dist/items/item-dto.js.map +1 -0
  101. package/dist/items/item-icon.d.ts +27 -0
  102. package/dist/items/item-icon.d.ts.map +1 -0
  103. package/dist/items/item-icon.js +103 -0
  104. package/dist/items/item-icon.js.map +1 -0
  105. package/dist/items/item-serializer.d.ts +38 -0
  106. package/dist/items/item-serializer.d.ts.map +1 -0
  107. package/dist/items/item-serializer.js +92 -0
  108. package/dist/items/item-serializer.js.map +1 -0
  109. package/dist/items/item-stats-parser.d.ts +52 -0
  110. package/dist/items/item-stats-parser.d.ts.map +1 -0
  111. package/dist/items/item-stats-parser.js +671 -0
  112. package/dist/items/item-stats-parser.js.map +1 -0
  113. package/dist/items/item-types.d.ts +40 -0
  114. package/dist/items/item-types.d.ts.map +1 -0
  115. package/dist/items/item-types.js +198 -0
  116. package/dist/items/item-types.js.map +1 -0
  117. package/dist/items/item.d.ts +61 -0
  118. package/dist/items/item.d.ts.map +1 -0
  119. package/dist/items/item.js +335 -0
  120. package/dist/items/item.js.map +1 -0
  121. package/dist/operations/extract-item.d.ts +39 -0
  122. package/dist/operations/extract-item.d.ts.map +1 -0
  123. package/dist/operations/extract-item.js +204 -0
  124. package/dist/operations/extract-item.js.map +1 -0
  125. package/dist/operations/index.d.ts +4 -0
  126. package/dist/operations/index.d.ts.map +1 -0
  127. package/dist/operations/index.js +4 -0
  128. package/dist/operations/index.js.map +1 -0
  129. package/dist/operations/insert-item.d.ts +59 -0
  130. package/dist/operations/insert-item.d.ts.map +1 -0
  131. package/dist/operations/insert-item.js +210 -0
  132. package/dist/operations/insert-item.js.map +1 -0
  133. package/dist/operations/read-save.d.ts +25 -0
  134. package/dist/operations/read-save.d.ts.map +1 -0
  135. package/dist/operations/read-save.js +27 -0
  136. package/dist/operations/read-save.js.map +1 -0
  137. package/dist/types/constants.d.ts +76 -0
  138. package/dist/types/constants.d.ts.map +1 -0
  139. package/dist/types/constants.js +96 -0
  140. package/dist/types/constants.js.map +1 -0
  141. package/dist/types/errors.d.ts +47 -0
  142. package/dist/types/errors.d.ts.map +1 -0
  143. package/dist/types/errors.js +53 -0
  144. package/dist/types/errors.js.map +1 -0
  145. package/dist/types/index.d.ts +5 -0
  146. package/dist/types/index.d.ts.map +1 -0
  147. package/dist/types/index.js +3 -0
  148. package/dist/types/index.js.map +1 -0
  149. package/dist/types/item.d.ts +112 -0
  150. package/dist/types/item.d.ts.map +1 -0
  151. package/dist/types/item.js +6 -0
  152. package/dist/types/item.js.map +1 -0
  153. package/dist/types/save-file.d.ts +74 -0
  154. package/dist/types/save-file.d.ts.map +1 -0
  155. package/dist/types/save-file.js +5 -0
  156. package/dist/types/save-file.js.map +1 -0
  157. package/dist/types/trade-item.d.ts +37 -0
  158. package/dist/types/trade-item.d.ts.map +1 -0
  159. package/dist/types/trade-item.js +5 -0
  160. package/dist/types/trade-item.js.map +1 -0
  161. package/package.json +70 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * GameData — central registry of processed game data tables.
3
+ *
4
+ * Replaces the d2planner `Data` singleton. Instead of a global,
5
+ * GameData instances are created once and passed to all consumers.
6
+ *
7
+ * Ported from: d2planner/src/data/index.js + d2planner/src/data/load.js (processData).
8
+ * Simplified: Blizzless v105 only — no version filtering, no browser/UI code.
9
+ */
10
+ import type { RawGameData, ItemEntry, ArmorEntry, WeaponEntry, MiscEntry, ItemStatCostEntry, ItemTypeEntry, UniqueItemEntry, SetItemEntry, SetEntry, RunewordEntry, MagicAffixEntry, GemEntry, SkillEntry, PropertyEntry, StateEntry, MonsterEntry, MissileEntry, HirelingEntry, CharStatEntry, RareAffixEntry, QualityItemEntry, PropertyGroupEntry, UniqueModEntry, SuperUniqueEntry, GameInfo } from './types.js';
11
+ import type { LocaleArray } from './loader.js';
12
+ export interface LocaleStore {
13
+ strings: Record<string, string>;
14
+ istrings: string[];
15
+ stringi: Record<string, number>;
16
+ }
17
+ export declare class GameData {
18
+ armor: Record<string, ArmorEntry>;
19
+ weapons: Record<string, WeaponEntry>;
20
+ misc: Record<string, MiscEntry>;
21
+ itemStatCost: Record<string, ItemStatCostEntry>;
22
+ itemTypes: Record<string, ItemTypeEntry>;
23
+ uniqueItems: Record<string, UniqueItemEntry>;
24
+ setItems: Record<string, SetItemEntry>;
25
+ sets: Record<string, SetEntry>;
26
+ runes: Record<string, RunewordEntry>;
27
+ magicPrefix: Record<string, MagicAffixEntry>;
28
+ magicSuffix: Record<string, MagicAffixEntry>;
29
+ autoMagic: Record<string, MagicAffixEntry>;
30
+ crafted: Record<string, MagicAffixEntry>;
31
+ qualityItems: Record<string, QualityItemEntry>;
32
+ gems: Record<string, GemEntry>;
33
+ skills: Record<string, SkillEntry>;
34
+ properties: Record<string, PropertyEntry>;
35
+ states: Record<string, StateEntry>;
36
+ monsters: Record<string, MonsterEntry>;
37
+ missiles: Record<string, MissileEntry>;
38
+ hireling: Record<string, HirelingEntry>;
39
+ charStats: Record<string, CharStatEntry>;
40
+ rarePrefix: Record<string, RareAffixEntry>;
41
+ rareSuffix: Record<string, RareAffixEntry>;
42
+ /** Property groups (e.g. random skill-tab grants). Expanded into `mods["<group>:N"]` at load. */
43
+ propertyGroups?: Record<string, PropertyGroupEntry>;
44
+ /** Unique-mod table (used by warlock bind-demon parsing). */
45
+ uniqueMods?: Record<string, UniqueModEntry>;
46
+ /** Super-unique monster table. */
47
+ superUniques?: Record<string, SuperUniqueEntry>;
48
+ info: GameInfo;
49
+ strings: Record<string, string>;
50
+ /** Merged map: armor + misc + weapons. */
51
+ items: Record<string, ItemEntry>;
52
+ /** Merged map: autoMagic + magicPrefix + magicSuffix + crafted + qualityItems + staffMods. */
53
+ mods: Record<string, MagicAffixEntry>;
54
+ /** Generated staff mod affix definitions. */
55
+ staffMods: Record<string, MagicAffixEntry>;
56
+ /** skill.skill.toLowerCase() → SkillEntry */
57
+ skillByName: Record<string, SkillEntry>;
58
+ /** state.state.toLowerCase() → StateEntry */
59
+ stateByName: Record<string, StateEntry>;
60
+ /** missile.missile.toLowerCase() → MissileEntry */
61
+ missileByName: Record<string, MissileEntry>;
62
+ /** monster.hcidx → MonsterEntry */
63
+ monsterById: MonsterEntry[];
64
+ /** Locale lookup tables. */
65
+ locale: LocaleStore;
66
+ static readonly classes: readonly ["ama", "sor", "nec", "pal", "bar", "dru", "ass", "war"];
67
+ static readonly classNames: Record<string, string>;
68
+ static readonly strClassSkillsStat: string[];
69
+ static readonly strClassOnly: string[];
70
+ static readonly strSkilltabStat: string[];
71
+ private constructor();
72
+ /**
73
+ * Create GameData by loading from file system.
74
+ */
75
+ static fromFile(dataPath: string, stringsPath: string): Promise<GameData>;
76
+ /**
77
+ * Create GameData from pre-parsed JSON objects.
78
+ */
79
+ static fromRaw(rawData: RawGameData, locale: LocaleArray): GameData;
80
+ /**
81
+ * Internal: create and process from loaded data.
82
+ */
83
+ private static fromLoaded;
84
+ private processData;
85
+ private reorderStatPriorities;
86
+ private generateStaffMods;
87
+ private fixupMods;
88
+ private buildLookupMaps;
89
+ }
90
+ //# sourceMappingURL=game-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-data.d.ts","sourceRoot":"","sources":["../../src/game-data/game-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,355 @@
1
+ /**
2
+ * GameData — central registry of processed game data tables.
3
+ *
4
+ * Replaces the d2planner `Data` singleton. Instead of a global,
5
+ * GameData instances are created once and passed to all consumers.
6
+ *
7
+ * Ported from: d2planner/src/data/index.js + d2planner/src/data/load.js (processData).
8
+ * Simplified: Blizzless v105 only — no version filtering, no browser/UI code.
9
+ */
10
+ // ─── GameData class ─────────────────────────────────────────────
11
+ export class GameData {
12
+ // ── Raw tables (from data.json, post-process) ───────────────
13
+ armor;
14
+ weapons;
15
+ misc;
16
+ itemStatCost;
17
+ itemTypes;
18
+ uniqueItems;
19
+ setItems;
20
+ sets;
21
+ runes;
22
+ magicPrefix;
23
+ magicSuffix;
24
+ autoMagic;
25
+ crafted;
26
+ qualityItems;
27
+ gems;
28
+ skills;
29
+ properties;
30
+ states;
31
+ monsters;
32
+ missiles;
33
+ hireling;
34
+ charStats;
35
+ rarePrefix;
36
+ rareSuffix;
37
+ /** Property groups (e.g. random skill-tab grants). Expanded into `mods["<group>:N"]` at load. */
38
+ propertyGroups;
39
+ /** Unique-mod table (used by warlock bind-demon parsing). */
40
+ uniqueMods;
41
+ /** Super-unique monster table. */
42
+ superUniques;
43
+ info;
44
+ strings;
45
+ // ── Derived / computed ──────────────────────────────────────
46
+ /** Merged map: armor + misc + weapons. */
47
+ items;
48
+ /** Merged map: autoMagic + magicPrefix + magicSuffix + crafted + qualityItems + staffMods. */
49
+ mods;
50
+ /** Generated staff mod affix definitions. */
51
+ staffMods;
52
+ /** skill.skill.toLowerCase() → SkillEntry */
53
+ skillByName;
54
+ /** state.state.toLowerCase() → StateEntry */
55
+ stateByName;
56
+ /** missile.missile.toLowerCase() → MissileEntry */
57
+ missileByName;
58
+ /** monster.hcidx → MonsterEntry */
59
+ monsterById;
60
+ /** Locale lookup tables. */
61
+ locale;
62
+ // ── Static class metadata ───────────────────────────────────
63
+ static classes = ['ama', 'sor', 'nec', 'pal', 'bar', 'dru', 'ass', 'war'];
64
+ static classNames = {
65
+ ama: 'Amazon',
66
+ sor: 'Sorceress',
67
+ nec: 'Necromancer',
68
+ pal: 'Paladin',
69
+ bar: 'Barbarian',
70
+ dru: 'Druid',
71
+ ass: 'Assassin',
72
+ war: 'Warlock',
73
+ };
74
+ static strClassSkillsStat = [
75
+ 'ModStr3a', 'ModStr3d', 'ModStr3c', 'ModStr3b', 'ModStr3e',
76
+ 'ModStre8a', 'ModStre8b', 'ModStrge9',
77
+ ];
78
+ static strClassOnly = [
79
+ 'AmaOnly', 'SorOnly', 'NecOnly', 'PalOnly',
80
+ 'BarOnly', 'DruOnly', 'AssOnly', 'WarOnly',
81
+ ];
82
+ static strSkilltabStat = [
83
+ 'StrSklTabItem3', 'StrSklTabItem2', 'StrSklTabItem1',
84
+ 'StrSklTabItem15', 'StrSklTabItem14', 'StrSklTabItem13',
85
+ 'StrSklTabItem8', 'StrSklTabItem7', 'StrSklTabItem9',
86
+ 'StrSklTabItem6', 'StrSklTabItem5', 'StrSklTabItem4',
87
+ 'StrSklTabItem11', 'StrSklTabItem12', 'StrSklTabItem10',
88
+ 'StrSklTabItem16', 'StrSklTabItem17', 'StrSklTabItem18',
89
+ 'StrSklTabItem19', 'StrSklTabItem20', 'StrSklTabItem21',
90
+ 'StrSklTabItem24', 'StrSklTabItem22', 'StrSklTabItem23',
91
+ ];
92
+ // ── Construction ────────────────────────────────────────────
93
+ constructor() { }
94
+ /**
95
+ * Create GameData by loading from file system.
96
+ */
97
+ static async fromFile(dataPath, stringsPath) {
98
+ // Lazy import so node:fs/promises + node:path only load when fromFile is
99
+ // actually called (Node contexts). Browser consumers use fromRaw/fromData.
100
+ const { loadDataFromFile } = await import('./loader.js');
101
+ const loaded = await loadDataFromFile(dataPath, stringsPath);
102
+ return GameData.fromLoaded(loaded);
103
+ }
104
+ /**
105
+ * Create GameData from pre-parsed JSON objects.
106
+ */
107
+ static fromRaw(rawData, locale) {
108
+ return GameData.fromLoaded({ rawData, locale });
109
+ }
110
+ /**
111
+ * Internal: create and process from loaded data.
112
+ */
113
+ static fromLoaded(loaded) {
114
+ const gd = new GameData();
115
+ gd.processData(loaded.rawData, loaded.locale);
116
+ return gd;
117
+ }
118
+ // ── processData ─────────────────────────────────────────────
119
+ processData(rawData, locale) {
120
+ // 1. Merge all raw tables onto this instance
121
+ Object.assign(this, rawData);
122
+ // 2. Stash defaults
123
+ if (!this.info.stash) {
124
+ this.info.stash = { rows: 13, columns: 16 }; // Blizzless dimensions
125
+ }
126
+ // 3. Locale setup
127
+ this.locale = { strings: {}, istrings: [], stringi: {} };
128
+ for (let index = 0; index < locale.length; ++index) {
129
+ const entry = locale[index];
130
+ if (entry) {
131
+ this.locale.istrings[index] = entry[1];
132
+ this.locale.strings[entry[0]] = entry[1];
133
+ this.locale.stringi[entry[0]] = index;
134
+ }
135
+ }
136
+ // 4. itemStatCost priority reorder
137
+ this.reorderStatPriorities();
138
+ // 5. Generate staff mods
139
+ this.generateStaffMods();
140
+ // 6. Version filtering — SKIPPED for Blizzless v105 (always latest)
141
+ // (no GameVersion < 100 branch, no version filtering)
142
+ // 7. Magic prefix/suffix filter (keep version > 0, Blizzless GameVersion = 100)
143
+ this.magicPrefix = filterRows(this.magicPrefix, row => row.version > 0 && row.version <= 100);
144
+ this.magicSuffix = filterRows(this.magicSuffix, row => row.version > 0 && row.version <= 100);
145
+ // 8. Hireling filter (Blizzless uses version 100)
146
+ for (const id in this.hireling) {
147
+ const hirelings = this.hireling[id];
148
+ if (Array.isArray(hirelings)) {
149
+ this.hireling[id] =
150
+ hirelings.filter(row => row.version === 100);
151
+ }
152
+ }
153
+ // 9. Merged items dict
154
+ this.items = { ...this.armor, ...this.misc, ...this.weapons };
155
+ // 10. Merged mods dict
156
+ this.mods = {
157
+ ...this.autoMagic,
158
+ ...this.magicPrefix,
159
+ ...this.magicSuffix,
160
+ ...this.crafted,
161
+ ...this.qualityItems,
162
+ ...this.staffMods,
163
+ };
164
+ // 11. Mod fixups
165
+ this.fixupMods();
166
+ // 11b. Expand propertyGroups into mods (matches d2planner data/load.js).
167
+ // Each group `<name>` produces one mod per concrete option, keyed `<name>:<n>`.
168
+ if (this.propertyGroups) {
169
+ for (const [name, pg] of Object.entries(this.propertyGroups)) {
170
+ let v = 0;
171
+ for (let i = 1; i <= 8; i++) {
172
+ const prop = pg[`prop${i}`];
173
+ if (!prop)
174
+ continue;
175
+ const parmin = pg[`parmin${i}`];
176
+ const parmax = pg[`parmax${i}`];
177
+ const w = pg[`modmin${i}`];
178
+ const M = pg[`modmax${i}`];
179
+ if (parmin != null && parmax != null && parmin < parmax) {
180
+ for (let p = parmin; p <= parmax; p++) {
181
+ this.mods[`${name}:${++v}`] = {
182
+ name: `${name}:${v}`,
183
+ version: 100,
184
+ level: 1,
185
+ levelreq: 0,
186
+ mod1code: prop,
187
+ mod1param: p,
188
+ mod1min: w,
189
+ mod1max: M,
190
+ };
191
+ }
192
+ }
193
+ else {
194
+ this.mods[`${name}:${++v}`] = {
195
+ name: `${name}:${v}`,
196
+ version: 100,
197
+ level: 1,
198
+ levelreq: 0,
199
+ mod1code: prop,
200
+ mod1param: parmax,
201
+ mod1min: w,
202
+ mod1max: M,
203
+ };
204
+ }
205
+ }
206
+ }
207
+ }
208
+ // 12. Lookup maps
209
+ this.buildLookupMaps();
210
+ // 13. itemStatCost overrides
211
+ if (this.itemStatCost.item_extra_stack) {
212
+ this.itemStatCost.item_extra_stack.descfunc = 1;
213
+ this.itemStatCost.item_extra_stack.descval = 2;
214
+ }
215
+ if (this.itemStatCost.item_replenish_quantity) {
216
+ this.itemStatCost.item_replenish_quantity.descfunc = 99;
217
+ }
218
+ // 14. Locale patch
219
+ if (this.locale.strings.ModStre9vx) {
220
+ this.locale.strings.ModStre9vx = `${this.locale.strings.ModStre9vx} [1 in %d sec.]`;
221
+ }
222
+ }
223
+ // ── Processing helpers ──────────────────────────────────────
224
+ reorderStatPriorities() {
225
+ const statList = [];
226
+ for (const id in this.itemStatCost) {
227
+ const stat = this.itemStatCost[id];
228
+ let priority = (stat.descpriority || 0) + stat.id * 0.001;
229
+ if (id === 'item_magicbonus' || id === 'passive_cold_mastery' || id === 'passive_pois_mastery') {
230
+ priority += 0.1;
231
+ }
232
+ else if (id === 'item_preventheal' || id === 'item_replenish_durability') {
233
+ priority -= 0.1;
234
+ }
235
+ statList.push([id, priority]);
236
+ }
237
+ statList.sort((a, b) => a[1] - b[1]);
238
+ statList.forEach(([id], i) => { this.itemStatCost[id].descpriority = i; });
239
+ }
240
+ generateStaffMods() {
241
+ this.staffMods = {};
242
+ const staffILvl = { 1: 1, 6: 1, 12: 12, 18: 19, 24: 25, 30: 37 };
243
+ for (const id in this.skills) {
244
+ const skill = this.skills[id];
245
+ if (!skill.charclass || !staffILvl[skill.reqlevel ?? 0])
246
+ continue;
247
+ const mod = {
248
+ name: `staff${id}`,
249
+ version: skill.reqlevel === 30 ? 100 : 1,
250
+ rare: 1,
251
+ level: staffILvl[skill.reqlevel],
252
+ levelreq: skill.reqlevel,
253
+ classspecific: skill.charclass,
254
+ group: 600 + parseInt(id),
255
+ multiply: skill.costmult,
256
+ add: skill.costadd,
257
+ mod1code: 'skill',
258
+ mod1param: parseInt(id),
259
+ mod1min: 1,
260
+ mod1max: 3,
261
+ };
262
+ let itypes = 0;
263
+ for (const typeId in this.itemTypes) {
264
+ if (this.itemTypes[typeId].staffmods === skill.charclass) {
265
+ mod[`itype${++itypes}`] = typeId;
266
+ }
267
+ }
268
+ this.staffMods[`staff${id}`] = mod;
269
+ }
270
+ }
271
+ fixupMods() {
272
+ // Normalize sock/rep-quant mods
273
+ for (const mod of Object.values(this.mods)) {
274
+ if ((mod.mod1code === 'sock' || mod.mod1code === 'rep-quant') && mod.mod1param && !mod.mod1min && !mod.mod1max) {
275
+ mod.mod1min = mod.mod1param;
276
+ mod.mod1max = mod.mod1param;
277
+ delete mod.mod1param;
278
+ }
279
+ }
280
+ // Fix dmg-ac min/max inversion
281
+ for (const row of Object.values(this.mods)) {
282
+ for (let i = 1; i <= 5; i++)
283
+ fixmod(row, `mod${i}code`, `mod${i}min`, `mod${i}max`);
284
+ }
285
+ for (const row of Object.values(this.uniqueItems)) {
286
+ for (let i = 1; i <= 12; i++)
287
+ fixmod(row, `prop${i}`, `min${i}`, `max${i}`);
288
+ }
289
+ for (const row of Object.values(this.setItems)) {
290
+ for (let i = 1; i <= 9; i++)
291
+ fixmod(row, `prop${i}`, `min${i}`, `max${i}`);
292
+ for (let i = 1; i <= 5; i++) {
293
+ fixmod(row, `aprop${i}a`, `amin${i}a`, `amax${i}a`);
294
+ fixmod(row, `aprop${i}b`, `amin${i}b`, `amax${i}b`);
295
+ }
296
+ }
297
+ for (const row of Object.values(this.sets)) {
298
+ for (let i = 2; i <= 5; i++) {
299
+ fixmod(row, `pcode${i}a`, `pmin${i}a`, `pmax${i}a`);
300
+ fixmod(row, `pcode${i}b`, `pmin${i}b`, `pmax${i}b`);
301
+ }
302
+ for (let i = 1; i <= 8; i++)
303
+ fixmod(row, `fcode${i}`, `fmin${i}`, `fmax${i}`);
304
+ }
305
+ }
306
+ buildLookupMaps() {
307
+ this.skillByName = {};
308
+ for (const skill of Object.values(this.skills)) {
309
+ this.skillByName[skill.skill.toLowerCase()] = skill;
310
+ }
311
+ this.stateByName = {};
312
+ for (const state of Object.values(this.states)) {
313
+ this.stateByName[state.state.toLowerCase()] = state;
314
+ }
315
+ this.missileByName = {};
316
+ for (const missile of Object.values(this.missiles)) {
317
+ const m = missile;
318
+ if (m.srcdamage) {
319
+ m.srcdam = m.srcdamage;
320
+ delete m.srcdamage;
321
+ }
322
+ this.missileByName[missile.missile.toLowerCase()] = missile;
323
+ }
324
+ this.monsterById = [];
325
+ for (const monster of Object.values(this.monsters)) {
326
+ this.monsterById[monster.hcidx] = monster;
327
+ const m = monster;
328
+ if ((rawData => rawData)(this.monstersEx)) {
329
+ const monstersEx = this.monstersEx;
330
+ if (m.monstatsex && monstersEx[m.monstatsex]) {
331
+ Object.assign(monster, monstersEx[m.monstatsex]);
332
+ }
333
+ }
334
+ }
335
+ }
336
+ }
337
+ // ─── Utility functions ──────────────────────────────────────────
338
+ function filterRows(table, fn) {
339
+ const result = {};
340
+ for (const id in table) {
341
+ if (fn(table[id]))
342
+ result[id] = table[id];
343
+ }
344
+ return result;
345
+ }
346
+ function fixmod(row, prop, min, max) {
347
+ if (row[prop] === 'sock')
348
+ row.sockets = true;
349
+ if (row[prop] === 'dmg-ac' && row[min] > row[max]) {
350
+ const tmp = row[min];
351
+ row[min] = row[max];
352
+ row[max] = tmp;
353
+ }
354
+ }
355
+ //# sourceMappingURL=game-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-data.js","sourceRoot":"","sources":["../../src/game-data/game-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { GameData, type LocaleStore } from './game-data.js';
2
+ export { loadDataFromFile, loadDataFromJSON, type LocaleArray, type LoadedData } from './loader.js';
3
+ export type { RawGameData, BaseItemEntry, ArmorEntry, WeaponEntry, MiscEntry, ItemEntry, ItemStatCostEntry, ItemTypeEntry, UniqueItemEntry, SetItemEntry, SetEntry, RunewordEntry, MagicAffixEntry, GemEntry, SkillEntry, PropertyEntry, StateEntry, MonsterEntry, MissileEntry, HirelingEntry, CharStatEntry, RareAffixEntry, QualityItemEntry, GameInfo, GridDimensions, } from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/game-data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACpG,YAAY,EACV,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,eAAe,EACf,QAAQ,EACR,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { GameData } from './game-data.js';
2
+ export { loadDataFromFile, loadDataFromJSON } from './loader.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/game-data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAqC,MAAM,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * File-system loader for game data (data.json + strings.json).
3
+ * Reads from the local filesystem — no browser / HTTP dependencies.
4
+ */
5
+ import type { RawGameData } from './types.js';
6
+ /** Locale entry: [key, value] tuples array. */
7
+ export type LocaleArray = ([string, string] | null)[];
8
+ export interface LoadedData {
9
+ rawData: RawGameData;
10
+ locale: LocaleArray;
11
+ }
12
+ /**
13
+ * Load game data from the filesystem.
14
+ *
15
+ * @param dataPath Path to `data.json`.
16
+ * @param stringsPath Path to `strings.json` (locale array).
17
+ */
18
+ export declare function loadDataFromFile(dataPath: string, stringsPath: string): Promise<LoadedData>;
19
+ /**
20
+ * Load game data from pre-parsed objects (e.g. when data is already in memory).
21
+ */
22
+ export declare function loadDataFromJSON(rawData: RawGameData, locale: LocaleArray): LoadedData;
23
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/game-data/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBjG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,CAEtF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * File-system loader for game data (data.json + strings.json).
3
+ * Reads from the local filesystem — no browser / HTTP dependencies.
4
+ */
5
+ /**
6
+ * Load game data from the filesystem.
7
+ *
8
+ * @param dataPath Path to `data.json`.
9
+ * @param stringsPath Path to `strings.json` (locale array).
10
+ */
11
+ export async function loadDataFromFile(dataPath, stringsPath) {
12
+ // Lazy-load node builtins INSIDE the function so this module carries no
13
+ // top-level node: import. That keeps loader.ts import-safe in browser
14
+ // bundlers (Vite/Rollup/Webpack) — the node: deps resolve only at runtime
15
+ // when a Node consumer actually calls this (browser consumers use fromRaw).
16
+ const { readFile } = await import('node:fs/promises');
17
+ const { resolve } = await import('node:path');
18
+ const [rawText, localeText] = await Promise.all([
19
+ readFile(resolve(dataPath), 'utf-8'),
20
+ readFile(resolve(stringsPath), 'utf-8'),
21
+ ]);
22
+ const rawData = JSON.parse(rawText);
23
+ const locale = JSON.parse(localeText);
24
+ return { rawData, locale };
25
+ }
26
+ /**
27
+ * Load game data from pre-parsed objects (e.g. when data is already in memory).
28
+ */
29
+ export function loadDataFromJSON(rawData, locale) {
30
+ return { rawData, locale };
31
+ }
32
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/game-data/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,WAAmB;IAC1E,wEAAwE;IACxE,sEAAsE;IACtE,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACpC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;KACxC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAgB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB,EAAE,MAAmB;IACxE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}