diff --git a/players/join.bat b/players/join.bat index 1779f9f..8129612 100644 --- a/players/join.bat +++ b/players/join.bat @@ -29,6 +29,23 @@ 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 A genuinely dead exe leaves no process and falls straight through, so +rem the #41 launch forensics above still work. +rem ------------------------------------------------------------------ +:btwait +tasklist /FI "IMAGENAME eq btl4.exe" /NH 2>nul | find /I "btl4.exe" >nul +if not errorlevel 1 ( + timeout /t 2 /nobreak >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: diff --git a/players/join_lan.bat b/players/join_lan.bat index f6fb9c1..7d36037 100644 --- a/players/join_lan.bat +++ b/players/join_lan.bat @@ -32,6 +32,23 @@ 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 A genuinely dead exe leaves no process and falls straight through, so +rem the #41 launch forensics above still work. +rem ------------------------------------------------------------------ +:btwait +tasklist /FI "IMAGENAME eq btl4.exe" /NH 2>nul | find /I "btl4.exe" >nul +if not errorlevel 1 ( + timeout /t 2 /nobreak >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: diff --git a/players/play_solo.bat b/players/play_solo.bat index 48f6bd1..57fda3d 100644 --- a/players/play_solo.bat +++ b/players/play_solo.bat @@ -28,6 +28,23 @@ 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 A genuinely dead exe leaves no process and falls straight through, so +rem the #41 launch forensics above still work. +rem ------------------------------------------------------------------ +:btwait +tasklist /FI "IMAGENAME eq btl4.exe" /NH 2>nul | find /I "btl4.exe" >nul +if not errorlevel 1 ( + timeout /t 2 /nobreak >nul + goto btwait +) echo. echo The game has exited. If it closed unexpectedly, echo send the operator content\join.log. diff --git a/players/play_steam.bat b/players/play_steam.bat index 6223714..9898125 100644 --- a/players/play_steam.bat +++ b/players/play_steam.bat @@ -22,6 +22,23 @@ rem case this shell ran play_solo.bat first set BT_FE_SOLO= cd content ..\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 A genuinely dead exe leaves no process and falls straight through, so +rem the #41 launch forensics above still work. +rem ------------------------------------------------------------------ +:btwait +tasklist /FI "IMAGENAME eq btl4.exe" /NH 2>nul | find /I "btl4.exe" >nul +if not errorlevel 1 ( + timeout /t 2 /nobreak >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