From f855de6fb89fd0fca8d6584594ee74666274034c Mon Sep 17 00:00:00 2001 From: Legogizmo Date: Mon, 29 Mar 2021 16:05:49 -0500 Subject: [PATCH] Added a lock function to burgs (#612) * Added a lock function to burgs that will prevent them from being regenerated * Updated tooltips and fixed culture change from renaming locked burgs and group remove from deleting locked burgs --- index.html | 8 ++++---- modules/burgs-and-states.js | 2 +- modules/ui/burg-editor.js | 30 +++++++++++++++++++++++++++--- modules/ui/burgs-overview.js | 28 +++++++++++++++++++++++----- modules/ui/cultures-editor.js | 2 +- modules/ui/editors.js | 14 ++++++++++++++ modules/ui/tools.js | 17 +++++++++++++++-- 7 files changed, 85 insertions(+), 16 deletions(-) diff --git a/index.html b/index.html index 01b6aaf0..851fbec9 100644 --- a/index.html +++ b/index.html @@ -1313,7 +1313,7 @@ - + @@ -1972,6 +1972,7 @@ + @@ -3142,7 +3143,7 @@ - + @@ -3358,7 +3359,7 @@
- +
@@ -4133,4 +4134,3 @@ - diff --git a/modules/burgs-and-states.js b/modules/burgs-and-states.js index 56830bd6..d04ee699 100644 --- a/modules/burgs-and-states.js +++ b/modules/burgs-and-states.js @@ -145,7 +145,7 @@ const cells = pack.cells, vertices = pack.vertices, features = pack.features, temp = grid.cells.temp; for (const b of pack.burgs) { - if (!b.i) continue; + if (!b.i || b.lock) continue; const i = b.cell; // asign port status to some coastline burgs with temp > 0 °C diff --git a/modules/ui/burg-editor.js b/modules/ui/burg-editor.js index 2b384ee5..10d86583 100644 --- a/modules/ui/burg-editor.js +++ b/modules/ui/burg-editor.js @@ -48,6 +48,8 @@ function editBurg(id) { document.getElementById("burgEditEmblem").addEventListener("click", openEmblemEdit); document.getElementById("burgRelocate").addEventListener("click", toggleRelocateBurg); document.getElementById("burglLegend").addEventListener("click", editBurgLegend); + document.getElementById("burgLock").addEventListener("click", toggleBurgLockButton); + document.getElementById("burgLock").addEventListener("mouseover", showBurgELockTip); document.getElementById("burgRemove").addEventListener("click", removeSelectedBurg); function updateBurgValues() { @@ -90,6 +92,9 @@ function editBurg(id) { if (b.shanty) document.getElementById("burgShanty").classList.remove("inactive"); else document.getElementById("burgShanty").classList.add("inactive"); + //toggle lock + updateBurgLockIcon(); + // select group const group = elSelected.node().parentNode.id; const select = document.getElementById("burgSelectGroup"); @@ -220,12 +225,12 @@ function editBurg(id) { for (let i=0; i < group.children.length; i++) { burgsInGroup.push(+group.children[i].dataset.id); } - const burgsToRemove = burgsInGroup.filter(b => !pack.burgs[b].capital); + const burgsToRemove = burgsInGroup.filter(b => !(pack.burgs[b].capital || pack.burgs[b].lock)); const capital = burgsToRemove.length < burgsInGroup.length; alertMessage.innerHTML = `Are you sure you want to remove - ${basic || capital ? "all elements in the group" : "the entire burg group"}? -
Please note that capital burgs will not be deleted. + ${basic || capital ? "all unlocked elements in the group" : "the entire burg group"}? +
Please note that capital or locked burgs will not be deleted.

Burgs to be removed: ${burgsToRemove.length}`; $("#alert").dialog({resizable: false, title: "Remove route group", buttons: { @@ -299,6 +304,25 @@ function editBurg(id) { else document.getElementById("burgEditAnchorStyle").style.display = "none"; } + function toggleBurgLockButton() { + const id = +elSelected.attr("data-id"); + toggleBurgLock(id); + updateBurgLockIcon(); + } + + function updateBurgLockIcon() { + const id = +elSelected.attr("data-id"); + const b = pack.burgs[id]; + if (b.lock) {document.getElementById("burgLock").classList.remove("icon-lock-open"); document.getElementById("burgLock").classList.add("icon-lock");} + else {document.getElementById("burgLock").classList.remove("icon-lock"); document.getElementById("burgLock").classList.add("icon-lock-open");} + + } + + function showBurgELockTip() { + const id = +elSelected.attr("data-id"); + showBurgLockTip(id); + } + function showStyleSection() { document.querySelectorAll("#burgBottom > button").forEach(el => el.style.display = "none"); document.getElementById("burgStyleSection").style.display = "inline-block"; diff --git a/modules/ui/burgs-overview.js b/modules/ui/burgs-overview.js index d5e37f79..18bc79ce 100644 --- a/modules/ui/burgs-overview.js +++ b/modules/ui/burgs-overview.js @@ -86,6 +86,7 @@ function overviewBurgs() { + `; } @@ -104,6 +105,8 @@ function overviewBurgs() { body.querySelectorAll("div > input.burgPopulation").forEach(el => el.addEventListener("change", changeBurgPopulation)); body.querySelectorAll("div > span.icon-star-empty").forEach(el => el.addEventListener("click", toggleCapitalStatus)); body.querySelectorAll("div > span.icon-anchor").forEach(el => el.addEventListener("click", togglePortStatus)); + body.querySelectorAll("div > span.locks").forEach(el => el.addEventListener("click", toggleBurgLockStatus)); + body.querySelectorAll("div > span.locks").forEach(el => el.addEventListener("mouseover", showBurgOLockTip)); body.querySelectorAll("div > span.icon-pencil").forEach(el => el.addEventListener("click", openBurgEditor)); body.querySelectorAll("div > span.icon-trash-empty").forEach(el => el.addEventListener("click", triggerBurgRemove)); @@ -178,6 +181,18 @@ function overviewBurgs() { else this.classList.add("inactive"); } + function toggleBurgLockStatus() { + const burg = +this.parentNode.dataset.id; + toggleBurgLock(burg); + if (this.classList.contains("icon-lock")) {this.classList.remove("icon-lock"); this.classList.add("icon-lock-open"); this.classList.add("inactive");} + else {this.classList.remove("icon-lock-open"); this.classList.add("icon-lock"); this.classList.remove("inactive");} + } + + function showBurgOLockTip() { + const burg = +this.parentNode.dataset.id; + showBurgLockTip(burg); + } + function openBurgEditor() { const burg = +this.parentNode.dataset.id; editBurg(burg); @@ -203,11 +218,14 @@ function overviewBurgs() { function regenerateNames() { body.querySelectorAll(":scope > div").forEach(function(el) { const burg = +el.dataset.id; + //if (pack.burgs[burg].lock) return; const culture = pack.burgs[burg].culture; const name = Names.getCulture(culture); - el.querySelector(".burgName").value = name; - pack.burgs[burg].name = el.dataset.name = name; - burgLabels.select("[data-id='" + burg + "']").text(name); + if (!pack.burgs[burg].lock) { + el.querySelector(".burgName").value = name; + pack.burgs[burg].name = el.dataset.name = name; + burgLabels.select("[data-id='" + burg + "']").text(name); + } }); } @@ -455,7 +473,7 @@ function overviewBurgs() { } function triggerAllBurgsRemove() { - alertMessage.innerHTML = `Are you sure you want to remove all burgs except of capitals? + alertMessage.innerHTML = `Are you sure you want to remove all unlocked burgs except for capitals?
To remove a capital you have to remove a state first`; $("#alert").dialog({resizable: false, title: "Remove all burgs", buttons: { @@ -469,7 +487,7 @@ function overviewBurgs() { } function removeAllBurgs() { - pack.burgs.filter(b => b.i && !b.capital).forEach(b => removeBurg(b.i)); + pack.burgs.filter(b => b.i && !(b.capital || b.lock)).forEach(b => removeBurg(b.i)); burgsOverviewAddLines(); } } diff --git a/modules/ui/cultures-editor.js b/modules/ui/cultures-editor.js index 70eb0857..67e4618c 100644 --- a/modules/ui/cultures-editor.js +++ b/modules/ui/cultures-editor.js @@ -335,7 +335,7 @@ function editCultures() { function cultureRegenerateBurgs() { if (customization === 4) return; const culture = +this.parentNode.dataset.id; - const cBurgs = pack.burgs.filter(b => b.culture === culture); + const cBurgs = pack.burgs.filter(b => b.culture === culture && !b.lock); cBurgs.forEach(b => { b.name = Names.getCulture(culture); labels.select("[data-id='" + b.i +"']").text(b.name); diff --git a/modules/ui/editors.js b/modules/ui/editors.js index 6a7bbfe9..cac16d4c 100644 --- a/modules/ui/editors.js +++ b/modules/ui/editors.js @@ -221,6 +221,20 @@ function togglePort(burg) { .attr("width", size).attr("height", size); } +function toggleBurgLock(burg) { + const b = pack.burgs[burg]; + b.lock = b.lock ? 0 : 1; +} + +function showBurgLockTip(burg) { + const b = pack.burgs[burg]; + if (b.lock) { + tip("Click to Unlock burg and allow it to be change by regeneration tools"); + } else { + tip("Click to Lock burg and prevent changes by regeneration tools"); + } +} + // draw legend box function drawLegend(name, data) { legend.selectAll("*").remove(); // fully redraw every time diff --git a/modules/ui/tools.js b/modules/ui/tools.js index a0594374..1ab8f192 100644 --- a/modules/ui/tools.js +++ b/modules/ui/tools.js @@ -103,7 +103,7 @@ function regenerateRivers() { function recalculatePopulation() { rankCells(); pack.burgs.forEach(b => { - if (!b.i || b.removed) return; + if (!b.i || b.removed || b.lock) return; const i = b.cell; b.population = rn(Math.max((pack.cells.s[i] + pack.cells.road[i] / 2) / 8 + b.i / 1000 + i % 100 / 1000, .1), 3); @@ -224,7 +224,7 @@ function regenerateProvinces() { } function regenerateBurgs() { - const cells = pack.cells, states = pack.states; + const cells = pack.cells, states = pack.states, Lockedburgs = pack.burgs.filter(b =>b.lock); rankCells(); cells.burg = new Uint16Array(cells.i.length); const burgs = pack.burgs = [0]; // clear burgs array @@ -237,6 +237,19 @@ function regenerateBurgs() { const burgsCount = manorsInput.value == 1000 ? rn(sorted.length / 5 / (grid.points.length / 10000) ** .8) + states.length : +manorsInput.value + states.length; const spacing = (graphWidth + graphHeight) / 150 / (burgsCount ** .7 / 66); // base min distance between towns + //clear locked list since ids will change + //burglock.selectAll("text").remove(); + for (let j=0; j < Lockedburgs.length; j++) { + const id = burgs.length; + const oldBurg = Lockedburgs[j]; + oldBurg.i = id; + burgs.push(oldBurg); + burgsTree.add([oldBurg.x, oldBurg.y]); + cells.burg[oldBurg.cell] = id; + if (oldBurg.capital) {states[oldBurg.state].capital = id; states[oldBurg.state].center = oldBurg.cell;} + //burglock.append("text").attr("data-id", id); + } + for (let i=0; i < sorted.length && burgs.length < burgsCount; i++) { const id = burgs.length; const cell = sorted[i];