Private
Public Access
1
0
Files
star-wars-wild-space/public/src/planetGeneration.js
2026-03-29 11:16:46 +02:00

77 lines
2.7 KiB
JavaScript

import * as stat from "./planetStat.js";
const getRandomInt = (rng, min, max) => Math.floor(rng() * (max - min + 1)) + min;
const pick = (rng, array) => array[Math.floor(rng() * array.length)];
const randomPlanetTypeKey = (rng, planetType) => {
const keys = Object.keys(planetType);
return keys[Math.floor(rng() * keys.length)];
};
const distributePercentages = (rng, items) => {
if (items.length === 0) return {};
if (items.length === 1) return { [items[0]]: 100 };
const cuts = Array.from({ length: items.length - 1 }, () => rng()).sort((a, b) => a - b);
const segs = cuts.map((p, i) => (i === 0 ? p * 100 : (cuts[i] - cuts[i - 1]) * 100));
segs.push((1 - cuts[items.length - 2]) * 100);
return Object.fromEntries(items.map((item, idx) => [item, segs[idx]]));
};
export function buildPlanetTypeDistributions(rng) {
for (const key in stat.planetType) {
const type = stat.planetType[key];
if (Array.isArray(type.elements)) type.distributedElements = distributePercentages(rng, type.elements);
if (Array.isArray(type.resources)) type.distributedResources = distributePercentages(rng, type.resources);
}
}
export function generatePlanet(rng) {
// Distributions are normally created once at startup, but since we run per-cell with per-cell rng,
// we generate per planet for stable, deterministic results from the same seed.
buildPlanetTypeDistributions(rng);
const planetTypeGeneration = randomPlanetTypeKey(rng, stat.planetType);
const planetName = pick(rng, stat.planetNamePrefix) + pick(rng, stat.planetNameSuffix); // don't touch it
const planetPopulationPeople = pick(rng, stat.planetType[planetTypeGeneration].populationType);
const planetPopulationNumber =
(stat.planetType[planetTypeGeneration].population * getRandomInt(rng, 50, 150)) / 99.9;
return {
name: planetName,
type: planetTypeGeneration,
population: {
billions: Number(planetPopulationNumber.toFixed(3)),
majority: planetPopulationPeople,
},
production: stat.planetType[planetTypeGeneration].distributedElements,
naturalResources: stat.planetType[planetTypeGeneration].distributedResources,
};
}
export function formatPlanet(planet) {
const elementsDescription = Object.entries(planet.production)
.map(([k, v]) => ` ${k}: ${v.toFixed(1)}%`)
.join("\n");
const resourcesDescription = Object.entries(planet.naturalResources)
.map(([k, v]) => ` ${k}: ${v.toFixed(3)}%`)
.join("\n");
return `Planète : ${planet.name}
Type : ${planet.type}
Production :
${elementsDescription}
Ressources naturelles :
${resourcesDescription}
Population :
${planet.population.billions.toFixed(3)} milliards
Majoritairement ${planet.population.majority}`;
}