From 306303b9a6d2a8083318c17b4dce052cd882368e Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 6 Jan 2025 06:22:31 +0100 Subject: [PATCH] Fix console colors not working before an iwad has been selected --- src/common/engine/i_interface.h | 1 + src/common/fonts/v_font.cpp | 36 ++++++ src/common/platform/posix/cocoa/i_main.mm | 37 +++++- src/common/platform/posix/cocoa/i_system.mm | 2 +- src/common/platform/posix/sdl/i_main.cpp | 89 +++++++------ src/common/platform/posix/sdl/i_system.cpp | 2 +- src/common/platform/win32/i_main.cpp | 125 ++++++++++++------- src/common/platform/win32/i_specialpaths.cpp | 3 +- src/common/platform/win32/i_system.cpp | 31 +++-- src/d_iwad.cpp | 6 + src/d_main.cpp | 48 +++---- src/d_net.cpp | 2 +- src/g_statusbar/sbarinfo.cpp | 4 +- src/gamedata/d_dehacked.cpp | 4 +- src/gamedata/info.cpp | 2 +- src/scripting/thingdef.cpp | 3 +- 16 files changed, 268 insertions(+), 127 deletions(-) diff --git a/src/common/engine/i_interface.h b/src/common/engine/i_interface.h index 4289bfeab..5cf2d6717 100644 --- a/src/common/engine/i_interface.h +++ b/src/common/engine/i_interface.h @@ -61,6 +61,7 @@ struct WadStuff extern FString endoomName; extern bool batchrun; +extern bool RunningAsTool; extern float menuBlurAmount; extern bool generic_ui; extern bool special_i; diff --git a/src/common/fonts/v_font.cpp b/src/common/fonts/v_font.cpp index 3d63725cc..e50f35a61 100644 --- a/src/common/fonts/v_font.cpp +++ b/src/common/fonts/v_font.cpp @@ -53,6 +53,7 @@ #include "texturemanager.h" #include "printf.h" #include "palentry.h" +#include "i_interface.h" #include "fontinternals.h" @@ -784,6 +785,41 @@ static void CalcDefaultTranslation(FFont* base, int index) PalEntry V_LogColorFromColorRange (EColorRange range) { + // Console wants to use colors before we loaded anything and we can't retroactively apply them like we can for the console in the game + if (RunningAsTool) + { + static std::vector colors = + { + 0x00cc3333, + 0x00d2b48c, + 0x00cccccc, + 0x0000cc00, + 0x00996633, + 0x00ffcc00, + 0x00ff5566, + 0x009999ff, + 0x00ffaa00, + 0x00dfdfdf, + 0x00eeee33, + 0x00dfdfdf, + 0x00000000, + 0x0033eeff, + 0x00ffcc99, + 0x00d1d8a8, + 0x00008c00, + 0x00800000, + 0x00663333, + 0x009966cc, + 0x00808080, + 0x0000dddd, + 0x007c7c98, + 0x00d57604, + 0x00506cfc, + 0x00236773, + }; + return (size_t)range >= colors.size() ? DEFAULT_LOG_COLOR : colors[range]; + } + if ((unsigned int)range >= TranslationColors.Size()) { // Return default color return DEFAULT_LOG_COLOR; diff --git a/src/common/platform/posix/cocoa/i_main.mm b/src/common/platform/posix/cocoa/i_main.mm index 21ebf67eb..1a4bd6349 100644 --- a/src/common/platform/posix/cocoa/i_main.mm +++ b/src/common/platform/posix/cocoa/i_main.mm @@ -61,6 +61,9 @@ EXTERN_CVAR(Int, vid_defheight) EXTERN_CVAR(Bool, vid_vsync ) int GameMain(); + +extern bool RunningAsTool = false; + // --------------------------------------------------------------------------- @@ -528,9 +531,7 @@ void ReleaseApplicationController() } } -} // unnamed namespace - -int I_GameMain(int argc, char** argv) +void InitArgs(int argc, char** argv) { for (int i = 0; i < argc; ++i) { @@ -549,6 +550,13 @@ int I_GameMain(int argc, char** argv) s_argv.Push(argument); } +} + +} // unnamed namespace + +int I_GameMain(int argc, char** argv) +{ + InitArgs(argc, argv); NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; @@ -574,7 +582,28 @@ int I_GameMain(int argc, char** argv) return EXIT_SUCCESS; } +// Note: no idea if this actually works as I don't have a macOS machine nowadays. +// It is possible this function should do exactly the same as the linux/posix version. +// Not really sure how Cocoa initialization and macOS bundles affects console applications on macOS, if at all. int I_ToolMain(int argc, char** argv) { - return I_GameMain(argc, argv); + RunningAsTool = true; + + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + + seteuid(getuid()); + + // Set LC_NUMERIC environment variable in case some library decides to + // clear the setlocale call at least this will be correct. + // Note that the LANG environment variable is overridden by LC_* + setenv("LC_NUMERIC", "C", 1); + setlocale(LC_ALL, "C"); + + Args = new FArgs(argc, argv); + + NSString* exePath = [[NSBundle mainBundle] executablePath]; + progdir = [[exePath stringByDeletingLastPathComponent] UTF8String]; + progdir += "/"; + + return GameMain(); } diff --git a/src/common/platform/posix/cocoa/i_system.mm b/src/common/platform/posix/cocoa/i_system.mm index d4c28624c..a533c1ffc 100644 --- a/src/common/platform/posix/cocoa/i_system.mm +++ b/src/common/platform/posix/cocoa/i_system.mm @@ -54,7 +54,7 @@ void CalculateCPUSpeed() PerfToSec = 1.0 / frequency; PerfToMillisec = 1000.0 / frequency; - if (!batchrun) + if (!batchrun && !RunningAsTool) { Printf("CPU speed: %.0f MHz\n", 0.001 / PerfToMillisec); } diff --git a/src/common/platform/posix/sdl/i_main.cpp b/src/common/platform/posix/sdl/i_main.cpp index 988a12b83..fa8ca2525 100644 --- a/src/common/platform/posix/sdl/i_main.cpp +++ b/src/common/platform/posix/sdl/i_main.cpp @@ -53,13 +53,8 @@ #include "i_interface.h" #include "printf.h" -// MACROS ------------------------------------------------------------------ - -// TYPES ------------------------------------------------------------------- - -// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- - extern "C" int cc_install_handlers(int, char**, int, int*, const char*, int(*)(char*, char*)); +extern bool RunningAsTool; #ifdef __APPLE__ void Mac_I_FatalError(const char* errortext); @@ -69,26 +64,11 @@ void Mac_I_FatalError(const char* errortext); void Linux_I_FatalError(const char* errortext); #endif -// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- int GameMain(); -// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- - -// EXTERNAL DATA DECLARATIONS ---------------------------------------------- - -// PUBLIC DATA DEFINITIONS ------------------------------------------------- FString sys_ostype; - -// The command line arguments. FArgs *Args; -// PRIVATE DATA DEFINITIONS ------------------------------------------------ - - -// CODE -------------------------------------------------------------------- - - - static int GetCrashInfo (char *buffer, char *end) { if (sysCallbacks.CrashInfo) sysCallbacks.CrashInfo(buffer, end - buffer, "\n"); @@ -146,7 +126,7 @@ void I_DetectOS() void I_StartupJoysticks(); -int I_GameMain(int argc, char** argv) +void InitCrashReporter() { #if !defined (__APPLE__) { @@ -154,35 +134,36 @@ int I_GameMain(int argc, char** argv) cc_install_handlers(argc, argv, 4, s, GAMENAMELOWERCASE "-crash.log", GetCrashInfo); } #endif // !__APPLE__ +} - printf(GAMENAME" %s - %s - SDL version\nCompiled on %s\n", - GetVersionString(), GetGitTime(), __DATE__); +void SetEffectiveUser() +{ + seteuid(getuid()); +} - seteuid (getuid ()); +void InitLocale() +{ // Set LC_NUMERIC environment variable in case some library decides to // clear the setlocale call at least this will be correct. // Note that the LANG environment variable is overridden by LC_* - setenv ("LC_NUMERIC", "C", 1); - - setlocale (LC_ALL, "C"); - - if (SDL_Init (0) < 0) - { - fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); - return -1; - } - - printf("\n"); + setenv("LC_NUMERIC", "C", 1); + setlocale(LC_ALL, "C"); +} +void InitArgs(int argc, char** argv) +{ Args = new FArgs(argc, argv); +} +void InitExePath() +{ #ifdef PROGDIR progdir = PROGDIR; #else char program[PATH_MAX]; - if (realpath (argv[0], program) == NULL) - strcpy (program, argv[0]); - char *slash = strrchr (program, '/'); + if (realpath(argv[0], program) == NULL) + strcpy(program, argv[0]); + char* slash = strrchr(program, '/'); if (slash != NULL) { *(slash + 1) = '\0'; @@ -193,6 +174,26 @@ int I_GameMain(int argc, char** argv) progdir = "./"; } #endif +} + +int I_GameMain(int argc, char** argv) +{ + InitCrashReporter(); + SetEffectiveUser(); + InitLocale(); + + printf(GAMENAME" %s - %s - SDL version\nCompiled on %s\n", GetVersionString(), GetGitTime(), __DATE__); + + if (SDL_Init (0) < 0) + { + fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); + return -1; + } + + printf("\n"); + + InitArgs(argc, argv); + InitExePath(); I_StartupJoysticks(); @@ -205,5 +206,13 @@ int I_GameMain(int argc, char** argv) int I_ToolMain(int argc, char** argv) { - return I_GameMain(argc, argv); + RunningAsTool = true; + + InitCrashReporter(); + SetEffectiveUser(); + InitLocale(); + InitArgs(argc, argv); + InitExePath(); + + return GameMain(); } diff --git a/src/common/platform/posix/sdl/i_system.cpp b/src/common/platform/posix/sdl/i_system.cpp index 3f2dd6a8c..847f92495 100644 --- a/src/common/platform/posix/sdl/i_system.cpp +++ b/src/common/platform/posix/sdl/i_system.cpp @@ -196,7 +196,7 @@ void CalculateCPUSpeed() PerfAvailable = true; PerfToSec = .000001/mhz; PerfToMillisec = PerfToSec*1000.; - if (!batchrun) Printf("CPU speed: %.0f MHz\n", mhz); + if (!batchrun && !RunningAsTool) Printf("CPU speed: %.0f MHz\n", mhz); close(fd); #endif } diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index 9d69a9a45..2ddec159c 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -95,6 +95,7 @@ void DestroyCustomCursor(); int GameMain(); extern UINT TimerPeriod; +extern bool RunningAsTool; // The command line arguments. FArgs *Args; @@ -140,16 +141,15 @@ bool isConsoleApp() return returnvalue; } -//========================================================================== - -int DoMain (HINSTANCE hInstance) +void InitComAndCommonControls() { - LONG WinWidth, WinHeight; - int height, width, x, y; - RECT cRect; - TIMECAPS tc; - DEVMODE displaysettings; + InitCommonControls(); + if (SUCCEEDED(CoInitialize(nullptr))) + atexit([]() { CoUninitialize(); }); // beware of calling convention. +} +void InitArgs() +{ // Do not use the multibyte __argv here because we want UTF-8 arguments // and those can only be done by converting the Unicode variants. Args = new FArgs(); @@ -159,6 +159,51 @@ int DoMain (HINSTANCE hInstance) { Args->AppendArg(FString(wargv[i])); } +} + +void InitTimer() +{ + // Set the timer to be as accurate as possible + TIMECAPS tc; + if (timeGetDevCaps(&tc, sizeof(tc)) != TIMERR_NOERROR) + TimerPeriod = 1; // Assume minimum resolution of 1 ms + else + TimerPeriod = tc.wPeriodMin; + + timeBeginPeriod(TimerPeriod); + atexit([]() { timeEndPeriod(TimerPeriod); }); +} + +void InitExePath() +{ + // Figure out what directory the program resides in. + WCHAR progbuff[1024]; + if (GetModuleFileNameW(nullptr, progbuff, 1024) == 0) + { + MessageBoxA(nullptr, "Fatal", "Could not determine program location.", MB_ICONEXCLAMATION | MB_OK); + exit(-1); + } + + progbuff[1023] = '\0'; + if (auto lastsep = wcsrchr(progbuff, '\\')) + { + lastsep[1] = '\0'; + } + + progdir = progbuff; + FixPathSeperator(progdir); +} + +//========================================================================== + +int DoMain (HINSTANCE hInstance) +{ + LONG WinWidth, WinHeight; + int height, width, x, y; + RECT cRect; + DEVMODE displaysettings; + + InitArgs(); if (isConsoleApp()) { @@ -171,7 +216,7 @@ int DoMain (HINSTANCE hInstance) if (GetConsoleMode(StdOut, &mode)) { - if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) + if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT)) FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. } } @@ -223,31 +268,8 @@ int DoMain (HINSTANCE hInstance) } } - // Set the timer to be as accurate as possible - if (timeGetDevCaps (&tc, sizeof(tc)) != TIMERR_NOERROR) - TimerPeriod = 1; // Assume minimum resolution of 1 ms - else - TimerPeriod = tc.wPeriodMin; - - timeBeginPeriod (TimerPeriod); - atexit([](){ timeEndPeriod(TimerPeriod); }); - - // Figure out what directory the program resides in. - WCHAR progbuff[1024]; - if (GetModuleFileNameW(nullptr, progbuff, 1024) == 0) - { - MessageBoxA(nullptr, "Fatal", "Could not determine program location.", MB_ICONEXCLAMATION|MB_OK); - exit(-1); - } - - progbuff[1023] = '\0'; - if (auto lastsep = wcsrchr(progbuff, '\\')) - { - lastsep[1] = '\0'; - } - - progdir = progbuff; - FixPathSeperator(progdir); + InitTimer(); + InitExePath(); HDC screenDC = GetDC(0); int dpi = GetDeviceCaps(screenDC, LOGPIXELSX); @@ -323,13 +345,13 @@ void I_ShowFatalError(const char *msg) Printf("%s", CVMAbortException::stacktrace.GetChars()); } - if (!batchrun) + if (!batchrun && !RunningAsTool) { mainwindow.ShowErrorPane(msg); } else { - Printf("%s\n", msg); + Printf(TEXTCOLOR_ORANGE "%s\n", msg); } } @@ -344,10 +366,7 @@ int I_GameMain(HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int nCmdS { g_hInst = hInstance; - InitCommonControls(); - - if (SUCCEEDED(CoInitialize(nullptr))) - atexit([]() { CoUninitialize(); }); // beware of calling convention. + InitComAndCommonControls(); #if defined(_DEBUG) && defined(_MSC_VER) // Uncomment this line to make the Visual C++ CRT check the heap before @@ -383,17 +402,33 @@ int I_GameMain(HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int nCmdS int I_ToolMain(HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int nCmdShow) { g_hInst = hInstance; + RunningAsTool = true; - InitCommonControls(); - if (SUCCEEDED(CoInitialize(nullptr))) - atexit([]() { CoUninitialize(); }); // beware of calling convention. + InitComAndCommonControls(); FString reportsDirectory = GetKnownFolder(CSIDL_LOCAL_APPDATA, FOLDERID_LocalAppData, true); reportsDirectory += "/" GAMENAMELOWERCASE; reportsDirectory += "/crashreports"; CreatePath(reportsDirectory.GetChars()); - InitCrashReporter(reportsDirectory.WideString(), {}); - return DoMain(hInstance); + InitArgs(); + + StdOut = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + + DWORD mode; + if (GetConsoleMode(StdOut, &mode)) + { + if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT)) + FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. + } + + InitTimer(); + InitExePath(); + + int res = GameMain(); + SetConsoleMode(StdOut, mode); + return res; } diff --git a/src/common/platform/win32/i_specialpaths.cpp b/src/common/platform/win32/i_specialpaths.cpp index 8862024b7..ffb9c9ddf 100644 --- a/src/common/platform/win32/i_specialpaths.cpp +++ b/src/common/platform/win32/i_specialpaths.cpp @@ -47,6 +47,7 @@ #include "gstrings.h" #include "i_mainwindow.h" #include "engineerrors.h" +#include "i_interface.h" static int isportable = -1; @@ -98,7 +99,7 @@ bool IsPortable() if (file != INVALID_HANDLE_VALUE) { CloseHandle(file); - if (!batchrun) Printf("Using portable configuration\n"); + if (!batchrun && !RunningAsTool) Printf("Using portable configuration\n"); isportable = true; return true; } diff --git a/src/common/platform/win32/i_system.cpp b/src/common/platform/win32/i_system.cpp index e36a2caaa..a2b48dda7 100644 --- a/src/common/platform/win32/i_system.cpp +++ b/src/common/platform/win32/i_system.cpp @@ -203,7 +203,7 @@ void I_DetectOS(void) break; } - if (!batchrun) Printf ("OS: Windows %s (NT %lu.%lu) Build %lu\n %s\n", + if (!batchrun && !RunningAsTool) Printf ("OS: Windows %s (NT %lu.%lu) Build %lu\n %s\n", osname, info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.szCSDVersion); @@ -264,7 +264,7 @@ void CalculateCPUSpeed() PerfToMillisec = PerfToSec * 1000.0; } - if (!batchrun) Printf ("CPU speed: %.0f MHz\n", 0.001 / PerfToMillisec); + if (!batchrun && !RunningAsTool) Printf ("CPU speed: %.0f MHz\n", 0.001 / PerfToMillisec); } //========================================================================== @@ -276,24 +276,40 @@ void CalculateCPUSpeed() // //========================================================================== +std::wstring to_utf16(const std::string& str) +{ + if (str.empty()) return {}; + int needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0); + if (needed == 0) + return {}; + std::wstring result; + result.resize(needed); + needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), &result[0], (int)result.size()); + if (needed == 0) + return {}; + return result; +} + static void PrintToStdOut(const char *cpt, HANDLE StdOut) { const char* srcp = cpt; FString printData = ""; bool terminal = FancyStdOut; + bool colorSet = false; while (*srcp != 0) { if (*srcp == 0x1c && terminal) { srcp += 1; - const uint8_t* scratch = (const uint8_t*)srcp; // GCC does not like direct casting of the parameter. + const uint8_t* scratch = (const uint8_t*)srcp; EColorRange range = V_ParseFontColor(scratch, CR_UNTRANSLATED, CR_YELLOW); srcp = (char*)scratch; if (range != CR_UNDEFINED) { PalEntry color = V_LogColorFromColorRange(range); - printData.AppendFormat("\033[38;2;%u;%u;%um", color.r, color.g, color.b); + printData.AppendFormat("\x1b[38;2;%u;%u;%um", color.r, color.g, color.b); + colorSet = true; } } else if (*srcp != 0x1c && *srcp != 0x1d && *srcp != 0x1e && *srcp != 0x1f) @@ -307,10 +323,11 @@ static void PrintToStdOut(const char *cpt, HANDLE StdOut) } } + if (colorSet) + printData += "\x1b[0m"; + DWORD bytes_written; - WriteFile(StdOut, printData.GetChars(), (DWORD)printData.Len(), &bytes_written, NULL); - if (terminal) - WriteFile(StdOut, "\033[0m", 4, &bytes_written, NULL); + WriteFile(StdOut, printData.GetChars(), (DWORD)printData.Len(), &bytes_written, nullptr); } void I_PrintStr(const char *cp) diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 6ce60d30b..cde54626f 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -757,6 +757,12 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char if (alwaysshow || picks.Size() > 1) { + if (RunningAsTool) + { + Printf("Please specify which iwad to use with -iwad\n"); + return -1; + } + // Locate the user's prefered IWAD, if it was found. if (defaultiwad[0] != '\0') { diff --git a/src/d_main.cpp b/src/d_main.cpp index 6cf86d3bd..8af45de10 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -313,7 +313,7 @@ CUSTOM_CVAR(Int, I_FriendlyWindowTitle, 1, CVAR_GLOBALCONFIG|CVAR_ARCHIVE|CVAR_N } CVAR(Bool, cl_nointros, false, CVAR_ARCHIVE) - +bool RunningAsTool = false; bool hud_toggled = false; bool wantToRestart; bool DrawFSHUD; // [RH] Draw fullscreen HUD? @@ -2035,7 +2035,7 @@ static void D_DoomInit() gamestate = GS_STARTUP; - if (!batchrun) Printf ("M_LoadDefaults: Load system defaults.\n"); + if (!batchrun && !RunningAsTool) Printf ("M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults (); // load before initing other systems } @@ -2126,7 +2126,7 @@ static void CheckCmdLine() int p; const char *v; - if (!batchrun) Printf ("Checking cmd-line parameters...\n"); + if (!batchrun && !RunningAsTool) Printf ("Checking cmd-line parameters...\n"); if (Args->CheckParm ("-nomonsters")) flags |= DF_NO_MONSTERS; if (Args->CheckParm ("-respawn")) flags |= DF_MONSTERS_RESPAWN; if (Args->CheckParm ("-fast")) flags |= DF_FAST_MONSTERS; @@ -3147,7 +3147,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw { rngseed = staticrngseed = atoi(v); use_staticrng = true; - if (!batchrun) Printf("D_DoomInit: Static RNGseed %d set.\n", rngseed); + if (!batchrun && !RunningAsTool) Printf("D_DoomInit: Static RNGseed %d set.\n", rngseed); } else { @@ -3184,7 +3184,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw exec->AddPullins(allwads, GameConfig); } - if (!batchrun) Printf ("W_Init: Init WADfiles.\n"); + if (!batchrun && !RunningAsTool) Printf ("W_Init: Init WADfiles.\n"); LumpFilterInfo lfi; @@ -3244,12 +3244,12 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw D_GrabCVarDefaults(); //parse DEFCVARS InitPalette(); - if (!batchrun) Printf("S_Init: Setting up sound.\n"); + if (!batchrun && !RunningAsTool) Printf("S_Init: Setting up sound.\n"); S_Init(); int max_progress = TexMan.GuesstimateNumTextures(); int per_shader_progress = 0;//screen->GetShaderCount()? (max_progress / 10 / screen->GetShaderCount()) : 0; - bool nostartscreen = batchrun || restart || Args->CheckParm("-join") || Args->CheckParm("-host") || Args->CheckParm("-norun"); + bool nostartscreen = RunningAsTool || batchrun || restart || Args->CheckParm("-join") || Args->CheckParm("-host") || Args->CheckParm("-norun"); if (GameStartupInfo.Type == FStartupInfo::DefaultStartup) { @@ -3288,7 +3288,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw if (!restart) { - if (!batchrun) Printf ("I_Init: Setting up machine state.\n"); + if (!batchrun && !RunningAsTool) Printf ("I_Init: Setting up machine state.\n"); CheckCPUID(&CPU); CalculateCPUSpeed(); auto ci = DumpCPUInfo(&CPU); @@ -3297,7 +3297,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw TexMan.Init(); - if (!batchrun) Printf ("V_Init: allocate screen.\n"); + if (!batchrun && !RunningAsTool) Printf ("V_Init: allocate screen.\n"); if (!restart) { screen->CompileNextShader(); @@ -3319,7 +3319,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw compatmode = (int)strtoll(compatmodeval, nullptr, 10); } - if (!batchrun) Printf ("ST_Init: Init startup screen.\n"); + if (!batchrun && !RunningAsTool) Printf ("ST_Init: Init startup screen.\n"); if (!restart) { StartWindow = FStartupScreen::CreateInstance (TexMan.GuesstimateNumTextures() + 5); @@ -3335,11 +3335,11 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw S_ParseReverbDef (); // [RH] Parse any SNDINFO lumps - if (!batchrun) Printf ("S_InitData: Load sound definitions.\n"); + if (!batchrun && !RunningAsTool) Printf ("S_InitData: Load sound definitions.\n"); S_InitData (); // [RH] Parse through all loaded mapinfo lumps - if (!batchrun) Printf ("G_ParseMapInfo: Load map definitions.\n"); + if (!batchrun && !RunningAsTool) Printf ("G_ParseMapInfo: Load map definitions.\n"); G_ParseMapInfo (iwad_info->MapInfo); MessageBoxClass = gameinfo.MessageBoxClass; endoomName = gameinfo.Endoom; @@ -3349,7 +3349,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw // MUSINFO must be parsed after MAPINFO S_ParseMusInfo(); - if (!batchrun) Printf ("Texman.Init: Init texture manager.\n"); + if (!batchrun && !RunningAsTool) Printf ("Texman.Init: Init texture manager.\n"); UpdateUpscaleMask(); SpriteFrames.Clear(); TexMan.AddTextures([]() @@ -3371,7 +3371,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw UpdateGenericUI(false); // [CW] Parse any TEAMINFO lumps. - if (!batchrun) Printf ("ParseTeamInfo: Load team definitions.\n"); + if (!batchrun && !RunningAsTool) Printf ("ParseTeamInfo: Load team definitions.\n"); FTeam::ParseTeamInfo (); R_ParseTrnslate(); @@ -3397,13 +3397,13 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw ParseGLDefs(); - if (!batchrun) Printf ("R_Init: Init %s refresh subsystem.\n", gameinfo.ConfigName.GetChars()); + if (!batchrun && !RunningAsTool) Printf ("R_Init: Init %s refresh subsystem.\n", gameinfo.ConfigName.GetChars()); if (StartScreen) StartScreen->LoadingStatus ("Loading graphics", 0x3f); if (StartScreen) StartScreen->Progress(1); StartWindow->Progress(); R_Init (); - if (!batchrun) Printf ("DecalLibrary: Load decals.\n"); + if (!batchrun && !RunningAsTool) Printf ("DecalLibrary: Load decals.\n"); DecalLibrary.ReadAllDecals (); auto numbasesounds = soundEngine->GetNumSounds(); @@ -3425,7 +3425,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw { if (stricmp (key, "Path") == 0 && FileExists (value)) { - if (!batchrun) Printf ("Applying patch %s\n", value); + if (!batchrun && !RunningAsTool) Printf ("Applying patch %s\n", value); D_LoadDehFile(value, 0); } } @@ -3440,7 +3440,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw auto numdehsounds = soundEngine->GetNumSounds(); if (numbasesounds < numdehsounds) S_LockLocalSndinfo(); // DSDHacked sounds are not compatible with map-local SNDINFOs. - if (!batchrun) Printf("M_Init: Init menus.\n"); + if (!batchrun && !RunningAsTool) Printf("M_Init: Init menus.\n"); SetDefaultMenuColors(); M_Init(); M_CreateGameMenus(); @@ -3465,7 +3465,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw primaryLevel->BotInfo.spawn_tries = 0; primaryLevel->BotInfo.wanted_botnum = primaryLevel->BotInfo.getspawned.Size(); - if (!batchrun) Printf ("P_Init: Init Playloop state.\n"); + if (!batchrun && !RunningAsTool) Printf ("P_Init: Init Playloop state.\n"); if (StartScreen) StartScreen->LoadingStatus ("Init game engine", 0x3f); AM_StaticInit(); P_Init (); @@ -3475,7 +3475,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw //SBarInfo support. Note that the first SBARINFO lump contains the mugshot definition so it even needs to be read when a regular status bar is being used. SBarInfo::Load(); - if (!batchrun) + if (!batchrun && !RunningAsTool) { // [RH] User-configurable startup strings. Because BOOM does. static const char *startupString[5] = { @@ -3494,7 +3494,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw if (!restart) { - if (!batchrun) Printf ("D_CheckNetGame: Checking network game status.\n"); + if (!batchrun && !RunningAsTool) Printf ("D_CheckNetGame: Checking network game status.\n"); if (StartScreen) StartScreen->LoadingStatus ("Checking network game status.", 0x3f); if (!D_CheckNetGame ()) { @@ -3537,6 +3537,12 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw return 1337; // special exit } + if (RunningAsTool) + { + // To do: is enough of the engine initialized now for running tool commandlets? + return 0; + } + if (StartScreen) { StartScreen->Progress(max_progress); // advance progress bar to the end. diff --git a/src/d_net.cpp b/src/d_net.cpp index b785b52e2..e56c08d6a 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -1766,7 +1766,7 @@ bool D_CheckNetGame (void) Printf("Arbitrator selected " TEXTCOLOR_BLUE "%s" TEXTCOLOR_NORMAL " networking mode.\n", NetMode == NET_PeerToPeer ? "peer to peer" : "packet server"); } - if (!batchrun) Printf ("player %i of %i (%i nodes)\n", + if (!batchrun && !RunningAsTool) Printf ("player %i of %i (%i nodes)\n", consoleplayer+1, doomcom.numplayers, doomcom.numnodes); return true; diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 82aba4263..7fa35f659 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -448,7 +448,7 @@ void SBarInfo::Load() int lump = fileSystem.CheckNumForFullName(gameinfo.statusbar.GetChars(), true); if(lump != -1) { - if (!batchrun) Printf ("ParseSBarInfo: Loading default status bar definition.\n"); + if (!batchrun && !RunningAsTool) Printf ("ParseSBarInfo: Loading default status bar definition.\n"); if(SBarInfoScript[SCRIPT_DEFAULT] == NULL) SBarInfoScript[SCRIPT_DEFAULT] = new SBarInfo(lump); else @@ -458,7 +458,7 @@ void SBarInfo::Load() if(fileSystem.CheckNumForName("SBARINFO") != -1) { - if (!batchrun) Printf ("ParseSBarInfo: Loading custom status bar definition.\n"); + if (!batchrun && !RunningAsTool) Printf ("ParseSBarInfo: Loading custom status bar definition.\n"); int lastlump, lump; lastlump = 0; while((lump = fileSystem.FindLump("SBARINFO", &lastlump)) != -1) diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index 8ddcc7935..9d8dc2106 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -3225,7 +3225,7 @@ bool D_LoadDehFile(const char *patchfile, int flags) static bool DoDehPatch(int flags) { - if (!batchrun) Printf("Adding dehacked patch %s\n", PatchName.GetChars()); + if (!batchrun && !RunningAsTool) Printf("Adding dehacked patch %s\n", PatchName.GetChars()); int cont; @@ -3320,7 +3320,7 @@ static bool DoDehPatch(int flags) PatchName = ""; delete[] PatchFile; - if (!batchrun) Printf ("Patch installed\n"); + if (!batchrun && !RunningAsTool) Printf ("Patch installed\n"); return true; } diff --git a/src/gamedata/info.cpp b/src/gamedata/info.cpp index 67fb87f67..82fc13dea 100644 --- a/src/gamedata/info.cpp +++ b/src/gamedata/info.cpp @@ -393,7 +393,7 @@ void PClassActor::StaticInit() sprites.Push (temp); } - if (!batchrun) Printf ("LoadActors: Load actor definitions.\n"); + if (!batchrun && !RunningAsTool) Printf ("LoadActors: Load actor definitions.\n"); ClearStrifeTypes(); LoadActors (); InitServices(); diff --git a/src/scripting/thingdef.cpp b/src/scripting/thingdef.cpp index bdec840f5..676e05cea 100644 --- a/src/scripting/thingdef.cpp +++ b/src/scripting/thingdef.cpp @@ -55,6 +55,7 @@ #include "thingdef.h" #include "zcc_parser.h" #include "zcc_compile_doom.h" +#include "i_interface.h" // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- void InitThingdef(); @@ -545,7 +546,7 @@ void LoadActors() } timer.Unclock(); - if (!batchrun) Printf("script parsing took %.2f ms\n", timer.TimeMS()); + if (!batchrun && !RunningAsTool) Printf("script parsing took %.2f ms\n", timer.TimeMS()); // Now we may call the scripted OnDestroy method. PClass::bVMOperational = true;