summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server.js20
-rwxr-xr-xtools/patchgame.js12
2 files changed, 26 insertions, 6 deletions
diff --git a/server.js b/server.js
index f813261..20915df 100644
--- a/server.js
+++ b/server.js
@@ -3468,6 +3468,16 @@ function put_replay(game_id, role, action, args) {
return SQL_INSERT_REPLAY.get(game_id, game_id, role, action, args)
}
+function dont_snap(rules, state, old_active) {
+ if (state.active === old_active)
+ return true
+ if (state.state === "game_over")
+ return true
+ if (rules.dont_snap && rules.dont_snap(state))
+ return true
+ return false
+}
+
function put_snap(game_id, replay_id, state) {
let snap_id = SQL_INSERT_SNAP.get(game_id, game_id, replay_id, snap_from_state(state))
if (game_clients[game_id])
@@ -3494,12 +3504,12 @@ function put_game_state(game_id, state, old_active, current_role) {
}
}
-function put_new_state(game_id, state, old_active, role, action, args) {
+function put_new_state(title_id, game_id, state, old_active, role, action, args) {
SQL_BEGIN.run()
try {
let replay_id = put_replay(game_id, role, action, args)
- if (state.active !== old_active)
+ if (!dont_snap(RULES[title_id], state, old_active))
put_snap(game_id, replay_id, state)
put_game_state(game_id, state, old_active, role)
@@ -3544,7 +3554,7 @@ function on_action(socket, action, args, cookie) {
game_cookies[socket.game_id] ++
state = RULES[socket.title_id].action(state, socket.role, action, args)
- put_new_state(socket.game_id, state, old_active, socket.role, action, args)
+ put_new_state(socket.title_id, socket.game_id, state, old_active, socket.role, action, args)
} catch (err) {
console.log(err)
return send_message(socket, "error", err.toString())
@@ -3584,7 +3594,7 @@ function do_resign(game_id, role, how) {
state.log.push("")
state.log.push(state.victory)
- put_new_state(game_id, state, old_active, role, ".resign", null)
+ put_new_state(game.title_id, game_id, state, old_active, role, ".resign", null)
}
function on_restore(socket, state_text) {
@@ -3601,7 +3611,7 @@ function on_restore(socket, state_text) {
for (let other of game_clients[socket.game_id])
other.seen = 0
- put_new_state(socket.game_id, state, null, null, "$restore", state)
+ put_new_state(socket.title_id, socket.game_id, state, null, null, "$restore", state)
} catch (err) {
console.log(err)
return send_message(socket, "error", err.toString())
diff --git a/tools/patchgame.js b/tools/patchgame.js
index c2b0802..1426a75 100755
--- a/tools/patchgame.js
+++ b/tools/patchgame.js
@@ -89,6 +89,16 @@ function is_valid_action(rules, state, role, action, arg) {
return false
}
+function dont_snap(rules, state, old_active) {
+ if (state.state === "game_over")
+ return true
+ if (state.active === old_active)
+ return true
+ if (rules.dont_snap && rules.dont_snap(state))
+ return true
+ return false
+}
+
function patch_game(game_id, {validate_actions=true, save_snaps=true, delete_undo=false, delete_invalid=false}, verbose) {
let game = select_game.get(game_id)
if (!game) {
@@ -142,7 +152,7 @@ function patch_game(game_id, {validate_actions=true, save_snaps=true, delete_und
item.state = snapshot(state)
item.checksum = crc32c(item.state)
- if (old_active !== state.active)
+ if (!dont_snap(rules, state, old_active))
item.save = 1
old_active = state.active