Shields: armour you raise, and the only armour you can defend with

A shield is the one piece of armour you hold, and it protects you exactly as much as
you are currently holding it up. Raised, its points apply to what it covers and it can
parry on a new Shield skill. Lowered, it is weight. The price of keeping it up is that
it occupies a hand and you are shooting around it: -20% to your own ranged attacks,
printed on the card like everything else. Only one shield goes up at a time.

Seven of them, 2-point buckler to 6-point ballistic shield; the pavise and barrier
plate cover legs too because they are walls you carry.

`degradation` finally does something — it has been on every armour item since the packs
were first built and was read by nothing. A blow costs the shield a point of wear for
every step it stood above an ordinary success, so an ordinary hit costs nothing, a
special 1 and a critical 2. At its limit it comes apart, drops, and will not be raised
again.

Two defects found by driving the real functions rather than reading the diff, both
introduced by this change:

- Every shield defence quietly rolled DODGE. "shield" passed through
  defenceTypeAllowed unchanged, so neither parry branch matched and it fell through.
  Invisible in the card; it showed up as eight rolls at a supposed 85% returning six
  failures. Taking a blow on the shield IS a parry, so it is now a flag on a parry
  rather than a defence type of its own.
- The wear rule was unreachable: it fired only on a clean stop, but under graded
  defences only a critical fully stops a critical, so a shield would never have taken
  a scratch. Wear is for what the shield ABSORBED — dragging a critical down to a
  special is exactly when shields splinter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-08-11 18:25:30 +01:00
co-authored by Claude Opus 5
parent 016ea1c4ab
commit c61700566c
125 changed files with 419 additions and 102 deletions
+49
View File
@@ -4521,3 +4521,52 @@ on the first attempt and landed on the second, staunched the bleeding, healed 3,
`reviveIfHealed` took Plated out of the dying state without being asked. My harness
then called `tickDying` on a revived character and read `.state` off the null it
correctly returned — the rule was right and the probe was wrong.
## Shields — armour with a switch
A shield is the one piece of armour you *hold*, and it protects you exactly as much as
you are currently holding it up. Everything interesting follows from that switch
having a cost, so the design is: raised it is armour and a defence, lowered it is
weight, and the price of keeping it up is that it occupies a hand and you are shooting
around it.
* **Raised** — its points apply to what it covers, and it is the only armour you can
also defend with, on a new **Shield** skill.
* **Lowered** — nothing. Verified: heater shield slung reads 0 on every location,
raised reads 4 on torso and both arms and 0 on legs and head.
* **The cost** — −20% to your own ranged attacks while it is up, printed on
the card as plainly as anything else: *"Heater shield −20%"*. That is what stops
"always raised" being the only answer; it is obviously right for a containment
officer and obviously wrong for a marksman.
* **Only one goes up.** Raising a second lowers the first. Two shields is not a stance.
Seven of them, from a 2-point buckler to a 6-point ballistic shield, with the pavise
and the barrier plate covering legs as well because they are walls you carry.
**`degradation` finally does something.** It has been on every armour item since the
packs were first built and was read by nothing. Shields wear: a blow costs the shield a
point for every step the attack stood above an ordinary success, so an ordinary hit
costs it nothing, a special costs 1 and a critical costs 2. At its limit it comes apart
— no points, nothing to parry with, and it drops out of your hand and refuses to be
raised again.
### Two defects found by testing it rather than reading it
**R-244. Every shield defence quietly rolled Dodge.** I added `"shield"` as a third
defence type and passed it through `defenceTypeAllowed`, which returned it unchanged —
so `kind` was `"shield"`, neither of the `kind === "parry"` branches matched, and the
function fell through to the dodge branch. It was invisible in the chat card and only
showed up as a statistical smell: eight rolls at a supposed 85% produced six failures.
Taking a blow on the shield **is** a parry — it locks with parries and is not a dodge —
so the shield is a flag on a parry rather than a type of its own.
**R-245. The wear rule was unreachable.** I first wrote it to fire only when the shield
turned a blow aside *completely*. But under graded defences only a critical fully stops
a critical, so a shield would have gone its entire service life without a scratch. Wear
is for what the shield **absorbed**: a shield that drags a critical down to a special
has very much taken that blow, and that is exactly when shields splinter. Ten forced
criticals produced zero wear under the first rule; under the corrected one the shield
went 0 → 2 → 4 → broken in three absorbed blows.
Both were mine, both were introduced in this change, and both were found by driving the
real functions rather than by reading the diff.