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,627 @@
1
+ /**
2
+ * Item binary parser — reads items from D2R v105 save files.
3
+ *
4
+ * Ported from d2planner/src/logic/binary/index.js → createItemParser().
5
+ * Simplified: Blizzless v105 only (D2R=true, V105=true, version=105).
6
+ *
7
+ * Uses GameData instead of global Data singleton.
8
+ */
9
+ import { itemGetTypes, isSubType, presetItemIds } from '../items/item-types.js';
10
+ import { parseParamStats, parseUniqueStats as parseUniqueStatsHelper, parseRunewordStats as parseRunewordStatsHelper, parseModStats as parseModStatsHelper, } from '../items/item-stats-parser.js';
11
+ // ─── Constants ──────────────────────────────────────────────────
12
+ /** Maps the 4-bit quality field from the binary format to our Quality enum values. */
13
+ export const gameQualityMap = [0, 1, 2, 3, 4, 5, 6, 7, 8];
14
+ // Index: 0 1 2 3 4 5 6 7 8
15
+ // Quality: none, LOW, NORMAL, SUPERIOR, MAGIC, SET, RARE, UNIQUE, CRAFTED
16
+ const QUALITY_LOW = 1;
17
+ const QUALITY_NORMAL = 2;
18
+ const QUALITY_SUPERIOR = 3;
19
+ const QUALITY_MAGIC = 4;
20
+ const QUALITY_SET = 5;
21
+ const QUALITY_RARE = 6;
22
+ const QUALITY_UNIQUE = 7;
23
+ const QUALITY_CRAFTED = 8;
24
+ const QUALITY_RUNEWORD = 9;
25
+ /** Maps body slot indices to slot names. */
26
+ const bodyMap = [
27
+ null, 'head', 'neck', 'tors', 'rarm', 'larm',
28
+ 'rrin', 'lrin', 'belt', 'feet', 'glov', 'rarm2', 'larm2',
29
+ ];
30
+ /** Zero-pad a number to 3 digits (for mod IDs like "mp001"). */
31
+ function mkid(n) {
32
+ return n.toString().padStart(3, '0');
33
+ }
34
+ /**
35
+ * Stats followed by N consecutive stat IDs in the binary stream.
36
+ * (e.g. item_maxdamage_percent followed by 1 stat, coldmindam by 2.)
37
+ */
38
+ const followStats = {
39
+ item_maxdamage_percent: 1,
40
+ firemindam: 1,
41
+ lightmindam: 1,
42
+ magicmindam: 1,
43
+ coldmindam: 2,
44
+ poisonmindam: 2,
45
+ };
46
+ // ─── extractValuesFromStats (fallback for unique/set/runeword) ──
47
+ /**
48
+ * Build a `uniqueValues` array by walking a unique/set/runeword definition
49
+ * and filling each `prop_i` slot from the item's actual binary stats.
50
+ *
51
+ * Used as a fallback when parseUniqueStats / parseRunewordStats can't solve.
52
+ * For propertyGroups (pg) props, the picked option index is captured in
53
+ * `propertyIndex[propName]` so the writer / tooltip can recover the option.
54
+ */
55
+ function extractValuesFromStats(gd, def, codeKey, maxKey, binaryStats) {
56
+ if (!def)
57
+ return null;
58
+ const result = [];
59
+ const propertyIndex = {};
60
+ for (let i = 1; i <= 12; i++) {
61
+ const prop = def[codeKey + i];
62
+ if (!prop)
63
+ continue;
64
+ const pg = gd.propertyGroups?.[prop];
65
+ if (pg) {
66
+ let foundOptIdx = 0;
67
+ let foundValue = def[maxKey + i] ?? 0;
68
+ for (let j = 1; gd.mods[`${prop}:${j}`]; j++) {
69
+ const m = gd.mods[`${prop}:${j}`];
70
+ const baseStat = gd.properties[m.mod1code]?.stat1;
71
+ const key = m.mod1param != null ? `${baseStat}#${m.mod1param}` : baseStat;
72
+ if (baseStat && key != null && binaryStats[key] != null) {
73
+ foundOptIdx = j - 1;
74
+ const raw = binaryStats[key];
75
+ foundValue = typeof raw === 'object'
76
+ ? (raw.min + raw.max) >> 1
77
+ : raw;
78
+ break;
79
+ }
80
+ }
81
+ propertyIndex[prop] = foundOptIdx;
82
+ result.push(foundValue);
83
+ continue;
84
+ }
85
+ const statName = gd.properties[prop]?.stat1;
86
+ const tmax = def[maxKey + i] ?? 0;
87
+ let val = (statName && binaryStats[statName] != null
88
+ ? binaryStats[statName]
89
+ : tmax);
90
+ val = typeof val === 'object'
91
+ ? ((val.min + val.max) >> 1)
92
+ : val;
93
+ result.push(tmax > 0 ? Math.min(val, tmax) : val);
94
+ }
95
+ return { values: result, propertyIndex };
96
+ }
97
+ // ─── Stat helper ────────────────────────────────────────────────
98
+ /**
99
+ * Add a stat value to the stats accumulator.
100
+ * Handles special cases: skill-on-event encoding, addclass/single/aura skill params, enhanced damage max.
101
+ */
102
+ function addStat(stats, stat, param, value) {
103
+ let param2;
104
+ switch (stat) {
105
+ case 'item_skillonattack':
106
+ case 'item_skillonkill':
107
+ case 'item_skillondeath':
108
+ case 'item_skillonhit':
109
+ case 'item_skillonlevelup':
110
+ case 'item_skillongethit':
111
+ param2 = value;
112
+ value = param & 63;
113
+ param = param >> 6;
114
+ stat = `${stat}#${param}#${param2}`;
115
+ break;
116
+ case 'item_charged_skill':
117
+ value = value >> 8;
118
+ param2 = param & 63;
119
+ param = param >> 6;
120
+ stat = `${stat}#${param}#${param2}`;
121
+ break;
122
+ case 'item_addclassskills':
123
+ case 'item_nonclassskill':
124
+ case 'state':
125
+ case 'item_singleskill':
126
+ case 'item_elemskill':
127
+ case 'item_aura':
128
+ case 'item_reanimate':
129
+ stat = `${stat}#${param}`;
130
+ break;
131
+ case 'item_addskill_tab':
132
+ param = (param >> 3) * 3 + (param & 7);
133
+ stat = `${stat}#${param}`;
134
+ break;
135
+ }
136
+ // Enhanced damage workaround: follow stats can read item_mindamage_percent
137
+ // twice; summing would double-count. Use Math.max.
138
+ if (stat === 'item_mindamage_percent' || stat === 'item_maxdamage_percent') {
139
+ stats[stat] = Math.max(stats[stat] || 0, value);
140
+ return;
141
+ }
142
+ stats[stat] = (stats[stat] || 0) + value;
143
+ }
144
+ // ─── createItemParser ───────────────────────────────────────────
145
+ /**
146
+ * Create a parser context for reading items from a BinaryReader.
147
+ * V105 only — no version branching.
148
+ *
149
+ * @param reader BinaryReader positioned before item data
150
+ * @param gd GameData instance
151
+ * @param initialId Starting item ID (default 0)
152
+ * @param options Parser options
153
+ */
154
+ export function createItemParser(reader, gd, initialId = 0, options) {
155
+ const forceStackable = options?.forceStackable ?? false;
156
+ const items = {};
157
+ let itemId = initialId;
158
+ let listError = null;
159
+ // Build stat map: numeric id → stat key
160
+ const statMap = new Map();
161
+ for (const key in gd.itemStatCost) {
162
+ statMap.set(gd.itemStatCost[key].id, key);
163
+ }
164
+ function getStatInfo(stat) {
165
+ return gd.itemStatCost[stat] || {};
166
+ }
167
+ function itemTypeTreeFilter(type) {
168
+ const tradeableTypes = [
169
+ 'helm', 'tors', 'glov', 'boot', 'belt', 'shld',
170
+ 'amul', 'ring', 'jewl', 'char',
171
+ 'mele', 'miss', 'orb', 'comb',
172
+ ];
173
+ return tradeableTypes.some(t => isSubType(gd, type, t));
174
+ }
175
+ const stashColumns = gd.info?.stash?.columns || 16;
176
+ function parseItem(idIn, handler) {
177
+ const startBit = reader.bitpos;
178
+ // ── Flags (35 bits, D2R v105) ─────────────────────────────
179
+ reader.skipbits(4);
180
+ const unidentified = !reader.bits(1);
181
+ reader.skipbits(6);
182
+ const socketed = !!reader.bits(1);
183
+ reader.skipbits(4);
184
+ const ear = !!reader.bits(1);
185
+ reader.skipbits(4);
186
+ const simple = !!reader.bits(1);
187
+ const ethereal = !!reader.bits(1);
188
+ reader.skipbits(1);
189
+ const personalized = !!reader.bits(1);
190
+ reader.skipbits(1);
191
+ const runeword = !!reader.bits(1);
192
+ // D2R: 1 unk + 1 extras flag + 6 unk
193
+ reader.skipbits(1);
194
+ const extras = reader.bits(1);
195
+ reader.skipbits(6);
196
+ const item = {
197
+ itemId: typeof idIn === 'number' ? idIn : 0,
198
+ unidentified,
199
+ ethereal,
200
+ socketed,
201
+ sockets: 0,
202
+ socketedItems: [],
203
+ stats: {},
204
+ binaryOffset: { start: startBit, end: 0 },
205
+ };
206
+ // ── Location ──────────────────────────────────────────────
207
+ const location = reader.bits(3);
208
+ const bodyloc = reader.bits(4);
209
+ const invcol = reader.bits(4);
210
+ const invrow = reader.bits(4);
211
+ const storage = reader.bits(3);
212
+ // ── Ear item ──────────────────────────────────────────────
213
+ if (ear) {
214
+ const earClass = reader.bits(3);
215
+ const earLevel = reader.bits(7);
216
+ const nameBytes = [];
217
+ let ch;
218
+ while ((ch = reader.bits(7)))
219
+ nameBytes.push(ch);
220
+ const earName = String.fromCharCode(...nameBytes);
221
+ item.ear = { class: earClass, level: earLevel, name: earName };
222
+ item.base = 'ear';
223
+ item.quality = QUALITY_NORMAL;
224
+ reader.align();
225
+ item.binaryOffset.end = reader.bitpos;
226
+ const earId = typeof idIn === 'number' ? idIn : 0;
227
+ items[earId] = item;
228
+ emitLocation(earId, location, bodyloc, storage, invrow, invcol, item, handler);
229
+ return;
230
+ }
231
+ // ── Item code (Huffman: 3 letters + space) ────────────────
232
+ const basea = reader.char();
233
+ const baseb = reader.char();
234
+ const basec = reader.char();
235
+ const based = reader.char();
236
+ if (based !== ' ')
237
+ throw Error(`invalid item code`);
238
+ const baseId = basea + baseb + basec;
239
+ // Unknown bases are tolerated (parsed as generic) to match d2planner-HEAD.
240
+ item.base = baseId;
241
+ const base = (gd.items[baseId] || {});
242
+ let socketedItemsCount = 0;
243
+ if (simple) {
244
+ // socketed-count is 1-bit for simple items (always 0 in practice)
245
+ socketedItemsCount = reader.bits(1);
246
+ item.quality = QUALITY_NORMAL;
247
+ }
248
+ else {
249
+ socketedItemsCount = reader.bits(3);
250
+ const types = itemGetTypes(gd, baseId);
251
+ reader.skipbits(32); // item ID
252
+ item.ilvl = reader.bits(7);
253
+ const qualityRaw = gameQualityMap[reader.bits(4)];
254
+ item.quality = runeword ? QUALITY_RUNEWORD : qualityRaw;
255
+ if (reader.bits(1)) {
256
+ item.iconIndex = reader.bits(3);
257
+ }
258
+ const mods = [];
259
+ if (reader.bits(1)) {
260
+ mods.push(`am${mkid(reader.bits(11))}`);
261
+ }
262
+ let modid;
263
+ switch (qualityRaw) {
264
+ case QUALITY_LOW:
265
+ reader.skipbits(3);
266
+ break;
267
+ case QUALITY_NORMAL:
268
+ if (types.has('char'))
269
+ reader.skipbits(12);
270
+ break;
271
+ case QUALITY_SUPERIOR:
272
+ mods.push(`qm${mkid(reader.bits(3))}`);
273
+ mods.pop(); // too many mismatches (mirrors d2planner)
274
+ break;
275
+ case QUALITY_MAGIC: {
276
+ const p = reader.bits(11);
277
+ if (p) {
278
+ const c = `mp${mkid(p)}`;
279
+ mods.push(c);
280
+ item.magicPrefixCode = c;
281
+ (item.prefixCodes ??= []).push(c);
282
+ }
283
+ const s = reader.bits(11);
284
+ if (s) {
285
+ const c = `ms${mkid(s)}`;
286
+ mods.push(c);
287
+ item.magicSuffixCode = c;
288
+ (item.suffixCodes ??= []).push(c);
289
+ }
290
+ break;
291
+ }
292
+ case QUALITY_SET:
293
+ item.unique = `set${mkid(reader.bits(12))}`;
294
+ break;
295
+ case QUALITY_UNIQUE:
296
+ item.unique = `unique${mkid(reader.bits(12))}`;
297
+ break;
298
+ case QUALITY_RARE:
299
+ case QUALITY_CRAFTED: {
300
+ const name1 = gd.rarePrefix[reader.bits(8) - 156]?.name;
301
+ const name2 = gd.rareSuffix[reader.bits(8) - 1]?.name;
302
+ item.name = `${gd.locale.strings[name1] || name1 || ''} ${gd.locale.strings[name2] || name2 || ''}`.trim();
303
+ // Up to 3 prefix + 3 suffix affix ids, interleaved. Capture every one into ordered
304
+ // code arrays so the backend can fill the Prefix/Suffix NAME slots (the stats stay flat
305
+ // in lot.mods — affixes are never re-attributed). magicPrefix/SuffixCode stay unset for
306
+ // rares (multi-affix), so single-code consumers must read prefixCodes/suffixCodes.
307
+ const pushPrefix = () => { const c = `mp${mkid(reader.bits(11))}`; mods.push(c); (item.prefixCodes ??= []).push(c); };
308
+ const pushSuffix = () => { const c = `ms${mkid(reader.bits(11))}`; mods.push(c); (item.suffixCodes ??= []).push(c); };
309
+ if (reader.bits(1))
310
+ pushPrefix();
311
+ if (reader.bits(1))
312
+ pushSuffix();
313
+ if (reader.bits(1))
314
+ pushPrefix();
315
+ if (reader.bits(1))
316
+ pushSuffix();
317
+ if (reader.bits(1))
318
+ pushPrefix();
319
+ if (reader.bits(1))
320
+ pushSuffix();
321
+ break;
322
+ }
323
+ }
324
+ if (runeword) {
325
+ let rwid = reader.bits(12);
326
+ // Eye() mapping (maxroll): stored D2S runeword ID → sequential index.
327
+ if (rwid === 2718)
328
+ rwid = 48;
329
+ else if (rwid > 3194)
330
+ rwid -= 3194;
331
+ else if (rwid > 2869)
332
+ rwid -= 2869;
333
+ else if (rwid > 2588)
334
+ rwid -= 2588;
335
+ item.unique = `runeword${mkid(rwid)}`;
336
+ reader.skipbits(4);
337
+ }
338
+ if (personalized) {
339
+ const bytes = [];
340
+ let chr;
341
+ while ((chr = reader.bits(8)))
342
+ bytes.push(chr);
343
+ item.personalized = String.fromCharCode(...bytes);
344
+ }
345
+ if (types.has('book')) {
346
+ reader.skipbits(5);
347
+ }
348
+ // D2R extended section flag
349
+ if (reader.bits(1)) {
350
+ reader.skipbits(types.has('misc') ? 128 : 3);
351
+ }
352
+ // ── Armor defense ─────────────────────────────────────
353
+ if (types.has('armo')) {
354
+ let minac = reader.bits(11) - 10;
355
+ let maxac = minac;
356
+ if (item.ethereal) {
357
+ minac = Math.ceil(minac / 1.5);
358
+ maxac = Math.ceil((maxac + 1) / 1.5) - 1;
359
+ }
360
+ const baseMaxAc = 'maxac' in base ? base.maxac : 0;
361
+ const baseMinAc = 'minac' in base ? base.minac : 0;
362
+ if (minac <= baseMaxAc + 1 && maxac >= baseMinAc) {
363
+ item.defense = (Math.max(minac, baseMinAc) + Math.min(maxac, baseMaxAc + 1)) >> 1;
364
+ }
365
+ else {
366
+ const minac2 = Math.ceil(minac / 1.5);
367
+ const maxac2 = Math.ceil((maxac + 1) / 1.5) - 1;
368
+ if (minac <= baseMaxAc && maxac >= baseMinAc) {
369
+ item.defense = (Math.max(minac2, baseMinAc) + Math.min(maxac2, baseMaxAc)) >> 1;
370
+ item.ethbugged = true;
371
+ }
372
+ else {
373
+ item.defense = (minac + maxac) >> 1;
374
+ }
375
+ }
376
+ }
377
+ // ── Durability ────────────────────────────────────────
378
+ if (types.has('weap') || types.has('armo')) {
379
+ if (reader.bits(8))
380
+ reader.skipbits(9);
381
+ }
382
+ // ── V105 pre-stats quantity (1-bit flag + 9-bit value) ─
383
+ if (reader.bits(1)) {
384
+ item.quantity = reader.bits(9);
385
+ }
386
+ else if (forceStackable && !types.has('ques')) {
387
+ // legacy fixture path — V105 never enters here
388
+ }
389
+ if (socketed)
390
+ item.sockets = reader.bits(4);
391
+ // ── Set flags ─────────────────────────────────────────
392
+ const setflags = (qualityRaw === QUALITY_SET ? reader.bits(5) : 0);
393
+ if (setflags)
394
+ item.setflags = setflags;
395
+ // ── Stats ─────────────────────────────────────────────
396
+ const stats = {};
397
+ function parseStats() {
398
+ // eslint-disable-next-line no-constant-condition
399
+ while (true) {
400
+ let id = reader.bits(9);
401
+ if (id === 511)
402
+ break;
403
+ const stat = statMap.get(id);
404
+ if (!stat)
405
+ throw Error(`unknown item stat code ${id}`);
406
+ const info = getStatInfo(stat);
407
+ if (!info)
408
+ throw Error(`unknown item stat code ${id}`);
409
+ const param = info.saveparambits ? reader.bits(info.saveparambits) : 0;
410
+ const value = reader.bits(info.savebits ?? 0) - (info.saveadd || 0);
411
+ addStat(stats, stat, param, value);
412
+ let follow = followStats[stat] || 0;
413
+ while (follow--) {
414
+ const followStat = statMap.get(++id);
415
+ if (!followStat)
416
+ break;
417
+ const followInfo = getStatInfo(followStat) || {};
418
+ const followParam = followInfo.saveparambits ? reader.bits(followInfo.saveparambits) : 0;
419
+ const followValue = reader.bits(followInfo.savebits ?? 0) - (followInfo.saveadd || 0);
420
+ addStat(stats, followStat, followParam, followValue);
421
+ }
422
+ }
423
+ }
424
+ parseStats();
425
+ if (setflags & 1)
426
+ parseStats();
427
+ if (setflags & 2)
428
+ parseStats();
429
+ if (setflags & 4)
430
+ parseStats();
431
+ if (setflags & 8)
432
+ parseStats();
433
+ if (setflags & 16)
434
+ parseStats();
435
+ if (runeword)
436
+ parseStats();
437
+ // Damage stat consolidation
438
+ if (stats.mindamage || stats.secondary_mindamage || stats.item_throw_mindamage) {
439
+ stats.mindamage = Math.max(...[stats.mindamage, stats.secondary_mindamage, stats.item_throw_mindamage].filter(Boolean));
440
+ delete stats.secondary_mindamage;
441
+ delete stats.item_throw_mindamage;
442
+ }
443
+ if (stats.maxdamage || stats.secondary_maxdamage || stats.item_throw_maxdamage) {
444
+ stats.maxdamage = Math.max(...[stats.maxdamage, stats.secondary_maxdamage, stats.item_throw_maxdamage].filter(Boolean));
445
+ delete stats.secondary_maxdamage;
446
+ delete stats.item_throw_maxdamage;
447
+ }
448
+ item.stats = stats;
449
+ // ── Resolve mod sources ───────────────────────────────
450
+ const getStats = (src) => parseParamStats(gd, stats, src);
451
+ if (item.quality === QUALITY_SET || item.quality === QUALITY_UNIQUE) {
452
+ const parsed = parseUniqueStatsHelper(gd, item, getStats);
453
+ if (parsed) {
454
+ item.uniqueValues = parsed.uniqueValues;
455
+ if (parsed.propertyIndex && Object.keys(parsed.propertyIndex).length) {
456
+ item.propertyIndex = parsed.propertyIndex;
457
+ }
458
+ }
459
+ else {
460
+ const def = (gd.uniqueItems[item.unique] || gd.setItems[item.unique]);
461
+ const extracted = extractValuesFromStats(gd, def, 'prop', 'max', stats);
462
+ if (extracted) {
463
+ item.uniqueValues = extracted.values;
464
+ if (Object.keys(extracted.propertyIndex).length)
465
+ item.propertyIndex = extracted.propertyIndex;
466
+ }
467
+ }
468
+ }
469
+ else if (item.quality === QUALITY_RUNEWORD) {
470
+ const parsed = parseRunewordStatsHelper(gd, item, null, getStats, mods);
471
+ if (parsed) {
472
+ Object.assign(item, parsed);
473
+ }
474
+ else {
475
+ const def = gd.runes[item.unique];
476
+ const extracted = extractValuesFromStats(gd, def, 't1code', 't1max', stats);
477
+ if (extracted)
478
+ item.uniqueValues = extracted.values;
479
+ }
480
+ }
481
+ else {
482
+ // Type-mismatch guard: if any magic prefix/suffix is unknown or out of
483
+ // type tree, skip the solver (it'd otherwise yield garbage) and mark custom.
484
+ const hasMismatch = mods.some(mid => {
485
+ const isPfx = mid.startsWith('mp'), isSfx = mid.startsWith('ms');
486
+ if (!isPfx && !isSfx)
487
+ return false;
488
+ const modDef = isPfx
489
+ ? gd.magicPrefix[mid]
490
+ : gd.magicSuffix[mid];
491
+ if (!modDef)
492
+ return true;
493
+ const itypes = [modDef.itype1, modDef.itype2, modDef.itype3, modDef.itype4]
494
+ .filter(Boolean);
495
+ return itypes.length > 0 && !itypes.some(t => types.has(t));
496
+ });
497
+ if (hasMismatch) {
498
+ item.mods = {};
499
+ item.custom = true;
500
+ }
501
+ else {
502
+ // The brute-force affix solver can THROW on Blizzless data (e.g. a missing mod table
503
+ // like `crafted`, or an unhandled staffmod). A throw here used to abort the WHOLE
504
+ // item list (one bad item hid every item after it). Treat any solver failure as
505
+ // "unsolved" → the item keeps its raw stats (the backend rebuilds mods from those),
506
+ // it just isn't marked with reconstructed affixes.
507
+ let parsed = null;
508
+ try {
509
+ parsed = parseModStatsHelper(gd, item, null, null, null, getStats, mods);
510
+ }
511
+ catch {
512
+ parsed = null;
513
+ }
514
+ if (parsed) {
515
+ Object.assign(item, parsed);
516
+ }
517
+ else {
518
+ item.mods = mods.length ? {} : undefined;
519
+ if (Object.keys(stats).length)
520
+ item.custom = true;
521
+ }
522
+ }
523
+ }
524
+ // Blunt weapon undead damage bonus
525
+ if (types.has('blun')) {
526
+ stats.item_undeaddamage_percent = (stats.item_undeaddamage_percent || 0) + 50;
527
+ }
528
+ }
529
+ // ── Post-stats: D2R extras + chronicle + V105 quantity ───
530
+ if (extras) {
531
+ reader.skipbits(52);
532
+ // Blizzless: SET/UNIQUE/RUNEWORD items carry an extra 64-bit
533
+ // chronicle-tracking field after the extras block.
534
+ if (item.quality === QUALITY_SET || item.quality === QUALITY_UNIQUE || item.quality === QUALITY_RUNEWORD) {
535
+ reader.skipbits(64);
536
+ }
537
+ }
538
+ // V105: post-stats quantity (1-bit flag + 8-bit value).
539
+ if (reader.bits(1))
540
+ item.quantity = reader.bits(8);
541
+ reader.align();
542
+ item.binaryOffset.end = reader.bitpos;
543
+ // ── Socketed sub-items (recursive) ────────────────────────
544
+ if (socketedItemsCount > 0) {
545
+ item.socketedItems = [];
546
+ for (let i = 0; i < socketedItemsCount; ++i) {
547
+ parseItem(itemId++, (sockId) => {
548
+ // Preset items (runes/gems) emit their base code as id; non-preset
549
+ // sub-items emit numeric ids. Both are valid.
550
+ item.socketedItems.push(sockId);
551
+ });
552
+ }
553
+ }
554
+ // ── Validate / store / emit ───────────────────────────────
555
+ if (item.unique && !(gd.uniqueItems[item.unique] || gd.setItems[item.unique] || gd.runes[item.unique])) {
556
+ // Unknown unique/set/runeword: drop without registering, but the stream
557
+ // has already been consumed correctly via socketed-item recursion above.
558
+ return;
559
+ }
560
+ let effectiveId = idIn;
561
+ if (presetItemIds.has(item.base) && !item.unique) {
562
+ // Preset items (runes, gems, potions, etc.) are keyed by their base code
563
+ // so the items dict can identify them by type. This matches the d2r-saver
564
+ // convention and lets callers find e.g. r01 via items['r01'].
565
+ effectiveId = item.base;
566
+ items[effectiveId] = item;
567
+ }
568
+ else if ((gd.items[item.base] && itemTypeTreeFilter(gd.items[item.base].type)) ||
569
+ item.unique ||
570
+ location === 6) {
571
+ items[effectiveId] = item;
572
+ }
573
+ else {
574
+ return;
575
+ }
576
+ emitLocation(effectiveId, location, bodyloc, storage, invrow, invcol, item, handler);
577
+ }
578
+ function emitLocation(id, location, bodyloc, storage, invrow, invcol, item, handler) {
579
+ switch (location) {
580
+ case 0:
581
+ case 4: // Blizzless: crafting materials (e.g. Ingot) use location 4 with storage 5
582
+ if (storage === 1)
583
+ handler(id, 'inventory', invrow * 10 + invcol, item);
584
+ if (storage === 4)
585
+ handler(id, 'cube', invrow * 3 + invcol, item);
586
+ if (storage === 5)
587
+ handler(id, 'stash', invrow * stashColumns + invcol, item);
588
+ break;
589
+ case 1:
590
+ if (bodyMap[bodyloc])
591
+ handler(id, 'body', bodyMap[bodyloc], item);
592
+ break;
593
+ case 2:
594
+ handler(id, 'belt', invcol, item);
595
+ break;
596
+ case 6:
597
+ handler(id);
598
+ break;
599
+ }
600
+ }
601
+ function parseItemList(handler) {
602
+ if (reader.read16() !== 0x4d4a)
603
+ throw Error('invalid item table header');
604
+ const count = reader.read16();
605
+ for (let i = 0; i < count; ++i) {
606
+ try {
607
+ parseItem(itemId++, handler);
608
+ }
609
+ catch (e) {
610
+ listError = `item ${i + 1}/${count}: ${e.message}`;
611
+ break;
612
+ }
613
+ }
614
+ }
615
+ function nextId() {
616
+ return itemId++;
617
+ }
618
+ return {
619
+ parseItem,
620
+ parseItemList,
621
+ items,
622
+ nextId,
623
+ get currentId() { return itemId; },
624
+ get error() { return listError; },
625
+ };
626
+ }
627
+ //# sourceMappingURL=item-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-parser.js","sourceRoot":"","sources":["../../src/formats/item-parser.ts"],"names":[],"mappings":"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"}