Chengi's menu selectors

- Menu BG image is defined by menu option
- Menu BG image slides in
- Gamemode menu options are now like Chengi's mockup
This commit is contained in:
Sally Coolatta 2021-01-13 01:16:14 -05:00
parent 521eff868c
commit 8289bf252f
7 changed files with 139 additions and 83 deletions

View file

@ -268,10 +268,11 @@ void HU_Init(void)
PR ("MKFNT");
REG;
ADIM (AZ);
ADIM (LT);
PR ("GAMEM");
REG;
ADIM (AZ);
PR ("FILEF");
REG;

View file

@ -365,6 +365,7 @@ void M_ReplayHut(INT32 choice);
// M_MENUDRAW.C
void M_UpdateMenuBGImage(boolean forceReset);
void M_DrawMenuBackground(void);
void M_DrawMenuForeground(void);
void M_Drawer(void);

View file

@ -18,17 +18,21 @@
// ---------
menuitem_t MainMenu[] =
{
{IT_STRING | IT_CALL, "Play", "Cut to the chase and start the race!",
NULL, M_CharacterSelectInit, 0, 0},
{IT_STRING | IT_CALL, "Play",
"Cut to the chase and start the race!", NULL,
M_CharacterSelectInit, 0, 0},
{IT_STRING, "Extra", "Check out some bonus features.",
NULL, NULL, 0, 0},
{IT_STRING, "Extra",
"Check out some bonus features.", "MENUI001",
NULL, 0, 0},
{IT_STRING, "Option", "Configure your controls, settings, and preferences.",
NULL, NULL, 0, 0},
{IT_STRING, "Option",
"Configure your controls, settings, and preferences.", NULL,
NULL, 0, 0},
{IT_STRING | IT_CALL, "Quit", "Exit SRB2Kart.",
NULL, M_QuitSRB2, 0, 0},
{IT_STRING | IT_CALL, "Quit",
"Exit \"Dr. Robotnik's Ring Racers\".", NULL,
M_QuitSRB2, 0, 0},
};
menu_t MainDef = KARTGAMEMODEMENU(MainMenu, NULL);

View file

@ -86,6 +86,32 @@ int snprintf(char *str, size_t n, const char *fmt, ...);
#define SERVERS_PER_PAGE 11
static UINT32 bgTextScroll = 0;
static UINT32 bgImageScroll = 0;
static char bgImageName[9];
#define MENUBG_TEXTSCROLL 6
#define MENUBG_IMAGESCROLL 32
void M_UpdateMenuBGImage(boolean forceReset)
{
char oldName[9];
memcpy(oldName, bgImageName, 9);
if (currentMenu->menuitems[itemOn].patch)
{
sprintf(bgImageName, "%s", currentMenu->menuitems[itemOn].patch);
}
else
{
sprintf(bgImageName, "MENUI000");
}
if (forceReset == false && strcmp(bgImageName, oldName))
{
bgImageScroll = (BASEVIDWIDTH / 2) / MENUBG_IMAGESCROLL;
}
}
void M_DrawMenuBackground(void)
{
@ -95,14 +121,15 @@ void M_DrawMenuBackground(void)
INT32 text1loop = SHORT(text1->height);
INT32 text2loop = SHORT(text2->width);
fixed_t text1scroll = -(bgTextScroll % text1loop) * FRACUNIT;
fixed_t text2scroll = -(bgTextScroll % text2loop) * FRACUNIT;
fixed_t text1scroll = -((bgTextScroll * MENUBG_TEXTSCROLL) % text1loop) * FRACUNIT;
fixed_t text2scroll = -((bgTextScroll * MENUBG_TEXTSCROLL) % text2loop) * FRACUNIT;
V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("MENUBG4", PU_CACHE), NULL);
V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("MENUBG2", PU_CACHE), NULL);
V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("MENUBG1", PU_CACHE), NULL);
V_DrawFixedPatch(0, BASEVIDHEIGHT * FRACUNIT, FRACUNIT, V_TRANSLUCENT, W_CachePatchName("MENUBG5", PU_CACHE), NULL);
V_DrawFixedPatch(-(bgImageScroll * MENUBG_IMAGESCROLL) * FRACUNIT, 0, FRACUNIT, 0, W_CachePatchName("MENUBG1", PU_CACHE), NULL);
V_DrawFixedPatch(-(bgImageScroll * MENUBG_IMAGESCROLL) * FRACUNIT, 0, FRACUNIT, 0, W_CachePatchName(bgImageName, PU_CACHE), NULL);
V_DrawFixedPatch(0, (BASEVIDHEIGHT + 16) * FRACUNIT, FRACUNIT, V_TRANSLUCENT, W_CachePatchName("MENUBG2", PU_CACHE), NULL);
V_DrawFixedPatch(text2scroll, (BASEVIDHEIGHT-8) * FRACUNIT,
FRACUNIT, V_TRANSLUCENT, text2, NULL);
@ -114,7 +141,12 @@ void M_DrawMenuBackground(void)
V_DrawFixedPatch(8 * FRACUNIT, text1scroll + (text1loop * FRACUNIT),
FRACUNIT, V_TRANSLUCENT, text1, NULL);
bgTextScroll += 8;
bgTextScroll++;
if (bgImageScroll > 0)
{
bgImageScroll--;
}
}
void M_DrawMenuForeground(void)
@ -214,26 +246,6 @@ static void M_DrawMenuTooltips(void)
}
}
//
// M_DrawMenuPreviews
//
// Draw a box with a preview image of the current option
//
static void M_DrawMenuPreviews(void)
{
V_DrawFixedPatch(172<<FRACBITS, 29<<FRACBITS, FRACUNIT, 0, W_CachePatchName("MENUPREV", PU_CACHE), NULL);
if (currentMenu->menuitems[itemOn].patch == NULL)
{
patch_t *st = W_CachePatchName(va("MIMGST0%d", (skullAnimCounter % 4) + 1), PU_CACHE);
V_DrawFixedPatch(181<<FRACBITS, 39<<FRACBITS, FRACUNIT, 0, st, NULL);
}
else
{
V_DrawFixedPatch(181<<FRACBITS, 39<<FRACBITS, FRACUNIT, 0, W_CachePatchName(currentMenu->menuitems[itemOn].patch, PU_CACHE), NULL);
}
}
// Converts a string into question marks.
// Used for the secrets menu, to hide yet-to-be-unlocked stuff.
static const char *M_CreateSecretMenuOption(const char *str)
@ -404,6 +416,11 @@ void M_DrawGenericMenu(void)
}
}
#define GM_STARTX 128
#define GM_STARTY 80
#define GM_XOFFSET 17
#define GM_YOFFSET 34
//
// M_DrawKartGamemodeMenu
//
@ -411,33 +428,52 @@ void M_DrawGenericMenu(void)
//
void M_DrawKartGamemodeMenu(void)
{
INT16 i, x = 170;
UINT8 n = currentMenu->numitems-1;
INT32 i, x = GM_STARTX - ((GM_XOFFSET / 2) * (n-1)), y = GM_STARTY - ((GM_YOFFSET / 2) * (n-1));
M_DrawMenuTooltips();
M_DrawMenuPreviews();
if (menutransition.tics)
x -= 24 * menutransition.tics;
{
x += 24 * menutransition.tics;
}
for (i = 0; i < currentMenu->numitems; i++)
{
INT16 y;
if (i >= n)
{
x = GM_STARTX + (GM_XOFFSET * 5 / 2);
y = GM_STARTY + (GM_YOFFSET * 5 / 2);
if (i == n)
y = 160;
else
y = 80 - (16 * (n-1)) + (32 * i);
if (menutransition.tics)
{
x += 24 * menutransition.tics;
}
}
switch (currentMenu->menuitems[i].status & IT_DISPLAY)
{
case IT_STRING:
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, (i == itemOn) ? SKINCOLOR_PLAGUE : SKINCOLOR_PIGEON, GTC_CACHE);
V_DrawRightAlignedGamemodeString(x, y, 0, colormap, currentMenu->menuitems[i].text);
UINT8 *colormap = NULL;
if (i == itemOn)
{
colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PLAGUE, GTC_CACHE);
}
else
{
colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_MOSS, GTC_CACHE);
}
V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT, 0, W_CachePatchName("MENUPLTR", PU_CACHE), colormap);
V_DrawGamemodeString(x + 16, y - 3, V_ALLOWLOWERCASE, colormap, currentMenu->menuitems[i].text);
}
break;
}
x += GM_XOFFSET;
y += GM_YOFFSET;
}
}

View file

@ -663,6 +663,8 @@ static void M_NextOpt(void)
else
itemOn++;
} while (oldItemOn != itemOn && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_SPACE);
M_UpdateMenuBGImage(false);
}
static void M_PrevOpt(void)
@ -679,6 +681,8 @@ static void M_PrevOpt(void)
else
itemOn--;
} while (oldItemOn != itemOn && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_SPACE);
M_UpdateMenuBGImage(false);
}
//
@ -1411,6 +1415,8 @@ void M_SetupNextMenu(menu_t *menudef, boolean notransition)
}
}
}
M_UpdateMenuBGImage(false);
}
void M_GoBack(INT32 choice)
@ -1542,6 +1548,8 @@ void M_Init(void)
CV_RegisterVar(&cv_dummyscramble);
CV_RegisterVar(&cv_dummystaff);
M_UpdateMenuBGImage(true);
#if 0
#ifdef HWRENDER
// Permanently hide some options based on render mode

View file

@ -1973,6 +1973,8 @@ void V_DrawStringScaled(
}
break;
case GM_FONT:
spacew = 6;
break;
case FILE_FONT:
spacew = 0;
break;

View file

@ -571,51 +571,53 @@ void Y_IntermissionDrawer(void)
}
skiptallydrawer:
if (!LUA_HudEnabled(hud_intermissionmessages))
return;
if (timer && grandprixinfo.gp == false)
if (LUA_HudEnabled(hud_intermissionmessages))
{
char *string;
INT32 tickdown = (timer+1)/TICRATE;
if (multiplayer && demo.playback)
string = va("Replay ends in %d", tickdown);
else
string = va("%s starts in %d", cv_advancemap.string, tickdown);
V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol,
string);
}
if ((demo.recording || demo.savemode == DSM_SAVED) && !demo.playback)
switch (demo.savemode)
if (timer && grandprixinfo.gp == false)
{
case DSM_NOTSAVING:
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|hilicol, "Look Backward: Save replay");
break;
char *string;
INT32 tickdown = (timer+1)/TICRATE;
case DSM_SAVED:
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|hilicol, "Replay saved!");
break;
if (multiplayer && demo.playback)
string = va("Replay ends in %d", tickdown);
else
string = va("%s starts in %d", cv_advancemap.string, tickdown);
case DSM_TITLEENTRY:
ST_DrawDemoTitleEntry();
break;
default: // Don't render any text here
break;
V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol,
string);
}
//if ((intertic/TICRATE) & 1) // Make it obvious that scrambling is happening next round. (OR NOT, I GUESS)
//{
/*if (cv_scrambleonchange.value && cv_teamscramble.value)
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, hilicol, M_GetText("Teams will be scrambled next round!"));*/
if ((demo.recording || demo.savemode == DSM_SAVED) && !demo.playback)
switch (demo.savemode)
{
case DSM_NOTSAVING:
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|hilicol, "Look Backward: Save replay");
break;
if (speedscramble != -1 && speedscramble != gamespeed)
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, hilicol|V_ALLOWLOWERCASE|V_SNAPTOBOTTOM,
va(M_GetText("Next race will be %s Speed!"), kartspeed_cons_t[1+speedscramble].strvalue));
//}
case DSM_SAVED:
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|hilicol, "Replay saved!");
break;
case DSM_TITLEENTRY:
ST_DrawDemoTitleEntry();
break;
default: // Don't render any text here
break;
}
//if ((intertic/TICRATE) & 1) // Make it obvious that scrambling is happening next round. (OR NOT, I GUESS)
//{
/*if (cv_scrambleonchange.value && cv_teamscramble.value)
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, hilicol, M_GetText("Teams will be scrambled next round!"));*/
if (speedscramble != -1 && speedscramble != gamespeed)
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, hilicol|V_ALLOWLOWERCASE|V_SNAPTOBOTTOM,
va(M_GetText("Next race will be %s Speed!"), kartspeed_cons_t[1+speedscramble].strvalue));
//}
}
M_DrawMenuForeground();
}
//
@ -1010,6 +1012,8 @@ void Y_StartIntermission(void)
bgpatch = W_CachePatchName("MENUBG", PU_STATIC);
widebgpatch = W_CachePatchName("WEIRDRES", PU_STATIC);
M_UpdateMenuBGImage(true);
}
// ======