From 89d27f8e4c78eb2040595a3c24b96c34daa7b608 Mon Sep 17 00:00:00 2001 From: StempunkDev Date: Wed, 14 Jan 2026 21:18:42 +0100 Subject: [PATCH] fix: migrate ice data to new data model structure --- public/modules/dynamic/auto-update.js | 119 ++++++++++++++------------ 1 file changed, 63 insertions(+), 56 deletions(-) diff --git a/public/modules/dynamic/auto-update.js b/public/modules/dynamic/auto-update.js index a9847788..8e3ef5bc 100644 --- a/public/modules/dynamic/auto-update.js +++ b/public/modules/dynamic/auto-update.js @@ -1040,66 +1040,73 @@ export function resolveVersionConflicts(mapVersion) { if (isOlderThan("1.110.0")) { // v1.110.0 moved ice data from SVG to data model // Migrate old ice SVG elements to new pack.ice structure - if (!pack.ice) pack.ice = { glaciers: [], icebergs: [] }; + if (!pack.ice) { + pack.ice = { glaciers: [], icebergs: [] }; + + const iceLayer = document.getElementById("ice"); + if (iceLayer) { + // Migrate glaciers (type="iceShield") + iceLayer.querySelectorAll("polygon[type='iceShield']").forEach(polygon => { + // Parse points string "x1,y1 x2,y2 x3,y3 ..." into array [[x1,y1], [x2,y2], ...] + const points = [...polygon.points].map(svgPoint => [svgPoint.x, svgPoint.y]); + + const transform = polygon.getAttribute("transform"); - const iceLayer = document.getElementById("ice"); - if (iceLayer) { - // Migrate glaciers (type="iceShield") - iceLayer.querySelectorAll("polygon[type='iceShield']").forEach(polygon => { - const pointsStr = polygon.getAttribute("points"); - if (!pointsStr) return; - - // Parse points string "x1,y1 x2,y2 x3,y3 ..." into array [[x1,y1], [x2,y2], ...] - const points = pointsStr - .split(" ") - .map(pair => pair.split(",").map(Number)); - - const transform = polygon.getAttribute("transform"); - const offset = transform ? parseTransform(transform) : null; - pack.ice.glaciers.push({ - points, - offset + if (transform) { + pack.ice.glaciers.push({ + points, + offset: parseTransform(transform) + }); + } else { + pack.ice.glaciers.push({ points }); + } }); - }); + + // Migrate icebergs + iceLayer.querySelectorAll("polygon:not([type])").forEach(polygon => { + const cellId = +polygon.getAttribute("cell"); + const size = +polygon.getAttribute("size"); + + // points string must exist, cell attribute must be present, and size must be non-zero + if (polygon.getAttribute("cell") === null || !size) return; + + // Parse points string "x1,y1 x2,y2 x3,y3 ..." into array [[x1,y1], [x2,y2], ...] + const points = [...polygon.points].map(svgPoint => [svgPoint.x, svgPoint.y]); + + const transform = polygon.getAttribute("transform"); + if (transform) { + pack.ice.icebergs.push({ + cellId, + size, + points, + offset: parseTransform(transform) + }); + } else { + pack.ice.icebergs.push({ + cellId, + size, + points + }); + } - // Migrate icebergs - iceLayer.querySelectorAll("polygon:not([type])").forEach(polygon => { - const pointsStr = polygon.getAttribute("points"); - const cellId = +polygon.getAttribute("cell"); - const size = +polygon.getAttribute("size"); - - // points string must exist, cell attribute must be present, and size must be non-zero - if (!pointsStr || polygon.getAttribute("cell") === null || !size) return; - - // Parse points string "x1,y1 x2,y2 x3,y3 ..." into array [[x1,y1], [x2,y2], ...] - const points = pointsStr - .split(" ") - .map(pair => pair.split(",").map(Number)); - - const transform = polygon.getAttribute("transform"); - const offset = transform ? parseTransform(transform) : null; - pack.ice.icebergs.push({ - cellId, - size, - points, - offset }); - }); - - // Clear old SVG elements - use d3 selection - d3.select(iceLayer).selectAll("*").remove(); - } else { - // If ice layer element doesn't exist, create it - ice = viewbox.insert("g", "#coastline").attr("id", "ice"); - ice - .attr("opacity", null) - .attr("fill", "#e8f0f6") - .attr("stroke", "#e8f0f6") - .attr("stroke-width", 1) - .attr("filter", "url(#dropShadow05)"); + + // Clear old SVG elements + iceLayer.querySelectorAll("*").forEach(el => el.remove()); + } else { + // If ice layer element doesn't exist, create it + ice = viewbox.insert("g", "#coastline").attr("id", "ice"); + ice + .attr("opacity", null) + .attr("fill", "#e8f0f6") + .attr("stroke", "#e8f0f6") + .attr("stroke-width", 1) + .attr("filter", "url(#dropShadow05)"); + } + + // Re-render ice from migrated data + if (layerIsOn("toggleIce")) drawIce(); } - - // Re-render ice from migrated data - if (layerIsOn("toggleIce")) drawIce(); + } }