UNPKG

patchwork-mapconverter

Version:

Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator

258 lines 26.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UnitsTranslator = void 0; const HexBuffer_1 = require("../HexBuffer"); const W3Buffer_1 = require("../W3Buffer"); class UnitsTranslator { constructor() { } static getInstance() { if (this.instance == null) { this.instance = new this(); } return this.instance; } static jsonToWar(units) { return this.getInstance().jsonToWar(units); } static warToJson(buffer) { return this.getInstance().warToJson(buffer); } jsonToWar(unitsJson) { const outBufferToWar = new HexBuffer_1.HexBuffer(); /* * Header */ outBufferToWar.addChars('W3do'); outBufferToWar.addInt(9); outBufferToWar.addInt(11); outBufferToWar.addInt(unitsJson?.length || 0); // number of units /* * Body */ unitsJson?.forEach((unit) => { outBufferToWar.addChars(unit.type); // type outBufferToWar.addInt(unit.variation != null ? unit.variation : 0); // variation outBufferToWar.addFloat(unit.position[0]); // position x outBufferToWar.addFloat(unit.position[1]); // position y outBufferToWar.addFloat(unit.position[2]); // position z outBufferToWar.addFloat(unit.rotation != null ? unit.rotation : 0); // rotation angle if (unit.scale == null) unit.scale = [1, 1, 1]; outBufferToWar.addFloat(unit.scale[0] != null ? unit.scale[0] : 1); // scale x outBufferToWar.addFloat(unit.scale[1] != null ? unit.scale[1] : 1); // scale y outBufferToWar.addFloat(unit.scale[2] != null ? unit.scale[2] : 1); // scale z outBufferToWar.addChars(unit.skin); // Unit flags outBufferToWar.addByte(0); // UNSUPPORTED: flags outBufferToWar.addInt(unit.player); // player # outBufferToWar.addByte(0); // (byte unknown - 0) outBufferToWar.addByte(0); // (byte unknown - 0) outBufferToWar.addInt(unit.hitpoints); // hitpoints outBufferToWar.addInt(unit.mana != null ? unit.mana : 0); // mana outBufferToWar.addInt(unit.randomItemSetPtr); outBufferToWar.addInt(unit.droppedItemSets?.length || 0); unit.droppedItemSets?.forEach(itemSet => { outBufferToWar.addInt(itemSet.items?.length || 0); itemSet.items?.forEach(item => { outBufferToWar.addChars(item.itemId); outBufferToWar.addInt(item.chance); }); }); // Gold amount // Required if unit is a gold mine // Optional (set to zero) if unit is not a gold mine outBufferToWar.addInt(unit.gold); // outBufferToWar.addInt(unit.type === 'ngol' ? unit.gold : 0); outBufferToWar.addFloat(unit.targetAcquisition != null ? unit.targetAcquisition : 0); // target acquisition // Unit hero attributes // Can be left unspecified, but values can never be below 1 if (unit.hero == null) unit.hero = { level: 1, str: 1, agi: 1, int: 1 }; outBufferToWar.addInt(unit.hero.level); outBufferToWar.addInt(unit.hero.str); outBufferToWar.addInt(unit.hero.agi); outBufferToWar.addInt(unit.hero.int); // Inventory - - - if (unit.inventory == null) unit.inventory = []; outBufferToWar.addInt(unit.inventory?.length || 0); // # items in inventory unit.inventory?.forEach(item => { outBufferToWar.addInt(item.slot - 1); // zero-index item slot outBufferToWar.addChars(item.type); }); // Modified abilities - - - if (unit.abilities == null) unit.abilities = []; outBufferToWar.addInt(unit.abilities?.length || 0); // # modified abilities unit.abilities?.forEach((ability) => { outBufferToWar.addChars(ability.ability); // ability string outBufferToWar.addInt(+ability.active); // 0 = not active, 1 = active outBufferToWar.addInt(ability.level); }); // Random outBufferToWar.addInt(unit.random.type); switch (unit.random.type) { case 0: outBufferToWar.addByte(unit.random.level); outBufferToWar.addByte(0); // Unknown - apparently it's part of level ^ outBufferToWar.addByte(0); // Unknown - apparently it's part of level ^ outBufferToWar.addByte(unit.random.itemClass); break; case 1: outBufferToWar.addInt(unit.random.groupIndex); outBufferToWar.addInt(unit.random.columnIndex); break; case 2: outBufferToWar.addInt(unit.random.unitSet?.length || 0); unit.random.unitSet?.forEach(spawnableUnit => { outBufferToWar.addChars(spawnableUnit.unitId); outBufferToWar.addInt(spawnableUnit.chance); }); break; } outBufferToWar.addInt(unit.color != null ? unit.color : unit.player); // custom color, defaults to owning player outBufferToWar.addInt(unit.waygate); // waygate outBufferToWar.addInt(unit.id); // id }); return { errors: [], buffer: outBufferToWar.getBuffer() }; } warToJson(buffer) { const result = []; const outBufferToJSON = new W3Buffer_1.W3Buffer(buffer); const fileId = outBufferToJSON.readChars(4); // W3do for doodad file const fileVersion = outBufferToJSON.readInt(); // File version = 7 const subVersion = outBufferToJSON.readInt(); // 0B 00 00 00 const numUnits = outBufferToJSON.readInt(); // # of units for (let i = 0; i < numUnits; i++) { const unit = { type: '', variation: -1, position: [0, 0, 0], rotation: 0, scale: [0, 0, 0], hero: { level: 1, str: 1, agi: 1, int: 1 }, skin: '', inventory: [], abilities: [], player: 0, hitpoints: -1, mana: -1, randomItemSetPtr: -1, droppedItemSets: [], gold: 0, targetAcquisition: -1, random: { type: -1, }, color: -1, waygate: -1, id: -1 }; unit.type = outBufferToJSON.readChars(4); // (iDNR = random item, uDNR = random unit) unit.variation = outBufferToJSON.readInt(); unit.position = [outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat()]; // X Y Z coords unit.rotation = outBufferToJSON.readFloat(); unit.scale = [outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat()]; // X Y Z scaling if (fileVersion > 7) { unit.skin = outBufferToJSON.readChars(4); } else { // default unit's skin - Note: Probably fails for items? unit.skin = unit.type; } // UNSUPPORTED: flags const flags = outBufferToJSON.readByte(); unit.player = outBufferToJSON.readInt(); // (player1 = 0, 16=neutral passive); note: wc3 patch now has 24 max players outBufferToJSON.readByte(); // unknown outBufferToJSON.readByte(); // unknown unit.hitpoints = outBufferToJSON.readInt(); // -1 = use default unit.mana = outBufferToJSON.readInt(); // -1 = use default, 0 = unit doesn't have mana if (subVersion !== 9) { // not RoC unit.randomItemSetPtr = outBufferToJSON.readInt(); } const numDroppedItemSets = outBufferToJSON.readInt(); for (let j = 0; j < numDroppedItemSets; j++) { unit.droppedItemSets.push({ items: [] }); const numDroppableItems = outBufferToJSON.readInt(); for (let k = 0; k < numDroppableItems; k++) { unit.droppedItemSets[j].items.push({ itemId: outBufferToJSON.readChars(4), chance: outBufferToJSON.readInt() // % chance to drop }); } } unit.gold = outBufferToJSON.readInt(); unit.targetAcquisition = outBufferToJSON.readFloat(); // (-1 = normal, -2 = camp) unit.hero = { level: outBufferToJSON.readInt(), str: 0, agi: 0, int: 0 }; if (subVersion !== 9) { // not RoC unit.hero.str = outBufferToJSON.readInt(); unit.hero.agi = outBufferToJSON.readInt(); unit.hero.int = outBufferToJSON.readInt(); } const numItemsInventory = outBufferToJSON.readInt(); for (let j = 0; j < numItemsInventory; j++) { unit.inventory.push({ slot: outBufferToJSON.readInt() + 1, type: outBufferToJSON.readChars(4) // Item ID }); } const numModifiedAbil = outBufferToJSON.readInt(); for (let j = 0; j < numModifiedAbil; j++) { unit.abilities.push({ ability: outBufferToJSON.readChars(4), active: outBufferToJSON.readInt() === 1, level: outBufferToJSON.readInt() }); } unit.random.type = outBufferToJSON.readInt(); // random unit/item flag "r" (for uDNR units and iDNR items) if (unit.random.type === 0) { // 0 = Any neutral passive building/item, in this case we have // byte[3]: level of the random unit/item,-1 = any (this is actually interpreted as a 24-bit number) // byte: item class of the random item, 0 = any, 1 = permanent ... (this is 0 for units) // r is also 0 for non random units/items so we have these 4 bytes anyway (even if the id wasnt uDNR or iDNR) unit.random.level = outBufferToJSON.readByte(); outBufferToJSON.readByte(); // unknown outBufferToJSON.readByte(); // unknown unit.random.itemClass = outBufferToJSON.readByte(); } else if (unit.random.type === 1) { // 1 = random unit from random group (defined in the w3i), in this case we have // int: unit group number (which group from the global table) // int: position number (which column of this group) // the column should of course have the item flag set (in the w3i) if this is a random item unit.random.groupIndex = outBufferToJSON.readInt(); unit.random.columnIndex = outBufferToJSON.readInt(); } else if (unit.random.type === 2) { // 2 = random unit from custom table, in this case we have // int: number "n" of different available units // then we have n times a random unit structure const numDiffAvailUnits = outBufferToJSON.readInt(); unit.random.unitSet = []; for (let k = 0; k < numDiffAvailUnits; k++) { unit.random.unitSet.push({ unitId: outBufferToJSON.readChars(4), chance: outBufferToJSON.readInt() // % chance }); } } unit.color = outBufferToJSON.readInt(); unit.waygate = outBufferToJSON.readInt(); // waygate (-1 = deactivated, else its the creation number of the target rect as in war3map.w3r) unit.id = outBufferToJSON.readInt(); result.push(unit); } return { errors: [], json: result }; } } exports.UnitsTranslator = UnitsTranslator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pdHNUcmFuc2xhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3djM21hcHRyYW5zbGF0b3IvdHJhbnNsYXRvcnMvVW5pdHNUcmFuc2xhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDRDQUF3QztBQUN4QywwQ0FBc0M7QUFNdEMsTUFBYSxlQUFlO0lBRzFCLGdCQUF3QixDQUFDO0lBRWxCLE1BQU0sQ0FBQyxXQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWE7UUFDbkMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQWM7UUFDcEMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFTSxTQUFTLENBQUMsU0FBaUI7UUFDaEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUE7UUFFdEM7O2VBRU87UUFDUCxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQy9CLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN6QixjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQyxrQkFBa0I7UUFFaEU7O2VBRU87UUFDUCxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVB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