summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoël Simoneau <simoneaujoel@gmail.com>2024-12-15 09:51:38 -0500
committerJoël Simoneau <simoneaujoel@gmail.com>2024-12-15 09:51:38 -0500
commit6ef81f4de16c24e220a7cbc5e330290d354b6d01 (patch)
treeb4d165ebacf26e5021082d032ed0e197954d879a
parentf9a6766dddea70c9ee4b395406511af65b05df9f (diff)
downloadvijayanagara-6ef81f4de16c24e220a7cbc5e330290d354b6d01.tar.gz
Campaign
-rw-r--r--play.css1
-rw-r--r--play.js5
-rw-r--r--rules.js105
3 files changed, 109 insertions, 2 deletions
diff --git a/play.css b/play.css
index 7924533..7dd3022 100644
--- a/play.css
+++ b/play.css
@@ -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;
diff --git a/play.js b/play.js
index c0cec62..d263535 100644
--- a/play.js
+++ b/play.js
@@ -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")
diff --git a/rules.js b/rules.js
index 1af6dfc..9fbf357 100644
--- a/rules.js
+++ b/rules.js
@@ -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() {