@etothepii/satisfactory-file-parser 0.3.7 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/build/index.d.ts +2 -2
- package/build/index.js +4 -4
- package/build/parser/byte/alignment.enum.js +1 -1
- package/build/parser/byte/byte-writer.class.js +1 -1
- package/build/parser/file.types.js +1 -1
- package/build/parser/parser.d.ts +0 -1
- package/build/parser/parser.js +1 -1
- package/build/parser/satisfactory/blueprint/blueprint-reader.js +2 -2
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +1 -1
- package/build/parser/satisfactory/edit/edit-constants.d.ts +729 -23
- package/build/parser/satisfactory/edit/edit-constants.js +743 -53
- package/build/parser/satisfactory/objects/DataFields.d.ts +2 -2
- package/build/parser/satisfactory/objects/DataFields.js +2 -2
- package/build/parser/satisfactory/objects/GUIDInfo.d.ts +3 -2
- package/build/parser/satisfactory/objects/GUIDInfo.js +2 -2
- package/build/parser/satisfactory/objects/Property.d.ts +17 -7
- package/build/parser/satisfactory/objects/Property.js +87 -26
- package/build/parser/satisfactory/objects/SaveComponent.js +1 -1
- package/build/parser/satisfactory/objects/SaveEntity.d.ts +1 -1
- package/build/parser/satisfactory/objects/SaveEntity.js +4 -4
- package/build/parser/satisfactory/objects/ue/MD5Hash.d.ts +2 -1
- package/build/parser/satisfactory/objects/ue/MD5Hash.js +1 -1
- package/build/parser/satisfactory/objects/values/GUID.d.ts +7 -0
- package/build/parser/satisfactory/objects/values/GUID.js +21 -0
- package/build/parser/satisfactory/objects/values/ObjectReference.d.ts +10 -0
- package/build/parser/satisfactory/objects/values/ObjectReference.js +17 -0
- package/build/parser/satisfactory/objects/values/SoftObjectReference.d.ts +11 -0
- package/build/parser/satisfactory/objects/values/SoftObjectReference.js +19 -0
- package/build/parser/satisfactory/save/level.class.d.ts +1 -1
- package/build/parser/satisfactory/save/level.class.js +1 -1
- package/build/parser/satisfactory/save/satisfactory-save.d.ts +1 -1
- package/build/parser/satisfactory/save/save-reader.d.ts +1 -1
- package/build/parser/satisfactory/save/save-reader.js +10 -7
- package/build/parser/satisfactory/save/save-writer.js +1 -2
- package/build/parser/satisfactory/save/save.types.d.ts +1 -1
- package/build/parser/satisfactory/structs/util.types.d.ts +35 -25
- package/build/parser/satisfactory/structs/util.types.js +133 -143
- package/build/parser/stream/reworked/readable-stream-parser.js +6 -6
- package/build/parser/stream/reworked/save-stream-json-stringifier.d.ts +1 -2
- package/build/parser/stream/reworked/save-stream-writer.class.d.ts +3 -2
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ByteWriter } from "../../..";
|
|
2
1
|
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
|
+
import { ByteWriter } from '../../byte/byte-writer.class';
|
|
3
3
|
import { SaveWriter } from "../save/save-writer";
|
|
4
4
|
import { vec3 } from "../structs/util.types";
|
|
5
|
-
import { ObjectReference } from "./ObjectReference";
|
|
6
5
|
import { AbstractBaseProperty } from "./Property";
|
|
7
6
|
import { SaveObject } from "./SaveObject";
|
|
7
|
+
import { ObjectReference } from "./values/ObjectReference";
|
|
8
8
|
export type SpecialAnyProperty = {} | PowerLineSpecialProperty | PlayerSpecialProperty;
|
|
9
9
|
export type PowerLineSpecialProperty = {
|
|
10
10
|
num: number;
|
|
@@ -63,8 +63,8 @@ class DataFields {
|
|
|
63
63
|
target: Property_1.ObjectProperty.ReadValue(reader)
|
|
64
64
|
};
|
|
65
65
|
if (remainingLen - (reader.getBufferPosition() - start) >= 24) {
|
|
66
|
-
property.sourceTranslation =
|
|
67
|
-
property.targetTranslation =
|
|
66
|
+
property.sourceTranslation = util_types_1.vec3.ParseF(reader);
|
|
67
|
+
property.targetTranslation = util_types_1.vec3.ParseF(reader);
|
|
68
68
|
}
|
|
69
69
|
break;
|
|
70
70
|
case '/Game/FactoryGame/Character/Player/BP_PlayerState.BP_PlayerState_C':
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { BinaryReadable
|
|
2
|
-
import {
|
|
1
|
+
import { BinaryReadable } from '../../byte/binary-readable.interface';
|
|
2
|
+
import { ByteWriter } from '../../byte/byte-writer.class';
|
|
3
|
+
import { GUID } from './values/GUID';
|
|
3
4
|
export type GUIDInfo = undefined | GUID;
|
|
4
5
|
export declare namespace GUIDInfo {
|
|
5
6
|
const read: (reader: BinaryReadable) => GUIDInfo;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GUIDInfo = void 0;
|
|
4
|
-
const GUID_1 = require("./
|
|
4
|
+
const GUID_1 = require("./values/GUID");
|
|
5
5
|
var GUIDInfo;
|
|
6
6
|
(function (GUIDInfo) {
|
|
7
7
|
GUIDInfo.read = (reader) => {
|
|
@@ -22,5 +22,5 @@ var GUIDInfo;
|
|
|
22
22
|
GUID_1.GUID.write(writer, guid);
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
|
-
})(GUIDInfo
|
|
25
|
+
})(GUIDInfo || (exports.GUIDInfo = GUIDInfo = {}));
|
|
26
26
|
;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ByteWriter } from "../../..";
|
|
2
1
|
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
|
+
import { ByteWriter } from '../../byte/byte-writer.class';
|
|
3
3
|
import { col4, vec3, vec4 } from "../structs/util.types";
|
|
4
4
|
import { GUIDInfo } from './GUIDInfo';
|
|
5
|
-
import { ObjectReference } from "./ObjectReference";
|
|
5
|
+
import { ObjectReference } from "./values/ObjectReference";
|
|
6
6
|
export type PropertiesMap = {
|
|
7
7
|
[name: string]: AbstractBaseProperty | AbstractBaseProperty[];
|
|
8
8
|
};
|
|
@@ -186,9 +186,13 @@ export type RailroadTrackPositionStructPropertyValue = {
|
|
|
186
186
|
export type InventoryItemStructPropertyValue = {
|
|
187
187
|
unk1: number;
|
|
188
188
|
itemName: string;
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
189
|
+
hasItemState: number;
|
|
190
|
+
itemState?: {
|
|
191
|
+
unk: number;
|
|
192
|
+
pathName: string;
|
|
193
|
+
binarySize: number;
|
|
194
|
+
itemStateRaw: number[];
|
|
195
|
+
};
|
|
192
196
|
};
|
|
193
197
|
export type FICFrameRangeStructPropertyValue = {
|
|
194
198
|
begin: string;
|
|
@@ -198,7 +202,14 @@ export type DynamicStructPropertyValue = {
|
|
|
198
202
|
type: string;
|
|
199
203
|
properties: PropertiesMap;
|
|
200
204
|
};
|
|
201
|
-
export type
|
|
205
|
+
export type ClientIdentityInfo = {
|
|
206
|
+
id: string;
|
|
207
|
+
clientUnk1: number;
|
|
208
|
+
clientUnk2: number;
|
|
209
|
+
clientHashSize: number;
|
|
210
|
+
someClientHash: number[];
|
|
211
|
+
};
|
|
212
|
+
export type GENERIC_STRUCT_PROPERTY_VALUE = BasicMultipleStructPropertyValue | BasicStructPropertyValue | BoxStructPropertyValue | RailroadTrackPositionStructPropertyValue | InventoryItemStructPropertyValue | FICFrameRangeStructPropertyValue | ClientIdentityInfo | DynamicStructPropertyValue | col4 | vec3 | vec4 | string;
|
|
202
213
|
export declare class StructProperty extends AbstractBaseProperty {
|
|
203
214
|
subtype: string;
|
|
204
215
|
guid: number;
|
|
@@ -246,7 +257,6 @@ export type GENERIC_MAP_VALUE_TYPE = number | ObjectReference | boolean | GENERI
|
|
|
246
257
|
export declare class MapProperty extends BasicProperty {
|
|
247
258
|
keyType: string;
|
|
248
259
|
valueType: string;
|
|
249
|
-
structKeyProxy: MAP_STRUCT_KEY_PROXY;
|
|
250
260
|
modeType: number;
|
|
251
261
|
modeUnk1: string | undefined;
|
|
252
262
|
modeUnk2: string;
|
|
@@ -4,7 +4,9 @@ exports.SerializeFINLuaProcessorStateStorage = exports.ReadFINLuaProcessorStateS
|
|
|
4
4
|
const util_types_1 = require("../structs/util.types");
|
|
5
5
|
const DataFields_1 = require("./DataFields");
|
|
6
6
|
const GUIDInfo_1 = require("./GUIDInfo");
|
|
7
|
-
const
|
|
7
|
+
const GUID_1 = require("./values/GUID");
|
|
8
|
+
const ObjectReference_1 = require("./values/ObjectReference");
|
|
9
|
+
const SoftObjectReference_1 = require("./values/SoftObjectReference");
|
|
8
10
|
class AbstractProperty {
|
|
9
11
|
constructor(type, index) {
|
|
10
12
|
this.type = type;
|
|
@@ -496,29 +498,29 @@ class StructProperty extends AbstractBaseProperty {
|
|
|
496
498
|
let value;
|
|
497
499
|
switch (subtype) {
|
|
498
500
|
case 'Color':
|
|
499
|
-
value =
|
|
501
|
+
value = util_types_1.col4.ParseBGRA(reader);
|
|
500
502
|
break;
|
|
501
503
|
case 'LinearColor':
|
|
502
|
-
value =
|
|
504
|
+
value = util_types_1.col4.ParseRGBA(reader);
|
|
503
505
|
break;
|
|
504
506
|
case 'Vector':
|
|
505
507
|
case 'Rotator':
|
|
506
508
|
case 'Vector2D':
|
|
507
|
-
value = (size === 12) ?
|
|
509
|
+
value = (size === 12) ? util_types_1.vec3.ParseF(reader) : util_types_1.vec3.Parse(reader);
|
|
508
510
|
break;
|
|
509
511
|
case 'Quat':
|
|
510
512
|
case 'Vector4':
|
|
511
513
|
case 'Vector4D':
|
|
512
|
-
value = (size === 16) ?
|
|
514
|
+
value = (size === 16) ? util_types_1.vec4.ParseF(reader) : util_types_1.vec4.Parse(reader);
|
|
513
515
|
break;
|
|
514
516
|
case 'Box':
|
|
515
517
|
value = (size === 25) ? {
|
|
516
|
-
min:
|
|
517
|
-
max:
|
|
518
|
+
min: util_types_1.vec3.ParseF(reader),
|
|
519
|
+
max: util_types_1.vec3.ParseF(reader),
|
|
518
520
|
isValid: reader.readByte() >= 1
|
|
519
521
|
} : {
|
|
520
|
-
min:
|
|
521
|
-
max:
|
|
522
|
+
min: util_types_1.vec3.Parse(reader),
|
|
523
|
+
max: util_types_1.vec3.Parse(reader),
|
|
522
524
|
isValid: reader.readByte() >= 1
|
|
523
525
|
};
|
|
524
526
|
break;
|
|
@@ -536,14 +538,32 @@ class StructProperty extends AbstractBaseProperty {
|
|
|
536
538
|
case 'Guid':
|
|
537
539
|
value = reader.readString();
|
|
538
540
|
break;
|
|
541
|
+
case 'ClientIdentityInfo':
|
|
542
|
+
const id = reader.readString();
|
|
543
|
+
const clientUnk1 = reader.readInt32();
|
|
544
|
+
const clientUnk2 = reader.readByte();
|
|
545
|
+
const clientHashSize = reader.readInt32();
|
|
546
|
+
const someClientHash = Array.from(reader.readBytes(clientHashSize));
|
|
547
|
+
value = { id, clientUnk1, clientUnk2, clientHashSize, someClientHash };
|
|
548
|
+
break;
|
|
539
549
|
case 'InventoryItem':
|
|
540
550
|
value = {
|
|
541
551
|
unk1: reader.readInt32(),
|
|
542
552
|
itemName: reader.readString(),
|
|
543
|
-
|
|
544
|
-
unk3: reader.readString(),
|
|
545
|
-
properties: [],
|
|
553
|
+
hasItemState: reader.readInt32(),
|
|
546
554
|
};
|
|
555
|
+
if (value.hasItemState >= 1) {
|
|
556
|
+
const stateUnk = reader.readInt32();
|
|
557
|
+
const statePathName = reader.readString();
|
|
558
|
+
const stateBinarySize = reader.readInt32();
|
|
559
|
+
const itemStateRaw = Array.from(reader.readBytes(stateBinarySize));
|
|
560
|
+
value.itemState = {
|
|
561
|
+
unk: stateUnk,
|
|
562
|
+
pathName: statePathName,
|
|
563
|
+
binarySize: stateBinarySize,
|
|
564
|
+
itemStateRaw: itemStateRaw
|
|
565
|
+
};
|
|
566
|
+
}
|
|
547
567
|
break;
|
|
548
568
|
case 'FluidBox':
|
|
549
569
|
value = {
|
|
@@ -591,28 +611,28 @@ class StructProperty extends AbstractBaseProperty {
|
|
|
591
611
|
switch (subtype) {
|
|
592
612
|
case 'Color':
|
|
593
613
|
value = value;
|
|
594
|
-
|
|
614
|
+
util_types_1.col4.SerializeBGRA(writer, value);
|
|
595
615
|
break;
|
|
596
616
|
case 'LinearColor':
|
|
597
617
|
value = value;
|
|
598
|
-
|
|
618
|
+
util_types_1.col4.SerializeRGBA(writer, value);
|
|
599
619
|
break;
|
|
600
620
|
case 'Vector':
|
|
601
621
|
case 'Rotator':
|
|
602
622
|
case 'Vector2D':
|
|
603
623
|
value = value;
|
|
604
|
-
|
|
624
|
+
util_types_1.vec3.Serialize(writer, value);
|
|
605
625
|
break;
|
|
606
626
|
case 'Quat':
|
|
607
627
|
case 'Vector4':
|
|
608
628
|
case 'Vector4D':
|
|
609
629
|
value = value;
|
|
610
|
-
|
|
630
|
+
util_types_1.vec4.Serialize(writer, value);
|
|
611
631
|
break;
|
|
612
632
|
case 'Box':
|
|
613
633
|
value = value;
|
|
614
|
-
|
|
615
|
-
|
|
634
|
+
util_types_1.vec3.Serialize(writer, value.min);
|
|
635
|
+
util_types_1.vec3.Serialize(writer, value.max);
|
|
616
636
|
writer.writeByte(value.isValid ? 1 : 0);
|
|
617
637
|
break;
|
|
618
638
|
case 'RailroadTrackPosition':
|
|
@@ -630,12 +650,26 @@ class StructProperty extends AbstractBaseProperty {
|
|
|
630
650
|
value = value;
|
|
631
651
|
writer.writeString(value);
|
|
632
652
|
break;
|
|
653
|
+
case 'ClientIdentityInfo':
|
|
654
|
+
value = value;
|
|
655
|
+
writer.writeString(value.id);
|
|
656
|
+
writer.writeInt32(value.clientUnk1);
|
|
657
|
+
writer.writeByte(value.clientUnk2);
|
|
658
|
+
writer.writeInt32(value.clientHashSize);
|
|
659
|
+
writer.writeBytesArray(value.someClientHash);
|
|
660
|
+
break;
|
|
633
661
|
case 'InventoryItem':
|
|
634
662
|
value = value;
|
|
635
663
|
writer.writeInt32(value.unk1);
|
|
636
664
|
writer.writeString(value.itemName);
|
|
637
|
-
writer.
|
|
638
|
-
|
|
665
|
+
writer.writeInt32(value.hasItemState);
|
|
666
|
+
if (value.hasItemState >= 1) {
|
|
667
|
+
writer.writeInt32(value.itemState.unk);
|
|
668
|
+
writer.writeString(value.itemState.pathName);
|
|
669
|
+
writer.writeInt32(value.itemState.binarySize);
|
|
670
|
+
writer.writeBytesArray(value.itemState.itemStateRaw);
|
|
671
|
+
}
|
|
672
|
+
break;
|
|
639
673
|
break;
|
|
640
674
|
case 'FluidBox':
|
|
641
675
|
value = value;
|
|
@@ -678,7 +712,7 @@ class ArrayProperty extends BasicProperty {
|
|
|
678
712
|
}
|
|
679
713
|
static Parse(reader, ueType, index, propertyName) {
|
|
680
714
|
const subtype = reader.readString();
|
|
681
|
-
reader.skipBytes();
|
|
715
|
+
reader.skipBytes(1);
|
|
682
716
|
let property;
|
|
683
717
|
const elementCount = reader.readInt32();
|
|
684
718
|
switch (subtype) {
|
|
@@ -713,6 +747,9 @@ class ArrayProperty extends BasicProperty {
|
|
|
713
747
|
case "ObjectProperty":
|
|
714
748
|
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => ObjectProperty.ReadValue(reader)), ueType, index);
|
|
715
749
|
break;
|
|
750
|
+
case "SoftObjectProperty":
|
|
751
|
+
property = new ArrayProperty(subtype, new Array(elementCount).fill(0).map(() => SoftObjectReference_1.SoftObjectReference.read(reader)), ueType, index);
|
|
752
|
+
break;
|
|
716
753
|
case "StructProperty":
|
|
717
754
|
const name = reader.readString();
|
|
718
755
|
const type = reader.readString();
|
|
@@ -794,6 +831,9 @@ class ArrayProperty extends BasicProperty {
|
|
|
794
831
|
case "ObjectProperty":
|
|
795
832
|
property.values.forEach(v => ObjectProperty.SerializeValue(writer, v));
|
|
796
833
|
break;
|
|
834
|
+
case "SoftObjectProperty":
|
|
835
|
+
property.values.forEach(v => SoftObjectReference_1.SoftObjectReference.write(writer, v));
|
|
836
|
+
break;
|
|
797
837
|
case "StructProperty":
|
|
798
838
|
writer.writeString(propertyName);
|
|
799
839
|
writer.writeString(property.subtype);
|
|
@@ -841,6 +881,14 @@ class SetProperty extends BasicProperty {
|
|
|
841
881
|
case "NameProperty":
|
|
842
882
|
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(() => StrProperty.ReadValue(reader)), ueType, index);
|
|
843
883
|
break;
|
|
884
|
+
case "StructProperty":
|
|
885
|
+
if (propertyName === 'mDestroyedPickups') {
|
|
886
|
+
property = new SetProperty(subtype, new Array(elementCount).fill(0).map(() => GUID_1.GUID.read(reader)), ueType, index);
|
|
887
|
+
}
|
|
888
|
+
else {
|
|
889
|
+
throw new Error(`Not Implemented SetProperty of StructProperty for property ${propertyName}.`);
|
|
890
|
+
}
|
|
891
|
+
break;
|
|
844
892
|
default:
|
|
845
893
|
throw new Error(`Not Implemented SetProperty of ${subtype}.`);
|
|
846
894
|
}
|
|
@@ -870,7 +918,16 @@ class SetProperty extends BasicProperty {
|
|
|
870
918
|
property.values.forEach(v => StrProperty.SerializeValue(writer, v));
|
|
871
919
|
break;
|
|
872
920
|
case "StructProperty":
|
|
873
|
-
property.
|
|
921
|
+
if (property.name === 'mRemovalLocations') {
|
|
922
|
+
console.warn('serializing mRemovalLocations, this is still under investigation.');
|
|
923
|
+
property.values.forEach(v => util_types_1.vec3.SerializeF(writer, v));
|
|
924
|
+
}
|
|
925
|
+
else if (property.name === 'mDestroyedPickups') {
|
|
926
|
+
property.values.forEach(v => GUID_1.GUID.write(writer, v));
|
|
927
|
+
}
|
|
928
|
+
else {
|
|
929
|
+
throw new Error(`Not Implemented serializing SetProperty of StructProperty for property ${property.name}.`);
|
|
930
|
+
}
|
|
874
931
|
break;
|
|
875
932
|
default:
|
|
876
933
|
throw new Error(`Not Implemented SetProperty of ${property.subtype}.`);
|
|
@@ -883,7 +940,6 @@ class MapProperty extends BasicProperty {
|
|
|
883
940
|
super('MapProperty', ueType, undefined, index);
|
|
884
941
|
this.keyType = keyType;
|
|
885
942
|
this.valueType = valueType;
|
|
886
|
-
this.structKeyProxy = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
887
943
|
this.modeType = 0;
|
|
888
944
|
this.modeUnk2 = '';
|
|
889
945
|
this.modeUnk3 = '';
|
|
@@ -901,8 +957,7 @@ class MapProperty extends BasicProperty {
|
|
|
901
957
|
switch (property.keyType) {
|
|
902
958
|
case 'StructProperty':
|
|
903
959
|
if (propertyName === 'mSaveData' || propertyName === 'mUnresolvedSaveData') {
|
|
904
|
-
key =
|
|
905
|
-
property.structKeyProxy = Array.from(reader.readBytes(12));
|
|
960
|
+
key = Array.from(reader.readBytes(12));
|
|
906
961
|
}
|
|
907
962
|
else {
|
|
908
963
|
key = (0, exports.ParseDynamicStructData)(reader, 0, property.keyType);
|
|
@@ -946,6 +1001,9 @@ class MapProperty extends BasicProperty {
|
|
|
946
1001
|
case 'Int32Property':
|
|
947
1002
|
value = Int32Property.ReadValue(reader);
|
|
948
1003
|
break;
|
|
1004
|
+
case 'Int64Property':
|
|
1005
|
+
value = Int64Property.ReadValue(reader);
|
|
1006
|
+
break;
|
|
949
1007
|
case 'ByteProperty':
|
|
950
1008
|
value = ByteProperty.ReadValue(reader);
|
|
951
1009
|
break;
|
|
@@ -969,7 +1027,7 @@ class MapProperty extends BasicProperty {
|
|
|
969
1027
|
switch (property.keyType) {
|
|
970
1028
|
case 'StructProperty':
|
|
971
1029
|
if (property.name === 'mSaveData' || property.name === 'mUnresolvedSaveData') {
|
|
972
|
-
writer.writeBytesArray(
|
|
1030
|
+
writer.writeBytesArray(entry[0]);
|
|
973
1031
|
}
|
|
974
1032
|
else {
|
|
975
1033
|
(0, exports.SerializeDynamicStructData)(writer, 0, entry[0]);
|
|
@@ -1013,6 +1071,9 @@ class MapProperty extends BasicProperty {
|
|
|
1013
1071
|
case 'Int32Property':
|
|
1014
1072
|
Int32Property.SerializeValue(writer, entry[1]);
|
|
1015
1073
|
break;
|
|
1074
|
+
case 'Int64Property':
|
|
1075
|
+
Int64Property.SerializeValue(writer, entry[1]);
|
|
1076
|
+
break;
|
|
1016
1077
|
case 'ByteProperty':
|
|
1017
1078
|
ByteProperty.SerializeValue(writer, entry[1]);
|
|
1018
1079
|
break;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
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
|
-
import { ObjectReference } from "./ObjectReference";
|
|
5
4
|
import { SaveObject, SaveObjectHeader } from "./SaveObject";
|
|
5
|
+
import { ObjectReference } from "./values/ObjectReference";
|
|
6
6
|
export declare const isSaveEntity: (obj: any) => obj is SaveEntity;
|
|
7
7
|
export interface SaveEntityHeader extends SaveObjectHeader {
|
|
8
8
|
needTransform: boolean;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SaveEntity = exports.isSaveEntity = void 0;
|
|
4
4
|
const util_types_1 = require("../structs/util.types");
|
|
5
|
-
const ObjectReference_1 = require("./ObjectReference");
|
|
6
5
|
const SaveObject_1 = require("./SaveObject");
|
|
6
|
+
const ObjectReference_1 = require("./values/ObjectReference");
|
|
7
7
|
const isSaveEntity = (obj) => {
|
|
8
8
|
return obj.type === 'SaveEntity';
|
|
9
9
|
};
|
|
@@ -30,7 +30,7 @@ class SaveEntity extends SaveObject_1.SaveObject {
|
|
|
30
30
|
static ParseHeader(reader, obj) {
|
|
31
31
|
SaveObject_1.SaveObject.ParseHeader(reader, obj);
|
|
32
32
|
obj.needTransform = reader.readInt32() == 1;
|
|
33
|
-
obj.transform =
|
|
33
|
+
obj.transform = util_types_1.Transform.Parse(reader);
|
|
34
34
|
obj.wasPlacedInLevel = reader.readInt32() == 1;
|
|
35
35
|
}
|
|
36
36
|
static ParseData(entity, length, reader, buildVersion, typePath) {
|
|
@@ -48,7 +48,7 @@ class SaveEntity extends SaveObject_1.SaveObject {
|
|
|
48
48
|
static SerializeHeader(writer, entity) {
|
|
49
49
|
SaveObject_1.SaveObject.SerializeHeader(writer, entity);
|
|
50
50
|
writer.writeInt32(entity.needTransform ? 1 : 0);
|
|
51
|
-
|
|
51
|
+
util_types_1.Transform.Serialize(writer, entity.transform);
|
|
52
52
|
writer.writeInt32(entity.wasPlacedInLevel ? 1 : 0);
|
|
53
53
|
}
|
|
54
54
|
static SerializeData(writer, entity, buildVersion) {
|
|
@@ -62,5 +62,5 @@ class SaveEntity extends SaveObject_1.SaveObject {
|
|
|
62
62
|
SaveObject_1.SaveObject.SerializeData(writer, entity, buildVersion);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
SaveEntity.TypeID = 1;
|
|
66
65
|
exports.SaveEntity = SaveEntity;
|
|
66
|
+
SaveEntity.TypeID = 1;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BinaryReadable } from '../../../byte/binary-readable.interface';
|
|
2
|
+
import { ByteWriter } from '../../../byte/byte-writer.class';
|
|
3
|
+
export type GUID = [number, number, number, number];
|
|
4
|
+
export declare namespace GUID {
|
|
5
|
+
const read: (reader: BinaryReadable) => GUID;
|
|
6
|
+
const write: (writer: ByteWriter, guid: GUID) => void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GUID = void 0;
|
|
4
|
+
var GUID;
|
|
5
|
+
(function (GUID) {
|
|
6
|
+
GUID.read = (reader) => {
|
|
7
|
+
return [
|
|
8
|
+
reader.readUint32(),
|
|
9
|
+
reader.readUint32(),
|
|
10
|
+
reader.readUint32(),
|
|
11
|
+
reader.readUint32(),
|
|
12
|
+
];
|
|
13
|
+
};
|
|
14
|
+
GUID.write = (writer, guid) => {
|
|
15
|
+
writer.writeUint32(guid[0]);
|
|
16
|
+
writer.writeUint32(guid[1]);
|
|
17
|
+
writer.writeUint32(guid[2]);
|
|
18
|
+
writer.writeUint32(guid[3]);
|
|
19
|
+
};
|
|
20
|
+
})(GUID || (exports.GUID = GUID = {}));
|
|
21
|
+
;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BinaryReadable } from "../../../byte/binary-readable.interface";
|
|
2
|
+
import { ByteWriter } from "../../../byte/byte-writer.class";
|
|
3
|
+
export type ObjectReference = {
|
|
4
|
+
levelName: string;
|
|
5
|
+
pathName: string;
|
|
6
|
+
};
|
|
7
|
+
export declare namespace ObjectReference {
|
|
8
|
+
const read: (reader: BinaryReadable) => ObjectReference;
|
|
9
|
+
const write: (writer: ByteWriter, ref: ObjectReference) => void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObjectReference = void 0;
|
|
4
|
+
var ObjectReference;
|
|
5
|
+
(function (ObjectReference) {
|
|
6
|
+
ObjectReference.read = (reader) => {
|
|
7
|
+
return {
|
|
8
|
+
levelName: reader.readString(),
|
|
9
|
+
pathName: reader.readString()
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
ObjectReference.write = (writer, ref) => {
|
|
13
|
+
writer.writeString(ref.levelName);
|
|
14
|
+
writer.writeString(ref.pathName);
|
|
15
|
+
};
|
|
16
|
+
})(ObjectReference || (exports.ObjectReference = ObjectReference = {}));
|
|
17
|
+
;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BinaryReadable } from "../../../byte/binary-readable.interface";
|
|
2
|
+
import { ByteWriter } from "../../../byte/byte-writer.class";
|
|
3
|
+
export type SoftObjectReference = {
|
|
4
|
+
instanceName: string;
|
|
5
|
+
pathName: string;
|
|
6
|
+
unk: number;
|
|
7
|
+
};
|
|
8
|
+
export declare namespace SoftObjectReference {
|
|
9
|
+
const read: (reader: BinaryReadable) => SoftObjectReference;
|
|
10
|
+
const write: (writer: ByteWriter, ref: SoftObjectReference) => void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SoftObjectReference = void 0;
|
|
4
|
+
var SoftObjectReference;
|
|
5
|
+
(function (SoftObjectReference) {
|
|
6
|
+
SoftObjectReference.read = (reader) => {
|
|
7
|
+
return {
|
|
8
|
+
pathName: reader.readString(),
|
|
9
|
+
instanceName: reader.readString(),
|
|
10
|
+
unk: reader.readInt32()
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
SoftObjectReference.write = (writer, ref) => {
|
|
14
|
+
writer.writeString(ref.pathName);
|
|
15
|
+
writer.writeString(ref.instanceName);
|
|
16
|
+
writer.writeInt32(ref.unk);
|
|
17
|
+
};
|
|
18
|
+
})(SoftObjectReference || (exports.SoftObjectReference = SoftObjectReference = {}));
|
|
19
|
+
;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BinaryReadable } from "../../byte/binary-readable.interface";
|
|
2
2
|
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
|
-
import { ObjectReference } from "../objects/ObjectReference";
|
|
4
3
|
import { SaveComponent } from "../objects/SaveComponent";
|
|
5
4
|
import { SaveEntity } from "../objects/SaveEntity";
|
|
6
5
|
import { SaveObject } from "../objects/SaveObject";
|
|
6
|
+
import { ObjectReference } from "../objects/values/ObjectReference";
|
|
7
7
|
import { SaveReader } from "./save-reader";
|
|
8
8
|
export declare class Level {
|
|
9
9
|
name: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Level = void 0;
|
|
4
|
-
const ObjectReference_1 = require("../objects/ObjectReference");
|
|
5
4
|
const SaveComponent_1 = require("../objects/SaveComponent");
|
|
6
5
|
const SaveEntity_1 = require("../objects/SaveEntity");
|
|
6
|
+
const ObjectReference_1 = require("../objects/values/ObjectReference");
|
|
7
7
|
class Level {
|
|
8
8
|
constructor(name) {
|
|
9
9
|
this.name = name;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChunkCompressionInfo } from "../../file.types";
|
|
2
|
-
import { ObjectReference } from "../objects/ObjectReference";
|
|
2
|
+
import { ObjectReference } from "../objects/values/ObjectReference";
|
|
3
3
|
import { Level } from "./level.class";
|
|
4
4
|
import { ByteArray4, Grids } from "./save-reader";
|
|
5
5
|
import { SatisfactorySaveHeader } from "./save.types";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ByteReader } from "../../byte/byte-reader.class";
|
|
2
2
|
import { ChunkCompressionInfo } from "../../file.types";
|
|
3
|
-
import { ObjectReference } from "../objects/ObjectReference";
|
|
3
|
+
import { ObjectReference } from "../objects/values/ObjectReference";
|
|
4
4
|
import { Level } from "./level.class";
|
|
5
5
|
import { RoughSaveVersion, SatisfactorySaveHeader } from "./save.types";
|
|
6
6
|
export type ReadMode = 'stream' | 'whole';
|
|
@@ -41,14 +41,14 @@ class SaveReader extends byte_reader_class_1.ByteReader {
|
|
|
41
41
|
const gridHash = this.readUint32();
|
|
42
42
|
grids[parentName] = { checksum: parentChecksumIdOrSmth, children: {}, cellSize, gridHash };
|
|
43
43
|
for (let i = 0; i < childrenCount; i++) {
|
|
44
|
-
const
|
|
44
|
+
const cellBinSizeMaybe = this.readUint32();
|
|
45
45
|
const levelInstanceName = this.readString();
|
|
46
|
-
grids[parentName].children[levelInstanceName] =
|
|
46
|
+
grids[parentName].children[levelInstanceName] = cellBinSizeMaybe;
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
|
-
readGrid(
|
|
49
|
+
readGrid(1289);
|
|
50
50
|
readGrid(0);
|
|
51
|
-
readGrid(
|
|
51
|
+
readGrid(758);
|
|
52
52
|
readGrid(0);
|
|
53
53
|
readGrid(0);
|
|
54
54
|
const unk5 = this.readInt32();
|
|
@@ -189,10 +189,14 @@ class SaveReader extends byte_reader_class_1.ByteReader {
|
|
|
189
189
|
return levels;
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
+
exports.SaveReader = SaveReader;
|
|
192
193
|
SaveReader.EPOCH_TICKS = 621355968000000000n;
|
|
193
194
|
SaveReader.getRoughSaveVersion = (saveVersion, headerTypeVersion) => {
|
|
194
|
-
if (
|
|
195
|
-
return '
|
|
195
|
+
if (saveVersion >= 46) {
|
|
196
|
+
return 'U1.0+';
|
|
197
|
+
}
|
|
198
|
+
else if (headerTypeVersion >= 13) {
|
|
199
|
+
return 'U8';
|
|
196
200
|
}
|
|
197
201
|
else if (saveVersion >= 29) {
|
|
198
202
|
return 'U6/U7';
|
|
@@ -201,4 +205,3 @@ SaveReader.getRoughSaveVersion = (saveVersion, headerTypeVersion) => {
|
|
|
201
205
|
return '<U6';
|
|
202
206
|
}
|
|
203
207
|
};
|
|
204
|
-
exports.SaveReader = SaveReader;
|
|
@@ -64,7 +64,6 @@ class SaveWriter extends byte_writer_class_1.ByteWriter {
|
|
|
64
64
|
}
|
|
65
65
|
level_class_1.Level.WriteLevel(writer, level, buildVersion);
|
|
66
66
|
}
|
|
67
|
-
level_class_1.Level.SerializeCollectablesList(writer, save.trailingCollectedObjects ?? []);
|
|
68
67
|
}
|
|
69
68
|
static GenerateCompressedChunksFromData(bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, alignment = alignment_enum_1.Alignment.LITTLE_ENDIAN) {
|
|
70
69
|
const errors = [];
|
|
@@ -122,6 +121,7 @@ class SaveWriter extends byte_writer_class_1.ByteWriter {
|
|
|
122
121
|
return chunkSummary;
|
|
123
122
|
}
|
|
124
123
|
}
|
|
124
|
+
exports.SaveWriter = SaveWriter;
|
|
125
125
|
SaveWriter.WriteSaveBodyHash = (writer, hash) => {
|
|
126
126
|
writer.writeInt32(0);
|
|
127
127
|
writer.writeInt32(6);
|
|
@@ -144,4 +144,3 @@ SaveWriter.WriteGrids = (writer, grids) => {
|
|
|
144
144
|
}
|
|
145
145
|
writer.writeInt32(0);
|
|
146
146
|
};
|
|
147
|
-
exports.SaveWriter = SaveWriter;
|
|
@@ -28,7 +28,7 @@ export interface SatisfactorySaveHeader {
|
|
|
28
28
|
consistencyHashBytes?: MD5Hash;
|
|
29
29
|
creativeModeEnabled?: boolean;
|
|
30
30
|
}
|
|
31
|
-
export type RoughSaveVersion = '<U6' | 'U6/U7' | 'U8+';
|
|
31
|
+
export type RoughSaveVersion = '<U6' | 'U6/U7' | 'U8' | 'U1.0+';
|
|
32
32
|
export type ResourceNodeEntry = {
|
|
33
33
|
purity: string;
|
|
34
34
|
pathName: string;
|