mirror of
https://gitlab.com/lecarore/breakout71.git
synced 2025-04-21 20:46:14 -04:00
129 lines
3.6 KiB
TypeScript
129 lines
3.6 KiB
TypeScript
import { RunHistoryItem } from "./types";
|
|
|
|
import _appVersion from "./data/version.json";
|
|
import { generateSaveFileContent } from "./generateSaveFileContent";
|
|
import { getLevelUnlockCondition, reasonLevelIsLocked } from "./game_utils";
|
|
import { allLevels } from "./loadGameData";
|
|
|
|
// The page will be reloaded if any migrations were run
|
|
let migrationsRun = 0;
|
|
function migrate(name: string, cb: () => void) {
|
|
if (!localStorage.getItem(name)) {
|
|
try {
|
|
cb();
|
|
console.debug("Ran migration : " + name);
|
|
localStorage.setItem(name, "" + Date.now());
|
|
migrationsRun++;
|
|
} catch (e) {
|
|
console.warn("Migration " + name + " failed : ", e);
|
|
}
|
|
}
|
|
}
|
|
function afterMigration() {
|
|
// Avoid a boot loop by setting the hash before reloading
|
|
// We can't set the query string as it is used for other things
|
|
if (migrationsRun && !window.location.hash) {
|
|
window.location.hash = "#reloadAfterMigration";
|
|
window.location.reload();
|
|
}
|
|
if (!migrationsRun) {
|
|
window.location.hash = "";
|
|
}
|
|
}
|
|
|
|
migrate("save_data_before_upgrade_to_" + _appVersion, () => {
|
|
localStorage.setItem(
|
|
"recovery_data",
|
|
JSON.stringify(generateSaveFileContent()),
|
|
);
|
|
});
|
|
|
|
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,
|
|
);
|
|
}
|
|
});
|
|
});
|
|
|
|
migrate("remove_long_and_creative_mode_data", () => {
|
|
let runsHistory = JSON.parse(
|
|
localStorage.getItem("breakout_71_runs_history") || "[]",
|
|
) as RunHistoryItem[];
|
|
|
|
let cleaned = runsHistory.filter((r) => {
|
|
if (!r.perks) return false;
|
|
if ("mode" in r) {
|
|
if (r.mode !== "short") {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
if (cleaned.length !== runsHistory.length)
|
|
localStorage.setItem("breakout_71_runs_history", JSON.stringify(cleaned));
|
|
});
|
|
|
|
migrate("compact_runs_data", () => {
|
|
let runsHistory = JSON.parse(
|
|
localStorage.getItem("breakout_71_runs_history") || "[]",
|
|
) as RunHistoryItem[];
|
|
|
|
runsHistory.forEach((r) => {
|
|
r.runTime = Math.round(r.runTime);
|
|
for (let key in r.perks) {
|
|
if (r.perks && !r.perks[key]) {
|
|
delete r.perks[key];
|
|
}
|
|
}
|
|
if ("best_level_score" in r) {
|
|
delete r.best_level_score;
|
|
}
|
|
if ("worst_level_score" in r) {
|
|
delete r.worst_level_score;
|
|
}
|
|
});
|
|
|
|
localStorage.setItem("breakout_71_runs_history", JSON.stringify(runsHistory));
|
|
});
|
|
|
|
migrate("set_breakout_71_unlocked_levels" + _appVersion, () => {
|
|
// We want to lock any level unlocked by an app upgrade too
|
|
let runsHistory = JSON.parse(
|
|
localStorage.getItem("breakout_71_runs_history") || "[]",
|
|
) as RunHistoryItem[];
|
|
|
|
let breakout_71_unlocked_levels = JSON.parse(
|
|
localStorage.getItem("breakout_71_unlocked_levels") || "[]",
|
|
) as string[];
|
|
|
|
allLevels
|
|
.filter((l, li) => !reasonLevelIsLocked(li, runsHistory, false))
|
|
.forEach((l) => {
|
|
if (!breakout_71_unlocked_levels.includes(l.name)) {
|
|
breakout_71_unlocked_levels.push(l.name);
|
|
}
|
|
});
|
|
localStorage.setItem(
|
|
"breakout_71_unlocked_levels",
|
|
JSON.stringify(breakout_71_unlocked_levels),
|
|
);
|
|
});
|
|
|
|
afterMigration();
|