diff --git a/js/utils.js b/js/utils.js index 2f1c088..fd82828 100644 --- a/js/utils.js +++ b/js/utils.js @@ -193,6 +193,45 @@ function spellf(n) { return parts.join(' ') || 'zero'; } +// === EXPORT / IMPORT === +function exportSave() { + const raw = localStorage.getItem('the-beacon-v2'); + if (!raw) { + showToast('No save data to export.', 'info'); + return; + } + navigator.clipboard.writeText(raw).then(() => { + showToast('Save data copied to clipboard.', 'info'); + }).catch(() => { + // Fallback: select in a temporary textarea + const ta = document.createElement('textarea'); + ta.value = raw; + document.body.appendChild(ta); + ta.select(); + document.execCommand('copy'); + document.body.removeChild(ta); + showToast('Save data copied to clipboard (fallback).', 'info'); + }); +} + +function importSave() { + const input = prompt('Paste save data:'); + if (!input || !input.trim()) return; + try { + const data = JSON.parse(input.trim()); + // Validate: must have expected keys + if (typeof data.code !== 'number' || typeof data.phase !== 'number') { + showToast('Invalid save data: missing required fields.', 'event'); + return; + } + localStorage.setItem('the-beacon-v2', input.trim()); + showToast('Save data imported — reloading', 'info'); + setTimeout(() => location.reload(), 800); + } catch (e) { + showToast('Invalid save data: not valid JSON.', 'event'); + } +} + function getBuildingCost(id) { const def = BDEF.find(b => b.id === id); if (!def) return {};