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>
102 lines
4.9 KiB
Batchfile
102 lines
4.9 KiB
Batchfile
@echo off
|
|
rem BT411 -- join 107.202.218.169's game (internet). Seat/mech assigned
|
|
rem by the operator. Keep this file next to content\ + build\.
|
|
cd /d %~dp0
|
|
rem ONE unified build (2026-07-21): the exe carries every layer; the GLASS
|
|
rem platform env arms the desktop cockpit (clickable MFD buttons, trigger
|
|
rem config, bindings.txt keymap).
|
|
set BT_PLATFORM=glass
|
|
if not exist "build\Release\btl4.exe" goto badpath
|
|
if not exist "content\OPERATOR.EGG" goto badpath
|
|
set BT_RELAY=107.202.218.169:1500
|
|
rem one fresh log per bat run; the menu->game relaunch chain APPENDS
|
|
rem so every generation's lines survive (0-byte logs = killed pre-start)
|
|
REM keep the PREVIOUS session's log: a crash report died 2026-07-26
|
|
REM because re-running this bat deleted the only evidence.
|
|
if exist content\join.old.log del content\join.old.log
|
|
if exist content\join.log ren content\join.log join.old.log
|
|
set BT_LOG=join.log
|
|
set BT_LOG_APPEND=1
|
|
set BT_START_INSIDE=1
|
|
set BT_DEV_GAUGES=1
|
|
cd content
|
|
rem JOIN-GAME menu (2026-07-22): pick your CALLSIGN + MECH, click JOIN --
|
|
rem your choice is sent to the operator and lands in the mission roster.
|
|
set BT_FE_JOIN=1
|
|
rem LAUNCH FORENSICS (#41): bracket the exe from outside -- if it dies
|
|
rem before it can write its own log, this report still records when it
|
|
rem ran, how it exited, and whether it ever created its log at all.
|
|
echo [%DATE% %TIME%] launching btl4.exe > launch_report.txt
|
|
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
|
|
set BT_EXITCODE=%ERRORLEVEL%
|
|
echo [%DATE% %TIME%] btl4.exe exited with code %BT_EXITCODE% >> launch_report.txt
|
|
if not exist join.log echo join.log WAS NEVER CREATED: the exe was blocked before it could run (loader failure or antivirus) >> launch_report.txt
|
|
if exist join.log for %%A in (join.log) do echo join.log size: %%~zA bytes >> launch_report.txt
|
|
|
|
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 you did NOT quit on purpose
|
|
echo (crash, or it never connected), send the operator BOTH files:
|
|
echo content\join.log and content\launch_report.txt
|
|
echo Otherwise the session may not be up yet -- try again.
|
|
pause
|
|
exit /b
|
|
:badpath
|
|
echo.
|
|
echo ==================================================
|
|
echo ERROR: this file is not in the right place.
|
|
echo.
|
|
echo It must sit in the EXTRACTED game folder, next to
|
|
echo the 'content' and 'build' folders.
|
|
echo.
|
|
echo Fix: right-click the .zip - Extract All, open the
|
|
echo extracted folder, and run this file from THERE.
|
|
echo (Do NOT run it from inside the zip.)
|
|
echo ==================================================
|
|
echo.
|
|
pause
|