From 3f34bc68d37ebc6a6063bd6ae6bfc5a901ec66c2 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 18 Jun 2025 20:08:33 -0400 Subject: [PATCH] viewserver2 refactoring This now takes advantage of regular menu drawing with styles and an enter routine instead of hardcoded v_draw*string calles --- src/d_clisrv.c | 2 +- src/deh_tables.c | 1 + src/g_game.c | 44 +++++++++++++++- src/m_menu.c | 130 +++++++++++++++++++++++++++++++---------------- src/m_menu.h | 1 + src/z_zone.c | 28 ++++++++++ src/z_zone.h | 1 + 7 files changed, 159 insertions(+), 48 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index fce7d23c7..1f96800b6 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -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, diff --git a/src/deh_tables.c b/src/deh_tables.c index eca7682f9..44db8fdf0 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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 }, diff --git a/src/g_game.c b/src/g_game.c index e90487120..e72fe3e35 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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; } diff --git a/src/m_menu.c b/src/m_menu.c index eb9a70a43..b12added7 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -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< 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) diff --git a/src/m_menu.h b/src/m_menu.h index 279956d5e..54d0d44fb 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -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); diff --git a/src/z_zone.c b/src/z_zone.c index 0050089dd..0aa4aa7a0 100644 --- a/src/z_zone.c +++ b/src/z_zone.c @@ -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; +} + diff --git a/src/z_zone.h b/src/z_zone.h index 727b2bc4e..a8124b7f6 100644 --- a/src/z_zone.h +++ b/src/z_zone.h @@ -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"