patchwork-mapconverter
Version:
Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator
258 lines • 26.7 kB
JavaScript
;
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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