summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2022-12-15 12:30:28 +0100
committerTor Andersson <tor@ccxvii.net>2023-02-18 13:02:38 +0100
commit65dff0c518948bf6d552b92f01901320d40ba448 (patch)
tree6151231b1ca3edd4d72ee5f2ee61d46ba049fa67
parentadd062d5c9bc31f2134912d93a24058f8829a22c (diff)
downloadnevsky-65dff0c518948bf6d552b92f01901320d40ba448.tar.gz
March in "action" state to prevent lots of extra clicks.
-rw-r--r--play.js9
-rw-r--r--rules.js225
2 files changed, 126 insertions, 108 deletions
diff --git a/play.js b/play.js
index 045148e..d37e5bd 100644
--- a/play.js
+++ b/play.js
@@ -23,7 +23,10 @@ const VASSAL_MUSTERED = 2
const NOWHERE = -1
const CALENDAR = 100
+
const LEGATE = 100
+const LEGATE_INDISPOSED = -2
+const LEGATE_ARRIVED = -1
const round = Math.round
const floor = Math.floor
@@ -965,13 +968,13 @@ function update_lord(ix) {
}
function update_legate() {
- if (view.call_to_arms.legate < 0) {
+ if (view.call_to_arms.legate === LEGATE_INDISPOSED) {
ui.legate.classList.add("hide")
} else {
ui.legate.classList.remove("hide")
ui.legate.classList.toggle("action", is_legate_action())
ui.legate.classList.toggle("selected", is_legate_selected())
- if (view.call_to_arms.legate === 100) {
+ if (view.call_to_arms.legate === LEGATE_ARRIVED) {
ui.legate.style.top = "1580px"
ui.legate.style.left = "170px"
} else {
@@ -1230,6 +1233,8 @@ function on_update() {
action_button("laden", "Laden")
action_button("unladen", "Unladen")
+ action_button("use_legate", "Legate")
+
action_button("sail", "Sail")
action_button("march", "March")
action_button("siege", "Siege")
diff --git a/rules.js b/rules.js
index 8cfbf75..21a79b3 100644
--- a/rules.js
+++ b/rules.js
@@ -151,6 +151,8 @@ const LORD_KARELIANS = find_lord("Karelians")
const LORD_VLADISLAV = find_lord("Vladislav")
const LEGATE = 100
+const LEGATE_INDISPOSED = -2
+const LEGATE_ARRIVED = -1
const LOC_REVAL = find_locale("Reval")
const LOC_WESENBERG = find_locale("Wesenberg")
@@ -979,6 +981,8 @@ function is_located_with_legate(lord) {
return get_lord_locale(lord) === game.call_to_arms.legate
}
+// TODO: include active lord in group and select legate by other means to simplify group_ functions?
+
function for_each_group_lord(fn) {
fn(game.who)
if (game.group)
@@ -1142,7 +1146,7 @@ exports.setup = function (seed, scenario, options) {
},
call_to_arms: {
- legate: NOWHERE,
+ legate: LEGATE_INDISPOSED,
veche_vp: 0,
veche_coin: 0,
},
@@ -2135,6 +2139,13 @@ function goto_actions() {
game.who = game.command
game.count = 0
+ // 4.1.3 Lieutenants MUST take lower lord
+ let lower = get_lower_lord(game.who)
+ if (lower !== NOBODY)
+ game.group = [ lower ]
+ else
+ game.group = []
+
if (game.active === TEUTONS) {
if (has_global_capability(AOW_TEUTONIC_ORDENSBURGEN)) {
if (is_commandery(get_lord_locale(game.who)))
@@ -2206,44 +2217,46 @@ states.actions = {
view.prompt = `${lord_name[game.who]} has ${avail}x actions.`
- if (game.active === TEUTONS) {
- if (game.count === 0 && is_located_with_legate())
- view.actions.legate = 1
+ if (avail > 0)
+ view.actions.pass = 1
+ else
+ view.actions.end_actions = 1
+
+ if (is_lord_besieged(game.who)) {
+ view.actions.sally = 1
}
- if (avail > 0) {
- if (is_lord_besieged(game.who)) {
- if (can_action_sally())
- view.actions.sally = 1
- view.actions.pass = 1
- } else {
- if (can_action_march())
- view.actions.march = 1
- if (can_action_siege())
- view.actions.siege = 1
- if (can_action_storm())
- view.actions.storm = 1
- if (can_action_supply())
- view.actions.supply = 1
- if (can_action_forage())
- view.actions.forage = 1
- if (can_action_ravage())
- view.actions.ravage = 1
- if (can_action_tax())
- view.actions.tax = 1
- if (can_action_sail())
- view.actions.sail = 1
- view.actions.pass = 1
+ else {
+ if (game.active === TEUTONS) {
+ if (game.count === 0 && is_located_with_legate() && !has_flag(FLAG_LEGATE))
+ view.actions.use_legate = 1
}
- } else {
- view.actions.end_actions = 1
+
+ march_prompt(avail)
+
+ if (can_action_siege(avail))
+ view.actions.siege = 1
+ if (can_action_storm(avail))
+ view.actions.storm = 1
+ if (can_action_supply(avail))
+ view.actions.supply = 1
+ if (can_action_forage(avail))
+ view.actions.forage = 1
+ if (can_action_ravage(avail))
+ view.actions.ravage = 1
+ if (can_action_tax(avail))
+ view.actions.tax = 1
+ if (can_action_sail(avail))
+ view.actions.sail = 1
}
},
- march: do_action_march,
- forage: do_action_forage,
- ravage: do_action_ravage,
- sail: do_action_sail,
- tax: do_action_tax,
+
+ use_legate() {
+ push_undo()
+ log(`Used Legate for +1 Command.`)
+ set_flag(FLAG_LEGATE)
+ game.call_to_arms.legate = LEGATE_ARRIVED
+ },
pass() {
push_undo()
log("Passed.")
@@ -2253,6 +2266,15 @@ states.actions = {
clear_undo()
end_actions()
},
+
+ forage: do_action_forage,
+ ravage: do_action_ravage,
+ sail: do_action_sail,
+ tax: do_action_tax,
+
+ locale: march_action_locale,
+ lord: march_action_lord,
+ legate: march_action_legate,
}
// === ACTION: MARCH ===
@@ -2267,35 +2289,15 @@ function group_has_teutonic_converts() {
return false
}
-function can_action_march() {
- return true
-}
-
-function do_action_march() {
- push_undo()
- game.state = 'march'
-
- // Initialize group on first March!
- if (!game.group) {
- // 4.1.3 Lieutenants MUST take lower lord
- let lower = get_lower_lord(game.who)
- if (lower !== NOBODY)
- game.group = [ lower ]
- else
- game.group = []
- }
-}
-
-states.march = {
- prompt() {
- view.prompt = `March: Select destination.`
- view.group = game.group
-
+function march_prompt(avail) {
+ if (avail > 0 || group_has_teutonic_converts()) {
let here = get_lord_locale(game.who)
- for (let [to] of data.locales[here].ways)
+ for (let [ to ] of data.locales[here].ways)
gen_action_locale(to)
+ view.group = game.group
+
// 4.3.2 Marshals MAY take other lords
if (is_marshal(game.who)) {
for (let lord = first_friendly_lord; lord <= last_friendly_lord; ++lord)
@@ -2308,28 +2310,31 @@ states.march = {
if (game.active === TEUTONS && is_located_with_legate(game.who)) {
view.actions.legate = 1
}
- },
- locale(to) {
- push_undo()
- let from = get_lord_locale(game.who)
- let ways = list_ways(from, to)
- if (ways.length > 2) {
- game.where = to
- game.state = 'march_way'
- } else {
- game.where = to
- game.approach = ways[1]
- march_with_group()
- }
- },
- lord(lord) {
- set_toggle(game.group, lord)
- if (is_upper_lord(lord))
- set_toggle(game.group, get_lower_lord(lord))
- },
- legate() {
- set_toggle(game.group, LEGATE)
- },
+ }
+}
+
+function march_action_locale(to) {
+ push_undo()
+ let from = get_lord_locale(game.who)
+ let ways = list_ways(from, to)
+ if (ways.length > 2) {
+ game.where = to
+ game.state = "march_way"
+ } else {
+ game.where = to
+ game.approach = ways[1]
+ march_with_group()
+ }
+}
+
+function march_action_lord(lord) {
+ set_toggle(game.group, lord)
+ if (is_upper_lord(lord))
+ set_toggle(game.group, get_lower_lord(lord))
+}
+
+function march_action_legate() {
+ set_toggle(game.group, LEGATE)
}
states.march_way = {
@@ -2463,45 +2468,50 @@ function march_with_group_2(laden) {
// === ACTION: SIEGE ===
-function can_action_siege() {
+function can_action_siege(avail) {
+ if (game.count > 0)
+ return false
return false
}
// === ACTION: STORM ===
-function can_action_storm() {
+function can_action_storm(avail) {
+ if (avail < 1)
+ return false
return false
}
// === ACTION: SALLY ===
-function can_action_sally() {
- return is_lord_besieged(game.who)
-}
-
// === ACTION: SUPPLY ===
-function can_action_supply() {
+function can_action_supply(avail) {
+ if (avail < 1)
+ return false
+
return false
}
// === ACTION: FORAGE ===
-function can_action_forage() {
- let where = get_lord_locale(game.who)
- if (has_ravaged_marker(where))
+function can_action_forage(avail) {
+ if (avail < 1)
+ return false
+ let here = get_lord_locale(game.who)
+ if (has_ravaged_marker(here))
return false
if (current_season() === SUMMER)
return true
- if (is_friendly_stronghold(where))
+ if (is_friendly_stronghold(here))
return true
return false
}
function do_action_forage() {
push_undo()
- let where = get_lord_locale(game.who)
- log(`Foraged at %${where}`)
+ let here = get_lord_locale(game.who)
+ log(`Foraged at %${here}`)
add_lord_assets(game.who, PROV, 1)
game.count += 1
}
@@ -2536,10 +2546,12 @@ function can_ravage_locale(loc) {
)
}
-function can_action_ravage() {
- let here = get_lord_locale(game.who)
-
+function can_action_ravage(avail) {
// TODO: cost 2 if enemy lord is adjacent (2nd ed)
+ if (avail < 1)
+ return false
+
+ let here = get_lord_locale(game.who)
if (can_ravage_locale(here))
return true
@@ -2572,6 +2584,7 @@ function do_action_ravage() {
states.ravage = {
prompt() {
view.prompt = `Ravage: Choose enemy territory to ravage!`
+
let here = get_lord_locale(game.who)
if (can_ravage_locale(here))
@@ -2616,7 +2629,7 @@ function ravage_location(here, there) {
// === ACTION: TAX ===
-function can_action_tax() {
+function can_action_tax(avail) {
// Must use whole action
if (game.count > 0)
return false
@@ -2632,15 +2645,15 @@ function can_action_tax() {
function do_action_tax() {
push_undo()
- let here = get_lord_locale(lord)
+ let here = get_lord_locale(game.who)
log(`Taxed %${here}.`)
- add_lord_assets(lord, COIN, 1)
+ add_lord_assets(game.who, COIN, 1)
use_all_actions()
game.state = "actions"
- if (lord_has_capability(lord, AOW_RUSSIAN_VELIKY_KNYAZ)) {
+ if (lord_has_capability(game.who, AOW_RUSSIAN_VELIKY_KNYAZ)) {
push_state("veliky_knyaz")
// TODO: restore mustered forces
game.count = 2
@@ -2680,9 +2693,9 @@ function count_lord_ships(lord) {
}
function count_lord_boats(lord) {
- let boats = get_lord_boats(lord, BOAT)
+ let boats = get_lord_assets(lord, BOAT)
- if (lord_has_capability(AOW_RUSSIAN_LODYA)) {
+ if (lord_has_capability(lord, AOW_RUSSIAN_LODYA)) {
// TODO: one option or the other (only matters for supply)
let ships = get_lord_assets(lord, SHIP)
if (ships > 2)
@@ -2728,14 +2741,14 @@ function has_enough_available_ships_for_horses() {
return ships >= horses
}
-function can_action_sail() {
+function can_action_sail(avail) {
// Must use whole action
if (game.count > 0)
return false
// at a seaport
- let where = get_lord_locale(game.who)
- if (!is_seaport(where))
+ let here = get_lord_locale(game.who)
+ if (!is_seaport(here))
return false
// during Rasputitsa or Summer