summaryrefslogtreecommitdiff
path: root/rules.js
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2023-09-24 22:06:36 +0200
committerTor Andersson <tor@ccxvii.net>2023-10-01 16:11:22 +0200
commit4a4cd09b3c5a3592e5870fb7728449bcbaa56abe (patch)
tree69f92e239f24c827348463fc5c75d889b450366b /rules.js
parent192b949ff8503e1f80ccd873ebc77fbfbe60d158 (diff)
downloadwaterloo-campaign-1815-4a4cd09b3c5a3592e5870fb7728449bcbaa56abe.tar.gz
Fix detachment placement checks.
HQ cannot stack with any other (friendly or enemy) HQ. Check if Detachment has valid destination to allow selecting. Update ZOCs everywhere necessary.
Diffstat (limited to 'rules.js')
-rw-r--r--rules.js93
1 files changed, 60 insertions, 33 deletions
diff --git a/rules.js b/rules.js
index 1b8dcc1..83d71c1 100644
--- a/rules.js
+++ b/rules.js
@@ -181,6 +181,8 @@ const p1_corps = make_piece_list(p => p.side === P1 && (p.type === "inf" || p.ty
const p2_corps = make_piece_list(p => p.side !== P1 && (p.type === "inf" || p.type === "cav"))
const p1_units = make_piece_list(p => p.side === P1 && (p.type === "inf" || p.type === "cav" || p.type === "det"))
const p2_units = make_piece_list(p => p.side !== P1 && (p.type === "inf" || p.type === "cav" || p.type === "det"))
+
+const all_hqs = make_piece_list(p => (p.type === "hq"))
const all_units = make_piece_list(p => (p.type === "inf" || p.type === "cav" || p.type === "det"))
const all_corps = make_piece_list(p => (p.type === "inf" || p.type === "cav"))
@@ -570,7 +572,7 @@ states.place_hq_where = {
let x = piece_hex(p)
if (is_map_hex(x) && pieces_are_associated(p, game.who)) {
for_each_within_x3(x, next => {
- if (!is_enemy_zoc_or_zoi(next) && !hex_has_any_piece(next, friendly_hqs()))
+ if (!is_enemy_zoc_or_zoi(next) && !hex_has_any_piece(next, all_hqs))
gen_action_hex(next)
})
}
@@ -750,10 +752,16 @@ function begin_detachment_placement_step() {
game.count = 0
for (let p of friendly_hqs())
game.count |= (1 << p)
- for (let hq of friendly_hqs())
- for (let p of friendly_detachments())
+
+ update_zoc()
+ for (let hq of friendly_hqs()) {
+ for (let p of friendly_detachments()) {
+ search_detachment(p, hq)
if (can_place_detachment(p, hq))
return
+ }
+ }
+
end_detachment_placement_step()
}
@@ -767,6 +775,43 @@ function end_detachment_placement_step() {
}
}
+function can_place_detachment_at(x) {
+ // NOTE: must have run search_detachment before calling!
+ // TODO: forbidden
+ return (
+ move_seen[x-1000] &&
+ !is_friendly_zoc_or_zoi(x) &&
+ !hex_has_any_piece(x, friendly_detachments()) &&
+ !hex_has_any_piece(x, enemy_detachments())
+ )
+}
+
+function can_place_detachment_anywhere(p, hq) {
+ // NOTE: must have run search_detachment before calling!
+ for (let row = 0; row < data.map.rows; ++row)
+ for (let col = 0; col < data.map.cols; ++col)
+ if (can_place_detachment_at(1000 + row * 100 + col))
+ return true
+ return false
+}
+
+function can_place_detachment(p, hq) {
+ // NOTE: must have run search_detachment before calling!
+ let x = piece_hex(p)
+ // TODO: forbidden
+ if (x === AVAILABLE_P1 || x === AVAILABLE_P2) {
+ if (pieces_are_associated(p, hq)) {
+ if (p === GRAND_BATTERY || p === OLD_GUARD) {
+ if (hq === NAPOLEON_HQ && piece_mode(NAPOLEON_HQ))
+ return can_place_detachment_anywhere(p, hq)
+ } else {
+ return can_place_detachment_anywhere(p, hq)
+ }
+ }
+ }
+ return false
+}
+
states.place_detachment_hq = {
prompt() {
prompt("Place Detachment: Select HQ.")
@@ -787,30 +832,18 @@ states.place_detachment_hq = {
},
}
-function can_place_detachment(p, hq) {
- let x = piece_hex(p)
- // TODO: have available hex
- // TODO: forbidden
- if (x === AVAILABLE_P1 || x === AVAILABLE_P2) {
- if (pieces_are_associated(p, hq)) {
- if (p === GRAND_BATTERY || p === OLD_GUARD) {
- if (hq === NAPOLEON_HQ && piece_mode(NAPOLEON_HQ))
- return true
- } else {
- return true
- }
- }
- }
- return false
-}
-
states.place_detachment_who = {
prompt() {
prompt("Place Detachment: Select an available detachment.")
+
gen_action_piece(game.target)
- for (let p of friendly_detachments())
+
+ update_zoc()
+ for (let p of friendly_detachments()) {
+ search_detachment(p, game.target)
if (can_place_detachment(p, game.target))
gen_action_piece(p)
+ }
},
piece(p) {
if (p === game.target) {
@@ -824,6 +857,8 @@ states.place_detachment_who = {
states.place_detachment_where = {
prompt() {
+ update_zoc()
+
prompt("Place " + piece_name(game.who) + ".")
gen_action_piece(game.who)
@@ -845,19 +880,11 @@ states.place_detachment_where = {
return
}
- update_zoc()
-
search_detachment(game.who, game.target)
-
- for (let row = 0; row < data.map.rows; ++row) {
- for (let col = 0; col < data.map.cols; ++col) {
- let x = 1000 + row * 100 + col
- if (move_seen[x-1000])
- if (!is_friendly_zoc_or_zoi(x) && !hex_has_any_piece(x, friendly_detachments()))
- // TODO: forbidden
- gen_action_hex(x)
- }
- }
+ for (let row = 0; row < data.map.rows; ++row)
+ for (let col = 0; col < data.map.cols; ++col)
+ if (can_place_detachment_at(1000 + row * 100 + col))
+ gen_action_hex(1000 + row * 100 + col)
},
piece(p) {
game.who = -1