diff options
Diffstat (limited to 'rules.ts')
-rw-r--r-- | rules.ts | 99 |
1 files changed, 64 insertions, 35 deletions
@@ -685,29 +685,31 @@ export function setup(seed: number, _scenario: string, options: Record<string,bo return game; } +function can_draw_any_hand_cards(faction_id: FactionId) { + return (game.discard[faction_id].length > 0 || count_deck(faction_id) > 0) +} + function draw_hand_cards(faction_id: FactionId, count: number, indent = true) { - const deck = list_deck(faction_id); + let deck = list_deck(faction_id); if (game.medallions[faction_id].includes(INTELLIGENCE_MEDALLION_ID)) { log(">M" + INTELLIGENCE_MEDALLION_ID); count++; } - let drawn_cards = 0; - // Draw all remaining cards - if (deck.length < count) { - count = count - deck.length; - drawn_cards += deck.length; - game.hands[faction_id] = game.hands[faction_id].concat(deck); - game.discard[faction_id] = []; - } - - for (let i = 0; i < count; i++) { - const deck = list_deck(faction_id); - if (deck.length > 0) { - game.hands[faction_id].push(draw_card(deck)); - drawn_cards++; + let drawn_cards = 0; + while (drawn_cards < count) { + if (deck.length === 0) { + if (game.discard[faction_id].length === 0) { + logi(`${get_player(faction_id)} deck is empty`); + break; + } + logi(`${get_player(faction_id)} reshuffled`); + game.discard[faction_id] = []; + deck = list_deck(faction_id); } + game.hands[faction_id].push(draw_card(deck)); + drawn_cards++; } if (indent) @@ -2268,7 +2270,11 @@ states.spend_hero_points = { return; } - gen_action('draw_card'); + if (can_draw_any_hand_cards(faction)) + view.actions['draw_card'] = 1; + else + view.actions['draw_card'] = 0; + if (can_use_medallion(ARCHIVES_MEDALLION_ID, faction)) { gen_action('archives'); if (game.triggered_track_effects.length === 0) { @@ -3827,25 +3833,48 @@ function make_list(first: number, last: number): number[] { return list; } -function list_deck(id: FactionId | FascistId) { - const deck = []; - const card_list: CardId[] = - id === FASCIST_ID ? fascist_decks[game.year] : faction_cards[id]; - card_list.forEach((card) => { - if (id === FASCIST_ID) { - if (game.current_events.includes(card)) return; - if (game.discard[id].includes(card)) return; - if (game.fascist_cards && game.fascist_cards.includes(card)) return; - } else if ( - game.hands[id].includes(card) || - game.discard[id].includes(card) || - game.tableaus[id].includes(card) || - game.trash[id].includes(card) - ) { - return; - } - deck.push(card); - }); +function is_fascist_card_used(card: CardId) { + return ( + game.current_events.includes(card) || + game.discard[FASCIST_ID].includes(card) || + (game.fascist_cards && game.fascist_cards.includes(card)) + ); +} + +function is_player_card_used(faction: FactionId, card: CardId) { + return ( + game.hands[faction].includes(card) || + game.discard[faction].includes(card) || + game.tableaus[faction].includes(card) || + game.trash[faction].includes(card) + ); +} + +function count_deck(faction: FactionId | FascistId) { + let n = 0; + if (faction === FASCIST_ID) { + for (let card of fascist_decks[game.year]) + if (!is_fascist_card_used(card)) + ++n; + } else { + for (let card of faction_cards[faction]) + if (!is_player_card_used(faction, card)) + ++n; + } + return n; +} + +function list_deck(faction: FactionId | FascistId) { + const deck = [] + if (faction === FASCIST_ID) { + for (let card of fascist_decks[game.year]) + if (!is_fascist_card_used(card)) + deck.push(card); + } else { + for (let card of faction_cards[faction]) + if (!is_player_card_used(faction, card)) + deck.push(card); + } return deck; } |