Merge branch 'last-jartha-menu-fixes' into 'master'

jartha's final menu and HUD fixes/polish

Closes #846, #1039, #868, #996, and #823

See merge request KartKrew/Kart!2036
This commit is contained in:
AJ Martinez 2024-03-08 08:41:19 +00:00
commit 01dce3665a
26 changed files with 246 additions and 236 deletions

View file

@ -532,7 +532,7 @@ consvar_t cv_masterserver_token = Server("masterserver_token", "");
void MasterClient_Ticker(void);
consvar_t cv_masterserver_update_rate = Server("masterserver_update_rate", "15").min_max(2, 60).onchange_noinit(MasterClient_Ticker);
consvar_t cv_maxping = Server("maxdelay", "20").values(CV_Unsigned);
consvar_t cv_maxping = Server("maxdelay", "20").min_max(0, 30);
consvar_t cv_menujam = Server("menujam", "menu").values({{0, "menu"}, {1, "menu2"}, {2, "menu3"}});
consvar_t cv_menujam_update = Server("menujam_update", "Off").on_off();
consvar_t cv_netdemosyncquality = Server("netdemo_syncquality", "1").min_max(1, 35);
@ -541,7 +541,7 @@ consvar_t cv_netdemosize = Server("netdemo_size", "6").values(CV_Natural);
void NetTimeout_OnChange(void);
consvar_t cv_nettimeout = Server("nettimeout", "210").min_max(TICRATE/7, 60*TICRATE).onchange(NetTimeout_OnChange);
consvar_t cv_pause = NetVar("pausepermission", "Server").values({{0, "Server"}, {1, "All"}});
consvar_t cv_pause = NetVar("pausepermission", "Server Admins").values({{0, "Server Admins"}, {1, "Everyone"}});
consvar_t cv_pingmeasurement = Server("pingmeasurement", "Frames").values({{0, "Frames"}, {1, "Milliseconds"}});
consvar_t cv_playbackspeed = Server("playbackspeed", "1").min_max(1, 10).dont_save();
@ -1327,7 +1327,7 @@ consvar_t cv_chattime = Player("chattime", "8").min_max(5, 999);
consvar_t cv_chatwidth = Player("chatwidth", "150").min_max(64, 150);
// old shit console chat. (mostly exists for stuff like terminal, not because I cared if anyone liked the old chat.)
consvar_t cv_consolechat = Player("chatmode", "Window").values({{0, "Window"}, {1, "Console"}, {2, "Window (Hidden)"}});
consvar_t cv_consolechat = Player("chatmode", "Yes").values({{0, "Yes"}, {2, "No"}});
consvar_t cv_gamestochat = Player("gamestochat", "0").values(CV_Unsigned);
@ -1348,7 +1348,7 @@ consvar_t cv_mute = UnsavedNetVar("mute", "Off").on_off().onchange(Mute_OnChange
extern CV_PossibleValue_t glanisotropicmode_cons_t[];
void CV_glanisotropic_OnChange(void);
consvar_t cv_glanisotropicmode = OpenGL("gr_anisotropicmode", "1").values(glanisotropicmode_cons_t).onchange(CV_glanisotropic_OnChange).dont_save();
consvar_t cv_glanisotropicmode = OpenGL("gr_anisotropicmode", "1").values(glanisotropicmode_cons_t).onchange(CV_glanisotropic_OnChange);
consvar_t cv_glbatching = OpenGL("gr_batching", "On").on_off().dont_save();
@ -1368,7 +1368,7 @@ consvar_t cv_mute = UnsavedNetVar("mute", "Off").on_off().onchange(Mute_OnChange
consvar_t cv_glmodellighting = OpenGL("gr_modellighting", "Off").on_off();
#endif
consvar_t cv_glmodels = OpenGL("gr_models", "Off").on_off();
consvar_t cv_glmodels = OpenGL("gr_models", "On").on_off();
consvar_t cv_glshearing = OpenGL("gr_shearing", "Off").values({{0, "Off"}, {1, "On"}, {2, "Third-person"}});
consvar_t cv_glskydome = OpenGL("gr_skydome", "On").on_off();
consvar_t cv_glsolvetjoin = OpenGL("gr_solvetjoin", "On").on_off().dont_save();

View file

@ -687,7 +687,7 @@ static bool D_Display(void)
}
}
if (Playing())
if (Playing() || demo.playback)
{
HU_Drawer();
}

View file

@ -1958,43 +1958,6 @@ static void HU_DrawTitlecardCEcho(size_t num)
UINT32 hu_demotime;
UINT32 hu_demolap;
static void HU_DrawDemoInfo(void)
{
if (!multiplayer)/* netreplay */
{
V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-40, 0, M_GetText("Replay:"));
V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-32, 0, player_names[0]);
}
else
{
V_DrawRightAlignedThinString(BASEVIDWIDTH-2, BASEVIDHEIGHT-10, 0, demo.titlename);
}
if (modeattacking & ATTACKING_TIME)
{
V_DrawRightAlignedString((BASEVIDWIDTH/2)-4, BASEVIDHEIGHT-24, V_YELLOWMAP|V_MONOSPACE, "BEST TIME:");
if (hu_demotime != UINT32_MAX)
V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-24, V_MONOSPACE, va("%i'%02i\"%02i",
G_TicsToMinutes(hu_demotime,true),
G_TicsToSeconds(hu_demotime),
G_TicsToCentiseconds(hu_demotime)));
else
V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-24, V_MONOSPACE, "--'--\"--");
}
if (modeattacking & ATTACKING_LAP)
{
V_DrawRightAlignedString((BASEVIDWIDTH/2)-4, BASEVIDHEIGHT-16, V_YELLOWMAP|V_MONOSPACE, "BEST LAP:");
if (hu_demolap != UINT32_MAX)
V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-16, V_MONOSPACE, va("%i'%02i\"%02i",
G_TicsToMinutes(hu_demolap,true),
G_TicsToSeconds(hu_demolap),
G_TicsToCentiseconds(hu_demolap)));
else
V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-16, V_MONOSPACE, "--'--\"--");
}
}
//
// Song credits
@ -2068,11 +2031,6 @@ void HU_Drawer(void)
}
LUA_HUD_DrawList(luahuddrawlist_scores);
}
if (demo.playback)
{
HU_DrawDemoInfo();
}
}
if (cv_vhseffect.value && (paused || (demo.playback && cv_playbackspeed.value > 1)))
@ -2253,8 +2211,6 @@ void HU_drawPing(fixed_t x, fixed_t y, UINT32 lag, UINT32 pl, INT32 flags, boole
boolean drawlocal = (offline && cv_mindelay.value && lag <= (tic_t)cv_mindelay.value);
fixed_t x2, y2;
y = y - 10*FRACUNIT; // Making space for connection quality, sorry.
if (!server && lag <= (tic_t)cv_mindelay.value)
{
lag = cv_mindelay.value;

View file

@ -6005,13 +6005,41 @@ void K_drawKartHUD(void)
bool ta = modeattacking && !demo.playback;
INT32 flags = V_HUDTRANS|V_SLIDEIN|V_SNAPTOTOP|V_SNAPTORIGHT;
K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y + (ta ? 2 : 0), flags, 0);
if (ta)
if (modeattacking)
{
using srb2::Draw;
Draw(BASEVIDWIDTH - 19, 2)
.flags(flags | V_YELLOWMAP)
.align(Draw::Align::kRight)
.text("\xBE Restart");
if (ta)
{
using srb2::Draw;
Draw(BASEVIDWIDTH - 19, 2)
.flags(flags | V_YELLOWMAP)
.align(Draw::Align::kRight)
.text("\xBE Restart");
}
else
{
using srb2::Draw;
Draw row = Draw(BASEVIDWIDTH - 20, TIME_Y + 18).flags(flags).align(Draw::Align::kRight);
auto insert = [&](const char *label, UINT32 tics)
{
Draw::TextElement text =
tics != UINT32_MAX ?
Draw::TextElement(
"{}'{}\"{}",
G_TicsToMinutes(tics, true),
G_TicsToSeconds(tics),
G_TicsToCentiseconds(tics)
) :
Draw::TextElement("--'--\"--");
text.font(Draw::Font::kZVote);
row.x(-text.width()).flags(V_ORANGEMAP).text(label);
row.y(1).text(text);
row = row.y(10);
};
if (modeattacking & ATTACKING_TIME)
insert("Finish: ", hu_demotime);
if (modeattacking & ATTACKING_LAP)
insert("Best Lap: ", hu_demolap);
}
}
}

View file

@ -353,11 +353,10 @@ typedef enum
typedef enum
{
dopt_screenshot = 0,
dopt_addon,
dopt_advanced,
dopt_spacer1,
dopt_replay,
dopt_rprecord,
dopt_rpsync,
dopt_rpsize,
#ifdef HAVE_DISCORDRPC
dopt_discord,
@ -370,6 +369,14 @@ typedef enum
dopt_erase,
} dopt_e;
typedef enum
{
daopt_addon = 0,
daopt_spacer1,
daopt_replay,
daopt_replaycons,
} daopt_e;
extern menuitem_t OPTIONS_Profiles[];
extern menu_t OPTIONS_ProfilesDef;
@ -404,10 +411,8 @@ extern menu_t OPTIONS_VideoDef;
extern menuitem_t OPTIONS_VideoModes[];
extern menu_t OPTIONS_VideoModesDef;
#ifdef HWRENDER
extern menuitem_t OPTIONS_VideoOGL[];
extern menu_t OPTIONS_VideoOGLDef;
#endif
extern menuitem_t OPTIONS_VideoAdvanced[];
extern menu_t OPTIONS_VideoAdvancedDef;
extern menuitem_t OPTIONS_Sound[];
extern menu_t OPTIONS_SoundDef;
@ -420,7 +425,8 @@ extern menu_t OPTIONS_HUDOnlineDef;
typedef enum
{
gopt_gamespeed = 0,
gopt_spacer0 = 0,
gopt_gamespeed,
gopt_baselapcount,
gopt_frantic,
gopt_encore,
@ -451,8 +457,11 @@ extern menu_t OPTIONS_DataDef;
extern menuitem_t OPTIONS_DataScreenshot[];
extern menu_t OPTIONS_DataScreenshotDef;
extern menuitem_t OPTIONS_DataAddon[];
extern menu_t OPTIONS_DataAddonDef;
extern menuitem_t OPTIONS_DataAdvanced[];
extern menu_t OPTIONS_DataAdvancedDef;
extern menuitem_t OPTIONS_DataAdvancedAddon[];
extern menu_t OPTIONS_DataAdvancedAddonDef;
extern menuitem_t OPTIONS_DataErase[];
extern menu_t OPTIONS_DataEraseDef;
@ -1104,7 +1113,6 @@ void M_ProfileTryController(INT32 choice);
void M_ProfileControlsConfirm(INT32 choice);
// video modes menu (resolution)
void M_VideoModeMenu(INT32 choice);
void M_HandleVideoModes(INT32 ch);
// data stuff

View file

@ -3338,38 +3338,25 @@ static void M_DrawHighLowLevelTitle(INT16 x, INT16 y, INT16 map)
}
else
{
boolean donewithone = false;
char *ttlsource =
mapheaderinfo[map]->menuttl[0]
? mapheaderinfo[map]->menuttl
: mapheaderinfo[map]->lvlttl;
for (i = 0; i < 22; i++)
// If there are 2 or more words:
// - Last word goes on word2
// - Everything else on word1
char *p = strrchr(ttlsource, ' ');
if (p)
{
if (!ttlsource[i])
break;
if (ttlsource[i] == ' ')
{
if (!donewithone)
{
donewithone = true;
continue;
}
}
if (donewithone)
{
word2[word2len] = ttlsource[i];
word2len++;
}
else
{
word1[word1len] = ttlsource[i];
word1len++;
}
word2len = strlen(p + 1);
memcpy(word2, p + 1, word2len);
}
else
p = ttlsource + strlen(ttlsource);
word1len = p - ttlsource;
memcpy(word1, ttlsource, word1len);
}
if (!mapheaderinfo[map]->menuttl[0] && mapheaderinfo[map]->actnum)
@ -4545,9 +4532,12 @@ box_found:
}
/* FALLTHRU */
case IT_NOTHING:
case IT_DYBIGSPACE:
y += SMALLLINEHEIGHT;
break;
case IT_DYBIGSPACE:
y += SMALLLINEHEIGHT/2;
break;
#if 0
case IT_BIGSLIDER:
M_DrawThermo(x, y, currentMenu->menuitems[i].itemaction.cvar);

View file

@ -176,8 +176,6 @@ void M_ChangeCvarDirect(INT32 choice, consvar_t *cv)
choice *= (TICRATE/7);
else if (cv == &cv_maxsend)
choice *= 512;
else if (cv == &cv_maxping)
choice *= 50;
CV_AddValue(cv, choice);
}

View file

@ -10,7 +10,8 @@ target_sources(SRB2SDL2 PRIVATE
main-profile-select.c
options-1.c
options-data-1.c
options-data-addons.c
options-data-advanced-1.c
options-data-advanced-addon.c
options-data-erase-1.c
options-data-erase-profile.c
options-data-screenshots.c
@ -26,7 +27,7 @@ target_sources(SRB2SDL2 PRIVATE
options-server-advanced.c
options-sound.cpp
options-video-1.c
options-video-gl.c
options-video-advanced.c
options-video-modes.c
play-1.c
play-char-select.c

View file

@ -11,25 +11,25 @@
menuitem_t OPTIONS_Main[] =
{
{IT_STRING | IT_CALL, "Profile Setup", "Remap keys & buttons to your likings.",
{IT_STRING | IT_CALL, "Profile Setup", "Remap keys & buttons.",
NULL, {.routine = M_ProfileSelectInit}, 0, 0},
{IT_STRING | IT_CALL, "Video Options", "Change video settings such as the resolution.",
{IT_STRING | IT_CALL, "Video Options", "Change the resolution.",
NULL, {.routine = M_VideoOptions}, 0, 0},
{IT_STRING | IT_CALL, "Sound Options", "Adjust various sound settings such as the volume.",
{IT_STRING | IT_CALL, "Sound Options", "Adjust the volume.",
NULL, {.routine = M_SoundOptions}, 0, 0},
{IT_STRING | IT_SUBMENU, "HUD Options", "Options related to the Heads-Up Display.",
{IT_STRING | IT_SUBMENU, "HUD Options", "Tweak the Heads-Up Display.",
NULL, {.submenu = &OPTIONS_HUDDef}, 0, 0},
{IT_STRING | IT_CALL, "Gameplay Options", "Change various game related options",
{IT_STRING | IT_CALL, "Gameplay Options", "Modify game mechanics.",
NULL, {.routine = M_GameplayOptions}, 0, 0},
{IT_STRING | IT_CALL, "Server Options", "Change various specific options for your game server.",
{IT_STRING | IT_CALL, "Server Options", "Update server settings.",
NULL, {.routine = M_ServerOptions}, 0, 0},
{IT_STRING | IT_SUBMENU, "Data Options", "Miscellaneous data options such as the screenshot format.",
{IT_STRING | IT_SUBMENU, "Data Options", "Video recording, file saving, Discord status.",
NULL, {.submenu = &OPTIONS_DataDef}, 0, 0},
#ifdef TODONEWMANUAL
@ -96,9 +96,9 @@ void M_InitOptions(INT32 choice)
(M_SecretUnlocked(SECRET_ENCORE, false) ? (IT_STRING | IT_CVAR) : IT_DISABLED);
}
OPTIONS_DataDef.menuitems[dopt_addon].status = (M_SecretUnlocked(SECRET_ADDONS, true)
OPTIONS_DataAdvancedDef.menuitems[daopt_addon].status = (M_SecretUnlocked(SECRET_ADDONS, true)
? (IT_STRING | IT_SUBMENU)
: (IT_TRANSTEXT2 | IT_SPACE));
: (IT_NOTHING | IT_SPACE));
OPTIONS_DataDef.menuitems[dopt_erase].status = (gamestate == GS_MENU
? (IT_STRING | IT_SUBMENU)
: (IT_TRANSTEXT2 | IT_SPACE));
@ -212,6 +212,11 @@ static void M_OptionsMenuGoto(menu_t *assignment)
{
assignment->prevMenu = currentMenu;
M_SetupNextMenu(assignment, false);
if (currentMenu != &OPTIONS_MainDef)
{
optionsmenu.ticker = 0;
M_OptionsTick();
}
}
void M_VideoOptions(INT32 choice)
@ -232,12 +237,14 @@ void M_GameplayOptions(INT32 choice)
{
(void)choice;
M_OptionsMenuGoto(&OPTIONS_GameplayDef);
OPTIONS_MainDef.lastOn = mopt_gameplay;
}
void M_ServerOptions(INT32 choice)
{
(void)choice;
M_OptionsMenuGoto(&OPTIONS_ServerDef);
OPTIONS_MainDef.lastOn = mopt_server;
}
boolean M_OptionsInputs(INT32 ch)

View file

@ -10,11 +10,11 @@ extern consvar_t cv_netdemosize;
menuitem_t OPTIONS_Data[] =
{
{IT_STRING | IT_SUBMENU, "Video Recording...", "Set options relative to screenshot and movie capture.",
{IT_STRING | IT_SUBMENU, "Video Recording...", "Options for recording clips.",
NULL, {.submenu = &OPTIONS_DataScreenshotDef}, 0, 0},
{IT_STRING | IT_SUBMENU, "Addons...", "Set options relative to the addons menu.",
NULL, {.submenu = &OPTIONS_DataAddonDef}, 0, 0},
{IT_STRING | IT_SUBMENU, "Advanced...", "Technical settings that you probably don't want to change.",
NULL, {.submenu = &OPTIONS_DataAdvancedDef}, 0, 0},
{IT_SPACE | IT_NOTHING, NULL, NULL,
NULL, {NULL}, 0, 0},
@ -22,12 +22,9 @@ menuitem_t OPTIONS_Data[] =
{IT_HEADER, "Replays...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Record Replays", "Select when to save replays.",
{IT_STRING | IT_CVAR, "Record Replays", "How the save prompt should appear.",
NULL, {.cvar = &cv_recordmultiplayerdemos}, 0, 0},
{IT_STRING | IT_CVAR, "Net Consistency Quality", "For filesize, how often do we write position data in online replays?",
NULL, {.cvar = &cv_netdemosyncquality}, 0, 0},
{IT_STRING | IT_CVAR, "Buffer Size (MB)", "Lets replays last longer with more players. Uses more RAM.",
NULL, {.cvar = &cv_netdemosize}, 0, 0},
@ -51,7 +48,7 @@ menuitem_t OPTIONS_Data[] =
{IT_SPACE | IT_DYBIGSPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_SUBMENU, "\x85""Erase Data...", "Erase specific data. Be careful, what's deleted is gone forever!",
{IT_STRING | IT_SUBMENU, "\x85""Erase Data...", "Erase save data. Be careful, what's deleted is gone forever!",
NULL, {.submenu = &OPTIONS_DataEraseDef}, 0, 0},
};

View file

@ -0,0 +1,41 @@
/// \file menus/options-data-advanced.c
/// \brief Advanced Data Options
#include "../k_menu.h"
#include "../filesrch.h" // addons cvars
// advanced data options menu -- see daopt_e
menuitem_t OPTIONS_DataAdvanced[] =
{
{IT_STRING | IT_SUBMENU, "Addons...", NULL,
NULL, {.submenu = &OPTIONS_DataAdvancedAddonDef}, 0, 0},
{IT_NOTHING | IT_SPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_HEADER, "Replays (Advanced)...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Net Consistency Quality", "For filesize, how often do we write position data in online replays?",
NULL, {.cvar = &cv_netdemosyncquality}, 0, 0},
};
menu_t OPTIONS_DataAdvancedDef = {
sizeof (OPTIONS_DataAdvanced) / sizeof (menuitem_t),
&OPTIONS_DataDef,
0,
OPTIONS_DataAdvanced,
48, 80,
SKINCOLOR_BLUEBERRY, 0,
MBF_DRAWBGWHILEPLAYING,
NULL,
2, 5,
M_DrawGenericOptions,
M_DrawOptionsCogs,
M_OptionsTick,
NULL,
NULL,
NULL,
};

View file

@ -1,10 +1,7 @@
/// \file menus/options-data-addons.c
/// \brief Addon Options
#include "../k_menu.h"
#include "../filesrch.h" // addons cvars
menuitem_t OPTIONS_DataAddon[] =
menuitem_t OPTIONS_DataAdvancedAddon[] =
{
{IT_HEADER, "Addon List", NULL,
@ -27,11 +24,11 @@ menuitem_t OPTIONS_DataAddon[] =
};
menu_t OPTIONS_DataAddonDef = {
sizeof (OPTIONS_DataAddon) / sizeof (menuitem_t),
&OPTIONS_DataDef,
menu_t OPTIONS_DataAdvancedAddonDef = {
sizeof (OPTIONS_DataAdvancedAddon) / sizeof (menuitem_t),
&OPTIONS_DataAdvancedDef,
0,
OPTIONS_DataAddon,
OPTIONS_DataAdvancedAddon,
48, 80,
SKINCOLOR_BLUEBERRY, 0,
MBF_DRAWBGWHILEPLAYING,

View file

@ -10,7 +10,7 @@
menuitem_t OPTIONS_DataScreenshot[] =
{
#ifdef SRB2_CONFIG_ENABLE_WEBM_MOVIES
{IT_HEADER, "Movie Recording (F9)", NULL,
{IT_HEADER, "WebM Recording (F9)", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Max. Duration (s)", "Automatically stop recording after this much time.",
@ -28,10 +28,10 @@ menuitem_t OPTIONS_DataScreenshot[] =
{IT_SPACE | IT_NOTHING, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Resolution", "Video resolution",
{IT_STRING | IT_CVAR, "Resolution", "Video resolution.",
NULL, {.cvar = &cv_movie_resolution}, 0, 0},
{IT_STRING | IT_CVAR, "Max. FPS", "Video framerate",
{IT_STRING | IT_CVAR, "Max. FPS", "Video framerate.",
NULL, {.cvar = &cv_movie_fps}, 0, 0},
{IT_STRING | IT_CVAR, "Record Audio", "Record audio.",
@ -41,7 +41,7 @@ menuitem_t OPTIONS_DataScreenshot[] =
{IT_HEADER, "Lossless Recording (F10)", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Recording Format", "What file format will lossless recordings use?",
{IT_STRING | IT_CVAR, "Recording Format", "Which file format will lossless recordings use?",
NULL, {.cvar = &cv_lossless_recorder}, 0, 0},
};

View file

@ -10,16 +10,16 @@ menuitem_t OPTIONS_Gameplay[] =
{IT_HEADER, "Race...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Game Speed", "Change Game Speed for the next map.",
{IT_STRING | IT_CVAR, "Game Speed", "Gear for the next map.",
NULL, {.cvar = &cv_kartspeed}, 0, 0},
{IT_STRING | IT_CVAR, "Base Lap Count", "Change how many laps must be completed per race.",
{IT_STRING | IT_CVAR, "Base Lap Count", "How many laps must be completed per race.",
NULL, {.cvar = &cv_numlaps}, 0, 0},
{IT_STRING | IT_CVAR, "Frantic Items", "Make item odds crazier with more powerful items!",
NULL, {.cvar = &cv_kartfrantic}, 0, 0},
{IT_STRING | IT_CVAR, "Encore Mode", "Forces Encore Mode on for the next map.",
{IT_STRING | IT_CVAR, "Encore Mode", "Play in Encore Mode next map.",
NULL, {.cvar = &cv_kartencore}, 0, 0},
{IT_STRING | IT_CVAR, "Exit Countdown", "How long players have to finish after 1st place finishes.",
@ -29,20 +29,20 @@ menuitem_t OPTIONS_Gameplay[] =
{IT_HEADER, "Battle...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Time Limit", "Change the time limit for Battle rounds.",
{IT_STRING | IT_CVAR, "Time Limit", "Time limit for Battle rounds.",
NULL, {.cvar = &cv_timelimit}, 0, 0},
{IT_STRING | IT_CVAR, "Point Limit", "How many strikes it takes to win a Battle.",
NULL, {.cvar = &cv_pointlimit}, 0, 0},
{IT_STRING | IT_CVAR, "Starting Bumpers", "Change how many bumpers player start with in Battle.",
{IT_STRING | IT_CVAR, "Starting Bumpers", "How many bumpers players start with in Battle.",
NULL, {.cvar = &cv_kartbumpers}, 0, 0},
{IT_SPACE | IT_DYBIGSPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_SUBMENU, "Random Item Toggles...", "Change which items to enable for your games.",
{IT_STRING | IT_SUBMENU, "Random Item Toggles...", "Which items appear in your games.",
NULL, {.submenu = &OPTIONS_GameplayItemsDef}, 0, 0},
};

View file

@ -8,35 +8,31 @@
menuitem_t OPTIONS_HUD[] =
{
{IT_STRING | IT_CVAR, "Show HUD (F3)", "Toggles HUD display. Great for taking screenshots!",
{IT_STRING | IT_CVAR, "Show HUD (F3)", "Toggles the Heads-Up display. Great for taking screenshots!",
NULL, {.cvar = &cv_showhud}, 0, 0},
{IT_SPACE | IT_NOTHING, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Speedometer", "Choose to what speed unit to display or toggle off the speedometer.",
{IT_STRING | IT_CVAR, "Speedometer", "Choose which speed unit to display on the speedometer.",
NULL, {.cvar = &cv_kartspeedometer}, 0, 0},
{IT_SPACE | IT_NOTHING, NULL, NULL,
NULL, {NULL}, 0, 0},
/* -- Nah, console isn't even bound by default, if you know how to use it you can change the size there
{IT_STRING | IT_CVAR, "Console Text Size", "Size of the text within the console.",
NULL, {.cvar = &cv_constextsize}, 0, 0},*/
{IT_STRING | IT_CVAR, "Show FPS", "Displays the game framerate at the lower right corner of the screen.",
{IT_STRING | IT_CVAR, "Show FPS", "Displays the framerate in the lower right corner of the screen.",
NULL, {.cvar = &cv_ticrate}, 0, 0},
{IT_STRING | IT_CVAR, "Show Input Delay", "Displays your input delay at the lower right corner of the screen.",
{IT_STRING | IT_CVAR, "Show Input Delay", "Displays your input delay in the lower right corner of the screen.",
NULL, {.cvar = &cv_showping}, 0, 0},
{IT_STRING | IT_CVAR, "Show \"FOCUS LOST\"", "Displays \"FOCUS LOST\" when the game window isn't the active window.",
{IT_STRING | IT_CVAR, "Show \"FOCUS LOST\"", "Displays \"FOCUS LOST\" when the game cannot accept inputs.",
NULL, {.cvar = &cv_showfocuslost}, 0, 0},
{IT_SPACE | IT_NOTHING, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_SUBMENU, "Online Chat Options...", "HUD options related to the online chat box.",
{IT_STRING | IT_SUBMENU, "Online Chat Options...", "Visual options for the online chat box.",
NULL, {.submenu = &OPTIONS_HUDOnlineDef}, 0, 0},
};

View file

@ -7,7 +7,7 @@
menuitem_t OPTIONS_HUDOnline[] =
{
{IT_STRING | IT_CVAR, "Chat Mode", "Choose whether to display chat in its own window or the console.",
{IT_STRING | IT_CVAR, "Show Chat", "Show chat by default or keep it hidden until you open it.",
NULL, {.cvar = &cv_consolechat}, 0, 0},
{IT_SPACE | IT_NOTHING, NULL, NULL,
@ -28,7 +28,7 @@ menuitem_t OPTIONS_HUDOnline[] =
{IT_STRING | IT_CVAR, "Message Fadeout Time (s)", "How long chat messages stay displayed with the chat closed.",
NULL, {.cvar = &cv_chattime}, 0, 0},
{IT_STRING | IT_CVAR, "Message Tint", "Shows the tint for new chat messages when the box is closed.",
{IT_STRING | IT_CVAR, "Message Fadeout Tint", "Shows the tint for new chat messages when the box is closed.",
NULL, {.cvar = &cv_chatbacktint}, 0, 0},
};

View file

@ -12,16 +12,16 @@ menuitem_t OPTIONS_EditProfile[] = {
{IT_STRING | IT_CVAR | IT_CV_STRING, "Profile ID", "6-character long name to identify this Profile.",
NULL, {.cvar = &cv_dummyprofilename}, 0, 41},
{IT_STRING | IT_CALL, "Controls", "Select the button mappings for this Profile.",
{IT_STRING | IT_CALL, "Controls", "Change the button mappings.",
NULL, {.routine = M_ProfileDeviceSelect}, 0, 71},
{IT_STRING | IT_SUBMENU, "Accessibility", "Acccessibility and quality of life options.",
NULL, {.submenu = &OPTIONS_ProfileAccessibilityDef}, 0, 91},
{IT_STRING | IT_CALL, "Character", "Default character and color for this Profile.",
{IT_STRING | IT_CALL, "Character", "Default character and color.",
NULL, {.routine = M_CharacterSelect}, 0, 111},
{IT_STRING | IT_CVAR | IT_CV_STRING, "Player Tag", "Name displayed online when using this Profile.",
{IT_STRING | IT_CVAR | IT_CV_STRING, "Player Tag", "Name displayed online and in replays.",
NULL, {.cvar = &cv_dummyprofileplayername}, 0, 141},
{IT_STRING | IT_CALL, "Confirm", "Confirm changes.",

View file

@ -9,13 +9,13 @@ menuitem_t OPTIONS_Server[] =
{IT_HEADER, "Advertising...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR | IT_CV_STRING, "Server Name", "Change the name of your server.",
{IT_STRING | IT_CVAR | IT_CV_STRING, "Server Name", "Name of your server.",
NULL, {.cvar = &cv_servername}, 0, 0},
{IT_STRING | IT_CVAR | IT_CV_STRING, "Server Contact", "Where you should be contacted for Master Server moderation.",
{IT_STRING | IT_CVAR | IT_CV_STRING, "Server Contact", "How you should be contacted for Master Server moderation.",
NULL, {.cvar = &cv_server_contact}, 0, 0},
{IT_STRING | IT_CVAR, "Advertise", "Display your game in the Server Browser for other players.",
{IT_STRING | IT_CVAR, "Advertise", "Display your server in the Browser for other players to join.",
NULL, {.cvar = &cv_advertise}, 0, 0},
@ -28,49 +28,49 @@ menuitem_t OPTIONS_Server[] =
{IT_STRING | IT_CVAR, "Maximum Connections", "How many players & spectators can connect to the server.",
NULL, {.cvar = &cv_maxconnections}, 0, 0},
{IT_STRING | IT_CVAR, "CPU Difficulty", "Bots can fill unused slots. How strong should they be?",
{IT_STRING | IT_CVAR, "CPU Level", "Bots can fill unused slots. How strong should they be?",
NULL, {.cvar = &cv_kartbot}, 0, 0},
{IT_STRING | IT_CVAR, "Use PWR.LV", "Set whether players should be rated on their performance.",
{IT_STRING | IT_CVAR, "Use PWR.LV", "Should players should be rated on their performance?",
NULL, {.cvar = &cv_kartusepwrlv}, 0, 0},
{IT_HEADER, "Progression...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Intermission", "Set how long to stay on the result screen.",
{IT_STRING | IT_CVAR, "Intermission", "How long to stay on the result screen.",
NULL, {.cvar = &cv_inttime}, 0, 0},
{IT_STRING | IT_CVAR, "Map Progression", "Set how the next map is chosen.",
{IT_STRING | IT_CVAR, "Map Progression", "How the next map is chosen.",
NULL, {.cvar = &cv_advancemap}, 0, 0},
{IT_STRING | IT_CVAR, "Vote Timer", "Set how long players have to vote.",
{IT_STRING | IT_CVAR, "Vote Timer", "How long players have to vote.",
NULL, {.cvar = &cv_votetime}, 0, 0},
{IT_HEADER, "Permissions...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Allow Joining", "Sets whether players can connect to your server.",
{IT_STRING | IT_CVAR, "Allow Joining", "Let players connect to your server.",
NULL, {.cvar = &cv_allownewplayer}, 0, 0},
{IT_STRING | IT_CVAR, "Allow Downloads", "Allows joiners to download missing files from you.",
{IT_STRING | IT_CVAR, "Allow Downloads", "Let players download missing files from your server.",
NULL, {.cvar = &cv_downloading}, 0, 0},
{IT_STRING | IT_CVAR, "Pause Permissions", "Sets who can pause the game.",
{IT_STRING | IT_CVAR, "Pause Permissions", "Who is allowed to pause the game?",
NULL, {.cvar = &cv_pause}, 0, 0},
{IT_HEADER, "Chat...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Mute Chat", "Prevents non-admins from sending chat messages.",
{IT_STRING | IT_CVAR, "Mute Chat", "Prevent everyone but admins from sending chat messages.",
NULL, {.cvar = &cv_mute}, 0, 0},
{IT_STRING | IT_CVAR, "Chat Spam Protection", "Prevents too many message from a single player.",
{IT_STRING | IT_CVAR, "Chat Spam Protection", "Prevent too many messages from a single player.",
NULL, {.cvar = &cv_chatspamprotection}, 0, 0},
{IT_HEADER, "Advanced...", NULL,
{IT_SPACE | IT_DYBIGSPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_SUBMENU, "Advanced...", "Advanced options. Be careful when messing with these!",

View file

@ -22,13 +22,13 @@ menuitem_t OPTIONS_ServerAdvanced[] =
{IT_STRING | IT_CVAR, "Resynch. Attempts", "How many times to attempt sending data to desynchronized players.",
NULL, {.cvar = &cv_resynchattempts}, 0, 0},
{IT_STRING | IT_CVAR, "Ping Limit (ms)", "Players above the ping limit will get kicked from the server.",
{IT_STRING | IT_CVAR, "Delay Limit (tics)", "Players above the delay limit will get kicked from the server.",
NULL, {.cvar = &cv_maxping}, 0, 0},
{IT_STRING | IT_CVAR, "Ping Timeout (s)", "Players must be above the ping limit for this long before being kicked.",
{IT_STRING | IT_CVAR, "Delay Timeout (seconds)", "Players must be above the delay limit for this long before being kicked.",
NULL, {.cvar = &cv_pingtimeout}, 0, 0},
{IT_STRING | IT_CVAR, "Connection Timeout (tics)", "Players not giving any netowrk activity for this long are kicked.",
{IT_STRING | IT_CVAR, "Connection Timeout (tics)", "Players not giving any network activity for this long are kicked.",
NULL, {.cvar = &cv_nettimeout}, 0, 0},
{IT_STRING | IT_CVAR, "Join Timeout (tics)", "Players taking too long to join are kicked.",
@ -38,7 +38,7 @@ menuitem_t OPTIONS_ServerAdvanced[] =
{IT_HEADER, "Addon Downloading", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Max File Transfer", "Maximum size of the files that can be downloaded from joining clients. (KB)",
{IT_STRING | IT_CVAR, "Max File Transfer", "Maximum size of each file that joining players may download. (KB)",
NULL, {.cvar = &cv_maxsend}, 0, 0},
{IT_STRING | IT_CVAR, "File Transfer Speed", "File transfer packet rate. Larger values send more data.",
@ -48,13 +48,13 @@ menuitem_t OPTIONS_ServerAdvanced[] =
{IT_HEADER, "Logging", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Log Joiner IPs", "Shows the IP of connecting players.",
{IT_STRING | IT_CVAR, "Log Joiner IPs", "Shows the IP address of connecting players as they join.",
NULL, {.cvar = &cv_showjoinaddress}, 0, 0},
{IT_STRING | IT_CVAR, "Log Resynch", "Shows which players need resynchronization.",
NULL, {.cvar = &cv_blamecfail}, 0, 0},
{IT_STRING | IT_CVAR, "Log Transfers", "Shows when clients are downloading files from you.",
{IT_STRING | IT_CVAR, "Log Transfers", "Shows when players are downloading files from you.",
NULL, {.cvar = &cv_noticedownload}, 0, 0},
};

View file

@ -220,22 +220,22 @@ boolean input_routine(INT32)
menuitem_t OPTIONS_Sound[] =
{
{IT_STRING | IT_ARROWS | IT_CV_SLIDER, "Volume", "Adjust the volume of game audio.",
{IT_STRING | IT_ARROWS | IT_CV_SLIDER, "Volume", "Loudness of all game audio.",
NULL, {.routine = slider_routine}, 0, Slider::kMasterVolume},
{IT_STRING | IT_ARROWS | IT_CV_SLIDER, "SFX Volume", "Adjust the volume of sound effects.",
{IT_STRING | IT_ARROWS | IT_CV_SLIDER, "SFX Volume", "Loudness of sound effects.",
NULL, {.routine = slider_routine}, 0, Slider::kSfxVolume},
{IT_STRING | IT_ARROWS | IT_CV_SLIDER, "Music Volume", "Adjust the volume of music playback.",
{IT_STRING | IT_ARROWS | IT_CV_SLIDER, "Music Volume", "Loudness of music.",
NULL, {.routine = slider_routine}, 0, Slider::kMusicVolume},
{IT_SPACE | IT_NOTHING, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Chat Notifications", "Set when to play notification sounds when chat messages are received.",
{IT_STRING | IT_CVAR, "Chat Notifications", "Play a sound effect when chat messages appear.",
NULL, {.cvar = &cv_chatnotifications}, 0, 0},
{IT_STRING | IT_CVAR, "Character Voices", "Set how often to play character voices in game.",
{IT_STRING | IT_CVAR, "Character Voices", "How often to play character voices in a race.",
NULL, {.cvar = &cv_kartvoices}, 0, 0},
{IT_SPACE | IT_NOTHING, NULL, NULL,

View file

@ -2,7 +2,6 @@
/// \brief Video Options
#include "../k_menu.h"
#include "../r_main.h" // cv_skybox
#include "../v_video.h" // cv_globalgamma
#include "../r_fps.h" // fps cvars
@ -10,21 +9,21 @@
menuitem_t OPTIONS_Video[] =
{
{IT_STRING | IT_CALL, "Set Resolution...", "Change the screen resolution for the game.",
NULL, {.routine = M_VideoModeMenu}, 0, 0},
{IT_STRING | IT_SUBMENU, "Resolution...", "Change the aspect ratio and image quality.",
NULL, {.submenu = &OPTIONS_VideoModesDef}, 0, 0},
{IT_NOTHING|IT_SPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL)
{IT_STRING | IT_CVAR, "Fullscreen", "Set whether you want to use fullscreen or windowed mode.",
{IT_STRING | IT_CVAR, "Fullscreen", "Play on the big screen or in a small window.",
NULL, {.cvar = &cv_fullscreen}, 0, 0},
#endif
{IT_STRING | IT_CVAR, "Vertical Sync", "Works with your screen to reduce image tearing and judder.",
{IT_STRING | IT_CVAR, "V-Sync", "Reduce image tearing and judder.",
NULL, {.cvar = &cv_vidwait}, 0, 0},
{IT_STRING | IT_CVAR, "FPS Cap", "Handles the frame rate of the game (35 to match game logic)",
{IT_STRING | IT_CVAR, "FPS Cap", "Limit the frame rate. Higher values may consume more CPU usage.",
NULL, {.cvar = &cv_fpscap}, 0, 0},
{IT_STRING | IT_CVAR, "Screen Effect", "Uses a special effect when displaying the game.",
@ -33,45 +32,11 @@ menuitem_t OPTIONS_Video[] =
{IT_NOTHING|IT_SPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
#if 0 // See Profiles/Accessibility
{IT_STRING | IT_CVAR, "Screen Tilting", "The view rotatation on inclines can be disabled to reduce motion sickness.",
NULL, {.cvar = &cv_tilting}, 0, 0},
{IT_STRING | IT_CVAR, "Reduce Visual Effects", "If on, some less-important particle cues will be hidden.",
NULL, {.cvar = &cv_reducevfx}, 0, 0},
#endif
/*
{IT_STRING | IT_CVAR | IT_CV_SLIDER, "Gamma", "Adjusts the overall brightness of the game.",
NULL, {.cvar = &cv_globalgamma}, 0, 0},
{IT_NOTHING|IT_SPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
*/
{IT_HEADER, "Advanced...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Draw Distance", "How far objects can be drawn. A tradeoff between performance & visibility.",
NULL, {.cvar = &cv_drawdist}, 0, 0},
{IT_STRING | IT_CVAR, "Weather Draw Distance", "Affects how far weather visuals can be drawn. Lower values improve performance.",
NULL, {.cvar = &cv_drawdist_precip}, 0, 0},
{IT_STRING | IT_CVAR, "Enable Skyboxes", "Turning this off may improve performance, but reduces courses' background details.",
NULL, {.cvar = &cv_skybox}, 0, 0},
{IT_STRING | IT_CVAR, "Parallel Software", "Uses multiple CPU cores for the software renderer if available, for a FPS boost.",
NULL, {.cvar = &cv_parallelsoftware}, 0, 0},
#ifdef HWRENDER
{IT_NOTHING|IT_SPACE, NULL, NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_SUBMENU, "Hardware Options...", "For usage and configuration of the OpenGL renderer.",
NULL, {.submenu = &OPTIONS_VideoOGLDef}, 0, 0},
#endif
{IT_STRING | IT_SUBMENU, "Advanced...", "Advanced performance options and experimental rendering features.",
NULL, {.submenu = &OPTIONS_VideoAdvancedDef}, 0, 0},
};

View file

@ -2,10 +2,26 @@
/// \brief OpenGL Options
#include "../k_menu.h"
#include "../r_main.h" // cv_skybox
#include "../hardware/hw_main.h" // gl consvars
menuitem_t OPTIONS_VideoOGL[] =
menuitem_t OPTIONS_VideoAdvanced[] =
{
{IT_HEADER, "Performance...", NULL,
NULL, {NULL}, 0, 0},
{IT_STRING | IT_CVAR, "Draw Distance", "How far objects can be drawn. A tradeoff between performance & visibility.",
NULL, {.cvar = &cv_drawdist}, 0, 0},
{IT_STRING | IT_CVAR, "Weather Draw Distance", "Affects how far weather visuals can be drawn. Lower values improve performance.",
NULL, {.cvar = &cv_drawdist_precip}, 0, 0},
{IT_STRING | IT_CVAR, "Enable Skyboxes", "Turning this off may improve performance, but reduces courses' background details.",
NULL, {.cvar = &cv_skybox}, 0, 0},
{IT_STRING | IT_CVAR, "Parallel Software", "Uses multiple CPU cores for the software renderer if available, for a FPS boost.",
NULL, {.cvar = &cv_parallelsoftware}, 0, 0},
{IT_HEADER, "Rendering Backend...", "Watch people get confused anyway!!",
NULL, {NULL}, 0, 0},
@ -67,11 +83,11 @@ menuitem_t OPTIONS_VideoOGL[] =
NULL, {.cvar = &cv_glshearing}, 0, 0},
};
menu_t OPTIONS_VideoOGLDef = {
sizeof (OPTIONS_VideoOGL) / sizeof (menuitem_t),
menu_t OPTIONS_VideoAdvancedDef = {
sizeof (OPTIONS_VideoAdvanced) / sizeof (menuitem_t),
&OPTIONS_VideoDef,
0,
OPTIONS_VideoOGL,
OPTIONS_VideoAdvanced,
48, 80,
SKINCOLOR_PLAGUE, 0,
MBF_DRAWBGWHILEPLAYING,

View file

@ -12,6 +12,8 @@ menuitem_t OPTIONS_VideoModes[] = {
};
static void M_VideoModeMenu(void);
menu_t OPTIONS_VideoModesDef = {
sizeof (OPTIONS_VideoModes) / sizeof (menuitem_t),
&OPTIONS_VideoDef,
@ -25,20 +27,18 @@ menu_t OPTIONS_VideoModesDef = {
M_DrawVideoModes,
M_DrawOptionsCogs,
M_OptionsTick,
NULL,
M_VideoModeMenu,
NULL,
NULL,
};
// setup video mode menu
void M_VideoModeMenu(INT32 choice)
static void M_VideoModeMenu(void)
{
INT32 i, j, vdup, nummodes;
UINT32 width, height;
const char *desc;
(void)choice;
memset(optionsmenu.modedescs, 0, sizeof(optionsmenu.modedescs));
#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL)
@ -100,8 +100,6 @@ void M_VideoModeMenu(INT32 choice)
}
optionsmenu.vidm_column_size = (optionsmenu.vidm_nummodes+2) / 3;
M_SetupNextMenu(&OPTIONS_VideoModesDef, false);
}
// special menuitem key handler for video mode list

View file

@ -52,6 +52,8 @@ static void tick_routine(void)
{
case drace_mritems:
M_SetupNextMenu(&OPTIONS_GameplayItemsDef, false);
optionsmenu.ticker = 0;
M_OptionsTick();
break;
case drace_encore:

View file

@ -41,10 +41,10 @@ menuitem_t PLAY_MP_Host[] =
{IT_STRING | IT_ARROWS, "Gametype", "Choose the type of play on your serer.",
NULL, {.routine = M_HandleHostMenuGametype}, 0, 0},
{IT_STRING2 | IT_CALL, "Gameplay Options...", "Adjust settings pertaining to gameplay.",
{IT_STRING2 | IT_CALL, "Gameplay Options...", "Modify game mechanics.",
NULL, {.routine = M_GameplayOptions}, 0, 0},
{IT_STRING2 | IT_CALL, "Server Options...", "Adjust settings pertaining to online play.",
{IT_STRING2 | IT_CALL, "Server Options...", "Update server settings.",
NULL, {.routine = M_ServerOptions}, 0, 0},
{IT_STRING | IT_CALL, "Map Select", "Go on and select a level!",

View file

@ -1279,20 +1279,30 @@ static void ST_overlayDrawer(void)
{
if (!demo.attract && !P_IsLocalPlayer(stplyr) && !camera[viewnum].freecam)
{
if (!r_splitscreen)
if (r_splitscreen <= 1)
{
V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-40, V_HUDTRANSHALF, M_GetText("VIEWPOINT:"));
V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-32, V_HUDTRANSHALF, player_names[stplyr-players]);
}
else if (r_splitscreen == 1)
{
char name[MAXPLAYERNAME+12];
INT32 flags = V_SNAPTOBOTTOM | V_SPLITSCREEN | V_HUDTRANS;
INT32 x = BASEVIDWIDTH/2;
INT32 y = (BASEVIDHEIGHT / (r_splitscreen + 1)) - 34;
INT32 width = 50;
INT32 y = (viewnum == 0) ? 4 : BASEVIDHEIGHT/2-12;
sprintf(name, "VIEWPOINT: %s", player_names[stplyr-players]);
V_DrawRightAlignedThinString(BASEVIDWIDTH-40, y, V_HUDTRANSHALF|V_SNAPTOTOP|V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN, name);
if (r_splitscreen)
{
flags = (flags & ~V_ALPHAMASK) | V_HUDTRANSHALF;
y += 4;
}
else
{
V_DrawFill(x - width/2, y + 6, width, 2, flags | 31);
V_DrawCenteredThinString(x, y, flags | V_ORANGEMAP, "Watching");
}
const char *text = player_names[stplyr-players];
fixed_t textwidth = V_StringScaledWidth(FRACUNIT, FRACUNIT, FRACUNIT, flags, KART_FONT, text);
V_DrawStringScaled(x*FRACUNIT - textwidth/2, (y+10)*FRACUNIT,
FRACUNIT, FRACUNIT, FRACUNIT, flags, NULL, KART_FONT, text);
}
else if (r_splitscreen)
else
{
V_DrawCenteredThinString((vid.width/vid.dupx)/4, BASEVIDHEIGHT/2 - 12, V_HUDTRANSHALF|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_SPLITSCREEN, player_names[stplyr-players]);
}