Update menus to use the new input system all over...

This commit is contained in:
SinnamonLat 2022-02-15 23:30:51 +01:00
parent 3deba803ae
commit aea066b70f
6 changed files with 420 additions and 335 deletions

View file

@ -597,6 +597,10 @@ extern struct optionsmenu_s {
INT16 toptx; INT16 toptx;
INT16 topty; INT16 topty;
// profile garbage
boolean profilemenu; // In profile menu. (Used to know when to get the "PROFILE SETUP" button away....
profile_t *profile; // Pointer to the profile we're editing
// for video mode testing: // for video mode testing:
INT32 vidm_testingmode; INT32 vidm_testingmode;
INT32 vidm_previousmode; INT32 vidm_previousmode;
@ -624,6 +628,7 @@ void M_HandleItemToggles(INT32 choice); // For item toggling
void M_EraseData(INT32 choice); // For data erasing void M_EraseData(INT32 choice); // For data erasing
// profile selection menu // profile selection menu
void M_ProfileSelectInit(INT32 choice);
void M_HandleProfileSelect(INT32 ch); void M_HandleProfileSelect(INT32 ch);
// video modes menu (resolution) // video modes menu (resolution)

View file

@ -367,8 +367,8 @@ menu_t PLAY_MP_RoomSelectDef = {
menuitem_t OPTIONS_Main[] = menuitem_t OPTIONS_Main[] =
{ {
{IT_STRING | IT_SUBMENU, "Profile Setup", "Remap keys & buttons to your likings.", {IT_STRING | IT_CALL, "Profile Setup", "Remap keys & buttons to your likings.",
NULL, &OPTIONS_ProfilesDef, 0, 0}, NULL, M_ProfileSelectInit, 0, 0},
{IT_STRING | IT_SUBMENU, "Video Options", "Change video settings such as the resolution.", {IT_STRING | IT_SUBMENU, "Video Options", "Change video settings such as the resolution.",
NULL, &OPTIONS_VideoDef, 0, 0}, NULL, &OPTIONS_VideoDef, 0, 0},

View file

@ -754,6 +754,43 @@ static void M_DrawCharSelectCircle(setup_player_t *p, INT16 x, INT16 y)
} }
} }
static void M_DrawCharacterSprite(INT16 x, INT16 y, SINT8 skin, INT32 addflags, UINT8 *colormap)
{
UINT8 spr;
spritedef_t *sprdef;
spriteframe_t *sprframe;
patch_t *sprpatch;
UINT32 flags = 0;
UINT32 frame;
spr = P_GetSkinSprite2(&skins[skin], SPR2_FSTN, NULL);
sprdef = &skins[skin].sprites[spr];
if (!sprdef->numframes) // No frames ??
return; // Can't render!
frame = states[S_KART_FAST].frame & FF_FRAMEMASK;
if (frame >= sprdef->numframes) // Walking animation missing
frame = 0; // Try to use standing frame
sprframe = &sprdef->spriteframes[frame];
sprpatch = W_CachePatchNum(sprframe->lumppat[1], PU_CACHE);
if (sprframe->flip & 1) // Only for first sprite
flags |= V_FLIP; // This sprite is left/right flipped!
if (skins[skin].flags & SF_HIRES)
{
V_DrawFixedPatch(x<<FRACBITS,
y<<FRACBITS,
skins[skin].highresscale,
flags, sprpatch, colormap);
}
else
V_DrawMappedPatch(x, y, addflags|flags, sprpatch, colormap);
}
static void M_DrawCharSelectSprite(UINT8 num, INT16 x, INT16 y) static void M_DrawCharSelectSprite(UINT8 num, INT16 x, INT16 y)
{ {
setup_player_t *p = &setup_player[num]; setup_player_t *p = &setup_player[num];
@ -761,47 +798,13 @@ static void M_DrawCharSelectSprite(UINT8 num, INT16 x, INT16 y)
SINT8 skin = setup_chargrid[p->gridx][p->gridy].skinlist[p->clonenum]; SINT8 skin = setup_chargrid[p->gridx][p->gridy].skinlist[p->clonenum];
UINT8 color = p->color; UINT8 color = p->color;
UINT8 *colormap = R_GetTranslationColormap(skin, color, GTC_MENUCACHE); UINT8 *colormap = R_GetTranslationColormap(skin, color, GTC_MENUCACHE);
INT32 flags = 0;
if (skin != -1) // Flip for left-side players
{ if (!(num & 1))
UINT8 spr; flags ^= V_FLIP;
spritedef_t *sprdef;
spriteframe_t *sprframe;
patch_t *sprpatch;
UINT32 flags = 0; M_DrawCharacterSprite(x, y, skin, flags, colormap);
UINT32 frame;
spr = P_GetSkinSprite2(&skins[skin], SPR2_FSTN, NULL);
sprdef = &skins[skin].sprites[spr];
if (!sprdef->numframes) // No frames ??
return; // Can't render!
frame = states[S_KART_FAST].frame & FF_FRAMEMASK;
if (frame >= sprdef->numframes) // Walking animation missing
frame = 0; // Try to use standing frame
sprframe = &sprdef->spriteframes[frame];
sprpatch = W_CachePatchNum(sprframe->lumppat[1], PU_CACHE);
if (sprframe->flip & 1) // Only for first sprite
flags |= V_FLIP; // This sprite is left/right flipped!
// Flip for left-side players
if (!(num & 1))
flags ^= V_FLIP;
if (skins[skin].flags & SF_HIRES)
{
V_DrawFixedPatch(x<<FRACBITS,
y<<FRACBITS,
skins[skin].highresscale,
flags, sprpatch, colormap);
}
else
V_DrawMappedPatch(x, y, flags, sprpatch, colormap);
}
} }
static void M_DrawCharSelectPreview(UINT8 num) static void M_DrawCharSelectPreview(UINT8 num)
@ -2016,6 +2019,7 @@ void M_DrawProfileSelect(void)
{ {
INT32 i; INT32 i;
patch_t *card = W_CachePatchName("PR_CARD", PU_CACHE); patch_t *card = W_CachePatchName("PR_CARD", PU_CACHE);
patch_t *cardbot = W_CachePatchName("PR_CARDB", PU_CACHE);
INT32 x = 160; INT32 x = 160;
INT32 y = 75 + menutransition.tics*16; INT32 y = 75 + menutransition.tics*16;
@ -2028,18 +2032,26 @@ void M_DrawProfileSelect(void)
{ {
profile_t *p = PR_GetProfile(i); profile_t *p = PR_GetProfile(i);
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLACK, GTC_CACHE); UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLACK, GTC_CACHE);
char pname[PROFILENAMELEN+1] = "EMPTY"; INT32 skinnum = -1;
char pname[PROFILENAMELEN+1] = "empty";
if (p != NULL) if (p != NULL)
{ {
colormap = R_GetTranslationColormap(TC_DEFAULT, p->color, GTC_CACHE); colormap = R_GetTranslationColormap(TC_DEFAULT, p->color, GTC_CACHE);
strcpy(pname, p->profilename); strcpy(pname, p->profilename);
skinnum = R_SkinAvailable(p->skinname);
} }
// Card
V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT, 0, card, colormap); V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT, 0, card, colormap);
V_DrawCenteredGamemodeString(x, y+18, 0, 0, pname);
CONS_Printf("pname %s\n", pname); if (skinnum > -1)
M_DrawCharacterSprite(x, y+104, skinnum, 0, colormap);
V_DrawCenteredGamemodeString(x, y+16, V_ALLOWLOWERCASE, 0, pname);
// Card bottom to overlay the skin preview
V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT, 0, cardbot, colormap);
x += 96; x += 96;
} }

View file

@ -1146,6 +1146,11 @@ static void M_HandleMenuInput(void)
return; return;
} }
if (menucmd[pid].delay > 0)
{
return;
}
// Handle menu-specific input handling. If this returns true, we skip regular input handling. // Handle menu-specific input handling. If this returns true, we skip regular input handling.
if (currentMenu->inputroutine) if (currentMenu->inputroutine)
{ {
@ -1154,12 +1159,6 @@ static void M_HandleMenuInput(void)
return; return;
} }
} }
if (menucmd[pid].delay > 0)
{
return;
}
routine = currentMenu->menuitems[itemOn].itemaction; routine = currentMenu->menuitems[itemOn].itemaction;
// Handle menuitems which need a specific key handling // Handle menuitems which need a specific key handling
@ -3101,6 +3100,9 @@ boolean M_OptionsQuit(void)
optionsmenu.toptx = 140-1; optionsmenu.toptx = 140-1;
optionsmenu.topty = 70+1; optionsmenu.topty = 70+1;
optionsmenu.profilemenu = false;
optionsmenu.profile = NULL;
return true; // Always allow quitting, duh. return true; // Always allow quitting, duh.
} }
@ -3125,6 +3127,8 @@ void M_OptionsTick(void)
} }
else else
{ {
// I don't like this, it looks like shit but it needs to be done..........
optionsmenu.toptx = 160; optionsmenu.toptx = 160;
optionsmenu.topty = 50; optionsmenu.topty = 50;
} }
@ -3142,47 +3146,56 @@ void M_OptionsTick(void)
boolean M_OptionsInputs(INT32 ch) boolean M_OptionsInputs(INT32 ch)
{ {
switch (ch) const UINT8 pid = 0;
(void)ch;
if (menucmd[pid].dpad_ud > 0)
{ {
case KEY_DOWNARROW: M_SetMenuDelay(pid);
{ optionsmenu.offset += 48;
optionsmenu.offset += 48; M_NextOpt();
M_NextOpt(); S_StartSound(NULL, sfx_menu1);
S_StartSound(NULL, sfx_menu1);
if (itemOn == 0) if (itemOn == 0)
optionsmenu.offset -= currentMenu->numitems*48; optionsmenu.offset -= currentMenu->numitems*48;
return true;
}
case KEY_UPARROW:
{
optionsmenu.offset -= 48;
M_PrevOpt();
S_StartSound(NULL, sfx_menu1);
if (itemOn == currentMenu->numitems-1)
optionsmenu.offset += currentMenu->numitems*48;
return true;
}
case KEY_ENTER:
{
if (currentMenu->menuitems[itemOn].status & IT_TRANSTEXT)
return true; // No.
optionsmenu.optx = 140;
optionsmenu.opty = 70; // Default position for the currently selected option.
return false; // Don't eat.
}
return true;
} }
else if (menucmd[pid].dpad_ud < 0)
{
M_SetMenuDelay(pid);
optionsmenu.offset -= 48;
M_PrevOpt();
S_StartSound(NULL, sfx_menu1);
if (itemOn == currentMenu->numitems-1)
optionsmenu.offset += currentMenu->numitems*48;
return true;
}
else if (M_MenuButtonPressed(pid, MBT_A) || M_MenuButtonPressed(pid, MBT_X))
{
if (currentMenu->menuitems[itemOn].status & IT_TRANSTEXT)
return true; // No.
optionsmenu.optx = 140;
optionsmenu.opty = 70; // Default position for the currently selected option.
return false; // Don't eat.
}
return false; return false;
} }
void M_ProfileSelectInit(INT32 choice)
{
(void)choice;
optionsmenu.profilemenu = true;
M_SetupNextMenu(&OPTIONS_ProfilesDef, false);
}
// setup video mode menu // setup video mode menu
void M_VideoModeMenu(INT32 choice) void M_VideoModeMenu(INT32 choice)
{ {
@ -3272,52 +3285,72 @@ void M_HandleProfileSelect(INT32 ch)
// special menuitem key handler for video mode list // special menuitem key handler for video mode list
void M_HandleVideoModes(INT32 ch) void M_HandleVideoModes(INT32 ch)
{ {
if (optionsmenu.vidm_testingmode > 0) switch (ch)
const UINT8 pid = 0;
(void)ch;
if (optionsmenu.vidm_testingmode > 0)
{ {
// change back to the previous mode quickly // change back to the previous mode quickly
case KEY_ESCAPE: if (M_MenuButtonPressed(pid, MBT_B) || M_MenuButtonPressed(pid, MBT_Y))
{
setmodeneeded = optionsmenu.vidm_previousmode + 1; setmodeneeded = optionsmenu.vidm_previousmode + 1;
optionsmenu.vidm_testingmode = 0; optionsmenu.vidm_testingmode = 0;
break; }
else if (M_MenuButtonPressed(pid, MBT_A) || M_MenuButtonPressed(pid, MBT_X))
case KEY_ENTER: {
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
optionsmenu.vidm_testingmode = 0; // stop testing optionsmenu.vidm_testingmode = 0; // stop testing
}
} }
else switch (ch) else
{ {
case KEY_DOWNARROW: if (menucmd[pid].dpad_ud < 0)
{
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
if (++optionsmenu.vidm_selected >= optionsmenu.vidm_nummodes) if (++optionsmenu.vidm_selected >= optionsmenu.vidm_nummodes)
optionsmenu.vidm_selected = 0; optionsmenu.vidm_selected = 0;
break;
case KEY_UPARROW: M_SetMenuDelay(pid);
}
else if (menucmd[pid].dpad_ud > 0)
{
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
if (--optionsmenu.vidm_selected < 0) if (--optionsmenu.vidm_selected < 0)
optionsmenu.vidm_selected = optionsmenu.vidm_nummodes - 1; optionsmenu.vidm_selected = optionsmenu.vidm_nummodes - 1;
break;
case KEY_LEFTARROW: M_SetMenuDelay(pid);
}
else if (menucmd[pid].dpad_lr < 0)
{
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
optionsmenu.vidm_selected -= optionsmenu.vidm_column_size; optionsmenu.vidm_selected -= optionsmenu.vidm_column_size;
if (optionsmenu.vidm_selected < 0) if (optionsmenu.vidm_selected < 0)
optionsmenu.vidm_selected = (optionsmenu.vidm_column_size*3) + optionsmenu.vidm_selected; optionsmenu.vidm_selected = (optionsmenu.vidm_column_size*3) + optionsmenu.vidm_selected;
if (optionsmenu.vidm_selected >= optionsmenu.vidm_nummodes) if (optionsmenu.vidm_selected >= optionsmenu.vidm_nummodes)
optionsmenu.vidm_selected = optionsmenu.vidm_nummodes - 1; optionsmenu.vidm_selected = optionsmenu.vidm_nummodes - 1;
break;
case KEY_RIGHTARROW: M_SetMenuDelay(pid);
}
else if (menucmd[pid].dpad_lr > 0)
{
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
optionsmenu.vidm_selected += optionsmenu.vidm_column_size; optionsmenu.vidm_selected += optionsmenu.vidm_column_size;
if (optionsmenu.vidm_selected >= (optionsmenu.vidm_column_size*3)) if (optionsmenu.vidm_selected >= (optionsmenu.vidm_column_size*3))
optionsmenu.vidm_selected %= optionsmenu.vidm_column_size; optionsmenu.vidm_selected %= optionsmenu.vidm_column_size;
if (optionsmenu.vidm_selected >= optionsmenu.vidm_nummodes) if (optionsmenu.vidm_selected >= optionsmenu.vidm_nummodes)
optionsmenu.vidm_selected = optionsmenu.vidm_nummodes - 1; optionsmenu.vidm_selected = optionsmenu.vidm_nummodes - 1;
break;
case KEY_ENTER: M_SetMenuDelay(pid);
}
else if (M_MenuButtonPressed(pid, MBT_A) || M_MenuButtonPressed(pid, MBT_X))
{
M_SetMenuDelay(pid);
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
if (vid.modenum == optionsmenu.modedescs[optionsmenu.vidm_selected].modenum) if (vid.modenum == optionsmenu.modedescs[optionsmenu.vidm_selected].modenum)
SCR_SetDefaultMode(); SCR_SetDefaultMode();
@ -3328,17 +3361,16 @@ void M_HandleVideoModes(INT32 ch)
if (!setmodeneeded) // in case the previous setmode was not finished if (!setmodeneeded) // in case the previous setmode was not finished
setmodeneeded = optionsmenu.modedescs[optionsmenu.vidm_selected].modenum + 1; setmodeneeded = optionsmenu.modedescs[optionsmenu.vidm_selected].modenum + 1;
} }
break; }
case KEY_ESCAPE: // this one same as M_Responder else if (M_MenuButtonPressed(pid, MBT_B) || M_MenuButtonPressed(pid, MBT_Y))
{
M_SetMenuDelay(pid);
if (currentMenu->prevMenu) if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu, false); M_SetupNextMenu(currentMenu->prevMenu, false);
else else
M_ClearMenus(true); M_ClearMenus(true);
break; }
default:
break;
} }
} }
@ -3349,86 +3381,103 @@ void M_HandleItemToggles(INT32 choice)
INT16 next; INT16 next;
UINT8 i; UINT8 i;
boolean exitmenu = false; boolean exitmenu = false;
const UINT8 pid = 0;
switch (choice) (void) choice;
if (menucmd[pid].dpad_lr > 0)
{ {
case KEY_RIGHTARROW: S_StartSound(NULL, sfx_menu1);
S_StartSound(NULL, sfx_menu1); column++;
column++; if (((column*height)+row) >= currentMenu->numitems)
if (((column*height)+row) >= currentMenu->numitems) column = 0;
column = 0; next = min(((column*height)+row), currentMenu->numitems-1);
next = min(((column*height)+row), currentMenu->numitems-1); itemOn = next;
itemOn = next;
break;
case KEY_LEFTARROW: M_SetMenuDelay(pid);
S_StartSound(NULL, sfx_menu1); }
else if (menucmd[pid].dpad_lr < 0)
{
S_StartSound(NULL, sfx_menu1);
column--;
if (column < 0)
column = width-1;
if (((column*height)+row) >= currentMenu->numitems)
column--; column--;
if (column < 0) next = max(((column*height)+row), 0);
column = width-1; if (next >= currentMenu->numitems)
if (((column*height)+row) >= currentMenu->numitems) next = currentMenu->numitems-1;
column--; itemOn = next;
next = max(((column*height)+row), 0);
if (next >= currentMenu->numitems)
next = currentMenu->numitems-1;
itemOn = next;
break;
case KEY_DOWNARROW: M_SetMenuDelay(pid);
S_StartSound(NULL, sfx_menu1); }
row = (row+1) % height;
if (((column*height)+row) >= currentMenu->numitems)
row = 0;
next = min(((column*height)+row), currentMenu->numitems-1);
itemOn = next;
break;
case KEY_UPARROW: else if (menucmd[pid].dpad_ud > 0)
S_StartSound(NULL, sfx_menu1); {
row = (row-1) % height; S_StartSound(NULL, sfx_menu1);
if (row < 0) row = (row+1) % height;
row = height-1; if (((column*height)+row) >= currentMenu->numitems)
if (((column*height)+row) >= currentMenu->numitems) row = 0;
row--; next = min(((column*height)+row), currentMenu->numitems-1);
next = max(((column*height)+row), 0); itemOn = next;
if (next >= currentMenu->numitems)
next = currentMenu->numitems-1;
itemOn = next;
break;
case KEY_ENTER: M_SetMenuDelay(pid);
}
else if (menucmd[pid].dpad_ud < 0)
{
S_StartSound(NULL, sfx_menu1);
row = (row-1) % height;
if (row < 0)
row = height-1;
if (((column*height)+row) >= currentMenu->numitems)
row--;
next = max(((column*height)+row), 0);
if (next >= currentMenu->numitems)
next = currentMenu->numitems-1;
itemOn = next;
M_SetMenuDelay(pid);
}
else if (M_MenuButtonPressed(pid, MBT_A) || M_MenuButtonPressed(pid, MBT_X))
{
M_SetMenuDelay(pid);
#ifdef ITEMTOGGLEBOTTOMRIGHT #ifdef ITEMTOGGLEBOTTOMRIGHT
if (currentMenu->menuitems[itemOn].mvar1 == 255) if (currentMenu->menuitems[itemOn].mvar1 == 255)
{
//S_StartSound(NULL, sfx_s26d);
if (!shitsfree)
{ {
//S_StartSound(NULL, sfx_s26d); shitsfree = TICRATE;
if (!shitsfree) S_StartSound(NULL, sfx_itfree);
{
shitsfree = TICRATE;
S_StartSound(NULL, sfx_itfree);
}
} }
else }
else
#endif #endif
if (currentMenu->menuitems[itemOn].mvar1 == 0) if (currentMenu->menuitems[itemOn].mvar1 == 0)
{
INT32 v = cv_sneaker.value;
S_StartSound(NULL, sfx_s1b4);
for (i = 0; i < NUMKARTRESULTS-1; i++)
{ {
INT32 v = cv_sneaker.value; if (KartItemCVars[i]->value == v)
S_StartSound(NULL, sfx_s1b4); CV_AddValue(KartItemCVars[i], 1);
for (i = 0; i < NUMKARTRESULTS-1; i++)
{
if (KartItemCVars[i]->value == v)
CV_AddValue(KartItemCVars[i], 1);
}
} }
else }
{ else
S_StartSound(NULL, sfx_s1ba); {
CV_AddValue(KartItemCVars[currentMenu->menuitems[itemOn].mvar1-1], 1); S_StartSound(NULL, sfx_s1ba);
} CV_AddValue(KartItemCVars[currentMenu->menuitems[itemOn].mvar1-1], 1);
break; }
}
case KEY_ESCAPE: else if (M_MenuButtonPressed(pid, MBT_B) || M_MenuButtonPressed(pid, MBT_Y))
exitmenu = true; {
break; M_SetMenuDelay(pid);
exitmenu = true;
} }
if (exitmenu) if (exitmenu)
@ -3499,41 +3548,46 @@ void M_ExtrasTick(void)
boolean M_ExtrasInputs(INT32 ch) boolean M_ExtrasInputs(INT32 ch)
{ {
switch (ch) const UINT8 pid = 0;
(void) ch;
if (menucmd[pid].dpad_ud > 0)
{ {
case KEY_DOWNARROW: extrasmenu.offset += 48;
{ M_NextOpt();
extrasmenu.offset += 48; S_StartSound(NULL, sfx_menu1);
M_NextOpt();
S_StartSound(NULL, sfx_menu1);
if (itemOn == 0) if (itemOn == 0)
extrasmenu.offset -= currentMenu->numitems*48; extrasmenu.offset -= currentMenu->numitems*48;
return true; M_SetMenuDelay(pid);
} return true;
case KEY_UPARROW: }
{
extrasmenu.offset -= 48;
M_PrevOpt();
S_StartSound(NULL, sfx_menu1);
if (itemOn == currentMenu->numitems-1) else if (menucmd[pid].dpad_ud < 0)
extrasmenu.offset += currentMenu->numitems*48; {
extrasmenu.offset -= 48;
M_PrevOpt();
S_StartSound(NULL, sfx_menu1);
return true; if (itemOn == currentMenu->numitems-1)
} extrasmenu.offset += currentMenu->numitems*48;
case KEY_ENTER:
{
if (currentMenu->menuitems[itemOn].status & IT_TRANSTEXT) M_SetMenuDelay(pid);
return true; // No. return true;
}
extrasmenu.extx = 140; else if (M_MenuButtonPressed(pid, MBT_A) || M_MenuButtonPressed(pid, MBT_X))
extrasmenu.exty = 70; // Default position for the currently selected option. {
return false; // Don't eat. if (currentMenu->menuitems[itemOn].status & IT_TRANSTEXT)
} return true; // No.
extrasmenu.extx = 140;
extrasmenu.exty = 70; // Default position for the currently selected option.
M_SetMenuDelay(pid);
return false; // Don't eat.
} }
return false; return false;
} }
@ -3634,36 +3688,35 @@ void M_PauseTick(void)
boolean M_PauseInputs(INT32 ch) boolean M_PauseInputs(INT32 ch)
{ {
const UINT8 pid = 0;
(void) ch;
if (pausemenu.closing) if (pausemenu.closing)
return true; // Don't allow inputs. return true; // Don't allow inputs.
switch (ch) if (menucmd[pid].dpad_ud < 0)
{ {
M_SetMenuDelay(pid);
case KEY_UPARROW: pausemenu.offset -= 50; // Each item is spaced by 50 px
{ S_StartSound(NULL, sfx_menu1);
pausemenu.offset -= 50; // Each item is spaced by 50 px M_PrevOpt();
S_StartSound(NULL, sfx_menu1); return true;
M_PrevOpt();
return true;
}
case KEY_DOWNARROW:
{
pausemenu.offset += 50; // Each item is spaced by 50 px
S_StartSound(NULL, sfx_menu1);
M_NextOpt();
return true;
}
case KEY_ESCAPE:
{
M_QuitPauseMenu();
return true;
}
} }
else if (menucmd[pid].dpad_ud > 0)
{
pausemenu.offset += 50; // Each item is spaced by 50 px
S_StartSound(NULL, sfx_menu1);
M_NextOpt();
M_SetMenuDelay(pid);
return true;
}
else if (M_MenuButtonPressed(pid, MBT_B) || M_MenuButtonPressed(pid, MBT_Y))
{
M_QuitPauseMenu();
return true;
}
return false; return false;
} }
@ -3914,9 +3967,12 @@ void M_ReplayHut(INT32 choice)
// key handler // key handler
void M_HandleReplayHutList(INT32 choice) void M_HandleReplayHutList(INT32 choice)
{ {
switch (choice)
const UINT8 pid = 0;
(void) choice;
if (menucmd[pid].dpad_ud > 0)
{ {
case KEY_UPARROW:
if (dir_on[menudepthleft]) if (dir_on[menudepthleft])
dir_on[menudepthleft]--; dir_on[menudepthleft]--;
else else
@ -3925,9 +3981,10 @@ void M_HandleReplayHutList(INT32 choice)
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
extrasmenu.replayScrollTitle = 0; extrasmenu.replayScrollDelay = TICRATE; extrasmenu.replayScrollDir = 1; extrasmenu.replayScrollTitle = 0; extrasmenu.replayScrollDelay = TICRATE; extrasmenu.replayScrollDir = 1;
break; }
case KEY_DOWNARROW: else if (menucmd[pid].dpad_ud < 0)
{
if (dir_on[menudepthleft] < sizedirmenu-1) if (dir_on[menudepthleft] < sizedirmenu-1)
dir_on[menudepthleft]++; dir_on[menudepthleft]++;
else else
@ -3936,13 +3993,15 @@ void M_HandleReplayHutList(INT32 choice)
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
extrasmenu.replayScrollTitle = 0; extrasmenu.replayScrollDelay = TICRATE; extrasmenu.replayScrollDir = 1; extrasmenu.replayScrollTitle = 0; extrasmenu.replayScrollDelay = TICRATE; extrasmenu.replayScrollDir = 1;
break; }
case KEY_ESCAPE: else if (M_MenuButtonPressed(pid, MBT_B) || M_MenuButtonPressed(pid, MBT_Y))
{
M_QuitReplayHut(); M_QuitReplayHut();
break; }
case KEY_ENTER: else if (M_MenuButtonPressed(pid, MBT_A) || M_MenuButtonPressed(pid, MBT_X))
{
switch (dirmenu[dir_on[menudepthleft]][DIR_TYPE]) switch (dirmenu[dir_on[menudepthleft]][DIR_TYPE])
{ {
case EXT_FOLDER: case EXT_FOLDER:
@ -4028,8 +4087,6 @@ void M_HandleReplayHutList(INT32 choice)
break; break;
} }
} }
break;
} }
} }
@ -4252,8 +4309,11 @@ static boolean M_ChangeStringAddons(INT32 choice)
void M_HandleAddons(INT32 choice) void M_HandleAddons(INT32 choice)
{ {
const UINT8 pid = 0;
boolean exitmenu = false; // exit to previous menu boolean exitmenu = false; // exit to previous menu
(void) choice;
if (M_ChangeStringAddons(choice)) if (M_ChangeStringAddons(choice))
{ {
char *tempname = NULL; char *tempname = NULL;
@ -4270,116 +4330,122 @@ void M_HandleAddons(INT32 choice)
#endif #endif
} }
switch (choice) if (menucmd[pid].dpad_ud < 0)
{ {
case KEY_DOWNARROW: if (dir_on[menudepthleft] < sizedirmenu-1)
if (dir_on[menudepthleft] < sizedirmenu-1) dir_on[menudepthleft]++;
dir_on[menudepthleft]++; S_StartSound(NULL, sfx_menu1);
S_StartSound(NULL, sfx_menu1); }
break; else if (menucmd[pid].dpad_ud > 0)
case KEY_UPARROW: {
if (dir_on[menudepthleft]) if (dir_on[menudepthleft])
dir_on[menudepthleft]--; dir_on[menudepthleft]--;
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
break; }
case KEY_PGDN:
else if (M_MenuButtonPressed(pid, MBT_L))
{
UINT8 i;
for (i = numaddonsshown; i && (dir_on[menudepthleft] < sizedirmenu-1); i--)
dir_on[menudepthleft]++;
S_StartSound(NULL, sfx_menu1);
}
else if (M_MenuButtonPressed(pid, MBT_R))
{
UINT8 i;
for (i = numaddonsshown; i && (dir_on[menudepthleft]); i--)
dir_on[menudepthleft]--;
S_StartSound(NULL, sfx_menu1);
}
else if (M_MenuButtonPressed(pid, MBT_A) || M_MenuButtonPressed(pid, MBT_X))
{
boolean refresh = true;
if (!dirmenu[dir_on[menudepthleft]])
S_StartSound(NULL, sfx_s26d);
else
{
switch (dirmenu[dir_on[menudepthleft]][DIR_TYPE])
{ {
UINT8 i; case EXT_FOLDER:
for (i = numaddonsshown; i && (dir_on[menudepthleft] < sizedirmenu-1); i--) strcpy(&menupath[menupathindex[menudepthleft]],dirmenu[dir_on[menudepthleft]]+DIR_STRING);
dir_on[menudepthleft]++; if (menudepthleft)
}
S_StartSound(NULL, sfx_menu1);
break;
case KEY_PGUP:
{
UINT8 i;
for (i = numaddonsshown; i && (dir_on[menudepthleft]); i--)
dir_on[menudepthleft]--;
}
S_StartSound(NULL, sfx_menu1);
break;
case KEY_ENTER:
{
boolean refresh = true;
if (!dirmenu[dir_on[menudepthleft]])
S_StartSound(NULL, sfx_s26d);
else
{
switch (dirmenu[dir_on[menudepthleft]][DIR_TYPE])
{ {
case EXT_FOLDER: menupathindex[--menudepthleft] = strlen(menupath);
strcpy(&menupath[menupathindex[menudepthleft]],dirmenu[dir_on[menudepthleft]]+DIR_STRING); menupath[menupathindex[menudepthleft]] = 0;
if (menudepthleft)
{
menupathindex[--menudepthleft] = strlen(menupath);
menupath[menupathindex[menudepthleft]] = 0;
if (!preparefilemenu(false, false)) if (!preparefilemenu(false, false))
{ {
S_StartSound(NULL, sfx_s224); S_StartSound(NULL, sfx_s224);
M_StartMessage(va("%c%s\x80\nThis folder is empty.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), M_AddonsHeaderPath()),NULL,MM_NOTHING); M_StartMessage(va("%c%s\x80\nThis folder is empty.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), M_AddonsHeaderPath()),NULL,MM_NOTHING);
menupath[menupathindex[++menudepthleft]] = 0;
if (!preparefilemenu(true, false))
{
UNEXIST;
return;
}
}
else
{
S_StartSound(NULL, sfx_menu1);
dir_on[menudepthleft] = 1;
}
refresh = false;
}
else
{
S_StartSound(NULL, sfx_s26d);
M_StartMessage(va("%c%s\x80\nThis folder is too deep to navigate to!\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), M_AddonsHeaderPath()),NULL,MM_NOTHING);
menupath[menupathindex[menudepthleft]] = 0;
}
break;
case EXT_UP:
S_StartSound(NULL, sfx_menu1);
menupath[menupathindex[++menudepthleft]] = 0; menupath[menupathindex[++menudepthleft]] = 0;
if (!preparefilemenu(false, false))
if (!preparefilemenu(true, false))
{ {
UNEXIST; UNEXIST;
return; return;
} }
break; }
case EXT_TXT: else
M_StartMessage(va("%c%s\x80\nThis file may not be a console script.\nAttempt to run anyways? \n\n(Press 'Y' to confirm)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),M_AddonExec,MM_YESNO); {
break; S_StartSound(NULL, sfx_menu1);
case EXT_CFG: dir_on[menudepthleft] = 1;
M_AddonExec(KEY_ENTER); }
break; refresh = false;
case EXT_LUA:
case EXT_SOC:
case EXT_WAD:
#ifdef USE_KART
case EXT_KART:
#endif
case EXT_PK3:
COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
break;
default:
S_StartSound(NULL, sfx_s26d);
} }
} else
if (refresh) {
refreshdirmenu |= REFRESHDIR_NORMAL; S_StartSound(NULL, sfx_s26d);
M_StartMessage(va("%c%s\x80\nThis folder is too deep to navigate to!\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), M_AddonsHeaderPath()),NULL,MM_NOTHING);
menupath[menupathindex[menudepthleft]] = 0;
}
break;
case EXT_UP:
S_StartSound(NULL, sfx_menu1);
menupath[menupathindex[++menudepthleft]] = 0;
if (!preparefilemenu(false, false))
{
UNEXIST;
return;
}
break;
case EXT_TXT:
M_StartMessage(va("%c%s\x80\nThis file may not be a console script.\nAttempt to run anyways? \n\n(Press 'Y' to confirm)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),M_AddonExec,MM_YESNO);
break;
case EXT_CFG:
M_AddonExec(KEY_ENTER);
break;
case EXT_LUA:
case EXT_SOC:
case EXT_WAD:
#ifdef USE_KART
case EXT_KART:
#endif
case EXT_PK3:
COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
break;
default:
S_StartSound(NULL, sfx_s26d);
} }
break;
case KEY_ESCAPE: if (refresh)
exitmenu = true; refreshdirmenu |= REFRESHDIR_NORMAL;
break; }
default:
break;
} }
else if (M_MenuButtonPressed(pid, MBT_B) || M_MenuButtonPressed(pid, MBT_Y))
{
exitmenu = true;
}
if (exitmenu) if (exitmenu)
{ {
closefilemenu(true); closefilemenu(true);

View file

@ -16,7 +16,7 @@
static profile_t profilesList[MAXPROFILES+1]; // +1 because we're gonna add a default "GUEST' profile. static profile_t profilesList[MAXPROFILES+1]; // +1 because we're gonna add a default "GUEST' profile.
static UINT8 numprofiles = 0; // # of loaded profiles static UINT8 numprofiles = 0; // # of loaded profiles
profile_t PR_MakeProfile(const char *prname, const char *pname, const UINT16 col, const char *fname, UINT16 fcol, INT32 controlarray[num_gamecontrols][MAXINPUTMAPPING]) profile_t PR_MakeProfile(const char *prname, const char *pname, const char *sname, const UINT16 col, const char *fname, UINT16 fcol, INT32 controlarray[num_gamecontrols][MAXINPUTMAPPING])
{ {
profile_t new; profile_t new;
@ -24,6 +24,7 @@ profile_t PR_MakeProfile(const char *prname, const char *pname, const UINT16 col
strcpy(new.profilename, prname); strcpy(new.profilename, prname);
strcpy(new.skinname, sname);
strcpy(new.playername, pname); strcpy(new.playername, pname);
new.color = col; new.color = col;
@ -36,10 +37,10 @@ profile_t PR_MakeProfile(const char *prname, const char *pname, const UINT16 col
return new; return new;
} }
profile_t PR_MakeProfileFromPlayer(const char *prname, const char *pname, const UINT16 col, const char *fname, UINT16 fcol, UINT8 pnum) profile_t PR_MakeProfileFromPlayer(const char *prname, const char *pname, const char *sname, const UINT16 col, const char *fname, UINT16 fcol, UINT8 pnum)
{ {
// Generate profile using the player's gamecontrol, as we set them directly when making profiles from menus. // Generate profile using the player's gamecontrol, as we set them directly when making profiles from menus.
profile_t new = PR_MakeProfile(prname, pname, col, fname, fcol, gamecontrol[pnum]); profile_t new = PR_MakeProfile(prname, pname, sname, col, fname, fcol, gamecontrol[pnum]);
// Player bound cvars: // Player bound cvars:
new.kickstartaccel = cv_kickstartaccel[pnum].value; new.kickstartaccel = cv_kickstartaccel[pnum].value;
@ -85,7 +86,7 @@ void PR_SaveProfiles(void)
void PR_LoadProfiles(void) void PR_LoadProfiles(void)
{ {
//FILE *f = NULL; //FILE *f = NULL;
profile_t dprofile = PR_MakeProfile(PROFILEDEFAULTNAME, PROFILEDEFAULTPNAME, PROFILEDEFAULTCOLOR, PROFILEDEFAULTFOLLOWER, PROFILEDEFAULTFOLLOWERCOLOR, gamecontroldefault); profile_t dprofile = PR_MakeProfile(PROFILEDEFAULTNAME, PROFILEDEFAULTPNAME, PROFILEDEFAULTSKIN, PROFILEDEFAULTCOLOR, PROFILEDEFAULTFOLLOWER, PROFILEDEFAULTFOLLOWERCOLOR, gamecontroldefault);
PR_AddProfile(dprofile); PR_AddProfile(dprofile);
/*f = fopen(PROFILESFILE, "r"); /*f = fopen(PROFILESFILE, "r");

View file

@ -30,7 +30,7 @@
#define MAXPROFILES 16 #define MAXPROFILES 16
#define PROFILESFILE "kartprofiles.cfg" #define PROFILESFILE "kartprofiles.cfg"
#define PROFILEDEFAULTNAME "GUEST" #define PROFILEDEFAULTNAME "guest"
#define PROFILEDEFAULTPNAME "Player" #define PROFILEDEFAULTPNAME "Player"
#define PROFILEDEFAULTSKIN "sonic" #define PROFILEDEFAULTSKIN "sonic"
#define PROFILEDEFAULTCOLOR SKINCOLOR_SAPPHIRE #define PROFILEDEFAULTCOLOR SKINCOLOR_SAPPHIRE
@ -52,6 +52,7 @@ typedef struct profile_s
// Player data // Player data
char playername[MAXPLAYERNAME+1]; // Player name char playername[MAXPLAYERNAME+1]; // Player name
char skinname[SKINNAMESIZE+1]; // Default Skin
UINT16 color; // Default player coloUr. ...But for consistency we'll name it color. UINT16 color; // Default player coloUr. ...But for consistency we'll name it color.
char follower[SKINNAMESIZE+1]; // Follower char follower[SKINNAMESIZE+1]; // Follower
UINT16 followercolor; // Follower color UINT16 followercolor; // Follower color
@ -70,12 +71,12 @@ typedef struct profile_s
// PR_MakeProfile // PR_MakeProfile
// Makes a profile from the supplied profile name, player name, colour, follower, followercolour and controls. // Makes a profile from the supplied profile name, player name, colour, follower, followercolour and controls.
// The consvar values are left untouched. // The consvar values are left untouched.
profile_t PR_MakeProfile(const char *prname, const char *pname, const UINT16 col, const char *fname, UINT16 fcol, INT32 controlarray[num_gamecontrols][MAXINPUTMAPPING]); profile_t PR_MakeProfile(const char *prname, const char *pname, const char *sname, const UINT16 col, const char *fname, UINT16 fcol, INT32 controlarray[num_gamecontrols][MAXINPUTMAPPING]);
// PR_MakeProfileFromPlayer // PR_MakeProfileFromPlayer
// Makes a profile_t from the supplied profile name, player name, colour, follower and followercolour. // Makes a profile_t from the supplied profile name, player name, colour, follower and followercolour.
// The last argument is a player number to read cvars from; as for convenience, cvars will be set directly when making a profile (since loading another one will overwrite them, this will be inconsequential) // The last argument is a player number to read cvars from; as for convenience, cvars will be set directly when making a profile (since loading another one will overwrite them, this will be inconsequential)
profile_t PR_MakeProfileFromPlayer(const char *prname, const char *pname, const UINT16 col, const char *fname, UINT16 fcol, UINT8 pnum); profile_t PR_MakeProfileFromPlayer(const char *prname, const char *pname, const char *sname, const UINT16 col, const char *fname, UINT16 fcol, UINT8 pnum);
// PR_AddProfile(profile_t p) // PR_AddProfile(profile_t p)
// Adds a profile to profilesList and increments numprofiles. // Adds a profile to profilesList and increments numprofiles.