@d2runewizard/d2s 2.0.36
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/README.md +59 -0
- package/lib/binary/bitreader.d.ts +22 -0
- package/lib/binary/bitreader.js +100 -0
- package/lib/binary/bitreader.js.map +1 -0
- package/lib/binary/bitwriter.d.ts +21 -0
- package/lib/binary/bitwriter.js +118 -0
- package/lib/binary/bitwriter.js.map +1 -0
- package/lib/binary/constants.d.ts +4 -0
- package/lib/binary/constants.js +9 -0
- package/lib/binary/constants.js.map +1 -0
- package/lib/d2/attribute_enhancer.d.ts +5 -0
- package/lib/d2/attribute_enhancer.js +593 -0
- package/lib/d2/attribute_enhancer.js.map +1 -0
- package/lib/d2/attributes.d.ts +4 -0
- package/lib/d2/attributes.js +99 -0
- package/lib/d2/attributes.js.map +1 -0
- package/lib/d2/constants.d.ts +4 -0
- package/lib/d2/constants.js +16 -0
- package/lib/d2/constants.js.map +1 -0
- package/lib/d2/d2s.d.ts +10 -0
- package/lib/d2/d2s.js +106 -0
- package/lib/d2/d2s.js.map +1 -0
- package/lib/d2/header.d.ts +8 -0
- package/lib/d2/header.js +95 -0
- package/lib/d2/header.js.map +1 -0
- package/lib/d2/items.d.ts +17 -0
- package/lib/d2/items.js +728 -0
- package/lib/d2/items.js.map +1 -0
- package/lib/d2/skills.d.ts +4 -0
- package/lib/d2/skills.js +45 -0
- package/lib/d2/skills.js.map +1 -0
- package/lib/d2/stash.d.ts +3 -0
- package/lib/d2/stash.js +196 -0
- package/lib/d2/stash.js.map +1 -0
- package/lib/d2/types.d.ts +402 -0
- package/lib/d2/types.js +15 -0
- package/lib/d2/types.js.map +1 -0
- package/lib/d2/versions/default_header.d.ts +5 -0
- package/lib/d2/versions/default_header.js +721 -0
- package/lib/d2/versions/default_header.js.map +1 -0
- package/lib/data/parser.d.ts +3 -0
- package/lib/data/parser.js +627 -0
- package/lib/data/parser.js.map +1 -0
- package/lib/data/versions/96_constant_data.d.ts +14427 -0
- package/lib/data/versions/96_constant_data.js +5 -0
- package/lib/data/versions/96_constant_data.js.map +1 -0
- package/lib/data/versions/99_constant_data.d.ts +15572 -0
- package/lib/data/versions/99_constant_data.js +5 -0
- package/lib/data/versions/99_constant_data.js.map +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +47 -0
- package/lib/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writeAttributes = exports.readAttributes = void 0;
|
|
4
|
+
const bitwriter_1 = require("../binary/bitwriter");
|
|
5
|
+
//todo use constants.magical_properties and csvBits
|
|
6
|
+
async function readAttributes(char, reader, constants) {
|
|
7
|
+
char.attributes = {};
|
|
8
|
+
const header = reader.ReadString(2); //0x0000 [attributes header = 0x67, 0x66 "gf"]
|
|
9
|
+
if (header != "gf") {
|
|
10
|
+
// header is not present in first save after char is created
|
|
11
|
+
if (char.header.level === 1) {
|
|
12
|
+
const classData = constants.classes.find((c) => c.n === char.header.class).a;
|
|
13
|
+
char.attributes = {
|
|
14
|
+
strength: +classData.str,
|
|
15
|
+
energy: +classData.int,
|
|
16
|
+
dexterity: +classData.dex,
|
|
17
|
+
vitality: +classData.vit,
|
|
18
|
+
unused_stats: 0,
|
|
19
|
+
unused_skill_points: 0,
|
|
20
|
+
current_hp: +classData.vit + +classData.hpadd,
|
|
21
|
+
max_hp: +classData.vit + +classData.hpadd,
|
|
22
|
+
current_mana: +classData.int,
|
|
23
|
+
max_mana: +classData.int,
|
|
24
|
+
current_stamina: +classData.stam,
|
|
25
|
+
max_stamina: +classData.stam,
|
|
26
|
+
level: 1,
|
|
27
|
+
experience: 0,
|
|
28
|
+
gold: 0,
|
|
29
|
+
stashed_gold: 0,
|
|
30
|
+
};
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Attribute header 'gf' not found at position ${reader.offset - 2 * 8}`);
|
|
34
|
+
}
|
|
35
|
+
let bitoffset = 0;
|
|
36
|
+
let id = reader.ReadUInt16(9);
|
|
37
|
+
//read till 0x1ff end of attributes is found
|
|
38
|
+
while (id != 0x1ff) {
|
|
39
|
+
bitoffset += 9;
|
|
40
|
+
const field = constants.magical_properties[id];
|
|
41
|
+
if (field === undefined) {
|
|
42
|
+
throw new Error(`Invalid attribute id: ${id}`);
|
|
43
|
+
}
|
|
44
|
+
const size = field.cB;
|
|
45
|
+
char.attributes[Attributes[field.s]] = reader.ReadUInt32(size);
|
|
46
|
+
//current_hp - max_stamina need to be bit shifted
|
|
47
|
+
if (id >= 6 && id <= 11) {
|
|
48
|
+
char.attributes[Attributes[field.s]] >>>= 8;
|
|
49
|
+
}
|
|
50
|
+
bitoffset += size;
|
|
51
|
+
id = reader.ReadUInt16(9);
|
|
52
|
+
}
|
|
53
|
+
reader.Align();
|
|
54
|
+
}
|
|
55
|
+
exports.readAttributes = readAttributes;
|
|
56
|
+
async function writeAttributes(char, constants) {
|
|
57
|
+
const writer = new bitwriter_1.BitWriter();
|
|
58
|
+
writer.WriteString("gf", 2); //0x0000 [attributes header = 0x67, 0x66 "gf"]
|
|
59
|
+
for (let i = 0; i < 16; i++) {
|
|
60
|
+
const property = constants.magical_properties[i];
|
|
61
|
+
if (property === undefined) {
|
|
62
|
+
throw new Error(`Invalid attribute: ${property}`);
|
|
63
|
+
}
|
|
64
|
+
let value = char.attributes[Attributes[property.s]];
|
|
65
|
+
if (!value) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const size = property.cB;
|
|
69
|
+
if (i >= 6 && i <= 11) {
|
|
70
|
+
value <<= 8;
|
|
71
|
+
}
|
|
72
|
+
writer.WriteUInt16(i, 9);
|
|
73
|
+
writer.WriteUInt32(value, size);
|
|
74
|
+
}
|
|
75
|
+
writer.WriteUInt16(0x1ff, 9);
|
|
76
|
+
writer.Align();
|
|
77
|
+
return writer.ToArray();
|
|
78
|
+
}
|
|
79
|
+
exports.writeAttributes = writeAttributes;
|
|
80
|
+
//nokkas names
|
|
81
|
+
const Attributes = {
|
|
82
|
+
strength: "strength",
|
|
83
|
+
energy: "energy",
|
|
84
|
+
dexterity: "dexterity",
|
|
85
|
+
vitality: "vitality",
|
|
86
|
+
statpts: "unused_stats",
|
|
87
|
+
newskills: "unused_skill_points",
|
|
88
|
+
hitpoints: "current_hp",
|
|
89
|
+
maxhp: "max_hp",
|
|
90
|
+
mana: "current_mana",
|
|
91
|
+
maxmana: "max_mana",
|
|
92
|
+
stamina: "current_stamina",
|
|
93
|
+
maxstamina: "max_stamina",
|
|
94
|
+
level: "level",
|
|
95
|
+
experience: "experience",
|
|
96
|
+
gold: "gold",
|
|
97
|
+
goldbank: "stashed_gold",
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/d2/attributes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setConstantData = exports.getConstantData = void 0;
|
|
4
|
+
const versionedConstants = new Map();
|
|
5
|
+
function getConstantData(version) {
|
|
6
|
+
if (!(version in versionedConstants)) {
|
|
7
|
+
throw new Error(`No constant data found for this version ${version}`);
|
|
8
|
+
}
|
|
9
|
+
return versionedConstants[version];
|
|
10
|
+
}
|
|
11
|
+
exports.getConstantData = getConstantData;
|
|
12
|
+
function setConstantData(version, data) {
|
|
13
|
+
versionedConstants[version] = data;
|
|
14
|
+
}
|
|
15
|
+
exports.setConstantData = setConstantData;
|
|
16
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/d2/constants.ts"],"names":[],"mappings":";;;AAEA,MAAM,kBAAkB,GAAqC,IAAI,GAAG,EAA+B,CAAC;AAEpG,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,CAAC,CAAC,OAAO,IAAI,kBAAkB,CAAC,EAAE;QACpC,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC;KACvE;IACD,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAMQ,0CAAe;AAJxB,SAAS,eAAe,CAAC,OAAe,EAAE,IAAyB;IACjE,kBAAkB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;AACrC,CAAC;AAEyB,0CAAe"}
|
package/lib/d2/d2s.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as types from "./types";
|
|
2
|
+
import { BitReader } from "../binary/bitreader";
|
|
3
|
+
import { BitWriter } from "../binary/bitwriter";
|
|
4
|
+
declare function reader(buffer: Uint8Array): BitReader;
|
|
5
|
+
declare function read(buffer: Uint8Array, constants?: types.IConstantData, userConfig?: types.IConfig): Promise<types.ID2S>;
|
|
6
|
+
declare function readItem(buffer: Uint8Array, version: number, constants?: types.IConstantData, userConfig?: types.IConfig): Promise<types.IItem>;
|
|
7
|
+
declare function writer(buffer: Uint8Array): BitWriter;
|
|
8
|
+
declare function write(data: types.ID2S, constants?: types.IConstantData, userConfig?: types.IConfig): Promise<Uint8Array>;
|
|
9
|
+
declare function writeItem(item: types.IItem, version: number, constants?: types.IConstantData, userConfig?: types.IConfig): Promise<Uint8Array>;
|
|
10
|
+
export { reader, writer, read, write, readItem, writeItem };
|
package/lib/d2/d2s.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.writeItem = exports.readItem = exports.write = exports.read = exports.writer = exports.reader = void 0;
|
|
23
|
+
const header_1 = require("./header");
|
|
24
|
+
const attributes_1 = require("./attributes");
|
|
25
|
+
const bitreader_1 = require("../binary/bitreader");
|
|
26
|
+
const bitwriter_1 = require("../binary/bitwriter");
|
|
27
|
+
const skills_1 = require("./skills");
|
|
28
|
+
const items = __importStar(require("./items"));
|
|
29
|
+
const constants_1 = require("./constants");
|
|
30
|
+
const attribute_enhancer_1 = require("./attribute_enhancer");
|
|
31
|
+
const defaultConfig = {
|
|
32
|
+
extendedStash: false,
|
|
33
|
+
sortProperties: true,
|
|
34
|
+
};
|
|
35
|
+
function reader(buffer) {
|
|
36
|
+
return new bitreader_1.BitReader(buffer);
|
|
37
|
+
}
|
|
38
|
+
exports.reader = reader;
|
|
39
|
+
async function read(buffer, constants, userConfig) {
|
|
40
|
+
const char = {};
|
|
41
|
+
const reader = new bitreader_1.BitReader(buffer);
|
|
42
|
+
const config = Object.assign(defaultConfig, userConfig);
|
|
43
|
+
await header_1.readHeader(char, reader);
|
|
44
|
+
//could load constants based on version here
|
|
45
|
+
if (!constants) {
|
|
46
|
+
constants = constants_1.getConstantData(char.header.version);
|
|
47
|
+
}
|
|
48
|
+
await header_1.readHeaderData(char, reader, constants);
|
|
49
|
+
await attributes_1.readAttributes(char, reader, constants);
|
|
50
|
+
await skills_1.readSkills(char, reader, constants);
|
|
51
|
+
await items.readCharItems(char, reader, constants, config);
|
|
52
|
+
await items.readCorpseItems(char, reader, constants, config);
|
|
53
|
+
if (char.header.status.expansion) {
|
|
54
|
+
await items.readMercItems(char, reader, constants, config);
|
|
55
|
+
await items.readGolemItems(char, reader, constants, config);
|
|
56
|
+
}
|
|
57
|
+
await attribute_enhancer_1.enhanceAttributes(char, constants, config);
|
|
58
|
+
return char;
|
|
59
|
+
}
|
|
60
|
+
exports.read = read;
|
|
61
|
+
async function readItem(buffer, version, constants, userConfig) {
|
|
62
|
+
const reader = new bitreader_1.BitReader(buffer);
|
|
63
|
+
const config = Object.assign(defaultConfig, userConfig);
|
|
64
|
+
if (!constants) {
|
|
65
|
+
constants = constants_1.getConstantData(version);
|
|
66
|
+
}
|
|
67
|
+
const item = await items.readItem(reader, version, constants, config);
|
|
68
|
+
await attribute_enhancer_1.enhanceItems([item], constants);
|
|
69
|
+
return item;
|
|
70
|
+
}
|
|
71
|
+
exports.readItem = readItem;
|
|
72
|
+
function writer(buffer) {
|
|
73
|
+
return new bitwriter_1.BitWriter();
|
|
74
|
+
}
|
|
75
|
+
exports.writer = writer;
|
|
76
|
+
async function write(data, constants, userConfig) {
|
|
77
|
+
const config = Object.assign(defaultConfig, userConfig);
|
|
78
|
+
const writer = new bitwriter_1.BitWriter();
|
|
79
|
+
writer.WriteArray(await header_1.writeHeader(data));
|
|
80
|
+
if (!constants) {
|
|
81
|
+
constants = constants_1.getConstantData(data.header.version);
|
|
82
|
+
}
|
|
83
|
+
writer.WriteArray(await header_1.writeHeaderData(data, constants));
|
|
84
|
+
writer.WriteArray(await attributes_1.writeAttributes(data, constants));
|
|
85
|
+
writer.WriteArray(await skills_1.writeSkills(data, constants));
|
|
86
|
+
writer.WriteArray(await items.writeCharItems(data, constants, config));
|
|
87
|
+
writer.WriteArray(await items.writeCorpseItem(data, constants, config));
|
|
88
|
+
if (data.header.status.expansion) {
|
|
89
|
+
writer.WriteArray(await items.writeMercItems(data, constants, config));
|
|
90
|
+
writer.WriteArray(await items.writeGolemItems(data, constants, config));
|
|
91
|
+
}
|
|
92
|
+
await header_1.fixHeader(writer);
|
|
93
|
+
return writer.ToArray();
|
|
94
|
+
}
|
|
95
|
+
exports.write = write;
|
|
96
|
+
async function writeItem(item, version, constants, userConfig) {
|
|
97
|
+
const config = Object.assign(defaultConfig, userConfig);
|
|
98
|
+
const writer = new bitwriter_1.BitWriter();
|
|
99
|
+
if (!constants) {
|
|
100
|
+
constants = constants_1.getConstantData(version);
|
|
101
|
+
}
|
|
102
|
+
writer.WriteArray(await items.writeItem(item, version, constants, config));
|
|
103
|
+
return writer.ToArray();
|
|
104
|
+
}
|
|
105
|
+
exports.writeItem = writeItem;
|
|
106
|
+
//# sourceMappingURL=d2s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d2s.js","sourceRoot":"","sources":["../../src/d2/d2s.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,qCAA+F;AAC/F,6CAA+D;AAC/D,mDAAgD;AAChD,mDAAgD;AAChD,qCAAmD;AACnD,+CAAiC;AACjC,2CAA8C;AAC9C,6DAAuE;AAEvE,MAAM,aAAa,GAAG;IACpB,aAAa,EAAE,KAAK;IACpB,cAAc,EAAE,IAAI;CACJ,CAAC;AAEnB,SAAS,MAAM,CAAC,MAAkB;IAChC,OAAO,IAAI,qBAAS,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AA+EQ,wBAAM;AA7Ef,KAAK,UAAU,IAAI,CAAC,MAAkB,EAAE,SAA+B,EAAE,UAA0B;IACjG,MAAM,IAAI,GAAG,EAAgB,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,qBAAS,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,mBAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,IAAI,CAAC,SAAS,EAAE;QACd,SAAS,GAAG,2BAAe,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAClD;IACD,MAAM,uBAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,2BAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,mBAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;QAChC,MAAM,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;KAC7D;IACD,MAAM,sCAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAyDwB,oBAAI;AAvD7B,KAAK,UAAU,QAAQ,CACrB,MAAkB,EAClB,OAAe,EACf,SAA+B,EAC/B,UAA0B;IAE1B,MAAM,MAAM,GAAG,IAAI,qBAAS,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE;QACd,SAAS,GAAG,2BAAe,CAAC,OAAO,CAAC,CAAC;KACtC;IACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,iCAAY,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAyCqC,4BAAQ;AAvC9C,SAAS,MAAM,CAAC,MAAkB;IAChC,OAAO,IAAI,qBAAS,EAAE,CAAC;AACzB,CAAC;AAqCgB,wBAAM;AAnCvB,KAAK,UAAU,KAAK,CAAC,IAAgB,EAAE,SAA+B,EAAE,UAA0B;IAChG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,qBAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,UAAU,CAAC,MAAM,oBAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS,EAAE;QACd,SAAS,GAAG,2BAAe,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAClD;IACD,MAAM,CAAC,UAAU,CAAC,MAAM,wBAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,CAAC,MAAM,4BAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,CAAC,MAAM,oBAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACvE,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;QAChC,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;KACzE;IACD,MAAM,kBAAS,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAiB8B,sBAAK;AAfpC,KAAK,UAAU,SAAS,CACtB,IAAiB,EACjB,OAAe,EACf,SAA+B,EAC/B,UAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,qBAAS,EAAE,CAAC;IAC/B,IAAI,CAAC,SAAS,EAAE;QACd,SAAS,GAAG,2BAAe,CAAC,OAAO,CAAC,CAAC;KACtC;IACD,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAE+C,8BAAS"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as types from "./types";
|
|
2
|
+
import { BitReader } from "../binary/bitreader";
|
|
3
|
+
import { BitWriter } from "../binary/bitwriter";
|
|
4
|
+
export declare function readHeader(char: types.ID2S, reader: BitReader): Promise<void>;
|
|
5
|
+
export declare function readHeaderData(char: types.ID2S, reader: BitReader, constants: types.IConstantData): Promise<void>;
|
|
6
|
+
export declare function writeHeader(char: types.ID2S): Promise<Uint8Array>;
|
|
7
|
+
export declare function writeHeaderData(char: types.ID2S, constants: types.IConstantData): Promise<Uint8Array>;
|
|
8
|
+
export declare function fixHeader(writer: BitWriter): Promise<void>;
|
package/lib/d2/header.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.fixHeader = exports.writeHeaderData = exports.writeHeader = exports.readHeaderData = exports.readHeader = void 0;
|
|
23
|
+
const bitwriter_1 = require("../binary/bitwriter");
|
|
24
|
+
async function readHeader(char, reader) {
|
|
25
|
+
char.header = {};
|
|
26
|
+
//0x0000
|
|
27
|
+
char.header.identifier = reader.ReadUInt32().toString(16).padStart(8, "0");
|
|
28
|
+
if (char.header.identifier != "aa55aa55") {
|
|
29
|
+
throw new Error(`D2S identifier 'aa55aa55' not found at position ${reader.offset - 4 * 8}`);
|
|
30
|
+
}
|
|
31
|
+
//0x0004
|
|
32
|
+
char.header.version = reader.ReadUInt32();
|
|
33
|
+
}
|
|
34
|
+
exports.readHeader = readHeader;
|
|
35
|
+
async function readHeaderData(char, reader, constants) {
|
|
36
|
+
const v = await _versionSpecificHeader(char.header.version);
|
|
37
|
+
if (v == null) {
|
|
38
|
+
throw new Error(`Cannot parse version: ${char.header.version}`);
|
|
39
|
+
}
|
|
40
|
+
v.readHeader(char, reader, constants);
|
|
41
|
+
}
|
|
42
|
+
exports.readHeaderData = readHeaderData;
|
|
43
|
+
async function writeHeader(char) {
|
|
44
|
+
const writer = new bitwriter_1.BitWriter();
|
|
45
|
+
writer.WriteUInt32(parseInt(char.header.identifier, 16)).WriteUInt32(char.header.version);
|
|
46
|
+
return writer.ToArray();
|
|
47
|
+
}
|
|
48
|
+
exports.writeHeader = writeHeader;
|
|
49
|
+
async function writeHeaderData(char, constants) {
|
|
50
|
+
const writer = new bitwriter_1.BitWriter();
|
|
51
|
+
const v = await _versionSpecificHeader(char.header.version);
|
|
52
|
+
if (v == null) {
|
|
53
|
+
throw new Error(`Cannot parse version: ${char.header.version}`);
|
|
54
|
+
}
|
|
55
|
+
v.writeHeader(char, writer, constants);
|
|
56
|
+
return writer.ToArray();
|
|
57
|
+
}
|
|
58
|
+
exports.writeHeaderData = writeHeaderData;
|
|
59
|
+
async function fixHeader(writer) {
|
|
60
|
+
let checksum = 0;
|
|
61
|
+
const eof = writer.length / 8;
|
|
62
|
+
writer.SeekByte(0x0008).WriteUInt32(eof);
|
|
63
|
+
writer.SeekByte(0x000c).WriteUInt32(0);
|
|
64
|
+
for (let i = 0; i < eof; i++) {
|
|
65
|
+
let byte = writer.SeekByte(i).PeekBytes(1)[0];
|
|
66
|
+
if (checksum & 0x80000000) {
|
|
67
|
+
byte += 1;
|
|
68
|
+
}
|
|
69
|
+
checksum = byte + checksum * 2;
|
|
70
|
+
//hack make it a uint32
|
|
71
|
+
checksum >>>= 0;
|
|
72
|
+
}
|
|
73
|
+
//checksum pos
|
|
74
|
+
writer.SeekByte(0x000c).WriteUInt32(checksum);
|
|
75
|
+
}
|
|
76
|
+
exports.fixHeader = fixHeader;
|
|
77
|
+
/**
|
|
78
|
+
* Save Version
|
|
79
|
+
* 0x47, 0x0, 0x0, 0x0 = <1.06
|
|
80
|
+
* 0x59, 0x0, 0x0, 0x0 = 1.08 = version
|
|
81
|
+
* 0x5c, 0x0, 0x0, 0x0 = 1.09 = version
|
|
82
|
+
* 0x60, 0x0, 0x0, 0x0 = 1.13c = version
|
|
83
|
+
* 0x62, 0x0, 0x0, 0x0 = 1.2 = version
|
|
84
|
+
* */
|
|
85
|
+
async function _versionSpecificHeader(version) {
|
|
86
|
+
switch (version) {
|
|
87
|
+
case 0x60: {
|
|
88
|
+
return await Promise.resolve().then(() => __importStar(require(`./versions/default_header`)));
|
|
89
|
+
}
|
|
90
|
+
default: {
|
|
91
|
+
return await Promise.resolve().then(() => __importStar(require(`./versions/default_header`)));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/d2/header.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as types from "./types";
|
|
2
|
+
import { BitReader } from "../binary/bitreader";
|
|
3
|
+
import { BitWriter } from "../binary/bitwriter";
|
|
4
|
+
export declare function readCharItems(char: types.ID2S, reader: BitReader, constants: types.IConstantData, config: types.IConfig): Promise<void>;
|
|
5
|
+
export declare function writeCharItems(char: types.ID2S, constants: types.IConstantData, config: types.IConfig): Promise<Uint8Array>;
|
|
6
|
+
export declare function readMercItems(char: types.ID2S, reader: BitReader, constants: types.IConstantData, config: types.IConfig): Promise<void>;
|
|
7
|
+
export declare function writeMercItems(char: types.ID2S, constants: types.IConstantData, config: types.IConfig): Promise<Uint8Array>;
|
|
8
|
+
export declare function readGolemItems(char: types.ID2S, reader: BitReader, constants: types.IConstantData, config: types.IConfig): Promise<void>;
|
|
9
|
+
export declare function writeGolemItems(char: types.ID2S, constants: types.IConstantData, config: types.IConfig): Promise<Uint8Array>;
|
|
10
|
+
export declare function readCorpseItems(char: types.ID2S, reader: BitReader, constants: types.IConstantData, config: types.IConfig): Promise<void>;
|
|
11
|
+
export declare function writeCorpseItem(char: types.ID2S, constants: types.IConstantData, config: types.IConfig): Promise<Uint8Array>;
|
|
12
|
+
export declare function readItems(reader: BitReader, version: number, constants: types.IConstantData, config: types.IConfig, char?: types.ID2S): Promise<types.IItem[]>;
|
|
13
|
+
export declare function writeItems(items: types.IItem[], version: number, constants: types.IConstantData, config: types.IConfig): Promise<Uint8Array>;
|
|
14
|
+
export declare function readItem(reader: BitReader, version: number, originalConstants: types.IConstantData, config: types.IConfig, parent?: types.IItem): Promise<types.IItem>;
|
|
15
|
+
export declare function writeItem(item: types.IItem, version: number, constants: types.IConstantData, config: types.IConfig): Promise<Uint8Array>;
|
|
16
|
+
export declare function _readMagicProperties(reader: BitReader, constants: types.IConstantData): types.IMagicProperty[];
|
|
17
|
+
export declare function _writeMagicProperties(writer: BitWriter, properties: types.IMagicProperty[], constants: types.IConstantData): void;
|