From 47833d20bdd7dbfdd3f13e820f595fbd5b5c387b Mon Sep 17 00:00:00 2001 From: Joël Simoneau Date: Sun, 27 Oct 2024 19:04:25 -0400 Subject: Rebel and Control. --- play.js | 9 +++++- rules.js | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) diff --git a/play.js b/play.js index df932ed..f173ee6 100644 --- a/play.js +++ b/play.js @@ -908,10 +908,15 @@ function on_update() { } // Control - view.tributary &= ~(1 << 12) if (s < S_DELHI) { if (view.tributary & (1< 0) @@ -716,6 +766,7 @@ function can_build_in_space(s) { function add_tributary(s) { game.tributary |= (1 << s) + update_control() } function is_tributary(s) { @@ -724,10 +775,52 @@ function is_tributary(s) { function remove_tributary(s) { game.tributary &= ~(1 << s) + update_control() } /* MISC SPACE + PIECE QUERIES */ +function count_pieces(s, faction, type) { + let first = first_piece[faction][type] + let last = last_piece[faction][type] + let n = 0 + for (let p = first; p <= last; ++p) + if (piece_space(p) === s) + ++n + return n +} + +function count_faction_pieces(s, faction) { + switch (faction) { + case DS: + return count_pieces(s, DS, TROOPS) + count_pieces(s, DS, ELITE) + count_pieces(s, DS, DISC) + case BK: + return count_pieces(s, BK, ELITE) + count_pieces(s, BK, DISC) + case VE: + return count_pieces(s, VE, ELITE) + count_pieces(s, VE, DISC) + case MI: + return count_pieces(s, MI, TROOPS) + } +} + +function has_majority(s) { + let d = count_faction_pieces(s, DS) + let b = count_faction_pieces(s, BK) + let v = count_faction_pieces(s, VE) + let m = count_faction_pieces(s, MI) + + if (d > b + v + m) + return DS + else if (b > d + v + m) + return BK + else if (v > b + d + m) + return VE + else if (m > b + d+ v) + return MI + else + return -1 +} + function has_piece(s, faction, type) { let first = first_piece[faction][type] let last = last_piece[faction][type] @@ -770,6 +863,7 @@ function place_piece(p, s) { p = find_piece(AVAILABLE, piece_faction(p), piece_type(p)) set_piece_space(p, s) + update_control() } function piece_faction(p) { @@ -822,6 +916,16 @@ function add_resources(faction, n) { game.resources[faction] = Math.max(0, Math.min(24, game.resources[faction] + n)) } +function update_control() { + game.control = [0, 0, 0] + for (let s = first_space; s <= last_province; ++s) { + if (is_tributary(s)) continue + + let c = has_majority(s) + if (c <= VE) + game.control[c] |= (1 << s) + } +} /* ACTIONS */ -- cgit v1.2.3