/**
* Реестр размеров спрайтов игры — единственный источник истины для
* генераторов (gen.mjs), линтера (aiart/lint-art.mjs) и aiart-тулз.
* Таблица размеров в docs/art-style.md ссылается сюда (§2).
*
* Рантайм размеры не отсюда: движок читает их из атласного JSON
* (`AssetLoader.frameSize`) — тулзовый реестр движок не знает.
*/
export const SIZES = {
/** Тайл-ромб (изометрия 2:1). */
tile: { w: 32, h: 16 },
/** Высокие тайлы: спрайт якорится низом в центр ромба. */
tall: {
wall: [32, 32],
well: [32, 40],
tree: [32, 48],
house: [32, 56],
tower: [32, 80]
},
/** Крупные пропы. */
prop: {
houseBig: [64, 80]
},
/** Кадры героя и NPC (общая сетка атласов chars/*_sheet). */
char: { w: 16, h: 24 },
/** Кадры фауны (та же сетка, что у героя). */
fauna: { w: 16, h: 24 },
/** Кадры сгустков (враги демо-боя; рисунки вписаны по низу-центру). */
clump: { w: 20, h: 20 },
/** Спрайты декора поверх тайлов (микро-кусты, камни, проплешины). */
decor: { w: 16, h: 16 }
};
/** Слоты вне реестра: рукодельные кадры сгустков и крупные AI-ассеты. */
const EXTRA_SLOTS = ['14x12', '14x14', '48x48', '96x96', '128x112'];
const dim = (s) => (Array.isArray(s) ? `${s[0]}x${s[1]}` : `${s.w}x${s.h}`);
/** Все размеры группы: группа — либо один размер {w,h}, либо карта имён → размер. */
const groupDims = (group) =>
'w' in group ? [group] : Object.values(group);
/** Все допустимые слоты линтера: реестр + исключения. */
export const SLOTS = new Set([
...Object.values(SIZES).flatMap((group) => groupDims(group).map(dim)),
...EXTRA_SLOTS
]);