UNPKG

patchwork-mapconverter

Version:

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

523 lines 51.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InfoTranslator = void 0; /* eslint-disable @typescript-eslint/strict-boolean-expressions */ const HexBuffer_1 = require("../HexBuffer"); const W3Buffer_1 = require("../W3Buffer"); const Info_1 = require("../data/Info"); class InfoTranslator { constructor() { } static getInstance() { if (this.instance == null) { this.instance = new this(); } return this.instance; } static jsonToWar(info) { return this.getInstance().jsonToWar(info); } static warToJson(buffer) { return this.getInstance().warToJson(buffer); } jsonToWar(infoJson) { const outBufferToWar = new HexBuffer_1.HexBuffer(); outBufferToWar.addInt(33); // format version outBufferToWar.addInt(infoJson.saves != null ? infoJson.saves : 0); outBufferToWar.addInt(infoJson.editorVersion != null ? infoJson.editorVersion : 0); outBufferToWar.addInt(infoJson.gameVersion.major); outBufferToWar.addInt(infoJson.gameVersion.minor); outBufferToWar.addInt(infoJson.gameVersion.patch); outBufferToWar.addInt(infoJson.gameVersion.build); // Map information outBufferToWar.addString(infoJson.map.name); outBufferToWar.addString(infoJson.map.author); outBufferToWar.addString(infoJson.map.description); outBufferToWar.addString(infoJson.map.recommendedPlayers); // Camera bounds (8 floats total) for (let cbIndex = 0; cbIndex < 8; cbIndex++) { outBufferToWar.addFloat(infoJson.camera.bounds[cbIndex]); } // Camera complements (4 ints total) for (let ccIndex = 0; ccIndex < 4; ccIndex++) { outBufferToWar.addInt(infoJson.camera.complements[ccIndex]); } // Playable area outBufferToWar.addInt(infoJson.map.playableArea.width); outBufferToWar.addInt(infoJson.map.playableArea.height); /* * Flags */ let flags = 0; if (infoJson.map.flags != null) { // can leave out the entire flags object, all flags will default to false if (infoJson.map.flags.hideMinimapInPreview) flags |= 0x0001; // hide minimap in preview screens if (infoJson.map.flags.modifyAllyPriorities) flags |= 0x0002; // modify ally priorities if (infoJson.map.flags.isMeleeMap) flags |= 0x0004; // melee map if (infoJson.map.flags.nonDefaultTilesetMapSizeLargeNeverBeenReducedToMedium) flags |= 0x0008; // playable map size was large and never reduced to medium (?) if (infoJson.map.flags.maskedPartiallyVisible) flags |= 0x0010; // masked area are partially visible if (infoJson.map.flags.fixedPlayerSetting) flags |= 0x0020; // fixed player setting for custom forces if (infoJson.map.flags.useCustomForces) flags |= 0x0040; // use custom forces if (infoJson.map.flags.useCustomTechtree) flags |= 0x0080; // use custom techtree if (infoJson.map.flags.useCustomAbilities) flags |= 0x0100; // use custom abilities if (infoJson.map.flags.useCustomUpgrades) flags |= 0x0200; // use custom upgrades if (infoJson.map.flags.mapPropertiesMenuOpenedAtLeastOnce) flags |= 0x0400; // map properties menu opened at least once since map creation (?) if (infoJson.map.flags.waterWavesOnCliffShores) flags |= 0x0800; // show water waves on cliff shores if (infoJson.map.flags.waterWavesOnRollingShores) flags |= 0x1000; // show water waves on rolling shores if (infoJson.map.flags.useTerrainFog) flags |= 0x2000; if (infoJson.map.flags.tftRequired) flags |= 0x4000; if (infoJson.map.flags.useItemClassificationSystem) flags |= 0x8000; if (infoJson.map.flags.enableWaterTinting) flags |= 0x10000; if (infoJson.map.flags.useAccurateProbabilityForCalculations) flags |= 0x20000; if (infoJson.map.flags.useCustomAbilitySkins) flags |= 0x40000; if (infoJson.map.flags.disableDenyIcon) flags |= 0x80000; if (infoJson.map.flags.forceDefaultCameraZoom) flags |= 0x100000; if (infoJson.map.flags.forceMaxCameraZoom) flags |= 0x200000; if (infoJson.map.flags.forceMinCameraZoom) flags |= 0x400000; // 0x800000 // 8 -unknown bits? } outBufferToWar.addInt(flags); // Add flags // Map main ground type outBufferToWar.addChar(infoJson.map.mainTileType); // Loading screen outBufferToWar.addInt(infoJson.loadingScreen.background); outBufferToWar.addString(infoJson.loadingScreen.path); outBufferToWar.addString(infoJson.loadingScreen.text); outBufferToWar.addString(infoJson.loadingScreen.title); outBufferToWar.addString(infoJson.loadingScreen.subtitle); // Use game data set outBufferToWar.addInt(infoJson.gameDataSet); // Prologue outBufferToWar.addString(infoJson.prologue.path); outBufferToWar.addString(infoJson.prologue.text); outBufferToWar.addString(infoJson.prologue.title); outBufferToWar.addString(infoJson.prologue.subtitle); // Fog outBufferToWar.addInt(infoJson.fog.type); outBufferToWar.addFloat(infoJson.fog.startHeight); outBufferToWar.addFloat(infoJson.fog.endHeight); outBufferToWar.addFloat(infoJson.fog.density); outBufferToWar.addByte(infoJson.fog.color[0]); outBufferToWar.addByte(infoJson.fog.color[1]); outBufferToWar.addByte(infoJson.fog.color[2]); outBufferToWar.addByte(infoJson.fog.color[3]); // Misc. // // If globalWeather is not defined or is set to 'none', use 0 sentinel value, else add char[4] -- why this distinct crap? it just breaks the w3i for me. // if (infoJson.globalWeather == null || infoJson.globalWeather.toLowerCase() === 'none') { // outBufferToWar.addInt(0) // } else { outBufferToWar.addInt(infoJson.globalWeather); // } outBufferToWar.addString(infoJson.customSoundEnvironment != null ? infoJson.customSoundEnvironment : ''); outBufferToWar.addByte(infoJson.customLightEnv); // Custom water tinting outBufferToWar.addByte(infoJson.water[0]); outBufferToWar.addByte(infoJson.water[1]); outBufferToWar.addByte(infoJson.water[2]); outBufferToWar.addByte(infoJson.water[3]); outBufferToWar.addInt(infoJson.scriptLanguage); outBufferToWar.addInt(infoJson.supportedModes); outBufferToWar.addInt(infoJson.gameDataVersion); outBufferToWar.addInt(infoJson.forcedDefaultCamDistance); outBufferToWar.addInt(infoJson.forcedMaxCamDistance); outBufferToWar.addInt(infoJson.forcedMinCamDistance); // Players outBufferToWar.addInt(infoJson.players?.length || 0); infoJson.players?.forEach((player) => { outBufferToWar.addInt(player.playerNum); outBufferToWar.addInt(player.type); outBufferToWar.addInt(player.race); outBufferToWar.addInt(player.startingPos.fixed ? 1 : 0); outBufferToWar.addString(player.name); outBufferToWar.addFloat(player.startingPos.x); outBufferToWar.addFloat(player.startingPos.y); outBufferToWar.addInt(player.allyLowPriorities); // ally low prio flags outBufferToWar.addInt(player.allyHighPriorities); // ally high prio flags outBufferToWar.addInt(player.enemyLowPriorities); // enemy low prio flags outBufferToWar.addInt(player.enermyHighPriorities); // enemy high prio flags }); // Forces outBufferToWar.addInt(infoJson.forces?.length || 0); infoJson.forces?.forEach((force) => { // Calculate flags let forceFlags = 0; if (force.flags.allied) forceFlags |= 0x0001; if (force.flags.alliedVictory) forceFlags |= 0x0002; // Skip 0x0004 if (force.flags.shareVision) forceFlags |= 0x0008; if (force.flags.shareUnitControl) forceFlags |= 0x0010; if (force.flags.shareAdvUnitControl) forceFlags |= 0x0020; outBufferToWar.addInt(forceFlags); outBufferToWar.addInt(force.players); outBufferToWar.addString(force.name); }); // Struct: upgrade avail. outBufferToWar.addInt(infoJson.upgrades?.length || 0); infoJson.upgrades?.forEach(upgrade => { outBufferToWar.addInt(upgrade.playerFlags); outBufferToWar.addChars(upgrade.upgradeId); outBufferToWar.addInt(upgrade.level); outBufferToWar.addInt(upgrade.availability); }); // Struct: tech avail. outBufferToWar.addInt(infoJson.techBlacklist?.length || 0); infoJson.techBlacklist?.forEach(tech => { outBufferToWar.addInt(tech.playerFlags); outBufferToWar.addChars(tech.techId); }); // Struct: random unit table outBufferToWar.addInt(infoJson.randomUnitTables?.length || 0); infoJson.randomUnitTables?.forEach(randomUnitTable => { outBufferToWar.addInt(randomUnitTable.id); outBufferToWar.addString(randomUnitTable.name); outBufferToWar.addInt(randomUnitTable.positions?.length || 0); randomUnitTable.positions?.forEach(position => outBufferToWar.addInt(position)); outBufferToWar.addInt(randomUnitTable.chances?.length || 0); randomUnitTable.chances?.forEach(chance => { outBufferToWar.addInt(chance.chance); chance.unitIds.forEach(unitId => outBufferToWar.addChars(unitId)); //Amount of units must match amount of positions }); }); // Struct: random item table outBufferToWar.addInt(infoJson.randomItemTables?.length || 0); infoJson.randomItemTables?.forEach(randomItemTable => { outBufferToWar.addInt(randomItemTable.id); outBufferToWar.addString(randomItemTable.name); outBufferToWar.addInt(randomItemTable.rows?.length || 0); randomItemTable.rows?.forEach(randomItemPool => { outBufferToWar.addInt(randomItemPool.objects?.length || 0); randomItemPool.objects?.forEach(randomItem => { outBufferToWar.addInt(randomItem.chance); outBufferToWar.addChars(randomItem.objectId); }); }); }); return { errors: [], buffer: outBufferToWar.getBuffer() }; } warToJson(buffer) { const result = { map: { name: '', author: '', description: '', recommendedPlayers: '', playableArea: { width: 64, height: 64 }, mainTileType: '', flags: { hideMinimapInPreview: false, modifyAllyPriorities: true, isMeleeMap: false, nonDefaultTilesetMapSizeLargeNeverBeenReducedToMedium: false, maskedPartiallyVisible: false, fixedPlayerSetting: false, useCustomForces: false, useCustomTechtree: false, useCustomAbilities: false, useCustomUpgrades: false, mapPropertiesMenuOpenedAtLeastOnce: false, waterWavesOnCliffShores: false, waterWavesOnRollingShores: false, useTerrainFog: false, tftRequired: false, useItemClassificationSystem: false, enableWaterTinting: false, useAccurateProbabilityForCalculations: false, useCustomAbilitySkins: false, disableDenyIcon: false, forceDefaultCameraZoom: false, forceMaxCameraZoom: false, forceMinCameraZoom: false // 0x400000 } }, loadingScreen: { background: 0, path: '', text: '', title: '', subtitle: '' }, prologue: { path: '', text: '', title: '', subtitle: '' }, fog: { type: Info_1.FogType.Linear, startHeight: 0, endHeight: 0, density: 0, color: [0, 0, 0, 1] }, camera: { bounds: [], complements: [] }, players: [], forces: [], saves: 0, editorVersion: 0, scriptLanguage: Info_1.ScriptLanguage.JASS, supportedModes: Info_1.SupportedModes.Both, forcedDefaultCamDistance: 1250, forcedMaxCamDistance: 1250, forcedMinCamDistance: 1250, gameVersion: { major: 0, minor: 0, patch: 0, build: 0 }, globalWeather: 0, customSoundEnvironment: '', customLightEnv: 0, water: [], gameDataVersion: 0, gameDataSet: 0, upgrades: [], techBlacklist: [], randomUnitTables: [], randomItemTables: [] }; const outBufferToJSON = new W3Buffer_1.W3Buffer(buffer); const fileVersion = outBufferToJSON.readInt(); result.saves = outBufferToJSON.readInt(); result.editorVersion = outBufferToJSON.readInt(); result.gameVersion = { major: outBufferToJSON.readInt(), minor: outBufferToJSON.readInt(), patch: outBufferToJSON.readInt(), build: outBufferToJSON.readInt() }; result.map.name = outBufferToJSON.readString(); result.map.author = outBufferToJSON.readString(); result.map.description = outBufferToJSON.readString(); result.map.recommendedPlayers = outBufferToJSON.readString(); result.camera.bounds = [ outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat() ]; result.camera.complements = [ outBufferToJSON.readInt(), outBufferToJSON.readInt(), outBufferToJSON.readInt(), outBufferToJSON.readInt() ]; result.map.playableArea = { width: outBufferToJSON.readInt(), height: outBufferToJSON.readInt() }; const flags = outBufferToJSON.readInt(); result.map.flags = { hideMinimapInPreview: !!(flags & 0x0001), modifyAllyPriorities: !!(flags & 0x0002), isMeleeMap: !!(flags & 0x0004), nonDefaultTilesetMapSizeLargeNeverBeenReducedToMedium: !!(flags & 0x0008), maskedPartiallyVisible: !!(flags & 0x0010), fixedPlayerSetting: !!(flags & 0x0020), useCustomForces: !!(flags & 0x0040), useCustomTechtree: !!(flags & 0x0080), useCustomAbilities: !!(flags & 0x0100), useCustomUpgrades: !!(flags & 0x0200), mapPropertiesMenuOpenedAtLeastOnce: !!(flags & 0x0400), waterWavesOnCliffShores: !!(flags & 0x0800), waterWavesOnRollingShores: !!(flags & 0x1000), useTerrainFog: !!(flags & 0x2000), tftRequired: !!(flags & 0x4000), useItemClassificationSystem: !!(flags & 0x8000), enableWaterTinting: !!(flags & 0x10000), useAccurateProbabilityForCalculations: !!(flags & 0x20000), useCustomAbilitySkins: !!(flags & 0x40000), disableDenyIcon: !!(flags & 0x80000), forceDefaultCameraZoom: !!(flags & 0x100000), forceMaxCameraZoom: !!(flags & 0x200000), forceMinCameraZoom: !!(flags & 0x400000) }; result.map.mainTileType = outBufferToJSON.readChars(); result.loadingScreen.background = outBufferToJSON.readInt(); result.loadingScreen.path = outBufferToJSON.readString(); result.loadingScreen.text = outBufferToJSON.readString(); result.loadingScreen.title = outBufferToJSON.readString(); result.loadingScreen.subtitle = outBufferToJSON.readString(); result.gameDataSet = outBufferToJSON.readInt(); // 0 = standard result.prologue = { path: outBufferToJSON.readString(), text: outBufferToJSON.readString(), title: outBufferToJSON.readString(), subtitle: outBufferToJSON.readString() }; result.fog = { type: outBufferToJSON.readInt(), startHeight: outBufferToJSON.readFloat(), endHeight: outBufferToJSON.readFloat(), density: outBufferToJSON.readFloat(), color: [outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte()] // R G B A }; result.globalWeather = outBufferToJSON.readInt(); result.customSoundEnvironment = outBufferToJSON.readString(); result.customLightEnv = outBufferToJSON.readByte(); result.water = [outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte()]; // R G B A result.scriptLanguage = outBufferToJSON.readInt(); result.supportedModes = outBufferToJSON.readInt(); result.gameDataVersion = outBufferToJSON.readInt(); if (fileVersion >= 32) { result.forcedDefaultCamDistance = outBufferToJSON.readInt(); result.forcedMaxCamDistance = outBufferToJSON.readInt(); } if (fileVersion >= 33) { result.forcedMinCamDistance = outBufferToJSON.readInt(); } // Struct: players const numPlayers = outBufferToJSON.readInt(); for (let i = 0; i < numPlayers; i++) { const player = { name: '', startingPos: { x: 0, y: 0, fixed: false }, playerNum: 0, type: 0, race: 0, allyLowPriorities: 0, allyHighPriorities: 0, enemyLowPriorities: 0, enermyHighPriorities: 0 }; player.playerNum = outBufferToJSON.readInt(); player.type = outBufferToJSON.readInt(); // 1=Human, 2=Computer, 3=Neutral, 4=Rescuable player.race = outBufferToJSON.readInt(); // 1=Human, 2=Orc, 3=Undead, 4=Night Elf const isPlayerStartPositionFixed = outBufferToJSON.readInt() === 1; // 00000001 = fixed start position player.name = outBufferToJSON.readString(); player.startingPos = { x: outBufferToJSON.readFloat(), y: outBufferToJSON.readFloat(), fixed: isPlayerStartPositionFixed }; player.allyLowPriorities = outBufferToJSON.readInt(); // ally low priorities flags (bit "x"=1 --> set for player "x") player.allyHighPriorities = outBufferToJSON.readInt(); // ally high priorities flags (bit "x"=1 --> set for player "x") player.enemyLowPriorities = outBufferToJSON.readInt(); // enemy low priorities flags player.enermyHighPriorities = outBufferToJSON.readInt(); // enemy high priorities flags result.players.push(player); } // Struct: forces const numForces = outBufferToJSON.readInt(); for (let i = 0; i < numForces; i++) { const force = { flags: { allied: false, alliedVictory: true, shareVision: true, shareUnitControl: false, shareAdvUnitControl: false }, players: 0, name: '' }; const forceFlag = outBufferToJSON.readInt(); force.flags = { allied: !!(forceFlag & 0b1), alliedVictory: !!(forceFlag & 0b10), // 0x00000004: share vision (the documentation has this incorrect) shareVision: !!(forceFlag & 0b1000), shareUnitControl: !!(forceFlag & 0b10000), shareAdvUnitControl: !!(forceFlag & 0b100000) // 0x00000020: share advanced unit control }; force.players = outBufferToJSON.readInt(); // UNSUPPORTED: (bit "x"=1 --> player "x" is in this force; but carried over for accurate translation force.name = outBufferToJSON.readString(); result.forces.push(force); } // Struct: upgrade avail. const numUpgrades = outBufferToJSON.readInt(); for (let i = 0; i < numUpgrades; i++) { result.upgrades.push({ playerFlags: outBufferToJSON.readInt(), upgradeId: outBufferToJSON.readChars(4), level: outBufferToJSON.readInt(), availability: outBufferToJSON.readInt() // Availability (0 = unavailable, 1 = available, 2 = researched) }); } // Struct: tech avail. const numTech = outBufferToJSON.readInt(); for (let i = 0; i < numTech; i++) { result.techBlacklist.push({ playerFlags: outBufferToJSON.readInt(), techId: outBufferToJSON.readChars(4) // tech id (this can be an item, unit or ability) }); } // Struct: random unit table const numUnitTable = outBufferToJSON.readInt(); for (let i = 0; i < numUnitTable; i++) { result.randomUnitTables.push({ id: outBufferToJSON.readInt(), name: outBufferToJSON.readString(), positions: [], chances: [] }); const numPositions = outBufferToJSON.readInt(); // Number "m" of positions for (let j = 0; j < numPositions; j++) { result.randomUnitTables[i].positions.push(outBufferToJSON.readInt()); // Apparently, the following is false: unit table (=0), a building table (=1) or an item table (=2) } const numChances = outBufferToJSON.readInt(); for (let j = 0; j < numChances; j++) { result.randomUnitTables[i].chances.push({ chance: outBufferToJSON.readInt(), unitIds: [] }); for (let k = 0; k < numPositions; k++) { result.randomUnitTables[i].chances[j].unitIds.push(outBufferToJSON.readChars(4)); // unit/item id's for this line specified } } } // Struct: random item table const numItemTable = outBufferToJSON.readInt(); for (let i = 0; i < numItemTable; i++) { result.randomItemTables.push({ id: outBufferToJSON.readInt(), name: outBufferToJSON.readString(), rows: [] }); const itemSetsCurrentTable = outBufferToJSON.readInt(); // Number "m" of item sets on the current item table for (let j = 0; j < itemSetsCurrentTable; j++) { result.randomItemTables[i].rows.push({ type: 2, objects: [] }); const itemsInItemSet = outBufferToJSON.readInt(); // Number "i" of items on the current item set for (let k = 0; k < itemsInItemSet; k++) { result.randomItemTables[i].rows[j].objects.push({ chance: outBufferToJSON.readInt(), objectId: outBufferToJSON.readChars(4) // Item id (as in ItemData.slk) }); } } } return { errors: [], json: result }; } } exports.InfoTranslator = InfoTranslator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5mb1RyYW5zbGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2MzbWFwdHJhbnNsYXRvci90cmFuc2xhdG9ycy9JbmZvVHJhbnNsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRUFBa0U7QUFDbEUsNENBQXdDO0FBQ3hDLDBDQUFzQztBQUd0Qyx1Q0FBMEc7QUFFMUcsTUFBYSxjQUFjO0lBR3pCLGdCQUF3QixDQUFDO0lBRWxCLE1BQU0sQ0FBQyxXQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVU7UUFDaEMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQWM7UUFDcEMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFTSxTQUFTLENBQUMsUUFBYztRQUM3QixNQUFNLGNBQWMsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQTtRQUV0QyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsaUJBQWlCO1FBQzNDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FB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