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"); PR ("MKFNT");
REG; REG;
ADIM (AZ); ADIM (LT);
PR ("GAMEM"); PR ("GAMEM");
REG; REG;
ADIM (AZ);
PR ("FILEF"); PR ("FILEF");
REG; REG;

View file

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

View file

@ -18,17 +18,21 @@
// --------- // ---------
menuitem_t MainMenu[] = menuitem_t MainMenu[] =
{ {
{IT_STRING | IT_CALL, "Play", "Cut to the chase and start the race!", {IT_STRING | IT_CALL, "Play",
NULL, M_CharacterSelectInit, 0, 0}, "Cut to the chase and start the race!", NULL,
M_CharacterSelectInit, 0, 0},
{IT_STRING, "Extra", "Check out some bonus features.", {IT_STRING, "Extra",
NULL, NULL, 0, 0}, "Check out some bonus features.", "MENUI001",
NULL, 0, 0},
{IT_STRING, "Option", "Configure your controls, settings, and preferences.", {IT_STRING, "Option",
NULL, NULL, 0, 0}, "Configure your controls, settings, and preferences.", NULL,
NULL, 0, 0},
{IT_STRING | IT_CALL, "Quit", "Exit SRB2Kart.", {IT_STRING | IT_CALL, "Quit",
NULL, M_QuitSRB2, 0, 0}, "Exit \"Dr. Robotnik's Ring Racers\".", NULL,
M_QuitSRB2, 0, 0},
}; };
menu_t MainDef = KARTGAMEMODEMENU(MainMenu, NULL); 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 #define SERVERS_PER_PAGE 11
static UINT32 bgTextScroll = 0; 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) void M_DrawMenuBackground(void)
{ {
@ -95,14 +121,15 @@ void M_DrawMenuBackground(void)
INT32 text1loop = SHORT(text1->height); INT32 text1loop = SHORT(text1->height);
INT32 text2loop = SHORT(text2->width); INT32 text2loop = SHORT(text2->width);
fixed_t text1scroll = -(bgTextScroll % text1loop) * FRACUNIT; fixed_t text1scroll = -((bgTextScroll * MENUBG_TEXTSCROLL) % text1loop) * FRACUNIT;
fixed_t text2scroll = -(bgTextScroll % text2loop) * 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("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, V_DrawFixedPatch(text2scroll, (BASEVIDHEIGHT-8) * FRACUNIT,
FRACUNIT, V_TRANSLUCENT, text2, NULL); FRACUNIT, V_TRANSLUCENT, text2, NULL);
@ -114,7 +141,12 @@ void M_DrawMenuBackground(void)
V_DrawFixedPatch(8 * FRACUNIT, text1scroll + (text1loop * FRACUNIT), V_DrawFixedPatch(8 * FRACUNIT, text1scroll + (text1loop * FRACUNIT),
FRACUNIT, V_TRANSLUCENT, text1, NULL); FRACUNIT, V_TRANSLUCENT, text1, NULL);
bgTextScroll += 8; bgTextScroll++;
if (bgImageScroll > 0)
{
bgImageScroll--;
}
} }
void M_DrawMenuForeground(void) 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. // Converts a string into question marks.
// Used for the secrets menu, to hide yet-to-be-unlocked stuff. // Used for the secrets menu, to hide yet-to-be-unlocked stuff.
static const char *M_CreateSecretMenuOption(const char *str) 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 // M_DrawKartGamemodeMenu
// //
@ -411,33 +428,52 @@ void M_DrawGenericMenu(void)
// //
void M_DrawKartGamemodeMenu(void) void M_DrawKartGamemodeMenu(void)
{ {
INT16 i, x = 170;
UINT8 n = currentMenu->numitems-1; 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_DrawMenuTooltips();
M_DrawMenuPreviews();
if (menutransition.tics) if (menutransition.tics)
x -= 24 * menutransition.tics; {
x += 24 * menutransition.tics;
}
for (i = 0; i < currentMenu->numitems; i++) 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) if (menutransition.tics)
y = 160; {
else x += 24 * menutransition.tics;
y = 80 - (16 * (n-1)) + (32 * i); }
}
switch (currentMenu->menuitems[i].status & IT_DISPLAY) switch (currentMenu->menuitems[i].status & IT_DISPLAY)
{ {
case IT_STRING: case IT_STRING:
{ {
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, (i == itemOn) ? SKINCOLOR_PLAGUE : SKINCOLOR_PIGEON, GTC_CACHE); UINT8 *colormap = NULL;
V_DrawRightAlignedGamemodeString(x, y, 0, colormap, currentMenu->menuitems[i].text);
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; break;
} }
x += GM_XOFFSET;
y += GM_YOFFSET;
} }
} }

View file

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

View file

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

View file

@ -571,51 +571,53 @@ void Y_IntermissionDrawer(void)
} }
skiptallydrawer: skiptallydrawer:
if (!LUA_HudEnabled(hud_intermissionmessages)) if (LUA_HudEnabled(hud_intermissionmessages))
return;
if (timer && grandprixinfo.gp == false)
{ {
char *string; if (timer && grandprixinfo.gp == false)
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)
{ {
case DSM_NOTSAVING: char *string;
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|hilicol, "Look Backward: Save replay"); INT32 tickdown = (timer+1)/TICRATE;
break;
case DSM_SAVED: if (multiplayer && demo.playback)
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|hilicol, "Replay saved!"); string = va("Replay ends in %d", tickdown);
break; else
string = va("%s starts in %d", cv_advancemap.string, tickdown);
case DSM_TITLEENTRY: V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol,
ST_DrawDemoTitleEntry(); string);
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 ((demo.recording || demo.savemode == DSM_SAVED) && !demo.playback)
//{ switch (demo.savemode)
/*if (cv_scrambleonchange.value && cv_teamscramble.value) {
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, hilicol, M_GetText("Teams will be scrambled next round!"));*/ 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) case DSM_SAVED:
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, hilicol|V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|hilicol, "Replay saved!");
va(M_GetText("Next race will be %s Speed!"), kartspeed_cons_t[1+speedscramble].strvalue)); 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); bgpatch = W_CachePatchName("MENUBG", PU_STATIC);
widebgpatch = W_CachePatchName("WEIRDRES", PU_STATIC); widebgpatch = W_CachePatchName("WEIRDRES", PU_STATIC);
M_UpdateMenuBGImage(true);
} }
// ====== // ======