summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMischa Untaga <99098079+MischaU8@users.noreply.github.com>2023-10-04 11:36:41 +0200
committerMischa Untaga <99098079+MischaU8@users.noreply.github.com>2023-10-04 11:36:41 +0200
commit65ca540db89363f2a20c7b32005de400490cdaae (patch)
treecaefd72b4c545ccd48234e3f9edd221b5136a4fd
parent1bf9942cd30465f860d24a5251391a61a1bfae12 (diff)
downloadalgeria-65ca540db89363f2a20c7b32005de400490cdaae.tar.gz
fln deployment
-rw-r--r--play.js8
-rw-r--r--rules.js109
2 files changed, 107 insertions, 10 deletions
diff --git a/play.js b/play.js
index 7d4ea47..d1a3339 100644
--- a/play.js
+++ b/play.js
@@ -114,6 +114,10 @@ function is_area_remote(l) {
return (view.areas[l] & AREA_REMOTE_MASK) === AREA_REMOTE_MASK
}
+function is_area_country(l) {
+ return data.areas[l].type === COUNTRY
+}
+
// === UNIT STATE ===
// location (8 bits), op box (2 bits), dispersed (1 bit), airmobile (1 bit), neutralized (1 bit)
@@ -401,6 +405,10 @@ function update_map() {
ui.eliminated.appendChild(e)
} else {
let box_id = unit_box(u)
+ if (is_area_country(loc)) {
+ // only single box in France, Morocco and Tunisia
+ box_id = 0
+ }
if (!ui.boxes[loc * 4 + box_id].contains(e))
ui.boxes[loc * 4 + box_id].appendChild(e)
}
diff --git a/rules.js b/rules.js
index 2b0181a..93fa258 100644
--- a/rules.js
+++ b/rules.js
@@ -38,6 +38,7 @@ const FRONT = 8
const FREE = 0
const DEPLOY = 1
const ELIMINATED = 2
+const FRANCE = 3
var states = {}
var game = null
@@ -326,6 +327,10 @@ function is_area_algerian(l) {
return areas[l].type !== COUNTRY
}
+function is_area_france(l) {
+ return l === FRANCE
+}
+
function is_area_urban(l) {
return areas[l].type === URBAN
}
@@ -1640,20 +1645,18 @@ states.gov_deployment = {
prompt() {
view.prompt = "Deploy activated mobile units to PTL or into OPS of another area"
if (game.selected.length === 0) {
-
-
for_each_friendly_unit_on_map(u => {
if (unit_box(u) === OPS || (!is_police_unit(u) && unit_box(u) === PTL) || is_division_unit(u))
gen_action_unit(u)
- })
- } else {
- let first_unit = game.selected[0]
- let first_unit_type = unit_type(first_unit)
+ })
+ } else {
+ let first_unit = game.selected[0]
+ let first_unit_type = unit_type(first_unit)
- if (first_unit_type == FR_XX) {
- if (is_unit_not_neutralized(first_unit)) {
- view.prompt = "Deploy activated mobile units to PTL or into OPS of another area, or change division mode"
- } else {
+ if (first_unit_type == FR_XX) {
+ if (is_unit_not_neutralized(first_unit)) {
+ view.prompt = "Deploy activated mobile units to PTL or into OPS of another area, or change division mode"
+ } else {
// allow selection of neutralized divisions (to change mode only)
view.prompt = "Deploy: change division mode"
}
@@ -1712,6 +1715,92 @@ states.gov_deployment = {
}
},
end_deployment() {
+ goto_fln_deployment_phase()
+ }
+}
+
+function goto_fln_deployment_phase() {
+ game.phasing = FLN_NAME
+ set_active_player()
+ log_h2(`${game.active} Deployment`)
+ game.state = "fln_deployment"
+ game.selected = []
+}
+
+states.fln_deployment = {
+ inactive: "to do deployment",
+ prompt() {
+ view.prompt = "Deploy units to OPS in same area"
+ if (game.selected.length === 0) {
+ for_each_friendly_unit_on_map(u => {
+ // TODO handle units in Morocco and Tunisia
+ if (unit_box(u) === OPS || unit_box(u) === UG)
+ gen_action_unit(u)
+ })
+ } else {
+ let first_unit = game.selected[0]
+ let first_unit_loc = unit_loc(first_unit)
+ let first_unit_box = unit_box(first_unit)
+ let first_unit_type = unit_type(first_unit)
+
+ // Allow deselect && more units in same box
+ for_each_friendly_unit_in_loc(first_unit_loc, u => {
+ if (unit_box(u) === first_unit_box) {
+ gen_action_unit(u)
+ }
+ })
+
+ if (is_area_algerian(first_unit_loc)) {
+ gen_action_loc(first_unit_loc)
+ } else if (is_area_france(first_unit_loc)) {
+ // The Cadre unit in France may be deployed to any Area where there is a Front unit.
+ // XXX CHEAT this allows free movement when deploying to France and then again in the same turn elsewhere
+ let has_front = false
+ for_each_friendly_unit_on_map_of_type(FRONT, u => {
+ gen_action_loc(unit_loc(u))
+ has_front = true
+ })
+ if (has_front) {
+ view.prompt = "Deploy Cadre to Area with Front"
+ }
+ }
+
+ if (first_unit_type == CADRE && game.selected.length === 1 && !has_friendly_unit_in_loc(FRANCE)) {
+ view.prompt = "Deploy units to OPS in same area (or Cadre to France)"
+ // deploy single Cadre to France
+ gen_action_loc(FRANCE)
+ }
+ }
+
+ // XXX debug
+ // TODO confirmation when no units are activated?
+ gen_action("end_deployment")
+ },
+ unit(u) {
+ set_toggle(game.selected, u)
+ },
+ loc(to) {
+ let list = game.selected
+ game.selected = []
+ push_undo()
+ log("Deployed:")
+ for (let u of list) {
+ let loc = unit_loc(u)
+ if (loc === to) {
+ log(`>${units[u].name} in ${areas[loc].name}`)
+ if (unit_box(u) === UG) {
+ set_unit_box(u, OPS)
+ } else {
+ set_unit_box(u, UG)
+ }
+ } else {
+ log(`>${units[u].name} to ${areas[to].name}`)
+ set_unit_loc(u, to)
+ set_unit_box(u, UG)
+ }
+ }
+ },
+ end_deployment() {
// XXX debug
goto_next_turn()
}