summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rules.js90
1 files changed, 59 insertions, 31 deletions
diff --git a/rules.js b/rules.js
index 937e924..601b431 100644
--- a/rules.js
+++ b/rules.js
@@ -28,7 +28,9 @@ const Kabul_Kandahar = 307;
const Kabul_Punjab = 308;
const Kandahar_Punjab = 309;
-const Gift = 400;
+const Gift2 = 400;
+const Gift4 = 401;
+const Gift6 = 402;
const Safe_House = 500;
const first_region = 201;
@@ -324,17 +326,33 @@ function active_cylinders() {
return 36 + game.active * 10;
}
-function active_gifts() {
+function min_gift_cost() {
let x = active_cylinders();
- let n = 0;
- for (let i = x; i < x + 10; ++i)
- if (game.pieces[i] === Gift)
- ++n;
- return n;
+ let avail_2 = true, avail_4 = true, avail_6 = true;
+ for (let i = x; i < x + 10; ++i) {
+ let s = game.pieces[i];
+ if (s === Gift2) avail_2 = false;
+ else if (s === Gift4) avail_4 = false;
+ else if (s === Gift6) avail_6 = false;
+ }
+ if (avail_2) return 2;
+ if (avail_4) return 4;
+ if (avail_6) return 6;
+ return 1000;
}
-function gift_cost() {
- return 2 * active_gifts() + 2;
+function gen_place_gift() {
+ let x = active_cylinders();
+ let avail_2 = true, avail_4 = true, avail_6 = true;
+ for (let i = x; i < x + 10; ++i) {
+ let s = game.pieces[i];
+ if (s === Gift2) avail_2 = false;
+ else if (s === Gift4) avail_4 = false;
+ else if (s === Gift6) avail_6 = false;
+ }
+ if (avail_2 && player.coins >= 2) gen_action('place_gift', 2);
+ if (avail_4 && player.coins >= 4) gen_action('place_gift', 4);
+ if (avail_6 && player.coins >= 6) gen_action('place_gift', 6);
}
function ruler_of_region(r) {
@@ -636,9 +654,11 @@ function change_loyalty(new_loyalty) {
}
let x = active_cylinders();
- for (let i = x; i < x + 10; ++i)
- if (game.pieces[i] === Gift)
+ for (let i = x; i < x + 10; ++i) {
+ let s = game.pieces[i];
+ if (s === Gift2 || s === Gift4 || s === Gift6)
game.pieces[i] = 0;
+ }
player.prizes = 0;
}
@@ -963,7 +983,7 @@ states.actions = {
gen_action('tax', c);
usable = true;
}
- if (card.gift && active_gifts() < 3 && player.coins >= gift_cost()) {
+ if (card.gift && player.coins >= min_gift_cost()) {
gen_action('gift', c);
usable = true;
}
@@ -1057,7 +1077,7 @@ states.actions = {
// Use card based ability
tax(c) { do_card_action_1(c, "Tax", 0); },
- gift(c) { do_card_action_1(c, "Gift", gift_cost()); },
+ gift(c) { do_card_action_1(c, "Gift", min_gift_cost()); },
build(c) { do_card_action_1(c, "Build", 2); },
move(c) { do_card_action_1(c, "Move", 0); },
betray(c) { do_card_action_1(c, "Betray", 2); },
@@ -1325,14 +1345,8 @@ const card_action_table = {
},
Gift() {
- let cost = gift_cost();
- logi(`Paid ${cost}.`);
- pay_action_cost(cost, 0);
game.selected = select_available_cylinder();
- if (game.selected < 0)
- game.state = 'gift';
- else
- do_gift();
+ game.state = 'gift';
},
Build() {
@@ -1484,20 +1498,32 @@ states.tax = {
states.gift = {
prompt() {
- view.prompt = `Select cylinder to use as Gift.`;
- gen_select_cylinder();
+ if (game.selected < 0) {
+ view.prompt = `Select cylinder to place as Gift.`;
+ gen_select_cylinder();
+ } else {
+ view.prompt = `Place cylinder as Gift.`;
+ gen_place_gift();
+ }
},
piece(x) {
push_undo();
game.selected = x;
- do_gift();
},
-}
-
-function do_gift() {
- game.pieces[game.selected] = Gift;
- game.used_pieces.push(game.selected);
- end_action();
+ place_gift(cost) {
+ push_undo();
+ logi(`Paid ${cost}.`);
+ pay_action_cost(cost, 0);
+ if (cost === 2)
+ game.pieces[game.selected] = Gift2;
+ else if (cost === 4)
+ game.pieces[game.selected] = Gift4;
+ else if (cost === 6)
+ game.pieces[game.selected] = Gift6;
+ game.used_pieces.push(game.selected);
+ game.selected = -1;
+ end_action();
+ }
}
// CARD-BASED ACTION: BUILD
@@ -2707,9 +2733,11 @@ function count_influence_points(p) {
if (!game.events.embarrassment_of_riches) {
let gv = game.players[p].events.koh_i_noor ? 2 : 1;
- for (let i = x; i < x + 10; ++i)
- if (game.pieces[i] === Gift)
+ for (let i = x; i < x + 10; ++i) {
+ let s = game.pieces[i];
+ if (s === Gift2 || s === Gift4 || s === Gift6)
n += gv;
+ }
}
if (!game.players[p].events.rumor) {