Files
BT411/players
Joe DiPrimaandClaude Opus 5 901cf1b459 four ENG-page lamps were invisible, not missing: the ctors dropped their colour parameters
Playtest report: "generators don't seem to have an Auto setting" / "no auto mode
is ever displayed", plus the operator's own memory that the BUS MODE button once
stepped through three states.  The state machine was NEVER wrong: @004b0abc has
exactly two branches (<2 -> Auto(2); ==2 -> detach + Off(0)), Manual(1) is set
only by the four SelectGenerator buttons, and the auto-hunt gates on ==2 -- all
byte-verified, and the #62 re-attach fires live.  Manual is a one-way door out
of BUS MODE by design: a single cycle button cannot know WHICH generator manual
should mean.  Verified on-screen by the operator this session: A-D returns to
manual, BUS MODE toggles auto/off thereafter.

What was actually broken: the connect-mode lamp -- and three siblings -- never
drew a pixel.  OneOfSeveralStates (@004c5470) and OneOfSeveralInt (@004c5148)
forward caller-supplied background/foreground colours in the binary; the recon
dropped both parameters and hardcoded 0,0 into the base.  A BitMap-strip lamp
draws SetColor(bg) + DrawBitMapOpaque(fg,...), so 0/0 painted colour-0 on
colour-0: invisible.  Affected: btemode (connect mode, 1x3 -- THE report),
btecmode (coolant on/off, 1x2), and both bteseek gear-step lamps (1x4).  The
cluster call sites pass 0xff/0, byte-verified (@004c866c disasm;
part_014.c:1479-1481, :2146-2147).  Same dropped-element family as issue #42's
MoveToAbsolute.

THE TRAP THAT WAS NOT LANDED, recorded so it stays unlanded: with the lamp
first made visible, the frames appeared inverted against the levels (art reads
AUTO/MANUAL/OFF top-down; levels run OFF/MANUAL/AUTO), and a
row=(rows-1)-selected "fix" was proposed.  An adversarial workflow proved it
wrong: the gauge blit addresses SOURCE rows BOTTOM-UP
(Video16BitBuffered::DrawBitMapOpaque, L4VB16.cpp:3846-3850 -- sTop =
map_max_y - sTop, rows walked upward), the 1995 blit @0046bdfc performs the
identical flip, and the vertical strips are AUTHORED bottom-up to match.
Identity level->row therefore draws the pod-correct display; the inversion
would have created the very bug it claimed to cure.  Two of five investigators
(and the first human pass) assumed top-down; the engine source overruled all
three.  Convention + warning now recorded in context/gauges-hud.md.
btecmode doubles as the standing tripwire: a second vertical strip that must
show ON when coolant is available -- if it ever reads inverted, the bottom-up
verdict is falsified.

Also corrected: @004c552c is OneOfSeveralStates' EXECUTE override (clamp >= 0,
chain the base draw) -- the port had the body on BecameActive under a wrong
label; vtable-diffed against OneOfSeveral (0x518b24 vs 0x518bf0).  BecameActive
is inherited.  Behaviorally inert today (the state source never goes negative),
byte-faithful now.

README: the "KNOWN ISSUE -- automatic re-attach is not working yet" text is
replaced with how power routing actually works (A-D = manual, BUS MODE = auto
then off, two presses off / one back to auto).  That text shipped in 600, which
already contained the #62 fix -- players were being TOLD auto was broken while
it worked, which is half of how a painted-out lamp became "no auto mode".

Diagnostic kept: BT_GENSEL_TEST=<id> now drives any of the five power-routing
message ids (4..8, default 7) and pulses four times, so the whole mode cycle is
observable headlessly under BT_FIRE_LOG ([gensel] lines).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 13:22:21 -05:00
..

BattleTech {VERSION} -- multiplayer client
==========================================

IMPORTANT: FULLY EXTRACT this zip first (right-click - Extract All).
Do NOT run anything from inside the zip.  The .bat files must sit next
to the 'content' and 'build' folders.

UPGRADING from an older version?  Extract the new zip OVER your
existing game folder and say YES TO OVERWRITE.  Do NOT delete the
folder first -- your personal files (content\bindings.txt with your
key/joystick setup, content\volume.cfg with your volume) are not in
the zip and survive an extract-over-top, but a delete wipes them.
If you prefer a clean delete anyway, copy those two files out first
and put them back after.

TO JOIN AN INTERNET GAME:   double-click  join.bat
   -- pick your CALLSIGN and MECH, click JOIN (your choice is sent to
   the operator; waits for the session if it's not up yet)
TO JOIN A LAN GAME:         double-click  join_lan.bat  (operator's LAN;
   same callsign/mech menu)
SINGLE-PLAYER:              double-click  play_solo.bat  -- opens the
   mission menu: pick your mech (all 18), map, experience level,
   colours, weather and mission length, then launch
{STEAM}STEAM INTERNET PLAY:        double-click  play_steam.bat  (EXPERIMENTAL --
{STEAM}   needs the Steam client running; host or join from the menu)

Your seat is assigned automatically; you'll pilot the mech you picked
in the join menu (the operator can override it).
When a round ends your game AUTOMATICALLY rejoins for the next one
(same seat, same mech) -- just wait for the operator's next launch.
Close the window to leave for real.
If the game closes unexpectedly, send the operator TODAY'S log --
content\join_YYYYMMDD.log (the NEWEST one) -- plus content\lastrun_join.txt.

AFTER A MULTIPLAYER SESSION: the game writes a small match report
(content\matchlog_<date>_<time>_<number>.txt) and, on join.bat /
join_lan.bat, UPLOADS IT TO THE OPERATOR BY ITSELF at the end of each
round -- you do not need to send it.  Please send one MANUALLY only if
the game CRASHED mid-round (the upload happens on a clean round end, so
a crash loses it) or if you were playing SOLO or over STEAM (no relay
to upload through).
IF ANYTHING CRASHED OR MISBEHAVED, send BOTH of these -- neither is ever
uploaded, they only exist on your machine:
  content\join_YYYYMMDD.log   today's date; the NEWEST one.  There is now
                              ONE log per day holding every session, so a
                              crash is no longer erased when you relaunch.
                              Each session inside it starts with a line
                              "===== BT411 SESSION ... =====" naming your
                              build and PC, so it still identifies itself
                              if the filename gets changed when you send it.
  content\lastrun_join.txt    tiny; send it EVEN IF there is no log dated
                              today -- that combination is exactly how we
                              tell "the game was blocked before it started"
                              (antivirus, or a missing system file) apart
                              from a normal crash.
If you UPGRADED over an older copy you may still have an old content\join.log
lying around.  Nothing writes to it any more -- ignore it, or delete it, so
you don't send a stale one by mistake.

You start INSIDE the cockpit with the pod's MFD panels composited
around the view (one window).  The red MFD buttons, radar rails and
joystick buttons are all MOUSE-CLICKABLE -- right-click a button to
latch it held.  Press ` (backtick) any time to toggle the external
camera.

CONTROLS (keyboard) -- NEW DEFAULT LAYOUT THIS BUILD:
  The keyboard IS the cockpit button board now: the letter and number
  rows are the MFD button banks laid out where they sit on the panel,
  and FLIGHT LIVES ON THE NUMBER PAD.  Full map: CONTROLS.txt.

  UPGRADING?  Your bindings are MIGRATED to the new board on first
  launch: any keys YOU added or changed are kept (they beat the new
  defaults), and your joystick/HOTAS wizard setup is kept exactly --
  but the old stock keys (W/S throttle, A/D turn, V camera, M mode...)
  are replaced by the layout below.  Your previous file is saved as
  content\bindings.old.txt if you want to copy a favourite line back.

  FLIGHT (number pad -- NUMLOCK ON):
  NumPad 8/2 ........... torso aim up/down     NumPad 7/9 .... left/right pedal
  NumPad 4/6 ........... torso twist           NumPad 5 ...... all stop
  NumPad 0 or Space .... main trigger          NumPad 1/3/. .. pinky/middle/upper
  Shift/Ctrl ........... throttle up/down      Alt ........... reverse thrust
  Left/Down/Right ...... look left/behind/right  Up .......... torso centre
  ` (backtick) ......... cockpit / chase camera
  PgUp / PgDn .......... game volume up/down (saved between sessions)

  THE PANEL ON YOUR KEYS: 1-4/QWER = heat & coolant, 5-8/TYUI =
  engineering, 9-0-minus-equals/OP[] = comm, ASDF/ZXCV = left weapons,
  HJKL/NM,. = right weapons, F1-F12 = the map columns (F1/F2 zoom,
  F4 crouch, F7 CONTROL MODE, F9-F12 Generators A-D).  G and B are
  deliberately unbound -- feel for the gap.  Every button also stays
  mouse-clickable on screen (right-click latches it held).

  NOTE: you SPAWN IN BASIC control mode (the pod's rookie setting) --
  in BASIC the stick steers and the pedals do NOTHING.  Press F7 once
  for MID (pedals steer, stick twists the torso -- the full
  experience).  If 'turning does not work', it is this, not a bug.
  CONTROL MODE (BAS/MID/ADV, the F7 key IN the cockpit) is NOT the
  menu's EXPERIENCE setting (novice/standard/veteran/expert) -- that
  one changes the simulation (heat, damage), not your controls.
  1/2/3/Q/W/E are the six coolant valves and 4 (hold) is the flush.
  CAREFUL with the valves: the detents go 1 - 5 - 50 (max) -
  0 (CLOSED!) - back to 1.  One press past max SHUTS THE LOOP OFF and
  everything on it will overheat -- watch the valve dial on the coolant
  screen.  Boosting one loop starves the others (the supply is shared).
  A weapon gone quiet with ammo left has probably JAMMED (heat makes
  ballistic weapons jam -- authentic!).  Check its panel's ENG DATA page
  for the jam lamp (a cocked round with warning bolts).  The pod's fix
  is the EJECT button on that weapon's ENG DATA page: TAP to eject the
  jammed round (weapon reloads and returns to service), HOLD ~3s to
  jettison the whole bay before it cooks off.  Watch the TEMP strip and
  pace salvos.
  NEW: on a jam or a bay fire, that system's ENG-page buttons now FLASH
  to catch your eye -- the pod's own annunciator, restored.
  NEW AND DANGEROUS: an AMMO BAY FIRE is now genuinely lethal.  You get
  a fire icon by the ammo counter, the flashing buttons, and about TEN
  SECONDS -- then the bay detonates for (rounds x per-round damage),
  which can and will kill you.  HOLD the EJECT button on that weapon to
  dump the bay and put the fire out.  Previously these fires were
  harmless; they are not any more, so treat one as an emergency.
  G (hold) + fire key .. regroup a weapon onto that trigger -- or hold a
     weapon panel's red PROGRAM button with the mouse and tap a fire key;
     the joystick diagram on the panel shows the binding live.

FIXED THIS BUILD -- the automatic re-attach now works.  Previously a weapon
detached by the BUS MODE button stayed dark for the rest of the mission and
you had to rescue it with a GENERATOR SELECT button.  It now recovers by
itself, as the arcade did.

HOW POWER ROUTING WORKS (the ENG page).  Each weapon draws from one
generator, and it has three routing modes:
  GENERATOR SELECT A/B/C/D -- you pick that generator by hand.
  BUS MODE, first press ---- AUTO: the mech hunts for any live generator
                             and attaches to it by itself.  This is what
                             recovers a weapon whose generator died.
  BUS MODE, second press --- detached.  The weapon goes dark on purpose --
                             blank recharge arc, no ready dot, will not
                             fire.  Press BUS MODE again for AUTO, or a
                             GENERATOR SELECT button to choose one.
So it is TWO presses of BUS MODE to take a weapon off line, and one more to
put it back on AUTO.  There is no on-screen label for the current mode --
that is authentic, the pod had none either.  You tell by behaviour: on AUTO
a weapon with a working generator comes back on its own.

NOTE these are two different buttons: BUS MODE routes a WEAPON to a
generator, while the GENERATOR A-D buttons on the radar rail (F9-F12) turn
the GENERATORS THEMSELVES on and off.

An Xbox controller works out of the box.  FLIGHT STICKS / HOTAS /
pedals: run joyconfig.bat ONCE -- a wizard asks you to move each
control (stick, twist, throttle, fire buttons), writes the bindings,
and drops you into the solo menu to try them.  Rebind keys in
content\bindings.txt (regenerates with defaults if deleted).

FULL CONTROLS REFERENCE: see CONTROLS.txt next to this file -- every one of
the pod's 72 cockpit buttons, what it does, and which display it sits on.

COCKPIT LAYOUT: content\environ.ini (written on first run, every option
documented in the file itself) sizes the MFDs and the map, moves the map out
of the middle of the road, or breaks each display into its own window.  The
cockpit now scales to ANY window shape without distorting -- drag it, maximise
it, or launch with -fit for borderless full screen.

This build: {VERSION}.  Private -- do not redistribute.
{EXPIRE}Test builds STOP WORKING 14 days after they are made -- if the game
{EXPIRE}says it has expired, just grab the operator's newest zip.