@etothepii/satisfactory-file-parser 0.5.1 → 1.0.2
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 +69 -41
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +1 -0
- package/build/index.js.map +1 -0
- package/build/parser/byte/alignment.enum.d.ts +1 -0
- package/build/parser/byte/alignment.enum.d.ts.map +1 -0
- package/build/parser/byte/alignment.enum.js +1 -0
- package/build/parser/byte/alignment.enum.js.map +1 -0
- package/build/parser/byte/binary-operable.interface.d.ts +1 -0
- package/build/parser/byte/binary-operable.interface.d.ts.map +1 -0
- package/build/parser/byte/binary-operable.interface.js +1 -0
- package/build/parser/byte/binary-operable.interface.js.map +1 -0
- package/build/parser/byte/binary-readable.interface.d.ts +1 -0
- package/build/parser/byte/binary-readable.interface.d.ts.map +1 -0
- package/build/parser/byte/binary-readable.interface.js +1 -0
- package/build/parser/byte/binary-readable.interface.js.map +1 -0
- package/build/parser/byte/binary-writable.interface.d.ts +1 -0
- package/build/parser/byte/binary-writable.interface.d.ts.map +1 -0
- package/build/parser/byte/binary-writable.interface.js +1 -0
- package/build/parser/byte/binary-writable.interface.js.map +1 -0
- package/build/parser/byte/byte-reader.class.d.ts +1 -0
- package/build/parser/byte/byte-reader.class.d.ts.map +1 -0
- package/build/parser/byte/byte-reader.class.js +4 -4
- package/build/parser/byte/byte-reader.class.js.map +1 -0
- package/build/parser/byte/byte-writer.class.d.ts +1 -0
- package/build/parser/byte/byte-writer.class.d.ts.map +1 -0
- package/build/parser/byte/byte-writer.class.js +1 -0
- package/build/parser/byte/byte-writer.class.js.map +1 -0
- package/build/parser/error/parser.error.d.ts +1 -0
- package/build/parser/error/parser.error.d.ts.map +1 -0
- package/build/parser/error/parser.error.js +1 -0
- package/build/parser/error/parser.error.js.map +1 -0
- package/build/parser/file.types.d.ts +1 -0
- package/build/parser/file.types.d.ts.map +1 -0
- package/build/parser/file.types.js +1 -0
- package/build/parser/file.types.js.map +1 -0
- package/build/parser/parser.d.ts +18 -3
- package/build/parser/parser.d.ts.map +1 -0
- package/build/parser/parser.js +40 -6
- package/build/parser/parser.js.map +1 -0
- package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts +1 -0
- package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts.map +1 -0
- package/build/parser/satisfactory/blueprint/blueprint-reader.js +2 -1
- package/build/parser/satisfactory/blueprint/blueprint-reader.js.map +1 -0
- package/build/parser/satisfactory/blueprint/blueprint-writer.d.ts +6 -1
- package/build/parser/satisfactory/blueprint/blueprint-writer.d.ts.map +1 -0
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +7 -4
- package/build/parser/satisfactory/blueprint/blueprint-writer.js.map +1 -0
- package/build/parser/satisfactory/blueprint/blueprint.types.d.ts +1 -0
- package/build/parser/satisfactory/blueprint/blueprint.types.d.ts.map +1 -0
- package/build/parser/satisfactory/blueprint/blueprint.types.js +1 -0
- package/build/parser/satisfactory/blueprint/blueprint.types.js.map +1 -0
- package/build/parser/satisfactory/edit/edit-constants.d.ts +1 -0
- package/build/parser/satisfactory/edit/edit-constants.d.ts.map +1 -0
- package/build/parser/satisfactory/edit/edit-constants.js +1 -0
- package/build/parser/satisfactory/edit/edit-constants.js.map +1 -0
- package/build/parser/satisfactory/save/level.class.d.ts +13 -8
- package/build/parser/satisfactory/save/level.class.d.ts.map +1 -0
- package/build/parser/satisfactory/save/level.class.js +104 -48
- package/build/parser/satisfactory/save/level.class.js.map +1 -0
- package/build/parser/satisfactory/save/object-references-list.d.ts +8 -0
- package/build/parser/satisfactory/save/object-references-list.d.ts.map +1 -0
- package/build/parser/satisfactory/save/object-references-list.js +22 -0
- package/build/parser/satisfactory/save/object-references-list.js.map +1 -0
- package/build/parser/satisfactory/save/satisfactory-save.d.ts +4 -3
- package/build/parser/satisfactory/save/satisfactory-save.d.ts.map +1 -0
- package/build/parser/satisfactory/save/satisfactory-save.js +2 -1
- package/build/parser/satisfactory/save/satisfactory-save.js.map +1 -0
- package/build/parser/satisfactory/save/save-reader.d.ts +11 -3
- package/build/parser/satisfactory/save/save-reader.d.ts.map +1 -0
- package/build/parser/satisfactory/save/save-reader.js +59 -21
- package/build/parser/satisfactory/save/save-reader.js.map +1 -0
- package/build/parser/satisfactory/save/save-writer.d.ts +3 -2
- package/build/parser/satisfactory/save/save-writer.d.ts.map +1 -0
- package/build/parser/satisfactory/save/save-writer.js +12 -12
- package/build/parser/satisfactory/save/save-writer.js.map +1 -0
- package/build/parser/satisfactory/save/save.types.d.ts +1 -0
- package/build/parser/satisfactory/save/save.types.d.ts.map +1 -0
- package/build/parser/satisfactory/save/save.types.js +1 -0
- package/build/parser/satisfactory/save/save.types.js.map +1 -0
- package/build/parser/satisfactory/types/objects/SaveComponent.d.ts +1 -0
- package/build/parser/satisfactory/types/objects/SaveComponent.d.ts.map +1 -0
- package/build/parser/satisfactory/types/objects/SaveComponent.js +1 -0
- package/build/parser/satisfactory/types/objects/SaveComponent.js.map +1 -0
- package/build/parser/satisfactory/types/objects/SaveEntity.d.ts +1 -0
- package/build/parser/satisfactory/types/objects/SaveEntity.d.ts.map +1 -0
- package/build/parser/satisfactory/types/objects/SaveEntity.js +1 -0
- package/build/parser/satisfactory/types/objects/SaveEntity.js.map +1 -0
- package/build/parser/satisfactory/types/objects/SaveObject.d.ts +1 -0
- package/build/parser/satisfactory/types/objects/SaveObject.d.ts.map +1 -0
- package/build/parser/satisfactory/types/objects/SaveObject.js +1 -0
- package/build/parser/satisfactory/types/objects/SaveObject.js.map +1 -0
- package/build/parser/satisfactory/types/property/PropertiesList.d.ts +1 -0
- package/build/parser/satisfactory/types/property/PropertiesList.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/PropertiesList.js +1 -0
- package/build/parser/satisfactory/types/property/PropertiesList.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/ArrayProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/ArrayProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/ArrayProperty.js +3 -2
- package/build/parser/satisfactory/types/property/generic/ArrayProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/BasicProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/BasicProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/BasicProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/BasicProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/BoolProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/BoolProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/BoolProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/BoolProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/ByteProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/ByteProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/ByteProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/ByteProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/DoubleProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/DoubleProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/DoubleProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/DoubleProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/EnumProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/EnumProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/EnumProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/EnumProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/FloatProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/FloatProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/FloatProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/FloatProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Int32Property.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/Int32Property.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Int32Property.js +1 -0
- package/build/parser/satisfactory/types/property/generic/Int32Property.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Int64Property.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/Int64Property.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Int64Property.js +1 -0
- package/build/parser/satisfactory/types/property/generic/Int64Property.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Int8Property.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/Int8Property.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Int8Property.js +1 -0
- package/build/parser/satisfactory/types/property/generic/Int8Property.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/MapProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/MapProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/MapProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/MapProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/ObjectProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/ObjectProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/ObjectProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/ObjectProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/SetProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/SetProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/SetProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/SetProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/StrProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/StrProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/StrProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/StrProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/StructProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/StructProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/StructProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/StructProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/TextProperty.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/TextProperty.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/TextProperty.js +1 -0
- package/build/parser/satisfactory/types/property/generic/TextProperty.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint32Property.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint32Property.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint32Property.js +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint32Property.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint64Property.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint64Property.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint64Property.js +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint64Property.js.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint8Property.d.ts +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint8Property.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint8Property.js +1 -0
- package/build/parser/satisfactory/types/property/generic/Uint8Property.js.map +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialAnyProperties.d.ts +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialAnyProperties.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialAnyProperties.js +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialAnyProperties.js.map +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialProperties.d.ts +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialProperties.d.ts.map +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialProperties.js +1 -0
- package/build/parser/satisfactory/types/property/special/SpecialProperties.js.map +1 -0
- package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.js +1 -0
- package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.js.map +1 -0
- package/build/parser/satisfactory/types/structs/GUID.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/GUID.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/GUID.js +1 -0
- package/build/parser/satisfactory/types/structs/GUID.js.map +1 -0
- package/build/parser/satisfactory/types/structs/GUIDInfo.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/GUIDInfo.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/GUIDInfo.js +1 -0
- package/build/parser/satisfactory/types/structs/GUIDInfo.js.map +1 -0
- package/build/parser/satisfactory/types/structs/MD5Hash.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/MD5Hash.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/MD5Hash.js +1 -0
- package/build/parser/satisfactory/types/structs/MD5Hash.js.map +1 -0
- package/build/parser/satisfactory/types/structs/ObjectReference.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/ObjectReference.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/ObjectReference.js +1 -0
- package/build/parser/satisfactory/types/structs/ObjectReference.js.map +1 -0
- package/build/parser/satisfactory/types/structs/SoftObjectReference.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/SoftObjectReference.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/SoftObjectReference.js +1 -0
- package/build/parser/satisfactory/types/structs/SoftObjectReference.js.map +1 -0
- package/build/parser/satisfactory/types/structs/Transform.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/Transform.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/Transform.js +1 -0
- package/build/parser/satisfactory/types/structs/Transform.js.map +1 -0
- package/build/parser/satisfactory/types/structs/col4.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/col4.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/col4.js +1 -0
- package/build/parser/satisfactory/types/structs/col4.js.map +1 -0
- package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.js +1 -0
- package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.js.map +1 -0
- package/build/parser/satisfactory/types/structs/vec2.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/vec2.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/vec2.js +1 -0
- package/build/parser/satisfactory/types/structs/vec2.js.map +1 -0
- package/build/parser/satisfactory/types/structs/vec3.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/vec3.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/vec3.js +1 -0
- package/build/parser/satisfactory/types/structs/vec3.js.map +1 -0
- package/build/parser/satisfactory/types/structs/vec4.d.ts +1 -0
- package/build/parser/satisfactory/types/structs/vec4.d.ts.map +1 -0
- package/build/parser/satisfactory/types/structs/vec4.js +1 -0
- package/build/parser/satisfactory/types/structs/vec4.js.map +1 -0
- package/build/parser/stream/reworked/readable-stream-parser.d.ts +6 -5
- package/build/parser/stream/reworked/readable-stream-parser.d.ts.map +1 -0
- package/build/parser/stream/reworked/readable-stream-parser.js +21 -66
- package/build/parser/stream/reworked/readable-stream-parser.js.map +1 -0
- package/build/parser/stream/reworked/save-stream-json-stringifier.d.ts +1 -0
- package/build/parser/stream/reworked/save-stream-json-stringifier.d.ts.map +1 -0
- package/build/parser/stream/reworked/save-stream-json-stringifier.js +1 -0
- package/build/parser/stream/reworked/save-stream-json-stringifier.js.map +1 -0
- package/build/parser/stream/reworked/save-stream-writer.class.d.ts +3 -2
- package/build/parser/stream/reworked/save-stream-writer.class.d.ts.map +1 -0
- package/build/parser/stream/reworked/save-stream-writer.class.js +1 -0
- package/build/parser/stream/reworked/save-stream-writer.class.js.map +1 -0
- package/docs/.nojekyll +1 -0
- package/docs/assets/highlight.css +92 -0
- package/docs/assets/icons.js +18 -0
- package/docs/assets/icons.svg +1 -0
- package/docs/assets/main.js +60 -0
- package/docs/assets/navigation.js +1 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +1493 -0
- package/docs/classes/AbstractBaseProperty.html +6 -0
- package/docs/classes/AbstractProperty.html +4 -0
- package/docs/classes/ArrayProperty.html +13 -0
- package/docs/classes/BasicProperty.html +7 -0
- package/docs/classes/BlueprintConfigReader.html +35 -0
- package/docs/classes/BlueprintConfigWriter.html +37 -0
- package/docs/classes/BlueprintReader.html +36 -0
- package/docs/classes/BlueprintWriter.html +40 -0
- package/docs/classes/BoolProperty.html +13 -0
- package/docs/classes/ByteProperty.html +13 -0
- package/docs/classes/CompressionLibraryError.html +11 -0
- package/docs/classes/CorruptSaveError.html +11 -0
- package/docs/classes/DoubleProperty.html +13 -0
- package/docs/classes/EnumProperty.html +13 -0
- package/docs/classes/FloatProperty.html +13 -0
- package/docs/classes/Int32Property.html +13 -0
- package/docs/classes/Int64Property.html +13 -0
- package/docs/classes/Int8Property.html +13 -0
- package/docs/classes/MapProperty.html +17 -0
- package/docs/classes/ObjectProperty.html +13 -0
- package/docs/classes/Parser.html +35 -0
- package/docs/classes/ParserError.html +11 -0
- package/docs/classes/ReadableStreamParser.html +8 -0
- package/docs/classes/SatisfactorySave.html +8 -0
- package/docs/classes/SaveComponent.html +17 -0
- package/docs/classes/SaveEntity.html +23 -0
- package/docs/classes/SaveReader.html +43 -0
- package/docs/classes/SaveStreamJsonStringifier.html +4 -0
- package/docs/classes/SaveStreamWriter.html +16 -0
- package/docs/classes/SaveWriter.html +42 -0
- package/docs/classes/SetProperty.html +12 -0
- package/docs/classes/StrProperty.html +13 -0
- package/docs/classes/StructProperty.html +18 -0
- package/docs/classes/TextProperty.html +13 -0
- package/docs/classes/TimeoutError.html +11 -0
- package/docs/classes/Uint32Property.html +13 -0
- package/docs/classes/Uint64Property.html +13 -0
- package/docs/classes/Uint8Property.html +13 -0
- package/docs/classes/UnimplementedError.html +11 -0
- package/docs/classes/UnsupportedVersionError.html +11 -0
- package/docs/functions/DynamicStructPropertyValue.read.html +1 -0
- package/docs/functions/DynamicStructPropertyValue.write.html +1 -0
- package/docs/functions/FICFrameRange.Parse.html +1 -0
- package/docs/functions/FICFrameRange.Serialize.html +1 -0
- package/docs/functions/GUID.read.html +1 -0
- package/docs/functions/GUID.write.html +1 -0
- package/docs/functions/GUIDInfo.read.html +1 -0
- package/docs/functions/GUIDInfo.write.html +1 -0
- package/docs/functions/Level.ReadAllObjectContents.html +1 -0
- package/docs/functions/Level.ReadAllObjectHeaders.html +1 -0
- package/docs/functions/Level.ReadLevel.html +1 -0
- package/docs/functions/Level.ReadNObjectContents.html +1 -0
- package/docs/functions/Level.ReadNObjectHeaders.html +1 -0
- package/docs/functions/Level.SerializeAllObjectContents.html +1 -0
- package/docs/functions/Level.SerializeAllObjectHeaders.html +1 -0
- package/docs/functions/Level.SerializeLevel.html +1 -0
- package/docs/functions/MD5Hash.read.html +1 -0
- package/docs/functions/MD5Hash.write.html +1 -0
- package/docs/functions/ObjectReference.read.html +1 -0
- package/docs/functions/ObjectReference.write.html +1 -0
- package/docs/functions/PropertiesList.ParseList.html +1 -0
- package/docs/functions/PropertiesList.ParseSingleProperty.html +1 -0
- package/docs/functions/PropertiesList.SerializeList.html +1 -0
- package/docs/functions/PropertiesList.SerializeSingleProperty.html +1 -0
- package/docs/functions/SoftObjectReference.read.html +1 -0
- package/docs/functions/SoftObjectReference.write.html +1 -0
- package/docs/functions/SpecialProperties.ParseClassSpecificSpecialProperties.html +1 -0
- package/docs/functions/SpecialProperties.SerializeClassSpecificSpecialProperties.html +1 -0
- package/docs/functions/Transform.Parse.html +1 -0
- package/docs/functions/Transform.ParseF.html +1 -0
- package/docs/functions/Transform.Serialize.html +1 -0
- package/docs/functions/Transform.SerializeF.html +1 -0
- package/docs/functions/col4.ParseBGRA.html +1 -0
- package/docs/functions/col4.ParseRGBA.html +1 -0
- package/docs/functions/col4.SerializeBGRA.html +1 -0
- package/docs/functions/col4.SerializeRGBA.html +1 -0
- package/docs/functions/isArrayProperty.html +1 -0
- package/docs/functions/isBoolProperty.html +1 -0
- package/docs/functions/isByteProperty.html +1 -0
- package/docs/functions/isDoubleProperty.html +1 -0
- package/docs/functions/isEnumProperty.html +1 -0
- package/docs/functions/isFloatProperty.html +1 -0
- package/docs/functions/isInt32Property.html +1 -0
- package/docs/functions/isInt64Property.html +1 -0
- package/docs/functions/isInt8Property.html +1 -0
- package/docs/functions/isMapProperty.html +1 -0
- package/docs/functions/isObjectProperty.html +1 -0
- package/docs/functions/isSaveComponent.html +1 -0
- package/docs/functions/isSaveEntity.html +1 -0
- package/docs/functions/isSetProperty.html +1 -0
- package/docs/functions/isStrProperty.html +1 -0
- package/docs/functions/isStructProperty.html +1 -0
- package/docs/functions/isTextProperty.html +1 -0
- package/docs/functions/isUInt64Property.html +1 -0
- package/docs/functions/isUint32Property.html +1 -0
- package/docs/functions/isUint8Property.html +1 -0
- package/docs/functions/vec2.Parse.html +1 -0
- package/docs/functions/vec2.ParseF.html +1 -0
- package/docs/functions/vec2.Serialize.html +1 -0
- package/docs/functions/vec2.SerializeF.html +1 -0
- package/docs/functions/vec3.Parse.html +1 -0
- package/docs/functions/vec3.ParseF.html +1 -0
- package/docs/functions/vec3.ParseInt.html +1 -0
- package/docs/functions/vec3.Serialize.html +1 -0
- package/docs/functions/vec3.SerializeF.html +1 -0
- package/docs/functions/vec3.SerializeInt.html +1 -0
- package/docs/functions/vec3.add.html +1 -0
- package/docs/functions/vec3.length.html +1 -0
- package/docs/functions/vec3.mult.html +1 -0
- package/docs/functions/vec3.norm.html +1 -0
- package/docs/functions/vec3.sub.html +1 -0
- package/docs/functions/vec4.Parse.html +1 -0
- package/docs/functions/vec4.ParseF.html +1 -0
- package/docs/functions/vec4.Serialize.html +1 -0
- package/docs/functions/vec4.SerializeF.html +1 -0
- package/docs/hierarchy.html +1 -0
- package/docs/index.html +146 -0
- package/docs/interfaces/Blueprint.html +6 -0
- package/docs/interfaces/BlueprintConfig.html +6 -0
- package/docs/interfaces/ModData.html +4 -0
- package/docs/interfaces/SatisfactoryModMetadata.html +4 -0
- package/docs/interfaces/SatisfactorySaveHeader.html +18 -0
- package/docs/interfaces/SaveComponentHeader.html +5 -0
- package/docs/interfaces/SaveEntityHeader.html +7 -0
- package/docs/modules/DynamicStructPropertyValue.html +3 -0
- package/docs/modules/FICFrameRange.html +3 -0
- package/docs/modules/GUID.html +3 -0
- package/docs/modules/GUIDInfo.html +3 -0
- package/docs/modules/Level.html +9 -0
- package/docs/modules/MD5Hash.html +3 -0
- package/docs/modules/ObjectReference.html +3 -0
- package/docs/modules/PropertiesList.html +5 -0
- package/docs/modules/SoftObjectReference.html +3 -0
- package/docs/modules/SpecialProperties.html +3 -0
- package/docs/modules/Transform.html +5 -0
- package/docs/modules/col4.html +5 -0
- package/docs/modules/vec2.html +5 -0
- package/docs/modules/vec3.html +12 -0
- package/docs/modules/vec4.html +5 -0
- package/docs/modules.html +123 -0
- package/docs/types/ArrayPropertyStructValueFields.html +1 -0
- package/docs/types/BasicMultipleStructPropertyValue.html +1 -0
- package/docs/types/BasicStructPropertyValue.html +1 -0
- package/docs/types/BlueprintHeader.html +1 -0
- package/docs/types/BoxStructPropertyValue.html +1 -0
- package/docs/types/BuildableSubsystemSpecialProperties.html +1 -0
- package/docs/types/BuildableTypeInstance.html +1 -0
- package/docs/types/BytePropertyValue.html +1 -0
- package/docs/types/ClientIdentityInfo.html +1 -0
- package/docs/types/ConveyorChainActorSpecialProperties.html +1 -0
- package/docs/types/ConveyorChainSegmentSpecialProperties.html +1 -0
- package/docs/types/ConveyorItemSpecialProperties.html +1 -0
- package/docs/types/DynamicStructPropertyValue-1.html +1 -0
- package/docs/types/EmptySpecialProperties.html +1 -0
- package/docs/types/FICFrameRange-1.html +1 -0
- package/docs/types/FICFrameRangeStructPropertyValue.html +1 -0
- package/docs/types/GENERIC_MAP_KEY_TYPE.html +1 -0
- package/docs/types/GENERIC_MAP_VALUE_TYPE.html +1 -0
- package/docs/types/GENERIC_STRUCT_PROPERTY_VALUE.html +1 -0
- package/docs/types/GUID-1.html +1 -0
- package/docs/types/GUIDInfo-1.html +1 -0
- package/docs/types/InventoryItemStructPropertyValue.html +1 -0
- package/docs/types/Level-1.html +1 -0
- package/docs/types/MAP_STRUCT_KEY_PROXY.html +1 -0
- package/docs/types/MD5Hash-1.html +1 -0
- package/docs/types/ObjectReference-1.html +1 -0
- package/docs/types/PlayerSpecialProperties.html +1 -0
- package/docs/types/PowerLineSpecialProperties.html +1 -0
- package/docs/types/PropertiesMap.html +1 -0
- package/docs/types/RailroadTrackPositionStructPropertyValue.html +1 -0
- package/docs/types/RoughSaveVersion.html +1 -0
- package/docs/types/SoftObjectReference-1.html +1 -0
- package/docs/types/SpecialAnyProperties.html +1 -0
- package/docs/types/TextPropertyValue.html +1 -0
- package/docs/types/Transform-1.html +1 -0
- package/docs/types/col4-1.html +1 -0
- package/docs/types/vec2-1.html +1 -0
- package/docs/types/vec3-1.html +1 -0
- package/docs/types/vec4-1.html +1 -0
- package/docs/variables/EDIT.html +1 -0
- package/package.json +5 -10
- package/build/parser/satisfactory/objects/DataFields.d.ts +0 -15
- package/build/parser/satisfactory/objects/DataFields.js +0 -491
- package/build/parser/satisfactory/objects/GUIDInfo.d.ts +0 -8
- package/build/parser/satisfactory/objects/GUIDInfo.js +0 -26
- package/build/parser/satisfactory/objects/SaveComponent.d.ts +0 -19
- package/build/parser/satisfactory/objects/SaveComponent.js +0 -31
- package/build/parser/satisfactory/objects/SaveEntity.d.ts +0 -30
- package/build/parser/satisfactory/objects/SaveEntity.js +0 -66
- package/build/parser/satisfactory/objects/SaveObject.d.ts +0 -24
- package/build/parser/satisfactory/objects/SaveObject.js +0 -33
- package/build/parser/satisfactory/objects/property/generic/ArrayProperty.d.ts +0 -21
- package/build/parser/satisfactory/objects/property/generic/ArrayProperty.js +0 -169
- package/build/parser/satisfactory/objects/property/generic/BasicProperty.d.ts +0 -25
- package/build/parser/satisfactory/objects/property/generic/BasicProperty.js +0 -27
- package/build/parser/satisfactory/objects/property/generic/BoolProperty.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/BoolProperty.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/ByteProperty.d.ts +0 -17
- package/build/parser/satisfactory/objects/property/generic/ByteProperty.js +0 -50
- package/build/parser/satisfactory/objects/property/generic/DoubleProperty.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/DoubleProperty.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/EnumProperty.d.ts +0 -19
- package/build/parser/satisfactory/objects/property/generic/EnumProperty.js +0 -33
- package/build/parser/satisfactory/objects/property/generic/FloatProperty.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/FloatProperty.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/Int32Property.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/Int32Property.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/Int64Property.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/Int64Property.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/Int8Property.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/Int8Property.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/MapProperty.d.ts +0 -21
- package/build/parser/satisfactory/objects/property/generic/MapProperty.js +0 -160
- package/build/parser/satisfactory/objects/property/generic/ObjectProperty.d.ts +0 -14
- package/build/parser/satisfactory/objects/property/generic/ObjectProperty.js +0 -35
- package/build/parser/satisfactory/objects/property/generic/SetProperty.d.ts +0 -11
- package/build/parser/satisfactory/objects/property/generic/SetProperty.js +0 -92
- package/build/parser/satisfactory/objects/property/generic/SoftObjectProperty.d.ts +0 -12
- package/build/parser/satisfactory/objects/property/generic/SoftObjectProperty.js +0 -25
- package/build/parser/satisfactory/objects/property/generic/StrProperty.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/StrProperty.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/StructProperty.d.ts +0 -66
- package/build/parser/satisfactory/objects/property/generic/StructProperty.js +0 -361
- package/build/parser/satisfactory/objects/property/generic/TextProperty.d.ts +0 -29
- package/build/parser/satisfactory/objects/property/generic/TextProperty.js +0 -109
- package/build/parser/satisfactory/objects/property/generic/Uint32Property.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/Uint32Property.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/Uint64Property.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/Uint64Property.js +0 -30
- package/build/parser/satisfactory/objects/property/generic/Uint8Property.d.ts +0 -13
- package/build/parser/satisfactory/objects/property/generic/Uint8Property.js +0 -30
- package/build/parser/satisfactory/objects/property/special/SpecialAnyProperty.d.ts +0 -52
- package/build/parser/satisfactory/objects/property/special/SpecialAnyProperty.js +0 -2
- package/build/parser/satisfactory/objects/ue/MD5Hash.d.ts +0 -10
- package/build/parser/satisfactory/objects/ue/MD5Hash.js +0 -21
- package/build/parser/satisfactory/objects/values/GUID.d.ts +0 -7
- package/build/parser/satisfactory/objects/values/GUID.js +0 -21
- package/build/parser/satisfactory/objects/values/ObjectReference.d.ts +0 -10
- package/build/parser/satisfactory/objects/values/ObjectReference.js +0 -17
- package/build/parser/satisfactory/objects/values/SoftObjectReference.d.ts +0 -11
- package/build/parser/satisfactory/objects/values/SoftObjectReference.js +0 -19
- package/build/parser/satisfactory/structs/util.types.d.ts +0 -60
- package/build/parser/satisfactory/structs/util.types.js +0 -147
- package/build/parser/satisfactory/types/property/DataFields.d.ts +0 -15
- package/build/parser/satisfactory/types/property/DataFields.js +0 -493
- package/build/parser/satisfactory/types/property/special/SpecialAnyProperty.d.ts +0 -54
- package/build/parser/satisfactory/types/property/special/SpecialAnyProperty.js +0 -2
|
@@ -1,26 +1,89 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Level = void 0;
|
|
4
|
+
const parser_error_1 = require("../../error/parser.error");
|
|
4
5
|
const SaveComponent_1 = require("../types/objects/SaveComponent");
|
|
5
6
|
const SaveEntity_1 = require("../types/objects/SaveEntity");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
const object_references_list_1 = require("./object-references-list");
|
|
8
|
+
var Level;
|
|
9
|
+
(function (Level) {
|
|
10
|
+
Level.ReadLevel = (reader, levelName, buildVersion) => {
|
|
11
|
+
const level = {
|
|
12
|
+
name: levelName,
|
|
13
|
+
objects: [],
|
|
14
|
+
collectables: []
|
|
15
|
+
};
|
|
16
|
+
const headersBinLen = reader.readInt32();
|
|
17
|
+
reader.readInt32();
|
|
18
|
+
const posBeforeHeaders = reader.getBufferPosition();
|
|
19
|
+
Level.ReadAllObjectHeaders(reader, level.objects);
|
|
20
|
+
let remainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);
|
|
21
|
+
if (remainingSize > 0) {
|
|
22
|
+
const doubledCollectablesIgnored = object_references_list_1.ObjectReferencesList.ReadList(reader);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
}
|
|
26
|
+
remainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);
|
|
27
|
+
if (remainingSize !== 0) {
|
|
28
|
+
console.warn('remaining size not 0. Save may be corrupt.', remainingSize, levelName);
|
|
29
|
+
}
|
|
30
|
+
const objectContentsBinLen = reader.readInt32();
|
|
31
|
+
reader.readInt32();
|
|
32
|
+
const posBeforeContents = reader.getBufferPosition();
|
|
33
|
+
Level.ReadAllObjectContents(levelName, reader, level.objects, buildVersion, reader.onProgressCallback);
|
|
34
|
+
const posAfterContents = reader.getBufferPosition();
|
|
35
|
+
if (posAfterContents - posBeforeContents !== objectContentsBinLen) {
|
|
36
|
+
console.warn('save seems corrupt.', level.name);
|
|
37
|
+
}
|
|
38
|
+
level.collectables = object_references_list_1.ObjectReferencesList.ReadList(reader);
|
|
39
|
+
return level;
|
|
40
|
+
};
|
|
41
|
+
Level.SerializeLevel = (writer, level, buildVersion) => {
|
|
14
42
|
const lenIndicatorHeaderAndDestroyedEntitiesSize = writer.getBufferPosition();
|
|
15
43
|
writer.writeInt32(0);
|
|
16
44
|
writer.writeInt32(0);
|
|
17
|
-
Level.
|
|
18
|
-
|
|
45
|
+
Level.SerializeAllObjectHeaders(writer, level.objects);
|
|
46
|
+
object_references_list_1.ObjectReferencesList.SerializeList(writer, level.collectables);
|
|
19
47
|
writer.writeBinarySizeFromPosition(lenIndicatorHeaderAndDestroyedEntitiesSize, lenIndicatorHeaderAndDestroyedEntitiesSize + 8);
|
|
20
|
-
Level.
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
48
|
+
Level.SerializeAllObjectContents(writer, level.objects, buildVersion, level.name);
|
|
49
|
+
object_references_list_1.ObjectReferencesList.SerializeList(writer, level.collectables);
|
|
50
|
+
};
|
|
51
|
+
Level.ReadAllObjectContents = (levelName, reader, objectsList, buildVersion, onProgressCallback) => {
|
|
52
|
+
const countEntities = reader.readInt32();
|
|
53
|
+
if (countEntities !== objectsList.length) {
|
|
54
|
+
throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);
|
|
55
|
+
}
|
|
56
|
+
const batchSize = 10000;
|
|
57
|
+
let readObjectsCount = 0;
|
|
58
|
+
let lastProgressReport = 0;
|
|
59
|
+
while (readObjectsCount < countEntities) {
|
|
60
|
+
Level.ReadNObjectContents(reader, Math.min(batchSize, countEntities - readObjectsCount), objectsList, readObjectsCount);
|
|
61
|
+
readObjectsCount += Math.min(batchSize, countEntities - readObjectsCount);
|
|
62
|
+
if (readObjectsCount - lastProgressReport > batchSize) {
|
|
63
|
+
onProgressCallback(reader.getBufferProgress(), `read object count [${(readObjectsCount)}/${(countEntities)}] in level ${levelName}`);
|
|
64
|
+
lastProgressReport = readObjectsCount;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
Level.ReadNObjectContents = (reader, count, objects, objectListOffset = 0, buildVersion = 0) => {
|
|
69
|
+
for (let i = 0; i < count; i++) {
|
|
70
|
+
objects[i + objectListOffset].objectVersion = reader.readInt32();
|
|
71
|
+
objects[i + objectListOffset].unknownType2 = reader.readInt32();
|
|
72
|
+
const binarySize = reader.readInt32();
|
|
73
|
+
const before = reader.getBufferPosition();
|
|
74
|
+
if ((0, SaveEntity_1.isSaveEntity)(objects[i + objectListOffset])) {
|
|
75
|
+
SaveEntity_1.SaveEntity.ParseData(objects[i + objectListOffset], binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);
|
|
76
|
+
}
|
|
77
|
+
else if ((0, SaveComponent_1.isSaveComponent)(objects[i + objectListOffset])) {
|
|
78
|
+
SaveComponent_1.SaveComponent.ParseData(objects[i + objectListOffset], binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);
|
|
79
|
+
}
|
|
80
|
+
const after = reader.getBufferPosition();
|
|
81
|
+
if (after - before !== binarySize) {
|
|
82
|
+
throw new parser_error_1.CorruptSaveError(`Could not read entity ${objects[i + objectListOffset].instanceName}, as ${after - before} bytes were read, but ${binarySize} bytes were indicated.`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
Level.SerializeAllObjectContents = (writer, objects, buildVersion, levelName) => {
|
|
24
87
|
const lenIndicatorEntities = writer.getBufferPosition();
|
|
25
88
|
writer.writeInt32(0);
|
|
26
89
|
writer.writeInt32(0);
|
|
@@ -39,32 +102,39 @@ class Level {
|
|
|
39
102
|
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
40
103
|
}
|
|
41
104
|
writer.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 8);
|
|
42
|
-
}
|
|
43
|
-
|
|
105
|
+
};
|
|
106
|
+
Level.ReadAllObjectHeaders = (reader, objectsList) => {
|
|
44
107
|
let countObjectHeaders = reader.readInt32();
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
108
|
+
const batchSize = 10000;
|
|
109
|
+
let readObjectHeadersCount = 0;
|
|
110
|
+
while (readObjectHeadersCount < countObjectHeaders) {
|
|
111
|
+
objectsList.push(...Level.ReadNObjectHeaders(reader, Math.min(batchSize, countObjectHeaders - readObjectHeadersCount)));
|
|
112
|
+
readObjectHeadersCount += Math.min(batchSize, countObjectHeaders - readObjectHeadersCount);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
Level.ReadNObjectHeaders = (reader, count) => {
|
|
116
|
+
let objects = [];
|
|
117
|
+
let objectsRead = 0;
|
|
118
|
+
for (; objectsRead < count; objectsRead++) {
|
|
119
|
+
let obj;
|
|
49
120
|
let objectType = reader.readInt32();
|
|
50
121
|
switch (objectType) {
|
|
51
122
|
case SaveEntity_1.SaveEntity.TypeID:
|
|
52
|
-
|
|
53
|
-
SaveEntity_1.SaveEntity.ParseHeader(reader,
|
|
54
|
-
objectsList.push(object);
|
|
123
|
+
obj = new SaveEntity_1.SaveEntity('', '', '', '');
|
|
124
|
+
SaveEntity_1.SaveEntity.ParseHeader(reader, obj);
|
|
55
125
|
break;
|
|
56
126
|
case SaveComponent_1.SaveComponent.TypeID:
|
|
57
|
-
|
|
58
|
-
SaveComponent_1.SaveComponent.ParseHeader(reader,
|
|
59
|
-
objectsList.push(component);
|
|
127
|
+
obj = new SaveComponent_1.SaveComponent('', '', '', '');
|
|
128
|
+
SaveComponent_1.SaveComponent.ParseHeader(reader, obj);
|
|
60
129
|
break;
|
|
61
130
|
default:
|
|
62
|
-
|
|
63
|
-
break;
|
|
131
|
+
throw new parser_error_1.CorruptSaveError('Unknown object type' + objectType);
|
|
64
132
|
}
|
|
133
|
+
objects.push(obj);
|
|
65
134
|
}
|
|
66
|
-
|
|
67
|
-
|
|
135
|
+
return objects;
|
|
136
|
+
};
|
|
137
|
+
Level.SerializeAllObjectHeaders = (writer, objects) => {
|
|
68
138
|
writer.writeInt32(objects.length);
|
|
69
139
|
for (const obj of objects) {
|
|
70
140
|
switch (obj.type) {
|
|
@@ -77,24 +147,10 @@ class Level {
|
|
|
77
147
|
SaveComponent_1.SaveComponent.SerializeHeader(writer, obj);
|
|
78
148
|
break;
|
|
79
149
|
default:
|
|
80
|
-
|
|
150
|
+
throw new parser_error_1.UnimplementedError(`Unknown object type ${obj.type}. Not implemented.`);
|
|
81
151
|
break;
|
|
82
152
|
}
|
|
83
153
|
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
for (const collectable of collectables) {
|
|
88
|
-
ObjectReference_1.ObjectReference.write(writer, collectable);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
static ReadCollectablesList(reader) {
|
|
92
|
-
const collected = [];
|
|
93
|
-
let count = reader.readInt32();
|
|
94
|
-
for (let i = 0; i < count; i++) {
|
|
95
|
-
collected.push(ObjectReference_1.ObjectReference.read(reader));
|
|
96
|
-
}
|
|
97
|
-
return collected;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
exports.Level = Level;
|
|
154
|
+
};
|
|
155
|
+
})(Level || (exports.Level = Level = {}));
|
|
156
|
+
//# sourceMappingURL=level.class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"level.class.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/level.class.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { BinaryReadable } from \"../../byte/binary-readable.interface\";\nimport { ByteWriter } from \"../../byte/byte-writer.class\";\nimport { CorruptSaveError, UnimplementedError } from '../../error/parser.error';\nimport { SaveComponent, isSaveComponent } from \"../types/objects/SaveComponent\";\nimport { SaveEntity, isSaveEntity } from \"../types/objects/SaveEntity\";\nimport { SaveObject } from \"../types/objects/SaveObject\";\nimport { ObjectReference } from \"../types/structs/ObjectReference\";\nimport { ObjectReferencesList } from './object-references-list';\nimport { SaveReader } from './save-reader';\n\nexport type Level = {\n\tname: string;\n\tobjects: (SaveEntity | SaveComponent)[];\n\tcollectables: ObjectReference[];\n}\n\nexport namespace Level {\n\n\texport const ReadLevel = (reader: SaveReader, levelName: string, buildVersion: number): Level => {\n\t\tconst level: Level = {\n\t\t\tname: levelName,\n\t\t\tobjects: [],\n\t\t\tcollectables: []\n\t\t}\n\n\t\t// checksum object headers.\n\t\tconst headersBinLen = reader.readInt32(); // object headers + binary length\n\t\treader.readInt32();\t// 0\n\n\t\t// object headers\n\t\tconst posBeforeHeaders = reader.getBufferPosition();\n\t\tReadAllObjectHeaders(reader, level.objects);\n\n\t\t// collected, like slugs Only listed here since U8.\n\t\tlet remainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);\n\t\tif (remainingSize > 0) {\n\t\t\tconst doubledCollectablesIgnored = ObjectReferencesList.ReadList(reader);\n\t\t} else {\n\t\t\t// its perfectly possible for ported saves to have nothing here.\n\t\t}\n\n\t\tremainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);\n\t\tif (remainingSize !== 0) {\n\t\t\tconsole.warn('remaining size not 0. Save may be corrupt.', remainingSize, levelName);\n\t\t}\n\n\t\t// checksum for object content size\n\t\tconst objectContentsBinLen = reader.readInt32();\n\t\treader.readInt32();\t// 0\n\n\t\t// objects contents\n\t\tconst posBeforeContents = reader.getBufferPosition();\n\t\tReadAllObjectContents(levelName, reader, level.objects, buildVersion, reader.onProgressCallback);\n\t\tconst posAfterContents = reader.getBufferPosition();\n\t\tif (posAfterContents - posBeforeContents !== objectContentsBinLen) {\n\t\t\t//WARNING\n\t\t\tconsole.warn('save seems corrupt.', level.name);\n\t\t}\n\n\t\t// collectables 2nd time. Listed here since < U8 and in U8 as well. So this is the best list you can rely on.\n\t\tlevel.collectables = ObjectReferencesList.ReadList(reader);\n\n\t\treturn level;\n\t}\n\n\texport const SerializeLevel = (writer: ByteWriter, level: Level, buildVersion: number) => {\n\t\tconst lenIndicatorHeaderAndDestroyedEntitiesSize = writer.getBufferPosition();\n\t\twriter.writeInt32(0);\t// len indicator\n\t\twriter.writeInt32(0);\t// unk\n\n\t\tSerializeAllObjectHeaders(writer, level.objects);\n\n\t\t// <--- destroyed actors is the same as collectables list.\n\t\tObjectReferencesList.SerializeList(writer, level.collectables);\n\n\t\t// replace binary size from earlier for - object headers + collectables\n\t\twriter.writeBinarySizeFromPosition(lenIndicatorHeaderAndDestroyedEntitiesSize, lenIndicatorHeaderAndDestroyedEntitiesSize + 8);\n\n\t\t// write entities\n\t\tSerializeAllObjectContents(writer, level.objects, buildVersion, level.name);\n\n\t\tObjectReferencesList.SerializeList(writer, level.collectables);\n\t}\n\n\texport const ReadAllObjectContents = (levelName: string, reader: BinaryReadable, objectsList: SaveObject[], buildVersion: number, onProgressCallback: (progress: number, msg?: string) => void): void => {\n\t\tconst countEntities = reader.readInt32();\n\t\tif (countEntities !== objectsList.length) {\n\t\t\tthrow new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);\n\t\t}\n\n\t\t// read in batches\n\t\tconst batchSize = 10000;\n\t\tlet readObjectsCount = 0;\n\t\tlet lastProgressReport = 0;\n\t\twhile (readObjectsCount < countEntities) {\n\t\t\tReadNObjectContents(reader, Math.min(batchSize, countEntities - readObjectsCount), objectsList, readObjectsCount);\n\t\t\treadObjectsCount += Math.min(batchSize, countEntities - readObjectsCount);\n\n\t\t\tif (readObjectsCount - lastProgressReport > batchSize) {\n\t\t\t\tonProgressCallback(reader.getBufferProgress(), `read object count [${(readObjectsCount)}/${(countEntities)}] in level ${levelName}`);\n\t\t\t\tlastProgressReport = readObjectsCount;\n\t\t\t}\n\t\t}\n\t}\n\n\texport const ReadNObjectContents = (reader: BinaryReadable, count: number, objects: SaveObject[], objectListOffset: number = 0, buildVersion: number = 0) => {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tobjects[i + objectListOffset].objectVersion = reader.readInt32();\t// 36, 41..... 42, 46 at 1.0 Release - so its probably an object version\n\t\t\tobjects[i + objectListOffset].unknownType2 = reader.readInt32();\t//1 - //occasionally 0 ?\n\t\t\tconst binarySize = reader.readInt32();\n\n\t\t\tconst before = reader.getBufferPosition();\n\t\t\tif (isSaveEntity(objects[i + objectListOffset])) {\n\t\t\t\tSaveEntity.ParseData(objects[i + objectListOffset] as SaveEntity, binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);\n\t\t\t} else if (isSaveComponent(objects[i + objectListOffset])) {\n\t\t\t\tSaveComponent.ParseData(objects[i + objectListOffset] as SaveComponent, binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);\n\t\t\t}\n\n\t\t\tconst after = reader.getBufferPosition();\n\t\t\tif (after - before !== binarySize) {\n\t\t\t\tthrow new CorruptSaveError(`Could not read entity ${objects[i + objectListOffset].instanceName}, as ${after - before} bytes were read, but ${binarySize} bytes were indicated.`);\n\t\t\t}\n\t\t}\n\t}\n\n\texport const SerializeAllObjectContents = (writer: ByteWriter, objects: (SaveEntity | SaveComponent)[], buildVersion: number, levelName: string): void => {\n\t\tconst lenIndicatorEntities = writer.getBufferPosition();\n\t\twriter.writeInt32(0);\n\n\t\twriter.writeInt32(0);\t// 0\n\n\t\twriter.writeInt32(objects.length);\n\t\tfor (const obj of objects) {\n\n\t\t\twriter.writeInt32(obj.objectVersion);\n\t\t\twriter.writeInt32(obj.unknownType2);\n\t\t\tconst lenReplacementPosition = writer.getBufferPosition();\n\t\t\twriter.writeInt32(0);\n\n\t\t\tif (isSaveEntity(obj)) {\n\t\t\t\tSaveEntity.SerializeData(writer, obj, buildVersion);\n\t\t\t} else if (isSaveComponent(obj)) {\n\t\t\t\tSaveComponent.SerializeData(writer, obj, buildVersion);\n\t\t\t}\n\n\t\t\twriter.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);\n\t\t}\n\t\twriter.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 8);\n\t}\n\n\texport const ReadAllObjectHeaders = (reader: BinaryReadable, objectsList: SaveObject[]): void => {\n\t\tlet countObjectHeaders = reader.readInt32();\n\n\t\t// read in batches\n\t\tconst batchSize = 10000;\n\t\tlet readObjectHeadersCount = 0;\n\t\twhile (readObjectHeadersCount < countObjectHeaders) {\n\t\t\tobjectsList.push(...ReadNObjectHeaders(reader, Math.min(batchSize, countObjectHeaders - readObjectHeadersCount)));\n\t\t\treadObjectHeadersCount += Math.min(batchSize, countObjectHeaders - readObjectHeadersCount);\n\t\t}\n\t}\n\n\texport const ReadNObjectHeaders = (reader: BinaryReadable, count: number): (SaveEntity | SaveComponent)[] => {\n\t\tlet objects: (SaveEntity | SaveComponent)[] = [];\n\t\tlet objectsRead = 0;\n\t\tfor (; objectsRead < count; objectsRead++) {\n\n\t\t\tlet obj: SaveEntity | SaveComponent;\n\t\t\tlet objectType = reader.readInt32();\n\t\t\tswitch (objectType) {\n\t\t\t\tcase SaveEntity.TypeID:\n\t\t\t\t\tobj = new SaveEntity('', '', '', '');\n\t\t\t\t\tSaveEntity.ParseHeader(reader, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SaveComponent.TypeID:\n\t\t\t\t\tobj = new SaveComponent('', '', '', '');\n\t\t\t\t\tSaveComponent.ParseHeader(reader, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new CorruptSaveError('Unknown object type' + objectType);\n\t\t\t}\n\t\t\tobjects.push(obj);\n\t\t}\n\t\treturn objects;\n\t}\n\n\texport const SerializeAllObjectHeaders = (writer: ByteWriter, objects: (SaveEntity | SaveComponent)[]): void => {\n\t\twriter.writeInt32(objects.length);\n\t\tfor (const obj of objects) {\n\n\t\t\tswitch (obj.type) {\n\t\t\t\tcase 'SaveEntity':\n\t\t\t\t\twriter.writeInt32(SaveEntity.TypeID);\n\t\t\t\t\tSaveEntity.SerializeHeader(writer, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SaveComponent':\n\t\t\t\t\twriter.writeInt32(SaveComponent.TypeID);\n\t\t\t\t\tSaveComponent.SerializeHeader(writer, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new UnimplementedError(`Unknown object type ${(obj as unknown as any).type}. Not implemented.`);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BinaryReadable } from '../../byte/binary-readable.interface';
|
|
2
|
+
import { ByteWriter } from '../../byte/byte-writer.class';
|
|
3
|
+
import { ObjectReference } from '../types/structs/ObjectReference';
|
|
4
|
+
export declare namespace ObjectReferencesList {
|
|
5
|
+
const SerializeList: (writer: ByteWriter, collectables: ObjectReference[]) => void;
|
|
6
|
+
const ReadList: (reader: BinaryReadable) => ObjectReference[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=object-references-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-references-list.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/object-references-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,yBAAiB,oBAAoB,CAAC;IAE3B,MAAM,aAAa,WAAY,UAAU,gBAAgB,eAAe,EAAE,KAAG,IAKnF,CAAA;IAEM,MAAM,QAAQ,WAAY,cAAc,KAAG,eAAe,EAOhE,CAAA;CACJ"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObjectReferencesList = void 0;
|
|
4
|
+
const ObjectReference_1 = require("../types/structs/ObjectReference");
|
|
5
|
+
var ObjectReferencesList;
|
|
6
|
+
(function (ObjectReferencesList) {
|
|
7
|
+
ObjectReferencesList.SerializeList = (writer, collectables) => {
|
|
8
|
+
writer.writeInt32(collectables.length);
|
|
9
|
+
for (const collectable of collectables) {
|
|
10
|
+
ObjectReference_1.ObjectReference.write(writer, collectable);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
ObjectReferencesList.ReadList = (reader) => {
|
|
14
|
+
const collected = [];
|
|
15
|
+
let count = reader.readInt32();
|
|
16
|
+
for (let i = 0; i < count; i++) {
|
|
17
|
+
collected.push(ObjectReference_1.ObjectReference.read(reader));
|
|
18
|
+
}
|
|
19
|
+
return collected;
|
|
20
|
+
};
|
|
21
|
+
})(ObjectReferencesList || (exports.ObjectReferencesList = ObjectReferencesList = {}));
|
|
22
|
+
//# sourceMappingURL=object-references-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-references-list.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/object-references-list.ts"],"names":[],"mappings":";;;AAEA,sEAAmE;AAEnE,IAAiB,oBAAoB,CAiBpC;AAjBD,WAAiB,oBAAoB;IAEpB,kCAAa,GAAG,CAAC,MAAkB,EAAE,YAA+B,EAAQ,EAAE;QACvF,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACrC,iCAAe,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC,CAAA;IAEY,6BAAQ,GAAG,CAAC,MAAsB,EAAqB,EAAE;QAClE,MAAM,SAAS,GAAsB,EAAE,CAAC;QACxC,IAAI,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,iCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC,CAAA;AACL,CAAC,EAjBgB,oBAAoB,oCAApB,oBAAoB,QAiBpC","sourcesContent":["import { BinaryReadable } from '../../byte/binary-readable.interface';\r\nimport { ByteWriter } from '../../byte/byte-writer.class';\r\nimport { ObjectReference } from '../types/structs/ObjectReference';\r\n\r\nexport namespace ObjectReferencesList {\r\n\r\n export const SerializeList = (writer: ByteWriter, collectables: ObjectReference[]): void => {\r\n writer.writeInt32(collectables.length);\r\n for (const collectable of collectables) {\r\n ObjectReference.write(writer, collectable);\r\n }\r\n }\r\n\r\n export const ReadList = (reader: BinaryReadable): ObjectReference[] => {\r\n const collected: ObjectReference[] = [];\r\n let count = reader.readInt32();\r\n for (let i = 0; i < count; i++) {\r\n collected.push(ObjectReference.read(reader));\r\n }\r\n return collected;\r\n }\r\n}"]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { ChunkCompressionInfo } from "../../file.types";
|
|
2
|
-
import { Level } from
|
|
3
|
-
import {
|
|
2
|
+
import { Level } from './level.class';
|
|
3
|
+
import { Grids, SaveBodyValidation } from "./save-reader";
|
|
4
4
|
import { SatisfactorySaveHeader } from "./save.types";
|
|
5
5
|
export declare class SatisfactorySave {
|
|
6
6
|
name: string;
|
|
7
7
|
header: SatisfactorySaveHeader;
|
|
8
|
-
gridHash:
|
|
8
|
+
gridHash: SaveBodyValidation;
|
|
9
9
|
grids: Grids;
|
|
10
10
|
levels: Level[];
|
|
11
11
|
compressionInfo?: ChunkCompressionInfo;
|
|
12
12
|
constructor(name: string, header: SatisfactorySaveHeader);
|
|
13
13
|
}
|
|
14
|
+
//# sourceMappingURL=satisfactory-save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"satisfactory-save.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/satisfactory-save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,qBAAa,gBAAgB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,kBAAkB,CAA4D;IACxF,KAAK,EAAE,KAAK,CAAM;IAClB,MAAM,EAAE,KAAK,EAAE,CAAM;IACrB,eAAe,CAAC,EAAE,oBAAoB,CAAC;gBAElC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB;CAIxD"}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SatisfactorySave = void 0;
|
|
4
4
|
class SatisfactorySave {
|
|
5
5
|
constructor(name, header) {
|
|
6
|
-
this.gridHash = [0, 0, 0, 0];
|
|
6
|
+
this.gridHash = { version: 6, hash1: [0, 0, 0, 0], hash2: [0, 0, 0, 0] };
|
|
7
7
|
this.grids = {};
|
|
8
8
|
this.levels = [];
|
|
9
9
|
this.name = name;
|
|
@@ -11,3 +11,4 @@ class SatisfactorySave {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
exports.SatisfactorySave = SatisfactorySave;
|
|
14
|
+
//# sourceMappingURL=satisfactory-save.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"satisfactory-save.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/satisfactory-save.ts"],"names":[],"mappings":";;;AAKA,MAAa,gBAAgB;IAQ5B,YAAY,IAAY,EAAE,MAA8B;QALjD,aAAQ,GAAuB,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACxF,UAAK,GAAU,EAAE,CAAC;QAClB,WAAM,GAAY,EAAE,CAAC;QAI3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;CACD;AAZD,4CAYC","sourcesContent":["import { ChunkCompressionInfo } from \"../../file.types\";\nimport { Level } from './level.class';\nimport { Grids, SaveBodyValidation } from \"./save-reader\";\nimport { SatisfactorySaveHeader } from \"./save.types\";\n\nexport class SatisfactorySave {\n\tpublic name: string;\n\tpublic header: SatisfactorySaveHeader;\n\tpublic gridHash: SaveBodyValidation = { version: 6, hash1: [0, 0, 0, 0], hash2: [0, 0, 0, 0] };\n\tpublic grids: Grids = {};\n\tpublic levels: Level[] = [];\n\tpublic compressionInfo?: ChunkCompressionInfo;\n\n\tconstructor(name: string, header: SatisfactorySaveHeader) {\n\t\tthis.name = name;\n\t\tthis.header = header;\n\t}\n}"]}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { ByteReader } from "../../byte/byte-reader.class";
|
|
2
2
|
import { ChunkCompressionInfo } from "../../file.types";
|
|
3
|
+
import { Level } from './level.class';
|
|
3
4
|
import { RoughSaveVersion, SatisfactorySaveHeader } from "./save.types";
|
|
4
5
|
export declare const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;
|
|
5
6
|
export type ByteArray4 = [number, number, number, number];
|
|
7
|
+
export type SaveBodyValidation = {
|
|
8
|
+
version: number;
|
|
9
|
+
hash1: ByteArray4;
|
|
10
|
+
hash2: ByteArray4;
|
|
11
|
+
};
|
|
6
12
|
export type Grids = {
|
|
7
13
|
[parentName: string]: {
|
|
8
|
-
checksum: number;
|
|
9
14
|
cellSize: number;
|
|
10
15
|
gridHash: number;
|
|
11
16
|
children: {
|
|
@@ -19,12 +24,15 @@ export declare class SaveReader extends ByteReader {
|
|
|
19
24
|
compressionInfo: ChunkCompressionInfo;
|
|
20
25
|
static readonly EPOCH_TICKS = 621355968000000000n;
|
|
21
26
|
constructor(fileBuffer: ArrayBuffer, onProgressCallback?: (progress: number, msg?: string) => void);
|
|
27
|
+
expect: (value: any, expected: any) => void;
|
|
22
28
|
readHeader(): SatisfactorySaveHeader;
|
|
23
|
-
static
|
|
29
|
+
static GetRoughSaveVersion: (saveVersion: number, headerTypeVersion: number) => RoughSaveVersion;
|
|
24
30
|
inflateChunks(): {
|
|
25
31
|
concatenatedChunkLength: number;
|
|
26
32
|
numChunks: number;
|
|
27
33
|
};
|
|
28
|
-
readSaveBodyHash: () =>
|
|
34
|
+
readSaveBodyHash: () => SaveBodyValidation;
|
|
29
35
|
readGrids: () => Grids;
|
|
36
|
+
readLevels(): Level[];
|
|
30
37
|
}
|
|
38
|
+
//# sourceMappingURL=save-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-reader.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/save-reader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAExE,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;CAClB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IACnB,CAAC,UAAU,EAAE,MAAM,GAAG;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE;YACT,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;SACvB,CAAA;KACD,CAAA;CACD,CAAC;AAEF,qBAAa,UAAW,SAAQ,UAAU;IAYG,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI;IAVjG,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,oBAAoB,CAI1C;IAGF,gBAAuB,WAAW,uBAAuB;gBAE7C,UAAU,EAAE,WAAW,EAAS,kBAAkB,GAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAgB;IAI7G,MAAM,UAAW,GAAG,YAAY,GAAG,UAIxC;IAEK,UAAU,IAAI,sBAAsB;IAkE3C,OAAc,mBAAmB,gBAAiB,MAAM,qBAAqB,MAAM,KAAG,gBAAgB,CAUrG;IAEM,aAAa,IAAI;QAAE,uBAAuB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAkFvE,gBAAgB,QAAO,kBAAkB,CAuB/C;IAEM,SAAS,QAAO,KAAK,CAiC3B;IAEM,UAAU,IAAI,KAAK,EAAE;CAiC5B"}
|
|
@@ -9,6 +9,7 @@ const alignment_enum_1 = require("../../byte/alignment.enum");
|
|
|
9
9
|
const byte_reader_class_1 = require("../../byte/byte-reader.class");
|
|
10
10
|
const parser_error_1 = require("../../error/parser.error");
|
|
11
11
|
const MD5Hash_1 = require("../types/structs/MD5Hash");
|
|
12
|
+
const level_class_1 = require("./level.class");
|
|
12
13
|
exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;
|
|
13
14
|
class SaveReader extends byte_reader_class_1.ByteReader {
|
|
14
15
|
constructor(fileBuffer, onProgressCallback = () => { }) {
|
|
@@ -19,36 +20,45 @@ class SaveReader extends byte_reader_class_1.ByteReader {
|
|
|
19
20
|
maxUncompressedChunkContentSize: 0,
|
|
20
21
|
chunkHeaderSize: exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE
|
|
21
22
|
};
|
|
23
|
+
this.expect = (value, expected) => {
|
|
24
|
+
if (value !== expected) {
|
|
25
|
+
console.warn(`Read a value that's usually ${expected}, but this time ${value}. Meaning unclear. Raise an issue or contact me if you want.`);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
22
28
|
this.readSaveBodyHash = () => {
|
|
23
|
-
this.readInt32();
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
this.readInt32();
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
this.expect(this.readInt32(), 0);
|
|
30
|
+
const saveBodyValidationVersion = this.readInt32();
|
|
31
|
+
this.expect(this.readString(), 'None');
|
|
32
|
+
this.expect(this.readInt32(), 0);
|
|
33
|
+
const hash1 = Array.from(this.readBytes(4));
|
|
34
|
+
this.expect(this.readInt32(), 1);
|
|
35
|
+
this.expect(this.readString(), 'None');
|
|
36
|
+
const hash2 = Array.from(this.readBytes(4));
|
|
37
|
+
return {
|
|
38
|
+
version: saveBodyValidationVersion,
|
|
39
|
+
hash1,
|
|
40
|
+
hash2
|
|
41
|
+
};
|
|
31
42
|
};
|
|
32
43
|
this.readGrids = () => {
|
|
33
44
|
const grids = {};
|
|
34
|
-
const readGrid = (
|
|
35
|
-
const
|
|
36
|
-
const parentName = this.readString();
|
|
45
|
+
const readGrid = () => {
|
|
46
|
+
const gridName = this.readString();
|
|
37
47
|
const cellSize = this.readInt32();
|
|
38
48
|
const gridHash = this.readUint32();
|
|
39
|
-
grids[
|
|
49
|
+
grids[gridName] = { children: {}, cellSize, gridHash };
|
|
50
|
+
const childrenCount = this.readUint32();
|
|
40
51
|
for (let i = 0; i < childrenCount; i++) {
|
|
41
|
-
const cellBinSizeMaybe = this.readUint32();
|
|
42
52
|
const levelInstanceName = this.readString();
|
|
43
|
-
|
|
53
|
+
const cellBinHex = this.readUint32();
|
|
54
|
+
grids[gridName].children[levelInstanceName] = cellBinHex;
|
|
44
55
|
}
|
|
45
56
|
};
|
|
46
|
-
readGrid(
|
|
47
|
-
readGrid(
|
|
48
|
-
readGrid(
|
|
49
|
-
readGrid(
|
|
50
|
-
readGrid(
|
|
51
|
-
this.readInt32();
|
|
57
|
+
readGrid();
|
|
58
|
+
readGrid();
|
|
59
|
+
readGrid();
|
|
60
|
+
readGrid();
|
|
61
|
+
readGrid();
|
|
52
62
|
return grids;
|
|
53
63
|
};
|
|
54
64
|
}
|
|
@@ -160,10 +170,37 @@ class SaveReader extends byte_reader_class_1.ByteReader {
|
|
|
160
170
|
numChunks: currentChunks.length
|
|
161
171
|
};
|
|
162
172
|
}
|
|
173
|
+
readLevels() {
|
|
174
|
+
if (!this.header) {
|
|
175
|
+
throw new parser_error_1.ParserError('ParserError', 'Header must be set before objects can be read.');
|
|
176
|
+
}
|
|
177
|
+
const roughSaveVersion = SaveReader.GetRoughSaveVersion(this.header.saveVersion, this.header.saveHeaderType);
|
|
178
|
+
if (roughSaveVersion === '<U6') {
|
|
179
|
+
throw new parser_error_1.UnsupportedVersionError('Game Version < U6 is not supported.');
|
|
180
|
+
}
|
|
181
|
+
else if (roughSaveVersion === 'U6/U7') {
|
|
182
|
+
throw new parser_error_1.UnsupportedVersionError('Game Version U6/U7 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.0.34');
|
|
183
|
+
}
|
|
184
|
+
else if (roughSaveVersion === 'U8') {
|
|
185
|
+
throw new parser_error_1.UnsupportedVersionError('Game Version U8 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.3.7');
|
|
186
|
+
}
|
|
187
|
+
const levels = [];
|
|
188
|
+
const levelCount = this.readInt32();
|
|
189
|
+
this.onProgressCallback(this.getBufferProgress(), `reading pack of ${levelCount + 1} levels.`);
|
|
190
|
+
for (let i = 0; i <= levelCount; i++) {
|
|
191
|
+
let levelSingleName = i === levelCount ? this.header.mapName : this.readString();
|
|
192
|
+
if (i % 500 === 0) {
|
|
193
|
+
this.onProgressCallback(this.getBufferProgress(), `reading level [${(i + 1)}/${(levelCount + 1)}] ${levelSingleName}`);
|
|
194
|
+
}
|
|
195
|
+
levels.push(level_class_1.Level.ReadLevel(this, levelSingleName, this.header.buildVersion));
|
|
196
|
+
}
|
|
197
|
+
this.onProgressCallback(this.getBufferProgress(), 'finished parsing.');
|
|
198
|
+
return levels;
|
|
199
|
+
}
|
|
163
200
|
}
|
|
164
201
|
exports.SaveReader = SaveReader;
|
|
165
202
|
SaveReader.EPOCH_TICKS = 621355968000000000n;
|
|
166
|
-
SaveReader.
|
|
203
|
+
SaveReader.GetRoughSaveVersion = (saveVersion, headerTypeVersion) => {
|
|
167
204
|
if (saveVersion >= 46) {
|
|
168
205
|
return 'U1.0+';
|
|
169
206
|
}
|
|
@@ -177,3 +214,4 @@ SaveReader.getRoughSaveVersion = (saveVersion, headerTypeVersion) => {
|
|
|
177
214
|
return '<U6';
|
|
178
215
|
}
|
|
179
216
|
};
|
|
217
|
+
//# sourceMappingURL=save-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-reader.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/save-reader.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport Pako from \"pako\";\nimport { Alignment } from \"../../byte/alignment.enum\";\nimport { ByteReader } from \"../../byte/byte-reader.class\";\nimport { CompressionLibraryError, CorruptSaveError, ParserError, UnsupportedVersionError } from \"../../error/parser.error\";\nimport { ChunkCompressionInfo } from \"../../file.types\";\nimport { MD5Hash } from '../types/structs/MD5Hash';\nimport { Level } from './level.class';\nimport { RoughSaveVersion, SatisfactorySaveHeader } from \"./save.types\";\n\nexport const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;\n\nexport type ByteArray4 = [number, number, number, number];\n\nexport type SaveBodyValidation = {\n\tversion: number;\n\thash1: ByteArray4;\n\thash2: ByteArray4;\n}\n\nexport type Grids = {\n\t[parentName: string]: {\n\t\tcellSize: number;\n\t\tgridHash: number;\n\t\tchildren: {\n\t\t\t[name: string]: number;\t// children object contains names and their binary size.\n\t\t}\n\t}\n};\n\nexport class SaveReader extends ByteReader {\n\n\tpublic header: SatisfactorySaveHeader | undefined;\n\tpublic compressionInfo: ChunkCompressionInfo = {\n\t\tpackageFileTag: 0,\n\t\tmaxUncompressedChunkContentSize: 0,\n\t\tchunkHeaderSize: DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE\n\t};\n\n\t// the number of .net ticks at the unix epoch\n\tpublic static readonly EPOCH_TICKS = 621355968000000000n;\n\n\tconstructor(fileBuffer: ArrayBuffer, public onProgressCallback: (progress: number, msg?: string) => void = () => { }) {\n\t\tsuper(fileBuffer, Alignment.LITTLE_ENDIAN);\n\t}\n\n\tpublic expect = (value: any, expected: any) => {\n\t\tif (value !== expected) {\n\t\t\tconsole.warn(`Read a value that's usually ${expected}, but this time ${value}. Meaning unclear. Raise an issue or contact me if you want.`);\n\t\t}\n\t};\n\n\tpublic readHeader(): SatisfactorySaveHeader {\n\t\tthis.header = {\n\t\t\tsaveHeaderType: 0,\n\t\t\tsaveVersion: 0,\n\t\t\tbuildVersion: 0,\n\t\t\tmapName: \"DEFAULT\",\n\t\t\tmapOptions: \"\",\n\t\t\tsessionName: \"\",\n\t\t\tplayDurationSeconds: 0,\n\t\t\tsaveDateTime: \"0\",\n\t\t\tsessionVisibility: 0\n\t\t} as SatisfactorySaveHeader;\n\n\t\tthis.header.saveHeaderType = this.readInt32();\n\t\tthis.header.saveVersion = this.readInt32();\n\t\tthis.header.buildVersion = this.readInt32();\n\t\tthis.header.mapName = this.readString();\n\t\tthis.header.mapOptions = this.readString();\n\t\tthis.header.sessionName = this.readString();\n\t\tthis.header.playDurationSeconds = this.readInt32();\n\t\tconst rawSaveDateTimeInTicks = this.readLong();\t// in UTC it seems.\n\t\tconst unixMilliseconds = (rawSaveDateTimeInTicks - SaveReader.EPOCH_TICKS) / 10000n;\n\t\tthis.header.saveDateTime = unixMilliseconds.toString();\n\t\tthis.header.sessionVisibility = this.readByte();\n\n\t\tif (this.header.saveHeaderType >= 7) {\n\t\t\tthis.header.fEditorObjectVersion = this.readInt32();\n\t\t}\n\t\tif (this.header.saveHeaderType >= 8) {\n\t\t\tthis.header.rawModMetadataString = this.readString();\n\t\t\ttry {\n\t\t\t\tthis.header.modMetadata = JSON.parse(this.header.rawModMetadataString);\n\t\t\t} catch (error) {\n\t\t\t\t// ignore.\n\t\t\t}\n\t\t\tthis.header.isModdedSave = this.readInt32();\n\t\t}\n\n\t\t//10 is U7\n\t\tif (this.header.saveHeaderType >= 10) {\n\t\t\tthis.header.saveIdentifier = this.readString();\n\t\t}\n\n\t\t// U8 jumped directly to 13.\n\t\tif (this.header.saveHeaderType >= 11) {\n\t\t\tthis.header.partitionEnabledFlag = this.readInt32() === 1;\n\t\t}\n\n\t\tif (this.header.saveHeaderType >= 12) {\n\t\t\tthis.header.consistencyHashBytes = MD5Hash.read(this);\n\t\t}\n\n\t\t// 13 is U8 Experimental, Also First 1.0 Release\n\t\tif (this.header.saveHeaderType >= 13) {\n\t\t\tthis.header.creativeModeEnabled = this.readInt32() == 1;\n\t\t}\n\n\t\tif (this.header.saveVersion >= 21) {\n\t\t\t// all good, ready to read chunks now.\n\t\t} else {\n\t\t\tthrow new UnsupportedVersionError(\"The save version is too old to support encoding currently. Save in newer game version.\");\n\t\t}\n\n\t\treturn this.header;\n\t}\n\n\tpublic static GetRoughSaveVersion = (saveVersion: number, headerTypeVersion: number): RoughSaveVersion => {\n\t\tif (saveVersion >= 46) {\n\t\t\treturn 'U1.0+';\n\t\t} else if (headerTypeVersion >= 13) {\n\t\t\treturn 'U8';\n\t\t} else if (saveVersion >= 29) {\n\t\t\treturn 'U6/U7';\n\t\t} else {\n\t\t\treturn '<U6';\n\t\t}\n\t}\n\n\tpublic inflateChunks(): { concatenatedChunkLength: number, numChunks: number } {\n\n\t\t// free memory\n\t\tthis.fileBuffer = this.fileBuffer.slice(this.currentByte);\n\n\t\tthis.handledByte = 0;\n\t\tthis.currentByte = 0;\n\t\tthis.maxByte = this.fileBuffer.byteLength;\n\n\n\t\tlet currentChunks = [];\n\t\tlet totalUncompressedBodySize = 0;\n\n\t\t// read while we can handle\n\t\twhile (this.handledByte < this.maxByte) {\n\n\t\t\t// Read chunk info size...\n\t\t\tlet chunkHeader = new DataView(this.fileBuffer.slice(0, this.compressionInfo.chunkHeaderSize));\n\t\t\tthis.currentByte = this.compressionInfo.chunkHeaderSize;\n\t\t\tthis.handledByte += this.compressionInfo.chunkHeaderSize;\n\n\n\t\t\tif (this.compressionInfo.packageFileTag <= 0) {\n\t\t\t\t// Should always be 0xC1832A9E in LE\n\t\t\t\tthis.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\t}\n\t\t\tif (this.compressionInfo.maxUncompressedChunkContentSize <= 0) {\n\t\t\t\t// should always be 0x00000200 in LE\n\t\t\t\tthis.compressionInfo.maxUncompressedChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\t}\n\n\t\t\tconst chunkCompressedLength = chunkHeader.getInt32(33, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\tconst chunkUncompressedLength = chunkHeader.getInt32(25, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\ttotalUncompressedBodySize += chunkUncompressedLength;\n\n\t\t\tconst currentChunkSize = chunkCompressedLength;\n\t\t\tlet currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);\n\t\t\tthis.handledByte += currentChunkSize;\n\t\t\tthis.currentByte += currentChunkSize;\n\n\n\t\t\t// Free memory from previous chunk...\n\t\t\tthis.fileBuffer = this.fileBuffer.slice(this.currentByte);\n\t\t\tthis.currentByte = 0;\n\n\t\t\t// unzip current chunk\n\t\t\ttry {\n\t\t\t\tlet currentInflatedChunk = null;\n\t\t\t\tcurrentInflatedChunk = Pako.inflate(currentChunk);\n\t\t\t\tcurrentChunks.push(currentInflatedChunk);\n\t\t\t}\n\t\t\tcatch (err: any) {\n\t\t\t\tthrow new CompressionLibraryError(\"Failed to inflate compressed save data. \" + err);\n\t\t\t}\n\t\t}\n\n\t\t//TODO we can get rid of file buffer here.\n\n\t\t// Create one big chunk out of the little chunks\n\t\tlet newChunkLength = currentChunks.map<number>(cc => cc.length).reduce((prev, cur) => prev + cur);\n\t\tconst bigWholeChunk = new Uint8Array(newChunkLength);\n\t\tlet currentLength = 0;\n\t\tfor (let i = 0; i < currentChunks.length; i++) {\n\t\t\tbigWholeChunk.set(currentChunks[i], currentLength);\n\t\t\tcurrentLength += currentChunks[i].length;\n\t\t}\n\n\t\tthis.currentByte = 0;\n\t\tthis.maxByte = bigWholeChunk.buffer.byteLength;\n\t\tthis.bufferView = new DataView(bigWholeChunk.buffer);\n\n\t\tconst dataLength = this.readInt32();\n\t\tif (totalUncompressedBodySize !== dataLength + 8) {\n\t\t\tthrow new CorruptSaveError(`Possibly corrupt. Indicated size of total save body (${dataLength + 8}) does not match the uncompressed real size of ${totalUncompressedBodySize}.`);\n\t\t}\n\n\t\treturn {\n\t\t\tconcatenatedChunkLength: newChunkLength,\n\t\t\tnumChunks: currentChunks.length\n\t\t};\n\t}\n\n\tpublic readSaveBodyHash = (): SaveBodyValidation => {\n\n\t\tthis.expect(this.readInt32(), 0);\n\n\t\tconst saveBodyValidationVersion = this.readInt32();\t// seems constant, always 06 00 00 00\n\n\t\tthis.expect(this.readString(), 'None');\n\t\tthis.expect(this.readInt32(), 0);\n\n\t\t// binary len maybe? But its not binary length of just grids, must be grids + levels?\n\t\tconst hash1 = Array.from(this.readBytes(4)) as ByteArray4;\t// some weird binary hash - 67 21 E7 F7 / DC 7E 81 48 / 59 E4 1E 1B -- changes not when collecting a slug or dismantling an object. Grids havent changed. So it must depend on grid-related things.\n\n\t\tthis.expect(this.readInt32(), 1);\n\t\tthis.expect(this.readString(), 'None');\n\n\t\t// TODO: check\n\t\tconst hash2 = Array.from(this.readBytes(4)) as ByteArray4;\t// no idea, changes somehow when level content changes. So we save it for now. -- 8B 08 EB 00\n\n\t\treturn {\n\t\t\tversion: saveBodyValidationVersion,\n\t\t\thash1,\n\t\t\thash2\n\t\t} satisfies SaveBodyValidation;\n\t}\n\n\tpublic readGrids = (): Grids => {\n\t\tconst grids: Grids = {};\n\n\t\tconst readGrid = () => {\n\t\t\tconst gridName = this.readString();\n\t\t\tconst cellSize = this.readInt32();\n\t\t\tconst gridHash = this.readUint32();\n\t\t\tgrids[gridName] = { children: {}, cellSize, gridHash };\n\n\t\t\tconst childrenCount = this.readUint32();\n\t\t\tfor (let i = 0; i < childrenCount; i++) {\n\t\t\t\tconst levelInstanceName = this.readString();\n\t\t\t\tconst cellBinHex = this.readUint32();\n\t\t\t\tgrids[gridName].children[levelInstanceName] = cellBinHex;\n\t\t\t}\n\t\t};\n\n\t\t// main grid\n\t\treadGrid();\n\n\t\t// landscape grid\n\t\treadGrid();\n\n\t\t// exploration grid\n\t\treadGrid();\n\n\t\t// foliage grid\n\t\treadGrid();\n\n\t\t// hlod0\n\t\treadGrid();\n\n\t\treturn grids;\n\t}\n\n\tpublic readLevels(): Level[] {\n\n\t\tif (!this.header) {\n\t\t\tthrow new ParserError('ParserError', 'Header must be set before objects can be read.');\n\t\t}\n\n\t\t// guard save version\n\t\tconst roughSaveVersion = SaveReader.GetRoughSaveVersion(this.header.saveVersion, this.header.saveHeaderType);\n\t\tif (roughSaveVersion === '<U6') {\n\t\t\tthrow new UnsupportedVersionError('Game Version < U6 is not supported.');\n\t\t} else if (roughSaveVersion === 'U6/U7') {\n\t\t\tthrow new UnsupportedVersionError('Game Version U6/U7 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.0.34');\n\t\t} else if (roughSaveVersion === 'U8') {\n\t\t\tthrow new UnsupportedVersionError('Game Version U8 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.3.7');\n\t\t}\n\n\t\tconst levels: Level[] = [];\n\t\tconst levelCount = this.readInt32();\n\t\tthis.onProgressCallback(this.getBufferProgress(), `reading pack of ${levelCount + 1} levels.`);\n\n\t\tfor (let i = 0; i <= levelCount; i++) {\n\t\t\tlet levelSingleName = i === levelCount ? this.header.mapName : this.readString();\n\t\t\tif (i % 500 === 0) {\n\t\t\t\tthis.onProgressCallback(this.getBufferProgress(), `reading level [${(i + 1)}/${(levelCount + 1)}] ${levelSingleName}`);\n\t\t\t}\n\n\t\t\tlevels.push(Level.ReadLevel(this, levelSingleName, this.header.buildVersion));\n\t\t}\n\n\t\tthis.onProgressCallback(this.getBufferProgress(), 'finished parsing.');\n\n\t\treturn levels;\n\t}\n}\n\n\n\n"]}
|
|
@@ -2,14 +2,15 @@ import { Alignment } from "../../byte/alignment.enum";
|
|
|
2
2
|
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
3
|
import { ChunkCompressionInfo, ChunkSummary } from "../../file.types";
|
|
4
4
|
import { SatisfactorySave } from "./satisfactory-save";
|
|
5
|
-
import {
|
|
5
|
+
import { Grids, SaveBodyValidation } from "./save-reader";
|
|
6
6
|
import { SatisfactorySaveHeader } from "./save.types";
|
|
7
7
|
export declare class SaveWriter extends ByteWriter {
|
|
8
8
|
constructor();
|
|
9
9
|
static WriteHeader(writer: ByteWriter, header: SatisfactorySaveHeader): void;
|
|
10
|
-
static WriteSaveBodyHash: (writer: ByteWriter,
|
|
10
|
+
static WriteSaveBodyHash: (writer: ByteWriter, saveBodyValidation: SaveBodyValidation) => void;
|
|
11
11
|
static WriteGrids: (writer: ByteWriter, grids: Grids) => void;
|
|
12
12
|
static WriteLevels(writer: ByteWriter, save: SatisfactorySave, buildVersion: number): void;
|
|
13
13
|
static GenerateCompressedChunksFromData(bufferArray: ArrayBuffer, compressionInfo: ChunkCompressionInfo, onBinaryBeforeCompressing: (binary: ArrayBuffer) => void, onChunk: (chunk: Uint8Array) => void, alignment?: Alignment): ChunkSummary[];
|
|
14
14
|
generateChunks(compressionInfo: ChunkCompressionInfo, posAfterHeader: number, onBinaryBeforeCompressing: (binary: ArrayBuffer) => void, onHeader: (header: Uint8Array) => void, onChunk: (chunk: Uint8Array) => void): ChunkSummary[];
|
|
15
15
|
}
|
|
16
|
+
//# sourceMappingURL=save-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-writer.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/save-writer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAGhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAc,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtD,qBAAa,UAAW,SAAQ,UAAU;;WAM3B,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAgDnF,OAAc,iBAAiB,WAAY,UAAU,sBAAsB,kBAAkB,KAAG,IAAI,CASnG;IAED,OAAc,UAAU,WAAY,UAAU,SAAS,KAAK,KAAG,IAAI,CAYjE;WAEY,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;WAUnF,gCAAgC,CAC7C,WAAW,EAAE,WAAW,EACxB,eAAe,EAAE,oBAAoB,EACrC,yBAAyB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,EACxD,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACpC,SAAS,GAAE,SAAmC,GAC5C,YAAY,EAAE;IA6DV,cAAc,CACpB,eAAe,EAAE,oBAAoB,EACrC,cAAc,EAAE,MAAM,EAEtB,yBAAyB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,EACxD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,EACtC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAClC,YAAY,EAAE;CAgBjB"}
|
|
@@ -66,7 +66,6 @@ class SaveWriter extends byte_writer_class_1.ByteWriter {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
static GenerateCompressedChunksFromData(bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, alignment = alignment_enum_1.Alignment.LITTLE_ENDIAN) {
|
|
69
|
-
const errors = [];
|
|
70
69
|
const totalUncompressedSize = bufferArray.byteLength;
|
|
71
70
|
const saveBody = new Uint8Array(bufferArray.byteLength + 8);
|
|
72
71
|
saveBody.set(new Uint8Array(bufferArray), 4);
|
|
@@ -122,25 +121,26 @@ class SaveWriter extends byte_writer_class_1.ByteWriter {
|
|
|
122
121
|
}
|
|
123
122
|
}
|
|
124
123
|
exports.SaveWriter = SaveWriter;
|
|
125
|
-
SaveWriter.WriteSaveBodyHash = (writer,
|
|
124
|
+
SaveWriter.WriteSaveBodyHash = (writer, saveBodyValidation) => {
|
|
126
125
|
writer.writeInt32(0);
|
|
127
|
-
writer.writeInt32(
|
|
126
|
+
writer.writeInt32(saveBodyValidation.version);
|
|
128
127
|
writer.writeString('None');
|
|
129
128
|
writer.writeInt32(0);
|
|
130
|
-
writer.writeBytesArray(
|
|
129
|
+
writer.writeBytesArray(saveBodyValidation.hash1);
|
|
131
130
|
writer.writeInt32(1);
|
|
132
131
|
writer.writeString('None');
|
|
132
|
+
writer.writeBytesArray(saveBodyValidation.hash2);
|
|
133
133
|
};
|
|
134
134
|
SaveWriter.WriteGrids = (writer, grids) => {
|
|
135
|
-
for (const
|
|
136
|
-
writer.
|
|
137
|
-
writer.
|
|
138
|
-
writer.
|
|
139
|
-
writer.writeUint32(
|
|
140
|
-
for (const child of Object.entries(
|
|
141
|
-
writer.writeUint32(child[1]);
|
|
135
|
+
for (const gridEntry of Object.entries(grids)) {
|
|
136
|
+
writer.writeString(gridEntry[0]);
|
|
137
|
+
writer.writeInt32(gridEntry[1].cellSize);
|
|
138
|
+
writer.writeUint32(gridEntry[1].gridHash);
|
|
139
|
+
writer.writeUint32(Object.values(gridEntry[1].children).length);
|
|
140
|
+
for (const child of Object.entries(gridEntry[1].children)) {
|
|
142
141
|
writer.writeString(child[0]);
|
|
142
|
+
writer.writeUint32(child[1]);
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
-
writer.writeInt32(0);
|
|
146
145
|
};
|
|
146
|
+
//# sourceMappingURL=save-writer.js.map
|