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.
- package/LICENSE +21 -0
- package/README.md +126 -0
- package/data/data.json +1 -0
- package/data/strings.json +1 -0
- package/dist/core/binary-reader.d.ts +43 -0
- package/dist/core/binary-reader.d.ts.map +1 -0
- package/dist/core/binary-reader.js +130 -0
- package/dist/core/binary-reader.js.map +1 -0
- package/dist/core/binary-writer.d.ts +49 -0
- package/dist/core/binary-writer.d.ts.map +1 -0
- package/dist/core/binary-writer.js +156 -0
- package/dist/core/binary-writer.js.map +1 -0
- package/dist/core/checksum.d.ts +28 -0
- package/dist/core/checksum.d.ts.map +1 -0
- package/dist/core/checksum.js +62 -0
- package/dist/core/checksum.js.map +1 -0
- package/dist/core/huffman.d.ts +22 -0
- package/dist/core/huffman.d.ts.map +1 -0
- package/dist/core/huffman.js +66 -0
- package/dist/core/huffman.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/formats/d2i-reader.d.ts +53 -0
- package/dist/formats/d2i-reader.d.ts.map +1 -0
- package/dist/formats/d2i-reader.js +208 -0
- package/dist/formats/d2i-reader.js.map +1 -0
- package/dist/formats/d2i-writer.d.ts +63 -0
- package/dist/formats/d2i-writer.d.ts.map +1 -0
- package/dist/formats/d2i-writer.js +229 -0
- package/dist/formats/d2i-writer.js.map +1 -0
- package/dist/formats/d2s-reader.d.ts +104 -0
- package/dist/formats/d2s-reader.d.ts.map +1 -0
- package/dist/formats/d2s-reader.js +257 -0
- package/dist/formats/d2s-reader.js.map +1 -0
- package/dist/formats/d2s-writer.d.ts +52 -0
- package/dist/formats/d2s-writer.d.ts.map +1 -0
- package/dist/formats/d2s-writer.js +407 -0
- package/dist/formats/d2s-writer.js.map +1 -0
- package/dist/formats/detect.d.ts +18 -0
- package/dist/formats/detect.d.ts.map +1 -0
- package/dist/formats/detect.js +40 -0
- package/dist/formats/detect.js.map +1 -0
- package/dist/formats/index.d.ts +8 -0
- package/dist/formats/index.d.ts.map +1 -0
- package/dist/formats/index.js +8 -0
- package/dist/formats/index.js.map +1 -0
- package/dist/formats/item-parser.d.ts +97 -0
- package/dist/formats/item-parser.d.ts.map +1 -0
- package/dist/formats/item-parser.js +627 -0
- package/dist/formats/item-parser.js.map +1 -0
- package/dist/formats/item-writer.d.ts +55 -0
- package/dist/formats/item-writer.d.ts.map +1 -0
- package/dist/formats/item-writer.js +514 -0
- package/dist/formats/item-writer.js.map +1 -0
- package/dist/game-data/game-data.d.ts +90 -0
- package/dist/game-data/game-data.d.ts.map +1 -0
- package/dist/game-data/game-data.js +355 -0
- package/dist/game-data/game-data.js.map +1 -0
- package/dist/game-data/index.d.ts +4 -0
- package/dist/game-data/index.d.ts.map +1 -0
- package/dist/game-data/index.js +3 -0
- package/dist/game-data/index.js.map +1 -0
- package/dist/game-data/loader.d.ts +23 -0
- package/dist/game-data/loader.d.ts.map +1 -0
- package/dist/game-data/loader.js +32 -0
- package/dist/game-data/loader.js.map +1 -0
- package/dist/game-data/types.d.ts +428 -0
- package/dist/game-data/types.d.ts.map +1 -0
- package/dist/game-data/types.js +10 -0
- package/dist/game-data/types.js.map +1 -0
- package/dist/index.d.ts +166 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +197 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory/dimensions.d.ts +42 -0
- package/dist/inventory/dimensions.d.ts.map +1 -0
- package/dist/inventory/dimensions.js +30 -0
- package/dist/inventory/dimensions.js.map +1 -0
- package/dist/inventory/grid.d.ts +53 -0
- package/dist/inventory/grid.d.ts.map +1 -0
- package/dist/inventory/grid.js +117 -0
- package/dist/inventory/grid.js.map +1 -0
- package/dist/inventory/index.d.ts +4 -0
- package/dist/inventory/index.d.ts.map +1 -0
- package/dist/inventory/index.js +4 -0
- package/dist/inventory/index.js.map +1 -0
- package/dist/inventory/placement.d.ts +68 -0
- package/dist/inventory/placement.d.ts.map +1 -0
- package/dist/inventory/placement.js +90 -0
- package/dist/inventory/placement.js.map +1 -0
- package/dist/items/index.d.ts +7 -0
- package/dist/items/index.d.ts.map +1 -0
- package/dist/items/index.js +7 -0
- package/dist/items/index.js.map +1 -0
- package/dist/items/item-dto.d.ts +47 -0
- package/dist/items/item-dto.d.ts.map +1 -0
- package/dist/items/item-dto.js +124 -0
- package/dist/items/item-dto.js.map +1 -0
- package/dist/items/item-icon.d.ts +27 -0
- package/dist/items/item-icon.d.ts.map +1 -0
- package/dist/items/item-icon.js +103 -0
- package/dist/items/item-icon.js.map +1 -0
- package/dist/items/item-serializer.d.ts +38 -0
- package/dist/items/item-serializer.d.ts.map +1 -0
- package/dist/items/item-serializer.js +92 -0
- package/dist/items/item-serializer.js.map +1 -0
- package/dist/items/item-stats-parser.d.ts +52 -0
- package/dist/items/item-stats-parser.d.ts.map +1 -0
- package/dist/items/item-stats-parser.js +671 -0
- package/dist/items/item-stats-parser.js.map +1 -0
- package/dist/items/item-types.d.ts +40 -0
- package/dist/items/item-types.d.ts.map +1 -0
- package/dist/items/item-types.js +198 -0
- package/dist/items/item-types.js.map +1 -0
- package/dist/items/item.d.ts +61 -0
- package/dist/items/item.d.ts.map +1 -0
- package/dist/items/item.js +335 -0
- package/dist/items/item.js.map +1 -0
- package/dist/operations/extract-item.d.ts +39 -0
- package/dist/operations/extract-item.d.ts.map +1 -0
- package/dist/operations/extract-item.js +204 -0
- package/dist/operations/extract-item.js.map +1 -0
- package/dist/operations/index.d.ts +4 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +4 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/insert-item.d.ts +59 -0
- package/dist/operations/insert-item.d.ts.map +1 -0
- package/dist/operations/insert-item.js +210 -0
- package/dist/operations/insert-item.js.map +1 -0
- package/dist/operations/read-save.d.ts +25 -0
- package/dist/operations/read-save.d.ts.map +1 -0
- package/dist/operations/read-save.js +27 -0
- package/dist/operations/read-save.js.map +1 -0
- package/dist/types/constants.d.ts +76 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/constants.js +96 -0
- package/dist/types/constants.js.map +1 -0
- package/dist/types/errors.d.ts +47 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +53 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/item.d.ts +112 -0
- package/dist/types/item.d.ts.map +1 -0
- package/dist/types/item.js +6 -0
- package/dist/types/item.js.map +1 -0
- package/dist/types/save-file.d.ts +74 -0
- package/dist/types/save-file.d.ts.map +1 -0
- package/dist/types/save-file.js +5 -0
- package/dist/types/save-file.js.map +1 -0
- package/dist/types/trade-item.d.ts +37 -0
- package/dist/types/trade-item.d.ts.map +1 -0
- package/dist/types/trade-item.js +5 -0
- package/dist/types/trade-item.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insert item into a save file — places an item and returns a patched buffer.
|
|
3
|
+
*
|
|
4
|
+
* Works with both .d2s and .d2i files.
|
|
5
|
+
*/
|
|
6
|
+
import { GameData } from '../game-data/game-data.js';
|
|
7
|
+
import type { BinaryParsedItem } from '../formats/item-parser.js';
|
|
8
|
+
/** Location types for D2S insertion. */
|
|
9
|
+
export type InsertD2STarget = 'stash' | 'inventory' | 'cube';
|
|
10
|
+
/** Result of inserting an item into a save. */
|
|
11
|
+
export interface InsertResult {
|
|
12
|
+
/** Patched file buffer with the item inserted. */
|
|
13
|
+
newBuffer: Uint8Array;
|
|
14
|
+
/** Position where the item was placed. */
|
|
15
|
+
position: {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Result of inserting an item into a D2I stash. */
|
|
21
|
+
export interface InsertD2IResult extends InsertResult {
|
|
22
|
+
/** Page index where the item was placed. */
|
|
23
|
+
pageIndex: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Insert an item into a .d2s character save.
|
|
27
|
+
*
|
|
28
|
+
* If `position` is provided, attempts to place at that exact location.
|
|
29
|
+
* Otherwise, finds the first available slot.
|
|
30
|
+
*
|
|
31
|
+
* @param buffer Original .d2s file bytes.
|
|
32
|
+
* @param item The item to insert.
|
|
33
|
+
* @param allItemsForItem All items for the item (e.g. socketed sub-items).
|
|
34
|
+
* @param target Where to place: 'stash', 'inventory', or 'cube'.
|
|
35
|
+
* @param gd GameData instance.
|
|
36
|
+
* @param position Optional specific position `{ x, y }`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function insertItemD2S(buffer: Uint8Array, item: BinaryParsedItem, allItemsForItem: Record<number | string, BinaryParsedItem>, target: InsertD2STarget, gd: GameData, position?: {
|
|
39
|
+
x: number;
|
|
40
|
+
y: number;
|
|
41
|
+
}): InsertResult;
|
|
42
|
+
/**
|
|
43
|
+
* Insert an item into a .d2i stash page.
|
|
44
|
+
*
|
|
45
|
+
* If `position` is provided, attempts to place at that exact location on the
|
|
46
|
+
* specified page. Otherwise, finds the first available slot across normal pages.
|
|
47
|
+
*
|
|
48
|
+
* @param buffer Original .d2i file bytes.
|
|
49
|
+
* @param item The item to insert.
|
|
50
|
+
* @param allItemsForItem All items for the item (e.g. socketed sub-items).
|
|
51
|
+
* @param gd GameData instance.
|
|
52
|
+
* @param target Optional { pageIndex, x, y } for exact placement.
|
|
53
|
+
*/
|
|
54
|
+
export declare function insertItemD2I(buffer: Uint8Array, item: BinaryParsedItem, allItemsForItem: Record<number | string, BinaryParsedItem>, gd: GameData, target?: {
|
|
55
|
+
pageIndex: number;
|
|
56
|
+
x: number;
|
|
57
|
+
y: number;
|
|
58
|
+
}): InsertD2IResult;
|
|
59
|
+
//# sourceMappingURL=insert-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-item.d.ts","sourceRoot":"","sources":["../../src/operations/insert-item.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAKrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAOlE,wCAAwC;AACxC,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;AAE7D,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,SAAS,EAAE,UAAU,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC;AAED,oDAAoD;AACpD,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,gBAAgB,EACtB,eAAe,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,gBAAgB,CAAC,EAC1D,MAAM,EAAE,eAAe,EACvB,EAAE,EAAE,QAAQ,EACZ,QAAQ,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,YAAY,CAwDd;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,gBAAgB,EACtB,eAAe,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,gBAAgB,CAAC,EAC1D,EAAE,EAAE,QAAQ,EACZ,MAAM,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,eAAe,CA6EjB"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insert item into a save file — places an item and returns a patched buffer.
|
|
3
|
+
*
|
|
4
|
+
* Works with both .d2s and .d2i files.
|
|
5
|
+
*/
|
|
6
|
+
import { readD2S } from '../formats/d2s-reader.js';
|
|
7
|
+
import { writeD2S } from '../formats/d2s-writer.js';
|
|
8
|
+
import { readD2I } from '../formats/d2i-reader.js';
|
|
9
|
+
import { patchStashPage } from '../formats/d2i-writer.js';
|
|
10
|
+
import { buildGrid, findFreeSlot, canPlaceItem } from '../inventory/placement.js';
|
|
11
|
+
import { STASH, INVENTORY, CUBE } from '../inventory/dimensions.js';
|
|
12
|
+
// ─── insertItemD2S ──────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Insert an item into a .d2s character save.
|
|
15
|
+
*
|
|
16
|
+
* If `position` is provided, attempts to place at that exact location.
|
|
17
|
+
* Otherwise, finds the first available slot.
|
|
18
|
+
*
|
|
19
|
+
* @param buffer Original .d2s file bytes.
|
|
20
|
+
* @param item The item to insert.
|
|
21
|
+
* @param allItemsForItem All items for the item (e.g. socketed sub-items).
|
|
22
|
+
* @param target Where to place: 'stash', 'inventory', or 'cube'.
|
|
23
|
+
* @param gd GameData instance.
|
|
24
|
+
* @param position Optional specific position `{ x, y }`.
|
|
25
|
+
*/
|
|
26
|
+
export function insertItemD2S(buffer, item, allItemsForItem, target, gd, position) {
|
|
27
|
+
const { profile, items } = readD2S(buffer, gd);
|
|
28
|
+
const { size, slots } = getTargetInfo(profile, target);
|
|
29
|
+
// Build occupancy grid
|
|
30
|
+
const grid = buildGrid(size, slots, items, gd);
|
|
31
|
+
// Determine placement position
|
|
32
|
+
let x;
|
|
33
|
+
let y;
|
|
34
|
+
if (position) {
|
|
35
|
+
if (!canPlaceItem(grid, position.x, position.y, item, gd)) {
|
|
36
|
+
throw new Error(`NO_SPACE: cannot place item at (${position.x}, ${position.y}) in ${target}`);
|
|
37
|
+
}
|
|
38
|
+
x = position.x;
|
|
39
|
+
y = position.y;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const slot = findFreeSlot(grid, item, gd);
|
|
43
|
+
if (!slot) {
|
|
44
|
+
throw new Error(`NO_SPACE: no free slot for item in ${target}`);
|
|
45
|
+
}
|
|
46
|
+
x = slot.x;
|
|
47
|
+
y = slot.y;
|
|
48
|
+
}
|
|
49
|
+
// Assign new unique item ID
|
|
50
|
+
const maxId = Math.max(0, ...Object.keys(items).filter(k => !isNaN(Number(k))).map(Number));
|
|
51
|
+
const newId = maxId + 1;
|
|
52
|
+
const newItem = { ...item, itemId: newId };
|
|
53
|
+
// Register item and its sockets in the save's items dict
|
|
54
|
+
items[newId] = newItem;
|
|
55
|
+
let nextSocketId = newId + 1;
|
|
56
|
+
if (item.socketedItems) {
|
|
57
|
+
const newSocketedIds = [];
|
|
58
|
+
for (const oldSid of item.socketedItems) {
|
|
59
|
+
const sockItem = allItemsForItem[oldSid];
|
|
60
|
+
if (sockItem) {
|
|
61
|
+
items[nextSocketId] = { ...sockItem, itemId: nextSocketId };
|
|
62
|
+
newSocketedIds.push(nextSocketId);
|
|
63
|
+
nextSocketId++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
newItem.socketedItems = newSocketedIds;
|
|
67
|
+
}
|
|
68
|
+
// Place in the slot array
|
|
69
|
+
const slotIndex = y * size.columns + x;
|
|
70
|
+
slots[slotIndex] = newId;
|
|
71
|
+
// Rewrite D2S
|
|
72
|
+
const newBuffer = writeD2S({ profile: profile, items, gd });
|
|
73
|
+
return { newBuffer, position: { x, y } };
|
|
74
|
+
}
|
|
75
|
+
// ─── insertItemD2I ──────────────────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Insert an item into a .d2i stash page.
|
|
78
|
+
*
|
|
79
|
+
* If `position` is provided, attempts to place at that exact location on the
|
|
80
|
+
* specified page. Otherwise, finds the first available slot across normal pages.
|
|
81
|
+
*
|
|
82
|
+
* @param buffer Original .d2i file bytes.
|
|
83
|
+
* @param item The item to insert.
|
|
84
|
+
* @param allItemsForItem All items for the item (e.g. socketed sub-items).
|
|
85
|
+
* @param gd GameData instance.
|
|
86
|
+
* @param target Optional { pageIndex, x, y } for exact placement.
|
|
87
|
+
*/
|
|
88
|
+
export function insertItemD2I(buffer, item, allItemsForItem, gd, target) {
|
|
89
|
+
const { pages, items } = readD2I(buffer, gd);
|
|
90
|
+
// Filter to normal pages only (pageType=0)
|
|
91
|
+
const normalPages = pages.filter(p => p.pageType === 0);
|
|
92
|
+
let targetPage;
|
|
93
|
+
let x;
|
|
94
|
+
let y;
|
|
95
|
+
if (target) {
|
|
96
|
+
// Exact placement
|
|
97
|
+
targetPage = pages[target.pageIndex];
|
|
98
|
+
if (!targetPage)
|
|
99
|
+
throw new Error(`PAGE_NOT_FOUND: page ${target.pageIndex} not found`);
|
|
100
|
+
if (targetPage.pageType !== 0)
|
|
101
|
+
throw new Error('INVALID_PAGE: can only insert into normal pages');
|
|
102
|
+
const grid = buildGrid(STASH, targetPage.stash, items, gd);
|
|
103
|
+
if (!canPlaceItem(grid, target.x, target.y, item, gd)) {
|
|
104
|
+
throw new Error(`NO_SPACE: cannot place item at (${target.x}, ${target.y}) on page ${target.pageIndex}`);
|
|
105
|
+
}
|
|
106
|
+
x = target.x;
|
|
107
|
+
y = target.y;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Auto-find slot across normal pages
|
|
111
|
+
let found = false;
|
|
112
|
+
targetPage = normalPages[0]; // default
|
|
113
|
+
x = 0;
|
|
114
|
+
y = 0;
|
|
115
|
+
for (const page of normalPages) {
|
|
116
|
+
const grid = buildGrid(STASH, page.stash, items, gd);
|
|
117
|
+
const slot = findFreeSlot(grid, item, gd);
|
|
118
|
+
if (slot) {
|
|
119
|
+
targetPage = page;
|
|
120
|
+
x = slot.x;
|
|
121
|
+
y = slot.y;
|
|
122
|
+
found = true;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!found) {
|
|
127
|
+
throw new Error('NO_SPACE: no free slot for item in any stash page');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Assign new unique item ID
|
|
131
|
+
const maxId = Math.max(0, ...Object.keys(items).filter(k => !isNaN(Number(k))).map(Number));
|
|
132
|
+
const newId = maxId + 1;
|
|
133
|
+
const newItem = { ...item, itemId: newId };
|
|
134
|
+
// Register item and its sockets
|
|
135
|
+
items[newId] = newItem;
|
|
136
|
+
let nextSocketId = newId + 1;
|
|
137
|
+
if (item.socketedItems) {
|
|
138
|
+
const newSocketedIds = [];
|
|
139
|
+
for (const oldSid of item.socketedItems) {
|
|
140
|
+
const sockItem = allItemsForItem[oldSid];
|
|
141
|
+
if (sockItem) {
|
|
142
|
+
items[nextSocketId] = { ...sockItem, itemId: nextSocketId };
|
|
143
|
+
newSocketedIds.push(nextSocketId);
|
|
144
|
+
nextSocketId++;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
newItem.socketedItems = newSocketedIds;
|
|
148
|
+
}
|
|
149
|
+
// Place in stash array
|
|
150
|
+
const slotIndex = y * 16 + x; // STASH columns = 16
|
|
151
|
+
targetPage.stash[slotIndex] = newId;
|
|
152
|
+
// Build write page and patch
|
|
153
|
+
const writePage = buildWritePageFromStash(targetPage, items, gd);
|
|
154
|
+
const rawPageIndex = findRawPageIndex(pages, targetPage.index);
|
|
155
|
+
const newBuffer = patchStashPage(buffer, rawPageIndex, writePage, items, gd);
|
|
156
|
+
return { newBuffer, position: { x, y }, pageIndex: targetPage.index };
|
|
157
|
+
}
|
|
158
|
+
// ─── Helpers ────────────────────────────────────────────────────
|
|
159
|
+
/** Get target grid info from a D2S profile. */
|
|
160
|
+
function getTargetInfo(profile, target) {
|
|
161
|
+
switch (target) {
|
|
162
|
+
case 'stash':
|
|
163
|
+
return { size: STASH, slots: profile.stash };
|
|
164
|
+
case 'inventory':
|
|
165
|
+
return { size: INVENTORY, slots: profile.inventory };
|
|
166
|
+
case 'cube':
|
|
167
|
+
return { size: CUBE, slots: profile.cube };
|
|
168
|
+
default:
|
|
169
|
+
throw new Error(`INVALID_TARGET: unknown target '${target}'`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Build a WriteStashPage from a D2IStashPage's current stash array. */
|
|
173
|
+
function buildWritePageFromStash(page, items, gd) {
|
|
174
|
+
const entries = [];
|
|
175
|
+
const columns = 16; // STASH.columns
|
|
176
|
+
for (let slot = 0; slot < page.stash.length; slot++) {
|
|
177
|
+
const id = page.stash[slot];
|
|
178
|
+
if (id == null)
|
|
179
|
+
continue;
|
|
180
|
+
const item = items[id];
|
|
181
|
+
if (!item)
|
|
182
|
+
continue;
|
|
183
|
+
// Skip socketed sub-items
|
|
184
|
+
const isSocketed = Object.values(items).some(i => i.socketedItems?.includes(id));
|
|
185
|
+
if (isSocketed)
|
|
186
|
+
continue;
|
|
187
|
+
const x = slot % columns;
|
|
188
|
+
const y = Math.floor(slot / columns);
|
|
189
|
+
const location = { loc: 0, equip: 0, x, y, storage: 5 };
|
|
190
|
+
entries.push({ item, location });
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
pageType: typeof page.pageType === 'number' ? page.pageType : 0,
|
|
194
|
+
gold: page.gold,
|
|
195
|
+
entries,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/** Find the raw sector index for a page in the d2i file. */
|
|
199
|
+
function findRawPageIndex(pages, targetPageIndex) {
|
|
200
|
+
const targetOffset = pages[targetPageIndex].offset;
|
|
201
|
+
const seenOffsets = new Set();
|
|
202
|
+
for (let i = 0; i < pages.length; i++) {
|
|
203
|
+
const off = pages[i].offset;
|
|
204
|
+
if (off === targetOffset)
|
|
205
|
+
return seenOffsets.size;
|
|
206
|
+
seenOffsets.add(off);
|
|
207
|
+
}
|
|
208
|
+
return targetPageIndex;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=insert-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-item.js","sourceRoot":"","sources":["../../src/operations/insert-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal save file reader — auto-detects format and parses.
|
|
3
|
+
*/
|
|
4
|
+
import { type D2SReadResult } from '../formats/d2s-reader.js';
|
|
5
|
+
import { type D2IReadResult } from '../formats/d2i-reader.js';
|
|
6
|
+
import type { GameData } from '../game-data/game-data.js';
|
|
7
|
+
export interface ReadSaveD2SResult {
|
|
8
|
+
type: 'd2s';
|
|
9
|
+
data: D2SReadResult;
|
|
10
|
+
}
|
|
11
|
+
export interface ReadSaveD2IResult {
|
|
12
|
+
type: 'd2i';
|
|
13
|
+
data: D2IReadResult;
|
|
14
|
+
}
|
|
15
|
+
export type ReadSaveResult = ReadSaveD2SResult | ReadSaveD2IResult;
|
|
16
|
+
/**
|
|
17
|
+
* Detect format and parse a save file buffer.
|
|
18
|
+
*
|
|
19
|
+
* @param buffer Raw file bytes.
|
|
20
|
+
* @param gd GameData instance.
|
|
21
|
+
* @returns Discriminated union with `type` and parsed `data`.
|
|
22
|
+
* @throws {D2RSaverError} INVALID_FORMAT if file cannot be detected.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readSave(buffer: Uint8Array, gd: GameData): ReadSaveResult;
|
|
25
|
+
//# sourceMappingURL=read-save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-save.d.ts","sourceRoot":"","sources":["../../src/operations/read-save.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAW,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAW,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAInE;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,GAAG,cAAc,CAWzE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal save file reader — auto-detects format and parses.
|
|
3
|
+
*/
|
|
4
|
+
import { detectFormat } from '../formats/detect.js';
|
|
5
|
+
import { readD2S } from '../formats/d2s-reader.js';
|
|
6
|
+
import { readD2I } from '../formats/d2i-reader.js';
|
|
7
|
+
import { D2RSaverError, ErrorCode } from '../types/errors.js';
|
|
8
|
+
// ─── Public API ─────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Detect format and parse a save file buffer.
|
|
11
|
+
*
|
|
12
|
+
* @param buffer Raw file bytes.
|
|
13
|
+
* @param gd GameData instance.
|
|
14
|
+
* @returns Discriminated union with `type` and parsed `data`.
|
|
15
|
+
* @throws {D2RSaverError} INVALID_FORMAT if file cannot be detected.
|
|
16
|
+
*/
|
|
17
|
+
export function readSave(buffer, gd) {
|
|
18
|
+
const format = detectFormat(buffer);
|
|
19
|
+
if (!format) {
|
|
20
|
+
throw new D2RSaverError(ErrorCode.INVALID_FORMAT, 'File is not a valid Blizzless v105 d2s or d2i.');
|
|
21
|
+
}
|
|
22
|
+
if (format.type === 'd2s') {
|
|
23
|
+
return { type: 'd2s', data: readD2S(buffer, gd) };
|
|
24
|
+
}
|
|
25
|
+
return { type: 'd2i', data: readD2I(buffer, gd) };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=read-save.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-save.js","sourceRoot":"","sources":["../../src/operations/read-save.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAsB,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,OAAO,EAAsB,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAgB9D,mEAAmE;AAEnE;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAkB,EAAE,EAAY;IACvD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,aAAa,CAAC,SAAS,CAAC,cAAc,EAAE,gDAAgD,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enums & constants for Blizzless D2R v105 save format.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ItemQuality {
|
|
5
|
+
LOW = 1,
|
|
6
|
+
NORMAL = 2,
|
|
7
|
+
SUPERIOR = 3,
|
|
8
|
+
MAGIC = 4,
|
|
9
|
+
SET = 5,
|
|
10
|
+
RARE = 6,
|
|
11
|
+
UNIQUE = 7,
|
|
12
|
+
CRAFTED = 8
|
|
13
|
+
}
|
|
14
|
+
/** Where the item is in the save file (3-bit location field). */
|
|
15
|
+
export declare enum LocationType {
|
|
16
|
+
/** Stored in a location grid (inventory, cube, stash). */
|
|
17
|
+
STORED = 0,
|
|
18
|
+
/** Equipped on body. */
|
|
19
|
+
EQUIPPED = 1,
|
|
20
|
+
/** In belt. */
|
|
21
|
+
BELT = 2,
|
|
22
|
+
/** Socketed inside another item. */
|
|
23
|
+
SOCKETED = 6
|
|
24
|
+
}
|
|
25
|
+
/** Storage grid identifier (3-bit field for STORED items). */
|
|
26
|
+
export declare enum StorageType {
|
|
27
|
+
NONE = 0,
|
|
28
|
+
INVENTORY = 1,
|
|
29
|
+
CUBE = 4,
|
|
30
|
+
STASH = 5
|
|
31
|
+
}
|
|
32
|
+
/** Body slot index for equipped items (4-bit bodyloc field). */
|
|
33
|
+
export declare enum BodyLocation {
|
|
34
|
+
NONE = 0,
|
|
35
|
+
HEAD = 1,
|
|
36
|
+
NECK = 2,
|
|
37
|
+
TORSO = 3,
|
|
38
|
+
RIGHT_HAND = 4,
|
|
39
|
+
LEFT_HAND = 5,
|
|
40
|
+
RIGHT_RING = 6,
|
|
41
|
+
LEFT_RING = 7,
|
|
42
|
+
WAIST = 8,
|
|
43
|
+
FEET = 9,
|
|
44
|
+
GLOVES = 10
|
|
45
|
+
}
|
|
46
|
+
/** D2S magic signature. */
|
|
47
|
+
export declare const D2S_MAGIC = 2857740885;
|
|
48
|
+
/** D2I (stash) magic signature. */
|
|
49
|
+
export declare const D2I_MAGIC = 5460804;
|
|
50
|
+
/** Only supported version. */
|
|
51
|
+
export declare const BLIZZLESS_VERSION = 105;
|
|
52
|
+
export declare const STASH_WIDTH = 16;
|
|
53
|
+
export declare const STASH_HEIGHT = 13;
|
|
54
|
+
export declare const INVENTORY_WIDTH = 10;
|
|
55
|
+
export declare const INVENTORY_HEIGHT = 4;
|
|
56
|
+
export declare const CUBE_WIDTH = 3;
|
|
57
|
+
export declare const CUBE_HEIGHT = 4;
|
|
58
|
+
/** Section marker in d2s: item list section. */
|
|
59
|
+
export declare const SECTION_ITEMS = 19021;
|
|
60
|
+
/** Section marker in d2s: character stats. */
|
|
61
|
+
export declare const SECTION_STATS = 26470;
|
|
62
|
+
/** Section marker in d2s: extended section (v105). */
|
|
63
|
+
export declare const SECTION_EXTENDED = 26220;
|
|
64
|
+
/** Prefix for serialized item tokens. */
|
|
65
|
+
export declare const TOKEN_PREFIX = "d2r1:";
|
|
66
|
+
export declare enum CharacterClass {
|
|
67
|
+
AMAZON = 0,
|
|
68
|
+
SORCERESS = 1,
|
|
69
|
+
NECROMANCER = 2,
|
|
70
|
+
PALADIN = 3,
|
|
71
|
+
BARBARIAN = 4,
|
|
72
|
+
DRUID = 5,
|
|
73
|
+
ASSASSIN = 6
|
|
74
|
+
}
|
|
75
|
+
export declare const CLASS_NAMES: Readonly<Record<CharacterClass, string>>;
|
|
76
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,oBAAY,WAAW;IACrB,GAAG,IAAI;IACP,MAAM,IAAI;IACV,QAAQ,IAAI;IACZ,KAAK,IAAI;IACT,GAAG,IAAI;IACP,IAAI,IAAI;IACR,MAAM,IAAI;IACV,OAAO,IAAI;CACZ;AAID,iEAAiE;AACjE,oBAAY,YAAY;IACtB,0DAA0D;IAC1D,MAAM,IAAI;IACV,wBAAwB;IACxB,QAAQ,IAAI;IACZ,eAAe;IACf,IAAI,IAAI;IACR,oCAAoC;IACpC,QAAQ,IAAI;CACb;AAED,8DAA8D;AAC9D,oBAAY,WAAW;IACrB,IAAI,IAAI;IACR,SAAS,IAAI;IACb,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,gEAAgE;AAChE,oBAAY,YAAY;IACtB,IAAI,IAAI;IACR,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,UAAU,IAAI;IACd,SAAS,IAAI;IACb,UAAU,IAAI;IACd,SAAS,IAAI;IACb,KAAK,IAAI;IACT,IAAI,IAAI;IACR,MAAM,KAAK;CACZ;AAID,2BAA2B;AAC3B,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,mCAAmC;AACnC,eAAO,MAAM,SAAS,UAAa,CAAC;AAEpC,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAIrC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,WAAW,IAAI,CAAC;AAI7B,gDAAgD;AAChD,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,8CAA8C;AAC9C,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAIvC,yCAAyC;AACzC,eAAO,MAAM,YAAY,UAAU,CAAC;AAIpC,oBAAY,cAAc;IACxB,MAAM,IAAI;IACV,SAAS,IAAI;IACb,WAAW,IAAI;IACf,OAAO,IAAI;IACX,SAAS,IAAI;IACb,KAAK,IAAI;IACT,QAAQ,IAAI;CACb;AAED,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAQhE,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enums & constants for Blizzless D2R v105 save format.
|
|
3
|
+
*/
|
|
4
|
+
// ─── Item Quality ───────────────────────────────────────────────
|
|
5
|
+
export var ItemQuality;
|
|
6
|
+
(function (ItemQuality) {
|
|
7
|
+
ItemQuality[ItemQuality["LOW"] = 1] = "LOW";
|
|
8
|
+
ItemQuality[ItemQuality["NORMAL"] = 2] = "NORMAL";
|
|
9
|
+
ItemQuality[ItemQuality["SUPERIOR"] = 3] = "SUPERIOR";
|
|
10
|
+
ItemQuality[ItemQuality["MAGIC"] = 4] = "MAGIC";
|
|
11
|
+
ItemQuality[ItemQuality["SET"] = 5] = "SET";
|
|
12
|
+
ItemQuality[ItemQuality["RARE"] = 6] = "RARE";
|
|
13
|
+
ItemQuality[ItemQuality["UNIQUE"] = 7] = "UNIQUE";
|
|
14
|
+
ItemQuality[ItemQuality["CRAFTED"] = 8] = "CRAFTED";
|
|
15
|
+
})(ItemQuality || (ItemQuality = {}));
|
|
16
|
+
// ─── Location / Storage ─────────────────────────────────────────
|
|
17
|
+
/** Where the item is in the save file (3-bit location field). */
|
|
18
|
+
export var LocationType;
|
|
19
|
+
(function (LocationType) {
|
|
20
|
+
/** Stored in a location grid (inventory, cube, stash). */
|
|
21
|
+
LocationType[LocationType["STORED"] = 0] = "STORED";
|
|
22
|
+
/** Equipped on body. */
|
|
23
|
+
LocationType[LocationType["EQUIPPED"] = 1] = "EQUIPPED";
|
|
24
|
+
/** In belt. */
|
|
25
|
+
LocationType[LocationType["BELT"] = 2] = "BELT";
|
|
26
|
+
/** Socketed inside another item. */
|
|
27
|
+
LocationType[LocationType["SOCKETED"] = 6] = "SOCKETED";
|
|
28
|
+
})(LocationType || (LocationType = {}));
|
|
29
|
+
/** Storage grid identifier (3-bit field for STORED items). */
|
|
30
|
+
export var StorageType;
|
|
31
|
+
(function (StorageType) {
|
|
32
|
+
StorageType[StorageType["NONE"] = 0] = "NONE";
|
|
33
|
+
StorageType[StorageType["INVENTORY"] = 1] = "INVENTORY";
|
|
34
|
+
StorageType[StorageType["CUBE"] = 4] = "CUBE";
|
|
35
|
+
StorageType[StorageType["STASH"] = 5] = "STASH";
|
|
36
|
+
})(StorageType || (StorageType = {}));
|
|
37
|
+
/** Body slot index for equipped items (4-bit bodyloc field). */
|
|
38
|
+
export var BodyLocation;
|
|
39
|
+
(function (BodyLocation) {
|
|
40
|
+
BodyLocation[BodyLocation["NONE"] = 0] = "NONE";
|
|
41
|
+
BodyLocation[BodyLocation["HEAD"] = 1] = "HEAD";
|
|
42
|
+
BodyLocation[BodyLocation["NECK"] = 2] = "NECK";
|
|
43
|
+
BodyLocation[BodyLocation["TORSO"] = 3] = "TORSO";
|
|
44
|
+
BodyLocation[BodyLocation["RIGHT_HAND"] = 4] = "RIGHT_HAND";
|
|
45
|
+
BodyLocation[BodyLocation["LEFT_HAND"] = 5] = "LEFT_HAND";
|
|
46
|
+
BodyLocation[BodyLocation["RIGHT_RING"] = 6] = "RIGHT_RING";
|
|
47
|
+
BodyLocation[BodyLocation["LEFT_RING"] = 7] = "LEFT_RING";
|
|
48
|
+
BodyLocation[BodyLocation["WAIST"] = 8] = "WAIST";
|
|
49
|
+
BodyLocation[BodyLocation["FEET"] = 9] = "FEET";
|
|
50
|
+
BodyLocation[BodyLocation["GLOVES"] = 10] = "GLOVES";
|
|
51
|
+
})(BodyLocation || (BodyLocation = {}));
|
|
52
|
+
// ─── File format ────────────────────────────────────────────────
|
|
53
|
+
/** D2S magic signature. */
|
|
54
|
+
export const D2S_MAGIC = 0xaa55aa55;
|
|
55
|
+
/** D2I (stash) magic signature. */
|
|
56
|
+
export const D2I_MAGIC = 0x00535344; // "DST\0" in LE
|
|
57
|
+
/** Only supported version. */
|
|
58
|
+
export const BLIZZLESS_VERSION = 105;
|
|
59
|
+
// ─── Grid dimensions (Blizzless) ────────────────────────────────
|
|
60
|
+
export const STASH_WIDTH = 16;
|
|
61
|
+
export const STASH_HEIGHT = 13;
|
|
62
|
+
export const INVENTORY_WIDTH = 10;
|
|
63
|
+
export const INVENTORY_HEIGHT = 4;
|
|
64
|
+
export const CUBE_WIDTH = 3;
|
|
65
|
+
export const CUBE_HEIGHT = 4;
|
|
66
|
+
// ─── D2S section markers (v105 — no "JM" per-item headers) ─────
|
|
67
|
+
/** Section marker in d2s: item list section. */
|
|
68
|
+
export const SECTION_ITEMS = 0x4a4d; // "JM"
|
|
69
|
+
/** Section marker in d2s: character stats. */
|
|
70
|
+
export const SECTION_STATS = 0x6766; // "gf"
|
|
71
|
+
/** Section marker in d2s: extended section (v105). */
|
|
72
|
+
export const SECTION_EXTENDED = 0x666c; // "fl"
|
|
73
|
+
// ─── Portability token prefix ───────────────────────────────────
|
|
74
|
+
/** Prefix for serialized item tokens. */
|
|
75
|
+
export const TOKEN_PREFIX = 'd2r1:';
|
|
76
|
+
// ─── Character classes ──────────────────────────────────────────
|
|
77
|
+
export var CharacterClass;
|
|
78
|
+
(function (CharacterClass) {
|
|
79
|
+
CharacterClass[CharacterClass["AMAZON"] = 0] = "AMAZON";
|
|
80
|
+
CharacterClass[CharacterClass["SORCERESS"] = 1] = "SORCERESS";
|
|
81
|
+
CharacterClass[CharacterClass["NECROMANCER"] = 2] = "NECROMANCER";
|
|
82
|
+
CharacterClass[CharacterClass["PALADIN"] = 3] = "PALADIN";
|
|
83
|
+
CharacterClass[CharacterClass["BARBARIAN"] = 4] = "BARBARIAN";
|
|
84
|
+
CharacterClass[CharacterClass["DRUID"] = 5] = "DRUID";
|
|
85
|
+
CharacterClass[CharacterClass["ASSASSIN"] = 6] = "ASSASSIN";
|
|
86
|
+
})(CharacterClass || (CharacterClass = {}));
|
|
87
|
+
export const CLASS_NAMES = {
|
|
88
|
+
[CharacterClass.AMAZON]: 'Amazon',
|
|
89
|
+
[CharacterClass.SORCERESS]: 'Sorceress',
|
|
90
|
+
[CharacterClass.NECROMANCER]: 'Necromancer',
|
|
91
|
+
[CharacterClass.PALADIN]: 'Paladin',
|
|
92
|
+
[CharacterClass.BARBARIAN]: 'Barbarian',
|
|
93
|
+
[CharacterClass.DRUID]: 'Druid',
|
|
94
|
+
[CharacterClass.ASSASSIN]: 'Assassin',
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error class for d2r-saver.
|
|
3
|
+
*
|
|
4
|
+
* All user-facing errors are instances of D2RSaverError with a machine-readable
|
|
5
|
+
* `code` property for programmatic handling.
|
|
6
|
+
*/
|
|
7
|
+
/** Error code enum — all machine-readable error codes. */
|
|
8
|
+
export declare enum ErrorCode {
|
|
9
|
+
/** File is not a valid d2s or d2i. */
|
|
10
|
+
INVALID_FORMAT = "INVALID_FORMAT",
|
|
11
|
+
/** Unrecognized or non-v105 file version. */
|
|
12
|
+
UNSUPPORTED_VERSION = "UNSUPPORTED_VERSION",
|
|
13
|
+
/** Generic parse failure. */
|
|
14
|
+
PARSE_ERROR = "PARSE_ERROR",
|
|
15
|
+
/** Checksum doesn't match (warning, usually non-blocking). */
|
|
16
|
+
CHECKSUM_MISMATCH = "CHECKSUM_MISMATCH",
|
|
17
|
+
/** No free grid slot for placement. */
|
|
18
|
+
NO_FREE_SLOT = "NO_FREE_SLOT",
|
|
19
|
+
/** Item with given ID not found. */
|
|
20
|
+
ITEM_NOT_FOUND = "ITEM_NOT_FOUND",
|
|
21
|
+
/** Error during binary write. */
|
|
22
|
+
WRITE_ERROR = "WRITE_ERROR",
|
|
23
|
+
/** Malformed portability token. */
|
|
24
|
+
INVALID_TOKEN = "INVALID_TOKEN",
|
|
25
|
+
/** GameData has not been loaded yet. */
|
|
26
|
+
DATA_NOT_LOADED = "DATA_NOT_LOADED"
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Structured error thrown by d2r-saver operations.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* try {
|
|
34
|
+
* saver.extractItemD2S(buf, 999);
|
|
35
|
+
* } catch (e) {
|
|
36
|
+
* if (e instanceof D2RSaverError && e.code === ErrorCode.ITEM_NOT_FOUND) {
|
|
37
|
+
* console.log('Item not found');
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class D2RSaverError extends Error {
|
|
43
|
+
readonly name = "D2RSaverError";
|
|
44
|
+
readonly code: ErrorCode;
|
|
45
|
+
constructor(code: ErrorCode, message: string);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,0DAA0D;AAC1D,oBAAY,SAAS;IACnB,sCAAsC;IACtC,cAAc,mBAAmB;IACjC,6CAA6C;IAC7C,mBAAmB,wBAAwB;IAC3C,6BAA6B;IAC7B,WAAW,gBAAgB;IAC3B,8DAA8D;IAC9D,iBAAiB,sBAAsB;IACvC,uCAAuC;IACvC,YAAY,iBAAiB;IAC7B,oCAAoC;IACpC,cAAc,mBAAmB;IACjC,iCAAiC;IACjC,WAAW,gBAAgB;IAC3B,mCAAmC;IACnC,aAAa,kBAAkB;IAC/B,wCAAwC;IACxC,eAAe,oBAAoB;CACpC;AAID;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,mBAAmB;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;gBAEb,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;CAI7C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error class for d2r-saver.
|
|
3
|
+
*
|
|
4
|
+
* All user-facing errors are instances of D2RSaverError with a machine-readable
|
|
5
|
+
* `code` property for programmatic handling.
|
|
6
|
+
*/
|
|
7
|
+
// ─── Error codes ────────────────────────────────────────────────
|
|
8
|
+
/** Error code enum — all machine-readable error codes. */
|
|
9
|
+
export var ErrorCode;
|
|
10
|
+
(function (ErrorCode) {
|
|
11
|
+
/** File is not a valid d2s or d2i. */
|
|
12
|
+
ErrorCode["INVALID_FORMAT"] = "INVALID_FORMAT";
|
|
13
|
+
/** Unrecognized or non-v105 file version. */
|
|
14
|
+
ErrorCode["UNSUPPORTED_VERSION"] = "UNSUPPORTED_VERSION";
|
|
15
|
+
/** Generic parse failure. */
|
|
16
|
+
ErrorCode["PARSE_ERROR"] = "PARSE_ERROR";
|
|
17
|
+
/** Checksum doesn't match (warning, usually non-blocking). */
|
|
18
|
+
ErrorCode["CHECKSUM_MISMATCH"] = "CHECKSUM_MISMATCH";
|
|
19
|
+
/** No free grid slot for placement. */
|
|
20
|
+
ErrorCode["NO_FREE_SLOT"] = "NO_FREE_SLOT";
|
|
21
|
+
/** Item with given ID not found. */
|
|
22
|
+
ErrorCode["ITEM_NOT_FOUND"] = "ITEM_NOT_FOUND";
|
|
23
|
+
/** Error during binary write. */
|
|
24
|
+
ErrorCode["WRITE_ERROR"] = "WRITE_ERROR";
|
|
25
|
+
/** Malformed portability token. */
|
|
26
|
+
ErrorCode["INVALID_TOKEN"] = "INVALID_TOKEN";
|
|
27
|
+
/** GameData has not been loaded yet. */
|
|
28
|
+
ErrorCode["DATA_NOT_LOADED"] = "DATA_NOT_LOADED";
|
|
29
|
+
})(ErrorCode || (ErrorCode = {}));
|
|
30
|
+
// ─── Error class ────────────────────────────────────────────────
|
|
31
|
+
/**
|
|
32
|
+
* Structured error thrown by d2r-saver operations.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* try {
|
|
37
|
+
* saver.extractItemD2S(buf, 999);
|
|
38
|
+
* } catch (e) {
|
|
39
|
+
* if (e instanceof D2RSaverError && e.code === ErrorCode.ITEM_NOT_FOUND) {
|
|
40
|
+
* console.log('Item not found');
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class D2RSaverError extends Error {
|
|
46
|
+
name = 'D2RSaverError';
|
|
47
|
+
code;
|
|
48
|
+
constructor(code, message) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.code = code;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mEAAmE;AAEnE,0DAA0D;AAC1D,MAAM,CAAN,IAAY,SAmBX;AAnBD,WAAY,SAAS;IACnB,sCAAsC;IACtC,8CAAiC,CAAA;IACjC,6CAA6C;IAC7C,wDAA2C,CAAA;IAC3C,6BAA6B;IAC7B,wCAA2B,CAAA;IAC3B,8DAA8D;IAC9D,oDAAuC,CAAA;IACvC,uCAAuC;IACvC,0CAA6B,CAAA;IAC7B,oCAAoC;IACpC,8CAAiC,CAAA;IACjC,iCAAiC;IACjC,wCAA2B,CAAA;IAC3B,mCAAmC;IACnC,4CAA+B,CAAA;IAC/B,wCAAwC;IACxC,gDAAmC,CAAA;AACrC,CAAC,EAnBW,SAAS,KAAT,SAAS,QAmBpB;AAED,mEAAmE;AAEnE;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpB,IAAI,GAAG,eAAe,CAAC;IAChC,IAAI,CAAY;IAEzB,YAAY,IAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ItemQuality, LocationType, StorageType, BodyLocation, CharacterClass, CLASS_NAMES, D2S_MAGIC, D2I_MAGIC, BLIZZLESS_VERSION, STASH_WIDTH, STASH_HEIGHT, INVENTORY_WIDTH, INVENTORY_HEIGHT, CUBE_WIDTH, CUBE_HEIGHT, SECTION_ITEMS, SECTION_STATS, SECTION_EXTENDED, TOKEN_PREFIX, } from './constants.js';
|
|
2
|
+
export type { ModContainer, RawItemLocation, ItemLocation, EarData, BinaryOffset, ParsedItem, LocatedItem, } from './item.js';
|
|
3
|
+
export type { CharacterStats, QuestCompletions, CharacterInfo, CharacterStatus, D2SParseResult, D2IParseResult, StashPage, SaveFileType, DetectedFormat, } from './save-file.js';
|
|
4
|
+
export type { TradeItemDTO } from './trade-item.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|