@etothepii/satisfactory-file-parser 0.0.33 → 0.1.1
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 +12 -8
- package/build/index.js +41 -51
- package/build/parser/byte/alignment.enum.js +8 -18
- package/build/parser/byte/binary-operable.interface.js +2 -12
- package/build/parser/byte/binary-readable.interface.js +2 -12
- package/build/parser/byte/byte-reader.class.js +122 -132
- package/build/parser/byte/byte-writer.class.js +133 -143
- package/build/parser/error/parser.error.js +40 -50
- package/build/parser/file.types.js +2 -12
- package/build/parser/parser.js +84 -95
- package/build/parser/satisfactory/blueprint/blueprint-reader.js +109 -119
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +56 -66
- package/build/parser/satisfactory/blueprint/blueprint.types.js +2 -12
- package/build/parser/satisfactory/objects/DataFields.js +306 -307
- package/build/parser/satisfactory/objects/ObjectReference.js +14 -24
- package/build/parser/satisfactory/objects/Property.js +974 -977
- package/build/parser/satisfactory/objects/SaveComponent.js +28 -38
- package/build/parser/satisfactory/objects/SaveEntity.js +69 -75
- package/build/parser/satisfactory/objects/SaveObject.js +26 -36
- package/build/parser/satisfactory/save/asynchronous-level.class.js +60 -70
- package/build/parser/satisfactory/save/level.class.d.ts +1 -1
- package/build/parser/satisfactory/save/level.class.js +147 -128
- package/build/parser/satisfactory/save/satisfactory-save.js +10 -20
- package/build/parser/satisfactory/save/save-reader.d.ts +2 -2
- package/build/parser/satisfactory/save/save-reader.js +209 -171
- package/build/parser/satisfactory/save/save-writer.js +97 -107
- package/build/parser/satisfactory/save/save.types.js +2 -12
- package/build/parser/satisfactory/structs/util.types.d.ts +6 -0
- package/build/parser/satisfactory/structs/util.types.js +122 -96
- package/build/parser/stream/byte-stream-reader.class.js +217 -227
- package/build/parser/stream/json-stream-state-writer.js +15 -25
- package/build/parser/stream/json-stream-writable.js +72 -82
- package/build/parser/stream/json-stream-writer.js +122 -132
- package/build/parser/stream/save-stream-json-stringifier.js +29 -39
- package/build/parser/stream/save-stream-reader.class.js +106 -116
- package/build/parser/stream/save-stream-writer.class.js +90 -100
- package/build/parser/stream/stream-level.class.js +93 -103
- package/package.json +2 -2
|
@@ -1,148 +1,167 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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 {
|
|
8
|
+
constructor(name) {
|
|
9
|
+
this.name = name;
|
|
10
|
+
this.objects = [];
|
|
11
|
+
this.collectables = [];
|
|
5
12
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
static SerializeObjectHeaders(writer, objects) {
|
|
23
|
-
writer.writeInt32(objects.length);
|
|
24
|
-
for (const obj of objects) {
|
|
25
|
-
switch (obj.type) {
|
|
26
|
-
case 'SaveEntity':
|
|
27
|
-
writer.writeInt32(SaveEntity_1.SaveEntity.TypeID);
|
|
28
|
-
SaveEntity_1.SaveEntity.SerializeHeader(writer, obj);
|
|
29
|
-
break;
|
|
30
|
-
case 'SaveComponent':
|
|
31
|
-
writer.writeInt32(SaveComponent_1.SaveComponent.TypeID);
|
|
32
|
-
SaveComponent_1.SaveComponent.SerializeHeader(writer, obj);
|
|
33
|
-
break;
|
|
34
|
-
default:
|
|
35
|
-
console.log('Unknown object type', obj);
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
13
|
+
static SerializeObjectHeaders(writer, objects) {
|
|
14
|
+
writer.writeInt32(objects.length);
|
|
15
|
+
for (const obj of objects) {
|
|
16
|
+
switch (obj.type) {
|
|
17
|
+
case 'SaveEntity':
|
|
18
|
+
writer.writeInt32(SaveEntity_1.SaveEntity.TypeID);
|
|
19
|
+
SaveEntity_1.SaveEntity.SerializeHeader(writer, obj);
|
|
20
|
+
break;
|
|
21
|
+
case 'SaveComponent':
|
|
22
|
+
writer.writeInt32(SaveComponent_1.SaveComponent.TypeID);
|
|
23
|
+
SaveComponent_1.SaveComponent.SerializeHeader(writer, obj);
|
|
24
|
+
break;
|
|
25
|
+
default:
|
|
26
|
+
console.log('Unknown object type', obj);
|
|
27
|
+
break;
|
|
38
28
|
}
|
|
39
29
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
30
|
+
}
|
|
31
|
+
static WriteLevel(writer, level, buildVersion) {
|
|
32
|
+
const lenIndicatorHeaderAndCollectableSize = writer.getBufferPosition();
|
|
33
|
+
writer.writeInt32(0);
|
|
34
|
+
Level.SerializeObjectHeaders(writer, level.objects);
|
|
35
|
+
Level.SerializeCollectablesList(writer, level.collectables);
|
|
36
|
+
writer.writeBinarySizeFromPosition(lenIndicatorHeaderAndCollectableSize, lenIndicatorHeaderAndCollectableSize + 4);
|
|
37
|
+
Level.SerializeObjectContents(writer, level.objects, buildVersion, level.name);
|
|
38
|
+
Level.SerializeCollectablesList(writer, level.collectables);
|
|
39
|
+
}
|
|
40
|
+
static SerializeObjectContents(writer, objects, buildVersion, levelName) {
|
|
41
|
+
const lenIndicatorEntities = writer.getBufferPosition();
|
|
42
|
+
writer.writeInt32(0);
|
|
43
|
+
writer.writeInt32(objects.length);
|
|
44
|
+
for (const obj of objects) {
|
|
45
|
+
const lenReplacementPosition = writer.getBufferPosition();
|
|
51
46
|
writer.writeInt32(0);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const lenReplacementPosition = writer.getBufferPosition();
|
|
55
|
-
writer.writeInt32(0);
|
|
56
|
-
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
57
|
-
SaveEntity_1.SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
58
|
-
}
|
|
59
|
-
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
60
|
-
SaveComponent_1.SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
61
|
-
}
|
|
62
|
-
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
47
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
48
|
+
SaveEntity_1.SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
63
49
|
}
|
|
64
|
-
|
|
50
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
51
|
+
SaveComponent_1.SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
52
|
+
}
|
|
53
|
+
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
65
54
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
55
|
+
writer.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 4);
|
|
56
|
+
}
|
|
57
|
+
static ReadObjectHeaders(reader, objectsList, onProgressCallback) {
|
|
58
|
+
let countObjectHeaders = reader.readInt32();
|
|
59
|
+
for (let i = 0; i < countObjectHeaders; i++) {
|
|
60
|
+
if (i % 1000 === 0) {
|
|
61
|
+
onProgressCallback(reader.getBufferProgress());
|
|
62
|
+
}
|
|
63
|
+
let objectType = reader.readInt32();
|
|
64
|
+
switch (objectType) {
|
|
65
|
+
case SaveEntity_1.SaveEntity.TypeID:
|
|
66
|
+
let object = new SaveEntity_1.SaveEntity('', '', '', '');
|
|
67
|
+
SaveEntity_1.SaveEntity.ParseHeader(reader, object);
|
|
68
|
+
objectsList.push(object);
|
|
69
|
+
break;
|
|
70
|
+
case SaveComponent_1.SaveComponent.TypeID:
|
|
71
|
+
let component = new SaveComponent_1.SaveComponent('', '', '', '');
|
|
72
|
+
SaveComponent_1.SaveComponent.ParseHeader(reader, component);
|
|
73
|
+
objectsList.push(component);
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
console.log('Unknown object type', objectType);
|
|
77
|
+
break;
|
|
88
78
|
}
|
|
89
79
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
80
|
+
const unk = reader.readInt32();
|
|
81
|
+
}
|
|
82
|
+
static async ReadObjectContents(levelName, reader, objectsList, buildVersion, onProgressCallback) {
|
|
83
|
+
const posBefore = reader.getBufferPosition();
|
|
84
|
+
const countEntities = reader.readInt32();
|
|
85
|
+
if (countEntities !== objectsList.length) {
|
|
86
|
+
throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);
|
|
87
|
+
}
|
|
88
|
+
for (let i = 0; i < countEntities; i++) {
|
|
89
|
+
if (i % 1000 === 0) {
|
|
90
|
+
onProgressCallback(reader.getBufferProgress());
|
|
96
91
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
const len = reader.readInt32();
|
|
102
|
-
const before = reader.getBufferPosition();
|
|
103
|
-
const obj = objectsList[i];
|
|
104
|
-
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
105
|
-
SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
106
|
-
}
|
|
107
|
-
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
108
|
-
SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
109
|
-
}
|
|
110
|
-
const after = reader.getBufferPosition();
|
|
111
|
-
if (after - before !== len) {
|
|
112
|
-
console.warn('entity may be corrupt', this.name, i);
|
|
113
|
-
}
|
|
92
|
+
const len = reader.readInt32();
|
|
93
|
+
if (len === 0) {
|
|
94
|
+
throw new Error(`check number is a wrong value (${len}). This normally indicates a corrupt entity or save.`);
|
|
114
95
|
}
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
96
|
+
const before = reader.getBufferPosition();
|
|
97
|
+
const obj = objectsList[i];
|
|
98
|
+
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
|
|
99
|
+
SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
|
|
118
100
|
}
|
|
101
|
+
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
|
|
102
|
+
const wtf1 = reader.readInt32();
|
|
103
|
+
const wtf2 = reader.readInt32();
|
|
104
|
+
SaveComponent_1.SaveComponent.ParseData(obj, wtf2, reader, buildVersion, obj.typePath);
|
|
105
|
+
}
|
|
106
|
+
const after = reader.getBufferPosition();
|
|
107
|
+
if (after - before !== len) {
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const posAfter = reader.getBufferPosition();
|
|
111
|
+
}
|
|
112
|
+
static ReadLevel(reader, levelName, buildVersion) {
|
|
113
|
+
const level = new Level(levelName);
|
|
114
|
+
const levelStartPos = reader.getBufferPosition();
|
|
115
|
+
const placeholderHead = reader.readInt32();
|
|
116
|
+
if (placeholderHead === 8) {
|
|
117
|
+
const morePlaceholder = reader.readBytes(28);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
reader.skipBytes(-4);
|
|
119
121
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
reader.onProgressCallback(reader.getBufferProgress());
|
|
125
|
-
level.collectables = Level.ReadCollectablesList(reader);
|
|
126
|
-
Level.ReadObjectContents(reader, level.objects, buildVersion, reader.onProgressCallback);
|
|
127
|
-
reader.onProgressCallback(reader.getBufferProgress());
|
|
128
|
-
Level.ReadCollectablesList(reader);
|
|
122
|
+
const lookahead1 = reader.readInt32();
|
|
123
|
+
const lookahead2 = reader.readInt32();
|
|
124
|
+
if (lookahead1 !== 0 && lookahead2 !== 0) {
|
|
125
|
+
reader.skipBytes(-8);
|
|
129
126
|
return level;
|
|
130
127
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
for (const collectable of collectables) {
|
|
134
|
-
ObjectReference_1.ObjectReference.Serialize(writer, collectable);
|
|
135
|
-
}
|
|
128
|
+
else if (lookahead1 !== 0 && lookahead2 === 0) {
|
|
129
|
+
reader.skipBytes(-8);
|
|
136
130
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
131
|
+
else {
|
|
132
|
+
throw new Error('Unexpected. what now? TODO FIXME');
|
|
133
|
+
}
|
|
134
|
+
const binLen = reader.readInt32();
|
|
135
|
+
const unk = reader.readInt32();
|
|
136
|
+
Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback);
|
|
137
|
+
reader.onProgressCallback(reader.getBufferProgress());
|
|
138
|
+
level.collectables = Level.ReadCollectablesList(reader);
|
|
139
|
+
Level.ReadObjectContents(levelName, reader, level.objects, buildVersion, reader.onProgressCallback);
|
|
140
|
+
reader.onProgressCallback(reader.getBufferProgress());
|
|
141
|
+
Level.ReadCollectablesList(reader);
|
|
142
|
+
return level;
|
|
143
|
+
}
|
|
144
|
+
static SerializeCollectablesList(writer, collectables) {
|
|
145
|
+
writer.writeInt32(collectables.length);
|
|
146
|
+
for (const collectable of collectables) {
|
|
147
|
+
ObjectReference_1.ObjectReference.Serialize(writer, collectable);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
static ReadCollectablesList(reader) {
|
|
151
|
+
const collected = [];
|
|
152
|
+
let countSmthing = reader.readInt32();
|
|
153
|
+
if (countSmthing > 0) {
|
|
154
|
+
const lookahead = reader.readInt32();
|
|
155
|
+
if (lookahead === 0) {
|
|
156
|
+
return collected;
|
|
157
|
+
}
|
|
158
|
+
reader.skipBytes(-4);
|
|
159
|
+
for (let i = 0; i < countSmthing; i++) {
|
|
141
160
|
const collectable = ObjectReference_1.ObjectReference.Parse(reader);
|
|
142
161
|
collected.push(collectable);
|
|
143
162
|
}
|
|
144
|
-
return collected;
|
|
145
163
|
}
|
|
164
|
+
return collected;
|
|
146
165
|
}
|
|
147
|
-
|
|
148
|
-
|
|
166
|
+
}
|
|
167
|
+
exports.Level = Level;
|
|
@@ -1,21 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SatisfactorySave = void 0;
|
|
4
|
+
class SatisfactorySave {
|
|
5
|
+
constructor(header) {
|
|
6
|
+
this.levels = [];
|
|
7
|
+
this.trailingCollectedObjects = [];
|
|
8
|
+
this.header = header;
|
|
5
9
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
})(function (require, exports) {
|
|
10
|
-
"use strict";
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.SatisfactorySave = void 0;
|
|
13
|
-
class SatisfactorySave {
|
|
14
|
-
constructor(header) {
|
|
15
|
-
this.levels = [];
|
|
16
|
-
this.trailingCollectedObjects = [];
|
|
17
|
-
this.header = header;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
exports.SatisfactorySave = SatisfactorySave;
|
|
21
|
-
});
|
|
10
|
+
}
|
|
11
|
+
exports.SatisfactorySave = SatisfactorySave;
|
|
@@ -16,7 +16,7 @@ export type SaveProjectionConfig = {
|
|
|
16
16
|
};
|
|
17
17
|
export declare const projectionFilterApplies: (config: SaveProjectionConfig, object: SaveComponent | SaveEntity) => boolean;
|
|
18
18
|
export type ReadMode = 'stream' | 'whole';
|
|
19
|
-
export declare const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE =
|
|
19
|
+
export declare const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;
|
|
20
20
|
export declare class SaveReader extends ByteReader {
|
|
21
21
|
onProgressCallback: (progress: number, msg?: string) => void;
|
|
22
22
|
header: SatisfactorySaveHeader | undefined;
|
|
@@ -30,6 +30,6 @@ export declare class SaveReader extends ByteReader {
|
|
|
30
30
|
concatenatedChunkLength: number;
|
|
31
31
|
numChunks: number;
|
|
32
32
|
};
|
|
33
|
-
|
|
33
|
+
readLevelsU8(): Level[];
|
|
34
34
|
readLevelsAsynchronously(writer: SaveStreamWriter): Promise<Level[]>;
|
|
35
35
|
}
|