@etothepii/satisfactory-file-parser 0.1.25 → 0.1.26
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.js +25 -60
- package/build/parser/byte/alignment.enum.js +2 -5
- package/build/parser/byte/binary-operable.interface.js +1 -2
- package/build/parser/byte/binary-readable.interface.js +1 -2
- package/build/parser/byte/byte-reader.class.js +10 -14
- package/build/parser/byte/byte-writer.class.js +10 -13
- package/build/parser/error/parser.error.js +6 -15
- package/build/parser/file.types.js +2 -5
- package/build/parser/parser.js +23 -26
- package/build/parser/satisfactory/blueprint/blueprint-reader.js +28 -36
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +20 -25
- package/build/parser/satisfactory/blueprint/blueprint.types.js +1 -2
- package/build/parser/satisfactory/objects/DataFields.js +79 -83
- package/build/parser/satisfactory/objects/GUIDInfo.js +5 -8
- package/build/parser/satisfactory/objects/ObjectReference.js +2 -5
- package/build/parser/satisfactory/objects/Property.js +91 -120
- package/build/parser/satisfactory/objects/SaveComponent.js +7 -11
- package/build/parser/satisfactory/objects/SaveEntity.js +13 -17
- package/build/parser/satisfactory/objects/SaveObject.js +4 -8
- package/build/parser/satisfactory/objects/ue/GUID.js +2 -5
- package/build/parser/satisfactory/objects/ue/MD5Hash.js +2 -5
- package/build/parser/satisfactory/save/asynchronous-level.class.js +12 -16
- package/build/parser/satisfactory/save/level.class.js +24 -28
- package/build/parser/satisfactory/save/satisfactory-save.js +1 -5
- package/build/parser/satisfactory/save/save-reader.js +28 -34
- package/build/parser/satisfactory/save/save-writer.js +34 -40
- package/build/parser/satisfactory/save/save.types.js +1 -2
- package/build/parser/satisfactory/structs/util.types.js +37 -63
- package/build/parser/stream/byte-stream-reader.class.js +17 -21
- package/build/parser/stream/json-stream-state-writer.js +2 -6
- package/build/parser/stream/json-stream-writable.js +1 -5
- package/build/parser/stream/json-stream-writer.js +2 -6
- package/build/parser/stream/reworked/readable-stream-parser.d.ts +1 -1
- package/build/parser/stream/reworked/readable-stream-parser.js +21 -24
- package/build/parser/stream/reworked/stream-parser.js +17 -20
- package/build/parser/stream/save-stream-json-stringifier.js +3 -7
- package/build/parser/stream/save-stream-reader.class.js +18 -24
- package/build/parser/stream/save-stream-writer.class.js +1 -5
- package/build/parser/stream/stream-level.class.js +11 -15
- package/build/parser/stream/stream-parser.js +11 -15
- package/package.json +4 -2
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SerializeTransform = exports.ParseTransform = exports.SerializeVec2f = exports.ParseVec2f = exports.SerializeVec2 = exports.ParseVec2 = exports.SerializeVec3f = exports.ParseVec3f = exports.SerializeVec3 = exports.ParseVec3 = exports.norm = exports.mult = exports.length = exports.add = exports.sub = exports.SerializeVec4f = exports.ParseVec4f = exports.SerializeVec4 = exports.ParseVec4 = exports.ParseCol4BGRA = exports.SerializeCol4BGRA = exports.ParseCol4RGBA = exports.SerializeCol4RGBA = void 0;
|
|
4
|
-
const SerializeCol4RGBA = (writer, value) => {
|
|
1
|
+
export const SerializeCol4RGBA = (writer, value) => {
|
|
5
2
|
writer.writeFloat(value.r);
|
|
6
3
|
writer.writeFloat(value.g);
|
|
7
4
|
writer.writeFloat(value.b);
|
|
8
5
|
writer.writeFloat(value.a);
|
|
9
6
|
};
|
|
10
|
-
|
|
11
|
-
const ParseCol4RGBA = (reader) => {
|
|
7
|
+
export const ParseCol4RGBA = (reader) => {
|
|
12
8
|
return {
|
|
13
9
|
r: reader.readFloat32(),
|
|
14
10
|
g: reader.readFloat32(),
|
|
@@ -16,15 +12,13 @@ const ParseCol4RGBA = (reader) => {
|
|
|
16
12
|
a: reader.readFloat32(),
|
|
17
13
|
};
|
|
18
14
|
};
|
|
19
|
-
|
|
20
|
-
const SerializeCol4BGRA = (writer, value) => {
|
|
15
|
+
export const SerializeCol4BGRA = (writer, value) => {
|
|
21
16
|
writer.writeByte(value.b);
|
|
22
17
|
writer.writeByte(value.g);
|
|
23
18
|
writer.writeByte(value.r);
|
|
24
19
|
writer.writeByte(value.a);
|
|
25
20
|
};
|
|
26
|
-
|
|
27
|
-
const ParseCol4BGRA = (reader) => {
|
|
21
|
+
export const ParseCol4BGRA = (reader) => {
|
|
28
22
|
return {
|
|
29
23
|
b: reader.readByte(),
|
|
30
24
|
g: reader.readByte(),
|
|
@@ -32,100 +26,80 @@ const ParseCol4BGRA = (reader) => {
|
|
|
32
26
|
a: reader.readByte(),
|
|
33
27
|
};
|
|
34
28
|
};
|
|
35
|
-
|
|
36
|
-
const ParseVec4 = (reader) => {
|
|
29
|
+
export const ParseVec4 = (reader) => {
|
|
37
30
|
return {
|
|
38
|
-
...(
|
|
31
|
+
...(ParseVec3(reader)),
|
|
39
32
|
w: reader.readDouble()
|
|
40
33
|
};
|
|
41
34
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
(0, exports.SerializeVec3)(writer, vec);
|
|
35
|
+
export const SerializeVec4 = (writer, vec) => {
|
|
36
|
+
SerializeVec3(writer, vec);
|
|
45
37
|
writer.writeDouble(vec.w);
|
|
46
38
|
};
|
|
47
|
-
|
|
48
|
-
const ParseVec4f = (reader) => {
|
|
39
|
+
export const ParseVec4f = (reader) => {
|
|
49
40
|
return {
|
|
50
|
-
...(
|
|
41
|
+
...(ParseVec3f(reader)),
|
|
51
42
|
w: reader.readFloat32()
|
|
52
43
|
};
|
|
53
44
|
};
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
(0, exports.SerializeVec3f)(writer, vec);
|
|
45
|
+
export const SerializeVec4f = (writer, vec) => {
|
|
46
|
+
SerializeVec3f(writer, vec);
|
|
57
47
|
writer.writeFloat(vec.w);
|
|
58
48
|
};
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
exports.length = length;
|
|
66
|
-
const mult = (vec, scale) => ({ x: vec.x * scale, y: vec.y * scale, z: vec.z * scale });
|
|
67
|
-
exports.mult = mult;
|
|
68
|
-
const norm = (vec) => (0, exports.mult)(vec, 1. / (0, exports.length)(vec));
|
|
69
|
-
exports.norm = norm;
|
|
70
|
-
const ParseVec3 = (reader) => {
|
|
49
|
+
export const sub = (other, vec) => ({ x: other.x - vec.x, y: other.y - vec.y, z: other.z - vec.z });
|
|
50
|
+
export const add = (vec, other) => ({ x: vec.x + other.x, y: vec.y + other.y, z: vec.z + other.z });
|
|
51
|
+
export const length = (vec) => Math.sqrt(vec.x ** 2 + vec.y ** 2 + vec.z ** 2);
|
|
52
|
+
export const mult = (vec, scale) => ({ x: vec.x * scale, y: vec.y * scale, z: vec.z * scale });
|
|
53
|
+
export const norm = (vec) => mult(vec, 1. / length(vec));
|
|
54
|
+
export const ParseVec3 = (reader) => {
|
|
71
55
|
return {
|
|
72
|
-
...(
|
|
56
|
+
...(ParseVec2(reader)),
|
|
73
57
|
z: reader.readDouble()
|
|
74
58
|
};
|
|
75
59
|
};
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
(0, exports.SerializeVec2)(writer, vec);
|
|
60
|
+
export const SerializeVec3 = (writer, vec) => {
|
|
61
|
+
SerializeVec2(writer, vec);
|
|
79
62
|
writer.writeDouble(vec.z);
|
|
80
63
|
};
|
|
81
|
-
|
|
82
|
-
const ParseVec3f = (reader) => {
|
|
64
|
+
export const ParseVec3f = (reader) => {
|
|
83
65
|
return {
|
|
84
|
-
...(
|
|
66
|
+
...(ParseVec2f(reader)),
|
|
85
67
|
z: reader.readFloat32()
|
|
86
68
|
};
|
|
87
69
|
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
(0, exports.SerializeVec2f)(writer, vec);
|
|
70
|
+
export const SerializeVec3f = (writer, vec) => {
|
|
71
|
+
SerializeVec2f(writer, vec);
|
|
91
72
|
writer.writeFloat(vec.z);
|
|
92
73
|
};
|
|
93
|
-
|
|
94
|
-
const ParseVec2 = (reader) => {
|
|
74
|
+
export const ParseVec2 = (reader) => {
|
|
95
75
|
return {
|
|
96
76
|
x: reader.readDouble(),
|
|
97
77
|
y: reader.readDouble(),
|
|
98
78
|
};
|
|
99
79
|
};
|
|
100
|
-
|
|
101
|
-
const SerializeVec2 = (writer, vec) => {
|
|
80
|
+
export const SerializeVec2 = (writer, vec) => {
|
|
102
81
|
writer.writeDouble(vec.x);
|
|
103
82
|
writer.writeDouble(vec.y);
|
|
104
83
|
};
|
|
105
|
-
|
|
106
|
-
const ParseVec2f = (reader) => {
|
|
84
|
+
export const ParseVec2f = (reader) => {
|
|
107
85
|
return {
|
|
108
86
|
x: reader.readFloat32(),
|
|
109
87
|
y: reader.readFloat32(),
|
|
110
88
|
};
|
|
111
89
|
};
|
|
112
|
-
|
|
113
|
-
const SerializeVec2f = (writer, vec) => {
|
|
90
|
+
export const SerializeVec2f = (writer, vec) => {
|
|
114
91
|
writer.writeFloat(vec.x);
|
|
115
92
|
writer.writeFloat(vec.y);
|
|
116
93
|
};
|
|
117
|
-
|
|
118
|
-
const ParseTransform = (reader) => {
|
|
94
|
+
export const ParseTransform = (reader) => {
|
|
119
95
|
return {
|
|
120
|
-
rotation:
|
|
121
|
-
translation:
|
|
122
|
-
scale3d:
|
|
96
|
+
rotation: ParseVec4f(reader),
|
|
97
|
+
translation: ParseVec3f(reader),
|
|
98
|
+
scale3d: ParseVec3f(reader),
|
|
123
99
|
};
|
|
124
100
|
};
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
(
|
|
128
|
-
|
|
129
|
-
(0, exports.SerializeVec3f)(writer, transform.scale3d);
|
|
101
|
+
export const SerializeTransform = (writer, transform) => {
|
|
102
|
+
SerializeVec4f(writer, transform.rotation);
|
|
103
|
+
SerializeVec3f(writer, transform.translation);
|
|
104
|
+
SerializeVec3f(writer, transform.scale3d);
|
|
130
105
|
};
|
|
131
|
-
exports.SerializeTransform = SerializeTransform;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const parser_error_1 = require("../error/parser.error");
|
|
7
|
-
class ByteStreamReader {
|
|
8
|
-
constructor(reader, onCloseCallback, timeout = 30000, maxBufferThreshold = 100 * 1000 * 1000, alignment = alignment_enum_1.Alignment.LITTLE_ENDIAN) {
|
|
1
|
+
import { Alignment } from "../byte/alignment.enum";
|
|
2
|
+
import { ByteWriter } from "../byte/byte-writer.class";
|
|
3
|
+
import { CorruptSaveError, TimeoutError, UnimplementedError } from "../error/parser.error";
|
|
4
|
+
export class ByteStreamReader {
|
|
5
|
+
constructor(reader, onCloseCallback, timeout = 30000, maxBufferThreshold = 100 * 1000 * 1000, alignment = Alignment.LITTLE_ENDIAN) {
|
|
9
6
|
this.reader = reader;
|
|
10
7
|
this.onCloseCallback = onCloseCallback;
|
|
11
8
|
this.timeout = timeout;
|
|
@@ -21,7 +18,7 @@ class ByteStreamReader {
|
|
|
21
18
|
if (!this.inputStreamIsDone) {
|
|
22
19
|
if (value) {
|
|
23
20
|
const trailingPos = Math.max(0, this.currentByte - this.trailingBufferSize);
|
|
24
|
-
this.operatingStreamBuffer = new Uint8Array(
|
|
21
|
+
this.operatingStreamBuffer = new Uint8Array(ByteWriter.AppendBuffer(this.operatingStreamBuffer.slice(trailingPos), value));
|
|
25
22
|
this.operatingDataView = new DataView(this.operatingStreamBuffer.buffer);
|
|
26
23
|
this.currentByte = Math.min(this.currentByte, this.trailingBufferSize);
|
|
27
24
|
if (this.operatingStreamBuffer.byteLength > this.maxBufferThreshold) {
|
|
@@ -79,7 +76,7 @@ class ByteStreamReader {
|
|
|
79
76
|
}
|
|
80
77
|
if (this.getAmountAllocatedLeft() < count) {
|
|
81
78
|
if (this.inputStreamIsDone) {
|
|
82
|
-
throw new
|
|
79
|
+
throw new CorruptSaveError('Input Stream has finished before needed data was received.');
|
|
83
80
|
}
|
|
84
81
|
if (this.paused) {
|
|
85
82
|
this.resume();
|
|
@@ -109,7 +106,7 @@ class ByteStreamReader {
|
|
|
109
106
|
}
|
|
110
107
|
this.waitingTimeoutHandle = setTimeout(() => {
|
|
111
108
|
if (!this.inputStreamIsDone) {
|
|
112
|
-
reject(new
|
|
109
|
+
reject(new TimeoutError(`Timed out before ${this.neededNextAmountOfBytes} bytes were available to read next.`));
|
|
113
110
|
}
|
|
114
111
|
return resolve();
|
|
115
112
|
}, this.timeout);
|
|
@@ -149,31 +146,31 @@ class ByteStreamReader {
|
|
|
149
146
|
}
|
|
150
147
|
readInt16() {
|
|
151
148
|
this.totalNumberOfBytesRead += 2;
|
|
152
|
-
let data = this.operatingDataView.getInt16(this.currentByte, this.alignment ===
|
|
149
|
+
let data = this.operatingDataView.getInt16(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
153
150
|
this.currentByte += 2;
|
|
154
151
|
return data;
|
|
155
152
|
}
|
|
156
153
|
readUint16() {
|
|
157
154
|
this.totalNumberOfBytesRead += 2;
|
|
158
|
-
let data = this.operatingDataView.getUint16(this.currentByte, this.alignment ===
|
|
155
|
+
let data = this.operatingDataView.getUint16(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
159
156
|
this.currentByte += 2;
|
|
160
157
|
return data;
|
|
161
158
|
}
|
|
162
159
|
readInt32() {
|
|
163
160
|
this.totalNumberOfBytesRead += 4;
|
|
164
|
-
let data = this.operatingDataView.getInt32(this.currentByte, this.alignment ===
|
|
161
|
+
let data = this.operatingDataView.getInt32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
165
162
|
this.currentByte += 4;
|
|
166
163
|
return data;
|
|
167
164
|
}
|
|
168
165
|
readUint32() {
|
|
169
166
|
this.totalNumberOfBytesRead += 4;
|
|
170
|
-
let data = this.operatingDataView.getUint32(this.currentByte, this.alignment ===
|
|
167
|
+
let data = this.operatingDataView.getUint32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
171
168
|
this.currentByte += 4;
|
|
172
169
|
return data;
|
|
173
170
|
}
|
|
174
171
|
readLong() {
|
|
175
172
|
this.totalNumberOfBytesRead += 8;
|
|
176
|
-
let data = this.operatingDataView.getBigInt64(this.currentByte, this.alignment ===
|
|
173
|
+
let data = this.operatingDataView.getBigInt64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
177
174
|
this.currentByte += 8;
|
|
178
175
|
return data;
|
|
179
176
|
}
|
|
@@ -182,19 +179,19 @@ class ByteStreamReader {
|
|
|
182
179
|
}
|
|
183
180
|
readUint64() {
|
|
184
181
|
this.totalNumberOfBytesRead += 8;
|
|
185
|
-
let data = this.operatingDataView.getBigUint64(this.currentByte, this.alignment ===
|
|
182
|
+
let data = this.operatingDataView.getBigUint64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
186
183
|
this.currentByte += 8;
|
|
187
184
|
return data;
|
|
188
185
|
}
|
|
189
186
|
readFloat32() {
|
|
190
187
|
this.totalNumberOfBytesRead += 4;
|
|
191
|
-
let data = this.operatingDataView.getFloat32(this.currentByte, this.alignment ===
|
|
188
|
+
let data = this.operatingDataView.getFloat32(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
192
189
|
this.currentByte += 4;
|
|
193
190
|
return data;
|
|
194
191
|
}
|
|
195
192
|
readDouble() {
|
|
196
193
|
this.totalNumberOfBytesRead += 8;
|
|
197
|
-
let data = this.operatingDataView.getFloat64(this.currentByte, this.alignment ===
|
|
194
|
+
let data = this.operatingDataView.getFloat64(this.currentByte, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
198
195
|
this.currentByte += 8;
|
|
199
196
|
return data;
|
|
200
197
|
}
|
|
@@ -229,7 +226,7 @@ class ByteStreamReader {
|
|
|
229
226
|
return this.totalNumberOfBytesRead;
|
|
230
227
|
}
|
|
231
228
|
getBufferProgress() {
|
|
232
|
-
throw new
|
|
229
|
+
throw new UnimplementedError();
|
|
233
230
|
}
|
|
234
231
|
getBufferLength() {
|
|
235
232
|
return this.operatingStreamBuffer.byteLength;
|
|
@@ -238,4 +235,3 @@ class ByteStreamReader {
|
|
|
238
235
|
return this.operatingStreamBuffer.byteLength - this.currentByte;
|
|
239
236
|
}
|
|
240
237
|
}
|
|
241
|
-
exports.ByteStreamReader = ByteStreamReader;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.JsonStreamStateWriter = void 0;
|
|
4
|
-
const json_stream_writable_1 = require("./json-stream-writable");
|
|
5
|
-
class JsonStreamStateWriter extends json_stream_writable_1.JsonStreamWritable {
|
|
1
|
+
import { JsonStreamWritable } from "./json-stream-writable";
|
|
2
|
+
export class JsonStreamStateWriter extends JsonStreamWritable {
|
|
6
3
|
constructor(pushWritable, startState) {
|
|
7
4
|
super(pushWritable);
|
|
8
5
|
this.currentState = startState;
|
|
@@ -15,4 +12,3 @@ class JsonStreamStateWriter extends json_stream_writable_1.JsonStreamWritable {
|
|
|
15
12
|
this.currentState = transition.assignOnFinish;
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
|
-
exports.JsonStreamStateWriter = JsonStreamStateWriter;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.JsonStreamWritable = void 0;
|
|
4
|
-
class JsonStreamWritable {
|
|
1
|
+
export class JsonStreamWritable {
|
|
5
2
|
constructor(pushWritable) {
|
|
6
3
|
this.pushWritable = pushWritable;
|
|
7
4
|
this.isValid = () => this.openedSymbols.length === 0;
|
|
@@ -80,4 +77,3 @@ class JsonStreamWritable {
|
|
|
80
77
|
return;
|
|
81
78
|
}
|
|
82
79
|
}
|
|
83
|
-
exports.JsonStreamWritable = JsonStreamWritable;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.JsonStreamWriter = void 0;
|
|
4
|
-
const json_stream_state_writer_1 = require("./json-stream-state-writer");
|
|
5
|
-
class JsonStreamWriter extends json_stream_state_writer_1.JsonStreamStateWriter {
|
|
1
|
+
import { JsonStreamStateWriter } from "./json-stream-state-writer";
|
|
2
|
+
export class JsonStreamWriter extends JsonStreamStateWriter {
|
|
6
3
|
constructor(writer) {
|
|
7
4
|
super(async (value) => await writer.write(value), 'BEFORE_START');
|
|
8
5
|
this.writer = writer;
|
|
@@ -124,4 +121,3 @@ class JsonStreamWriter extends json_stream_state_writer_1.JsonStreamStateWriter
|
|
|
124
121
|
await this.useTransition(this.stateMachine.closeSave);
|
|
125
122
|
}
|
|
126
123
|
}
|
|
127
|
-
exports.JsonStreamWriter = JsonStreamWriter;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReadableStream } from
|
|
1
|
+
import { ReadableStream } from 'web-streams-polyfill';
|
|
2
2
|
export declare class ReadableStreamParser {
|
|
3
3
|
private static CreateReadableStreamForParsingSave;
|
|
4
4
|
static CreateReadableStreamFromSaveToJson: (name: string, bytes: Uint8Array, onDecompressedSaveBody?: (buffer: ArrayBuffer) => void, onProgress?: (progress: number, message?: string) => void) => {
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var _a;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const SaveEntity_1 = require("../../satisfactory/objects/SaveEntity");
|
|
10
|
-
const level_class_1 = require("../../satisfactory/save/level.class");
|
|
2
|
+
import { SatisfactorySave } from "../../satisfactory/save/satisfactory-save";
|
|
3
|
+
import { SaveReader } from "../../satisfactory/save/save-reader";
|
|
4
|
+
import { ReadableStream } from 'web-streams-polyfill';
|
|
5
|
+
import { SaveComponent, isSaveComponent } from "../../satisfactory/objects/SaveComponent";
|
|
6
|
+
import { SaveEntity, isSaveEntity } from "../../satisfactory/objects/SaveEntity";
|
|
7
|
+
import { Level } from "../../satisfactory/save/level.class";
|
|
11
8
|
const DEFAULT_BYTE_HIGHWATERMARK = 1024 * 1024 * 200;
|
|
12
9
|
const createStringLengthQueuingStrategy = (highWaterMark = DEFAULT_BYTE_HIGHWATERMARK / 4) => ({
|
|
13
10
|
highWaterMark,
|
|
@@ -97,7 +94,7 @@ class ReadableStreamParser {
|
|
|
97
94
|
writtenObjectsInLevel += objectCountToRead;
|
|
98
95
|
} while (totalReadObjectsInLevel < countObjectHeaders);
|
|
99
96
|
await write('], "collectables": [', false);
|
|
100
|
-
const collectables =
|
|
97
|
+
const collectables = Level.ReadCollectablesList(reader);
|
|
101
98
|
await write(`${collectables.map(obj => JSON.stringify(obj)).join(', ')}`, true);
|
|
102
99
|
await write(']', false);
|
|
103
100
|
await write('}', false);
|
|
@@ -107,7 +104,7 @@ class ReadableStreamParser {
|
|
|
107
104
|
_a = ReadableStreamParser;
|
|
108
105
|
ReadableStreamParser.CreateReadableStreamForParsingSave = (onStart, onCancel, onPullRequest, highWaterMark = DEFAULT_BYTE_HIGHWATERMARK / 4) => {
|
|
109
106
|
let ourController = null;
|
|
110
|
-
const stream = new
|
|
107
|
+
const stream = new ReadableStream({
|
|
111
108
|
start: (controller) => {
|
|
112
109
|
ourController = controller;
|
|
113
110
|
onStart(ourController);
|
|
@@ -148,9 +145,9 @@ ReadableStreamParser.CreateReadableStreamFromSaveToJson = (name, bytes, onDecomp
|
|
|
148
145
|
controller.enqueue(value);
|
|
149
146
|
};
|
|
150
147
|
const startStreaming = async () => {
|
|
151
|
-
const reader = new
|
|
148
|
+
const reader = new SaveReader(bytes.buffer, onProgress);
|
|
152
149
|
const header = reader.readHeader();
|
|
153
|
-
const save = new
|
|
150
|
+
const save = new SatisfactorySave(name, header);
|
|
154
151
|
const inflateResult = reader.inflateChunks();
|
|
155
152
|
onDecompressedSaveBody(reader.getBuffer());
|
|
156
153
|
const gridHash = reader.readSaveBodyHash();
|
|
@@ -172,13 +169,13 @@ ReadableStreamParser.ReadNObjectHeaders = (reader, count) => {
|
|
|
172
169
|
let obj;
|
|
173
170
|
let objectType = reader.readInt32();
|
|
174
171
|
switch (objectType) {
|
|
175
|
-
case
|
|
176
|
-
obj = new
|
|
177
|
-
|
|
172
|
+
case SaveEntity.TypeID:
|
|
173
|
+
obj = new SaveEntity('', '', '', '');
|
|
174
|
+
SaveEntity.ParseHeader(reader, obj);
|
|
178
175
|
break;
|
|
179
|
-
case
|
|
180
|
-
obj = new
|
|
181
|
-
|
|
176
|
+
case SaveComponent.TypeID:
|
|
177
|
+
obj = new SaveComponent('', '', '', '');
|
|
178
|
+
SaveComponent.ParseHeader(reader, obj);
|
|
182
179
|
break;
|
|
183
180
|
default:
|
|
184
181
|
throw new Error('Unknown object type' + objectType);
|
|
@@ -193,12 +190,12 @@ ReadableStreamParser.ReadNObjects = (reader, count, objects, buildVersion) => {
|
|
|
193
190
|
objects[i].unknownType2 = reader.readInt32();
|
|
194
191
|
const binarySize = reader.readInt32();
|
|
195
192
|
const before = reader.getBufferPosition();
|
|
196
|
-
if (
|
|
197
|
-
|
|
193
|
+
if (isSaveEntity(objects[i])) {
|
|
194
|
+
SaveEntity.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
|
|
198
195
|
}
|
|
199
|
-
else if (
|
|
200
|
-
|
|
196
|
+
else if (isSaveComponent(objects[i])) {
|
|
197
|
+
SaveComponent.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
|
|
201
198
|
}
|
|
202
199
|
}
|
|
203
200
|
};
|
|
204
|
-
|
|
201
|
+
export { ReadableStreamParser };
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const __1 = require("../../..");
|
|
5
|
-
const SaveComponent_1 = require("../../satisfactory/objects/SaveComponent");
|
|
6
|
-
const SaveEntity_1 = require("../../satisfactory/objects/SaveEntity");
|
|
1
|
+
import { Level, SatisfactorySave, SaveComponent, SaveEntity, SaveReader } from '../../..';
|
|
2
|
+
import { isSaveComponent } from '../../satisfactory/objects/SaveComponent';
|
|
3
|
+
import { isSaveEntity } from '../../satisfactory/objects/SaveEntity';
|
|
7
4
|
class StreamParser {
|
|
8
5
|
static async ParseSaveFileToJsonStream(name, bytes, outputJson, onDecompressedSaveBody = () => { }, onProgress = () => { }) {
|
|
9
|
-
const reader = new
|
|
6
|
+
const reader = new SaveReader(bytes.buffer, onProgress);
|
|
10
7
|
const writer = outputJson.getWriter();
|
|
11
8
|
const header = reader.readHeader();
|
|
12
|
-
const save = new
|
|
9
|
+
const save = new SatisfactorySave(name, header);
|
|
13
10
|
const inflateResult = reader.inflateChunks();
|
|
14
11
|
onDecompressedSaveBody(reader.getBuffer());
|
|
15
12
|
const gridHash = reader.readSaveBodyHash();
|
|
@@ -63,7 +60,7 @@ class StreamParser {
|
|
|
63
60
|
await writer.write(`${objects.map(obj => JSON.stringify(obj)).join(', ')}`);
|
|
64
61
|
} while (totalReadObjects < countObjectHeaders);
|
|
65
62
|
await writer.write('], "collectables": [');
|
|
66
|
-
const collectables =
|
|
63
|
+
const collectables = Level.ReadCollectablesList(reader);
|
|
67
64
|
await writer.write(`${collectables.map(obj => JSON.stringify(obj)).join(', ')}`);
|
|
68
65
|
await writer.write(']');
|
|
69
66
|
await writer.write('}');
|
|
@@ -77,13 +74,13 @@ StreamParser.ReadNObjectHeaders = (reader, count) => {
|
|
|
77
74
|
let obj;
|
|
78
75
|
let objectType = reader.readInt32();
|
|
79
76
|
switch (objectType) {
|
|
80
|
-
case
|
|
81
|
-
obj = new
|
|
82
|
-
|
|
77
|
+
case SaveEntity.TypeID:
|
|
78
|
+
obj = new SaveEntity('', '', '', '');
|
|
79
|
+
SaveEntity.ParseHeader(reader, obj);
|
|
83
80
|
break;
|
|
84
|
-
case
|
|
85
|
-
obj = new
|
|
86
|
-
|
|
81
|
+
case SaveComponent.TypeID:
|
|
82
|
+
obj = new SaveComponent('', '', '', '');
|
|
83
|
+
SaveComponent.ParseHeader(reader, obj);
|
|
87
84
|
break;
|
|
88
85
|
default:
|
|
89
86
|
throw new Error('Unknown object type' + objectType);
|
|
@@ -98,12 +95,12 @@ StreamParser.ReadNObjects = (reader, count, objects, buildVersion) => {
|
|
|
98
95
|
objects[i].unknownType2 = reader.readInt32();
|
|
99
96
|
const binarySize = reader.readInt32();
|
|
100
97
|
const before = reader.getBufferPosition();
|
|
101
|
-
if (
|
|
102
|
-
|
|
98
|
+
if (isSaveEntity(objects[i])) {
|
|
99
|
+
SaveEntity.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
|
|
103
100
|
}
|
|
104
|
-
else if (
|
|
105
|
-
|
|
101
|
+
else if (isSaveComponent(objects[i])) {
|
|
102
|
+
SaveComponent.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
|
|
106
103
|
}
|
|
107
104
|
}
|
|
108
105
|
};
|
|
109
|
-
|
|
106
|
+
export { StreamParser };
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.SaveStreamJsonStringifier = void 0;
|
|
4
|
-
const save_stream_writer_class_1 = require("./save-stream-writer.class");
|
|
5
|
-
class SaveStreamJsonStringifier {
|
|
1
|
+
import { SaveStreamWriter } from "./save-stream-writer.class";
|
|
2
|
+
export class SaveStreamJsonStringifier {
|
|
6
3
|
static async StreamStringifySave(save, output) {
|
|
7
|
-
const writer = new
|
|
4
|
+
const writer = new SaveStreamWriter(output.getWriter());
|
|
8
5
|
await writer.beginSave();
|
|
9
6
|
await writer.writeHeader(save.header);
|
|
10
7
|
if (save.compressionInfo) {
|
|
@@ -32,4 +29,3 @@ class SaveStreamJsonStringifier {
|
|
|
32
29
|
await writer.close();
|
|
33
30
|
}
|
|
34
31
|
}
|
|
35
|
-
exports.SaveStreamJsonStringifier = SaveStreamJsonStringifier;
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const pako_1 = __importDefault(require("pako"));
|
|
8
|
-
const __1 = require("../..");
|
|
9
|
-
const alignment_enum_1 = require("../byte/alignment.enum");
|
|
10
|
-
const byte_stream_reader_class_1 = require("./byte-stream-reader.class");
|
|
11
|
-
const stream_level_class_1 = require("./stream-level.class");
|
|
12
|
-
class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
|
|
1
|
+
import Pako from "pako";
|
|
2
|
+
import { CompressionLibraryError, CorruptSaveError, UnsupportedVersionError } from "../..";
|
|
3
|
+
import { Alignment } from "../byte/alignment.enum";
|
|
4
|
+
import { ByteStreamReader } from "./byte-stream-reader.class";
|
|
5
|
+
import { StreamLevel } from "./stream-level.class";
|
|
6
|
+
class SaveStreamReader extends ByteStreamReader {
|
|
13
7
|
constructor(reader, maxBufferThreshold, onCloseCallback = async () => { }) {
|
|
14
|
-
super(reader, onCloseCallback, 30000, maxBufferThreshold,
|
|
8
|
+
super(reader, onCloseCallback, 30000, maxBufferThreshold, Alignment.LITTLE_ENDIAN);
|
|
15
9
|
this.compressionInfo = {
|
|
16
10
|
packageFileTag: 0,
|
|
17
11
|
maxUncompressedChunkContentSize: 0,
|
|
@@ -61,7 +55,7 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
|
|
|
61
55
|
if (header.saveVersion >= 21) {
|
|
62
56
|
}
|
|
63
57
|
else {
|
|
64
|
-
throw new
|
|
58
|
+
throw new UnsupportedVersionError("The save version is too old to support encoding currently. Save in newer game version.");
|
|
65
59
|
}
|
|
66
60
|
return header;
|
|
67
61
|
}
|
|
@@ -71,22 +65,22 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
|
|
|
71
65
|
this.operatingDataView = new DataView(this.operatingStreamBuffer.buffer);
|
|
72
66
|
this.currentByte = 0;
|
|
73
67
|
if (this.compressionInfo.packageFileTag <= 0) {
|
|
74
|
-
this.compressionInfo.packageFileTag = this.operatingDataView.getInt32(0, this.alignment ===
|
|
68
|
+
this.compressionInfo.packageFileTag = this.operatingDataView.getInt32(0, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
75
69
|
}
|
|
76
70
|
if (this.compressionInfo.maxUncompressedChunkContentSize <= 0) {
|
|
77
|
-
this.compressionInfo.maxUncompressedChunkContentSize = this.operatingDataView.getInt32(8, this.alignment ===
|
|
71
|
+
this.compressionInfo.maxUncompressedChunkContentSize = this.operatingDataView.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
78
72
|
}
|
|
79
|
-
const chunkCompressedLength = this.operatingDataView.getInt32(32, this.alignment ===
|
|
80
|
-
const chunkUncompressedLength = this.operatingDataView.getInt32(40, this.alignment ===
|
|
73
|
+
const chunkCompressedLength = this.operatingDataView.getInt32(32, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
74
|
+
const chunkUncompressedLength = this.operatingDataView.getInt32(40, this.alignment === Alignment.LITTLE_ENDIAN);
|
|
81
75
|
this.currentByte = this.compressionInfo.chunkHeaderSize;
|
|
82
76
|
await this.allocate(chunkCompressedLength);
|
|
83
77
|
let currentChunk = this.operatingStreamBuffer.slice(this.currentByte, this.currentByte + chunkCompressedLength);
|
|
84
78
|
this.currentByte += chunkCompressedLength;
|
|
85
79
|
this.totalNumberOfBytesRead += chunkUncompressedLength;
|
|
86
80
|
try {
|
|
87
|
-
const uncompressedChunk =
|
|
81
|
+
const uncompressedChunk = Pako.inflate(currentChunk);
|
|
88
82
|
if (uncompressedChunk.byteLength !== chunkUncompressedLength) {
|
|
89
|
-
throw new
|
|
83
|
+
throw new CorruptSaveError('indicated save body chunk size does not match the inflated result. Save is possibly corrupt.');
|
|
90
84
|
}
|
|
91
85
|
if (this.debug) {
|
|
92
86
|
console.log(`${new Date().toString()}: decompressed a chunk from ${currentChunk.byteLength} to ${uncompressedChunk.byteLength} bytes.`);
|
|
@@ -94,7 +88,7 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
|
|
|
94
88
|
return uncompressedChunk;
|
|
95
89
|
}
|
|
96
90
|
catch (err) {
|
|
97
|
-
throw new
|
|
91
|
+
throw new CompressionLibraryError("Failed to inflate compressed save data. " + err);
|
|
98
92
|
}
|
|
99
93
|
}
|
|
100
94
|
debugInfo() {
|
|
@@ -102,7 +96,7 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
|
|
|
102
96
|
}
|
|
103
97
|
async streamLevelsToOutput(writer, header) {
|
|
104
98
|
if (header.saveVersion < 29) {
|
|
105
|
-
throw new
|
|
99
|
+
throw new UnsupportedVersionError('Support for < U6 is not yet implemented.');
|
|
106
100
|
}
|
|
107
101
|
await this.allocate(100);
|
|
108
102
|
const numSubLevels = this.readInt32();
|
|
@@ -111,11 +105,11 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
|
|
|
111
105
|
if (this.debug) {
|
|
112
106
|
console.log(`${new Date().toString()}: reading level [${(j)}/${numSubLevels}] ${levelName}`);
|
|
113
107
|
}
|
|
114
|
-
await
|
|
108
|
+
await StreamLevel.ReadLevelAsync(this, writer, levelName, header.buildVersion);
|
|
115
109
|
}
|
|
116
110
|
return;
|
|
117
111
|
}
|
|
118
112
|
}
|
|
119
113
|
SaveStreamReader.EPOCH_TICKS = 621355968000000000n;
|
|
120
114
|
SaveStreamReader.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 48;
|
|
121
|
-
|
|
115
|
+
export { SaveStreamReader };
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SaveStreamWriter = void 0;
|
|
4
1
|
class ModeStateTracker {
|
|
5
2
|
constructor(mode) {
|
|
6
3
|
this.mode = mode;
|
|
@@ -14,7 +11,7 @@ class ModeStateTracker {
|
|
|
14
11
|
this.mode = newMode;
|
|
15
12
|
}
|
|
16
13
|
}
|
|
17
|
-
class SaveStreamWriter {
|
|
14
|
+
export class SaveStreamWriter {
|
|
18
15
|
constructor(writer) {
|
|
19
16
|
this.writer = writer;
|
|
20
17
|
this.createExecutionFunction = async (allowedInputModes, fn, targetMode) => {
|
|
@@ -83,4 +80,3 @@ class SaveStreamWriter {
|
|
|
83
80
|
return this.writer.close();
|
|
84
81
|
}
|
|
85
82
|
}
|
|
86
|
-
exports.SaveStreamWriter = SaveStreamWriter;
|