var Storage = { setCookie: function(name, value, days) { var expires = ""; if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + (value || "") + expires + "; path=/; SameSite=Strict"; }, getCookie: function(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') c = c.substring(1, c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); } return null; }, deleteCookie: function(name) { document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; SameSite=Strict'; }, // Simple checksum: sum of char codes checksum: function(str) { var sum = 0; for (var i = 0; i < str.length; i++) { sum = (sum + str.charCodeAt(i)) % 65536; } return sum.toString(16).padStart(4, '0'); }, saveGame: function(gameState) { var saveData = { blackHoleTotalMass: gameState.blackHoleTotalMass, totalMassConsumedEver: gameState.totalMassConsumedEver, totalMassConsumed: gameState.totalMassConsumed, asteroidUpgradeLevel: gameState.asteroidUpgradeLevel, asteroidUpgradeCost: gameState.asteroidUpgradeCost, cometUpgradeLevel: gameState.cometUpgradeLevel, cometUpgradeCost: gameState.cometUpgradeCost, planetUpgradeLevel: gameState.planetUpgradeLevel, planetUpgradeCost: gameState.planetUpgradeCost, giantUpgradeLevel: gameState.giantUpgradeLevel, giantUpgradeCost: gameState.giantUpgradeCost, asteroidSpawnCount: gameState.asteroidSpawnCount, lastAsteroidSpawn: gameState.lastAsteroidSpawn, lastCometSpawn: gameState.lastCometSpawn, lastPlanetSpawn: gameState.lastPlanetSpawn, lastGiantSpawn: gameState.lastGiantSpawn, sM: gameState.sM, sT: gameState.sT, mM: gameState.mM, mT: gameState.mT, lM: gameState.lM, lT: gameState.lT, rateShort: gameState.rateShort, rateMedium: gameState.rateMedium, rateLong: gameState.rateLong, savedAt: Date.now() }; var json = JSON.stringify(saveData); var chksum = this.checksum(json); var packaged = btoa(chksum + json); // prepend checksum, then base64 this.setCookie('blackHoleSave', packaged, 365); var saveStatus = document.getElementById('save-status'); saveStatus.textContent = 'Game saved successfully!'; setTimeout(function() { saveStatus.textContent = ''; }, 3000); }, loadGame: function() { var savedData = this.getCookie('blackHoleSave'); if (!savedData) return null; try { // try base64 decode var decoded = atob(savedData); // new format: first 4 chars = checksum var chksum = decoded.slice(0, 4); var json = decoded.slice(4); // verify checksum if (this.checksum(json) !== chksum) { console.warn('Save data integrity check failed.'); return null; } return JSON.parse(json); } catch (e) { // old save format (plain JSON) try { return JSON.parse(savedData); } catch { return null; } } }, resetGame: function() { this.deleteCookie('blackHoleSave'); location.reload(); } };