109 lines
2.5 KiB
TypeScript
109 lines
2.5 KiB
TypeScript
export const TERRAIN_COLORS = {
|
|
grass1: {
|
|
hex: "#84C66B",
|
|
rgb: [132, 198, 107] as const,
|
|
type: "grass" as const,
|
|
grassTipColor: "#84C66B",
|
|
},
|
|
grass2: {
|
|
hex: "#67B058",
|
|
rgb: [103, 176, 88] as const,
|
|
type: "grass" as const,
|
|
grassTipColor: "#67B058",
|
|
},
|
|
grass3: {
|
|
hex: "#A3CA5B",
|
|
rgb: [163, 202, 91] as const,
|
|
type: "grass" as const,
|
|
grassTipColor: "#A3CA5B",
|
|
},
|
|
potager: {
|
|
hex: "#342420",
|
|
rgb: [52, 36, 32] as const,
|
|
type: "tile" as const,
|
|
tileModel: "/models/potager/potager.gltf",
|
|
tileSize: 1,
|
|
},
|
|
terre: {
|
|
hex: "#513E2C",
|
|
rgb: [81, 62, 44] as const,
|
|
type: "none" as const,
|
|
},
|
|
chemin: {
|
|
hex: "#F5D896",
|
|
rgb: [245, 216, 150] as const,
|
|
type: "tile" as const,
|
|
tileModel: "/models/chemins/model.gltf",
|
|
tileSize: 1,
|
|
},
|
|
eau: {
|
|
hex: "#91DAF5",
|
|
rgb: [145, 218, 245] as const,
|
|
type: "water" as const,
|
|
},
|
|
cailloux: {
|
|
hex: "#B6D3DE",
|
|
rgb: [182, 211, 222] as const,
|
|
type: "none" as const,
|
|
},
|
|
} as const;
|
|
|
|
export type TerrainColorKey = keyof typeof TERRAIN_COLORS;
|
|
export type TerrainType = "grass" | "tile" | "water" | "none";
|
|
|
|
export const GRASS_BASE_COLOR = "#1a3a1a";
|
|
|
|
export const COLOR_TOLERANCE = 15;
|
|
|
|
export function colorMatchesTerrain(
|
|
r: number,
|
|
g: number,
|
|
b: number,
|
|
targetRgb: readonly [number, number, number],
|
|
tolerance: number = COLOR_TOLERANCE,
|
|
): boolean {
|
|
return (
|
|
Math.abs(r - targetRgb[0]) <= tolerance &&
|
|
Math.abs(g - targetRgb[1]) <= tolerance &&
|
|
Math.abs(b - targetRgb[2]) <= tolerance
|
|
);
|
|
}
|
|
|
|
export function getTerrainTypeFromColor(
|
|
r: number,
|
|
g: number,
|
|
b: number,
|
|
): TerrainColorKey | null {
|
|
for (const [key, config] of Object.entries(TERRAIN_COLORS)) {
|
|
if (colorMatchesTerrain(r, g, b, config.rgb)) {
|
|
return key as TerrainColorKey;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function isGrassZone(r: number, g: number, b: number): boolean {
|
|
return (
|
|
colorMatchesTerrain(r, g, b, TERRAIN_COLORS.grass1.rgb) ||
|
|
colorMatchesTerrain(r, g, b, TERRAIN_COLORS.grass2.rgb) ||
|
|
colorMatchesTerrain(r, g, b, TERRAIN_COLORS.grass3.rgb)
|
|
);
|
|
}
|
|
|
|
export function getGrassTipColor(
|
|
r: number,
|
|
g: number,
|
|
b: number,
|
|
): string | null {
|
|
if (colorMatchesTerrain(r, g, b, TERRAIN_COLORS.grass1.rgb)) {
|
|
return TERRAIN_COLORS.grass1.grassTipColor;
|
|
}
|
|
if (colorMatchesTerrain(r, g, b, TERRAIN_COLORS.grass2.rgb)) {
|
|
return TERRAIN_COLORS.grass2.grassTipColor;
|
|
}
|
|
if (colorMatchesTerrain(r, g, b, TERRAIN_COLORS.grass3.rgb)) {
|
|
return TERRAIN_COLORS.grass3.grassTipColor;
|
|
}
|
|
return null;
|
|
}
|