@etothepii/satisfactory-file-parser 0.0.3 → 0.0.4
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/build/index.d.ts +4 -0
- package/build/index.js +7 -0
- package/build/parser/blueprint-reader.d.ts +2 -2
- package/build/parser/blueprint-reader.js +20 -29
- package/build/parser/blueprint-writer.d.ts +2 -2
- package/build/parser/blueprint-writer.js +15 -21
- package/build/parser/byte/alignment.enum.js +2 -6
- package/build/parser/byte/byte-reader.class.js +9 -14
- package/build/parser/byte/byte-writer.class.js +10 -14
- package/build/parser/error/parser.error.js +4 -12
- package/build/parser/{parser.class.d.ts → parser.d.ts} +0 -8
- package/build/parser/{parser.class.js → parser.js} +12 -16
- package/build/parser/satisfactory/blueprint/blueprint.js +1 -0
- package/build/parser/satisfactory/level.class.js +24 -29
- package/build/parser/satisfactory/objects/DataFields.d.ts +1 -1
- package/build/parser/satisfactory/objects/DataFields.js +72 -77
- package/build/parser/satisfactory/objects/ObjectReference.js +1 -6
- package/build/parser/satisfactory/objects/Property.d.ts +1 -1
- package/build/parser/satisfactory/objects/Property.js +87 -119
- package/build/parser/satisfactory/objects/SaveComponent.js +7 -12
- package/build/parser/satisfactory/objects/SaveEntity.js +13 -18
- package/build/parser/satisfactory/objects/SaveObject.js +5 -10
- package/build/parser/satisfactory/satisfactory-save.class.js +1 -6
- package/build/parser/{static-data.d.ts → satisfactory/static-data.d.ts} +1 -1
- package/build/parser/satisfactory/static-data.js +1 -0
- package/build/parser/satisfactory/structs/util.types.js +27 -48
- package/build/parser/save-reader.d.ts +1 -1
- package/build/parser/save-reader.js +26 -35
- package/build/parser/{save-writer.class.js → save-writer.js} +26 -34
- package/index.d.ts +2356 -0
- package/index.js +2364 -0
- package/package.json +6 -3
- package/rollup.config.mjs +11 -0
- package/.eslintrc.json +0 -28
- package/build/parser/blueprint-reader.js.map +0 -1
- package/build/parser/blueprint-writer.js.map +0 -1
- package/build/parser/byte/alignment.enum.js.map +0 -1
- package/build/parser/byte/byte-reader.class.js.map +0 -1
- package/build/parser/byte/byte-writer.class.js.map +0 -1
- package/build/parser/error/parser.error.js.map +0 -1
- package/build/parser/parser.class.js.map +0 -1
- package/build/parser/satisfactory/blueprint/blueprint.interface.js +0 -3
- package/build/parser/satisfactory/blueprint/blueprint.interface.js.map +0 -1
- package/build/parser/satisfactory/level.class.js.map +0 -1
- package/build/parser/satisfactory/objects/DataFields.js.map +0 -1
- package/build/parser/satisfactory/objects/ObjectReference.js.map +0 -1
- package/build/parser/satisfactory/objects/Property.js.map +0 -1
- package/build/parser/satisfactory/objects/SaveComponent.js.map +0 -1
- package/build/parser/satisfactory/objects/SaveEntity.js.map +0 -1
- package/build/parser/satisfactory/objects/SaveObject.js.map +0 -1
- package/build/parser/satisfactory/satisfactory-save.class.js.map +0 -1
- package/build/parser/satisfactory/structs/util.types.js.map +0 -1
- package/build/parser/save-reader.js.map +0 -1
- package/build/parser/save-writer.class.js.map +0 -1
- package/build/parser/static-data.js +0 -3
- package/build/parser/static-data.js.map +0 -1
- package/jest.config.json +0 -12
- package/tsconfig.json +0 -105
- /package/build/parser/satisfactory/blueprint/{blueprint.interface.d.ts → blueprint.d.ts} +0 -0
- /package/build/parser/{save-writer.class.d.ts → save-writer.d.ts} +0 -0
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// types & classes for convenience
|
|
2
|
+
export { Level } from './parser/satisfactory/level.class';
|
|
3
|
+
export * from './parser/satisfactory/satisfactory-save.class';
|
|
4
|
+
// errors
|
|
5
|
+
export * from './parser/error/parser.error';
|
|
6
|
+
// facade
|
|
7
|
+
export { SaveParser } from './parser/parser';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ByteReader } from "./byte/byte-reader.class";
|
|
2
|
-
import {
|
|
2
|
+
import { BlueprintConfig, BlueprintHeader } from "./satisfactory/blueprint/blueprint";
|
|
3
3
|
import { SaveComponent } from "./satisfactory/objects/SaveComponent";
|
|
4
|
+
import { SaveEntity } from "./satisfactory/objects/SaveEntity";
|
|
4
5
|
import { ChunkCompressionInfo } from "./satisfactory/satisfactory-save.class";
|
|
5
|
-
import { BlueprintConfig, BlueprintHeader } from "./satisfactory/blueprint/blueprint.interface";
|
|
6
6
|
export declare class BlueprintReader extends ByteReader {
|
|
7
7
|
compressionInfo: ChunkCompressionInfo;
|
|
8
8
|
constructor(bluePrintBuffer: ArrayBuffer);
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const byte_reader_class_1 = require("./byte/byte-reader.class");
|
|
9
|
-
const util_types_1 = require("./satisfactory/structs/util.types");
|
|
10
|
-
const pako_1 = __importDefault(require("pako"));
|
|
11
|
-
const level_class_1 = require("./satisfactory/level.class");
|
|
12
|
-
const parser_error_1 = require("./error/parser.error");
|
|
13
|
-
class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
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 {
|
|
14
8
|
constructor(bluePrintBuffer) {
|
|
15
|
-
super(bluePrintBuffer,
|
|
9
|
+
super(bluePrintBuffer, Alignment.LITTLE_ENDIAN);
|
|
16
10
|
this.compressionInfo = {
|
|
17
11
|
packageFileTag: 0,
|
|
18
12
|
maxChunkContentSize: 0,
|
|
@@ -21,7 +15,7 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
21
15
|
}
|
|
22
16
|
static ReadHeader(reader) {
|
|
23
17
|
const unk = reader.readBytes(3 * 4); // 02 00 00 00, 24 00 00 00, 7F 3B 03 00 - always
|
|
24
|
-
const positionThingOrWhat =
|
|
18
|
+
const positionThingOrWhat = ParseVec3(reader); // 04 00 00 00, 04 00 00 00, 04 00 00 00 - always
|
|
25
19
|
// list of item costs.
|
|
26
20
|
let itemTypeCount = reader.readInt32();
|
|
27
21
|
const itemCosts = new Array(itemTypeCount).fill(['', 0]);
|
|
@@ -59,13 +53,13 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
59
53
|
this.currentByte = this.compressionInfo.chunkHeaderSize;
|
|
60
54
|
this.handledByte += this.compressionInfo.chunkHeaderSize;
|
|
61
55
|
if (this.compressionInfo.packageFileTag <= 0) {
|
|
62
|
-
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment ===
|
|
56
|
+
this.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
63
57
|
}
|
|
64
58
|
if (this.compressionInfo.maxChunkContentSize <= 0) {
|
|
65
|
-
this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment ===
|
|
59
|
+
this.compressionInfo.maxChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN); //00 00 02 00 = 131072
|
|
66
60
|
}
|
|
67
|
-
const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment ===
|
|
68
|
-
const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment ===
|
|
61
|
+
const chunkCompressedLength = chunkHeader.getInt32(32, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
62
|
+
const chunkUncompressedLength = chunkHeader.getInt32(40, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
69
63
|
totalUncompressedBodySize += chunkUncompressedLength;
|
|
70
64
|
const currentChunkSize = chunkCompressedLength;
|
|
71
65
|
let currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);
|
|
@@ -77,11 +71,11 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
77
71
|
try {
|
|
78
72
|
// Inflate current chunk
|
|
79
73
|
let currentInflatedChunk = null;
|
|
80
|
-
currentInflatedChunk =
|
|
74
|
+
currentInflatedChunk = Pako.inflate(currentChunk);
|
|
81
75
|
currentChunks.push(currentInflatedChunk);
|
|
82
76
|
}
|
|
83
77
|
catch (err) {
|
|
84
|
-
throw new
|
|
78
|
+
throw new ParserError('ParserError', 'An error occurred while calling pako inflate.' + err);
|
|
85
79
|
}
|
|
86
80
|
}
|
|
87
81
|
//TODO we can get rid of file buffer here.
|
|
@@ -108,16 +102,15 @@ class BlueprintReader extends byte_reader_class_1.ByteReader {
|
|
|
108
102
|
// object headers
|
|
109
103
|
const objectHeadersBinarySize = reader.readInt32();
|
|
110
104
|
let objects = [];
|
|
111
|
-
|
|
105
|
+
Level.ReadObjectHeaders(reader, objects, () => { });
|
|
112
106
|
// objects contents
|
|
113
|
-
|
|
107
|
+
Level.ReadObjectContents(reader, objects, 0, () => { });
|
|
114
108
|
return objects;
|
|
115
109
|
}
|
|
116
110
|
}
|
|
117
|
-
|
|
118
|
-
class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
|
|
111
|
+
export class BlueprintConfigReader extends ByteReader {
|
|
119
112
|
constructor(bluePrintConfigBuffer) {
|
|
120
|
-
super(bluePrintConfigBuffer,
|
|
113
|
+
super(bluePrintConfigBuffer, Alignment.LITTLE_ENDIAN);
|
|
121
114
|
this.bluePrintConfigBuffer = bluePrintConfigBuffer;
|
|
122
115
|
this.parse = () => BlueprintConfigReader.ParseConfig(this);
|
|
123
116
|
}
|
|
@@ -125,7 +118,7 @@ class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
|
|
|
125
118
|
const unk = reader.readInt32(); // unknown, seems to always be 02.
|
|
126
119
|
const description = reader.readString();
|
|
127
120
|
const unk3 = reader.readInt32(); // iconID. default is 0x0E03 = 782
|
|
128
|
-
const colorMaybe =
|
|
121
|
+
const colorMaybe = ParseCol4RGBA(reader); // LinearColor, which is 4x float32 as RGBA
|
|
129
122
|
return {
|
|
130
123
|
description,
|
|
131
124
|
color: colorMaybe,
|
|
@@ -133,5 +126,3 @@ class BlueprintConfigReader extends byte_reader_class_1.ByteReader {
|
|
|
133
126
|
};
|
|
134
127
|
}
|
|
135
128
|
}
|
|
136
|
-
exports.BlueprintConfigReader = BlueprintConfigReader;
|
|
137
|
-
//# sourceMappingURL=blueprint-reader.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ByteWriter } from "./byte/byte-writer.class";
|
|
2
|
-
import { BlueprintHeader, BlueprintConfig } from "../parser/satisfactory/blueprint/blueprint.interface";
|
|
3
1
|
import { SaveComponent } from "../parser/satisfactory/objects/SaveComponent";
|
|
4
2
|
import { SaveEntity } from "../parser/satisfactory/objects/SaveEntity";
|
|
5
3
|
import { ChunkCompressionInfo } from "../parser/satisfactory/satisfactory-save.class";
|
|
4
|
+
import { ByteWriter } from "./byte/byte-writer.class";
|
|
5
|
+
import { BlueprintConfig, BlueprintHeader } from "./satisfactory/blueprint/blueprint";
|
|
6
6
|
export declare class BlueprintWriter extends ByteWriter {
|
|
7
7
|
constructor();
|
|
8
8
|
static SerializeHeader(writer: ByteWriter, header: BlueprintHeader): void;
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const save_writer_class_1 = require("../parser/save-writer.class");
|
|
9
|
-
const parser_error_1 = require("./error/parser.error");
|
|
10
|
-
class BlueprintWriter extends byte_writer_class_1.ByteWriter {
|
|
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 {
|
|
11
8
|
constructor() {
|
|
12
|
-
super(
|
|
9
|
+
super(Alignment.LITTLE_ENDIAN);
|
|
13
10
|
}
|
|
14
11
|
static SerializeHeader(writer, header) {
|
|
15
12
|
writer.writeInt32(2); // unknown, seems to always be 02.
|
|
@@ -35,36 +32,33 @@ class BlueprintWriter extends byte_writer_class_1.ByteWriter {
|
|
|
35
32
|
}
|
|
36
33
|
generateChunks(compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
|
|
37
34
|
if (posAfterHeader <= 0) {
|
|
38
|
-
throw new
|
|
35
|
+
throw new ParserError('ParserError', 'seems like this buffer has no header. Please write the header first before you can generate chunks.');
|
|
39
36
|
}
|
|
40
37
|
// send plain header first.
|
|
41
38
|
const header = new Uint8Array(this.bufferArray.slice(0, posAfterHeader));
|
|
42
39
|
onHeader(header);
|
|
43
40
|
// create save body
|
|
44
41
|
this.bufferArray = this.bufferArray.slice(posAfterHeader);
|
|
45
|
-
|
|
42
|
+
SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, onFinish, this.alignment);
|
|
46
43
|
}
|
|
47
44
|
static SerializeObjects(writer, objects) {
|
|
48
45
|
// object headers
|
|
49
46
|
const headersLenIndicator = writer.getBufferPosition();
|
|
50
47
|
writer.writeInt32(0);
|
|
51
|
-
|
|
48
|
+
Level.SerializeObjectHeaders(writer, objects);
|
|
52
49
|
writer.writeBinarySizeFromPosition(headersLenIndicator, headersLenIndicator + 4);
|
|
53
50
|
// objects contents
|
|
54
|
-
|
|
51
|
+
Level.SerializeObjectContents(writer, objects, 0);
|
|
55
52
|
}
|
|
56
53
|
}
|
|
57
|
-
|
|
58
|
-
class BlueprintConfigWriter extends byte_writer_class_1.ByteWriter {
|
|
54
|
+
export class BlueprintConfigWriter extends ByteWriter {
|
|
59
55
|
constructor() {
|
|
60
|
-
super(
|
|
56
|
+
super(Alignment.LITTLE_ENDIAN);
|
|
61
57
|
}
|
|
62
58
|
static SerializeConfig(writer, config) {
|
|
63
59
|
writer.writeInt32(2); // unknown, seems to always be 02.
|
|
64
60
|
writer.writeString(config.description);
|
|
65
61
|
writer.writeInt32(config.iconID);
|
|
66
|
-
|
|
62
|
+
SerializeCol4RGBA(writer, config.color);
|
|
67
63
|
}
|
|
68
64
|
}
|
|
69
|
-
exports.BlueprintConfigWriter = BlueprintConfigWriter;
|
|
70
|
-
//# sourceMappingURL=blueprint-writer.js.map
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Alignment = void 0;
|
|
4
|
-
var Alignment;
|
|
1
|
+
export var Alignment;
|
|
5
2
|
(function (Alignment) {
|
|
6
3
|
Alignment[Alignment["BIG_ENDIAN"] = 0] = "BIG_ENDIAN";
|
|
7
4
|
Alignment[Alignment["LITTLE_ENDIAN"] = 1] = "LITTLE_ENDIAN";
|
|
8
|
-
})(Alignment
|
|
9
|
-
//# sourceMappingURL=alignment.enum.js.map
|
|
5
|
+
})(Alignment || (Alignment = {}));
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ByteReader = void 0;
|
|
4
|
-
const alignment_enum_1 = require("./alignment.enum");
|
|
5
|
-
class ByteReader {
|
|
1
|
+
import { Alignment } from "./alignment.enum";
|
|
2
|
+
export class ByteReader {
|
|
6
3
|
constructor(fileBuffer, alignment) {
|
|
7
4
|
this.currentByte = 0;
|
|
8
5
|
this.handledByte = 0;
|
|
@@ -57,32 +54,32 @@ class ByteReader {
|
|
|
57
54
|
return data;
|
|
58
55
|
}
|
|
59
56
|
readUint16() {
|
|
60
|
-
let data = this.bufferView.getUint16(this.currentByte, this.alignment ===
|
|
57
|
+
let data = this.bufferView.getUint16(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
61
58
|
this.currentByte += 2;
|
|
62
59
|
return data;
|
|
63
60
|
}
|
|
64
61
|
readInt32() {
|
|
65
|
-
let data = this.bufferView.getInt32(this.currentByte, this.alignment ===
|
|
62
|
+
let data = this.bufferView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
66
63
|
this.currentByte += 4;
|
|
67
64
|
return data;
|
|
68
65
|
}
|
|
69
66
|
readUint32() {
|
|
70
|
-
let data = this.bufferView.getUint32(this.currentByte, this.alignment ===
|
|
67
|
+
let data = this.bufferView.getUint32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
71
68
|
this.currentByte += 4;
|
|
72
69
|
return data;
|
|
73
70
|
}
|
|
74
71
|
readLong() {
|
|
75
|
-
let data = this.bufferView.getBigInt64(this.currentByte, this.alignment ===
|
|
72
|
+
let data = this.bufferView.getBigInt64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
76
73
|
this.currentByte += 8;
|
|
77
74
|
return data;
|
|
78
75
|
}
|
|
79
76
|
readFloat() {
|
|
80
|
-
let data = this.bufferView.getFloat32(this.currentByte, this.alignment ===
|
|
77
|
+
let data = this.bufferView.getFloat32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
81
78
|
this.currentByte += 4;
|
|
82
79
|
return data;
|
|
83
80
|
}
|
|
84
81
|
readDouble() {
|
|
85
|
-
let data = this.bufferView.getFloat64(this.currentByte, this.alignment ===
|
|
82
|
+
let data = this.bufferView.getFloat64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
86
83
|
this.currentByte += 8;
|
|
87
84
|
return data;
|
|
88
85
|
}
|
|
@@ -90,7 +87,7 @@ class ByteReader {
|
|
|
90
87
|
let payload = '';
|
|
91
88
|
let counter = this.currentByte;
|
|
92
89
|
try {
|
|
93
|
-
let strLength = this.bufferView.getInt32(this.currentByte, this.alignment ===
|
|
90
|
+
let strLength = this.bufferView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
94
91
|
counter += 4;
|
|
95
92
|
payload = new Array(strLength - 1).fill('').map(c => String.fromCharCode(this.bufferView.getUint8(counter++))).join('');
|
|
96
93
|
}
|
|
@@ -129,5 +126,3 @@ class ByteReader {
|
|
|
129
126
|
}
|
|
130
127
|
}
|
|
131
128
|
}
|
|
132
|
-
exports.ByteReader = ByteReader;
|
|
133
|
-
//# sourceMappingURL=byte-reader.class.js.map
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ByteWriter = void 0;
|
|
4
|
-
const alignment_enum_1 = require("./alignment.enum");
|
|
1
|
+
import { Alignment } from "./alignment.enum";
|
|
5
2
|
class ByteWriter {
|
|
6
3
|
constructor(alignment, bufferSize = 500) {
|
|
7
4
|
this.getBufferPosition = () => this.currentByte;
|
|
@@ -44,42 +41,42 @@ class ByteWriter {
|
|
|
44
41
|
}
|
|
45
42
|
writeInt16(value) {
|
|
46
43
|
this.extendBufferIfNeeded(2);
|
|
47
|
-
this.bufferView.setInt16(this.currentByte, value, this.alignment ===
|
|
44
|
+
this.bufferView.setInt16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
48
45
|
this.currentByte += 2;
|
|
49
46
|
}
|
|
50
47
|
writeUint16(value) {
|
|
51
48
|
this.extendBufferIfNeeded(2);
|
|
52
|
-
this.bufferView.setUint16(this.currentByte, value, this.alignment ===
|
|
49
|
+
this.bufferView.setUint16(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
53
50
|
this.currentByte += 2;
|
|
54
51
|
}
|
|
55
52
|
writeInt32(value) {
|
|
56
53
|
this.extendBufferIfNeeded(4);
|
|
57
|
-
this.bufferView.setInt32(this.currentByte, value, this.alignment ===
|
|
54
|
+
this.bufferView.setInt32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
58
55
|
this.currentByte += 4;
|
|
59
56
|
}
|
|
60
57
|
writeUint32(value) {
|
|
61
58
|
this.extendBufferIfNeeded(4);
|
|
62
|
-
this.bufferView.setUint32(this.currentByte, value, this.alignment ===
|
|
59
|
+
this.bufferView.setUint32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
63
60
|
this.currentByte += 4;
|
|
64
61
|
}
|
|
65
62
|
writeInt64(value) {
|
|
66
63
|
this.extendBufferIfNeeded(8);
|
|
67
|
-
this.bufferView.setBigInt64(this.currentByte, value, this.alignment ===
|
|
64
|
+
this.bufferView.setBigInt64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
68
65
|
this.currentByte += 8;
|
|
69
66
|
}
|
|
70
67
|
writeUint64(value) {
|
|
71
68
|
this.extendBufferIfNeeded(8);
|
|
72
|
-
this.bufferView.setBigUint64(this.currentByte, value, this.alignment ===
|
|
69
|
+
this.bufferView.setBigUint64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
73
70
|
this.currentByte += 8;
|
|
74
71
|
}
|
|
75
72
|
writeFloat(value) {
|
|
76
73
|
this.extendBufferIfNeeded(4);
|
|
77
|
-
this.bufferView.setFloat32(this.currentByte, value, this.alignment ===
|
|
74
|
+
this.bufferView.setFloat32(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
78
75
|
this.currentByte += 4;
|
|
79
76
|
}
|
|
80
77
|
writeDouble(value) {
|
|
81
78
|
this.extendBufferIfNeeded(8);
|
|
82
|
-
this.bufferView.setFloat64(this.currentByte, value, this.alignment ===
|
|
79
|
+
this.bufferView.setFloat64(this.currentByte, value, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
83
80
|
this.currentByte += 8;
|
|
84
81
|
}
|
|
85
82
|
writeString(value) {
|
|
@@ -146,5 +143,4 @@ class ByteWriter {
|
|
|
146
143
|
;
|
|
147
144
|
}
|
|
148
145
|
ByteWriter.IsASCIICompatible = (value) => /^[\x00-\x7F]*$/.test(value);
|
|
149
|
-
|
|
150
|
-
//# sourceMappingURL=byte-writer.class.js.map
|
|
146
|
+
export { ByteWriter };
|
|
@@ -1,29 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CompressionLibraryError = exports.CorruptSaveError = exports.UnsupportedVersionError = exports.ParserError = void 0;
|
|
4
|
-
class ParserError extends Error {
|
|
1
|
+
export class ParserError extends Error {
|
|
5
2
|
constructor(name, message) {
|
|
6
3
|
super(message);
|
|
7
4
|
this.name = name;
|
|
8
5
|
}
|
|
9
6
|
}
|
|
10
|
-
|
|
11
|
-
class UnsupportedVersionError extends ParserError {
|
|
7
|
+
export class UnsupportedVersionError extends ParserError {
|
|
12
8
|
constructor(message) {
|
|
13
9
|
super('UnsupportedVersionError', message ?? 'This save version is not supported.');
|
|
14
10
|
}
|
|
15
11
|
}
|
|
16
|
-
|
|
17
|
-
class CorruptSaveError extends ParserError {
|
|
12
|
+
export class CorruptSaveError extends ParserError {
|
|
18
13
|
constructor(message) {
|
|
19
14
|
super('CorruptSaveError', message ?? 'This save data is most likely corrupt.');
|
|
20
15
|
}
|
|
21
16
|
}
|
|
22
|
-
|
|
23
|
-
class CompressionLibraryError extends ParserError {
|
|
17
|
+
export class CompressionLibraryError extends ParserError {
|
|
24
18
|
constructor(message) {
|
|
25
19
|
super('CompressionLibraryError', message ?? 'Failed to compress/decompress save data.');
|
|
26
20
|
}
|
|
27
21
|
}
|
|
28
|
-
exports.CompressionLibraryError = CompressionLibraryError;
|
|
29
|
-
//# sourceMappingURL=parser.error.js.map
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { SatisfactorySave } from "./satisfactory/satisfactory-save.class";
|
|
3
3
|
import { SaveProjectionConfig } from "./save-reader";
|
|
4
|
-
/**
|
|
5
|
-
* Represents a parse result of an object type. The errors contain information in case of a failed parsing.
|
|
6
|
-
* The parse result contains a valid payload in case of a successful parsing.
|
|
7
|
-
*/
|
|
8
|
-
export type ParseResult<T> = {
|
|
9
|
-
payload?: T;
|
|
10
|
-
errors: string[];
|
|
11
|
-
};
|
|
12
4
|
export declare class SaveParser {
|
|
13
5
|
/**
|
|
14
6
|
* serializes a save file into binary and reports back on individual callbacks.
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const satisfactory_save_class_1 = require("./satisfactory/satisfactory-save.class");
|
|
6
|
-
const save_reader_1 = require("./save-reader");
|
|
7
|
-
const save_writer_class_1 = require("./save-writer.class");
|
|
1
|
+
import { Level } from "./satisfactory/level.class";
|
|
2
|
+
import { SatisfactorySave } from "./satisfactory/satisfactory-save.class";
|
|
3
|
+
import { SaveReader, projectionFilterApplies } from "./save-reader";
|
|
4
|
+
import { SaveWriter } from "./save-writer";
|
|
8
5
|
class SaveParser {
|
|
9
6
|
/**
|
|
10
7
|
* serializes a save file into binary and reports back on individual callbacks.
|
|
@@ -15,10 +12,10 @@ class SaveParser {
|
|
|
15
12
|
* @param onFinish gets called when all chunks have been generated. A summary of the chunk sizes and count is reported.
|
|
16
13
|
*/
|
|
17
14
|
static WriteSave(save, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
|
|
18
|
-
const writer = new
|
|
19
|
-
|
|
15
|
+
const writer = new SaveWriter();
|
|
16
|
+
SaveWriter.WriteHeader(writer, save.header);
|
|
20
17
|
const posAfterHeader = writer.getBufferPosition();
|
|
21
|
-
|
|
18
|
+
SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
|
|
22
19
|
writer.endWriting();
|
|
23
20
|
writer.generateChunks(save.compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish);
|
|
24
21
|
}
|
|
@@ -30,10 +27,10 @@ class SaveParser {
|
|
|
30
27
|
* @returns a brief summary
|
|
31
28
|
*/
|
|
32
29
|
static ParseSaveFile(file, onSaveDecompressed = () => { }, onProgress = () => { }) {
|
|
33
|
-
const reader = new
|
|
30
|
+
const reader = new SaveReader(file.buffer, onProgress);
|
|
34
31
|
// read header
|
|
35
32
|
const header = reader.readHeader();
|
|
36
|
-
const save = new
|
|
33
|
+
const save = new SatisfactorySave(header);
|
|
37
34
|
// inflate chunks
|
|
38
35
|
const inflateResult = reader.inflateChunks();
|
|
39
36
|
// call callback on decompressed save body
|
|
@@ -56,9 +53,9 @@ class SaveParser {
|
|
|
56
53
|
header: save.header,
|
|
57
54
|
trailingCollectedObjects: save.trailingCollectedObjects,
|
|
58
55
|
levels: save.levels.map(level => {
|
|
59
|
-
const lvl = new
|
|
56
|
+
const lvl = new Level(level.name);
|
|
60
57
|
lvl.collectables = level.collectables;
|
|
61
|
-
lvl.objects = level.objects.filter(obj =>
|
|
58
|
+
lvl.objects = level.objects.filter(obj => projectionFilterApplies(config, obj));
|
|
62
59
|
return lvl;
|
|
63
60
|
})
|
|
64
61
|
};
|
|
@@ -81,5 +78,4 @@ SaveParser.JSONStringifyModified = (obj, indent = 0) => JSON.stringify(obj, (key
|
|
|
81
78
|
}
|
|
82
79
|
return value;
|
|
83
80
|
}, indent);
|
|
84
|
-
|
|
85
|
-
//# sourceMappingURL=parser.class.js.map
|
|
81
|
+
export { SaveParser };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const SaveComponent_1 = require("./objects/SaveComponent");
|
|
6
|
-
const SaveEntity_1 = require("./objects/SaveEntity");
|
|
7
|
-
class Level {
|
|
1
|
+
import { ObjectReference } from "./objects/ObjectReference";
|
|
2
|
+
import { isSaveComponent, SaveComponent } from "./objects/SaveComponent";
|
|
3
|
+
import { isSaveEntity, SaveEntity } from "./objects/SaveEntity";
|
|
4
|
+
export class Level {
|
|
8
5
|
constructor(name) {
|
|
9
6
|
this.name = name;
|
|
10
7
|
this.objects = [];
|
|
@@ -15,12 +12,12 @@ class Level {
|
|
|
15
12
|
for (const obj of objects) {
|
|
16
13
|
switch (obj.type) {
|
|
17
14
|
case 'SaveEntity':
|
|
18
|
-
writer.writeInt32(
|
|
19
|
-
|
|
15
|
+
writer.writeInt32(SaveEntity.TypeID);
|
|
16
|
+
SaveEntity.SerializeHeader(writer, obj);
|
|
20
17
|
break;
|
|
21
18
|
case 'SaveComponent':
|
|
22
|
-
writer.writeInt32(
|
|
23
|
-
|
|
19
|
+
writer.writeInt32(SaveComponent.TypeID);
|
|
20
|
+
SaveComponent.SerializeHeader(writer, obj);
|
|
24
21
|
break;
|
|
25
22
|
default:
|
|
26
23
|
console.log('Unknown object type', obj);
|
|
@@ -46,11 +43,11 @@ class Level {
|
|
|
46
43
|
for (const obj of objects) {
|
|
47
44
|
const lenReplacementPosition = writer.getBufferPosition();
|
|
48
45
|
writer.writeInt32(0);
|
|
49
|
-
if (
|
|
50
|
-
|
|
46
|
+
if (isSaveEntity(obj)) {
|
|
47
|
+
SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
51
48
|
}
|
|
52
|
-
else if (
|
|
53
|
-
|
|
49
|
+
else if (isSaveComponent(obj)) {
|
|
50
|
+
SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
54
51
|
}
|
|
55
52
|
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
56
53
|
}
|
|
@@ -64,14 +61,14 @@ class Level {
|
|
|
64
61
|
}
|
|
65
62
|
let objectType = reader.readInt32();
|
|
66
63
|
switch (objectType) {
|
|
67
|
-
case
|
|
68
|
-
let object = new
|
|
69
|
-
|
|
64
|
+
case SaveEntity.TypeID:
|
|
65
|
+
let object = new SaveEntity('', '', '', '');
|
|
66
|
+
SaveEntity.ParseHeader(reader, object);
|
|
70
67
|
objectsList.push(object);
|
|
71
68
|
break;
|
|
72
|
-
case
|
|
73
|
-
let component = new
|
|
74
|
-
|
|
69
|
+
case SaveComponent.TypeID:
|
|
70
|
+
let component = new SaveComponent('', '', '', '');
|
|
71
|
+
SaveComponent.ParseHeader(reader, component);
|
|
75
72
|
objectsList.push(component);
|
|
76
73
|
break;
|
|
77
74
|
default:
|
|
@@ -95,11 +92,11 @@ class Level {
|
|
|
95
92
|
const len = reader.readInt32();
|
|
96
93
|
const before = reader.getBufferPosition();
|
|
97
94
|
const obj = objectsList[i];
|
|
98
|
-
if (
|
|
99
|
-
|
|
95
|
+
if (isSaveEntity(obj)) {
|
|
96
|
+
SaveEntity.ParseData(obj, len, reader, buildVersion);
|
|
100
97
|
}
|
|
101
|
-
else if (
|
|
102
|
-
|
|
98
|
+
else if (isSaveComponent(obj)) {
|
|
99
|
+
SaveComponent.ParseData(obj, len, reader, buildVersion);
|
|
103
100
|
}
|
|
104
101
|
const after = reader.getBufferPosition();
|
|
105
102
|
if (after - before !== len) {
|
|
@@ -131,7 +128,7 @@ class Level {
|
|
|
131
128
|
static SerializeCollectablesList(writer, collectables) {
|
|
132
129
|
writer.writeInt32(collectables.length);
|
|
133
130
|
for (const collectable of collectables) {
|
|
134
|
-
|
|
131
|
+
ObjectReference.Serialize(writer, collectable);
|
|
135
132
|
}
|
|
136
133
|
}
|
|
137
134
|
// collected stuff
|
|
@@ -139,11 +136,9 @@ class Level {
|
|
|
139
136
|
let countCollected = reader.readInt32();
|
|
140
137
|
const collected = [];
|
|
141
138
|
for (let i = 0; i < countCollected; i++) {
|
|
142
|
-
const collectable =
|
|
139
|
+
const collectable = ObjectReference.Parse(reader);
|
|
143
140
|
collected.push(collectable);
|
|
144
141
|
}
|
|
145
142
|
return collected;
|
|
146
143
|
}
|
|
147
144
|
}
|
|
148
|
-
exports.Level = Level;
|
|
149
|
-
//# sourceMappingURL=level.class.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ByteReader } from "../../byte/byte-reader.class";
|
|
2
|
-
import { SaveWriter } from "../../save-writer
|
|
2
|
+
import { SaveWriter } from "../../save-writer";
|
|
3
3
|
import { AbstractBaseProperty } from "./Property";
|
|
4
4
|
export declare class DataFields {
|
|
5
5
|
properties: any[];
|