hoel/js/storage.js
2026-01-22 19:21:59 +01:00

107 lines
3.7 KiB
JavaScript

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();
}
};