summaryrefslogtreecommitdiff
path: root/rules.ts
diff options
context:
space:
mode:
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;
}