mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-19 18:41:23 +01:00
feat: zones - regenerate
This commit is contained in:
parent
1fe6156ea2
commit
492bcd9c9b
2 changed files with 58 additions and 27 deletions
|
|
@ -1885,13 +1885,45 @@ function drawZones() {
|
||||||
const filterBy = byId("zonesFilterType").value;
|
const filterBy = byId("zonesFilterType").value;
|
||||||
const isFiltered = filterBy && filterBy !== "all";
|
const isFiltered = filterBy && filterBy !== "all";
|
||||||
|
|
||||||
const zonesHtml = pack.zones.filter(zone => !zone.hidden && (!isFiltered || zone.type === filterBy)).map(drawZone);
|
const visibleZones = pack.zones.filter(
|
||||||
zones.html(zonesHtml.join(""));
|
zone => !zone.hidden && zone.cells.length && (!isFiltered || zone.type === filterBy)
|
||||||
|
);
|
||||||
|
zones.html(visibleZones.map(drawZone).join(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawZone({i, cells, type, color}) {
|
function drawZone({i, cells, type, color}) {
|
||||||
const cellsPath = cells.map(cell => "M" + getPackPolygon(cell).join(" ")).join(" ");
|
// find a path connecting all cells of zone
|
||||||
return `<path id="zone${i}" data-id="${i}" data-type="${type}" d="${cellsPath}" fill="${color}" />`;
|
const path = getZonePath(cells);
|
||||||
|
if (!path) return;
|
||||||
|
|
||||||
|
function getZonePath(cells) {
|
||||||
|
const used = new Set();
|
||||||
|
const vertices = cells.map(c => pack.cells.v[c]).flat();
|
||||||
|
const points = vertices.map(v => pack.vertices.p[v]);
|
||||||
|
const boundary = getBoundaryPoints(points, used);
|
||||||
|
return boundary.length > 2 ? "M" + boundary.join("L") + "Z" : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBoundaryPoints(points, used) {
|
||||||
|
const boundary = [];
|
||||||
|
let currentPoint = points[0];
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
boundary.push(currentPoint);
|
||||||
|
used.add(currentPoint.toString());
|
||||||
|
let nextPoint = findNextPoint(currentPoint, points, used);
|
||||||
|
if (!nextPoint || nextPoint === boundary[0]) break;
|
||||||
|
currentPoint = nextPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
return boundary;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findNextPoint(current, points, used) {
|
||||||
|
return points.find(p => !used.has(p.toString()) && Math.hypot(p[0] - current[0], p[1] - current[1]) < 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
return `<path id="zone${i}" data-id="${i}" data-type="${type}" d="${path}" fill="${color}" />`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleEmblems(event) {
|
function toggleEmblems(event) {
|
||||||
|
|
|
||||||
|
|
@ -167,9 +167,9 @@ function regenerateStates() {
|
||||||
Military.generate();
|
Military.generate();
|
||||||
if (layerIsOn("toggleEmblems")) drawEmblems();
|
if (layerIsOn("toggleEmblems")) drawEmblems();
|
||||||
|
|
||||||
if (document.getElementById("burgsOverviewRefresh")?.offsetParent) burgsOverviewRefresh.click();
|
if (byId("burgsOverviewRefresh")?.offsetParent) burgsOverviewRefresh.click();
|
||||||
if (document.getElementById("statesEditorRefresh")?.offsetParent) statesEditorRefresh.click();
|
if (byId("statesEditorRefresh")?.offsetParent) statesEditorRefresh.click();
|
||||||
if (document.getElementById("militaryOverviewRefresh")?.offsetParent) militaryOverviewRefresh.click();
|
if (byId("militaryOverviewRefresh")?.offsetParent) militaryOverviewRefresh.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
function recreateStates() {
|
function recreateStates() {
|
||||||
|
|
@ -445,8 +445,8 @@ function regenerateBurgs() {
|
||||||
emblems.selectAll("use").remove();
|
emblems.selectAll("use").remove();
|
||||||
if (layerIsOn("toggleEmblems")) drawEmblems();
|
if (layerIsOn("toggleEmblems")) drawEmblems();
|
||||||
|
|
||||||
if (document.getElementById("burgsOverviewRefresh")?.offsetParent) burgsOverviewRefresh.click();
|
if (byId("burgsOverviewRefresh")?.offsetParent) burgsOverviewRefresh.click();
|
||||||
if (document.getElementById("statesEditorRefresh")?.offsetParent) statesEditorRefresh.click();
|
if (byId("statesEditorRefresh")?.offsetParent) statesEditorRefresh.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
function regenerateEmblems() {
|
function regenerateEmblems() {
|
||||||
|
|
@ -521,7 +521,7 @@ function regenerateCultures() {
|
||||||
function regenerateMilitary() {
|
function regenerateMilitary() {
|
||||||
Military.generate();
|
Military.generate();
|
||||||
if (!layerIsOn("toggleMilitary")) toggleMilitary();
|
if (!layerIsOn("toggleMilitary")) toggleMilitary();
|
||||||
if (document.getElementById("militaryOverviewRefresh").offsetParent) militaryOverviewRefresh.click();
|
if (byId("militaryOverviewRefresh").offsetParent) militaryOverviewRefresh.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
function regenerateIce() {
|
function regenerateIce() {
|
||||||
|
|
@ -534,7 +534,7 @@ function regenerateMarkers() {
|
||||||
Markers.regenerate();
|
Markers.regenerate();
|
||||||
turnButtonOn("toggleMarkers");
|
turnButtonOn("toggleMarkers");
|
||||||
drawMarkers();
|
drawMarkers();
|
||||||
if (document.getElementById("markersOverviewRefresh").offsetParent) markersOverviewRefresh.click();
|
if (byId("markersOverviewRefresh").offsetParent) markersOverviewRefresh.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
function regenerateZones(event) {
|
function regenerateZones(event) {
|
||||||
|
|
@ -545,10 +545,9 @@ function regenerateZones(event) {
|
||||||
else addNumberOfZones(gauss(1, 0.5, 0.6, 5, 2));
|
else addNumberOfZones(gauss(1, 0.5, 0.6, 5, 2));
|
||||||
|
|
||||||
function addNumberOfZones(number) {
|
function addNumberOfZones(number) {
|
||||||
zones.selectAll("g").remove(); // remove existing zones
|
|
||||||
Zones.generate(number);
|
Zones.generate(number);
|
||||||
if (document.getElementById("zonesEditorRefresh").offsetParent) zonesEditorRefresh.click();
|
if (byId("zonesEditorRefresh").offsetParent) zonesEditorRefresh.click();
|
||||||
if (!layerIsOn("toggleZones")) toggleZones();
|
if (layerIsOn("toggleZones")) drawZones();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -559,7 +558,7 @@ function unpressClickToAddButton() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleAddLabel() {
|
function toggleAddLabel() {
|
||||||
const pressed = document.getElementById("addLabel").classList.contains("pressed");
|
const pressed = byId("addLabel").classList.contains("pressed");
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
unpressClickToAddButton();
|
unpressClickToAddButton();
|
||||||
return;
|
return;
|
||||||
|
|
@ -627,22 +626,22 @@ function addLabelOnClick() {
|
||||||
|
|
||||||
function toggleAddBurg() {
|
function toggleAddBurg() {
|
||||||
unpressClickToAddButton();
|
unpressClickToAddButton();
|
||||||
document.getElementById("addBurgTool").classList.add("pressed");
|
byId("addBurgTool").classList.add("pressed");
|
||||||
overviewBurgs();
|
overviewBurgs();
|
||||||
document.getElementById("addNewBurg").click();
|
byId("addNewBurg").click();
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleAddRiver() {
|
function toggleAddRiver() {
|
||||||
const pressed = document.getElementById("addRiver").classList.contains("pressed");
|
const pressed = byId("addRiver").classList.contains("pressed");
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
unpressClickToAddButton();
|
unpressClickToAddButton();
|
||||||
document.getElementById("addNewRiver").classList.remove("pressed");
|
byId("addNewRiver").classList.remove("pressed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
addFeature.querySelectorAll("button.pressed").forEach(b => b.classList.remove("pressed"));
|
addFeature.querySelectorAll("button.pressed").forEach(b => b.classList.remove("pressed"));
|
||||||
addRiver.classList.add("pressed");
|
addRiver.classList.add("pressed");
|
||||||
document.getElementById("addNewRiver").classList.add("pressed");
|
byId("addNewRiver").classList.add("pressed");
|
||||||
closeDialogs(".stable");
|
closeDialogs(".stable");
|
||||||
viewbox.style("cursor", "crosshair").on("click", addRiverOnClick);
|
viewbox.style("cursor", "crosshair").on("click", addRiverOnClick);
|
||||||
tip("Click on map to place new river or extend an existing one. Hold Shift to place multiple rivers", true, "warn");
|
tip("Click on map to place new river or extend an existing one. Hold Shift to place multiple rivers", true, "warn");
|
||||||
|
|
@ -728,7 +727,7 @@ function addRiverOnClick() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// continue old river
|
// continue old river
|
||||||
document.getElementById("river" + oldRiverId)?.remove();
|
byId("river" + oldRiverId)?.remove();
|
||||||
riverCells.forEach(i => (cells.r[i] = oldRiverId));
|
riverCells.forEach(i => (cells.r[i] = oldRiverId));
|
||||||
oldRiverCells.forEach(cell => {
|
oldRiverCells.forEach(cell => {
|
||||||
if (h[cell] > h[min]) {
|
if (h[cell] > h[min]) {
|
||||||
|
|
@ -796,13 +795,13 @@ function addRiverOnClick() {
|
||||||
if (d3.event.shiftKey === false) {
|
if (d3.event.shiftKey === false) {
|
||||||
Lakes.cleanupLakeData();
|
Lakes.cleanupLakeData();
|
||||||
unpressClickToAddButton();
|
unpressClickToAddButton();
|
||||||
document.getElementById("addNewRiver").classList.remove("pressed");
|
byId("addNewRiver").classList.remove("pressed");
|
||||||
if (addNewRiver.offsetParent) riversOverviewRefresh.click();
|
if (addNewRiver.offsetParent) riversOverviewRefresh.click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleAddMarker() {
|
function toggleAddMarker() {
|
||||||
const pressed = document.getElementById("addMarker")?.classList.contains("pressed");
|
const pressed = byId("addMarker")?.classList.contains("pressed");
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
unpressClickToAddButton();
|
unpressClickToAddButton();
|
||||||
return;
|
return;
|
||||||
|
|
@ -830,7 +829,7 @@ function addMarkerOnClick() {
|
||||||
const isMarkerSelected = markers.length && elSelected?.node()?.parentElement?.id === "markers";
|
const isMarkerSelected = markers.length && elSelected?.node()?.parentElement?.id === "markers";
|
||||||
const selectedMarker = isMarkerSelected ? markers.find(marker => marker.i === +elSelected.attr("id").slice(6)) : null;
|
const selectedMarker = isMarkerSelected ? markers.find(marker => marker.i === +elSelected.attr("id").slice(6)) : null;
|
||||||
|
|
||||||
const selectedType = document.getElementById("addedMarkerType").value;
|
const selectedType = byId("addedMarkerType").value;
|
||||||
const selectedConfig = Markers.getConfig().find(({type}) => type === selectedType);
|
const selectedConfig = Markers.getConfig().find(({type}) => type === selectedType);
|
||||||
|
|
||||||
const baseMarker = selectedMarker || selectedConfig || {icon: "❓"};
|
const baseMarker = selectedMarker || selectedConfig || {icon: "❓"};
|
||||||
|
|
@ -840,13 +839,13 @@ function addMarkerOnClick() {
|
||||||
selectedConfig.add("marker" + marker.i, cell);
|
selectedConfig.add("marker" + marker.i, cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
const markersElement = document.getElementById("markers");
|
const markersElement = byId("markers");
|
||||||
const rescale = +markersElement.getAttribute("rescale");
|
const rescale = +markersElement.getAttribute("rescale");
|
||||||
markersElement.insertAdjacentHTML("beforeend", drawMarker(marker, rescale));
|
markersElement.insertAdjacentHTML("beforeend", drawMarker(marker, rescale));
|
||||||
|
|
||||||
if (d3.event.shiftKey === false) {
|
if (d3.event.shiftKey === false) {
|
||||||
document.getElementById("markerAdd").classList.remove("pressed");
|
byId("markerAdd").classList.remove("pressed");
|
||||||
document.getElementById("markersAddFromOverview").classList.remove("pressed");
|
byId("markersAddFromOverview").classList.remove("pressed");
|
||||||
unpressClickToAddButton();
|
unpressClickToAddButton();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue