import * as path from 'path' import * as fs from 'fs' import { wrapper, TypeOnEveryFile, TypeToolProp, TypeToolOptions } from '@asset-toolkit/core' const parseLDtk = require('../parseLDtk') export interface TypeProps extends TypeToolOptions { worldCoordToEntities?: boolean parser?: any } /** * A tool to generate json map from LDtk file * @param props - { pathIn, pathOut } * @param options - { } * @returns { Promise(returns) } */ const ldtk: (_props: TypeToolProp, options?: TypeProps) => Promise = wrapper( ({ pathIn, pathOut, options, file, next, log }: TypeOnEveryFile) => { const opts = { worldCoordToEntities: false, ...options, } const fileData = fs.readFileSync(path.resolve(pathIn || pathOut, file), 'utf8') const parser = opts.parser || parseLDtk const LDtkFile = JSON.parse(fileData) const { extractLevels, extractWorld } = parser(LDtkFile) const worldName = file.replace('.ldtk', '') const worldData = extractWorld() const levels = extractLevels({ worldCoordToEntities: opts.worldCoordToEntities, }) worldData.levels = [] levels.forEach((level: any) => { worldData.levels.push({ name: level.name, url: `${worldName}-${level.name}.json`, data: level.fields.reduce((obj: any, item: any) => { return { ...obj, [item['name']]: item['value'] } }, {}), tilesets: level.tilesetsIDs, }) fs.writeFileSync(path.resolve(pathOut, `${worldName}-${level.name}.json`), JSON.stringify(level, null, ' ')) log(file) }) fs.writeFileSync(path.resolve(pathOut, `${worldName}.json`), JSON.stringify(worldData, null, ' ')) next() }, undefined, { exts: ['ldtk'], name: 'LDtk to JSON' }, ) export default ldtk