Fire modes, fitted sights and lamps, and a tab rail

Selectable fire, with the modifiers on the choice
  Every weapon has carried a fireMode since the packs were first built and nothing
  read it: a musket could rip a ten-round burst and "rapid" bought a weapon nothing.
  FIRE_MODE now gates the burst rules and carries its own attack modifier — slow +10%
  and then you work for the next one, fast a second shot at -20% to both, rapid
  bursts, beam +5% and it can be held on the target for damage instead of hits. The
  gate lives in burstAttack too, so no macro can route round it. `fast` was on five
  catalogue weapons and was not in the system's list of modes at all, so re-saving one
  of them silently blanked it; the list is derived from the rule now.

  burstAttack shipped complete and was reachable from nothing. It is the resolution
  path the selector chooses, and takes the dialog's whole stack rather than charging
  the player twice for the same burst.

Sights and lamps that apply themselves
  A sight is graded by range band, so a telescopic sight is a -10% liability inside
  ten metres and worth +20% at extreme, and it only counts if it fits. The band is
  already known when the modifier is wanted, so nothing is selected and nothing is
  forgotten. The dark costs something now; a carried lamp buys it back to dim, never
  to daylight, and the card says it shows them exactly where you are. A migration
  fits gear that predates the fields, matched on the stamped key rather than by name.

The damage card
  The last card still wearing Foundry's stock dice styling — it posted a bare Roll and
  let the core template dress it. It renders through the module's own card now, with
  the Roll still on the message so dice stay inspectable.

A rail instead of a strip
  Eight tabs across an 820px sheet compressed to 11px type. They run down the side
  now, one line each, with counts as badges; the sheet is 152px wider to pay for it.

Also fixed: any weapon with a Coherence cost could not be attacked with AT ALL — the
handler re-read the weapon after an await, when currentTarget is already null, and the
attack died on a TypeError with nothing shown. And the duplicate-rule guard failed an
honest table because FIRE_MODE and speedBands share two key names; it wants a majority
now, and prints partial overlaps rather than swallowing them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-08-11 08:56:04 +01:00
co-authored by Claude Opus 5
parent d4442a55f0
commit 2e10ecced9
125 changed files with 1023 additions and 172 deletions
+79
View File
@@ -4211,3 +4211,82 @@ is the retuned extraction rule working end to end.
all four agents. Only the Field Lead ever had it — the other three had never been
awarded it, and the probe could not tell the difference between a talent removed and a
talent never held. The amendments actually made were three, not four.
## Fire modes, fitted kit, and a rail instead of a strip
Four requests, and the first of them turned over the usual stone.
**R-231. Every weapon has carried a fire mode since the packs were first built, and
nothing has ever read it.** A musket could rip a ten-round burst; "rapid" bought a
weapon precisely nothing. `FIRE_MODE` now gates the burst rules and carries its own
attack modifier, so the mode is a decision rather than a label: **slow** +10% and then
you work for the next one, **single** the baseline, **fast** a second shot at −20% to
*both*, **rapid** bursts, **beam** +5% and it can be held. The gate is checked inside
`burstAttack` rather than only in the dialog, so no macro or harness can route round it.
**R-232. `fast` was not a fire mode at all.** Five weapons carried it — longbow, sling,
javelin, the Webley and the Lee-Enfield — and the system's list of modes did not
include it, so the item sheet's dropdown had no matching option and re-saving one of
those weapons silently blanked its mode. The list was hand-written next to the rule
instead of derived from it. It is derived now, and the guard that should have caught
this was the one I had to fix in R-236.
**R-233. `burstAttack` was reachable from nothing.** The automatic-fire rules shipped
complete and could not be used from any sheet. It is now the resolution path the fire
selector chooses, and it takes the dialog's whole modifier stack rather than rebuilding
its own — the first version charged the player twice for the same burst.
**R-234. Any weapon with a Coherence cost could not be attacked with at all.** The
handler read the weapon, awaited the Coherence charge, and then read the weapon
*again* — but `currentTarget` is only set while an event is being dispatched, so the
second read returned null and the attack died on a TypeError with nothing shown to the
player. The Redaction lance, the Unmaker and every piece of transposed materiel were
unusable, and the failure was completely silent. Resolve once, before anything is
awaited.
**R-235. The damage card was the last one wearing Foundry's stock dice styling.** It
posted a bare Roll and let the core template dress it — grey boxes on a white panel in
the middle of a navy sheet. It renders through the module's own card now, with the Roll
still riding on the message so the dice stay inspectable and Dice So Nice still
animates.
**R-236. The duplicate-rule guard reported an honest table as a copy.** `FIRE_MODE` has
`slow` and `fast`; so does the entirely unrelated `speedBands` vocabulary, and two
shared key names was enough to fail the build. Every real instance this guard has ever
caught duplicated the *whole* table, so it now wants a majority of the keys — and
prints partial overlaps rather than swallowing them.
**Sights and lamps.** A sight is not a flat bonus, which is why most systems end up
with everybody carrying the same scope. It is graded by range band, so **a telescopic
sight is a −10% liability inside ten metres** and worth +20% at extreme, and it only
counts if it *fits* — the scope and the thermal sight are rifle furniture. Because the
band is already known by the time the modifier is wanted, the sight applies itself:
there is nothing to select and nothing to forget. The dark now costs something, a
carried lamp buys it back to dim and never to daylight, and the card says plainly that
the lamp shows them exactly where you are.
**R-237. "Automatic" that needs a re-import is not automatic.** Agents created before
those fields existed carried a Field lamp whose `lightSource` was the template default
of false — the lamp sat in the pack doing nothing. A migration stamps fitted gear from
the compendium on load, matched on `flags.ringbrp.key` rather than on display name,
because the fuzzy-name match this project used before once mapped a climbing kit to
breaching charges.
**My own error, caught by playing it.** I first costed a sustained beam as
`multiplier × energyPerShot`, which made a locked beam cost 60 charge from a 20-charge
cell — unfirable, and the failure was a warning the player would read as a bug. The
magazine is spent one per shot everywhere else in the system, so the cost is in shots:
a locked beam burns six. Worth noting that `energyPerShot` itself is written by the
pack builder and **read by nothing** — the same defect again, left alone here because
wiring it would change every energy weapon's economy.
**The tabs.** Eight of them across the top of an 820px sheet compressed to 11px type
and were genuinely hard to read. They are a rail down the side now: one line each,
larger type, a solid block for the active tab, and counts as badges. The sheet is 152px
wider to pay for the rail so nothing else got tighter, and the skills list is driven by
the space actually available rather than by a window-width breakpoint that was
measuring the wrong box.
Also noted, not fixed: fourteen rules are imported into `ringbrp.mjs` and read nowhere
in it. They are live rules with real readers in the rulebook generator and the guards,
so this is dead *imports* rather than dead rules — but it is the same smell.