@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.
Files changed (52) hide show
  1. package/LICENCE.md +20 -20
  2. package/README.md +112 -112
  3. package/build/index.d.ts +5 -1
  4. package/build/index.js +7 -7
  5. package/build/parser/byte/binary-operable.interface.d.ts +6 -0
  6. package/build/parser/byte/binary-operable.interface.js +12 -0
  7. package/build/parser/byte/binary-readable.interface.d.ts +22 -0
  8. package/build/parser/byte/binary-readable.interface.js +12 -0
  9. package/build/parser/byte/byte-reader.class.d.ts +11 -9
  10. package/build/parser/byte/byte-reader.class.js +23 -15
  11. package/build/parser/error/parser.error.d.ts +6 -0
  12. package/build/parser/error/parser.error.js +13 -1
  13. package/build/parser/parser.d.ts +9 -0
  14. package/build/parser/parser.js +100 -2
  15. package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts +3 -2
  16. package/build/parser/satisfactory/blueprint/blueprint-writer.js +1 -1
  17. package/build/parser/satisfactory/objects/DataFields.d.ts +34 -6
  18. package/build/parser/satisfactory/objects/DataFields.js +86 -3
  19. package/build/parser/satisfactory/objects/ObjectReference.d.ts +2 -2
  20. package/build/parser/satisfactory/objects/Property.d.ts +72 -72
  21. package/build/parser/satisfactory/objects/Property.js +24 -23
  22. package/build/parser/satisfactory/objects/SaveComponent.d.ts +8 -5
  23. package/build/parser/satisfactory/objects/SaveComponent.js +2 -2
  24. package/build/parser/satisfactory/objects/SaveEntity.d.ts +9 -4
  25. package/build/parser/satisfactory/objects/SaveEntity.js +2 -2
  26. package/build/parser/satisfactory/objects/SaveObject.d.ts +9 -4
  27. package/build/parser/satisfactory/objects/SaveObject.js +3 -3
  28. package/build/parser/satisfactory/save/asynchronous-level.class.d.ts +9 -0
  29. package/build/parser/satisfactory/save/asynchronous-level.class.js +76 -0
  30. package/build/parser/satisfactory/save/level.class.d.ts +5 -5
  31. package/build/parser/satisfactory/save/level.class.js +7 -6
  32. package/build/parser/satisfactory/save/save-reader.d.ts +4 -13
  33. package/build/parser/satisfactory/save/save-reader.js +17 -72
  34. package/build/parser/satisfactory/structs/util.types.d.ts +7 -7
  35. package/build/parser/satisfactory/structs/util.types.js +10 -10
  36. package/build/parser/stream/byte-stream-reader.class.d.ts +57 -0
  37. package/build/parser/stream/byte-stream-reader.class.js +251 -0
  38. package/build/parser/stream/json-stream-state-writer.d.ts +12 -0
  39. package/build/parser/stream/json-stream-state-writer.js +28 -0
  40. package/build/parser/stream/json-stream-writable.d.ts +20 -0
  41. package/build/parser/stream/json-stream-writable.js +93 -0
  42. package/build/parser/stream/json-stream-writer.d.ts +22 -0
  43. package/build/parser/stream/json-stream-writer.js +137 -0
  44. package/build/parser/stream/save-stream-json-stringifier.d.ts +6 -0
  45. package/build/parser/stream/save-stream-json-stringifier.js +43 -0
  46. package/build/parser/stream/save-stream-reader.class.d.ts +15 -0
  47. package/build/parser/stream/save-stream-reader.class.js +131 -0
  48. package/build/parser/stream/save-stream-writer.class.d.ts +22 -0
  49. package/build/parser/stream/save-stream-writer.class.js +115 -0
  50. package/build/parser/stream/stream-level.class.d.ts +12 -0
  51. package/build/parser/stream/stream-level.class.js +113 -0
  52. 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.readLong().toString();
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.readFloat();
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.readFloat(),
551
- forward: reader.readFloat()
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.readFloat()
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.readLong().toString();
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.readLong().toString(),
591
- end: reader.readLong().toString(),
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(e => FloatProperty.ReadValue(reader)), ueType, index);
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(e => BoolProperty.ReadValue(reader)), ueType, index);
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(e => Int32Property.ReadValue(reader)), ueType, index);
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(e => Int64Property.ReadValue(reader)), ueType, index);
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(e => DoubleProperty.ReadValue(reader)), ueType, index);
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(e => ByteProperty.ReadValue(reader)), ueType, index);
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(e => StrProperty.ReadValue(reader)), ueType, index);
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(e => EnumProperty.ReadValue(reader)), ueType, index);
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(e => TextProperty.ParseValue(reader)), ueType, index);
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(e => ObjectProperty.ReadValue(reader)), ueType, index);
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(e => {
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(e => Int32Property.ReadValue(reader)), ueType, index);
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(e => ObjectProperty.ReadValue(reader)), ueType, index);
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(e => StrProperty.ReadValue(reader)), ueType, index);
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(e => (0, util_types_1.ParseVec3)(reader)), ueType, index);
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 { ByteReader } from "../../byte/byte-reader.class";
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 declare class SaveComponent extends SaveObject {
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: ByteReader, obj: SaveComponent): void;
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: ByteReader, buildVersion: number): void;
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 { ByteReader } from "../../byte/byte-reader.class";
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: ByteReader, obj: SaveEntity): void;
22
- static ParseData(entity: SaveEntity, length: number, reader: ByteReader, buildVersion: number): void;
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 { ByteReader } from "../../byte/byte-reader.class";
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 declare abstract class SaveObject {
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: ByteReader, obj: SaveObject): void;
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: ByteReader, buildVersion: number): void;
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 { ByteReader } from "../../byte/byte-reader.class";
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: ByteReader, objectsList: SaveObject[], onProgressCallback: (progress: number, msg?: string) => void): void;
17
- static ReadObjectContents(reader: ByteReader, objectsList: SaveObject[], buildVersion: number, onProgressCallback: (progress: number, msg?: string) => void): void;
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: SaveReader): ObjectReference[];
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.Conveyor = exports.SaveReader = exports.projectionFilterApplies = void 0;
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: 48
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
- SaveReader.EPOCH_TICKS = 621355968000000000n;
173
- exports.SaveReader = SaveReader;
174
- class Conveyor {
175
- static getConveyorBeltRegex() {
176
- return /\/Game\/FactoryGame\/Buildable\/Factory\/(ConveyorBeltMk[0-9]+)\/Build_(\1)\.Build_(\1)_C/g;
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
- return false;
182
+ await writer.endLevels();
183
+ return this.levels;
240
184
  }
241
185
  }
242
- exports.Conveyor = Conveyor;
186
+ SaveReader.EPOCH_TICKS = 621355968000000000n;
187
+ exports.SaveReader = SaveReader;
243
188
  });
@@ -1,4 +1,4 @@
1
- import { ByteReader } from "../../byte/byte-reader.class";
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: ByteReader) => col4;
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: ByteReader) => col4;
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: ByteReader) => vec4;
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: ByteReader) => vec3;
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: ByteReader) => vec2;
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: ByteReader) => Transform;
39
+ export declare const ParseTransform: (reader: BinaryReadable) => Transform;
40
40
  export declare const SerializeTransform: (writer: ByteWriter, transform: Transform) => void;