UNPKG

xcom2charpool

Version:

Library for reading, manipulating, and managing XCOM 2 character pool binary files, supporting both browser and Node.js environments.

118 lines (117 loc) 5.91 kB
"use strict"; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _ArrayBufferWriter_length, _ArrayBufferWriter_buffer, _ArrayBufferWriter_dataView; Object.defineProperty(exports, "__esModule", { value: true }); exports.ArrayBufferWriter = void 0; const FSting_1 = require("../UE/FSting"); /** * Auto-growing ArrayBuffer-backed Writer implementation for binary encoding. */ class ArrayBufferWriter { constructor(initialSize = 1024) { this.position = 0; _ArrayBufferWriter_length.set(this, 0); // Actual length of data written _ArrayBufferWriter_buffer.set(this, void 0); _ArrayBufferWriter_dataView.set(this, void 0); __classPrivateFieldSet(this, _ArrayBufferWriter_buffer, new ArrayBuffer(initialSize), "f"); __classPrivateFieldSet(this, _ArrayBufferWriter_dataView, new DataView(__classPrivateFieldGet(this, _ArrayBufferWriter_buffer, "f")), "f"); } /** * Writes a 32-bit unsigned integer at the current position. */ uint32(value) { this.ensureCapacity(4); __classPrivateFieldGet(this, _ArrayBufferWriter_dataView, "f").setUint32(this.position, value, true); this.position += 4; __classPrivateFieldSet(this, _ArrayBufferWriter_length, Math.max(__classPrivateFieldGet(this, _ArrayBufferWriter_length, "f"), this.position), "f"); return this; } /** * Writes a 32-bit signed integer at the current position. */ int32(value) { this.ensureCapacity(4); __classPrivateFieldGet(this, _ArrayBufferWriter_dataView, "f").setInt32(this.position, value, true); this.position += 4; __classPrivateFieldSet(this, _ArrayBufferWriter_length, Math.max(__classPrivateFieldGet(this, _ArrayBufferWriter_length, "f"), this.position), "f"); return this; } /** * Writes a byte at the current position. */ byte(value) { this.ensureCapacity(1); __classPrivateFieldGet(this, _ArrayBufferWriter_dataView, "f").setUint8(this.position, value); this.position += 1; __classPrivateFieldSet(this, _ArrayBufferWriter_length, Math.max(__classPrivateFieldGet(this, _ArrayBufferWriter_length, "f"), this.position), "f"); return this; } /** * Writes padding (4 zero bytes) at the current position. */ padding() { this.uint32(0); return this; } /** * Writes a string using UE4StringCodec */ string(value) { FSting_1.FSting.write(this, value); return this; } /** * Retrieves the underlying buffer up to the current length of data written. * @returns A sliced ArrayBuffer containing the written data. */ getBuffer() { return __classPrivateFieldGet(this, _ArrayBufferWriter_buffer, "f").slice(0, __classPrivateFieldGet(this, _ArrayBufferWriter_length, "f")); } bytes(value) { this.ensureCapacity(value.length); new Uint8Array(__classPrivateFieldGet(this, _ArrayBufferWriter_buffer, "f"), this.position, value.length).set(value); this.position += value.length; __classPrivateFieldSet(this, _ArrayBufferWriter_length, Math.max(__classPrivateFieldGet(this, _ArrayBufferWriter_length, "f"), this.position), "f"); return this; } withLength(fn) { const lengthPosition = this.position; this.uint32(0).padding(); const sourceLength = this.position; const result = fn(); const finalPosition = this.position; this.position = lengthPosition; this.uint32(typeof result === 'number' ? result : finalPosition - sourceLength); this.position = finalPosition; return result; } /** * Ensures the internal buffer has enough capacity to write additional bytes. */ ensureCapacity(additionalBytes) { const requiredLength = this.position + additionalBytes; if (requiredLength > __classPrivateFieldGet(this, _ArrayBufferWriter_buffer, "f").byteLength) { // Need to resize buffer let newBufferLength = __classPrivateFieldGet(this, _ArrayBufferWriter_buffer, "f").byteLength * 2; while (newBufferLength < requiredLength) { newBufferLength *= 2; } const newBuffer = new ArrayBuffer(newBufferLength); new Uint8Array(newBuffer).set(new Uint8Array(__classPrivateFieldGet(this, _ArrayBufferWriter_buffer, "f"))); __classPrivateFieldSet(this, _ArrayBufferWriter_buffer, newBuffer, "f"); __classPrivateFieldSet(this, _ArrayBufferWriter_dataView, new DataView(__classPrivateFieldGet(this, _ArrayBufferWriter_buffer, "f")), "f"); } } } exports.ArrayBufferWriter = ArrayBufferWriter; _ArrayBufferWriter_length = new WeakMap(), _ArrayBufferWriter_buffer = new WeakMap(), _ArrayBufferWriter_dataView = new WeakMap();