summaryrefslogtreecommitdiff
path: root/rules.ts
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2025-04-08 00:58:53 +0200
committerTor Andersson <tor@ccxvii.net>2025-04-08 01:38:17 +0200
commit8ef50da1a723ad59c008c5adbb41ee43de9c359b (patch)
treef3c19b6831d6dde611fdc72a0666570444f4f4e3 /rules.ts
parent90f22b8d4b5dd891dc26ce1a90750687260275c2 (diff)
downloadland-and-freedom-8ef50da1a723ad59c008c5adbb41ee43de9c359b.tar.gz
optimize card drawing and add checks if cards can be drawn
Diffstat (limited to 'rules.ts')
-rw-r--r--rules.ts99
1 files changed, 64 insertions, 35 deletions
diff --git a/rules.ts b/rules.ts
index b058d49..3a320c5 100644
--- a/rules.ts
+++ b/rules.ts
@@ -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;
}