diff options
author | Joël Simoneau <simoneaujoel@gmail.com> | 2024-12-15 09:51:38 -0500 |
---|---|---|
committer | Joël Simoneau <simoneaujoel@gmail.com> | 2024-12-15 09:51:38 -0500 |
commit | 6ef81f4de16c24e220a7cbc5e330290d354b6d01 (patch) | |
tree | b4d165ebacf26e5021082d032ed0e197954d879a | |
parent | f9a6766dddea70c9ee4b395406511af65b05df9f (diff) | |
download | vijayanagara-6ef81f4de16c24e220a7cbc5e330290d354b6d01.tar.gz |
Campaign
-rw-r--r-- | play.css | 1 | ||||
-rw-r--r-- | play.js | 5 | ||||
-rw-r--r-- | rules.js | 105 |
3 files changed, 109 insertions, 2 deletions
@@ -115,6 +115,7 @@ path.action { fill: yellowgreen; fill-opacity: 0.3; stroke: lightgreen; } path.mongol.action { fill: gold; fill-opacity: 0.3; stroke: gold; } path.selected { stroke: yellow; } path.tip { stroke: white; stroke-dasharray: 4 4; } +path.campaign { stroke: black; stroke-dasharray: 4 4; } .space { position: absolute; @@ -951,6 +951,7 @@ function on_update() { if (s <= S_MONGOL_INVADERS) { ui.spaces[s].classList.toggle("action", is_action("space", s)) ui.spaces[s].classList.toggle("selected", view.where === s) + ui.spaces[s].classList.toggle("campaign", is_action("campaign_spaces", s) && !is_action("space", s)) } // Control @@ -1018,7 +1019,7 @@ function on_update() { for (let i = 0; i < ui.pieces.length; ++i) ui.pieces[i].classList.remove("action") for (let i = 0; i < ui.pieces.length; ++i) - ui.pieces[i].classList.toggle("selected", view.who === i) + ui.pieces[i].classList.toggle("selected", set_has(view.who, i)) // Influence layout_influence() @@ -1030,6 +1031,8 @@ function on_update() { action_button("pass", "Pass") // DS buttons + action_button("campaign", "Campaign") + action_button("end_campaign", "End Campaign") action_button("conscript", "Conscript") action_button("end_conscript", "End Conscript") action_button("govern", "Govern") @@ -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() { |