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