From 04ea28defc85c09e44fbc317d1762f96335842cf Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 30 Jan 2023 16:45:03 -0500 Subject: [PATCH] - add RedirectCVAR directive for loading alternate maps based on a Bool CVAR setting --- src/g_level.cpp | 6 ++++++ src/gamedata/g_mapinfo.cpp | 32 ++++++++++++++++++++++++++++++++ src/gamedata/g_mapinfo.h | 5 +++++ 3 files changed, 43 insertions(+) diff --git a/src/g_level.cpp b/src/g_level.cpp index 0a19c44fa..208913566 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -557,6 +557,12 @@ void G_InitNew (const char *mapname, bool bTitleLevel) // [RH] Mark all levels as not visited for (unsigned int i = 0; i < wadlevelinfos.Size(); i++) wadlevelinfos[i].flags = wadlevelinfos[i].flags & ~LEVEL_VISITED; + + auto redirectmap = FindLevelInfo(mapname); + if (redirectmap->RedirectCVAR != NAME_None) + redirectmap = redirectmap->CheckLevelRedirect(); + if (redirectmap) + mapname = redirectmap->MapName; } UnlatchCVars (); diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index e2848c015..e85803af6 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -274,6 +274,8 @@ void level_info_t::Reset() Translator = ""; RedirectType = NAME_None; RedirectMapName = ""; + RedirectCVAR = NAME_None; + RedirectCVARMapName = ""; EnterPic = ""; ExitPic = ""; Intermission = NAME_None; @@ -388,6 +390,27 @@ level_info_t *level_info_t::CheckLevelRedirect () } } } + if (RedirectCVAR != NAME_None) + { + auto var = FindCVar(RedirectCVAR.GetChars(), NULL); + if ((var->GetRealType() == CVAR_Bool) && !(var->GetFlags() & CVAR_IGNORE)) // only check Bool cvars that are currently defined + { + if (var->GetFlags() & CVAR_USERINFO) + { + // user sync'd cvar, check for all players + for (int i = 0; i < MAXPLAYERS; ++i) + { + if (playeringame[i] && (var = GetCVar(i, RedirectCVAR.GetChars()))) + { + if (var->ToInt()) + return FindLevelInfo(RedirectCVARMapName); + } + } + } + else if (var->ToInt()) + return FindLevelInfo(RedirectCVARMapName); + } + } return NULL; } @@ -1299,6 +1322,15 @@ DEFINE_MAP_OPTION(redirect, true) parse.ParseNextMap(info->RedirectMapName); } +DEFINE_MAP_OPTION(cvar_redirect, true) +{ + parse.ParseAssign(); + parse.sc.MustGetString(); + info->RedirectCVAR = parse.sc.String; + parse.ParseComma(); + parse.ParseNextMap(info->RedirectCVARMapName); +} + DEFINE_MAP_OPTION(sndseq, true) { parse.ParseAssign(); diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index 166a53439..f9e97e0c5 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -380,6 +380,11 @@ struct level_info_t FName RedirectType; FString RedirectMapName; + // CVAR Redirection: If the CVAR Bool returns true, then + // you go to the RedirectMap instead of this one. + FName RedirectCVAR; + FString RedirectCVARMapName; + FString EnterPic; FString ExitPic; FString InterMusic;