From 538ad3512e77527debe01df8097aa4296a1cc804 Mon Sep 17 00:00:00 2001 From: Azgaar Date: Mon, 29 Aug 2022 00:59:30 +0300 Subject: [PATCH] fix(burgs): don't put burgs on border cells --- .../pack/burgsAndStates/createTowns.ts | 5 +---- .../burgsAndStates/generateBurgsAndStates.ts | 17 +++++++++++------ src/scripts/generation/pack/pack.ts | 2 +- src/utils/debugUtils.ts | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/scripts/generation/pack/burgsAndStates/createTowns.ts b/src/scripts/generation/pack/burgsAndStates/createTowns.ts index a6b6dbf9..fd13a14c 100644 --- a/src/scripts/generation/pack/burgsAndStates/createTowns.ts +++ b/src/scripts/generation/pack/burgsAndStates/createTowns.ts @@ -8,8 +8,8 @@ import {gauss} from "utils/probabilityUtils"; const {Names} = window; export function createTowns( - capitalCells: Map, cultures: TCultures, + scoredCellIds: UintArray, cells: Pick ) { TIME && console.time("createTowns"); @@ -17,9 +17,6 @@ export function createTowns( // randomize cells score a bit for more natural towns placement const randomizeScore = (suitability: number) => suitability * gauss(1, 3, 0, 20, 3); const scores = new Int16Array(cells.s.map(randomizeScore)); - - // take populated cells without capitals - const scoredCellIds = cells.i.filter(i => scores[i] > 0 && cells.culture[i] && !capitalCells.has(i)); scoredCellIds.sort((a, b) => scores[b] - scores[a]); // sort by randomized suitability score const townsNumber = getTownsNumber(); diff --git a/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts b/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts index 061d804e..eeefba07 100644 --- a/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts +++ b/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts @@ -16,7 +16,7 @@ export function generateBurgsAndStates( vertices: IGraphVertices, cells: Pick< IPack["cells"], - "v" | "c" | "p" | "i" | "g" | "h" | "f" | "t" | "haven" | "harbor" | "r" | "fl" | "biome" | "s" | "culture" + "v" | "c" | "p" | "b" | "i" | "g" | "h" | "f" | "t" | "haven" | "harbor" | "r" | "fl" | "biome" | "s" | "culture" > ): {burgIds: Uint16Array; stateIds: Uint16Array; burgs: TBurgs; states: TStates} { const cellsNumber = cells.i.length; @@ -34,9 +34,13 @@ export function generateBurgsAndStates( const capitals = createCapitals(statesNumber, scoredCellIds, cultures, pick(cells, "p", "f", "culture")); const capitalCells = new Map(capitals.map(({cell}) => [cell, true])); - const states = createStates(capitals, cultures); - const towns = createTowns(capitalCells, cultures, pick(cells, "p", "i", "f", "s", "culture")); + + const towns = createTowns( + cultures, + scoredCellIds.filter(i => !capitalCells.has(i)), + pick(cells, "p", "i", "f", "s", "culture") + ); const stateIds = expandStates( capitalCells, @@ -63,11 +67,12 @@ export function generateBurgsAndStates( return {burgIds, stateIds, burgs, states}; function getScoredCellIds() { - // cell score for capitals placement const score = new Int16Array(cells.s.map(s => s * Math.random())); - // filtered and sorted array of indexes - const sorted = cells.i.filter(i => score[i] > 0 && cells.culture[i]).sort((a, b) => score[b] - score[a]); + // filtered and sorted array of indexes: only populated cells not on map edge + const sorted = cells.i + .filter(i => !cells.b[i] && score[i] > 0 && cells.culture[i]) + .sort((a, b) => score[b] - score[a]); return sorted; } diff --git a/src/scripts/generation/pack/pack.ts b/src/scripts/generation/pack/pack.ts index 16005c6f..915f3a63 100644 --- a/src/scripts/generation/pack/pack.ts +++ b/src/scripts/generation/pack/pack.ts @@ -104,7 +104,7 @@ export function createPack(grid: IGrid): IPack { rawRivers, vertices, { - ...pick(cells, "v", "c", "p", "i", "g"), + ...pick(cells, "v", "c", "p", "b", "i", "g"), h: heights, f: featureIds, t: distanceField, diff --git a/src/utils/debugUtils.ts b/src/utils/debugUtils.ts index e17c98c3..f72c614f 100644 --- a/src/utils/debugUtils.ts +++ b/src/utils/debugUtils.ts @@ -58,7 +58,7 @@ export function drawText(text: string | number, [x, y]: TPoint, {size = 6, color } export function drawPolygons( - values: TypedArray, + values: TypedArray | number[], cellVertices: number[][], vertexPoints: TPoints, {