diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ad1eed24b..eb2c7388d 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -300,6 +300,18 @@ consvar_t cv_followercolor[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("followercolor4", "1", CV_SAVE|CV_CALL|CV_NOINIT, Followercolor_cons_t, Followercolor4_OnChange) }; +// last selected profile, unaccessible cvar only set internally but is saved. +// It's used to know what profile to autoload you to when you get into the character setup. + +static CV_PossibleValue_t lastprofile_cons_t[] = {{0, "MIN"}, {MAXPROFILES, "MAX"}, {0, NULL}}; + +consvar_t cv_lastprofile[MAXSPLITSCREENPLAYERS] = { + CVAR_INIT ("lastprofile", "1", CV_SAVE|CV_HIDDEN, lastprofile_cons_t, NULL), + CVAR_INIT ("lastprofile2", "1", CV_SAVE|CV_HIDDEN, lastprofile_cons_t, NULL), + CVAR_INIT ("lastprofile3", "1", CV_SAVE|CV_HIDDEN, lastprofile_cons_t, NULL), + CVAR_INIT ("lastprofile4", "1", CV_SAVE|CV_HIDDEN, lastprofile_cons_t, NULL), +}; + consvar_t cv_skipmapcheck = CVAR_INIT ("skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL); INT32 cv_debug; @@ -861,6 +873,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_skin[i]); CV_RegisterVar(&cv_follower[i]); CV_RegisterVar(&cv_followercolor[i]); + CV_RegisterVar(&cv_lastprofile[i]); } // preferred number of players diff --git a/src/d_netcmd.h b/src/d_netcmd.h index be4727b59..7a385ba92 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -23,6 +23,7 @@ extern consvar_t cv_playercolor[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_skin[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_follower[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_followercolor[MAXSPLITSCREENPLAYERS]; +extern consvar_t cv_lastprofile[MAXSPLITSCREENPLAYERS]; // preferred number of players extern consvar_t cv_splitplayers; diff --git a/src/k_menudraw.c b/src/k_menudraw.c index a1098bc26..9fd382022 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -1171,7 +1171,8 @@ static void M_DrawCharSelectSprite(UINT8 num, INT16 x, INT16 y) if (!(num & 1)) flags ^= V_FLIP; - M_DrawCharacterSprite(x, y, skin, flags, colormap); + if (skin >= 0) + M_DrawCharacterSprite(x, y, skin, flags, colormap); } static void M_DrawCharSelectPreview(UINT8 num) @@ -1206,7 +1207,7 @@ static void M_DrawCharSelectPreview(UINT8 num) } } - if ((setup_animcounter/10) & 1) + if ((setup_animcounter/10) & 1 && gamestate == GS_MENU) // Not drawn outside of GS_MENU. { if (p->mdepth == CSSTEP_NONE && num == setup_numplayers) { diff --git a/src/k_menufunc.c b/src/k_menufunc.c index 52f14a311..ad77b37a0 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -2104,11 +2104,15 @@ void M_CharacterSelectInit(void) memset(setup_explosions, 0, sizeof(setup_explosions)); setup_animcounter = 0; - // Default to no follower / Match for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { + // Default to no follower / match colour. setup_player[i].followern = -1; setup_player[i].followercolor = -1; + + // Set default selected profile to the last used profile for each player: + // (Make sure we don't overshoot it somehow if we deleted profiles or whatnot) + setup_player[i].profilen = min(cv_lastprofile[i].value, PR_GetNumProfiles()); } for (i = 0; i < numskins; i++) @@ -2133,10 +2137,18 @@ void M_CharacterSelectInit(void) setup_player[j].color = skins[i].prefcolor; // If we're on prpfile select, skip straight to CSSTEP_CHARS - if (optionsmenu.profile && j == 0) + if ((optionsmenu.profile || gamestate != GS_MENU) && j == 0) { - setup_player[j].profilen = optionsmenu.profilen; - PR_ApplyProfile(setup_player[j].profilen, 0); + if (optionsmenu.profile) // In menu, setting up profile character/follower + { + setup_player[j].profilen = optionsmenu.profilen; + PR_ApplyProfile(setup_player[j].profilen, 0); + } + else // gamestate != GS_MENU, in that case, assume this is whatever profile we chose to play with. + setup_player[j].profilen = cv_lastprofile[j].value; + // Don't reapply the profile here, it was already applied. + + M_SetupProfileGridPos(&setup_player[j]); setup_player[j].mdepth = CSSTEP_CHARS; } @@ -2428,9 +2440,9 @@ static boolean M_HandleCharacterGrid(setup_player_t *p, UINT8 num) { if (num == setup_numplayers-1) { - // for profiles, exit out of the menu instantly, + // for profiles / gameplay, exit out of the menu instantly, // we don't want to go to the input detection menu. - if (optionsmenu.profile) + if (optionsmenu.profile || gamestate != GS_MENU) { memset(setup_player, 0, sizeof(setup_player)); // Reset setup_player otherwise it does some VERY funky things. M_SetMenuDelay(0); @@ -2701,7 +2713,9 @@ boolean M_CharacterSelectHandler(INT32 choice) switch (p->mdepth) { case CSSTEP_NONE: // Enter Game - playersChanged = M_HandlePressStart(p, i); + if (gamestate == GS_MENU) // do NOT handle that outside of GS_MENU. + playersChanged = M_HandlePressStart(p, i); + break; case CSSTEP_PROFILE: playersChanged = M_HandleCSelectProfile(p, i); @@ -2770,10 +2784,10 @@ static void M_MPConfirmCharacterSelection(void) INT16 col; char colstr[8]; - char commandnames[][4][MAXSTRINGLENGTH] = { {"skin ", "color ", "follower ", "followercolor "}, {"skin2 ", "color2 ", "follower2 ", "followercolor2 "}, {"skin3 ", "color3 " "follower3 ", "followercolor3 "}, {"skin4 ", "color4 ", "follower4 ", "followercolor4 "}}; + char commandnames[][4][MAXSTRINGLENGTH] = { {"skin ", "color ", "follower ", "followercolor "}, {"skin2 ", "color2 ", "follower2 ", "followercolor2 "}, {"skin3 ", "color3 ", "follower3 ", "followercolor3 "}, {"skin4 ", "color4 ", "follower4 ", "followercolor4 "}}; // ^ laziness 100 (we append a space directly so that we don't have to do it later too!!!!) - for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + for (i = 0; i < splitscreen +1; i++) { char cmd[MAXSTRINGLENGTH]; @@ -4264,7 +4278,22 @@ boolean M_ProfileControlsInputs(INT32 ch) } else if (M_MenuBackPressed(pid)) { + UINT8 i; + UINT8 pnum; + optionsmenu.profile->kickstartaccel = cv_dummyprofilekickstart.value; // Make sure to save kickstart accel. + pnum = PR_GetProfileNum(optionsmenu.profile); + + // Check if this profile is one we have last used on any player: + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + if (cv_lastprofile[i].value == pnum) + { + PR_ApplyProfile(pnum, i); + break; + } + } + } return false; diff --git a/src/k_profiles.c b/src/k_profiles.c index e48688d41..3baa18159 100644 --- a/src/k_profiles.c +++ b/src/k_profiles.c @@ -150,13 +150,19 @@ void PR_ApplyProfile(UINT8 profilenum, UINT8 playernum) CV_StealthSet(&cv_skin[playernum], p->skinname); CV_StealthSetValue(&cv_playercolor[playernum], p->color); CV_StealthSet(&cv_playername[playernum], p->playername); - // @TODO followers + + // Followers + CV_StealthSet(&cv_follower[playernum], p->follower); + CV_StealthSetValue(&cv_followercolor[playernum], p->followercolor); // toggles CV_StealthSetValue(&cv_kickstartaccel[playernum], p->kickstartaccel); // set controls... memcpy(&gamecontrol[playernum], p->controls, sizeof(gamecontroldefault)); + + // set memory cvar + CV_StealthSetValue(&cv_lastprofile[playernum], profilenum); } UINT8 PR_GetProfileNum(profile_t *p)