diff options
-rw-r--r-- | tools/patchgame.js | 78 |
1 files changed, 54 insertions, 24 deletions
diff --git a/tools/patchgame.js b/tools/patchgame.js index 86c0580..9b63f4f 100644 --- a/tools/patchgame.js +++ b/tools/patchgame.js @@ -1,44 +1,74 @@ #!/usr/bin/env node -const fs = require('fs'); -const sqlite3 = require('better-sqlite3'); +const fs = require('fs') +const sqlite3 = require('better-sqlite3') if (process.argv.length !== 3) { - process.stderr.write("usage: ./tools/patchgame.js <game_id>\n"); - process.exit(1); + process.stderr.write("usage: ./tools/patchgame.js <game_id>\n") + process.exit(1) } -let db = new sqlite3("./db"); +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 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 save = db.prepare("select state from game_state where game_id=?").pluck().get(game_id) +fs.writeFileSync("backup-" + game_id + ".txt", save) + +function is_valid_action(rules, game, role, action, a) { + if (action !== 'undo') + if (game.active !== role && game.active !== "Both" && game.active !== "All") + return false + let view = rules.view(game, role) + let va = view.actions[action] + if (va === undefined) + return false + if (a === undefined || a === null) + return (va === 1) || (typeof va === 'string') + if (Array.isArray(a)) + a = a[0] + if (!Array.isArray(va)) + throw new Error("action list not array:" + JSON.stringify(view.actions)) + return va.includes(a) +} let game = { state: null, active: null } -let i = 0; +let view = null +let i = 0 try { log.forEach(item => { - let args = JSON.parse(item.arguments); + let args = JSON.parse(item.arguments) if (item.action === 'setup') - game = rules.setup(args[0], args[1], args[2]); + 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); - ++i; - }); + game = rules.resign(game, item.role) + else { + console.log("ACTION", i, game.seed, game.state, game.active, ">", item.role, item.action, item.arguments) + if (1) + if (!is_valid_action(rules, game, item.role, item.action, args)) { + console.log(`invalid action: ${item.role} ${item.action} ${item.arguments}`) + console.log("\t", game.state, game.active, JSON.stringify(rules.view(game, item.role).actions)) + throw "invalid action" + } + game = rules.action(game, item.role, item.action, args) + } + ++i + }) } catch (err) { - console.log("FAILED %d/%d", i+1, log.length); - console.log(err); + console.log("FAILED %d/%d", i+1, log.length) + console.log(err) + game.log=undefined + game.undo=undefined + //console.log(JSON.stringify(game,0,4)) + console.log(game) } -db.prepare("update game_state set active=?, state=? where game_id=?").run(game.active, JSON.stringify(game), game_id); +db.prepare("update game_state set active=?, state=? where game_id=?").run(game.active, JSON.stringify(game), game_id) if (i < log.length) { - console.log("BROKEN ENTRIES: %d", log.length-i); - console.log(`sqlite3 db "delete from game_replay where game_id=${game_id} and replay_id>=${log[i].replay_id}"`); + console.log("BROKEN ENTRIES: %d", log.length-i) + console.log(`sqlite3 db "delete from game_replay where game_id=${game_id} and replay_id>=${log[i].replay_id}"`) } |