summaryrefslogtreecommitdiff
path: root/rules.js
diff options
context:
space:
mode:
Diffstat (limited to 'rules.js')
-rw-r--r--rules.js87
1 files changed, 55 insertions, 32 deletions
diff --git a/rules.js b/rules.js
index 7e186be..f1219e9 100644
--- a/rules.js
+++ b/rules.js
@@ -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() {