diff --git a/context/glass-cockpit.md b/context/glass-cockpit.md index cd3ca00..a737480 100644 --- a/context/glass-cockpit.md +++ b/context/glass-cockpit.md @@ -115,6 +115,25 @@ each, so they cover the foot band too, and the hit test takes the first match what keeps 0x16/0x17/0x1F/0x1E reachable. That class of bug is why the verification below tests first-hit reachability, not mere presence. +**Protrusion bonus — `BT_RIO_PROTRUDE` (2026-08-14, player request) [T2 receipt+screenshot].** +Players asked for more of the RIO buttons to clear the glass so a FLASHING lamp is easier to +notice. `BTRioBankMetricsFor` now adds a flat **+10px** to `strip` AFTER the scale, so the bar +reaches that much further out on every renderer; `BT_RIO_PROTRUDE=` tunes it (`0` restores +the pre-2026-08-14 geometry). Deliberately FLAT, not scaled: the surround runs the glass at half +scale where the strip sits on the 6px floor — a scaled bonus would help least exactly where the +lamps are smallest — and that floor already trades proportionality for legibility. Because only +`strip` moves, this touches exactly the **red MFD** and **yellow radar** buttons (+ the radar +foot row) and grows them **outward only**: the layout anchors the inboard edge, so under-glass +depth, button WIDTH and the press targets are unchanged. The **blue flight cells** are laid out +from `cellW/cellH` and never see it (receipt: their bank bounds are byte-identical). Verified by +`BT_RIOBANK_LOG` A/B — e.g. Heat MFD top button `y 21→11, h 126→136` with its bottom edge fixed +at 147, bank bounds `252→272` tall, no negative coordinates — plus a surround screenshot pair. +Relation to **#172**: the alert RING (`BT_ALERT_RING`, default off) answered the same night-16 +complaint after a *"+8px grown-face bloom"* was rejected on the bench as "the button got fat"; +this is a different shape — the lamp keeps its width and simply shows more of its own bar — so +the ring stays optional. Desktop-glass affordance only; the pod's buttons are physical and +backlit and never had this problem. + ## Sticky window placement — BT_GLASS_LAYOUT (2026-07-28) [T2 round-trip-verified] The `BT_GLASS_PANELS` windows self-place in a pod-faithful ring around the main window diff --git a/engine/MUNGA_L4/L4RIOBANK.cpp b/engine/MUNGA_L4/L4RIOBANK.cpp index f1e991d..a88ecd5 100644 --- a/engine/MUNGA_L4/L4RIOBANK.cpp +++ b/engine/MUNGA_L4/L4RIOBANK.cpp @@ -25,6 +25,46 @@ namespace const int minimumStrip = 6; const int defaultGap = 4; + //------------------------------------------------------------------- + // PROTRUSION BONUS (2026-08-14, player request). Flat pixels added to + // the lamp strip AFTER the scale, so the visible bar reaches this much + // further out of the glass on EVERY renderer. + // + // WHY FLAT, not scaled: the ask is on-screen noticeability of a + // FLASHING lamp, and the surround runs the glass at half scale, where + // the strip lands on the `minimumStrip` floor (~6px) -- a scaled bonus + // would give the surround half the help exactly where the lamps are + // smallest. The floor above already establishes legibility over strict + // proportionality for this field; this is the same trade, sized by the + // players. It is a DESKTOP-GLASS affordance: the pod's buttons are + // physical and backlit and have never had this problem. + // + // Scope: only the strip -- so only the RED MFD buttons and the YELLOW + // radar buttons/foot row grow, and they grow OUTWARD ONLY (the layout + // anchors the inboard edge; under-glass depth is unchanged). The BLUE + // flight cells are laid out from cellW/cellH and never see this. + // + // Relation to #172: the alert RING (BT_ALERT_RING, default off) was the + // answer to the same night-16 complaint after a "+8px grown-face bloom" + // was rejected on the bench as "the button got fat". This is a + // different shape -- the lamp keeps its width and simply shows more of + // its own bar -- and it is unconditional, so the ring stays optional. + //------------------------------------------------------------------- + const int defaultProtrude = 10; + + int ProtrudeBonus() + { + static int cached = -1; + if (cached < 0) + { + const char *e = getenv("BT_RIO_PROTRUDE"); // tune by eye; 0 = pre-2026-08-14 + cached = (e != 0) ? atoi(e) : defaultProtrude; + if (cached < 0) cached = 0; + if (cached > 200) cached = 200; + } + return cached; + } + //------------------------------------------------------------------- // Per-column horizontal nudge for the 4 MFD buttons, left->right, so // they line up with the (unevenly spaced) DISPLAY / PROGRAM / ... @@ -111,6 +151,7 @@ void int strip = Scaled(nativeStrip, shortAxis, nativeShortAxis); if (strip < minimumStrip) strip = minimumStrip; + strip += ProtrudeBonus(); // player-requested reach (see above) out->strip = strip; out->gap = defaultGap;