diff --git a/modules/burgs-and-states.js b/modules/burgs-and-states.js
index a198a216..e56d9b6a 100644
--- a/modules/burgs-and-states.js
+++ b/modules/burgs-and-states.js
@@ -602,40 +602,15 @@ window.BurgsAndStates = (function () {
const displayed = layerIsOn("toggleLabels");
if (!displayed) toggleLabels();
- if (!list) {
- // remove all labels and textpaths
- g.selectAll("text")
- .filter((_, i) => {
- const id = g.select(`:nth-child(${i + 1})`).node()?.id;
- if (!id) return true;
+ // remove state labels to be redrawn
+ for (const state of pack.states) {
+ if (!state.i || state.removed || state.lock) continue;
+ if (list && !list.includes(state.i)) continue;
- return !pack.states.some(s => s.lock && `${s.old_i}` === id.substring(10));
- })
- .remove();
- t.selectAll("path[id*='stateLabel']")
- .filter((_, i) => {
- const id = t.select(`:nth-child(${i + 1})`).node()?.id;
- if (!id) return true;
-
- return !pack.states.some(s => s.lock && `${s.old_i}` === id.substring(19));
- })
- .remove();
+ byId(`stateLabel${state.i}`)?.remove();
+ byId(`textPath_stateLabel6${state.i}`)?.remove();
}
- pack.states.forEach(s => {
- if (!s.lock) return;
-
- // For locked states, get the name and update its index to keep it in place
- const g = labels.select("#states");
- const t = defs.select("#textPaths");
-
- const labelNode = g.select(`#stateLabel${s.old_i}`);
- const textNode = t.select(`#textPath_stateLabel${s.old_i}`);
-
- labelNode.attr("id", `stateLabel${s.i}`).select("textPath").attr("xlink:href", `#textPath_stateLabel${s.i}`);
- textNode.attr("id", `textPath_stateLabel${s.i}`);
- });
-
const example = g.append("text").attr("x", 0).attr("x", 0).text("Average");
const letterLength = example.node().getComputedTextLength() / 7; // average length of 1 letter
@@ -644,11 +619,6 @@ window.BurgsAndStates = (function () {
const state = states[p[0]];
const {name, fullName} = state;
- if (list) {
- t.select("#textPath_stateLabel" + id).remove();
- g.select("#stateLabel" + id).remove();
- }
-
const path = p[1].length > 1 ? round(lineGen(p[1])) : `M${p[1][0][0] - 50},${p[1][0][1]}h${100}`;
const textPath = t
.append("path")
diff --git a/modules/ui/tools.js b/modules/ui/tools.js
index 29807226..3ec4c8b9 100644
--- a/modules/ui/tools.js
+++ b/modules/ui/tools.js
@@ -152,6 +152,7 @@ function regenerateStates() {
else drawStates();
if (!layerIsOn("toggleBorders")) toggleBorders();
else drawBorders();
+
BurgsAndStates.drawStateLabels();
Military.generate();
if (layerIsOn("toggleEmblems")) drawEmblems(); // redrawEmblems
@@ -167,6 +168,7 @@ function recreateStates() {
const statesCount = +regionsOutput.value;
const validBurgs = pack.burgs.filter(b => b.i && !b.removed);
+
if (!validBurgs.length)
return tip("There are no any burgs to generate states. Please create burgs first", false, "error");
if (validBurgs.length < statesCount)
@@ -189,30 +191,27 @@ function recreateStates() {
burg.capital = 0;
}
- // remove emblems
- document.querySelectorAll("[id^=stateCOA]").forEach(el => el.remove());
- document.querySelectorAll("[id^=provinceCOA]").forEach(el => el.remove());
- emblems.selectAll("use").remove();
+ // remove labels and emblems for non-locked states
+ for (const state of pack.states) {
+ if (!state.i || state.removed || state.lock) continue;
+
+ // remove state labels
+ byId(`stateLabel${state.i}`)?.remove();
+ byId(`textPath_stateLabel${state.i}`)?.remove();
+
+ // remove state emblems
+ byId(`stateCOA${state.i}`)?.remove();
+ document.querySelector(`#stateEmblems > use[data-i="${state.i}"]`)?.remove();
+
+ // remove province emblems
+ for (const provinceId of state.provinces) {
+ byId(`provinceCOA${provinceId}`)?.remove();
+ document.querySelector(`#provinceEmblems > use[data-i="${provinceId}"]`)?.remove();
+ }
+ }
unfog();
- if (!statesCount) {
- 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
-
- if (document.getElementById("burgsOverviewRefresh").offsetParent) burgsOverviewRefresh.click();
- if (document.getElementById("statesEditorRefresh").offsetParent) statesEditorRefresh.click();
- return;
- }
-
// burg local ids sorted by a bit randomized population. Also ignore burgs of a locked state
const sortedBurgs = validBurgs
.filter(b => !lockedStatesIds.includes(b.state))
@@ -229,26 +228,38 @@ function recreateStates() {
const newStates = [{i: 0, name: pack.states[0].name}];
// restore locked states
- lockedStates.forEach(s => {
+ lockedStates.forEach(state => {
const newId = newStates.length;
+ const {x, y} = validBurgs[state.capital];
+ capitalsTree.add([x, y]);
- s.provinces.forEach(id => {
+ // update label id reference
+ labels
+ .select("#states")
+ .select(`#stateLabel${state.i}`)
+ .attr("id", `stateLabel${newId}`)
+ .select("textPath")
+ .attr("xlink:href", `#textPath_stateLabel${newId}`);
+ defs.select("#textPaths").select(`#textPath_stateLabel${state.i}`).attr("id", `textPath_stateLabel${newId}`);
+
+ // update emblem id reference
+ byId(`stateCOA${state.i}`)?.setAttribute("id", `stateCOA${newId}`);
+ document.querySelector(`#stateEmblems > use[data-i="${state.i}"]`)?.setAttribute("data-i", newId);
+
+ state.provinces.forEach(id => {
if (!pack.provinces[id] || !pack.provinces[id].removed) return;
pack.provinces[id].state = newId;
// pack.provinces[id].should_restore = true;
});
- const {x, y} = validBurgs[s.capital];
- capitalsTree.add([x, y]);
-
- s.i = newId;
- newStates.push(s);
+ state.i = newId;
+ newStates.push(state);
});
for (const i of pack.cells.i) {
const stateId = pack.cells.state[i];
const lockedStateIndex = lockedStatesIds.indexOf(stateId) + 1;
- // lockedStateIndex is an index of locked state of 0 if state is not locked
+ // lockedStateIndex is an index of locked state or 0 if state is not locked
pack.cells.state[i] = lockedStateIndex;
}
@@ -291,6 +302,8 @@ function recreateStates() {
newStates.push({i, name, type, capital: capital.i, center: capital.cell, culture, expansionism, coa});
}
+ if (!statesCount) tip(`States Number option is set to zero. No counties are generated`, false, "warn");
+
pack.states = newStates;
}