viewserver2 refactoring

This now takes advantage of regular menu drawing with styles and an enter routine instead of hardcoded v_draw*string calles
This commit is contained in:
NepDisk 2025-06-18 20:08:33 -04:00
parent 7852dfbf3a
commit 3f34bc68d3
7 changed files with 159 additions and 48 deletions

View file

@ -988,7 +988,7 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime)
{
//strncpy(netbuffer->u.serverinfo.maptitle, (char *)mapheaderinfo[gamemap-1]->lvlttl, sizeof netbuffer->u.serverinfo.maptitle);
// set up the levelstring
if (netbuffer->u.serverinfo.iszone || (mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE))
if (!netbuffer->u.serverinfo.iszone || (mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE))
{
if (mapheaderinfo[gamemap-1]->actnum[0])
snprintf(netbuffer->u.serverinfo.maptitle,

View file

@ -747,6 +747,7 @@ struct menu_routine_s const MENU_ROUTINES[] = {
{ "ASSIGNJOYSTICK", &MR_AssignJoystick },
{ "HANDLEMONITORTOGGLES", &MR_HandleMonitorToggles },
{ "RESTARTAUDIO", &MR_RestartAudio },
{ "ENTERVIEWSERVER", &MR_EnterViewServer },
{ "QUITVIEWSERVER", &MR_QuitViewServer },
{ "HANDLEVIEWSERVER", &MR_HandleViewServer },
{ "CAMERASETUP", &MR_CameraSetup },

View file

@ -777,18 +777,58 @@ INT32 G_MapNumber(const char * name)
INT32 G_LevelTitleToMapNum(const char * leveltitle)
{
INT32 map;
char *levelname;
char *levelnameact;
char *levelnamezone;
char *levelnameactzone;
for (map = 0; map < nummapheaders; ++map)
{
if (!strcasecmp(leveltitle, mapheaderinfo[map]->lvlttl))
levelname = zva(PU_STATIC, NULL, "%s %s", mapheaderinfo[map]->lvlttl);
levelnameact = zva(PU_STATIC, NULL, "%s %s", mapheaderinfo[map]->lvlttl, mapheaderinfo[map]->actnum);
levelnamezone = zva(PU_STATIC, NULL, "%s %s", mapheaderinfo[map]->lvlttl, mapheaderinfo[map]->zonttl);
levelnameactzone = zva(PU_STATIC, NULL, "%s %s %s", mapheaderinfo[map]->lvlttl, mapheaderinfo[map]->zonttl, mapheaderinfo[map]->actnum);
if (!strcasecmp(leveltitle, levelname))
{
Z_Free(levelname);
Z_Free(levelnameact);
Z_Free(levelnamezone);
Z_Free(levelnameactzone);
return map;
}
if (!strcasecmp(leveltitle, va("%s %s", mapheaderinfo[map]->lvlttl, mapheaderinfo[map]->actnum)))
if (!strcasecmp(leveltitle, levelnameact))
{
Z_Free(levelname);
Z_Free(levelnameact);
Z_Free(levelnamezone);
Z_Free(levelnameactzone);
return map;
}
if (!strcasecmp(leveltitle, levelnamezone))
{
Z_Free(levelname);
Z_Free(levelnameact);
Z_Free(levelnamezone);
Z_Free(levelnameactzone);
return map;
}
if (!strcasecmp(leveltitle, levelnameactzone))
{
Z_Free(levelname);
Z_Free(levelnameact);
Z_Free(levelnamezone);
Z_Free(levelnameactzone);
return map;
}
Z_Free(levelname);
Z_Free(levelnameact);
Z_Free(levelnamezone);
Z_Free(levelnameactzone);
}
return INT32_MIN;
}

View file

@ -6558,9 +6558,12 @@ static void Splitplayers_OnChange(void)
dummymultiplayer_cons_t[1].value = cv_splitplayers.value - 1;
}
// Tails 11-19-2002
INT32 MR_ConnectIP(INT32 choice)
{
int i;
(void)choice;
if (*cv_dummyip.string == 0)
@ -7942,10 +7945,83 @@ INT32 MR_HandleMonitorToggles(INT32 choice)
return true;
}
static char *serveraddon = NULL;
static char *serverping = NULL;
static char *servergametype = NULL;
INT32 MR_EnterViewServer(INT32 choice)
{
(void)choice;
char *servermap = serverlist[joinnode].info.maptitle;
char *servername = serverlist[joinnode].info.servername;
const char *speedstring = "Auto";
UINT32 ping = serverlist[joinnode].info.time;
UINT8 kartvars = serverlist[joinnode].info.kartvars;
serveraddon = zva(PU_STATIC, NULL, "\x82%d Addon%s", fileneedednum, fileneedednum > 1 ? "s" : "");
serverping = zva(PU_STATIC, NULL, "Ping: %s%ums", (ping < 128 ? "\x83" : (ping < 256 ? "\x82" : "\x85")), ping);
switch (kartvars & SV_SPEEDMASK)
{
case KARTSPEED_EASY:
speedstring = "Easy";
break;
case KARTSPEED_NORMAL:
speedstring = "Normal";
break;
case KARTSPEED_HARD:
speedstring = "Hard";
break;
}
servergametype = zva(PU_STATIC, NULL, "%s: %s", serverlist[joinnode].info.gametypename, speedstring);
M_SetItemText(MN_VIEWSERVER, "SERVERNAME", servername);
M_SetItemText(MN_VIEWSERVER, "SERVERPING", serverping);
M_SetItemText(MN_VIEWSERVER, "SERVERMAP", servermap);
M_SetItemText(MN_VIEWSERVER, "SERVERGAMETYPE", servergametype);
if (fileneedednum > 0)
{
M_SetItemText(MN_VIEWSERVER, "SERVERADDON", serveraddon);
}
else
{
M_SetItemText(MN_VIEWSERVER, "SERVERADDON", "Vanilla");
}
if (serverlist[joinnode].info.cheatsenabled)
{
M_SetItemText(MN_VIEWSERVER, "SERVERCHEATS", "Cheats");
}
else
{
M_SetItemText(MN_VIEWSERVER, "SERVERCHEATS", "");
}
if (kartvars & SV_DEDICATED)
{
M_SetItemText(MN_VIEWSERVER, "SERVERDEDICATED", "Dedicated Server");
}
else
{
M_SetItemText(MN_VIEWSERVER, "SERVERDEDICATED", "Listen Server");
}
return true;
}
INT32 MR_QuitViewServer(INT32 choice)
{
(void)choice;
if (serveraddon)
Z_Free(serveraddon);
if (serverping)
Z_Free(serverping);
if (servergametype)
Z_Free(servergametype);
D_QuitNetGame();
CL_Reset();
return true;
@ -7963,6 +8039,12 @@ INT32 MR_HandleViewServer(INT32 choice)
S_StartSound(NULL, sfx_menu1);
ChangeClientMode(CL_CHECKFILES);
M_ClearMenus(false);
if (serveraddon)
Z_Free(serveraddon);
if (serverping)
Z_Free(serverping);
if (servergametype)
Z_Free(servergametype);
return true;
break;
@ -7996,18 +8078,12 @@ INT32 MR_HandleViewServer(INT32 choice)
void M_DrawViewServer(void)
{
UINT32 ping = (UINT32)serverlist[joinnode].info.time;
UINT8 kartvars = serverlist[joinnode].info.kartvars;
const char *speedstring = "Auto";
const char *serverstring = "Listen";
const char *maptitle = serverlist[joinnode].info.maptitle;
INT32 mapnum = G_LevelTitleToMapNum(maptitle);
patch_t *current_map;
V_DrawFill(M_GetItemX(MN_VIEWSERVER, "TOPBOXXY"), M_GetItemY(MN_VIEWSERVER, "TOPBOXXY"), M_GetItemX(MN_VIEWSERVER, "TOPBOXWH"), M_GetItemY(MN_VIEWSERVER, "TOPBOXWH"), 159);
V_DrawThinString(M_GetItemX(MN_VIEWSERVER, "SERVERNAME"), M_GetItemY(MN_VIEWSERVER, "SERVERNAME"), V_ALLOWLOWERCASE, va("%s", serverlist[joinnode].info.servername));
if (mapnum == INT32_MIN)
{
V_DrawSmallScaledPatch(10, 18, 0, W_CachePatchName("RANDOMLV", PU_CACHE));
@ -8018,46 +8094,10 @@ void M_DrawViewServer(void)
V_DrawFixedPatch(10<<FRACBITS, 18<<FRACBITS, scale, 0, current_map, NULL);
}
switch (kartvars & SV_SPEEDMASK)
{
case KARTSPEED_EASY:
speedstring = "Easy";
break;
case KARTSPEED_NORMAL:
speedstring = "Normal";
break;
case KARTSPEED_HARD:
speedstring = "Hard";
break;
}
if (kartvars & SV_DEDICATED)
{
serverstring = "Dedicated";
}
V_DrawThinString(M_GetItemX(MN_VIEWSERVER, "SERVERPING"), M_GetItemY(MN_VIEWSERVER, "SERVERPING"), V_ALLOWLOWERCASE, va("Ping: %s%ums", (ping < 128 ? "\x83" : (ping < 256 ? "\x82" : "\x85")), ping));
V_DrawThinString(M_GetItemX(MN_VIEWSERVER, "SERVERMAP"), M_GetItemY(MN_VIEWSERVER, "SERVERMAP"), V_ALLOWLOWERCASE, va("%s", serverlist[joinnode].info.maptitle));
V_DrawThinString(M_GetItemX(MN_VIEWSERVER, "SERVERGAMETYPE"), M_GetItemY(MN_VIEWSERVER, "SERVERGAMETYPE"), V_ALLOWLOWERCASE, va("%s: %s", serverlist[joinnode].info.gametypename, speedstring));
if (fileneedednum > 0)
{
V_DrawThinString(M_GetItemX(MN_VIEWSERVER, "SERVERADDON"), M_GetItemY(MN_VIEWSERVER, "SERVERADDON"), V_ALLOWLOWERCASE|warningflags, va("%i Addons", fileneedednum));
}
else
{
V_DrawThinString(M_GetItemX(MN_VIEWSERVER, "SERVERADDON"), M_GetItemY(MN_VIEWSERVER, "SERVERADDON"), V_ALLOWLOWERCASE|highlightflags, "Vanilla");
}
if (serverlist[joinnode].info.cheatsenabled)
{
V_DrawRightAlignedThinString(M_GetItemX(MN_VIEWSERVER, "SERVERCHEATS"), M_GetItemY(MN_VIEWSERVER, "SERVERCHEATS"), V_ALLOWLOWERCASE|recommendedflags, "Cheats");
}
V_DrawRightAlignedThinString(M_GetItemX(MN_VIEWSERVER, "SERVERDEDICATED"), M_GetItemY(MN_VIEWSERVER, "SERVERDEDICATED"), V_ALLOWLOWERCASE|recommendedflags, va("%s Server", serverstring));
V_DrawFill(M_GetItemX(MN_VIEWSERVER, "MIDBOXXY"), M_GetItemY(MN_VIEWSERVER, "MIDBOXXY"), M_GetItemX(MN_VIEWSERVER, "MIDBOXWH"), M_GetItemY(MN_VIEWSERVER, "MIDBOXWH"), 159);
M_DrawGenericMenu();
if (!viewserver_showaddons)
{
INT32 i;
@ -8080,7 +8120,7 @@ void M_DrawViewServer(void)
{
if (playeramount <= 16)
{
UINT8 skinum = playerinfo[i].skin;
UINT16 skinum = playerinfo[i].skin;
INT32 flags = 0;
if (R_SkinAvailable(skins[skinum].name) == -1)

View file

@ -303,6 +303,7 @@ INT32 MR_ChangeControl(INT32 arg);
INT32 MR_AssignJoystick(INT32 arg);
INT32 MR_HandleMonitorToggles(INT32 choice);
INT32 MR_RestartAudio(INT32 choice);
INT32 MR_EnterViewServer(INT32 choice);
INT32 MR_QuitViewServer(INT32 choice);
INT32 MR_HandleViewServer(INT32 choice);
INT32 MR_CameraSetup(INT32 arg);

View file

@ -654,3 +654,31 @@ char *Z_StrDup(const char *s)
{
return strcpy(ZZ_Alloc(strlen(s) + 1), s);
}
/** Allocates and returns a string made out of varargs.
* Allocated for Zone Memory.
*
* \param format Format string.
* \return Pointer to the resulting string.
*/
char *zva(INT32 tag, void *user, const char *format, ...)
{
va_list argptr;
char *string;
va_start(argptr, format);
int size = vsnprintf(NULL, 0, format, argptr);
if (size < 0)
I_Error("Z_xva: can't format string");
string = Z_Malloc((unsigned)size+1, tag, user);
if (!string)
I_Error("Z_xva: out of memory");
va_end(argptr);
va_start(argptr, format);
vsprintf(string, format, argptr);
va_end(argptr);
return string;
}

View file

@ -145,6 +145,7 @@ size_t Z_TagsUsage(INT32 lowtag, INT32 hightag);
//
char *Z_StrDup(const char *in);
#define Z_Unlock(p) (void)p // TODO: remove this now that NDS code has been removed
char *zva(INT32 tag, void *user, const char *format, ...);
#ifdef __cplusplus
} // extern "C"