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
+90
-12
@@ -276,20 +276,60 @@
|
||||
Tabs — solid active state, not a Material underline
|
||||
============================================================ */
|
||||
|
||||
/* A RAIL, not a strip. Eight tabs across the top of an 820px sheet compressed to
|
||||
11px type and were genuinely hard to read; down the side each one gets a whole
|
||||
line to itself, so the type can be larger and the active tab can be a solid
|
||||
block rather than a tint. */
|
||||
|
||||
.rb-main {
|
||||
flex: 1 1 auto; min-height: 0;
|
||||
display: flex; flex-direction: row; align-items: stretch;
|
||||
}
|
||||
|
||||
.rb-tabs {
|
||||
display: flex; padding: 0 14px;
|
||||
flex: 0 0 152px;
|
||||
display: flex; flex-direction: column; padding: 8px 0 0;
|
||||
background: var(--rb-void);
|
||||
border-bottom: 1px solid var(--rb-line);
|
||||
border-right: 1px solid var(--rb-line);
|
||||
overflow-y: auto;
|
||||
}
|
||||
.rb-tabs .item {
|
||||
font-family: var(--rb-body); font-weight: 700; font-size: 11px; letter-spacing: .06em;
|
||||
text-transform: uppercase; color: var(--rb-muted);
|
||||
padding: 9px 14px 8px;
|
||||
display: flex; align-items: center; justify-content: space-between; gap: 6px;
|
||||
font-family: var(--rb-display); font-weight: 700; font-size: 12px; letter-spacing: .05em;
|
||||
text-transform: uppercase; color: var(--rb-muted); white-space: nowrap;
|
||||
padding: 10px 10px 10px 13px;
|
||||
border-left: 3px solid transparent;
|
||||
border-bottom: 1px solid var(--rb-hairline);
|
||||
}
|
||||
.rb-tabs .item:hover { color: var(--rb-white); }
|
||||
.rb-tabs .item.active { color: var(--rb-void); background: var(--rb-yellow); }
|
||||
.rb-tabs .item:hover { color: var(--rb-white); background: var(--rb-panel); }
|
||||
.rb-tabs .item.active {
|
||||
color: var(--rb-void); background: var(--rb-yellow);
|
||||
border-left-color: var(--rb-white);
|
||||
}
|
||||
.rb-tab-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
||||
.rb-tab-count {
|
||||
flex: 0 0 auto; font-family: var(--rb-mono); font-size: 10px; font-weight: 700;
|
||||
letter-spacing: 0; padding: 1px 5px; border-radius: 2px;
|
||||
background: var(--rb-panel); color: var(--rb-white);
|
||||
}
|
||||
.rb-tabs .item.active .rb-tab-count { background: var(--rb-void); color: var(--rb-yellow); }
|
||||
.rb-tab-count.rb-tab-bad { background: var(--rb-danger); color: var(--rb-void); }
|
||||
.rb-tabs .item.active .rb-tab-count.rb-tab-bad { background: var(--rb-void); color: var(--rb-danger); }
|
||||
|
||||
.rb-body { flex: 1 1 auto; overflow-y: auto; padding: 12px 14px 16px; }
|
||||
.rb-body { flex: 1 1 auto; min-width: 0; overflow-y: auto; padding: 12px 14px 16px; }
|
||||
|
||||
/* Narrow windows cannot afford 132px of rail — fold it back to a strip. */
|
||||
@media (max-width: 560px) {
|
||||
.rb-main { flex-direction: column; }
|
||||
.rb-tabs {
|
||||
flex: 0 0 auto; flex-direction: row; overflow-x: auto; padding: 0 8px;
|
||||
border-right: none; border-bottom: 1px solid var(--rb-line);
|
||||
}
|
||||
.rb-tabs .item {
|
||||
border-left: none; border-bottom: 3px solid transparent; padding: 8px 11px;
|
||||
}
|
||||
.rb-tabs .item.active { border-bottom-color: var(--rb-white); }
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
Section heads — the book's rule treatment
|
||||
@@ -325,13 +365,13 @@
|
||||
|
||||
.rb-body .tab[data-tab="skills"].active {
|
||||
display: block;
|
||||
column-count: 2;
|
||||
/* Driven by the space actually available rather than by window width. The rail
|
||||
takes 152px the body used to have, so a width-based breakpoint measured the
|
||||
wrong box and dropped to one column while there was still room for two. */
|
||||
columns: 300px 2;
|
||||
column-gap: 22px;
|
||||
column-fill: balance;
|
||||
}
|
||||
@media (max-width: 720px) {
|
||||
.rb-body .tab[data-tab="skills"].active { column-count: 1; }
|
||||
}
|
||||
.rb-skills { list-style: none; margin: 0; padding: 0; }
|
||||
.rb-skill {
|
||||
display: grid; grid-template-columns: 13px 20px minmax(0,1fr) 44px 104px 15px 15px;
|
||||
@@ -476,6 +516,44 @@
|
||||
.rb-wound-stamina { font-size: 11px; color: var(--rb-muted); font-style: italic; margin: 0; }
|
||||
.rb-dialog .notes { font-size: 12px; color: var(--rb-muted); }
|
||||
|
||||
/* Damage. This card used to be posted as a bare Roll and wore Foundry's stock
|
||||
dice styling — grey boxes on a white panel, in the middle of a navy sheet. */
|
||||
.rb-chat-formula { font-family: var(--rb-mono); color: var(--rb-white); }
|
||||
.rb-chat-mod { font-size: 11px; color: var(--rb-muted); }
|
||||
.rb-damage-result { align-items: baseline; gap: 9px; }
|
||||
.rb-damage-total {
|
||||
font-size: 34px; font-weight: 700; line-height: 1; color: var(--rb-yellow);
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.rb-damage-unit {
|
||||
font-family: var(--rb-display); font-size: 11px; letter-spacing: .12em;
|
||||
text-transform: uppercase; color: var(--rb-muted);
|
||||
}
|
||||
.rb-damage-wound {
|
||||
margin-left: auto; font-family: var(--rb-mono); font-size: 10px;
|
||||
text-transform: uppercase; letter-spacing: .06em; color: var(--rb-muted);
|
||||
border: 1px solid var(--rb-hairline); padding: 1px 6px;
|
||||
}
|
||||
.rb-damage-dice { gap: 6px; }
|
||||
.rb-damage-dice span {
|
||||
min-width: 17px; text-align: center; color: var(--rb-white);
|
||||
border: 1px solid var(--rb-hairline); padding: 1px 0;
|
||||
}
|
||||
.rb-damage.rb-critical .rb-chat-title { color: var(--rb-yellow); }
|
||||
.rb-damage.rb-critical .rb-damage-total { color: var(--rb-white); }
|
||||
|
||||
/* What the pack is doing to the shot without being asked. */
|
||||
.rb-dialog-kit {
|
||||
margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--rb-hairline);
|
||||
}
|
||||
.rb-kit-head {
|
||||
font-family: var(--rb-display); font-size: 10px; letter-spacing: .1em;
|
||||
text-transform: uppercase; color: var(--rb-yellow);
|
||||
}
|
||||
.rb-dialog-kit ul { list-style: none; margin: 4px 0 0; padding: 0; font-size: 12px; color: var(--rb-muted); }
|
||||
.rb-dialog-kit li:before { content: "› "; color: var(--rb-yellow); }
|
||||
.rb-fire-group .notes { margin: 3px 0 0; font-style: italic; }
|
||||
|
||||
/* ============================================================
|
||||
ITEM SHEET — the statline, after the 1984 weapons table
|
||||
============================================================ */
|
||||
|
||||
Reference in New Issue
Block a user