diff options
-rw-r--r-- | rules.js | 178 | ||||
-rw-r--r-- | tools/gencards.js | 2 |
2 files changed, 91 insertions, 89 deletions
@@ -351,28 +351,28 @@ const CARD_INDEX = [ ] const CARD_INFO = [ - { name: "M1", type: 0, value: 1, event: null }, - { name: "S1", type: 1, value: 1, event: null }, - { name: "P1", type: 2, value: 1, event: null }, - { name: "M2", type: 0, value: 2, event: "Castra" }, - { name: "S2", type: 1, value: 2, event: "Tribute" }, - { name: "P2", type: 2, value: 2, event: "Quaestor" }, - { name: "M2X", type: 0, value: 2, event: "Cavalry" }, - { name: "S2X", type: 1, value: 2, event: "Princeps Senatus" }, - { name: "P2X", type: 2, value: 2, event: "Ambitus" }, - { name: "M3", type: 0, value: 3, event: "Flanking Maneuver" }, - { name: "S3", type: 1, value: 3, event: "Foederati" }, - { name: "P3", type: 2, value: 3, event: "Mob" }, - { name: "M3X", type: 0, value: 3, event: "Force March" }, - { name: "S3X", type: 1, value: 3, event: "Frumentarii" }, - { name: "P3X", type: 2, value: 3, event: "Mobile Vulgus" }, - { name: "M4", type: 0, value: 4, event: "Praetorian Guard" }, - { name: "S4", type: 1, value: 4, event: "Damnatio Memoriae" }, - { name: "S4B", type: 1, value: 4, event: "Damnatio Memoriae (exp)" }, - { name: "P4", type: 2, value: 4, event: "Pretender" }, - { name: "M4X", type: 0, value: 4, event: "Spiculum" }, - { name: "S4X", type: 1, value: 4, event: "Triumph" }, - { name: "P4X", type: 2, value: 4, event: "Demagogue" }, + { name: "M1", type: 0, value: 1, event: "None" }, + { name: "S1", type: 1, value: 1, event: "None" }, + { name: "P1", type: 2, value: 1, event: "None" }, + { name: "M2 - Castra", type: 0, value: 2, event: "Castra" }, + { name: "S2 - Tribute", type: 1, value: 2, event: "Tribute" }, + { name: "P2 - Quaestor", type: 2, value: 2, event: "Quaestor" }, + { name: "M2 - Cavalry", type: 0, value: 2, event: "Cavalry" }, + { name: "S2 - Princeps Senatus", type: 1, value: 2, event: "Princeps Senatus" }, + { name: "P2 - Ambitus", type: 2, value: 2, event: "Ambitus" }, + { name: "M3 - Flanking Maneuver", type: 0, value: 3, event: "Flanking Maneuver" }, + { name: "S3 - Foederati", type: 1, value: 3, event: "Foederati" }, + { name: "P3 - Mob", type: 2, value: 3, event: "Mob" }, + { name: "M3 - Force March", type: 0, value: 3, event: "Force March" }, + { name: "S3 - Frumentarii", type: 1, value: 3, event: "Frumentarii" }, + { name: "P3 - Mobile Vulgus", type: 2, value: 3, event: "Mobile Vulgus" }, + { name: "M4 - Praetorian Guard", type: 0, value: 4, event: "Praetorian Guard" }, + { name: "S4 - Damnatio Memoriae", type: 1, value: 4, event: "Damnatio Memoriae" }, + { name: "S4 - Damnatio Memoriae", type: 1, value: 4, event: "Damnatio Memoriae (exp)" }, + { name: "P4 - Pretender", type: 2, value: 4, event: "Pretender" }, + { name: "M4 - Spiculum", type: 0, value: 4, event: "Spiculum" }, + { name: "S4 - Triumph", type: 1, value: 4, event: "Triumph" }, + { name: "P4 - Demagogue", type: 2, value: 4, event: "Demagogue" }, ] function card_name(c) { @@ -1114,6 +1114,7 @@ function has_card_event(event) { // === SETUP === states.setup_province = { + inactive: "Setup", prompt() { view.prompt = "Setup: Choose a province to place your governor and general." view.selected_governor = game.current * 6 @@ -1141,6 +1142,7 @@ states.setup_province = { } states.setup_hand = { + inactive: "Setup", prompt() { view.prompt = "Setup: Draw cards." let hand = current_hand() @@ -1248,6 +1250,7 @@ function goto_ira_deorum() { } states.ira_deorum = { + inactive: "Ira Deorum", prompt() { prompt("Ira Deorum: Activate one barbarian in each tribe's homeland.") let tribe_count = get_tribe_count() @@ -1283,6 +1286,7 @@ function resume_pax_deorum() { } states.pax_deorum = { + inactive: "Pax Deorum", prompt() { prompt("Pax Deorum: Draw one card.") for (let c of game.draw[game.current]) @@ -1297,6 +1301,7 @@ states.pax_deorum = { } states.pax_deorum_done = { + inactive: "Pax Deorum", prompt() { prompt("Pax Deorum: Done.") view.actions.done = 1 @@ -1322,6 +1327,7 @@ function goto_barbarian_crisis(tribe) { } states.barbarian_crisis = { + get inactive() { return BARBARIAN_NAME[game.crisis] }, prompt() { let tribe = game.crisis prompt(BARBARIAN_NAME[tribe] + ": Activate one barbarian.") @@ -1371,6 +1377,7 @@ function goto_barbarian_invasion(tribe, black) { } states.barbarian_invasion = { + get inactive() { return BARBARIAN_NAME[game.crisis] }, prompt() { let tribe = game.crisis prompt(BARBARIAN_NAME[tribe] + " invade!") @@ -1473,6 +1480,7 @@ function goto_crisis_barbarian_leader(id, where) { } states.crisis_barbarian_leader = { + get inactive() { return EVENT_NAME[game.active_event] }, prompt() { prompt(EVENT_NAME[game.active_event] + ": Place barbarian leader.") gen_action_region(game.where) @@ -1493,6 +1501,7 @@ function goto_crisis_rival_emperor(id, where) { } states.crisis_rival_emperor = { + get inactive() { return EVENT_NAME[game.active_event] }, prompt() { prompt(EVENT_NAME[game.active_event] + ": Place rival emperor in " + REGION_NAME[game.where] + ".") gen_action_region(game.where) @@ -1524,6 +1533,7 @@ function resume_palmyra_allies() { } states.palmyra_allies = { + inactive: "Palmyra Allies", prompt() { prompt("Palmyra Allies: Remove " + game.count + " active Sassanids.") let id, where @@ -1571,6 +1581,7 @@ function goto_ludi_saeculares() { } states.ludi_saeculares = { + inactive: "Ludi Saeculares", prompt() { prompt("Ludi Saeculares: Discard a card to gain legacy equal to twice its value.") for (let c of current_hand()) @@ -1587,6 +1598,7 @@ states.ludi_saeculares = { } states.ludi_saeculares_done = { + inactive: "Ludi Saeculares", prompt() { prompt("Ludi Saeculares: Done.") view.actions.done = 1 @@ -1614,21 +1626,25 @@ function goto_take_actions() { } states.take_actions = { + get inactive() { + let [ mip, sip, pip ] = game.ip + return `Take Actions \u2013 ${mip} military, ${sip} senate, ${pip} populace` + }, prompt() { let [ mip, sip, pip ] = game.ip + let hand = current_hand() - prompt(`Take Actions: ${mip} Military, ${sip} Senate, ${pip} Populace.`) + prompt(`Take Actions: ${mip} military, ${sip} senate, ${pip} populace.`) let where = UNAVAILABLE - // XXX - if (game.selected_governor < 0 && game.selected_general < 0 && current_hand().length > 0 && mip + sip + pip === 0) + if (game.selected_governor < 0 && game.selected_general < 0 && hand.length > 0 && mip + sip + pip === 0) view.actions.play_all = 1 view.actions.end_actions = 1 // Play cards for IP - for (let c of current_hand()) + for (let c of hand) gen_action_card(c) // Use events on played cards @@ -1720,24 +1736,14 @@ states.take_actions = { // Place Governor if (game.selected_governor >= 0 && where === AVAILABLE) { - if (sip >= 1) { - view.prompt += " Choose a province to Place Governor." + if (sip >= 1) gen_place_governor() - } - //view.actions.place_governor = 1 - //else - //view.actions.place_governor = 0 } // Create Army if (game.selected_general >= 0 && where === AVAILABLE) { - if (mip >= 1 && find_unused_legion() >= 0) { - view.prompt += " Choose a province to Create Army." + if (mip >= 1 && find_unused_legion() >= 0) gen_create_army() - } - //view.actions.create_army = 1 - //else - //view.actions.create_army = 0 } // Governor Actions @@ -1765,7 +1771,6 @@ states.take_actions = { // Hold Games if (get_mobs(where)) { - view.actions.hold_games = 0 if (pip >= 2) view.actions.hold_games = 1 } @@ -1913,18 +1918,6 @@ states.take_actions = { recall_governor() }, - place_governor() { - push_undo() - spend_senate(1) - game.count = 1 - game.state = "place_governor_where" - }, - - create_army() { - push_undo() - game.state = "create_army" - }, - support() { push_undo() improve_support() @@ -1954,7 +1947,7 @@ states.take_actions = { add_legion_to_army() { push_undo() - log("Added Legion to Army.") + log("Add Legion to Army.") let cost = count_legions_in_army(game.selected_general) + 1 spend_military(cost) set_legion_location(find_unused_legion(), ARMY + game.selected_general) @@ -2030,6 +2023,7 @@ states.take_actions = { // ACTION: BUILD IMPROVEMENT states.build_improvement = { + inactive: "Build Improvement", prompt() { prompt("Build Improvement in " + REGION_NAME[game.where] + ".") view.color = POPULACE @@ -2172,21 +2166,8 @@ function calc_needed_votes(where, pg) { return Math.max(1, n) } -states.place_governor_where = { - prompt() { - prompt("Place Governor: Choose a province.") - view.color = SENATE - view.selected_governor = game.selected_governor - gen_place_governor() - }, - region(where) { - push_undo() - game.where = where - game.state = "place_governor" - }, -} - states.place_governor = { + inactive: "Place Governor", prompt() { let sip = game.ip[SENATE] let need = calc_needed_votes(game.where, false) @@ -2196,7 +2177,7 @@ states.place_governor = { view.color = SENATE view.selected_region = game.where view.selected_governor = game.selected_governor - prompt(`Place Governor: ${sip} Senate. Rolling ${votes} dice. ${need} votes needed.`) + prompt(`Place Governor: ${sip} senate. Rolling ${votes} dice. ${need} votes needed.`) if (sip >= 1) view.actions.spend_senate = 1 else @@ -2215,6 +2196,7 @@ states.place_governor = { } states.praetorian_guard = { + inactive: "Praetorian Guard", prompt() { let mip = game.ip[MILITARY] let need = calc_needed_votes(game.where, true) @@ -2323,6 +2305,7 @@ function play_praetorian_guard() { } states.praetorian_guard_governor = { + inactive: "Praetorian Guard", prompt() { prompt("Praetorian Guard: Choose an available governor to place in Italia.") for (let i = 0; i < 6; ++i) { @@ -2340,6 +2323,7 @@ states.praetorian_guard_governor = { } states.praetorian_guard_italia = { + inactive: "Praetorian Guard", prompt() { prompt("Praetorian Guard: Place governor in Italia.") view.color = MILITARY @@ -2357,6 +2341,7 @@ states.praetorian_guard_italia = { // CARD: DAMNATIO MEMORIAE states.damnatio_memoriae = { + inactive: "Damnatio Memoriae", prompt() { prompt("Place Governor: You may play Damnatio Memoriae.") gen_card_event(CARD_S4) @@ -2387,6 +2372,7 @@ function play_damnatio_memoriae_exp() { } states.damnatio_memoriae_mobs = { + inactive: "Damnatio Memoriae", prompt() { prompt("Damnatio Memoriae: Place " + game.count + " mobs in provinces you govern.") view.color = SENATE @@ -2396,7 +2382,7 @@ states.damnatio_memoriae_mobs = { }, region(where) { push_undo() - log("Added Mob in %" + where + ".") + logi("Mob in %" + where + ".") set_mobs(where, get_mobs(where) + 1) if (--game.count === 0) game.state = "take_actions" @@ -2422,20 +2408,6 @@ function create_army(where) { set_legion_location(find_unused_legion(), ARMY + game.selected_general) } -states.create_army = { - prompt() { - prompt("Create Army: Choose a province you govern.") - view.color = MILITARY - view.selected_general = game.selected_general - gen_create_army() - }, - region(where) { - push_undo() - create_army(where) - game.state = "take_actions" - }, -} - // ACTION: MOVE ARMY function gen_move_army() { @@ -2454,6 +2426,7 @@ function gen_move_army() { } states.move_army_at_sea = { + inactive: "Move Army", prompt() { let mip = game.ip[MILITARY] prompt("Move Army: " + mip + " Military.") @@ -2521,8 +2494,9 @@ function resume_occupy_seat_of_power() { } states.occupy_seat_of_power_1 = { + inactive: "Occupation of a Pretender Provincial Capital", prompt() { - prompt("Occupy Pretender Provincial Capital: Remove seat of power marker and governor.") + prompt("Occupation of a Pretender Provincial Capital: Remove seat of power marker and governor.") view.color = POPULACE gen_action_region(game.where) }, @@ -2536,8 +2510,9 @@ states.occupy_seat_of_power_1 = { } states.occupy_seat_of_power_2 = { + inactive: "Occupation of a Pretender Provincial Capital", prompt() { - prompt("Occupy Pretender Provincial Capital: Remove breakaway markers.") + prompt("Occupation of a Pretender Provincial Capital: Remove breakaway markers.") view.color = POPULACE for (let where = 1; where < 12; ++where) if (is_breakaway(where) && (get_province_governor(where) / 6 | 0) === game.count) @@ -2552,8 +2527,9 @@ states.occupy_seat_of_power_2 = { } states.occupy_breakaway = { + inactive: "Occupation of a Pretender Provincial Capital", prompt() { - prompt("Occupy Pretender Provincial Capital: Remove breakaway marker and governor.") + prompt("Occupation of a Pretender Provincial Capital: Remove breakaway marker and governor.") view.color = POPULACE gen_action_region(game.where) }, @@ -2574,8 +2550,9 @@ function goto_replace_pretender() { } states.replace_pretender_governor = { + inactive: "Occupation of a Pretender Provincial Capital", prompt() { - prompt("Occupy Pretender Provincial Capital: You may place an available governor.") + prompt("Occupation of a Pretender Provincial Capital: You may place an available governor.") view.selected_region = game.where view.color = SENATE for (let i = 0; i < 6; ++i) { @@ -2617,6 +2594,7 @@ function play_castra() { } states.castra = { + inactive: "Castra", prompt() { prompt("Castra: Choose an army you command.") for (let where = 0; where < 12; ++where) @@ -2655,6 +2633,7 @@ function play_quaestor() { } states.quaestor = { + inactive: "Quaestor", prompt() { prompt("Quaestor: Choose a province you govern.") view.color = POPULACE @@ -2683,6 +2662,7 @@ function play_tribute() { } states.tribute = { + inactive: "Tribute", prompt() { prompt("Tribute: Flip a single tribe to their inactive side in any province.") let tribe_count = get_tribe_count() @@ -2760,6 +2740,7 @@ function play_foederati() { } states.foederati = { + inactive: "Foederati", prompt() { prompt("Foederati: Choose an army you command...") for (let i = 0; i < 6; ++i) { @@ -2785,6 +2766,7 @@ states.foederati = { } states.foederati_general = { + inactive: "Foederati", prompt() { if (count_legions_in_army(game.count) > count_barbarians_in_army(game.count)) prompt("Foederati: Recruit a barbarian.") @@ -2809,6 +2791,7 @@ states.foederati_general = { } states.foederati_militia = { + inactive: "Foederati", prompt() { prompt("Foederati: Remove a barbarian.") view.selected_militia = game.where @@ -2839,6 +2822,7 @@ function play_mob() { } states.mob = { + inactive: "Mob", prompt() { prompt("Mob: Place a mob in a province with no mobs.") view.color = POPULACE @@ -2883,6 +2867,7 @@ function play_pretender() { } states.pretender_seat_of_power = { + inactive: "Pretender", prompt() { prompt("Pretender: Place your seat of power marker.") view.color = POPULACE @@ -2912,6 +2897,7 @@ function goto_pretender_breakaway() { } states.pretender_breakaway = { + inactive: "Pretender", prompt() { prompt("Pretender: Place breakaway markers.") view.color = POPULACE @@ -3009,6 +2995,7 @@ function format_battle_target() { } states.battle = { + inactive: "Combat", prompt() { prompt("Initiate Battle against " + format_battle_target() + " in " + REGION_NAME[game.where] + ".") if (!game.battle.flanking && has_card_event(CARD_M3)) { @@ -3038,6 +3025,7 @@ function format_hits() { } states.flanking_maneuver = { + inactive: "Flanking Maneuver", prompt() { prompt("Flanking Maneuver: " + format_hits() + ".") view.actions.pass = 1 @@ -3313,6 +3301,7 @@ function goto_assign_hits_on_defender() { } states.assign_hits_on_attacker = { + inactive: "Combat", prompt() { prompt("Combat: " + format_hits() + " \u2013 assign " + (game.battle.ahits - game.battle.ataken) + " hits to attacker!") if (game.battle.attacker < 0) @@ -3341,6 +3330,7 @@ states.assign_hits_on_attacker = { } states.assign_hits_on_defender = { + inactive: "Combat", prompt() { prompt("Combat: " + format_hits() + " \u2013 assign " + (game.battle.dhits - game.battle.dtaken) + " hits to defender!") switch (game.battle.type) { @@ -3467,6 +3457,7 @@ function goto_combat_victory_attacker() { } states.advance_after_combat = { + inactive: "Combat", prompt() { prompt("Combat: You may advance into provincial capital.") gen_action_capital(game.where) @@ -3506,6 +3497,7 @@ function can_free_increase_support_level(where) { } states.free_increase_support_level = { + inactive: "Combat", prompt() { prompt("Combat: Increase support level or keep counter to reduce cost of card?") view.color = POPULACE @@ -3570,6 +3562,7 @@ function resume_support_check() { } states.support_check = { + inactive: "Support Check", prompt() { prompt("Support Check: Reduce support where active barbarians, rival emperors or opponent armies in capital.") view.color = POPULACE @@ -3596,6 +3589,7 @@ function goto_support_check_emperor() { } states.support_check_emperor = { + inactive: "Support Check", prompt() { prompt("Support Check: Reduce support in Italia for rival emperor and/or pretender on map.") view.color = POPULACE @@ -3620,6 +3614,7 @@ function goto_support_check_mobs() { } states.support_check_mobs = { + inactive: "Support Check", prompt() { prompt("Support Check: Remove governors where number of mobs exceed support.") view.color = POPULACE @@ -3647,6 +3642,7 @@ function goto_expand_pretender_empire() { } states.expand_pretender_empire = { + inactive: "Expand Pretender Empire", prompt() { prompt("Expand Pretender Empire: Add breakaway markers.") view.color = POPULACE @@ -3684,6 +3680,7 @@ function goto_legitimize_claim() { } states.legitimize_claim = { + inactive: "Gain Legacy", prompt() { prompt("Gain Legacy: Remove seat of power and breakaway markers in your provinces.") for (let where = 1; where < 12; ++where) @@ -3752,6 +3749,7 @@ function goto_buy_trash_cards() { } states.buy_trash_discard = { + inactive: "Buy/Trash Cards", prompt() { prompt("Buy/Trash Cards: You may discard any number of cards.") for (let c of current_hand()) @@ -3807,6 +3805,7 @@ function spend_senate_card_bonus() { } states.buy_trash = { + inactive: "Buy/Trash Cards", prompt() { let military_bonus = has_military_card_bonus() let senate_bonus = has_senate_card_bonus() @@ -3897,6 +3896,7 @@ function goto_grow_mobs() { } states.grow_mobs = { + inactive: "End of Turn", prompt() { prompt("End of Turn: Add a mob in each province you govern with mob and no amphitheater.") view.color = POPULACE @@ -3924,6 +3924,7 @@ function goto_flip_inactive_barbarians() { } states.flip_inactive_barbarians = { + inactive: "End of Turn", prompt() { prompt("End of Turn: Flip all inactive barbarians in your provinces to their active side.") view.color = POPULACE @@ -3959,6 +3960,7 @@ function goto_refill_hand() { } states.refill_hand = { + inactive: "End of Turn", prompt() { prompt("End of Turn: Draw cards.") let hand = current_hand() @@ -4179,7 +4181,7 @@ exports.setup = function (seed, scenario, options) { game.hand[player] = [] game.draw[player] = setup_player_deck(player) game.discard[player] = [] - //for (let i = 0; i < 9; ++i) set_add(game.draw[player], game.market[i].pop()) + //for (let i = 0; i < game.market.length; ++i) set_add(game.draw[player], game.market[i].pop()) } update_neutral_italia() @@ -4246,7 +4248,7 @@ exports.view = function (state, player_name) { view.prompt = game.victory } else if (game.current !== player) { let inactive = states[game.state].inactive || game.state - view.prompt = `Waiting for ${PLAYER_NAMES[game.current]} \u2014 ${inactive}...` + view.prompt = `Waiting for ${PLAYER_NAMES[game.current]}: ${inactive}.` } else { view.actions = {} states[game.state].prompt() diff --git a/tools/gencards.js b/tools/gencards.js index 1ca352d..de233cc 100644 --- a/tools/gencards.js +++ b/tools/gencards.js @@ -9,7 +9,7 @@ const CARD_INDEX = [] const CARD_INFO = [] function mk(n, type, value, name, event) { - CARD_INFO[xx] = { name, type, value, event } + CARD_INFO[xx] = { name: name + " - " + event, type, value, event } var a = ix var b = ix + n - 1 for (let i = 0; i < n; ++i) |