mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 17:51:24 +01:00
refactor(generation): rankCells
This commit is contained in:
parent
21234dc414
commit
1a57a8ac08
4 changed files with 35 additions and 20 deletions
|
|
@ -1,14 +1,11 @@
|
|||
import * as d3 from "d3";
|
||||
|
||||
import {markupPackFeatures} from "scripts/generation/markup";
|
||||
// @ts-expect-error js module
|
||||
import {drawScaleBar} from "modules/measurers";
|
||||
// @ts-expect-error js module
|
||||
import {addZones} from "modules/zones";
|
||||
import {UINT16_MAX} from "config/constants";
|
||||
import {DISTANCE_FIELD, MIN_LAND_HEIGHT} from "config/generation";
|
||||
import {TIME} from "config/logging";
|
||||
import {UINT16_MAX} from "config/constants";
|
||||
import {calculateVoronoi} from "scripts/generation/graph";
|
||||
import {markupPackFeatures} from "scripts/generation/markup";
|
||||
import {rankCells} from "scripts/generation/pack/rankCells";
|
||||
import {createTypedArray} from "utils/arrayUtils";
|
||||
import {pick} from "utils/functionUtils";
|
||||
import {rn} from "utils/numberUtils";
|
||||
|
|
@ -51,8 +48,18 @@ export function createPack(grid: IGrid): IPack {
|
|||
gridReference: cells.g
|
||||
});
|
||||
|
||||
// const rankCellsData = pick(newPack.cells, "i", "f", "fl", "conf", "r", "h", "area", "biome", "haven", "harbor");
|
||||
// rankCells(newPack.features!, rankCellsData);
|
||||
const {suitability, population} = rankCells(mergedFeatures, {
|
||||
t: distanceField,
|
||||
f: featureIds,
|
||||
fl: riverIds,
|
||||
conf,
|
||||
r: riverIds,
|
||||
h: heights,
|
||||
area: cells.area,
|
||||
biome,
|
||||
haven,
|
||||
harbor
|
||||
});
|
||||
|
||||
// Cultures.generate();
|
||||
// Cultures.expand();
|
||||
|
|
@ -90,10 +97,13 @@ export function createPack(grid: IGrid): IPack {
|
|||
fl: flux,
|
||||
r: riverIds,
|
||||
conf,
|
||||
biome
|
||||
biome,
|
||||
s: suitability,
|
||||
pop: population
|
||||
// state, culture, religion, province, burg
|
||||
},
|
||||
features: mergedFeatures,
|
||||
rivers: rawRivers
|
||||
rivers: rawRivers // "name" | "basin" | "type"
|
||||
};
|
||||
|
||||
return pack;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import * as d3 from "d3";
|
||||
|
||||
import {DISTANCE_FIELD, MIN_LAND_HEIGHT} from "config/generation";
|
||||
import {TIME} from "config/logging";
|
||||
import {normalize} from "utils/numberUtils";
|
||||
import {isWater, isCoastal} from "utils/graphUtils";
|
||||
|
||||
const FLUX_MAX_BONUS = 250;
|
||||
const SUITABILITY_FACTOR = 5;
|
||||
|
|
@ -10,18 +10,22 @@ const SUITABILITY_FACTOR = 5;
|
|||
// assess cells suitability for population and rank cells for culture centers and burgs placement
|
||||
export function rankCells(
|
||||
features: TPackFeatures,
|
||||
cells: Pick<IPack["cells"], "i" | "f" | "fl" | "conf" | "r" | "h" | "area" | "biome" | "haven" | "harbor">
|
||||
cells: Pick<IPack["cells"], "t" | "f" | "fl" | "conf" | "r" | "h" | "area" | "biome" | "haven" | "harbor">
|
||||
) {
|
||||
TIME && console.time("rankCells");
|
||||
|
||||
const suitability = new Int16Array(cells.i.length); // cell suitability array
|
||||
const population = new Float32Array(cells.i.length); // cell population array
|
||||
const cellsNumber = cells.h.length;
|
||||
const suitability = new Int16Array(cellsNumber); // cell suitability array
|
||||
const population = new Float32Array(cellsNumber); // cell population array
|
||||
|
||||
const meanFlux = d3.median(cells.fl.filter(f => f)) || 0;
|
||||
const maxFlux = (d3.max(cells.fl) || 0) + (d3.max(cells.conf) || 0); // to normalize flux
|
||||
const meanArea = d3.mean(cells.area) || 0; // to adjust population by cell area
|
||||
|
||||
for (const cellId of cells.i) {
|
||||
const isWater = (cellId: number) => cells.h[cellId] < MIN_LAND_HEIGHT;
|
||||
const isCoastal = (i: number) => cells.t[i] === DISTANCE_FIELD.LAND_COAST;
|
||||
|
||||
for (let cellId = 0; cellId < cellsNumber; cellId++) {
|
||||
if (isWater(cellId)) continue; // no population in water
|
||||
|
||||
const habitabilityBonus = getHabitabilityBonus(cellId); // [0, 100]
|
||||
|
|
@ -40,6 +44,10 @@ export function rankCells(
|
|||
population[cellId] = total > 0 ? total * (cells.area[cellId] / meanArea) : 0;
|
||||
}
|
||||
|
||||
TIME && console.timeEnd("rankCells");
|
||||
|
||||
return {suitability, population};
|
||||
|
||||
function getHabitabilityBonus(cellId: number) {
|
||||
return biomesData.habitability[cells.biome[cellId]];
|
||||
}
|
||||
|
|
@ -79,8 +87,4 @@ export function rankCells(
|
|||
function getEstuaryBonus(cellId: number) {
|
||||
return cells.r[cellId] && isCoastal(cellId) ? 15 : 0;
|
||||
}
|
||||
|
||||
TIME && console.timeEnd("rankCells");
|
||||
|
||||
return {s: suitability, pop: population};
|
||||
}
|
||||
|
|
@ -47,7 +47,7 @@ export function generateRivers(
|
|||
|
||||
TIME && console.timeEnd("generateRivers");
|
||||
|
||||
return {heights, flux, riverIds, conf, rivers, mergedFeatures};
|
||||
return {heights: new Uint8Array(heights), flux, riverIds, conf, rivers, mergedFeatures};
|
||||
|
||||
function drainWater() {
|
||||
const MIN_FLUX_TO_FORM_RIVER = 30;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue