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