summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--play.js7
-rw-r--r--rules.js94
2 files changed, 88 insertions, 13 deletions
diff --git a/play.js b/play.js
index 0c06c1a..fa9bd19 100644
--- a/play.js
+++ b/play.js
@@ -638,12 +638,14 @@ function update_map() {
elt.className = "minefield"
ui.minefields_holder.appendChild(elt)
}
- for (let i = view.minefields.length; i < ui.minefields.length; ++i)
- ui.minefields[i].remove()
for (let i = 0; i < view.minefields.length; ++i) {
let hex = view.minefields[i]
ui.minefields[i].style.left = (ui.hex_x[hex] - 40) + "px"
ui.minefields[i].style.top = (ui.hex_y[hex] + 4) + "px"
+ ui.minefields_holder.appendChild(ui.minefields[i])
+ }
+ for (let i = view.minefields.length; i < ui.minefields.length; ++i) {
+ ui.minefields[i].remove()
}
} else {
for (let i = 0; i < ui.minefields.length; ++i)
@@ -859,6 +861,7 @@ function on_update() {
action_button("replacement", "Replacement")
action_button("refit", "Refit")
action_button("minefield", "Minefield")
+ action_button("dismantle", "Dismantle")
action_button("extra_supply_card", "Card")
action_button("group", "Group")
diff --git a/rules.js b/rules.js
index 3d7b7c1..4feba56 100644
--- a/rules.js
+++ b/rules.js
@@ -1,17 +1,14 @@
"use strict"
-// TODO: MINEFIELDS
-// TODO: create minefields
-// TODO: tear down 2 minefields to create new minefield
-// TODO: track minefields to be revealed when moved through
-// TODO: reveal minefields at end of movement
-
// TODO: legal pass withdrawal moves (reduce supply net, withdraw from fortress attack)
// TODO: fortress combat in pass turns (must withdraw)
// TODO: log summaries (deploy, rebuild, move, etc)
// TODO: put initial deployment stack somewhere more accessible (spread out along the top?)
+// UI: separate colors for secret and visible minefields
+// UI: basic turn - skip move - direct to combat
+
// TODO: undo push/clear
// ERRATA: forbid single-group regroup moves or convert to group moves after the fact,
@@ -1768,7 +1765,7 @@ function find_valid_regroup_destinations(from, rommel) {
// === MINEFIELDS ===
function visit_hex(x) {
- let mf_enemy = (game.active === AXIS) ? MF_AXIS : MF_ALLIED
+ let mf_enemy = (game.active === AXIS) ? MF_ALLIED : MF_AXIS
if (set_has(game.minefields[mf_enemy], x))
set_add(game.minefields[MF_REVEAL], x)
console.log("VISIT", x, hex_name[x])
@@ -3852,7 +3849,7 @@ function is_fortress_defensive_fire() {
function is_minefield_offensive_fire() {
if ((game.state === 'battle_fire' && is_active_player()) || (game.state === 'probe_fire' && is_passive_player())) {
- if (set_has(game.minefields)) {
+ if (set_has(game.minefields[MF_VISIBLE])) {
// DD advantage is lost if the defender initiated combat
if (is_axis_player())
return set_has(game.allied_hexes, game.battle)
@@ -5010,10 +5007,85 @@ function end_buildup_spending() {
}
}
+function friendly_minefields() {
+ return is_axis_player() ? game.minefields[MF_AXIS] : game.minefields[MF_ALLIED]
+}
+
+function friendly_buildup_network() {
+ return is_axis_player() ? game.buildup.axis_network : game.buildup.allied_network
+}
+
states.minefield = {
prompt() {
- view.prompt = `Buildup: Build a minefield. (TODO!)`
- // Tear down two existing, or pay 15
+ view.prompt = `Buildup: Build a minefield.`
+ let mfs = friendly_minefields()
+ let net = friendly_buildup_network()
+ if (mfs.length >= 2)
+ gen_action('dismantle')
+ for (let x of all_hexes)
+ if (net[x] && !is_battle_hex(x) && !set_has(mfs, x))
+ gen_action_hex(x)
+ },
+ dismantle() {
+ push_undo()
+ game.state = 'dismantle1'
+ },
+ hex(x) {
+ let mfs = friendly_minefields()
+ log(`Built minefield.`)
+ pay_bps(15)
+ set_add(mfs, x)
+ game.state = 'spending_bps'
+ }
+}
+
+states.dismantle1 = {
+ prompt() {
+ view.prompt = `Buildup: Dismantle first minefield to build a new one.`
+ let mfs = friendly_minefields()
+ let net = friendly_buildup_network()
+ for (let x of mfs)
+ if (net[x])
+ gen_action_hex(x)
+ },
+ hex(x) {
+ let mfs = friendly_minefields()
+ set_delete(mfs, x)
+ game.state = 'dismantle2'
+ },
+}
+
+states.dismantle2 = {
+ prompt() {
+ view.prompt = `Buildup: Dismantle second minefield to build a new one.`
+ let mfs = friendly_minefields()
+ let net = friendly_buildup_network()
+ for (let x of mfs)
+ if (net[x])
+ gen_action_hex(x)
+ },
+ hex(x) {
+ let mfs = friendly_minefields()
+ set_delete(mfs, x)
+ game.state = 'dismantle3'
+ },
+}
+
+states.dismantle3 = {
+ prompt() {
+ view.prompt = `Buildup: Build a new minefield.`
+ let mfs = friendly_minefields()
+ let net = friendly_buildup_network()
+ for (let x of all_hexes)
+ if (net[x] && !is_battle_hex(x) && !set_has(mfs, x))
+ gen_action_hex(x)
+ },
+ hex(x) {
+ let mfs = friendly_minefields()
+ log(`Dismantled minefields.`)
+ log(`Built minefield.`)
+ set_add(mfs, x)
+ game.state = 'spending_bps'
},
}
@@ -5319,7 +5391,7 @@ function begin_game() {
if (game.scenario === "Crusader") {
game.phasing = ALLIED
- set_add(game.minefields, TOBRUK)
+ set_add(game.minefields[MF_VISIBLE], TOBRUK)
}
if (game.scenario === "Gazala") {