mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 17:51:24 +01:00
167 lines
7 KiB
JavaScript
167 lines
7 KiB
JavaScript
"use strict";
|
|
function editUnits() {
|
|
closeDialogs("#unitsEditor, .stable");
|
|
$("#unitsEditor").dialog();
|
|
|
|
if (modules.editUnits) return;
|
|
modules.editUnits = true;
|
|
|
|
$("#unitsEditor").dialog({
|
|
title: "Units Editor",
|
|
position: {my: "right top", at: "right-10 top+10", of: "svg", collision: "fit"}
|
|
});
|
|
|
|
// add listeners
|
|
document.getElementById("distanceUnit").addEventListener("change", changeDistanceUnit);
|
|
document.getElementById("distanceScaleSlider").addEventListener("input", changeDistanceScale);
|
|
document.getElementById("distanceScale").addEventListener("change", changeDistanceScale);
|
|
document.getElementById("distanceScale").addEventListener("mouseenter", hideDistanceUnitOutput);
|
|
document.getElementById("distanceScale").addEventListener("mouseleave", showDistanceUnitOutput);
|
|
document.getElementById("heightUnit").addEventListener("change", changeHeightUnit);
|
|
document.getElementById("heightExponent").addEventListener("input", changeHeightExponent);
|
|
document.getElementById("heightExponentSlider").addEventListener("input", changeHeightExponent);
|
|
document.getElementById("temperatureScale").addEventListener("change", () => {if (layerIsOn("toggleTemp")) drawTemp()});
|
|
document.getElementById("barSizeSlider").addEventListener("input", changeScaleBarSize);
|
|
document.getElementById("barSize").addEventListener("input", changeScaleBarSize);
|
|
document.getElementById("barLabel").addEventListener("input", drawScaleBar);
|
|
document.getElementById("barPosX").addEventListener("input", fitScaleBar);
|
|
document.getElementById("barPosY").addEventListener("input", fitScaleBar);
|
|
document.getElementById("barBackOpacity").addEventListener("input", function() {scaleBar.select("rect").attr("opacity", this.value)});
|
|
document.getElementById("barBackColor").addEventListener("input", function() {scaleBar.select("rect").attr("fill", this.value)});
|
|
document.getElementById("populationRateSlider").addEventListener("input", changePopulationRate);
|
|
document.getElementById("populationRate").addEventListener("change", changePopulationRate);
|
|
document.getElementById("urbanizationSlider").addEventListener("input", changeUrbanizationRate);
|
|
document.getElementById("urbanization").addEventListener("change", changeUrbanizationRate);
|
|
|
|
document.getElementById("addLinearRuler").addEventListener("click", addAdditionalRuler);
|
|
document.getElementById("addOpisometer").addEventListener("click", toggleOpisometerMode);
|
|
document.getElementById("addPlanimeter").addEventListener("click", togglePlanimeterMode);
|
|
document.getElementById("removeRulers").addEventListener("click", removeAllRulers);
|
|
|
|
function changeDistanceUnit() {
|
|
if (this.value === "custom_name") {
|
|
const custom = prompt("Provide a custom name for distance unit");
|
|
if (custom) this.options.add(new Option(custom, custom, false, true));
|
|
else {this.value = document.getElementById("distanceUnitOutput").innerHTML; return;};
|
|
}
|
|
|
|
document.getElementById("distanceUnitOutput").innerHTML = this.value;
|
|
drawScaleBar();
|
|
calculateFriendlyGridSize();
|
|
}
|
|
|
|
function changeDistanceScale() {
|
|
const scale = +this.value;
|
|
if (!scale || isNaN(scale) || scale < 0) {
|
|
tip("Distance scale should be a positive number", false, "error");
|
|
this.value = document.getElementById("distanceScale").dataset.value;
|
|
return;
|
|
}
|
|
|
|
document.getElementById("distanceScaleSlider").value = scale;
|
|
document.getElementById("distanceScale").value = scale;
|
|
document.getElementById("distanceScale").dataset.value = scale;
|
|
drawScaleBar();
|
|
calculateFriendlyGridSize();
|
|
}
|
|
|
|
function hideDistanceUnitOutput() {document.getElementById("distanceUnitOutput").style.opacity = .2;}
|
|
function showDistanceUnitOutput() {document.getElementById("distanceUnitOutput").style.opacity = 1;}
|
|
|
|
function changeHeightUnit() {
|
|
if (this.value !== "custom_name") return;
|
|
const custom = prompt("Provide a custom name for height unit");
|
|
if (custom) this.options.add(new Option(custom, custom, false, true));
|
|
else this.value = "ft";
|
|
}
|
|
|
|
function changeHeightExponent() {
|
|
document.getElementById("heightExponent").value = this.value;
|
|
document.getElementById("heightExponentSlider").value = this.value;
|
|
calculateTemperatures();
|
|
if (layerIsOn("toggleTemp")) drawTemp();
|
|
}
|
|
|
|
function changeScaleBarSize() {
|
|
document.getElementById("barSize").value = this.value;
|
|
document.getElementById("barSizeSlider").value = this.value;
|
|
drawScaleBar();
|
|
}
|
|
|
|
function changePopulationRate() {
|
|
const rate = +this.value;
|
|
if (!rate || isNaN(rate) || rate <= 0) {
|
|
tip("Population rate should be a positive number", false, "error");
|
|
this.value = document.getElementById("populationRate").dataset.value;
|
|
return;
|
|
}
|
|
|
|
document.getElementById("populationRateSlider").value = rate;
|
|
document.getElementById("populationRate").value = rate;
|
|
document.getElementById("populationRate").dataset.value = rate;
|
|
}
|
|
|
|
function changeUrbanizationRate() {
|
|
const rate = +this.value;
|
|
if (!rate || isNaN(rate) || rate < 0) {
|
|
tip("Urbanization rate should be a number", false, "error");
|
|
this.value = document.getElementById("urbanization").dataset.value;
|
|
return;
|
|
}
|
|
|
|
document.getElementById("urbanizationSlider").value = rate;
|
|
document.getElementById("urbanization").value = rate;
|
|
document.getElementById("urbanization").dataset.value = rate;
|
|
}
|
|
|
|
function addAdditionalRuler() {
|
|
if (!layerIsOn("toggleRulers")) toggleRulers();
|
|
const y = rn(Math.random() * graphHeight * .5 + graphHeight * .25);
|
|
addRuler(graphWidth * .2, y, graphWidth * .8, y);
|
|
}
|
|
|
|
function toggleOpisometerMode() {
|
|
if (this.classList.contains("pressed")) {
|
|
restoreDefaultEvents();
|
|
clearMainTip();
|
|
this.classList.remove("pressed");
|
|
} else {
|
|
if (!layerIsOn("toggleRulers")) toggleRulers();
|
|
tip("Draw a curve to measure its length", true);
|
|
unitsBottom.querySelectorAll(".pressed").forEach(button => button.classList.remove("pressed"));
|
|
this.classList.add("pressed");
|
|
viewbox.style("cursor", "crosshair").call(d3.drag().on("start", drawOpisometer));
|
|
}
|
|
}
|
|
|
|
function togglePlanimeterMode() {
|
|
if (this.classList.contains("pressed")) {
|
|
restoreDefaultEvents();
|
|
clearMainTip();
|
|
this.classList.remove("pressed");
|
|
} else {
|
|
if (!layerIsOn("toggleRulers")) toggleRulers();
|
|
tip("Draw a line to measure its inner area", true);
|
|
unitsBottom.querySelectorAll(".pressed").forEach(button => button.classList.remove("pressed"));
|
|
this.classList.add("pressed");
|
|
viewbox.style("cursor", "crosshair").call(d3.drag().on("start", drawPlanimeter));
|
|
}
|
|
}
|
|
|
|
function removeAllRulers() {
|
|
if (!ruler.selectAll("g").size()) return;
|
|
alertMessage.innerHTML = `Are you sure you want to remove all placed rulers?`;
|
|
$("#alert").dialog({resizable: false, title: "Remove all rulers",
|
|
buttons: {
|
|
Remove: function() {
|
|
$(this).dialog("close");
|
|
ruler.selectAll("g").remove();
|
|
},
|
|
Cancel: function() {$(this).dialog("close");}
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
|