diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 0d4a8da9d..2cdb92bd2 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3091,7 +3091,7 @@ static void Command_RandomMap(void) } else { - newgametype = cv_dummygametype.value; // Changed from cv_newgametype to match newmenus + newgametype = menugametype; newencoremode = false; newresetplayers = true; oldmapnum = -1; diff --git a/src/deh_soc.c b/src/deh_soc.c index 241ddb8eb..930ace846 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -920,9 +920,6 @@ void readgametype(MYFILE *f, char *gtname) gametypes[numgametypes++] = newgametype; - // Update gametype_cons_t accordingly. - G_UpdateGametypeSelections(); - CONS_Printf("Added gametype %s\n", gtname); } diff --git a/src/discord.c b/src/discord.c index b5c6a5a88..9d6011c11 100644 --- a/src/discord.c +++ b/src/discord.c @@ -499,7 +499,7 @@ void DRPC_UpdatePresence(void) else { snprintf(detailstr, 48, "%s%s%s", - gametype_cons_t[gametype].strvalue, + gametypes[gametype]->name, (gametyperules & GTR_CIRCUIT) ? va(" | %s", kartspeed_cons_t[gamespeed].strvalue) : "", (encoremode == true) ? " | Encore" : "" ); diff --git a/src/doomstat.h b/src/doomstat.h index e7ff2f093..7520342a9 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -519,11 +519,14 @@ enum GameTypeRules GTR_CLOSERPLAYERS = 1<<21, // Buffs spindash and draft power to bring everyone together, nerfs invincibility and grow to prevent excessive combos GTR_ENCORE = 1<<22, // Alternate Encore mirroring, scripting, and texture remapping GTR_SPECIALSTART = 1<<23, // White fade instant start + GTR_NOMP = 1<<24, // No multiplayer // free: to and including 1<<31 }; // Remember to update GAMETYPERULE_LIST in deh_soc.c +#define GTR_FORBIDMP (GTR_NOMP|GTR_CATCHER|GTR_BOSS) + // TODO: replace every instance #define gametyperules (gametypes[gametype]->rules) diff --git a/src/g_game.c b/src/g_game.c index 8ba6a4aa5..ac0190c4e 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3186,23 +3186,6 @@ char *G_PrepareGametypeConstant(const char *newgtconst) return gtconst; } -// -// G_UpdateGametypeSelections -// -// Updates gametype_cons_t. -// -void G_UpdateGametypeSelections(void) -{ - INT32 i; - for (i = 0; i < numgametypes; i++) - { - gametype_cons_t[i].value = i; - gametype_cons_t[i].strvalue = gametypes[i]->name; - } - gametype_cons_t[numgametypes].value = 0; - gametype_cons_t[numgametypes].strvalue = NULL; -} - tolinfo_t TYPEOFLEVEL[NUMTOLNAMES] = { {"RACE",TOL_RACE}, {"BATTLE",TOL_BATTLE}, diff --git a/src/g_game.h b/src/g_game.h index 5675da0dd..227274590 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -181,7 +181,6 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives); void G_SetGametype(INT16 gametype); char *G_PrepareGametypeConstant(const char *newgtconst); -void G_UpdateGametypeSelections(void); void G_AddTOL(UINT32 newtol, const char *tolname); INT32 G_GetGametypeByName(const char *gametypestr); INT32 G_GuessGametypeByTOL(UINT32 tol); diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 2a75663e2..dd682e1bd 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -16,7 +16,7 @@ #include "hu_stuff.h" #include "font.h" -#include "k_menu.h" // gametype_cons_t +#include "k_menu.h" // highlightflags #include "m_cond.h" // emblems #include "m_misc.h" // word jumping diff --git a/src/k_menu.h b/src/k_menu.h index 832e2146e..4dd5db602 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -115,7 +115,8 @@ struct menucolor_t { extern menucolor_t *menucolorhead, *menucolortail; -extern CV_PossibleValue_t gametype_cons_t[]; +extern INT16 menugametype; +void M_HandleMenuGametype(INT32 choice); // // MENU TYPEDEFS @@ -770,7 +771,6 @@ void M_MPOptSelect(INT32 choice); void M_MPOptSelectInit(INT32 choice); void M_MPOptSelectTick(void); boolean M_MPResetOpts(void); -extern consvar_t cv_dummygametype; // lazy hack to allow us to select the GT on the server host submenu extern consvar_t cv_dummyip; // I HAVE // HAVE YOUR IP ADDRESS (This just the hack Cvar we'll type into and then it apends itself to "connect" in the console for IP join) diff --git a/src/k_menudef.c b/src/k_menudef.c index b0de23761..374c44968 100644 --- a/src/k_menudef.c +++ b/src/k_menudef.c @@ -362,8 +362,8 @@ menuitem_t PLAY_MP_Host[] = {IT_STRING | IT_CVAR, "Max. Players", "Set how many players can play at once. Others will spectate.", NULL, {.cvar = &cv_maxplayers}, 0, 0}, - {IT_STRING | IT_CVAR, "Gamemode", "Are we racing? Or perhaps battling?", - NULL, {.cvar = &cv_dummygametype}, 0, 0}, + {IT_STRING | IT_KEYHANDLER, "Gamemode", "Choose the type of play on your server.", + NULL, {.routine = M_HandleMenuGametype}, 0, 0}, {IT_STRING | IT_CALL, "GO", "Select a map with the currently selected gamemode", NULL, {.routine = M_MPSetupNetgameMapSelect}, 0, 0}, diff --git a/src/k_menudraw.c b/src/k_menudraw.c index f47689f8b..4087fdd7a 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -2466,6 +2466,20 @@ void M_DrawMPHost(void) } break; } + case IT_KEYHANDLER: + { + if (currentMenu->menuitems[i].itemaction.routine != M_HandleMenuGametype) + break; + + w = V_ThinStringWidth(gametypes[menugametype]->name, V_6WIDTHSPACE); + V_DrawThinString(xp + 138 - w, yp, highlightflags|V_6WIDTHSPACE, gametypes[menugametype]->name); + if (i == itemOn) + { + V_DrawCharacter(xp + 138 - 10 - w - (skullAnimCounter/5), yp, '\x1C' | highlightflags, false); // left arrow + V_DrawCharacter(xp + 138 + 2 + (skullAnimCounter/5), yp, '\x1D' | highlightflags, false); // right arrow + } + break; + } } xp += 5; diff --git a/src/k_menufunc.c b/src/k_menufunc.c index abd3baa99..0cd21d572 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -147,10 +147,6 @@ consvar_t cv_menujam_update = CVAR_INIT ("menujam_update", "Off", CV_SAVE, CV_On static CV_PossibleValue_t menujam_cons_t[] = {{0, "menu"}, {1, "menu2"}, {2, "menu3"}, {0, NULL}}; static consvar_t cv_menujam = CVAR_INIT ("menujam", "0", CV_SAVE, menujam_cons_t, NULL); -// This gametype list is integral for many different reasons. -// When you add gametypes here, don't forget to update them in dehacked.c and doomstat.h! -CV_PossibleValue_t gametype_cons_t[MAXGAMETYPES+1]; - static CV_PossibleValue_t serversort_cons_t[] = { {0,"Ping"}, {1,"AVG. Power Level"}, @@ -189,18 +185,18 @@ static CV_PossibleValue_t dummyteam_cons_t[] = {{0, "Spectator"}, {1, "Red"}, {2 static CV_PossibleValue_t dummyspectate_cons_t[] = {{0, "Spectator"}, {1, "Playing"}, {0, NULL}}; static CV_PossibleValue_t dummyscramble_cons_t[] = {{0, "Random"}, {1, "Points"}, {0, NULL}}; static CV_PossibleValue_t dummystaff_cons_t[] = {{0, "MIN"}, {100, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t dummygametype_cons_t[] = {{0, "Race"}, {1, "Battle"}, {0, NULL}}; //static consvar_t cv_dummymenuplayer = CVAR_INIT ("dummymenuplayer", "P1", CV_HIDDEN|CV_CALL, dummymenuplayer_cons_t, Dummymenuplayer_OnChange); static consvar_t cv_dummyteam = CVAR_INIT ("dummyteam", "Spectator", CV_HIDDEN, dummyteam_cons_t, NULL); //static cv_dummyspectate = CVAR_INITconsvar_t ("dummyspectate", "Spectator", CV_HIDDEN, dummyspectate_cons_t, NULL); static consvar_t cv_dummyscramble = CVAR_INIT ("dummyscramble", "Random", CV_HIDDEN, dummyscramble_cons_t, NULL); static consvar_t cv_dummystaff = CVAR_INIT ("dummystaff", "0", CV_HIDDEN|CV_CALL, dummystaff_cons_t, Dummystaff_OnChange); -consvar_t cv_dummygametype = CVAR_INIT ("dummygametype", "Race", CV_HIDDEN, dummygametype_cons_t, NULL); consvar_t cv_dummyip = CVAR_INIT ("dummyip", "", CV_HIDDEN, NULL, NULL); consvar_t cv_dummymenuplayer = CVAR_INIT ("dummymenuplayer", "P1", CV_HIDDEN|CV_CALL, dummymenuplayer_cons_t, Dummymenuplayer_OnChange); consvar_t cv_dummyspectate = CVAR_INIT ("dummyspectate", "Spectator", CV_HIDDEN, dummyspectate_cons_t, NULL); +INT16 menugametype = GT_RACE; + consvar_t cv_dummyprofilename = CVAR_INIT ("dummyprofilename", "", CV_HIDDEN, NULL, NULL); consvar_t cv_dummyprofileplayername = CVAR_INIT ("dummyprofileplayername", "", CV_HIDDEN, NULL, NULL); consvar_t cv_dummyprofilekickstart = CVAR_INIT ("dummyprofilekickstart", "Off", CV_HIDDEN, CV_OnOff, NULL); @@ -1715,7 +1711,6 @@ void M_Init(void) CV_RegisterVar(&cv_dummyspectate); CV_RegisterVar(&cv_dummyscramble); CV_RegisterVar(&cv_dummystaff); - CV_RegisterVar(&cv_dummygametype); CV_RegisterVar(&cv_dummyip); CV_RegisterVar(&cv_dummyprofilename); @@ -4167,10 +4162,70 @@ void M_MPHostInit(INT32 choice) itemOn = mhost_go; } +void M_HandleMenuGametype(INT32 choice) +{ + const UINT8 pid = 0; + const INT16 currentmenugametype = menugametype; + UINT32 forbidden = GTR_FORBIDMP; + + (void)choice; + + if (currentMenu->menuitems[itemOn].mvar1 != 0) + forbidden = currentMenu->menuitems[itemOn].mvar1; + + if (menucmd[pid].dpad_lr > 0 || M_MenuConfirmPressed(pid)) + { + do + { + menugametype++; + if (menugametype >= numgametypes) + menugametype = 0; + + if (!(gametypes[menugametype]->rules & forbidden)) + break; + } while (menugametype != currentmenugametype); + + S_StartSound(NULL, sfx_s3k5b); + M_SetMenuDelay(pid); + } + else if (menucmd[pid].dpad_lr < 0) + { + do + { + if (menugametype == 0) + menugametype = numgametypes; + menugametype--; + + if (!(gametypes[menugametype]->rules & forbidden)) + break; + } while (menugametype != currentmenugametype); + + S_StartSound(NULL, sfx_s3k5b); + M_SetMenuDelay(pid); + } + else if (M_MenuBackPressed(pid)) + { + M_GoBack(0); + M_SetMenuDelay(pid); + return; + } + + if (menucmd[pid].dpad_ud > 0) + { + M_NextOpt(); + S_StartSound(NULL, sfx_s3k5b); + M_SetMenuDelay(pid); + } + else if (menucmd[pid].dpad_ud < 0) + { + M_PrevOpt(); + S_StartSound(NULL, sfx_s3k5b); + M_SetMenuDelay(pid); + } +} + void M_MPSetupNetgameMapSelect(INT32 choice) { - - INT16 gt = GT_RACE; (void)choice; // Yep, we'll be starting a netgame. @@ -4181,26 +4236,10 @@ void M_MPSetupNetgameMapSelect(INT32 choice) levellist.levelsearch.checklocked = true; cupgrid.grandprix = false; - // In case we ever want to add new gamemodes there somehow, have at it! - switch (cv_dummygametype.value) - { - case 1: // Battle - { - gt = GT_BATTLE; - break; - } - - default: - { - gt = GT_RACE; - break; - } - } - // okay this is REALLY stupid but this fixes the host menu re-folding on itself when we go back. mpmenu.modewinextend[0][0] = 1; - M_LevelListFromGametype(gt); // Setup the level select. + M_LevelListFromGametype(menugametype); // Setup the level select. // (This will also automatically send us to the apropriate menu) } diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 1a33438fb..54f3bacf1 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3080,9 +3080,6 @@ static int lib_gAddGametype(lua_State *L) gametypes[numgametypes++] = newgametype; - // Update gametype_cons_t accordingly. - G_UpdateGametypeSelections(); - // done CONS_Printf("Added gametype %s\n", gtname); return 0;