summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2022-06-20 22:42:33 +0200
committerTor Andersson <tor@ccxvii.net>2022-11-16 19:19:39 +0100
commitba1918039ba3b4fa428a4bc00539c1a574489d93 (patch)
treeb83c7d4bf3de5c7dc49f4f2a62243916665fc9ea
parente2153f9fe825607fa180e8ae43d8ff35792677a2 (diff)
downloadcrusader-rex-ba1918039ba3b4fa428a4bc00539c1a574489d93.tar.gz
Don't use JSON for undo state.
-rw-r--r--rules.js60
1 files 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;