diff --git a/index.html b/index.html
index 2cecd05a..26f23f36 100644
--- a/index.html
+++ b/index.html
@@ -7990,12 +7990,12 @@
-
+
-
-
+
+
@@ -8030,16 +8030,16 @@
-
-
+
+
-
-
-
+
+
+
diff --git a/main.js b/main.js
index 78270510..945fb0bd 100644
--- a/main.js
+++ b/main.js
@@ -306,9 +306,9 @@ async function checkLoadParameters() {
async function generateMapOnLoad() {
await applyStyleOnLoad(); // apply previously selected default or custom style
await generate(); // generate map
- focusOn(); // based on searchParams focus on point, cell or burg from MFCG
applyPreset(); // apply saved layers preset
fitMapToScreen();
+ focusOn(); // based on searchParams focus on point, cell or burg from MFCG
}
// focus on coordinates, cell or burg provided in searchParams
diff --git a/modules/dynamic/supporters.js b/modules/dynamic/supporters.js
index f65caf62..2c608cb4 100644
--- a/modules/dynamic/supporters.js
+++ b/modules/dynamic/supporters.js
@@ -541,4 +541,9 @@ Igor
John Todd
burning.rosary
Shane Roppel
-Hank Agrippa`;
+Hank Agrippa
+Noah Morris
+Phil Karecki
+Matthew Jarocki
+Lucius Licinius Lucullus
+Andrew Haney`;
diff --git a/modules/io/cloud.js b/modules/io/cloud.js
index 01338c0b..4e174194 100644
--- a/modules/io/cloud.js
+++ b/modules/io/cloud.js
@@ -118,9 +118,9 @@ window.Cloud = (function () {
},
async getLink(path) {
- // return existitng shared link
+ // return existing shared link
const sharedLinks = await this.call("sharingListSharedLinks", {path});
- if (sharedLinks.result.links.length) return resp.result.links[0].url;
+ if (sharedLinks.result.links.length) return sharedLinks.result.links[0].url;
// create new shared link
const settings = {
diff --git a/modules/io/export.js b/modules/io/export.js
index 648c29e5..7a6c65a7 100644
--- a/modules/io/export.js
+++ b/modules/io/export.js
@@ -138,16 +138,15 @@ async function exportToPngTiles() {
}
// parse map svg to object url
-async function getMapURL(type, options = {}) {
+async function getMapURL(type, options) {
const {
debug = false,
- globe = false,
noLabels = false,
noWater = false,
noScaleBar = false,
noIce = false,
fullMap = false
- } = options;
+ } = options || {};
const cloneEl = document.getElementById("map").cloneNode(true); // clone svg
cloneEl.id = "fantasyMap";
@@ -160,7 +159,6 @@ async function getMapURL(type, options = {}) {
const isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") > -1;
if (isFirefox && type === "mesh") clone.select("#oceanPattern")?.remove();
- if (globe) clone.select("#scaleBar")?.remove();
if (noLabels) {
clone.select("#labels #states")?.remove();
clone.select("#labels #burgLabels")?.remove();
@@ -171,14 +169,17 @@ async function getMapURL(type, options = {}) {
clone.select("#oceanPattern").attr("opacity", 0);
}
if (noIce) clone.select("#ice")?.remove();
- if (noScaleBar) clone.select("#scaleBar")?.remove();
if (fullMap) {
// reset transform to show the whole map
clone.attr("width", graphWidth).attr("height", graphHeight);
clone.select("#viewbox").attr("transform", null);
- drawScaleBar(clone.select("#scaleBar"), 1);
- fitScaleBar(clone.select("#scaleBar"), graphWidth, graphHeight);
+
+ if (!noScaleBar) {
+ drawScaleBar(clone.select("#scaleBar"), 1);
+ fitScaleBar(clone.select("#scaleBar"), graphWidth, graphHeight);
+ }
}
+ if (noScaleBar) clone.select("#scaleBar")?.remove();
if (type === "svg") removeUnusedElements(clone);
if (customization && type === "mesh") updateMeshCells(clone);
diff --git a/modules/io/load.js b/modules/io/load.js
index f2154872..282cf009 100644
--- a/modules/io/load.js
+++ b/modules/io/load.js
@@ -21,22 +21,19 @@ async function createSharableDropboxLink() {
const mapFile = document.querySelector("#loadFromDropbox select").value;
const sharableLink = document.getElementById("sharableLink");
const sharableLinkContainer = document.getElementById("sharableLinkContainer");
- let url;
+
try {
- url = await Cloud.providers.dropbox.getLink(mapFile);
- } catch {
+ const previewLink = await Cloud.providers.dropbox.getLink(mapFile);
+ const directLink = previewLink.replace("www.dropbox.com", "dl.dropboxusercontent.com"); // DL allows CORS
+ const finalLink = `${location.origin}${location.pathname}?maplink=${directLink}`;
+
+ sharableLink.innerText = finalLink.slice(0, 45) + "...";
+ sharableLink.setAttribute("href", finalLink);
+ sharableLinkContainer.style.display = "block";
+ } catch (error) {
+ ERROR && console.error(error);
return tip("Dropbox API error. Can not create link.", true, "error", 2000);
}
-
- const fmg = window.location.href.split("?")[0];
- const reallink = `${fmg}?maplink=${url}`;
- // voodoo magic required by the yellow god of CORS
- const link = reallink.replace("www.dropbox.com/s/", "dl.dropboxusercontent.com/1/view/");
- const shortLink = link.slice(0, 50) + "...";
-
- sharableLinkContainer.style.display = "block";
- sharableLink.innerText = shortLink;
- sharableLink.setAttribute("href", link);
}
function loadMapPrompt(blob) {
@@ -349,6 +346,15 @@ async function parseLoadedData(data) {
burgLabels = labels.select("#burgLabels");
})();
+ void (function addMissingElements() {
+ if (!texture.size()) {
+ texture = viewbox
+ .insert("g", "#landmass")
+ .attr("id", "texture")
+ .attr("data-href", "./images/textures/plaster.jpg");
+ }
+ })();
+
void (function parseGridData() {
grid = JSON.parse(data[6]);
diff --git a/modules/ui/3d.js b/modules/ui/3d.js
index 2c021116..81356130 100644
--- a/modules/ui/3d.js
+++ b/modules/ui/3d.js
@@ -623,7 +623,7 @@ window.ThreeD = (function () {
material.map = texture;
if (addMesh) addGlobe3dMesh();
};
- img2.src = await getMapURL("mesh", {globe: true, fullMap: true});
+ img2.src = await getMapURL("mesh", {noScaleBar: true, fullMap: true});
}
function addGlobe3dMesh() {
diff --git a/modules/ui/measurers.js b/modules/ui/measurers.js
index c9a1aff9..eedeaffb 100644
--- a/modules/ui/measurers.js
+++ b/modules/ui/measurers.js
@@ -535,7 +535,7 @@ class Planimeter extends Measurer {
// Scale bar
function drawScaleBar(scaleBar, scaleLevel) {
- if (scaleBar.style("display") === "none") return; // no need to re-draw hidden element
+ if (!scaleBar.size() || scaleBar.style("display") === "none") return;
scaleBar.selectAll("*").remove(); // fully redraw every time
const distanceScale = +distanceScaleInput.value;
diff --git a/modules/ui/submap.js b/modules/ui/submap.js
index 737560c3..2a476faa 100644
--- a/modules/ui/submap.js
+++ b/modules/ui/submap.js
@@ -136,7 +136,14 @@ window.UISubmap = (function () {
}
async function loadPreview($container, w, h) {
- const url = await getMapURL("png", {globe: false, noWater: true, fullMap: true, noLabels: true, noScaleBar: true, noIce: true});
+ const url = await getMapURL("png", {
+ globe: false,
+ noWater: true,
+ fullMap: true,
+ noLabels: true,
+ noScaleBar: true,
+ noIce: true
+ });
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
@@ -173,7 +180,11 @@ window.UISubmap = (function () {
const {angle, shiftX, shiftY, ratio, mirrorH, mirrorV} = getTransformInput();
const [cx, cy] = [graphWidth / 2, graphHeight / 2];
- const rot = alfa => (x, y) => [(x - cx) * Math.cos(alfa) - (y - cy) * Math.sin(alfa) + cx, (y - cy) * Math.cos(alfa) + (x - cx) * Math.sin(alfa) + cy];
+ const rot = alfa => (x, y) =>
+ [
+ (x - cx) * Math.cos(alfa) - (y - cy) * Math.sin(alfa) + cx,
+ (y - cy) * Math.cos(alfa) + (x - cx) * Math.sin(alfa) + cy
+ ];
const shift = (dx, dy) => (x, y) => [x + dx, y + dy];
const scale = r => (x, y) => [(x - cx) * r + cx, (y - cy) * r + cy];
const flipH = (x, y) => [-x + 2 * cx, y];
@@ -185,7 +196,11 @@ window.UISubmap = (function () {
let inverse = id;
if (angle) [projection, inverse] = [rot(angle), rot(-angle)];
- if (ratio) [projection, inverse] = [app(scale(Math.pow(1.1, ratio)), projection), app(inverse, scale(Math.pow(1.1, -ratio)))];
+ if (ratio)
+ [projection, inverse] = [
+ app(scale(Math.pow(1.1, ratio)), projection),
+ app(inverse, scale(Math.pow(1.1, -ratio)))
+ ];
if (mirrorH) [projection, inverse] = [app(flipH, projection), app(inverse, flipH)];
if (mirrorV) [projection, inverse] = [app(flipV, projection), app(inverse, flipV)];
if (shiftX || shiftY) {
@@ -244,7 +259,10 @@ window.UISubmap = (function () {
// fix scale
distanceScaleInput.value = distanceScaleOutput.value = rn((distanceScale = distanceScaleOutput.value / scale), 2);
- populationRateInput.value = populationRateOutput.value = rn((populationRate = populationRateOutput.value / scale), 2);
+ populationRateInput.value = populationRateOutput.value = rn(
+ (populationRate = populationRateOutput.value / scale),
+ 2
+ );
customization = 0;
startResample(options);
}, 1000);
diff --git a/versioning.js b/versioning.js
index 7ad37a21..69e65f3c 100644
--- a/versioning.js
+++ b/versioning.js
@@ -1,7 +1,7 @@
"use strict";
// version and caching control
-const version = "1.94.02"; // generator version, update each time
+const version = "1.94.06"; // generator version, update each time
{
document.title += " v" + version;