UNPKG

mdx-m3-viewer

Version:

A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.

118 lines (89 loc) 2.54 kB
import BinaryStream from '../../../common/binarystream'; import TriggerCategory from './triggercategory'; import Variable from './variable'; import Trigger from './trigger'; /** * war3map.wtg - the trigger file. */ export default class War3MapWtg { /** * @param {?ArrayBuffer} buffer * @param {?TriggerData} triggerData */ constructor(buffer, triggerData) { this.version = 0; this.categories = []; this.u1 = 0; this.variables = []; this.triggers = []; if (buffer) { this.load(buffer, triggerData); } } /** * @param {ArrayBuffer} buffer * @param {TriggerData} triggerData */ load(buffer, triggerData) { let stream = new BinaryStream(buffer); if (stream.read(4) !== 'WTG!') { throw new Error('Not a WTG file'); } this.version = stream.readInt32(); for (let i = 0, l = stream.readUint32(); i < l; i++) { let category = new TriggerCategory(); category.load(stream, this.version); this.categories[i] = category; } this.u1 = stream.readInt32(); for (let i = 0, l = stream.readUint32(); i < l; i++) { let variable = new Variable(); variable.load(stream, this.version); this.variables[i] = variable; } for (let i = 0, l = stream.readUint32(); i < l; i++) { let trigger = new Trigger(); trigger.load(stream, this.version, triggerData); this.triggers[i] = trigger; } } /** * @return {ArrayBuffer} */ save() { let buffer = new ArrayBuffer(this.getByteLength()); let stream = new BinaryStream(buffer); stream.write('WTG!'); stream.writeInt32(this.version); stream.writeUint32(this.categories.length); for (let category of this.categories) { category.save(stream, this.version); } stream.writeInt32(this.u1); stream.writeUint32(this.variables.length); for (let variable of this.variables) { variable.save(stream, this.version); } stream.writeUint32(this.triggers.length); for (let trigger of this.triggers) { trigger.save(stream, this.version); } return buffer; } /** * @return {number} */ getByteLength() { let size = 24; for (let category of this.categories) { size += category.getByteLength(this.version); } for (let variable of this.variables) { size += variable.getByteLength(this.version); } for (let trigger of this.triggers) { size += trigger.getByteLength(this.version); } return size; } }