diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8d49750..6363aea 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "me.lecaro.breakout" minSdk = 21 targetSdk = 34 - versionCode = 29060048 - versionName = "29060048" + versionCode = 29060103 + versionName = "29060103" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true diff --git a/app/src/main/assets/index.html b/app/src/main/assets/index.html index 0883a17..ab73a6c 100644 --- a/app/src/main/assets/index.html +++ b/app/src/main/assets/index.html @@ -1 +1 @@ -Breakout 71 \ No newline at end of file +Breakout 71 \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index f514ede..b8d4beb 100644 --- a/dist/index.html +++ b/dist/index.html @@ -719,6 +719,7 @@ var _help = require("./help"); var _creative = require("./creative"); var _tooltip = require("./tooltip"); var _startingPerks = require("./startingPerks"); +var _migrations = require("./migrations"); async function play() { if (await applyFullScreenChoice()) return; if (gameState.running) return; @@ -1431,7 +1432,7 @@ tick(); (0, _tooltip.setupTooltips)(); document.getElementById("menu")?.setAttribute("data-tooltip", (0, _i18N.t)("play.menu_tooltip")); -},{"./loadGameData":"l1B4x","./sounds":"dQKPV","./game_utils":"cEeac","./PWA/sw_loader":"2n0gK","./i18n/i18n":"eNPRm","./settings":"5blfu","./gameStateMutators":"9ZeQl","./render":"9AS2t","./recording":"godmD","./newGameState":"aQN6X","./asyncAlert":"rSqLY","./options":"d5NoS","./getLevelBackground":"7OIPf","./pure_functions":"6pQh7","./help":"bqkdF","./creative":"63kYJ","./tooltip":"3RWxb","@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3","./startingPerks":"lv30m"}],"l1B4x":[function(require,module,exports,__globalThis) { +},{"./loadGameData":"l1B4x","./sounds":"dQKPV","./game_utils":"cEeac","./PWA/sw_loader":"2n0gK","./i18n/i18n":"eNPRm","./settings":"5blfu","./gameStateMutators":"9ZeQl","./render":"9AS2t","./recording":"godmD","./newGameState":"aQN6X","./asyncAlert":"rSqLY","./options":"d5NoS","./getLevelBackground":"7OIPf","./pure_functions":"6pQh7","./help":"bqkdF","./creative":"63kYJ","./tooltip":"3RWxb","@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3","./startingPerks":"lv30m","./migrations":"a9qdY"}],"l1B4x":[function(require,module,exports,__globalThis) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "appVersion", ()=>appVersion); @@ -1474,7 +1475,7 @@ const upgrades = (0, _upgrades.rawUpgrades).map((u)=>({ })); },{"./data/palette.json":"ktRBU","./data/levels.json":"8JSUc","./data/version.json":"iyP6E","./upgrades":"1u3Dx","./getLevelBackground":"7OIPf","./levelIcon":"6rQoT","@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}],"iyP6E":[function(require,module,exports,__globalThis) { -module.exports = JSON.parse("\"29060048\""); +module.exports = JSON.parse("\"29060103\""); },{}],"1u3Dx":[function(require,module,exports,__globalThis) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); @@ -2804,13 +2805,6 @@ function highScoreForMode(mode) { } catch (e) {} return ""; } -try { - const old = localStorage.getItem("breakout-3-hs"); - if (old) { - localStorage.setItem("breakout-3-hs-short", old); - localStorage.removeItem("breakout-3-hs"); - } -} catch (e) {} },{"./loadGameData":"l1B4x","./i18n/i18n":"eNPRm","@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}],"2n0gK":[function(require,module,exports,__globalThis) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); @@ -5055,7 +5049,34 @@ async function openStartingPerksEditor() { } } -},{"./asyncAlert":"rSqLY","./i18n/i18n":"eNPRm","./loadGameData":"l1B4x","@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3","./settings":"5blfu"}]},["gVqJ6","67XFf"], "67XFf", "parcelRequire94c2") +},{"./asyncAlert":"rSqLY","./i18n/i18n":"eNPRm","./loadGameData":"l1B4x","@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3","./settings":"5blfu"}],"a9qdY":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +function migrate(name, cb) { + if (!localStorage.getItem(name)) try { + cb(); + console.debug("Ran migration : " + name); + localStorage.setItem(name, "" + Date.now()); + } catch (e) { + console.warn("Migration " + name + " failed : ", e); + } +} +migrate("migrate_high_scores", ()=>{ + const old = localStorage.getItem("breakout-3-hs"); + if (old) { + localStorage.setItem("breakout-3-hs-short", old); + localStorage.removeItem("breakout-3-hs"); + } +}); +migrate("recover_high_scores", ()=>{ + let runsHistory = JSON.parse(localStorage.getItem("breakout_71_runs_history") || "[]"); + runsHistory.forEach((r)=>{ + const currentHS = parseInt(localStorage.getItem("breakout-3-hs-" + (r.mode || "short")) || "0"); + if (r.score > currentHS) localStorage.setItem("breakout-3-hs-" + (r.mode || "short"), "" + r.score); + }); +}); + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}]},["gVqJ6","67XFf"], "67XFf", "parcelRequire94c2") diff --git a/src/PWA/sw-b71.js b/src/PWA/sw-b71.js index 22bb323..a3c57da 100644 --- a/src/PWA/sw-b71.js +++ b/src/PWA/sw-b71.js @@ -1,5 +1,5 @@ // The version of the cache. -const VERSION = "29060048"; +const VERSION = "29060103"; // The name of the cache const CACHE_NAME = `breakout-71-${VERSION}`; diff --git a/src/data/version.json b/src/data/version.json index 5b015fc..ca47cdb 100644 --- a/src/data/version.json +++ b/src/data/version.json @@ -1 +1 @@ -"29060048" +"29060103" diff --git a/src/game.ts b/src/game.ts index 4646d75..c1c80e8 100644 --- a/src/game.ts +++ b/src/game.ts @@ -69,6 +69,7 @@ import { helpMenuEntry } from "./help"; import { creativeMode } from "./creative"; import { setupTooltips } from "./tooltip"; import { startingPerkMenuButton } from "./startingPerks"; +import "./migrations"; export async function play() { if (await applyFullScreenChoice()) return; diff --git a/src/game_utils.ts b/src/game_utils.ts index d7c55ca..01768f4 100644 --- a/src/game_utils.ts +++ b/src/game_utils.ts @@ -268,11 +268,3 @@ export function highScoreForMode(mode: GameState["mode"]) { return ""; } - -try { - const old = localStorage.getItem("breakout-3-hs"); - if (old) { - localStorage.setItem("breakout-3-hs-short", old); - localStorage.removeItem("breakout-3-hs"); - } -} catch (e) {} diff --git a/src/migrations.ts b/src/migrations.ts new file mode 100644 index 0000000..0202458 --- /dev/null +++ b/src/migrations.ts @@ -0,0 +1,37 @@ +import { RunHistoryItem } from "./types"; + +function migrate(name: string, cb: () => void) { + if (!localStorage.getItem(name)) { + try { + cb(); + console.debug("Ran migration : " + name); + localStorage.setItem(name, "" + Date.now()); + } catch (e) { + console.warn("Migration " + name + " failed : ", e); + } + } +} + +migrate("migrate_high_scores", () => { + const old = localStorage.getItem("breakout-3-hs"); + if (old) { + localStorage.setItem("breakout-3-hs-short", old); + localStorage.removeItem("breakout-3-hs"); + } +}); +migrate("recover_high_scores", () => { + let runsHistory = JSON.parse( + localStorage.getItem("breakout_71_runs_history") || "[]", + ) as RunHistoryItem[]; + runsHistory.forEach((r) => { + const currentHS = parseInt( + localStorage.getItem("breakout-3-hs-" + (r.mode || "short")) || "0", + ); + if (r.score > currentHS) { + localStorage.setItem( + "breakout-3-hs-" + (r.mode || "short"), + "" + r.score, + ); + } + }); +});