UNPKG

sc4

Version:

A command line utility for automating SimCity 4 modding tasks & modifying savegames

93 lines (92 loc) 3.06 kB
// # dbpf-header.js import { SmartBuffer } from 'smart-arraybuffer'; import Version from './version.js'; // # Header export default class Header { buffer; // ## constructor(opts) constructor(opts) { if (opts instanceof Uint8Array) { this.buffer = opts; } else { this.buffer = getDefaultHeader(opts); } } // ## get #reader() get #reader() { return SmartBuffer.fromBuffer(this.buffer); } get #writer() { return SmartBuffer.fromBuffer(this.buffer); } // ## get id() get id() { return this.#reader.readString(4); } // ## get version() get version() { const rs = this.#reader; const major = rs.readUInt32LE(4); const minor = rs.readUInt32LE(8); return [major, minor].join('.'); } get created() { return new Date(1000 * this.#reader.readUInt32LE(24)); } set created(value) { this.#writer.writeUInt32LE(toUnixTimestamp(value), 24); } get modified() { return new Date(1000 * this.#reader.readUInt32LE(28)); } set modified(value) { this.#writer.writeUInt32LE(toUnixTimestamp(value), 28); } get indexMajor() { return this.#reader.readUInt32LE(32); } get indexMinor() { return this.#reader.readUInt32LE(60); } get indexCount() { return this.#reader.readUInt32LE(36); } get indexOffset() { return this.#reader.readUInt32LE(40); } get indexSize() { return this.#reader.readUInt32LE(44); } // ## toBuffer() toBuffer() { return this.buffer; } // ## toJSON() toJSON() { const { version, created, modified, indexMajor, indexMinor, indexCount, indexOffset, indexSize, } = this; return { version, created, modified, indexMajor, indexMinor, indexCount, indexOffset, indexSize, }; } [Symbol.for('nodejs.util.inspect.custom')]() { return this.toJSON(); } } // # getDefaultHeader(opts) function getDefaultHeader(opts = {}) { const { version = '1.0', created = Date.now(), modified = Date.now(), indexMajor = 7, indexMinor = 0, indexCount = 0, indexOffset = 0, indexSize = 0, } = opts; const buffer = new SmartBuffer({ size: 96 }); buffer.writeString('DBPF'); const [major, minor] = new Version(version); buffer.writeUInt32LE(major); buffer.writeUInt32LE(minor); buffer.writeUInt32LE(toUnixTimestamp(created), 24); buffer.writeUInt32LE(toUnixTimestamp(modified), 28); buffer.writeUInt32LE(indexMajor, 32); buffer.writeUInt32LE(indexCount, 36); buffer.writeUInt32LE(indexOffset, 40); buffer.writeUInt32LE(indexSize, 44); buffer.writeUInt32LE(indexMinor, 60); return buffer.internalUint8Array; } // # toUnixTimestamp(date) function toUnixTimestamp(date) { if (typeof date === 'number') return date / 1000; else if (typeof date === 'string') return Date.parse(date) / 1000; else return date.getTime() / 1000; }