UNPKG

patchwork-mapconverter

Version:

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

354 lines 35.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TriggerComposer = void 0; const path_1 = __importDefault(require("path")); const LoggerFactory_1 = require("../logging/LoggerFactory"); const TriggerContainer_1 = require("../translator/data/TriggerContainer"); const EnhancementManager_1 = __importDefault(require("./EnhancementManager")); const TreeIterator_1 = __importDefault(require("../util/TreeIterator")); const TriggerContent_1 = require("../translator/data/content/TriggerContent"); const ini = __importStar(require("ini")); const WriteAndCreatePath_1 = require("../util/WriteAndCreatePath"); const promises_1 = require("fs/promises"); const FileBlacklist_1 = require("./FileBlacklist"); const FormatConverters_1 = require("../converter/formats/FormatConverters"); const log = LoggerFactory_1.LoggerFactory.createLogger('TriggerComposer'); async function populateComment(element, child) { element.comment = await (0, promises_1.readFile)(child.path, 'utf8'); } // handles both GUI trigger and Variable async function populateGUIContent(element, child) { const trigger = FormatConverters_1.FormatConverters[EnhancementManager_1.default.guiExtension].parse(await (0, promises_1.readFile)(child.path, 'utf8')); for (const [key, value] of Object.entries(trigger)) { if (key === 'children') continue; if (value == null || value === '') continue; element[key] = value; } } async function populateCustomScript(element, child) { element.script = await (0, promises_1.readFile)(child.path, 'utf8'); } async function populateParentDetails(parent, file) { const record = ini.parse(await (0, promises_1.readFile)(file.path, 'utf8')); for (const [key, value] of Object.entries(record)) { if (key === 'children') continue; // ignore children entry, that one is handled internally (shouldn't exist anyways) parent[key] = value; } } function safeReplaceTriggerName(name) { return name .replaceAll('/', '-') .replaceAll('\\', '-') .replaceAll(':', ';') .replaceAll('*', '+') .replaceAll('?', '!') .replaceAll('"', '\'') .replaceAll('<', '(') .replaceAll('>', ')') .replaceAll('|', '_'); } function generateTriggerOrder(parent) { const commentCounts = {}; return parent.children.map(it => { it.name = safeReplaceTriggerName(it.name); if (it.contentType === TriggerContent_1.ContentType.COMMENT) { if (commentCounts[it.name] != null) { const count = commentCounts[it.name] + 1; commentCounts[it.name] = count; it.name = `${it.name}_${count}`; } else { commentCounts[it.name] = 1; } } return it.name; }); } function sortTriggerContent(root) { let newChildrenOrder = new Array(root.order != null ? root.order.length : 0); const unspecifiedChildren = []; const containerChildrenRecord = Object.values(root.children).reduce((ret, value) => { ret[value.name] = value; return ret; }, {}); if (root.order == null) root.order = []; const orderedContentRecord = Object.entries(root.order).reduce((ret, entry) => { const [key, value] = entry; ret[value] = key; return ret; }, {}); for (const [name, content] of Object.entries(containerChildrenRecord)) { const desiredIndex = orderedContentRecord[name]; if (desiredIndex == null) { unspecifiedChildren.push(content); } else { newChildrenOrder[desiredIndex] = content; } } newChildrenOrder = newChildrenOrder.filter(it => it != null); newChildrenOrder.push(...unspecifiedChildren); root.children = newChildrenOrder; for (const child of root.children) { if (child.children != null) { sortTriggerContent(child); } } } const TriggerComposer = { composeTriggerJson: async function (input) { const tasks = []; const result = { name: EnhancementManager_1.default.mapHeaderFilename, contentType: TriggerContent_1.ContentType.HEADER, isExpanded: false, children: [], description: '', script: '' }; const parentMap = new Map(); parentMap.set(input, result); const triggerContentMap = new Map(); triggerContentMap.set(result, new Map()); const commentCounters = new Map(); if (input.children == null) { return result; } for (const [parents, file] of (0, TreeIterator_1.default)(input, (parent) => parent.children)) { if (FileBlacklist_1.FileBlacklist.isDirectoryTreeBlacklisted(file)) continue; let parent = parents.pop(); if (parent == null) { parent = input; } const containerParent = parentMap.get(parent); if (containerParent == null) { throw new Error('Something went wrong 2'); } const scriptDisabled = file.extension === EnhancementManager_1.default.disabledExtension; if (scriptDisabled) { const pos1 = file.name.lastIndexOf(EnhancementManager_1.default.disabledExtension); file.name = file.name.substring(0, pos1); file.extension = file.name.substring(file.name.lastIndexOf('.'), pos1); } if (file.type === 'directory' && file !== input) { const container = { name: file.name, contentType: TriggerContent_1.ContentType.CATEGORY, isExpanded: false, children: [] }; parentMap.set(file, container); triggerContentMap.set(container, new Map()); containerParent.children.push(container); } else if (file.type === 'file') { if (file.extension === EnhancementManager_1.default.containerInfoExtension) { tasks.push(populateParentDetails(containerParent, file)); } else if (file.extension === EnhancementManager_1.default.guiExtension) { const element = { name: file.name.substring(0, file.name.lastIndexOf('.')), contentType: TriggerContent_1.ContentType.TRIGGER, actions: [], arrayLength: 0, conditions: [], description: '', events: [], initiallyOff: false, initialValue: '', isArray: false, isEnabled: false, isInitialized: false, runOnMapInit: false, type: '' }; if ((triggerContentMap.get(containerParent)?.has(element.name)) ?? false) { triggerContentMap.get(containerParent)?.get(element.name)?.push(element); } else { triggerContentMap.get(containerParent)?.set(element.name, [element]); containerParent.children.push(element); } tasks.push(populateGUIContent(element, file)); } else if (file.extension === EnhancementManager_1.default.scriptExtension) { if (file.name.endsWith(`${EnhancementManager_1.default.mapHeaderFilename}${EnhancementManager_1.default.scriptExtension}`)) { tasks.push(populateCustomScript(result, file)); } else { const element = { name: file.name.substring(0, file.name.lastIndexOf('.')), contentType: TriggerContent_1.ContentType.CUSTOM_SCRIPT, script: '', description: '', isEnabled: !scriptDisabled }; if ((triggerContentMap.get(containerParent)?.has(element.name)) ?? false) { triggerContentMap.get(containerParent)?.get(element.name)?.push(element); } else { triggerContentMap.get(containerParent)?.set(element.name, [element]); containerParent.children.push(element); } tasks.push(populateCustomScript(element, file)); } } else if (file.extension === EnhancementManager_1.default.commentExtension) { const element = { name: file.name.substring(0, file.name.lastIndexOf('.')), contentType: TriggerContent_1.ContentType.COMMENT, comment: '' }; if (!commentCounters.has(containerParent)) { commentCounters.set(containerParent, { [element.name]: 1 }); } else { const commentCounts = commentCounters.get(containerParent); if (commentCounts[element.name] != null) { const count = commentCounts[element.name] + 1; commentCounters[element.name] = count; element.name = `${element.name}_${count}`; } else { commentCounts[element.name] = 1; } } containerParent.children.push(element); tasks.push(populateComment(element, file)); } } } for (const file of input.children) { if (file.type === 'file') { if (file.extension === EnhancementManager_1.default.containerInfoExtension) { tasks.push(populateParentDetails(result, file)); } } } await Promise.all(tasks); for (const [container, contentMap] of triggerContentMap) { for (const [, contents] of contentMap) { if (contents.length > 1) { let injectedRef; let script; let trigger; for (const content of contents) { if (injectedRef == null) { injectedRef = content; } switch (content.contentType) { case TriggerContent_1.ContentType.TRIGGER: case TriggerContent_1.ContentType.TRIGGER_SCRIPTED: trigger = content; break; case TriggerContent_1.ContentType.CUSTOM_SCRIPT: script = content; break; } if (script != null && trigger != null) { injectedRef.isEnabled = trigger.isEnabled; injectedRef.script = script.script; injectedRef.contentType = TriggerContent_1.ContentType.TRIGGER_SCRIPTED; } } } else { contents.forEach(it => container.children.push(it)); } } } sortTriggerContent(result); return result; }, explodeTriggersJsonIntoSource: async function (output, triggersJson) { const sourceOutput = path_1.default.join(output, EnhancementManager_1.default.sourceFolder); log.info('Exploding triggers.json into a source code tree at', sourceOutput); triggersJson.name = ''; // Delete header name const tasks = []; for (const [parents, content] of (0, TreeIterator_1.default)(triggersJson, TriggerContainer_1.GetTriggerContainerChildren)) { const outPath = path_1.default.join(sourceOutput, ...parents.map(it => it.name)); const exportObj = { contentType: content.contentType }; content.name = safeReplaceTriggerName(content.name); switch (content.contentType) { case TriggerContent_1.ContentType.HEADER: exportObj.description = content.description; tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${EnhancementManager_1.default.mapHeaderFilename}${EnhancementManager_1.default.scriptExtension}`), content.script, 'utf8')); exportObj.isExpanded = content.isExpanded; exportObj.order = generateTriggerOrder(content); tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${EnhancementManager_1.default.mapHeaderFilename}${EnhancementManager_1.default.containerInfoExtension}`), ini.encode(exportObj), 'utf8')); break; case TriggerContent_1.ContentType.LIBRARY: case TriggerContent_1.ContentType.CATEGORY: exportObj.isExpanded = content.isExpanded; exportObj.order = generateTriggerOrder(content); tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, content.name, `${content.name}${EnhancementManager_1.default.containerInfoExtension}`), ini.encode(exportObj), 'utf8')); break; case TriggerContent_1.ContentType.TRIGGER: exportObj.runOnMapInit = content.runOnMapInit; exportObj.initiallyOff = content.initiallyOff; exportObj.isEnabled = content.isEnabled; exportObj.description = content.description; exportObj.events = content.events; exportObj.conditions = content.conditions; exportObj.actions = content.actions; tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${content.name}${EnhancementManager_1.default.guiExtension}`), FormatConverters_1.FormatConverters[EnhancementManager_1.default.guiExtension].stringify(content), 'utf8')); break; case TriggerContent_1.ContentType.TRIGGER_SCRIPTED: tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${content.name}${EnhancementManager_1.default.scriptExtension}`), content.script, 'utf8')); content.script = ''; tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${content.name}${EnhancementManager_1.default.guiExtension}`), FormatConverters_1.FormatConverters[EnhancementManager_1.default.guiExtension].stringify(content), 'utf8')); break; case TriggerContent_1.ContentType.COMMENT: tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${content.name}${EnhancementManager_1.default.commentExtension}`), content.comment, 'utf8')); break; case TriggerContent_1.ContentType.CUSTOM_SCRIPT: tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${content.name}${EnhancementManager_1.default.scriptExtension}${(content.isEnabled) ? ('') : (EnhancementManager_1.default.disabledExtension)}`), content.script, 'utf8')); break; case TriggerContent_1.ContentType.VARIABLE: exportObj.type = content.type; exportObj.isInitialized = content.isInitialized; exportObj.initialValue = content.initialValue; exportObj.isArray = content.isArray; exportObj.arrayLength = content.arrayLength; tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(outPath, `${content.name}${EnhancementManager_1.default.guiExtension}`), FormatConverters_1.FormatConverters[EnhancementManager_1.default.guiExtension].stringify(content), 'utf8')); break; } } await Promise.all(tasks); } }; exports.TriggerComposer = TriggerComposer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJpZ2dlckNvbXBvc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuaGFuY2VtZW50cy9UcmlnZ2VyQ29tcG9zZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBdUI7QUFDdkIsNERBQXdEO0FBQ3hELDBFQUF3RztBQUN4Ryw4RUFBcUQ7QUFDckQsd0VBQStDO0FBQy9DLDhFQUE0RjtBQUs1Rix5Q0FBMEI7QUFFMUIsbUVBQStEO0FBRy9ELDBDQUFzQztBQUd0QyxtREFBK0M7QUFDL0MsNEVBQXdFO0FBRXhFLE1BQU0sR0FBRyxHQUFHLDZCQUFhLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUE7QUFFekQsS0FBSyxVQUFVLGVBQWUsQ0FBQyxPQUF1QixFQUFFLEtBQW9CO0lBQzFFLE9BQU8sQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUN0RCxDQUFDO0FBRUQsd0NBQXdDO0FBQ3hDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxPQUF1QixFQUFFLEtBQW9CO0lBQzdFLE1BQU0sT0FBTyxHQUFZLG1DQUFnQixDQUFDLDRCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUEsbUJBQVEsRUFBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDcEgsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBZSxDQUFDLEVBQUU7UUFDMUQsSUFBSSxHQUFHLEtBQUssVUFBVTtZQUFFLFNBQVE7UUFDaEMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1lBQUUsU0FBUTtRQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBZ0Is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