Migrate old savegames

pull/60/head
tobspr 4 years ago
parent 4e18fa74d4
commit 23db5b117e

@ -40,6 +40,9 @@
<meta http-equiv="Expires" content="0" /> <meta http-equiv="Expires" content="0" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<link rel="canonical" href="https://shapez.io" /> <link rel="canonical" href="https://shapez.io" />
<!-- a/b testing -->
<script src="https://www.googleoptimize.com/optimize.js?id=OPT-M5NHCV7"></script>
</head> </head>
<body oncontextmenu="return false" style="background: #393747;"></body> <body oncontextmenu="return false" style="background: #393747;"></body>

@ -1,4 +1,12 @@
export const CHANGELOG = [ export const CHANGELOG = [
{
version: "1.1.3",
date: "unreleased",
entries: [
"Allow binding mouse buttons to actions (by Dimava)",
"Fix belts being too slow when copied via blueprint (by Dimava)",
],
},
{ {
version: "1.1.2", version: "1.1.2",
date: "30.05.2020", date: "30.05.2020",

@ -66,11 +66,6 @@ export class GoogleAnalyticsImpl extends AnalyticsInterface {
} }
trackUiClick(elementName) { trackUiClick(elementName) {
// Only track a fraction of clicks to not annoy google analytics
if (Math_random() < 0.9) {
return;
}
const stateKey = this.app.stateMgr.getCurrentState().key; const stateKey = this.app.stateMgr.getCurrentState().key;
const fullSelector = stateKey + ">" + elementName; const fullSelector = stateKey + ">" + elementName;

@ -10,8 +10,9 @@ import { BaseSavegameInterface } from "./savegame_interface";
import { createLogger } from "../core/logging"; import { createLogger } from "../core/logging";
import { globalConfig } from "../core/config"; import { globalConfig } from "../core/config";
import { SavegameInterface_V1000 } from "./schemas/1000"; import { SavegameInterface_V1000 } from "./schemas/1000";
import { getSavegameInterface } from "./savegame_interface_registry"; import { getSavegameInterface, savegameInterfaces } from "./savegame_interface_registry";
import { SavegameInterface_V1001 } from "./schemas/1001"; import { SavegameInterface_V1001 } from "./schemas/1001";
import { SavegameInterface_V1002 } from "./schemas/1002";
const logger = createLogger("savegame"); const logger = createLogger("savegame");
@ -30,6 +31,11 @@ export class Savegame extends ReadWriteProxy {
/** @type {import("./savegame_typedefs").SavegameData} */ /** @type {import("./savegame_typedefs").SavegameData} */
this.currentData = this.getDefaultData(); this.currentData = this.getDefaultData();
assert(
savegameInterfaces[Savegame.getCurrentVersion()],
"Savegame interface not defined: " + Savegame.getCurrentVersion()
);
} }
//////// RW Proxy Impl ////////// //////// RW Proxy Impl //////////
@ -38,14 +44,14 @@ export class Savegame extends ReadWriteProxy {
* @returns {number} * @returns {number}
*/ */
static getCurrentVersion() { static getCurrentVersion() {
return 1001; return 1002;
} }
/** /**
* @returns {typeof BaseSavegameInterface} * @returns {typeof BaseSavegameInterface}
*/ */
static getReaderClass() { static getReaderClass() {
return SavegameInterface_V1001; return savegameInterfaces[Savegame.getCurrentVersion()];
} }
/** /**
@ -82,6 +88,11 @@ export class Savegame extends ReadWriteProxy {
data.version = 1001; data.version = 1001;
} }
if (data.version === 1001) {
SavegameInterface_V1002.migrate1001to1002(data);
data.version = 1002;
}
return ExplainedResult.good(); return ExplainedResult.good();
} }

@ -2,11 +2,13 @@ import { BaseSavegameInterface } from "./savegame_interface";
import { SavegameInterface_V1000 } from "./schemas/1000"; import { SavegameInterface_V1000 } from "./schemas/1000";
import { createLogger } from "../core/logging"; import { createLogger } from "../core/logging";
import { SavegameInterface_V1001 } from "./schemas/1001"; import { SavegameInterface_V1001 } from "./schemas/1001";
import { SavegameInterface_V1002 } from "./schemas/1002";
/** @type {Object.<number, typeof BaseSavegameInterface>} */ /** @type {Object.<number, typeof BaseSavegameInterface>} */
const interfaces = { export const savegameInterfaces = {
1000: SavegameInterface_V1000, 1000: SavegameInterface_V1000,
1001: SavegameInterface_V1001, 1001: SavegameInterface_V1001,
1002: SavegameInterface_V1002,
}; };
const logger = createLogger("savegame_interface_registry"); const logger = createLogger("savegame_interface_registry");
@ -27,7 +29,7 @@ export function getSavegameInterface(savegame) {
return null; return null;
} }
const interfaceClass = interfaces[version]; const interfaceClass = savegameInterfaces[version];
if (!interfaceClass) { if (!interfaceClass) {
logger.warn("Version", version, "has no implemented interface!"); logger.warn("Version", version, "has no implemented interface!");
return null; return null;

@ -0,0 +1,37 @@
import { createLogger } from "../../core/logging.js";
import { T } from "../../translations.js";
import { SavegameInterface_V1001 } from "./1001.js";
const schema = require("./1002.json");
const logger = createLogger("savegame_interface/1002");
export class SavegameInterface_V1002 extends SavegameInterface_V1001 {
getVersion() {
return 1002;
}
getSchemaUncached() {
return schema;
}
/**
* @param {import("../savegame_typedefs.js").SavegameData} data
*/
static migrate1001to1002(data) {
logger.log("Migrating 1001 to 1002");
const dump = data.dump;
if (!dump) {
return true;
}
const entities = dump.entities;
for (let i = 0; i < entities.length; ++i) {
const entity = entities[i];
const beltComp = entity.components.Belt;
const ejectorComp = entity.components.ItemEjector;
if (beltComp && ejectorComp) {
ejectorComp.instantEject = true;
}
}
}
}

@ -0,0 +1,5 @@
{
"type": "object",
"required": [],
"additionalProperties": true
}

@ -1 +1 @@
1.1.2 1.1.3
Loading…
Cancel
Save