@etothepii/satisfactory-file-parser 0.0.31 → 0.0.32
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/LICENCE.md +20 -20
- package/README.md +112 -112
- package/build/index.d.ts +5 -1
- package/build/index.js +7 -7
- package/build/parser/byte/binary-operable.interface.d.ts +6 -0
- package/build/parser/byte/binary-operable.interface.js +12 -0
- package/build/parser/byte/binary-readable.interface.d.ts +22 -0
- package/build/parser/byte/binary-readable.interface.js +12 -0
- package/build/parser/byte/byte-reader.class.d.ts +11 -9
- package/build/parser/byte/byte-reader.class.js +23 -15
- package/build/parser/error/parser.error.d.ts +6 -0
- package/build/parser/error/parser.error.js +13 -1
- package/build/parser/parser.d.ts +9 -0
- package/build/parser/parser.js +100 -2
- package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts +3 -2
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +1 -1
- package/build/parser/satisfactory/objects/DataFields.d.ts +34 -6
- package/build/parser/satisfactory/objects/DataFields.js +86 -3
- package/build/parser/satisfactory/objects/ObjectReference.d.ts +2 -2
- package/build/parser/satisfactory/objects/Property.d.ts +72 -72
- package/build/parser/satisfactory/objects/Property.js +24 -23
- package/build/parser/satisfactory/objects/SaveComponent.d.ts +8 -5
- package/build/parser/satisfactory/objects/SaveComponent.js +2 -2
- package/build/parser/satisfactory/objects/SaveEntity.d.ts +9 -4
- package/build/parser/satisfactory/objects/SaveEntity.js +2 -2
- package/build/parser/satisfactory/objects/SaveObject.d.ts +9 -4
- package/build/parser/satisfactory/objects/SaveObject.js +3 -3
- package/build/parser/satisfactory/save/asynchronous-level.class.d.ts +9 -0
- package/build/parser/satisfactory/save/asynchronous-level.class.js +76 -0
- package/build/parser/satisfactory/save/level.class.d.ts +5 -5
- package/build/parser/satisfactory/save/level.class.js +7 -6
- package/build/parser/satisfactory/save/save-reader.d.ts +4 -13
- package/build/parser/satisfactory/save/save-reader.js +17 -72
- package/build/parser/satisfactory/structs/util.types.d.ts +7 -7
- package/build/parser/satisfactory/structs/util.types.js +10 -10
- package/build/parser/stream/byte-stream-reader.class.d.ts +57 -0
- package/build/parser/stream/byte-stream-reader.class.js +251 -0
- package/build/parser/stream/json-stream-state-writer.d.ts +12 -0
- package/build/parser/stream/json-stream-state-writer.js +28 -0
- package/build/parser/stream/json-stream-writable.d.ts +20 -0
- package/build/parser/stream/json-stream-writable.js +93 -0
- package/build/parser/stream/json-stream-writer.d.ts +22 -0
- package/build/parser/stream/json-stream-writer.js +137 -0
- package/build/parser/stream/save-stream-json-stringifier.d.ts +6 -0
- package/build/parser/stream/save-stream-json-stringifier.js +43 -0
- package/build/parser/stream/save-stream-reader.class.d.ts +15 -0
- package/build/parser/stream/save-stream-reader.class.js +131 -0
- package/build/parser/stream/save-stream-writer.class.d.ts +22 -0
- package/build/parser/stream/save-stream-writer.class.js +115 -0
- package/build/parser/stream/stream-level.class.d.ts +12 -0
- package/build/parser/stream/stream-level.class.js +113 -0
- package/package.json +3 -1
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
return new Int64Property(value, ueType, guidInfo, index);
|
|
234
234
|
}
|
|
235
235
|
static ReadValue(reader) {
|
|
236
|
-
return reader.
|
|
236
|
+
return reader.readInt64().toString();
|
|
237
237
|
}
|
|
238
238
|
static CalcOverhead(property) {
|
|
239
239
|
return 1;
|
|
@@ -261,7 +261,7 @@
|
|
|
261
261
|
return 1;
|
|
262
262
|
}
|
|
263
263
|
static ReadValue(reader) {
|
|
264
|
-
return reader.
|
|
264
|
+
return reader.readFloat32();
|
|
265
265
|
}
|
|
266
266
|
static Serialize(writer, property) {
|
|
267
267
|
(0, exports.SerializeGUID)(writer, property.guidInfo);
|
|
@@ -547,8 +547,8 @@
|
|
|
547
547
|
value = {
|
|
548
548
|
root: reader.readString(),
|
|
549
549
|
instanceName: reader.readString(),
|
|
550
|
-
offset: reader.
|
|
551
|
-
forward: reader.
|
|
550
|
+
offset: reader.readFloat32(),
|
|
551
|
+
forward: reader.readFloat32()
|
|
552
552
|
};
|
|
553
553
|
break;
|
|
554
554
|
case 'TimerHandle':
|
|
@@ -568,14 +568,14 @@
|
|
|
568
568
|
break;
|
|
569
569
|
case 'FluidBox':
|
|
570
570
|
value = {
|
|
571
|
-
value: reader.
|
|
571
|
+
value: reader.readFloat32()
|
|
572
572
|
};
|
|
573
573
|
break;
|
|
574
574
|
case 'SlateBrush':
|
|
575
575
|
value = reader.readString();
|
|
576
576
|
break;
|
|
577
577
|
case 'DateTime':
|
|
578
|
-
value = reader.
|
|
578
|
+
value = reader.readInt64().toString();
|
|
579
579
|
break;
|
|
580
580
|
case 'FINNetworkTrace':
|
|
581
581
|
value = (0, exports.ReadFINNetworkTrace)(reader);
|
|
@@ -587,8 +587,8 @@
|
|
|
587
587
|
break;
|
|
588
588
|
case 'FICFrameRange':
|
|
589
589
|
value = {
|
|
590
|
-
begin: reader.
|
|
591
|
-
end: reader.
|
|
590
|
+
begin: reader.readInt64().toString(),
|
|
591
|
+
end: reader.readInt64().toString(),
|
|
592
592
|
};
|
|
593
593
|
break;
|
|
594
594
|
default:
|
|
@@ -704,35 +704,35 @@
|
|
|
704
704
|
const elementCount = reader.readInt32();
|
|
705
705
|
switch (subtype) {
|
|
706
706
|
case "FloatProperty":
|
|
707
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
707
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => FloatProperty.ReadValue(reader)), ueType, index);
|
|
708
708
|
break;
|
|
709
709
|
case "BoolProperty":
|
|
710
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
710
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => BoolProperty.ReadValue(reader)), ueType, index);
|
|
711
711
|
break;
|
|
712
712
|
case "IntProperty":
|
|
713
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
713
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => Int32Property.ReadValue(reader)), ueType, index);
|
|
714
714
|
break;
|
|
715
715
|
case "Int64Property":
|
|
716
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
716
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => Int64Property.ReadValue(reader)), ueType, index);
|
|
717
717
|
break;
|
|
718
718
|
case "DoubleProperty":
|
|
719
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
719
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => DoubleProperty.ReadValue(reader)), ueType, index);
|
|
720
720
|
break;
|
|
721
721
|
case "ByteProperty":
|
|
722
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
722
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => ByteProperty.ReadValue(reader)), ueType, index);
|
|
723
723
|
break;
|
|
724
724
|
case "StrProperty":
|
|
725
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
725
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => StrProperty.ReadValue(reader)), ueType, index);
|
|
726
726
|
break;
|
|
727
727
|
case "EnumProperty":
|
|
728
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
728
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => EnumProperty.ReadValue(reader)), ueType, index);
|
|
729
729
|
break;
|
|
730
730
|
case "TextProperty":
|
|
731
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
731
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => TextProperty.ParseValue(reader)), ueType, index);
|
|
732
732
|
break;
|
|
733
733
|
case "InterfaceProperty":
|
|
734
734
|
case "ObjectProperty":
|
|
735
|
-
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(
|
|
735
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => ObjectProperty.ReadValue(reader)), ueType, index);
|
|
736
736
|
break;
|
|
737
737
|
case "StructProperty":
|
|
738
738
|
const name = reader.readString();
|
|
@@ -759,7 +759,7 @@
|
|
|
759
759
|
innerStructValueFields.allUnk4 = allUnk4;
|
|
760
760
|
}
|
|
761
761
|
const before = reader.getBufferPosition();
|
|
762
|
-
const maArr = new Array(elementCount).fill(0).map(
|
|
762
|
+
const maArr = new Array(elementCount).fill(0).map(() => {
|
|
763
763
|
const struct = new StructProperty(allStructType, type, allIndex, allGuid);
|
|
764
764
|
struct.value = StructProperty.ParseValue(reader, allStructType, binarySize);
|
|
765
765
|
return struct;
|
|
@@ -852,17 +852,17 @@
|
|
|
852
852
|
let property;
|
|
853
853
|
switch (subtype) {
|
|
854
854
|
case "IntProperty":
|
|
855
|
-
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(
|
|
855
|
+
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(() => Int32Property.ReadValue(reader)), ueType, index);
|
|
856
856
|
break;
|
|
857
857
|
case "ObjectProperty":
|
|
858
|
-
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(
|
|
858
|
+
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(() => ObjectProperty.ReadValue(reader)), ueType, index);
|
|
859
859
|
break;
|
|
860
860
|
case "NameProperty":
|
|
861
|
-
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(
|
|
861
|
+
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(() => StrProperty.ReadValue(reader)), ueType, index);
|
|
862
862
|
break;
|
|
863
863
|
case "StructProperty":
|
|
864
864
|
if (propertyName === 'mRemovalLocations') {
|
|
865
|
-
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(
|
|
865
|
+
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(() => (0, util_types_1.ParseVec3)(reader)), ueType, index);
|
|
866
866
|
}
|
|
867
867
|
break;
|
|
868
868
|
default:
|
|
@@ -932,6 +932,7 @@
|
|
|
932
932
|
const data = {
|
|
933
933
|
type, properties: {}
|
|
934
934
|
};
|
|
935
|
+
const pos = reader.getBufferPosition();
|
|
935
936
|
let propertyName = reader.readString();
|
|
936
937
|
while (propertyName !== 'None') {
|
|
937
938
|
const property = DataFields_1.DataFields.ParseProperty(reader, buildVersion, propertyName);
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
2
|
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
|
-
import { SaveObject } from "./SaveObject";
|
|
3
|
+
import { SaveObject, SaveObjectHeader } from "./SaveObject";
|
|
4
4
|
export declare const isSaveComponent: (obj: any) => obj is SaveComponent;
|
|
5
|
-
export
|
|
5
|
+
export interface SaveComponentHeader extends SaveObjectHeader {
|
|
6
|
+
parentEntityName: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class SaveComponent extends SaveObject implements SaveComponentHeader {
|
|
6
9
|
typePath: string;
|
|
7
10
|
rootObject: string;
|
|
8
11
|
instanceName: string;
|
|
@@ -10,7 +13,7 @@ export declare class SaveComponent extends SaveObject {
|
|
|
10
13
|
static readonly TypeID = 0;
|
|
11
14
|
readonly type = "SaveComponent";
|
|
12
15
|
constructor(typePath: string, rootObject: string, instanceName: string, parentEntityName?: string);
|
|
13
|
-
static ParseHeader(reader:
|
|
16
|
+
static ParseHeader(reader: BinaryReadable, obj: SaveComponent): void;
|
|
14
17
|
static SerializeHeader(writer: ByteWriter, component: SaveComponent): void;
|
|
15
|
-
static ParseData(component: SaveComponent, length: number, reader:
|
|
18
|
+
static ParseData(component: SaveComponent, length: number, reader: BinaryReadable, buildVersion: number, typePath: string): void;
|
|
16
19
|
}
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
SaveObject_1.SaveObject.SerializeHeader(writer, component);
|
|
33
33
|
writer.writeString(component.parentEntityName);
|
|
34
34
|
}
|
|
35
|
-
static ParseData(component, length, reader, buildVersion) {
|
|
36
|
-
SaveObject_1.SaveObject.ParseData(component, length, reader, buildVersion);
|
|
35
|
+
static ParseData(component, length, reader, buildVersion, typePath) {
|
|
36
|
+
SaveObject_1.SaveObject.ParseData(component, length, reader, buildVersion, typePath);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
SaveComponent.TypeID = 0;
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
2
|
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
3
|
import { Transform } from "../structs/util.types";
|
|
4
4
|
import { ObjectReference } from "./ObjectReference";
|
|
5
|
-
import { SaveObject } from "./SaveObject";
|
|
5
|
+
import { SaveObject, SaveObjectHeader } from "./SaveObject";
|
|
6
6
|
export declare const isSaveEntity: (obj: any) => obj is SaveEntity;
|
|
7
|
+
export interface SaveEntityHeader extends SaveObjectHeader {
|
|
8
|
+
needTransform: boolean;
|
|
9
|
+
transform: Transform;
|
|
10
|
+
wasPlacedInLevel: boolean;
|
|
11
|
+
}
|
|
7
12
|
export declare class SaveEntity extends SaveObject {
|
|
8
13
|
typePath: string;
|
|
9
14
|
rootObject: string;
|
|
@@ -18,8 +23,8 @@ export declare class SaveEntity extends SaveObject {
|
|
|
18
23
|
parentObjectName: string;
|
|
19
24
|
components: ObjectReference[];
|
|
20
25
|
constructor(typePath: string, rootObject: string, instanceName: string, parentEntityName?: string, needsTransform?: boolean);
|
|
21
|
-
static ParseHeader(reader:
|
|
22
|
-
static ParseData(entity: SaveEntity, length: number, reader:
|
|
26
|
+
static ParseHeader(reader: BinaryReadable, obj: SaveEntity): void;
|
|
27
|
+
static ParseData(entity: SaveEntity, length: number, reader: BinaryReadable, buildVersion: number, typePath: string): void;
|
|
23
28
|
static SerializeHeader(writer: ByteWriter, entity: SaveEntity): void;
|
|
24
29
|
static SerializeData(writer: ByteWriter, entity: SaveEntity, buildVersion: number): void;
|
|
25
30
|
}
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
obj.transform = (0, util_types_1.ParseTransform)(reader);
|
|
43
43
|
obj.wasPlacedInLevel = reader.readInt32() == 1;
|
|
44
44
|
}
|
|
45
|
-
static ParseData(entity, length, reader, buildVersion) {
|
|
45
|
+
static ParseData(entity, length, reader, buildVersion, typePath) {
|
|
46
46
|
var newLen = length - 12;
|
|
47
47
|
entity.parentObjectRoot = reader.readString();
|
|
48
48
|
if (entity.parentObjectRoot.length > 0)
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
entity.components.push(componentRef);
|
|
57
57
|
newLen -= 10 + componentRef.levelName.length + componentRef.pathName.length;
|
|
58
58
|
}
|
|
59
|
-
SaveObject_1.SaveObject.ParseData(entity, newLen, reader, buildVersion);
|
|
59
|
+
return SaveObject_1.SaveObject.ParseData(entity, newLen, reader, buildVersion, typePath);
|
|
60
60
|
}
|
|
61
61
|
static SerializeHeader(writer, entity) {
|
|
62
62
|
SaveObject_1.SaveObject.SerializeHeader(writer, entity);
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
2
|
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
3
|
import { DataFields } from "./DataFields";
|
|
4
|
-
export
|
|
4
|
+
export interface SaveObjectHeader {
|
|
5
|
+
typePath: string;
|
|
6
|
+
rootObject: string;
|
|
7
|
+
instanceName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare abstract class SaveObject implements SaveObjectHeader {
|
|
5
10
|
typePath: string;
|
|
6
11
|
rootObject: string;
|
|
7
12
|
instanceName: string;
|
|
8
13
|
dataFields: DataFields;
|
|
9
14
|
constructor(typePath: string, rootObject: string, instanceName: string);
|
|
10
|
-
protected static ParseHeader(reader:
|
|
15
|
+
protected static ParseHeader(reader: BinaryReadable, obj: SaveObject): void;
|
|
11
16
|
protected static SerializeHeader(writer: ByteWriter, obj: SaveObject): void;
|
|
12
|
-
static ParseData(obj: SaveObject, length: number, reader:
|
|
17
|
+
static ParseData(obj: SaveObject, length: number, reader: BinaryReadable, buildVersion: number, typePath: string): void;
|
|
13
18
|
static SerializeData(writer: any, obj: SaveObject, buildVersion: number): void;
|
|
14
19
|
}
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
writer.writeString(obj.rootObject);
|
|
29
29
|
writer.writeString(obj.instanceName);
|
|
30
30
|
}
|
|
31
|
-
static ParseData(obj, length, reader, buildVersion) {
|
|
32
|
-
obj.dataFields = DataFields_1.DataFields.Parse(length, reader, buildVersion);
|
|
31
|
+
static ParseData(obj, length, reader, buildVersion, typePath) {
|
|
32
|
+
obj.dataFields = DataFields_1.DataFields.Parse(length, reader, buildVersion, typePath);
|
|
33
33
|
}
|
|
34
34
|
static SerializeData(writer, obj, buildVersion) {
|
|
35
|
-
DataFields_1.DataFields.Serialize(writer, obj.dataFields, buildVersion);
|
|
35
|
+
DataFields_1.DataFields.Serialize(writer, obj.dataFields, buildVersion, obj.typePath);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
exports.SaveObject = SaveObject;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ByteReader } from "../../byte/byte-reader.class";
|
|
2
|
+
import { SaveStreamWriter } from "../../stream/save-stream-writer.class";
|
|
3
|
+
import { SaveObject } from "../objects/SaveObject";
|
|
4
|
+
import { Level } from "./level.class";
|
|
5
|
+
import { SaveReader } from "./save-reader";
|
|
6
|
+
export declare class AsynchronousLevel {
|
|
7
|
+
static StreamReadObjectContents(reader: ByteReader, objectsList: SaveObject[], buildVersion: number, writer: SaveStreamWriter, onProgressCallback: (progress: number, msg?: string) => void): Promise<void>;
|
|
8
|
+
static StreamReadLevel(reader: SaveReader, levelName: string, buildVersion: number, writer: SaveStreamWriter): Promise<Level>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "../objects/SaveComponent", "../objects/SaveEntity", "./level.class"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AsynchronousLevel = void 0;
|
|
13
|
+
const SaveComponent_1 = require("../objects/SaveComponent");
|
|
14
|
+
const SaveEntity_1 = require("../objects/SaveEntity");
|
|
15
|
+
const level_class_1 = require("./level.class");
|
|
16
|
+
class AsynchronousLevel {
|
|
17
|
+
static async StreamReadObjectContents(reader, objectsList, buildVersion, writer, onProgressCallback) {
|
|
18
|
+
const binarySize = reader.readInt32();
|
|
19
|
+
const posBefore = reader.getBufferPosition();
|
|
20
|
+
await reader.allocate(binarySize);
|
|
21
|
+
const countEntities = reader.readInt32();
|
|
22
|
+
if (countEntities !== objectsList.length) {
|
|
23
|
+
throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);
|
|
24
|
+
}
|
|
25
|
+
let dynamicObjectBatch = [];
|
|
26
|
+
for (let i = 0; i < countEntities; i++) {
|
|
27
|
+
if (i % 1000 === 0) {
|
|
28
|
+
console.log(`having some objects, writing ${i + 1}/${countEntities}.`);
|
|
29
|
+
onProgressCallback(reader.getBufferProgress());
|
|
30
|
+
await writer.writeObjects(...dynamicObjectBatch);
|
|
31
|
+
dynamicObjectBatch = [];
|
|
32
|
+
}
|
|
33
|
+
const len = reader.readInt32();
|
|
34
|
+
const before = reader.getBufferPosition();
|
|
35
|
+
if (len < reader.getAmountAllocatedLeft()) {
|
|
36
|
+
await reader.allocate(Math.max(before - binarySize, 300 * 1000 * 1000));
|
|
37
|
+
}
|
|
38
|
+
const obj = objectsList[i];
|
|
39
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
40
|
+
SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
41
|
+
}
|
|
42
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
43
|
+
SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
44
|
+
}
|
|
45
|
+
dynamicObjectBatch.push(obj);
|
|
46
|
+
const after = reader.getBufferPosition();
|
|
47
|
+
if (after - before !== len) {
|
|
48
|
+
console.warn('entity may be corrupt', this.name, i);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
await writer.writeObjects(...dynamicObjectBatch);
|
|
52
|
+
const posAfter = reader.getBufferPosition();
|
|
53
|
+
if (posAfter - posBefore !== binarySize) {
|
|
54
|
+
console.warn('save seems corrupt.', this.name);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
static async StreamReadLevel(reader, levelName, buildVersion, writer) {
|
|
58
|
+
const level = new level_class_1.Level(levelName);
|
|
59
|
+
const binaryLength = reader.readInt32();
|
|
60
|
+
await reader.allocate(binaryLength);
|
|
61
|
+
await writer.openLevel(levelName);
|
|
62
|
+
level_class_1.Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback);
|
|
63
|
+
reader.onProgressCallback(reader.getBufferProgress());
|
|
64
|
+
level.collectables = level_class_1.Level.ReadCollectablesList(reader);
|
|
65
|
+
console.log(`before object contents buffer pos ${reader.getBufferPosition()}`);
|
|
66
|
+
await AsynchronousLevel.StreamReadObjectContents(reader, level.objects, buildVersion, writer, reader.onProgressCallback);
|
|
67
|
+
await writer.switchInLevelToCollectables();
|
|
68
|
+
await writer.writeCollectables(...level.collectables);
|
|
69
|
+
reader.onProgressCallback(reader.getBufferProgress());
|
|
70
|
+
level_class_1.Level.ReadCollectablesList(reader);
|
|
71
|
+
await writer.endLevel();
|
|
72
|
+
return level;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.AsynchronousLevel = AsynchronousLevel;
|
|
76
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
2
|
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
3
|
import { ObjectReference } from "../objects/ObjectReference";
|
|
4
4
|
import { SaveComponent } from "../objects/SaveComponent";
|
|
@@ -12,10 +12,10 @@ export declare class Level {
|
|
|
12
12
|
constructor(name: string);
|
|
13
13
|
static SerializeObjectHeaders(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[]): void;
|
|
14
14
|
static WriteLevel(writer: ByteWriter, level: Level, buildVersion: number): void;
|
|
15
|
-
static SerializeObjectContents(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[], buildVersion: number): void;
|
|
16
|
-
static ReadObjectHeaders(reader:
|
|
17
|
-
static ReadObjectContents(reader:
|
|
15
|
+
static SerializeObjectContents(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[], buildVersion: number, levelName: string): void;
|
|
16
|
+
static ReadObjectHeaders(reader: BinaryReadable, objectsList: SaveObject[], onProgressCallback: (progress: number, msg?: string) => void): void;
|
|
17
|
+
static ReadObjectContents(reader: BinaryReadable, objectsList: SaveObject[], buildVersion: number, onProgressCallback: (progress: number, msg?: string) => void): Promise<void>;
|
|
18
18
|
static ReadLevel(reader: SaveReader, levelName: string, buildVersion: number): Level;
|
|
19
19
|
static SerializeCollectablesList(writer: ByteWriter, collectables: ObjectReference[]): void;
|
|
20
|
-
static ReadCollectablesList(reader:
|
|
20
|
+
static ReadCollectablesList(reader: BinaryReadable): ObjectReference[];
|
|
21
21
|
}
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
Level.SerializeObjectHeaders(writer, level.objects);
|
|
44
44
|
Level.SerializeCollectablesList(writer, level.collectables);
|
|
45
45
|
writer.writeBinarySizeFromPosition(lenIndicatorHeaderAndCollectableSize, lenIndicatorHeaderAndCollectableSize + 4);
|
|
46
|
-
Level.SerializeObjectContents(writer, level.objects, buildVersion);
|
|
46
|
+
Level.SerializeObjectContents(writer, level.objects, buildVersion, level.name);
|
|
47
47
|
Level.SerializeCollectablesList(writer, level.collectables);
|
|
48
48
|
}
|
|
49
|
-
static SerializeObjectContents(writer, objects, buildVersion) {
|
|
49
|
+
static SerializeObjectContents(writer, objects, buildVersion, levelName) {
|
|
50
50
|
const lenIndicatorEntities = writer.getBufferPosition();
|
|
51
51
|
writer.writeInt32(0);
|
|
52
52
|
writer.writeInt32(objects.length);
|
|
@@ -87,12 +87,12 @@
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
static ReadObjectContents(reader, objectsList, buildVersion, onProgressCallback) {
|
|
90
|
+
static async ReadObjectContents(reader, objectsList, buildVersion, onProgressCallback) {
|
|
91
91
|
const binarySize = reader.readInt32();
|
|
92
92
|
const posBefore = reader.getBufferPosition();
|
|
93
93
|
const countEntities = reader.readInt32();
|
|
94
94
|
if (countEntities !== objectsList.length) {
|
|
95
|
-
throw new Error(`possibly corrupt. entity content count ${countEntities} does not object count of ${objectsList.length}`);
|
|
95
|
+
throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);
|
|
96
96
|
}
|
|
97
97
|
for (let i = 0; i < countEntities; i++) {
|
|
98
98
|
if (i % 1000 === 0) {
|
|
@@ -102,10 +102,10 @@
|
|
|
102
102
|
const before = reader.getBufferPosition();
|
|
103
103
|
const obj = objectsList[i];
|
|
104
104
|
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
105
|
-
SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion);
|
|
105
|
+
SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
106
106
|
}
|
|
107
107
|
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
108
|
-
SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion);
|
|
108
|
+
SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
109
109
|
}
|
|
110
110
|
const after = reader.getBufferPosition();
|
|
111
111
|
if (after - before !== len) {
|
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback);
|
|
124
124
|
reader.onProgressCallback(reader.getBufferProgress());
|
|
125
125
|
level.collectables = Level.ReadCollectablesList(reader);
|
|
126
|
+
console.log(`before object contents buffer pos ${reader.getBufferPosition()}`);
|
|
126
127
|
Level.ReadObjectContents(reader, level.objects, buildVersion, reader.onProgressCallback);
|
|
127
128
|
reader.onProgressCallback(reader.getBufferProgress());
|
|
128
129
|
Level.ReadCollectablesList(reader);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ByteReader } from "../../byte/byte-reader.class";
|
|
2
2
|
import { ChunkCompressionInfo } from "../../file.types";
|
|
3
|
+
import { SaveStreamWriter } from "../../stream/save-stream-writer.class";
|
|
3
4
|
import { ObjectReference } from "../objects/ObjectReference";
|
|
4
5
|
import { SaveComponent } from "../objects/SaveComponent";
|
|
5
6
|
import { SaveEntity } from "../objects/SaveEntity";
|
|
6
|
-
import { SaveObject } from "../objects/SaveObject";
|
|
7
7
|
import { Level } from "./level.class";
|
|
8
8
|
import { SatisfactorySaveHeader } from "./save.types";
|
|
9
9
|
export type EntityPathFilter = {
|
|
@@ -15,6 +15,8 @@ export type SaveProjectionConfig = {
|
|
|
15
15
|
includeComponents: boolean;
|
|
16
16
|
};
|
|
17
17
|
export declare const projectionFilterApplies: (config: SaveProjectionConfig, object: SaveComponent | SaveEntity) => boolean;
|
|
18
|
+
export type ReadMode = 'stream' | 'whole';
|
|
19
|
+
export declare const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 48;
|
|
18
20
|
export declare class SaveReader extends ByteReader {
|
|
19
21
|
onProgressCallback: (progress: number, msg?: string) => void;
|
|
20
22
|
header: SatisfactorySaveHeader | undefined;
|
|
@@ -29,16 +31,5 @@ export declare class SaveReader extends ByteReader {
|
|
|
29
31
|
numChunks: number;
|
|
30
32
|
};
|
|
31
33
|
readLevels(): Level[];
|
|
32
|
-
|
|
33
|
-
export declare class Conveyor {
|
|
34
|
-
static getConveyorBeltRegex(): RegExp;
|
|
35
|
-
static getConveyorLiftRegex(): RegExp;
|
|
36
|
-
static isAConveyorBelt(obj: SaveObject): boolean;
|
|
37
|
-
static isAConveyorLift(obj: SaveObject): boolean;
|
|
38
|
-
static get availableConnections(): string[];
|
|
39
|
-
static get availableConveyorBelts(): string[];
|
|
40
|
-
static get availableConveyorLifts(): string[];
|
|
41
|
-
static isConveyor(currentObject: any): boolean;
|
|
42
|
-
static isConveyorBelt(currentObject: any): boolean;
|
|
43
|
-
static isConveyorLift(currentObject: any): boolean;
|
|
34
|
+
readLevelsAsynchronously(writer: SaveStreamWriter): Promise<Level[]>;
|
|
44
35
|
}
|
|
@@ -7,18 +7,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
7
7
|
if (v !== undefined) module.exports = v;
|
|
8
8
|
}
|
|
9
9
|
else if (typeof define === "function" && define.amd) {
|
|
10
|
-
define(["require", "exports", "pako", "../../byte/alignment.enum", "../../byte/byte-reader.class", "../../error/parser.error", "../objects/SaveComponent", "../objects/SaveEntity", "./level.class"], factory);
|
|
10
|
+
define(["require", "exports", "pako", "../../byte/alignment.enum", "../../byte/byte-reader.class", "../../error/parser.error", "../objects/SaveComponent", "../objects/SaveEntity", "./asynchronous-level.class", "./level.class"], factory);
|
|
11
11
|
}
|
|
12
12
|
})(function (require, exports) {
|
|
13
13
|
"use strict";
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.
|
|
15
|
+
exports.SaveReader = exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = exports.projectionFilterApplies = void 0;
|
|
16
16
|
const pako_1 = __importDefault(require("pako"));
|
|
17
17
|
const alignment_enum_1 = require("../../byte/alignment.enum");
|
|
18
18
|
const byte_reader_class_1 = require("../../byte/byte-reader.class");
|
|
19
19
|
const parser_error_1 = require("../../error/parser.error");
|
|
20
20
|
const SaveComponent_1 = require("../objects/SaveComponent");
|
|
21
21
|
const SaveEntity_1 = require("../objects/SaveEntity");
|
|
22
|
+
const asynchronous_level_class_1 = require("./asynchronous-level.class");
|
|
22
23
|
const level_class_1 = require("./level.class");
|
|
23
24
|
const projectionFilterApplies = (config, object) => {
|
|
24
25
|
let cond1 = false;
|
|
@@ -38,6 +39,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
39
|
return cond1 && cond2;
|
|
39
40
|
};
|
|
40
41
|
exports.projectionFilterApplies = projectionFilterApplies;
|
|
42
|
+
exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 48;
|
|
41
43
|
class SaveReader extends byte_reader_class_1.ByteReader {
|
|
42
44
|
constructor(fileBuffer, onProgressCallback = () => { }) {
|
|
43
45
|
super(fileBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
@@ -47,7 +49,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
47
49
|
this.compressionInfo = {
|
|
48
50
|
packageFileTag: 0,
|
|
49
51
|
maxChunkContentSize: 0,
|
|
50
|
-
chunkHeaderSize:
|
|
52
|
+
chunkHeaderSize: exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE
|
|
51
53
|
};
|
|
52
54
|
}
|
|
53
55
|
readHeader() {
|
|
@@ -168,76 +170,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
168
170
|
}
|
|
169
171
|
return this.levels;
|
|
170
172
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
static getConveyorLiftRegex() {
|
|
180
|
-
return /\/Game\/FactoryGame\/Buildable\/Factory\/(ConveyorLiftMk[0-9]+)\/Build_(\1)\.Build_(\1)_C/g;
|
|
181
|
-
}
|
|
182
|
-
;
|
|
183
|
-
static isAConveyorBelt(obj) {
|
|
184
|
-
return obj.typePath.match(this.getConveyorBeltRegex()) !== null;
|
|
185
|
-
}
|
|
186
|
-
static isAConveyorLift(obj) {
|
|
187
|
-
return obj.typePath.match(this.getConveyorLiftRegex()) !== null;
|
|
188
|
-
}
|
|
189
|
-
static get availableConnections() { return ['.ConveyorAny0', '.ConveyorAny1', '.Input0', '.Input1', '.Input2', '.Input3', '.InPut3', '.Input4', '.Input5', '.Input6', '.Output0', '.Output1', '.Output2', '.Output3']; }
|
|
190
|
-
static get availableConveyorBelts() {
|
|
191
|
-
return [
|
|
192
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk1/Build_ConveyorBeltMk1.Build_ConveyorBeltMk1_C',
|
|
193
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk2/Build_ConveyorBeltMk2.Build_ConveyorBeltMk2_C',
|
|
194
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk3/Build_ConveyorBeltMk3.Build_ConveyorBeltMk3_C',
|
|
195
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk4/Build_ConveyorBeltMk4.Build_ConveyorBeltMk4_C',
|
|
196
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk5/Build_ConveyorBeltMk5.Build_ConveyorBeltMk5_C'
|
|
197
|
-
];
|
|
198
|
-
}
|
|
199
|
-
static get availableConveyorLifts() {
|
|
200
|
-
return [
|
|
201
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk1/Build_ConveyorLiftMk1.Build_ConveyorLiftMk1_C',
|
|
202
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk2/Build_ConveyorLiftMk2.Build_ConveyorLiftMk2_C',
|
|
203
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk3/Build_ConveyorLiftMk3.Build_ConveyorLiftMk3_C',
|
|
204
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk4/Build_ConveyorLiftMk4.Build_ConveyorLiftMk4_C',
|
|
205
|
-
'/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk5/Build_ConveyorLiftMk5.Build_ConveyorLiftMk5_C'
|
|
206
|
-
];
|
|
207
|
-
}
|
|
208
|
-
static isConveyor(currentObject) {
|
|
209
|
-
return Conveyor.isConveyorBelt(currentObject) || Conveyor.isConveyorLift(currentObject);
|
|
210
|
-
}
|
|
211
|
-
static isConveyorBelt(currentObject) {
|
|
212
|
-
if (Conveyor.availableConveyorBelts.includes(currentObject.className)) {
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
if (currentObject.className.startsWith('/Conveyors_Mod/Build_BeltMk')
|
|
216
|
-
|| currentObject.className.startsWith('/Game/Conveyors_Mod/Build_BeltMk')
|
|
217
|
-
|| currentObject.className.startsWith('/UltraFastLogistics/Buildable/build_conveyorbeltMK')
|
|
218
|
-
|| currentObject.className.startsWith('/FlexSplines/Conveyor/Build_Belt')
|
|
219
|
-
|| currentObject.className.startsWith('/conveyorbeltmod/Belt/mk')
|
|
220
|
-
|| currentObject.className.startsWith('/minerplus/content/buildable/Factory/belt_')
|
|
221
|
-
|| currentObject.className.startsWith('/bamfp/content/buildable/Factory/belt_')) {
|
|
222
|
-
return true;
|
|
223
|
-
}
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
|
-
static isConveyorLift(currentObject) {
|
|
227
|
-
if (Conveyor.availableConveyorLifts.includes(currentObject.className)) {
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
if (currentObject.className.startsWith('/minerplus/content/buildable/Factory/lift')
|
|
231
|
-
|| currentObject.className.startsWith('/bamfp/content/buildable/Factory/lift')
|
|
232
|
-
|| currentObject.className.startsWith('/Game/Conveyors_Mod/Build_LiftMk')
|
|
233
|
-
|| currentObject.className.startsWith('/Conveyors_Mod/Build_LiftMk')
|
|
234
|
-
|| currentObject.className.startsWith('/Game/CoveredConveyor')
|
|
235
|
-
|| currentObject.className.startsWith('/CoveredConveyor')
|
|
236
|
-
|| currentObject.className.startsWith('/conveyorbeltmod/lift/')) {
|
|
237
|
-
return true;
|
|
173
|
+
async readLevelsAsynchronously(writer) {
|
|
174
|
+
const numSubLevels = this.readInt32();
|
|
175
|
+
this.levels = new Array(numSubLevels + 1);
|
|
176
|
+
await writer.openLevels();
|
|
177
|
+
for (let j = 0; j <= numSubLevels; j++) {
|
|
178
|
+
let levelName = (j === numSubLevels) ? '' + this.header.mapName : this.readString();
|
|
179
|
+
this.onProgressCallback(this.getBufferProgress(), `reading level [${(j + 1)}/${(numSubLevels + 1)}] ${levelName}`);
|
|
180
|
+
this.levels[j] = await asynchronous_level_class_1.AsynchronousLevel.StreamReadLevel(this, levelName, this.header.buildVersion, writer);
|
|
238
181
|
}
|
|
239
|
-
|
|
182
|
+
await writer.endLevels();
|
|
183
|
+
return this.levels;
|
|
240
184
|
}
|
|
241
185
|
}
|
|
242
|
-
|
|
186
|
+
SaveReader.EPOCH_TICKS = 621355968000000000n;
|
|
187
|
+
exports.SaveReader = SaveReader;
|
|
243
188
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
2
|
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
3
|
export type col4 = {
|
|
4
4
|
r: number;
|
|
@@ -7,13 +7,13 @@ export type col4 = {
|
|
|
7
7
|
a: number;
|
|
8
8
|
};
|
|
9
9
|
export declare const SerializeCol4RGBA: (writer: ByteWriter, value: col4) => void;
|
|
10
|
-
export declare const ParseCol4RGBA: (reader:
|
|
10
|
+
export declare const ParseCol4RGBA: (reader: BinaryReadable) => col4;
|
|
11
11
|
export declare const SerializeCol4BGRA: (writer: ByteWriter, value: col4) => void;
|
|
12
|
-
export declare const ParseCol4BGRA: (reader:
|
|
12
|
+
export declare const ParseCol4BGRA: (reader: BinaryReadable) => col4;
|
|
13
13
|
export type vec4 = vec3 & {
|
|
14
14
|
w: number;
|
|
15
15
|
};
|
|
16
|
-
export declare const ParseVec4: (reader:
|
|
16
|
+
export declare const ParseVec4: (reader: BinaryReadable) => vec4;
|
|
17
17
|
export declare const SerializeVec4: (writer: ByteWriter, vec: vec4) => void;
|
|
18
18
|
export declare const sub: (other: vec3, vec: vec3) => vec3;
|
|
19
19
|
export declare const add: (vec: vec3, other: vec3) => vec3;
|
|
@@ -23,18 +23,18 @@ export declare const norm: (vec: vec3) => vec3;
|
|
|
23
23
|
export type vec3 = vec2 & {
|
|
24
24
|
z: number;
|
|
25
25
|
};
|
|
26
|
-
export declare const ParseVec3: (reader:
|
|
26
|
+
export declare const ParseVec3: (reader: BinaryReadable) => vec3;
|
|
27
27
|
export declare const SerializeVec3: (writer: ByteWriter, vec: vec3) => void;
|
|
28
28
|
export type vec2 = {
|
|
29
29
|
x: number;
|
|
30
30
|
y: number;
|
|
31
31
|
};
|
|
32
|
-
export declare const ParseVec2: (reader:
|
|
32
|
+
export declare const ParseVec2: (reader: BinaryReadable) => vec2;
|
|
33
33
|
export declare const SerializeVec2: (writer: ByteWriter, vec: vec2) => void;
|
|
34
34
|
export type Transform = {
|
|
35
35
|
rotation: vec4;
|
|
36
36
|
translation: vec3;
|
|
37
37
|
scale3d: vec3;
|
|
38
38
|
};
|
|
39
|
-
export declare const ParseTransform: (reader:
|
|
39
|
+
export declare const ParseTransform: (reader: BinaryReadable) => Transform;
|
|
40
40
|
export declare const SerializeTransform: (writer: ByteWriter, transform: Transform) => void;
|