import { GRID } from './config.js'; export function yen(value) { return `JPY ${Math.floor(value).toLocaleString('en-US')}`; } export function key(col, row) { return `${col},${row}`; } export function parseKey(k) { const [col, row] = String(k).split(',').map(Number); return { col, row }; } export function clamp(n, min, max) { return Math.max(min, Math.min(max, n)); } export function randomBetween(min, max) { return min + Math.random() * (max - min); } export function inGrid(col, row) { return col >= 0 && col < GRID.cols && row >= 0 && row < GRID.rows; } export function cellCenter(col, row) { return { x: GRID.x + col * GRID.cell + GRID.cell / 2, y: GRID.y + row * GRID.cell + GRID.cell / 2 }; } export function pointToCell(x, y) { const col = Math.floor((x - GRID.x) / GRID.cell); const row = Math.floor((y - GRID.y) / GRID.cell); if (!inGrid(col, row)) return null; return { col, row }; } export function distance(a, b) { return Math.hypot(a.x - b.x, a.y - b.y); } export function sameCell(a, b) { return a && b && a.col === b.col && a.row === b.row; } export function lerp(a, b, t) { return a + (b - a) * t; } export function hexToRgb(hex) { const s = hex.replace('#', ''); return { r: parseInt(s.slice(0, 2), 16), g: parseInt(s.slice(2, 4), 16), b: parseInt(s.slice(4, 6), 16) }; } export function rgbToHex(r, g, b) { const c = n => Math.round(clamp(n, 0, 255)).toString(16).padStart(2, '0'); return `#${c(r)}${c(g)}${c(b)}`; } export function mixHex(a, b, t) { const ca = hexToRgb(a), cb = hexToRgb(b); return rgbToHex(lerp(ca.r, cb.r, t), lerp(ca.g, cb.g, t), lerp(ca.b, cb.b, t)); }