import { fnv1a32, hash2u32, mulberry32 } from "../../public/src/rng.js"; import { generatePlanet, formatPlanet } from "../../public/src/planetGeneration.js"; const GRID_W = 100; const GRID_H = 100; const OUTER_RADIUS = 50; const INNER_RADIUS = 30; const PLANET_CHANCE = 0.1; export function cellCenter(x, y) { const cx = (GRID_W - 1) / 2; const cy = (GRID_H - 1) / 2; return { dx: x - cx, dy: y - cy }; } export function isExploitable(x, y) { const { dx, dy } = cellCenter(x, y); const r = Math.hypot(dx, dy); return r <= OUTER_RADIUS - 0.5 && r >= INNER_RADIUS - 0.5; } export function hasPlanetAt(x, y, seedU32) { const h = hash2u32(x, y, seedU32); return h / 4294967296 < PLANET_CHANCE; } export function computeCell(seedStr, x, y) { const seedU32 = fnv1a32(seedStr); const exploitable = isExploitable(x, y); if (!exploitable) { return { x, y, exploitable: false, hasPlanet: false, planet: null, formatted: null }; } const hp = hasPlanetAt(x, y, seedU32); if (!hp) { return { x, y, exploitable: true, hasPlanet: false, planet: null, formatted: null }; } const h = hash2u32(x, y, seedU32 ^ 0xa5a5a5a5); const rng = mulberry32(h); const planet = generatePlanet(rng); return { x, y, exploitable: true, hasPlanet: true, planet, formatted: formatPlanet(planet), }; } export function rowToCellPayload(row) { return { x: row.x, y: row.y, exploitable: row.exploitable, hasPlanet: row.has_planet, planet: row.planet_json ?? null, discoveredBy: row.discovered_by, }; }