@etothepii/satisfactory-file-parser 0.0.11 → 0.0.13

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 ADDED
@@ -0,0 +1,41 @@
1
+ # Satisfactory File Parser
2
+ This is an NPM TypeScript Module to parse Satisfactory Files. Satisfactory is a game released by Coffee Stain Studios.
3
+
4
+ The Module is written entirely in TypeScript and comes with Type Definitions.
5
+
6
+ This parser can read, modify and write:
7
+ - Save Files `.sav`
8
+ - Blueprint Files `.sbp`, `.sbpcfg`
9
+
10
+ ## Supported Versions
11
+ Game Version Files of U5 and below are NOT supported. However, U6 and above is perfectly fine and parsable.
12
+ - ✅ U7
13
+ - ✅ U6
14
+ - ❌ <= U5
15
+
16
+ ### U8 is on the Horizon!
17
+ We can not promise that U8 saves will work out of the box!
18
+ If there will be changes, those will come very soon as soon as U8 is out on Experimental.
19
+
20
+ ## Installation via npm
21
+ `npm install @etothepii/satisfactory-file-parser`
22
+ ## Usage
23
+ Usage of the SaveParser is easy. For reading a save file, just pass a Buffer to it.
24
+ ```js
25
+ import { SaveParser } from "@etothepii/satisfactory-file-parser";
26
+
27
+ const file = fs.readFileSync('./MySave.sav') as Buffer;
28
+ const parsedSave = SaveParser.ParseSaveFile(file);
29
+ ```
30
+
31
+ Consequently, writing a parsed save file back is just as easy.
32
+ ```js
33
+ import { SaveParser } from "@etothepii/satisfactory-file-parser";
34
+
35
+ SaveParser.WriteSave(parsedSave);
36
+ ```
37
+
38
+ ## License
39
+ MIT
40
+
41
+ The module's code is free to use and open source.
package/build/index.d.ts CHANGED
@@ -3,9 +3,13 @@ export { DataFields } from './parser/satisfactory/objects/DataFields';
3
3
  export { ObjectReference } from './parser/satisfactory/objects/ObjectReference';
4
4
  export * from './parser/satisfactory/objects/Property';
5
5
  export { SaveComponent } from './parser/satisfactory/objects/SaveComponent';
6
+ export { SaveEntity } from './parser/satisfactory/objects/SaveEntity';
6
7
  export type * from './parser/satisfactory/satisfactory-save';
7
8
  export { StaticData } from './parser/satisfactory/static-data';
9
+ export { BlueprintConfigReader, BlueprintReader } from './parser/blueprint-reader';
10
+ export { BlueprintConfigWriter, BlueprintWriter } from './parser/blueprint-writer';
8
11
  export type * from './parser/satisfactory/structs/util.types';
9
- export { SaveEntity } from './parser/satisfactory/objects/SaveEntity';
12
+ export { SaveReader } from './parser/save-reader';
13
+ export { SaveWriter } from './parser/save-writer';
10
14
  export { CompressionLibraryError, CorruptSaveError, ParserError, UnsupportedVersionError } from './parser/error/parser.error';
11
15
  export { SaveParser } from './parser/parser';
package/build/index.js CHANGED
@@ -1,12 +1,49 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.SaveParser = exports.UnsupportedVersionError = exports.ParserError = exports.CorruptSaveError = exports.CompressionLibraryError = exports.SaveWriter = exports.SaveReader = exports.BlueprintWriter = exports.BlueprintConfigWriter = exports.BlueprintReader = exports.BlueprintConfigReader = exports.SaveEntity = exports.SaveComponent = exports.ObjectReference = exports.DataFields = exports.Level = void 0;
1
18
  // types & classes for convenience
2
- export { Level } from './parser/satisfactory/level.class';
3
- export { DataFields } from './parser/satisfactory/objects/DataFields';
4
- export { ObjectReference } from './parser/satisfactory/objects/ObjectReference';
5
- export * from './parser/satisfactory/objects/Property';
6
- export { SaveComponent } from './parser/satisfactory/objects/SaveComponent';
7
- // should better be removed
8
- export { SaveEntity } from './parser/satisfactory/objects/SaveEntity';
19
+ var level_class_1 = require("./parser/satisfactory/level.class");
20
+ Object.defineProperty(exports, "Level", { enumerable: true, get: function () { return level_class_1.Level; } });
21
+ var DataFields_1 = require("./parser/satisfactory/objects/DataFields");
22
+ Object.defineProperty(exports, "DataFields", { enumerable: true, get: function () { return DataFields_1.DataFields; } });
23
+ var ObjectReference_1 = require("./parser/satisfactory/objects/ObjectReference");
24
+ Object.defineProperty(exports, "ObjectReference", { enumerable: true, get: function () { return ObjectReference_1.ObjectReference; } });
25
+ __exportStar(require("./parser/satisfactory/objects/Property"), exports);
26
+ var SaveComponent_1 = require("./parser/satisfactory/objects/SaveComponent");
27
+ Object.defineProperty(exports, "SaveComponent", { enumerable: true, get: function () { return SaveComponent_1.SaveComponent; } });
28
+ var SaveEntity_1 = require("./parser/satisfactory/objects/SaveEntity");
29
+ Object.defineProperty(exports, "SaveEntity", { enumerable: true, get: function () { return SaveEntity_1.SaveEntity; } });
30
+ // should better be removed in a future update to prevent shenanigans.
31
+ var blueprint_reader_1 = require("./parser/blueprint-reader");
32
+ Object.defineProperty(exports, "BlueprintConfigReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintConfigReader; } });
33
+ Object.defineProperty(exports, "BlueprintReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintReader; } });
34
+ var blueprint_writer_1 = require("./parser/blueprint-writer");
35
+ Object.defineProperty(exports, "BlueprintConfigWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintConfigWriter; } });
36
+ Object.defineProperty(exports, "BlueprintWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintWriter; } });
37
+ var save_reader_1 = require("./parser/save-reader");
38
+ Object.defineProperty(exports, "SaveReader", { enumerable: true, get: function () { return save_reader_1.SaveReader; } });
39
+ var save_writer_1 = require("./parser/save-writer");
40
+ Object.defineProperty(exports, "SaveWriter", { enumerable: true, get: function () { return save_writer_1.SaveWriter; } });
9
41
  // errors
10
- export { CompressionLibraryError, CorruptSaveError, ParserError, UnsupportedVersionError } from './parser/error/parser.error';
42
+ var parser_error_1 = require("./parser/error/parser.error");
43
+ Object.defineProperty(exports, "CompressionLibraryError", { enumerable: true, get: function () { return parser_error_1.CompressionLibraryError; } });
44
+ Object.defineProperty(exports, "CorruptSaveError", { enumerable: true, get: function () { return parser_error_1.CorruptSaveError; } });
45
+ Object.defineProperty(exports, "ParserError", { enumerable: true, get: function () { return parser_error_1.ParserError; } });
46
+ Object.defineProperty(exports, "UnsupportedVersionError", { enumerable: true, get: function () { return parser_error_1.UnsupportedVersionError; } });
11
47
  // facade
12
- export { SaveParser } from './parser/parser';
48
+ var parser_1 = require("./parser/parser");
49
+ Object.defineProperty(exports, "SaveParser", { enumerable: true, get: function () { return parser_1.SaveParser; } });
@@ -1,12 +1,18 @@
1
- import Pako from "pako";
2
- import { Alignment } from "./byte/alignment.enum";
3
- import { ByteReader } from "./byte/byte-reader.class";
4
- import { ParserError } from "./error/parser.error";
5
- import { Level } from "./satisfactory/level.class";
6
- import { ParseCol4RGBA, ParseVec3 } from "./satisfactory/structs/util.types";
7
- export class BlueprintReader extends ByteReader {
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BlueprintConfigReader = exports.BlueprintReader = void 0;
7
+ const pako_1 = __importDefault(require("pako"));
8
+ const alignment_enum_1 = require("./byte/alignment.enum");
9
+ const byte_reader_class_1 = require("./byte/byte-reader.class");
10
+ const parser_error_1 = require("./error/parser.error");
11
+ const level_class_1 = require("./satisfactory/level.class");
12
+ const util_types_1 = require("./satisfactory/structs/util.types");
13
+ class BlueprintReader extends byte_reader_class_1.ByteReader {
8
14
  constructor(bluePrintBuffer) {
9
- super(bluePrintBuffer, Alignment.LITTLE_ENDIAN);
15
+ super(bluePrintBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
10
16
  this.compressionInfo = {
11
17
  packageFileTag: 0,
12
18
  maxChunkContentSize: 0,
@@ -15,7 +21,7 @@ export class BlueprintReader extends ByteReader {
15
21
  }
16
22
  static ReadHeader(reader) {
17
23
  const unk = reader.readBytes(3 * 4); // 02 00 00 00, 24 00 00 00, 7F 3B 03 00 - always
18
- const positionThingOrWhat = ParseVec3(reader); // 04 00 00 00, 04 00 00 00, 04 00 00 00 - always
24
+ const positionThingOrWhat = (0, util_types_1.ParseVec3)(reader); // 04 00 00 00, 04 00 00 00, 04 00 00 00 - always
19
25
  // list of item costs.
20
26
  let itemTypeCount = reader.readInt32();
21
27
  const itemCosts = new Array(itemTypeCount).fill(['', 0]);
@@ -53,13 +59,13 @@ export class BlueprintReader extends ByteReader {
53
59
  this.currentByte = this.compressionInfo.chunkHeaderSize;
54
60
  this.handledByte += this.compressionInfo.chunkHeaderSize;
55
61
  if (this.compressionInfo.packageFileTag <= 0) {
56
- this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === Alignment.LITTLE_ENDIAN);
62
+ this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
57
63
  }
58
64
  if (this.compressionInfo.maxChunkContentSize <= 0) {
59
- this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN); //00 00 02 00 = 131072
65
+ this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN); //00 00 02 00 = 131072
60
66
  }
61
- const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment === Alignment.LITTLE_ENDIAN);
62
- const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment === Alignment.LITTLE_ENDIAN);
67
+ const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
68
+ const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
63
69
  totalUncompressedBodySize += chunkUncompressedLength;
64
70
  const currentChunkSize = chunkCompressedLength;
65
71
  let currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);
@@ -71,11 +77,11 @@ export class BlueprintReader extends ByteReader {
71
77
  try {
72
78
  // Inflate current chunk
73
79
  let currentInflatedChunk = null;
74
- currentInflatedChunk = Pako.inflate(currentChunk);
80
+ currentInflatedChunk = pako_1.default.inflate(currentChunk);
75
81
  currentChunks.push(currentInflatedChunk);
76
82
  }
77
83
  catch (err) {
78
- throw new ParserError('ParserError', 'An error occurred while calling pako inflate.' + err);
84
+ throw new parser_error_1.ParserError('ParserError', 'An error occurred while calling pako inflate.' + err);
79
85
  }
80
86
  }
81
87
  //TODO we can get rid of file buffer here.
@@ -102,15 +108,16 @@ export class BlueprintReader extends ByteReader {
102
108
  // object headers
103
109
  const objectHeadersBinarySize = reader.readInt32();
104
110
  let objects = [];
105
- Level.ReadObjectHeaders(reader, objects, () => { });
111
+ level_class_1.Level.ReadObjectHeaders(reader, objects, () => { });
106
112
  // objects contents
107
- Level.ReadObjectContents(reader, objects, 0, () => { });
113
+ level_class_1.Level.ReadObjectContents(reader, objects, 0, () => { });
108
114
  return objects;
109
115
  }
110
116
  }
111
- export class BlueprintConfigReader extends ByteReader {
117
+ exports.BlueprintReader = BlueprintReader;
118
+ class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
112
119
  constructor(bluePrintConfigBuffer) {
113
- super(bluePrintConfigBuffer, Alignment.LITTLE_ENDIAN);
120
+ super(bluePrintConfigBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
114
121
  this.bluePrintConfigBuffer = bluePrintConfigBuffer;
115
122
  this.parse = () => BlueprintConfigReader.ParseConfig(this);
116
123
  }
@@ -118,7 +125,7 @@ export class BlueprintConfigReader extends ByteReader {
118
125
  const unk = reader.readInt32(); // unknown, seems to always be 02.
119
126
  const description = reader.readString();
120
127
  const unk3 = reader.readInt32(); // iconID. default is 0x0E03 = 782
121
- const colorMaybe = ParseCol4RGBA(reader); // LinearColor, which is 4x float32 as RGBA
128
+ const colorMaybe = (0, util_types_1.ParseCol4RGBA)(reader); // LinearColor, which is 4x float32 as RGBA
122
129
  return {
123
130
  description,
124
131
  color: colorMaybe,
@@ -126,3 +133,4 @@ export class BlueprintConfigReader extends ByteReader {
126
133
  };
127
134
  }
128
135
  }
136
+ exports.BlueprintConfigReader = BlueprintConfigReader;
@@ -1,12 +1,15 @@
1
- import { Level } from "../parser/satisfactory/level.class";
2
- import { SerializeCol4RGBA } from "../parser/satisfactory/structs/util.types";
3
- import { Alignment } from "./byte/alignment.enum";
4
- import { ByteWriter } from "./byte/byte-writer.class";
5
- import { ParserError } from "./error/parser.error";
6
- import { SaveWriter } from "./save-writer";
7
- export class BlueprintWriter extends ByteWriter {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlueprintConfigWriter = exports.BlueprintWriter = void 0;
4
+ const level_class_1 = require("../parser/satisfactory/level.class");
5
+ const util_types_1 = require("../parser/satisfactory/structs/util.types");
6
+ const alignment_enum_1 = require("./byte/alignment.enum");
7
+ const byte_writer_class_1 = require("./byte/byte-writer.class");
8
+ const parser_error_1 = require("./error/parser.error");
9
+ const save_writer_1 = require("./save-writer");
10
+ class BlueprintWriter extends byte_writer_class_1.ByteWriter {
8
11
  constructor() {
9
- super(Alignment.LITTLE_ENDIAN);
12
+ super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
10
13
  }
11
14
  static SerializeHeader(writer, header) {
12
15
  writer.writeInt32(2); // unknown, seems to always be 02.
@@ -32,33 +35,35 @@ export class BlueprintWriter extends ByteWriter {
32
35
  }
33
36
  generateChunks(compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
34
37
  if (posAfterHeader <= 0) {
35
- throw new ParserError('ParserError', 'seems like this buffer has no header. Please write the header first before you can generate chunks.');
38
+ throw new parser_error_1.ParserError('ParserError', 'seems like this buffer has no header. Please write the header first before you can generate chunks.');
36
39
  }
37
40
  // send plain header first.
38
41
  const header = new Uint8Array(this.bufferArray.slice(0, posAfterHeader));
39
42
  onHeader(header);
40
43
  // create save body
41
44
  this.bufferArray = this.bufferArray.slice(posAfterHeader);
42
- SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, this.alignment);
45
+ save_writer_1.SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, this.alignment);
43
46
  }
44
47
  static SerializeObjects(writer, objects) {
45
48
  // object headers
46
49
  const headersLenIndicator = writer.getBufferPosition();
47
50
  writer.writeInt32(0);
48
- Level.SerializeObjectHeaders(writer, objects);
51
+ level_class_1.Level.SerializeObjectHeaders(writer, objects);
49
52
  writer.writeBinarySizeFromPosition(headersLenIndicator, headersLenIndicator + 4);
50
53
  // objects contents
51
- Level.SerializeObjectContents(writer, objects, 0);
54
+ level_class_1.Level.SerializeObjectContents(writer, objects, 0);
52
55
  }
53
56
  }
54
- export class BlueprintConfigWriter extends ByteWriter {
57
+ exports.BlueprintWriter = BlueprintWriter;
58
+ class BlueprintConfigWriter extends byte_writer_class_1.ByteWriter {
55
59
  constructor() {
56
- super(Alignment.LITTLE_ENDIAN);
60
+ super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
57
61
  }
58
62
  static SerializeConfig(writer, config) {
59
63
  writer.writeInt32(2); // unknown, seems to always be 02.
60
64
  writer.writeString(config.description);
61
65
  writer.writeInt32(config.iconID);
62
- SerializeCol4RGBA(writer, config.color);
66
+ (0, util_types_1.SerializeCol4RGBA)(writer, config.color);
63
67
  }
64
68
  }
69
+ exports.BlueprintConfigWriter = BlueprintConfigWriter;
@@ -1,5 +1,8 @@
1
- export var Alignment;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Alignment = void 0;
4
+ var Alignment;
2
5
  (function (Alignment) {
3
6
  Alignment[Alignment["BIG_ENDIAN"] = 0] = "BIG_ENDIAN";
4
7
  Alignment[Alignment["LITTLE_ENDIAN"] = 1] = "LITTLE_ENDIAN";
5
- })(Alignment || (Alignment = {}));
8
+ })(Alignment = exports.Alignment || (exports.Alignment = {}));
@@ -1,5 +1,8 @@
1
- import { Alignment } from "./alignment.enum";
2
- export class ByteReader {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ByteReader = void 0;
4
+ const alignment_enum_1 = require("./alignment.enum");
5
+ class ByteReader {
3
6
  constructor(fileBuffer, alignment) {
4
7
  this.currentByte = 0;
5
8
  this.handledByte = 0;
@@ -54,32 +57,32 @@ export class ByteReader {
54
57
  return data;
55
58
  }
56
59
  readUint16() {
57
- let data = this.bufferView.getUint16(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
60
+ let data = this.bufferView.getUint16(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
58
61
  this.currentByte += 2;
59
62
  return data;
60
63
  }
61
64
  readInt32() {
62
- let data = this.bufferView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
65
+ let data = this.bufferView.getInt32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
63
66
  this.currentByte += 4;
64
67
  return data;
65
68
  }
66
69
  readUint32() {
67
- let data = this.bufferView.getUint32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
70
+ let data = this.bufferView.getUint32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
68
71
  this.currentByte += 4;
69
72
  return data;
70
73
  }
71
74
  readLong() {
72
- let data = this.bufferView.getBigInt64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
75
+ let data = this.bufferView.getBigInt64(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
73
76
  this.currentByte += 8;
74
77
  return data;
75
78
  }
76
79
  readFloat() {
77
- let data = this.bufferView.getFloat32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
80
+ let data = this.bufferView.getFloat32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
78
81
  this.currentByte += 4;
79
82
  return data;
80
83
  }
81
84
  readDouble() {
82
- let data = this.bufferView.getFloat64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
85
+ let data = this.bufferView.getFloat64(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
83
86
  this.currentByte += 8;
84
87
  return data;
85
88
  }
@@ -87,7 +90,7 @@ export class ByteReader {
87
90
  let payload = '';
88
91
  let counter = this.currentByte;
89
92
  try {
90
- let strLength = this.bufferView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
93
+ let strLength = this.bufferView.getInt32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
91
94
  counter += 4;
92
95
  payload = new Array(strLength - 1).fill('').map(c => String.fromCharCode(this.bufferView.getUint8(counter++))).join('');
93
96
  }
@@ -126,3 +129,4 @@ export class ByteReader {
126
129
  }
127
130
  }
128
131
  }
132
+ exports.ByteReader = ByteReader;
@@ -1,4 +1,7 @@
1
- import { Alignment } from "./alignment.enum";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ByteWriter = void 0;
4
+ const alignment_enum_1 = require("./alignment.enum");
2
5
  class ByteWriter {
3
6
  constructor(alignment, bufferSize = 500) {
4
7
  this.getBufferPosition = () => this.currentByte;
@@ -41,42 +44,42 @@ class ByteWriter {
41
44
  }
42
45
  writeInt16(value) {
43
46
  this.extendBufferIfNeeded(2);
44
- this.bufferView.setInt16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
47
+ this.bufferView.setInt16(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
45
48
  this.currentByte += 2;
46
49
  }
47
50
  writeUint16(value) {
48
51
  this.extendBufferIfNeeded(2);
49
- this.bufferView.setUint16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
52
+ this.bufferView.setUint16(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
50
53
  this.currentByte += 2;
51
54
  }
52
55
  writeInt32(value) {
53
56
  this.extendBufferIfNeeded(4);
54
- this.bufferView.setInt32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
57
+ this.bufferView.setInt32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
55
58
  this.currentByte += 4;
56
59
  }
57
60
  writeUint32(value) {
58
61
  this.extendBufferIfNeeded(4);
59
- this.bufferView.setUint32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
62
+ this.bufferView.setUint32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
60
63
  this.currentByte += 4;
61
64
  }
62
65
  writeInt64(value) {
63
66
  this.extendBufferIfNeeded(8);
64
- this.bufferView.setBigInt64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
67
+ this.bufferView.setBigInt64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
65
68
  this.currentByte += 8;
66
69
  }
67
70
  writeUint64(value) {
68
71
  this.extendBufferIfNeeded(8);
69
- this.bufferView.setBigUint64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
72
+ this.bufferView.setBigUint64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
70
73
  this.currentByte += 8;
71
74
  }
72
75
  writeFloat(value) {
73
76
  this.extendBufferIfNeeded(4);
74
- this.bufferView.setFloat32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
77
+ this.bufferView.setFloat32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
75
78
  this.currentByte += 4;
76
79
  }
77
80
  writeDouble(value) {
78
81
  this.extendBufferIfNeeded(8);
79
- this.bufferView.setFloat64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
82
+ this.bufferView.setFloat64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
80
83
  this.currentByte += 8;
81
84
  }
82
85
  writeString(value) {
@@ -143,4 +146,4 @@ class ByteWriter {
143
146
  ;
144
147
  }
145
148
  ByteWriter.IsASCIICompatible = (value) => /^[\x00-\x7F]*$/.test(value);
146
- export { ByteWriter };
149
+ exports.ByteWriter = ByteWriter;
@@ -1,21 +1,28 @@
1
- export class ParserError extends Error {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompressionLibraryError = exports.CorruptSaveError = exports.UnsupportedVersionError = exports.ParserError = void 0;
4
+ class ParserError extends Error {
2
5
  constructor(name, message) {
3
6
  super(message);
4
7
  this.name = name;
5
8
  }
6
9
  }
7
- export class UnsupportedVersionError extends ParserError {
10
+ exports.ParserError = ParserError;
11
+ class UnsupportedVersionError extends ParserError {
8
12
  constructor(message) {
9
13
  super('UnsupportedVersionError', message ?? 'This save version is not supported.');
10
14
  }
11
15
  }
12
- export class CorruptSaveError extends ParserError {
16
+ exports.UnsupportedVersionError = UnsupportedVersionError;
17
+ class CorruptSaveError extends ParserError {
13
18
  constructor(message) {
14
19
  super('CorruptSaveError', message ?? 'This save data is most likely corrupt.');
15
20
  }
16
21
  }
17
- export class CompressionLibraryError extends ParserError {
22
+ exports.CorruptSaveError = CorruptSaveError;
23
+ class CompressionLibraryError extends ParserError {
18
24
  constructor(message) {
19
25
  super('CompressionLibraryError', message ?? 'Failed to compress/decompress save data.');
20
26
  }
21
27
  }
28
+ exports.CompressionLibraryError = CompressionLibraryError;
@@ -1,7 +1,10 @@
1
- import { Level } from "./satisfactory/level.class";
2
- import { SatisfactorySave } from "./satisfactory/satisfactory-save";
3
- import { SaveReader, projectionFilterApplies } from "./save-reader";
4
- import { SaveWriter } from "./save-writer";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SaveParser = void 0;
4
+ const level_class_1 = require("./satisfactory/level.class");
5
+ const satisfactory_save_1 = require("./satisfactory/satisfactory-save");
6
+ const save_reader_1 = require("./save-reader");
7
+ const save_writer_1 = require("./save-writer");
5
8
  class SaveParser {
6
9
  /**
7
10
  * serializes a save file into binary and reports back on individual callbacks.
@@ -12,10 +15,10 @@ class SaveParser {
12
15
  * @param onFinish gets called when all chunks have been generated. A summary of the chunk sizes and count is reported.
13
16
  */
14
17
  static WriteSave(save, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
15
- const writer = new SaveWriter();
16
- SaveWriter.WriteHeader(writer, save.header);
18
+ const writer = new save_writer_1.SaveWriter();
19
+ save_writer_1.SaveWriter.WriteHeader(writer, save.header);
17
20
  const posAfterHeader = writer.getBufferPosition();
18
- SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
21
+ save_writer_1.SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
19
22
  writer.endWriting();
20
23
  writer.generateChunks(save.compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish);
21
24
  }
@@ -27,10 +30,10 @@ class SaveParser {
27
30
  * @returns a brief summary
28
31
  */
29
32
  static ParseSaveFile(file, onSaveDecompressed = () => { }, onProgress = () => { }) {
30
- const reader = new SaveReader(file.buffer, onProgress);
33
+ const reader = new save_reader_1.SaveReader(file.buffer, onProgress);
31
34
  // read header
32
35
  const header = reader.readHeader();
33
- const save = new SatisfactorySave(header);
36
+ const save = new satisfactory_save_1.SatisfactorySave(header);
34
37
  // inflate chunks
35
38
  const inflateResult = reader.inflateChunks();
36
39
  // call callback on decompressed save body
@@ -53,9 +56,9 @@ class SaveParser {
53
56
  header: save.header,
54
57
  trailingCollectedObjects: save.trailingCollectedObjects,
55
58
  levels: save.levels.map(level => {
56
- const lvl = new Level(level.name);
59
+ const lvl = new level_class_1.Level(level.name);
57
60
  lvl.collectables = level.collectables;
58
- lvl.objects = level.objects.filter(obj => projectionFilterApplies(config, obj));
61
+ lvl.objects = level.objects.filter(obj => (0, save_reader_1.projectionFilterApplies)(config, obj));
59
62
  return lvl;
60
63
  })
61
64
  };
@@ -78,4 +81,4 @@ SaveParser.JSONStringifyModified = (obj, indent = 0) => JSON.stringify(obj, (key
78
81
  }
79
82
  return value;
80
83
  }, indent);
81
- export { SaveParser };
84
+ exports.SaveParser = SaveParser;
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,7 +1,10 @@
1
- import { ObjectReference } from "./objects/ObjectReference";
2
- import { isSaveComponent, SaveComponent } from "./objects/SaveComponent";
3
- import { isSaveEntity, SaveEntity } from "./objects/SaveEntity";
4
- export class Level {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Level = void 0;
4
+ const ObjectReference_1 = require("./objects/ObjectReference");
5
+ const SaveComponent_1 = require("./objects/SaveComponent");
6
+ const SaveEntity_1 = require("./objects/SaveEntity");
7
+ class Level {
5
8
  constructor(name) {
6
9
  this.name = name;
7
10
  this.objects = [];
@@ -12,12 +15,12 @@ export class Level {
12
15
  for (const obj of objects) {
13
16
  switch (obj.type) {
14
17
  case 'SaveEntity':
15
- writer.writeInt32(SaveEntity.TypeID);
16
- SaveEntity.SerializeHeader(writer, obj);
18
+ writer.writeInt32(SaveEntity_1.SaveEntity.TypeID);
19
+ SaveEntity_1.SaveEntity.SerializeHeader(writer, obj);
17
20
  break;
18
21
  case 'SaveComponent':
19
- writer.writeInt32(SaveComponent.TypeID);
20
- SaveComponent.SerializeHeader(writer, obj);
22
+ writer.writeInt32(SaveComponent_1.SaveComponent.TypeID);
23
+ SaveComponent_1.SaveComponent.SerializeHeader(writer, obj);
21
24
  break;
22
25
  default:
23
26
  console.log('Unknown object type', obj);
@@ -43,11 +46,11 @@ export class Level {
43
46
  for (const obj of objects) {
44
47
  const lenReplacementPosition = writer.getBufferPosition();
45
48
  writer.writeInt32(0);
46
- if (isSaveEntity(obj)) {
47
- SaveEntity.SerializeData(writer, obj, buildVersion);
49
+ if ((0, SaveEntity_1.isSaveEntity)(obj)) {
50
+ SaveEntity_1.SaveEntity.SerializeData(writer, obj, buildVersion);
48
51
  }
49
- else if (isSaveComponent(obj)) {
50
- SaveComponent.SerializeData(writer, obj, buildVersion);
52
+ else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
53
+ SaveComponent_1.SaveComponent.SerializeData(writer, obj, buildVersion);
51
54
  }
52
55
  writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
53
56
  }
@@ -61,14 +64,14 @@ export class Level {
61
64
  }
62
65
  let objectType = reader.readInt32();
63
66
  switch (objectType) {
64
- case SaveEntity.TypeID:
65
- let object = new SaveEntity('', '', '', '');
66
- SaveEntity.ParseHeader(reader, object);
67
+ case SaveEntity_1.SaveEntity.TypeID:
68
+ let object = new SaveEntity_1.SaveEntity('', '', '', '');
69
+ SaveEntity_1.SaveEntity.ParseHeader(reader, object);
67
70
  objectsList.push(object);
68
71
  break;
69
- case SaveComponent.TypeID:
70
- let component = new SaveComponent('', '', '', '');
71
- SaveComponent.ParseHeader(reader, component);
72
+ case SaveComponent_1.SaveComponent.TypeID:
73
+ let component = new SaveComponent_1.SaveComponent('', '', '', '');
74
+ SaveComponent_1.SaveComponent.ParseHeader(reader, component);
72
75
  objectsList.push(component);
73
76
  break;
74
77
  default:
@@ -92,11 +95,11 @@ export class Level {
92
95
  const len = reader.readInt32();
93
96
  const before = reader.getBufferPosition();
94
97
  const obj = objectsList[i];
95
- if (isSaveEntity(obj)) {
96
- SaveEntity.ParseData(obj, len, reader, buildVersion);
98
+ if ((0, SaveEntity_1.isSaveEntity)(obj)) {
99
+ SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion);
97
100
  }
98
- else if (isSaveComponent(obj)) {
99
- SaveComponent.ParseData(obj, len, reader, buildVersion);
101
+ else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
102
+ SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion);
100
103
  }
101
104
  const after = reader.getBufferPosition();
102
105
  if (after - before !== len) {
@@ -128,7 +131,7 @@ export class Level {
128
131
  static SerializeCollectablesList(writer, collectables) {
129
132
  writer.writeInt32(collectables.length);
130
133
  for (const collectable of collectables) {
131
- ObjectReference.Serialize(writer, collectable);
134
+ ObjectReference_1.ObjectReference.Serialize(writer, collectable);
132
135
  }
133
136
  }
134
137
  // collected stuff
@@ -136,9 +139,10 @@ export class Level {
136
139
  let countCollected = reader.readInt32();
137
140
  const collected = [];
138
141
  for (let i = 0; i < countCollected; i++) {
139
- const collectable = ObjectReference.Parse(reader);
142
+ const collectable = ObjectReference_1.ObjectReference.Parse(reader);
140
143
  collected.push(collectable);
141
144
  }
142
145
  return collected;
143
146
  }
144
147
  }
148
+ exports.Level = Level;