diff options
Diffstat (limited to 'rules.ts')
-rw-r--r-- | rules.ts | 53 |
1 files changed, 27 insertions, 26 deletions
@@ -262,6 +262,7 @@ function setup_final_bid() { function setup_player_turn() { game.fascist = 0; + game.card_played = 0; const next_faction = game.first_player === null @@ -352,6 +353,7 @@ const engine_functions: Record<string, Function> = { card53_event2, card54_event1, setup_return_card_from_trash, + trash_card, }; function get_active( @@ -661,6 +663,7 @@ export function setup(seed: number, _scenario: string, _options: unknown) { year: 0, glory_current_year: null, fascist: 0, + card_played: 0, }; // Randomly choose second player @@ -1206,8 +1209,10 @@ states.play_card = { }, card(c: CardId) { const faction = get_active_faction(); - game.selected_cards[faction].push(c); + game.selected_cards[faction] = [c]; + game.card_played = 0; + // NOTE: I don't think we are using game.played_card in the UI at the moment? game.played_card = game.selected_cards[faction][0]; resolve_active_and_proceed(); @@ -1241,7 +1246,7 @@ states.choose_card = { }, card(c: CardId, player: Player) { const faction = player_faction_map[player]; - game.selected_cards[faction].push(c); + game.selected_cards[faction] = [c]; }, undo(_, player: Player) { const faction = player_faction_map[player]; @@ -1305,7 +1310,7 @@ function setup_momentum() { // Get player turn node const node: StateNode<PlayerTurnArgs> = get_nodes_for_state('player_turn')[0]; - const player_needs_to_play_card = game.selected_cards[faction].length > 0; + const player_needs_to_play_card = !game.card_played; const { use_ap, use_morale_bonus, resolving_event } = node.a ?? ({} as PlayerTurnArgs); @@ -1840,7 +1845,7 @@ states.player_turn = { const can_spend_hp = game.faction_turn === faction_id && game.hero_points[faction_id] > 0; - const can_play_card = game.selected_cards[faction_id].length > 0; + const can_play_card = !game.card_played; if (use_momentum) { gen_action('use_momentum'); if (use_ap || use_morale_bonus || can_play_card) { @@ -1876,9 +1881,11 @@ states.player_turn = { end_turn() { game.faction_turn = null; game.played_card = null; + game.selected_cards[get_active_faction()] = []; resolve_active_and_proceed(true); }, play_to_tableau() { + game.card_played = 1; const faction = get_active_faction(); const { strength } = play_card_to_tableau(faction); update_active_node_args<PlayerTurnArgs>({ @@ -1889,6 +1896,7 @@ states.player_turn = { next(); }, play_for_event() { + game.card_played = 1; const faction = get_active_faction(); const { effects } = play_card_for_event(faction); update_active_node_args<PlayerTurnArgs>({ @@ -1896,7 +1904,7 @@ states.player_turn = { }); const node = create_effects_node(effects, 'player_event'); - node.c.push(create_state_node('trash_card_played_for_event', faction)); + node.c.push(create_function_node('trash_card', faction)); node.c.push(create_function_node('end_resolving_event_effects')); insert_before_active_node(node); @@ -1916,14 +1924,21 @@ states.player_turn = { next(); }, use_momentum() { + const faction = get_active_faction(); // We need to update since there can be a case where // morale bonus hasn't been used yet but is still set to true // due to bonus being turned off. + game.card_played = 0; + game.selected_cards[faction] = []; update_active_node_args<PlayerTurnArgs>({ use_morale_bonus: false, use_momentum: false, }); - setup_momentum(); + insert_before_active_node( + create_state_node<PlayCardArgs>('play_card', faction, { + src: 'momentum', + }) + ) next(); }, use_morale_bonus() { @@ -2341,25 +2356,9 @@ function trash_card() { array_remove(game.hands[faction], game.hands[faction].indexOf(card_id)); array_remove(game.selected_cards[faction], index); game.trash[faction].push(card_id); + resolve_active_and_proceed(); } -states.trash_card_played_for_event = { - inactive: 'trash their card', - prompt() { - view.prompt = 'Trash your card'; - gen_action('trash_card'); - }, - // NOTE: uncomment this to autoresolve - // auto_resolve() { - // trash_card(); - // return true; - // }, - trash_card() { - trash_card(); - resolve_active_and_proceed(); - }, -}; - states.use_organization_medallion = { inactive: 'use Organization Medallion', prompt() { @@ -2377,15 +2376,18 @@ states.use_organization_medallion = { pay_hero_points(faction, 1); game.used_medallions.push(ORGANIZATION_MEDALLION_ID); + // Value is the clicked location on the track let { t, v } = get_active_node_args(); + // If player uses medallion we need to add or subtract + // depending on direction of movement if (v > game.tracks[t]) { v++; } else { v--; } - move_track(t, v); + move_track(t, v - game.tracks[t]); resolve_active_and_proceed(); }, no() { @@ -2815,8 +2817,7 @@ function play_card_to_tableau(faction: FactionId): PlayerCard { game.played_card = card_id; array_remove(game.hands[faction], game.hands[faction].indexOf(card_id)); - // TODO: keep card selected during resolution - array_remove(game.selected_cards[faction], index); + log('Played to Tableau:'); game.tableaus[faction].push(card_id); return card as PlayerCard; |