diff --git a/src/modules/zones.js b/src/modules/zones.ts similarity index 99% rename from src/modules/zones.js rename to src/modules/zones.ts index d747d395..c11ed390 100644 --- a/src/modules/zones.js +++ b/src/modules/zones.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import * as d3 from "d3"; import FlatQueue from "flatqueue"; diff --git a/src/scripts/generation/pack/pack.ts b/src/scripts/generation/pack/pack.ts index e400ca98..a4481759 100644 --- a/src/scripts/generation/pack/pack.ts +++ b/src/scripts/generation/pack/pack.ts @@ -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; diff --git a/src/scripts/rankCells.ts b/src/scripts/generation/pack/rankCells.ts similarity index 82% rename from src/scripts/rankCells.ts rename to src/scripts/generation/pack/rankCells.ts index 39875d71..341d304a 100644 --- a/src/scripts/rankCells.ts +++ b/src/scripts/generation/pack/rankCells.ts @@ -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 + cells: Pick ) { 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}; } diff --git a/src/scripts/generation/pack/rivers.ts b/src/scripts/generation/pack/rivers.ts index d72b6e4d..b8b6a5df 100644 --- a/src/scripts/generation/pack/rivers.ts +++ b/src/scripts/generation/pack/rivers.ts @@ -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;