Files
heros_web/scripts/export-battle-map-v2-data.mjs

50 lines
1.8 KiB
JavaScript

import { mkdirSync, writeFileSync } from 'node:fs';
import { dirname, join, sep } from 'node:path';
import { createServer } from 'vite';
const outputPath = process.argv[2] ?? join('tmp', 'battle-map-v2-runtime-data.json');
const battleAssetMarker = '/src/assets/images/battle/';
const server = await createServer({
logLevel: 'error',
server: { middlewareMode: true },
appType: 'custom'
});
try {
const { battleScenarios } = await server.ssrLoadModule('/src/game/data/battles.ts');
const { battleMapAssets } = await server.ssrLoadModule('/src/game/data/battleMapAssets.ts');
const battles = Object.values(battleScenarios).map((scenario, index) => {
const assetUrl = battleMapAssets[scenario.mapTextureKey];
const markerIndex = typeof assetUrl === 'string' ? assetUrl.indexOf(battleAssetMarker) : -1;
if (markerIndex < 0) {
throw new Error(`${scenario.id}: cannot resolve battle map asset URL ${JSON.stringify(assetUrl)}`);
}
const fileName = assetUrl.slice(markerIndex + battleAssetMarker.length);
return {
number: index + 1,
id: scenario.id,
title: scenario.title,
mapTextureKey: scenario.mapTextureKey,
assetPath: join('src', 'assets', 'images', 'battle', fileName).split(sep).join('/'),
width: scenario.map.width,
height: scenario.map.height,
terrain: scenario.map.terrain,
units: scenario.units.map((unit) => ({
id: unit.id,
faction: unit.faction,
x: unit.x,
y: unit.y
}))
};
});
mkdirSync(dirname(outputPath), { recursive: true });
writeFileSync(outputPath, `${JSON.stringify({ generatedAt: new Date().toISOString(), battles }, null, 2)}\n`, 'utf8');
console.log(`Wrote ${outputPath} with ${battles.length} runtime battle maps.`);
} finally {
await server.close();
}