/** * Cosmic Garden - Save System * Handles localStorage persistence and export/import */ const SaveSystem = { SAVE_KEY: 'cosmicGardenSave', /** * Save game to localStorage */ save() { const data = JSON.stringify(Game.state); localStorage.setItem(this.SAVE_KEY, data); console.log('💾 Game saved'); }, /** * Load game from localStorage */ load() { const data = localStorage.getItem(this.SAVE_KEY); if (data) { try { return JSON.parse(data); } catch (e) { console.error('Failed to parse save:', e); return null; } } return null; }, /** * Export save as base64 string */ exportSave() { const data = btoa(JSON.stringify(Game.state)); navigator.clipboard.writeText(data).then(() => { UI.showNotification('Save copied to clipboard!', 'success'); }).catch(() => { // Fallback for older browsers const textarea = document.createElement('textarea'); textarea.value = data; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); document.body.removeChild(textarea); UI.showNotification('Save copied to clipboard!', 'success'); }); }, /** * Import save from base64 string */ importSave(data) { try { const parsed = JSON.parse(atob(data)); // Validate save data if (!parsed.stardust || !parsed.buildings) { throw new Error('Invalid save format'); } // Merge with existing state Game.state = { ...Game.state, ...parsed }; Game.state.lastSaveTime = Date.now(); UI.update(); return true; } catch (e) { console.error('Failed to import save:', e); UI.showNotification('Invalid save data!', 'warning'); return false; } }, /** * Clear save data */ clear() { localStorage.removeItem(this.SAVE_KEY); }, /** * Get last save time */ getLastSaveTime() { const data = this.load(); if (data && data.lastSaveTime) { return new Date(data.lastSaveTime); } return null; }, /** * Check if auto-save is available */ hasAutoSave() { return !!localStorage.getItem(this.SAVE_KEY); } }; window.SaveSystem = SaveSystem;