From c5115fc63ae4c2ba358e0476095a11f0f9dce34d Mon Sep 17 00:00:00 2001 From: "@permadeath.com" Date: Wed, 19 Aug 2026 21:43:10 -0400 Subject: [PATCH] revert(unit-rules): let a battle shoot joints off after all They were skipped on the premise that a joint carries no battle value. It carries none of its own and a great deal through the movement it costs, which helm now models - so a leg hit is one of the sharpest ways down to a figure rather than a way of quietly handing somebody a weaker machine. --- TODO.md | 18 ++++++++++++++---- crates/helm-bv/src/battle.rs | 23 ++++------------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/TODO.md b/TODO.md index 20f0eee..8d65f75 100644 --- a/TODO.md +++ b/TODO.md @@ -510,10 +510,20 @@ not obvious from any one of them. way down to a figure, and an Atlas that lost its autocannon and kept its lasers is a more interesting unit than one with evenly thinned plate. What is refused is the end of that - nothing left to fire, or less than a - quarter of what it could throw. Joints are left alone for the opposite - reason: a shoulder, a hip or an actuator carries no battle value, so - shooting one off would hand somebody a machine much weaker than the - figure they asked for. + quarter of what it could throw. + + A leg joint turned out to be the sharpest lever of the lot, and the least + obvious one. A hip has no battle value of its own, so shooting one off + looked free - and it is not free at all, because it halves what the Mek + walks and movement feeds the defensive factor through the target movement + modifier and the offensive factor through the speed factor. helm was not + modelling that: a wrecked hip changed nothing. MegaMek takes an Atlas + AS7-D from 1897 to 1630 for one hip, and to 1289 for the three actuators + below it. The rule is now written and the damaged oracle carries two more + scenarios to hold it: a destroyed hip halves the walk rounding up, two + hips stop the Mek, every other leg actuator costs a point, and a leg with + a wrecked hip does not also pay for its remaining actuators. 40 of 40 + oracle rows agree. A location is only ever damaged behind plate that was breached. The pass that puts armour back when a hit overshoots was patching up locations it diff --git a/crates/helm-bv/src/battle.rs b/crates/helm-bv/src/battle.rs index e2bca54..f79be4d 100644 --- a/crates/helm-bv/src/battle.rs +++ b/crates/helm-bv/src/battle.rs @@ -47,9 +47,10 @@ //! or with less than a quarter of what it could throw, which is a tow rather //! than a unit. //! -//! Joints are left alone for the opposite reason: a shoulder, a hip or an -//! actuator carries no battle value at all, so shooting one off would hand -//! somebody a machine much weaker than the figure they asked for. +//! A leg joint is one of the sharpest levers there is, and not an obvious one: +//! a hip carries no battle value of its own, and shooting one off takes an +//! Atlas from 1897 to 1630 because it halves what the Mek walks and movement +//! feeds both halves of the figure. //! //! Magazines are never hit either. One taking a critical explodes, and without //! CASE that is the end of the machine - and it is the only hit that can raise @@ -411,13 +412,6 @@ impl Field { if is_ammo(what) { continue; } - // An actuator or a hip is worth no battle value at all and is - // worth a great deal in play - a wrecked hip halves what a Mek can - // walk. Hitting one would hand somebody a machine much weaker than - // the figure they asked for, which is the opposite of the job. - if is_actuator(what) { - continue; - } candidates.push(at); } let Some(&at) = rng.choose(&candidates) else { @@ -504,15 +498,6 @@ fn is_gyro(what: &str) -> bool { what.contains("Gyro") } -/// A joint: shoulders, hips and the actuators between them. -/// -/// Legitimate targets in the game and useless ones here. None of them carries -/// any battle value, so shooting one off cripples a machine without moving the -/// figure it is being worn down to. -fn is_actuator(what: &str) -> bool { - what.contains("Actuator") || what.contains("Shoulder") || what.contains("Hip") -} - /// A magazine, which does not take a critical hit and leave a live Mek. fn is_ammo(what: &str) -> bool { what.contains("Ammo") -- 2.51.2