/** 原始图片文件清单。只缓存文件;是否进内存仍由两关需求决定。 */ export function allBlockTexturePaths(): string[] { const paths: string[] = []; for (let shape = 0; shape < 23; shape++) { for (let color = 0; color <= 12; color++) paths.push(color + "color" + shape); paths.push("question" + shape, "ice_" + shape, "xz_" + shape); } return paths.sort(); } /** 保留现有 PNG 的裁剪布局:[x,y,w,h,offsetX,offsetY,originalW,originalH]。 */ export const BLOCK_TEXTURE_TRIMS: { [path: string]: number[] } = { "10color0": [1, 0, 121, 129, 0.5, 0, 122, 129], "10color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "10color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "10color9": [1, 0, 366, 250, 0.5, 0, 367, 250], "1color0": [1, 0, 121, 129, 0.5, 0, 122, 129], "1color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "1color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "2color0": [1, 0, 121, 129, 0.5, 0, 122, 129], "2color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "2color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "3color0": [1, 0, 121, 129, 0.5, 0, 122, 129], "3color13": [1, 0, 363, 249, 0.5, 0, 364, 249], "3color3": [1, 0, 363, 131, 0.5, 0, 364, 131], "3color4": [1, 0, 123, 372, 0.5, 0, 124, 372], "3color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "4color20": [23, 0, 244, 249, 11.5, 0, 267, 249], "4color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "4color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "4color9": [1, 0, 366, 250, 0.5, 0, 367, 250], "5color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "5color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "6color0": [1, 0, 121, 129, 0.5, 0, 122, 129], "6color13": [1, 0, 363, 249, 0.5, 0, 364, 249], "6color3": [1, 0, 363, 131, 0.5, 0, 364, 131], "6color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "6color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "7color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "7color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "8color11": [1, 0, 365, 254, 0.5, 0, 366, 254], "8color21": [1, 0, 246, 252, 0.5, 0, 247, 252], "8color22": [0, 1, 244, 250, 0, -0.5, 244, 251], "8color4": [1, 0, 121, 367, 0.5, 0, 122, 367], "8color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "9color0": [1, 0, 121, 129, 0.5, 0, 122, 129], "9color4": [1, 0, 121, 368, 0.5, 0, 122, 368], "9color7": [1, 1, 363, 251, 0.5, -0.5, 364, 252], "xz_0": [2, 2, 154, 159, 0, 0, 158, 163], "xz_1": [2, 2, 272, 160, 0, 0, 276, 164], "xz_10": [2, 2, 272, 397, 0, 0, 276, 401], "xz_11": [2, 2, 393, 278, 0, 0, 397, 282], "xz_12": [2, 2, 272, 397, 0, 0, 276, 401], "xz_13": [2, 2, 393, 278, 0, 0, 397, 282], "xz_14": [2, 2, 395, 277, 0, 0, 399, 281], "xz_15": [2, 2, 395, 277, 0, 0, 399, 281], "xz_16": [2, 2, 273, 395, 0, 0, 277, 399], "xz_17": [2, 2, 273, 395, 0, 0, 277, 399], "xz_18": [2, 2, 392, 398, 0, 0, 396, 402], "xz_19": [2, 2, 275, 274, 0, 0, 279, 278], "xz_2": [2, 2, 155, 277, 0, 0, 159, 281], "xz_20": [2, 2, 274, 275, 0, 0, 278, 279], "xz_21": [2, 2, 275, 274, 0, 0, 279, 278], "xz_22": [2, 2, 274, 275, 0, 0, 278, 279], "xz_3": [2, 2, 393, 160, 0, 0, 397, 164], "xz_4": [2, 2, 151, 398, 0, 0, 155, 402], "xz_5": [2, 2, 272, 280, 0, 0, 276, 284], "xz_6": [2, 2, 272, 397, 0, 0, 276, 401], "xz_7": [2, 2, 393, 278, 0, 0, 397, 282], "xz_8": [2, 2, 272, 397, 0, 0, 276, 401], "xz_9": [2, 2, 393, 278, 0, 0, 397, 282], }; /** 关卡中的颜色从 1 开始;颜色 11 使用灰色障碍图。 */ export function blockTexturePath(color: number, shape: number): string { return (color === 11 ? 0 : color) + "color" + shape; } export function blockCycleColors(value: string | number): number[] { return value == null ? [] : String(value).split("").map(char => Number(char) + 1); } /** 包含本关游玩过程中会出现的状态,而不只是开局颜色。 */ export function collectBlockTexturePaths(blocks: any[]): string[] { const paths = new Set(); for (const block of blocks || []) { if (!block || block.block == null || block.block === 23) continue; const shape = block.block; const colors = blockCycleColors(block.colorArray); if (!colors.length) colors.push(block.color); if (block.type === 1) colors.push(block.stacking); for (const color of colors) { if (!Number.isInteger(shape) || shape < 0 || shape > 22 || !Number.isInteger(color) || color < 1 || color > 11) { throw new Error("无效的方块图片配置: " + JSON.stringify(block)); } paths.add(blockTexturePath(color, shape)); } // 旧 block6 的 10color 是问号外壳,与普通 10color 不是同一张图。 if (block.type === 16) paths.add("question" + shape); if (block.lock != null) { paths.add("11color" + shape); paths.add("12color" + shape); } } return Array.from(paths).sort(); }