From 8a6108e203fcdab4de1b6509b3637f048de470ef Mon Sep 17 00:00:00 2001 From: Azgaar Date: Sun, 29 Dec 2019 19:24:10 +0300 Subject: [PATCH] v1.22.33 --- main.js | 2 +- modules/cultures-generator.js | 349 +++++++++++++++++---------------- modules/religions-generator.js | 2 +- modules/ui/cultures-editor.js | 1 + modules/ui/diplomacy-editor.js | 12 +- 5 files changed, 186 insertions(+), 180 deletions(-) diff --git a/main.js b/main.js index d4447a31..46d35076 100644 --- a/main.js +++ b/main.js @@ -288,7 +288,7 @@ function findBurgForMFCG(params) { function applyDefaultBiomesSystem() { const name = ["Marine","Hot desert","Cold desert","Savanna","Grassland","Tropical seasonal forest","Temperate deciduous forest","Tropical rainforest","Temperate rainforest","Taiga","Tundra","Glacier","Wetland"]; const color = ["#53679f","#fbe79f","#b5b887","#d2d082","#c8d68f","#b6d95d","#29bc56","#7dcb35","#409c43","#4b6b32","#96784b","#d5e7eb","#0b9131"]; - const habitability = [0,2,5,20,30,50,100,80,90,10,2,0,12]; + const habitability = [0,4,10,22,30,50,100,80,90,12,4,0,12]; const iconsDensity = [0,3,2,120,120,120,120,150,150,100,5,0,150]; const icons = [{},{dune:3, cactus:6, deadTree:1},{dune:9, deadTree:1},{acacia:1, grass:9},{grass:1},{acacia:8, palm:1},{deciduous:1},{acacia:5, palm:3, deciduous:1, swamp:1},{deciduous:6, swamp:1},{conifer:1},{grass:1},{},{swamp:1}]; const cost = [10,200,150,60,50,70,70,80,90,80,100,255,150]; // biome movement cost diff --git a/modules/cultures-generator.js b/modules/cultures-generator.js index 34209404..cf18c94b 100644 --- a/modules/cultures-generator.js +++ b/modules/cultures-generator.js @@ -10,9 +10,9 @@ console.time('generateCultures'); cells = pack.cells; cells.culture = new Uint16Array(cells.i.length); // cell cultures - let count = +culturesInput.value; + let count = Math.min(+culturesInput.value, +culturesSet.selectedOptions[0].dataset.max); - const populated = cells.i.filter(i => cells.s[i]).sort((a, b) => cells.s[b] - cells.s[a]); // cells sorted by population + const populated = cells.i.filter(i => cells.s[i]); // populated cells if (populated.length < count * 25) { count = Math.floor(populated.length / 50); if (!count) { @@ -42,19 +42,28 @@ const centers = d3.quadtree(); const colors = getColors(count); - cultures.forEach(function(culture, i) { - const c = culture.center = placeCultureCenter(); - centers.add(cells.p[c]); - culture.i = i+1; - delete culture.odd; - culture.color = colors[i]; - culture.type = defineCultureType(c); - culture.expansionism = defineCultureExpansionism(culture.type); - culture.origin = 0; - culture.code = getCode(culture.name); - cells.culture[c] = i+1; + cultures.forEach(function(c, i) { + const cell = c.center = placeCenter(c.sort ? c.sort : (i) => cells.s[i]); + centers.add(cells.p[cell]); + c.i = i+1; + delete c.odd; + delete c.sort; + c.color = colors[i]; + c.type = defineCultureType(cell); + c.expansionism = defineCultureExpansionism(c.type); + c.origin = 0; + c.code = getCode(c.name); + cells.culture[cell] = i+1; }); + function placeCenter(v) { + let c, spacing = (graphWidth + graphHeight) / 2 / count; + const sorted = [...populated].sort((a, b) => v(b) - v(a)), max = Math.floor(sorted.length / 2); + do {c = sorted[biased(0, max, 5)]; spacing *= .9;} + while (centers.find(cells.p[c][0], cells.p[c][1], spacing) !== undefined); + return c; + } + // the first culture with id 0 is for wildlands cultures.unshift({name:"Wildlands", i:0, base:1, origin:null}); @@ -76,27 +85,15 @@ return cultures; } - // culture center tends to be placed in a density populated cell - function placeCultureCenter() { - let center, spacing = (graphWidth + graphHeight) / count; - do { - center = populated[biased(0, populated.length-1, 3)]; - spacing = spacing * .8; - } - while (centers.find(cells.p[center][0], cells.p[center][1], spacing) !== undefined); - return center; - } - // set culture type based on culture center position function defineCultureType(i) { + if (cells.h[i] < 70 && [1,2,4].includes(cells.biome[i])) return "Nomadic"; // high penalty in forest biomes and near coastline if (cells.h[i] > 50) return "Highland"; // no penalty for hills and moutains, high for other elevations - const f = pack.features[cells.f[cells.haven[i]]]; // feature - if (f.type === "lake" && f.cells > 5) return "Lake" // low water cross penalty and high for non-along-coastline growth - if ((f.cells < 10 && cells.harbor[i]) || (cells.harbor[i] === 1 && P(.5))) return "Naval"; // low water cross penalty and high for non-along-coastline growth + const f = pack.features[cells.f[cells.haven[i]]]; // opposite feature + if (f.type === "lake" && f.cells > 5) return "Lake" // low water cross penalty and high for growth not along coastline + if (cells.harbor[i] && f.type !== "lake" && P(.1) || (cells.harbor[i] === 1 && P(.6)) || (pack.features[cells.f[i]].group === "isle" && P(.4))) return "Naval"; // low water cross penalty and high for non-along-coastline growth if (cells.r[i] && cells.fl[i] > 100) return "River"; // no River cross penalty, penalty for non-River growth - const b = cells.biome[i]; - if (b === 4 || b === 1 || b === 2) return "Nomadic"; // high penalty in forest biomes and near coastline - if (b === 3 || b === 9 || b === 10) return "Hunting"; // high penalty in non-native biomes + if (cells.t[i] > 2 && [3,7,8,9,10,12].includes(cells.biome[i])) return "Hunting"; // high penalty in non-native biomes return "Generic"; } @@ -145,41 +142,49 @@ } const getDefault = function(count) { + // generic sorting functions + const cells = pack.cells, s = cells.s, sMax = d3.max(s), t = cells.t, h = cells.h, temp = grid.cells.temp; + const n = cell => Math.ceil(s[cell] / sMax * 3) // normalized cell score + const td = (cell, goal) => {const d = Math.abs(temp[cells.g[cell]] - goal); return d ? d+1 : 1;} // temperature difference fee + const bd = (cell, biomes, fee = 4) => biomes.includes(cells.biome[cell]) ? 1 : fee; // biome difference fee + const sf = (cell, fee = 4) => cells.haven[cell] && pack.features[cells.f[cells.haven[cell]]].type !== "lake" ? 1 : fee; // not on sea coast fee + // https://en.wikipedia.org/wiki/List_of_cities_by_average_temperature + if (culturesSet.value === "european") { return [ - {name:"Shwazen", base:0, odd: 1}, - {name:"Angshire", base:1, odd: 1}, - {name:"Luari", base:2, odd: 1}, - {name:"Tallian", base:3, odd: 1}, - {name:"Astellian", base:4, odd: 1}, - {name:"Slovan", base:5, odd: 1}, - {name:"Norse", base:6, odd: 1}, - {name:"Elladan", base:7, odd: 1}, - {name:"Romian", base:8, odd: .2}, - {name:"Soumi", base:9, odd: 1}, - {name:"Portuzian", base:13, odd: 1}, - {name:"Vengrian", base: 15, odd: 1}, - {name:"Turchian", base: 16, odd: .05}, - {name:"Euskati", base: 20, odd: .05}, - {name:"Keltan", base: 22, odd: .05} + {name:"Shwazen", base:0, odd: 1, sort: i => n(i) / td(i, 10) / bd(i, [6, 8])}, + {name:"Angshire", base:1, odd: 1, sort: i => n(i) / td(i, 10) / sf(i)}, + {name:"Luari", base:2, odd: 1, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])}, + {name:"Tallian", base:3, odd: 1, sort: i => n(i) / td(i, 15)}, + {name:"Astellian", base:4, odd: 1, sort: i => n(i) / td(i, 16)}, + {name:"Slovan", base:5, odd: 1, sort: i => n(i) / td(i, 6) * t[i]}, + {name:"Norse", base:6, odd: 1, sort: i => n(i) / td(i, 5)}, + {name:"Elladan", base:7, odd: 1, sort: i => n(i) / td(i, 18) * h[i]}, + {name:"Romian", base:8, odd: .2, sort: i => n(i) / td(i, 15) / t[i]}, + {name:"Soumi", base:9, odd: 1, sort: i => n(i) / td(i, 5) / bd(i, [9]) * t[i]}, + {name:"Portuzian", base:13, odd: 1, sort: i => n(i) / td(i, 17) / sf(i)}, + {name:"Vengrian", base: 15, odd: 1, sort: i => n(i) / td(i, 11) / bd(i, [4]) * t[i]}, + {name:"Turchian", base: 16, odd: .05, sort: i => n(i) / td(i, 14)}, + {name:"Euskati", base: 20, odd: .05, sort: i => n(i) / td(i, 15) * h[i]}, + {name:"Keltan", base: 22, odd: .05, sort: i => n(i) / td(i, 11) / bd(i, [6, 8]) * t[i]} ]; } if (culturesSet.value === "oriental") { return [ - {name:"Koryo", base:10, odd: 1}, - {name:"Hantzu", base:11, odd: 1}, - {name:"Yamoto", base:12, odd: 1}, - {name:"Turchian", base: 16, odd: 1}, - {name:"Berberan", base: 17, odd: .2}, - {name:"Eurabic", base: 18, odd: 1}, - {name:"Efratic", base: 23, odd: .1}, - {name:"Tehrani", base: 24, odd: 1}, - {name:"Maui", base: 25, odd: .2}, - {name:"Carnatic", base: 26, odd: .5}, - {name:"Vietic", base: 29, odd: .8}, - {name:"Guantzu", base:30, odd: .5}, - {name:"Ulus", base:31, odd: 1} + {name:"Koryo", base:10, odd: 1, sort: i => n(i) / td(i, 12) / t[i]}, + {name:"Hantzu", base:11, odd: 1, sort: i => n(i) / td(i, 13)}, + {name:"Yamoto", base:12, odd: 1, sort: i => n(i) / td(i, 15) / t[i]}, + {name:"Turchian", base: 16, odd: 1, sort: i => n(i) / td(i, 12)}, + {name:"Berberan", base: 17, odd: .2, sort: i => n(i) / td(i, 19) / bd(i, [1, 2, 3], 7) * t[i]}, + {name:"Eurabic", base: 18, odd: 1, sort: i => n(i) / td(i, 26) / bd(i, [1, 2], 7) * t[i]}, + {name:"Efratic", base: 23, odd: .1, sort: i => n(i) / td(i, 22) * t[i]}, + {name:"Tehrani", base: 24, odd: 1, sort: i => n(i) / td(i, 18) * h[i]}, + {name:"Maui", base: 25, odd: .2, sort: i => n(i) / td(i, 24) / sf(i) / t[i]}, + {name:"Carnatic", base: 26, odd: .5, sort: i => n(i) / td(i, 26)}, + {name:"Vietic", base: 29, odd: .8, sort: i => n(i) / td(i, 25) / bd(i, [7], 7) / t[i]}, + {name:"Guantzu", base:30, odd: .5, sort: i => n(i) / td(i, 17)}, + {name:"Ulus", base:31, odd: 1, sort: i => n(i) / td(i, 5) / bd(i, [2, 4, 10], 7) * t[i]} ]; } @@ -201,106 +206,106 @@ if (culturesSet.value === "antique") { return [ - {name:"Roman", base:8, odd: 1}, - {name:"Roman", base:8, odd: 1}, - {name:"Roman", base:8, odd: 1}, - {name:"Roman", base:8, odd: 1}, - {name:"Hellenic", base:7, odd: 1}, // Greek - {name:"Hellenic", base:7, odd: 1}, // Greek - {name:"Macedonian", base:7, odd: .5}, // Greek - {name:"Celtic", base:22, odd: 1}, - {name:"Germanic", base:0, odd: 1}, - {name:"Persian", base:24, odd: .8}, // Iranian - {name:"Scythian", base:24, odd: .5}, // Iranian - {name:"Cantabrian", base: 20, odd: .5}, // Basque - {name:"Estian", base: 9, odd: .2}, // Finnic - {name:"Carthaginian", base: 17, odd: .3}, // Berber (the closest we have) - {name:"Mesopotamian", base: 23, odd: .2} // Mesopotamian + {name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 14) / t[i]}, // Roman + {name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 15) / sf(i)}, // Roman + {name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 16) / sf(i)}, // Roman + {name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 17) / t[i]}, // Roman + {name:"Hellenic", base:7, odd: 1, sort: i => n(i) / td(i, 18) / sf(i) * h[i]}, // Greek + {name:"Hellenic", base:7, odd: 1, sort: i => n(i) / td(i, 19) / sf(i) * h[i]}, // Greek + {name:"Macedonian", base:7, odd: .5, sort: i => n(i) / td(i, 12) * h[i]}, // Greek + {name:"Celtic", base:22, odd: 1, sort: i => n(i) / td(i, 11) ** .5 / bd(i, [6, 8])}, + {name:"Germanic", base:0, odd: 1, sort: i => n(i) / td(i, 10) ** .5 / bd(i, [6, 8])}, + {name:"Persian", base:24, odd: .8, sort: i => n(i) / td(i, 18) * h[i]}, // Iranian + {name:"Scythian", base:24, odd: .5, sort: i => n(i) / td(i, 11) ** .5 / bd(i, [4])}, // Iranian + {name:"Cantabrian", base: 20, odd: .5, sort: i => n(i) / td(i, 16) * h[i]}, // Basque + {name:"Estian", base: 9, odd: .2, sort: i => n(i) / td(i, 5) * t[i]}, // Finnic + {name:"Carthaginian", base: 17, odd: .3, sort: i => n(i) / td(i, 19) / sf(i)}, // Berber + {name:"Mesopotamian", base: 23, odd: .2, sort: i => n(i) / td(i, 22) / bd(i, [1, 2, 3])} // Mesopotamian ]; } if (culturesSet.value === "highFantasy") { return [ // fantasy races - {name:"Quenian", base: 33, odd: 1}, // Elves - {name:"Eldar", base: 33, odd: 1}, // Elves - {name:"Lorian", base: 33, odd: .5}, // Elves - {name:"Trow", base: 34, odd: .9}, // Dark Elves - {name:"Dokalfar", base: 34, odd: .3}, // Dark Elves - {name:"Durinn", base: 35, odd: 1}, // Dwarven - {name:"Khazadur", base: 35, odd: 1}, // Dwarven - {name:"Kobblin", base: 36, odd: 1}, // Goblin - {name:"Uruk", base: 37, odd: 1}, // Orc - {name:"Ugluk", base: 37, odd: .7}, // Orc - {name:"Yotunn", base: 38, odd: .9}, // Giant - {name:"Drake", base: 39, odd: .7}, // Draconic - {name:"Rakhnid", base: 40, odd: .9}, // Arachnid - {name:"Aj'Snaga", base: 41, odd: .9}, // Serpents + {name:"Quenian", base: 33, odd: 1, sort: i => n(i) / bd(i, [6,7,8,9], 10) * t[i]}, // Elves + {name:"Eldar", base: 33, odd: 1, sort: i => n(i) / bd(i, [6,7,8,9], 10) * t[i]}, // Elves + {name:"Lorian", base: 33, odd: .5, sort: i => n(i) / bd(i, [6,7,8,9], 10)}, // Elves + {name:"Trow", base: 34, odd: .9, sort: i => n(i) / bd(i, [7,8,9,12], 10) * t[i]}, // Dark Elves + {name:"Dokalfar", base: 34, odd: .3, sort: i => n(i) / bd(i, [7,8,9,12], 10) * t[i]}, // Dark Elves + {name:"Durinn", base: 35, odd: 1, sort: i => n(i) + h[i]}, // Dwarven + {name:"Khazadur", base: 35, odd: 1, sort: i => n(i) + h[i]}, // Dwarven + {name:"Kobblin", base: 36, odd: 1, sort: i => t[i] - s[i]}, // Goblin + {name:"Uruk", base: 37, odd: 1, sort: i => h[i] * t[i]}, // Orc + {name:"Ugluk", base: 37, odd: .7, sort: i => h[i] * t[i] / bd(i, [1,2,10,11])}, // Orc + {name:"Yotunn", base: 38, odd: .9, sort: i => td(i, -10)}, // Giant + {name:"Drake", base: 39, odd: .7, sort: i => -s[i]}, // Draconic + {name:"Rakhnid", base: 40, odd: .9, sort: i => t[i] - s[i]}, // Arachnid + {name:"Aj'Snaga", base: 41, odd: .9, sort: i => n(i) / bd(i, [12], 10)}, // Serpents // common fantasy human - {name:"Gozdor", base:32, odd: 1}, - {name:"Anor", base:32, odd: 1}, - {name:"Dail", base:32, odd: 1}, - {name:"Duland", base:32, odd: 1}, - {name:"Rohand", base:32, odd: 1}, + {name:"Gozdor", base:32, odd: 1, sort: i => n(i) / td(i, 18)}, + {name:"Anor", base:32, odd: 1, sort: i => n(i) / td(i, 10)}, + {name:"Dail", base:32, odd: 1, sort: i => n(i) / td(i, 13)}, + {name:"Duland", base:32, odd: 1, sort: i => n(i) / td(i, 14)}, + {name:"Rohand", base:32, odd: 1, sort: i => n(i) / td(i, 16)}, // rare real-world western - {name:"Norse", base:6, odd: .5}, - {name:"Izenlute", base:0, odd: .1}, - {name:"Lurian", base:2, odd: .1}, - {name:"Getalian", base:3, odd: .1}, - {name:"Astelan", base:4, odd: .05}, + {name:"Norse", base:6, odd: .5, sort: i => n(i) / td(i, 5) / sf(i)}, + {name:"Izenlute", base:0, odd: .1, sort: i => n(i) / td(i, 5)}, + {name:"Lurian", base:2, odd: .1, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])}, + {name:"Getalian", base:3, odd: .1, sort: i => n(i) / td(i, 15)}, + {name:"Astelan", base:4, odd: .05, sort: i => n(i) / td(i, 16)}, // rare real-world exotic - {name:"Yoruba", base:21, odd: .05}, - {name:"Ryoko", base:10, odd: .05}, - {name:"Toyamo", base:12, odd: .05}, - {name:"Guan-Tsu", base:30, odd: .05}, - {name:"Ulus-Khan", base:31, odd: .05}, - {name:"Turan", base: 16, odd: .05}, - {name:"Al'Uma", base: 18, odd: .05}, - {name:"Druidas", base: 22, odd: .05}, - {name:"Gorodian", base:5, odd: .05} + {name:"Yoruba", base:21, odd: .05, sort: i => n(i) / td(i, 15) / bd(i, [5, 7])}, + {name:"Ryoko", base:10, odd: .05, sort: i => n(i) / td(i, 12) / t[i]}, + {name:"Toyamo", base:12, odd: .05, sort: i => n(i) / td(i, 15) / t[i]}, + {name:"Guan-Tsu", base:30, odd: .05, sort: i => n(i) / td(i, 17)}, + {name:"Ulus-Khan", base:31, odd: .05, sort: i => n(i) / td(i, 5) / bd(i, [2, 4, 10], 7) * t[i]}, + {name:"Turan", base: 16, odd: .05, sort: i => n(i) / td(i, 13)}, + {name:"Al'Uma", base: 18, odd: .05, sort: i => n(i) / td(i, 26) / bd(i, [1, 2], 7) * t[i]}, + {name:"Druidas", base: 22, odd: .05, sort: i => n(i) / td(i, 11) / bd(i, [6, 8]) * t[i]}, + {name:"Gorodian", base:5, odd: .05, sort: i => n(i) / td(i, 6) * t[i]} ]; } if (culturesSet.value === "darkFantasy") { return [ // common real-world English - {name:"Angshire", base:1, odd: 1}, - {name:"Enlandic", base:1, odd: 1}, - {name:"Westen", base:1, odd: 1}, - {name:"Nortumbic", base:1, odd: 1}, - {name:"Mercian", base:1, odd: 1}, - {name:"Kentian", base:1, odd: 1}, + {name:"Angshire", base:1, odd: 1, sort: i => n(i) / td(i, 10) / sf(i)}, + {name:"Enlandic", base:1, odd: 1, sort: i => n(i) / td(i, 12)}, + {name:"Westen", base:1, odd: 1, sort: i => n(i) / td(i, 10)}, + {name:"Nortumbic", base:1, odd: 1, sort: i => n(i) / td(i, 7)}, + {name:"Mercian", base:1, odd: 1, sort: i => n(i) / td(i, 9)}, + {name:"Kentian", base:1, odd: 1, sort: i => n(i) / td(i, 12)}, // rare real-world western - {name:"Norse", base:6, odd: .7}, - {name:"Schwarzen", base:0, odd: .3}, - {name:"Luarian", base:2, odd: .3}, - {name:"Hetallian", base:3, odd: .3}, - {name:"Astellian", base:4, odd: .3}, + {name:"Norse", base:6, odd: .7, sort: i => n(i) / td(i, 5) / sf(i)}, + {name:"Schwarzen", base:0, odd: .3, sort: i => n(i) / td(i, 10) / bd(i, [6, 8])}, + {name:"Luarian", base:2, odd: .3, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])}, + {name:"Hetallian", base:3, odd: .3, sort: i => n(i) / td(i, 15)}, + {name:"Astellian", base:4, odd: .3, sort: i => n(i) / td(i, 16)}, // rare real-world exotic - {name:"Kiswaili", base:28, odd: .05}, - {name:"Yoruba", base:21, odd: .05}, - {name:"Koryo", base:10, odd: .05}, - {name:"Hantzu", base:11, odd: .05}, - {name:"Yamoto", base:12, odd: .05}, - {name:"Guantzu", base:30, odd: .05}, - {name:"Ulus", base:31, odd: .05}, - {name:"Turan", base: 16, odd: .05}, - {name:"Berberan", base: 17, odd: .05}, - {name:"Eurabic", base: 18, odd: .05}, - {name:"Slovan", base:5, odd: .05}, - {name:"Keltan", base: 22, odd: .1}, - {name:"Elladan", base:7, odd: .2}, - {name:"Romian", base:8, odd: .2}, + {name:"Kiswaili", base:28, odd: .05, sort: i => n(i) / td(i, 29) / bd(i, [1, 3, 5, 7])}, + {name:"Yoruba", base:21, odd: .05, sort: i => n(i) / td(i, 15) / bd(i, [5, 7])}, + {name:"Koryo", base:10, odd: .05, sort: i => n(i) / td(i, 12) / t[i]}, + {name:"Hantzu", base:11, odd: .05, sort: i => n(i) / td(i, 13)}, + {name:"Yamoto", base:12, odd: .05, sort: i => n(i) / td(i, 15) / t[i]}, + {name:"Guantzu", base:30, odd: .05, sort: i => n(i) / td(i, 17)}, + {name:"Ulus", base:31, odd: .05, sort: i => n(i) / td(i, 5) / bd(i, [2, 4, 10], 7) * t[i]}, + {name:"Turan", base: 16, odd: .05, sort: i => n(i) / td(i, 12)}, + {name:"Berberan", base: 17, odd: .05, sort: i => n(i) / td(i, 19) / bd(i, [1, 2, 3], 7) * t[i]}, + {name:"Eurabic", base: 18, odd: .05, sort: i => n(i) / td(i, 26) / bd(i, [1, 2], 7) * t[i]}, + {name:"Slovan", base:5, odd: .05, sort: i => n(i) / td(i, 6) * t[i]}, + {name:"Keltan", base: 22, odd: .1, sort: i => n(i) / td(i, 11) ** .5 / bd(i, [6, 8])}, + {name:"Elladan", base:7, odd: .2, sort: i => n(i) / td(i, 18) / sf(i) * h[i]}, + {name:"Romian", base:8, odd: .2, sort: i => n(i) / td(i, 14) / t[i]}, // fantasy races - {name:"Eldar", base: 33, odd: .5}, // Elves - {name:"Trow", base: 34, odd: .8}, // Dark Elves - {name:"Durinn", base: 35, odd: .8}, // Dwarven - {name:"Kobblin", base: 36, odd: .8}, // Goblin - {name:"Uruk", base: 37, odd: .8}, // Orc - {name:"Yotunn", base: 38, odd: .8}, // Giant - {name:"Drake", base: 39, odd: .9}, // Draconic - {name:"Rakhnid", base: 40, odd: .9}, // Arachnid - {name:"Aj'Snaga", base: 41, odd: .9}, // Serpents + {name:"Eldar", base: 33, odd: .5, sort: i => n(i) / bd(i, [6,7,8,9], 10) * t[i]}, // Elves + {name:"Trow", base: 34, odd: .8, sort: i => n(i) / bd(i, [7,8,9,12], 10) * t[i]}, // Dark Elves + {name:"Durinn", base: 35, odd: .8, sort: i => n(i) + h[i]}, // Dwarven + {name:"Kobblin", base: 36, odd: .8, sort: i => t[i] - s[i]}, // Goblin + {name:"Uruk", base: 37, odd: .8, sort: i => h[i] * t[i] / bd(i, [1,2,10,11])}, // Orc + {name:"Yotunn", base: 38, odd: .8, sort: i => td(i, -10)}, // Giant + {name:"Drake", base: 39, odd: .9, sort: i => -s[i]}, // Draconic + {name:"Rakhnid", base: 40, odd: .9, sort: i => t[i] - s[i]}, // Arachnid + {name:"Aj'Snaga", base: 41, odd: .9, sort: i => n(i) / bd(i, [12], 10)}, // Serpents ] } @@ -313,38 +318,38 @@ // all-world return [ - {name:"Shwazen", base:0, odd: .7}, - {name:"Angshire", base:1, odd: 1}, - {name:"Luari", base:2, odd: .6}, - {name:"Tallian", base:3, odd: .6}, - {name:"Astellian", base:4, odd: .6}, - {name:"Slovan", base:5, odd: .7}, - {name:"Norse", base:6, odd: .7}, - {name:"Elladan", base:7, odd: .7}, - {name:"Romian", base:8, odd: .7}, - {name:"Soumi", base:9, odd: .3}, - {name:"Koryo", base:10, odd: .1}, - {name:"Hantzu", base:11, odd: .1}, - {name:"Yamoto", base:12, odd: .1}, - {name:"Portuzian", base:13, odd: .4}, - {name:"Nawatli", base:14, odd: .1}, - {name:"Vengrian", base: 15, odd: .2}, - {name:"Turchian", base: 16, odd: .2}, - {name:"Berberan", base: 17, odd: .1}, - {name:"Eurabic", base: 18, odd: .2}, - {name:"Inuk", base: 19, odd: .05}, - {name:"Euskati", base: 20, odd: .05}, - {name:"Yoruba", base: 21, odd: .05}, - {name:"Keltan", base: 22, odd: .05}, - {name:"Efratic", base: 23, odd: .05}, - {name:"Tehrani", base: 24, odd: .1}, - {name:"Maui", base: 25, odd: .05}, - {name:"Carnatic", base: 26, odd: .05}, - {name:"Inqan", base: 27, odd: .05}, - {name:"Kiswaili", base: 28, odd: .1}, - {name:"Vietic", base: 29, odd: .1}, - {name:"Guantzu", base:30, odd: .1}, - {name:"Ulus", base:31, odd: .1} + {name:"Shwazen", base:0, odd: .7, sort: i => n(i) / td(i, 10) / bd(i, [6, 8])}, + {name:"Angshire", base:1, odd: 1, sort: i => n(i) / td(i, 10) / sf(i)}, + {name:"Luari", base:2, odd: .6, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])}, + {name:"Tallian", base:3, odd: .6, sort: i => n(i) / td(i, 15)}, + {name:"Astellian", base:4, odd: .6, sort: i => n(i) / td(i, 16)}, + {name:"Slovan", base:5, odd: .7, sort: i => n(i) / td(i, 6) * t[i]}, + {name:"Norse", base:6, odd: .7, sort: i => n(i) / td(i, 5)}, + {name:"Elladan", base:7, odd: .7, sort: i => n(i) / td(i, 18) * h[i]}, + {name:"Romian", base:8, odd: .7, sort: i => n(i) / td(i, 15)}, + {name:"Soumi", base:9, odd: .3, sort: i => n(i) / td(i, 5) / bd(i, [9]) * t[i]}, + {name:"Koryo", base:10, odd: .1, sort: i => n(i) / td(i, 12) / t[i]}, + {name:"Hantzu", base:11, odd: .1, sort: i => n(i) / td(i, 13)}, + {name:"Yamoto", base:12, odd: .1, sort: i => n(i) / td(i, 15) / t[i]}, + {name:"Portuzian", base:13, odd: .4, sort: i => n(i) / td(i, 17) / sf(i)}, + {name:"Nawatli", base:14, odd: .1, sort: i => h[i] / td(i, 18) / bd(i, [7])}, + {name:"Vengrian", base: 15, odd: .2, sort: i => n(i) / td(i, 11) / bd(i, [4]) * t[i]}, + {name:"Turchian", base: 16, odd: .2, sort: i => n(i) / td(i, 13)}, + {name:"Berberan", base: 17, odd: .1, sort: i => n(i) / td(i, 19) / bd(i, [1, 2, 3], 7) * t[i]}, + {name:"Eurabic", base: 18, odd: .2, sort: i => n(i) / td(i, 26) / bd(i, [1, 2], 7) * t[i]}, + {name:"Inuk", base: 19, odd: .05, sort: i => td(i, -1) / bd(i, [10, 11]) / sf(i)}, + {name:"Euskati", base: 20, odd: .05, sort: i => n(i) / td(i, 15) * h[i]}, + {name:"Yoruba", base: 21, odd: .05, sort: i => n(i) / td(i, 15) / bd(i, [5, 7])}, + {name:"Keltan", base: 22, odd: .05, sort: i => n(i) / td(i, 11) / bd(i, [6, 8]) * t[i]}, + {name:"Efratic", base: 23, odd: .05, sort: i => n(i) / td(i, 22) * t[i]}, + {name:"Tehrani", base: 24, odd: .1, sort: i => n(i) / td(i, 18) * h[i]}, + {name:"Maui", base: 25, odd: .05, sort: i => n(i) / td(i, 24) / sf(i) / t[i]}, + {name:"Carnatic", base: 26, odd: .05, sort: i => n(i) / td(i, 26)}, + {name:"Inqan", base: 27, odd: .05, sort: i => h[i] / td(i, 13)}, + {name:"Kiswaili", base: 28, odd: .1, sort: i => n(i) / td(i, 29) / bd(i, [1, 3, 5, 7])}, + {name:"Vietic", base: 29, odd: .1, sort: i => n(i) / td(i, 25) / bd(i, [7], 7) / t[i]}, + {name:"Guantzu", base:30, odd: .1, sort: i => n(i) / td(i, 17)}, + {name:"Ulus", base:31, odd: .1, sort: i => n(i) / td(i, 5) / bd(i, [2, 4, 10], 7) * t[i]} ]; } diff --git a/modules/religions-generator.js b/modules/religions-generator.js index b5d35ff6..096b3260 100644 --- a/modules/religions-generator.js +++ b/modules/religions-generator.js @@ -21,7 +21,7 @@ const base = { number: ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve"], being: ["God", "Goddess", "Lord", "Lady", "Deity", "Creator", "Maker", "Overlord", "Ruler", "Chief", "Master", "Spirit", "Ancestor", "Father", "Forebear", "Forefather", "Mother", "Brother", "Sister", "Elder", "Numen", "Ancient", "Virgin", "Giver", "Council", "Guardian", "Reaper"], - animal: ["Antelope", "Ape", "Badger", "Bear", "Beaver", "Bison", "Boar", "Buffalo", "Cat", "Cobra", "Crane", "Crocodile", "Crow", "Deer", "Dog", "Eagle", "Elk", "Fox", "Goat", "Goose", "Hare", "Hawk", "Heron", "Horse", "Hyena", "Ibis", "Jackal", "Jaguar", "Lark", "Leopard", "Lion", "Mantis", "Marten", "Moose", "Mule", "Narwhal", "Owl", "Panther", "Rat", "Raven", "Rook", "Scorpion", "Shark", "Sheep", "Snake", "Spider", "Swan", "Tiger", "Turtle", "Viper", "Vulture", "Walrus", "Wolf", "Wolverine", "Worm", "Camel", "Falcon", "Hound", "Ox", "Serpent"], + animal: ["Dragon", "Wyvern", "Phoenix", "Unicorn", "Sphinx", "Centaur", "Pegasus", "Kraken", "Basilisk", "Chimera", "Cyclope", "Antelope", "Ape", "Badger", "Bear", "Beaver", "Bison", "Boar", "Buffalo", "Cat", "Cobra", "Crane", "Crocodile", "Crow", "Deer", "Dog", "Eagle", "Elk", "Fox", "Goat", "Goose", "Hare", "Hawk", "Heron", "Horse", "Hyena", "Ibis", "Jackal", "Jaguar", "Lark", "Leopard", "Lion", "Mantis", "Marten", "Moose", "Mule", "Narwhal", "Owl", "Panther", "Rat", "Raven", "Rook", "Scorpion", "Shark", "Sheep", "Snake", "Spider", "Swan", "Tiger", "Turtle", "Viper", "Vulture", "Walrus", "Wolf", "Wolverine", "Worm", "Camel", "Falcon", "Hound", "Ox", "Serpent"], adjective: ["New", "Good", "High", "Old", "Great", "Big", "Young", "Major", "Strong", "Happy", "Last", "Main", "Huge", "Far", "Beautiful", "Wild", "Fair", "Prime", "Crazy", "Ancient", "Proud", "Secret", "Lucky", "Sad", "Silent", "Latter", "Severe", "Fat", "Holy", "Pure", "Aggressive", "Honest", "Giant", "Mad", "Pregnant", "Distant", "Lost", "Broken", "Blind", "Friendly", "Unknown", "Sleeping", "Slumbering", "Loud", "Hungry", "Wise", "Worried", "Sacred", "Magical", "Superior", "Patient", "Dead", "Deadly", "Peaceful", "Grateful", "Frozen", "Evil", "Scary", "Burning", "Divine", "Bloody", "Dying", "Waking", "Brutal", "Unhappy", "Calm", "Cruel", "Favorable", "Blond", "Explicit", "Disturbing", "Devastating", "Brave", "Sunny", "Troubled", "Flying", "Sustainable", "Marine", "Fatal", "Inherent", "Selected", "Naval", "Cheerful", "Almighty", "Benevolent", "Eternal", "Immutable", "Infallible"], genitive: ["Day", "Life", "Death", "Night", "Home", "Fog", "Snow", "Winter", "Summer", "Cold", "Springs", "Gates", "Nature", "Thunder", "Lightning", "War", "Ice", "Frost", "Fire", "Doom", "Fate", "Pain", "Heaven", "Justice", "Light", "Love", "Time", "Victory"], theGenitive: ["World", "Word", "South", "West", "North", "East", "Sun", "Moon", "Peak", "Fall", "Dawn", "Eclipse", "Abyss", "Blood", "Tree", "Earth", "Harvest", "Rainbow", "Sea", "Sky", "Stars", "Storm", "Underworld", "Wild"], diff --git a/modules/ui/cultures-editor.js b/modules/ui/cultures-editor.js index 3bdbe6de..9ca5a13c 100644 --- a/modules/ui/cultures-editor.js +++ b/modules/ui/cultures-editor.js @@ -470,6 +470,7 @@ function editCultures() { drawCultures(); pack.burgs.forEach(b => b.culture = pack.cells.culture[b.cell]); refreshCulturesEditor(); + document.querySelector("input.statePower").focus(); // to not trigger hotkeys } function enterCultureManualAssignent() { diff --git a/modules/ui/diplomacy-editor.js b/modules/ui/diplomacy-editor.js index a1bf2012..69df11d8 100644 --- a/modules/ui/diplomacy-editor.js +++ b/modules/ui/diplomacy-editor.js @@ -39,7 +39,7 @@ function editDiplomacy() { document.getElementById("diplomacyMatrix").addEventListener("click", showRelationsMatrix); document.getElementById("diplomacyHistory").addEventListener("click", showRelationsHistory); document.getElementById("diplomacyExport").addEventListener("click", downloadDiplomacyData); - document.getElementById("diplomacySelect").addEventListener("click", diplomacyChangeRelations); + document.getElementById("diplomacySelect").addEventListener("mouseup", diplomacyChangeRelations); function refreshDiplomacyEditor() { diplomacyEditorAddLines(); @@ -170,7 +170,7 @@ function editDiplomacy() { function diplomacyChangeRelations(event) { event.stopPropagation(); diplomacySelect.style.display = "none"; - const subject = body.dataset.state; + const subject = +body.dataset.state; const rel = event.target.innerHTML; const states = pack.states, chronicle = states[0].diplomacy; @@ -195,10 +195,10 @@ function editDiplomacy() { const war = () => [`War declaration`, `${subjectName} declared a war on its enemy ${objectName}`]; const peace = () => { const treaty = `${subjectName} and ${objectName} agreed to cease fire and signed a peace treaty`; - const changed = rel === "Ally" ? ally() - : rel === "Vassal" ? vassal() - : rel === "Suzerain" ? suzerain() - : rel === "Unknown" ? unknown() + const changed = rel === "Ally" ? ally() + : rel === "Vassal" ? vassal() + : rel === "Suzerain" ? suzerain() + : rel === "Unknown" ? unknown() : change(); return [`War termination`, treaty, changed[1]]; }