xcom2charpool
Version:
Library for reading, manipulating, and managing XCOM 2 character pool binary files, supporting both browser and Node.js environments.
90 lines (89 loc) • 4.95 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 _ArrayBufferReader_position, _ArrayBufferReader_length;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArrayBufferReader = void 0;
const FSting_1 = require("../UE/FSting");
/**
* ArrayBuffer-backed Reader implementation for binary decoding.
*/
class ArrayBufferReader {
constructor(source, position, length) {
this.source = source;
_ArrayBufferReader_position.set(this, 0);
_ArrayBufferReader_length.set(this, void 0);
if (typeof position === 'number') {
__classPrivateFieldSet(this, _ArrayBufferReader_position, position, "f");
}
__classPrivateFieldSet(this, _ArrayBufferReader_length, typeof length === 'number' ? length : source.byteLength, "f");
}
get length() {
return __classPrivateFieldGet(this, _ArrayBufferReader_length, "f");
}
get position() {
return __classPrivateFieldGet(this, _ArrayBufferReader_position, "f");
}
uint32() {
this.ensureAvailable(4, 'uint32');
const value = this.source.getUint32(__classPrivateFieldGet(this, _ArrayBufferReader_position, "f"), true);
__classPrivateFieldSet(this, _ArrayBufferReader_position, __classPrivateFieldGet(this, _ArrayBufferReader_position, "f") + 4, "f");
return value;
}
int32() {
this.ensureAvailable(4, 'int32');
const value = this.source.getInt32(__classPrivateFieldGet(this, _ArrayBufferReader_position, "f"), true);
__classPrivateFieldSet(this, _ArrayBufferReader_position, __classPrivateFieldGet(this, _ArrayBufferReader_position, "f") + 4, "f");
return value;
}
byte() {
this.ensureAvailable(1, 'byte');
const value = this.source.getUint8(__classPrivateFieldGet(this, _ArrayBufferReader_position, "f"));
__classPrivateFieldSet(this, _ArrayBufferReader_position, __classPrivateFieldGet(this, _ArrayBufferReader_position, "f") + 1, "f");
return value;
}
padding() {
const padding = this.uint32();
if (padding) {
throw new Error(`Expected empty padding, got ${padding.toString(16).padStart(8, '0')}`);
}
}
subarray(length) {
if (length < 0) {
throw new Error('Attempt to subarray negative length');
}
this.ensureAvailable(length, 'subarray');
const sub = new ArrayBufferReader(this.source, __classPrivateFieldGet(this, _ArrayBufferReader_position, "f"), __classPrivateFieldGet(this, _ArrayBufferReader_position, "f") + length);
__classPrivateFieldSet(this, _ArrayBufferReader_position, __classPrivateFieldGet(this, _ArrayBufferReader_position, "f") + length, "f");
return sub;
}
string() {
return FSting_1.FSting.read(this);
}
bytes(length) {
if (length < 0) {
throw new Error('Attempt to read negative byte length');
}
this.ensureAvailable(length, 'bytes');
const start = this.source.byteOffset + __classPrivateFieldGet(this, _ArrayBufferReader_position, "f");
const bytes = new Uint8Array(this.source.buffer, start, length);
__classPrivateFieldSet(this, _ArrayBufferReader_position, __classPrivateFieldGet(this, _ArrayBufferReader_position, "f") + length, "f");
return bytes;
}
ensureAvailable(size, context) {
if (__classPrivateFieldGet(this, _ArrayBufferReader_position, "f") + size > this.length) {
throw new Error(`Attempt to read beyond buffer length in ${context}. Offset: ${__classPrivateFieldGet(this, _ArrayBufferReader_position, "f")}, requested: ${size}, remaining: ${this.length - __classPrivateFieldGet(this, _ArrayBufferReader_position, "f")}`);
}
}
}
exports.ArrayBufferReader = ArrayBufferReader;
_ArrayBufferReader_position = new WeakMap(), _ArrayBufferReader_length = new WeakMap();