From bc3e6882e21acd7e92631111d9b5862fb28cf457 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 3 Jun 2023 00:57:27 +0200 Subject: Re-evaluate control during removal ops, but still forbid daisy chaining. --- rules.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/rules.js b/rules.js index 9b3e051..cbd7d0e 100644 --- a/rules.js +++ b/rules.js @@ -520,6 +520,13 @@ function update_presence_and_control() { } } +function update_operations_possible() { + game.possible = 0 + for (let s of game.spaces) + if (is_present(s) || is_adjacent_to_control(s)) + game.possible |= (1 << s) +} + function is_present(s) { if (game.active === COMMUNE) return game.presence & (1 << s) @@ -1612,6 +1619,7 @@ function goto_operations(count, spaces) { function goto_operations_remove() { update_presence_and_control() + update_operations_possible() if (can_operations_remove()) game.state = "operations_remove" else @@ -1626,7 +1634,7 @@ function can_operations_remove() { } function can_operations_remove_space(s) { - if (is_present(s) || is_adjacent_to_control(s)) { + if (game.possible & (1 << s)) { let c = has_enemy_cube(s) let d = has_enemy_disc(s) if (c || d) { @@ -1690,8 +1698,9 @@ states.operations_remove = { if (is_military_space(s)) { let str = military_strength(s) if (str >= 3) { - logi("Remove " + pn + " from S" + s + ".") + log("Remove " + pn + " from S" + s + ".") remove_piece(p) + update_presence_and_control() resume_operations_remove() } else { log("Remove " + pn + " from S" + s + ".") @@ -1701,6 +1710,7 @@ states.operations_remove = { } else { log("Removed " + pn + " from S" + s + ".") remove_piece(p) + update_presence_and_control() resume_operations_remove() } }, @@ -1756,6 +1766,7 @@ function attempt_remove_piece(extra) { logi("Strength " + str + " vs " + ops) if (str >= ops) { remove_piece(p) + update_presence_and_control() logi("Success") } else { logi("Failure") @@ -1775,6 +1786,7 @@ function resume_operations_remove() { function goto_operations_place() { update_presence_and_control() + update_operations_possible() if (can_operations_place()) game.state = "operations_place" else @@ -1791,7 +1803,7 @@ function can_operations_place() { } function can_operations_place_space(s) { - if (is_present(s) || is_adjacent_to_control(s)) { + if (game.possible & (1 << s)) { if (can_place_cube(s)) { let d = has_enemy_disc(s) if (!d || game.count >= 2) @@ -3301,6 +3313,7 @@ exports.setup = function (seed, scenario, options) { presence: 0, control: 0, + possible: 0, pieces: [ // Commune cubes -- cgit v1.2.3