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,55 @@
1
+ /**
2
+ * Item binary writer — writes items to D2R v105 save format.
3
+ *
4
+ * Ported from d2planner/src/logic/binary/writed2s.js →
5
+ * writeItem(), writeItemList(), writeItemStats().
6
+ * Simplified: Blizzless v105 only (D2R=true, V105=true).
7
+ *
8
+ * Uses GameData instead of global Data/Locale singletons.
9
+ */
10
+ import { GameData } from '../game-data/game-data.js';
11
+ import type { BinaryParsedItem } from './item-parser.js';
12
+ /** Location descriptor for an item being written. */
13
+ export interface ItemWriteLocation {
14
+ /** 3-bit location type (0=stored, 1=equipped, 2=belt, 6=socketed). */
15
+ loc: number;
16
+ /** 4-bit body slot for equipped, 0 otherwise. */
17
+ equip: number;
18
+ /** Grid column (x). */
19
+ x: number;
20
+ /** Grid row (y). */
21
+ y: number;
22
+ /** 3-bit storage type (0=none, 1=inventory, 3(cube in d2planner)→4(cube), 5=stash). */
23
+ storage: number;
24
+ }
25
+ /** An item entry to be written. */
26
+ export interface ItemWriteEntry {
27
+ item: BinaryParsedItem;
28
+ location: ItemWriteLocation;
29
+ }
30
+ /**
31
+ * Write a JM-prefixed item list.
32
+ *
33
+ * Takes an array of item entries (item + location) and all items
34
+ * (for socketed item lookups). Returns the raw bytes.
35
+ */
36
+ export declare function writeItemList(entries: ItemWriteEntry[], allItems: Record<number | string, BinaryParsedItem>, gd: GameData): Uint8Array;
37
+ /**
38
+ * Write a single item to binary format.
39
+ *
40
+ * Returns raw bytes for the item (includes socketed sub-items).
41
+ */
42
+ export declare function writeItem(item: BinaryParsedItem, loc: ItemWriteLocation, allItems: Record<number | string, BinaryParsedItem>, gd: GameData): Uint8Array;
43
+ /**
44
+ * Build write entries from a profile's inventory layout (stash, inventory, cube, belt, body, merc).
45
+ * This collects items from their slots and prepares them for writeItemList().
46
+ */
47
+ export declare function buildWriteEntries(profile: {
48
+ items?: Record<string, number | string>;
49
+ mercItems?: Record<string, number | string>;
50
+ inventory?: (number | string | undefined)[];
51
+ cube?: (number | string | undefined)[];
52
+ stash?: (number | string | undefined)[];
53
+ belt?: (number | string | undefined)[];
54
+ }, allItems: Record<number | string, BinaryParsedItem>, gd: GameData, merc?: boolean): ItemWriteEntry[];
55
+ //# sourceMappingURL=item-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-writer.d.ts","sourceRoot":"","sources":["../../src/formats/item-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAqCzD,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,oBAAoB;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAID;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EAAE,EACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,gBAAgB,CAAC,EACnD,EAAE,EAAE,QAAQ,GACX,UAAU,CASZ;AAID;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,gBAAgB,EACtB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,gBAAgB,CAAC,EACnD,EAAE,EAAE,QAAQ,GACX,UAAU,CAiLZ;AAwRD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACvC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACxC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;CACxC,EACD,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,gBAAgB,CAAC,EACnD,EAAE,EAAE,QAAQ,EACZ,IAAI,UAAQ,GACX,cAAc,EAAE,CAmElB"}
@@ -0,0 +1,514 @@
1
+ /**
2
+ * Item binary writer — writes items to D2R v105 save format.
3
+ *
4
+ * Ported from d2planner/src/logic/binary/writed2s.js →
5
+ * writeItem(), writeItemList(), writeItemStats().
6
+ * Simplified: Blizzless v105 only (D2R=true, V105=true).
7
+ *
8
+ * Uses GameData instead of global Data/Locale singletons.
9
+ */
10
+ import { BitWriter } from '../core/binary-writer.js';
11
+ import { presetItemIds, itemGetTypes } from '../items/item-types.js';
12
+ import { modsToStats, runewordStats } from '../items/item.js';
13
+ // ─── Constants ──────────────────────────────────────────────────
14
+ /** Reverse map: body slot name → numeric location index. */
15
+ const bodyLocMap = {
16
+ head: 1, neck: 2, tors: 3, rarm: 4, larm: 5,
17
+ rrin: 6, lrin: 7, belt: 8, feet: 9, glov: 10,
18
+ rarm2: 11, larm2: 12,
19
+ };
20
+ /** Quality enum → file quality code (4-bit field). */
21
+ const qualityToFileBits = {
22
+ 1: 1, // LOW
23
+ 2: 2, // NORMAL
24
+ 3: 3, // SUPERIOR
25
+ 4: 4, // MAGIC
26
+ 5: 5, // SET
27
+ 6: 6, // RARE
28
+ 7: 7, // UNIQUE
29
+ 8: 8, // CRAFTED
30
+ };
31
+ /** Stats that require consecutive follow-up stat writes. */
32
+ const followStats = {
33
+ item_maxdamage_percent: 1,
34
+ firemindam: 1,
35
+ lightmindam: 1,
36
+ magicmindam: 1,
37
+ coldmindam: 2,
38
+ poisonmindam: 2,
39
+ };
40
+ // ─── writeItemList ──────────────────────────────────────────────
41
+ /**
42
+ * Write a JM-prefixed item list.
43
+ *
44
+ * Takes an array of item entries (item + location) and all items
45
+ * (for socketed item lookups). Returns the raw bytes.
46
+ */
47
+ export function writeItemList(entries, allItems, gd) {
48
+ const writer = new BitWriter();
49
+ writer.writeString('JM', 2);
50
+ writer.writeUInt16(entries.length);
51
+ for (const e of entries) {
52
+ const bytes = writeItem(e.item, e.location, allItems, gd);
53
+ writer.writeBytes(bytes, bytes.length * 8);
54
+ }
55
+ return writer.toArray();
56
+ }
57
+ // ─── writeItem ──────────────────────────────────────────────────
58
+ /**
59
+ * Write a single item to binary format.
60
+ *
61
+ * Returns raw bytes for the item (includes socketed sub-items).
62
+ */
63
+ export function writeItem(item, loc, allItems, gd) {
64
+ const writer = new BitWriter();
65
+ // Determine simple flag from item type (matches maxroll behaviour): potions,
66
+ // gems, scrolls, runes have no stat block.
67
+ const baseTypes = itemGetTypes(gd, item.base);
68
+ const isSimple = !!item.ear
69
+ || isItemSimple(item)
70
+ || baseTypes.has('poti') || baseTypes.has('gem')
71
+ || baseTypes.has('scro') || baseTypes.has('rune');
72
+ const runeword = item.unique?.startsWith('runeword') ?? false;
73
+ /**
74
+ * A runeword struck on a superior base — d2planner writes quality=3 (SUPERIOR)
75
+ * + the 3-bit superior mod, instead of quality=2 (NORMAL).
76
+ */
77
+ const isSuperiorBase = runeword && item.superior != null;
78
+ // ═══════════ FLAGS (35 bits) ═══════════
79
+ writeZeroBits(writer, 4);
80
+ writer.writeBit(item.unidentified ? 0 : 1); // identified
81
+ writeZeroBits(writer, 6);
82
+ writer.writeBit(item.sockets > 0 ? 1 : 0); // socketed
83
+ writeZeroBits(writer, 4);
84
+ writer.writeBit(item.ear ? 1 : 0); // ear
85
+ writeZeroBits(writer, 4);
86
+ writer.writeBit(isSimple ? 1 : 0); // simple
87
+ writer.writeBit(item.ethereal ? 1 : 0); // ethereal
88
+ writer.writeBit(1); // justsaved = 1
89
+ writer.writeBit(item.personalized ? 1 : 0); // personalized
90
+ writer.writeBit(0); // unknown
91
+ writer.writeBit(runeword ? 1 : 0); // runeword
92
+ writeZeroBits(writer, 5); // remaining unknown bits
93
+ // v105: 3 bits after flags
94
+ writer.writeUInt16(0b101, 3);
95
+ // ═══════════ LOCATION (18 bits) ═══════════
96
+ writer.writeUInt8(loc.loc, 3);
97
+ writer.writeUInt8(loc.equip, 4);
98
+ writer.writeUInt8(loc.x, 4);
99
+ writer.writeUInt8(loc.y, 4);
100
+ writer.writeUInt8(loc.storage, 3);
101
+ // ═══════════ BASE CODE (Huffman) ═══════════
102
+ const baseStr = item.base + ' ';
103
+ for (const ch of baseStr) {
104
+ writer.writeChar(ch);
105
+ }
106
+ // ═══════════ SOCKETED COUNT ═══════════
107
+ const socketedCount = item.socketedItems?.filter(Boolean).length || 0;
108
+ writer.writeUInt8(socketedCount, isSimple ? 1 : 3);
109
+ // ═══════════ COMPLEX ITEM FIELDS (skipped for simple) ═══════════
110
+ if (isSimple) {
111
+ // Simple items go straight to the post-stats quantity field below.
112
+ }
113
+ else {
114
+ // (closed before V105 post-stats quantity block)
115
+ writer.writeUInt32(item.itemId || 0, 32); // item ID
116
+ writer.writeUInt8(item.ilvl, 7); // item level
117
+ // Runeword: quality field stores SUPERIOR (3) for a superior runeword base,
118
+ // NORMAL (2) otherwise.
119
+ const quality = runeword ? (isSuperiorBase ? 3 : 2) : (qualityToFileBits[item.quality] || 0);
120
+ writer.writeUInt8(quality, 4); // quality
121
+ // Custom icon
122
+ if (item.iconIndex) {
123
+ writer.writeUInt8(1, 1);
124
+ writer.writeUInt8(item.iconIndex, 3);
125
+ }
126
+ else {
127
+ writer.writeUInt8(0, 1);
128
+ }
129
+ // Class-specific
130
+ writer.writeUInt8(0, 1);
131
+ // Quality-specific data. Runeword on a superior base also writes the
132
+ // SUPERIOR 3-bit mod (0) after the quality byte.
133
+ const qualityRaw = item.quality === 9 ? 2 : item.quality;
134
+ writeQualityData(writer, item, qualityRaw, gd);
135
+ if (runeword && isSuperiorBase)
136
+ writer.writeUInt8(0, 3);
137
+ // Runeword ID
138
+ if (runeword) {
139
+ writer.writeUInt16(Number(item.unique?.replace('runeword', '') || 0), 12);
140
+ writer.writeUInt8(0, 4);
141
+ }
142
+ // Personalized name
143
+ if (item.personalized) {
144
+ const name = (typeof item.personalized === 'string' ? item.personalized : '').substring(0, 15);
145
+ for (let i = 0; i < name.length; i++) {
146
+ writer.writeUInt8(name.charCodeAt(i), 8);
147
+ }
148
+ writer.writeUInt8(0, 8);
149
+ }
150
+ const types = itemGetTypes(gd, item.base);
151
+ // Book type
152
+ if (types.has('book')) {
153
+ writer.writeUInt8(item.base === 'ibk' ? 1 : 0, 5);
154
+ }
155
+ // Timestamp
156
+ writer.writeUInt8(0, 1);
157
+ // Defense (armor)
158
+ if (types.has('armo')) {
159
+ writer.writeUInt16((item.defense || 0) + 10, 11);
160
+ }
161
+ // Durability (armor or weapon)
162
+ if (types.has('weap') || types.has('armo')) {
163
+ const baseItem = gd.items[item.base];
164
+ const maxDur = (baseItem?.nodurability || item.stats?.item_indesctructible) ? 0 : (baseItem?.durability || 0);
165
+ writer.writeUInt16(maxDur, 8);
166
+ if (maxDur > 0) {
167
+ writer.writeUInt16(maxDur, 9);
168
+ }
169
+ }
170
+ // V105 pre-stats quantity: 1-bit flag + 9-bit value. Always written for V105,
171
+ // gated by the base item being stackable (matches d2planner-HEAD writeItem).
172
+ const baseItem = gd.items[item.base];
173
+ const stackable = !!baseItem?.stackable;
174
+ writer.writeBit(stackable ? 1 : 0);
175
+ if (stackable)
176
+ writer.writeUInt16(item.quantity || 1, 9);
177
+ // Socket count (4-bit)
178
+ if (item.sockets > 0) {
179
+ writer.writeUInt8(item.sockets, 4);
180
+ }
181
+ // Set property list flags — write the actual setflags field rather than
182
+ // synthesising it from stats.length.
183
+ if (qualityRaw === 5) { // SET
184
+ writer.writeUInt8(item.setflags || 0, 5);
185
+ }
186
+ // ═══════════ STATS ═══════════
187
+ if (runeword) {
188
+ const runewordData = gd.runes[item.unique];
189
+ const rwStats = {};
190
+ if (runewordData) {
191
+ runewordStats(gd, rwStats, runewordData, item.uniqueValues, item);
192
+ }
193
+ const baseStats = {};
194
+ if (item.auto)
195
+ modsToStats(gd, baseStats, item.auto, item);
196
+ if (item.superior)
197
+ modsToStats(gd, baseStats, item.superior, item);
198
+ if (item.staff)
199
+ modsToStats(gd, baseStats, item.staff, item);
200
+ writeItemStats(writer, baseStats, gd);
201
+ writeItemStats(writer, rwStats, gd);
202
+ }
203
+ else {
204
+ writeItemStats(writer, item.stats || {}, gd);
205
+ // Empty set-bonus stat sections for each active setflag bit — terminator only.
206
+ if (qualityRaw === 5 && item.setflags) {
207
+ for (let bit = 0; bit < 5; bit++) {
208
+ if (item.setflags & (1 << bit))
209
+ writeItemStats(writer, {}, gd);
210
+ }
211
+ }
212
+ }
213
+ } // end if(!isSimple) — complex item body
214
+ // ═══════════ V105 POST-STATS QUANTITY (both simple + complex) ═══════════
215
+ // 1-bit flag + 8-bit value, gated by base.stackable && item.quantity.
216
+ const _postBase = gd.items[item.base];
217
+ const _postQty = (_postBase?.stackable && item.quantity) ? item.quantity : 0;
218
+ writer.writeBit(_postQty ? 1 : 0);
219
+ if (_postQty)
220
+ writer.writeUInt8(_postQty, 8);
221
+ writer.align();
222
+ // Write socketed sub-items
223
+ writeSocketedItems(writer, item, allItems, gd);
224
+ return writer.toArray();
225
+ }
226
+ // ─── Quality-specific data ──────────────────────────────────────
227
+ function writeQualityData(writer, item, qualityRaw, gd) {
228
+ switch (qualityRaw) {
229
+ case 1: // LOW
230
+ writer.writeUInt8(0, 3);
231
+ break;
232
+ case 2: // NORMAL
233
+ break;
234
+ case 3: { // SUPERIOR
235
+ writer.writeUInt8(0, 3);
236
+ break;
237
+ }
238
+ case 4: { // MAGIC
239
+ let mp = 0;
240
+ let ms = 0;
241
+ for (const k in item.mods || {}) {
242
+ if (!mp && k.includes('mp'))
243
+ mp = +k.slice(2);
244
+ else if (!ms && k.includes('ms'))
245
+ ms = +k.slice(2);
246
+ }
247
+ writer.writeUInt16(mp, 11);
248
+ writer.writeUInt16(ms, 11);
249
+ break;
250
+ }
251
+ case 5: // SET
252
+ writer.writeUInt16(Number(item.unique?.replace('set', '') || 0), 12);
253
+ break;
254
+ case 7: // UNIQUE
255
+ writer.writeUInt16(Number(item.unique?.replace('unique', '') || 0), 12);
256
+ break;
257
+ case 6: // RARE
258
+ case 8: { // CRAFTED
259
+ const mods = Object.keys(item.mods || {});
260
+ const mpMods = mods.filter(k => k.startsWith('mp')).map(k => +k.slice(2));
261
+ const msMods = mods.filter(k => k.startsWith('ms')).map(k => +k.slice(2));
262
+ const { rarePrefix, rareSuffix } = findRareNames(item.name || '', gd);
263
+ writer.writeUInt8(rarePrefix + 156, 8);
264
+ writer.writeUInt8(rareSuffix + 1, 8);
265
+ for (let i = 0; i < 3; i++) {
266
+ if (mpMods[i]) {
267
+ writer.writeBit(1);
268
+ writer.writeUInt16(mpMods[i], 11);
269
+ }
270
+ else {
271
+ writer.writeBit(0);
272
+ }
273
+ if (msMods[i]) {
274
+ writer.writeBit(1);
275
+ writer.writeUInt16(msMods[i], 11);
276
+ }
277
+ else {
278
+ writer.writeBit(0);
279
+ }
280
+ }
281
+ break;
282
+ }
283
+ }
284
+ }
285
+ // ─── Stat writing ─────────────────────────────────────────────
286
+ /**
287
+ * Write all stats for an item, terminated by 0x1ff (511).
288
+ */
289
+ function writeItemStats(writer, stats, gd) {
290
+ const processed = new Set();
291
+ // Remove poison_count — it's not written
292
+ const cleanStats = { ...stats };
293
+ delete cleanStats.poison_count;
294
+ // Sort by stat ID for deterministic output
295
+ const sortedKeys = Object.keys(cleanStats).sort((a, b) => getStatId(a, gd) - getStatId(b, gd));
296
+ for (const stat of sortedKeys) {
297
+ if (processed.has(stat))
298
+ continue;
299
+ if (stat === 'item_numsockets')
300
+ continue; // written in dedicated field
301
+ writeStat(writer, cleanStats, stat, processed, gd);
302
+ }
303
+ // End-of-stats marker
304
+ writer.writeUInt16(0x1ff, 9);
305
+ }
306
+ /** Get the numeric stat ID from a stat key (may have #params). */
307
+ function getStatId(stat, gd) {
308
+ const statName = stat.split('#')[0];
309
+ return gd.itemStatCost[statName]?.id ?? 999;
310
+ }
311
+ /**
312
+ * Write a single stat entry including any follow-up stats.
313
+ */
314
+ function writeStat(writer, stats, stat, processed, gd) {
315
+ const [statName, p1, p2] = stat.split('#');
316
+ const itemStat = gd.itemStatCost[statName];
317
+ if (!itemStat)
318
+ return;
319
+ writer.writeUInt16(itemStat.id, 9);
320
+ processed.add(stat);
321
+ const followCount = followStats[statName] || 0;
322
+ for (let i = 0; i <= followCount; i++) {
323
+ // Find the stat entry at id + i
324
+ const entries = Object.entries(gd.itemStatCost);
325
+ const found = entries.find(([, s]) => s.id === itemStat.id + i);
326
+ if (!found)
327
+ break;
328
+ const [statName2, itemStat2] = found;
329
+ const stat2 = i === 0 ? stat : [statName2, p1, p2].filter(Boolean).join('#');
330
+ if (i > 0)
331
+ processed.add(stat2);
332
+ writeStatValue(writer, stats, stat2, statName, p1, p2, itemStat2, i > 0);
333
+ }
334
+ }
335
+ /**
336
+ * Write a single stat value (base or follow-up).
337
+ */
338
+ function writeStatValue(writer, stats, stat, statName, p1, p2, itemStat, isFollowStat) {
339
+ let value = Number(stats[stat] || 0);
340
+ let param = 0;
341
+ if (itemStat.saveparambits) {
342
+ const statParam = !isFollowStat
343
+ ? getStatParamAndValue(statName, p1, p2, value, stats, stat)
344
+ : { param: Number(p1 || 0), value };
345
+ param = statParam.param;
346
+ value = statParam.value;
347
+ writer.writeUInt32(param, itemStat.saveparambits);
348
+ }
349
+ if (itemStat.saveadd)
350
+ value += itemStat.saveadd;
351
+ if (itemStat.savebits) {
352
+ writer.writeUInt32(value, itemStat.savebits);
353
+ }
354
+ }
355
+ /**
356
+ * Encode param + value for special stat types (skill-on-event, charged skill, etc).
357
+ */
358
+ function getStatParamAndValue(statName, p1, p2, value, stats, statKey) {
359
+ switch (statName) {
360
+ case 'item_skillonattack':
361
+ case 'item_skillonkill':
362
+ case 'item_skillondeath':
363
+ case 'item_skillonhit':
364
+ case 'item_skillonlevelup':
365
+ case 'item_skillongethit': {
366
+ const skillId = Number(p1 || 0);
367
+ const level = Number(p2 || 0);
368
+ const chance = value;
369
+ return { param: (skillId << 6) | (chance & 0x3f), value: level };
370
+ }
371
+ case 'item_charged_skill': {
372
+ const param1 = Number(p1 || 0);
373
+ const param2 = Number(p2 || 0);
374
+ const charges = Number(stats[statKey] || 0);
375
+ const maxCharges = Number(stats[statKey] || 0);
376
+ return { param: (param1 << 6) | (param2 & 0x3f), value: (charges << 8) | (maxCharges & 0xff) };
377
+ }
378
+ case 'item_addskill_tab': {
379
+ const tab = Number(p1 || 0);
380
+ return { param: (Math.floor(tab / 3) << 3) | (tab % 3), value };
381
+ }
382
+ default:
383
+ return { param: Number(p1 || 0), value };
384
+ }
385
+ }
386
+ // ─── Helpers ────────────────────────────────────────────────────
387
+ /** Determine if an item should be written as "simple" (no complex stat block). */
388
+ function isItemSimple(item) {
389
+ // Simple items: presetItemIds that aren't uniquified
390
+ if (presetItemIds.has(item.base) && !item.unique)
391
+ return true;
392
+ // Items explicitly marked simple (quality 2 with no stats)
393
+ if (item.quality === 2 && !item.unique && Object.keys(item.stats || {}).length === 0)
394
+ return true;
395
+ return false;
396
+ }
397
+ /** Write N zero bits. */
398
+ function writeZeroBits(writer, count) {
399
+ for (let i = 0; i < count; i++) {
400
+ writer.writeBit(0);
401
+ }
402
+ }
403
+ /** Write socketed sub-items. */
404
+ function writeSocketedItems(writer, item, allItems, gd) {
405
+ if (item.sockets > 0 && item.socketedItems) {
406
+ for (const s of item.socketedItems) {
407
+ const socketItem = allItems[s] ?? {
408
+ itemId: 0,
409
+ base: String(s),
410
+ quality: 2,
411
+ ilvl: 1,
412
+ unidentified: false,
413
+ ethereal: false,
414
+ socketed: false,
415
+ sockets: 0,
416
+ socketedItems: [],
417
+ stats: {},
418
+ binaryOffset: { start: 0, end: 0 },
419
+ };
420
+ const socketLoc = { loc: 6, equip: 0, x: 0, y: 0, storage: 0 };
421
+ const bytes = writeItem(socketItem, socketLoc, allItems, gd);
422
+ writer.writeBytes(bytes, bytes.length * 8);
423
+ }
424
+ }
425
+ }
426
+ /** Find rare prefix/suffix IDs from a name string. */
427
+ function findRareNames(name, gd) {
428
+ if (!name)
429
+ return { rarePrefix: 0, rareSuffix: 0 };
430
+ const [pName, sName] = name.split(' ', 2);
431
+ let rarePrefix = 0;
432
+ let rareSuffix = 0;
433
+ for (const [id, v] of Object.entries(gd.rarePrefix)) {
434
+ const resolvedName = gd.locale.strings[v.name] || v.name;
435
+ if (resolvedName === pName) {
436
+ rarePrefix = Number(id);
437
+ break;
438
+ }
439
+ }
440
+ for (const [id, v] of Object.entries(gd.rareSuffix)) {
441
+ const resolvedName = gd.locale.strings[v.name] || v.name;
442
+ if (resolvedName === sName) {
443
+ rareSuffix = Number(id);
444
+ break;
445
+ }
446
+ }
447
+ return { rarePrefix, rareSuffix };
448
+ }
449
+ // ─── Convenience: build entries from a profile ──────────────────
450
+ /**
451
+ * Build write entries from a profile's inventory layout (stash, inventory, cube, belt, body, merc).
452
+ * This collects items from their slots and prepares them for writeItemList().
453
+ */
454
+ export function buildWriteEntries(profile, allItems, gd, merc = false) {
455
+ const entries = [];
456
+ const socketed = new Set();
457
+ // Collect socketed item IDs to exclude them from top-level entries
458
+ for (const item of Object.values(allItems)) {
459
+ if (item?.socketedItems) {
460
+ for (const s of item.socketedItems) {
461
+ if (!presetItemIds.has(String(s)))
462
+ socketed.add(s);
463
+ }
464
+ }
465
+ }
466
+ const push = (id, loc) => {
467
+ if (id == null)
468
+ return;
469
+ if (socketed.has(id))
470
+ return;
471
+ const key = typeof id === 'number' ? id : id;
472
+ if (allItems[key]) {
473
+ entries.push({ item: { ...allItems[key], itemId: allItems[key].itemId }, location: loc });
474
+ }
475
+ else if (presetItemIds.has(String(id))) {
476
+ entries.push({
477
+ item: {
478
+ itemId: 0,
479
+ base: String(id),
480
+ quality: 2,
481
+ ilvl: 1,
482
+ unidentified: false,
483
+ ethereal: false,
484
+ socketed: false,
485
+ sockets: 0,
486
+ socketedItems: [],
487
+ stats: {},
488
+ binaryOffset: { start: 0, end: 0 },
489
+ },
490
+ location: loc,
491
+ });
492
+ }
493
+ };
494
+ const stashColumns = gd.info?.stash?.columns || 16;
495
+ if (merc) {
496
+ for (const slot in profile.mercItems || {}) {
497
+ const id = profile.mercItems[slot];
498
+ push(id, { loc: 1, equip: bodyLocMap[slot] || 0, x: bodyLocMap[slot] || 0, y: 0, storage: 0 });
499
+ }
500
+ }
501
+ else {
502
+ for (const slot in profile.items || {}) {
503
+ const id = profile.items[slot];
504
+ push(id, { loc: 1, equip: bodyLocMap[slot] || 0, x: bodyLocMap[slot] || 0, y: 0, storage: 0 });
505
+ }
506
+ (profile.inventory || []).forEach((id, i) => push(id, { loc: 0, equip: 0, x: i % 10, y: (i / 10) | 0, storage: 1 }));
507
+ // cube: location=0, storage=4 (matches d2planner-HEAD: loc:0 storage:4)
508
+ (profile.cube || []).forEach((id, i) => push(id, { loc: 0, equip: 0, x: i % 3, y: (i / 3) | 0, storage: 4 }));
509
+ (profile.stash || []).forEach((id, i) => push(id, { loc: 0, equip: 0, x: i % stashColumns, y: (i / stashColumns) | 0, storage: 5 }));
510
+ (profile.belt || []).forEach((id, i) => push(id, { loc: 2, equip: 0, x: i, y: 0, storage: 0 }));
511
+ }
512
+ return entries;
513
+ }
514
+ //# sourceMappingURL=item-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-writer.js","sourceRoot":"","sources":["../../src/formats/item-writer.ts"],"names":[],"mappings":"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"}