var initialState = { axeNr: 0, answerPrice: 1, answerStates: [], bAncientCubeFound: false, bAncientPlanet: false, bAppleProgress: 0, bBarCocoPrice: 10, bBarCocoSell: 30, bBurgulonUnlocked: false, bMyBeans: [], bBeanieImaginationUpgrade: false, bBeanieProgress: 0, bBeanShop: false, bBentProgress: 0, bBret: false, bBretDoingCoco: false, bBobMessage: false, bCelestialSummoner: false, bCelestialSummonerCharged: false, bCoco: 0, bCocoPS: 0, bCoreCapacity: 50, bCoreLevel: 1, bCoreState: "coreBlue", bDerekProgress: 0, bGold: 0, bGoldPS: 0, bCoreStardust: 50, bCoreStardustIncrement: 1, bDerekShipStates: [], bDerekSummoningDevice: false, bDoubleRings: false, bEggProgress: 0, bFriendBananaMan: false, bFriendJerkWiseman: false, bFriendBrokenRobot: false, bFriendJerkinson: false, bFriendSweatson: false, bFriendAncientDerek: false, bGardenBoys: false, bGnomeRecords: [0,0,0], bJackLetters: 0, bJackProgress: 0, bJerkCanCool: false, bJerkCanFantastic: false, bJerkClub: false, bJerkStarted: false, bJerkActions: 3, bJerksPerTurn: 4, bJerkAttackPower: 1, bJerkMuffinPower: 1, bJerkinsonRecruited: false, bLemonada: false, bLollipops: 0, bMayonadaProgress: 0, bMillionDerekCubeFound: false, bMinionsKilled: 0, bMouladinLollipops: 0, bMouladinProgress: 0, bMouladinUpgrades: [false,false,false,false], bMouladinUpgradePoints: 0, bWood: 0, bWoodPS: 0, bPlanetBack: false, bPokerCubeFound: false, bPotato: false, bRemoveJerkPrice: 10, bRouletteCubeFound: false, bShipsSummoned: [false,false,false,false], bSlopnax: false, bSlopnaxProgress: 0, bStanley: false, bStanleyStardust: 0, bStardust: 0, bSpaceBar: false, bSpaceBarCoco: 0, bSpaceBarGold: 0, bSpaceBarRate: 1, bSpaceBen: false, bSpaceBenPrices: [25,25,25,0], bSpaceBenUpgraded: false, bSpaceRadio: false, bSpaceRings: 0, bWarshipProgress: 0, bWoodSynthesizer: false, bottleFound: false, burgerDoing: '', burgerGoldPS: 1, burgerWoodPS: 1, burgerGift: false, burgerLost: false, burgerReview: false, burgulonCreated: false, burgulonDungeon: [4,4,4], burgulonTime: false, broccoliChapter: false, chosenTTItem: false, chosenTTJerk: false, coco: 0, cocoDungeonsCompleted: false, cocoDungeonsFound: false, cocoPenguinFound: false, cocoPopsAsteroid: false, cocoPS: 0, coins: 0, curGhostID: 0, curCreatureID: 0, derekDead: false, derekDefrosted: false, derekHealth: 50, derekItems: [], derekMaxHealth: 50, derekToughness: 50, derekulusX: false, derekulusXCubeFound: false, drillNr: 0, ddsPrice: [300, 20, 0, 0, false], dungeonFound: false, dungeon2Found: false, dungeon3Found: false, dungeonMasterSummoned: false, dungeons: [], dungeonsCompleted: false, firstCocoTrade: false, friendHousePrice: [500, 0, 0, 0, false], friends: [], ghostTradeFound: false, ghosts: 0, ghostPrice: 13, ghostTrend: 10, ghostTrendy: true, gold: 0, goldChance: 0.3, goldFishPurity: 10, goldPS: 0, healthPotionCapacity: 1, healthPotionHeal: 50, healthPotions: 0, imgaOver: true, impatientMode: false, jerkPile: [], lochJuiceVomit: false, monsterDungeons: false, monsterDungeonsCompleted: false, musicMuted: false, penguinCocoPS: 0, pickedRobot: false, planetudFound: false, planetudFoundAgain: false, planetudPrices: [], playIntro: true, productStates: [], purchasedChapter2: false, purchasedChapter3: false, quizDone: false, quizHalfway: false, randomDungeonDifficulty: 8, repairSlipFound: false, remouladinFound: false, revivePrice: [0, 0, 0, 1], savedLevel: 0, shopFound: false, shopPrices: [], skillStates: [], slotmachinePrice: [400, 50, 200, 0, false], soundMuted: false, spaceDungeon: false, stardust: 0, stardustPS: 0, starmapNr: 0, strawCocoPS: 1, strawNr: 0, strawPrice: [100, 10, 0, 0, false], stateInitialized: false, svenFound: false, svenWoodPS: 0, tTerrariumFound: false, tClosetArray: [], tClosetSlots: 1, tClubArray: [], tClubSlots: 1, tWoodPS: 1, tWood: 0, tWoodCapacity: 500, tCocoPS: 1, tCoco: 0, tCocoCapacity: 500, tGamesCompleted: 0, tGoldPS: 0, tGold: 0, tGoldCapacity: 100, unlockedFullHeal: false, villaKey: false, villaPortal: false, wood: 0, woodPS: 0, workshopDemolished: false, workshopPrice: [20, 0, 0, 0, false], wormCubes: 0, wormFound: false, wormFoundAgain: false, wormholePaid: false, wormOut: false, version: 12, }; var state = initialState; var stateQueue = { paused: false, }; // https://github.com/Northplay/PlanetLife/compare/212c2b611e8ddffc96830e1d658efe9492ca19ad...master var stateMigrations = [ { // First migration from: undefined, to: 2, added: [ { key: 'answerPrice', value: 1 }, { key: 'answerStates', value: [] }, { key: 'bBarCocoPrice', value: 10 }, { key: 'bBarCocoSell', value: 30 }, { key: 'bBret', value: false }, { key: 'bBretDoingCoco', value: false }, { key: 'bCelestialSummoner', value: false }, { key: 'bCoco', value: 0 }, { key: 'bCocoPS', value: 0 }, { key: 'bGold', value: 0 }, { key: 'bGoldPS', value: 0 }, { key: 'bWood', value: 0 }, { key: 'bWoodPS', value: 0 }, { key: 'bStardust', value: 0 }, { key: 'bSpaceBar', value: false }, { key: 'bWoodSynthesizer', value: false }, { key: 'bottleFound', value: false }, { key: 'burgerLost', value: false }, { key: 'burgulonCreated', value: false }, { key: 'burgulonTime', value: false }, { key: 'broccoliChapter', value: false }, { key: 'cocoDungeonsCompleted', value: false }, { key: 'cocoDungeonsFound', value: false}, { key: 'cocoPenguinFound', value: false }, { key: 'coins', value: 0 }, { key: 'curGhostID', value: 0 }, { key: 'curCreatureID', value: 0 }, { key: 'derekDead', value: false }, { key: 'derekulusX', value: false }, { key: 'ddsPrice', value: [300,20,0,0,false] }, { key: 'dungeon2Found', value: false }, { key: 'dungeon3Found', value: false }, { key: 'dungeonMasterSummoned', value: false }, { key: 'dungeons', value: [] }, { key: 'dungeonsCompleted', value: false }, { key: 'ghostTradeFound', value: false }, { key: 'ghosts', value: 0 }, { key: 'ghostPrice', value: 13 }, { key: 'ghostTrend', value: 10 }, { key: 'ghostTrendy', value: true }, { key: 'goldFishPurity', value: 10 }, { key: 'healthPotionHeal', value: 50 }, { key: 'imgaOver', value: true }, { key: 'lochJuiceVomit', value: false }, { key: 'monsterDungeons', value: false }, { key: 'monsterDungeonsCompleted', value: false }, { key: 'penguinCocoPS', value: 0 }, { key: 'planetudFoundAgain', value: false }, { key: 'productStates', value: [] }, { key: 'quizDone', value: false }, { key: 'quizHalfway', value: false }, { key: 'randomDungeonDifficulty', value: 8 }, { key: 'remouladinFound', value: false }, //{ key: 'revivePrice', value: [0,0,0,1] }, { key: 'skillStates', value: [] }, { key: 'spaceDungeon', value: false }, { key: 'strawCocoPS', value: 1 }, { key: 'svenFound', value: false }, { key: 'svenWoodPS', value: 0 }, { key: 'unlockedFullHeal', value: false }, { key: 'villaKey', value: false }, { key: 'villaPortal', value: false }, { key: 'workshopDemolished', value: false }, { key: 'wormFoundAgain', value: false }, { key: 'version', value: 2}, { key: 'didPlayOriginal', value: true }, ], removed: [ 'beltUpgradeNr', 'healthUpgradeNr', 'toughnessUpgradeNr', ], updated: [ // { key: 'test', value: 'what does the fox say?'}, ], }, { from: 2, to: 3, added: [ { key: 'burgerReview', value: false }, ], removed: [], updated: [], }, { from: 3, to: 4, added: [ { key: 'jerkPile', value: [] }, { key: 'burgulonDungeon', value: [2,2] }, { key: 'bBeanieProgress', value: 0 }, { key: 'bEggProgress', value: 0 }, { key: 'bWarshipProgress', value: 0 }, { key: 'bJerkClub', value: false }, { key: 'bCoreStardust', value: 50 }, { key: 'bCoreStardustIncrement', value: 1 }, { key: 'bJerkStarted', value: false }, { key: 'bSpaceRings', value: 0 }, { key: 'bJerkActions', value: 3 }, { key: 'bJerksPerTurn', value: 3 }, { key: 'bJerkAttackPower', value: 1 }, { key: 'bJerkMuffinPower', value: 1 }, { key: 'bMyBeans', value: [] }, { key: 'bCoreState', value: "coreBlue" }, { key: 'bCoreLevel', value: 1 }, { key: 'bCoreCapacity', value: 100 }, { key: 'bBentProgress', value: 0 }, { key: 'bAncientPlanet', value: false }, { key: 'bGardenBoys', value: false }, { key: 'bStanley', value: false }, { key: 'bStanleyStardust', value: 0 }, { key: 'bAppleProgress', value: 0 }, { key: 'bMinionsKilled', value: 0 }, { key: 'bSlopnaxProgress', value: 0 }, { key: 'bMouladinProgress', value: 0 }, { key: 'bMouladinLollipops', value: 0 }, { key: 'bLollipops', value: 0 }, { key: 'bMouladinUpgradePoints', value: 0 }, { key: 'bMouladinUpgrades', value: [false,false,false,false] }, { key: 'bMayonadaProgress', value: 0 }, { key: 'bJerkCanCool', value: false }, { key: 'bJerkCanFantastic', value: false }, { key: 'bJackProgress', value: 0 }, { key: 'bSpaceBarCoco', value: 0 }, { key: 'bSpaceBarGold', value: 0 }, { key: 'bSpaceBarRate', value: 1 }, { key: 'bCelestialSummonerCharged', value: false}, { key: 'bSpaceBen', value: false }, { key: 'bSpaceBenPrices', value: [25,25,25,0] }, { key: 'bPotato', value: false }, { key: 'bSlopnax', value: false }, { key: 'bLemonada', value: false }, { key: 'bGnomeRecords', value: [0,0,0] }, ], removed: [], updated: [], }, { from: 4, to: 5, added: [ { key: 'bBeanShop', value: false }, { key: 'bFriendSweatson', value: false }, { key: 'bFriendJerkinson', value: false }, { key: 'bFriendAncientDerek', value: false }, { key: 'bDoubleRings', value: false }, { key: 'bBobMessage', value: false }, { key: 'bJerkinsonRecruited', value: false }, { key: 'bDerekShipStates', value: [] }, { key: 'bShipsSummoned', value: [false,false,false,false] }, { key: 'bSpaceRadio', value: false }, { key: 'bFriendBananaMan', value: false }, { key: 'bFriendBrokenRobot', value: false }, { key: 'bFriendJerkWiseman', value: false }, { key: 'bRemoveJerkPrice', value: 10 }, { key: 'bJackLetters', value: 0 }, { key: 'bDerekProgress', value: 0 }, { key: 'bPlanetBack', value: false }, { key: 'bDerekSummoningDevice', value: false }, { key: 'bBurgulonUnlocked', value: false }, ], removed: [], updated: [ { key: 'bBarCocoPrice', value: 10 }, { key: 'bBarCocoSell', value: 30 }, { key: 'bBret', value: false }, { key: 'bBretDoingCoco', value: false }, { key: 'bCelestialSummoner', value: false }, { key: 'bCoco', value: 0 }, { key: 'bCocoPS', value: 0 }, { key: 'bGold', value: 0 }, { key: 'bGoldPS', value: 0 }, { key: 'bWood', value: 0 }, { key: 'bWoodPS', value: 0 }, { key: 'bStardust', value: 0 }, { key: 'bSpaceBar', value: false }, { key: 'bWoodSynthesizer', value: false }, ], customFunction: function(state) { var newState = state; console.log("Fixing the burgulon product states"); var newProductStates = state.productStates; newProductStates[18] = 0; newProductStates[19] = 0; newProductStates[20] = 0; newProductStates[21] = 0; newProductStates[22] = 0; updateState('productStates', newProductStates); return newState; }, }, { from: 5, to: 6, added: [ { key: 'wormholePaid', value: false }, { key: 'bSpaceBenUpgrade', value: false }, ], removed: [], updated: [], }, { from: 6, to: 7, added: [ { key: 'impatientMode', value: false }, ], removed: [], updated: [], }, { from: 7, to: 8, added: [ { key: 'bBeanieImaginationUpgrade', value: false }, ], removed: [], updated: [], }, { from: 8, to: 9, added: [ { key: 'purchasedChapter2', value: false }, { key: 'purchasedChapter3', value: false }, ], removed: [], updated: [], }, { from: 9, to: 10, added: [ { key: 'tTerrariumFound', value: false }, { key: 'tWoodPS', value: 1 }, { key: 'tWoodCapacity', value: 500 }, { key: 'tCocoPS', value: 1 }, { key: 'tCocoCapacity', value: 500 }, { key: 'tGoldPS', value: 0 }, { key: 'tGoldCapacity', value: 100 }, { key: 'tWood', value: 0 }, { key: 'tCoco', value: 0 }, { key: 'tGold', value: 0 }, { key: 'wormCubes', value: 0 }, { key: 'tGamesCompleted', value: 0 }, { key: 'bAncientCubeFound', value: false }, { key: 'derekulusXCubeFound', value: false }, { key: 'bMillionDerekCubeFound', value: false }, { key: 'bPokerCubeFound', value: false }, { key: 'bRouletteCubeFound', value: false }, ], removed: [], updated: [], }, { from: 10, to: 11, added: [ { key: 'derekItems', value: [] }, ], removed: [], updated: [], }, { from: 11, to: 12, added: [ { key: 'tClosetArray', value: [] }, { key: 'tClosetSlots', value: 1 }, { key: 'tClubArray', value: [] }, { key: 'tClubSlots', value: 1 }, { key: 'chosenTTJerk', value: false }, { key: 'chosenTTItem', value: false }, ], removed: [], updated: [], }, // { // from: 2, // to: 3, // added: [], // removed: [], // updated: [{ key: 'wormFoundAgain', value: true }], // }, ]; //ADMIN HACKS // updateState('dungeonFound',true); // updateState('derekDefrosted',true); // updateState('playIntro',false); // updateState('muted',true); function hasLocalStorage() { var test = 'test'; try { localStorage.setItem(test, test); localStorage.removeItem(test); return true; } catch (e) { return false; } } function hasBridge() { return typeof BridgeCommander !== 'undefined'; } function decodeState(string) { if (typeof string !== 'undefined' && string !== null && string.length > 0) { var decoded = Base64.decode(string); var parsed = JSON.parse(decoded); return parsed; } else { return null; } } function encodeState(data) { var string = JSON.stringify(data); var encoded = Base64.encode(string); return encoded; } function loadState(onComplete) { stateQueue.paused = true; if (hasBridge() === true) { loadFromBridge(onComplete); } else if (hasLocalStorage() === true) { loadFromLocalStorage(onComplete); } else { stateQueue.paused = false; onComplete(); } } function parseAndSetState(value) { var decoded = decodeState(value); if (decoded !== null && decoded['gold'] !== undefined) { var migratedState = migrateStateIfNeeded(decoded); state = migratedState; } else { state = initialState; } stateQueue.paused = false; } function loadFromBridge(onComplete) { var call = BridgeCommander.call('loadState'); call.then(function(value) { parseAndSetState(value); onComplete(); }); call.catch(function(error) { console.log('Error trying to load state'); onComplete(); }); } function loadFromLocalStorage(onComplete) { var value = localStorage.getItem('state'); console.log("load state"); // console.log("load state: " + value); parseAndSetState(value); onComplete(); } function updateState(key, value) { if (stateQueue.paused) { return; } state[key] = value; saveState(); } var ignoreStateSaves = false; function saveState() { if (ignoreStateSaves) { return; } var encoded = encodeState(state); if (hasBridge()) { BridgeCommander.call('updateState', encoded); } else if (hasLocalStorage()) { localStorage.setItem('state', encoded); } } function updateArrayState(key, index, value) { var arrayValue = state[key]; arrayValue[index] = value; updateState(key, arrayValue); } function migrateStateIfNeeded(decoded) { var version = decoded.version; var migrations = stateMigrations.filter(m => m.from === version); if (migrations.length > 0) { var migratedState = runMigration(decoded, migrations[0]); return migrateStateIfNeeded(migratedState); } return decoded; } function runMigration(currentState, migration) { var state = currentState; migration.added.forEach(m => (state[m.key] = m.value)); migration.updated.forEach(m => (state[m.key] = m.value)); migration.removed.forEach(m => delete state[m]); if (migration.customFunction !== undefined) { state = migration.customFunction(state); } state.version = migration.to; return state; } function removeUsedBeans() { // Check for used beans var mb = state.bMyBeans; for (var i = 0; i < mb.length; i++) { if (mb[i].used) { console.log("Removed bean " + i); mb.splice(i,1); i--; } } updateState('bMyBeans', mb); } function cleanUpRemovedJerks() { // Check for removed jerks var mb = state.jerkPile; for (var i = 0; i < mb.length; i++) { if (mb[i].removed) { console.log("Removed jerk " + i); mb.splice(i,1); i--; } } updateState('jerkPile', mb); } function fixOldBurgulonState() { console.log("Fixing the burgulon product states"); var newProductStates = state.productStates; newProductStates[18] = 0; newProductStates[19] = 0; newProductStates[20] = 0; newProductStates[21] = 0; newProductStates[22] = 0; updateState('productStates', newProductStates); }