diff --git a/index.html b/index.html index 334ae80e..03b5c1a7 100644 --- a/index.html +++ b/index.html @@ -1930,9 +1930,10 @@ - + + diff --git a/modules/burgs-and-states.js b/modules/burgs-and-states.js index fc8ed72c..4a1751fd 100644 --- a/modules/burgs-and-states.js +++ b/modules/burgs-and-states.js @@ -91,7 +91,7 @@ const nomadic = [1, 2, 3, 4].includes(cells.biome[b.cell]); const type = nomadic ? "Nomadic" : cultures[b.culture].type === "Nomadic" ? "Generic" : cultures[b.culture].type; const coa = COA.generate(null); - coa.shield = getShield(b.culture, null); + coa.shield = COA.getShield(b.culture, null); states.push({i, color: colors[i-1], name, expansionism, capital: i, type, center: b.cell, culture: b.culture, coa}); cells.burg[b.cell] = i; }); @@ -139,14 +139,6 @@ } } - function getShield(culture, state) { - const emblemShape = document.getElementById("emblemShape").value; - if (emblemShape === "state" && state && pack.states[state].coa) return pack.states[state].coa.shield; - if (pack.cultures[culture].shield) return pack.cultures[culture].shield; - console.error("Emblem shape is not defined on culture level", pack.cultures[culture]); - return "heater"; - } - // define burg coordinates, coa, port status and define details const specifyBurgs = function() { TIME && console.time("specifyBurgs"); @@ -194,7 +186,7 @@ else if (b.port) kinship -= .1; if (b.culture !== state.culture) kinship -= .25; b.coa = COA.generate(stateCOA, kinship); - b.coa.shield = getShield(b.culture, b.state); + b.coa.shield = COA.getShield(b.culture, b.state); } // de-assign port status if it's the only one on feature @@ -592,6 +584,7 @@ TIME && console.time("collectStatistics"); const cells = pack.cells, states = pack.states; states.forEach(s => { + if (s.removed) return; s.cells = s.area = s.burgs = s.rural = s.urban = 0; s.neighbors = new Set(); }); @@ -614,7 +607,10 @@ } // convert neighbors Set object into array - states.forEach(s => s.neighbors = Array.from(s.neighbors)); + states.forEach(s => { + if (!s.neighbors) return; + s.neighbors = Array.from(s.neighbors); + }); TIME && console.timeEnd("collectStatistics"); } @@ -957,7 +953,7 @@ const color = getMixedColor(s.color); const kinship = nameByBurg ? .8 : .4; const coa = COA.generate(stateBurgs[i].coa, kinship); - coa.shield = getShield(c, s.i); + coa.shield = COA.getShield(c, s.i); provinces.push({i:province, state:s.i, center, burg, name, formName, fullName, color, coa}); } }); @@ -1055,7 +1051,7 @@ const dominion = colony ? P(.95) : singleIsle || isleGroup ? P(.7) : P(.3); const kinship = dominion ? 0 : .4; const coa = COA.generate(s.coa, kinship, dominion); - coa.shield = getShield(c, s.i); + coa.shield = COA.getShield(c, s.i); provinces.push({i:province, state:s.i, center, burg, name, formName, fullName, color, coa}); s.provinces.push(province); diff --git a/modules/coa-generator.js b/modules/coa-generator.js index 274ecff1..50140fac 100644 --- a/modules/coa-generator.js +++ b/modules/coa-generator.js @@ -196,18 +196,14 @@ // TODO // seafaring // stringify coa on save and load - // regenerateAll // generate on new item creation // old versions auto migration: coa generation for cultures and states etc. // emblems layer for old maps // define emblems layer style for all styles - // add coa on click events for loaded map // generatate state/prov/burg - remove all rendered coas - // remove state/prov/burg - remove rendered coa [burg - done, provice - done, state] // style settings for emblems layer - // fix download svg/png + // fix map download svg/png // test in FF - // generate all? // layout preset // burg editor - add emblem // other editors @@ -340,11 +336,13 @@ } // dominions have canton with parent coa - if (P(dominion)) { - const t = getType(parent.t1) === getType(coa.t1) ? getTincture("division", usedTinctures, coa.t1) : parent.t1; + if (P(dominion) && parent.charges) { + const invert = isSameType(parent.t1, coa.t1); + const t = invert ? getTincture("division", usedTinctures, coa.t1) : parent.t1; const canton = {ordinary: "canton", t}; if (coa.charges) { coa.charges.forEach((charge, i) => { + if (charge.size === 1.5) charge.size = 1.4; if (charge.p.includes("a")) charge.p = charge.p.replaceAll("a", ""); if (charge.p.includes("j")) charge.p = charge.p.replaceAll("j", ""); if (charge.p.includes("y")) charge.p = charge.p.replaceAll("y", ""); @@ -352,17 +350,20 @@ }); } - if (parent.charges) { - let charge = parent.charges[0].charge; - if (charge === "inescutcheon" && parent.charges[1]) charge = parent.charges[1].charge; + let charge = parent.charges[0].charge; + if (charge === "inescutcheon" && parent.charges[1]) charge = parent.charges[1].charge; + + let t2 = invert ? parent.t1 : parent.charges[0].t; + if (isSameType(t, t2)) t2 = getTincture("charge", usedTinctures, t); + + if (!coa.charges) coa.charges = []; + coa.charges.push({charge, t: t2, p: "y", size: 0.5}); - let t2 = parent.charges[0].t; - if (getType(t) === getType(t2)) t2 = getTincture("charge", usedTinctures, t); - - if (!coa.charges) coa.charges = []; - coa.charges.push({charge, t: t2, p: "y", size: 0.5}); - } else canton.above = 1; coa.ordinaries ? coa.ordinaries.push(canton) : coa.ordinaries = [canton]; + + console.log(encodeURI(`https://azgaar.github.io/Armoria/?coa=${JSON.stringify(coa)}`)); + console.log(encodeURI(`https://azgaar.github.io/Armoria/?coa=${JSON.stringify(parent)}`)); + console.log("-------"); } function selectCharge(set) { @@ -398,6 +399,18 @@ if (Object.keys(tinctures.stains).includes(tincture)) return "stains"; } + function isSameType(t1, t2) { + return type(t1) === type(t2); + + function type(tincture) { + if (Object.keys(tinctures.metals).includes(tincture)) return "metals"; + if (Object.keys(tinctures.colours).includes(tincture)) return "colours"; + if (Object.keys(tinctures.stains).includes(tincture)) return "stains"; + else return "pattern"; + } + + } + function definePattern(pattern, element, size = "") { let t1 = null, t2 = null; if (P(.15)) size = "-small"; @@ -465,19 +478,17 @@ return coa; } - const generateAll = function() { - const states = pack.states, burgs = pack.burgs, provinces = pack.provinces; - - states.forEach(state => { - if (!state.i || state.removed) return; - const coa = generate(); - s.coa = coa; - }); + const getShield = function(culture, state) { + const emblemShape = document.getElementById("emblemShape").value; + if (emblemShape === "state" && state && pack.states[state].coa) return pack.states[state].coa.shield; + if (pack.cultures[culture].shield) return pack.cultures[culture].shield; + console.error("Emblem shape is not defined on culture level", pack.cultures[culture]); + return "heater"; } const toString = coa => JSON.stringify(coa).replaceAll("#", "%23"); const copy = coa => JSON.parse(JSON.stringify(coa)); - return {generate, generateAll, toString, copy}; + return {generate, toString, copy, getShield}; }))); \ No newline at end of file diff --git a/modules/ui/emblems-editor.js b/modules/ui/emblems-editor.js index f5b6ff18..d46908bd 100644 --- a/modules/ui/emblems-editor.js +++ b/modules/ui/emblems-editor.js @@ -3,7 +3,7 @@ function editEmblem(type, id, el) { if (customization) return; if (!id && d3.event) defineEmblemData(d3.event); - emblems.selectAll(":scope > use").call(d3.drag().on("drag", dragEmblem)).classed("draggable", true); + emblems.selectAll("use").call(d3.drag().on("drag", dragEmblem)).classed("draggable", true); const emblemStates = document.getElementById("emblemStates"); const emblemProvinces = document.getElementById("emblemProvinces"); @@ -337,6 +337,6 @@ function editEmblem(type, id, el) { } function closeEmblemEditor() { - emblems.selectAll(":scope > use").call(d3.drag().on("drag", null)).attr("class", null); + emblems.selectAll("use").call(d3.drag().on("drag", null)).attr("class", null); } } \ No newline at end of file diff --git a/modules/ui/layers.js b/modules/ui/layers.js index 87b545da..37f5191e 100644 --- a/modules/ui/layers.js +++ b/modules/ui/layers.js @@ -1297,32 +1297,23 @@ function drawEmblems() { .force('collision', d3.forceCollide().radius(d => d.size/2)) .stop(); - // debug.attr("fill", "#fff").attr("stroke", "#000") - // .selectAll("circle").data(nodes).join("circle") - // .attr("cx", d => d.x) - // .attr("cy", d => d.y) - // .attr("r", 2); - d3.timeout(function() { const n = Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay())); for (let i = 0; i < n; ++i) { simulation.tick(); } - emblems.select("#burgEmblems").attr("font-size", sizeBurgs) - .selectAll("use").data(nodes.filter(node => node.type === "burg")).join("use") - .attr("x", d => d.x - d.size / 2).attr("y", d => d.y - d.size / 2) - .attr("width", "1em").attr("height", "1em").attr("data-i", d => d.i); + const burgNodes = nodes.filter(node => node.type === "burg"); + const burgString = burgNodes.map(d => ``).join(""); + emblems.select("#burgEmblems").attr("font-size", sizeBurgs).html(burgString); - emblems.select("#provinceEmblems").attr("font-size", sizeProvinces) - .selectAll("use").data(nodes.filter(node => node.type === "province")).join("use") - .attr("x", d => d.x - d.size / 2).attr("y", d => d.y - d.size / 2) - .attr("width", "1em").attr("height", "1em").attr("data-i", d => d.i); + const provinceNodes = nodes.filter(node => node.type === "province"); + const provinceString = provinceNodes.map(d => ``).join(""); + emblems.select("#provinceEmblems").attr("font-size", sizeProvinces).html(provinceString); - emblems.select("#stateEmblems").attr("font-size", sizeStates) - .selectAll("use").data(nodes.filter(node => node.type === "state")).join("use") - .attr("x", d => d.x - d.size / 2).attr("y", d => d.y - d.size / 2) - .attr("width", "1em").attr("height", "1em").attr("data-i", d => d.i); + const stateNodes = nodes.filter(node => node.type === "state"); + const stateString = stateNodes.map(d => ``).join(""); + emblems.select("#stateEmblems").attr("font-size", sizeStates).html(stateString); invokeActiveZooming(); }); diff --git a/modules/ui/provinces-editor.js b/modules/ui/provinces-editor.js index 28788e12..44a16e9c 100644 --- a/modules/ui/provinces-editor.js +++ b/modules/ui/provinces-editor.js @@ -352,18 +352,16 @@ function editProvinces() { pack.cells.province.forEach((province, i) => { if(province === p) pack.cells.province[i] = 0; }); - const province = pack.provinces[p]; const s = province.state, state = pack.states[s]; if (state.provinces.includes(p)) state.provinces.splice(state.provinces.indexOf(p), 1); - province.removed = true; + unfog("focusProvince"+p); - if (province.coa) { - const coaId = "provinceCOA" + p; - if (document.getElementById(coaId)) document.getElementById(coaId).remove(); - emblems.select(`#provinceEmblems > use[data-i='${p}']`).remove(); - delete province.coa; // remove to save data - } + const coaId = "provinceCOA" + p; + if (document.getElementById(coaId)) document.getElementById(coaId).remove(); + emblems.select(`#provinceEmblems > use[data-i='${p}']`).remove(); + + pack.provinces[p] = {i: p, removed: true}; const g = provs.select("#provincesBody"); g.select("#province"+p).remove(); diff --git a/modules/ui/states-editor.js b/modules/ui/states-editor.js index 6ba44b8a..99a0c02a 100644 --- a/modules/ui/states-editor.js +++ b/modules/ui/states-editor.js @@ -422,17 +422,28 @@ function editStates() { statesBody.select("#state"+state).remove(); statesBody.select("#state-gap"+state).remove(); statesHalo.select("#state-border"+state).remove(); + labels.select("#stateLabel"+state).remove(); + defs.select("#textPath_stateLabel"+state).remove(); + unfog("focusState"+state); - const label = document.querySelector("#stateLabel"+state); - if (label) label.remove(); pack.burgs.forEach(b => {if(b.state === state) b.state = 0;}); pack.cells.state.forEach((s, i) => {if(s === state) pack.cells.state[i] = 0;}); - pack.states[state].removed = true; + + // remove emblem + const coaId = "stateCOA" + state; + document.getElementById(coaId).remove(); + emblems.select(`#stateEmblems > use[data-i='${state}']`).remove(); // remove provinces pack.states[state].provinces.forEach(p => { - pack.provinces[p].removed = true; + pack.provinces[p] = {i: p, removed: true}; pack.cells.province.forEach((pr, i) => {if(pr === p) pack.cells.province[i] = 0;}); + const coaId = "provinceCOA" + p; + if (document.getElementById(coaId)) document.getElementById(coaId).remove(); + emblems.select(`#provinceEmblems > use[data-i='${p}']`).remove(); + const g = provs.select("#provincesBody"); + g.select("#province"+p).remove(); + g.select("#province-gap"+p).remove(); }); // remove military @@ -448,8 +459,7 @@ function editStates() { pack.burgs[capital].state = 0; moveBurgToGroup(capital, "towns"); - // clean state object - pack.states[state].military = []; + pack.states[state] = {i: state, removed: true}; debug.selectAll(".highlight").remove(); if (!layerIsOn("toggleStates")) toggleStates(); else drawStates(); diff --git a/modules/ui/tools.js b/modules/ui/tools.js index 066eda0b..992880fb 100644 --- a/modules/ui/tools.js +++ b/modules/ui/tools.js @@ -60,9 +60,10 @@ function processFeatureRegeneration(event, button) { if (button === "regenerateRoutes") {Routes.regenerate(); if (!layerIsOn("toggleRoutes")) toggleRoutes();} else if (button === "regenerateRivers") regenerateRivers(); else if (button === "regeneratePopulation") recalculatePopulation(); else - if (button === "regenerateBurgs") regenerateBurgs(); else if (button === "regenerateStates") regenerateStates(); else if (button === "regenerateProvinces") regenerateProvinces(); else + if (button === "regenerateBurgs") regenerateBurgs(); else + if (button === "regenerateEmblems") regenerateEmblems(); else if (button === "regenerateReligions") regenerateReligions(); else if (button === "regenerateCultures") regenerateCultures(); else if (button === "regenerateMilitary") regenerateMilitary(); else @@ -95,6 +96,108 @@ function recalculatePopulation() { }); } +function regenerateStates() { + Math.seedrandom(Math.floor(Math.random() * 1e9)); // new random seed + const burgs = pack.burgs.filter(b => b.i && !b.removed); + if (!burgs.length) { + tip("No burgs to generate states. Please create burgs first", false, "error"); + return; + } + if (burgs.length < +regionsInput.value) { + tip(`Not enough burgs to generate ${regionsInput.value} states. Will generate only ${burgs.length} states`, false, "warn"); + } + + // burg local ids sorted by a bit randomized population: + const sorted = burgs.map((b, i) => [i, b.population * Math.random()]).sort((a, b) => b[1] - a[1]).map(b => b[0]); + const capitalsTree = d3.quadtree(); + + // turn all old capitals into towns + burgs.filter(b => b.capital).forEach(b => { + moveBurgToGroup(b.i, "towns"); + b.capital = 0; + }); + + unfog(); + + // if desired states number is 0 + if (regionsInput.value == 0) { + tip(`Cannot generate zero states. Please check the States Number option`, false, "warn"); + pack.states = pack.states.slice(0,1); // remove all except of neutrals + pack.states[0].diplomacy = []; // clear diplomacy + pack.provinces = [0]; // remove all provinces + pack.cells.state = new Uint16Array(pack.cells.i.length); // reset cells data + borders.selectAll("path").remove(); // remove borders + regions.selectAll("path").remove(); // remove states fill + labels.select("#states").selectAll("text"); // remove state labels + defs.select("#textPaths").selectAll("path[id*='stateLabel']").remove(); // remove state labels paths + + // remove emblems + document.querySelectorAll("[id^=stateCOA]").forEach(el => el.remove()); + document.querySelectorAll("[id^=provinceCOA]").forEach(el => el.remove()); + emblems.selectAll("use").remove(); + + if (document.getElementById("burgsOverviewRefresh").offsetParent) burgsOverviewRefresh.click(); + if (document.getElementById("statesEditorRefresh").offsetParent) statesEditorRefresh.click(); + return; + } + + const neutral = pack.states[0].name; + const count = Math.min(+regionsInput.value, burgs.length); + let spacing = (graphWidth + graphHeight) / 2 / count; // min distance between capitals + pack.states = d3.range(count).map(i => { + if (!i) return {i, name: neutral}; + + let capital = null, x = 0, y = 0; + for (const i of sorted) { + capital = burgs[i]; + x = capital.x, y = capital.y; + if (capitalsTree.find(x, y, spacing) === undefined) break; + spacing = Math.max(spacing - 1, 1); + } + + capitalsTree.add([x, y]); + capital.capital = 1; + moveBurgToGroup(capital.i, "cities"); + + const culture = capital.culture; + const basename = capital.name.length < 9 && capital.cell%5 === 0 ? capital.name : Names.getCulture(culture, 3, 6, "", 0); + const name = Names.getState(basename, culture); + const nomadic = [1, 2, 3, 4].includes(pack.cells.biome[capital.cell]); + const type = nomadic ? "Nomadic" : pack.cultures[culture].type === "Nomadic" ? "Generic" : pack.cultures[culture].type; + const expansionism = rn(Math.random() * powerInput.value + 1, 1); + + const coa = COA.generate(capital.coa, .3); + coa.shield = capital.coa.shield; + + return {i, name, type, capital:capital.i, center:capital.cell, culture, expansionism, coa}; + }); + + BurgsAndStates.expandStates(); + BurgsAndStates.normalizeStates(); + BurgsAndStates.collectStatistics(); + BurgsAndStates.assignColors(); + BurgsAndStates.generateCampaigns(); + BurgsAndStates.generateDiplomacy(); + BurgsAndStates.defineStateForms(); + BurgsAndStates.generateProvinces(true); + if (!layerIsOn("toggleStates")) toggleStates(); else drawStates(); + if (!layerIsOn("toggleBorders")) toggleBorders(); else drawBorders(); + BurgsAndStates.drawStateLabels(); + Military.generate(); + if (layerIsOn("toggleEmblems")) drawEmblems(); // redrawEmblems + + if (document.getElementById("burgsOverviewRefresh").offsetParent) burgsOverviewRefresh.click(); + if (document.getElementById("statesEditorRefresh").offsetParent) statesEditorRefresh.click(); + if (document.getElementById("militaryOverviewRefresh").offsetParent) militaryOverviewRefresh.click(); +} + +function regenerateProvinces() { + unfog(); + BurgsAndStates.generateProvinces(true); + drawBorders(); + if (layerIsOn("toggleProvinces")) drawProvinces(); +} + function regenerateBurgs() { const cells = pack.cells, states = pack.states; rankCells(); @@ -148,96 +251,55 @@ function regenerateBurgs() { if (document.getElementById("statesEditorRefresh").offsetParent) statesEditorRefresh.click(); } -function regenerateStates() { - Math.seedrandom(Math.floor(Math.random() * 1e9)); // new random seed - const burgs = pack.burgs.filter(b => b.i && !b.removed); - if (!burgs.length) { - tip("No burgs to generate states. Please create burgs first", false, "error"); - return; - } - if (burgs.length < +regionsInput.value) { - tip(`Not enough burgs to generate ${regionsInput.value} states. Will generate only ${burgs.length} states`, false, "warn"); - } +function regenerateEmblems() { + // remove old emblems + document.querySelectorAll("[id^=stateCOA]").forEach(el => el.remove()); + document.querySelectorAll("[id^=provinceCOA]").forEach(el => el.remove()); + document.querySelectorAll("[id^=burgCOA]").forEach(el => el.remove()); + emblems.selectAll("use").remove(); - // burg local ids sorted by a bit randomized population: - const sorted = burgs.map((b, i) => [i, b.population * Math.random()]).sort((a, b) => b[1] - a[1]).map(b => b[0]); - const capitalsTree = d3.quadtree(); - - // turn all old capitals into towns - burgs.filter(b => b.capital).forEach(b => { - moveBurgToGroup(b.i, "towns"); - b.capital = 0; + // generate new emblems + pack.states.forEach(state => { + if (!state.i || state.removed) return; + state.coa = COA.generate(null); + state.coa.shield = COA.getShield(state.culture, null); }); - unfog(); + pack.burgs.forEach(burg => { + if (!burg.i || burg.removed) return; + const state = pack.states[burg.state]; - // if desired states number is 0 - if (regionsInput.value == 0) { - tip(`Cannot generate zero states. Please check the States Number option`, false, "warn"); - pack.states = pack.states.slice(0,1); // remove all except of neutrals - pack.states[0].diplomacy = []; // clear diplomacy - pack.provinces = [0]; // remove all provinces - pack.cells.state = new Uint16Array(pack.cells.i.length); // reset cells data - borders.selectAll("path").remove(); // remove borders - regions.selectAll("path").remove(); // remove states fill - labels.select("#states").selectAll("text"); // remove state labels - defs.select("#textPaths").selectAll("path[id*='stateLabel']").remove(); // remove state labels paths + let kinship = .25; + if (burg.capital) kinship += .1; + else if (burg.port) kinship -= .1; + if (burg.culture !== state.culture) kinship -= .25; + burg.coa = COA.generate(state.coa, kinship); + burg.coa.shield = COA.getShield(burg.culture, burg.state); + }); - if (document.getElementById("burgsOverviewRefresh").offsetParent) burgsOverviewRefresh.click(); - if (document.getElementById("statesEditorRefresh").offsetParent) statesEditorRefresh.click(); - return; - } + pack.provinces.forEach(province => { + if (!province.i || province.removed) return; + const parent = province.burg ? pack.burgs[province.burg] : pack.states[province.state]; - const neutral = pack.states[0].name; - const count = Math.min(+regionsInput.value, burgs.length); - let spacing = (graphWidth + graphHeight) / 2 / count; // min distance between capitals - pack.states = d3.range(count).map(i => { - if (!i) return {i, name: neutral}; - - let capital = null, x = 0, y = 0; - for (const i of sorted) { - capital = burgs[i]; - x = capital.x, y = capital.y; - if (capitalsTree.find(x, y, spacing) === undefined) break; - spacing = Math.max(spacing - 1, 1); + let dominion = false; + if (province.burg) { + dominion = P(.2); + if (province.formName === "Colony") dominion = P(.95); else + if (province.formName === "Island") dominion = P(.6); else + if (province.formName === "Islands") dominion = P(.5); else + if (province.formName === "Territory") dominion = P(.4); else + if (province.formName === "Land") dominion = P(.3); } - capitalsTree.add([x, y]); - capital.capital = 1; - moveBurgToGroup(capital.i, "cities"); + const nameByBurg = province.burg && province.name.slice(0, 3) === parent.name.slice(0, 3); + const kinship = dominion ? 0 : nameByBurg ? .8 : .4; + const culture = pack.cells.culture[province.center]; - const culture = capital.culture; - const basename = capital.name.length < 9 && capital.cell%5 === 0 ? capital.name : Names.getCulture(culture, 3, 6, "", 0); - const name = Names.getState(basename, culture); - const nomadic = [1, 2, 3, 4].includes(pack.cells.biome[capital.cell]); - const type = nomadic ? "Nomadic" : pack.cultures[culture].type === "Nomadic" ? "Generic" : pack.cultures[culture].type; - const expansionism = rn(Math.random() * powerInput.value + 1, 1); - return {i, name, type, capital:capital.i, center:capital.cell, culture, expansionism}; + province.coa = COA.generate(parent.coa, kinship, dominion); + province.coa.shield = COA.getShield(culture, province.state); }); - BurgsAndStates.expandStates(); - BurgsAndStates.normalizeStates(); - BurgsAndStates.collectStatistics(); - BurgsAndStates.assignColors(); - BurgsAndStates.generateCampaigns(); - BurgsAndStates.generateDiplomacy(); - BurgsAndStates.defineStateForms(); - BurgsAndStates.generateProvinces(true); - if (!layerIsOn("toggleStates")) toggleStates(); else drawStates(); - if (!layerIsOn("toggleBorders")) toggleBorders(); else drawBorders(); - BurgsAndStates.drawStateLabels(); - Military.generate(); - - if (document.getElementById("burgsOverviewRefresh").offsetParent) burgsOverviewRefresh.click(); - if (document.getElementById("statesEditorRefresh").offsetParent) statesEditorRefresh.click(); - if (document.getElementById("militaryOverviewRefresh").offsetParent) militaryOverviewRefresh.click(); -} - -function regenerateProvinces() { - unfog(); - BurgsAndStates.generateProvinces(true); - drawBorders(); - if (layerIsOn("toggleProvinces")) drawProvinces(); + if (layerIsOn("toggleEmblems")) drawEmblems(); // redrawEmblems } function regenerateReligions() {