@etothepii/satisfactory-file-parser 0.0.29 → 0.0.31
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 +19 -0
- package/build/index.js +65 -0
- package/build/parser/byte/alignment.enum.d.ts +4 -0
- package/build/parser/byte/alignment.enum.js +18 -0
- package/build/parser/byte/byte-reader.class.d.ts +34 -0
- package/build/parser/byte/byte-reader.class.js +131 -0
- package/build/parser/byte/byte-writer.class.d.ts +33 -0
- package/build/parser/byte/byte-writer.class.js +149 -0
- package/build/parser/error/parser.error.d.ts +12 -0
- package/build/parser/error/parser.error.js +38 -0
- package/build/parser/file.types.d.ts +9 -0
- package/build/parser/file.types.js +12 -0
- package/build/parser/parser.d.ts +16 -0
- package/build/parser/parser.js +98 -0
- package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts +18 -0
- package/build/parser/satisfactory/blueprint/blueprint-reader.js +134 -0
- package/build/parser/satisfactory/blueprint/blueprint-writer.d.ts +15 -0
- package/build/parser/satisfactory/blueprint/blueprint-writer.js +73 -0
- package/build/parser/satisfactory/blueprint/blueprint.types.d.ts +20 -0
- package/build/parser/satisfactory/blueprint/blueprint.types.js +12 -0
- package/build/parser/satisfactory/objects/DataFields.d.ts +13 -0
- package/build/parser/satisfactory/objects/DataFields.js +234 -0
- package/build/parser/satisfactory/objects/ObjectReference.d.ts +9 -0
- package/build/parser/satisfactory/objects/ObjectReference.js +27 -0
- package/build/parser/satisfactory/objects/Property.d.ts +270 -0
- package/build/parser/satisfactory/objects/Property.js +1011 -0
- package/build/parser/satisfactory/objects/SaveComponent.d.ts +16 -0
- package/build/parser/satisfactory/objects/SaveComponent.js +41 -0
- package/build/parser/satisfactory/objects/SaveEntity.d.ts +25 -0
- package/build/parser/satisfactory/objects/SaveEntity.js +80 -0
- package/build/parser/satisfactory/objects/SaveObject.d.ts +14 -0
- package/build/parser/satisfactory/objects/SaveObject.js +39 -0
- package/build/parser/satisfactory/save/level.class.d.ts +21 -0
- package/build/parser/satisfactory/save/level.class.js +148 -0
- package/build/parser/satisfactory/save/satisfactory-save.d.ts +11 -0
- package/build/parser/satisfactory/save/satisfactory-save.js +21 -0
- package/build/parser/satisfactory/save/save-reader.d.ts +44 -0
- package/build/parser/satisfactory/save/save-reader.js +243 -0
- package/build/parser/satisfactory/save/save-writer.d.ts +12 -0
- package/build/parser/satisfactory/save/save-writer.js +122 -0
- package/build/parser/satisfactory/save/save.types.d.ts +49 -0
- package/build/parser/satisfactory/save/save.types.js +12 -0
- package/build/parser/satisfactory/structs/util.types.d.ts +40 -0
- package/build/parser/satisfactory/structs/util.types.js +105 -0
- package/package.json +3 -3
- package/dist/index.d.ts +0 -610
- package/dist/index.js +0 -1
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from './parser/satisfactory/blueprint/blueprint.types';
|
|
2
|
+
export { DataFields } from './parser/satisfactory/objects/DataFields';
|
|
3
|
+
export { ObjectReference } from './parser/satisfactory/objects/ObjectReference';
|
|
4
|
+
export * from './parser/satisfactory/objects/Property';
|
|
5
|
+
export { SaveComponent } from './parser/satisfactory/objects/SaveComponent';
|
|
6
|
+
export { SaveEntity } from './parser/satisfactory/objects/SaveEntity';
|
|
7
|
+
export { Level } from './parser/satisfactory/save/level.class';
|
|
8
|
+
export { SatisfactorySave } from './parser/satisfactory/save/satisfactory-save';
|
|
9
|
+
export * from './parser/satisfactory/save/save.types';
|
|
10
|
+
export { ByteReader } from './parser/byte/byte-reader.class';
|
|
11
|
+
export { ByteWriter } from './parser/byte/byte-writer.class';
|
|
12
|
+
export { BlueprintConfigReader, BlueprintReader } from './parser/satisfactory/blueprint/blueprint-reader';
|
|
13
|
+
export { BlueprintConfigWriter, BlueprintWriter } from './parser/satisfactory/blueprint/blueprint-writer';
|
|
14
|
+
export { SaveReader } from './parser/satisfactory/save/save-reader';
|
|
15
|
+
export { SaveWriter } from './parser/satisfactory/save/save-writer';
|
|
16
|
+
export * from './parser/satisfactory/structs/util.types';
|
|
17
|
+
export { CompressionLibraryError, CorruptSaveError, ParserError, UnsupportedVersionError } from './parser/error/parser.error';
|
|
18
|
+
export * from './parser/file.types';
|
|
19
|
+
export { Parser } from './parser/parser';
|
package/build/index.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
2
|
+
if (k2 === undefined) k2 = k;
|
|
3
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
4
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
5
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
6
|
+
}
|
|
7
|
+
Object.defineProperty(o, k2, desc);
|
|
8
|
+
}) : (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
o[k2] = m[k];
|
|
11
|
+
}));
|
|
12
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
13
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
14
|
+
};
|
|
15
|
+
(function (factory) {
|
|
16
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
17
|
+
var v = factory(require, exports);
|
|
18
|
+
if (v !== undefined) module.exports = v;
|
|
19
|
+
}
|
|
20
|
+
else if (typeof define === "function" && define.amd) {
|
|
21
|
+
define(["require", "exports", "./parser/satisfactory/blueprint/blueprint.types", "./parser/satisfactory/objects/DataFields", "./parser/satisfactory/objects/ObjectReference", "./parser/satisfactory/objects/Property", "./parser/satisfactory/objects/SaveComponent", "./parser/satisfactory/objects/SaveEntity", "./parser/satisfactory/save/level.class", "./parser/satisfactory/save/satisfactory-save", "./parser/satisfactory/save/save.types", "./parser/byte/byte-reader.class", "./parser/byte/byte-writer.class", "./parser/satisfactory/blueprint/blueprint-reader", "./parser/satisfactory/blueprint/blueprint-writer", "./parser/satisfactory/save/save-reader", "./parser/satisfactory/save/save-writer", "./parser/satisfactory/structs/util.types", "./parser/error/parser.error", "./parser/file.types", "./parser/parser"], factory);
|
|
22
|
+
}
|
|
23
|
+
})(function (require, exports) {
|
|
24
|
+
"use strict";
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.Parser = exports.UnsupportedVersionError = exports.ParserError = exports.CorruptSaveError = exports.CompressionLibraryError = exports.SaveWriter = exports.SaveReader = exports.BlueprintWriter = exports.BlueprintConfigWriter = exports.BlueprintReader = exports.BlueprintConfigReader = exports.ByteWriter = exports.ByteReader = exports.SatisfactorySave = exports.Level = exports.SaveEntity = exports.SaveComponent = exports.ObjectReference = exports.DataFields = void 0;
|
|
27
|
+
__exportStar(require("./parser/satisfactory/blueprint/blueprint.types"), exports);
|
|
28
|
+
var DataFields_1 = require("./parser/satisfactory/objects/DataFields");
|
|
29
|
+
Object.defineProperty(exports, "DataFields", { enumerable: true, get: function () { return DataFields_1.DataFields; } });
|
|
30
|
+
var ObjectReference_1 = require("./parser/satisfactory/objects/ObjectReference");
|
|
31
|
+
Object.defineProperty(exports, "ObjectReference", { enumerable: true, get: function () { return ObjectReference_1.ObjectReference; } });
|
|
32
|
+
__exportStar(require("./parser/satisfactory/objects/Property"), exports);
|
|
33
|
+
var SaveComponent_1 = require("./parser/satisfactory/objects/SaveComponent");
|
|
34
|
+
Object.defineProperty(exports, "SaveComponent", { enumerable: true, get: function () { return SaveComponent_1.SaveComponent; } });
|
|
35
|
+
var SaveEntity_1 = require("./parser/satisfactory/objects/SaveEntity");
|
|
36
|
+
Object.defineProperty(exports, "SaveEntity", { enumerable: true, get: function () { return SaveEntity_1.SaveEntity; } });
|
|
37
|
+
var level_class_1 = require("./parser/satisfactory/save/level.class");
|
|
38
|
+
Object.defineProperty(exports, "Level", { enumerable: true, get: function () { return level_class_1.Level; } });
|
|
39
|
+
var satisfactory_save_1 = require("./parser/satisfactory/save/satisfactory-save");
|
|
40
|
+
Object.defineProperty(exports, "SatisfactorySave", { enumerable: true, get: function () { return satisfactory_save_1.SatisfactorySave; } });
|
|
41
|
+
__exportStar(require("./parser/satisfactory/save/save.types"), exports);
|
|
42
|
+
var byte_reader_class_1 = require("./parser/byte/byte-reader.class");
|
|
43
|
+
Object.defineProperty(exports, "ByteReader", { enumerable: true, get: function () { return byte_reader_class_1.ByteReader; } });
|
|
44
|
+
var byte_writer_class_1 = require("./parser/byte/byte-writer.class");
|
|
45
|
+
Object.defineProperty(exports, "ByteWriter", { enumerable: true, get: function () { return byte_writer_class_1.ByteWriter; } });
|
|
46
|
+
var blueprint_reader_1 = require("./parser/satisfactory/blueprint/blueprint-reader");
|
|
47
|
+
Object.defineProperty(exports, "BlueprintConfigReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintConfigReader; } });
|
|
48
|
+
Object.defineProperty(exports, "BlueprintReader", { enumerable: true, get: function () { return blueprint_reader_1.BlueprintReader; } });
|
|
49
|
+
var blueprint_writer_1 = require("./parser/satisfactory/blueprint/blueprint-writer");
|
|
50
|
+
Object.defineProperty(exports, "BlueprintConfigWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintConfigWriter; } });
|
|
51
|
+
Object.defineProperty(exports, "BlueprintWriter", { enumerable: true, get: function () { return blueprint_writer_1.BlueprintWriter; } });
|
|
52
|
+
var save_reader_1 = require("./parser/satisfactory/save/save-reader");
|
|
53
|
+
Object.defineProperty(exports, "SaveReader", { enumerable: true, get: function () { return save_reader_1.SaveReader; } });
|
|
54
|
+
var save_writer_1 = require("./parser/satisfactory/save/save-writer");
|
|
55
|
+
Object.defineProperty(exports, "SaveWriter", { enumerable: true, get: function () { return save_writer_1.SaveWriter; } });
|
|
56
|
+
__exportStar(require("./parser/satisfactory/structs/util.types"), exports);
|
|
57
|
+
var parser_error_1 = require("./parser/error/parser.error");
|
|
58
|
+
Object.defineProperty(exports, "CompressionLibraryError", { enumerable: true, get: function () { return parser_error_1.CompressionLibraryError; } });
|
|
59
|
+
Object.defineProperty(exports, "CorruptSaveError", { enumerable: true, get: function () { return parser_error_1.CorruptSaveError; } });
|
|
60
|
+
Object.defineProperty(exports, "ParserError", { enumerable: true, get: function () { return parser_error_1.ParserError; } });
|
|
61
|
+
Object.defineProperty(exports, "UnsupportedVersionError", { enumerable: true, get: function () { return parser_error_1.UnsupportedVersionError; } });
|
|
62
|
+
__exportStar(require("./parser/file.types"), exports);
|
|
63
|
+
var parser_1 = require("./parser/parser");
|
|
64
|
+
Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_1.Parser; } });
|
|
65
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.Alignment = void 0;
|
|
13
|
+
var Alignment;
|
|
14
|
+
(function (Alignment) {
|
|
15
|
+
Alignment[Alignment["BIG_ENDIAN"] = 0] = "BIG_ENDIAN";
|
|
16
|
+
Alignment[Alignment["LITTLE_ENDIAN"] = 1] = "LITTLE_ENDIAN";
|
|
17
|
+
})(Alignment = exports.Alignment || (exports.Alignment = {}));
|
|
18
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Alignment } from "./alignment.enum";
|
|
2
|
+
export declare abstract class ByteReader {
|
|
3
|
+
protected bufferView: DataView;
|
|
4
|
+
protected fileBuffer: ArrayBuffer;
|
|
5
|
+
protected alignment: Alignment;
|
|
6
|
+
protected currentByte: number;
|
|
7
|
+
protected handledByte: number;
|
|
8
|
+
protected maxByte: number;
|
|
9
|
+
protected lastStrRead: number;
|
|
10
|
+
constructor(fileBuffer: ArrayBuffer, alignment: Alignment);
|
|
11
|
+
reset(newFileBuffer: ArrayBuffer): void;
|
|
12
|
+
skipBytes(byteLength?: number): void;
|
|
13
|
+
readByte(): number;
|
|
14
|
+
readBytes(count: number): Uint8Array;
|
|
15
|
+
readHex(hexLength: number): string;
|
|
16
|
+
readInt8(): number;
|
|
17
|
+
readUint8(): number;
|
|
18
|
+
readUint16(): number;
|
|
19
|
+
readInt32(): number;
|
|
20
|
+
readUint32(): number;
|
|
21
|
+
readLong(): bigint;
|
|
22
|
+
readFloat(): number;
|
|
23
|
+
readDouble(): number;
|
|
24
|
+
protected getStringInfo(): {
|
|
25
|
+
payload: string;
|
|
26
|
+
counter: number;
|
|
27
|
+
};
|
|
28
|
+
getBufferPosition: () => number;
|
|
29
|
+
getBufferSlice: (begin: number, end: number | undefined) => ArrayBuffer;
|
|
30
|
+
getBufferProgress: () => number;
|
|
31
|
+
getBufferLength: () => number;
|
|
32
|
+
getBuffer: () => ArrayBuffer;
|
|
33
|
+
readString(): string;
|
|
34
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "./alignment.enum"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ByteReader = void 0;
|
|
13
|
+
const alignment_enum_1 = require("./alignment.enum");
|
|
14
|
+
class ByteReader {
|
|
15
|
+
constructor(fileBuffer, alignment) {
|
|
16
|
+
this.currentByte = 0;
|
|
17
|
+
this.handledByte = 0;
|
|
18
|
+
this.maxByte = 0;
|
|
19
|
+
this.lastStrRead = 0;
|
|
20
|
+
this.getBufferPosition = () => this.currentByte;
|
|
21
|
+
this.getBufferSlice = (begin, end) => this.bufferView.buffer.slice(begin, end);
|
|
22
|
+
this.getBufferProgress = () => this.currentByte / this.bufferView.buffer.byteLength;
|
|
23
|
+
this.getBufferLength = () => this.bufferView.buffer.byteLength;
|
|
24
|
+
this.getBuffer = () => this.bufferView.buffer;
|
|
25
|
+
this.alignment = alignment;
|
|
26
|
+
this.reset(fileBuffer);
|
|
27
|
+
}
|
|
28
|
+
reset(newFileBuffer) {
|
|
29
|
+
this.fileBuffer = newFileBuffer;
|
|
30
|
+
this.bufferView = new DataView(newFileBuffer, 0, Math.min(102400, this.fileBuffer.byteLength));
|
|
31
|
+
this.maxByte = newFileBuffer.byteLength;
|
|
32
|
+
this.currentByte = 0;
|
|
33
|
+
this.handledByte = 0;
|
|
34
|
+
}
|
|
35
|
+
skipBytes(byteLength = 1) {
|
|
36
|
+
this.currentByte += byteLength;
|
|
37
|
+
}
|
|
38
|
+
readByte() {
|
|
39
|
+
return parseInt(this.bufferView.getUint8(this.currentByte++).toString());
|
|
40
|
+
}
|
|
41
|
+
readBytes(count) {
|
|
42
|
+
return new Uint8Array(new Array(count).fill(0).map(pl => this.bufferView.getUint8(this.currentByte++)));
|
|
43
|
+
}
|
|
44
|
+
readHex(hexLength) {
|
|
45
|
+
let hexPart = [];
|
|
46
|
+
for (let i = 0; i < hexLength; i++) {
|
|
47
|
+
let currentHex = String.fromCharCode(this.bufferView.getUint8(this.currentByte++));
|
|
48
|
+
hexPart.push(currentHex);
|
|
49
|
+
}
|
|
50
|
+
return hexPart.join('');
|
|
51
|
+
}
|
|
52
|
+
readInt8() {
|
|
53
|
+
let data = this.bufferView.getInt8(this.currentByte++);
|
|
54
|
+
return data;
|
|
55
|
+
}
|
|
56
|
+
readUint8() {
|
|
57
|
+
let data = this.bufferView.getUint8(this.currentByte++);
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
readUint16() {
|
|
61
|
+
let data = this.bufferView.getUint16(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
62
|
+
this.currentByte += 2;
|
|
63
|
+
return data;
|
|
64
|
+
}
|
|
65
|
+
readInt32() {
|
|
66
|
+
let data = this.bufferView.getInt32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
67
|
+
this.currentByte += 4;
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
readUint32() {
|
|
71
|
+
let data = this.bufferView.getUint32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
72
|
+
this.currentByte += 4;
|
|
73
|
+
return data;
|
|
74
|
+
}
|
|
75
|
+
readLong() {
|
|
76
|
+
let data = this.bufferView.getBigInt64(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
77
|
+
this.currentByte += 8;
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
readFloat() {
|
|
81
|
+
let data = this.bufferView.getFloat32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
82
|
+
this.currentByte += 4;
|
|
83
|
+
return data;
|
|
84
|
+
}
|
|
85
|
+
readDouble() {
|
|
86
|
+
let data = this.bufferView.getFloat64(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
87
|
+
this.currentByte += 8;
|
|
88
|
+
return data;
|
|
89
|
+
}
|
|
90
|
+
getStringInfo() {
|
|
91
|
+
let payload = '';
|
|
92
|
+
let counter = this.currentByte;
|
|
93
|
+
try {
|
|
94
|
+
let strLength = this.bufferView.getInt32(this.currentByte, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
95
|
+
counter += 4;
|
|
96
|
+
payload = new Array(strLength - 1).fill('').map(c => String.fromCharCode(this.bufferView.getUint8(counter++))).join('');
|
|
97
|
+
}
|
|
98
|
+
catch (error) { }
|
|
99
|
+
this.currentByte -= counter;
|
|
100
|
+
return { payload, counter };
|
|
101
|
+
}
|
|
102
|
+
readString() {
|
|
103
|
+
let strLength = this.readInt32();
|
|
104
|
+
this.lastStrRead = strLength;
|
|
105
|
+
let startBytes = this.currentByte;
|
|
106
|
+
if (strLength === 0) {
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
if (strLength > (this.bufferView.buffer.byteLength - this.currentByte)) {
|
|
110
|
+
let errorMessage = `Cannot read string of length ${strLength} at position ${this.currentByte} as it exceeds the end at ${this.bufferView.buffer.byteLength}`;
|
|
111
|
+
throw new Error(errorMessage);
|
|
112
|
+
}
|
|
113
|
+
if (strLength < 0) {
|
|
114
|
+
const string = new Array(-strLength - 1).fill('').map(c => String.fromCharCode(this.readUint16()));
|
|
115
|
+
this.currentByte += 2;
|
|
116
|
+
return string.join('');
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
const string = new Array(strLength - 1).fill('').map(c => String.fromCharCode(this.readUint8()));
|
|
120
|
+
this.currentByte += 1;
|
|
121
|
+
return string.join('');
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
let errorMessage = `Cannot read UTF8 string of length ${strLength} at position ${this.currentByte}.`;
|
|
125
|
+
console.log(errorMessage, error);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.ByteReader = ByteReader;
|
|
131
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Alignment } from "./alignment.enum";
|
|
2
|
+
export declare abstract class ByteWriter {
|
|
3
|
+
protected alignment: Alignment;
|
|
4
|
+
protected bufferArray: ArrayBuffer;
|
|
5
|
+
protected bufferView: DataView;
|
|
6
|
+
protected currentByte: number;
|
|
7
|
+
constructor(alignment: Alignment, bufferSize?: number);
|
|
8
|
+
skipBytes(count?: number): void;
|
|
9
|
+
jumpTo(pos: number): void;
|
|
10
|
+
writeByte(value: number): void;
|
|
11
|
+
writeBytesArray(bytes: number[]): void;
|
|
12
|
+
writeBytes(bytes: Uint8Array): void;
|
|
13
|
+
writeInt8(value: number): void;
|
|
14
|
+
writeUint8(value: number): void;
|
|
15
|
+
writeInt16(value: number): void;
|
|
16
|
+
writeUint16(value: number): void;
|
|
17
|
+
writeInt32(value: number): void;
|
|
18
|
+
writeUint32(value: number): void;
|
|
19
|
+
writeInt64(value: bigint): void;
|
|
20
|
+
writeUint64(value: bigint): void;
|
|
21
|
+
writeFloat(value: number): void;
|
|
22
|
+
writeDouble(value: number): void;
|
|
23
|
+
writeString(value: string): void;
|
|
24
|
+
static IsASCIICompatible: (value: string) => boolean;
|
|
25
|
+
getBufferPosition: () => number;
|
|
26
|
+
getBufferSlice: (start: number, end?: number) => ArrayBuffer;
|
|
27
|
+
writeBinarySizeFromPosition(lenIndicatorPos: number, start: number): void;
|
|
28
|
+
protected extendBufferIfNeeded(countNeededBytes: number, factor?: number): void;
|
|
29
|
+
protected truncateBuffer(): void;
|
|
30
|
+
endWriting(): ArrayBuffer;
|
|
31
|
+
static ToInt32(num: number): Uint8Array;
|
|
32
|
+
static AppendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer;
|
|
33
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "./alignment.enum"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ByteWriter = void 0;
|
|
13
|
+
const alignment_enum_1 = require("./alignment.enum");
|
|
14
|
+
class ByteWriter {
|
|
15
|
+
constructor(alignment, bufferSize = 500) {
|
|
16
|
+
this.getBufferPosition = () => this.currentByte;
|
|
17
|
+
this.getBufferSlice = (start, end) => this.bufferArray.slice(start, end);
|
|
18
|
+
this.alignment = alignment;
|
|
19
|
+
this.bufferArray = new ArrayBuffer(bufferSize);
|
|
20
|
+
this.bufferView = new DataView(this.bufferArray);
|
|
21
|
+
this.currentByte = 0;
|
|
22
|
+
}
|
|
23
|
+
skipBytes(count = 1) {
|
|
24
|
+
this.extendBufferIfNeeded(count);
|
|
25
|
+
this.currentByte += count;
|
|
26
|
+
}
|
|
27
|
+
jumpTo(pos) {
|
|
28
|
+
const count = pos - this.getBufferPosition();
|
|
29
|
+
this.skipBytes(count);
|
|
30
|
+
}
|
|
31
|
+
writeByte(value) {
|
|
32
|
+
this.extendBufferIfNeeded(1);
|
|
33
|
+
this.bufferView.setUint8(this.currentByte, value);
|
|
34
|
+
this.currentByte += 1;
|
|
35
|
+
}
|
|
36
|
+
writeBytesArray(bytes) {
|
|
37
|
+
this.writeBytes(new Uint8Array(bytes));
|
|
38
|
+
}
|
|
39
|
+
writeBytes(bytes) {
|
|
40
|
+
this.extendBufferIfNeeded(bytes.length);
|
|
41
|
+
bytes.forEach(byte => this.bufferView.setUint8(this.currentByte++, byte));
|
|
42
|
+
}
|
|
43
|
+
writeInt8(value) {
|
|
44
|
+
this.extendBufferIfNeeded(1);
|
|
45
|
+
this.bufferView.setInt8(this.currentByte, value);
|
|
46
|
+
this.currentByte += 1;
|
|
47
|
+
}
|
|
48
|
+
writeUint8(value) {
|
|
49
|
+
this.writeByte(value);
|
|
50
|
+
}
|
|
51
|
+
writeInt16(value) {
|
|
52
|
+
this.extendBufferIfNeeded(2);
|
|
53
|
+
this.bufferView.setInt16(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
54
|
+
this.currentByte += 2;
|
|
55
|
+
}
|
|
56
|
+
writeUint16(value) {
|
|
57
|
+
this.extendBufferIfNeeded(2);
|
|
58
|
+
this.bufferView.setUint16(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
59
|
+
this.currentByte += 2;
|
|
60
|
+
}
|
|
61
|
+
writeInt32(value) {
|
|
62
|
+
this.extendBufferIfNeeded(4);
|
|
63
|
+
this.bufferView.setInt32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
64
|
+
this.currentByte += 4;
|
|
65
|
+
}
|
|
66
|
+
writeUint32(value) {
|
|
67
|
+
this.extendBufferIfNeeded(4);
|
|
68
|
+
this.bufferView.setUint32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
69
|
+
this.currentByte += 4;
|
|
70
|
+
}
|
|
71
|
+
writeInt64(value) {
|
|
72
|
+
this.extendBufferIfNeeded(8);
|
|
73
|
+
this.bufferView.setBigInt64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
74
|
+
this.currentByte += 8;
|
|
75
|
+
}
|
|
76
|
+
writeUint64(value) {
|
|
77
|
+
this.extendBufferIfNeeded(8);
|
|
78
|
+
this.bufferView.setBigUint64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
79
|
+
this.currentByte += 8;
|
|
80
|
+
}
|
|
81
|
+
writeFloat(value) {
|
|
82
|
+
this.extendBufferIfNeeded(4);
|
|
83
|
+
this.bufferView.setFloat32(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
84
|
+
this.currentByte += 4;
|
|
85
|
+
}
|
|
86
|
+
writeDouble(value) {
|
|
87
|
+
this.extendBufferIfNeeded(8);
|
|
88
|
+
this.bufferView.setFloat64(this.currentByte, value, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
|
|
89
|
+
this.currentByte += 8;
|
|
90
|
+
}
|
|
91
|
+
writeString(value) {
|
|
92
|
+
if (value.length === 0) {
|
|
93
|
+
this.writeInt32(0);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (ByteWriter.IsASCIICompatible(value)) {
|
|
97
|
+
this.writeInt32(value.length + 1);
|
|
98
|
+
for (let i = 0; i < value.length; i++) {
|
|
99
|
+
this.writeByte(value.charCodeAt(i));
|
|
100
|
+
}
|
|
101
|
+
this.writeUint8(0);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.writeInt32(-value.length - 1);
|
|
105
|
+
for (let i = 0; i < value.length; i++) {
|
|
106
|
+
this.writeUint16(value.charCodeAt(i));
|
|
107
|
+
}
|
|
108
|
+
this.writeUint16(0);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
writeBinarySizeFromPosition(lenIndicatorPos, start) {
|
|
112
|
+
const after = this.getBufferPosition();
|
|
113
|
+
const writtenBytes = after - start;
|
|
114
|
+
this.jumpTo(lenIndicatorPos);
|
|
115
|
+
this.writeInt32(writtenBytes);
|
|
116
|
+
this.jumpTo(after);
|
|
117
|
+
}
|
|
118
|
+
extendBufferIfNeeded(countNeededBytes, factor = 1.5) {
|
|
119
|
+
if (this.currentByte + countNeededBytes > this.bufferView.byteLength) {
|
|
120
|
+
this.bufferArray = ByteWriter.AppendBuffer(this.bufferArray, new ArrayBuffer(factor * this.bufferArray.byteLength));
|
|
121
|
+
this.bufferView = new DataView(this.bufferArray);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
truncateBuffer() {
|
|
125
|
+
this.bufferArray = this.bufferArray.slice(0, this.currentByte);
|
|
126
|
+
}
|
|
127
|
+
endWriting() {
|
|
128
|
+
this.truncateBuffer();
|
|
129
|
+
return this.bufferArray;
|
|
130
|
+
}
|
|
131
|
+
static ToInt32(num) {
|
|
132
|
+
return new Uint8Array([
|
|
133
|
+
(num & 0xff000000) >> 24,
|
|
134
|
+
(num & 0x00ff0000) >> 16,
|
|
135
|
+
(num & 0x0000ff00) >> 8,
|
|
136
|
+
(num & 0x000000ff)
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
static AppendBuffer(buffer1, buffer2) {
|
|
140
|
+
var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
|
|
141
|
+
tmp.set(new Uint8Array(buffer1), 0);
|
|
142
|
+
tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
|
|
143
|
+
return tmp.buffer;
|
|
144
|
+
}
|
|
145
|
+
;
|
|
146
|
+
}
|
|
147
|
+
ByteWriter.IsASCIICompatible = (value) => /^[\x00-\x7F]*$/.test(value);
|
|
148
|
+
exports.ByteWriter = ByteWriter;
|
|
149
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class ParserError extends Error {
|
|
2
|
+
constructor(name: string, message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class UnsupportedVersionError extends ParserError {
|
|
5
|
+
constructor(message?: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class CorruptSaveError extends ParserError {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class CompressionLibraryError extends ParserError {
|
|
11
|
+
constructor(message?: string);
|
|
12
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CompressionLibraryError = exports.CorruptSaveError = exports.UnsupportedVersionError = exports.ParserError = void 0;
|
|
13
|
+
class ParserError extends Error {
|
|
14
|
+
constructor(name, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = name;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.ParserError = ParserError;
|
|
20
|
+
class UnsupportedVersionError extends ParserError {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super('UnsupportedVersionError', message ?? 'This save version is not supported.');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.UnsupportedVersionError = UnsupportedVersionError;
|
|
26
|
+
class CorruptSaveError extends ParserError {
|
|
27
|
+
constructor(message) {
|
|
28
|
+
super('CorruptSaveError', message ?? 'This save data is most likely corrupt.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.CorruptSaveError = CorruptSaveError;
|
|
32
|
+
class CompressionLibraryError extends ParserError {
|
|
33
|
+
constructor(message) {
|
|
34
|
+
super('CompressionLibraryError', message ?? 'Failed to compress/decompress save data.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.CompressionLibraryError = CompressionLibraryError;
|
|
38
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ChunkSummary } from "./file.types";
|
|
3
|
+
import { Blueprint } from "./satisfactory/blueprint/blueprint.types";
|
|
4
|
+
import { SatisfactorySave } from "./satisfactory/save/satisfactory-save";
|
|
5
|
+
import { SaveProjectionConfig } from "./satisfactory/save/save-reader";
|
|
6
|
+
export declare class Parser {
|
|
7
|
+
static WriteSave(save: SatisfactorySave, onBinaryBeforeCompressing: (buffer: ArrayBuffer) => void, onHeader: (header: Uint8Array) => void, onChunk: (chunk: Uint8Array) => void): ChunkSummary[];
|
|
8
|
+
static ParseSaveFile(file: Buffer, onDecompressedSaveBody?: (buffer: ArrayBuffer) => void, onProgress?: (progress: number, message?: string) => void): SatisfactorySave;
|
|
9
|
+
static WriteBlueprintFiles(blueprint: Blueprint, onMainFileBinaryBeforeCompressing?: (binary: ArrayBuffer) => void, onMainFileHeader?: (header: Uint8Array) => void, onMainFileChunk?: (chunk: Uint8Array) => void): {
|
|
10
|
+
mainFileChunkSummary: ChunkSummary[];
|
|
11
|
+
configFileBinary: ArrayBuffer;
|
|
12
|
+
};
|
|
13
|
+
static ParseBlueprintFiles(name: string, blueprintFile: Buffer, blueprintConfigFile: Buffer, onDecompressedBlueprintBody?: (buffer: ArrayBuffer) => void): Blueprint;
|
|
14
|
+
static ProjectSave(save: SatisfactorySave, config: SaveProjectionConfig): SatisfactorySave;
|
|
15
|
+
static JSONStringifyModified: (obj: any, indent?: number) => string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "./satisfactory/blueprint/blueprint-reader", "./satisfactory/blueprint/blueprint-writer", "./satisfactory/save/level.class", "./satisfactory/save/satisfactory-save", "./satisfactory/save/save-reader", "./satisfactory/save/save-writer"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.Parser = void 0;
|
|
13
|
+
const blueprint_reader_1 = require("./satisfactory/blueprint/blueprint-reader");
|
|
14
|
+
const blueprint_writer_1 = require("./satisfactory/blueprint/blueprint-writer");
|
|
15
|
+
const level_class_1 = require("./satisfactory/save/level.class");
|
|
16
|
+
const satisfactory_save_1 = require("./satisfactory/save/satisfactory-save");
|
|
17
|
+
const save_reader_1 = require("./satisfactory/save/save-reader");
|
|
18
|
+
const save_writer_1 = require("./satisfactory/save/save-writer");
|
|
19
|
+
class Parser {
|
|
20
|
+
static WriteSave(save, onBinaryBeforeCompressing, onHeader, onChunk) {
|
|
21
|
+
const writer = new save_writer_1.SaveWriter();
|
|
22
|
+
save_writer_1.SaveWriter.WriteHeader(writer, save.header);
|
|
23
|
+
const posAfterHeader = writer.getBufferPosition();
|
|
24
|
+
save_writer_1.SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
|
|
25
|
+
writer.endWriting();
|
|
26
|
+
const chunkSummary = writer.generateChunks(save.compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk);
|
|
27
|
+
return chunkSummary;
|
|
28
|
+
}
|
|
29
|
+
static ParseSaveFile(file, onDecompressedSaveBody = () => { }, onProgress = () => { }) {
|
|
30
|
+
const reader = new save_reader_1.SaveReader(new Uint8Array(file).buffer, onProgress);
|
|
31
|
+
const header = reader.readHeader();
|
|
32
|
+
const save = new satisfactory_save_1.SatisfactorySave(header);
|
|
33
|
+
const inflateResult = reader.inflateChunks();
|
|
34
|
+
onDecompressedSaveBody(reader.getBuffer());
|
|
35
|
+
const levelParseResult = reader.readLevels();
|
|
36
|
+
save.levels = reader.levels;
|
|
37
|
+
save.compressionInfo = reader.compressionInfo;
|
|
38
|
+
save.trailingCollectedObjects = reader.trailingCollectedObjects;
|
|
39
|
+
return save;
|
|
40
|
+
}
|
|
41
|
+
static WriteBlueprintFiles(blueprint, onMainFileBinaryBeforeCompressing = () => { }, onMainFileHeader = () => { }, onMainFileChunk = () => { }) {
|
|
42
|
+
const blueprintWriter = new blueprint_writer_1.BlueprintWriter();
|
|
43
|
+
blueprint_writer_1.BlueprintWriter.SerializeHeader(blueprintWriter, blueprint.header);
|
|
44
|
+
const saveBodyPos = blueprintWriter.getBufferPosition();
|
|
45
|
+
blueprint_writer_1.BlueprintWriter.SerializeObjects(blueprintWriter, blueprint.objects);
|
|
46
|
+
blueprintWriter.endWriting();
|
|
47
|
+
let binaryChunks = [];
|
|
48
|
+
let binaryHeader;
|
|
49
|
+
const mainFileChunkSummary = blueprintWriter.generateChunks(blueprint.compressionInfo, saveBodyPos, onMainFileBinaryBeforeCompressing, onMainFileHeader, onMainFileChunk);
|
|
50
|
+
const configWriter = new blueprint_writer_1.BlueprintConfigWriter();
|
|
51
|
+
blueprint_writer_1.BlueprintConfigWriter.SerializeConfig(configWriter, blueprint.config);
|
|
52
|
+
const configFileBinary = configWriter.endWriting();
|
|
53
|
+
return {
|
|
54
|
+
mainFileChunkSummary,
|
|
55
|
+
configFileBinary
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
static ParseBlueprintFiles(name, blueprintFile, blueprintConfigFile, onDecompressedBlueprintBody = () => { }) {
|
|
59
|
+
const blueprintConfigReader = new blueprint_reader_1.BlueprintConfigReader(new Uint8Array(blueprintConfigFile).buffer);
|
|
60
|
+
const config = blueprint_reader_1.BlueprintConfigReader.ParseConfig(blueprintConfigReader);
|
|
61
|
+
const blueprintReader = new blueprint_reader_1.BlueprintReader(new Uint8Array(blueprintFile).buffer);
|
|
62
|
+
const header = blueprint_reader_1.BlueprintReader.ReadHeader(blueprintReader);
|
|
63
|
+
const inflateResult = blueprintReader.inflateChunks();
|
|
64
|
+
onDecompressedBlueprintBody(inflateResult.inflatedData);
|
|
65
|
+
const blueprintObjects = blueprint_reader_1.BlueprintReader.ParseObjects(blueprintReader);
|
|
66
|
+
const blueprint = {
|
|
67
|
+
name,
|
|
68
|
+
compressionInfo: blueprintReader.compressionInfo,
|
|
69
|
+
header: header,
|
|
70
|
+
config,
|
|
71
|
+
objects: blueprintObjects
|
|
72
|
+
};
|
|
73
|
+
return blueprint;
|
|
74
|
+
}
|
|
75
|
+
static ProjectSave(save, config) {
|
|
76
|
+
return {
|
|
77
|
+
header: save.header,
|
|
78
|
+
trailingCollectedObjects: save.trailingCollectedObjects,
|
|
79
|
+
levels: save.levels.map(level => {
|
|
80
|
+
const lvl = new level_class_1.Level(level.name);
|
|
81
|
+
lvl.collectables = level.collectables;
|
|
82
|
+
lvl.objects = level.objects.filter(obj => (0, save_reader_1.projectionFilterApplies)(config, obj));
|
|
83
|
+
return lvl;
|
|
84
|
+
})
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
Parser.JSONStringifyModified = (obj, indent = 0) => JSON.stringify(obj, (key, value) => {
|
|
89
|
+
if (typeof value === 'bigint') {
|
|
90
|
+
return value.toString();
|
|
91
|
+
}
|
|
92
|
+
else if (value === 0 && 1 / value < 0) {
|
|
93
|
+
return '-0';
|
|
94
|
+
}
|
|
95
|
+
return value;
|
|
96
|
+
}, indent);
|
|
97
|
+
exports.Parser = Parser;
|
|
98
|
+
});
|