refacto: Keeping entrypoints clean and making files by purpose
This commit is contained in:
55
server/helpers/cell.js
Normal file
55
server/helpers/cell.js
Normal file
@@ -0,0 +1,55 @@
|
||||
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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user