vkdoom_m/src/common/engine/i_interface.cpp
Boondorl 66c5beccbd Added UUID for game sessions
Allows the SavegameManager to destroy all saves related to the current UUID session so hardcore mods can enforce this safely instead of needing to go nuclear.
2025-07-26 11:43:59 -03:00

194 lines
5.9 KiB
C++

#include "i_interface.h"
#include "st_start.h"
#include "gamestate.h"
#include "startupinfo.h"
#include "c_cvars.h"
#include "gstrings.h"
#include "version.h"
#include "m_argv.h"
#include "m_random.h"
static_assert(sizeof(void*) == 8,
"Only LP64/LLP64 builds are officially supported. "
"Please do not attempt to build for other platforms; "
"even if the program succeeds in a MAP01 smoke test, "
"there are e.g. known visual artifacts "
"<https://forum.zdoom.org/viewtopic.php?f=7&t=75673> "
"that lead to a bad user experience.");
// Some global engine variables taken out of the backend code.
FStartupScreen* StartWindow;
SystemCallbacks sysCallbacks;
FString endoomName;
bool batchrun;
float menuBlurAmount;
bool AppActive = true;
int chatmodeon;
gamestate_t gamestate = GS_STARTUP;
bool ToggleFullscreen;
int paused;
bool pauseext;
FStartupInfo GameStartupInfo;
CVAR(Bool, vid_fps, false, 0)
CVAR(Bool, queryiwad, QUERYIWADDEFAULT, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, saveargs, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, savenetfile, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, savenetargs, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(String, defaultiwad, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(String, defaultargs, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(String, defaultnetiwad, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(String, defaultnetargs, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnetplayers, 8, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnethostport, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnetticdup, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnetmode, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnetgamemode, -1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, defaultnetaltdm, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(String, defaultnetaddress, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnetjoinport, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnetpage, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnethostteam, 255, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, defaultnetjointeam, 255, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, defaultnetextratic, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(String, defaultnetsavefile, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
EXTERN_CVAR(Bool, ui_generic)
EXTERN_CVAR(Int, vid_preferbackend)
EXTERN_CVAR(Bool, vid_fullscreen)
CUSTOM_CVAR(String, language, "auto", CVAR_ARCHIVE | CVAR_NOINITCALL | CVAR_GLOBALCONFIG)
{
GStrings.UpdateLanguage(self);
UpdateGenericUI(ui_generic);
if (sysCallbacks.LanguageChanged) sysCallbacks.LanguageChanged(self);
}
// Some of this info has to be passed and managed from the front end since it's game-engine specific.
FStartupSelectionInfo::FStartupSelectionInfo(const TArray<WadStuff>& wads, FArgs& args, int startFlags) : Wads(&wads), Args(&args), DefaultStartFlags(startFlags)
{
DefaultQueryIWAD = queryiwad;
DefaultLanguage = language;
DefaultBackend = vid_preferbackend;
DefaultFullscreen = vid_fullscreen;
if (defaultiwad[0] != '\0')
{
for (int i = 0; i < wads.SSize(); ++i)
{
if (!wads[i].Name.CompareNoCase(defaultiwad))
{
DefaultIWAD = i;
break;
}
}
}
DefaultArgs = defaultargs;
bSaveArgs = saveargs;
if (defaultnetiwad[0] != '\0')
{
for (int i = 0; i < wads.SSize(); ++i)
{
if (!wads[i].Name.CompareNoCase(defaultnetiwad))
{
DefaultNetIWAD = i;
break;
}
}
}
DefaultNetArgs = defaultnetargs;
DefaultNetPage = defaultnetpage;
DefaultNetSaveFile = defaultnetsavefile;
bSaveNetFile = savenetfile;
bSaveNetArgs = savenetargs;
DefaultNetPlayers = defaultnetplayers;
DefaultNetHostPort = defaultnethostport;
DefaultNetTicDup = defaultnetticdup;
DefaultNetMode = defaultnetmode;
DefaultNetGameMode = defaultnetgamemode;
DefaultNetAltDM = defaultnetaltdm;
DefaultNetHostTeam = defaultnethostteam;
DefaultNetExtraTic = defaultnetextratic;
DefaultNetAddress = defaultnetaddress;
DefaultNetJoinPort = defaultnetjoinport;
DefaultNetJoinTeam = defaultnetjointeam;
}
// Return whatever IWAD the user selected.
int FStartupSelectionInfo::SaveInfo()
{
DefaultLanguage.StripLeftRight();
DefaultArgs.StripLeftRight();
DefaultNetArgs.StripLeftRight();
AdditionalNetArgs.StripLeftRight();
DefaultNetAddress.StripLeftRight();
DefaultNetSaveFile.StripLeftRight();
queryiwad = DefaultQueryIWAD;
language = DefaultLanguage.GetChars();
vid_fullscreen = DefaultFullscreen;
if (DefaultBackend != vid_preferbackend)
vid_preferbackend = DefaultBackend;
if (bNetStart)
{
savenetfile = bSaveNetFile;
savenetargs = bSaveNetArgs;
defaultnetiwad = (*Wads)[DefaultNetIWAD].Name.GetChars();
defaultnetpage = DefaultNetPage;
defaultnetsavefile = savenetfile ? DefaultNetSaveFile.GetChars() : "";
defaultnetargs = savenetargs ? DefaultNetArgs.GetChars() : "";
if (bHosting)
{
defaultnetplayers = DefaultNetPlayers;
defaultnethostport = DefaultNetHostPort;
defaultnetticdup = DefaultNetTicDup;
defaultnetmode = DefaultNetMode;
defaultnetgamemode = DefaultNetGameMode;
defaultnetaltdm = DefaultNetAltDM;
defaultnethostteam = DefaultNetHostTeam;
defaultnetextratic = DefaultNetExtraTic;
}
else
{
defaultnetaddress = DefaultNetAddress.GetChars();
defaultnetjoinport = DefaultNetJoinPort;
defaultnetjointeam = DefaultNetJoinTeam;
}
if (!DefaultNetArgs.IsEmpty())
Args->AppendArgsString(DefaultNetArgs);
if (!AdditionalNetArgs.IsEmpty())
Args->AppendArgsString(AdditionalNetArgs);
return DefaultNetIWAD;
}
defaultiwad = (*Wads)[DefaultIWAD].Name.GetChars();
saveargs = bSaveArgs;
defaultargs = saveargs ? DefaultArgs.GetChars() : "";
if (!DefaultArgs.IsEmpty())
Args->AppendArgsString(DefaultArgs);
return DefaultIWAD;
}
FString GameUUID;
static FRandom pr_uuid("GameUUID");
FString GenerateUUID()
{
FString uuid;
uuid.AppendFormat("%08X-%04X-4%03X-9%03X-%08X%04X", pr_uuid.GenRand32(), pr_uuid(UINT16_MAX), pr_uuid(4095), pr_uuid(4095), pr_uuid.GenRand32(), pr_uuid(UINT16_MAX));
return uuid;
}