Adding repo after 2 days of vibecoding
This commit is contained in:
76
public/src/planetGeneration.js
Normal file
76
public/src/planetGeneration.js
Normal file
@@ -0,0 +1,76 @@
|
||||
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}`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user