UNPKG

@etothepii/satisfactory-file-parser

Version:

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

67 lines (66 loc) 3.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AsynchronousLevel = void 0; const SaveComponent_1 = require("../objects/SaveComponent"); const SaveEntity_1 = require("../objects/SaveEntity"); const level_class_1 = require("./level.class"); class AsynchronousLevel { static async StreamReadObjectContents(reader, objectsList, buildVersion, writer, onProgressCallback) { const binarySize = reader.readInt32(); const posBefore = reader.getBufferPosition(); await reader.allocate(binarySize); const countEntities = reader.readInt32(); if (countEntities !== objectsList.length) { throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`); } let dynamicObjectBatch = []; for (let i = 0; i < countEntities; i++) { if (i % 1000 === 0) { console.log(`having some objects, writing ${i + 1}/${countEntities}.`); onProgressCallback(reader.getBufferProgress()); await writer.writeObjects(...dynamicObjectBatch); dynamicObjectBatch = []; } const len = reader.readInt32(); const before = reader.getBufferPosition(); if (len < reader.getAmountAllocatedLeft()) { await reader.allocate(Math.max(before - binarySize, 300 * 1000 * 1000)); } const obj = objectsList[i]; if ((0, SaveEntity_1.isSaveEntity)(obj)) { SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath); } else if ((0, SaveComponent_1.isSaveComponent)(obj)) { SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath); } dynamicObjectBatch.push(obj); const after = reader.getBufferPosition(); if (after - before !== len) { console.warn('entity may be corrupt', this.name, i); } } await writer.writeObjects(...dynamicObjectBatch); const posAfter = reader.getBufferPosition(); if (posAfter - posBefore !== binarySize) { console.warn('save seems corrupt.', this.name); } } static async StreamReadLevel(reader, levelName, buildVersion, writer) { const level = new level_class_1.Level(levelName); const binaryLength = reader.readInt32(); await reader.allocate(binaryLength); await writer.openLevel(levelName); level_class_1.Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback); reader.onProgressCallback(reader.getBufferProgress()); level.collectables = level_class_1.Level.ReadCollectablesList(reader, undefined); console.log(`before object contents buffer pos ${reader.getBufferPosition()}`); await AsynchronousLevel.StreamReadObjectContents(reader, level.objects, buildVersion, writer, reader.onProgressCallback); await writer.switchInLevelToCollectables(); await writer.writeCollectables(...level.collectables); reader.onProgressCallback(reader.getBufferProgress()); level_class_1.Level.ReadCollectablesList(reader, undefined); await writer.endLevel(); return level; } } exports.AsynchronousLevel = AsynchronousLevel;