UNPKG

@etothepii/satisfactory-file-parser

Version:

A file parser for satisfactory files. Includes save files and blueprint files.

88 lines (87 loc) 4.15 kB
"use strict"; 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;