summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Bongers <fransbongers@macbookpro.home>2025-03-22 20:09:42 +0100
committerFrans Bongers <fransbongers@macbookpro.home>2025-03-22 20:09:42 +0100
commit3edb3e8c15ac307c8adc6415408091c5037bad52 (patch)
treed21a9a57ae54a5b2569880a2d4abc0eb35a667ec
parente0be8aea7bc4d8de52ee0e8750968d70f86c979d (diff)
downloadland-and-freedom-3edb3e8c15ac307c8adc6415408091c5037bad52.tar.gz
skip a players turn if they cannot play a card
-rw-r--r--rules.js24
-rw-r--r--rules.ts30
2 files changed, 43 insertions, 11 deletions
diff --git a/rules.js b/rules.js
index bd6e116..eb0b138 100644
--- a/rules.js
+++ b/rules.js
@@ -155,11 +155,16 @@ function setup_player_turn(faction_id) {
if (game.first_player === null) {
game.first_player = next_faction;
}
- game.engine = [
- create_function_node('start_of_player_turn', { f: next_faction }),
- create_state_node('player_turn', next_faction),
- ];
- next();
+ if (game.selected_cards[next_faction].length > 0) {
+ game.engine = [
+ create_function_node('start_of_player_turn', { f: next_faction }),
+ create_state_node('player_turn', next_faction),
+ ];
+ next();
+ }
+ else {
+ setup_player_turn(get_next_faction_in_player_order(next_faction));
+ }
}
function check_end_of_year_discard() {
const { f: faction } = get_active_node_args();
@@ -1029,6 +1034,9 @@ states.choose_card = {
view.actions.undo = 1;
view.actions.confirm = 1;
}
+ if (game.selected_cards[faction].length === 0 && game.hands[faction].length === 0) {
+ gen_action('skip');
+ }
},
spend_hp() {
resolve_spend_hp();
@@ -1047,6 +1055,12 @@ states.choose_card = {
resolve_active_and_proceed();
}
},
+ skip(_, player) {
+ set_delete(game.active, player);
+ if (game.active.length === 0) {
+ resolve_active_and_proceed();
+ }
+ },
};
states.choose_final_bid = {
inactive: 'choose Final Bid',
diff --git a/rules.ts b/rules.ts
index 9484e7b..98f4f8e 100644
--- a/rules.ts
+++ b/rules.ts
@@ -276,12 +276,20 @@ function setup_player_turn(faction_id: FactionId) {
game.first_player = next_faction;
}
- game.engine = [
- create_function_node('start_of_player_turn', { f: next_faction }),
- create_state_node('player_turn', next_faction),
- ];
-
- next();
+ if (game.selected_cards[next_faction].length > 0) {
+ game.engine = [
+ create_function_node('start_of_player_turn', { f: next_faction }),
+ create_state_node('player_turn', next_faction),
+ ];
+ next();
+ } else {
+ /**
+ * Edge case situation where a player was not able to play a card due to
+ * having played Momentum medallion in a previous turn.
+ * This will skip their turn
+ */
+ setup_player_turn(get_next_faction_in_player_order(next_faction))
+ }
}
// Check if player needs to discard cards. If so inserts state node
@@ -1307,6 +1315,10 @@ states.choose_card = {
view.actions.undo = 1;
view.actions.confirm = 1;
}
+ // Edge case situation where player does not have any cards due to Momentum
+ if (game.selected_cards[faction].length === 0 && game.hands[faction].length === 0) {
+ gen_action('skip');
+ }
},
spend_hp() {
resolve_spend_hp();
@@ -1325,6 +1337,12 @@ states.choose_card = {
resolve_active_and_proceed();
}
},
+ skip(_, player: Player) {
+ set_delete(game.active as Player[], player);
+ if (game.active.length === 0) {
+ resolve_active_and_proceed();
+ }
+ },
};
states.choose_final_bid = {