mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 17:51:24 +01:00
fix(burgs): don't put burgs on border cells
This commit is contained in:
parent
7a3a87e935
commit
538ad3512e
4 changed files with 14 additions and 12 deletions
|
|
@ -8,8 +8,8 @@ import {gauss} from "utils/probabilityUtils";
|
||||||
const {Names} = window;
|
const {Names} = window;
|
||||||
|
|
||||||
export function createTowns(
|
export function createTowns(
|
||||||
capitalCells: Map<number, boolean>,
|
|
||||||
cultures: TCultures,
|
cultures: TCultures,
|
||||||
|
scoredCellIds: UintArray,
|
||||||
cells: Pick<IPack["cells"], "p" | "i" | "f" | "s" | "culture">
|
cells: Pick<IPack["cells"], "p" | "i" | "f" | "s" | "culture">
|
||||||
) {
|
) {
|
||||||
TIME && console.time("createTowns");
|
TIME && console.time("createTowns");
|
||||||
|
|
@ -17,9 +17,6 @@ export function createTowns(
|
||||||
// randomize cells score a bit for more natural towns placement
|
// randomize cells score a bit for more natural towns placement
|
||||||
const randomizeScore = (suitability: number) => suitability * gauss(1, 3, 0, 20, 3);
|
const randomizeScore = (suitability: number) => suitability * gauss(1, 3, 0, 20, 3);
|
||||||
const scores = new Int16Array(cells.s.map(randomizeScore));
|
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
|
scoredCellIds.sort((a, b) => scores[b] - scores[a]); // sort by randomized suitability score
|
||||||
|
|
||||||
const townsNumber = getTownsNumber();
|
const townsNumber = getTownsNumber();
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ export function generateBurgsAndStates(
|
||||||
vertices: IGraphVertices,
|
vertices: IGraphVertices,
|
||||||
cells: Pick<
|
cells: Pick<
|
||||||
IPack["cells"],
|
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} {
|
): {burgIds: Uint16Array; stateIds: Uint16Array; burgs: TBurgs; states: TStates} {
|
||||||
const cellsNumber = cells.i.length;
|
const cellsNumber = cells.i.length;
|
||||||
|
|
@ -34,9 +34,13 @@ export function generateBurgsAndStates(
|
||||||
|
|
||||||
const capitals = createCapitals(statesNumber, scoredCellIds, cultures, pick(cells, "p", "f", "culture"));
|
const capitals = createCapitals(statesNumber, scoredCellIds, cultures, pick(cells, "p", "f", "culture"));
|
||||||
const capitalCells = new Map(capitals.map(({cell}) => [cell, true]));
|
const capitalCells = new Map(capitals.map(({cell}) => [cell, true]));
|
||||||
|
|
||||||
const states = createStates(capitals, cultures);
|
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(
|
const stateIds = expandStates(
|
||||||
capitalCells,
|
capitalCells,
|
||||||
|
|
@ -63,11 +67,12 @@ export function generateBurgsAndStates(
|
||||||
return {burgIds, stateIds, burgs, states};
|
return {burgIds, stateIds, burgs, states};
|
||||||
|
|
||||||
function getScoredCellIds() {
|
function getScoredCellIds() {
|
||||||
// cell score for capitals placement
|
|
||||||
const score = new Int16Array(cells.s.map(s => s * Math.random()));
|
const score = new Int16Array(cells.s.map(s => s * Math.random()));
|
||||||
|
|
||||||
// filtered and sorted array of indexes
|
// filtered and sorted array of indexes: only populated cells not on map edge
|
||||||
const sorted = cells.i.filter(i => score[i] > 0 && cells.culture[i]).sort((a, b) => score[b] - score[a]);
|
const sorted = cells.i
|
||||||
|
.filter(i => !cells.b[i] && score[i] > 0 && cells.culture[i])
|
||||||
|
.sort((a, b) => score[b] - score[a]);
|
||||||
|
|
||||||
return sorted;
|
return sorted;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ export function createPack(grid: IGrid): IPack {
|
||||||
rawRivers,
|
rawRivers,
|
||||||
vertices,
|
vertices,
|
||||||
{
|
{
|
||||||
...pick(cells, "v", "c", "p", "i", "g"),
|
...pick(cells, "v", "c", "p", "b", "i", "g"),
|
||||||
h: heights,
|
h: heights,
|
||||||
f: featureIds,
|
f: featureIds,
|
||||||
t: distanceField,
|
t: distanceField,
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ export function drawText(text: string | number, [x, y]: TPoint, {size = 6, color
|
||||||
}
|
}
|
||||||
|
|
||||||
export function drawPolygons(
|
export function drawPolygons(
|
||||||
values: TypedArray,
|
values: TypedArray | number[],
|
||||||
cellVertices: number[][],
|
cellVertices: number[][],
|
||||||
vertexPoints: TPoints,
|
vertexPoints: TPoints,
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue