RGB keyboard lamp mirror + the shipped controls reference
KEYBOARD LAMP MIRROR (L4KEYLIGHT). Ported from RP412, itself a port of vRIO's KeyboardLampMirror. Keys bound to a lamp address in bindings.txt glow with the panel palette through Windows Dynamic Lighting -- yellow for the map's side columns (0x10-0x1F), red for the rest -- flashing in step with the on-screen buttons (its LampLevel copy matches the FIXED BTLampBrightnessOf). Per-key boards light each bound key; zone-lit boards mirror the strongest lamp board-wide. All WinRT runs on a private worker thread: watcher, claim, and a 100 ms paint loop that repaints only on change. RP412's packing hazard does NOT transfer: it forces default struct packing there because its engine is /Zp1, which would break the WinRT ABI. BT411's BT_OPTS carries no /Zp, so only the dialect flags are needed -- /std:c++17 /permissive- per-file, since the project otherwise builds C++14 /permissive. The scalars-only interface is kept anyway so the isolation survives if packing is ever added. Wired in PadRIO: map built from bindings.keyBindings (ActionButton binds only, first-binding-wins per key), fed from PadRIO::SetLamp, stopped in the dtor (which hands the LEDs back to Windows). BT_KEYLIGHT=0 opts out; a machine without Dynamic Lighting logs once and stays dormant. Verified live: claimed this machine's 24-zone keyboard and mirrors 25 bound keys; BT_KEYLIGHT=0 and the pod profile produce zero keylight lines and run clean. SHIPPED CONTROLS REFERENCE. docs/CONTROLS.md carries the keyboard table plus the full 72-BUTTON POD MAP, grouped by the display each bank surrounds, with the coolant-valve detent warning (1-5-50-CLOSED, one press past max shuts the loop) and the jam/eject procedure. mkdist flattens it to ASCII as CONTROLS.txt at the zip root, the README's own idiom. players/README.txt gained pointers to it, to environ.ini, to -fit, and to the RGB mirror. KB: context/glass-cockpit.md and docs/GLASS_COCKPIT.md updated for the whole branch -- layout modes, L4RIOBANK and the under-glass rule, the letterbox fit and its ordering trap, player-tunable displays, the measured legend grid, the closed dead-button backlog, and this mirror. Verified: five-mode regression (surround/exploded/dock/pod/dev) boots and simulates with zero faults; mkdist writes a 5149-byte pure-ASCII CONTROLS.txt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -119,6 +119,22 @@ def main():
|
||||
lines = [l for l in lines if "{EXPIRE}" not in l]
|
||||
readme = "".join(lines)
|
||||
z.writestr(name + "/README.txt", readme)
|
||||
|
||||
# The full controls reference travels with the game, so players get the
|
||||
# 72-button panel map without the repo. Flattened to ASCII so it reads
|
||||
# correctly in Notepad -- the markdown source keeps its typography.
|
||||
if os.path.exists("docs/CONTROLS.md"):
|
||||
controls = open("docs/CONTROLS.md", encoding="utf-8").read()
|
||||
for bad, good in ((u"—", "-"), (u"–", "-"), (u"‘", "'"),
|
||||
(u"’", "'"), (u"“", '"'), (u"”", '"'),
|
||||
(u"×", "x"), (u"→", "->"), (u"…", "..."),
|
||||
(u"↑", "Up"), (u"↓", "Down"),
|
||||
(u"←", "Left"), (u"→", "Right"),
|
||||
(u"⚠", "!"), (u"·", "-")):
|
||||
controls = controls.replace(bad, good)
|
||||
controls = controls.encode("ascii", "replace").decode("ascii")
|
||||
z.writestr(name + "/CONTROLS.txt", controls)
|
||||
print(" controls reference -> CONTROLS.txt")
|
||||
for p in bats: # bats at the zip ROOT (next to
|
||||
arc = os.path.basename(p) # content\ + build\, per the guard)
|
||||
z.write(p, name + "/" + arc)
|
||||
|
||||
Reference in New Issue
Block a user