mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 09:41:24 +01:00
v1.22.33
This commit is contained in:
parent
904951d6c0
commit
8a6108e203
5 changed files with 186 additions and 180 deletions
2
main.js
2
main.js
|
|
@ -288,7 +288,7 @@ function findBurgForMFCG(params) {
|
||||||
function applyDefaultBiomesSystem() {
|
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 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 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 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 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
|
const cost = [10,200,150,60,50,70,70,80,90,80,100,255,150]; // biome movement cost
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@
|
||||||
console.time('generateCultures');
|
console.time('generateCultures');
|
||||||
cells = pack.cells;
|
cells = pack.cells;
|
||||||
cells.culture = new Uint16Array(cells.i.length); // cell cultures
|
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) {
|
if (populated.length < count * 25) {
|
||||||
count = Math.floor(populated.length / 50);
|
count = Math.floor(populated.length / 50);
|
||||||
if (!count) {
|
if (!count) {
|
||||||
|
|
@ -42,19 +42,28 @@
|
||||||
const centers = d3.quadtree();
|
const centers = d3.quadtree();
|
||||||
const colors = getColors(count);
|
const colors = getColors(count);
|
||||||
|
|
||||||
cultures.forEach(function(culture, i) {
|
cultures.forEach(function(c, i) {
|
||||||
const c = culture.center = placeCultureCenter();
|
const cell = c.center = placeCenter(c.sort ? c.sort : (i) => cells.s[i]);
|
||||||
centers.add(cells.p[c]);
|
centers.add(cells.p[cell]);
|
||||||
culture.i = i+1;
|
c.i = i+1;
|
||||||
delete culture.odd;
|
delete c.odd;
|
||||||
culture.color = colors[i];
|
delete c.sort;
|
||||||
culture.type = defineCultureType(c);
|
c.color = colors[i];
|
||||||
culture.expansionism = defineCultureExpansionism(culture.type);
|
c.type = defineCultureType(cell);
|
||||||
culture.origin = 0;
|
c.expansionism = defineCultureExpansionism(c.type);
|
||||||
culture.code = getCode(culture.name);
|
c.origin = 0;
|
||||||
cells.culture[c] = i+1;
|
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
|
// the first culture with id 0 is for wildlands
|
||||||
cultures.unshift({name:"Wildlands", i:0, base:1, origin:null});
|
cultures.unshift({name:"Wildlands", i:0, base:1, origin:null});
|
||||||
|
|
||||||
|
|
@ -76,27 +85,15 @@
|
||||||
return cultures;
|
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
|
// set culture type based on culture center position
|
||||||
function defineCultureType(i) {
|
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
|
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
|
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 non-along-coastline growth
|
if (f.type === "lake" && f.cells > 5) return "Lake" // low water cross penalty and high for growth not along coastline
|
||||||
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
|
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
|
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 (cells.t[i] > 2 && [3,7,8,9,10,12].includes(cells.biome[i])) return "Hunting"; // high penalty in non-native biomes
|
||||||
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
|
|
||||||
return "Generic";
|
return "Generic";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,41 +142,49 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
const getDefault = function(count) {
|
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") {
|
if (culturesSet.value === "european") {
|
||||||
return [
|
return [
|
||||||
{name:"Shwazen", base:0, odd: 1},
|
{name:"Shwazen", base:0, odd: 1, sort: i => n(i) / td(i, 10) / bd(i, [6, 8])},
|
||||||
{name:"Angshire", base:1, odd: 1},
|
{name:"Angshire", base:1, odd: 1, sort: i => n(i) / td(i, 10) / sf(i)},
|
||||||
{name:"Luari", base:2, odd: 1},
|
{name:"Luari", base:2, odd: 1, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])},
|
||||||
{name:"Tallian", base:3, odd: 1},
|
{name:"Tallian", base:3, odd: 1, sort: i => n(i) / td(i, 15)},
|
||||||
{name:"Astellian", base:4, odd: 1},
|
{name:"Astellian", base:4, odd: 1, sort: i => n(i) / td(i, 16)},
|
||||||
{name:"Slovan", base:5, odd: 1},
|
{name:"Slovan", base:5, odd: 1, sort: i => n(i) / td(i, 6) * t[i]},
|
||||||
{name:"Norse", base:6, odd: 1},
|
{name:"Norse", base:6, odd: 1, sort: i => n(i) / td(i, 5)},
|
||||||
{name:"Elladan", base:7, odd: 1},
|
{name:"Elladan", base:7, odd: 1, sort: i => n(i) / td(i, 18) * h[i]},
|
||||||
{name:"Romian", base:8, odd: .2},
|
{name:"Romian", base:8, odd: .2, sort: i => n(i) / td(i, 15) / t[i]},
|
||||||
{name:"Soumi", base:9, odd: 1},
|
{name:"Soumi", base:9, odd: 1, sort: i => n(i) / td(i, 5) / bd(i, [9]) * t[i]},
|
||||||
{name:"Portuzian", base:13, odd: 1},
|
{name:"Portuzian", base:13, odd: 1, sort: i => n(i) / td(i, 17) / sf(i)},
|
||||||
{name:"Vengrian", base: 15, odd: 1},
|
{name:"Vengrian", base: 15, odd: 1, sort: i => n(i) / td(i, 11) / bd(i, [4]) * t[i]},
|
||||||
{name:"Turchian", base: 16, odd: .05},
|
{name:"Turchian", base: 16, odd: .05, sort: i => n(i) / td(i, 14)},
|
||||||
{name:"Euskati", base: 20, odd: .05},
|
{name:"Euskati", base: 20, odd: .05, sort: i => n(i) / td(i, 15) * h[i]},
|
||||||
{name:"Keltan", base: 22, odd: .05}
|
{name:"Keltan", base: 22, odd: .05, sort: i => n(i) / td(i, 11) / bd(i, [6, 8]) * t[i]}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (culturesSet.value === "oriental") {
|
if (culturesSet.value === "oriental") {
|
||||||
return [
|
return [
|
||||||
{name:"Koryo", base:10, odd: 1},
|
{name:"Koryo", base:10, odd: 1, sort: i => n(i) / td(i, 12) / t[i]},
|
||||||
{name:"Hantzu", base:11, odd: 1},
|
{name:"Hantzu", base:11, odd: 1, sort: i => n(i) / td(i, 13)},
|
||||||
{name:"Yamoto", base:12, odd: 1},
|
{name:"Yamoto", base:12, odd: 1, sort: i => n(i) / td(i, 15) / t[i]},
|
||||||
{name:"Turchian", base: 16, odd: 1},
|
{name:"Turchian", base: 16, odd: 1, sort: i => n(i) / td(i, 12)},
|
||||||
{name:"Berberan", base: 17, odd: .2},
|
{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},
|
{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},
|
{name:"Efratic", base: 23, odd: .1, sort: i => n(i) / td(i, 22) * t[i]},
|
||||||
{name:"Tehrani", base: 24, odd: 1},
|
{name:"Tehrani", base: 24, odd: 1, sort: i => n(i) / td(i, 18) * h[i]},
|
||||||
{name:"Maui", base: 25, odd: .2},
|
{name:"Maui", base: 25, odd: .2, sort: i => n(i) / td(i, 24) / sf(i) / t[i]},
|
||||||
{name:"Carnatic", base: 26, odd: .5},
|
{name:"Carnatic", base: 26, odd: .5, sort: i => n(i) / td(i, 26)},
|
||||||
{name:"Vietic", base: 29, odd: .8},
|
{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},
|
{name:"Guantzu", base:30, odd: .5, sort: i => n(i) / td(i, 17)},
|
||||||
{name:"Ulus", base:31, odd: 1}
|
{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") {
|
if (culturesSet.value === "antique") {
|
||||||
return [
|
return [
|
||||||
{name:"Roman", base:8, odd: 1},
|
{name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 14) / t[i]}, // Roman
|
||||||
{name:"Roman", base:8, odd: 1},
|
{name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 15) / sf(i)}, // Roman
|
||||||
{name:"Roman", base:8, odd: 1},
|
{name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 16) / sf(i)}, // Roman
|
||||||
{name:"Roman", base:8, odd: 1},
|
{name:"Roman", base:8, odd: 1, sort: i => n(i) / td(i, 17) / t[i]}, // Roman
|
||||||
{name:"Hellenic", base:7, odd: 1}, // Greek
|
{name:"Hellenic", base:7, odd: 1, sort: i => n(i) / td(i, 18) / sf(i) * h[i]}, // Greek
|
||||||
{name:"Hellenic", base:7, odd: 1}, // 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}, // Greek
|
{name:"Macedonian", base:7, odd: .5, sort: i => n(i) / td(i, 12) * h[i]}, // Greek
|
||||||
{name:"Celtic", base:22, odd: 1},
|
{name:"Celtic", base:22, odd: 1, sort: i => n(i) / td(i, 11) ** .5 / bd(i, [6, 8])},
|
||||||
{name:"Germanic", base:0, odd: 1},
|
{name:"Germanic", base:0, odd: 1, sort: i => n(i) / td(i, 10) ** .5 / bd(i, [6, 8])},
|
||||||
{name:"Persian", base:24, odd: .8}, // Iranian
|
{name:"Persian", base:24, odd: .8, sort: i => n(i) / td(i, 18) * h[i]}, // Iranian
|
||||||
{name:"Scythian", base:24, odd: .5}, // 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}, // Basque
|
{name:"Cantabrian", base: 20, odd: .5, sort: i => n(i) / td(i, 16) * h[i]}, // Basque
|
||||||
{name:"Estian", base: 9, odd: .2}, // Finnic
|
{name:"Estian", base: 9, odd: .2, sort: i => n(i) / td(i, 5) * t[i]}, // Finnic
|
||||||
{name:"Carthaginian", base: 17, odd: .3}, // Berber (the closest we have)
|
{name:"Carthaginian", base: 17, odd: .3, sort: i => n(i) / td(i, 19) / sf(i)}, // Berber
|
||||||
{name:"Mesopotamian", base: 23, odd: .2} // Mesopotamian
|
{name:"Mesopotamian", base: 23, odd: .2, sort: i => n(i) / td(i, 22) / bd(i, [1, 2, 3])} // Mesopotamian
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (culturesSet.value === "highFantasy") {
|
if (culturesSet.value === "highFantasy") {
|
||||||
return [
|
return [
|
||||||
// fantasy races
|
// fantasy races
|
||||||
{name:"Quenian", base: 33, odd: 1}, // Elves
|
{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}, // 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}, // 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}, // Dark 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}, // 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}, // Dwarven
|
{name:"Durinn", base: 35, odd: 1, sort: i => n(i) + h[i]}, // Dwarven
|
||||||
{name:"Khazadur", base: 35, odd: 1}, // Dwarven
|
{name:"Khazadur", base: 35, odd: 1, sort: i => n(i) + h[i]}, // Dwarven
|
||||||
{name:"Kobblin", base: 36, odd: 1}, // Goblin
|
{name:"Kobblin", base: 36, odd: 1, sort: i => t[i] - s[i]}, // Goblin
|
||||||
{name:"Uruk", base: 37, odd: 1}, // Orc
|
{name:"Uruk", base: 37, odd: 1, sort: i => h[i] * t[i]}, // Orc
|
||||||
{name:"Ugluk", base: 37, odd: .7}, // 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}, // Giant
|
{name:"Yotunn", base: 38, odd: .9, sort: i => td(i, -10)}, // Giant
|
||||||
{name:"Drake", base: 39, odd: .7}, // Draconic
|
{name:"Drake", base: 39, odd: .7, sort: i => -s[i]}, // Draconic
|
||||||
{name:"Rakhnid", base: 40, odd: .9}, // Arachnid
|
{name:"Rakhnid", base: 40, odd: .9, sort: i => t[i] - s[i]}, // Arachnid
|
||||||
{name:"Aj'Snaga", base: 41, odd: .9}, // Serpents
|
{name:"Aj'Snaga", base: 41, odd: .9, sort: i => n(i) / bd(i, [12], 10)}, // Serpents
|
||||||
// common fantasy human
|
// common fantasy human
|
||||||
{name:"Gozdor", base:32, odd: 1},
|
{name:"Gozdor", base:32, odd: 1, sort: i => n(i) / td(i, 18)},
|
||||||
{name:"Anor", base:32, odd: 1},
|
{name:"Anor", base:32, odd: 1, sort: i => n(i) / td(i, 10)},
|
||||||
{name:"Dail", base:32, odd: 1},
|
{name:"Dail", base:32, odd: 1, sort: i => n(i) / td(i, 13)},
|
||||||
{name:"Duland", base:32, odd: 1},
|
{name:"Duland", base:32, odd: 1, sort: i => n(i) / td(i, 14)},
|
||||||
{name:"Rohand", base:32, odd: 1},
|
{name:"Rohand", base:32, odd: 1, sort: i => n(i) / td(i, 16)},
|
||||||
// rare real-world western
|
// rare real-world western
|
||||||
{name:"Norse", base:6, odd: .5},
|
{name:"Norse", base:6, odd: .5, sort: i => n(i) / td(i, 5) / sf(i)},
|
||||||
{name:"Izenlute", base:0, odd: .1},
|
{name:"Izenlute", base:0, odd: .1, sort: i => n(i) / td(i, 5)},
|
||||||
{name:"Lurian", base:2, odd: .1},
|
{name:"Lurian", base:2, odd: .1, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])},
|
||||||
{name:"Getalian", base:3, odd: .1},
|
{name:"Getalian", base:3, odd: .1, sort: i => n(i) / td(i, 15)},
|
||||||
{name:"Astelan", base:4, odd: .05},
|
{name:"Astelan", base:4, odd: .05, sort: i => n(i) / td(i, 16)},
|
||||||
// rare real-world exotic
|
// rare real-world exotic
|
||||||
{name:"Yoruba", base:21, 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},
|
{name:"Ryoko", base:10, odd: .05, sort: i => n(i) / td(i, 12) / t[i]},
|
||||||
{name:"Toyamo", base:12, odd: .05},
|
{name:"Toyamo", base:12, odd: .05, sort: i => n(i) / td(i, 15) / t[i]},
|
||||||
{name:"Guan-Tsu", base:30, odd: .05},
|
{name:"Guan-Tsu", base:30, odd: .05, sort: i => n(i) / td(i, 17)},
|
||||||
{name:"Ulus-Khan", base:31, odd: .05},
|
{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},
|
{name:"Turan", base: 16, odd: .05, sort: i => n(i) / td(i, 13)},
|
||||||
{name:"Al'Uma", base: 18, odd: .05},
|
{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},
|
{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}
|
{name:"Gorodian", base:5, odd: .05, sort: i => n(i) / td(i, 6) * t[i]}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (culturesSet.value === "darkFantasy") {
|
if (culturesSet.value === "darkFantasy") {
|
||||||
return [
|
return [
|
||||||
// common real-world English
|
// common real-world English
|
||||||
{name:"Angshire", 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},
|
{name:"Enlandic", base:1, odd: 1, sort: i => n(i) / td(i, 12)},
|
||||||
{name:"Westen", base:1, odd: 1},
|
{name:"Westen", base:1, odd: 1, sort: i => n(i) / td(i, 10)},
|
||||||
{name:"Nortumbic", base:1, odd: 1},
|
{name:"Nortumbic", base:1, odd: 1, sort: i => n(i) / td(i, 7)},
|
||||||
{name:"Mercian", base:1, odd: 1},
|
{name:"Mercian", base:1, odd: 1, sort: i => n(i) / td(i, 9)},
|
||||||
{name:"Kentian", base:1, odd: 1},
|
{name:"Kentian", base:1, odd: 1, sort: i => n(i) / td(i, 12)},
|
||||||
// rare real-world western
|
// rare real-world western
|
||||||
{name:"Norse", base:6, odd: .7},
|
{name:"Norse", base:6, odd: .7, sort: i => n(i) / td(i, 5) / sf(i)},
|
||||||
{name:"Schwarzen", base:0, odd: .3},
|
{name:"Schwarzen", base:0, odd: .3, sort: i => n(i) / td(i, 10) / bd(i, [6, 8])},
|
||||||
{name:"Luarian", base:2, odd: .3},
|
{name:"Luarian", base:2, odd: .3, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])},
|
||||||
{name:"Hetallian", base:3, odd: .3},
|
{name:"Hetallian", base:3, odd: .3, sort: i => n(i) / td(i, 15)},
|
||||||
{name:"Astellian", base:4, odd: .3},
|
{name:"Astellian", base:4, odd: .3, sort: i => n(i) / td(i, 16)},
|
||||||
// rare real-world exotic
|
// rare real-world exotic
|
||||||
{name:"Kiswaili", base:28, odd: .05},
|
{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},
|
{name:"Yoruba", base:21, odd: .05, sort: i => n(i) / td(i, 15) / bd(i, [5, 7])},
|
||||||
{name:"Koryo", base:10, odd: .05},
|
{name:"Koryo", base:10, odd: .05, sort: i => n(i) / td(i, 12) / t[i]},
|
||||||
{name:"Hantzu", base:11, odd: .05},
|
{name:"Hantzu", base:11, odd: .05, sort: i => n(i) / td(i, 13)},
|
||||||
{name:"Yamoto", base:12, odd: .05},
|
{name:"Yamoto", base:12, odd: .05, sort: i => n(i) / td(i, 15) / t[i]},
|
||||||
{name:"Guantzu", base:30, odd: .05},
|
{name:"Guantzu", base:30, odd: .05, sort: i => n(i) / td(i, 17)},
|
||||||
{name:"Ulus", base:31, odd: .05},
|
{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},
|
{name:"Turan", base: 16, odd: .05, sort: i => n(i) / td(i, 12)},
|
||||||
{name:"Berberan", base: 17, odd: .05},
|
{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},
|
{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},
|
{name:"Slovan", base:5, odd: .05, sort: i => n(i) / td(i, 6) * t[i]},
|
||||||
{name:"Keltan", base: 22, odd: .1},
|
{name:"Keltan", base: 22, odd: .1, sort: i => n(i) / td(i, 11) ** .5 / bd(i, [6, 8])},
|
||||||
{name:"Elladan", base:7, odd: .2},
|
{name:"Elladan", base:7, odd: .2, sort: i => n(i) / td(i, 18) / sf(i) * h[i]},
|
||||||
{name:"Romian", base:8, odd: .2},
|
{name:"Romian", base:8, odd: .2, sort: i => n(i) / td(i, 14) / t[i]},
|
||||||
// fantasy races
|
// fantasy races
|
||||||
{name:"Eldar", base: 33, odd: .5}, // Elves
|
{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}, // Dark 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}, // Dwarven
|
{name:"Durinn", base: 35, odd: .8, sort: i => n(i) + h[i]}, // Dwarven
|
||||||
{name:"Kobblin", base: 36, odd: .8}, // Goblin
|
{name:"Kobblin", base: 36, odd: .8, sort: i => t[i] - s[i]}, // Goblin
|
||||||
{name:"Uruk", base: 37, odd: .8}, // Orc
|
{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}, // Giant
|
{name:"Yotunn", base: 38, odd: .8, sort: i => td(i, -10)}, // Giant
|
||||||
{name:"Drake", base: 39, odd: .9}, // Draconic
|
{name:"Drake", base: 39, odd: .9, sort: i => -s[i]}, // Draconic
|
||||||
{name:"Rakhnid", base: 40, odd: .9}, // Arachnid
|
{name:"Rakhnid", base: 40, odd: .9, sort: i => t[i] - s[i]}, // Arachnid
|
||||||
{name:"Aj'Snaga", base: 41, odd: .9}, // Serpents
|
{name:"Aj'Snaga", base: 41, odd: .9, sort: i => n(i) / bd(i, [12], 10)}, // Serpents
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -313,38 +318,38 @@
|
||||||
|
|
||||||
// all-world
|
// all-world
|
||||||
return [
|
return [
|
||||||
{name:"Shwazen", base:0, odd: .7},
|
{name:"Shwazen", base:0, odd: .7, sort: i => n(i) / td(i, 10) / bd(i, [6, 8])},
|
||||||
{name:"Angshire", base:1, odd: 1},
|
{name:"Angshire", base:1, odd: 1, sort: i => n(i) / td(i, 10) / sf(i)},
|
||||||
{name:"Luari", base:2, odd: .6},
|
{name:"Luari", base:2, odd: .6, sort: i => n(i) / td(i, 12) / bd(i, [6, 8])},
|
||||||
{name:"Tallian", base:3, odd: .6},
|
{name:"Tallian", base:3, odd: .6, sort: i => n(i) / td(i, 15)},
|
||||||
{name:"Astellian", base:4, odd: .6},
|
{name:"Astellian", base:4, odd: .6, sort: i => n(i) / td(i, 16)},
|
||||||
{name:"Slovan", base:5, odd: .7},
|
{name:"Slovan", base:5, odd: .7, sort: i => n(i) / td(i, 6) * t[i]},
|
||||||
{name:"Norse", base:6, odd: .7},
|
{name:"Norse", base:6, odd: .7, sort: i => n(i) / td(i, 5)},
|
||||||
{name:"Elladan", base:7, odd: .7},
|
{name:"Elladan", base:7, odd: .7, sort: i => n(i) / td(i, 18) * h[i]},
|
||||||
{name:"Romian", base:8, odd: .7},
|
{name:"Romian", base:8, odd: .7, sort: i => n(i) / td(i, 15)},
|
||||||
{name:"Soumi", base:9, odd: .3},
|
{name:"Soumi", base:9, odd: .3, sort: i => n(i) / td(i, 5) / bd(i, [9]) * t[i]},
|
||||||
{name:"Koryo", base:10, odd: .1},
|
{name:"Koryo", base:10, odd: .1, sort: i => n(i) / td(i, 12) / t[i]},
|
||||||
{name:"Hantzu", base:11, odd: .1},
|
{name:"Hantzu", base:11, odd: .1, sort: i => n(i) / td(i, 13)},
|
||||||
{name:"Yamoto", base:12, odd: .1},
|
{name:"Yamoto", base:12, odd: .1, sort: i => n(i) / td(i, 15) / t[i]},
|
||||||
{name:"Portuzian", base:13, odd: .4},
|
{name:"Portuzian", base:13, odd: .4, sort: i => n(i) / td(i, 17) / sf(i)},
|
||||||
{name:"Nawatli", base:14, odd: .1},
|
{name:"Nawatli", base:14, odd: .1, sort: i => h[i] / td(i, 18) / bd(i, [7])},
|
||||||
{name:"Vengrian", base: 15, odd: .2},
|
{name:"Vengrian", base: 15, odd: .2, sort: i => n(i) / td(i, 11) / bd(i, [4]) * t[i]},
|
||||||
{name:"Turchian", base: 16, odd: .2},
|
{name:"Turchian", base: 16, odd: .2, sort: i => n(i) / td(i, 13)},
|
||||||
{name:"Berberan", base: 17, odd: .1},
|
{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},
|
{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},
|
{name:"Inuk", base: 19, odd: .05, sort: i => td(i, -1) / bd(i, [10, 11]) / sf(i)},
|
||||||
{name:"Euskati", base: 20, odd: .05},
|
{name:"Euskati", base: 20, odd: .05, sort: i => n(i) / td(i, 15) * h[i]},
|
||||||
{name:"Yoruba", base: 21, odd: .05},
|
{name:"Yoruba", base: 21, odd: .05, sort: i => n(i) / td(i, 15) / bd(i, [5, 7])},
|
||||||
{name:"Keltan", base: 22, odd: .05},
|
{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},
|
{name:"Efratic", base: 23, odd: .05, sort: i => n(i) / td(i, 22) * t[i]},
|
||||||
{name:"Tehrani", base: 24, odd: .1},
|
{name:"Tehrani", base: 24, odd: .1, sort: i => n(i) / td(i, 18) * h[i]},
|
||||||
{name:"Maui", base: 25, odd: .05},
|
{name:"Maui", base: 25, odd: .05, sort: i => n(i) / td(i, 24) / sf(i) / t[i]},
|
||||||
{name:"Carnatic", base: 26, odd: .05},
|
{name:"Carnatic", base: 26, odd: .05, sort: i => n(i) / td(i, 26)},
|
||||||
{name:"Inqan", base: 27, odd: .05},
|
{name:"Inqan", base: 27, odd: .05, sort: i => h[i] / td(i, 13)},
|
||||||
{name:"Kiswaili", base: 28, odd: .1},
|
{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},
|
{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},
|
{name:"Guantzu", base:30, odd: .1, sort: i => n(i) / td(i, 17)},
|
||||||
{name:"Ulus", base:31, odd: .1}
|
{name:"Ulus", base:31, odd: .1, sort: i => n(i) / td(i, 5) / bd(i, [2, 4, 10], 7) * t[i]}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
const base = {
|
const base = {
|
||||||
number: ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve"],
|
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"],
|
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"],
|
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"],
|
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"],
|
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"],
|
||||||
|
|
|
||||||
|
|
@ -470,6 +470,7 @@ function editCultures() {
|
||||||
drawCultures();
|
drawCultures();
|
||||||
pack.burgs.forEach(b => b.culture = pack.cells.culture[b.cell]);
|
pack.burgs.forEach(b => b.culture = pack.cells.culture[b.cell]);
|
||||||
refreshCulturesEditor();
|
refreshCulturesEditor();
|
||||||
|
document.querySelector("input.statePower").focus(); // to not trigger hotkeys
|
||||||
}
|
}
|
||||||
|
|
||||||
function enterCultureManualAssignent() {
|
function enterCultureManualAssignent() {
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ function editDiplomacy() {
|
||||||
document.getElementById("diplomacyMatrix").addEventListener("click", showRelationsMatrix);
|
document.getElementById("diplomacyMatrix").addEventListener("click", showRelationsMatrix);
|
||||||
document.getElementById("diplomacyHistory").addEventListener("click", showRelationsHistory);
|
document.getElementById("diplomacyHistory").addEventListener("click", showRelationsHistory);
|
||||||
document.getElementById("diplomacyExport").addEventListener("click", downloadDiplomacyData);
|
document.getElementById("diplomacyExport").addEventListener("click", downloadDiplomacyData);
|
||||||
document.getElementById("diplomacySelect").addEventListener("click", diplomacyChangeRelations);
|
document.getElementById("diplomacySelect").addEventListener("mouseup", diplomacyChangeRelations);
|
||||||
|
|
||||||
function refreshDiplomacyEditor() {
|
function refreshDiplomacyEditor() {
|
||||||
diplomacyEditorAddLines();
|
diplomacyEditorAddLines();
|
||||||
|
|
@ -170,7 +170,7 @@ function editDiplomacy() {
|
||||||
function diplomacyChangeRelations(event) {
|
function diplomacyChangeRelations(event) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
diplomacySelect.style.display = "none";
|
diplomacySelect.style.display = "none";
|
||||||
const subject = body.dataset.state;
|
const subject = +body.dataset.state;
|
||||||
const rel = event.target.innerHTML;
|
const rel = event.target.innerHTML;
|
||||||
|
|
||||||
const states = pack.states, chronicle = states[0].diplomacy;
|
const states = pack.states, chronicle = states[0].diplomacy;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue