Various fixes in charsel / charswitch menus

This commit is contained in:
SinnamonLat 2022-04-13 00:53:27 +02:00
parent 4f919f883d
commit 66c62b38da
5 changed files with 62 additions and 12 deletions

View file

@ -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

View file

@ -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;

View file

@ -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)
{

View file

@ -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;

View file

@ -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)