diff options
Diffstat (limited to 'rules.js')
-rw-r--r-- | rules.js | 105 |
1 files changed, 104 insertions, 1 deletions
@@ -106,6 +106,7 @@ exports.view = function (state, role) { control: game.control, rebel: game.rebel, order: game.order, + who: {}, } if (game.result) { @@ -149,6 +150,11 @@ exports.view = function (state, role) { else view.actions.undo = 0 } + + // if (game.decree && game.decree.campaign) { + // view.actions.campaign_spaces = game.decree.campaign + // console.log("SPACES ", view.actions.campaign_spaces) + // } } save_game() @@ -611,6 +617,7 @@ states.main_phase = { } }, build: goto_build, + campaign: goto_campaign, collect: goto_collect, compel: goto_compel, conscript: goto_conscript, @@ -1168,7 +1175,7 @@ function init_decree(type) { function gen_any_decree() { if (game.current === DS) { view.actions.collect = can_collect() ? 1 : 0 - // view.actions.campaign = can_campaign() ? 1 : 0 + view.actions.campaign = can_campaign() ? 1 : 0 view.actions.demand = can_demand() ? 1 : 0 } else if (game.current === BK) { view.actions.trade = can_trade() ? 1 : 0 @@ -1237,6 +1244,102 @@ states.collect = { end_collect: end_decree, } +function can_campaign() { + if (count_pieces_on_map(DS, ELITE) > 0 || count_pieces_on_map(DS, TROOPS) > 0) + return true + return false +} + +function can_start_campaign_in_space(s) { + if (has_piece(s, DS, TROOPS) || has_piece(s, DS, ELITE)) + return true + return false +} + +function goto_campaign() { + init_decree("Campaign") + game.decree = { + campaign: [], + pieces: [], + selected: [] + } + game.state = "campaign" +} + +states.campaign = { + prompt() { + view.prompt = "Campaign: Select four contiguous spaces, from start to finish." + view.actions.campaign_spaces = [...game.decree.campaign].sort((a, b) => a - b) + + if (game.decree.campaign.length === 0) { + for (let s = first_space; s <= last_space; ++s) { + if (can_start_campaign_in_space(s)) + gen_action_space(s) + } + } else if (game.decree.campaign.length < 4) { + for (let s of SPACES[game.decree.campaign.at(-1)].adjacent) { + if (!game.decree.campaign.includes(s)) + gen_action_space(s) + } + } + + }, + space(s) { + game.decree.campaign.push(s) + if (game.decree.campaign.length === 4) + game.state = "campaign_moves" + } +} + +states.campaign_moves = { + prompt() { + view.prompt = "Campaign: Move units along the campaign trail." + view.actions.campaign_spaces = [...game.decree.campaign].sort((a, b) => a - b) + view.who = game.decree.selected + + for_each_movable(DS, p => { + if ( + [...game.decree.campaign.slice(0, -1)].includes(piece_space(p)) && + !set_has(game.decree.pieces, p) + ) + gen_action_piece(p) + }) + + if (game.decree.selected.length > 0) { + let min_indx = Math.max(...game.decree.selected.map(p => { + return game.decree.campaign.indexOf(piece_space(p)) + })) + for (let s of game.decree.campaign.slice(min_indx + 1)) { + gen_action_space(s) + } + } + + if (game.decree.pieces.length > 0) { + view.actions.end_campaign = 1 + } + }, + piece(p) { + if (!set_has(game.decree.selected, p)) + set_add(game.decree.selected, p) + else + set_delete(game.decree.selected, p) + + }, + space(s) { + log_space(s, "Campaign") + push_summary() + + for (let p of game.decree.selected) { + log_summary_place(p) + place_piece(p, s) + set_add(game.decree.pieces, p) + } + set_clear(game.decree.selected) + pop_summary() + }, + end_campaign: end_decree +} + /* REBELS DECREES */ function can_build() { |