import { materials } from './manager'; import { IBlockIdentifier, IIndexedIdentifier } from './types'; function extractClsBlocks>( cls: C, map: Record, icons: Record ): IBlockIdentifier[] { const max = Math.max(...Object.values(icons)); const arr = Array(max).fill(0); for (const [key, value] of Object.entries(icons)) { if (!(key in map)) continue; const id = key as AllIdsOf; const num = map[id] as keyof NumberToId; const identifier: IBlockIdentifier = { id: id as string, cls, num }; arr[value] = identifier; } return arr; } function addTileset(set: Set, map?: readonly (readonly number[])[]) { if (!map) return; map.forEach(line => { line.forEach(v => { if (v >= 10000) set.add(v); }); }); } /** * 兼容旧版加载 */ export function fallbackLoad() { // 基本素材 const icons = core.icons.icons; const images = core.material.images; const idNumMap: Record = {}; for (const [key, value] of Object.entries(core.maps.blocksInfo)) { idNumMap[value.id] = Number(key); } const terrains = extractClsBlocks('terrains', idNumMap, icons.terrains); const animates = extractClsBlocks('animates', idNumMap, icons.animates); const items = extractClsBlocks('items', idNumMap, icons.items); const enemys = extractClsBlocks('enemys', idNumMap, icons.enemys); const npcs = extractClsBlocks('npcs', idNumMap, icons.npcs); const enemy48 = extractClsBlocks('enemy48', idNumMap, icons.enemy48); const npc48 = extractClsBlocks('npc48', idNumMap, icons.npc48); // Grid materials.addGrid(images.terrains, terrains); materials.addGrid(images.items, items); // Row Animates materials.addRowAnimate(images.animates, animates, 4, 32); materials.addRowAnimate(images.enemys, enemys, 2, 32); materials.addRowAnimate(images.npcs, npcs, 2, 32); materials.addRowAnimate(images.enemy48, enemy48, 4, 48); materials.addRowAnimate(images.npc48, npc48, 4, 48); // Autotile for (const key of Object.keys(icons.autotile)) { const id = key as AllIdsOf<'autotile'>; const img = images.autotile[id]; const identifier: IBlockIdentifier = { id, num: idNumMap[id], cls: 'autotile' }; materials.addAutotile(img, identifier); } // Tilesets core.tilesets.forEach((v, i) => { const img = images.tilesets[v]; const identifier: IIndexedIdentifier = { index: i, alias: v }; materials.addTileset(img, identifier); }); // Images core.images.forEach((v, i) => { const img = core.material.images.images[v]; materials.addImage(img, { index: i, alias: v }); }); materials.buildAssets(); // 地图上出现过的 tileset const tilesetSet = new Set(); core.floorIds.forEach(v => { const floor = core.floors[v]; addTileset(tilesetSet, floor.bgmap); addTileset(tilesetSet, floor.bg2map); addTileset(tilesetSet, floor.map); addTileset(tilesetSet, floor.fgmap); addTileset(tilesetSet, floor.fg2map); }); materials.cacheTilesetList(tilesetSet); }