ts-tiled-converter
Version:
Typescript library to convert tiled map to Studio map
162 lines • 8.52 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.compressLayersTile = void 0;
var lodash_groupby_1 = __importDefault(require("lodash.groupby"));
var ndSpace_1 = require("../ndSpace");
var compressLayersTile = function (tileIndex, regularLayers, layerWithCommands, cache) {
var context = getContext(tileIndex, regularLayers, layerWithCommands);
if (context.layers.length === 0)
return [];
var hasZ = context.layers.some(function (_a) {
var z = _a.z;
return z > 0;
});
if (!hasZ) {
// Compress tiles with no tiles on top (water case) => bottom => water => stuff on top of water
return compressTilesWithNoZ(context, cache);
}
if (context.bridge1 || context.bridge2) {
return compressTilesWithBridge(context, cache);
}
return compressTiles(context, cache);
};
exports.compressLayersTile = compressLayersTile;
var getContext = function (tileIndex, regularLayers, layerWithCommands) {
var systemTag = layerWithCommands.systemTags[tileIndex] || 0;
var bridge1 = layerWithCommands.systemTagsBridge1[tileIndex] || 0;
var bridge2 = layerWithCommands.systemTagsBridge2[tileIndex] || 0;
var passage = layerWithCommands.passages[tileIndex] || 0;
var terrainTag = layerWithCommands.terrainTags[tileIndex] || 0;
var layers = regularLayers.filter(function (layer) { return !!layer.layer[tileIndex]; });
var commands = layerWithCommands.commands;
return {
tileIndex: tileIndex,
systemTag: systemTag !== 0 ? commands.systemTags.find(function (v) { return v.systemTag === systemTag; }) : undefined,
bridge1: bridge1 !== 0 ? commands.systemTags.find(function (v) { return v.systemTag === bridge1; }) : undefined,
bridge2: bridge2 !== 0 ? commands.systemTags.find(function (v) { return v.systemTag === bridge2; }) : undefined,
terrainTag: terrainTag !== 0 ? commands.terrainTags.find(function (v) { return v.terrainTag === terrainTag; }) : undefined,
passage: commands.passages.find(function (v) { return v.passage === passage; }),
priorities: commands.priorities,
layers: layers,
};
};
var compressTilesWithNoZ = function (context, cache) {
var tileIndex = context.tileIndex, layers = context.layers, passage = context.passage;
var mapToTile = toTileByIndex(tileIndex);
return [
layers.slice(0, -2).map(mapToTile),
layers.slice(-2, -1).map(mapToTile),
__spreadArray(__spreadArray([], layers.slice(-1).map(mapToTile), true), [context.systemTag, context.terrainTag, passage], false).filter(excludeUndefined),
]
.filter(filterOutEmptyArrays)
.map(mapToTileId(cache));
};
var GROUP_BY_Z = ['ground', 'bridge1Layer', 'bridge1Layer', 'bridge1Layer', 'bridge2Layer', 'bridge2Layer'];
var compressTilesWithBridge = function (context, cache) {
var tileIndex = context.tileIndex, layers = context.layers, systemTag = context.systemTag, terrainTag = context.terrainTag, passage = context.passage, bridge1 = context.bridge1, bridge2 = context.bridge2, priorities = context.priorities;
var mapToTile = toTileByIndex(tileIndex);
var _a = (0, lodash_groupby_1.default)(layers, function (_a) {
var z = _a.z;
return GROUP_BY_Z[z] || GROUP_BY_Z[5];
}), ground = _a.ground, bridge1Layer = _a.bridge1Layer, bridge2Layer = _a.bridge2Layer;
var tileLayers = [
ground && ground.length !== 0 ? ground.map(mapToTile) : [mapToTile(layers[0])],
bridge1Layer && bridge1Layer.length > 0 ? __spreadArray([priorities[3]], bridge1Layer.map(mapToTile), true) : [],
bridge2Layer && bridge2Layer.length > 0 ? __spreadArray([priorities[5]], bridge2Layer.map(mapToTile), true) : [],
];
if (systemTag)
tileLayers[0].push(systemTag);
if (terrainTag)
tileLayers[0].push(terrainTag);
tileLayers[0].push(passage);
if (bridge1 && tileLayers[1].length)
tileLayers[1].push(bridge1);
if (bridge2 && tileLayers[2].length)
tileLayers[2].push(bridge2);
return tileLayers.filter(filterOutEmptyArrays).map(mapToTileId(cache));
};
var GROUND = 'ground';
var PRIORITY_OVER_PLAYER = 'priorityOverPlayer';
var PRIORITY = 'priority';
var compressTiles = function (context, cache) {
var tileIndex = context.tileIndex, layers = context.layers;
var mapToTile = toTileByIndex(tileIndex);
var _a = (0, lodash_groupby_1.default)(layers, function (_a) {
var z = _a.z;
return (z === 0 ? GROUND : z === 1 ? PRIORITY_OVER_PLAYER : PRIORITY);
}), ground = _a.ground, priorityOverPlayer = _a.priorityOverPlayer, priority = _a.priority;
var tileLayers = !ground || ground.length === 0
? tileLayersWithNoGrounds(priorityOverPlayer, priority, context, mapToTile)
: tileLayersWithGrounds(priorityOverPlayer, priority, ground, context, mapToTile);
return tileLayers.filter(filterOutEmptyArrays).map(mapToTileId(cache));
};
var highestPriority = function (priority) { return Math.max.apply(Math, priority.map(function (_a) {
var z = _a.z;
return z;
})); };
var tileLayersWithNoGrounds = function (priorityOverPlayer, priority, context, mapToTile) {
var priorities = context.priorities;
if (priorityOverPlayer && priorityOverPlayer.length > 0) {
return [
getPriorityTileWithContext(mapToTile(priorityOverPlayer[0]), context),
__spreadArray([priorities[1]], priorityOverPlayer.map(mapToTile), true),
priority && priority.length > 0 ? __spreadArray([priorities[highestPriority(priority)] || priorities[5]], priority.map(mapToTile), true) : [],
];
}
if (!priority || priority.length === 0) {
// This condition is impossible in theory
return [[{ globalId: 1, transformId: 0 }, context.systemTag, context.terrainTag, context.passage].filter(excludeUndefined)];
}
return [
getPriorityTileWithContext(mapToTile(priority[0]), context),
__spreadArray([priorities[highestPriority(priority)] || priorities[5]], priority.map(mapToTile), true),
];
};
var tileLayersWithGrounds = function (priorityOverPlayer, priority, ground, context, mapToTile) {
var priorities = context.priorities;
if (priorityOverPlayer && priorityOverPlayer.length > 0) {
if (priority && priority.length > 0) {
return [
getGroundTile(ground, context, mapToTile),
__spreadArray([priorities[1]], priorityOverPlayer.map(mapToTile), true),
__spreadArray([priorities[highestPriority(priority)] || priorities[5]], priority.map(mapToTile), true),
];
}
return [
ground.slice(0, -1).map(mapToTile),
getGroundTile(ground.slice(-1), context, mapToTile),
__spreadArray([priorities[1]], priorityOverPlayer.map(mapToTile), true),
];
}
return [
ground.slice(0, -1).map(mapToTile),
getGroundTile(ground.slice(-1), context, mapToTile),
priority && priority.length > 0 ? __spreadArray([priorities[highestPriority(priority)] || priorities[5]], priority.map(mapToTile), true) : [],
];
};
var getGroundTile = function (ground, context, mapToTile) {
return __spreadArray(__spreadArray([], ground.map(mapToTile), true), [context.systemTag, context.terrainTag, context.passage], false).filter(excludeUndefined);
};
var getPriorityTileWithContext = function (tile, context) {
return [tile, context.systemTag, context.terrainTag, context.passage].filter(excludeUndefined);
};
var toTileByIndex = function (tileIndex) { return function (layer) { return layer.layer[tileIndex]; }; };
var filterOutEmptyArrays = function (_a) {
var length = _a.length;
return length !== 0;
};
var mapToTileId = function (cache) { return function (layer) { return (0, ndSpace_1.resolveNDSpaceId)(cache, layer); }; };
var excludeUndefined = function (v) { return v; };
//# sourceMappingURL=compressLayersTile.js.map