@etothepii/satisfactory-file-parser 0.0.11 → 0.0.13
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 +41 -0
- 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
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SaveEntity = exports.isSaveEntity = void 0;
|
|
4
|
+
const util_types_1 = require("../structs/util.types");
|
|
5
|
+
const ObjectReference_1 = require("./ObjectReference");
|
|
6
|
+
const SaveObject_1 = require("./SaveObject");
|
|
7
|
+
const isSaveEntity = (obj) => {
|
|
5
8
|
return obj.type === 'SaveEntity';
|
|
6
9
|
};
|
|
7
|
-
|
|
10
|
+
exports.isSaveEntity = isSaveEntity;
|
|
11
|
+
class SaveEntity extends SaveObject_1.SaveObject {
|
|
8
12
|
constructor(typePath, rootObject, instanceName, parentEntityName = '', needsTransform = false) {
|
|
9
13
|
super(typePath, rootObject, instanceName);
|
|
10
14
|
this.typePath = typePath;
|
|
@@ -24,9 +28,9 @@ class SaveEntity extends SaveObject {
|
|
|
24
28
|
this.components = [];
|
|
25
29
|
}
|
|
26
30
|
static ParseHeader(reader, obj) {
|
|
27
|
-
SaveObject.ParseHeader(reader, obj);
|
|
31
|
+
SaveObject_1.SaveObject.ParseHeader(reader, obj);
|
|
28
32
|
obj.needTransform = reader.readInt32() == 1;
|
|
29
|
-
obj.transform = ParseTransform(reader);
|
|
33
|
+
obj.transform = (0, util_types_1.ParseTransform)(reader);
|
|
30
34
|
obj.wasPlacedInLevel = reader.readInt32() == 1;
|
|
31
35
|
}
|
|
32
36
|
static ParseData(entity, length, reader, buildVersion) {
|
|
@@ -39,16 +43,16 @@ class SaveEntity extends SaveObject {
|
|
|
39
43
|
newLen -= entity.parentObjectName.length + 1;
|
|
40
44
|
var componentCount = reader.readInt32();
|
|
41
45
|
for (let i = 0; i < componentCount; i++) {
|
|
42
|
-
var componentRef = ObjectReference.Parse(reader);
|
|
46
|
+
var componentRef = ObjectReference_1.ObjectReference.Parse(reader);
|
|
43
47
|
entity.components.push(componentRef);
|
|
44
48
|
newLen -= 10 + componentRef.levelName.length + componentRef.pathName.length;
|
|
45
49
|
}
|
|
46
|
-
SaveObject.ParseData(entity, newLen, reader, buildVersion);
|
|
50
|
+
SaveObject_1.SaveObject.ParseData(entity, newLen, reader, buildVersion);
|
|
47
51
|
}
|
|
48
52
|
static SerializeHeader(writer, entity) {
|
|
49
|
-
SaveObject.SerializeHeader(writer, entity);
|
|
53
|
+
SaveObject_1.SaveObject.SerializeHeader(writer, entity);
|
|
50
54
|
writer.writeInt32(entity.needTransform ? 1 : 0);
|
|
51
|
-
SerializeTransform(writer, entity.transform);
|
|
55
|
+
(0, util_types_1.SerializeTransform)(writer, entity.transform);
|
|
52
56
|
writer.writeInt32(entity.wasPlacedInLevel ? 1 : 0);
|
|
53
57
|
}
|
|
54
58
|
static SerializeData(writer, entity, buildVersion) {
|
|
@@ -59,8 +63,8 @@ class SaveEntity extends SaveObject {
|
|
|
59
63
|
writer.writeString(com.levelName);
|
|
60
64
|
writer.writeString(com.pathName);
|
|
61
65
|
}
|
|
62
|
-
SaveObject.SerializeData(writer, entity, buildVersion);
|
|
66
|
+
SaveObject_1.SaveObject.SerializeData(writer, entity, buildVersion);
|
|
63
67
|
}
|
|
64
68
|
}
|
|
65
69
|
SaveEntity.TypeID = 1;
|
|
66
|
-
|
|
70
|
+
exports.SaveEntity = SaveEntity;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SaveObject = void 0;
|
|
4
|
+
const DataFields_1 = require("./DataFields");
|
|
5
|
+
class SaveObject {
|
|
3
6
|
constructor(typePath, rootObject, instanceName) {
|
|
4
7
|
this.typePath = typePath;
|
|
5
8
|
this.rootObject = rootObject;
|
|
6
9
|
this.instanceName = instanceName;
|
|
7
|
-
this.dataFields = new DataFields();
|
|
10
|
+
this.dataFields = new DataFields_1.DataFields();
|
|
8
11
|
}
|
|
9
12
|
static ParseHeader(reader, obj) {
|
|
10
13
|
obj.typePath = reader.readString();
|
|
@@ -17,9 +20,10 @@ export class SaveObject {
|
|
|
17
20
|
writer.writeString(obj.instanceName);
|
|
18
21
|
}
|
|
19
22
|
static ParseData(obj, length, reader, buildVersion) {
|
|
20
|
-
obj.dataFields = DataFields.Parse(length, reader, buildVersion);
|
|
23
|
+
obj.dataFields = DataFields_1.DataFields.Parse(length, reader, buildVersion);
|
|
21
24
|
}
|
|
22
25
|
static SerializeData(writer, obj, buildVersion) {
|
|
23
|
-
DataFields.Serialize(writer, obj.dataFields, buildVersion);
|
|
26
|
+
DataFields_1.DataFields.Serialize(writer, obj.dataFields, buildVersion);
|
|
24
27
|
}
|
|
25
28
|
}
|
|
29
|
+
exports.SaveObject = SaveObject;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SatisfactorySave = void 0;
|
|
4
|
+
class SatisfactorySave {
|
|
2
5
|
constructor(header) {
|
|
3
6
|
this.levels = [];
|
|
4
7
|
this.trailingCollectedObjects = [];
|
|
5
8
|
this.header = header;
|
|
6
9
|
}
|
|
7
10
|
}
|
|
11
|
+
exports.SatisfactorySave = SatisfactorySave;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SerializeTransform = exports.ParseTransform = exports.SerializeVec2 = exports.ParseVec2 = exports.SerializeVec3 = exports.ParseVec3 = exports.norm = exports.mult = exports.length = exports.add = exports.sub = exports.SerializeVec4 = exports.ParseVec4 = exports.ParseCol4BGRA = exports.SerializeCol4BGRA = exports.ParseCol4RGBA = exports.SerializeCol4RGBA = void 0;
|
|
4
|
+
const SerializeCol4RGBA = (writer, value) => {
|
|
2
5
|
writer.writeFloat(value.r);
|
|
3
6
|
writer.writeFloat(value.g);
|
|
4
7
|
writer.writeFloat(value.b);
|
|
5
8
|
writer.writeFloat(value.a);
|
|
6
9
|
};
|
|
7
|
-
|
|
10
|
+
exports.SerializeCol4RGBA = SerializeCol4RGBA;
|
|
11
|
+
const ParseCol4RGBA = (reader) => {
|
|
8
12
|
return {
|
|
9
13
|
r: reader.readFloat(),
|
|
10
14
|
g: reader.readFloat(),
|
|
@@ -12,13 +16,15 @@ export const ParseCol4RGBA = (reader) => {
|
|
|
12
16
|
a: reader.readFloat(),
|
|
13
17
|
};
|
|
14
18
|
};
|
|
15
|
-
|
|
19
|
+
exports.ParseCol4RGBA = ParseCol4RGBA;
|
|
20
|
+
const SerializeCol4BGRA = (writer, value) => {
|
|
16
21
|
writer.writeByte(value.b);
|
|
17
22
|
writer.writeByte(value.g);
|
|
18
23
|
writer.writeByte(value.r);
|
|
19
24
|
writer.writeByte(value.a);
|
|
20
25
|
};
|
|
21
|
-
|
|
26
|
+
exports.SerializeCol4BGRA = SerializeCol4BGRA;
|
|
27
|
+
const ParseCol4BGRA = (reader) => {
|
|
22
28
|
return {
|
|
23
29
|
b: reader.readByte(),
|
|
24
30
|
g: reader.readByte(),
|
|
@@ -26,50 +32,64 @@ export const ParseCol4BGRA = (reader) => {
|
|
|
26
32
|
a: reader.readByte(),
|
|
27
33
|
};
|
|
28
34
|
};
|
|
29
|
-
|
|
35
|
+
exports.ParseCol4BGRA = ParseCol4BGRA;
|
|
36
|
+
const ParseVec4 = (reader) => {
|
|
30
37
|
return {
|
|
31
|
-
...ParseVec3(reader),
|
|
38
|
+
...(0, exports.ParseVec3)(reader),
|
|
32
39
|
w: reader.readFloat()
|
|
33
40
|
};
|
|
34
41
|
};
|
|
35
|
-
|
|
36
|
-
|
|
42
|
+
exports.ParseVec4 = ParseVec4;
|
|
43
|
+
const SerializeVec4 = (writer, vec) => {
|
|
44
|
+
(0, exports.SerializeVec3)(writer, vec);
|
|
37
45
|
writer.writeFloat(vec.w);
|
|
38
46
|
};
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
exports.SerializeVec4 = SerializeVec4;
|
|
48
|
+
const sub = (other, vec) => ({ x: other.x - vec.x, y: other.y - vec.y, z: other.z - vec.z });
|
|
49
|
+
exports.sub = sub;
|
|
50
|
+
const add = (vec, other) => ({ x: vec.x + other.x, y: vec.y + other.y, z: vec.z + other.z });
|
|
51
|
+
exports.add = add;
|
|
52
|
+
const length = (vec) => Math.sqrt(vec.x ** 2 + vec.y ** 2 + vec.z ** 2);
|
|
53
|
+
exports.length = length;
|
|
54
|
+
const mult = (vec, scale) => ({ x: vec.x * scale, y: vec.y * scale, z: vec.z * scale });
|
|
55
|
+
exports.mult = mult;
|
|
56
|
+
const norm = (vec) => (0, exports.mult)(vec, 1. / (0, exports.length)(vec));
|
|
57
|
+
exports.norm = norm;
|
|
58
|
+
const ParseVec3 = (reader) => {
|
|
45
59
|
return {
|
|
46
|
-
...ParseVec2(reader),
|
|
60
|
+
...(0, exports.ParseVec2)(reader),
|
|
47
61
|
z: reader.readFloat()
|
|
48
62
|
};
|
|
49
63
|
};
|
|
50
|
-
|
|
51
|
-
|
|
64
|
+
exports.ParseVec3 = ParseVec3;
|
|
65
|
+
const SerializeVec3 = (writer, vec) => {
|
|
66
|
+
(0, exports.SerializeVec2)(writer, vec);
|
|
52
67
|
writer.writeFloat(vec.z);
|
|
53
68
|
};
|
|
54
|
-
|
|
69
|
+
exports.SerializeVec3 = SerializeVec3;
|
|
70
|
+
const ParseVec2 = (reader) => {
|
|
55
71
|
return {
|
|
56
72
|
x: reader.readFloat(),
|
|
57
73
|
y: reader.readFloat(),
|
|
58
74
|
};
|
|
59
75
|
};
|
|
60
|
-
|
|
76
|
+
exports.ParseVec2 = ParseVec2;
|
|
77
|
+
const SerializeVec2 = (writer, vec) => {
|
|
61
78
|
writer.writeFloat(vec.x);
|
|
62
79
|
writer.writeFloat(vec.y);
|
|
63
80
|
};
|
|
64
|
-
|
|
81
|
+
exports.SerializeVec2 = SerializeVec2;
|
|
82
|
+
const ParseTransform = (reader) => {
|
|
65
83
|
return {
|
|
66
|
-
rotation: ParseVec4(reader),
|
|
67
|
-
translation: ParseVec3(reader),
|
|
68
|
-
scale3d: ParseVec3(reader),
|
|
84
|
+
rotation: (0, exports.ParseVec4)(reader),
|
|
85
|
+
translation: (0, exports.ParseVec3)(reader),
|
|
86
|
+
scale3d: (0, exports.ParseVec3)(reader),
|
|
69
87
|
};
|
|
70
88
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
SerializeVec3(writer, transform.
|
|
89
|
+
exports.ParseTransform = ParseTransform;
|
|
90
|
+
const SerializeTransform = (writer, transform) => {
|
|
91
|
+
(0, exports.SerializeVec4)(writer, transform.rotation);
|
|
92
|
+
(0, exports.SerializeVec3)(writer, transform.translation);
|
|
93
|
+
(0, exports.SerializeVec3)(writer, transform.scale3d);
|
|
75
94
|
};
|
|
95
|
+
exports.SerializeTransform = SerializeTransform;
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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.Conveyor = exports.SaveReader = exports.projectionFilterApplies = 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 SaveComponent_1 = require("./satisfactory/objects/SaveComponent");
|
|
13
|
+
const SaveEntity_1 = require("./satisfactory/objects/SaveEntity");
|
|
14
|
+
const projectionFilterApplies = (config, object) => {
|
|
9
15
|
let cond1 = false;
|
|
10
|
-
if (isSaveEntity(object) || (config.includeComponents && isSaveComponent(object))) {
|
|
16
|
+
if ((0, SaveEntity_1.isSaveEntity)(object) || (config.includeComponents && (0, SaveComponent_1.isSaveComponent)(object))) {
|
|
11
17
|
cond1 = true;
|
|
12
18
|
}
|
|
13
19
|
let cond2 = true;
|
|
14
|
-
if (isSaveEntity(object)) {
|
|
20
|
+
if ((0, SaveEntity_1.isSaveEntity)(object)) {
|
|
15
21
|
cond2 = false;
|
|
16
22
|
if (config.entityPathFilter.behavior === 'whitelist') {
|
|
17
23
|
cond2 = config.entityPathFilter.list.find(en => object.typePath.startsWith(en)) !== undefined;
|
|
@@ -22,9 +28,10 @@ export const projectionFilterApplies = (config, object) => {
|
|
|
22
28
|
}
|
|
23
29
|
return cond1 && cond2;
|
|
24
30
|
};
|
|
25
|
-
|
|
31
|
+
exports.projectionFilterApplies = projectionFilterApplies;
|
|
32
|
+
class SaveReader extends byte_reader_class_1.ByteReader {
|
|
26
33
|
constructor(fileBuffer, onProgressCallback = () => { }) {
|
|
27
|
-
super(fileBuffer, Alignment.LITTLE_ENDIAN);
|
|
34
|
+
super(fileBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
28
35
|
this.onProgressCallback = onProgressCallback;
|
|
29
36
|
this.levels = [];
|
|
30
37
|
this.trailingCollectedObjects = [];
|
|
@@ -77,7 +84,7 @@ class SaveReader extends ByteReader {
|
|
|
77
84
|
// all good, ready to read chunks now.
|
|
78
85
|
}
|
|
79
86
|
else {
|
|
80
|
-
throw new UnsupportedVersionError("The save version is too old to support encoding currently. Save in newer game version.");
|
|
87
|
+
throw new parser_error_1.UnsupportedVersionError("The save version is too old to support encoding currently. Save in newer game version.");
|
|
81
88
|
}
|
|
82
89
|
return this.header;
|
|
83
90
|
}
|
|
@@ -96,13 +103,13 @@ class SaveReader extends ByteReader {
|
|
|
96
103
|
this.currentByte = this.compressionInfo.chunkHeaderSize;
|
|
97
104
|
this.handledByte += this.compressionInfo.chunkHeaderSize;
|
|
98
105
|
if (this.compressionInfo.packageFileTag <= 0) {
|
|
99
|
-
this.compressionInfo.packageFileTag = chunkHeader.getInt32(0, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
106
|
+
this.compressionInfo.packageFileTag = chunkHeader.getInt32(0, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
100
107
|
}
|
|
101
108
|
if (this.compressionInfo.maxChunkContentSize <= 0) {
|
|
102
|
-
this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
109
|
+
this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
103
110
|
}
|
|
104
|
-
const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
105
|
-
const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
111
|
+
const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
112
|
+
const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
106
113
|
totalUncompressedBodySize += chunkUncompressedLength;
|
|
107
114
|
const currentChunkSize = chunkCompressedLength;
|
|
108
115
|
let currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);
|
|
@@ -115,11 +122,11 @@ class SaveReader extends ByteReader {
|
|
|
115
122
|
try {
|
|
116
123
|
// Inflate current chunk
|
|
117
124
|
let currentInflatedChunk = null;
|
|
118
|
-
currentInflatedChunk =
|
|
125
|
+
currentInflatedChunk = pako_1.default.inflate(currentChunk);
|
|
119
126
|
currentChunks.push(currentInflatedChunk);
|
|
120
127
|
}
|
|
121
128
|
catch (err) {
|
|
122
|
-
throw new CompressionLibraryError("Failed to inflate compressed save data. " + err);
|
|
129
|
+
throw new parser_error_1.CompressionLibraryError("Failed to inflate compressed save data. " + err);
|
|
123
130
|
}
|
|
124
131
|
}
|
|
125
132
|
//TODO we can get rid of file buffer here.
|
|
@@ -136,7 +143,7 @@ class SaveReader extends ByteReader {
|
|
|
136
143
|
this.bufferView = new DataView(bigWholeChunk.buffer);
|
|
137
144
|
const dataLength = this.readInt32();
|
|
138
145
|
if (totalUncompressedBodySize !== dataLength + 4) {
|
|
139
|
-
throw new CorruptSaveError(`Possibly corrupt. Indicated size of total save body (${dataLength}) does not match the uncompressed real size of ${totalUncompressedBodySize}.`);
|
|
146
|
+
throw new parser_error_1.CorruptSaveError(`Possibly corrupt. Indicated size of total save body (${dataLength}) does not match the uncompressed real size of ${totalUncompressedBodySize}.`);
|
|
140
147
|
}
|
|
141
148
|
return {
|
|
142
149
|
concatenatedChunkLength: newChunkLength,
|
|
@@ -145,10 +152,10 @@ class SaveReader extends ByteReader {
|
|
|
145
152
|
}
|
|
146
153
|
readLevels() {
|
|
147
154
|
if (!this.header) {
|
|
148
|
-
throw new ParserError('ParserError', 'Header must be set before objects can be read.');
|
|
155
|
+
throw new parser_error_1.ParserError('ParserError', 'Header must be set before objects can be read.');
|
|
149
156
|
}
|
|
150
157
|
if (this.header.saveVersion < 29) {
|
|
151
|
-
throw new UnsupportedVersionError('Support for < U6 is not yet implemented.');
|
|
158
|
+
throw new parser_error_1.UnsupportedVersionError('Support for < U6 is not yet implemented.');
|
|
152
159
|
}
|
|
153
160
|
const numSubLevels = this.readInt32();
|
|
154
161
|
this.levels = new Array(numSubLevels + 1);
|
|
@@ -156,19 +163,19 @@ class SaveReader extends ByteReader {
|
|
|
156
163
|
for (let j = 0; j <= numSubLevels; j++) {
|
|
157
164
|
let levelName = (j === numSubLevels) ? '' + this.header.mapName : this.readString();
|
|
158
165
|
this.onProgressCallback(this.getBufferProgress(), `reading level [${(j + 1)}/${(numSubLevels + 1)}] ${levelName}`);
|
|
159
|
-
this.levels[j] = Level.ReadLevel(this, levelName, this.header.buildVersion);
|
|
166
|
+
this.levels[j] = level_class_1.Level.ReadLevel(this, levelName, this.header.buildVersion);
|
|
160
167
|
}
|
|
161
168
|
// in U6/U7 there were more collectibles added that do not belong to a particular level
|
|
162
169
|
if (this.getBufferPosition() < this.bufferView.byteLength) {
|
|
163
|
-
this.trailingCollectedObjects = Level.ReadCollectablesList(this);
|
|
170
|
+
this.trailingCollectedObjects = level_class_1.Level.ReadCollectablesList(this);
|
|
164
171
|
}
|
|
165
172
|
return this.levels;
|
|
166
173
|
}
|
|
167
174
|
}
|
|
168
175
|
// the number of .net ticks at the unix epoch
|
|
169
176
|
SaveReader.EPOCH_TICKS = 621355968000000000n;
|
|
170
|
-
|
|
171
|
-
|
|
177
|
+
exports.SaveReader = SaveReader;
|
|
178
|
+
class Conveyor {
|
|
172
179
|
static getConveyorBeltRegex() {
|
|
173
180
|
return /\/Game\/FactoryGame\/Buildable\/Factory\/(ConveyorBeltMk[0-9]+)\/Build_(\1)\.Build_(\1)_C/g;
|
|
174
181
|
}
|
|
@@ -241,3 +248,4 @@ export class Conveyor {
|
|
|
241
248
|
return false;
|
|
242
249
|
}
|
|
243
250
|
}
|
|
251
|
+
exports.Conveyor = Conveyor;
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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.SaveWriter = void 0;
|
|
7
|
+
const pako_1 = __importDefault(require("pako"));
|
|
8
|
+
const alignment_enum_1 = require("./byte/alignment.enum");
|
|
9
|
+
const byte_writer_class_1 = require("./byte/byte-writer.class");
|
|
10
|
+
const parser_error_1 = require("./error/parser.error");
|
|
11
|
+
const level_class_1 = require("./satisfactory/level.class");
|
|
12
|
+
class SaveWriter extends byte_writer_class_1.ByteWriter {
|
|
7
13
|
constructor() {
|
|
8
|
-
super(Alignment.LITTLE_ENDIAN);
|
|
14
|
+
super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
9
15
|
}
|
|
10
16
|
static WriteHeader(writer, header) {
|
|
11
17
|
writer.writeInt32(header.saveHeaderType);
|
|
@@ -36,7 +42,7 @@ export class SaveWriter extends ByteWriter {
|
|
|
36
42
|
// ready to write levels now.
|
|
37
43
|
}
|
|
38
44
|
else {
|
|
39
|
-
throw new UnsupportedVersionError("The save version is too old to be supported currently.");
|
|
45
|
+
throw new parser_error_1.UnsupportedVersionError("The save version is too old to be supported currently.");
|
|
40
46
|
}
|
|
41
47
|
}
|
|
42
48
|
static WriteLevels(writer, save, buildVersion) {
|
|
@@ -45,17 +51,17 @@ export class SaveWriter extends ByteWriter {
|
|
|
45
51
|
if (level.name !== save.header.mapName) {
|
|
46
52
|
writer.writeString(level.name);
|
|
47
53
|
}
|
|
48
|
-
Level.WriteLevel(writer, level, buildVersion);
|
|
54
|
+
level_class_1.Level.WriteLevel(writer, level, buildVersion);
|
|
49
55
|
}
|
|
50
|
-
Level.SerializeCollectablesList(writer, save.trailingCollectedObjects);
|
|
56
|
+
level_class_1.Level.SerializeCollectablesList(writer, save.trailingCollectedObjects);
|
|
51
57
|
}
|
|
52
|
-
static GenerateCompressedChunksFromData(bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, alignment = Alignment.LITTLE_ENDIAN) {
|
|
58
|
+
static GenerateCompressedChunksFromData(bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, alignment = alignment_enum_1.Alignment.LITTLE_ENDIAN) {
|
|
53
59
|
const errors = [];
|
|
54
60
|
const totalUncompressedSize = bufferArray.byteLength;
|
|
55
61
|
const saveBody = new Uint8Array(bufferArray.byteLength + 4);
|
|
56
62
|
saveBody.set(new Uint8Array(bufferArray), 4);
|
|
57
63
|
const miniView = new DataView(saveBody.buffer);
|
|
58
|
-
miniView.setInt32(0, totalUncompressedSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
64
|
+
miniView.setInt32(0, totalUncompressedSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
59
65
|
onBinaryBeforeCompressing(saveBody.buffer);
|
|
60
66
|
// collect slices of chunks with help of compression info for max chunk size
|
|
61
67
|
let handledByte = 0;
|
|
@@ -67,7 +73,7 @@ export class SaveWriter extends ByteWriter {
|
|
|
67
73
|
// deflate chunk while we're at it.
|
|
68
74
|
let compressedChunk = new Uint8Array(0);
|
|
69
75
|
try {
|
|
70
|
-
compressedChunk =
|
|
76
|
+
compressedChunk = pako_1.default.deflate(uncompressedChunk);
|
|
71
77
|
}
|
|
72
78
|
catch (err) {
|
|
73
79
|
errors.push("An error occurred while calling pako deflate. -> " + err);
|
|
@@ -76,18 +82,18 @@ export class SaveWriter extends ByteWriter {
|
|
|
76
82
|
chunk.set(compressedChunk, compressionInfo.chunkHeaderSize);
|
|
77
83
|
// write header
|
|
78
84
|
const view = new DataView(chunk.buffer);
|
|
79
|
-
view.setInt32(0, compressionInfo.packageFileTag, alignment === Alignment.LITTLE_ENDIAN);
|
|
80
|
-
view.setInt32(4, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
81
|
-
view.setInt32(8, compressionInfo.maxChunkContentSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
82
|
-
view.setInt32(12, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
83
|
-
view.setInt32(16, compressedChunk.byteLength, alignment === Alignment.LITTLE_ENDIAN);
|
|
84
|
-
view.setInt32(20, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
85
|
-
view.setInt32(24, uncompressedContentSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
86
|
-
view.setInt32(28, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
87
|
-
view.setInt32(32, compressedChunk.byteLength, alignment === Alignment.LITTLE_ENDIAN);
|
|
88
|
-
view.setInt32(36, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
89
|
-
view.setInt32(40, uncompressedContentSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
90
|
-
view.setInt32(44, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
85
|
+
view.setInt32(0, compressionInfo.packageFileTag, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
86
|
+
view.setInt32(4, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
87
|
+
view.setInt32(8, compressionInfo.maxChunkContentSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
88
|
+
view.setInt32(12, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
89
|
+
view.setInt32(16, compressedChunk.byteLength, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
90
|
+
view.setInt32(20, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
91
|
+
view.setInt32(24, uncompressedContentSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
92
|
+
view.setInt32(28, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
93
|
+
view.setInt32(32, compressedChunk.byteLength, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
94
|
+
view.setInt32(36, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
95
|
+
view.setInt32(40, uncompressedContentSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
96
|
+
view.setInt32(44, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
91
97
|
onChunk(chunk);
|
|
92
98
|
chunkSummary.push({
|
|
93
99
|
uncompressedSize: uncompressedContentSize + compressionInfo.chunkHeaderSize,
|
|
@@ -102,7 +108,7 @@ export class SaveWriter extends ByteWriter {
|
|
|
102
108
|
}
|
|
103
109
|
generateChunks(compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
|
|
104
110
|
if (posAfterHeader <= 0) {
|
|
105
|
-
throw new ParserError('ParserError', 'Seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
111
|
+
throw new parser_error_1.ParserError('ParserError', 'Seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
106
112
|
}
|
|
107
113
|
// send plain header first.
|
|
108
114
|
const header = new Uint8Array(this.bufferArray.slice(0, posAfterHeader));
|
|
@@ -112,3 +118,4 @@ export class SaveWriter extends ByteWriter {
|
|
|
112
118
|
SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, this.alignment);
|
|
113
119
|
}
|
|
114
120
|
}
|
|
121
|
+
exports.SaveWriter = SaveWriter;
|
package/package.json
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@etothepii/satisfactory-file-parser",
|
|
3
3
|
"author": "etothepii",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.13",
|
|
5
5
|
"description": "A file parser for satisfactory files. Includes save files and blueprint files.",
|
|
6
6
|
"main": "build/index.js",
|
|
7
|
-
"type": "module",
|
|
8
7
|
"keywords": [
|
|
9
8
|
"satisfactory",
|
|
10
9
|
"save",
|