MatchMaster/assets/Script/module/Tool/BlockTexturePaths.ts
COMPUTER\EDY 4a352390b8 更新
2026-08-27 19:31:20 +08:00

108 lines
5.0 KiB
TypeScript

/** 原始图片文件清单。只缓存文件;是否进内存仍由两关需求决定。 */
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<string>();
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();
}