port-layer papercuts for the playtest: #69 Denkou rename, #71 plasma X=minimize, #157 round-end UX (foreground handoff + lastrun clean-exit markers + bat sign-off rewording); tester-facing open-issues handout (docs/) + field-log anatomy notes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-08-10 11:29:01 -05:00
co-authored by Claude Fable 5
parent 46ff8dd262
commit bf04e1c079
11 changed files with 307 additions and 7 deletions
+1
View File
@@ -82,6 +82,7 @@ precise than anything you can infer.
| Multiplayer, replication, netcode | `context/multiplayer.md` |
| **The OPERATOR CONSOLE + RELAY** — how to launch it, ports, seats, the round/launch lifecycle, re-arm | `context/operator-console.md` |
| Running a session as sysop (operator-facing how-to) | `docs/OPERATOR_GUIDE.md` |
| The tester-facing OPEN-ISSUES handout (for Discord) | `docs/OPEN_ISSUES_FOR_TESTERS.txt` — regenerate from the tracker + update the header date before each playtest |
| Pod hardware, monitors, RIO, MFD surfaces, input remap (CONTROLS.MAP/XInput) | `context/pod-hardware.md` |
| Glass cockpit desktop dev layer (BT_GLASS/BT_STEAM gates, PadRIO, miniconsole, Steam) | `context/glass-cockpit.md` |
| Steam internet MP (the wire seam, identity tokens, lobby) | `context/steam-networking.md` |
+1 -1
View File
@@ -1384,7 +1384,7 @@ cmHeat(K,ModeSecondaryHeat,58,heatpal.pcc,heatpal2.pcc,Myomers);
}
#=======================================================================
# Sunder V1
# Denkou (was: Sunder V1)
#=======================================================================
Snd1Init
{
+17
View File
@@ -69,6 +69,23 @@ run\run.cmd [EGG] # default DEV.EGG; cd's to content\ and runs btl4.exe -eg
**Keep the `if /I "%%P"=="btl4.exe"` guard** — parsing tasklist with `tokens=2` alone reads its
*"INFO: No tasks are running"* line as a PID and spins forever with nothing running. Full
investigation, including which windows exit vs merely hide: `phases/phase-12-orphan-processes.md`.
- **Field-log anatomy — reading a steam night (#157 forensics, 2026-08-10) [T2].** A night's log is
a CHAIN of `===== BT411 SESSION` blocks: menu stubs (`args=''`, "first process") alternating with
glass generations (`-net 1501 -platform glass`, "relaunched generation"); one glass block = one
drop, and boundaries are synchronized across every machine to ±2 s (mission-clock expiry relaunches
all peers' menus in the same second). **Stub anatomy:** the steam lobby is CLICK-driven
(`steamAction`, btl4fe.cpp), so a menu closed without a click logs exactly **4 boot lines** and
exits 0 — a 4-line stub at end-of-night is a player going to bed, NOT a crash (all four machines
ended night-14 with identical 4-line stubs at 00:31:2x). 78-line stubs = a lobby cycle
(`[steamnet] up` + `[lobby] join` + map). `BTCrashFilter` is armed before the first log line and
writes a `[crash]` block + module-relative stack on ANY unhandled exception — a silent log end
means quit/kill/hang, never an unlogged AV. **`lastrun_<stem>.txt` caveats:** appends stop silently
if the file gets locked (the `is_open` guard skips) — a lastrun ending mid-night while the log
continues means the file was captured/locked during live troubleshooting, not that the chain died.
And the bat sign-off ("The game has exited. If it closed unexpectedly, send…") prints after ANY
chain end including a normal quit — it primes players to report quits as crashes; #157 ("did not
exit cleanly") was exactly this echo. The arcade-authentic round-end (mission process exits →
menu relaunch) itself reads as a crash to first-night players.
- **Why this is a BT411-only hazard [T1].** The 1995 pod shipped ONE folder — `BTL4OPT.EXE` sits
next to `BTL4.RES`/`VIDEO\`/`GAUGE\`/`AUDIO\` (it is still there in `content\`) — and RP411/RP412
keep that shape (`pack-dist.ps1` copies the exe and every asset dir into one dist root). BT411's
+1 -1
View File
@@ -339,7 +339,7 @@ cavern.egg`. This is every option the original console exposed for a BattleTech
- experience (4 [T1 game decode]): novice, standard, veteran, expert ← was hardcoded `expert`
- vehicle (18, friendly→tag): Black Hawk=blkhawk, Loki=loki, Nova=bhk1, Mad Cat=madcat, Thor=thor,
Owens=owens, Kotori=own1, Summoner=thr1, Hellbringer=lok1, Timber Wolf=mad1, Avatar=avatar,
Satyr=ava1, Sunder=sunder, Sunder V1=snd1, Vulture=vulture, Mad Dog=vul1, Mischief=lok2,
Satyr=ava1, Sunder=sunder, Denkou=snd1 (#69), Vulture=vulture, Mad Dog=vul1, Mischief=lok2,
Zanin Neko=mad2 (the 18 ModelList names; matches the 2026-07-18 vehicle sweep)
- color/camo (7, display→tag): White=White, Black=Black, Brown=Brown, Red=**Crimson**, Green=Green,
Gray=**Grey**, Tan=Tan ← was White/Black/Crimson only
+230
View File
@@ -0,0 +1,230 @@
=============================================================================
BT411 -- ALL OPEN TRACKER ISSUES (93), SORTED FOR PLAYTESTERS
Updated 2026-08-10 -- regenerated from the tracker before each playtest;
grab the newest copy from Discord (or docs/ in the repo)
=============================================================================
HOW TO REPORT: drop a line in Discord with the issue number and PASS /
FAIL / what you saw. Screenshots and rough times help; logs get collected
as usual.
=============================================================================
-----------------------------------------------------------------------------
A. FIXED -- PLEASE VERIFY
-----------------------------------------------------------------------------
#18 Engineering aux buttons crashed the game (glass windows)
TEST: click every Engineering panel button, incl. the aux row. No crash.
#20 Auto cooling BALANCE did nothing
TEST: ADV control mode, press BALANCE -- coolant redistributes.
#22 Ammo + destroyed weapons did not reset on respawn
TEST: die with empty bins / dead weapons -> respawn full and repaired.
#25 Gamepad turn profile (stick X could not turn the mech)
TEST: bind an axis to "Turn" in content\bindings.txt -- mech turns.
#27 Autocannon/Gauss dealt the wrong damage type
TEST: ballistics should feel/score like solid shot now (no blast splash).
#32 Audio cutting in/out late in the match
TEST: long drop -- audio should stay clean to the end.
#35 Owens crashed when firing lasers (Conn Man x2, long ago)
TEST: Conn Man -- Owens, spam lasers. Believed fixed for a while.
#36 Turning continued after releasing the pad/rudder axis
TEST: RajelAran -- release/center the turn axis, turning stops.
#38 Mech colors reverted on respawn
TEST: custom paint, die, respawn -- colors stay.
#39 Controls were live before the game screen appeared
TEST: mash fire during load -- nothing happens until the scene shows.
#40 Waiting/join screen burned 45-50% GPU
TEST: GPU near idle while waiting in the join screen.
#41 (David/Auric) launcher killed before it could run -- forensics armed
TEST: if join.bat ever fails again, send content\lastrun_join.txt --
it now records the exit code that names the killer.
#43 Comm display: pilot list with KILLS/DEATHS
TEST: all pilots listed, kills/deaths update through the round.
#47 Jam / ammo-bay-fire annunciation
TEST: bay fire alarm looks OK now. Still watching: does the ENG page
button FLASH on a weapon JAM? (run ballistics hot to force jams)
#48 Secondary/Comm MFD artifacting (stray blocks)
TEST: if you see artifacts, say so -- the log now self-reports the
culprit automatically.
#50 All MFDs unclickable for a round (SAURON) } same fix --
#56 MFD buttons drift away from where they are drawn } verify together
TEST: alt-tab / focus changes mid-round, then click MFD buttons --
they must stay aligned with the graphics.
#51 Coolant flush sound looped forever
TEST: flush coolant -- the sound ends when the flush ends.
#53 Generators could not be switched OFF
TEST: ENG page -- toggle each generator off and back on.
#54 (David) all three energy weapons died for a whole round
TEST: after your first death, weapons must still recharge normally
for the rest of the round.
#58 Reticle callsign plate drew as a solid rectangle
TEST: target names under the reticle render as text on every map.
#59 First death permanently froze parts of that player's simulation
TEST: nothing specific -- covered by normal play after dying.
#61 Searchlight toggle was dead
TEST: searchlight button toggles + lamp tracks. (The visible beam and
night-fog change are separate, still to come -- #123.)
#62 Weapon knocked off the power bus stayed dark forever
TEST: fiddle bus/generator selection on the ENG page -- weapons
reconnect on their own (AUTO) instead of staying dead.
#69 "Sunder V1" renamed to DENKOU
TEST: vehicle picker shows Denkou -- era witnesses, confirm the spelling.
#70 (Draco) torso twist lost after a death/respawn
TEST: die, respawn, twist. Fixed a while ago but never field-confirmed.
#71 Closing the Plasma window lost it until restart
TEST: X the plasma window -- it minimizes to the taskbar; click restores.
#93 Crash at end of round
TEST: play rounds to their natural end -- report ANY teardown crash.
#114 Missile impact smoke was a wall
TEST: LRM exchanges -- smoke is present but no longer a smoke screen.
#131 Reticle showed LOCK off-target / no-reg on target
TEST: stationary targets -- lock ring matches where the reticle is.
#137 Respawned with myomers heat MAXED (mech frozen at spawn)
TEST: respawn repeatedly -- heat always starts normal. Oracle already
confirmed one clean session; more eyes welcome, this one eluded us.
#138 Glass buttons flashed at the wrong rate unless a window was dragged
TEST: leave the MFD windows unfocused -- lamps flash at the real rate.
#149 Glass cockpit stutter / hitching
TEST: glass mode -- mission load and play feel smooth again.
(Repaints now skip windows whose gauges did not change.)
#150 Double kill credit (one kill counted twice)
TEST: kill someone with a missile volley -- scoreboard +1, not +2.
#146 Respawned already running (virtual throttle survived death)
TEST: respawn -- throttle idle until YOU move it; a physical throttle
re-syncs on first movement. Oracle confirmed the mechanic; keep watching.
#147 Range caret vanished for the session (ticks stayed)
TEST: nobody has re-created it. If it happens the log now catches the
culprit red-handed ("NaN TRAPPED") -- just report that you saw it.
#152 Torso auto-recentre / CENTER button
TEST: CENTER (pod button / F7) recentres the torso in every control
mode, on glass and RIO rigs too. (Era question below still open.)
#158 (Sauron) could not move after respawn until throttle cycled
TEST when it happens: does cycling the throttle free you?
YES -> it is the #146 throttle-release mechanic (expected).
NO -> report map + where you spawned (suspect: spawn-in geometry).
-----------------------------------------------------------------------------
B. OPEN -- HELP US REPRODUCE / NARROW (what to note when it happens)
-----------------------------------------------------------------------------
#24 Controller hat/look view sticks (recovers after wiggling now)
NOTE: which controller, which direction, does wiggling clear it.
#37 Mech torso appears BACKWARDS to other players (transient)
NOTE: whose mech, and does it snap back -- watch peers, any chassis.
#74 8BitDo gamepad works solo, dead in Steam MP
NOTE: VexUbiquity -- does it still happen, and in LAN vs Steam?
#100 Main coolant reservoir drains with NO leak shown anywhere
NOTE: what you were doing; screenshot the ENG page when you catch it.
#101 Round ended with 18 s still on the clock
NOTE: exact clock value + which drop; has not repeated since.
#102 Owens: full-throttle run -> hold reverse = animation/audio hang
REPRO known (exterior cam, savannah). Does it still happen? It
self-clears on a torso twist.
#122 Throttle: normal-vs-seek-4 speeds crammed into last sliver of travel
NOTE: which mech; era witnesses -- how did the pod lever feel?
#125 Peers do not see the FIRST destroyed-zone graphic (2nd hit shows it)
NOTE: victim + observer both report; paper doll vs external view.
#126 Peer weapon fire invisible AND silent from some positions
NOTE: positions of shooter/observer; moving fixes it.
#128 Ramming terrain = INSTANT coolant leak (4 for 4 that night)
NOTE: still 100%? speed at impact; which terrain.
#130 Vulture "skating" (gliding without walk animation) in a 6-player session
NOTE: a gait-replication fix landed since -- watch for any recurrence.
#132 (Conn Man) persistent yellow line on the HUD in every mech
NOTE: still there? screenshot + monitor resolution/aspect.
#135 Coolant leak with NO flashing annunciators (+ gen buttons not
flashing on leak, seen in glass too)
NOTE: glass or normal mode, which annunciators stayed dark.
#136 A SHUT leaking loop starts/stops leaking with COMPONENT toggles
NOTE: exact toggle order if you can reproduce.
#139 (Oracle, once) silent exit between "lobby up" and the room screen
NOTE: if hosting dies silently again, say so and we pull the log.
#143 One panel hit -> smoke erupts from MULTIPLE places at once
NOTE: which panel was hit (sensor special seen); screenshot.
#153 Basic-mode elevation limit only applies after cycling modes
Confirmed from the report; fix pending. No action needed.
#154 Overheated generator never came back online + no gen-out alarm on
thermal trip
NOTE: Oracle saw one stuck-forever gen, later trips recovered --
anyone else? How long did you wait?
#155 PANIC lamp lit: ENG + WEAPON MFD buttons stop responding
(The rapid flicker itself is AUTHENTIC -- see section D.)
NOTE: while panic is lit, which MFDs answer clicks and which do not.
#159 (Conn Man) lag during drops -- missiles / fire exploding in empty space
NOTE: shooter + target + rough time; the match receipts on both
machines can then measure the divergence directly.
-----------------------------------------------------------------------------
C. QUESTIONS FOR THE ERA WITNESSES (Oracle / VGL Lynx / Ronin / Draco)
-----------------------------------------------------------------------------
#103 Should a mech-to-mech RAM damage ARMOR, or internals only?
(Binary does internals-only rattle -- want a player ruling.)
#104 Mad Dog showing NARC 15 where an LRM is expected -- Ronin suspects
NARC was never implemented in 1995. Anyone remember it firing?
#105 Sensor DAMAGE effects: what exactly happened on-screen? (HUD flicker,
radar degradation, searchlight?) Video/timestamps welcome.
#120 Coolant FLUSH: to the line, or all the way to EMPTY? (Two era
witnesses say empty; our port stops at the line.)
#127 Weapon MFD EJECT graphic -- need a reference image/description.
#133 Did generators X-out on the MFD when SHUT DOWN / OVERHEATED, or
only when DESTROYED?
ALSO (#152 rider): in the pod, did the torso auto-recentre in Mid/Adv
modes, or only Basic? Sauron's "fought my control" suggests only Basic.
-----------------------------------------------------------------------------
D. SETTLED AS AUTHENTIC / DESIGN CALLS -- group opinions wanted
-----------------------------------------------------------------------------
#151 Panic eject costs -499 (not 0). This is the REAL 1995 scoring, verified
to the exact point value: ejecting scores your own death as a suicide
(you lose your kill-value) PLUS the death penalty. DESIGN CALL:
keep authentic, or house-rule a flat eject cost?
#119 Coolant-warning voice "clipping" at empty reservoir = authentic
(every leak-status edge restarts the phrase; the pod did this too).
#155 (flicker half) PANIC lamp rapid flicker at the failure edge =
authentic; the pod's incandescent bulbs visually smoothed it.
#23 MFDs overlapping the world view = pod-faithful design (real monitors
clipped the eyeport). Revisit sizing/tunability?
#77 Make the Secondary/Radar window resizable (SAURON's iPad-as-4th-
monitor experiment). Enhancement -- want it?
#157 "Crash at drop end" (Conn Man) = NOT a crash. Full forensics on the
ticket: every machine that night shows clean drops, and the round-end
exit-to-menu is the arcade's normal between-rounds flow. The separate
lag / "missiles hit empty space" report is now #159.
IMPROVED: the between-rounds menu should now land IN FRONT at round
end (say so if it still hides), and the console sign-off no longer
cries wolf on normal exits.
-----------------------------------------------------------------------------
E. KNOWN GAPS -- confirmed and on the list, no need to re-report
-----------------------------------------------------------------------------
#49 Radar/map does not draw the arena WALL geometry
#76 Glass layout save/restore being reworked (some windows not saved)
#83 INCOMING MISSILE alarm not implemented yet
#90 Flames/smoke from serious damage: less than the original (tuning)
#111 Peers see a dying mech's blue warp bubble (should see explosion only)
#112 AFC rounds shotgun across zones (should land as one projectile)
#113 LRM burn/hit state lasts too long
#115 Hot box / target select not connected
#121 Sensor HEAT has no consequences yet
#123 Searchlight: the visible LIGHT + night-fog swap still to come
#145 IR "predator vision": decode done, display not implemented
#156 Fade-to-black at mission end not happening
-----------------------------------------------------------------------------
F. INTERNAL ENGINEERING BACKLOG (listed for completeness -- nothing to test)
-----------------------------------------------------------------------------
#14 Glass panel unreconstructed button handler backlog (census)
#17 Cavern upper-butte halves lack a collision stream (authenticity TBD)
#21 Weapon recharge arc dark after eng-page use (symptom trail -> #62)
#28 Confirm the vital-subsystem-crit death path can fire (machinery in)
#30 Weapon "unavailable" (level-7) display verification + accessor cleanup
#63 PlayerStatus reads raw 1995 offsets (databinding trap, dormant)
#64 damageZone shadow field (half-fixed; consequences disarmed)
#65 HandleMessage non-virtual across 10 classes (latent dispatch trap)
#66 joyconfig.bat wizard re-run claim -- people use it fine; likely closing
#72 BTLoadPump swallows WM_QUIT during load (latent)
#107 Destroyed HeatSink annunciates nothing (no lamp for condition 0)
#117 KB note: per-chassis cockpit bounce was deliberate (Ronin) -- FYI
=============================================================================
End of list. 93 open issues total:
38 verify, 20 reproduce, 6 era questions, 6 settled/design (one is #155's
other half), 12 known gaps, 12 internal.
=============================================================================
+5 -1
View File
@@ -25,7 +25,11 @@ static LRESULT CALLBACK
return 0;
case WM_CLOSE:
ShowWindow(window, SW_HIDE); // hide only; the renderer owns it
// Minimize, never hide (#71): SW_HIDE left no way back short of a
// restart. A minimized window keeps its taskbar button (both framed
// and ,noframe styles), so the player can recover the display. The
// renderer still owns the window either way.
ShowWindow(window, SW_MINIMIZE);
return 0;
}
return DefWindowProcW(window, message, wparam, lparam);
+32
View File
@@ -234,6 +234,36 @@ static LONG WINAPI
return EXCEPTION_EXECUTE_HANDLER; // die (after the evidence is out)
}
//
// lastrun_<stem>.txt clean-exit markers (#157, 2026-08-10): the launch record
// only ever said "exe reached WinMain", so a night that ended with the player
// closing the menu was indistinguishable from a silent death -- and the bat's
// sign-off taught players to report normal quits as crashes. The deliberate
// exit paths stamp the record themselves now, so the file answers "crash or
// quit?" on its own. Name captured at breadcrumb time (cwd is content\ by
// then -- the same file the bats bracket).
//
static char gBTLastrunName[MAX_PATH] = "";
void
BTLastrunNote(const char *note)
{
if (gBTLastrunName[0] == 0)
{
return;
}
SYSTEMTIME lt;
GetLocalTime(&lt);
std::ofstream f(gBTLastrunName, std::ios::out | std::ios::app);
if (f.is_open())
{
char stamp[64];
wsprintfA(stamp, "[%04d-%02d-%02d %02d:%02d:%02d] ",
lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);
f << stamp << note << "\n";
}
}
//===========================================================================//
// environ.ini -- the player's settings file (cwd = content\). One KEY=VALUE
// per line; the real environment always WINS, so a launcher .bat or a shell
@@ -833,6 +863,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
GetComputerNameA(machine, &machine_len);
char lastrun_name[MAX_PATH];
wsprintfA(lastrun_name, "lastrun_%s.txt", logStem);
lstrcpynA(gBTLastrunName, lastrun_name, MAX_PATH);
std::ofstream breadcrumb(lastrun_name, std::ios::out | std::ios::app);
if (breadcrumb.is_open())
{
@@ -1209,6 +1240,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
BTFeLaunchSpec fe_spec;
if (BTFrontEnd_Run(&fe_spec) != 0 || fe_spec.mode == BTFeLaunchNone)
{
BTLastrunNote("clean exit: player quit from the menu");
return 0; // quit from the menu
}
char fe_arguments[192];
+12
View File
@@ -174,6 +174,8 @@ void
{
MarshalLog("window closed by the user -- exiting for real "
"(no relaunch)");
extern void BTLastrunNote(const char *);
BTLastrunNote("clean exit: player closed the game window");
ExitProcess(0);
}
}
@@ -257,6 +259,16 @@ void
if (CreateProcessW(exe_path, command_line, NULL, NULL, FALSE,
0, NULL, NULL, &startup, &process))
{
// Hand the child our foreground right BEFORE we die (#157): Windows
// refuses SetForegroundWindow to a process spawned by an exiting
// background parent, so the round-end menu could open BEHIND the
// desktop clutter -- which is how a normal between-rounds relaunch
// read as "the game crashed" from the cockpit seat.
if (!AllowSetForegroundWindow(process.dwProcessId))
{
MarshalLog("foreground handoff denied -- the next window may "
"open behind");
}
CloseHandle(process.hThread);
CloseHandle(process.hProcess);
}
+1 -1
View File
@@ -412,7 +412,7 @@ static const CatalogEntry kVehicles[] =
{ "avatar", "Avatar" },
{ "ava1", "Satyr" },
{ "sunder", "Sunder" },
{ "snd1", "Sunder V1" },
{ "snd1", "Denkou" }, // #69: the 4.x-era name (two era witnesses)
{ "vulture", "Vulture" },
{ "vul1", "Mad Dog" },
{ "lok2", "Mischief" },
+3 -2
View File
@@ -93,8 +93,9 @@ if defined BT_STILL_RUNNING (
goto btwait
)
echo.
echo The game has exited. If it closed unexpectedly, send the operator
echo BOTH of these from the content folder:
echo The game has exited. (Quitting from the menu lands here -- normal.)
echo If it CRASHED or would not start, send the operator BOTH of these
echo from the content folder:
echo content\lastrun_solo.txt (tiny -- send it EVEN IF there is
echo no solo_*.log at all: that combination
echo is how we spot a blocked launch)
+4 -1
View File
@@ -97,7 +97,10 @@ if defined BT_STILL_RUNNING (
goto btwait
)
echo.
echo The game has exited. If it closed unexpectedly, send the operator BOTH
echo The game has exited.
echo (Normal exits land here too: round ends return everyone to the menu,
echo and closing the menu window quits -- neither is a crash.)
echo If it CRASHED or would not start, send the operator BOTH:
echo content\lastrun_steam.txt (tiny -- send it EVEN IF there is no
echo steam_*.log at all: that is how we spot
echo a launch blocked before it ran)