@etothepii/satisfactory-file-parser 0.0.11 → 0.0.12
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/build/index.d.ts +5 -1
- package/build/index.js +46 -9
- package/build/parser/blueprint-reader.js +28 -20
- package/build/parser/blueprint-writer.js +20 -15
- package/build/parser/byte/alignment.enum.js +5 -2
- package/build/parser/byte/byte-reader.class.js +13 -9
- package/build/parser/byte/byte-writer.class.js +13 -10
- package/build/parser/error/parser.error.js +11 -4
- package/build/parser/parser.js +15 -12
- package/build/parser/satisfactory/blueprint/blueprint.js +2 -1
- package/build/parser/satisfactory/level.class.js +28 -24
- package/build/parser/satisfactory/objects/DataFields.js +76 -72
- package/build/parser/satisfactory/objects/ObjectReference.js +5 -1
- package/build/parser/satisfactory/objects/Property.js +118 -87
- package/build/parser/satisfactory/objects/SaveComponent.js +11 -7
- package/build/parser/satisfactory/objects/SaveEntity.js +17 -13
- package/build/parser/satisfactory/objects/SaveObject.js +9 -5
- package/build/parser/satisfactory/satisfactory-save.js +5 -1
- package/build/parser/satisfactory/static-data.js +2 -1
- package/build/parser/satisfactory/structs/util.types.js +47 -27
- package/build/parser/save-reader.js +34 -26
- package/build/parser/save-writer.js +33 -26
- package/package.json +1 -2
package/build/index.d.ts
CHANGED
|
@@ -3,9 +3,13 @@ export { DataFields } from './parser/satisfactory/objects/DataFields';
|
|
|
3
3
|
export { ObjectReference } from './parser/satisfactory/objects/ObjectReference';
|
|
4
4
|
export * from './parser/satisfactory/objects/Property';
|
|
5
5
|
export { SaveComponent } from './parser/satisfactory/objects/SaveComponent';
|
|
6
|
+
export { SaveEntity } from './parser/satisfactory/objects/SaveEntity';
|
|
6
7
|
export type * from './parser/satisfactory/satisfactory-save';
|
|
7
8
|
export { StaticData } from './parser/satisfactory/static-data';
|
|
9
|
+
export { BlueprintConfigReader, BlueprintReader } from './parser/blueprint-reader';
|
|
10
|
+
export { BlueprintConfigWriter, BlueprintWriter } from './parser/blueprint-writer';
|
|
8
11
|
export type * from './parser/satisfactory/structs/util.types';
|
|
9
|
-
export {
|
|
12
|
+
export { SaveReader } from './parser/save-reader';
|
|
13
|
+
export { SaveWriter } from './parser/save-writer';
|
|
10
14
|
export { CompressionLibraryError, CorruptSaveError, ParserError, UnsupportedVersionError } from './parser/error/parser.error';
|
|
11
15
|
export { SaveParser } from './parser/parser';
|
package/build/index.js
CHANGED
|
@@ -1,12 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SaveParser = exports.UnsupportedVersionError = exports.ParserError = exports.CorruptSaveError = exports.CompressionLibraryError = exports.SaveWriter = exports.SaveReader = exports.BlueprintWriter = exports.BlueprintConfigWriter = exports.BlueprintReader = exports.BlueprintConfigReader = exports.SaveEntity = exports.SaveComponent = exports.ObjectReference = exports.DataFields = exports.Level = void 0;
|
|
1
18
|
// types & classes for convenience
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
19
|
+
var level_class_1 = require("./parser/satisfactory/level.class");
|
|
20
|
+
Object.defineProperty(exports, "Level", { enumerable: true, get: function () { return level_class_1.Level; } });
|
|
21
|
+
var DataFields_1 = require("./parser/satisfactory/objects/DataFields");
|
|
22
|
+
Object.defineProperty(exports, "DataFields", { enumerable: true, get: function () { return DataFields_1.DataFields; } });
|
|
23
|
+
var ObjectReference_1 = require("./parser/satisfactory/objects/ObjectReference");
|
|
24
|
+
Object.defineProperty(exports, "ObjectReference", { enumerable: true, get: function () { return ObjectReference_1.ObjectReference; } });
|
|
25
|
+
__exportStar(require("./parser/satisfactory/objects/Property"), exports);
|
|
26
|
+
var SaveComponent_1 = require("./parser/satisfactory/objects/SaveComponent");
|
|
27
|
+
Object.defineProperty(exports, "SaveComponent", { enumerable: true, get: function () { return SaveComponent_1.SaveComponent; } });
|
|
28
|
+
var SaveEntity_1 = require("./parser/satisfactory/objects/SaveEntity");
|
|
29
|
+
Object.defineProperty(exports, "SaveEntity", { enumerable: true, get: function () { return SaveEntity_1.SaveEntity; } });
|
|
30
|
+
// should better be removed in a future update to prevent shenanigans.
|
|
31
|
+
var blueprint_reader_1 = require("./parser/blueprint-reader");
|
|
32
|
+
Object.defineProperty(exports, "BlueprintConfigReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintConfigReader; } });
|
|
33
|
+
Object.defineProperty(exports, "BlueprintReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintReader; } });
|
|
34
|
+
var blueprint_writer_1 = require("./parser/blueprint-writer");
|
|
35
|
+
Object.defineProperty(exports, "BlueprintConfigWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintConfigWriter; } });
|
|
36
|
+
Object.defineProperty(exports, "BlueprintWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintWriter; } });
|
|
37
|
+
var save_reader_1 = require("./parser/save-reader");
|
|
38
|
+
Object.defineProperty(exports, "SaveReader", { enumerable: true, get: function () { return save_reader_1.SaveReader; } });
|
|
39
|
+
var save_writer_1 = require("./parser/save-writer");
|
|
40
|
+
Object.defineProperty(exports, "SaveWriter", { enumerable: true, get: function () { return save_writer_1.SaveWriter; } });
|
|
9
41
|
// errors
|
|
10
|
-
|
|
42
|
+
var parser_error_1 = require("./parser/error/parser.error");
|
|
43
|
+
Object.defineProperty(exports, "CompressionLibraryError", { enumerable: true, get: function () { return parser_error_1.CompressionLibraryError; } });
|
|
44
|
+
Object.defineProperty(exports, "CorruptSaveError", { enumerable: true, get: function () { return parser_error_1.CorruptSaveError; } });
|
|
45
|
+
Object.defineProperty(exports, "ParserError", { enumerable: true, get: function () { return parser_error_1.ParserError; } });
|
|
46
|
+
Object.defineProperty(exports, "UnsupportedVersionError", { enumerable: true, get: function () { return parser_error_1.UnsupportedVersionError; } });
|
|
11
47
|
// facade
|
|
12
|
-
|
|
48
|
+
var parser_1 = require("./parser/parser");
|
|
49
|
+
Object.defineProperty(exports, "SaveParser", { enumerable: true, get: function () { return parser_1.SaveParser; } });
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BlueprintConfigReader = exports.BlueprintReader = void 0;
|
|
7
|
+
const pako_1 = __importDefault(require("pako"));
|
|
8
|
+
const alignment_enum_1 = require("./byte/alignment.enum");
|
|
9
|
+
const byte_reader_class_1 = require("./byte/byte-reader.class");
|
|
10
|
+
const parser_error_1 = require("./error/parser.error");
|
|
11
|
+
const level_class_1 = require("./satisfactory/level.class");
|
|
12
|
+
const util_types_1 = require("./satisfactory/structs/util.types");
|
|
13
|
+
class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
8
14
|
constructor(bluePrintBuffer) {
|
|
9
|
-
super(bluePrintBuffer, Alignment.LITTLE_ENDIAN);
|
|
15
|
+
super(bluePrintBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
10
16
|
this.compressionInfo = {
|
|
11
17
|
packageFileTag: 0,
|
|
12
18
|
maxChunkContentSize: 0,
|
|
@@ -15,7 +21,7 @@ export class BlueprintReader extends ByteReader {
|
|
|
15
21
|
}
|
|
16
22
|
static ReadHeader(reader) {
|
|
17
23
|
const unk = reader.readBytes(3 * 4); // 02 00 00 00, 24 00 00 00, 7F 3B 03 00 - always
|
|
18
|
-
const positionThingOrWhat = ParseVec3(reader); // 04 00 00 00, 04 00 00 00, 04 00 00 00 - always
|
|
24
|
+
const positionThingOrWhat = (0, util_types_1.ParseVec3)(reader); // 04 00 00 00, 04 00 00 00, 04 00 00 00 - always
|
|
19
25
|
// list of item costs.
|
|
20
26
|
let itemTypeCount = reader.readInt32();
|
|
21
27
|
const itemCosts = new Array(itemTypeCount).fill(['', 0]);
|
|
@@ -53,13 +59,13 @@ export class BlueprintReader extends ByteReader {
|
|
|
53
59
|
this.currentByte = this.compressionInfo.chunkHeaderSize;
|
|
54
60
|
this.handledByte += this.compressionInfo.chunkHeaderSize;
|
|
55
61
|
if (this.compressionInfo.packageFileTag <= 0) {
|
|
56
|
-
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
62
|
+
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
57
63
|
}
|
|
58
64
|
if (this.compressionInfo.maxChunkContentSize <= 0) {
|
|
59
|
-
this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN); //00 00 02 00 = 131072
|
|
65
|
+
this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN); //00 00 02 00 = 131072
|
|
60
66
|
}
|
|
61
|
-
const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
62
|
-
const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
67
|
+
const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
68
|
+
const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
63
69
|
totalUncompressedBodySize += chunkUncompressedLength;
|
|
64
70
|
const currentChunkSize = chunkCompressedLength;
|
|
65
71
|
let currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);
|
|
@@ -71,11 +77,11 @@ export class BlueprintReader extends ByteReader {
|
|
|
71
77
|
try {
|
|
72
78
|
// Inflate current chunk
|
|
73
79
|
let currentInflatedChunk = null;
|
|
74
|
-
currentInflatedChunk =
|
|
80
|
+
currentInflatedChunk = pako_1.default.inflate(currentChunk);
|
|
75
81
|
currentChunks.push(currentInflatedChunk);
|
|
76
82
|
}
|
|
77
83
|
catch (err) {
|
|
78
|
-
throw new ParserError('ParserError', 'An error occurred while calling pako inflate.' + err);
|
|
84
|
+
throw new parser_error_1.ParserError('ParserError', 'An error occurred while calling pako inflate.' + err);
|
|
79
85
|
}
|
|
80
86
|
}
|
|
81
87
|
//TODO we can get rid of file buffer here.
|
|
@@ -102,15 +108,16 @@ export class BlueprintReader extends ByteReader {
|
|
|
102
108
|
// object headers
|
|
103
109
|
const objectHeadersBinarySize = reader.readInt32();
|
|
104
110
|
let objects = [];
|
|
105
|
-
Level.ReadObjectHeaders(reader, objects, () => { });
|
|
111
|
+
level_class_1.Level.ReadObjectHeaders(reader, objects, () => { });
|
|
106
112
|
// objects contents
|
|
107
|
-
Level.ReadObjectContents(reader, objects, 0, () => { });
|
|
113
|
+
level_class_1.Level.ReadObjectContents(reader, objects, 0, () => { });
|
|
108
114
|
return objects;
|
|
109
115
|
}
|
|
110
116
|
}
|
|
111
|
-
|
|
117
|
+
exports.BlueprintReader = BlueprintReader;
|
|
118
|
+
class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
|
|
112
119
|
constructor(bluePrintConfigBuffer) {
|
|
113
|
-
super(bluePrintConfigBuffer, Alignment.LITTLE_ENDIAN);
|
|
120
|
+
super(bluePrintConfigBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
114
121
|
this.bluePrintConfigBuffer = bluePrintConfigBuffer;
|
|
115
122
|
this.parse = () => BlueprintConfigReader.ParseConfig(this);
|
|
116
123
|
}
|
|
@@ -118,7 +125,7 @@ export class BlueprintConfigReader extends ByteReader {
|
|
|
118
125
|
const unk = reader.readInt32(); // unknown, seems to always be 02.
|
|
119
126
|
const description = reader.readString();
|
|
120
127
|
const unk3 = reader.readInt32(); // iconID. default is 0x0E03 = 782
|
|
121
|
-
const colorMaybe = ParseCol4RGBA(reader); // LinearColor, which is 4x float32 as RGBA
|
|
128
|
+
const colorMaybe = (0, util_types_1.ParseCol4RGBA)(reader); // LinearColor, which is 4x float32 as RGBA
|
|
122
129
|
return {
|
|
123
130
|
description,
|
|
124
131
|
color: colorMaybe,
|
|
@@ -126,3 +133,4 @@ export class BlueprintConfigReader extends ByteReader {
|
|
|
126
133
|
};
|
|
127
134
|
}
|
|
128
135
|
}
|
|
136
|
+
exports.BlueprintConfigReader = BlueprintConfigReader;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BlueprintConfigWriter = exports.BlueprintWriter = void 0;
|
|
4
|
+
const level_class_1 = require("../parser/satisfactory/level.class");
|
|
5
|
+
const util_types_1 = require("../parser/satisfactory/structs/util.types");
|
|
6
|
+
const alignment_enum_1 = require("./byte/alignment.enum");
|
|
7
|
+
const byte_writer_class_1 = require("./byte/byte-writer.class");
|
|
8
|
+
const parser_error_1 = require("./error/parser.error");
|
|
9
|
+
const save_writer_1 = require("./save-writer");
|
|
10
|
+
class BlueprintWriter extends byte_writer_class_1.ByteWriter {
|
|
8
11
|
constructor() {
|
|
9
|
-
super(Alignment.LITTLE_ENDIAN);
|
|
12
|
+
super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
10
13
|
}
|
|
11
14
|
static SerializeHeader(writer, header) {
|
|
12
15
|
writer.writeInt32(2); // unknown, seems to always be 02.
|
|
@@ -32,33 +35,35 @@ export class BlueprintWriter extends ByteWriter {
|
|
|
32
35
|
}
|
|
33
36
|
generateChunks(compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
|
|
34
37
|
if (posAfterHeader <= 0) {
|
|
35
|
-
throw new ParserError('ParserError', 'seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
38
|
+
throw new parser_error_1.ParserError('ParserError', 'seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
36
39
|
}
|
|
37
40
|
// send plain header first.
|
|
38
41
|
const header = new Uint8Array(this.bufferArray.slice(0, posAfterHeader));
|
|
39
42
|
onHeader(header);
|
|
40
43
|
// create save body
|
|
41
44
|
this.bufferArray = this.bufferArray.slice(posAfterHeader);
|
|
42
|
-
SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, this.alignment);
|
|
45
|
+
save_writer_1.SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, this.alignment);
|
|
43
46
|
}
|
|
44
47
|
static SerializeObjects(writer, objects) {
|
|
45
48
|
// object headers
|
|
46
49
|
const headersLenIndicator = writer.getBufferPosition();
|
|
47
50
|
writer.writeInt32(0);
|
|
48
|
-
Level.SerializeObjectHeaders(writer, objects);
|
|
51
|
+
level_class_1.Level.SerializeObjectHeaders(writer, objects);
|
|
49
52
|
writer.writeBinarySizeFromPosition(headersLenIndicator, headersLenIndicator + 4);
|
|
50
53
|
// objects contents
|
|
51
|
-
Level.SerializeObjectContents(writer, objects, 0);
|
|
54
|
+
level_class_1.Level.SerializeObjectContents(writer, objects, 0);
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
|
-
|
|
57
|
+
exports.BlueprintWriter = BlueprintWriter;
|
|
58
|
+
class BlueprintConfigWriter extends byte_writer_class_1.ByteWriter {
|
|
55
59
|
constructor() {
|
|
56
|
-
super(Alignment.LITTLE_ENDIAN);
|
|
60
|
+
super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
57
61
|
}
|
|
58
62
|
static SerializeConfig(writer, config) {
|
|
59
63
|
writer.writeInt32(2); // unknown, seems to always be 02.
|
|
60
64
|
writer.writeString(config.description);
|
|
61
65
|
writer.writeInt32(config.iconID);
|
|
62
|
-
SerializeCol4RGBA(writer, config.color);
|
|
66
|
+
(0, util_types_1.SerializeCol4RGBA)(writer, config.color);
|
|
63
67
|
}
|
|
64
68
|
}
|
|
69
|
+
exports.BlueprintConfigWriter = BlueprintConfigWriter;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Alignment = void 0;
|
|
4
|
+
var Alignment;
|
|
2
5
|
(function (Alignment) {
|
|
3
6
|
Alignment[Alignment["BIG_ENDIAN"] = 0] = "BIG_ENDIAN";
|
|
4
7
|
Alignment[Alignment["LITTLE_ENDIAN"] = 1] = "LITTLE_ENDIAN";
|
|
5
|
-
})(Alignment || (Alignment = {}));
|
|
8
|
+
})(Alignment = exports.Alignment || (exports.Alignment = {}));
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ByteReader = void 0;
|
|
4
|
+
const alignment_enum_1 = require("./alignment.enum");
|
|
5
|
+
class ByteReader {
|
|
3
6
|
constructor(fileBuffer, alignment) {
|
|
4
7
|
this.currentByte = 0;
|
|
5
8
|
this.handledByte = 0;
|
|
@@ -54,32 +57,32 @@ export class ByteReader {
|
|
|
54
57
|
return data;
|
|
55
58
|
}
|
|
56
59
|
readUint16() {
|
|
57
|
-
let data = this.bufferView.getUint16(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
60
|
+
let data = this.bufferView.getUint16(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
58
61
|
this.currentByte += 2;
|
|
59
62
|
return data;
|
|
60
63
|
}
|
|
61
64
|
readInt32() {
|
|
62
|
-
let data = this.bufferView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
65
|
+
let data = this.bufferView.getInt32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
63
66
|
this.currentByte += 4;
|
|
64
67
|
return data;
|
|
65
68
|
}
|
|
66
69
|
readUint32() {
|
|
67
|
-
let data = this.bufferView.getUint32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
70
|
+
let data = this.bufferView.getUint32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
68
71
|
this.currentByte += 4;
|
|
69
72
|
return data;
|
|
70
73
|
}
|
|
71
74
|
readLong() {
|
|
72
|
-
let data = this.bufferView.getBigInt64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
75
|
+
let data = this.bufferView.getBigInt64(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
73
76
|
this.currentByte += 8;
|
|
74
77
|
return data;
|
|
75
78
|
}
|
|
76
79
|
readFloat() {
|
|
77
|
-
let data = this.bufferView.getFloat32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
80
|
+
let data = this.bufferView.getFloat32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
78
81
|
this.currentByte += 4;
|
|
79
82
|
return data;
|
|
80
83
|
}
|
|
81
84
|
readDouble() {
|
|
82
|
-
let data = this.bufferView.getFloat64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
85
|
+
let data = this.bufferView.getFloat64(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
83
86
|
this.currentByte += 8;
|
|
84
87
|
return data;
|
|
85
88
|
}
|
|
@@ -87,7 +90,7 @@ export class ByteReader {
|
|
|
87
90
|
let payload = '';
|
|
88
91
|
let counter = this.currentByte;
|
|
89
92
|
try {
|
|
90
|
-
let strLength = this.bufferView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
93
|
+
let strLength = this.bufferView.getInt32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
91
94
|
counter += 4;
|
|
92
95
|
payload = new Array(strLength - 1).fill('').map(c => String.fromCharCode(this.bufferView.getUint8(counter++))).join('');
|
|
93
96
|
}
|
|
@@ -126,3 +129,4 @@ export class ByteReader {
|
|
|
126
129
|
}
|
|
127
130
|
}
|
|
128
131
|
}
|
|
132
|
+
exports.ByteReader = ByteReader;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ByteWriter = void 0;
|
|
4
|
+
const alignment_enum_1 = require("./alignment.enum");
|
|
2
5
|
class ByteWriter {
|
|
3
6
|
constructor(alignment, bufferSize = 500) {
|
|
4
7
|
this.getBufferPosition = () => this.currentByte;
|
|
@@ -41,42 +44,42 @@ class ByteWriter {
|
|
|
41
44
|
}
|
|
42
45
|
writeInt16(value) {
|
|
43
46
|
this.extendBufferIfNeeded(2);
|
|
44
|
-
this.bufferView.setInt16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
47
|
+
this.bufferView.setInt16(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
45
48
|
this.currentByte += 2;
|
|
46
49
|
}
|
|
47
50
|
writeUint16(value) {
|
|
48
51
|
this.extendBufferIfNeeded(2);
|
|
49
|
-
this.bufferView.setUint16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
52
|
+
this.bufferView.setUint16(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
50
53
|
this.currentByte += 2;
|
|
51
54
|
}
|
|
52
55
|
writeInt32(value) {
|
|
53
56
|
this.extendBufferIfNeeded(4);
|
|
54
|
-
this.bufferView.setInt32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
57
|
+
this.bufferView.setInt32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
55
58
|
this.currentByte += 4;
|
|
56
59
|
}
|
|
57
60
|
writeUint32(value) {
|
|
58
61
|
this.extendBufferIfNeeded(4);
|
|
59
|
-
this.bufferView.setUint32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
62
|
+
this.bufferView.setUint32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
60
63
|
this.currentByte += 4;
|
|
61
64
|
}
|
|
62
65
|
writeInt64(value) {
|
|
63
66
|
this.extendBufferIfNeeded(8);
|
|
64
|
-
this.bufferView.setBigInt64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
67
|
+
this.bufferView.setBigInt64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
65
68
|
this.currentByte += 8;
|
|
66
69
|
}
|
|
67
70
|
writeUint64(value) {
|
|
68
71
|
this.extendBufferIfNeeded(8);
|
|
69
|
-
this.bufferView.setBigUint64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
72
|
+
this.bufferView.setBigUint64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
70
73
|
this.currentByte += 8;
|
|
71
74
|
}
|
|
72
75
|
writeFloat(value) {
|
|
73
76
|
this.extendBufferIfNeeded(4);
|
|
74
|
-
this.bufferView.setFloat32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
77
|
+
this.bufferView.setFloat32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
75
78
|
this.currentByte += 4;
|
|
76
79
|
}
|
|
77
80
|
writeDouble(value) {
|
|
78
81
|
this.extendBufferIfNeeded(8);
|
|
79
|
-
this.bufferView.setFloat64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
82
|
+
this.bufferView.setFloat64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
80
83
|
this.currentByte += 8;
|
|
81
84
|
}
|
|
82
85
|
writeString(value) {
|
|
@@ -143,4 +146,4 @@ class ByteWriter {
|
|
|
143
146
|
;
|
|
144
147
|
}
|
|
145
148
|
ByteWriter.IsASCIICompatible = (value) => /^[\x00-\x7F]*$/.test(value);
|
|
146
|
-
|
|
149
|
+
exports.ByteWriter = ByteWriter;
|
|
@@ -1,21 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CompressionLibraryError = exports.CorruptSaveError = exports.UnsupportedVersionError = exports.ParserError = void 0;
|
|
4
|
+
class ParserError extends Error {
|
|
2
5
|
constructor(name, message) {
|
|
3
6
|
super(message);
|
|
4
7
|
this.name = name;
|
|
5
8
|
}
|
|
6
9
|
}
|
|
7
|
-
|
|
10
|
+
exports.ParserError = ParserError;
|
|
11
|
+
class UnsupportedVersionError extends ParserError {
|
|
8
12
|
constructor(message) {
|
|
9
13
|
super('UnsupportedVersionError', message ?? 'This save version is not supported.');
|
|
10
14
|
}
|
|
11
15
|
}
|
|
12
|
-
|
|
16
|
+
exports.UnsupportedVersionError = UnsupportedVersionError;
|
|
17
|
+
class CorruptSaveError extends ParserError {
|
|
13
18
|
constructor(message) {
|
|
14
19
|
super('CorruptSaveError', message ?? 'This save data is most likely corrupt.');
|
|
15
20
|
}
|
|
16
21
|
}
|
|
17
|
-
|
|
22
|
+
exports.CorruptSaveError = CorruptSaveError;
|
|
23
|
+
class CompressionLibraryError extends ParserError {
|
|
18
24
|
constructor(message) {
|
|
19
25
|
super('CompressionLibraryError', message ?? 'Failed to compress/decompress save data.');
|
|
20
26
|
}
|
|
21
27
|
}
|
|
28
|
+
exports.CompressionLibraryError = CompressionLibraryError;
|
package/build/parser/parser.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SaveParser = void 0;
|
|
4
|
+
const level_class_1 = require("./satisfactory/level.class");
|
|
5
|
+
const satisfactory_save_1 = require("./satisfactory/satisfactory-save");
|
|
6
|
+
const save_reader_1 = require("./save-reader");
|
|
7
|
+
const save_writer_1 = require("./save-writer");
|
|
5
8
|
class SaveParser {
|
|
6
9
|
/**
|
|
7
10
|
* serializes a save file into binary and reports back on individual callbacks.
|
|
@@ -12,10 +15,10 @@ class SaveParser {
|
|
|
12
15
|
* @param onFinish gets called when all chunks have been generated. A summary of the chunk sizes and count is reported.
|
|
13
16
|
*/
|
|
14
17
|
static WriteSave(save, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
|
|
15
|
-
const writer = new SaveWriter();
|
|
16
|
-
SaveWriter.WriteHeader(writer, save.header);
|
|
18
|
+
const writer = new save_writer_1.SaveWriter();
|
|
19
|
+
save_writer_1.SaveWriter.WriteHeader(writer, save.header);
|
|
17
20
|
const posAfterHeader = writer.getBufferPosition();
|
|
18
|
-
SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
|
|
21
|
+
save_writer_1.SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
|
|
19
22
|
writer.endWriting();
|
|
20
23
|
writer.generateChunks(save.compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish);
|
|
21
24
|
}
|
|
@@ -27,10 +30,10 @@ class SaveParser {
|
|
|
27
30
|
* @returns a brief summary
|
|
28
31
|
*/
|
|
29
32
|
static ParseSaveFile(file, onSaveDecompressed = () => { }, onProgress = () => { }) {
|
|
30
|
-
const reader = new SaveReader(file.buffer, onProgress);
|
|
33
|
+
const reader = new save_reader_1.SaveReader(file.buffer, onProgress);
|
|
31
34
|
// read header
|
|
32
35
|
const header = reader.readHeader();
|
|
33
|
-
const save = new SatisfactorySave(header);
|
|
36
|
+
const save = new satisfactory_save_1.SatisfactorySave(header);
|
|
34
37
|
// inflate chunks
|
|
35
38
|
const inflateResult = reader.inflateChunks();
|
|
36
39
|
// call callback on decompressed save body
|
|
@@ -53,9 +56,9 @@ class SaveParser {
|
|
|
53
56
|
header: save.header,
|
|
54
57
|
trailingCollectedObjects: save.trailingCollectedObjects,
|
|
55
58
|
levels: save.levels.map(level => {
|
|
56
|
-
const lvl = new Level(level.name);
|
|
59
|
+
const lvl = new level_class_1.Level(level.name);
|
|
57
60
|
lvl.collectables = level.collectables;
|
|
58
|
-
lvl.objects = level.objects.filter(obj => projectionFilterApplies(config, obj));
|
|
61
|
+
lvl.objects = level.objects.filter(obj => (0, save_reader_1.projectionFilterApplies)(config, obj));
|
|
59
62
|
return lvl;
|
|
60
63
|
})
|
|
61
64
|
};
|
|
@@ -78,4 +81,4 @@ SaveParser.JSONStringifyModified = (obj, indent = 0) => JSON.stringify(obj, (key
|
|
|
78
81
|
}
|
|
79
82
|
return value;
|
|
80
83
|
}, indent);
|
|
81
|
-
|
|
84
|
+
exports.SaveParser = SaveParser;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Level = void 0;
|
|
4
|
+
const ObjectReference_1 = require("./objects/ObjectReference");
|
|
5
|
+
const SaveComponent_1 = require("./objects/SaveComponent");
|
|
6
|
+
const SaveEntity_1 = require("./objects/SaveEntity");
|
|
7
|
+
class Level {
|
|
5
8
|
constructor(name) {
|
|
6
9
|
this.name = name;
|
|
7
10
|
this.objects = [];
|
|
@@ -12,12 +15,12 @@ export class Level {
|
|
|
12
15
|
for (const obj of objects) {
|
|
13
16
|
switch (obj.type) {
|
|
14
17
|
case 'SaveEntity':
|
|
15
|
-
writer.writeInt32(SaveEntity.TypeID);
|
|
16
|
-
SaveEntity.SerializeHeader(writer, obj);
|
|
18
|
+
writer.writeInt32(SaveEntity_1.SaveEntity.TypeID);
|
|
19
|
+
SaveEntity_1.SaveEntity.SerializeHeader(writer, obj);
|
|
17
20
|
break;
|
|
18
21
|
case 'SaveComponent':
|
|
19
|
-
writer.writeInt32(SaveComponent.TypeID);
|
|
20
|
-
SaveComponent.SerializeHeader(writer, obj);
|
|
22
|
+
writer.writeInt32(SaveComponent_1.SaveComponent.TypeID);
|
|
23
|
+
SaveComponent_1.SaveComponent.SerializeHeader(writer, obj);
|
|
21
24
|
break;
|
|
22
25
|
default:
|
|
23
26
|
console.log('Unknown object type', obj);
|
|
@@ -43,11 +46,11 @@ export class Level {
|
|
|
43
46
|
for (const obj of objects) {
|
|
44
47
|
const lenReplacementPosition = writer.getBufferPosition();
|
|
45
48
|
writer.writeInt32(0);
|
|
46
|
-
if (isSaveEntity(obj)) {
|
|
47
|
-
SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
49
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
50
|
+
SaveEntity_1.SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
48
51
|
}
|
|
49
|
-
else if (isSaveComponent(obj)) {
|
|
50
|
-
SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
52
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
53
|
+
SaveComponent_1.SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
51
54
|
}
|
|
52
55
|
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
53
56
|
}
|
|
@@ -61,14 +64,14 @@ export class Level {
|
|
|
61
64
|
}
|
|
62
65
|
let objectType = reader.readInt32();
|
|
63
66
|
switch (objectType) {
|
|
64
|
-
case SaveEntity.TypeID:
|
|
65
|
-
let object = new SaveEntity('', '', '', '');
|
|
66
|
-
SaveEntity.ParseHeader(reader, object);
|
|
67
|
+
case SaveEntity_1.SaveEntity.TypeID:
|
|
68
|
+
let object = new SaveEntity_1.SaveEntity('', '', '', '');
|
|
69
|
+
SaveEntity_1.SaveEntity.ParseHeader(reader, object);
|
|
67
70
|
objectsList.push(object);
|
|
68
71
|
break;
|
|
69
|
-
case SaveComponent.TypeID:
|
|
70
|
-
let component = new SaveComponent('', '', '', '');
|
|
71
|
-
SaveComponent.ParseHeader(reader, component);
|
|
72
|
+
case SaveComponent_1.SaveComponent.TypeID:
|
|
73
|
+
let component = new SaveComponent_1.SaveComponent('', '', '', '');
|
|
74
|
+
SaveComponent_1.SaveComponent.ParseHeader(reader, component);
|
|
72
75
|
objectsList.push(component);
|
|
73
76
|
break;
|
|
74
77
|
default:
|
|
@@ -92,11 +95,11 @@ export class Level {
|
|
|
92
95
|
const len = reader.readInt32();
|
|
93
96
|
const before = reader.getBufferPosition();
|
|
94
97
|
const obj = objectsList[i];
|
|
95
|
-
if (isSaveEntity(obj)) {
|
|
96
|
-
SaveEntity.ParseData(obj, len, reader, buildVersion);
|
|
98
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
99
|
+
SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion);
|
|
97
100
|
}
|
|
98
|
-
else if (isSaveComponent(obj)) {
|
|
99
|
-
SaveComponent.ParseData(obj, len, reader, buildVersion);
|
|
101
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
102
|
+
SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion);
|
|
100
103
|
}
|
|
101
104
|
const after = reader.getBufferPosition();
|
|
102
105
|
if (after - before !== len) {
|
|
@@ -128,7 +131,7 @@ export class Level {
|
|
|
128
131
|
static SerializeCollectablesList(writer, collectables) {
|
|
129
132
|
writer.writeInt32(collectables.length);
|
|
130
133
|
for (const collectable of collectables) {
|
|
131
|
-
ObjectReference.Serialize(writer, collectable);
|
|
134
|
+
ObjectReference_1.ObjectReference.Serialize(writer, collectable);
|
|
132
135
|
}
|
|
133
136
|
}
|
|
134
137
|
// collected stuff
|
|
@@ -136,9 +139,10 @@ export class Level {
|
|
|
136
139
|
let countCollected = reader.readInt32();
|
|
137
140
|
const collected = [];
|
|
138
141
|
for (let i = 0; i < countCollected; i++) {
|
|
139
|
-
const collectable = ObjectReference.Parse(reader);
|
|
142
|
+
const collectable = ObjectReference_1.ObjectReference.Parse(reader);
|
|
140
143
|
collected.push(collectable);
|
|
141
144
|
}
|
|
142
145
|
return collected;
|
|
143
146
|
}
|
|
144
147
|
}
|
|
148
|
+
exports.Level = Level;
|