From db82084e6c167b5986679bdee237f613f1153f80 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 20 Dec 2021 23:49:55 +0100 Subject: Add 'patch' script to fix game state by replaying from the start. --- tools/patchgame.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tools/patchgame.js (limited to 'tools') diff --git a/tools/patchgame.js b/tools/patchgame.js new file mode 100644 index 0000000..467a45f --- /dev/null +++ b/tools/patchgame.js @@ -0,0 +1,32 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const sqlite3 = require('better-sqlite3'); + +if (process.argv.length !== 3) { + process.stderr.write("usage: ./tools/patchgame.js \n"); + process.exit(1); +} + +let db = new sqlite3("./db"); + +let game_id = process.argv[2]; +let title_id = db.prepare("select title_id from games where game_id=?").pluck().get(game_id); +let rules = require("../public/" + title_id + "/rules.js"); +let log = db.prepare("select * from game_replay where game_id=?").all(game_id); + +let save = db.prepare("select state from game_state where game_id=?").pluck().get(game_id); +fs.writeFileSync("backup-" + game_id + ".txt", save); + +let game = { state: null, active: null } +log.forEach(item => { + let args = JSON.parse(item.arguments); + if (item.action === 'setup') + game = rules.setup(args[0], args[1], args[2]); + else if (item.action === 'resign') + game = rules.resign(game, item.role); + else + game = rules.action(game, item.role, item.action, args); +}); + +db.prepare("update game_state set active=?, state=? where game_id=?").run(game.active, JSON.stringify(game), game_id); -- cgit v1.2.3