From a90bc82959f3443ab98a88133e7ef2ca09b201b4 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 22 Dec 2022 15:45:16 -0500 Subject: [PATCH] - implement ability to change GameTicRate --- src/common/engine/startupinfo.h | 1 + src/d_iwad.cpp | 7 +++++++ src/d_main.cpp | 36 ++++++++++++++++++++++++++++++++- src/d_main.h | 4 ++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/common/engine/startupinfo.h b/src/common/engine/startupinfo.h index c0dd608c10..a132862ff2 100644 --- a/src/common/engine/startupinfo.h +++ b/src/common/engine/startupinfo.h @@ -13,6 +13,7 @@ struct FStartupInfo FString def; FString DiscordAppId = nullptr; FString SteamAppId = nullptr; + int TicRate = -1; int Type; int LoadLights = -1; int LoadBrightmaps = -1; diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 431c37813c..95afe670ee 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -255,6 +255,12 @@ void FIWadManager::ParseIWadInfo(const char *fn, const char *data, int datasize, sc.MustGetString(); iwad->SteamAppId = sc.String; } + else if (sc.Compare("TicRate")) + { + sc.MustGetStringName("="); + sc.MustGetNumber(); + iwad->TicRate = sc.Number; + } else { sc.ScriptError("Unknown keyword '%s'", sc.String); @@ -859,6 +865,7 @@ const FIWADInfo *FIWadManager::FindIWAD(TArray &wadfiles, const char *i if (GameStartupInfo.Song.IsEmpty()) GameStartupInfo.Song = iwad_info->Song; if (GameStartupInfo.DiscordAppId.IsEmpty()) GameStartupInfo.DiscordAppId = iwad_info->DiscordAppId; if (GameStartupInfo.SteamAppId.IsEmpty()) GameStartupInfo.SteamAppId = iwad_info->SteamAppId; + if (GameStartupInfo.TicRate == -1) GameStartupInfo.TicRate = iwad_info->TicRate; I_SetIWADInfo(); return iwad_info; } diff --git a/src/d_main.cpp b/src/d_main.cpp index d9177fbb47..a1b217f8ca 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1876,6 +1876,11 @@ static FString ParseGameInfo(TArray &pwads, const char *fn, const char sc.MustGetString(); GameStartupInfo.SteamAppId = sc.String; } + else if (!nextKey.CompareNoCase("TICRATE")) + { + sc.MustGetNumber(); + GameStartupInfo.TicRate = sc.Number; + } else { // Silently ignore unknown properties @@ -3654,9 +3659,16 @@ static int D_DoomMain_Internal (void) delete iwad_man; // now we won't need this anymore iwad_man = NULL; if (ret != 0) return ret; - + if ((GameStartupInfo.TicRate) != -1) + { + if (((GameStartupInfo.TicRate) < TICRATEMIN) || ((GameStartupInfo.TicRate) > TICRATEMAX)) + I_FatalError("TicRate can only be in the range of %i to %i! (Default TicRate for Doom engine games: 35)", TICRATEMIN, TICRATEMAX); + else + GameTicRate = GameStartupInfo.TicRate; + } D_DoAnonStats(); I_UpdateWindowTitle(); + D_DoomLoop (); // this only returns if a 'restart' CCMD is given. // // Clean up after a restart @@ -3669,6 +3681,28 @@ static int D_DoomMain_Internal (void) while (1); } +CCMD(debug_SetTicRate) +{ + if (argv.argc() < 2) + Printf("Current game ticrate is: %i\n", GameTicRate); + else + { + uint32_t value = atoi(argv[1]); + if (netgame) + Printf("Time scale cannot be changed in net games.\n"); + else if (value < TICRATEMIN) + Printf("TicRate must be at least %i!\n", TICRATEMIN); + else if (value > TICRATEMAX) + Printf("TicRate must be at most %i!\n", TICRATEMAX); + else + { + GameTicRate = value; + I_ResetFrameTime(); + Printf("Testing game tic rate: %i\n", value); + } + } +} + int GameMain() { int ret = 0; diff --git a/src/d_main.h b/src/d_main.h index a6f76a8d89..e8c658c61e 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -33,6 +33,9 @@ #include "startupinfo.h" #include "c_cvars.h" +#define TICRATEMIN 25 +#define TICRATEMAX 50 + extern bool advancedemo; extern bool hud_toggled; void D_ToggleHud(); @@ -95,6 +98,7 @@ struct FIWADInfo int LoadLights = -1; FString DiscordAppId = nullptr; FString SteamAppId = nullptr; + int TicRate = -1; }; struct FFoundWadInfo