@etothepii/satisfactory-file-parser
Version:
A file parser for satisfactory files. Includes save files and blueprint files.
88 lines (87 loc) • 4.15 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.BlueprintConfigWriter = exports.BlueprintWriter = void 0;
const alignment_enum_1 = require("../../byte/alignment.enum");
const byte_writer_class_1 = require("../../byte/byte-writer.class");
const parser_error_1 = require("../../error/parser.error");
const SaveComponent_1 = require("../objects/SaveComponent");
const SaveEntity_1 = require("../objects/SaveEntity");
const level_class_1 = require("../save/level.class");
const save_writer_1 = require("../save/save-writer");
const util_types_1 = require("../structs/util.types");
class BlueprintWriter extends byte_writer_class_1.ByteWriter {
constructor() {
super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
}
static SerializeHeader(writer, header) {
writer.writeInt32(2);
writer.writeInt32(42);
writer.writeInt32(263910);
let dimensions = [
header.designerDimension?.x ?? 4,
header.designerDimension?.y ?? 4,
header.designerDimension?.z ?? 4,
].map(dim => dim < 4 ? 4 : dim);
writer.writeInt32(dimensions[0]);
writer.writeInt32(dimensions[1]);
writer.writeInt32(dimensions[2]);
writer.writeInt32(header.itemCosts.length);
for (const itemCost of header.itemCosts) {
writer.writeInt32(0);
writer.writeString(itemCost[0]);
writer.writeInt32(itemCost[1]);
}
writer.writeInt32(header.recipeReferences.length);
for (const recipeReference of header.recipeReferences) {
writer.writeInt32(0);
writer.writeString(recipeReference);
}
}
generateChunks(compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk) {
if (posAfterHeader <= 0) {
throw new parser_error_1.ParserError('ParserError', 'seems like this buffer has no header. Please write the header first before you can generate chunks.');
}
const header = new Uint8Array(this.bufferArray.slice(0, posAfterHeader));
onHeader(header);
this.bufferArray = this.bufferArray.slice(posAfterHeader);
const chunkSummary = save_writer_1.SaveWriter.GenerateCompressedChunksFromData(this.bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, this.alignment);
return chunkSummary;
}
static SerializeObjects(writer, objects) {
const headersLenIndicator = writer.getBufferPosition();
writer.writeInt32(0);
level_class_1.Level.SerializeObjectHeaders(writer, objects);
writer.writeBinarySizeFromPosition(headersLenIndicator, headersLenIndicator + 4);
BlueprintWriter.SerializeObjectContents(writer, objects, 0, '');
}
static SerializeObjectContents(writer, objects, buildVersion, levelName) {
const lenIndicatorEntities = writer.getBufferPosition();
writer.writeInt32(0);
writer.writeInt32(objects.length);
for (const obj of objects) {
const lenReplacementPosition = writer.getBufferPosition();
writer.writeInt32(0);
if ((0, SaveEntity_1.isSaveEntity)(obj)) {
SaveEntity_1.SaveEntity.SerializeData(writer, obj, buildVersion);
}
else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
SaveComponent_1.SaveComponent.SerializeData(writer, obj, buildVersion);
}
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
}
writer.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 4);
}
}
exports.BlueprintWriter = BlueprintWriter;
class BlueprintConfigWriter extends byte_writer_class_1.ByteWriter {
constructor() {
super(alignment_enum_1.Alignment.LITTLE_ENDIAN);
}
static SerializeConfig(writer, config) {
writer.writeInt32(2);
writer.writeString(config.description);
writer.writeInt32(config.iconID);
(0, util_types_1.SerializeCol4RGBA)(writer, config.color);
}
}
exports.BlueprintConfigWriter = BlueprintConfigWriter;
;