From 2be3c682904ce7d93fd7dbaa1bed7f042a6b1526 Mon Sep 17 00:00:00 2001 From: Azgaar Date: Fri, 2 Sep 2022 01:28:17 +0300 Subject: [PATCH 1/2] refactor - stateForms start --- src/modules/burgs-and-states.js | 2 +- src/scripts/events/onhover.ts | 26 ++++---- src/scripts/generation/generation.ts | 4 +- .../pack/burgsAndStates/collectStatistics.ts | 46 +++++++++++++ .../pack/burgsAndStates/createStateData.ts | 34 ++++++++++ .../pack/burgsAndStates/createStates.ts | 44 ------------- .../pack/burgsAndStates/defineStateForm.ts | 64 +++++++++++++++++++ .../pack/burgsAndStates/defineStateName.ts | 15 +++++ .../pack/burgsAndStates/expandStates.ts | 19 ++---- .../burgsAndStates/generateBurgsAndStates.ts | 32 ++++++++-- .../burgsAndStates/generateStateEmblem.ts | 8 +++ .../pack/burgsAndStates/specifyBurgs.ts | 21 +++--- .../pack/burgsAndStates/specifyStates.ts | 37 +++++++++++ src/scripts/generation/pack/pack.ts | 4 +- src/types/pack/states.d.ts | 10 ++- 15 files changed, 277 insertions(+), 89 deletions(-) create mode 100644 src/scripts/generation/pack/burgsAndStates/collectStatistics.ts create mode 100644 src/scripts/generation/pack/burgsAndStates/createStateData.ts delete mode 100644 src/scripts/generation/pack/burgsAndStates/createStates.ts create mode 100644 src/scripts/generation/pack/burgsAndStates/defineStateForm.ts create mode 100644 src/scripts/generation/pack/burgsAndStates/defineStateName.ts create mode 100644 src/scripts/generation/pack/burgsAndStates/generateStateEmblem.ts create mode 100644 src/scripts/generation/pack/burgsAndStates/specifyStates.ts diff --git a/src/modules/burgs-and-states.js b/src/modules/burgs-and-states.js index be4b359e..be1dba67 100644 --- a/src/modules/burgs-and-states.js +++ b/src/modules/burgs-and-states.js @@ -1053,7 +1053,7 @@ window.BurgsAndStates = (function () { const isTheocracy = (religion && pack.religions[religion].expansion === "state") || (P(0.1) && ["Organized", "Cult"].includes(pack.religions[religion].type)); - const isAnarchy = P(0.01 - tier / 500); + const isAnarchy = P((1 - tier / 5) / 100); // 1% for smallest states, 0.2% for biggest if (isTheocracy) s.form = "Theocracy"; else if (isAnarchy) s.form = "Anarchy"; diff --git a/src/scripts/events/onhover.ts b/src/scripts/events/onhover.ts index ac1ce961..8eb166b0 100644 --- a/src/scripts/events/onhover.ts +++ b/src/scripts/events/onhover.ts @@ -16,6 +16,7 @@ import { } from "utils/unitUtils"; import {showMainTip, tip} from "scripts/tooltips"; import {defineEmblemData} from "./utils"; +import {isState} from "utils/typeUtils"; export const onMouseMove = debounce(handleMouseMove, 100); @@ -75,8 +76,9 @@ const getHoveredElement = (tagName: string, group: string, subgroup: string, isL if (layerIsOn("togglePopulation")) return "populationLayer"; if (layerIsOn("toggleTemp")) return "temperatureLayer"; if (layerIsOn("toggleBiomes") && biome[cellId]) return "biomesLayer"; - if (religion[cellId]) return "religionsLayer"; // layerIsOn("toggleReligions") && - if (layerIsOn("toggleProvinces") || (layerIsOn("toggleStates") && state[cellId])) return "statesLayer"; + if (layerIsOn("toggleReligions") && religion[cellId]) return "religionsLayer"; + // if (layerIsOn("toggleProvinces") || (layerIsOn("toggleStates") && state[cellId])) return "statesLayer"; + if (state[cellId]) return "statesLayer"; if (layerIsOn("toggleCultures") && culture[cellId]) return "culturesLayer"; if (layerIsOn("toggleHeight")) return "heightLayer"; @@ -193,16 +195,18 @@ const onHoverEventsMap: OnHoverEventMap = { }, statesLayer: ({packCellId}) => { - const state = pack.cells.state[packCellId]; - const stateName = pack.states[state].fullName; - const province = pack.cells.province[packCellId]; - const prov = province ? `${pack.provinces[province].fullName}, ` : ""; - tip(prov + stateName); + const stateId = pack.cells.state[packCellId]; + const state = pack.states[stateId]; + const stateName = isState(state) ? state.fullName || state.name : state.name; - highlightDialogLine("statesEditor", state); - highlightDialogLine("diplomacyEditor", state); - highlightDialogLine("militaryEditor", state); - highlightDialogLine("provincesEditor", province); + const provinceId = pack.cells.province[packCellId]; + const provinceName = provinceId ? `${pack.provinces[provinceId].fullName}, ` : ""; + tip(provinceName + stateName); + + highlightDialogLine("statesEditor", stateId); + highlightDialogLine("diplomacyEditor", stateId); + highlightDialogLine("militaryEditor", stateId); + highlightDialogLine("provincesEditor", provinceId); }, culturesLayer: ({packCellId}) => { diff --git a/src/scripts/generation/generation.ts b/src/scripts/generation/generation.ts index 614840b4..9091e41b 100644 --- a/src/scripts/generation/generation.ts +++ b/src/scripts/generation/generation.ts @@ -70,8 +70,8 @@ async function generate(options?: IGenerationOptions) { // renderLayer("biomes"); renderLayer("burgs"); renderLayer("routes"); - // renderLayer("states"); - renderLayer("religions"); + renderLayer("states"); + // renderLayer("religions"); // pack.cells.route.forEach((route, index) => { // if (route === 2) drawPoint(pack.cells.p[index], {color: "black"}); diff --git a/src/scripts/generation/pack/burgsAndStates/collectStatistics.ts b/src/scripts/generation/pack/burgsAndStates/collectStatistics.ts new file mode 100644 index 00000000..30f236c8 --- /dev/null +++ b/src/scripts/generation/pack/burgsAndStates/collectStatistics.ts @@ -0,0 +1,46 @@ +import {MIN_LAND_HEIGHT} from "config/generation"; +import {TIME} from "config/logging"; + +export type TStateStatistics = Record; +const initialData = {cells: 0, area: 0, burgs: 0, rural: 0, urban: 0, neighbors: [] as number[]}; + +// calculate states data like area, population, etc. +export function collectStatistics( + cells: Pick, + burgs: TBurgs +) { + TIME && console.time("collectStatistics"); + + const statesData: TStateStatistics = {}; + const initiate = (stateId: number) => { + statesData[stateId] = structuredClone(initialData); + }; + + // check for neighboring states + const checkNeib = (neibCellId: number, stateId: number) => { + const neibStateId = cells.state[neibCellId]; + if (!neibStateId || neibStateId === stateId) return; + if (!statesData[stateId].neighbors.includes(neibStateId)) statesData[stateId].neighbors.push(neibStateId); + }; + + for (const cellId of cells.i) { + if (cells.h[cellId] < MIN_LAND_HEIGHT) continue; + const stateId = cells.state[cellId]; + if (!statesData[stateId]) initiate(stateId); + + cells.c[cellId].forEach(neibCellId => checkNeib(neibCellId, stateId)); + + statesData[stateId].cells += 1; + statesData[stateId].area += cells.area[cellId]; + statesData[stateId].rural += cells.pop[cellId]; + + const burgId = cells.burg[cellId]; + if (burgId) { + statesData[stateId].burgs += 1; + statesData[stateId].urban += (burgs[burgId] as IBurg)?.population || 0; + } + } + + TIME && console.timeEnd("collectStatistics"); + return statesData; +} diff --git a/src/scripts/generation/pack/burgsAndStates/createStateData.ts b/src/scripts/generation/pack/burgsAndStates/createStateData.ts new file mode 100644 index 00000000..8e155d81 --- /dev/null +++ b/src/scripts/generation/pack/burgsAndStates/createStateData.ts @@ -0,0 +1,34 @@ +import {TIME} from "config/logging"; +import {getInputNumber} from "utils/nodeUtils"; +import {rn} from "utils/numberUtils"; +import type {createCapitals} from "./createCapitals"; +import {defineStateName} from "./defineStateName"; +import {generateStateEmblem} from "./generateStateEmblem"; + +type TCapitals = ReturnType; +export type TStateData = Pick< + IState, + "i" | "name" | "type" | "culture" | "center" | "expansionism" | "capital" | "coa" +>; + +export function createStateData(capitals: TCapitals, cultures: TCultures) { + TIME && console.time("createStates"); + + const powerInput = getInputNumber("powerInput"); + + const statesData: TStateData[] = capitals.map((capital, index) => { + const {cell: cellId, culture: cultureId, name: capitalName} = capital; + const id = index + 1; + const name = defineStateName(cellId, capitalName, cultureId, cultures); + + const {type, shield} = cultures[cultureId] as ICulture; + const expansionism = rn(Math.random() * powerInput + 1, 1); + + const coa = generateStateEmblem(type, shield); + + return {i: id, name, type, center: cellId, expansionism, capital: id, culture: cultureId, coa}; + }); + + TIME && console.timeEnd("createStates"); + return statesData; +} diff --git a/src/scripts/generation/pack/burgsAndStates/createStates.ts b/src/scripts/generation/pack/burgsAndStates/createStates.ts deleted file mode 100644 index 73c5591b..00000000 --- a/src/scripts/generation/pack/burgsAndStates/createStates.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {TIME} from "config/logging"; -import {getColors} from "utils/colorUtils"; -import {getInputNumber} from "utils/nodeUtils"; -import {rn} from "utils/numberUtils"; -import {each} from "utils/probabilityUtils"; -import {NEUTRALS} from "./config"; -import type {createCapitals} from "./createCapitals"; - -const {Names, COA} = window; - -type TCapitals = ReturnType; - -export function createStates(capitals: TCapitals, cultures: TCultures): TStates { - TIME && console.time("createStates"); - - const colors = getColors(capitals.length); - const powerInput = getInputNumber("powerInput"); - - const states = capitals.map((capital, index) => { - const {cell: cellId, culture: cultureId, name: capitalName} = capital; - const id = index + 1; - const name = getStateName(cellId, capitalName, cultureId, cultures); - const color = colors[index]; - - const {type, shield: cultureShield} = cultures[cultureId] as ICulture; - const expansionism = rn(Math.random() * powerInput + 1, 1); - - const shield = COA.getShield(cultureShield, null); - const coa: ICoa = {...COA.generate(null, null, null, type), shield}; - - return {i: id, name, type, center: cellId, color, expansionism, capital: id, culture: cultureId, coa} as IState; - }); - - TIME && console.timeEnd("createStates"); - return [NEUTRALS, ...states]; -} - -function getStateName(cellId: number, capitalName: string, cultureId: number, cultures: TCultures): string { - const useCapitalName = capitalName.length < 9 && each(5)(cellId); - const nameBase = cultures[cultureId].base; - const basename: string = useCapitalName ? capitalName : Names.getBaseShort(nameBase); - - return Names.getState(basename, basename); -} diff --git a/src/scripts/generation/pack/burgsAndStates/defineStateForm.ts b/src/scripts/generation/pack/burgsAndStates/defineStateForm.ts new file mode 100644 index 00000000..cb7092fe --- /dev/null +++ b/src/scripts/generation/pack/burgsAndStates/defineStateForm.ts @@ -0,0 +1,64 @@ +import * as d3 from "d3"; + +import type {TStateStatistics} from "./collectStatistics"; + +const generic = {Monarchy: 25, Republic: 2, Union: 1}; +const naval = {Monarchy: 25, Republic: 8, Union: 3}; + +const republic = { + Republic: 75, + Federation: 4, + "Trade Company": 4, + "Most Serene Republic": 2, + Oligarchy: 2, + Tetrarchy: 1, + Triumvirate: 1, + Diarchy: 1, + Junta: 1 +}; + +const union = { + Union: 3, + League: 4, + Confederation: 1, + "United Kingdom": 1, + "United Republic": 1, + "United Provinces": 2, + Commonwealth: 1, + Heptarchy: 1 +}; + +const theocracy = {Theocracy: 20, Brotherhood: 1, Thearchy: 2, See: 1, "Holy State": 1}; + +const anarchy = {"Free Territory": 2, Council: 3, Commune: 1, Community: 1}; + +const monarchy = ["Duchy", "Grand Duchy", "Principality", "Kingdom", "Empire"]; // per area tier + +enum AreaTiers { + DUCHY = 0, + GRAND_DUCHY = 1, + PRINCIPALITY = 2, + KINGDOM = 3, + EMPIRE = 4 +} + +// create 5 area tiers, where 4 are the biggest, 0 the smallest +export function createAreaTiers(statistics: TStateStatistics) { + const stateAreas = Object.entries(statistics) + .filter(([id]) => Number(id)) + .map(([, {area}]) => area); + const medianArea = d3.median(stateAreas)!; + + const topTierIndex = Math.max(Math.ceil(stateAreas.length ** 0.4) - 2, 0); + const minTopTierArea = stateAreas.sort((a, b) => b - a)[topTierIndex]; + + return (area: number) => { + const tier = Math.min(Math.floor((area / medianArea) * 2.6), 4) as AreaTiers; + if (tier === AreaTiers.EMPIRE && area < minTopTierArea) return AreaTiers.KINGDOM; + return tier; + }; +} + +export function defineStateForm(type: TCultureType, areaTier: AreaTiers) { + return {form: "testForm", formName: "testFormName"}; +} diff --git a/src/scripts/generation/pack/burgsAndStates/defineStateName.ts b/src/scripts/generation/pack/burgsAndStates/defineStateName.ts new file mode 100644 index 00000000..7c40451c --- /dev/null +++ b/src/scripts/generation/pack/burgsAndStates/defineStateName.ts @@ -0,0 +1,15 @@ +import {each} from "utils/probabilityUtils"; + +const {Names} = window; + +export function defineStateName(cellId: number, capitalName: string, cultureId: number, cultures: TCultures): string { + const useCapitalName = capitalName.length < 9 && each(5)(cellId); + const nameBase = cultures[cultureId].base; + const basename: string = useCapitalName ? capitalName : Names.getBaseShort(nameBase); + + return Names.getState(basename, basename); +} + +export function defineFullStateName(name: string, form: string) { + return `${name} ${form}`; +} diff --git a/src/scripts/generation/pack/burgsAndStates/expandStates.ts b/src/scripts/generation/pack/burgsAndStates/expandStates.ts index 1de4dcf8..64bdc3aa 100644 --- a/src/scripts/generation/pack/burgsAndStates/expandStates.ts +++ b/src/scripts/generation/pack/burgsAndStates/expandStates.ts @@ -4,12 +4,12 @@ import {TIME} from "config/logging"; import {getInputNumber} from "utils/nodeUtils"; import {minmax} from "utils/numberUtils"; import {ELEVATION, FOREST_BIOMES, MIN_LAND_HEIGHT, DISTANCE_FIELD} from "config/generation"; -import {isNeutals} from "utils/typeUtils"; +import type {TStateData} from "./createStateData"; // growth algorithm to assign cells to states export function expandStates( capitalCells: Map, - states: TStates, + statesData: TStateData[], features: TPackFeatures, cells: Pick ) { @@ -24,10 +24,7 @@ export function expandStates( const neutralInput = getInputNumber("neutralInput"); const maxExpansionCost = (cellsNumber / 2) * neutralInput * statesNeutral; - for (const state of states) { - if (state.i === 0) continue; - - const {i: stateId, center: cellId} = state as IState; + for (const {i: stateId, center: cellId} of statesData) { stateIds[cellId] = stateId; cost[cellId] = 1; queue.push({cellId, stateId}, 0); @@ -66,11 +63,13 @@ export function expandStates( const GENERIC_LANDLOCKED_FEE = 0; const NAVAL_LANDLOCKED_FEE = 30; + const statesMap = new Map(statesData.map(stateData => [stateData.i, stateData])); + while (queue.length) { const priority = queue.peekValue()!; const {cellId, stateId} = queue.pop()!; - const {type, culture, center, expansionism} = getState(stateId); + const {type, culture, center, expansionism} = statesMap.get(stateId)!; const capitalBiome = cells.biome[center]; cells.c[cellId].forEach(neibCellId => { @@ -100,12 +99,6 @@ export function expandStates( return normalizeStates(stateIds, capitalCells, cells.c, cells.h); - function getState(stateId: number) { - const state = states[stateId]; - if (isNeutals(state)) throw new Error("Neutrals cannot expand"); - return state; - } - function getCultureCost(cellId: number, stateCulture: number) { return cells.culture[cellId] === stateCulture ? SAME_CULTURE_BONUS : DIFFERENT_CULTURES_FEE; } diff --git a/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts b/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts index eeefba07..b3750328 100644 --- a/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts +++ b/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts @@ -1,12 +1,14 @@ import {WARN} from "config/logging"; import {pick} from "utils/functionUtils"; import {getInputNumber} from "utils/nodeUtils"; +import {collectStatistics} from "./collectStatistics"; import {NEUTRALS, NO_BURG} from "./config"; import {createCapitals} from "./createCapitals"; -import {createStates} from "./createStates"; +import {createStateData} from "./createStateData"; import {createTowns} from "./createTowns"; import {expandStates} from "./expandStates"; import {specifyBurgs} from "./specifyBurgs"; +import {specifyStates} from "./specifyStates"; export function generateBurgsAndStates( cultures: TCultures, @@ -16,7 +18,24 @@ export function generateBurgsAndStates( vertices: IGraphVertices, cells: Pick< IPack["cells"], - "v" | "c" | "p" | "b" | "i" | "g" | "h" | "f" | "t" | "haven" | "harbor" | "r" | "fl" | "biome" | "s" | "culture" + | "v" + | "c" + | "p" + | "b" + | "i" + | "g" + | "area" + | "h" + | "f" + | "t" + | "haven" + | "harbor" + | "r" + | "fl" + | "biome" + | "s" + | "pop" + | "culture" > ): {burgIds: Uint16Array; stateIds: Uint16Array; burgs: TBurgs; states: TStates} { const cellsNumber = cells.i.length; @@ -34,7 +53,7 @@ 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 statesData = createStateData(capitals, cultures); const towns = createTowns( cultures, @@ -44,7 +63,7 @@ export function generateBurgsAndStates( const stateIds = expandStates( capitalCells, - states, + statesData, features, pick(cells, "c", "h", "f", "t", "r", "fl", "s", "biome", "culture") ); @@ -57,13 +76,16 @@ export function generateBurgsAndStates( temp, vertices, cultures, - states, + statesData, rivers, pick(cells, "v", "p", "g", "h", "f", "haven", "harbor", "s", "biome", "fl", "r") ); const burgIds = assignBurgIds(burgs); + const statistics = collectStatistics({...cells, state: stateIds, burg: burgIds}, burgs); + const states = specifyStates(statesData, statistics, stateIds, burgIds); + return {burgIds, stateIds, burgs, states}; function getScoredCellIds() { diff --git a/src/scripts/generation/pack/burgsAndStates/generateStateEmblem.ts b/src/scripts/generation/pack/burgsAndStates/generateStateEmblem.ts new file mode 100644 index 00000000..1785a61f --- /dev/null +++ b/src/scripts/generation/pack/burgsAndStates/generateStateEmblem.ts @@ -0,0 +1,8 @@ +const {COA} = window; + +export function generateStateEmblem(type: string, cultureShield: string) { + const shield = COA.getShield(cultureShield, null); + const coa: ICoa = {...COA.generate(null, null, null, type), shield}; + + return coa; +} diff --git a/src/scripts/generation/pack/burgsAndStates/specifyBurgs.ts b/src/scripts/generation/pack/burgsAndStates/specifyBurgs.ts index ba17bc79..ce7b0b44 100644 --- a/src/scripts/generation/pack/burgsAndStates/specifyBurgs.ts +++ b/src/scripts/generation/pack/burgsAndStates/specifyBurgs.ts @@ -6,14 +6,13 @@ import {gauss, P} from "utils/probabilityUtils"; import {NO_BURG} from "./config"; import type {createCapitals} from "./createCapitals"; -import type {createStates} from "./createStates"; +import type {TStateData} from "./createStateData"; import type {createTowns} from "./createTowns"; const {COA} = window; type TCapitals = ReturnType; type TTowns = ReturnType; -type TStatesReturn = ReturnType; export function specifyBurgs( capitals: TCapitals, @@ -23,12 +22,14 @@ export function specifyBurgs( temp: Int8Array, vertices: IGraphVertices, cultures: TCultures, - states: TStatesReturn, + statesData: TStateData[], rivers: Omit[], cells: Pick ): TBurgs { TIME && console.time("specifyBurgs"); + const stateDataMap = new Map(statesData.map(data => [data.i, data])); + const burgs = [...capitals, ...towns].map((burgData, index) => { const {cell, culture, capital} = burgData; const state = stateIds[cell]; @@ -38,7 +39,8 @@ export function specifyBurgs( const [x, y] = defineLocation(cell, port); const type = defineType(cell, port, population); - const coa: ICoa = defineEmblem(state, culture, port, capital, type, cultures, states); + const stateData = stateDataMap.get(state)!; + const coa: ICoa = defineEmblem(culture, port, capital, type, cultures, stateData); const burg: IBurg = {i: index + 1, ...burgData, state, port, population, x, y, type, coa}; return burg; @@ -119,28 +121,27 @@ export function specifyBurgs( } function defineEmblem( - stateId: number, cultureId: number, port: number, capital: Logical, type: TCultureType, cultures: TCultures, - states: TStatesReturn + stateData: TStateData ) { const coaType = capital && P(0.2) ? "Capital" : type === "Generic" ? "City" : type; const cultureShield = cultures[cultureId].shield; - const stateShield = ((states[stateId] as IState)?.coa as ICoa)?.shield; - if (stateId === 0) { + if (!stateData) { const baseCoa = COA.generate(null, 0, null, coaType); - const shield = COA.getShield(cultureShield, stateShield); + const shield = COA.getShield(cultureShield); return {...baseCoa, shield}; } - const {culture: stateCultureId, coa: stateCOA} = states[stateId] as IState; + const {culture: stateCultureId, coa: stateCOA} = stateData; const kinship = defineKinshipToStateEmblem(); const baseCoa = COA.generate(stateCOA, kinship, null, coaType); + const stateShield = (stateData.coa as ICoa)?.shield; const shield = COA.getShield(cultureShield, stateShield); return {...baseCoa, shield}; diff --git a/src/scripts/generation/pack/burgsAndStates/specifyStates.ts b/src/scripts/generation/pack/burgsAndStates/specifyStates.ts new file mode 100644 index 00000000..f7cb818f --- /dev/null +++ b/src/scripts/generation/pack/burgsAndStates/specifyStates.ts @@ -0,0 +1,37 @@ +import {TIME} from "config/logging"; +import {getColors} from "utils/colorUtils"; +import {NEUTRALS} from "./config"; +import {createAreaTiers, defineStateForm} from "./defineStateForm"; +import {defineFullStateName} from "./defineStateName"; + +import type {TStateStatistics} from "./collectStatistics"; +import type {TStateData} from "./createStateData"; + +export function specifyStates( + statesData: TStateData[], + statistics: TStateStatistics, + stateIds: Uint16Array, + burgIds: Uint16Array +): TStates { + TIME && console.time("specifyState"); + + const colors = getColors(statesData.length); + const getAreaTier = createAreaTiers(statistics); + + const states: IState[] = statesData.map((stateData, index) => { + const {i, type, name} = stateData; + const {area, ...stats} = statistics[i]; + + const areaTier = getAreaTier(area); + const {form, formName} = defineStateForm(type, areaTier); + const fullName = defineFullStateName(name, form); + + const color = colors[index]; + + const state: IState = {...stateData, form, formName, fullName, color, area, ...stats}; + return state; + }); + + TIME && console.timeEnd("specifyState"); + return [NEUTRALS, ...states]; +} diff --git a/src/scripts/generation/pack/pack.ts b/src/scripts/generation/pack/pack.ts index d110e75d..8ff96f6b 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", "b", "i", "g"), + ...pick(cells, "v", "c", "p", "b", "i", "g", "area"), h: heights, f: featureIds, t: distanceField, @@ -114,6 +114,7 @@ export function createPack(grid: IGrid): IPack { fl: flux, biome, s: suitability, + pop: population, culture: cultureIds } ); @@ -148,7 +149,6 @@ export function createPack(grid: IGrid): IPack { } }); - // Religions.generate(); // BurgsAndStates.defineStateForms(); // BurgsAndStates.generateProvinces(); // BurgsAndStates.defineBurgFeatures(); diff --git a/src/types/pack/states.d.ts b/src/types/pack/states.d.ts index 1a104e4b..beeb7dd0 100644 --- a/src/types/pack/states.d.ts +++ b/src/types/pack/states.d.ts @@ -2,14 +2,22 @@ interface IState { i: number; name: string; center: number; + capital: number; color: Hex | CssUrls; type: TCultureType; culture: number; expansionism: number; + form: string; + formName: string; fullName: string; - capital: Logical; coa: ICoa | string; // pole: TPoint ? + area: number; + cells: number; + burgs: number; + rural: number; + urban: number; + neighbors: number[]; removed?: boolean; } From cffb0a8ec3112349fe26e0f770e6d59a9b9dbddb Mon Sep 17 00:00:00 2001 From: Azgaar Date: Sat, 3 Sep 2022 19:52:22 +0300 Subject: [PATCH 2/2] refactor - define stateForms --- src/config/namebases.ts | 30 ++--- src/modules/burgs-and-states.js | 1 - src/modules/names-generator.js | 3 +- src/scripts/events/onhover.ts | 2 +- .../generation/pack/burgsAndStates/config.ts | 106 +++++++++++++++ .../pack/burgsAndStates/createStateData.ts | 13 +- .../pack/burgsAndStates/defineStateForm.ts | 124 ++++++++++++------ .../pack/burgsAndStates/defineStateName.ts | 17 ++- .../burgsAndStates/generateBurgsAndStates.ts | 46 +++---- .../pack/burgsAndStates/specifyStates.ts | 28 ++-- 10 files changed, 262 insertions(+), 108 deletions(-) diff --git a/src/config/namebases.ts b/src/config/namebases.ts index 47de2a08..19be659b 100644 --- a/src/config/namebases.ts +++ b/src/config/namebases.ts @@ -1,13 +1,3 @@ -interface INameBase { - name: string; - i: number; // id - min: number; // recommended min length - max: number; // recommended max length - d: string; // letters allowed to be duplicated - m: number; // multi-word name rate [deprecated] - b: string; // training data, comma-separated list of names -} - export enum NAMEBASE { German = 0, English = 1, @@ -55,8 +45,18 @@ export enum NAMEBASE { const NB = NAMEBASE; +interface INameBaseData { + name: string; + i: number; // id + min: number; // recommended min length + max: number; // recommended max length + d: string; // letters allowed to be duplicated + m: number; // multi-word name rate [deprecated] + b: string; // training data, comma-separated list of names +} + // prettier-ignore -export const defaultNameBases: INameBase[] = [ +export const defaultNameBases: INameBaseData[] = [ // real-world namebases by Azgaar: {name: "German", i: NB.German, min: 5, max: 12, d: "lt", m: 0, b: "Achern,Aichhalden,Aitern,Albbruck,Alpirsbach,Altensteig,Althengstett,Appenweier,Auggen,Wildbad,Badenen,Badenweiler,Baiersbronn,Ballrechten,Bellingen,Berghaupten,Bernau,Biberach,Biederbach,Binzen,Birkendorf,Birkenfeld,Bischweier,Blumberg,Bollen,Bollschweil,Bonndorf,Bosingen,Braunlingen,Breisach,Breisgau,Breitnau,Brigachtal,Buchenbach,Buggingen,Buhl,Buhlertal,Calw,Dachsberg,Dobel,Donaueschingen,Dornhan,Dornstetten,Dottingen,Dunningen,Durbach,Durrheim,Ebhausen,Ebringen,Efringen,Egenhausen,Ehrenkirchen,Ehrsberg,Eimeldingen,Eisenbach,Elzach,Elztal,Emmendingen,Endingen,Engelsbrand,Enz,Enzklosterle,Eschbronn,Ettenheim,Ettlingen,Feldberg,Fischerbach,Fischingen,Fluorn,Forbach,Freiamt,Freiburg,Freudenstadt,Friedenweiler,Friesenheim,Frohnd,Furtwangen,Gaggenau,Geisingen,Gengenbach,Gernsbach,Glatt,Glatten,Glottertal,Gorwihl,Gottenheim,Grafenhausen,Grenzach,Griesbach,Gutach,Gutenbach,Hag,Haiterbach,Hardt,Harmersbach,Hasel,Haslach,Hausach,Hausen,Hausern,Heitersheim,Herbolzheim,Herrenalb,Herrischried,Hinterzarten,Hochenschwand,Hofen,Hofstetten,Hohberg,Horb,Horben,Hornberg,Hufingen,Ibach,Ihringen,Inzlingen,Kandern,Kappel,Kappelrodeck,Karlsbad,Karlsruhe,Kehl,Keltern,Kippenheim,Kirchzarten,Konigsfeld,Krozingen,Kuppenheim,Kussaberg,Lahr,Lauchringen,Lauf,Laufenburg,Lautenbach,Lauterbach,Lenzkirch,Liebenzell,Loffenau,Loffingen,Lorrach,Lossburg,Mahlberg,Malsburg,Malsch,March,Marxzell,Marzell,Maulburg,Monchweiler,Muhlenbach,Mullheim,Munstertal,Murg,Nagold,Neubulach,Neuenburg,Neuhausen,Neuried,Neuweiler,Niedereschach,Nordrach,Oberharmersbach,Oberkirch,Oberndorf,Oberbach,Oberried,Oberwolfach,Offenburg,Ohlsbach,Oppenau,Ortenberg,otigheim,Ottenhofen,Ottersweier,Peterstal,Pfaffenweiler,Pfalzgrafenweiler,Pforzheim,Rastatt,Renchen,Rheinau,Rheinfelden,Rheinmunster,Rickenbach,Rippoldsau,Rohrdorf,Rottweil,Rummingen,Rust,Sackingen,Sasbach,Sasbachwalden,Schallbach,Schallstadt,Schapbach,Schenkenzell,Schiltach,Schliengen,Schluchsee,Schomberg,Schonach,Schonau,Schonenberg,Schonwald,Schopfheim,Schopfloch,Schramberg,Schuttertal,Schwenningen,Schworstadt,Seebach,Seelbach,Seewald,Sexau,Simmersfeld,Simonswald,Sinzheim,Solden,Staufen,Stegen,Steinach,Steinen,Steinmauern,Straubenhardt,Stuhlingen,Sulz,Sulzburg,Teinach,Tiefenbronn,Tiengen,Titisee,Todtmoos,Todtnau,Todtnauberg,Triberg,Tunau,Tuningen,uhlingen,Unterkirnach,Reichenbach,Utzenfeld,Villingen,Villingendorf,Vogtsburg,Vohrenbach,Waldachtal,Waldbronn,Waldkirch,Waldshut,Wehr,Weil,Weilheim,Weisenbach,Wembach,Wieden,Wiesental,Wildberg,Winzeln,Wittlingen,Wittnau,Wolfach,Wutach,Wutoschingen,Wyhlen,Zavelstein"}, {name: "English", i: NB.English, min: 6, max: 11, d: "", m: .1, b: "Abingdon,Albrighton,Alcester,Almondbury,Altrincham,Amersham,Andover,Appleby,Ashboume,Atherstone,Aveton,Axbridge,Aylesbury,Baldock,Bamburgh,Barton,Basingstoke,Berden,Bere,Berkeley,Berwick,Betley,Bideford,Bingley,Birmingham,Blandford,Blechingley,Bodmin,Bolton,Bootham,Boroughbridge,Boscastle,Bossinney,Bramber,Brampton,Brasted,Bretford,Bridgetown,Bridlington,Bromyard,Bruton,Buckingham,Bungay,Burton,Calne,Cambridge,Canterbury,Carlisle,Castleton,Caus,Charmouth,Chawleigh,Chichester,Chillington,Chinnor,Chipping,Chisbury,Cleobury,Clifford,Clifton,Clitheroe,Cockermouth,Coleshill,Combe,Congleton,Crafthole,Crediton,Cuddenbeck,Dalton,Darlington,Dodbrooke,Drax,Dudley,Dunstable,Dunster,Dunwich,Durham,Dymock,Exeter,Exning,Faringdon,Felton,Fenny,Finedon,Flookburgh,Fowey,Frampton,Gateshead,Gatton,Godmanchester,Grampound,Grantham,Guildford,Halesowen,Halton,Harbottle,Harlow,Hatfield,Hatherleigh,Haydon,Helston,Henley,Hertford,Heytesbury,Hinckley,Hitchin,Holme,Hornby,Horsham,Kendal,Kenilworth,Kilkhampton,Kineton,Kington,Kinver,Kirby,Knaresborough,Knutsford,Launceston,Leighton,Lewes,Linton,Louth,Luton,Lyme,Lympstone,Macclesfield,Madeley,Malborough,Maldon,Manchester,Manningtree,Marazion,Marlborough,Marshfield,Mere,Merryfield,Middlewich,Midhurst,Milborne,Mitford,Modbury,Montacute,Mousehole,Newbiggin,Newborough,Newbury,Newenden,Newent,Norham,Northleach,Noss,Oakham,Olney,Orford,Ormskirk,Oswestry,Padstow,Paignton,Penkneth,Penrith,Penzance,Pershore,Petersfield,Pevensey,Pickering,Pilton,Pontefract,Portsmouth,Preston,Quatford,Reading,Redcliff,Retford,Rockingham,Romney,Rothbury,Rothwell,Salisbury,Saltash,Seaford,Seasalter,Sherston,Shifnal,Shoreham,Sidmouth,Skipsea,Skipton,Solihull,Somerton,Southam,Southwark,Standon,Stansted,Stapleton,Stottesdon,Sudbury,Swavesey,Tamerton,Tarporley,Tetbury,Thatcham,Thaxted,Thetford,Thornbury,Tintagel,Tiverton,Torksey,Totnes,Towcester,Tregoney,Trematon,Tutbury,Uxbridge,Wallingford,Wareham,Warenmouth,Wargrave,Warton,Watchet,Watford,Wendover,Westbury,Westcheap,Weymouth,Whitford,Wickwar,Wigan,Wigmore,Winchelsea,Winkleigh,Wiscombe,Witham,Witheridge,Wiveliscombe,Woodbury,Yeovil"}, @@ -78,14 +78,14 @@ export const defaultNameBases: INameBase[] = [ {name: "Berber", i: NB.Berber, min: 4, max: 10, d: "s", m: .2, b: "Abkhouch,Adrar,Agadir,Agelmam,Aghmat,Agrakal,Agulmam,Ahaggar,Almou,Anfa,Annaba,Aousja,Arbat,Argoub,Arif,Asfi,Assamer,Assif,Azaghar,Azmour,Azrou,Beccar,Beja,Bennour,Benslimane,Berkane,Berrechid,Bizerte,Bouskoura,Boutferda,Dar Bouazza,Darallouch,Darchaabane,Dcheira,Denden,Djebel,Djedeida,Drargua,Essaouira,Ezzahra,Fas,Fnideq,Ghezeze,Goubellat,Grisaffen,Guelmim,Guercif,Hammamet,Harrouda,Hoceima,Idurar,Ifendassen,Ifoghas,Imilchil,Inezgane,Izoughar,Jendouba,Kacem,Kelibia,Kenitra,Kerrando,Khalidia,Khemisset,Khenifra,Khouribga,Kidal,Korba,Korbous,Lahraouyine,Larache,Leyun,Lqliaa,Manouba,Martil,Mazagan,Mcherga,Mdiq,Megrine,Mellal,Melloul,Midelt,Mohammedia,Mornag,Mrrakc,Nabeul,Nadhour,Nador,Nawaksut,Nefza,Ouarzazate,Ouazzane,Oued Zem,Oujda,Ouladteima,Qsentina,Rades,Rafraf,Safi,Sefrou,Sejnane,Settat,Sijilmassa,Skhirat,Slimane,Somaa,Sraghna,Susa,Tabarka,Taferka,Tafza,Tagbalut,Tagerdayt,Takelsa,Tanja,Tantan,Taourirt,Taroudant,Tasfelalayt,Tattiwin,Taza,Tazerka,Tazizawt,Tebourba,Teboursouk,Temara,Testour,Tetouan,Tibeskert,Tifelt,Tinariwen,Tinduf,Tinja,Tiznit,Toubkal,Trables,Tubqal,Tunes,Urup,Watlas,Wehran,Wejda,Youssoufia,Zaghouan,Zahret,Zemmour,Zriba"}, {name: "Arabic", i: NB.Arabic, min: 4, max: 9, d: "ae", m: .2, b: "Abadilah,Abayt,Abha,Abud,Aden,Ahwar,Ajman,Alabadilah,Alabar,Alahjer,Alain,Alaraq,Alarish,Alarjam,Alashraf,Alaswaaq,Alawali,Albarar,Albawadi,Albirk,Aldhabiyah,Alduwaid,Alfareeq,Algayed,Alhada,Alhafirah,Alhamar,Alharam,Alharidhah,Alhawtah,Alhazim,Alhrateem,Alhudaydah,Alhujun,Alhuwaya,Aljahra,Aljohar,Aljubail,Alkawd,Alkhalas,Alkhawaneej,Alkhen,Alkhhafah,Alkhobar,Alkhuznah,Alkiranah,Allisafah,Allith,Almadeed,Almardamah,Almarwah,Almasnaah,Almejammah,Almojermah,Almshaykh,Almurjan,Almuwayh,Almuzaylif,Alnaheem,Alnashifah,Alqadeimah,Alqah,Alqahma,Alqalh,Alqouz,Alquaba,Alqunfudhah,Alqurayyat,Alradha,Alraqmiah,Alsadyah,Alsafa,Alshagab,Alshoqiq,Alshuqaiq,Alsilaa,Althafeer,Alwakrah,Alwasqah,Amaq,Amran,Annaseem,Aqbiyah,Arafat,Arar,Ardah,Arrawdah,Asfan,Ashayrah,Ashshahaniyah,Askar,Assaffaniyah,Ayaar,Aziziyah,Baesh,Bahrah,Baish,Balhaf,Banizayd,Baqaa,Baqal,Bidiyah,Bisha,Biyatah,Buqhayq,Burayda,Dafiyat,Damad,Dammam,Dariyah,Daynah,Dhafar,Dhahran,Dhalkut,Dhamar,Dhubab,Dhurma,Dibab,Dirab,Doha,Dukhan,Duwaibah,Enaker,Fadhla,Fahaheel,Fanateer,Farasan,Fardah,Fujairah,Ghalilah,Ghar,Ghizlan,Ghomgyah,Ghran,Hababah,Habil,Hadiyah,Haffah,Hajanbah,Hajrah,Halban,Haqqaq,Haradh,Hasar,Hathah,Hawarwar,Hawaya,Hawiyah,Hebaa,Hefar,Hijal,Husnah,Huwailat,Huwaitah,Irqah,Isharah,Ithrah,Jamalah,Jarab,Jareef,Jarwal,Jash,Jazan,Jeddah,Jiblah,Jihanah,Jilah,Jizan,Joha,Joraibah,Juban,Jubbah,Juddah,Jumeirah,Kamaran,Keyad,Khab,Khabtsaeed,Khaiybar,Khasab,Khathirah,Khawarah,Khulais,Khulays,Klayah,Kumzar,Limah,Linah,Mabar,Madrak,Mahab,Mahalah,Makhtar,Makshosh,Manfuhah,Manifah,Manshabah,Mareah,Masdar,Mashwar,Masirah,Maskar,Masliyah,Mastabah,Maysaan,Mazhar,Mdina,Meeqat,Mirbah,Mirbat,Mokhtara,Muharraq,Muladdah,Musandam,Musaykah,Muscat,Mushayrif,Musrah,Mussafah,Mutrah,Nafhan,Nahdah,Nahwa,Najran,Nakhab,Nizwa,Oman,Qadah,Qalhat,Qamrah,Qasam,Qatabah,Qawah,Qosmah,Qurain,Quraydah,Quriyat,Qurwa,Rabigh,Radaa,Rafha,Rahlah,Rakamah,Rasheedah,Rasmadrakah,Risabah,Rustaq,Ryadh,Saabah,Saabar,Sabtaljarah,Sabya,Sadad,Sadah,Safinah,Saham,Sahlat,Saihat,Salalah,Salmalzwaher,Salmiya,Sanaa,Sanaban,Sayaa,Sayyan,Shabayah,Shabwah,Shafa,Shalim,Shaqra,Sharjah,Sharkat,Sharurah,Shatifiyah,Shibam,Shidah,Shifiyah,Shihar,Shoqra,Shoqsan,Shuwaq,Sibah,Sihmah,Sinaw,Sirwah,Sohar,Suhailah,Sulaibiya,Sunbah,Tabuk,Taif,Taqah,Tarif,Tharban,Thumrait,Thuqbah,Thuwal,Tubarjal,Turaif,Turbah,Tuwaiq,Ubar,Umaljerem,Urayarah,Urwah,Wabrah,Warbah,Yabreen,Yadamah,Yafur,Yarim,Yemen,Yiyallah,Zabid,Zahwah,Zallaq,Zinjibar,Zulumah"}, {name: "Inuit", i: NB.Inuit, min: 5, max: 15, d: "alutsn", m: 0, b: "Aaluik,Aappilattoq,Aasiaat,Agdleruussakasit,Aggas,Akia,Akilia,Akuliaruseq,Akuliarutsip,Akunnaaq,Agissat,Agssaussat,Alluitsup,Alluttoq,Aluit,Aluk,Ammassalik,Amarortalik,Amitsorsuaq,Anarusuk,Angisorsuaq,Anguniartarfik,Annertussoq,Annikitsoq,Anoraliuirsoq,Appat,Apparsuit,Apusiaajik,Arsivik,Arsuk,Ataa,Atammik,Ateqanngitsorsuaq,Atilissuaq,Attu,Aukarnersuaq,Augpalugtoq, Aumat,Auvilikavsak,Auvilkikavsaup,Avadtlek,Avallersuaq,Bjornesk,Blabaerdalen,Blomsterdalen,Brattalhid,Bredebrae,Brededal,Claushavn,Edderfulegoer,Egger,Eqalugalinnguit,Eqalugarssuit,Eqaluit,Eqqua,Etah,Graah,Hakluyt,Haredalen,Hareoen,Hundeo,Igdlorssuit,Igaliku,Igdlugdlip,Igdluluarssuk,Iginniafik,Ikamiuk,Ikamiut,Ikarissat,Ikateq,Ikeq,Ikerasak,Ikerasaarsuk,Ikermiut,Ikermoissuaq,Ikertivaq,Ikorfarssuit,Ikorfat,Ilimanaq,Illorsuit,Iluileq,Iluiteq,Ilulissat,Illunnguit,Imaarsivik,Imartunarssuk,Immikkoortukajik,Innaarsuit,Ingjald,Inneruulalik,Inussullissuaq,Iqek,Ikerasakassak,Iperaq,Ippik,Isortok,Isungartussoq,Itileq,Itivdleq,Itissaalik,Ittit,Ittoqqortoormiit,Ivingmiut,Ivittuut,Kanajoorartuut,Kangaamiut,Kangaarsuk,Kangaatsiaq,Kangeq,Kangerluk,Kangerlussuaq,Kanglinnguit,Kapisillit,Karrat,Kekertamiut,Kiatak,Kiatassuaq,Kiataussaq,Kigatak,Kigdlussat,Kinaussak,Kingittorsuaq,Kitak,Kitsissuarsuit,Kitsissut,Klenczner,Kook,Kraulshavn,Kujalleq,Kullorsuaq,Kulusuk,Kuurmiit,Kuusuaq,Laksedalen,Maniitsoq,Marrakajik,Mattaangassut,Mernoq,Mittivakkat,Moriusaq,Myggbukta,Naajaat,Nako,Nangissat,Nanortalik,Nanuuseq,Nappassoq,Narsarmijt,Narssaq,Narsarsuaq,Narssarssuk,Nasaussaq,Nasiffik,Natsiarsiorfik,Naujanguit,Niaqornaarsuk,Niaqornat,Nordfjordspasset,Nugatsiaq,Nuluuk,Nunaa,Nunarssit,Nunarsuaq,Nunataaq,Nunatakavsaup,Nutaarmiut,Nuugaatsiaq,Nuuk,Nuukullak,Nuuluk,Nuussuaq,Olonkinbyen,Oqaatsut,Oqaitsúnguit,Oqonermiut,Oodaaq,Paagussat,Palungataq,Pamialluk,Paamiut,Paatuut,Patuersoq,Perserajoq,Paornivik,Pituffik,Puugutaa,Puulkuip,Qaanaq,Qaarsorsuaq,Qaarsorsuatsiaq,Qaasuitsup,Qaersut,Qajartalik,Qallunaat,Qaneq,Qaqaarissorsuaq,Qaqit,Qaqortok,Qasigiannguit,Qasse,Qassimiut,Qeertartivaq,Qeertartivatsiaq,Qeqertaq,Qeqertarssdaq,Qeqertarsuaq,Qeqertasussuk,Qeqertarsuatsiaat,Qeqertat,Qeqqata,Qernertoq,Qernertunnguit,Qianarreq,Qilalugkiarfik,Qingagssat,Qingaq,Qoornuup,Qorlortorsuaq,Qullikorsuit,Qunnerit,Qutdleq,Ravnedalen,Ritenbenk,Rypedalen,Sarfannguit,Saarlia,Saarloq,Saatoq,Saatorsuaq,Saatup,Saattut,Sadeloe,Salleq,Salliaruseq,Sammeqqat,Sammisoq,Sanningassoq,Saqqaq,Saqqarlersuaq,Saqqarliit,Sarqaq,Sattiaatteq,Savissivik,Serfanguaq,Sermersooq,Sermersut,Sermilik,Sermiligaaq,Sermitsiaq,Simitakaja,Simiutaq,Singamaq,Siorapaluk,Sisimiut,Sisuarsuit,Skal,Skarvefjeld,Skjoldungen,Storoen,Sullorsuaq,Suunikajik,Sverdrup,Taartoq,Takiseeq,Talerua,Tarqo,Tasirliaq,Tasiusak,Tiilerilaaq,Timilersua,Timmiarmiut,Tingmjarmiut,Traill,Tukingassoq,Tuttorqortooq,Tuujuk,Tuttulissuup,Tussaaq,Uigordlit,Uigorlersuaq,Uilortussoq,Uiivaq,Ujuaakajiip,Ukkusissat,Umanat,Upernavik,Upernattivik,Upepnagssivik,Upernivik,Uttorsiutit,Uumannaq,Uummannaarsuk,Uunartoq,Uvkusigssat,Ymer"}, - {name: "Basque", i: NB.Basque, min: 4, max: 11, d: "r", m: .1, b: "Abadio,Abaltzisketa,Abanto Zierbena,Aduna,Agurain,Aia,Aiara,Aizarnazabal,Ajangiz,Albiztur,Alegia,Alkiza,Alonsotegi,Altzaga,Altzo,Amezketa,Amorebieta,Amoroto,Amurrio,Andoain,Anoeta,Antzuola,Arakaldo,Arama,Aramaio,Arantzazu,Arbatzegi ,Areatza,Aretxabaleta,Arraia,Arrankudiaga,Arrasate,Arratzu,Arratzua,Arrieta,Arrigorriaga,Artea,Artzentales,Artziniega,Asparrena,Asteasu,Astigarraga,Ataun,Atxondo,Aulesti,Azkoitia,Azpeitia,Bakio,Baliarrain,Balmaseda,Barakaldo,Barrika,Barrundia,Basauri,Bastida,Beasain,Bedia,Beizama,Belauntza,Berango,Berantevilla,Berastegi,Bergara,Bermeo,Bernedo,Berriatua,Berriz,Berrobi,Bidania,Bilar,Bilbao,Burgelu,Busturia,Deba,Derio,Dima,Donemiliaga,Donostia,Dulantzi,Durango,Ea,Eibar,Elantxobe,Elduain,Elgeta,Elgoibar,Elorrio,Erandio,Ereno,Ermua,Errenteria,Errezil,Erribera Beitia,Erriberagoitia,Errigoiti,Eskoriatza,Eskuernaga,Etxebarri,Etxebarria,Ezkio,Fika,Forua,Fruiz,Gabiria,Gaintza,Galdakao,Galdames,Gamiz,Garai,Gasteiz,Gatika,Gatzaga,Gaubea,Gauna,Gautegiz Arteaga,Gaztelu,Gernika,Gerrikaitz,Getaria,Getxo,Gizaburuaga,Goiatz,Gordexola,Gorliz,Harana,Hernani,Hernialde,Hondarribia,Ibarra,Ibarrangelu,Idiazabal,Iekora,Igorre,Ikaztegieta,Iruna Oka,Irun,Irura,Iruraiz,Ispaster,Itsaso,Itsasondo,Iurreta,Izurtza,Jatabe,Kanpezu,Karrantza Harana,Kortezubi,Kripan,Kuartango,Lanestosa,Lantziego,Larrabetzu,Larraul,Lasarte,Laudio,Laukiz,Lazkao,Leaburu,Legazpi,Legorreta,Legutio,Leintz,Leioa,Lekeitio,Lemoa,Lemoiz,Leza,Lezama,Lezo,Lizartza,Loiu,Lumo,Manaria,Maeztu,Mallabia,Markina,Maruri,Manueta,Menaka,Mendaro,Mendata,Mendexa,Moreda Araba,Morga,Mundaka,Mungia,Munitibar,Murueta,Muskiz,Mutiloa,Mutriku,Muxika,Nabarniz,Onati,Oiartzun,Oion,Okondo,Olaberria,Ondarroa,Ordizia,Orendain,Orexa,Oria,Orio,Ormaiztegi,Orozko,Ortuella,Otxandio,Pasaia,Plentzia,Portugalete,Samaniego,Santurtzi,Segura,Sestao,Sondika,Sopela,Sopuerta,Soraluze,Sukarrieta,Tolosa,Trapagaran,Turtzioz,Ubarrundia,Ubide,Ugao,Urdua,Urduliz,Urizaharra,Urkabustaiz,Urnieta,Urretxu,Usurbil,Xemein,Zaia,Zaldibar,Zaldibia,Zalduondo,Zambrana,Zamudio,Zaratamo,Zarautz,Zeanuri,Zeberio,Zegama,Zerain,Zestoa,Zierbena,Zigoitia,Ziortza,Zizurkil,Zuia,Zumaia,Zumarraga"}, + {name: "Basque", i: NB.Basque, min: 4, max: 11, d: "r", m: .1, b: "Abadio,Abaltzisketa,Abanto Zierbena,Aduna,Agurain,Aia,Aiara,Aizarnazabal,Ajangiz,Albiztur,Alegia,Alkiza,Alonsotegi,Altzaga,Altzo,Amezketa,Amorebieta,Amoroto,Amurrio,Andoain,Anoeta,Antzuola,Arakaldo,Arama,Aramaio,Arantzazu,Arbatzegi,Areatza,Aretxabaleta,Arraia,Arrankudiaga,Arrasate,Arratzu,Arratzua,Arrieta,Arrigorriaga,Artea,Artzentales,Artziniega,Asparrena,Asteasu,Astigarraga,Ataun,Atxondo,Aulesti,Azkoitia,Azpeitia,Bakio,Baliarrain,Balmaseda,Barakaldo,Barrika,Barrundia,Basauri,Bastida,Beasain,Bedia,Beizama,Belauntza,Berango,Berantevilla,Berastegi,Bergara,Bermeo,Bernedo,Berriatua,Berriz,Berrobi,Bidania,Bilar,Bilbao,Burgelu,Busturia,Deba,Derio,Dima,Donemiliaga,Donostia,Dulantzi,Durango,Ea,Eibar,Elantxobe,Elduain,Elgeta,Elgoibar,Elorrio,Erandio,Ereno,Ermua,Errenteria,Errezil,Erribera Beitia,Erriberagoitia,Errigoiti,Eskoriatza,Eskuernaga,Etxebarri,Etxebarria,Ezkio,Fika,Forua,Fruiz,Gabiria,Gaintza,Galdakao,Galdames,Gamiz,Garai,Gasteiz,Gatika,Gatzaga,Gaubea,Gauna,Gautegiz Arteaga,Gaztelu,Gernika,Gerrikaitz,Getaria,Getxo,Gizaburuaga,Goiatz,Gordexola,Gorliz,Harana,Hernani,Hernialde,Hondarribia,Ibarra,Ibarrangelu,Idiazabal,Iekora,Igorre,Ikaztegieta,Iruna Oka,Irun,Irura,Iruraiz,Ispaster,Itsaso,Itsasondo,Iurreta,Izurtza,Jatabe,Kanpezu,Karrantza Harana,Kortezubi,Kripan,Kuartango,Lanestosa,Lantziego,Larrabetzu,Larraul,Lasarte,Laudio,Laukiz,Lazkao,Leaburu,Legazpi,Legorreta,Legutio,Leintz,Leioa,Lekeitio,Lemoa,Lemoiz,Leza,Lezama,Lezo,Lizartza,Loiu,Lumo,Manaria,Maeztu,Mallabia,Markina,Maruri,Manueta,Menaka,Mendaro,Mendata,Mendexa,Moreda Araba,Morga,Mundaka,Mungia,Munitibar,Murueta,Muskiz,Mutiloa,Mutriku,Muxika,Nabarniz,Onati,Oiartzun,Oion,Okondo,Olaberria,Ondarroa,Ordizia,Orendain,Orexa,Oria,Orio,Ormaiztegi,Orozko,Ortuella,Otxandio,Pasaia,Plentzia,Portugalete,Samaniego,Santurtzi,Segura,Sestao,Sondika,Sopela,Sopuerta,Soraluze,Sukarrieta,Tolosa,Trapagaran,Turtzioz,Ubarrundia,Ubide,Ugao,Urdua,Urduliz,Urizaharra,Urkabustaiz,Urnieta,Urretxu,Usurbil,Xemein,Zaia,Zaldibar,Zaldibia,Zalduondo,Zambrana,Zamudio,Zaratamo,Zarautz,Zeanuri,Zeberio,Zegama,Zerain,Zestoa,Zierbena,Zigoitia,Ziortza,Zizurkil,Zuia,Zumaia,Zumarraga"}, {name: "Nigerian", i: NB.Nigerian, min: 4, max: 10, d: "", m: .3, b: "Abadogo,Abafon,Abdu,Acharu,Adaba,Adealesu,Adeto,Adyongo,Afaga,Afamju,Afuje,Agbelagba,Agigbigi,Agogoke,Ahute,Aiyelaboro,Ajebe,Ajola,Akarekwu,Akessan,Akunuba,Alawode,Alkaijji,Amangam,Amaoji,Amgbaye,Amtasa,Amunigun,Anase,Aniho,Animahun,Antul,Anyoko,Apekaa,Arapagi,Asamagidi,Asande,Ataibang,Awgbagba,Awhum,Awodu,Babanana,Babateduwa,Bagu,Bakura,Bandakwai,Bangdi,Barbo,Barkeje,Basa,Basabra,Basansagawa,Bieleshin,Bilikani,Birnindodo,Braidu,Bulakawa,Buriburi,Burisidna,Busum,Bwoi,Cainnan,Chakum,Charati,Chondugh,Dabibikiri,Dagwarga,Dallok,Danalili,Dandala,Darpi,Dhayaki,Dokatofa,Doma,Dozere,Duci,Dugan,Ebelibri,Efem,Efoi,Egudu,Egundugbo,Ekoku,Ekpe,Ekwere,Erhua,Eteu,Etikagbene,Ewhoeviri,Ewhotie,Ezemaowa,Fatima,Gadege,Galakura,Galea,Gamai,Gamen,Ganjin,Gantetudu,Garangamawa,Garema,Gargar,Gari,Garinbode,Garkuwa,Garu Kime,Gazabu,Gbure,Gerti,Gidan,Giringwe,Gitabaremu,Giyagiri,Giyawa,Gmawa,Golakochi,Golumba,Guchi,Gudugu,Gunji,Gusa,Gwambula,Gwamgwam,Gwodoti,Hayinlere,Hayinmaialewa,Hirishi,Hombo,Ibefum,Iberekodo,Ibodeipa,Icharge,Ideoro,Idofin,Idofinoka,Idya,Iganmeji,Igbetar,Igbogo,Ijoko,Ijuwa,Ikawga,Ikekogbe,Ikhin,Ikoro,Ikotefe,Ikotokpora,Ikpakidout,Ikpeoniong,Ilofa,Imuogo,Inyeneke,Iorsugh,Ipawo,Ipinlerere,Isicha,Itakpa,Itoki,Iyedeame,Jameri,Jangi,Jara,Jare,Jataudakum,Jaurogomki,Jepel,Jibam,Jirgu,Jirkange,Kafinmalama,Kamkem,Katab,Katanga,Katinda,Katirije,Kaurakimba,Keffinshanu,Kellumiri,Kiagbodor,Kibiare,Kingking,Kirbutu,Kita,Kogbo,Kogogo,Kopje,Koriga,Koroko,Korokorosei,Kotoku,Kuata,Kujum,Kukau,Kunboon,Kuonubogbene,Kurawe,Kushinahu,Kwaramakeri,Ladimeji,Lafiaro,Lahaga,Laindebajanle,Laindegoro,Lajere,Lakati,Ligeri,Litenswa,Lokobimagaji,Lusabe,Maba,Madarzai,Magoi,Maialewa,Maianita,Maijuja,Mairakuni,Maleh,Malikansaa,Mallamkola,Mallammaduri,Marmara,Masagu,Masoma,Mata,Matankali,Mbalare,Megoyo,Meku,Miama,Mige,Mkporagwu,Modi,Molafa,Mshi,Msugh,Muduvu,Murnachehu,Namnai,Nanumawa,Nasudu,Ndagawo,Ndamanma,Ndiebeleagu,Ndiwulunbe,Ndonutim,Ngaruwa,Ngbande,Nguengu,Nto Ekpe,Nubudi,Nyajo,Nyido,Nyior,Obafor,Obazuwa,Odajie,Odiama,Ofunatam,Ogali,Ogan,Ogbaga,Ogbahu,Ogultu,Ogunbunmi,Ogunmakin,Ojaota,Ojirami,Ojopode,Okehin,Olugunna,Omotunde,Onipede,Onisopi,Onma,Orhere,Orya,Oshotan,Otukwang,Otunade,Pepegbene,Poros,Rafin,Rampa,Rimi,Rinjim,Robertkiri,Rugan,Rumbukawa,Sabiu,Sabon,Sabongari,Sai,Salmatappare,Sangabama,Sarabe,Seboregetore,Seibiri,Sendowa,Shafar,Shagwa,Shata,Shefunda,Shengu,Sokoron,Sunnayu,Taberlma,Tafoki,Takula,Talontan,Taraku,Tarhemba,Tayu,Ter,Timtim,Timyam,Tindirke,Tirkalou,Tokunbo,Tonga,Torlwam,Tseakaadza,Tseanongo,Tseavungu,Tsebeeve,Tsekov,Tsepaegh,Tuba,Tumbo,Tungalombo,Tungamasu,Tunganrati,Tunganyakwe,Tungenzuri,Ubimimi,Uhkirhi,Umoru,Umuabai,Umuaja,Umuajuju,Umuimo,Umuojala,Unchida,Ungua,Unguwar,Unongo,Usha,Ute,Utongbo,Vembera,Vorokotok,Wachin,Walebaga,Wurawura,Wuro,Yanbashi,Yanmedi,Yenaka,Yoku,Zamangera,Zarunkwari,Zilumo,Zulika"}, {name: "Celtic", i: NB.Celtic, min: 4, max: 12, d: "nld", m: 0, b: "Aberaman,Aberangell,Aberarth,Aberavon,Aberbanc,Aberbargoed,Aberbeeg,Abercanaid,Abercarn,Abercastle,Abercegir,Abercraf,Abercregan,Abercych,Abercynon,Aberdare,Aberdaron,Aberdaugleddau,Aberdeen,Aberdulais,Aberdyfi,Aberedw,Abereiddy,Abererch,Abereron,Aberfan,Aberffraw,Aberffrwd,Abergavenny,Abergele,Aberglasslyn,Abergorlech,Abergwaun,Abergwesyn,Abergwili,Abergwynfi,Abergwyngregyn,Abergynolwyn,Aberhafesp,Aberhonddu,Aberkenfig,Aberllefenni,Abermain,Abermaw,Abermorddu,Abermule,Abernant,Aberpennar,Aberporth,Aberriw,Abersoch,Abersychan,Abertawe,Aberteifi,Aberthin,Abertillery,Abertridwr,Aberystwyth,Achininver,Afonhafren,Alisaha,Antinbhearmor,Ardenna,Attacon,Beira,Bhrura,Boioduro,Bona,Boudobriga,Bravon,Brigant,Briganta,Briva,Cambodunum,Cambra,Caracta,Catumagos,Centobriga,Ceredigion,Chalain,Dinn,Diwa,Dubingen,Duro,Ebora,Ebruac,Eburodunum,Eccles,Eighe,Eireann,Ferkunos,Genua,Ghrainnse,Inbhear,Inbhir,Inbhirair,Innerleithen,Innerleven,Innerwick,Inver,Inveraldie,Inverallan,Inveralmond,Inveramsay,Inveran,Inveraray,Inverarnan,Inverbervie,Inverclyde,Inverell,Inveresk,Inverfarigaig,Invergarry,Invergordon,Invergowrie,Inverhaddon,Inverkeilor,Inverkeithing,Inverkeithney,Inverkip,Inverleigh,Inverleith,Inverloch,Inverlochlarig,Inverlochy,Invermay,Invermoriston,Inverness,Inveroran,Invershin,Inversnaid,Invertrossachs,Inverugie,Inveruglas,Inverurie,Kilninver,Kirkcaldy,Kirkintilloch,Krake,Latense,Leming,Lindomagos,Llanaber,Lochinver,Lugduno,Magoduro,Monmouthshire,Narann,Novioduno,Nowijonago,Octoduron,Penning,Pheofharain,Ricomago,Rossinver,Salodurum,Seguia,Sentica,Theorsa,Uige,Vitodurum,Windobona"}, - {name: "Mesopotamian", i: NB.Mesopotamian, min: 4, max: 9, d: "srpl", m: .1, b: "Adab,Akkad,Akshak,Amnanum,Arbid,Arpachiyah,Arrapha,Assur,Babilim,Badtibira,Balawat,Barsip,Borsippa,Carchemish,Chagar Bazar,Chuera,Ctesiphon ,Der,Dilbat,Diniktum,Doura,Durkurigalzu,Ekallatum,Emar,Erbil,Eridu,Eshnunn,Fakhariya ,Gawra,Girsu,Hadatu,Hamoukar,Haradum,Harran,Hatra,Idu,Irisagrig,Isin,Jemdet,Kahat,Kartukulti,Khaiber,Kish ,Kisurra,Kuara,Kutha,Lagash,Larsa ,Leilan,Marad,Mardaman,Mari,Mashkan,Mumbaqat ,Nabada,Nagar,Nerebtum,Nimrud,Nineveh,Nippur,Nuzi,Qalatjarmo,Qatara,Rawda,Seleucia,Shaduppum,Shanidar,Sharrukin,Shemshara,Shibaniba,Shuruppak,Sippar,Tarbisu,Tellagrab,Tellessawwan,Tellessweyhat,Tellhassuna,Telltaya,Telul,Terqa,Thalathat,Tutub,Ubaid ,Umma,Ur,Urfa,Urkesh,Uruk,Urum,Zabalam,Zenobia"}, - {name: "Iranian", i: NB.Iranian, min: 5, max: 11, d: "", m: .1, b: "Abali,Abrisham,Absard,Abuzeydabad,Afus,Alavicheh,Alikosh,Amol,Anarak,Anbar,Andisheh,Anshan,Aran,Ardabil,Arderica,Ardestan,Arjomand,Asgaran,Asgharabad,Ashian,Awan,Babajan,Badrud,Bafran,Baghestan,Baghshad,Bahadoran,Baharan Shahr,Baharestan,Bakun,Bam,Baqershahr,Barzok,Bastam,Behistun,Bitistar,Bumahen,Bushehr,Chadegan,Chahardangeh,Chamgardan,Chermahin,Choghabonut,Chugan,Damaneh,Damavand,Darabgard,Daran,Dastgerd,Dehaq,Dehaqan,Dezful,Dizicheh,Dorcheh,Dowlatabad,Duruntash,Ecbatana,Eslamshahr,Estakhr,Ezhiyeh,Falavarjan,Farrokhi,Fasham,Ferdowsieh,Fereydunshahr,Ferunabad,Firuzkuh,Fuladshahr,Ganjdareh,Ganzak,Gaz,Geoy,Godin,Goldasht,Golestan,Golpayegan,Golshahr,Golshan,Gorgab,Guged,Habibabad,Hafshejan,Hajjifiruz,Hana,Harand,Hasanabad,Hasanlu,Hashtgerd,Hecatompylos,Hormirzad,Imanshahr,Isfahan,Jandaq,Javadabad,Jiroft,Jowsheqan ,Jowzdan,Kabnak,Kahriz Sang,Kahrizak,Kangavar,Karaj,Karkevand,Kashan,Kelishad,Kermanshah,Khaledabad,Khansar,Khorramabad,Khur,Khvorzuq,Kilan,Komeh,Komeshcheh,Konar,Kuhpayeh,Kul,Kushk,Lavasan,Laybid,Liyan,Lyan,Mahabad,Mahallat,Majlesi,Malard,Manzariyeh,Marlik,Meshkat,Meymeh,Miandasht,Mish,Mobarakeh,Nahavand,Nain,Najafabad,Naqshe,Narezzash,Nasimshahr,Nasirshahr,Nasrabad,Natanz,Neyasar,Nikabad,Nimvar,Nushabad,Pakdasht,Parand,Pardis,Parsa,Pasargadai,Patigrabana,Pir Bakran,Pishva,Qahderijan,Qahjaverestan,Qamsar,Qarchak,Qods,Rabat,Ray-shahr,Rezvanshahr,Rhages,Robat Karim,Rozveh,Rudehen,Sabashahr,Safadasht,Sagzi,Salehieh,Sandal,Sarvestan,Sedeh,Sefidshahr,Semirom,Semnan,Shadpurabad,Shah,Shahdad,Shahedshahr,Shahin,Shahpour,Shahr,Shahreza,Shahriar,Sharifabad,Shemshak,Shiraz,Shushan,Shushtar,Sialk,Sin,Sukhteh,Tabas,Tabriz,Takhte,Talkhuncheh,Talli,Tarq,Temukan,Tepe,Tiran,Tudeshk,Tureng,Urmia,Vahidieh,Vahrkana,Vanak,Varamin,Varnamkhast,Varzaneh,Vazvan,Yahya,Yarim,Yasuj,Zarrin Shahr,Zavareh,Zayandeh,Zazeran,Ziar,Zibashahr,Zranka"}, + {name: "Mesopotamian", i: NB.Mesopotamian, min: 4, max: 9, d: "srpl", m: .1, b: "Adab,Akkad,Akshak,Amnanum,Arbid,Arpachiyah,Arrapha,Assur,Babilim,Badtibira,Balawat,Barsip,Borsippa,Carchemish,Chagar Bazar,Chuera,Ctesiphon,Der,Dilbat,Diniktum,Doura,Durkurigalzu,Ekallatum,Emar,Erbil,Eridu,Eshnunn,Fakhariya,Gawra,Girsu,Hadatu,Hamoukar,Haradum,Harran,Hatra,Idu,Irisagrig,Isin,Jemdet,Kahat,Kartukulti,Khaiber,Kish,Kisurra,Kuara,Kutha,Lagash,Larsa,Leilan,Marad,Mardaman,Mari,Mashkan,Mumbaqat,Nabada,Nagar,Nerebtum,Nimrud,Nineveh,Nippur,Nuzi,Qalatjarmo,Qatara,Rawda,Seleucia,Shaduppum,Shanidar,Sharrukin,Shemshara,Shibaniba,Shuruppak,Sippar,Tarbisu,Tellagrab,Tellessawwan,Tellessweyhat,Tellhassuna,Telltaya,Telul,Terqa,Thalathat,Tutub,Ubaid,Umma,Ur,Urfa,Urkesh,Uruk,Urum,Zabalam,Zenobia"}, + {name: "Iranian", i: NB.Iranian, min: 5, max: 11, d: "", m: .1, b: "Abali,Abrisham,Absard,Abuzeydabad,Afus,Alavicheh,Alikosh,Amol,Anarak,Anbar,Andisheh,Anshan,Aran,Ardabil,Arderica,Ardestan,Arjomand,Asgaran,Asgharabad,Ashian,Awan,Babajan,Badrud,Bafran,Baghestan,Baghshad,Bahadoran,Baharan Shahr,Baharestan,Bakun,Bam,Baqershahr,Barzok,Bastam,Behistun,Bitistar,Bumahen,Bushehr,Chadegan,Chahardangeh,Chamgardan,Chermahin,Choghabonut,Chugan,Damaneh,Damavand,Darabgard,Daran,Dastgerd,Dehaq,Dehaqan,Dezful,Dizicheh,Dorcheh,Dowlatabad,Duruntash,Ecbatana,Eslamshahr,Estakhr,Ezhiyeh,Falavarjan,Farrokhi,Fasham,Ferdowsieh,Fereydunshahr,Ferunabad,Firuzkuh,Fuladshahr,Ganjdareh,Ganzak,Gaz,Geoy,Godin,Goldasht,Golestan,Golpayegan,Golshahr,Golshan,Gorgab,Guged,Habibabad,Hafshejan,Hajjifiruz,Hana,Harand,Hasanabad,Hasanlu,Hashtgerd,Hecatompylos,Hormirzad,Imanshahr,Isfahan,Jandaq,Javadabad,Jiroft,Jowsheqan,Jowzdan,Kabnak,Kahriz Sang,Kahrizak,Kangavar,Karaj,Karkevand,Kashan,Kelishad,Kermanshah,Khaledabad,Khansar,Khorramabad,Khur,Khvorzuq,Kilan,Komeh,Komeshcheh,Konar,Kuhpayeh,Kul,Kushk,Lavasan,Laybid,Liyan,Lyan,Mahabad,Mahallat,Majlesi,Malard,Manzariyeh,Marlik,Meshkat,Meymeh,Miandasht,Mish,Mobarakeh,Nahavand,Nain,Najafabad,Naqshe,Narezzash,Nasimshahr,Nasirshahr,Nasrabad,Natanz,Neyasar,Nikabad,Nimvar,Nushabad,Pakdasht,Parand,Pardis,Parsa,Pasargadai,Patigrabana,Pir Bakran,Pishva,Qahderijan,Qahjaverestan,Qamsar,Qarchak,Qods,Rabat,Ray-shahr,Rezvanshahr,Rhages,Robat Karim,Rozveh,Rudehen,Sabashahr,Safadasht,Sagzi,Salehieh,Sandal,Sarvestan,Sedeh,Sefidshahr,Semirom,Semnan,Shadpurabad,Shah,Shahdad,Shahedshahr,Shahin,Shahpour,Shahr,Shahreza,Shahriar,Sharifabad,Shemshak,Shiraz,Shushan,Shushtar,Sialk,Sin,Sukhteh,Tabas,Tabriz,Takhte,Talkhuncheh,Talli,Tarq,Temukan,Tepe,Tiran,Tudeshk,Tureng,Urmia,Vahidieh,Vahrkana,Vanak,Varamin,Varnamkhast,Varzaneh,Vazvan,Yahya,Yarim,Yasuj,Zarrin Shahr,Zavareh,Zayandeh,Zazeran,Ziar,Zibashahr,Zranka"}, {name: "Hawaiian", i: NB.Hawaiian, min: 5, max: 10, d: "auo", m: 1, b: "Aapueo,Ahoa,Ahuakaio,Ahuakamalii,Ahuakeio,Ahupau,Aki,Alaakua,Alae,Alaeloa,Alaenui,Alamihi,Aleamai,Alena,Alio,Aupokopoko,Auwahi,Hahakea,Haiku,Halakaa,Halehaku,Halehana,Halemano,Haleu,Haliimaile,Hamakuapoko,Hamoa,Hanakaoo,Hanaulu,Hanawana,Hanehoi,Haneoo,Haou,Hikiaupea,Hoalua,Hokuula,Honohina,Honokahua,Honokala,Honokalani,Honokeana,Honokohau,Honokowai,Honolua,Honolulu,Honolulunui,Honomaele,Honomanu,Hononana,Honopou,Hoolawa,Hopenui,Hualele,Huelo,Hulaia,Ihuula,Ilikahi,Kaalaea,Kaalelehinale,Kaapahu,Kaehoeho,Kaeleku,Kaeo,Kahakuloa,Kahalawe,Kahalawe,Kahalehili,Kahana,Kahilo,Kahuai,Kaiaula,Kailihiakoko,Kailua,Kainehe,Kakalahale,Kakanoni,Kakio,Kakiweka,Kalena,Kalenanui,Kaleoaihe,Kalepa,Kaliae,Kalialinui,Kalihi,Kalihi,Kalihi,Kalimaohe,Kaloi,Kamani,Kamaole,Kamehame,Kanahena,Kanaio,Kaniaula,Kaonoulu,Kaopa,Kapaloa,Kapaula,Kapewakua,Kapohue,Kapuaikini,Kapunakea,Kapuuomahuka,Kauau,Kauaula,Kaukuhalahala,Kaulalo,Kaulanamoa,Kauluohana,Kaumahalua,Kaumakani,Kaumanu,Kaunauhane,Kaunuahane,Kaupakulua,Kawaipapa,Kawaloa,Kawaloa,Kawalua,Kawela,Keaa,Keaalii,Keaaula,Keahua,Keahuapono,Keakuapauaela,Kealahou,Keanae,Keauhou,Kekuapawela,Kelawea,Keokea,Keopuka,Kepio,Kihapuhala,Kikoo,Kilolani,Kipapa,Koakupuna,Koali,Koananai,Koheo,Kolea,Kolokolo,Kooka,Kopili,Kou,Kualapa,Kuhiwa,Kuholilea,Kuhua,Kuia,Kuiaha,Kuikui,Kukoae,Kukohia,Kukuiaeo,Kukuioolu,Kukuipuka,Kukuiula,Kulahuhu,Kumunui,Lapakea,Lapalapaiki,Lapueo,Launiupoko,Loiloa,Lole,Lualailua,Maalo,Mahinahina,Mahulua,Maiana,Mailepai,Makaakini,Makaalae,Makaehu,Makaiwa,Makaliua,Makapipi,Makapuu,Makawao,Makila,Mala,Maluaka,Mamalu,Manawaiapiki,Manawainui,Maulili,Mehamenui,Miana,Mikimiki,Moalii,Moanui,Mohopili,Mohopilo,Mokae,Mokuia,Mokupapa,Mooiki,Mooloa,Moomuku,Muolea,Nahuakamalii,Nailiilipoko,Nakaaha,Nakalepo,Nakaohu,Nakapehu,Nakula,Napili,Niniau,Niumalu,Nuu,Ohia,Oloewa,Olowalu,Omaopio,Onau,Onouli,Opaeula,Opana,Opikoula,Paakea,Paeahu,Paehala,Paeohi,Pahoa,Paia,Pakakia,Pakala,Palauea,Palemo,Panaewa,Paniau,Papaaea,Papaanui,Papaauhau,Papahawahawa,Papaka,Papauluana,Pauku,Paunau,Pauwalu,Pauwela,Peahi,Piapia,Pohakanele,Pohoula,Polaiki,Polanui,Polapola,Polua,Poopoo,Popoiwi,Popoloa,Poponui,Poupouwela,Puaa,Puaaluu,Puahoowali,Puakea,Puako,Pualaea,Puehuehu,Puekahi,Pueokauiki,Pukaauhuhu,Pukalani,Pukuilua,Pulehu,Pulehuiki,Pulehunui,Punaluu,Puolua,Puou,Puuhaehae,Puuhaoa,Puuiki,Puuki,Puukohola,Puulani,Puumaneoneo,Puunau,Puunoa,Puuomaiai,Puuomaile,Uaoa,Uhao,Ukumehame,Ulaino,Ulumalu,Wahikuli,Waiahole,Waiakoa,Waianae,Waianu,Waiawa,Waiehu,Waieli,Waihee,Waikapu,Wailamoa,Wailaulau,Wailua,Wailuku,Wainee,Waiohole,Waiohonu,Waiohue,Waiohuli,Waiokama,Waiokila,Waiopai,Waiopua,Waipao,Waipio,Waipioiki,Waipionui,Waipouli,Wakiu,Wananalua"}, {name: "Karnataka", i: NB.Karnataka, min: 5, max: 11, d: "tnl", m: 0, b: "Adityapatna,Adyar,Afzalpur,Aland,Alnavar,Alur,Ambikanagara,Anekal,Ankola,Annigeri,Arkalgud,Arsikere,Athni,Aurad,Badami,Bagalkot,Bagepalli,Bail,Bajpe,Bangalore,Bangarapet,Bankapura,Bannur,Bantval,Basavakalyan,Basavana,Belgaum,Beltangadi,Belur,Bhadravati,Bhalki,Bhatkal,Bhimarayanagudi,Bidar,Bijapur,Bilgi,Birur,Bommasandra,Byadgi,Challakere,Chamarajanagar,Channagiri,Channapatna,Channarayapatna,Chik,Chikmagalur,Chiknayakanhalli,Chikodi,Chincholi,Chintamani,Chitapur,Chitgoppa,Chitradurga,Dandeli,Dargajogihalli,Devadurga,Devanahalli,Dod,Donimalai,Gadag,Gajendragarh,Gangawati,Gauribidanur,Gokak,Gonikoppal,Gubbi,Gudibanda,Gulbarga,Guledgudda,Gundlupet,Gurmatkal,Haliyal,Hangal,Harapanahalli,Harihar,Hassan,Hatti,Haveri,Hebbagodi,Heggadadevankote,Hirekerur,Holalkere,Hole,Homnabad,Honavar,Honnali,Hoovina,Hosakote,Hosanagara,Hosdurga,Hospet,Hubli,Hukeri,Hungund,Hunsur,Ilkal,Indi,Jagalur,Jamkhandi,Jevargi,Jog,Kadigenahalli,Kadur,Kalghatgi,Kamalapuram,Kampli,Kanakapura,Karkal,Karwar,Khanapur,Kodiyal,Kolar,Kollegal,Konnur,Koppa,Koppal,Koratagere,Kotturu,Krishnarajanagara,Krishnarajasagara,Krishnarajpet,Kudchi,Kudligi,Kudremukh,Kumta,Kundapura,Kundgol,Kunigal,Kurgunta,Kushalnagar,Kushtagi,Lakshmeshwar,Lingsugur,Londa,Maddur,Madhugiri,Madikeri,Mahalingpur,Malavalli,Mallar,Malur,Mandya,Mangalore,Manvi,Molakalmuru,Mudalgi,Mudbidri,Muddebihal,Mudgal,Mudhol,Mudigere,Mulbagal,Mulgund,Mulki,Mulur,Mundargi,Mundgod,Munirabad,Mysore,Nagamangala,Nanjangud,Narasimharajapura,Naregal,Nargund,Navalgund,Nipani,Pandavapura,Pavagada,Piriyapatna,Pudu,Puttur,Rabkavi,Raichur,Ramanagaram,Ramdurg,Ranibennur,Raybag,Robertson,Ron,Sadalgi,Sagar,Sakleshpur,Saligram,Sandur,Sankeshwar,Saundatti,Savanur,Sedam,Shahabad,Shahpur,Shaktinagar,Shiggaon,Shikarpur,Shirhatti,Shorapur,Shrirangapattana,Siddapur,Sidlaghatta,Sindgi,Sindhnur,Sira,Siralkoppa,Sirsi,Siruguppa,Somvarpet,Sorab,Sringeri,Srinivaspur,Sulya,Talikota,Tarikere,Tekkalakote,Terdal,Thumbe,Tiptur,Tirthahalli,Tirumakudal,Tumkur,Turuvekere,Udupi,Vijayapura,Wadi,Yadgir,Yelandur,Yelbarga,Yellapur,Yenagudde"}, - {name: "Quechua", i: NB.Quechua, min: 6, max: 12, d: "l", m: 0, b: "Altomisayoq,Ancash,Andahuaylas,Apachekta,Apachita,Apu ,Apurimac,Arequipa,Atahuallpa,Atawalpa,Atico,Ayacucho,Ayllu,Cajamarca,Carhuac,Carhuacatac,Cashan,Caullaraju,Caxamalca,Cayesh,Chacchapunta,Chacraraju,Champara,Chanchan,Chekiacraju,Chinchey,Chontah,Chopicalqui,Chucuito,Chuito,Chullo,Chumpi,Chuncho,Chuquiapo,Churup,Cochapata,Cojup,Collota,Conococha,Copa,Corihuayrachina,Cusichaca,Despacho,Haika,Hanpiq,Hatun,Haywarisqa,Huaca,Hualcan,Huamanga,Huamashraju,Huancarhuas,Huandoy,Huantsan,Huarmihuanusca,Huascaran,Huaylas,Huayllabamba,Huichajanca,Huinayhuayna,Huinioch,Illiasca,Intipunku,Ishinca,Jahuacocha,Jirishanca,Juli,Jurau,Kakananpunta,Kamasqa,Karpay,Kausay,Khuya ,Kuelap,Llaca,Llactapata,Llanganuco,Llaqta,Llupachayoc,Machu,Mallku,Matarraju,Mikhuy,Milluacocha,Munay,Ocshapalca,Ollantaytambo,Pacamayo,Paccharaju,Pachacamac,Pachakamaq,Pachakuteq,Pachakuti,Pachamama  ,Paititi,Pajaten,Palcaraju,Pampa,Panaka,Paqarina,Paqo,Parap,Paria,Patallacta,Phuyupatamarca,Pisac,Pongos,Pucahirca,Pucaranra,Puscanturpa,Putaca,Qawaq ,Qayqa,Qochamoqo,Qollana,Qorihuayrachina,Qorimoqo,Quenuaracra,Queshque,Quillcayhuanca,Quillya,Quitaracsa,Quitaraju,Qusqu,Rajucolta,Rajutakanan,Rajutuna,Ranrahirca,Ranrapalca,Raria,Rasac,Rimarima,Riobamba,Runkuracay,Rurec,Sacsa,Saiwa,Sarapo,Sayacmarca,Sinakara,TamboColorado,Tamboccocha,Taripaypacha,Taulliraju,Tawantinsuyu,Taytanchis,Tiwanaku,Tocllaraju,Tsacra,Tuco,Tullparaju,Tumbes,Ulta,Uruashraju,Vallunaraju,Vilcabamba,Wacho ,Wankawillka,Wayra,Yachay,Yahuarraju,Yanamarey,Yanesha,Yerupaja"}, + {name: "Quechua", i: NB.Quechua, min: 6, max: 12, d: "l", m: 0, b: "Altomisayoq,Ancash,Andahuaylas,Apachekta,Apachita,Apu ,Apurimac,Arequipa,Atahuallpa,Atawalpa,Atico,Ayacucho,Ayllu,Cajamarca,Carhuac,Carhuacatac,Cashan,Caullaraju,Caxamalca,Cayesh,Chacchapunta,Chacraraju,Champara,Chanchan,Chekiacraju,Chinchey,Chontah,Chopicalqui,Chucuito,Chuito,Chullo,Chumpi,Chuncho,Chuquiapo,Churup,Cochapata,Cojup,Collota,Conococha,Copa,Corihuayrachina,Cusichaca,Despacho,Haika,Hanpiq,Hatun,Haywarisqa,Huaca,Hualcan,Huamanga,Huamashraju,Huancarhuas,Huandoy,Huantsan,Huarmihuanusca,Huascaran,Huaylas,Huayllabamba,Huichajanca,Huinayhuayna,Huinioch,Illiasca,Intipunku,Ishinca,Jahuacocha,Jirishanca,Juli,Jurau,Kakananpunta,Kamasqa,Karpay,Kausay,Khuya ,Kuelap,Llaca,Llactapata,Llanganuco,Llaqta,Llupachayoc,Machu,Mallku,Matarraju,Mikhuy,Milluacocha,Munay,Ocshapalca,Ollantaytambo,Pacamayo,Paccharaju,Pachacamac,Pachakamaq,Pachakuteq,Pachakuti,Pachamama,Paititi,Pajaten,Palcaraju,Pampa,Panaka,Paqarina,Paqo,Parap,Paria,Patallacta,Phuyupatamarca,Pisac,Pongos,Pucahirca,Pucaranra,Puscanturpa,Putaca,Qawaq ,Qayqa,Qochamoqo,Qollana,Qorihuayrachina,Qorimoqo,Quenuaracra,Queshque,Quillcayhuanca,Quillya,Quitaracsa,Quitaraju,Qusqu,Rajucolta,Rajutakanan,Rajutuna,Ranrahirca,Ranrapalca,Raria,Rasac,Rimarima,Riobamba,Runkuracay,Rurec,Sacsa,Saiwa,Sarapo,Sayacmarca,Sinakara,TamboColorado,Tamboccocha,Taripaypacha,Taulliraju,Tawantinsuyu,Taytanchis,Tiwanaku,Tocllaraju,Tsacra,Tuco,Tullparaju,Tumbes,Ulta,Uruashraju,Vallunaraju,Vilcabamba,Wacho ,Wankawillka,Wayra,Yachay,Yahuarraju,Yanamarey,Yanesha,Yerupaja"}, {name: "Swahili", i: NB.Swahili, min: 4, max: 9, d: "", m: 0, b: "Abim,Adjumani,Alebtong,Amolatar,Amuria,Amuru,Apac,Arua,Arusha,Babati,Baragoi,Bombo,Budaka,Bugembe,Bugiri,Buikwe,Bukedea,Bukoba,Bukomansimbi,Bukungu,Buliisa,Bundibugyo,Bungoma,Busembatya,Bushenyi,Busia,Busia,Busolwe,Butaleja,Butambala,Butere,Buwenge,Buyende,Dadaab,Dodoma,Dokolo,Eldoret,Elegu,Emali,Embu,Entebbe,Garissa,Gede,Gulu,Handeni,Hima,Hoima,Hola,Ibanda,Iganga,Iringa,Isingiro,Isiolo,Jinja,Kaabong,Kabale,Kaberamaido,Kabuyanda,Kabwohe,Kagadi,Kahama,Kajiado,Kakamega,Kakinga,Kakira,Kakiri,Kakuma,Kalangala,Kaliro,Kalisizo,Kalongo,Kalungu,Kampala,Kamuli,Kamwenge,Kanoni,Kanungu,Kapchorwa,Kapenguria,Kasese,Kasulu,Katakwi,Kayunga,Kericho,Keroka,Kiambu,Kibaale,Kibaha,Kibingo,Kiboga,Kibwezi,Kigoma,Kihiihi,Kilifi,Kira,Kiruhura,Kiryandongo,Kisii,Kisoro,Kisumu,Kitale,Kitgum,Kitui,Koboko,Korogwe,Kotido,Kumi,Kyazanga,Kyegegwa,Kyenjojo,Kyotera,Lamu,Langata,Lindi,Lodwar,Lokichoggio,Londiani,Loyangalani,Lugazi,Lukaya,Luweero,Lwakhakha,Lwengo,Lyantonde,Machakos,Mafinga,Makambako,Makindu,Malaba,Malindi,Manafwa,Mandera,Maralal,Marsabit,Masaka,Masindi,MasindiPort,Masulita,Matugga,Mayuge,Mbale,Mbarara,Mbeya,Meru,Mitooma,Mityana,Mombasa,Morogoro,Moroto,Moshi,Moyale,Moyo,Mpanda,Mpigi,Mpondwe,Mtwara,Mubende,Mukono,Mumias,Muranga,Musoma,Mutomo,Mutukula,Mwanza,Nagongera,Nairobi,Naivasha,Nakapiripirit,Nakaseke,Nakasongola,Nakuru,Namanga,Namayingo,Namutumba,Nansana,Nanyuki,Narok,Naromoru,Nebbi,Ngora,Njeru,Njombe,Nkokonjeru,Ntungamo,Nyahururu,Nyeri,Oyam,Pader,Paidha,Pakwach,Pallisa,Rakai,Ruiru,Rukungiri,Rwimi,Sanga,Sembabule,Shimoni,Shinyanga,Singida,Sironko,Songea,Soroti,Ssabagabo,Sumbawanga,Tabora,Takaungu,Tanga,Thika,Tororo,Tunduma,Vihiga,Voi,Wajir,Wakiso,Watamu,Webuye,Wobulenzi,Wote,Wundanyi,Yumbe,Zanzibar"}, {name: "Vietnamese", i: NB.Vietnamese, min: 3, max: 12, d: "", m: 1, b: "An Khe,An Nhon,Ayun Pa,Ba Don,Ba Ria,Bac Giang,Bac Kan,Bac Lieu,Bac Ninh,Bao Loc,Ben Cat,Ben Tre,Bien Hoa,Bim Son,Binh Long,Binh Minh,Buon Ho,Buon Ma Thuot,Ca Mau,Cai Lay,Cam Pha,Cam Ranh,Can Tho,Cao Bang,Cao Lanh,Chau Doc,Chi Linh,Cua Lo,Da Lat,Da Nang,Di An,Dien Ban,Dien Bien Phu,Dong Ha,Dong Hoi,Dong Trieu,Duyen Hai,Gia Nghia,Gia Rai,Go Cong,Ha Giang,Ha Long,Ha Noi,Ha Tinh,Hai Duong,Hai Phong,Hoa Binh,Hoang Mai,Hoi An,Hong Linh,Hong Ngu,Hue,Hung Yen,Huong Thuy,Huong Tra,Kien Tuong,Kon Tum,Ky Anh,La Gi,Lai Chau,Lang Son,Lao Cai,Long Khanh,Long My,Long Xuyen,Mong Cai,Muong Lay,My Hao,My Tho,Nam Dinh,Nga Bay,Nga Nam,Nghia Lo,Nha Trang,Ninh Binh,Ninh Hoa,Phan Rang Thap Cham,Phan Thiet,Pho Yen,Phu Ly,Phu My,Phu Tho,Phuoc Long,Pleiku,Quang Ngai,Quang Tri,Quang Yen,Quy Nhon,Rach Gia,Sa Dec,Sam Son,Soc Trang,Son La,Son Tay,Song Cau,Song Cong,Tam Diep,Tam Ky,Tan An,Tan Chau,Tan Uyen,Tay Ninh,Thai Binh,Thai Hoa,Thai Nguyen,Thanh Hoa,Thu Dau Mot,Thuan An,Tra Vinh,Tu Son,Tuy Hoa,Tuyen Quang,Uong Bi,Vi Thanh,Viet Tri,Vinh,Vinh Chau,Vinh Long,Vinh Yen,Vung Tau,Yen Bai"}, {name: "Cantonese", i: NB.Cantonese, min: 5, max: 11, d: "", m: 0, b: "Chaiwan,Chekham,Cheungshawan,Chingchung,Chinghoi,Chingsen,Chingshing,Chiunam,Chiuon,Chiuyeung,Chiyuen,Choihung,Chuehoi,Chuiman,Chungfa,Chungfu,Chungsan,Chunguktsuen,Dakhing,Daopo,Daumun,Dingwu,Dinpak,Donggun,Dongyuen,Duenchau,Fachau,Fado,Fanling,Fatgong,Fatshan,Fotan,Fuktien,Fumun,Funggong,Funghoi,Fungshun,Fungtei,Gamtin,Gochau,Goming,Gonghoi,Gongshing,Goyiu,Hanghau,Hangmei,Hashan,Hengfachuen,Hengon,Heungchau,Heunggong,Heungkiu,Hingning,Hohfuktong,Hoichue,Hoifung,Hoiping,Hokong,Hokshan,Homantin,Hotin,Hoyuen,Hunghom,Hungshuikiu,Jiuling,Kamping,Kamsheung,Kamwan,Kaulongtong,Keilun,Kinon,Kinsang,Kityeung,Kongmun,Kukgong,Kwaifong,Kwaihing,Kwongchau,Kwongling,Kwongming,Kwuntong,Laichikok,Laiking,Laiwan,Lamtei,Lamtin,Leitung,Leungking,Limkong,Linchau,Linnam,Linping,Linshan,Loding,Lokcheong,Lokfu,Lokmachau,Longchuen,Longgong,Longmun,Longping,Longwa,Longwu,Lowu,Luichau,Lukfung,Lukho,Lungmun,Macheung,Maliushui,Maonshan,Mauming,Maunam,Meifoo,Mingkum,Mogong,Mongkok,Muichau,Muigong,Muiyuen,Naiwai,Namcheong,Namhoi,Namhong,Namo,Namsha,Namshan,Nganwai,Ngchuen,Ngoumun,Ngwa,Nngautaukok,Onting,Pakwun,Paotoishan,Pingshan,Pingyuen,Poklo,Polam,Pongon,Poning,Potau,Puito,Punyue,Saiwanho,Saiyingpun,Samshing,Samshui,Samtsen,Samyuenlei,Sanfung,Sanhing,Sanhui,Sanwai,Sanwui,Seiwui,Shamshuipo,Shanmei,Shantau,Shatin,Shatinwai,Shaukeiwan,Shauking,Shekkipmei,Shekmun,Shekpai,Sheungshui,Shingkui,Shiuhing,Shundak,Shunyi,Shupinwai,Simshing,Siuhei,Siuhong,Siukwan,Siulun,Suikai,Taihing,Taikoo,Taipo,Taishuihang,Taiwai,Taiwo,Taiwohau,Tinhau,Tinho,Tinking,Tinshuiwai,Tiukengleng,Toishan,Tongfong,Tonglowan,Tsakyoochung,Tsamgong,Tsangshing,Tseungkwano,Tsihing,Tsimshatsui,Tsinggong,Tsingshantsuen,Tsingwun,Tsingyi,Tsingyuen,Tsiuchau,Tsuenshekshan,Tsuenwan,Tuenmun,Tungchung,Waichap,Waichau,Waidong,Wailoi,Waishing,Waiyeung,Wanchai,Wanfau,Wanon,Wanshing,Wingon,Wongchukhang,Wongpo,Wongtaisin,Woping,Wukaisha,Yano,Yaumatei,Yauoi,Yautong,Yenfa,Yeungchun,Yeungdong,Yeunggong,Yeungsai,Yeungshan,Yimtin,Yingdak,Yiuping,Yongshing,Yongyuen,Yuenlong,Yuenshing,Yuetsau,Yuknam,Yunping,Yuyuen"}, diff --git a/src/modules/burgs-and-states.js b/src/modules/burgs-and-states.js index be1dba67..190322ea 100644 --- a/src/modules/burgs-and-states.js +++ b/src/modules/burgs-and-states.js @@ -1000,7 +1000,6 @@ window.BurgsAndStates = (function () { } TIME && console.timeEnd("generateDiplomacy"); - //console.table(states.map(s => s.diplomacy)); }; // select a forms for listed or all valid states diff --git a/src/modules/names-generator.js b/src/modules/names-generator.js index 34b07901..21e8e062 100644 --- a/src/modules/names-generator.js +++ b/src/modules/names-generator.js @@ -157,8 +157,7 @@ window.Names = (function () { base = 1; } const min = nameBases[base].min - 1; - const max = Math.max(nameBases[base].max - 2, min); - return getBase(base, min, max, "", 0); + return getBase(base, min, min, "", 0); }; // generate state name based on capital or random name and culture-specific suffix diff --git a/src/scripts/events/onhover.ts b/src/scripts/events/onhover.ts index 8eb166b0..90da1d71 100644 --- a/src/scripts/events/onhover.ts +++ b/src/scripts/events/onhover.ts @@ -197,7 +197,7 @@ const onHoverEventsMap: OnHoverEventMap = { statesLayer: ({packCellId}) => { const stateId = pack.cells.state[packCellId]; const state = pack.states[stateId]; - const stateName = isState(state) ? state.fullName || state.name : state.name; + const stateName = isState(state) ? state.fullName : state.name; const provinceId = pack.cells.province[packCellId]; const provinceName = provinceId ? `${pack.provinces[provinceId].fullName}, ` : ""; diff --git a/src/scripts/generation/pack/burgsAndStates/config.ts b/src/scripts/generation/pack/burgsAndStates/config.ts index 2a198cde..8461ab76 100644 --- a/src/scripts/generation/pack/burgsAndStates/config.ts +++ b/src/scripts/generation/pack/burgsAndStates/config.ts @@ -1,2 +1,108 @@ +import {NAMEBASE as NB} from "config/namebases"; + export const NO_BURG: TNoBurg = {i: 0, name: undefined}; export const NEUTRALS: TNeutrals = {i: 0, name: "Neutrals"}; + +export enum AreaTiers { + DUCHY = 0, + GRAND_DUCHY = 1, + PRINCIPALITY = 2, + KINGDOM = 3, + EMPIRE = 4 +} + +export const StateForms = { + monarchy: ["Duchy", "Grand Duchy", "Principality", "Kingdom", "Empire"] as const, // per area tier + republic: { + Republic: 75, + Federation: 4, + "Trade Company": 4, + "Most Serene Republic": 2, + Oligarchy: 2, + Tetrarchy: 1, + Triumvirate: 1, + Diarchy: 1, + Junta: 1 + }, + union: { + Union: 3, + League: 4, + Confederation: 1, + "United Kingdom": 1, + "United Republic": 1, + "United Provinces": 2, + Commonwealth: 1, + Heptarchy: 1 + }, + theocracy: {Theocracy: 20, Brotherhood: 1, Thearchy: 2, See: 1, "Holy State": 1}, + anarchy: {"Free Territory": 2, Council: 3, Commune: 1, Community: 1} +}; + +type TMonarchyForms = typeof StateForms.monarchy[number]; + +// prettier-ignore +export const culturalMonarchyFormsMap: {[key: number]: {[key in TMonarchyForms]?: string}} = { + [NB.Ruthenian]: {Kingdom: "Tsardom", Empire: "Tsardom"}, + [NB.Greek]: {Duchy: "Despotate", "Grand Duchy": "Despotate"}, + [NB.Japanese]: {"Grand Duchy": "Shogunate", Kingdom: "Shogunate"}, + [NB.Turkish]: {Duchy: "Beylik", "Grand Duchy": "Horde", Principality: "Great Horde", Kingdom: "Khanate", Empire: "Sultanate"}, + [NB.Berber]: {Duchy: "Sheikhdom", "Grand Duchy": "Emirate", Principality: "Emirate", Empire: "Sultanate"}, + [NB.Arabic]: {Duchy: "Sheikhdom", "Grand Duchy": "Emirate", Principality: "Emirate", Empire: "Sultanate"}, + [NB.Iranian]: {Duchy: "Satrapy", "Grand Duchy": "Satrapy", Kingdom: "Shahdom"}, + [NB.Mongolian]: {Duchy: "Horde", "Grand Duchy": "Horde", Principality: "Ulus", Kingdom: "Khanate", Empire: "Khaganate"} +}; + +const Catholic = {Duchy: "Diocese", "Grand Duchy": "Аrchdiocese"}; +const Orthodox = { + Duchy: "Eparchy", + "Grand Duchy": "Eparchy", + Principality: "Exarchate", + Kingdom: "Metropolia", + Empire: "Patriarchate" +}; +const Islamic = { + Duchy: "Imamah", + "Grand Duchy": "Imamah", + Principality: "Imamah", + Kingdom: "Caliphate", + Empire: "Caliphate" +}; + +export const culturalTheocracyFormsMap: {[key: number]: {[key in TMonarchyForms]?: string}} = { + [NB.German]: Catholic, + [NB.English]: Catholic, + [NB.French]: Catholic, + [NB.Italian]: Catholic, + [NB.Castillian]: Catholic, + [NB.Roman]: Catholic, + [NB.Portuguese]: Catholic, + [NB.Ruthenian]: Orthodox, + [NB.Ruthenian]: Orthodox, + [NB.Turkish]: Islamic, + [NB.Nigerian]: Islamic, + [NB.Berber]: Islamic, + [NB.Arabic]: Islamic, + [NB.Iranian]: Islamic, + [NB.Swahili]: Islamic +}; + +// state forms requiring Adjective + Name, all other forms use scheme Form + Of + Name +export const adjectivalForms = [ + "Empire", + "Sultanate", + "Khaganate", + "Shogunate", + "Caliphate", + "Despotate", + "Theocracy", + "Oligarchy", + "Union", + "Confederation", + "Trade Company", + "League", + "Tetrarchy", + "Triumvirate", + "Diarchy", + "Horde", + "Marches" +]; diff --git a/src/scripts/generation/pack/burgsAndStates/createStateData.ts b/src/scripts/generation/pack/burgsAndStates/createStateData.ts index 8e155d81..df1a55a0 100644 --- a/src/scripts/generation/pack/burgsAndStates/createStateData.ts +++ b/src/scripts/generation/pack/burgsAndStates/createStateData.ts @@ -2,14 +2,10 @@ import {TIME} from "config/logging"; import {getInputNumber} from "utils/nodeUtils"; import {rn} from "utils/numberUtils"; import type {createCapitals} from "./createCapitals"; -import {defineStateName} from "./defineStateName"; import {generateStateEmblem} from "./generateStateEmblem"; type TCapitals = ReturnType; -export type TStateData = Pick< - IState, - "i" | "name" | "type" | "culture" | "center" | "expansionism" | "capital" | "coa" ->; +export type TStateData = Pick; export function createStateData(capitals: TCapitals, cultures: TCultures) { TIME && console.time("createStates"); @@ -17,16 +13,15 @@ export function createStateData(capitals: TCapitals, cultures: TCultures) { const powerInput = getInputNumber("powerInput"); const statesData: TStateData[] = capitals.map((capital, index) => { - const {cell: cellId, culture: cultureId, name: capitalName} = capital; + const {cell: cellId, culture: cultureId} = capital; const id = index + 1; - const name = defineStateName(cellId, capitalName, cultureId, cultures); + if (cultureId === 0) throw new Error("Culture id cannot be 0"); const {type, shield} = cultures[cultureId] as ICulture; const expansionism = rn(Math.random() * powerInput + 1, 1); - const coa = generateStateEmblem(type, shield); - return {i: id, name, type, center: cellId, expansionism, capital: id, culture: cultureId, coa}; + return {i: id, type, center: cellId, expansionism, capital: id, culture: cultureId, coa}; }); TIME && console.timeEnd("createStates"); diff --git a/src/scripts/generation/pack/burgsAndStates/defineStateForm.ts b/src/scripts/generation/pack/burgsAndStates/defineStateForm.ts index cb7092fe..e6847c61 100644 --- a/src/scripts/generation/pack/burgsAndStates/defineStateForm.ts +++ b/src/scripts/generation/pack/burgsAndStates/defineStateForm.ts @@ -1,48 +1,12 @@ +import {NAMEBASE} from "config/namebases"; import * as d3 from "d3"; +import {getInputNumber} from "utils/nodeUtils"; +import {P, rand, rw} from "utils/probabilityUtils"; import type {TStateStatistics} from "./collectStatistics"; +import {AreaTiers, culturalMonarchyFormsMap, culturalTheocracyFormsMap, StateForms} from "./config"; -const generic = {Monarchy: 25, Republic: 2, Union: 1}; -const naval = {Monarchy: 25, Republic: 8, Union: 3}; - -const republic = { - Republic: 75, - Federation: 4, - "Trade Company": 4, - "Most Serene Republic": 2, - Oligarchy: 2, - Tetrarchy: 1, - Triumvirate: 1, - Diarchy: 1, - Junta: 1 -}; - -const union = { - Union: 3, - League: 4, - Confederation: 1, - "United Kingdom": 1, - "United Republic": 1, - "United Provinces": 2, - Commonwealth: 1, - Heptarchy: 1 -}; - -const theocracy = {Theocracy: 20, Brotherhood: 1, Thearchy: 2, See: 1, "Holy State": 1}; - -const anarchy = {"Free Territory": 2, Council: 3, Commune: 1, Community: 1}; - -const monarchy = ["Duchy", "Grand Duchy", "Principality", "Kingdom", "Empire"]; // per area tier - -enum AreaTiers { - DUCHY = 0, - GRAND_DUCHY = 1, - PRINCIPALITY = 2, - KINGDOM = 3, - EMPIRE = 4 -} - -// create 5 area tiers, where 4 are the biggest, 0 the smallest +// create 5 area tiers, 4 is the biggest, 0 the smallest export function createAreaTiers(statistics: TStateStatistics) { const stateAreas = Object.entries(statistics) .filter(([id]) => Number(id)) @@ -59,6 +23,80 @@ export function createAreaTiers(statistics: TStateStatistics) { }; } -export function defineStateForm(type: TCultureType, areaTier: AreaTiers) { - return {form: "testForm", formName: "testFormName"}; +export function defineStateForm(type: TCultureType, areaTier: AreaTiers, nameBase: number, burgsNumber: number) { + const form = defineForm(type, areaTier); + const formName = defineFormName(form, nameBase, areaTier, burgsNumber); + + return {form, formName}; +} + +const generic = {Monarchy: 25, Republic: 2, Union: 1}; +const naval = {Monarchy: 6, Republic: 2, Union: 1}; + +function defineForm(type: TCultureType, areaTier: AreaTiers) { + const isAnarchy = P((1 - areaTier / 5) / 100); // [1% - 0.2%] chance + if (isAnarchy) return "Anarchy"; + + // TODO: define Theocracies based on actual religion spread + const religionsNumberModifier = Math.min(getInputNumber("religionsInput") / 10, 2.5); // [0-2.5] + const isTheocracy = P(0.2 * religionsNumberModifier); // [0% - 50%] chance, av. 12% + if (isTheocracy) return "Theocracy"; + + if (type === "Naval") return rw(naval); + + return rw(generic); +} + +function defineFormName( + form: ReturnType, + nameBase: number, + areaTier: AreaTiers, + burgsNumber: number +) { + if (form === "Monarchy") return defineMonarchyForm(nameBase, areaTier); + if (form === "Republic") return defineRepublicForm(areaTier, burgsNumber); + if (form === "Union") return rw(StateForms.union); + if (form === "Theocracy") return defineTheocracyForm(nameBase, areaTier); + if (form === "Anarchy") return rw(StateForms.anarchy); + + return "test"; +} + +// Default name depends on area tier, some name bases have special names for tiers +function defineMonarchyForm(nameBase: number, areaTier: AreaTiers, diplomacy = [""], neighbors = []) { + const form = StateForms.monarchy[areaTier]; + + // TODO: specific names for vassals + const isVassal = diplomacy.includes("Vassal"); + if (isVassal) { + if (areaTier === AreaTiers.DUCHY && neighbors.length > 1 && rand(6) < neighbors.length) return "Marches"; + if (nameBase === NAMEBASE.English && P(0.3)) return "Dominion"; + if (P(0.3)) return "Protectorate"; + } + + if (culturalMonarchyFormsMap[nameBase]) { + const culturalForm = culturalMonarchyFormsMap[nameBase][form]; + if (culturalForm) return culturalForm; + } + + return form; +} + +// Default name is from weighted array, special case for small states with only 1 burg +function defineRepublicForm(areaTier: AreaTiers, burgsNumber: number) { + if (areaTier < AreaTiers.PRINCIPALITY && burgsNumber === 1) return P(0.7) ? "Free City" : "City-state"; + return rw(StateForms.republic); +} + +function defineTheocracyForm(nameBase: number, areaTier: AreaTiers) { + const form = StateForms.monarchy[areaTier]; + + if (P(0.05)) return "Divine " + form; // 5% + + if (culturalTheocracyFormsMap[nameBase]) { + const culturalForm = culturalTheocracyFormsMap[nameBase][form]; + if (culturalForm) return culturalForm; + } + + return rw(StateForms.theocracy); } diff --git a/src/scripts/generation/pack/burgsAndStates/defineStateName.ts b/src/scripts/generation/pack/burgsAndStates/defineStateName.ts index 7c40451c..93e13d77 100644 --- a/src/scripts/generation/pack/burgsAndStates/defineStateName.ts +++ b/src/scripts/generation/pack/burgsAndStates/defineStateName.ts @@ -1,15 +1,22 @@ +import {getAdjective} from "utils/languageUtils"; import {each} from "utils/probabilityUtils"; +import {adjectivalForms} from "./config"; const {Names} = window; -export function defineStateName(cellId: number, capitalName: string, cultureId: number, cultures: TCultures): string { - const useCapitalName = capitalName.length < 9 && each(5)(cellId); - const nameBase = cultures[cultureId].base; +export function defineStateName(center: number, capitalName: string, nameBase: number, formName: string): string { + if (["Free City", "City-state"].includes(formName)) return capitalName; + + const useCapitalName = capitalName.length < 9 && each(5)(center); const basename: string = useCapitalName ? capitalName : Names.getBaseShort(nameBase); return Names.getState(basename, basename); } -export function defineFullStateName(name: string, form: string) { - return `${name} ${form}`; +export function defineFullStateName(name: string, formName: string) { + if (!formName) return name; + if (!name && formName) return "The " + formName; + + const isAdjectival = adjectivalForms.includes(formName) && !/-| /.test(name); + return isAdjectival ? `${getAdjective(name)} ${formName}` : `${formName} of ${name}`; } diff --git a/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts b/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts index b3750328..fc370ff3 100644 --- a/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts +++ b/src/scripts/generation/pack/burgsAndStates/generateBurgsAndStates.ts @@ -10,33 +10,35 @@ import {expandStates} from "./expandStates"; import {specifyBurgs} from "./specifyBurgs"; import {specifyStates} from "./specifyStates"; +type TCellsData = Pick< + IPack["cells"], + | "v" + | "c" + | "p" + | "b" + | "i" + | "g" + | "area" + | "h" + | "f" + | "t" + | "haven" + | "harbor" + | "r" + | "fl" + | "biome" + | "s" + | "pop" + | "culture" +>; + export function generateBurgsAndStates( cultures: TCultures, features: TPackFeatures, temp: Int8Array, rivers: Omit[], vertices: IGraphVertices, - cells: Pick< - IPack["cells"], - | "v" - | "c" - | "p" - | "b" - | "i" - | "g" - | "area" - | "h" - | "f" - | "t" - | "haven" - | "harbor" - | "r" - | "fl" - | "biome" - | "s" - | "pop" - | "culture" - > + cells: TCellsData ): {burgIds: Uint16Array; stateIds: Uint16Array; burgs: TBurgs; states: TStates} { const cellsNumber = cells.i.length; @@ -84,7 +86,7 @@ export function generateBurgsAndStates( const burgIds = assignBurgIds(burgs); const statistics = collectStatistics({...cells, state: stateIds, burg: burgIds}, burgs); - const states = specifyStates(statesData, statistics, stateIds, burgIds); + const states = specifyStates(statesData, statistics, cultures, burgs); return {burgIds, stateIds, burgs, states}; diff --git a/src/scripts/generation/pack/burgsAndStates/specifyStates.ts b/src/scripts/generation/pack/burgsAndStates/specifyStates.ts index f7cb818f..3bc1fbbc 100644 --- a/src/scripts/generation/pack/burgsAndStates/specifyStates.ts +++ b/src/scripts/generation/pack/burgsAndStates/specifyStates.ts @@ -2,7 +2,8 @@ import {TIME} from "config/logging"; import {getColors} from "utils/colorUtils"; import {NEUTRALS} from "./config"; import {createAreaTiers, defineStateForm} from "./defineStateForm"; -import {defineFullStateName} from "./defineStateName"; +import {defineFullStateName, defineStateName} from "./defineStateName"; +import {isBurg} from "utils/typeUtils"; import type {TStateStatistics} from "./collectStatistics"; import type {TStateData} from "./createStateData"; @@ -10,28 +11,35 @@ import type {TStateData} from "./createStateData"; export function specifyStates( statesData: TStateData[], statistics: TStateStatistics, - stateIds: Uint16Array, - burgIds: Uint16Array + cultures: TCultures, + burgs: TBurgs ): TStates { - TIME && console.time("specifyState"); + TIME && console.time("specifyStates"); const colors = getColors(statesData.length); const getAreaTier = createAreaTiers(statistics); + const getNameBase = (cultureId: number) => cultures[cultureId].base; const states: IState[] = statesData.map((stateData, index) => { - const {i, type, name} = stateData; - const {area, ...stats} = statistics[i]; + const {i, center, type, culture, capital} = stateData; + const {area, burgs: burgsNumber, ...stats} = statistics[i]; + const capitalBurg = burgs[capital]; + const capitalName = isBurg(capitalBurg) ? capitalBurg.name : null; + if (!capitalName) throw new Error("State capital is not a burg"); + + const nameBase = getNameBase(culture); const areaTier = getAreaTier(area); - const {form, formName} = defineStateForm(type, areaTier); - const fullName = defineFullStateName(name, form); + const {form, formName} = defineStateForm(type, areaTier, nameBase, burgsNumber); + const name = defineStateName(center, capitalName, nameBase, formName); + const fullName = defineFullStateName(name, formName); const color = colors[index]; - const state: IState = {...stateData, form, formName, fullName, color, area, ...stats}; + const state: IState = {name, ...stateData, form, formName, fullName, color, area, burgs: burgsNumber, ...stats}; return state; }); - TIME && console.timeEnd("specifyState"); + TIME && console.timeEnd("specifyStates"); return [NEUTRALS, ...states]; }