summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2021-05-02 14:58:44 +0200
committerTor Andersson <tor@ccxvii.net>2023-02-18 12:42:59 +0100
commit3521555fd67319d9230a3f4eccc122b9f39bb23a (patch)
treef38918556289f0254a74f8a6cce9575586803f1d
parenta142db65d810ff668ba5b1a48a59c4b2db31499c (diff)
download300-earth-and-water-3521555fd67319d9230a3f4eccc122b9f39bb23a.tar.gz
300: greek land battle events
-rw-r--r--rules.js91
1 files changed, 89 insertions, 2 deletions
diff --git a/rules.js b/rules.js
index ce4c514..ed9af8e 100644
--- a/rules.js
+++ b/rules.js
@@ -26,11 +26,13 @@ const PELLA = "Pella";
// Greek event numbers
const MINES_OF_LAURION = 1;
const MILTIADES = 4;
+const PAUSANIAS = 6;
const LEONIDAS = 8;
const EVANGELION = 10;
const MOLON_LABE = 12;
const TRIREMES = 13;
const TRIREMES_TWO = 113;
+const THREE_HUNDRED_SPARTANS = 15;
// Persian event numbers
const CAVALRY_OF_MARDONIUS = 1;
@@ -1471,6 +1473,28 @@ states.persian_land_battle_react = {
view.prompt = "Persian Land Battle: Persia attacks " + game.where + " with " +
count_persian_armies(game.where) + " armies!";
gen_action(view, 'next');
+
+ if (game.greek.hand.includes(MILTIADES) && can_play_miltiades_defense())
+ gen_action(view, 'card_event', MILTIADES);
+ if (!game.trigger.carneia_festival) {
+ if (game.event == CAVALRY_OF_MARDONIUS && game.greek.hand.includes(PAUSANIAS))
+ gen_action(view, 'card_event', PAUSANIAS);
+ if (game.event != MILTIADES && game.greek.hand.includes(THREE_HUNDRED_SPARTANS))
+ gen_action(view, 'card_event', THREE_HUNDRED_SPARTANS);
+ }
+ },
+ card_event: function (card) {
+ switch (card) {
+ case MILTIADES:
+ play_miltiades_defense();
+ break;
+ case PAUSANIAS:
+ play_pausanias();
+ break;
+ case THREE_HUNDRED_SPARTANS:
+ play_300_spartans();
+ break;
+ }
},
next: function () {
game.active = PERSIA;
@@ -1492,15 +1516,31 @@ states.greek_land_battle_react = {
},
}
+function greek_battle_dice() {
+ if (game.event == MILTIADES)
+ return 3;
+ if (game.event == LEONIDAS)
+ return 2;
+ if (game.event == THREE_HUNDRED_SPARTANS)
+ return 3;
+ return count_greek_armies(game.where);
+}
+
function persian_land_battle_round() {
log("Persia attacks " + game.where + "!");
let p_max = (game.where == ABYDOS || game.where == EPHESOS) ? 5 : 4;
+ if (game.event == CAVALRY_OF_MARDONIUS)
+ p_max = 6;
let g_max = 6;
let p_hit = roll_battle_dice("Persia", count_persian_armies(game.where), p_max);
- let g_hit = roll_battle_dice("Greece", count_greek_armies(game.where), g_max);
+ let g_hit = roll_battle_dice("Greece", greek_battle_dice(), g_max);
if (p_hit >= g_hit) {
log("Greece loses one army.");
move_greek_army(game.where, RESERVE);
+ if (game.event == THREE_HUNDRED_SPARTANS) {
+ log("300 Spartans advantage lost.");
+ game.event = 0;
+ }
}
if (g_hit >= p_hit) {
log("Persia loses one army.");
@@ -1517,7 +1557,7 @@ function greek_land_battle_round() {
let p_max = (game.where == ABYDOS || game.where == EPHESOS) ? 5 : 4;
let g_max = 6;
let p_hit = roll_battle_dice("Persia", count_persian_armies(game.where), p_max);
- let g_hit = roll_battle_dice("Greece", count_greek_armies(game.where), g_max);
+ let g_hit = roll_battle_dice("Greece", greek_battle_dice(), g_max);
if (p_hit >= g_hit) {
log("Greece loses one army.");
move_greek_army(game.where, RESERVE);
@@ -2191,6 +2231,7 @@ function can_play_leonidas() {
}
function play_leonidas() {
+ game.event = LEONIDAS;
if (count_greek_armies(RESERVE) > 0) {
game.trigger.leonidas = 1;
remove_greek_army(RESERVE);
@@ -2364,6 +2405,52 @@ states.miltiades_attack_pay = {
undo: pop_undo,
}
+function can_play_miltiades_defense() {
+ return !game.trigger.miltiades && game.event != THREE_HUNDRED_SPARTANS;
+}
+
+function play_miltiades_defense() {
+ play_greek_event_card(MILTIADES);
+ game.event = MILTIADES;
+ if (count_greek_armies(RESERVE) > 0) {
+ remove_greek_army(RESERVE);
+ game.trigger.miltiades = 1;
+ } else {
+ game.state = 'miltiades_defense_pay';
+ }
+}
+
+states.miltiades_defense_pay = {
+ prompt: function (view, current) {
+ if (is_inactive_player(current))
+ return view.prompt = "Leonidas.";
+ view.prompt = "Miltiades: Remove one Greek army to pay for the event.";
+ for (let city of CITIES) {
+ let need = (city == game.where) ? 2 : 1;
+ if (count_greek_armies(city) >= need)
+ gen_action(view, 'city', city);
+ }
+ gen_action_undo(view);
+ },
+ city: function (space) {
+ push_undo();
+ remove_greek_army(space);
+ game.trigger.miltiades = 1;
+ game.state = 'persian_land_battle_react';
+ },
+ undo: pop_undo,
+}
+
+function play_pausanias() {
+ play_greek_event_card(PAUSANIAS);
+ game.event = 0;
+}
+
+function play_300_spartans() {
+ play_greek_event_card(THREE_HUNDRED_SPARTANS);
+ game.event = THREE_HUNDRED_SPARTANS;
+}
+
// SUPPLY PHASE
function goto_supply_phase() {