From ba1918039ba3b4fa428a4bc00539c1a574489d93 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 20 Jun 2022 22:42:33 +0200 Subject: Don't use JSON for undo state. --- rules.js | 60 +++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/rules.js b/rules.js index b8b112d..7da97d7 100644 --- a/rules.js +++ b/rules.js @@ -162,25 +162,54 @@ function remove_from_array(array, item) { array.splice(i, 1); } -function clear_undo() { - game.undo = []; +function deep_copy(original) { + if (Array.isArray(original)) { + let n = original.length + let copy = new Array(n) + for (let i = 0; i < n; ++i) { + let v = original[i] + if (typeof v === "object" && v !== null) + copy[i] = deep_copy(v) + else + copy[i] = v + } + return copy + } else { + let copy = {} + for (let i in original) { + let v = original[i] + if (typeof v === "object" && v !== null) + copy[i] = deep_copy(v) + else + copy[i] = v + } + return copy + } } function push_undo() { - game.undo.push(JSON.stringify(game, (k,v) => { - if (k === 'undo') return 0; - if (k === 'log') return v.length; - return v; - })); + let copy = {} + for (let k in game) { + let v = game[k] + if (k === "undo") continue + else if (k === "log") v = v.length + else if (typeof v === "object" && v !== null) v = deep_copy(v) + copy[k] = v + } + game.undo.push(copy) } function pop_undo() { - let undo = game.undo; - let save_log = game.log; - game = JSON.parse(undo.pop()); - game.undo = undo; - save_log.length = game.log; - game.log = save_log; + let save_log = game.log + let save_undo = game.undo + game = save_undo.pop() + save_log.length = game.log + game.log = save_log + game.undo = save_undo +} + +function clear_undo() { + game.undo = [] } function gen_action_undo(view) { @@ -3689,6 +3718,9 @@ function make_battle_view() { exports.setup = function (seed, scenario, options) { game = { seed: seed, + log: [], + undo: [], + s_hand: [], f_hand: [], s_card: 0, @@ -3698,7 +3730,6 @@ exports.setup = function (seed, scenario, options) { last_used: {}, location: {}, castle: [], - log: [], main_road: {}, moved: {}, moves: 0, @@ -3709,7 +3740,6 @@ exports.setup = function (seed, scenario, options) { steps: {}, who: null, where: null, - undo: [], } if (options && options.iron_bridge) { game.iron_bridge = 1; -- cgit v1.2.3