From 26439c2e1acd890b6641b4247b704e3eb4ea8883 Mon Sep 17 00:00:00 2001 From: arcattack Date: Thu, 23 Jul 2026 21:33:27 -0500 Subject: [PATCH] Boot forensics: first-breath log line + generation-safe bat logging Field 2026-07-23 (second night): a player's join.bat failed 3x in a row with a 0-byte join.log -- indistinguishable from 'never ran'. Two causes of evidence loss fixed: 1. The first flushed log line now happens the INSTANT the log opens (version, pid, args, first-process vs relaunched-generation). An empty log after this build means the exe was killed before WinMain -- an external cause (antivirus/loader), not ours. 2. The menu->game relaunch chain truncated join.log each generation (BT_LOG_APPEND was unset in the player bats): the crashed generation's evidence was erased by the next attempt. The bats now delete the log once per bat run and append across generations. Also explains the confusing 'The game has exited' bat message on SUCCESSFUL launches (the menu process exits after relaunching the game detached) -- the log now records the whole chain. --- game/btl4main.cpp | 11 +++++++++++ players/join.bat | 4 ++++ players/join_lan.bat | 4 ++++ players/joyconfig.bat | 4 ++++ players/play_solo.bat | 4 ++++ players/play_steam.bat | 2 ++ 6 files changed, 29 insertions(+) diff --git a/game/btl4main.cpp b/game/btl4main.cpp index 8f40bcd..c677ce0 100644 --- a/game/btl4main.cpp +++ b/game/btl4main.cpp @@ -197,6 +197,17 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine ? (std::ios::out | std::ios::app) : std::ios::out); std::cout.rdbuf(logfile.rdbuf()); + // FIRST-BREATH line, flushed IMMEDIATELY (field 2026-07-23: a player's + // exe died repeatedly with a 0-byte join.log -- indistinguishable from + // "never ran"). After this line, an empty log can only mean the exe was + // killed before WinMain (antivirus / loader) -- an external cause, not + // ours. Cheap forensics: version, PID, args, generation markers. + std::cout << "[boot] btl4 " << BT_VERSION_STRING << " pid=" + << (unsigned)GetCurrentProcessId() + << " args='" << (lpCmdLine ? lpCmdLine : "") << "'" + << (getenv("BT_FE_LOOP") ? " (relaunched generation)" : " (first process)") + << std::endl << std::flush; + // BT_JOYCONFIG=1: the generic-joystick capture wizard (flight sticks / // HOTAS / pedals -- L4JOY.h). Console prompts detect which device/axis // the player moves for each pod control and write the joystick section diff --git a/players/join.bat b/players/join.bat index 9147767..91f531a 100644 --- a/players/join.bat +++ b/players/join.bat @@ -9,7 +9,11 @@ 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) +if exist content\join.log del content\join.log set BT_LOG=join.log +set BT_LOG_APPEND=1 set BT_START_INSIDE=1 set BT_DEV_GAUGES=1 cd content diff --git a/players/join_lan.bat b/players/join_lan.bat index 9a5e1e7..0b4e245 100644 --- a/players/join_lan.bat +++ b/players/join_lan.bat @@ -12,7 +12,11 @@ set BT_PLATFORM=glass if not exist "build\Release\btl4.exe" goto badpath if not exist "content\OPERATOR.EGG" goto badpath set BT_RELAY=10.0.0.46: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) +if exist content\join.log del content\join.log set BT_LOG=join.log +set BT_LOG_APPEND=1 set BT_START_INSIDE=1 set BT_DEV_GAUGES=1 cd content diff --git a/players/joyconfig.bat b/players/joyconfig.bat index f104838..d1719f1 100644 --- a/players/joyconfig.bat +++ b/players/joyconfig.bat @@ -13,7 +13,11 @@ if not exist "content\OPERATOR.EGG" goto badpath set BT_JOYCONFIG=1 set BT_START_INSIDE=1 set BT_DEV_GAUGES=1 +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) +if exist content\join.log del content\join.log set BT_LOG=join.log +set BT_LOG_APPEND=1 set BT_FE_SOLO=1 cd content ..\build\Release\btl4.exe diff --git a/players/play_solo.bat b/players/play_solo.bat index 8a9e58c..1a09300 100644 --- a/players/play_solo.bat +++ b/players/play_solo.bat @@ -12,7 +12,11 @@ if not exist "build\Release\btl4.exe" goto badpath if not exist "content\OPERATOR.EGG" goto badpath set BT_START_INSIDE=1 set BT_DEV_GAUGES=1 +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) +if exist content\join.log del content\join.log set BT_LOG=join.log +set BT_LOG_APPEND=1 set BT_FE_SOLO=1 cd content ..\build\Release\btl4.exe diff --git a/players/play_steam.bat b/players/play_steam.bat index 5d915f8..6223714 100644 --- a/players/play_steam.bat +++ b/players/play_steam.bat @@ -9,7 +9,9 @@ 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 +if exist content\steam.log del content\steam.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.