From 0aaf5649ddb91f5db065e019775e4eabbb723af3 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 29 Mar 2024 22:03:35 +0000 Subject: [PATCH] Server Browser last-minute adjustments - Menu string for server count - Thin string for server name - Gear instead of difficulty (renamed to keep the old assets just in case online GP) - Pwr fixes - Handle -1 case as "No Pwr" - Adjust draw coords a little - Custom gametype support - Shows name as net-communicated instead of Pwr - Affects d_clisrv side a little bit too - All custom gametypes MUST show up on the Modded room, no exceptions - Cache gametype info instead of constant strcmp --- src/d_clisrv.c | 37 +++++++++++--- src/d_clisrv.h | 4 ++ src/k_menudraw.c | 67 ++++++++++++++++++-------- src/menus/play-online-server-browser.c | 23 ++++++++- 4 files changed, 105 insertions(+), 26 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index edab2f87b..1440b9193 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1537,15 +1537,16 @@ static boolean SL_InsertServer(serverinfo_pak* info, SINT8 node) i = SL_SearchServer(node); if (i == UINT32_MAX) { - // not found add it + // not found, check for packet format rejections + if (serverlistcount >= MAXSERVERLIST) return false; // list full if (info->_255 != 255) - return false;/* old packet format */ + return false; // old packet format if (info->packetversion != PACKETVERSION) - return false;/* old new packet format */ + return false; // old new packet format if (info->version != VERSION) return false; // Not same version. @@ -1554,16 +1555,40 @@ static boolean SL_InsertServer(serverinfo_pak* info, SINT8 node) return false; // Close, but no cigar. if (strcmp(info->application, SRB2APPLICATION)) - return false;/* that's a different mod */ + return false; // that's a different mod + } - if (serverlistultimatecount && info->modifiedgame != (mpmenu.room == 1)) - return false;/* CORE vs MODDED! But only on the server browser page. */ + const INT32 gtidentifier = G_GetGametypeByName(info->gametypename); + UINT8 gtcalc = GTCALC_RACE; + if (gtidentifier != GT_RACE) + { + gtcalc = (gtidentifier == GT_BATTLE) ? GTCALC_BATTLE : GTCALC_CUSTOM; + } + if (i == UINT32_MAX) + { + // Still not added to list... check for modifiedgame rejections + if (serverlistultimatecount) + { + // We're on the server browser page. We can reject based on our room. + if ( + ( + info->modifiedgame != false // self-declared + || (gtcalc == GTCALC_CUSTOM) // not a main two gametype + ) != (mpmenu.room == 1) + ) + { + return false; // CORE vs MODDED! + } + } + + // Ok, FINALLY now we can confirm i = serverlistcount++; } serverlist[i].info = *info; serverlist[i].node = node; + serverlist[i].cachedgtcalc = gtcalc; // resort server list M_SortServerList(); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 73430132b..81ac2e094 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -459,10 +459,14 @@ struct doomdata_t #endif #define MAXSERVERLIST (MAXNETNODES-1) +#define GTCALC_RACE 0 +#define GTCALC_BATTLE 1 +#define GTCALC_CUSTOM 2 struct serverelem_t { SINT8 node; serverinfo_pak info; + UINT8 cachedgtcalc; }; extern serverelem_t serverlist[MAXSERVERLIST]; diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 1d68588ab..39fd26d57 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -4151,7 +4151,7 @@ static void M_DrawServerCountAndHorizontalBar(void) if (throbindex == UINT8_MAX) { - V_DrawRightAlignedString( + V_DrawRightAlignedMenuString( BASEVIDWIDTH - currentMenu->x, y, highlightflags, @@ -4160,7 +4160,7 @@ static void M_DrawServerCountAndHorizontalBar(void) } else { - V_DrawRightAlignedString( + V_DrawRightAlignedMenuString( BASEVIDWIDTH - currentMenu->x - 12, y, highlightflags, text @@ -4186,11 +4186,15 @@ void M_DrawMPServerBrowser(void) patch_t *text1 = W_CachePatchName("MENUBGT1", PU_CACHE); patch_t *text2 = W_CachePatchName("MENUBGT2", PU_CACHE); - patch_t *raceh = W_CachePatchName("M_SERV1", PU_CACHE); - patch_t *batlh = W_CachePatchName("M_SERV2", PU_CACHE); + UINT8 i; - patch_t *racehs = W_CachePatchName("M_SERV12", PU_CACHE); - patch_t *batlhs = W_CachePatchName("M_SERV22", PU_CACHE); + patch_t *servpats[3]; + patch_t *gearpats[3]; + for (i = 0; i < 3; i++) + { + servpats[i] = W_CachePatchName(va("M_SERV%c", i + '1'), PU_CACHE); + gearpats[i] = W_CachePatchName(va("M_SGEAR%c", i + '1'), PU_CACHE); + } fixed_t text1loop = SHORT(text1->height)*FRACUNIT; fixed_t text2loop = SHORT(text2->width)*FRACUNIT; @@ -4199,7 +4203,6 @@ void M_DrawMPServerBrowser(void) const UINT8 basey = 56; const INT32 starty = basey - 18*mpmenu.scrolln + mpmenu.slide; INT32 ypos = 0; - UINT8 i; // background stuff V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName(header[mode][1], PU_CACHE), NULL); @@ -4221,8 +4224,6 @@ void M_DrawMPServerBrowser(void) // the actual server list. for (i = 0; i < serverlistcount; i++) { - - boolean racegt = strcmp(serverlist[i].info.gametypename, "Race") == 0; INT32 transflag = 0; INT32 basetransflag = 0; @@ -4242,13 +4243,23 @@ void M_DrawMPServerBrowser(void) { transflag = transflag << V_ALPHASHIFT; // shift the translucency flag. - if (itemOn == 2 && mpmenu.servernum == i) - V_DrawFixedPatch(startx*FRACUNIT, (starty + ypos)*FRACUNIT, FRACUNIT, transflag, racegt ? racehs : batlhs, NULL); - else - V_DrawFixedPatch(startx*FRACUNIT, (starty + ypos)*FRACUNIT, FRACUNIT, transflag, racegt ? raceh : batlh, NULL); + if (serverlist[i].cachedgtcalc < 3) + { + patch_t *focus; + if (itemOn == 2 && mpmenu.servernum == i) + { + focus = W_CachePatchName(va("M_SERH%c", serverlist[i].cachedgtcalc + '1'), PU_CACHE); + } + else + { + focus = servpats[serverlist[i].cachedgtcalc]; + } + + V_DrawFixedPatch(startx*FRACUNIT, (starty + ypos)*FRACUNIT, FRACUNIT, transflag, focus, NULL); + } // Server name: - V_DrawString(startx+11, starty + ypos + 6, transflag, serverlist[i].info.servername); + V_DrawThinString(startx+11, starty + ypos + 6, transflag, serverlist[i].info.servername); // Ping: V_DrawThinString(startx + 191, starty + ypos + 7, transflag, va("%03d", serverlist[i].info.time)); @@ -4256,16 +4267,34 @@ void M_DrawMPServerBrowser(void) // Playercount V_DrawThinString(startx + 214, starty + ypos + 7, transflag, va("%02d/%02d", serverlist[i].info.numberofplayer, serverlist[i].info.maxplayer)); - // Power Level - V_DrawThinString(startx + 248, starty + ypos, transflag, va("%04d PLv", serverlist[i].info.avgpwrlv)); + const char *pwrtext; + if (serverlist[i].cachedgtcalc == GTCALC_CUSTOM) + { + // Show custom gametype name + // (custom PWR is not available, and this is the best place to show the name) + pwrtext = serverlist[i].info.gametypename; + } + else if (serverlist[i].info.avgpwrlv != -1) + { + // Power Level + pwrtext = va("%04d Pwr", serverlist[i].info.avgpwrlv); + } + else + { + // Fallback + pwrtext = "No Pwr"; + } + V_DrawRightAlignedThinString(startx + 276, starty + ypos, transflag, pwrtext); // game speed if applicable: - if (racegt) + if (serverlist[i].cachedgtcalc != GTCALC_BATTLE) { UINT8 speed = serverlist[i].info.kartvars & SV_SPEEDMASK; - patch_t *pp = W_CachePatchName(va("M_SDIFF%d", speed), PU_CACHE); - V_DrawFixedPatch((startx + 251)*FRACUNIT, (starty + ypos + 9)*FRACUNIT, FRACUNIT, transflag, pp, NULL); + if (speed < 3) + { + V_DrawFixedPatch((startx + 251)*FRACUNIT, (starty + ypos + 9)*FRACUNIT, FRACUNIT, transflag, gearpats[speed], NULL); + } } } ypos += SERVERSPACE; diff --git a/src/menus/play-online-server-browser.c b/src/menus/play-online-server-browser.c index 05e65eaba..922ea6c5f 100644 --- a/src/menus/play-online-server-browser.c +++ b/src/menus/play-online-server-browser.c @@ -299,7 +299,28 @@ void M_ServerListFillDebug(void) strcpy(serverlist[i].info.servername, va("Serv %d", i+1)); - strcpy(serverlist[i].info.gametypename, i & 1 ? "Race" : "Battle"); + const char *tempgtname; + if (i < 10 && mpmenu.room == 1) + { + tempgtname = va("%c%c%c%c", + 'A' + M_RandomKey(26), + 'a' + M_RandomKey(26), + 'a' + M_RandomKey(26), + 'a' + M_RandomKey(26) + ); + } + else + tempgtname = (i & 1) ? "Race" : "Battle"; + + strcpy(serverlist[i].info.gametypename, tempgtname); + + const INT32 gtidentifier = G_GetGametypeByName(tempgtname); + UINT8 gtcalc = GTCALC_RACE; + if (gtidentifier != GT_RACE) + { + gtcalc = (gtidentifier == GT_BATTLE) ? GTCALC_BATTLE : GTCALC_CUSTOM; + } + serverlist[i].cachedgtcalc = gtcalc; serverlist[i].info.kartvars = M_RandomRange(0, 3) & SV_SPEEDMASK;