@etothepii/satisfactory-file-parser 0.1.25 → 0.1.26
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.js +25 -60
- package/build/parser/byte/alignment.enum.js +2 -5
- package/build/parser/byte/binary-operable.interface.js +1 -2
- package/build/parser/byte/binary-readable.interface.js +1 -2
- package/build/parser/byte/byte-reader.class.js +10 -14
- package/build/parser/byte/byte-writer.class.js +10 -13
- package/build/parser/error/parser.error.js +6 -15
- package/build/parser/file.types.js +2 -5
- package/build/parser/parser.js +23 -26
- package/build/parser/satisfactory/blueprint/blueprint-reader.js +28 -36
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +20 -25
- package/build/parser/satisfactory/blueprint/blueprint.types.js +1 -2
- package/build/parser/satisfactory/objects/DataFields.js +79 -83
- package/build/parser/satisfactory/objects/GUIDInfo.js +5 -8
- package/build/parser/satisfactory/objects/ObjectReference.js +2 -5
- package/build/parser/satisfactory/objects/Property.js +91 -120
- package/build/parser/satisfactory/objects/SaveComponent.js +7 -11
- package/build/parser/satisfactory/objects/SaveEntity.js +13 -17
- package/build/parser/satisfactory/objects/SaveObject.js +4 -8
- package/build/parser/satisfactory/objects/ue/GUID.js +2 -5
- package/build/parser/satisfactory/objects/ue/MD5Hash.js +2 -5
- package/build/parser/satisfactory/save/asynchronous-level.class.js +12 -16
- package/build/parser/satisfactory/save/level.class.js +24 -28
- package/build/parser/satisfactory/save/satisfactory-save.js +1 -5
- package/build/parser/satisfactory/save/save-reader.js +28 -34
- package/build/parser/satisfactory/save/save-writer.js +34 -40
- package/build/parser/satisfactory/save/save.types.js +1 -2
- package/build/parser/satisfactory/structs/util.types.js +37 -63
- package/build/parser/stream/byte-stream-reader.class.js +17 -21
- package/build/parser/stream/json-stream-state-writer.js +2 -6
- package/build/parser/stream/json-stream-writable.js +1 -5
- package/build/parser/stream/json-stream-writer.js +2 -6
- package/build/parser/stream/reworked/readable-stream-parser.d.ts +1 -1
- package/build/parser/stream/reworked/readable-stream-parser.js +21 -24
- package/build/parser/stream/reworked/stream-parser.js +17 -20
- package/build/parser/stream/save-stream-json-stringifier.js +3 -7
- package/build/parser/stream/save-stream-reader.class.js +18 -24
- package/build/parser/stream/save-stream-writer.class.js +1 -5
- package/build/parser/stream/stream-level.class.js +11 -15
- package/build/parser/stream/stream-parser.js +11 -15
- package/package.json +4 -2
package/build/index.js
CHANGED
|
@@ -1,60 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Object.defineProperty(exports, "SaveComponent", { enumerable: true, get: function () { return SaveComponent_1.SaveComponent; } });
|
|
27
|
-
var SaveEntity_1 = require("./parser/satisfactory/objects/SaveEntity");
|
|
28
|
-
Object.defineProperty(exports, "SaveEntity", { enumerable: true, get: function () { return SaveEntity_1.SaveEntity; } });
|
|
29
|
-
__exportStar(require("./parser/satisfactory/objects/ue/GUID"), exports);
|
|
30
|
-
__exportStar(require("./parser/satisfactory/objects/ue/MD5Hash"), exports);
|
|
31
|
-
var level_class_1 = require("./parser/satisfactory/save/level.class");
|
|
32
|
-
Object.defineProperty(exports, "Level", { enumerable: true, get: function () { return level_class_1.Level; } });
|
|
33
|
-
var satisfactory_save_1 = require("./parser/satisfactory/save/satisfactory-save");
|
|
34
|
-
Object.defineProperty(exports, "SatisfactorySave", { enumerable: true, get: function () { return satisfactory_save_1.SatisfactorySave; } });
|
|
35
|
-
__exportStar(require("./parser/satisfactory/save/save.types"), exports);
|
|
36
|
-
var byte_reader_class_1 = require("./parser/byte/byte-reader.class");
|
|
37
|
-
Object.defineProperty(exports, "ByteReader", { enumerable: true, get: function () { return byte_reader_class_1.ByteReader; } });
|
|
38
|
-
var byte_writer_class_1 = require("./parser/byte/byte-writer.class");
|
|
39
|
-
Object.defineProperty(exports, "ByteWriter", { enumerable: true, get: function () { return byte_writer_class_1.ByteWriter; } });
|
|
40
|
-
var blueprint_reader_1 = require("./parser/satisfactory/blueprint/blueprint-reader");
|
|
41
|
-
Object.defineProperty(exports, "BlueprintConfigReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintConfigReader; } });
|
|
42
|
-
Object.defineProperty(exports, "BlueprintReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintReader; } });
|
|
43
|
-
var blueprint_writer_1 = require("./parser/satisfactory/blueprint/blueprint-writer");
|
|
44
|
-
Object.defineProperty(exports, "BlueprintConfigWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintConfigWriter; } });
|
|
45
|
-
Object.defineProperty(exports, "BlueprintWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintWriter; } });
|
|
46
|
-
var save_reader_1 = require("./parser/satisfactory/save/save-reader");
|
|
47
|
-
Object.defineProperty(exports, "SaveReader", { enumerable: true, get: function () { return save_reader_1.SaveReader; } });
|
|
48
|
-
var save_writer_1 = require("./parser/satisfactory/save/save-writer");
|
|
49
|
-
Object.defineProperty(exports, "SaveWriter", { enumerable: true, get: function () { return save_writer_1.SaveWriter; } });
|
|
50
|
-
__exportStar(require("./parser/satisfactory/structs/util.types"), exports);
|
|
51
|
-
var save_stream_json_stringifier_1 = require("./parser/stream/save-stream-json-stringifier");
|
|
52
|
-
Object.defineProperty(exports, "SaveStreamJsonStringifier", { enumerable: true, get: function () { return save_stream_json_stringifier_1.SaveStreamJsonStringifier; } });
|
|
53
|
-
var save_stream_writer_class_1 = require("./parser/stream/save-stream-writer.class");
|
|
54
|
-
Object.defineProperty(exports, "SaveStreamWriter", { enumerable: true, get: function () { return save_stream_writer_class_1.SaveStreamWriter; } });
|
|
55
|
-
__exportStar(require("./parser/error/parser.error"), exports);
|
|
56
|
-
__exportStar(require("./parser/file.types"), exports);
|
|
57
|
-
var parser_1 = require("./parser/parser");
|
|
58
|
-
Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_1.Parser; } });
|
|
59
|
-
var readable_stream_parser_1 = require("./parser/stream/reworked/readable-stream-parser");
|
|
60
|
-
Object.defineProperty(exports, "ReadableStreamParser", { enumerable: true, get: function () { return readable_stream_parser_1.ReadableStreamParser; } });
|
|
1
|
+
export * from './parser/satisfactory/blueprint/blueprint.types';
|
|
2
|
+
export { DataFields } from './parser/satisfactory/objects/DataFields';
|
|
3
|
+
export * from './parser/satisfactory/objects/GUIDInfo';
|
|
4
|
+
export { ObjectReference } from './parser/satisfactory/objects/ObjectReference';
|
|
5
|
+
export * from './parser/satisfactory/objects/Property';
|
|
6
|
+
export { SaveComponent } from './parser/satisfactory/objects/SaveComponent';
|
|
7
|
+
export { SaveEntity } from './parser/satisfactory/objects/SaveEntity';
|
|
8
|
+
export * from './parser/satisfactory/objects/ue/GUID';
|
|
9
|
+
export * from './parser/satisfactory/objects/ue/MD5Hash';
|
|
10
|
+
export { Level } from './parser/satisfactory/save/level.class';
|
|
11
|
+
export { SatisfactorySave } from './parser/satisfactory/save/satisfactory-save';
|
|
12
|
+
export * from './parser/satisfactory/save/save.types';
|
|
13
|
+
export { ByteReader } from './parser/byte/byte-reader.class';
|
|
14
|
+
export { ByteWriter } from './parser/byte/byte-writer.class';
|
|
15
|
+
export { BlueprintConfigReader, BlueprintReader } from './parser/satisfactory/blueprint/blueprint-reader';
|
|
16
|
+
export { BlueprintConfigWriter, BlueprintWriter } from './parser/satisfactory/blueprint/blueprint-writer';
|
|
17
|
+
export { SaveReader } from './parser/satisfactory/save/save-reader';
|
|
18
|
+
export { SaveWriter } from './parser/satisfactory/save/save-writer';
|
|
19
|
+
export * from './parser/satisfactory/structs/util.types';
|
|
20
|
+
export { SaveStreamJsonStringifier } from './parser/stream/save-stream-json-stringifier';
|
|
21
|
+
export { SaveStreamWriter } from './parser/stream/save-stream-writer.class';
|
|
22
|
+
export * from './parser/error/parser.error';
|
|
23
|
+
export * from './parser/file.types';
|
|
24
|
+
export { Parser } from './parser/parser';
|
|
25
|
+
export { ReadableStreamParser } from './parser/stream/reworked/readable-stream-parser';
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Alignment = void 0;
|
|
4
|
-
var Alignment;
|
|
1
|
+
export var Alignment;
|
|
5
2
|
(function (Alignment) {
|
|
6
3
|
Alignment[Alignment["BIG_ENDIAN"] = 0] = "BIG_ENDIAN";
|
|
7
4
|
Alignment[Alignment["LITTLE_ENDIAN"] = 1] = "LITTLE_ENDIAN";
|
|
8
|
-
})(Alignment
|
|
5
|
+
})(Alignment || (Alignment = {}));
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ByteReader = void 0;
|
|
4
|
-
const alignment_enum_1 = require("./alignment.enum");
|
|
5
|
-
class ByteReader {
|
|
1
|
+
import { Alignment } from "./alignment.enum";
|
|
2
|
+
export class ByteReader {
|
|
6
3
|
constructor(fileBuffer, alignment) {
|
|
7
4
|
this.debug = false;
|
|
8
5
|
this.currentByte = 0;
|
|
@@ -49,27 +46,27 @@ class ByteReader {
|
|
|
49
46
|
return data;
|
|
50
47
|
}
|
|
51
48
|
readInt16() {
|
|
52
|
-
let data = this.bufferView.getInt16(this.currentByte, this.alignment ===
|
|
49
|
+
let data = this.bufferView.getInt16(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
53
50
|
this.currentByte += 2;
|
|
54
51
|
return data;
|
|
55
52
|
}
|
|
56
53
|
readUint16() {
|
|
57
|
-
let data = this.bufferView.getUint16(this.currentByte, this.alignment ===
|
|
54
|
+
let data = this.bufferView.getUint16(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
58
55
|
this.currentByte += 2;
|
|
59
56
|
return data;
|
|
60
57
|
}
|
|
61
58
|
readInt32() {
|
|
62
|
-
let data = this.bufferView.getInt32(this.currentByte, this.alignment ===
|
|
59
|
+
let data = this.bufferView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
63
60
|
this.currentByte += 4;
|
|
64
61
|
return data;
|
|
65
62
|
}
|
|
66
63
|
readUint32() {
|
|
67
|
-
let data = this.bufferView.getUint32(this.currentByte, this.alignment ===
|
|
64
|
+
let data = this.bufferView.getUint32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
68
65
|
this.currentByte += 4;
|
|
69
66
|
return data;
|
|
70
67
|
}
|
|
71
68
|
readLong() {
|
|
72
|
-
let data = this.bufferView.getBigInt64(this.currentByte, this.alignment ===
|
|
69
|
+
let data = this.bufferView.getBigInt64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
73
70
|
this.currentByte += 8;
|
|
74
71
|
return data;
|
|
75
72
|
}
|
|
@@ -77,17 +74,17 @@ class ByteReader {
|
|
|
77
74
|
return this.readLong();
|
|
78
75
|
}
|
|
79
76
|
readUint64() {
|
|
80
|
-
let data = this.bufferView.getBigUint64(this.currentByte, this.alignment ===
|
|
77
|
+
let data = this.bufferView.getBigUint64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
81
78
|
this.currentByte += 8;
|
|
82
79
|
return data;
|
|
83
80
|
}
|
|
84
81
|
readFloat32() {
|
|
85
|
-
let data = this.bufferView.getFloat32(this.currentByte, this.alignment ===
|
|
82
|
+
let data = this.bufferView.getFloat32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
86
83
|
this.currentByte += 4;
|
|
87
84
|
return data;
|
|
88
85
|
}
|
|
89
86
|
readDouble() {
|
|
90
|
-
let data = this.bufferView.getFloat64(this.currentByte, this.alignment ===
|
|
87
|
+
let data = this.bufferView.getFloat64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
91
88
|
this.currentByte += 8;
|
|
92
89
|
return data;
|
|
93
90
|
}
|
|
@@ -124,4 +121,3 @@ class ByteReader {
|
|
|
124
121
|
return Promise.resolve();
|
|
125
122
|
}
|
|
126
123
|
}
|
|
127
|
-
exports.ByteReader = ByteReader;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ByteWriter = void 0;
|
|
4
|
-
const alignment_enum_1 = require("./alignment.enum");
|
|
1
|
+
import { Alignment } from "./alignment.enum";
|
|
5
2
|
class ByteWriter {
|
|
6
3
|
constructor(alignment, bufferSize = 500) {
|
|
7
4
|
this.getBufferPosition = () => this.currentByte;
|
|
@@ -41,42 +38,42 @@ class ByteWriter {
|
|
|
41
38
|
}
|
|
42
39
|
writeInt16(value) {
|
|
43
40
|
this.extendBufferIfNeeded(2);
|
|
44
|
-
this.bufferView.setInt16(this.currentByte, value, this.alignment ===
|
|
41
|
+
this.bufferView.setInt16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
45
42
|
this.currentByte += 2;
|
|
46
43
|
}
|
|
47
44
|
writeUint16(value) {
|
|
48
45
|
this.extendBufferIfNeeded(2);
|
|
49
|
-
this.bufferView.setUint16(this.currentByte, value, this.alignment ===
|
|
46
|
+
this.bufferView.setUint16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
50
47
|
this.currentByte += 2;
|
|
51
48
|
}
|
|
52
49
|
writeInt32(value) {
|
|
53
50
|
this.extendBufferIfNeeded(4);
|
|
54
|
-
this.bufferView.setInt32(this.currentByte, value, this.alignment ===
|
|
51
|
+
this.bufferView.setInt32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
55
52
|
this.currentByte += 4;
|
|
56
53
|
}
|
|
57
54
|
writeUint32(value) {
|
|
58
55
|
this.extendBufferIfNeeded(4);
|
|
59
|
-
this.bufferView.setUint32(this.currentByte, value, this.alignment ===
|
|
56
|
+
this.bufferView.setUint32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
60
57
|
this.currentByte += 4;
|
|
61
58
|
}
|
|
62
59
|
writeInt64(value) {
|
|
63
60
|
this.extendBufferIfNeeded(8);
|
|
64
|
-
this.bufferView.setBigInt64(this.currentByte, value, this.alignment ===
|
|
61
|
+
this.bufferView.setBigInt64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
65
62
|
this.currentByte += 8;
|
|
66
63
|
}
|
|
67
64
|
writeUint64(value) {
|
|
68
65
|
this.extendBufferIfNeeded(8);
|
|
69
|
-
this.bufferView.setBigUint64(this.currentByte, value, this.alignment ===
|
|
66
|
+
this.bufferView.setBigUint64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
70
67
|
this.currentByte += 8;
|
|
71
68
|
}
|
|
72
69
|
writeFloat(value) {
|
|
73
70
|
this.extendBufferIfNeeded(4);
|
|
74
|
-
this.bufferView.setFloat32(this.currentByte, value, this.alignment ===
|
|
71
|
+
this.bufferView.setFloat32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
75
72
|
this.currentByte += 4;
|
|
76
73
|
}
|
|
77
74
|
writeDouble(value) {
|
|
78
75
|
this.extendBufferIfNeeded(8);
|
|
79
|
-
this.bufferView.setFloat64(this.currentByte, value, this.alignment ===
|
|
76
|
+
this.bufferView.setFloat64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
80
77
|
this.currentByte += 8;
|
|
81
78
|
}
|
|
82
79
|
writeString(value) {
|
|
@@ -136,4 +133,4 @@ class ByteWriter {
|
|
|
136
133
|
;
|
|
137
134
|
}
|
|
138
135
|
ByteWriter.IsASCIICompatible = (value) => /^[\x00-\x7F]*$/.test(value);
|
|
139
|
-
|
|
136
|
+
export { ByteWriter };
|
|
@@ -1,40 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UnimplementedError = exports.TimeoutError = exports.CompressionLibraryError = exports.CorruptSaveError = exports.UnsupportedVersionError = exports.ParserError = void 0;
|
|
4
|
-
class ParserError extends Error {
|
|
1
|
+
export class ParserError extends Error {
|
|
5
2
|
constructor(name, message) {
|
|
6
3
|
super(message);
|
|
7
4
|
this.name = name;
|
|
8
5
|
}
|
|
9
6
|
}
|
|
10
|
-
|
|
11
|
-
class UnsupportedVersionError extends ParserError {
|
|
7
|
+
export class UnsupportedVersionError extends ParserError {
|
|
12
8
|
constructor(message) {
|
|
13
9
|
super('UnsupportedVersionError', message ?? 'This save version is not supported.');
|
|
14
10
|
}
|
|
15
11
|
}
|
|
16
|
-
|
|
17
|
-
class CorruptSaveError extends ParserError {
|
|
12
|
+
export class CorruptSaveError extends ParserError {
|
|
18
13
|
constructor(message) {
|
|
19
14
|
super('CorruptSaveError', message ?? 'This save data is most likely corrupt.');
|
|
20
15
|
}
|
|
21
16
|
}
|
|
22
|
-
|
|
23
|
-
class CompressionLibraryError extends ParserError {
|
|
17
|
+
export class CompressionLibraryError extends ParserError {
|
|
24
18
|
constructor(message) {
|
|
25
19
|
super('CompressionLibraryError', message ?? 'Failed to compress/decompress save data.');
|
|
26
20
|
}
|
|
27
21
|
}
|
|
28
|
-
|
|
29
|
-
class TimeoutError extends ParserError {
|
|
22
|
+
export class TimeoutError extends ParserError {
|
|
30
23
|
constructor(message) {
|
|
31
24
|
super('TimeoutError', message ?? 'Operation timed out.');
|
|
32
25
|
}
|
|
33
26
|
}
|
|
34
|
-
|
|
35
|
-
class UnimplementedError extends ParserError {
|
|
27
|
+
export class UnimplementedError extends ParserError {
|
|
36
28
|
constructor(message) {
|
|
37
29
|
super('UnimplementedError', message ?? 'Unimplemented Operation.');
|
|
38
30
|
}
|
|
39
31
|
}
|
|
40
|
-
exports.UnimplementedError = UnimplementedError;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CompressionAlgorithmCode = void 0;
|
|
4
|
-
var CompressionAlgorithmCode;
|
|
1
|
+
export var CompressionAlgorithmCode;
|
|
5
2
|
(function (CompressionAlgorithmCode) {
|
|
6
3
|
CompressionAlgorithmCode[CompressionAlgorithmCode["ZLIB"] = 3] = "ZLIB";
|
|
7
|
-
})(CompressionAlgorithmCode
|
|
4
|
+
})(CompressionAlgorithmCode || (CompressionAlgorithmCode = {}));
|
package/build/parser/parser.js
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const satisfactory_save_1 = require("./satisfactory/save/satisfactory-save");
|
|
7
|
-
const save_reader_1 = require("./satisfactory/save/save-reader");
|
|
8
|
-
const save_writer_1 = require("./satisfactory/save/save-writer");
|
|
1
|
+
import { BlueprintConfigReader, BlueprintReader } from "./satisfactory/blueprint/blueprint-reader";
|
|
2
|
+
import { BlueprintConfigWriter, BlueprintWriter } from "./satisfactory/blueprint/blueprint-writer";
|
|
3
|
+
import { SatisfactorySave } from "./satisfactory/save/satisfactory-save";
|
|
4
|
+
import { SaveReader } from "./satisfactory/save/save-reader";
|
|
5
|
+
import { SaveWriter } from "./satisfactory/save/save-writer";
|
|
9
6
|
class Parser {
|
|
10
7
|
static WriteSave(save, onBinaryBeforeCompressing, onHeader, onChunk) {
|
|
11
|
-
const writer = new
|
|
12
|
-
|
|
8
|
+
const writer = new SaveWriter();
|
|
9
|
+
SaveWriter.WriteHeader(writer, save.header);
|
|
13
10
|
const posAfterHeader = writer.getBufferPosition();
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
SaveWriter.WriteSaveBodyHash(writer, save.gridHash);
|
|
12
|
+
SaveWriter.WriteGrids(writer, save.grids);
|
|
13
|
+
SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
|
|
17
14
|
writer.endWriting();
|
|
18
15
|
const chunkSummary = writer.generateChunks(save.compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk);
|
|
19
16
|
return chunkSummary;
|
|
20
17
|
}
|
|
21
18
|
static ParseSaveFile(name, file, onDecompressedSaveBody = () => { }, onProgress = () => { }) {
|
|
22
|
-
const reader = new
|
|
19
|
+
const reader = new SaveReader(new Uint8Array(file).buffer, onProgress);
|
|
23
20
|
const header = reader.readHeader();
|
|
24
|
-
const save = new
|
|
21
|
+
const save = new SatisfactorySave(name, header);
|
|
25
22
|
const inflateResult = reader.inflateChunks();
|
|
26
23
|
onDecompressedSaveBody(reader.getBuffer());
|
|
27
24
|
const gridHash = reader.readSaveBodyHash();
|
|
@@ -34,16 +31,16 @@ class Parser {
|
|
|
34
31
|
return save;
|
|
35
32
|
}
|
|
36
33
|
static WriteBlueprintFiles(blueprint, onMainFileBinaryBeforeCompressing = () => { }, onMainFileHeader = () => { }, onMainFileChunk = () => { }) {
|
|
37
|
-
const blueprintWriter = new
|
|
38
|
-
|
|
34
|
+
const blueprintWriter = new BlueprintWriter();
|
|
35
|
+
BlueprintWriter.SerializeHeader(blueprintWriter, blueprint.header);
|
|
39
36
|
const saveBodyPos = blueprintWriter.getBufferPosition();
|
|
40
|
-
|
|
37
|
+
BlueprintWriter.SerializeObjects(blueprintWriter, blueprint.objects);
|
|
41
38
|
blueprintWriter.endWriting();
|
|
42
39
|
let binaryChunks = [];
|
|
43
40
|
let binaryHeader;
|
|
44
41
|
const mainFileChunkSummary = blueprintWriter.generateChunks(blueprint.compressionInfo, saveBodyPos, onMainFileBinaryBeforeCompressing, onMainFileHeader, onMainFileChunk);
|
|
45
|
-
const configWriter = new
|
|
46
|
-
|
|
42
|
+
const configWriter = new BlueprintConfigWriter();
|
|
43
|
+
BlueprintConfigWriter.SerializeConfig(configWriter, blueprint.config);
|
|
47
44
|
const configFileBinary = configWriter.endWriting();
|
|
48
45
|
return {
|
|
49
46
|
mainFileChunkSummary,
|
|
@@ -51,13 +48,13 @@ class Parser {
|
|
|
51
48
|
};
|
|
52
49
|
}
|
|
53
50
|
static ParseBlueprintFiles(name, blueprintFile, blueprintConfigFile, onDecompressedBlueprintBody = () => { }) {
|
|
54
|
-
const blueprintConfigReader = new
|
|
55
|
-
const config =
|
|
56
|
-
const blueprintReader = new
|
|
57
|
-
const header =
|
|
51
|
+
const blueprintConfigReader = new BlueprintConfigReader(new Uint8Array(blueprintConfigFile).buffer);
|
|
52
|
+
const config = BlueprintConfigReader.ParseConfig(blueprintConfigReader);
|
|
53
|
+
const blueprintReader = new BlueprintReader(new Uint8Array(blueprintFile).buffer);
|
|
54
|
+
const header = BlueprintReader.ReadHeader(blueprintReader);
|
|
58
55
|
const inflateResult = blueprintReader.inflateChunks();
|
|
59
56
|
onDecompressedBlueprintBody(inflateResult.inflatedData);
|
|
60
|
-
const blueprintObjects =
|
|
57
|
+
const blueprintObjects = BlueprintReader.ParseObjects(blueprintReader);
|
|
61
58
|
const blueprint = {
|
|
62
59
|
name,
|
|
63
60
|
compressionInfo: blueprintReader.compressionInfo,
|
|
@@ -77,4 +74,4 @@ Parser.JSONStringifyModified = (obj, indent = 0) => JSON.stringify(obj, (key, va
|
|
|
77
74
|
}
|
|
78
75
|
return value;
|
|
79
76
|
}, indent);
|
|
80
|
-
|
|
77
|
+
export { Parser };
|
|
@@ -1,31 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const SaveComponent_1 = require("../objects/SaveComponent");
|
|
12
|
-
const SaveEntity_1 = require("../objects/SaveEntity");
|
|
13
|
-
const level_class_1 = require("../save/level.class");
|
|
14
|
-
const save_reader_1 = require("../save/save-reader");
|
|
15
|
-
const util_types_1 = require("../structs/util.types");
|
|
16
|
-
class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
1
|
+
import Pako from "pako";
|
|
2
|
+
import { Alignment } from "../../byte/alignment.enum";
|
|
3
|
+
import { ByteReader } from "../../byte/byte-reader.class";
|
|
4
|
+
import { CorruptSaveError, ParserError } from "../../error/parser.error";
|
|
5
|
+
import { SaveComponent, isSaveComponent } from "../objects/SaveComponent";
|
|
6
|
+
import { SaveEntity, isSaveEntity } from "../objects/SaveEntity";
|
|
7
|
+
import { Level } from "../save/level.class";
|
|
8
|
+
import { DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE } from "../save/save-reader";
|
|
9
|
+
import { ParseCol4RGBA, ParseVec3f } from "../structs/util.types";
|
|
10
|
+
export class BlueprintReader extends ByteReader {
|
|
17
11
|
constructor(bluePrintBuffer) {
|
|
18
|
-
super(bluePrintBuffer,
|
|
12
|
+
super(bluePrintBuffer, Alignment.LITTLE_ENDIAN);
|
|
19
13
|
this.compressionInfo = {
|
|
20
14
|
packageFileTag: 0,
|
|
21
15
|
maxUncompressedChunkContentSize: 0,
|
|
22
|
-
chunkHeaderSize:
|
|
16
|
+
chunkHeaderSize: DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE
|
|
23
17
|
};
|
|
24
18
|
}
|
|
25
19
|
static ReadHeader(reader) {
|
|
26
20
|
const blueprintTypeOrWhat = reader.readBytes(4);
|
|
27
21
|
const versionThing = reader.readBytes(2 * 4);
|
|
28
|
-
const dimensions =
|
|
22
|
+
const dimensions = ParseVec3f(reader);
|
|
29
23
|
let itemTypeCount = reader.readInt32();
|
|
30
24
|
const itemCosts = new Array(itemTypeCount).fill(['', 0]);
|
|
31
25
|
for (let i = 0; i < itemTypeCount; i++) {
|
|
@@ -59,13 +53,13 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
59
53
|
this.currentByte = this.compressionInfo.chunkHeaderSize;
|
|
60
54
|
this.handledByte += this.compressionInfo.chunkHeaderSize;
|
|
61
55
|
if (this.compressionInfo.packageFileTag <= 0) {
|
|
62
|
-
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment ===
|
|
56
|
+
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
63
57
|
}
|
|
64
58
|
if (this.compressionInfo.maxUncompressedChunkContentSize <= 0) {
|
|
65
|
-
this.compressionInfo.maxUncompressedChunkContentSize = chunkHeader.getInt32(8, this.alignment ===
|
|
59
|
+
this.compressionInfo.maxUncompressedChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
66
60
|
}
|
|
67
|
-
const chunkCompressedLength = chunkHeader.getInt32(33, this.alignment ===
|
|
68
|
-
const chunkUncompressedLength = chunkHeader.getInt32(25, this.alignment ===
|
|
61
|
+
const chunkCompressedLength = chunkHeader.getInt32(33, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
62
|
+
const chunkUncompressedLength = chunkHeader.getInt32(25, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
69
63
|
totalUncompressedBodySize += chunkUncompressedLength;
|
|
70
64
|
const currentChunkSize = chunkCompressedLength;
|
|
71
65
|
let currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);
|
|
@@ -75,11 +69,11 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
75
69
|
this.currentByte = 0;
|
|
76
70
|
try {
|
|
77
71
|
let currentInflatedChunk = null;
|
|
78
|
-
currentInflatedChunk =
|
|
72
|
+
currentInflatedChunk = Pako.inflate(currentChunk);
|
|
79
73
|
currentChunks.push(currentInflatedChunk);
|
|
80
74
|
}
|
|
81
75
|
catch (err) {
|
|
82
|
-
throw new
|
|
76
|
+
throw new ParserError('ParserError', 'An error occurred while calling pako inflate.' + err);
|
|
83
77
|
}
|
|
84
78
|
}
|
|
85
79
|
let newChunkLength = currentChunks.map(cc => cc.length).reduce((prev, cur) => prev + cur);
|
|
@@ -102,7 +96,7 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
102
96
|
const totalBodyRestSize = reader.readInt32();
|
|
103
97
|
const objectHeadersBinarySize = reader.readInt32();
|
|
104
98
|
let objects = [];
|
|
105
|
-
|
|
99
|
+
Level.ReadObjectHeaders(reader, objects, () => { });
|
|
106
100
|
const someChecksumThing = reader.readInt32();
|
|
107
101
|
BlueprintReader.ReadBlueprintObjectContents(reader, objects, 0);
|
|
108
102
|
const pos = reader.getBufferPosition();
|
|
@@ -113,22 +107,21 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
113
107
|
for (let i = 0; i < countEntities; i++) {
|
|
114
108
|
const len = reader.readInt32();
|
|
115
109
|
if (len === 0) {
|
|
116
|
-
throw new
|
|
110
|
+
throw new CorruptSaveError(`check number is a wrong value (${len}). This normally indicates a corrupt entity or blueprint.`);
|
|
117
111
|
}
|
|
118
112
|
const obj = objectsList[i];
|
|
119
|
-
if (
|
|
120
|
-
|
|
113
|
+
if (isSaveEntity(obj)) {
|
|
114
|
+
SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
121
115
|
}
|
|
122
|
-
else if (
|
|
123
|
-
|
|
116
|
+
else if (isSaveComponent(obj)) {
|
|
117
|
+
SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
124
118
|
}
|
|
125
119
|
}
|
|
126
120
|
}
|
|
127
121
|
}
|
|
128
|
-
|
|
129
|
-
class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
|
|
122
|
+
export class BlueprintConfigReader extends ByteReader {
|
|
130
123
|
constructor(bluePrintConfigBuffer) {
|
|
131
|
-
super(bluePrintConfigBuffer,
|
|
124
|
+
super(bluePrintConfigBuffer, Alignment.LITTLE_ENDIAN);
|
|
132
125
|
this.bluePrintConfigBuffer = bluePrintConfigBuffer;
|
|
133
126
|
this.parse = () => BlueprintConfigReader.ParseConfig(this);
|
|
134
127
|
}
|
|
@@ -136,7 +129,7 @@ class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
|
|
|
136
129
|
const unk = reader.readInt32();
|
|
137
130
|
const description = reader.readString();
|
|
138
131
|
const unk3 = reader.readInt32();
|
|
139
|
-
const colorMaybe =
|
|
132
|
+
const colorMaybe = ParseCol4RGBA(reader);
|
|
140
133
|
return {
|
|
141
134
|
description,
|
|
142
135
|
color: colorMaybe,
|
|
@@ -144,4 +137,3 @@ class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
|
|
|
144
137
|
};
|
|
145
138
|
}
|
|
146
139
|
}
|
|
147
|
-
exports.BlueprintConfigReader = BlueprintConfigReader;
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const save_writer_1 = require("../save/save-writer");
|
|
11
|
-
const util_types_1 = require("../structs/util.types");
|
|
12
|
-
class BlueprintWriter extends byte_writer_class_1.ByteWriter {
|
|
1
|
+
import { Alignment } from "../../byte/alignment.enum";
|
|
2
|
+
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
|
+
import { ParserError } from "../../error/parser.error";
|
|
4
|
+
import { SaveComponent, isSaveComponent } from "../objects/SaveComponent";
|
|
5
|
+
import { SaveEntity, isSaveEntity } from "../objects/SaveEntity";
|
|
6
|
+
import { Level } from "../save/level.class";
|
|
7
|
+
import { SaveWriter } from "../save/save-writer";
|
|
8
|
+
import { SerializeCol4RGBA } from "../structs/util.types";
|
|
9
|
+
export class BlueprintWriter extends ByteWriter {
|
|
13
10
|
constructor() {
|
|
14
|
-
super(
|
|
11
|
+
super(Alignment.LITTLE_ENDIAN);
|
|
15
12
|
}
|
|
16
13
|
static SerializeHeader(writer, header) {
|
|
17
14
|
writer.writeInt32(2);
|
|
@@ -39,18 +36,18 @@ class BlueprintWriter extends byte_writer_class_1.ByteWriter {
|
|
|
39
36
|
}
|
|
40
37
|
generateChunks(compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk) {
|
|
41
38
|
if (posAfterHeader <= 0) {
|
|
42
|
-
throw new
|
|
39
|
+
throw new ParserError('ParserError', 'seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
43
40
|
}
|
|
44
41
|
const header = new Uint8Array(this.bufferArray.slice(0, posAfterHeader));
|
|
45
42
|
onHeader(header);
|
|
46
43
|
this.bufferArray = this.bufferArray.slice(posAfterHeader);
|
|
47
|
-
const chunkSummary =
|
|
44
|
+
const chunkSummary = SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, this.alignment);
|
|
48
45
|
return chunkSummary;
|
|
49
46
|
}
|
|
50
47
|
static SerializeObjects(writer, objects) {
|
|
51
48
|
const headersLenIndicator = writer.getBufferPosition();
|
|
52
49
|
writer.writeInt32(0);
|
|
53
|
-
|
|
50
|
+
Level.SerializeObjectHeaders(writer, objects);
|
|
54
51
|
writer.writeBinarySizeFromPosition(headersLenIndicator, headersLenIndicator + 4);
|
|
55
52
|
BlueprintWriter.SerializeObjectContents(writer, objects, 0, '');
|
|
56
53
|
}
|
|
@@ -61,27 +58,25 @@ class BlueprintWriter extends byte_writer_class_1.ByteWriter {
|
|
|
61
58
|
for (const obj of objects) {
|
|
62
59
|
const lenReplacementPosition = writer.getBufferPosition();
|
|
63
60
|
writer.writeInt32(0);
|
|
64
|
-
if (
|
|
65
|
-
|
|
61
|
+
if (isSaveEntity(obj)) {
|
|
62
|
+
SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
66
63
|
}
|
|
67
|
-
else if (
|
|
68
|
-
|
|
64
|
+
else if (isSaveComponent(obj)) {
|
|
65
|
+
SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
69
66
|
}
|
|
70
67
|
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
71
68
|
}
|
|
72
69
|
writer.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 4);
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
|
-
|
|
76
|
-
class BlueprintConfigWriter extends byte_writer_class_1.ByteWriter {
|
|
72
|
+
export class BlueprintConfigWriter extends ByteWriter {
|
|
77
73
|
constructor() {
|
|
78
|
-
super(
|
|
74
|
+
super(Alignment.LITTLE_ENDIAN);
|
|
79
75
|
}
|
|
80
76
|
static SerializeConfig(writer, config) {
|
|
81
77
|
writer.writeInt32(2);
|
|
82
78
|
writer.writeString(config.description);
|
|
83
79
|
writer.writeInt32(config.iconID);
|
|
84
|
-
|
|
80
|
+
SerializeCol4RGBA(writer, config.color);
|
|
85
81
|
}
|
|
86
82
|
}
|
|
87
|
-
exports.BlueprintConfigWriter = BlueprintConfigWriter;
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|