diff options
Diffstat (limited to 'rules.js')
-rw-r--r-- | rules.js | 103 |
1 files changed, 87 insertions, 16 deletions
@@ -1199,10 +1199,10 @@ function search_move_bfs(from, cost, start, road, max_cost, retreat, sline, sdis if (presence_invalid) update_presence() if (is_axis_player()) { - path_enemy = presence_axis + path_enemy = presence_allied friendly_sides = game.axis_sides } else { - path_enemy = presence_allied + path_enemy = presence_axis friendly_sides = game.allied_sides } @@ -1767,12 +1767,12 @@ function goto_move() { states.move = { inactive: "move", prompt() { - view.prompt = `Move: Select unit to move.` - let rommel1 = (game.rommel === 1) ? 1 : 0 let rommel2 = (game.rommel === 2) ? 1 : 0 if (game.selected < 0) { + view.prompt = `Move: Select unit to move.` + // Select Group Move 1 if (!game.to1 && game.from1) { @@ -1840,6 +1840,7 @@ states.move = { else gen_action('end_move') } else { + view.prompt = `Move: Select hex to move to.` // Deselect gen_action_unit(game.selected) @@ -1849,6 +1850,7 @@ states.move = { search_withdraw(game.selected, (rommel1 | rommel2)) else search_move(unit_hex(game.selected), unit_speed(game.selected) + (rommel1 | rommel2)) + gen_move() } }, @@ -1943,10 +1945,6 @@ function apply_move(to) { push_undo() - if (has_enemy_unit(to)) { - // TODO: pick hex-side manually when engaging - } - search_move(from, speed + (rommel1 | rommel2)) if (!game.to1 && game.from1 === from) @@ -1966,19 +1964,92 @@ function apply_move(to) { return move_unit(who, to, speed + rommel2) } +// to check usable alternate paths to enter destination hex +function can_move_via(via, to, speed, road) { + let cost = path_cost[road][via] + let side = to_side_id(via, to) + let max_side = side_limit[side] + + console.log("can_move_via", via, to, speed, road, "=", cost) + + // too far + if (cost + 1 > speed + road) + return false + + // can't cross this hexside + if (max_side === 0) + return false + + // must stay on road for current bonus + if (side_road[side] < road) + return false + + // must stop on enemies + if (has_enemy_unit(via)) + return false + + // may not exceed hexside limit + if (has_enemy_unit(to)) + if ((game.side_limit[side] | 0) >= max_side) + return false + + return true +} + function move_unit(who, to, speed) { let from = unit_hex(who) let road = pick_path(to, speed) - set_unit_moved(who) - set_unit_hex(who, to) + if (has_enemy_unit(to)) { + game.engage_via = [] + for_each_adjacent_hex(to, via => { + if ( + (hex_road[from] >= 4 && can_move_via(via, to, speed, 4)) || + (hex_road[from] >= 2 && can_move_via(via, to, speed, 2)) || + (hex_road[from] >= 1 && can_move_via(via, to, speed, 1)) || + (hex_road[from] >= 0 && can_move_via(via, to, speed, 0)) + ) + game.engage_via.push(via) + }) + console.log("ENGAGE", to, "FROM", game.engage_via) + if (game.engage_via.length === 1) { + engage_via(who, game.engage_via[0], to) + } else { + game.engage_who = who + game.engage_to = to + game.state = 'engage' + return + } + } else { + log(`>from #${from} to #${to}`) + set_unit_moved(who) + set_unit_hex(who, to) + } +} + +states.engage = { + prompt() { + view.prompt = `Move: Select which hex side to cross.` + view.selected = game.engage_who + for (let x of game.engage_via) + gen_action_hex(x) + }, + hex(via) { + engage_via(game.engage_who, via, game.engage_to) + delete game.engage_via + delete game.engage_who + delete game.engage_to + game.state = 'move' + } +} - log(`>from #${from} to #${to}`) +function engage_via(who, via, to) { + let from = unit_hex(who) - // TODO: pick hex-side manually - if (is_battle_hex(to)) { - let side = to_side_id(to, path_from[road][to]) + set_unit_moved(who) + set_unit_hex(who, to) + let side = to_side_id(via, to) if (game.side_limit[side]) game.side_limit[side] = 2 else @@ -1989,8 +2060,8 @@ function move_unit(who, to, speed) { claim_hex_control_for_defender(to) set_add(game.active_battles, to) } - return true - } + + log(`>from #${from} via #${via} to #${to}`) } // === RETREAT === |