ts-tiled-converter
Version:
Typescript library to convert tiled map to Studio map
42 lines (38 loc) • 2.04 kB
text/typescript
import { assertTilesetValidity } from './tiledToStudio/assertTilesetValidity';
import { assertMapValidity } from './tiledToStudio/assertMapValidity';
import { buildLayerWithTileCommandCollection } from './tiledToStudio/buildLayerWithTileCommandCollection';
import { compressLayersTile } from './tiledToStudio/compressLayersTile';
import { mapToTileLayersWithMetaData } from './tiledToStudio/mapToTileLayersWithMetaData';
import { initNDSpace } from './ndSpace';
import { readMap } from './reader/readMap';
import { splitSpecialAndRegularLayers } from './tiledToStudio/splitSpecialAndRegularLayers';
import { getXMLProperties } from './tiledXML/objects';
import type { PartialStudioMap, TileCommand, TileMetaData } from './types';
import { filterTileset, throwIfError, toError } from './util';
export const convertTiledMapToTileMetadata = (mapPath: string): PartialStudioMap | Error => {
try {
const mapData = throwIfError(readMap(mapPath));
throwIfError(assertTilesetValidity(mapData.map));
throwIfError(assertMapValidity(mapData.map));
const layerWithMetadata = throwIfError(mapToTileLayersWithMetaData(mapData.map));
const { length } = layerWithMetadata[0].layer;
const { width, height } = getXMLProperties(mapData.map);
if (length !== width * height) throw Error('Invalid map size');
const split = throwIfError(splitSpecialAndRegularLayers(mapData.map, layerWithMetadata));
const layerWithCommands = buildLayerWithTileCommandCollection(split);
const cache = initNDSpace<TileMetaData | TileCommand, 0>(0);
const layerData = Array.from({ length }, (_, tileIndex) => compressLayersTile(tileIndex, split.regularLayers, layerWithCommands, cache));
return {
sha1: mapData.sha1,
tileMetadata: {
width,
height,
tilesets: mapData.map.map.filter(filterTileset).map(getXMLProperties),
tileByTileId: cache.itemsOrderedByIds,
layerData,
},
};
} catch (error) {
return toError(error);
}
};