mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 17:51:24 +01:00
refactor: lake names
This commit is contained in:
parent
2035b12115
commit
1ca3dd64d2
6 changed files with 84 additions and 31 deletions
|
|
@ -63,10 +63,7 @@ window.Names = (function () {
|
||||||
|
|
||||||
// generate name using Markov's chain
|
// generate name using Markov's chain
|
||||||
const getBase = function (base, min, max, dupl) {
|
const getBase = function (base, min, max, dupl) {
|
||||||
if (base === undefined) {
|
if (base === undefined) return ERROR && console.error("Please define a base");
|
||||||
ERROR && console.error("Please define a base");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!chains[base]) updateChain(base);
|
if (!chains[base]) updateChain(base);
|
||||||
|
|
||||||
const data = chains[base];
|
const data = chains[base];
|
||||||
|
|
|
||||||
17
src/scripts/generation/pack/lakes/generateLakeNames.ts
Normal file
17
src/scripts/generation/pack/lakes/generateLakeNames.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
const {Names} = window;
|
||||||
|
|
||||||
|
export function generateLakeNames(features: TPackFeatures, culture: UintArray, cultures: TCultures) {
|
||||||
|
const updatedFeatures = features.map(feature => {
|
||||||
|
if (feature === 0) return 0;
|
||||||
|
if (feature.type !== "lake") return feature;
|
||||||
|
|
||||||
|
const landCell = feature.shoreline[0];
|
||||||
|
const cultureId = culture[landCell];
|
||||||
|
const namebase = cultures[cultureId].base;
|
||||||
|
|
||||||
|
const name: string = Names.getBase(namebase);
|
||||||
|
return {...feature, name};
|
||||||
|
});
|
||||||
|
|
||||||
|
return updatedFeatures as TPackFeatures;
|
||||||
|
}
|
||||||
|
|
@ -3,8 +3,6 @@ import * as d3 from "d3";
|
||||||
import {rn} from "utils/numberUtils";
|
import {rn} from "utils/numberUtils";
|
||||||
import {getRealHeight} from "utils/unitUtils";
|
import {getRealHeight} from "utils/unitUtils";
|
||||||
|
|
||||||
const {Names} = window;
|
|
||||||
|
|
||||||
export interface ILakeClimateData extends IPackFeatureLake {
|
export interface ILakeClimateData extends IPackFeatureLake {
|
||||||
flux: number;
|
flux: number;
|
||||||
temp: number;
|
temp: number;
|
||||||
|
|
@ -100,17 +98,3 @@ function defineLakeGroup({
|
||||||
|
|
||||||
return "freshwater";
|
return "freshwater";
|
||||||
}
|
}
|
||||||
|
|
||||||
export function generateLakeNames(features: TPackFeatures, culture: UintArray) {
|
|
||||||
const updatedFeatures = features.map(feature => {
|
|
||||||
if (!feature) return 0;
|
|
||||||
if (feature.type !== "lake") return feature;
|
|
||||||
|
|
||||||
const landCell = feature.shoreline[0];
|
|
||||||
const cultureId = culture[landCell];
|
|
||||||
const name = Names.getCulture(cultureId) as string;
|
|
||||||
return {...feature, name};
|
|
||||||
});
|
|
||||||
|
|
||||||
return updatedFeatures as TPackFeatures;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,12 @@ import {pick} from "utils/functionUtils";
|
||||||
import {generateBurgsAndStates} from "./burgsAndStates/generateBurgsAndStates";
|
import {generateBurgsAndStates} from "./burgsAndStates/generateBurgsAndStates";
|
||||||
import {expandCultures} from "./cultures/expandCultures";
|
import {expandCultures} from "./cultures/expandCultures";
|
||||||
import {generateCultures} from "./cultures/generateCultures";
|
import {generateCultures} from "./cultures/generateCultures";
|
||||||
|
import {generateLakeNames} from "./lakes/generateLakeNames";
|
||||||
import {generateProvinces} from "./provinces/generateProvinces";
|
import {generateProvinces} from "./provinces/generateProvinces";
|
||||||
import {generateReligions} from "./religions/generateReligions";
|
import {generateReligions} from "./religions/generateReligions";
|
||||||
import {repackGrid} from "./repackGrid";
|
import {repackGrid} from "./repackGrid";
|
||||||
import {generateRivers} from "./rivers/generateRivers";
|
import {generateRivers} from "./rivers/generateRivers";
|
||||||
|
import {specifyRivers} from "./rivers/specifyRivers";
|
||||||
import {generateRoutes} from "./routes/generateRoutes";
|
import {generateRoutes} from "./routes/generateRoutes";
|
||||||
|
|
||||||
const {Biomes} = window;
|
const {Biomes} = window;
|
||||||
|
|
@ -16,11 +18,13 @@ export function createPack(grid: IGrid): IPack {
|
||||||
const {temp, prec} = grid.cells;
|
const {temp, prec} = grid.cells;
|
||||||
const {vertices, cells} = repackGrid(grid);
|
const {vertices, cells} = repackGrid(grid);
|
||||||
|
|
||||||
const {features, featureIds, distanceField, haven, harbor} = markupPackFeatures(
|
const {
|
||||||
grid,
|
features: rawFeatures,
|
||||||
vertices,
|
featureIds,
|
||||||
pick(cells, "v", "c", "b", "p", "h")
|
distanceField,
|
||||||
);
|
haven,
|
||||||
|
harbor
|
||||||
|
} = markupPackFeatures(grid, vertices, pick(cells, "v", "c", "b", "p", "h"));
|
||||||
|
|
||||||
const {
|
const {
|
||||||
heights,
|
heights,
|
||||||
|
|
@ -31,7 +35,7 @@ export function createPack(grid: IGrid): IPack {
|
||||||
mergedFeatures
|
mergedFeatures
|
||||||
} = generateRivers(
|
} = generateRivers(
|
||||||
{...pick(cells, "i", "c", "b", "g", "h", "p"), f: featureIds, t: distanceField, haven},
|
{...pick(cells, "i", "c", "b", "g", "h", "p"), f: featureIds, t: distanceField, haven},
|
||||||
features,
|
rawFeatures,
|
||||||
prec,
|
prec,
|
||||||
temp
|
temp
|
||||||
);
|
);
|
||||||
|
|
@ -155,8 +159,8 @@ export function createPack(grid: IGrid): IPack {
|
||||||
burg: burgIds
|
burg: burgIds
|
||||||
});
|
});
|
||||||
|
|
||||||
// Rivers.specify();
|
const rivers = specifyRivers(rawRivers, cultureIds, cultures);
|
||||||
// const updatedFeatures = generateLakeNames();
|
const features = generateLakeNames(mergedFeatures, cultureIds, cultures);
|
||||||
|
|
||||||
// Military.generate();
|
// Military.generate();
|
||||||
// Markers.generate();
|
// Markers.generate();
|
||||||
|
|
@ -191,8 +195,8 @@ export function createPack(grid: IGrid): IPack {
|
||||||
religion: religionIds,
|
religion: religionIds,
|
||||||
province: provinceIds
|
province: provinceIds
|
||||||
},
|
},
|
||||||
features: mergedFeatures,
|
features,
|
||||||
rivers: rawRivers, // "name" | "basin" | "type"
|
rivers,
|
||||||
cultures,
|
cultures,
|
||||||
states,
|
states,
|
||||||
burgs,
|
burgs,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import {TIME} from "config/logging";
|
import {TIME} from "config/logging";
|
||||||
import {drawPoint} from "utils/debugUtils";
|
|
||||||
import {pick} from "utils/functionUtils";
|
import {pick} from "utils/functionUtils";
|
||||||
import {generateFolkReligions} from "./generateFolkReligions";
|
import {generateFolkReligions} from "./generateFolkReligions";
|
||||||
import {generateOrganizedReligions} from "./generateOrganizedReligions";
|
import {generateOrganizedReligions} from "./generateOrganizedReligions";
|
||||||
|
|
|
||||||
52
src/scripts/generation/pack/rivers/specifyRivers.ts
Normal file
52
src/scripts/generation/pack/rivers/specifyRivers.ts
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
import {each, rw} from "utils/probabilityUtils";
|
||||||
|
|
||||||
|
const {Names} = window;
|
||||||
|
|
||||||
|
// weighted arrays of river type names
|
||||||
|
const riverTypes = {
|
||||||
|
main: {
|
||||||
|
big: {River: 1},
|
||||||
|
small: {Creek: 9, River: 3, Brook: 3, Stream: 1}
|
||||||
|
},
|
||||||
|
fork: {
|
||||||
|
big: {Fork: 1},
|
||||||
|
small: {Branch: 1}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export function specifyRivers(
|
||||||
|
rawRivers: Omit<IRiver, "name" | "basin" | "type">[],
|
||||||
|
cultureIds: Uint16Array,
|
||||||
|
cultures: TCultures
|
||||||
|
): TRivers {
|
||||||
|
const thresholdIndex = Math.ceil(rawRivers.length * 0.15);
|
||||||
|
const smallLength = rawRivers.map(r => r.length).sort((a, b) => a - b)[thresholdIndex];
|
||||||
|
|
||||||
|
const rivers: TRivers = rawRivers.map(river => {
|
||||||
|
const basin = getBasin(rawRivers, river.i);
|
||||||
|
const name = getName(river.mouth, cultureIds, cultures);
|
||||||
|
const type = getType(smallLength, river.i, river.length, river.parent);
|
||||||
|
|
||||||
|
return {...river, basin, name, type};
|
||||||
|
});
|
||||||
|
|
||||||
|
return rivers;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBasin(rivers: {i: number; parent: number}[], riverId: number): number {
|
||||||
|
const parent = rivers.find(river => river.i === riverId)?.parent;
|
||||||
|
if (!parent || riverId === parent) return riverId;
|
||||||
|
return getBasin(rivers, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getName = function (cellId: number, cultureIds: Uint16Array, cultures: TCultures) {
|
||||||
|
const culture = cultures[cultureIds[cellId]];
|
||||||
|
const namebase = culture.base;
|
||||||
|
return Names.getBase(namebase);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getType = function (smallLength: number, riverId: number, length: number, parent: number) {
|
||||||
|
const isSmall = length < smallLength;
|
||||||
|
const isFork = parent && parent !== riverId && each(3)(riverId);
|
||||||
|
return rw(riverTypes[isFork ? "fork" : "main"][isSmall ? "small" : "big"] as {[key: string]: number});
|
||||||
|
};
|
||||||
Loading…
Add table
Add a link
Reference in a new issue