Files
BT411/players/play_steam.bat
T
arcattackandClaude Opus 5 7afbda900e the terminal that never closes: every launcher waited for ANY btl4.exe on the machine
Operator report: "X-closing the game leaves the terminal open and leaves
orphaned processes."  Investigated on the rig against 4.11.600.

The terminal half is real and is THIS: :btwait polled
`tasklist /FI "IMAGENAME eq btl4.exe"`, which is machine-wide, so a bat that
launched nothing at all keeps spinning while an unrelated instance lives --
proved with btwait_probe.ps1.  A second client, the operator's own pod, or an
orphan from a crash therefore hangs every join window, which reads as "the game
never exited" and invites people to start killing processes.  All four
launchers carried the identical block.

Fix: snapshot the btl4 PIDs alive BEFORE the launch; wait only on PIDs absent
from that snapshot.  The `if /I "%%P"=="btl4.exe"` guard is deliberately kept --
tokens=2 alone parses tasklist's "INFO: No tasks are running" line as a PID and
spins forever with nothing running, which would be worse than the bug.

Verified with the text lifted verbatim from the shipped play_solo.bat: nothing
running -> signs off (the regression guard); someone else's instance -> signs
off; our own generation -> keeps waiting; decoy gone -> signs off.  The patched
bat still launches (pid + launch_report.txt).  NOT verified: the full handoff
E2E, because the bat blocks on the FE menu waiting for a human.

The orphan half did NOT reproduce on 600: closing the MAIN window exits cleanly
in ~1s during solo model-load, in the relay join wait, and after a real console
launch, with the relay logging the seat freed.  The orphans the playtesters saw
match 584 and earlier, where every close relaunched.  Full write-up, including
the aux windows that hide instead of closing and the WM_QUIT that BTLoadPump
swallows, in phases/phase-12-orphan-processes.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 16:06:39 -05:00

91 lines
4.1 KiB
Batchfile

@echo off
rem BT411 -- STEAM play (EXPERIMENTAL, dev testers). Launches the glass
rem front-end menu: HOST a Steam lobby or JOIN one from the menu -- there
rem is no address to configure; sessions form through the Steam lobby.
rem Requires: the Steam client RUNNING and logged in, and the steam build
rem extracted next to content\.
cd /d %~dp0
if not exist "build\Release\btl4.exe" goto badpath
if not exist "content\BTL4.RES" goto badpath
set BT_PLATFORM=glass
set BT_STEAM_NET=1
rem KEEP the previous run's log (a crash report died 2026-07-26 because a
rem re-run deleted the only evidence). Rotate, never delete.
if exist content\steam.old.log del content\steam.old.log
if exist content\steam.log ren content\steam.log steam.old.log
set BT_LOG=steam.log
set BT_LOG_APPEND=1
rem Cockpit view + MFD gauges -- the same client flags the join bats set
rem (field report: players booted 3rd-person without them). Inherited by
rem the menu's mission relaunch.
set BT_START_INSIDE=1
set BT_DEV_GAUGES=1
rem full menu here (all modes + steam buttons); clear the solo trim in
rem case this shell ran play_solo.bat first
set BT_FE_SOLO=
cd content
rem ------------------------------------------------------------------
rem OUR GENERATION ONLY (2026-07-27). The wait loop below used to hold
rem this window open for ANY btl4.exe on the machine -- a second client,
rem the operator's own pod, or an orphan left by a crash. The window
rem then never printed the sign-off and looked hung: the reported "it
rem leaves the terminal open". Snapshot the PIDs alive BEFORE we launch;
rem those belong to somebody else and must not hold us here.
rem ------------------------------------------------------------------
setlocal EnableDelayedExpansion
set "BT_PRE=,"
for /f "tokens=1,2" %%P in ('%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq btl4.exe" /NH 2^>nul') do (
if /I "%%P"=="btl4.exe" set "BT_PRE=!BT_PRE!%%Q,"
)
..\build\Release\btl4.exe
rem ------------------------------------------------------------------
rem HANDOFF WAIT (2026-07-25). The front end does NOT stay resident: it
rem CreateProcess()es the mission generation and ExitProcess(0)s itself
rem (btl4console.cpp). So OUR child exiting means "the menu handed off",
rem NOT "the game closed" -- without this wait the window announced "The
rem game has exited" while the game was still loading, which reads as a
rem crash to a playtester. Wait for the handed-off generation(s) to go.
rem
rem NO EXTERNAL TOOLS: `find`, `findstr` and `timeout` are all shadowed by
rem Git-Bash / MSYS / GnuWin32 builds of the same names when those are on
rem PATH (a dev box, or a player who installed git). The MSYS `find` is
rem the Unix one and dies with "find: '/I': No such file or directory",
rem and GNU `timeout` takes different arguments. So: parse tasklist with
rem a pure-cmd for/f, and call both helpers by ABSOLUTE System32 path.
rem A genuinely dead exe leaves no process and falls straight through, so
rem the #41 launch forensics above still work. If tasklist is missing
rem entirely the loop degrades to reporting immediately -- the old
rem behaviour, never a hang.
rem ------------------------------------------------------------------
:btwait
set "BT_STILL_RUNNING="
for /f "tokens=1,2" %%P in ('%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq btl4.exe" /NH 2^>nul') do (
if /I "%%P"=="btl4.exe" (
rem a PID that was NOT in the pre-launch snapshot is ours
set "BT_STRIP=!BT_PRE:,%%Q,=!"
if "!BT_STRIP!"=="!BT_PRE!" set "BT_STILL_RUNNING=1"
)
)
if defined BT_STILL_RUNNING (
%SystemRoot%\System32\timeout.exe /t 2 /nobreak >nul 2>nul
goto btwait
)
echo.
echo The game has exited. If it closed unexpectedly, send the operator
echo content\steam.log. Steam not running = the menu still works but
echo lobbies will not appear.
pause
exit /b
:badpath
echo.
echo ==================================================
echo ERROR: this file is not in the right place, or
echo the zip was not fully extracted.
echo.
echo It must sit in the EXTRACTED game folder, next to
echo the 'content' and 'build' folders.
echo ==================================================
echo.
pause