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