diff --git a/index.html b/index.html index cdbf6b73..7fafb2e1 100644 --- a/index.html +++ b/index.html @@ -7662,8 +7662,8 @@ - - + + diff --git a/src/layers/renderers/drawBiomes.js b/src/layers/renderers/drawBiomes.js index cd0c30ee..e1d7424f 100644 --- a/src/layers/renderers/drawBiomes.js +++ b/src/layers/renderers/drawBiomes.js @@ -1,4 +1,4 @@ -import {clipPoly} from "/src/utils/lineUtils"; +import {clipPoly} from "utils/lineUtils"; export function drawBiomes() { TIME && console.time("drawBiomes"); diff --git a/src/layers/renderers/drawCells.js b/src/layers/renderers/drawCells.js index 47821a47..a5601f7d 100644 --- a/src/layers/renderers/drawCells.js +++ b/src/layers/renderers/drawCells.js @@ -1,4 +1,4 @@ -import {getGridPolygon} from "/src/utils/graphUtils"; +import {getGridPolygon} from "utils/graphUtils"; export function drawCells() { cells.selectAll("path").remove(); diff --git a/src/layers/renderers/drawCoordinates.js b/src/layers/renderers/drawCoordinates.js index 633200c5..96a236f0 100644 --- a/src/layers/renderers/drawCoordinates.js +++ b/src/layers/renderers/drawCoordinates.js @@ -1,6 +1,6 @@ -import {rn} from "/src/utils/numberUtils"; -import {round} from "/src/utils/stringUtils"; -import {byId} from "/src/utils/shorthands"; +import {rn} from "utils/numberUtils"; +import {round} from "utils/stringUtils"; +import {byId} from "utils/shorthands"; export function drawCoordinates() { coordinates.selectAll("*").remove(); // remove every time diff --git a/src/layers/renderers/drawEmblems.js b/src/layers/renderers/drawEmblems.js index cf3c0dc9..5db39430 100644 --- a/src/layers/renderers/drawEmblems.js +++ b/src/layers/renderers/drawEmblems.js @@ -1,6 +1,6 @@ import {getProvincesVertices} from "./drawProvinces"; -import {minmax, rn} from "/src/utils/numberUtils"; -import {byId} from "/src/utils/shorthands"; +import {minmax, rn} from "utils/numberUtils"; +import {byId} from "utils/shorthands"; export function drawEmblems() { const {states, provinces, burgs} = pack; diff --git a/src/layers/renderers/drawHeightmap.js b/src/layers/renderers/drawHeightmap.js index 37641bb8..1deb4fda 100644 --- a/src/layers/renderers/drawHeightmap.js +++ b/src/layers/renderers/drawHeightmap.js @@ -1,4 +1,4 @@ -import {getColorScheme, getHeightColor} from "/src/utils/colorUtils"; +import {getColorScheme, getHeightColor} from "utils/colorUtils"; export function drawHeightmap() { terrs.selectAll("*").remove(); diff --git a/src/layers/renderers/drawIce.js b/src/layers/renderers/drawIce.js index c6564bd5..659e336e 100644 --- a/src/layers/renderers/drawIce.js +++ b/src/layers/renderers/drawIce.js @@ -1,4 +1,4 @@ -import {getGridPolygon} from "/src/utils/graphUtils"; +import {getGridPolygon} from "utils/graphUtils"; export function drawIce() { const {cells, vertices} = grid; diff --git a/src/layers/renderers/drawMarkers.js b/src/layers/renderers/drawMarkers.js index 52a89321..d4682250 100644 --- a/src/layers/renderers/drawMarkers.js +++ b/src/layers/renderers/drawMarkers.js @@ -1,4 +1,4 @@ -import {rn} from "/src/utils/numberUtils"; +import {rn} from "utils/numberUtils"; const pinShapeMap = { bubble: (stroke, fill) => diff --git a/src/layers/renderers/drawTemperature.js b/src/layers/renderers/drawTemperature.js index 227731ba..cc2ee432 100644 --- a/src/layers/renderers/drawTemperature.js +++ b/src/layers/renderers/drawTemperature.js @@ -1,4 +1,4 @@ -import {convertTemperature} from "/src/utils/unitUtils"; +import {convertTemperature} from "utils/unitUtils"; export function drawTemperature() { temperature.selectAll("*").remove(); diff --git a/src/layers/renderers/index.js b/src/layers/renderers/index.js index 48933470..d85b1567 100644 --- a/src/layers/renderers/index.js +++ b/src/layers/renderers/index.js @@ -1,4 +1,4 @@ -import {TIME} from "/src/config/logging"; +import {TIME} from "config/logging"; import {drawBiomes} from "./drawBiomes"; import {drawBorders} from "./drawBorders"; import {drawCells} from "./drawCells"; diff --git a/src/layers/toggles.js b/src/layers/toggles.js index 82ba99da..b9730dde 100644 --- a/src/layers/toggles.js +++ b/src/layers/toggles.js @@ -1,6 +1,6 @@ -import {tip} from "/src/scripts/tooltips"; -import {getBase64} from "/src/utils/functionUtils"; -import {isCtrlClick} from "/src/utils/keyboardUtils"; +import {tip} from "scripts/tooltips"; +import {getBase64} from "utils/functionUtils"; +import {isCtrlClick} from "utils/keyboardUtils"; import {turnLayerButtonOn, turnLayerButtonOff, layerIsOn} from "./utils"; import {renderLayer} from "./renderers"; diff --git a/src/modules/activeZooming.js b/src/modules/activeZooming.js index 0bb74bb7..aa093928 100644 --- a/src/modules/activeZooming.js +++ b/src/modules/activeZooming.js @@ -1,5 +1,5 @@ -import {rn} from "/src/utils/numberUtils"; -import {layerIsOn, renderLayer} from "/src/layers"; +import {rn} from "utils/numberUtils"; +import {layerIsOn, renderLayer} from "layers"; import {drawScaleBar} from "/src/modules/measurers"; export function handleZoom(isScaleChanged, isPositionChanged) { diff --git a/src/modules/burgs-and-states.js b/src/modules/burgs-and-states.js index 60588e77..63964140 100644 --- a/src/modules/burgs-and-states.js +++ b/src/modules/burgs-and-states.js @@ -1,13 +1,13 @@ -import {TIME} from "/src/config/logging"; -import {layerIsOn} from "/src/layers"; +import {TIME} from "config/logging"; +import {layerIsOn} from "layers"; import {Voronoi} from "/src/modules/voronoi"; -import {getColors, getMixedColor, getRandomColor} from "/src/utils/colorUtils"; -import {findCell} from "/src/utils/graphUtils"; -import {getAdjective, trimVowels} from "/src/utils/languageUtils"; -import {getMiddlePoint} from "/src/utils/lineUtils"; -import {minmax, rn} from "/src/utils/numberUtils"; -import {each, gauss, generateSeed, P, ra, rand, rw} from "/src/utils/probabilityUtils"; -import {round, splitInTwo} from "/src/utils/stringUtils"; +import {getColors, getMixedColor, getRandomColor} from "utils/colorUtils"; +import {findCell} from "utils/graphUtils"; +import {getAdjective, trimVowels} from "utils/languageUtils"; +import {getMiddlePoint} from "utils/lineUtils"; +import {minmax, rn} from "utils/numberUtils"; +import {each, gauss, generateSeed, P, ra, rand, rw} from "utils/probabilityUtils"; +import {round, splitInTwo} from "utils/stringUtils"; window.BurgsAndStates = (function () { const generate = function () { diff --git a/src/modules/coa-generator.js b/src/modules/coa-generator.js index 7ce88e4d..14c383a5 100644 --- a/src/modules/coa-generator.js +++ b/src/modules/coa-generator.js @@ -1,4 +1,4 @@ -import {P, rw} from "/src/utils/probabilityUtils"; +import {P, rw} from "utils/probabilityUtils"; window.COA = (function () { const tinctures = { diff --git a/src/modules/cultures-generator.js b/src/modules/cultures-generator.js index ef72d8fc..5bd38a75 100644 --- a/src/modules/cultures-generator.js +++ b/src/modules/cultures-generator.js @@ -1,8 +1,8 @@ -import {TIME} from "/src/config/logging"; -import {getColors} from "/src/utils/colorUtils"; -import {rn, minmax} from "/src/utils/numberUtils"; -import {rand, P, rw, biased} from "/src/utils/probabilityUtils"; -import {abbreviate} from "/src/utils/languageUtils"; +import {TIME} from "config/logging"; +import {getColors} from "utils/colorUtils"; +import {rn, minmax} from "utils/numberUtils"; +import {rand, P, rw, biased} from "utils/probabilityUtils"; +import {abbreviate} from "utils/languageUtils"; window.Cultures = (function () { let cells; diff --git a/src/modules/dynamic/auto-update.js b/src/modules/dynamic/auto-update.js index da883359..dcc73a0b 100644 --- a/src/modules/dynamic/auto-update.js +++ b/src/modules/dynamic/auto-update.js @@ -1,8 +1,8 @@ -import {findCell} from "/src/utils/graphUtils"; -import {rn} from "/src/utils/numberUtils"; -import {rand, P, rw} from "/src/utils/probabilityUtils"; -import {parseTransform} from "/src/utils/stringUtils"; -import {turnLayerButtonOn, turnLayerButtonOff} from "/src/layers"; +import {findCell} from "utils/graphUtils"; +import {rn} from "utils/numberUtils"; +import {rand, P, rw} from "utils/probabilityUtils"; +import {parseTransform} from "utils/stringUtils"; +import {turnLayerButtonOn, turnLayerButtonOff} from "layers"; // update old .map version to the current one export function resolveVersionConflicts(version) { diff --git a/src/modules/dynamic/editors/cultures-editor.js b/src/modules/dynamic/editors/cultures-editor.js index 9de7766d..76e9d247 100644 --- a/src/modules/dynamic/editors/cultures-editor.js +++ b/src/modules/dynamic/editors/cultures-editor.js @@ -1,12 +1,12 @@ -import {restoreDefaultEvents} from "/src/scripts/events"; -import {findAll, findCell, getPackPolygon, isLand} from "/src/utils/graphUtils"; -import {tip, showMainTip, clearMainTip} from "/src/scripts/tooltips"; -import {byId} from "/src/utils/shorthands"; -import {rn} from "/src/utils/numberUtils"; -import {capitalize} from "/src/utils/stringUtils"; -import {si} from "/src/utils/unitUtils"; -import {abbreviate} from "/src/utils/languageUtils"; -import {debounce} from "/src/utils/functionUtils"; +import {restoreDefaultEvents} from "scripts/events"; +import {findAll, findCell, getPackPolygon, isLand} from "utils/graphUtils"; +import {tip, showMainTip, clearMainTip} from "scripts/tooltips"; +import {byId} from "utils/shorthands"; +import {rn} from "utils/numberUtils"; +import {capitalize} from "utils/stringUtils"; +import {si} from "utils/unitUtils"; +import {abbreviate} from "utils/languageUtils"; +import {debounce} from "utils/functionUtils"; const $body = insertEditorHtml(); addListeners(); diff --git a/src/modules/dynamic/editors/religions-editor.js b/src/modules/dynamic/editors/religions-editor.js index f6a10c6a..3cf86784 100644 --- a/src/modules/dynamic/editors/religions-editor.js +++ b/src/modules/dynamic/editors/religions-editor.js @@ -1,11 +1,11 @@ -import {restoreDefaultEvents} from "/src/scripts/events"; -import {findAll, findCell, getPackPolygon, isLand} from "/src/utils/graphUtils"; -import {tip, showMainTip, clearMainTip} from "/src/scripts/tooltips"; -import {byId} from "/src/utils/shorthands"; -import {rn} from "/src/utils/numberUtils"; -import {si} from "/src/utils/unitUtils"; -import {abbreviate} from "/src/utils/languageUtils"; -import {debounce} from "/src/utils/functionUtils"; +import {restoreDefaultEvents} from "scripts/events"; +import {findAll, findCell, getPackPolygon, isLand} from "utils/graphUtils"; +import {tip, showMainTip, clearMainTip} from "scripts/tooltips"; +import {byId} from "utils/shorthands"; +import {rn} from "utils/numberUtils"; +import {si} from "utils/unitUtils"; +import {abbreviate} from "utils/languageUtils"; +import {debounce} from "utils/functionUtils"; const $body = insertEditorHtml(); addListeners(); diff --git a/src/modules/dynamic/editors/states-editor.js b/src/modules/dynamic/editors/states-editor.js index 50d2aaca..e277ef71 100644 --- a/src/modules/dynamic/editors/states-editor.js +++ b/src/modules/dynamic/editors/states-editor.js @@ -1,12 +1,12 @@ -import {restoreDefaultEvents} from "/src/scripts/events"; -import {findAll, findCell, getPackPolygon, isLand} from "/src/utils/graphUtils"; -import {byId} from "/src/utils/shorthands"; -import {tip, showMainTip, clearMainTip} from "/src/scripts/tooltips"; -import {getRandomColor, getMixedColor} from "/src/utils/colorUtils"; -import {rn} from "/src/utils/numberUtils"; -import {rand, P} from "/src/utils/probabilityUtils"; -import {si} from "/src/utils/unitUtils"; -import {getAdjective} from "/src/utils/languageUtils"; +import {restoreDefaultEvents} from "scripts/events"; +import {findAll, findCell, getPackPolygon, isLand} from "utils/graphUtils"; +import {byId} from "utils/shorthands"; +import {tip, showMainTip, clearMainTip} from "scripts/tooltips"; +import {getRandomColor, getMixedColor} from "utils/colorUtils"; +import {rn} from "utils/numberUtils"; +import {rand, P} from "utils/probabilityUtils"; +import {si} from "utils/unitUtils"; +import {getAdjective} from "utils/languageUtils"; const $body = insertEditorHtml(); addListeners(); @@ -403,18 +403,21 @@ function stateChangeFill(el) { } function editStateName(state) { + const $stateNameEditorCustomForm = byId("stateNameEditorCustomForm"); + const $stateNameEditorSelectForm = byId("stateNameEditorSelectForm"); + // reset input value and close add mode - stateNameEditorCustomForm.value = ""; - const addModeActive = stateNameEditorCustomForm.style.display === "inline-block"; + $stateNameEditorCustomForm.value = ""; + const addModeActive = $stateNameEditorCustomForm.style.display === "inline-block"; if (addModeActive) { - stateNameEditorCustomForm.style.display = "none"; - stateNameEditorSelectForm.style.display = "inline-block"; + $stateNameEditorCustomForm.style.display = "none"; + $stateNameEditorSelectForm.style.display = "inline-block"; } const s = pack.states[state]; byId("stateNameEditor").dataset.state = state; byId("stateNameEditorShort").value = s.name || ""; - applyOption(stateNameEditorSelectForm, s.formName); + applyDropdownOption($stateNameEditorSelectForm, s.formName); byId("stateNameEditorFull").value = s.fullName || ""; $("#stateNameEditor").dialog({ @@ -456,11 +459,15 @@ function editStateName(state) { } function addCustomForm() { - const value = stateNameEditorCustomForm.value; - const addModeActive = stateNameEditorCustomForm.style.display === "inline-block"; - stateNameEditorCustomForm.style.display = addModeActive ? "none" : "inline-block"; - stateNameEditorSelectForm.style.display = addModeActive ? "inline-block" : "none"; - if (value && addModeActive) applyOption(stateNameEditorSelectForm, value); + const $stateNameEditorCustomForm = byId("stateNameEditorCustomForm"); + const $stateNameEditorSelectForm = byId("stateNameEditorSelectForm"); + + const value = $stateNameEditorCustomForm.value; + const addModeActive = $stateNameEditorCustomForm.style.display === "inline-block"; + $stateNameEditorCustomForm.style.display = addModeActive ? "none" : "inline-block"; + $stateNameEditorSelectForm.style.display = addModeActive ? "inline-block" : "none"; + + if (value && addModeActive) applyDropdownOption($stateNameEditorSelectForm, value); stateNameEditorCustomForm.value = ""; } diff --git a/src/modules/dynamic/export-json.js b/src/modules/dynamic/export-json.js index b9f25e44..b3a822a6 100644 --- a/src/modules/dynamic/export-json.js +++ b/src/modules/dynamic/export-json.js @@ -1,4 +1,4 @@ -import {tip} from "/src/scripts/tooltips"; +import {tip} from "scripts/tooltips"; export function exportToJson(type) { if (customization) diff --git a/src/modules/dynamic/heightmap-selection.js b/src/modules/dynamic/heightmap-selection.js index 41f38f9b..e0b457e9 100644 --- a/src/modules/dynamic/heightmap-selection.js +++ b/src/modules/dynamic/heightmap-selection.js @@ -1,7 +1,7 @@ -import {shouldRegenerateGrid, generateGrid} from "/src/utils/graphUtils"; -import {byId} from "/src/utils/shorthands"; -import {generateSeed} from "/src/utils/probabilityUtils"; -import {getColorScheme} from "/src/utils/colorUtils"; +import {shouldRegenerateGrid, generateGrid} from "utils/graphUtils"; +import {byId} from "utils/shorthands"; +import {generateSeed} from "utils/probabilityUtils"; +import {getColorScheme} from "utils/colorUtils"; const initialSeed = generateSeed(); let graph = getGraph(grid); @@ -27,14 +27,14 @@ export function open() { }, Select: function () { const id = getSelected(); - applyOption($templateInput, id, getName(id)); + applyDropdownOption($templateInput, id, getName(id)); lock("template"); $(this).dialog("close"); }, "New Map": function () { const id = getSelected(); - applyOption($templateInput, id, getName(id)); + applyDropdownOption($templateInput, id, getName(id)); lock("template"); const seed = getSeed(); diff --git a/src/modules/dynamic/hierarchy-tree.js b/src/modules/dynamic/hierarchy-tree.js index 94b74a85..de68ca6e 100644 --- a/src/modules/dynamic/hierarchy-tree.js +++ b/src/modules/dynamic/hierarchy-tree.js @@ -1,6 +1,6 @@ -import {byId} from "/src/utils/shorthands"; -import {tip} from "/src/scripts/tooltips"; -import {capitalize} from "/src/utils/stringUtils"; +import {byId} from "utils/shorthands"; +import {tip} from "scripts/tooltips"; +import {capitalize} from "utils/stringUtils"; appendStyleSheet(); insertHtml(); diff --git a/src/modules/dynamic/installation.js b/src/modules/dynamic/installation.js index c6bee118..2d6ae90f 100644 --- a/src/modules/dynamic/installation.js +++ b/src/modules/dynamic/installation.js @@ -1,4 +1,4 @@ -import {tip} from "/src/scripts/tooltips"; +import {tip} from "scripts/tooltips"; // module to prompt PWA installation let installButton = null; diff --git a/src/modules/dynamic/overview/charts-overview.js b/src/modules/dynamic/overview/charts-overview.js index 49a3756d..3a97f91a 100644 --- a/src/modules/dynamic/overview/charts-overview.js +++ b/src/modules/dynamic/overview/charts-overview.js @@ -1,10 +1,10 @@ -import {isWater} from "/src/utils/graphUtils"; -import {tip} from "/src/scripts/tooltips"; -import {byId} from "/src/utils/shorthands"; -import {rn} from "/src/utils/numberUtils"; -import {capitalize} from "/src/utils/stringUtils"; -import {si, convertTemperature} from "/src/utils/unitUtils"; -import {rollups} from "/src/utils/functionUtils"; +import {isWater} from "utils/graphUtils"; +import {tip} from "scripts/tooltips"; +import {byId} from "utils/shorthands"; +import {rn} from "utils/numberUtils"; +import {capitalize} from "utils/stringUtils"; +import {si, convertTemperature, getFriendlyPrecipitation} from "utils/unitUtils"; +import {rollups} from "utils/functionUtils"; const entitiesMap = { states: { @@ -157,8 +157,8 @@ const quantizationMap = { label: "Annual mean precipitation", quantize: cellId => grid.cells.prec[pack.cells.g[cellId]], aggregate: values => rn(d3.mean(values)), - formatTicks: value => getPrecipitation(rn(value)), - stringify: value => getPrecipitation(rn(value)), + formatTicks: value => getFriendlyPrecipitation(rn(value)), + stringify: value => getFriendlyPrecipitation(rn(value)), stackable: false, landOnly: true }, @@ -166,8 +166,8 @@ const quantizationMap = { label: "Mean annual maximum precipitation", quantize: cellId => grid.cells.prec[pack.cells.g[cellId]], aggregate: values => rn(d3.max(values)), - formatTicks: value => getPrecipitation(rn(value)), - stringify: value => getPrecipitation(rn(value)), + formatTicks: value => getFriendlyPrecipitation(rn(value)), + stringify: value => getFriendlyPrecipitation(rn(value)), stackable: false, landOnly: true }, @@ -175,8 +175,8 @@ const quantizationMap = { label: "Mean annual minimum precipitation", quantize: cellId => grid.cells.prec[pack.cells.g[cellId]], aggregate: values => rn(d3.min(values)), - formatTicks: value => getPrecipitation(rn(value)), - stringify: value => getPrecipitation(rn(value)), + formatTicks: value => getFriendlyPrecipitation(rn(value)), + stringify: value => getFriendlyPrecipitation(rn(value)), stackable: false, landOnly: true }, diff --git a/src/modules/fonts.js b/src/modules/fonts.js index 80bec57b..aa02879a 100644 --- a/src/modules/fonts.js +++ b/src/modules/fonts.js @@ -1,4 +1,4 @@ -import {tip} from "/src/scripts/tooltips"; +import {tip} from "scripts/tooltips"; const fonts = [ {family: "Arial"}, diff --git a/src/modules/heightmap-generator.js b/src/modules/heightmap-generator.js index 8f2a052c..b285f904 100644 --- a/src/modules/heightmap-generator.js +++ b/src/modules/heightmap-generator.js @@ -1,10 +1,10 @@ import {ERROR} from "../config/logging"; import {lim, minmax} from "../utils/numberUtils"; -import {TIME} from "/src/config/logging"; -import {createTypedArray} from "/src/utils/arrayUtils"; -import {findGridCell} from "/src/utils/graphUtils"; -import {getNumberInRange, P, rand} from "/src/utils/probabilityUtils"; -import {byId} from "/src/utils/shorthands"; +import {TIME} from "config/logging"; +import {createTypedArray} from "utils/arrayUtils"; +import {findGridCell} from "utils/graphUtils"; +import {getNumberInRange, P, rand} from "utils/probabilityUtils"; +import {byId} from "utils/shorthands"; window.HeightmapGenerator = (function () { let grid = null; diff --git a/src/modules/io/cloud.js b/src/modules/io/cloud.js index 998d2338..18da11a2 100644 --- a/src/modules/io/cloud.js +++ b/src/modules/io/cloud.js @@ -1,4 +1,4 @@ -import {tip} from "/src/scripts/tooltips"; +import {tip} from "scripts/tooltips"; /* Cloud provider implementations (Dropbox only as now) diff --git a/src/modules/io/export.js b/src/modules/io/export.js index bd81913c..cfdddc76 100644 --- a/src/modules/io/export.js +++ b/src/modules/io/export.js @@ -1,10 +1,11 @@ -import {getGridPolygon} from "/src/utils/graphUtils"; -import {unique} from "/src/utils/arrayUtils"; -import {tip} from "/src/scripts/tooltips"; -import {getCoordinates} from "/src/utils/coordinateUtils"; -import {rn} from "/src/utils/numberUtils"; -import {getBase64} from "/src/utils/functionUtils"; -import {getColorScheme, getHeightColor} from "/src/utils/colorUtils"; +import {getGridPolygon} from "utils/graphUtils"; +import {unique} from "utils/arrayUtils"; +import {tip} from "scripts/tooltips"; +import {getCoordinates} from "utils/coordinateUtils"; +import {rn} from "utils/numberUtils"; +import {getBase64} from "utils/functionUtils"; +import {getColorScheme, getHeightColor} from "utils/colorUtils"; +import {getFriendlyHeight, getCellPopulation} from "utils/unitUtils"; // download map as SVG async function saveSVG() { diff --git a/src/modules/io/load.js b/src/modules/io/load.js index dc0309fc..4a0c7e69 100644 --- a/src/modules/io/load.js +++ b/src/modules/io/load.js @@ -1,12 +1,12 @@ -import {updatePresetInput} from "/src/layers"; -import {restoreDefaultEvents} from "/src/scripts/events"; -import {ldb} from "/src/scripts/indexedDB"; -import {tip} from "/src/scripts/tooltips"; -import {last} from "/src/utils/arrayUtils"; -import {parseError} from "/src/utils/errorUtils"; -import {calculateVoronoi, findCell} from "/src/utils/graphUtils"; -import {link} from "/src/utils/linkUtils"; -import {minmax, rn} from "/src/utils/numberUtils"; +import {updatePresetInput} from "layers"; +import {restoreDefaultEvents} from "scripts/events"; +import {ldb} from "scripts/indexedDB"; +import {tip} from "scripts/tooltips"; +import {last} from "utils/arrayUtils"; +import {parseError} from "utils/errorUtils"; +import {calculateVoronoi, findCell} from "utils/graphUtils"; +import {link} from "utils/linkUtils"; +import {minmax, rn} from "utils/numberUtils"; function quickLoad() { ldb.get("lastMap", blob => { @@ -211,10 +211,10 @@ async function parseLoadedData(data) { void (function parseSettings() { const settings = data[1].split("|"); - if (settings[0]) applyOption(distanceUnitInput, settings[0]); + if (settings[0]) applyDropdownOption(byId("distanceUnitInput"), settings[0]); if (settings[1]) distanceScale = distanceScaleInput.value = distanceScaleOutput.value = settings[1]; if (settings[2]) areaUnit.value = settings[2]; - if (settings[3]) applyOption(heightUnit, settings[3]); + if (settings[3]) applyDropdownOption(byId("heightUnit"), settings[3]); if (settings[4]) heightExponentInput.value = heightExponentOutput.value = settings[4]; if (settings[5]) temperatureScale.value = settings[5]; if (settings[6]) barSizeInput.value = barSizeOutput.value = settings[6]; diff --git a/src/modules/io/save.js b/src/modules/io/save.js index 8bec8945..dd77e11f 100644 --- a/src/modules/io/save.js +++ b/src/modules/io/save.js @@ -1,7 +1,7 @@ -import {tip} from "/src/scripts/tooltips"; -import {rn} from "/src/utils/numberUtils"; -import {ldb} from "/src/scripts/indexedDB"; -import {ra} from "/src/utils/probabilityUtils"; +import {tip} from "scripts/tooltips"; +import {rn} from "utils/numberUtils"; +import {ldb} from "scripts/indexedDB"; +import {ra} from "utils/probabilityUtils"; // functions to save project as .map file diff --git a/src/modules/lakes.js b/src/modules/lakes.js index a78bad36..802af65c 100644 --- a/src/modules/lakes.js +++ b/src/modules/lakes.js @@ -1,4 +1,4 @@ -import {rn} from "/src/utils/numberUtils"; +import {rn} from "utils/numberUtils"; window.Lakes = (function () { const setClimateData = function (h) { diff --git a/src/modules/legend.js b/src/modules/legend.js index be851510..29fb2225 100644 --- a/src/modules/legend.js +++ b/src/modules/legend.js @@ -1,5 +1,5 @@ import {rn} from "../utils/numberUtils"; -import {parseTransform} from "/src/utils/stringUtils"; +import {parseTransform} from "utils/stringUtils"; export function drawLegend(name, data) { legend.selectAll("*").remove(); // fully redraw every time diff --git a/src/modules/markers-generator.js b/src/modules/markers-generator.js index d40acdca..bc61175d 100644 --- a/src/modules/markers-generator.js +++ b/src/modules/markers-generator.js @@ -1,11 +1,10 @@ -import {TIME} from "/src/config/logging"; -import {getFriendlyHeight} from "./ui/general"; -import {last} from "/src/utils/arrayUtils"; -import {rn} from "/src/utils/numberUtils"; -import {rand, P, gauss, ra, rw} from "/src/utils/probabilityUtils"; -import {capitalize} from "/src/utils/stringUtils"; -import {convertTemperature} from "/src/utils/unitUtils"; -import {getAdjective, list} from "/src/utils/languageUtils"; +import {TIME} from "config/logging"; +import {last} from "utils/arrayUtils"; +import {rn} from "utils/numberUtils"; +import {rand, P, gauss, ra, rw} from "utils/probabilityUtils"; +import {capitalize} from "utils/stringUtils"; +import {convertTemperature, getFriendlyHeight} from "utils/unitUtils"; +import {getAdjective} from "utils/languageUtils"; window.Markers = (function () { let config = []; diff --git a/src/modules/measurers.js b/src/modules/measurers.js index 25393e19..3bc20989 100644 --- a/src/modules/measurers.js +++ b/src/modules/measurers.js @@ -1,9 +1,9 @@ -import {findCell} from "/src/utils/graphUtils"; -import {last} from "/src/utils/arrayUtils"; -import {getSegmentId} from "/src/utils/lineUtils"; -import {rn} from "/src/utils/numberUtils"; -import {round, parseTransform} from "/src/utils/stringUtils"; -import {si} from "/src/utils/unitUtils"; +import {findCell} from "utils/graphUtils"; +import {last} from "utils/arrayUtils"; +import {getSegmentId} from "utils/lineUtils"; +import {rn} from "utils/numberUtils"; +import {round, parseTransform} from "utils/stringUtils"; +import {si} from "utils/unitUtils"; export class Rulers { constructor() { diff --git a/src/modules/military-generator.js b/src/modules/military-generator.js index 68bea42e..bf3be081 100644 --- a/src/modules/military-generator.js +++ b/src/modules/military-generator.js @@ -1,8 +1,8 @@ -import {TIME} from "/src/config/logging"; -import {rn, minmax} from "/src/utils/numberUtils"; -import {rand, gauss, ra} from "/src/utils/probabilityUtils"; -import {si} from "/src/utils/unitUtils"; -import {nth} from "/src/utils/languageUtils"; +import {TIME} from "config/logging"; +import {rn, minmax} from "utils/numberUtils"; +import {rand, gauss, ra} from "utils/probabilityUtils"; +import {si} from "utils/unitUtils"; +import {nth} from "utils/languageUtils"; window.Military = (function () { const generate = function () { diff --git a/src/modules/names-generator.js b/src/modules/names-generator.js index 8327a629..cb5cfe72 100644 --- a/src/modules/names-generator.js +++ b/src/modules/names-generator.js @@ -1,9 +1,9 @@ -import {last} from "/src/utils/arrayUtils"; -import {locked} from "/src/scripts/options/lock"; -import {tip} from "/src/scripts/tooltips"; -import {rand, P, ra} from "/src/utils/probabilityUtils"; -import {capitalize} from "/src/utils/stringUtils"; -import {vowel} from "/src/utils/languageUtils"; +import {last} from "utils/arrayUtils"; +import {locked} from "scripts/options/lock"; +import {tip} from "scripts/tooltips"; +import {rand, P, ra} from "utils/probabilityUtils"; +import {capitalize} from "utils/stringUtils"; +import {vowel} from "utils/languageUtils"; window.Names = (function () { let chains = []; diff --git a/src/modules/ocean-layers.js b/src/modules/ocean-layers.js index 6a103b9e..1927e4f2 100644 --- a/src/modules/ocean-layers.js +++ b/src/modules/ocean-layers.js @@ -1,8 +1,8 @@ -import {TIME} from "/src/config/logging"; -import {clipPoly} from "/src/utils/lineUtils"; -import {rn} from "/src/utils/numberUtils"; -import {P} from "/src/utils/probabilityUtils"; -import {round} from "/src/utils/stringUtils"; +import {TIME} from "config/logging"; +import {clipPoly} from "utils/lineUtils"; +import {rn} from "utils/numberUtils"; +import {P} from "utils/probabilityUtils"; +import {round} from "utils/stringUtils"; window.OceanLayers = (function () { let cells, vertices, pointsN, used; diff --git a/src/modules/relief-icons.js b/src/modules/relief-icons.js index 87602126..616fc2c7 100644 --- a/src/modules/relief-icons.js +++ b/src/modules/relief-icons.js @@ -1,6 +1,6 @@ -import {getPackPolygon} from "/src/utils/graphUtils"; -import {rn, minmax} from "/src/utils/numberUtils"; -import {rand} from "/src/utils/probabilityUtils"; +import {getPackPolygon} from "utils/graphUtils"; +import {rn, minmax} from "utils/numberUtils"; +import {rand} from "utils/probabilityUtils"; window.ReliefIcons = (function () { const ReliefIcons = function () { diff --git a/src/modules/religions-generator.js b/src/modules/religions-generator.js index a7b03d55..04091340 100644 --- a/src/modules/religions-generator.js +++ b/src/modules/religions-generator.js @@ -1,10 +1,10 @@ -import {TIME} from "/src/config/logging"; -import {findAll} from "/src/utils/graphUtils"; -import {unique} from "/src/utils/arrayUtils"; -import {getRandomColor, getMixedColor} from "/src/utils/colorUtils"; -import {rn} from "/src/utils/numberUtils"; -import {rand, P, ra, rw, biased, gauss} from "/src/utils/probabilityUtils"; -import {trimVowels, getAdjective, abbreviate} from "/src/utils/languageUtils"; +import {TIME} from "config/logging"; +import {findAll} from "utils/graphUtils"; +import {unique} from "utils/arrayUtils"; +import {getRandomColor, getMixedColor} from "utils/colorUtils"; +import {rn} from "utils/numberUtils"; +import {rand, P, ra, rw, biased, gauss} from "utils/probabilityUtils"; +import {trimVowels, getAdjective, abbreviate} from "utils/languageUtils"; window.Religions = (function () { // name generation approach and relative chance to be selected diff --git a/src/modules/river-generator.js b/src/modules/river-generator.js index 34913653..0ea7a4ff 100644 --- a/src/modules/river-generator.js +++ b/src/modules/river-generator.js @@ -1,8 +1,8 @@ -import {TIME, WARN} from "/src/config/logging"; -import {last} from "/src/utils/arrayUtils"; -import {rn} from "/src/utils/numberUtils"; -import {round} from "/src/utils/stringUtils"; -import {rw, each} from "/src/utils/probabilityUtils"; +import {TIME, WARN} from "config/logging"; +import {last} from "utils/arrayUtils"; +import {rn} from "utils/numberUtils"; +import {round} from "utils/stringUtils"; +import {rw, each} from "utils/probabilityUtils"; window.Rivers = (function () { const generate = function (allowErosion = true) { diff --git a/src/modules/routes-generator.js b/src/modules/routes-generator.js index c0f0253c..d4fc6aa9 100644 --- a/src/modules/routes-generator.js +++ b/src/modules/routes-generator.js @@ -1,7 +1,7 @@ -import {TIME} from "/src/config/logging"; -import {findCell} from "/src/utils/graphUtils"; -import {last} from "/src/utils/arrayUtils"; -import {round} from "/src/utils/stringUtils"; +import {TIME} from "config/logging"; +import {findCell} from "utils/graphUtils"; +import {last} from "utils/arrayUtils"; +import {round} from "utils/stringUtils"; window.Routes = (function () { const getRoads = function () { diff --git a/src/modules/submap.js b/src/modules/submap.js index dec90236..84e131a2 100644 --- a/src/modules/submap.js +++ b/src/modules/submap.js @@ -1,6 +1,6 @@ -import {findCell} from "/src/utils/graphUtils"; -import {getMiddlePoint} from "/src/utils/lineUtils"; -import {rn} from "/src/utils/numberUtils"; +import {findCell} from "utils/graphUtils"; +import {getMiddlePoint} from "utils/lineUtils"; +import {rn} from "utils/numberUtils"; window.Submap = (function () { const isWater = (pack, id) => pack.cells.h[id] < 20; diff --git a/src/modules/ui/3d.js b/src/modules/ui/3d.js index 1c1d5e69..54880947 100644 --- a/src/modules/ui/3d.js +++ b/src/modules/ui/3d.js @@ -1,6 +1,6 @@ -import {tip} from "/src/scripts/tooltips"; -import {rn} from "/src/utils/numberUtils"; -import {throttle} from "/src/utils/functionUtils"; +import {tip} from "scripts/tooltips"; +import {rn} from "utils/numberUtils"; +import {throttle} from "utils/functionUtils"; window.ThreeD = (function () { const options = { diff --git a/src/modules/ui/battle-screen.js b/src/modules/ui/battle-screen.js index 54457da7..09060c94 100644 --- a/src/modules/ui/battle-screen.js +++ b/src/modules/ui/battle-screen.js @@ -1,10 +1,10 @@ -import {last} from "/src/utils/arrayUtils"; -import {tip} from "/src/scripts/tooltips"; -import {wiki} from "/src/utils/linkUtils"; -import {rn, minmax} from "/src/utils/numberUtils"; -import {rand, P, Pint} from "/src/utils/probabilityUtils"; -import {capitalize} from "/src/utils/stringUtils"; -import {getAdjective, list} from "/src/utils/languageUtils"; +import {last} from "utils/arrayUtils"; +import {tip} from "scripts/tooltips"; +import {wiki} from "utils/linkUtils"; +import {rn, minmax} from "utils/numberUtils"; +import {rand, P, Pint} from "utils/probabilityUtils"; +import {capitalize} from "utils/stringUtils"; +import {getAdjective, list} from "utils/languageUtils"; export class Battle { constructor(attacker, defender) { diff --git a/src/modules/ui/biomes-editor.js b/src/modules/ui/biomes-editor.js index a594143e..56113fa0 100644 --- a/src/modules/ui/biomes-editor.js +++ b/src/modules/ui/biomes-editor.js @@ -1,10 +1,10 @@ -import {restoreDefaultEvents} from "/src/scripts/events"; -import {findAll, findCell, getPackPolygon, isLand} from "/src/utils/graphUtils"; -import {tip, showMainTip, clearMainTip} from "/src/scripts/tooltips"; -import {getRandomColor} from "/src/utils/colorUtils"; -import {openURL} from "/src/utils/linkUtils"; -import {rn} from "/src/utils/numberUtils"; -import {si} from "/src/utils/unitUtils"; +import {restoreDefaultEvents} from "scripts/events"; +import {findAll, findCell, getPackPolygon, isLand} from "utils/graphUtils"; +import {tip, showMainTip, clearMainTip} from "scripts/tooltips"; +import {getRandomColor} from "utils/colorUtils"; +import {openURL} from "utils/linkUtils"; +import {rn} from "utils/numberUtils"; +import {si} from "utils/unitUtils"; export function editBiomes() { if (customization) return; diff --git a/src/modules/ui/burg-editor.js b/src/modules/ui/burg-editor.js index 4411a38d..00f856f0 100644 --- a/src/modules/ui/burg-editor.js +++ b/src/modules/ui/burg-editor.js @@ -1,9 +1,10 @@ -import {findCell} from "/src/utils/graphUtils"; -import {tip, clearMainTip} from "/src/scripts/tooltips"; -import {rn} from "/src/utils/numberUtils"; -import {prompt} from "/src/scripts/prompt"; -import {rand} from "/src/utils/probabilityUtils"; -import {parseTransform} from "/src/utils/stringUtils"; +import {findCell} from "utils/graphUtils"; +import {tip, clearMainTip} from "scripts/tooltips"; +import {rn} from "utils/numberUtils"; +import {prompt} from "scripts/prompt"; +import {rand} from "utils/probabilityUtils"; +import {parseTransform} from "utils/stringUtils"; +import {getHeight} from "utils/unitUtils"; export function editBurg(id) { if (customization) return; diff --git a/src/modules/ui/burgs-overview.js b/src/modules/ui/burgs-overview.js index 346e74b8..52a0f295 100644 --- a/src/modules/ui/burgs-overview.js +++ b/src/modules/ui/burgs-overview.js @@ -1,9 +1,10 @@ -import {restoreDefaultEvents} from "/src/scripts/events"; -import {findCell} from "/src/utils/graphUtils"; -import {tip, clearMainTip} from "/src/scripts/tooltips"; -import {getCoordinates} from "/src/utils/coordinateUtils"; -import {rn} from "/src/utils/numberUtils"; -import {si, siToInteger} from "/src/utils/unitUtils"; +import {restoreDefaultEvents} from "scripts/events"; +import {findCell} from "utils/graphUtils"; +import {tip, clearMainTip} from "scripts/tooltips"; +import {getCoordinates} from "utils/coordinateUtils"; +import {rn} from "utils/numberUtils"; +import {si, siToInteger} from "utils/unitUtils"; +import {getHeight} from "utils/unitUtils"; export function overviewBurgs() { if (customization) return; diff --git a/src/modules/ui/cell-info.js b/src/modules/ui/cell-info.js new file mode 100644 index 00000000..b28af147 --- /dev/null +++ b/src/modules/ui/cell-info.js @@ -0,0 +1,64 @@ +import {getHeight, getCellIdPrecipitation, getFriendlyPopulation} from "utils/unitUtils.ts"; + +// get cell info on mouse move +export function updateCellInfo(point, i, g) { + const cells = pack.cells; + const x = (infoX.innerHTML = rn(point[0])); + const y = (infoY.innerHTML = rn(point[1])); + const f = cells.f[i]; + + const [lon, lat] = getCoordinates(x, y, 4); + infoLat.innerHTML = toDMS(lat, "lat"); + infoLon.innerHTML = toDMS(lon, "lon"); + + infoCell.innerHTML = i; + infoArea.innerHTML = cells.area[i] ? si(getArea(cells.area[i])) + " " + getAreaUnit() : "n/a"; + infoEvelation.innerHTML = getElevation(pack.features[f], pack.cells.h[i]); + infoDepth.innerHTML = getDepth(pack.features[f], point); + infoTemp.innerHTML = convertTemperature(grid.cells.temp[g]); + infoPrec.innerHTML = cells.h[i] >= 20 ? getCellIdPrecipitation(i) : "n/a"; + infoRiver.innerHTML = cells.h[i] >= 20 && cells.r[i] ? getRiverInfo(cells.r[i]) : "no"; + infoState.innerHTML = + cells.h[i] >= 20 + ? cells.state[i] + ? `${pack.states[cells.state[i]].fullName} (${cells.state[i]})` + : "neutral lands (0)" + : "no"; + infoProvince.innerHTML = cells.province[i] + ? `${pack.provinces[cells.province[i]].fullName} (${cells.province[i]})` + : "no"; + infoCulture.innerHTML = cells.culture[i] ? `${pack.cultures[cells.culture[i]].name} (${cells.culture[i]})` : "no"; + infoReligion.innerHTML = cells.religion[i] + ? `${pack.religions[cells.religion[i]].name} (${cells.religion[i]})` + : "no"; + infoPopulation.innerHTML = getFriendlyPopulation(i); + infoBurg.innerHTML = cells.burg[i] ? pack.burgs[cells.burg[i]].name + " (" + cells.burg[i] + ")" : "no"; + infoFeature.innerHTML = f ? pack.features[f].group + " (" + f + ")" : "n/a"; + infoBiome.innerHTML = biomesData.name[cells.biome[i]]; +} + +// get surface elevation +function getElevation(f, h) { + if (f.land) return getHeight(h) + " (" + h + ")"; // land: usual height + if (f.border) return "0 " + heightUnit.value; // ocean: 0 + if (f.type === "lake") return getHeight(f.height) + " (" + f.height + ")"; // lake: defined on river generation +} + +// get water depth +function getDepth(f, p) { + if (f.land) return "0 " + heightUnit.value; // land: 0 + + // lake: difference between surface and bottom + const gridH = grid.cells.h[findGridCell(p[0], p[1], grid)]; + if (f.type === "lake") { + const depth = gridH === 19 ? f.height / 2 : gridH; + return getHeight(depth, true); + } + + return getHeight(gridH, true); // ocean: grid height +} + +function getRiverInfo(id) { + const r = pack.rivers.find(r => r.i == id); + return r ? `${r.name} ${r.type} (${id})` : "n/a"; +} diff --git a/src/modules/ui/coastline-editor.js b/src/modules/ui/coastline-editor.js index 36bd1ed1..5d7e8e51 100644 --- a/src/modules/ui/coastline-editor.js +++ b/src/modules/ui/coastline-editor.js @@ -1,9 +1,9 @@ -import {getPackPolygon} from "/src/utils/graphUtils"; -import {tip} from "/src/scripts/tooltips"; -import {clipPoly} from "/src/utils/lineUtils"; -import {rn} from "/src/utils/numberUtils"; -import {round} from "/src/utils/stringUtils"; -import {si} from "/src/utils/unitUtils"; +import {getPackPolygon} from "utils/graphUtils"; +import {tip} from "scripts/tooltips"; +import {clipPoly} from "utils/lineUtils"; +import {rn} from "utils/numberUtils"; +import {round} from "utils/stringUtils"; +import {si} from "utils/unitUtils"; export function editCoastline(node = d3.event.target) { if (customization) return; diff --git a/src/modules/ui/diplomacy-editor.js b/src/modules/ui/diplomacy-editor.js index 9559ac6f..bcacd399 100644 --- a/src/modules/ui/diplomacy-editor.js +++ b/src/modules/ui/diplomacy-editor.js @@ -1,6 +1,6 @@ -import {restoreDefaultEvents} from "/src/scripts/events"; -import {findCell} from "/src/utils/graphUtils"; -import {tip, clearMainTip} from "/src/scripts/tooltips"; +import {restoreDefaultEvents} from "scripts/events"; +import {findCell} from "utils/graphUtils"; +import {tip, clearMainTip} from "scripts/tooltips"; export function editDiplomacy() { if (customization) return; diff --git a/src/modules/ui/editors.js b/src/modules/ui/editors.js index 6d05834f..c4f78b92 100644 --- a/src/modules/ui/editors.js +++ b/src/modules/ui/editors.js @@ -1,9 +1,9 @@ -import {restoreDefaultEvents} from "/src/scripts/events"; -import {findCell} from "/src/utils/graphUtils"; -import {byId} from "/src/utils/shorthands"; -import {tip} from "/src/scripts/tooltips"; -import {rn, minmax, normalize} from "/src/utils/numberUtils"; -import {parseTransform} from "/src/utils/stringUtils"; +import {restoreDefaultEvents} from "scripts/events"; +import {findCell} from "utils/graphUtils"; +import {byId} from "utils/shorthands"; +import {tip} from "scripts/tooltips"; +import {rn, minmax, normalize} from "utils/numberUtils"; +import {parseTransform} from "utils/stringUtils"; // clear elSelected variable export function unselect() { diff --git a/src/modules/ui/elevation-profile.js b/src/modules/ui/elevation-profile.js index 9b808544..7d485696 100644 --- a/src/modules/ui/elevation-profile.js +++ b/src/modules/ui/elevation-profile.js @@ -1,6 +1,7 @@ -import {findCell} from "/src/utils/graphUtils"; -import {rn} from "/src/utils/numberUtils"; -import {getColorScheme, getHeightColor} from "/src/utils/colorUtils"; +import {findCell} from "utils/graphUtils"; +import {rn} from "utils/numberUtils"; +import {getColorScheme, getHeightColor} from "utils/colorUtils"; +import {getHeight} from "utils/unitUtils.ts"; export function showEPForRoute(node) { const points = []; diff --git a/src/modules/ui/emblems-editor.js b/src/modules/ui/emblems-editor.js index 0158d3a1..a31f9e13 100644 --- a/src/modules/ui/emblems-editor.js +++ b/src/modules/ui/emblems-editor.js @@ -1,8 +1,8 @@ -import {clearMainTip} from "/src/scripts/tooltips"; -import {tip} from "/src/scripts/tooltips"; -import {openURL} from "/src/utils/linkUtils"; -import {rn} from "/src/utils/numberUtils"; -import {parseTransform} from "/src/utils/stringUtils"; +import {clearMainTip} from "scripts/tooltips"; +import {tip} from "scripts/tooltips"; +import {openURL} from "utils/linkUtils"; +import {rn} from "utils/numberUtils"; +import {parseTransform} from "utils/stringUtils"; export function editEmblem(type, id, el) { if (customization) return; @@ -179,7 +179,59 @@ export function editEmblem(type, id, el) { } function showArea() { - highlightEmblemElement(type, el); + const i = el.i; + const cells = pack.cells; + const animation = d3.transition().duration(1000).ease(d3.easeSinIn); + + if (type === "burg") { + const {x, y} = el; + debug + .append("circle") + .attr("cx", x) + .attr("cy", y) + .attr("r", 0) + .attr("fill", "none") + .attr("stroke", "#d0240f") + .attr("stroke-width", 1) + .attr("opacity", 1) + .transition(animation) + .attr("r", 20) + .attr("opacity", 0.1) + .attr("stroke-width", 0) + .remove(); + return; + } + + const [x, y] = el.pole || pack.cells.p[el.center]; + const obj = type === "state" ? cells.state : cells.province; + const borderCells = cells.i.filter(id => obj[id] === i && cells.c[id].some(n => obj[n] !== i)); + const data = Array.from(borderCells) + .filter((c, i) => !(i % 2)) + .map(i => cells.p[i]) + .map(i => [i[0], i[1], Math.hypot(i[0] - x, i[1] - y)]); + + debug + .selectAll("line") + .data(data) + .enter() + .append("line") + .attr("x1", x) + .attr("y1", y) + .attr("x2", d => d[0]) + .attr("y2", d => d[1]) + .attr("stroke", "#d0240f") + .attr("stroke-width", 0.5) + .attr("opacity", 0.2) + .attr("stroke-dashoffset", d => d[2]) + .attr("stroke-dasharray", d => d[2]) + .transition(animation) + .attr("stroke-dashoffset", 0) + .attr("opacity", 1) + .transition(animation) + .delay(1000) + .attr("stroke-dashoffset", d => d[2]) + .attr("opacity", 0) + .remove(); } function changeSize() { diff --git a/src/modules/ui/general.js b/src/modules/ui/general.js deleted file mode 100644 index c8e227f8..00000000 --- a/src/modules/ui/general.js +++ /dev/null @@ -1,270 +0,0 @@ -import {findCell, findGridCell} from "/src/utils/graphUtils"; -import {rn} from "/src/utils/numberUtils"; -import {link} from "/src/utils/linkUtils"; -import {getCoordinates, toDMS} from "/src/utils/coordinateUtils"; -import {si, convertTemperature} from "/src/utils/unitUtils"; -import {stored} from "/src/utils/shorthands"; - -// fit full-screen map if window is resized -window.addEventListener("resize", function (e) { - if (stored("mapWidth") && stored("mapHeight")) return; - mapWidthInput.value = window.innerWidth; - mapHeightInput.value = window.innerHeight; - changeMapSize(); -}); - -if (location.hostname && location.hostname !== "localhost" && location.hostname !== "127.0.0.1") { - window.onbeforeunload = () => "Are you sure you want to navigate away?"; -} - -function highlightEditorLine(editor, id, timeout = 10000) { - Array.from(editor.getElementsByClassName("states hovered")).forEach(el => el.classList.remove("hovered")); // clear all hovered - const hovered = Array.from(editor.querySelectorAll("div")).find(el => el.dataset.id == id); - if (hovered) hovered.classList.add("hovered"); // add hovered class - if (timeout) - setTimeout(() => { - hovered && hovered.classList.remove("hovered"); - }, timeout); -} - -// get cell info on mouse move -function updateCellInfo(point, i, g) { - const cells = pack.cells; - const x = (infoX.innerHTML = rn(point[0])); - const y = (infoY.innerHTML = rn(point[1])); - const f = cells.f[i]; - - const [lon, lat] = getCoordinates(x, y, 4); - infoLat.innerHTML = toDMS(lat, "lat"); - infoLon.innerHTML = toDMS(lon, "lon"); - - infoCell.innerHTML = i; - infoArea.innerHTML = cells.area[i] ? si(getArea(cells.area[i])) + " " + getAreaUnit() : "n/a"; - infoEvelation.innerHTML = getElevation(pack.features[f], pack.cells.h[i]); - infoDepth.innerHTML = getDepth(pack.features[f], point); - infoTemp.innerHTML = convertTemperature(grid.cells.temp[g]); - infoPrec.innerHTML = cells.h[i] >= 20 ? getFriendlyPrecipitation(i) : "n/a"; - infoRiver.innerHTML = cells.h[i] >= 20 && cells.r[i] ? getRiverInfo(cells.r[i]) : "no"; - infoState.innerHTML = - cells.h[i] >= 20 - ? cells.state[i] - ? `${pack.states[cells.state[i]].fullName} (${cells.state[i]})` - : "neutral lands (0)" - : "no"; - infoProvince.innerHTML = cells.province[i] - ? `${pack.provinces[cells.province[i]].fullName} (${cells.province[i]})` - : "no"; - infoCulture.innerHTML = cells.culture[i] ? `${pack.cultures[cells.culture[i]].name} (${cells.culture[i]})` : "no"; - infoReligion.innerHTML = cells.religion[i] - ? `${pack.religions[cells.religion[i]].name} (${cells.religion[i]})` - : "no"; - infoPopulation.innerHTML = getFriendlyPopulation(i); - infoBurg.innerHTML = cells.burg[i] ? pack.burgs[cells.burg[i]].name + " (" + cells.burg[i] + ")" : "no"; - infoFeature.innerHTML = f ? pack.features[f].group + " (" + f + ")" : "n/a"; - infoBiome.innerHTML = biomesData.name[cells.biome[i]]; -} - -// get surface elevation -function getElevation(f, h) { - if (f.land) return getHeight(h) + " (" + h + ")"; // land: usual height - if (f.border) return "0 " + heightUnit.value; // ocean: 0 - if (f.type === "lake") return getHeight(f.height) + " (" + f.height + ")"; // lake: defined on river generation -} - -// get water depth -function getDepth(f, p) { - if (f.land) return "0 " + heightUnit.value; // land: 0 - - // lake: difference between surface and bottom - const gridH = grid.cells.h[findGridCell(p[0], p[1], grid)]; - if (f.type === "lake") { - const depth = gridH === 19 ? f.height / 2 : gridH; - return getHeight(depth, "abs"); - } - - return getHeight(gridH, "abs"); // ocean: grid height -} - -// get user-friendly (real-world) height value from map data -export function getFriendlyHeight([x, y]) { - const packH = pack.cells.h[findCell(x, y)]; - const gridH = grid.cells.h[findGridCell(x, y, grid)]; - const h = packH < 20 ? gridH : packH; - return getHeight(h); -} - -function getHeight(h, abs) { - const unit = heightUnit.value; - let unitRatio = 3.281; // default calculations are in feet - if (unit === "m") unitRatio = 1; // if meter - else if (unit === "f") unitRatio = 0.5468; // if fathom - - let height = -990; - if (h >= 20) height = Math.pow(h - 18, +heightExponentInput.value); - else if (h < 20 && h > 0) height = ((h - 20) / h) * 50; - - if (abs) height = Math.abs(height); - return rn(height * unitRatio) + " " + unit; -} - -function getPrecipitation(prec) { - return prec * 100 + " mm"; -} - -// get user-friendly (real-world) precipitation value from map data -function getFriendlyPrecipitation(i) { - const prec = grid.cells.prec[pack.cells.g[i]]; - return getPrecipitation(prec); -} - -function getRiverInfo(id) { - const r = pack.rivers.find(r => r.i == id); - return r ? `${r.name} ${r.type} (${id})` : "n/a"; -} - -function getCellPopulation(i) { - const rural = pack.cells.pop[i] * populationRate; - const urban = pack.cells.burg[i] ? pack.burgs[pack.cells.burg[i]].population * populationRate * urbanization : 0; - return [rural, urban]; -} - -// get user-friendly (real-world) population value from map data -function getFriendlyPopulation(i) { - const [rural, urban] = getCellPopulation(i); - return `${si(rural + urban)} (${si(rural)} rural, urban ${si(urban)})`; -} - -function getPopulationTip(i) { - const [rural, urban] = getCellPopulation(i); - return `Cell population: ${si(rural + urban)}; Rural: ${si(rural)}; Urban: ${si(urban)}`; -} - -function highlightEmblemElement(type, el) { - const i = el.i, - cells = pack.cells; - const animation = d3.transition().duration(1000).ease(d3.easeSinIn); - - if (type === "burg") { - const {x, y} = el; - debug - .append("circle") - .attr("cx", x) - .attr("cy", y) - .attr("r", 0) - .attr("fill", "none") - .attr("stroke", "#d0240f") - .attr("stroke-width", 1) - .attr("opacity", 1) - .transition(animation) - .attr("r", 20) - .attr("opacity", 0.1) - .attr("stroke-width", 0) - .remove(); - return; - } - - const [x, y] = el.pole || pack.cells.p[el.center]; - const obj = type === "state" ? cells.state : cells.province; - const borderCells = cells.i.filter(id => obj[id] === i && cells.c[id].some(n => obj[n] !== i)); - const data = Array.from(borderCells) - .filter((c, i) => !(i % 2)) - .map(i => cells.p[i]) - .map(i => [i[0], i[1], Math.hypot(i[0] - x, i[1] - y)]); - - debug - .selectAll("line") - .data(data) - .enter() - .append("line") - .attr("x1", x) - .attr("y1", y) - .attr("x2", d => d[0]) - .attr("y2", d => d[1]) - .attr("stroke", "#d0240f") - .attr("stroke-width", 0.5) - .attr("opacity", 0.2) - .attr("stroke-dashoffset", d => d[2]) - .attr("stroke-dasharray", d => d[2]) - .transition(animation) - .attr("stroke-dashoffset", 0) - .attr("opacity", 1) - .transition(animation) - .delay(1000) - .attr("stroke-dashoffset", d => d[2]) - .attr("opacity", 0) - .remove(); -} - -// assign skeaker behaviour -Array.from(document.getElementsByClassName("speaker")).forEach(el => { - const input = el.previousElementSibling; - el.addEventListener("click", () => speak(input.value)); -}); - -function speak(text) { - const speaker = new SpeechSynthesisUtterance(text); - const voices = speechSynthesis.getVoices(); - if (voices.length) { - const voiceId = +document.getElementById("speakerVoice").value; - speaker.voice = voices[voiceId]; - } - speechSynthesis.speak(speaker); -} - -// apply drop-down menu option. If the value is not in options, add it -export function applyOption($select, value, name = value) { - const isExisting = Array.from($select.options).some(o => o.value === value); - if (!isExisting) $select.options.add(new Option(name, value)); - $select.value = value; -} - -// show info about the generator in a popup -function showInfo() { - const Discord = link("https://discordapp.com/invite/X7E84HU", "Discord"); - const Reddit = link("https://www.reddit.com/r/FantasyMapGenerator", "Reddit"); - const Patreon = link("https://www.patreon.com/azgaar", "Patreon"); - const Armoria = link("https://azgaar.github.io/Armoria", "Armoria"); - - const QuickStart = link( - "https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Quick-Start-Tutorial", - "Quick start tutorial" - ); - const QAA = link("https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Q&A", "Q&A page"); - const VideoTutorial = link("https://youtube.com/playlist?list=PLtgiuDC8iVR2gIG8zMTRn7T_L0arl9h1C", "Video tutorial"); - - alertMessage.innerHTML = /* html */ `Fantasy Map Generator (FMG) is a free open-source application. It means that you own all created maps and can use them as - you wish. - -
- The development is community-backed, you can donate on ${Patreon}. You can also help creating overviews, tutorials and spreding the word about the - Generator. -
- -- The best way to get help is to contact the community on ${Discord} and ${Reddit}. Before asking questions, please check out the ${QuickStart}, the ${QAA}, - and ${VideoTutorial}. -
- -Check out our another project: ${Armoria} — heraldry generator and editor.
- -+ The development is community-backed, you can donate on ${Patreon}. You can also help creating overviews, tutorials and spreding the word about the + Generator. +
+ ++ The best way to get help is to contact the community on ${Discord} and ${Reddit}. Before asking questions, please check out the ${QuickStart}, the ${QAA}, + and ${VideoTutorial}. +
+ +Check out our another project: ${Armoria} — heraldry generator and editor.
+ +