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
JavaScript
"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();