zunda_shiwake/src/core/utils.js
2026-06-07 18:06:35 +09:00

32 lines
1.6 KiB
JavaScript

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));
}