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:
co-authored by
Claude Opus 5
parent
d4442a55f0
commit
2e10ecced9
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user