mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
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:
parent
521eff868c
commit
8289bf252f
7 changed files with 139 additions and 83 deletions
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
108
src/k_menudraw.c
108
src/k_menudraw.c
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ======
|
// ======
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue