@etothepii/satisfactory-file-parser 0.1.26 → 0.1.28
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 +60 -25
- package/build/parser/byte/alignment.enum.js +5 -2
- package/build/parser/byte/binary-operable.interface.js +2 -1
- package/build/parser/byte/binary-readable.interface.js +2 -1
- package/build/parser/byte/byte-reader.class.js +14 -10
- package/build/parser/byte/byte-writer.class.js +13 -10
- package/build/parser/error/parser.error.js +15 -6
- package/build/parser/file.types.js +5 -2
- package/build/parser/parser.js +26 -23
- package/build/parser/satisfactory/blueprint/blueprint-reader.js +36 -28
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +25 -20
- package/build/parser/satisfactory/blueprint/blueprint.types.js +2 -1
- package/build/parser/satisfactory/objects/DataFields.js +83 -79
- package/build/parser/satisfactory/objects/GUIDInfo.js +8 -5
- package/build/parser/satisfactory/objects/ObjectReference.js +5 -2
- package/build/parser/satisfactory/objects/Property.js +120 -91
- 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 +8 -4
- package/build/parser/satisfactory/objects/ue/GUID.js +5 -2
- package/build/parser/satisfactory/objects/ue/MD5Hash.js +5 -2
- package/build/parser/satisfactory/save/asynchronous-level.class.js +16 -12
- package/build/parser/satisfactory/save/level.class.js +28 -24
- package/build/parser/satisfactory/save/satisfactory-save.js +5 -1
- package/build/parser/satisfactory/save/save-reader.js +34 -28
- package/build/parser/satisfactory/save/save-writer.js +40 -34
- package/build/parser/satisfactory/save/save.types.js +2 -1
- package/build/parser/satisfactory/structs/util.types.js +63 -37
- package/build/parser/stream/byte-stream-reader.class.js +21 -17
- package/build/parser/stream/json-stream-state-writer.js +6 -2
- package/build/parser/stream/json-stream-writable.js +5 -1
- package/build/parser/stream/json-stream-writer.js +6 -2
- package/build/parser/stream/reworked/readable-stream-parser.js +24 -21
- package/build/parser/stream/reworked/stream-parser.js +20 -17
- package/build/parser/stream/save-stream-json-stringifier.js +7 -3
- package/build/parser/stream/save-stream-reader.class.js +24 -18
- package/build/parser/stream/save-stream-writer.class.js +5 -1
- package/build/parser/stream/stream-level.class.js +15 -11
- package/build/parser/stream/stream-parser.js +15 -11
- package/package.json +1 -2
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SaveComponent = exports.isSaveComponent = void 0;
|
|
4
|
+
const SaveObject_1 = require("./SaveObject");
|
|
5
|
+
const isSaveComponent = (obj) => {
|
|
3
6
|
return obj.type === 'SaveComponent';
|
|
4
7
|
};
|
|
5
|
-
|
|
8
|
+
exports.isSaveComponent = isSaveComponent;
|
|
9
|
+
class SaveComponent extends SaveObject_1.SaveObject {
|
|
6
10
|
constructor(typePath, rootObject, instanceName, parentEntityName = '') {
|
|
7
11
|
super(typePath, rootObject, instanceName);
|
|
8
12
|
this.typePath = typePath;
|
|
@@ -12,16 +16,16 @@ class SaveComponent extends SaveObject {
|
|
|
12
16
|
this.type = 'SaveComponent';
|
|
13
17
|
}
|
|
14
18
|
static ParseHeader(reader, obj) {
|
|
15
|
-
SaveObject.ParseHeader(reader, obj);
|
|
19
|
+
SaveObject_1.SaveObject.ParseHeader(reader, obj);
|
|
16
20
|
obj.parentEntityName = reader.readString();
|
|
17
21
|
}
|
|
18
22
|
static SerializeHeader(writer, component) {
|
|
19
|
-
SaveObject.SerializeHeader(writer, component);
|
|
23
|
+
SaveObject_1.SaveObject.SerializeHeader(writer, component);
|
|
20
24
|
writer.writeString(component.parentEntityName);
|
|
21
25
|
}
|
|
22
26
|
static ParseData(component, length, reader, buildVersion, typePath) {
|
|
23
|
-
SaveObject.ParseData(component, length, reader, buildVersion, typePath);
|
|
27
|
+
SaveObject_1.SaveObject.ParseData(component, length, reader, buildVersion, typePath);
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
SaveComponent.TypeID = 0;
|
|
27
|
-
|
|
31
|
+
exports.SaveComponent = SaveComponent;
|
|
@@ -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, typePath) {
|
|
@@ -35,16 +39,16 @@ class SaveEntity extends SaveObject {
|
|
|
35
39
|
entity.parentObjectName = reader.readString();
|
|
36
40
|
var componentCount = reader.readInt32();
|
|
37
41
|
for (let i = 0; i < componentCount; i++) {
|
|
38
|
-
var componentRef = ObjectReference.read(reader);
|
|
42
|
+
var componentRef = ObjectReference_1.ObjectReference.read(reader);
|
|
39
43
|
entity.components.push(componentRef);
|
|
40
44
|
}
|
|
41
45
|
const remainingSize = length - (reader.getBufferPosition() - afterSizeIndicator);
|
|
42
|
-
return SaveObject.ParseData(entity, remainingSize, reader, buildVersion, typePath);
|
|
46
|
+
return SaveObject_1.SaveObject.ParseData(entity, remainingSize, reader, buildVersion, typePath);
|
|
43
47
|
}
|
|
44
48
|
static SerializeHeader(writer, entity) {
|
|
45
|
-
SaveObject.SerializeHeader(writer, entity);
|
|
49
|
+
SaveObject_1.SaveObject.SerializeHeader(writer, entity);
|
|
46
50
|
writer.writeInt32(entity.needTransform ? 1 : 0);
|
|
47
|
-
SerializeTransform(writer, entity.transform);
|
|
51
|
+
(0, util_types_1.SerializeTransform)(writer, entity.transform);
|
|
48
52
|
writer.writeInt32(entity.wasPlacedInLevel ? 1 : 0);
|
|
49
53
|
}
|
|
50
54
|
static SerializeData(writer, entity, buildVersion) {
|
|
@@ -55,8 +59,8 @@ class SaveEntity extends SaveObject {
|
|
|
55
59
|
writer.writeString(com.levelName);
|
|
56
60
|
writer.writeString(com.pathName);
|
|
57
61
|
}
|
|
58
|
-
SaveObject.SerializeData(writer, entity, buildVersion);
|
|
62
|
+
SaveObject_1.SaveObject.SerializeData(writer, entity, buildVersion);
|
|
59
63
|
}
|
|
60
64
|
}
|
|
61
65
|
SaveEntity.TypeID = 1;
|
|
62
|
-
|
|
66
|
+
exports.SaveEntity = SaveEntity;
|
|
@@ -1,5 +1,8 @@
|
|
|
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;
|
|
@@ -21,9 +24,10 @@ export class SaveObject {
|
|
|
21
24
|
writer.writeString(obj.instanceName);
|
|
22
25
|
}
|
|
23
26
|
static ParseData(obj, length, reader, buildVersion, typePath) {
|
|
24
|
-
DataFields.ParseProperties(obj, length, reader, buildVersion, typePath);
|
|
27
|
+
DataFields_1.DataFields.ParseProperties(obj, length, reader, buildVersion, typePath);
|
|
25
28
|
}
|
|
26
29
|
static SerializeData(writer, obj, buildVersion) {
|
|
27
|
-
DataFields.Serialize(obj, writer, buildVersion, obj.typePath);
|
|
30
|
+
DataFields_1.DataFields.Serialize(obj, writer, buildVersion, obj.typePath);
|
|
28
31
|
}
|
|
29
32
|
}
|
|
33
|
+
exports.SaveObject = SaveObject;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GUID = void 0;
|
|
4
|
+
var GUID;
|
|
2
5
|
(function (GUID) {
|
|
3
6
|
GUID.read = (reader) => {
|
|
4
7
|
return [
|
|
@@ -14,5 +17,5 @@ export var GUID;
|
|
|
14
17
|
writer.writeUint32(guid[2]);
|
|
15
18
|
writer.writeUint32(guid[3]);
|
|
16
19
|
};
|
|
17
|
-
})(GUID || (GUID = {}));
|
|
20
|
+
})(GUID = exports.GUID || (exports.GUID = {}));
|
|
18
21
|
;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MD5Hash = void 0;
|
|
4
|
+
var MD5Hash;
|
|
2
5
|
(function (MD5Hash) {
|
|
3
6
|
MD5Hash.read = (reader) => {
|
|
4
7
|
const md5Hash = { isValid: false };
|
|
@@ -14,5 +17,5 @@ export var MD5Hash;
|
|
|
14
17
|
writer.writeBytesArray(md5Hash.hash);
|
|
15
18
|
}
|
|
16
19
|
};
|
|
17
|
-
})(MD5Hash || (MD5Hash = {}));
|
|
20
|
+
})(MD5Hash = exports.MD5Hash || (exports.MD5Hash = {}));
|
|
18
21
|
;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AsynchronousLevel = void 0;
|
|
4
|
+
const SaveComponent_1 = require("../objects/SaveComponent");
|
|
5
|
+
const SaveEntity_1 = require("../objects/SaveEntity");
|
|
6
|
+
const level_class_1 = require("./level.class");
|
|
7
|
+
class AsynchronousLevel {
|
|
5
8
|
static async StreamReadObjectContents(reader, objectsList, buildVersion, writer, onProgressCallback) {
|
|
6
9
|
const binarySize = reader.readInt32();
|
|
7
10
|
const posBefore = reader.getBufferPosition();
|
|
@@ -24,11 +27,11 @@ export class AsynchronousLevel {
|
|
|
24
27
|
await reader.allocate(Math.max(before - binarySize, 300 * 1000 * 1000));
|
|
25
28
|
}
|
|
26
29
|
const obj = objectsList[i];
|
|
27
|
-
if (isSaveEntity(obj)) {
|
|
28
|
-
SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
30
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
31
|
+
SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
29
32
|
}
|
|
30
|
-
else if (isSaveComponent(obj)) {
|
|
31
|
-
SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
33
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
34
|
+
SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
32
35
|
}
|
|
33
36
|
dynamicObjectBatch.push(obj);
|
|
34
37
|
const after = reader.getBufferPosition();
|
|
@@ -43,20 +46,21 @@ export class AsynchronousLevel {
|
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
static async StreamReadLevel(reader, levelName, buildVersion, writer) {
|
|
46
|
-
const level = new Level(levelName);
|
|
49
|
+
const level = new level_class_1.Level(levelName);
|
|
47
50
|
const binaryLength = reader.readInt32();
|
|
48
51
|
await reader.allocate(binaryLength);
|
|
49
52
|
await writer.openLevel(levelName);
|
|
50
|
-
Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback);
|
|
53
|
+
level_class_1.Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback);
|
|
51
54
|
reader.onProgressCallback(reader.getBufferProgress());
|
|
52
|
-
level.collectables = Level.ReadCollectablesList(reader, undefined);
|
|
55
|
+
level.collectables = level_class_1.Level.ReadCollectablesList(reader, undefined);
|
|
53
56
|
console.log(`before object contents buffer pos ${reader.getBufferPosition()}`);
|
|
54
57
|
await AsynchronousLevel.StreamReadObjectContents(reader, level.objects, buildVersion, writer, reader.onProgressCallback);
|
|
55
58
|
await writer.switchInLevelToCollectables();
|
|
56
59
|
await writer.writeCollectables(...level.collectables);
|
|
57
60
|
reader.onProgressCallback(reader.getBufferProgress());
|
|
58
|
-
Level.ReadCollectablesList(reader, undefined);
|
|
61
|
+
level_class_1.Level.ReadCollectablesList(reader, undefined);
|
|
59
62
|
await writer.endLevel();
|
|
60
63
|
return level;
|
|
61
64
|
}
|
|
62
65
|
}
|
|
66
|
+
exports.AsynchronousLevel = AsynchronousLevel;
|
|
@@ -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 = [];
|
|
@@ -13,12 +16,12 @@ export class Level {
|
|
|
13
16
|
for (const obj of objects) {
|
|
14
17
|
switch (obj.type) {
|
|
15
18
|
case 'SaveEntity':
|
|
16
|
-
writer.writeInt32(SaveEntity.TypeID);
|
|
17
|
-
SaveEntity.SerializeHeader(writer, obj);
|
|
19
|
+
writer.writeInt32(SaveEntity_1.SaveEntity.TypeID);
|
|
20
|
+
SaveEntity_1.SaveEntity.SerializeHeader(writer, obj);
|
|
18
21
|
break;
|
|
19
22
|
case 'SaveComponent':
|
|
20
|
-
writer.writeInt32(SaveComponent.TypeID);
|
|
21
|
-
SaveComponent.SerializeHeader(writer, obj);
|
|
23
|
+
writer.writeInt32(SaveComponent_1.SaveComponent.TypeID);
|
|
24
|
+
SaveComponent_1.SaveComponent.SerializeHeader(writer, obj);
|
|
22
25
|
break;
|
|
23
26
|
default:
|
|
24
27
|
console.log('Unknown object type', obj);
|
|
@@ -46,11 +49,11 @@ export class Level {
|
|
|
46
49
|
writer.writeInt32(obj.unknownType2);
|
|
47
50
|
const lenReplacementPosition = writer.getBufferPosition();
|
|
48
51
|
writer.writeInt32(0);
|
|
49
|
-
if (isSaveEntity(obj)) {
|
|
50
|
-
SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
52
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
53
|
+
SaveEntity_1.SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
51
54
|
}
|
|
52
|
-
else if (isSaveComponent(obj)) {
|
|
53
|
-
SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
55
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
56
|
+
SaveComponent_1.SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
54
57
|
}
|
|
55
58
|
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
56
59
|
}
|
|
@@ -64,14 +67,14 @@ export class Level {
|
|
|
64
67
|
}
|
|
65
68
|
let objectType = reader.readInt32();
|
|
66
69
|
switch (objectType) {
|
|
67
|
-
case SaveEntity.TypeID:
|
|
68
|
-
let object = new SaveEntity('', '', '', '');
|
|
69
|
-
SaveEntity.ParseHeader(reader, object);
|
|
70
|
+
case SaveEntity_1.SaveEntity.TypeID:
|
|
71
|
+
let object = new SaveEntity_1.SaveEntity('', '', '', '');
|
|
72
|
+
SaveEntity_1.SaveEntity.ParseHeader(reader, object);
|
|
70
73
|
objectsList.push(object);
|
|
71
74
|
break;
|
|
72
|
-
case SaveComponent.TypeID:
|
|
73
|
-
let component = new SaveComponent('', '', '', '');
|
|
74
|
-
SaveComponent.ParseHeader(reader, component);
|
|
75
|
+
case SaveComponent_1.SaveComponent.TypeID:
|
|
76
|
+
let component = new SaveComponent_1.SaveComponent('', '', '', '');
|
|
77
|
+
SaveComponent_1.SaveComponent.ParseHeader(reader, component);
|
|
75
78
|
objectsList.push(component);
|
|
76
79
|
break;
|
|
77
80
|
default:
|
|
@@ -94,11 +97,11 @@ export class Level {
|
|
|
94
97
|
obj.unknownType2 = reader.readInt32();
|
|
95
98
|
const binarySize = reader.readInt32();
|
|
96
99
|
const before = reader.getBufferPosition();
|
|
97
|
-
if (isSaveEntity(obj)) {
|
|
98
|
-
SaveEntity.ParseData(obj, binarySize, reader, buildVersion, obj.typePath);
|
|
100
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
101
|
+
SaveEntity_1.SaveEntity.ParseData(obj, binarySize, reader, buildVersion, obj.typePath);
|
|
99
102
|
}
|
|
100
|
-
else if (isSaveComponent(obj)) {
|
|
101
|
-
SaveComponent.ParseData(obj, binarySize, reader, buildVersion, obj.typePath);
|
|
103
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
104
|
+
SaveComponent_1.SaveComponent.ParseData(obj, binarySize, reader, buildVersion, obj.typePath);
|
|
102
105
|
}
|
|
103
106
|
const after = reader.getBufferPosition();
|
|
104
107
|
if (after - before !== binarySize) {
|
|
@@ -138,7 +141,7 @@ export class Level {
|
|
|
138
141
|
static SerializeCollectablesList(writer, collectables) {
|
|
139
142
|
writer.writeInt32(collectables.length);
|
|
140
143
|
for (const collectable of collectables) {
|
|
141
|
-
ObjectReference.write(writer, collectable);
|
|
144
|
+
ObjectReference_1.ObjectReference.write(writer, collectable);
|
|
142
145
|
}
|
|
143
146
|
}
|
|
144
147
|
static ReadCollectablesList(reader, printSmthWhenItsCollectables) {
|
|
@@ -146,7 +149,7 @@ export class Level {
|
|
|
146
149
|
let countSmthing = reader.readInt32();
|
|
147
150
|
if (countSmthing > 0) {
|
|
148
151
|
for (let i = 0; i < countSmthing; i++) {
|
|
149
|
-
const collectable = ObjectReference.read(reader);
|
|
152
|
+
const collectable = ObjectReference_1.ObjectReference.read(reader);
|
|
150
153
|
collected.push(collectable);
|
|
151
154
|
}
|
|
152
155
|
if (process.env.NODE_ENV === 'debug' && countSmthing > 0) {
|
|
@@ -156,3 +159,4 @@ export class Level {
|
|
|
156
159
|
return collected;
|
|
157
160
|
}
|
|
158
161
|
}
|
|
162
|
+
exports.Level = Level;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SatisfactorySave = void 0;
|
|
4
|
+
class SatisfactorySave {
|
|
2
5
|
constructor(name, header) {
|
|
3
6
|
this.gridHash = [0, 0, 0, 0];
|
|
4
7
|
this.grids = {};
|
|
@@ -8,3 +11,4 @@ export class SatisfactorySave {
|
|
|
8
11
|
this.header = header;
|
|
9
12
|
}
|
|
10
13
|
}
|
|
14
|
+
exports.SatisfactorySave = SatisfactorySave;
|
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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.SaveReader = exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 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 MD5Hash_1 = require("../objects/ue/MD5Hash");
|
|
12
|
+
const asynchronous_level_class_1 = require("./asynchronous-level.class");
|
|
13
|
+
const level_class_1 = require("./level.class");
|
|
14
|
+
exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;
|
|
15
|
+
class SaveReader extends byte_reader_class_1.ByteReader {
|
|
10
16
|
constructor(fileBuffer, onProgressCallback = () => { }) {
|
|
11
|
-
super(fileBuffer, Alignment.LITTLE_ENDIAN);
|
|
17
|
+
super(fileBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
12
18
|
this.onProgressCallback = onProgressCallback;
|
|
13
19
|
this.levels = [];
|
|
14
20
|
this.trailingCollectedObjects = [];
|
|
15
21
|
this.compressionInfo = {
|
|
16
22
|
packageFileTag: 0,
|
|
17
23
|
maxUncompressedChunkContentSize: 0,
|
|
18
|
-
chunkHeaderSize: DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE
|
|
24
|
+
chunkHeaderSize: exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE
|
|
19
25
|
};
|
|
20
26
|
this.readSaveBodyHash = () => {
|
|
21
27
|
const unk = this.readInt32();
|
|
@@ -92,7 +98,7 @@ class SaveReader extends ByteReader {
|
|
|
92
98
|
this.header.partitionEnabledFlag = this.readInt32() === 1;
|
|
93
99
|
}
|
|
94
100
|
if (this.header.saveHeaderType >= 12) {
|
|
95
|
-
this.header.consistencyHashBytes = MD5Hash.read(this);
|
|
101
|
+
this.header.consistencyHashBytes = MD5Hash_1.MD5Hash.read(this);
|
|
96
102
|
}
|
|
97
103
|
if (this.header.saveHeaderType >= 13) {
|
|
98
104
|
this.header.creativeModeEnabled = this.readInt32() == 1;
|
|
@@ -100,7 +106,7 @@ class SaveReader extends ByteReader {
|
|
|
100
106
|
if (this.header.saveVersion >= 21) {
|
|
101
107
|
}
|
|
102
108
|
else {
|
|
103
|
-
throw new UnsupportedVersionError("The save version is too old to support encoding currently. Save in newer game version.");
|
|
109
|
+
throw new parser_error_1.UnsupportedVersionError("The save version is too old to support encoding currently. Save in newer game version.");
|
|
104
110
|
}
|
|
105
111
|
return this.header;
|
|
106
112
|
}
|
|
@@ -116,13 +122,13 @@ class SaveReader extends ByteReader {
|
|
|
116
122
|
this.currentByte = this.compressionInfo.chunkHeaderSize;
|
|
117
123
|
this.handledByte += this.compressionInfo.chunkHeaderSize;
|
|
118
124
|
if (this.compressionInfo.packageFileTag <= 0) {
|
|
119
|
-
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
125
|
+
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
120
126
|
}
|
|
121
127
|
if (this.compressionInfo.maxUncompressedChunkContentSize <= 0) {
|
|
122
|
-
this.compressionInfo.maxUncompressedChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
128
|
+
this.compressionInfo.maxUncompressedChunkContentSize = chunkHeader.getInt32(8, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
123
129
|
}
|
|
124
|
-
const chunkCompressedLength = chunkHeader.getInt32(33, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
125
|
-
const chunkUncompressedLength = chunkHeader.getInt32(25, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
130
|
+
const chunkCompressedLength = chunkHeader.getInt32(33, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
131
|
+
const chunkUncompressedLength = chunkHeader.getInt32(25, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
126
132
|
totalUncompressedBodySize += chunkUncompressedLength;
|
|
127
133
|
const currentChunkSize = chunkCompressedLength;
|
|
128
134
|
let currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);
|
|
@@ -132,11 +138,11 @@ class SaveReader extends ByteReader {
|
|
|
132
138
|
this.currentByte = 0;
|
|
133
139
|
try {
|
|
134
140
|
let currentInflatedChunk = null;
|
|
135
|
-
currentInflatedChunk =
|
|
141
|
+
currentInflatedChunk = pako_1.default.inflate(currentChunk);
|
|
136
142
|
currentChunks.push(currentInflatedChunk);
|
|
137
143
|
}
|
|
138
144
|
catch (err) {
|
|
139
|
-
throw new CompressionLibraryError("Failed to inflate compressed save data. " + err);
|
|
145
|
+
throw new parser_error_1.CompressionLibraryError("Failed to inflate compressed save data. " + err);
|
|
140
146
|
}
|
|
141
147
|
}
|
|
142
148
|
let newChunkLength = currentChunks.map(cc => cc.length).reduce((prev, cur) => prev + cur);
|
|
@@ -151,7 +157,7 @@ class SaveReader extends ByteReader {
|
|
|
151
157
|
this.bufferView = new DataView(bigWholeChunk.buffer);
|
|
152
158
|
const dataLength = this.readInt32();
|
|
153
159
|
if (totalUncompressedBodySize !== dataLength + 8) {
|
|
154
|
-
throw new CorruptSaveError(`Possibly corrupt. Indicated size of total save body (${dataLength + 8}) does not match the uncompressed real size of ${totalUncompressedBodySize}.`);
|
|
160
|
+
throw new parser_error_1.CorruptSaveError(`Possibly corrupt. Indicated size of total save body (${dataLength + 8}) does not match the uncompressed real size of ${totalUncompressedBodySize}.`);
|
|
155
161
|
}
|
|
156
162
|
return {
|
|
157
163
|
concatenatedChunkLength: newChunkLength,
|
|
@@ -160,13 +166,13 @@ class SaveReader extends ByteReader {
|
|
|
160
166
|
}
|
|
161
167
|
readLevels() {
|
|
162
168
|
if (!this.header) {
|
|
163
|
-
throw new ParserError('ParserError', 'Header must be set before objects can be read.');
|
|
169
|
+
throw new parser_error_1.ParserError('ParserError', 'Header must be set before objects can be read.');
|
|
164
170
|
}
|
|
165
171
|
if (this.header.saveVersion < 29) {
|
|
166
|
-
throw new UnsupportedVersionError('Game Version < U6 is not supported.');
|
|
172
|
+
throw new parser_error_1.UnsupportedVersionError('Game Version < U6 is not supported.');
|
|
167
173
|
}
|
|
168
174
|
if (this.header.saveHeaderType < 13) {
|
|
169
|
-
throw new UnsupportedVersionError('Game Version < U8 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.0.34');
|
|
175
|
+
throw new parser_error_1.UnsupportedVersionError('Game Version < U8 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.0.34');
|
|
170
176
|
}
|
|
171
177
|
const levels = [];
|
|
172
178
|
const levelCount = this.readInt32();
|
|
@@ -176,10 +182,10 @@ class SaveReader extends ByteReader {
|
|
|
176
182
|
if (i % 500 === 0) {
|
|
177
183
|
this.onProgressCallback(this.getBufferProgress(), `reading level [${(i + 1)}/${(levelCount + 1)}] ${levelSingleName}`);
|
|
178
184
|
}
|
|
179
|
-
levels.push(Level.ReadLevel(this, levelSingleName, this.header.buildVersion));
|
|
185
|
+
levels.push(level_class_1.Level.ReadLevel(this, levelSingleName, this.header.buildVersion));
|
|
180
186
|
}
|
|
181
|
-
levels.push(Level.ReadLevel(this, this.header.mapName, this.header.buildVersion));
|
|
182
|
-
const trailingStuffToIgnore = Level.ReadCollectablesList(this, 'collectables 6!');
|
|
187
|
+
levels.push(level_class_1.Level.ReadLevel(this, this.header.mapName, this.header.buildVersion));
|
|
188
|
+
const trailingStuffToIgnore = level_class_1.Level.ReadCollectablesList(this, 'collectables 6!');
|
|
183
189
|
this.onProgressCallback(this.getBufferProgress(), 'finished parsing.');
|
|
184
190
|
return levels;
|
|
185
191
|
}
|
|
@@ -190,7 +196,7 @@ class SaveReader extends ByteReader {
|
|
|
190
196
|
for (let j = 0; j <= numSubLevels; j++) {
|
|
191
197
|
let levelName = (j === numSubLevels) ? '' + this.header.mapName : this.readString();
|
|
192
198
|
this.onProgressCallback(this.getBufferProgress(), `reading level [${(j + 1)}/${(numSubLevels + 1)}] ${levelName}`);
|
|
193
|
-
this.levels[j] = await AsynchronousLevel.StreamReadLevel(this, levelName, this.header.buildVersion, writer);
|
|
199
|
+
this.levels[j] = await asynchronous_level_class_1.AsynchronousLevel.StreamReadLevel(this, levelName, this.header.buildVersion, writer);
|
|
194
200
|
}
|
|
195
201
|
await writer.endLevels();
|
|
196
202
|
return this.levels;
|
|
@@ -208,4 +214,4 @@ SaveReader.getRoughSaveVersion = (saveVersion, headerTypeVersion) => {
|
|
|
208
214
|
return '<U6';
|
|
209
215
|
}
|
|
210
216
|
};
|
|
211
|
-
|
|
217
|
+
exports.SaveReader = SaveReader;
|
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 file_types_1 = require("../../file.types");
|
|
12
|
+
const MD5Hash_1 = require("../objects/ue/MD5Hash");
|
|
13
|
+
const level_class_1 = require("./level.class");
|
|
14
|
+
const save_reader_1 = require("./save-reader");
|
|
15
|
+
class SaveWriter extends byte_writer_class_1.ByteWriter {
|
|
10
16
|
constructor() {
|
|
11
|
-
super(Alignment.LITTLE_ENDIAN);
|
|
17
|
+
super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
12
18
|
}
|
|
13
19
|
static WriteHeader(writer, header) {
|
|
14
20
|
writer.writeInt32(header.saveHeaderType);
|
|
@@ -18,7 +24,7 @@ class SaveWriter extends ByteWriter {
|
|
|
18
24
|
writer.writeString(header.mapOptions);
|
|
19
25
|
writer.writeString(header.sessionName);
|
|
20
26
|
writer.writeInt32(header.playDurationSeconds);
|
|
21
|
-
writer.writeInt64(BigInt(header.saveDateTime) * 10000n + SaveReader.EPOCH_TICKS);
|
|
27
|
+
writer.writeInt64(BigInt(header.saveDateTime) * 10000n + save_reader_1.SaveReader.EPOCH_TICKS);
|
|
22
28
|
writer.writeByte(header.sessionVisibility);
|
|
23
29
|
if (header.saveHeaderType >= 7) {
|
|
24
30
|
writer.writeInt32(header.fEditorObjectVersion);
|
|
@@ -39,7 +45,7 @@ class SaveWriter extends ByteWriter {
|
|
|
39
45
|
writer.writeInt32(header.partitionEnabledFlag ? 1 : 0);
|
|
40
46
|
}
|
|
41
47
|
if (header.saveHeaderType >= 12) {
|
|
42
|
-
MD5Hash.write(writer, header.consistencyHashBytes);
|
|
48
|
+
MD5Hash_1.MD5Hash.write(writer, header.consistencyHashBytes);
|
|
43
49
|
}
|
|
44
50
|
if (header.saveHeaderType >= 13) {
|
|
45
51
|
writer.writeInt32(header.creativeModeEnabled ? 1 : 0);
|
|
@@ -47,7 +53,7 @@ class SaveWriter extends ByteWriter {
|
|
|
47
53
|
if (header.saveVersion >= 21) {
|
|
48
54
|
}
|
|
49
55
|
else {
|
|
50
|
-
throw new UnsupportedVersionError("The save version is too old to be supported currently.");
|
|
56
|
+
throw new parser_error_1.UnsupportedVersionError("The save version is too old to be supported currently.");
|
|
51
57
|
}
|
|
52
58
|
}
|
|
53
59
|
static WriteLevels(writer, save, buildVersion) {
|
|
@@ -56,17 +62,17 @@ class SaveWriter extends ByteWriter {
|
|
|
56
62
|
if (level.name !== save.header.mapName) {
|
|
57
63
|
writer.writeString(level.name);
|
|
58
64
|
}
|
|
59
|
-
Level.WriteLevel(writer, level, buildVersion);
|
|
65
|
+
level_class_1.Level.WriteLevel(writer, level, buildVersion);
|
|
60
66
|
}
|
|
61
|
-
Level.SerializeCollectablesList(writer, save.trailingCollectedObjects ?? []);
|
|
67
|
+
level_class_1.Level.SerializeCollectablesList(writer, save.trailingCollectedObjects ?? []);
|
|
62
68
|
}
|
|
63
|
-
static GenerateCompressedChunksFromData(bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, alignment = Alignment.LITTLE_ENDIAN) {
|
|
69
|
+
static GenerateCompressedChunksFromData(bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, alignment = alignment_enum_1.Alignment.LITTLE_ENDIAN) {
|
|
64
70
|
const errors = [];
|
|
65
71
|
const totalUncompressedSize = bufferArray.byteLength;
|
|
66
72
|
const saveBody = new Uint8Array(bufferArray.byteLength + 8);
|
|
67
73
|
saveBody.set(new Uint8Array(bufferArray), 4);
|
|
68
74
|
const miniView = new DataView(saveBody.buffer);
|
|
69
|
-
miniView.setInt32(0, totalUncompressedSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
75
|
+
miniView.setInt32(0, totalUncompressedSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
70
76
|
onBinaryBeforeCompressing(saveBody.buffer);
|
|
71
77
|
let handledByte = 0;
|
|
72
78
|
const chunkSummary = [];
|
|
@@ -75,27 +81,27 @@ class SaveWriter extends ByteWriter {
|
|
|
75
81
|
const uncompressedChunk = saveBody.buffer.slice(handledByte, handledByte + uncompressedContentSize);
|
|
76
82
|
let compressedChunk = new Uint8Array(0);
|
|
77
83
|
try {
|
|
78
|
-
compressedChunk =
|
|
84
|
+
compressedChunk = pako_1.default.deflate(uncompressedChunk);
|
|
79
85
|
}
|
|
80
86
|
catch (err) {
|
|
81
|
-
throw new CompressionLibraryError("Could not compress save data. " + err);
|
|
87
|
+
throw new parser_error_1.CompressionLibraryError("Could not compress save data. " + err);
|
|
82
88
|
}
|
|
83
89
|
const chunk = new Uint8Array(compressionInfo.chunkHeaderSize + compressedChunk.byteLength);
|
|
84
90
|
chunk.set(compressedChunk, compressionInfo.chunkHeaderSize);
|
|
85
91
|
const view = new DataView(chunk.buffer);
|
|
86
|
-
view.setInt32(0, compressionInfo.packageFileTag, alignment === Alignment.LITTLE_ENDIAN);
|
|
87
|
-
view.setInt32(4, 0x22222222, alignment === Alignment.LITTLE_ENDIAN);
|
|
88
|
-
view.setInt32(8, compressionInfo.maxUncompressedChunkContentSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
89
|
-
view.setInt32(12, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
90
|
-
view.setUint8(16, CompressionAlgorithmCode.ZLIB);
|
|
91
|
-
view.setInt32(17, compressedChunk.byteLength, alignment === Alignment.LITTLE_ENDIAN);
|
|
92
|
-
view.setInt32(21, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
93
|
-
view.setInt32(25, uncompressedContentSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
94
|
-
view.setInt32(29, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
95
|
-
view.setInt32(33, compressedChunk.byteLength, alignment === Alignment.LITTLE_ENDIAN);
|
|
96
|
-
view.setInt32(37, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
97
|
-
view.setInt32(41, uncompressedContentSize, alignment === Alignment.LITTLE_ENDIAN);
|
|
98
|
-
view.setInt32(45, 0, alignment === Alignment.LITTLE_ENDIAN);
|
|
92
|
+
view.setInt32(0, compressionInfo.packageFileTag, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
93
|
+
view.setInt32(4, 0x22222222, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
94
|
+
view.setInt32(8, compressionInfo.maxUncompressedChunkContentSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
95
|
+
view.setInt32(12, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
96
|
+
view.setUint8(16, file_types_1.CompressionAlgorithmCode.ZLIB);
|
|
97
|
+
view.setInt32(17, compressedChunk.byteLength, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
98
|
+
view.setInt32(21, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
99
|
+
view.setInt32(25, uncompressedContentSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
100
|
+
view.setInt32(29, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
101
|
+
view.setInt32(33, compressedChunk.byteLength, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
102
|
+
view.setInt32(37, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
103
|
+
view.setInt32(41, uncompressedContentSize, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
104
|
+
view.setInt32(45, 0, alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
99
105
|
onChunk(chunk);
|
|
100
106
|
chunkSummary.push({
|
|
101
107
|
uncompressedSize: uncompressedContentSize + compressionInfo.chunkHeaderSize,
|
|
@@ -107,7 +113,7 @@ class SaveWriter extends ByteWriter {
|
|
|
107
113
|
}
|
|
108
114
|
generateChunks(compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk) {
|
|
109
115
|
if (posAfterHeader <= 0) {
|
|
110
|
-
throw new ParserError('ParserError', 'Seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
116
|
+
throw new parser_error_1.ParserError('ParserError', 'Seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
111
117
|
}
|
|
112
118
|
const header = new Uint8Array(this.bufferArray.slice(0, posAfterHeader));
|
|
113
119
|
onHeader(header);
|
|
@@ -138,4 +144,4 @@ SaveWriter.WriteGrids = (writer, grids) => {
|
|
|
138
144
|
}
|
|
139
145
|
writer.writeInt32(0);
|
|
140
146
|
};
|
|
141
|
-
|
|
147
|
+
exports.SaveWriter = SaveWriter;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|