107 lines
3.7 KiB
JavaScript
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();
|
|
}
|
|
};
|