diff options
author | Tor Andersson <tor@ccxvii.net> | 2025-04-08 00:58:53 +0200 |
---|---|---|
committer | Tor Andersson <tor@ccxvii.net> | 2025-04-08 01:38:17 +0200 |
commit | 8ef50da1a723ad59c008c5adbb41ee43de9c359b (patch) | |
tree | f3c19b6831d6dde611fdc72a0666570444f4f4e3 /rules.js | |
parent | 90f22b8d4b5dd891dc26ce1a90750687260275c2 (diff) | |
download | land-and-freedom-8ef50da1a723ad59c008c5adbb41ee43de9c359b.tar.gz |
optimize card drawing and add checks if cards can be drawn
Diffstat (limited to 'rules.js')
-rw-r--r-- | rules.js | 87 |
1 files changed, 55 insertions, 32 deletions
@@ -479,25 +479,28 @@ function setup(seed, _scenario, options) { start_year(); return game; } +function can_draw_any_hand_cards(faction_id) { + return (game.discard[faction_id].length > 0 || count_deck(faction_id) > 0); +} function draw_hand_cards(faction_id, count, indent = true) { - const deck = list_deck(faction_id); + let deck = list_deck(faction_id); if (game.medallions[faction_id].includes(data_1.INTELLIGENCE_MEDALLION_ID)) { log(">M" + data_1.INTELLIGENCE_MEDALLION_ID); count++; } let drawn_cards = 0; - 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++; + 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) logi(`${get_player(faction_id)} +${drawn_cards} cards`); @@ -1865,7 +1868,10 @@ states.spend_hero_points = { if (hero_points === 0) { 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(data_1.ARCHIVES_MEDALLION_ID, faction)) { gen_action('archives'); if (game.triggered_track_effects.length === 0) { @@ -3100,26 +3106,43 @@ function make_list(first, last) { list.push(i); return list; } -function list_deck(id) { +function is_fascist_card_used(card) { + return (game.current_events.includes(card) || + game.discard[data_1.FASCIST_ID].includes(card) || + (game.fascist_cards && game.fascist_cards.includes(card))); +} +function is_player_card_used(faction, card) { + 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) { + let n = 0; + if (faction === data_1.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) { const deck = []; - const card_list = id === data_1.FASCIST_ID ? fascist_decks[game.year] : faction_cards[id]; - card_list.forEach((card) => { - if (id === data_1.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); - }); + if (faction === data_1.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; } function draw_medallions() { |