From 652e53b4286bfc99466f5b13133f2c31cd877d0e Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 14 Jul 2022 15:54:02 +0200 Subject: elite hit assignment --- rules.js | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/rules.js b/rules.js index 48b62ee..7808384 100644 --- a/rules.js +++ b/rules.js @@ -1,5 +1,7 @@ "use strict" +// TODO: partial moves during regroup (to allow deciding entry hex-side) + // unit state: location (8 bits), steps (2 bits), supplied, disrupted, moved const max = Math.max @@ -1567,14 +1569,32 @@ const xxx_fire = { }, } +function count_normal_steps() { + let steps = [ 0, 0, 0, 0 ] + for (let u = 0; u < units.length; ++u) + if (is_enemy_unit(u) && unit_hex(u) === game.battle) + steps[unit_class(u)] += unit_steps(u) +} + +function count_elite_steps() { + let steps = [ 0, 0, 0, 0 ] + for (let u = 0; u < units.length; ++u) + if (is_enemy_unit(u) && unit_hex(u) === game.battle) + steps[unit_class(u)] += unit_steps(u) +} + +function count_hp() { + let hp = [ 0, 0, 0, 0 ] + for (let u = 0; u < units.length; ++u) + if (is_enemy_unit(u) && unit_hex(u) === game.battle) + hp[unit_class(u)] += unit_hp(u) +} + const xxx_fire_target = { prompt() { view.prompt = `Select a target class.` - let hp = [ 0, 0, 0, 0 ] - for (let u = 0; u < units.length; ++u) - if (is_enemy_unit(u) && unit_hex(u) === game.battle) - hp[unit_class(u)] += unit_hp(u) + let hp = count_hp() for (let i = 0; i < 4; ++i) hp[i] -= game.hits[i] @@ -1638,12 +1658,30 @@ const xxx_fire_target = { const xxx_fire_hits = { prompt() { view.prompt = `Apply hits.` + + let normal_steps = count_normal_steps() + let elite_steps = count_elite_steps() + let done = true for (let u = 0; u < units.length; ++u) { if (is_friendly_unit(u) && unit_hex(u) === game.battle) { - if (game.hits[unit_class(u)] > 0) { - gen_action_unit(u) - done = false + let c = unit_class(u) + if (is_unit_elite(u)) { + if (game.hits[c] >= 2) { + gen_action_unit(u) + done = false + } + } else { + if (game.hits[c] >= 1) { + // If mixed elite and non-elite: must assign ALL damage. + if (elite_steps[c] > 0 && normal_steps[c] === 1 && (game.hits[c] & 1) === 0) { + // Eliminating the last non-elite must not leave an odd + // number of hits remaining. + } else { + gen_action_unit(u) + done = false + } + } } } } -- cgit v1.2.3