fix: routes (v1.104.3)

This commit is contained in:
Azgaar 2024-09-20 14:16:07 +02:00
parent 3d1f268003
commit 5904e9e7c6
9 changed files with 98 additions and 65 deletions

View file

@ -8047,7 +8047,7 @@
<script src="modules/cultures-generator.js?v=1.99.05"></script> <script src="modules/cultures-generator.js?v=1.99.05"></script>
<script src="modules/burgs-and-states.js?v=1.104.0"></script> <script src="modules/burgs-and-states.js?v=1.104.0"></script>
<script src="modules/provinces-generator.js?v=1.104.0"></script> <script src="modules/provinces-generator.js?v=1.104.0"></script>
<script src="modules/routes-generator.js?v=1.99.04"></script> <script src="modules/routes-generator.js?v=1.104.3"></script>
<script src="modules/religions-generator.js?v=1.99.05"></script> <script src="modules/religions-generator.js?v=1.99.05"></script>
<script src="modules/military-generator.js?v=1.104.0"></script> <script src="modules/military-generator.js?v=1.104.0"></script>
<script src="modules/markers-generator.js?v=1.104.0"></script> <script src="modules/markers-generator.js?v=1.104.0"></script>
@ -8063,13 +8063,13 @@
<script src="modules/ui/measurers.js?v=1.99.00"></script> <script src="modules/ui/measurers.js?v=1.99.00"></script>
<script src="modules/ui/style-presets.js?v=1.100.00"></script> <script src="modules/ui/style-presets.js?v=1.100.00"></script>
<script src="modules/ui/general.js?v=1.104.0"></script> <script src="modules/ui/general.js?v=1.104.3"></script>
<script src="modules/ui/options.js?v=1.100.00"></script> <script src="modules/ui/options.js?v=1.104.3"></script>
<script src="main.js?v=1.104.0"></script> <script src="main.js?v=1.104.0"></script>
<script defer src="modules/relief-icons.js?v=1.99.05"></script> <script defer src="modules/relief-icons.js?v=1.99.05"></script>
<script defer src="modules/ui/style.js?v=1.104.0"></script> <script defer src="modules/ui/style.js?v=1.104.0"></script>
<script defer src="modules/ui/editors.js?v=1.99.05"></script> <script defer src="modules/ui/editors.js?v=1.104.3"></script>
<script defer src="modules/ui/tools.js?v=1.104.0"></script> <script defer src="modules/ui/tools.js?v=1.104.0"></script>
<script defer src="modules/ui/world-configurator.js?v=1.104.0"></script> <script defer src="modules/ui/world-configurator.js?v=1.104.0"></script>
<script defer src="modules/ui/heightmap-editor.js?v=1.104.0"></script> <script defer src="modules/ui/heightmap-editor.js?v=1.104.0"></script>
@ -8078,8 +8078,8 @@
<script defer src="modules/ui/namesbase-editor.js?v=1.99.00"></script> <script defer src="modules/ui/namesbase-editor.js?v=1.99.00"></script>
<script defer src="modules/ui/elevation-profile.js?v=1.99.00"></script> <script defer src="modules/ui/elevation-profile.js?v=1.99.00"></script>
<script defer src="modules/ui/temperature-graph.js?v=1.99.00"></script> <script defer src="modules/ui/temperature-graph.js?v=1.99.00"></script>
<script defer src="modules/ui/routes-editor.js?v=1.99.02"></script> <script defer src="modules/ui/routes-editor.js?v=1.104.3"></script>
<script defer src="modules/ui/routes-creator.js?v=1.99.02"></script> <script defer src="modules/ui/routes-creator.js?v=1.104.3"></script>
<script defer src="modules/ui/route-group-editor.js?v=1.103.8"></script> <script defer src="modules/ui/route-group-editor.js?v=1.103.8"></script>
<script defer src="modules/ui/ice-editor.js?v=1.99.00"></script> <script defer src="modules/ui/ice-editor.js?v=1.99.00"></script>
<script defer src="modules/ui/lakes-editor.js?v=1.99.00"></script> <script defer src="modules/ui/lakes-editor.js?v=1.99.00"></script>
@ -8095,7 +8095,7 @@
<script defer src="modules/ui/diplomacy-editor.js?v=1.99.00"></script> <script defer src="modules/ui/diplomacy-editor.js?v=1.99.00"></script>
<script defer src="modules/ui/zones-editor.js?v=1.100.00"></script> <script defer src="modules/ui/zones-editor.js?v=1.100.00"></script>
<script defer src="modules/ui/burgs-overview.js?v=1.100.00"></script> <script defer src="modules/ui/burgs-overview.js?v=1.100.00"></script>
<script defer src="modules/ui/routes-overview.js?v=1.100.00"></script> <script defer src="modules/ui/routes-overview.js?v=1.104.3"></script>
<script defer src="modules/ui/rivers-overview.js?v=1.99.00"></script> <script defer src="modules/ui/rivers-overview.js?v=1.99.00"></script>
<script defer src="modules/ui/military-overview.js?v=1.99.00"></script> <script defer src="modules/ui/military-overview.js?v=1.99.00"></script>
<script defer src="modules/ui/regiments-overview.js?v=1.104.0"></script> <script defer src="modules/ui/regiments-overview.js?v=1.104.0"></script>
@ -8111,7 +8111,7 @@
<script defer src="libs/rgbquant.min.js"></script> <script defer src="libs/rgbquant.min.js"></script>
<script defer src="libs/jquery.ui.touch-punch.min.js"></script> <script defer src="libs/jquery.ui.touch-punch.min.js"></script>
<script defer src="modules/io/save.js?v=1.100.00"></script> <script defer src="modules/io/save.js?v=1.100.00"></script>
<script defer src="modules/io/load.js?v=1.104.0"></script> <script defer src="modules/io/load.js?v=1.104.3"></script>
<script defer src="modules/io/cloud.js?v=1.99.00"></script> <script defer src="modules/io/cloud.js?v=1.99.00"></script>
<script defer src="modules/io/export.js?v=1.100.00"></script> <script defer src="modules/io/export.js?v=1.100.00"></script>

View file

@ -481,7 +481,7 @@ async function parseLoadedData(data, mapVersion) {
const cells = pack.cells; const cells = pack.cells;
if (pack.cells.i.length !== pack.cells.state.length) { if (pack.cells.i.length !== pack.cells.state.length) {
const message = "Data integrity check. Striping issue detected. To fix edit the heightmap in ERASE mode"; const message = "[Data integrity] Striping issue detected. To fix edit the heightmap in ERASE mode";
ERROR && console.error(message); ERROR && console.error(message);
} }
@ -489,7 +489,7 @@ async function parseLoadedData(data, mapVersion) {
invalidStates.forEach(s => { invalidStates.forEach(s => {
const invalidCells = cells.i.filter(i => cells.state[i] === s); const invalidCells = cells.i.filter(i => cells.state[i] === s);
invalidCells.forEach(i => (cells.state[i] = 0)); invalidCells.forEach(i => (cells.state[i] = 0));
ERROR && console.error("Data integrity check. Invalid state", s, "is assigned to cells", invalidCells); ERROR && console.error("[Data integrity] Invalid state", s, "is assigned to cells", invalidCells);
}); });
const invalidProvinces = [...new Set(cells.province)].filter( const invalidProvinces = [...new Set(cells.province)].filter(
@ -498,14 +498,14 @@ async function parseLoadedData(data, mapVersion) {
invalidProvinces.forEach(p => { invalidProvinces.forEach(p => {
const invalidCells = cells.i.filter(i => cells.province[i] === p); const invalidCells = cells.i.filter(i => cells.province[i] === p);
invalidCells.forEach(i => (cells.province[i] = 0)); invalidCells.forEach(i => (cells.province[i] = 0));
ERROR && console.error("Data integrity check. Invalid province", p, "is assigned to cells", invalidCells); ERROR && console.error("[Data integrity] Invalid province", p, "is assigned to cells", invalidCells);
}); });
const invalidCultures = [...new Set(cells.culture)].filter(c => !pack.cultures[c] || pack.cultures[c].removed); const invalidCultures = [...new Set(cells.culture)].filter(c => !pack.cultures[c] || pack.cultures[c].removed);
invalidCultures.forEach(c => { invalidCultures.forEach(c => {
const invalidCells = cells.i.filter(i => cells.culture[i] === c); const invalidCells = cells.i.filter(i => cells.culture[i] === c);
invalidCells.forEach(i => (cells.province[i] = 0)); invalidCells.forEach(i => (cells.province[i] = 0));
ERROR && console.error("Data integrity check. Invalid culture", c, "is assigned to cells", invalidCells); ERROR && console.error("[Data integrity] Invalid culture", c, "is assigned to cells", invalidCells);
}); });
const invalidReligions = [...new Set(cells.religion)].filter( const invalidReligions = [...new Set(cells.religion)].filter(
@ -514,14 +514,14 @@ async function parseLoadedData(data, mapVersion) {
invalidReligions.forEach(r => { invalidReligions.forEach(r => {
const invalidCells = cells.i.filter(i => cells.religion[i] === r); const invalidCells = cells.i.filter(i => cells.religion[i] === r);
invalidCells.forEach(i => (cells.religion[i] = 0)); invalidCells.forEach(i => (cells.religion[i] = 0));
ERROR && console.error("Data integrity check. Invalid religion", r, "is assigned to cells", invalidCells); ERROR && console.error("[Data integrity] Invalid religion", r, "is assigned to cells", invalidCells);
}); });
const invalidFeatures = [...new Set(cells.f)].filter(f => f && !pack.features[f]); const invalidFeatures = [...new Set(cells.f)].filter(f => f && !pack.features[f]);
invalidFeatures.forEach(f => { invalidFeatures.forEach(f => {
const invalidCells = cells.i.filter(i => cells.f[i] === f); const invalidCells = cells.i.filter(i => cells.f[i] === f);
// No fix as for now // No fix as for now
ERROR && console.error("Data integrity check. Invalid feature", f, "is assigned to cells", invalidCells); ERROR && console.error("[Data integrity] Invalid feature", f, "is assigned to cells", invalidCells);
}); });
const invalidBurgs = [...new Set(cells.burg)].filter( const invalidBurgs = [...new Set(cells.burg)].filter(
@ -530,7 +530,7 @@ async function parseLoadedData(data, mapVersion) {
invalidBurgs.forEach(burgId => { invalidBurgs.forEach(burgId => {
const invalidCells = cells.i.filter(i => cells.burg[i] === burgId); const invalidCells = cells.i.filter(i => cells.burg[i] === burgId);
invalidCells.forEach(i => (cells.burg[i] = 0)); invalidCells.forEach(i => (cells.burg[i] = 0));
ERROR && console.error("Data integrity check. Invalid burg", burgId, "is assigned to cells", invalidCells); ERROR && console.error("[Data integrity] Invalid burg", burgId, "is assigned to cells", invalidCells);
}); });
const invalidRivers = [...new Set(cells.r)].filter(r => r && !pack.rivers.find(river => river.i === r)); const invalidRivers = [...new Set(cells.r)].filter(r => r && !pack.rivers.find(river => river.i === r));
@ -538,21 +538,20 @@ async function parseLoadedData(data, mapVersion) {
const invalidCells = cells.i.filter(i => cells.r[i] === r); const invalidCells = cells.i.filter(i => cells.r[i] === r);
invalidCells.forEach(i => (cells.r[i] = 0)); invalidCells.forEach(i => (cells.r[i] = 0));
rivers.select("river" + r).remove(); rivers.select("river" + r).remove();
ERROR && console.error("Data integrity check. Invalid river", r, "is assigned to cells", invalidCells); ERROR && console.error("[Data integrity] Invalid river", r, "is assigned to cells", invalidCells);
}); });
pack.burgs.forEach(burg => { pack.burgs.forEach(burg => {
if (typeof burg.capital === "boolean") burg.capital = Number(burg.capital); if (typeof burg.capital === "boolean") burg.capital = Number(burg.capital);
if (!burg.i && burg.lock) { if (!burg.i && burg.lock) {
ERROR && console.error(`Data integrity check. Burg 0 is marked as locked, removing the status`); ERROR && console.error(`[Data integrity] Burg 0 is marked as locked, removing the status`);
delete burg.lock; delete burg.lock;
return; return;
} }
if (burg.removed && burg.lock) { if (burg.removed && burg.lock) {
ERROR && ERROR && console.error(`[Data integrity] Removed burg ${burg.i} is marked as locked. Unlocking the burg`);
console.error(`Data integrity check. Removed burg ${burg.i} is marked as locked. Unlocking the burg`);
delete burg.lock; delete burg.lock;
return; return;
} }
@ -561,36 +560,34 @@ async function parseLoadedData(data, mapVersion) {
if (burg.cell === undefined || burg.x === undefined || burg.y === undefined) { if (burg.cell === undefined || burg.x === undefined || burg.y === undefined) {
ERROR && ERROR &&
console.error( console.error(`[Data integrity] Burg ${burg.i} is missing cell info or coordinates. Removing the burg`);
`Data integrity check. Burg ${burg.i} is missing cell info or coordinates. Removing the burg`
);
burg.removed = true; burg.removed = true;
} }
if (burg.port < 0) { if (burg.port < 0) {
ERROR && console.error("Data integrity check. Burg", burg.i, "has invalid port value", burg.port); ERROR && console.error("[Data integrity] Burg", burg.i, "has invalid port value", burg.port);
burg.port = 0; burg.port = 0;
} }
if (burg.cell >= cells.i.length) { if (burg.cell >= cells.i.length) {
ERROR && console.error("Data integrity check. Burg", burg.i, "is linked to invalid cell", burg.cell); ERROR && console.error("[Data integrity] Burg", burg.i, "is linked to invalid cell", burg.cell);
burg.cell = findCell(burg.x, burg.y); burg.cell = findCell(burg.x, burg.y);
cells.i.filter(i => cells.burg[i] === burg.i).forEach(i => (cells.burg[i] = 0)); cells.i.filter(i => cells.burg[i] === burg.i).forEach(i => (cells.burg[i] = 0));
cells.burg[burg.cell] = burg.i; cells.burg[burg.cell] = burg.i;
} }
if (burg.state && !pack.states[burg.state]) { if (burg.state && !pack.states[burg.state]) {
ERROR && console.error("Data integrity check. Burg", burg.i, "is linked to invalid state", burg.state); ERROR && console.error("[Data integrity] Burg", burg.i, "is linked to invalid state", burg.state);
burg.state = 0; burg.state = 0;
} }
if (burg.state && pack.states[burg.state].removed) { if (burg.state && pack.states[burg.state].removed) {
ERROR && console.error("Data integrity check. Burg", burg.i, "is linked to removed state", burg.state); ERROR && console.error("[Data integrity] Burg", burg.i, "is linked to removed state", burg.state);
burg.state = 0; burg.state = 0;
} }
if (burg.state === undefined) { if (burg.state === undefined) {
ERROR && console.error("Data integrity check. Burg", burg.i, "has no state data"); ERROR && console.error("[Data integrity] Burg", burg.i, "has no state data");
burg.state = 0; burg.state = 0;
} }
}); });
@ -604,7 +601,7 @@ async function parseLoadedData(data, mapVersion) {
if (!state.i && capitalBurgs.length) { if (!state.i && capitalBurgs.length) {
ERROR && ERROR &&
console.error( console.error(
`Data integrity check. Neutral burgs (${capitalBurgs `[Data integrity] Neutral burgs (${capitalBurgs
.map(b => b.i) .map(b => b.i)
.join(", ")}) marked as capitals. Moving them to towns` .join(", ")}) marked as capitals. Moving them to towns`
); );
@ -618,7 +615,7 @@ async function parseLoadedData(data, mapVersion) {
} }
if (capitalBurgs.length > 1) { if (capitalBurgs.length > 1) {
const message = `Data integrity check. State ${state.i} has multiple capitals (${capitalBurgs const message = `[Data integrity] State ${state.i} has multiple capitals (${capitalBurgs
.map(b => b.i) .map(b => b.i)
.join(", ")}) assigned. Keeping the first as capital and moving others to towns`; .join(", ")}) assigned. Keeping the first as capital and moving others to towns`;
ERROR && console.error(message); ERROR && console.error(message);
@ -634,7 +631,7 @@ async function parseLoadedData(data, mapVersion) {
if (state.i && stateBurgs.length && !capitalBurgs.length) { if (state.i && stateBurgs.length && !capitalBurgs.length) {
ERROR && ERROR &&
console.error(`Data integrity check. State ${state.i} has no capital. Assigning the first burg as capital`); console.error(`[Data integrity] State ${state.i} has no capital. Assigning the first burg as capital`);
stateBurgs[0].capital = 1; stateBurgs[0].capital = 1;
moveBurgToGroup(stateBurgs[0].i, "cities"); moveBurgToGroup(stateBurgs[0].i, "cities");
} }
@ -643,18 +640,38 @@ async function parseLoadedData(data, mapVersion) {
pack.provinces.forEach(p => { pack.provinces.forEach(p => {
if (!p.i || p.removed) return; if (!p.i || p.removed) return;
if (pack.states[p.state] && !pack.states[p.state].removed) return; if (pack.states[p.state] && !pack.states[p.state].removed) return;
ERROR && console.error("Data integrity check. Province", p.i, "is linked to removed state", p.state); ERROR &&
p.removed = true; // remove incorrect province console.error(
`[Data integrity] Province ${p.i} is linked to removed state ${p.state}. Removing the province`
);
p.removed = true;
}); });
pack.routes.forEach(({i, points}) => { pack.routes.forEach(route => {
if (!points || points.length < 2) { if (!route.points || route.points.length < 2) {
ERROR && ERROR && console.error(`[Data integrity] Route ${route.i} has less than 2 points. Removing the route`);
console.error( Routes.remove(route);
"Data integrity check. Route", }
i,
"has less than 2 points. Route will be ignored on layer rendering" for (const from in pack.cells.routes) {
); const value = pack.cells.routes[from];
if (!value) continue;
if (Object.keys(value).length === 0) {
// remove empty object
delete pack.cells.routes[from];
continue;
}
for (const to in value) {
const routeId = value[to];
const route = pack.routes.find(r => r.i === routeId);
if (!route) {
ERROR &&
console.error(`[Data integrity] Route ${routeId} from ${from} to ${to} is missing. Removing the route`);
delete pack.cells.routes[from][to];
}
}
} }
}); });
@ -664,7 +681,7 @@ async function parseLoadedData(data, mapVersion) {
pack.markers.forEach(marker => { pack.markers.forEach(marker => {
if (markerIds[marker.i]) { if (markerIds[marker.i]) {
ERROR && console.error("Data integrity check. Marker", marker.i, "has non-unique id. Changing to", nextId); ERROR && console.error("[Data integrity] Marker", marker.i, "has non-unique id. Changing to", nextId);
const domElements = document.querySelectorAll("#marker" + marker.i); const domElements = document.querySelectorAll("#marker" + marker.i);
if (domElements[1]) domElements[1].id = "marker" + nextId; // rename 2nd dom element if (domElements[1]) domElements[1].id = "marker" + nextId; // rename 2nd dom element

View file

@ -496,7 +496,7 @@ window.Routes = (function () {
// utility functions // utility functions
function isConnected(cellId) { function isConnected(cellId) {
const {routes} = pack.cells; const routes = pack.cells.routes;
return routes[cellId] && Object.keys(routes[cellId]).length > 0; return routes[cellId] && Object.keys(routes[cellId]).length > 0;
} }
@ -507,22 +507,34 @@ window.Routes = (function () {
function getRoute(from, to) { function getRoute(from, to) {
const routeId = pack.cells.routes[from]?.[to]; const routeId = pack.cells.routes[from]?.[to];
return routeId === undefined ? null : pack.routes[routeId]; if (routeId === undefined) return null;
const route = pack.routes.find(route => route.i === routeId);
if (!route) return null;
return route;
} }
function hasRoad(cellId) { function hasRoad(cellId) {
const connections = pack.cells.routes[cellId]; const connections = pack.cells.routes[cellId];
if (!connections) return false; if (!connections) return false;
return Object.values(connections).some(routeId => pack.routes[routeId].group === "roads");
return Object.values(connections).some(routeId => {
const route = pack.routes.find(route => route.i === routeId);
if (!route) return false;
return route.group === "roads";
});
} }
function isCrossroad(cellId) { function isCrossroad(cellId) {
const connections = pack.cells.routes[cellId]; const connections = pack.cells.routes[cellId];
if (!connections) return false; if (!connections) return false;
return ( if (Object.keys(connections).length > 3) return true;
Object.keys(connections).length > 3 || const roadConnections = Object.values(connections).filter(routeId => {
Object.values(connections).filter(routeId => pack.routes[routeId]?.group === "roads").length > 2 const route = pack.routes.find(route => route.i === routeId);
); return route?.group === "roads";
});
return roadConnections.length > 2;
} }
// name generator data // name generator data

View file

@ -393,12 +393,12 @@ function createVillageGeneratorLink(burg) {
else if (cells.r[cell]) tags.push("river"); else if (cells.r[cell]) tags.push("river");
else if (pop < 200 && each(4)(cell)) tags.push("pond"); else if (pop < 200 && each(4)(cell)) tags.push("pond");
const connections = pack.cells.routes[cell] || {}; const roadsNumber = Object.values(pack.cells.routes[cell] || {}).filter(routeId => {
const roads = Object.values(connections).filter(routeId => { const route = pack.routes.find(route => route.i === routeId);
const route = pack.routes[routeId]; if (!route) return false;
return route.group === "roads" || route.group === "trails"; return route.group === "roads" || route.group === "trails";
}).length; }).length;
tags.push(roads > 1 ? "highway" : roads === 1 ? "dead end" : "isolated"); tags.push(roadsNumber > 1 ? "highway" : roadsNumber === 1 ? "dead end" : "isolated");
const biome = cells.biome[cell]; const biome = cells.biome[cell];
const arableBiomes = cells.r[cell] ? [1, 2, 3, 4, 5, 6, 7, 8] : [5, 6, 7, 8]; const arableBiomes = cells.r[cell] ? [1, 2, 3, 4, 5, 6, 7, 8] : [5, 6, 7, 8];

View file

@ -153,9 +153,11 @@ function showMapTooltip(point, e, i, g) {
if (group === "routes") { if (group === "routes") {
const routeId = +e.target.id.slice(5); const routeId = +e.target.id.slice(5);
const name = pack.routes[routeId]?.name; const route = pack.routes.find(route => route.i === routeId);
if (name) return tip(`${name}. Click to edit the Route`); if (route) {
return tip("Click to edit the Route"); if (route.name) return tip(`${route.name}. Click to edit the Route`);
return tip("Click to edit the Route");
}
} }
if (group === "terrain") return tip("Click to edit the Relief Icon"); if (group === "terrain") return tip("Click to edit the Relief Icon");

View file

@ -250,8 +250,7 @@ const voiceInterval = setInterval(function () {
select.options.add(new Option(voice.name, i, false)); select.options.add(new Option(voice.name, i, false));
}); });
if (stored("speakerVoice")) select.value = stored("speakerVoice"); if (stored("speakerVoice")) select.value = stored("speakerVoice");
// se voice to store else select.value = voices.findIndex(voice => voice.lang === "en-US");
else select.value = voices.findIndex(voice => voice.lang === "en-US"); // or to first found English-US
}, 1000); }, 1000);
function testSpeaker() { function testSpeaker() {

View file

@ -174,9 +174,10 @@ function editRoute(id) {
function handleControlPointClick() { function handleControlPointClick() {
const controlPoint = d3.select(this); const controlPoint = d3.select(this);
const point = controlPoint.datum(); const point = controlPoint.datum();
const route = getRoute(); const route = getRoute();
if (route.points.length < 3) return; // can't remove or split point if only 2 points in route
const index = route.points.indexOf(point); const index = route.points.indexOf(point);
const isSplitMode = byId("routeSplit").classList.contains("pressed"); const isSplitMode = byId("routeSplit").classList.contains("pressed");

View file

@ -32,6 +32,7 @@ function overviewRoutes() {
let lines = ""; let lines = "";
for (const route of pack.routes) { for (const route of pack.routes) {
if (!route.points || route.points.length < 2) continue;
route.name = route.name || Routes.generateName(route); route.name = route.name || Routes.generateName(route);
route.length = route.length || Routes.getLength(route.i); route.length = route.length || Routes.getLength(route.i);
const length = rn(route.length * distanceScale) + " " + distanceUnitInput.value; const length = rn(route.length * distanceScale) + " " + distanceUnitInput.value;
@ -92,8 +93,8 @@ function overviewRoutes() {
} }
function zoomToRoute() { function zoomToRoute() {
const r = +this.parentNode.dataset.id; const routeId = +this.parentNode.dataset.id;
const route = routes.select("#route" + r).node(); const route = routes.select("#route" + routeId).node();
highlightElement(route, 3); highlightElement(route, 3);
} }
@ -111,15 +112,16 @@ function overviewRoutes() {
} }
function openRouteEditor() { function openRouteEditor() {
const id = "route" + this.parentNode.dataset.id; const routeId = "route" + this.parentNode.dataset.id;
editRoute(id); editRoute(routeId);
} }
function toggleLockStatus() { function toggleLockStatus() {
const routeId = +this.parentNode.dataset.id; const routeId = +this.parentNode.dataset.id;
const route = pack.routes[routeId]; const route = pack.routes.find(route => route.i === routeId);
route.lock = !route.lock; if (!route) return;
route.lock = !route.lock;
if (this.classList.contains("icon-lock")) { if (this.classList.contains("icon-lock")) {
this.classList.remove("icon-lock"); this.classList.remove("icon-lock");
this.classList.add("icon-lock-open"); this.classList.add("icon-lock-open");

View file

@ -12,7 +12,7 @@
* *
* Example: 1.102.2 -> Major version 1, Minor version 102, Patch version 2 * Example: 1.102.2 -> Major version 1, Minor version 102, Patch version 2
*/ */
const VERSION = "1.104.2"; const VERSION = "1.104.3";
if (parseMapVersion(VERSION) !== VERSION) alert("versioning.js: Invalid format or parsing function"); if (parseMapVersion(VERSION) !== VERSION) alert("versioning.js: Invalid format or parsing function");
{ {