From 201c725dc7d2f90e8b636304767410df3f4043da Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 30 May 2025 02:19:13 +0200 Subject: [PATCH 1/8] cleanup d_main a little --- src/d_main.c | 247 ++++++++++++++++++++++++++------------------------- 1 file changed, 125 insertions(+), 122 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 728a1a760..d10ba05ab 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -197,12 +197,10 @@ static void D_PadMenuScrollInput(UINT8 input) // and pass it to the eventlist static void D_GamePadMenuScrollTicker(void) { + UINT8 i; static UINT8 menuInputDelayTimer = 0; - if (dedicated) - return; - - for (UINT8 i = 0; i < 4; i++) + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { if (dpadscrollstate[i]) { @@ -222,10 +220,10 @@ static void D_GamePadMenuScrollTicker(void) static void D_DeviceLEDTick(void) { UINT8 i; - static UINT16 color[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; - static UINT16 curcolor[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; + static UINT16 color[MAXSPLITSCREENPLAYERS] = {0}; + static UINT16 curcolor[MAXSPLITSCREENPLAYERS] = {0}; - if (dedicated || numcontrollers == 0) + if (numcontrollers == 0) { return; } @@ -252,7 +250,6 @@ static void D_DeviceLEDTick(void) void D_ProcessEvents(void) { event_t *ev; - boolean eaten; for (; eventtail != eventhead; eventtail = (eventtail+1) & (MAXEVENTS-1)) @@ -291,8 +288,10 @@ void D_ProcessEvents(void) // Demo input: if (demo.playback) + { if (M_DemoResponder(ev)) continue; // demo ate the event + } // console input #ifdef HAVE_THREADS @@ -317,6 +316,88 @@ void D_ProcessEvents(void) // draw current display, possibly wiping it from the previous // +static void D_Renderview(void) +{ + UINT8 i; + + if (automapactive) + return; + + R_ApplyLevelInterpolators(rendertimefrac); + + for (i = 0; i <= splitscreen; i++) + { + const boolean issplitscreen = (i > 0); + + if (!P_MobjWasRemoved(players[displayplayers[i]].mo) || players[displayplayers[i]].playerstate == PST_DEAD) + { + viewssnum = i; + + if (!issplitscreen) // Initialize for P1 + { + viewwindowy = viewwindowx = 0; + topleft = screens[0]; + objectsdrawn = 0; + } + +#ifdef HWRENDER + if (rendermode == render_opengl) + { + HWR_RenderPlayerView(); + R_RestoreLevelInterpolators(); + return; + } +#endif + if (issplitscreen) // Splitscreen-specific + { + const INT32 len = viewheight*sizeof(ylookup[0]); + + switch (i) + { + case 1: + if (splitscreen > 1) + { + viewwindowx = viewwidth; + viewwindowy = 0; + } + else + { + viewwindowx = 0; + viewwindowy = viewheight; + } + M_Memcpy(ylookup, ylookup2, len); + break; + case 2: + viewwindowx = 0; + viewwindowy = viewheight; + M_Memcpy(ylookup, ylookup3, len); + break; + case 3: + viewwindowx = viewwidth; + viewwindowy = viewheight; + M_Memcpy(ylookup, ylookup4, len); + default: + break; + } + + topleft = screens[0] + viewwindowy*vid.width + viewwindowx; + } + + R_RenderPlayerView(&players[displayplayers[i]]); + + if (issplitscreen) + M_Memcpy(ylookup, ylookup1, viewheight*sizeof (ylookup[0])); + } + + if (!issplitscreen) + R_ApplyViewMorph(); + + V_DoPostProcessor(i, postimgparam[i]); + } + + R_RestoreLevelInterpolators(); +} + // wipegamestate can be set to -1 to force a wipe on the next draw // added comment : there is a wipe eatch change of the gamestate gamestate_t wipegamestate = GS_LEVEL; @@ -327,7 +408,6 @@ static boolean D_Display(void) boolean forcerefresh = false; static boolean wipe = false; INT32 wipedefindex = 0; - UINT8 i; if (!dedicated) { @@ -366,6 +446,7 @@ static boolean D_Display(void) { // set for all later wipedefindex = gamestate; // wipe_xxx_toblack + if (gamestate == GS_TITLESCREEN && wipegamestate != GS_INTRO) wipedefindex = wipe_timeattack_toblack; else if (gamestate == GS_INTERMISSION) @@ -378,26 +459,28 @@ static boolean D_Display(void) if (!dedicated) { - // Fade to black first - if (gamestate != GS_LEVEL // fades to black on its own timing, always - && wipedefs[wipedefindex] != UINT8_MAX) + if (gamestate != GS_LEVEL) { - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - F_WipeEndScreen(); - F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK); - ranwipe = true; - } + // Fade to black first + if (wipedefs[wipedefindex] != UINT8_MAX) // fades to black on its own timing, always + { + F_WipeStartScreen(); + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + F_WipeEndScreen(); + F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK); + ranwipe = true; + } - if (gamestate != GS_LEVEL && rendermode != render_none) - { - V_SetPaletteLump("PLAYPAL"); // Reset the palette - R_ReInitColormaps(0, LUMPERROR); + if (rendermode != render_none) + { + V_SetPaletteLump("PLAYPAL"); // Reset the palette + R_ReInitColormaps(0, LUMPERROR); + } } F_WipeStartScreen(); } - else //dedicated servers + else // dedicated servers { F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK); ranwipe = true; @@ -405,7 +488,7 @@ static boolean D_Display(void) } } - if (dedicated) //bail out after wipe logic + if (dedicated) // bail out after wipe logic return false; // do buffered drawing @@ -430,9 +513,6 @@ static boolean D_Display(void) HU_Drawer(); break; - case GS_TIMEATTACK: - break; - case GS_INTRO: F_IntroDrawer(); if (wipegamestate == (gamestate_t)-1) @@ -484,6 +564,7 @@ static boolean D_Display(void) HU_Erase(); HU_Drawer(); } + case GS_TIMEATTACK: case GS_DEDICATEDSERVER: case GS_NULL: break; @@ -492,89 +573,10 @@ static boolean D_Display(void) if (gamestate == GS_LEVEL) { // draw the view directly - if (cv_renderview.value && !automapactive) + if (cv_renderview.value) { PS_START_TIMING(ps_rendercalltime); - - R_ApplyLevelInterpolators(rendertimefrac); - - for (i = 0; i <= splitscreen; i++) - { - if (!P_MobjWasRemoved(players[displayplayers[i]].mo) || players[displayplayers[i]].playerstate == PST_DEAD) - { - viewssnum = i; - - if (i == 0) // Initialize for P1 - { - viewwindowy = 0; - viewwindowx = 0; - - topleft = screens[0] + viewwindowy*vid.width + viewwindowx; - objectsdrawn = 0; - } - -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_RenderPlayerView(); - else -#endif - if (rendermode != render_none) - { - if (i > 0) // Splitscreen-specific - { - switch (i) - { - case 1: - if (splitscreen > 1) - { - viewwindowx = viewwidth; - viewwindowy = 0; - } - else - { - viewwindowx = 0; - viewwindowy = viewheight; - } - M_Memcpy(ylookup, ylookup2, viewheight*sizeof (ylookup[0])); - break; - case 2: - viewwindowx = 0; - viewwindowy = viewheight; - M_Memcpy(ylookup, ylookup3, viewheight*sizeof (ylookup[0])); - break; - case 3: - viewwindowx = viewwidth; - viewwindowy = viewheight; - M_Memcpy(ylookup, ylookup4, viewheight*sizeof (ylookup[0])); - default: - break; - } - - - topleft = screens[0] + viewwindowy*vid.width + viewwindowx; - } - - R_RenderPlayerView(&players[displayplayers[i]]); - - if (i > 0) - M_Memcpy(ylookup, ylookup1, viewheight*sizeof (ylookup[0])); - } - } - } - - if (rendermode == render_soft) - { - if (!splitscreen) - R_ApplyViewMorph(); - - for (i = 0; i <= splitscreen; i++) - { - V_DoPostProcessor(i, postimgparam[i]); - } - } - - R_RestoreLevelInterpolators(); - + D_Renderview(); PS_STOP_TIMING(ps_rendercalltime); } @@ -584,6 +586,7 @@ static boolean D_Display(void) { VID_BlitLinearScreen(screens[0], screens[1], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); } + lastdraw = false; } @@ -606,13 +609,8 @@ static boolean D_Display(void) // draw pause pic if (paused && cv_showhud.value && !demo.playback) { - INT32 py; - patch_t *patch; - if (automapactive) - py = 4; - else - py = viewwindowy + 4; - patch = W_CachePatchName("M_PAUSE", PU_PATCH); + INT32 py = (automapactive) ? 4 : (viewwindowy + 4); + patch_t *patch = W_CachePatchName("M_PAUSE", PU_PATCH); V_DrawScaledPatch(viewwindowx + (BASEVIDWIDTH - patch->width)/2, py, V_SNAPTOTOP, patch); } @@ -754,7 +752,7 @@ void D_SRB2Loop(void) // Casting the return value of a function is bad practice (apparently) double budget = ((R_GetFramerateCap() == 0) ? 0.0 : round((1.0 / R_GetFramerateCap()) * I_GetPrecisePrecision())); - capbudget = (precise_t) budget; + capbudget = (precise_t)budget; boolean ranwipe = false; @@ -824,12 +822,15 @@ void D_SRB2Loop(void) doDisplay = true; } - if (menuactive) + if (!dedicated) { - D_GamePadMenuScrollTicker(); - } + if (menuactive) + { + D_GamePadMenuScrollTicker(); + } - D_DeviceLEDTick(); + D_DeviceLEDTick(); + } } if (interp) @@ -841,7 +842,9 @@ void D_SRB2Loop(void) ps_interp_frac.value.p = (precise_t)((FIXED_TO_FLOAT(g_time.timefrac)) * 1000.0f); ps_interp_lag.value.p = (precise_t)((deltasecs) * 1000.0f); - if (!(paused || P_AutoPause()) && deltatics < 1.0 && !hu_stopped) + const boolean lagging = ((deltatics >= 1.0) || hu_stopped); + + if (!(paused || P_AutoPause()) && !lagging) { rendertimefrac = g_time.timefrac; } @@ -850,7 +853,7 @@ void D_SRB2Loop(void) rendertimefrac = FRACUNIT; } - if ((deltatics < 1.0) && !hu_stopped) + if (!lagging) { rendertimefrac_unpaused = g_time.timefrac; } -- 2.54.0 From 7d68c0598c89f66d2774c9b29d8a5bdb5300a209 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 30 May 2025 02:54:34 +0200 Subject: [PATCH 2/8] Fix underflow in consistancy checking code https://git.srb2.org/Hanicef/SRB2Classic/-/commit/9f5686ef48956cd64ef92f737e59cbbaa27d8cf9 --- src/d_clisrv.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 4e5a1cd9a..0135c76cd 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5388,7 +5388,7 @@ static void HandlePacketFromPlayer(SINT8 node) // Check player consistancy during the level if (gamestate == GS_LEVEL - && (realstart > gametic - TICQUEUE+1 && realstart <= gametic) + && (realstart <= gametic && realstart + TICQUEUE - 1 > gametic) && consistancy[realstart%TICQUEUE] != SHORT(netbuffer->u.clientpak.consistancy) && (!UseSaturnSynch(node) || (!resendingsavegame[node] && savegameresendcooldown[node] <= I_GetTime() && !SV_ResendingSavegameToAnyone()))) { @@ -5418,10 +5418,13 @@ static void HandlePacketFromPlayer(SINT8 node) } if (cv_blamecfail.value) + { CONS_Printf(M_GetText("Synch failure for player %d (%s); expected %hd, got %hd\n"), netconsole+1, player_names[netconsole], consistancy[realstart%TICQUEUE], SHORT(netbuffer->u.clientpak.consistancy)); + } + DEBFILE(va("Restoring player %d (synch failure) [%update] %d!=%d\n", netconsole, realstart, consistancy[realstart%TICQUEUE], SHORT(netbuffer->u.clientpak.consistancy))); @@ -5693,7 +5696,7 @@ static void HandlePacketFromPlayer(SINT8 node) break; } - //Update client ping table from the server. + // Update client ping table from the server. if (client) { UINT8 i; @@ -6503,7 +6506,6 @@ static inline void PingUpdate(void) if (pingtimeout[i] > 0) pingtimeout[i]--; } - } //kick lagging players... unless everyone but the server's ping sucks. -- 2.54.0 From 27c053cd4832e5dbe8e94110fb19da251d12ee5b Mon Sep 17 00:00:00 2001 From: chromaticpipe <127907268+chromaticpipe@users.noreply.github.com> Date: Fri, 30 May 2025 13:23:36 -0500 Subject: [PATCH 3/8] Add Server info screen, ported from SRB2Classic --- src/d_clisrv.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++--- src/d_clisrv.h | 3 ++ 2 files changed, 108 insertions(+), 5 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 4e5a1cd9a..a97c47987 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -87,6 +87,9 @@ boolean serverrunning = false; INT32 serverplayer = 0; char motd[254], server_context[8]; // Message of the Day, Unique Context (even without Mumble support) +plrinfo playerinfo[MAXPLAYERS]; +SINT8 joinnode = 0; // used for CL_VIEWSERVER + // Server specific vars UINT8 playernode[MAXPLAYERS]; @@ -1185,6 +1188,7 @@ typedef enum #endif CL_CONNECTED, CL_ABORTED, + CL_VIEWSERVER, CL_ASKFULLFILELIST, CL_CONFIRMCONNECT, #ifdef HAVE_CURL @@ -1248,7 +1252,7 @@ static inline void CL_DrawConnectionStatus(void) if (!menuactive) // menu already draws its own fade V_DrawFadeScreen(0xFF00, 16); // force default - if (cl_mode != CL_DOWNLOADFILES && cl_mode != CL_LOADFILES && cl_mode != CL_CHECKFILES + if (cl_mode != CL_DOWNLOADFILES && cl_mode != CL_LOADFILES && cl_mode != CL_CHECKFILES && cl_mode != CL_VIEWSERVER #ifdef HAVE_CURL && cl_mode != CL_DOWNLOADHTTPFILES #endif @@ -1368,6 +1372,78 @@ static inline void CL_DrawConnectionStatus(void) V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS, va(" %2u/%2u Files",loadcompletednum,fileneedednum)); } + else if (cl_mode == CL_VIEWSERVER) + { + V_DrawFill(8, 16, BASEVIDWIDTH - 16, 54, 239); + + V_DrawThinString(12 + 80, 18, V_ALLOWLOWERCASE, va("%s", serverlist[joinnode].info.servername)); + + const char *map = va("%sP", serverlist[joinnode].info.mapname); + patch_t *current_map = W_LumpExists(map) ? W_CachePatchName(map, PU_CACHE) : W_CachePatchName("BLANKLVL", PU_CACHE); + V_DrawSmallScaledPatch(10, 18, 0, current_map); + + V_DrawThinString(12 + 80, 38, V_ALLOWLOWERCASE, va("%s", serverlist[joinnode].info.maptitle)); + V_DrawThinString(12 + 80, 48, V_ALLOWLOWERCASE, va("%s", Gametype_Names[serverlist[joinnode].info.gametype])); + + if (fileneedednum > 0) + { + V_DrawThinString(12 + 80, 58, V_ALLOWLOWERCASE|V_ORANGEMAP, va("%i Addons", fileneedednum)); + } + else + { + V_DrawThinString(12 + 80, 58, V_ALLOWLOWERCASE|V_YELLOWMAP, "Vanilla"); + } + + if (serverlist[joinnode].info.cheatsenabled) + { + V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_GREENMAP, "Cheats"); + } + + V_DrawFill(8, 72, BASEVIDWIDTH - 16, 112, 239); + + V_DrawString(12, 74, V_ALLOWLOWERCASE|V_YELLOWMAP, "Players"); + V_DrawRightAlignedString(BASEVIDWIDTH - 12, 74, V_ALLOWLOWERCASE|V_YELLOWMAP, va("%i / %i", serverlist[joinnode].info.numberofplayer, serverlist[joinnode].info.maxplayer)); + + INT32 i; + INT32 count = 0; + INT32 x = 14; + INT32 y = 84; + INT32 statuscolor = 1; + char player_name[MAXPLAYERNAME+1]; + if (serverlist[joinnode].info.numberofplayer > 0) + { + for (i = 0; i < MAXPLAYERS; i++) + { + if (playerinfo[i].node < 255) + { + strncpy(player_name, playerinfo[i].name, MAXPLAYERNAME); + V_DrawThinString(x + 10, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE, player_name); + + if (playerinfo[i].team == 0) { statuscolor = 184; } // playing + if (playerinfo[i].data & 0x20) { statuscolor = 86; } // tag IT + if (playerinfo[i].team == 1) { statuscolor = 128; } // ctf red team + if (playerinfo[i].team == 2) { statuscolor = 232; } // ctf blue team + if (playerinfo[i].team == 255) { statuscolor = 16; } // spectator or non-team + + V_DrawFill(x, y, 7, 7, 31); + V_DrawFill(x, y, 6, 6, statuscolor); + + y += 9; + count++; + if ((count == 11) || (count == 22)) + { + x += 104; + y = 84; + } + } + } + } + + // Buttons + V_DrawFill(8, BASEVIDHEIGHT - 14, BASEVIDWIDTH - 16, 12, 239); + V_DrawThinString(16, BASEVIDHEIGHT - 12, V_ALLOWLOWERCASE, va("[%sESC%s] = Abort", "\x82", "\x80")); + V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, BASEVIDHEIGHT - 12, V_ALLOWLOWERCASE, va("[%sENTER%s] = Join", "\x82", "\x80")); + } else if (filedownload.current != -1) { INT32 dldlength; @@ -2495,7 +2571,7 @@ static boolean CL_ServerConnectionSearchTicker(tic_t *asksent) return true; } - cl_mode = CL_CHECKFILES; + cl_mode = CL_VIEWSERVER; } else { @@ -2549,7 +2625,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic case CL_ASKFULLFILELIST: if (cl_lastcheckedfilecount == UINT16_MAX) // All files retrieved - cl_mode = CL_CHECKFILES; + cl_mode = CL_VIEWSERVER; else if (fileneedednum != cl_lastcheckedfilecount || I_GetTime() >= *asksent) { if (CL_AskFileList(fileneedednum)) @@ -2715,6 +2791,15 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic D_ProcessEvents(); //needed for menu system to receive inputs key = I_GetKey(); + + if (cl_mode == CL_VIEWSERVER) + { + if (gamekeydown[KEY_ENTER]) + cl_mode = CL_CHECKFILES; + else if (gamekeydown[KEY_ESCAPE]) + cl_mode = CL_ABORTED; + } + // Only ESC and non-keyboard keys abort connection if (!modeattacking && (key == KEY_ESCAPE || key == KEY_JOY1+1 || cl_mode == CL_ABORTED)) { @@ -4909,6 +4994,16 @@ static void HandleServerInfo(SINT8 node) if (client && cl_mode > CL_SEARCHING && node == servernode) memcpy(connectedservername, netbuffer->u.serverinfo.servername, MAXSERVERNAME); } + + +static void HandlePlayerInfo(SINT8 node) +{ + (void)node; + + INT32 i; + for (i = 0; i < MAXPLAYERS; i++) + playerinfo[i] = netbuffer->u.playerinfo[i]; +} #endif #ifdef SATURNPAK @@ -5197,6 +5292,10 @@ static void HandlePacketFromAwayNode(SINT8 node) case PT_CLIENTCMD: break; // This is not an "unknown packet" + + case PT_PLAYERINFO: + HandlePlayerInfo(node); + break; case PT_SERVERTICS: // Do not remove my own server (we have just get a out of order packet) @@ -5789,8 +5888,9 @@ static void GetPackets(void) } #endif - if (netbuffer->packettype == PT_PLAYERINFO) - continue; // We do nothing with PLAYERINFO, that's for the MS browser. + /*if (netbuffer->packettype == PT_PLAYERINFO) + continue; // We do nothing with PLAYERINFO, that's for the MS browser. Not quite true anymore :p*/ + // We also count unknown packets, hence "<=" if (netbuffer->packettype <= NUMPACKETTYPE) diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 6202c8c52..221375c35 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -577,6 +577,9 @@ extern boolean acceptnewnode; extern SINT8 servernode; extern char connectedservername[MAXSERVERNAME+1]; +extern plrinfo playerinfo[MAXPLAYERS]; +extern SINT8 joinnode; + void Command_Ping_f(void); extern tic_t connectiontimeout; extern tic_t jointimeout; -- 2.54.0 From c04ba992a7aeb108ae3ce40259eb8f5ff8089a12 Mon Sep 17 00:00:00 2001 From: chromaticpipe <127907268+chromaticpipe@users.noreply.github.com> Date: Fri, 30 May 2025 13:26:27 -0500 Subject: [PATCH 4/8] Forgort something --- src/d_clisrv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index a97c47987..e27d454d3 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2545,6 +2545,7 @@ static boolean CL_ServerConnectionSearchTicker(tic_t *asksent) if (i < 0) return true; } + joinnode = i; // Quit here rather than downloading files and being refused later. if (serverlist[i].info.numberofplayer >= serverlist[i].info.maxplayer) -- 2.54.0 From dd499a410f2dacf222a1c98fcab498c56dd36e23 Mon Sep 17 00:00:00 2001 From: chromaticpipe <127907268+chromaticpipe@users.noreply.github.com> Date: Fri, 30 May 2025 13:30:47 -0500 Subject: [PATCH 5/8] Very bad gamepad support --- src/d_clisrv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e27d454d3..30a450ee0 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2795,9 +2795,9 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic if (cl_mode == CL_VIEWSERVER) { - if (gamekeydown[KEY_ENTER]) + if (key == KEY_ENTER || key == KEY_JOY1) cl_mode = CL_CHECKFILES; - else if (gamekeydown[KEY_ESCAPE]) + else if (key == KEY_ESCAPE || key == KEY_JOY1+1) cl_mode = CL_ABORTED; } -- 2.54.0 From 6617382f54298869c7a557bf2c7c69e04412543d Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 30 May 2025 23:59:08 +0200 Subject: [PATCH 6/8] Revert "reset the palette earlier during levelload" This reverts commit 5e532a76cfba090a8150d72c7ec0cb018cde4c39. --- src/p_setup.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 47327e3ca..0459a03f5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2807,10 +2807,6 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate) CON_Drawer(); // let the user know what we are going to do I_FinishUpdate(); // page flip or blit buffer - // Reset the palette - if (rendermode != render_none) - V_SetPaletteLump("PLAYPAL"); - // Initialize sector node list. P_Initsecnode(); @@ -2879,7 +2875,10 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate) // Reset the palette now all fades have been done if (rendermode != render_none) - V_ReloadPalette(); // Set the level palette + { + //V_ResetPaletteCVars(); // dont carry over changed palettes + V_SetPaletteLump(GetPalette()); // Set the level palette + } // Print "SPEEDING OFF TO [ZONE] [ACT 1]..." /*if (rendermode != render_none) -- 2.54.0 From 55c6ba6d12fb4222e6baf15cbc85ea8d7dd2b6d2 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 31 May 2025 15:57:03 +0200 Subject: [PATCH 7/8] fix awayview join crash player->awayviewmobj may not exist yet in some cases --- src/r_main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/r_main.c b/src/r_main.c index f16d138ee..15f17db9d 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1063,7 +1063,7 @@ static void R_SetupCommonFrame(player_t * player, sector_t * sector) static void R_SetupAimingFrame(player_t *player, camera_t *thiscam) { - if (player->awayviewtics) + if (player->awayviewtics && player->awayviewmobj) { newview->aim = player->awayviewaiming; newview->angle = player->awayviewmobj->angle; @@ -1169,7 +1169,7 @@ void R_SkyboxFrame(int s) { mapheader_t *mh = mapheaderinfo[gamemap-1]; - if (player->awayviewtics) + if (player->awayviewtics && player->awayviewmobj) { SETUPSKYVIEW(player->awayviewmobj, (player->awayviewmobj->z + 20*FRACUNIT)); } @@ -1226,7 +1226,7 @@ void R_SetupFrame(int s, boolean skybox) R_SetupAimingFrame(player, thiscam); - if (player->awayviewtics) // cut-away view stuff + if (player->awayviewtics && player->awayviewmobj) // cut-away view stuff { viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN I_Assert(viewmobj != NULL); @@ -1235,7 +1235,7 @@ void R_SetupFrame(int s, boolean skybox) newview->y = viewmobj->y; newview->z = viewmobj->z + 20*FRACUNIT; - if (!P_MobjWasRemoved(viewmobj) && viewmobj->subsector && viewmobj->subsector->sector) + if (viewmobj->subsector && viewmobj->subsector->sector) sector = viewmobj->subsector->sector; R_SetupCommonFrame(player, sector); @@ -1253,7 +1253,7 @@ void R_SetupFrame(int s, boolean skybox) R_SetupCommonFrame(player, sector); } - else // use the player's eyes view + else if (player->mo) // use the player's eyes view { viewmobj = player->mo; I_Assert(viewmobj != NULL); @@ -1262,7 +1262,7 @@ void R_SetupFrame(int s, boolean skybox) newview->y = viewmobj->y; newview->z = player->viewz; - if (!P_MobjWasRemoved(viewmobj) && viewmobj->subsector && viewmobj->subsector->sector) + if (viewmobj->subsector && viewmobj->subsector->sector) sector = viewmobj->subsector->sector; R_SetupCommonFrame(player, sector); -- 2.54.0 From 74646acdcad54b633c69efe97892f64bd3099b6d Mon Sep 17 00:00:00 2001 From: chromaticpipe <127907268+chromaticpipe@users.noreply.github.com> Date: Sat, 31 May 2025 16:27:34 -0500 Subject: [PATCH 8/8] Options. --- src/d_clisrv.c | 6 ++++-- src/d_clisrv.h | 2 ++ src/d_netcmd.c | 1 + src/m_menu.c | 28 +++++++++++++++------------- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 30a450ee0..4b279c58a 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2572,7 +2572,7 @@ static boolean CL_ServerConnectionSearchTicker(tic_t *asksent) return true; } - cl_mode = CL_VIEWSERVER; + cl_mode = (cv_serverinfoscreen.value) ? CL_VIEWSERVER : CL_CHECKFILES; } else { @@ -2626,7 +2626,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic case CL_ASKFULLFILELIST: if (cl_lastcheckedfilecount == UINT16_MAX) // All files retrieved - cl_mode = CL_VIEWSERVER; + cl_mode = (cv_serverinfoscreen.value) ? CL_VIEWSERVER : CL_CHECKFILES; else if (fileneedednum != cl_lastcheckedfilecount || I_GetTime() >= *asksent) { if (CL_AskFileList(fileneedednum)) @@ -4228,6 +4228,8 @@ consvar_t cv_downloadspeed = {"downloadspeed", "300", CV_SAVE, downloadspeed_con static CV_PossibleValue_t connectawaittime_cons_t[] = {{1, "MIN"}, {60, "MAX"}, {0, "Inf"}, {0, NULL}}; consvar_t cv_connectawaittime = {"connectawaittime", "5", CV_SAVE, connectawaittime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_serverinfoscreen = {"serverinfoscreen", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + static void Got_AddPlayer(UINT8 **p, INT32 playernum); static void Got_RemovePlayer(UINT8 **p, INT32 playernum); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 221375c35..35c77ce12 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -611,6 +611,8 @@ extern consvar_t cv_connectawaittime; extern consvar_t cv_discordinvites; +extern consvar_t cv_serverinfoscreen; + // Used in d_net, the only dependence //tic_t ExpandTics(INT32 low, tic_t basetic); void D_ClientServerInit(void); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1970b5323..d73d6829a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -902,6 +902,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_netticbuffer); CV_RegisterVar(&cv_mindelay); CV_RegisterVar(&cv_gentlemens); + CV_RegisterVar(&cv_serverinfoscreen); #ifdef NETGAME_DEVMODE CV_RegisterVar(&cv_fishcake); diff --git a/src/m_menu.c b/src/m_menu.c index 65dab3e6a..b856c3a8a 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2188,29 +2188,30 @@ static menuitem_t OP_SaturnMenu[] = {IT_STRING | IT_CVAR, NULL, "Minimum Input Delay", &cv_mindelay, 20}, {IT_STRING | IT_CVAR, NULL, "Gentlemens Ping", &cv_gentlemens, 25}, + {IT_STRING | IT_CVAR, NULL, "Server Info Screen", &cv_serverinfoscreen, 30}, - {IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 35}, + {IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 40}, - {IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 45}, - {IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 50}, + {IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 50}, + {IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 55}, - {IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 60}, + {IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 65}, - {IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 70}, + {IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 75}, - {IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 80}, + {IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 85}, - {IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 90}, + {IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 95}, - {IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 100}, + {IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 105}, - {IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 110}, + {IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 115}, - {IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 120}, + {IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 125}, - {IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 130}, - {IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 135}, - {IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 140}, // uwu + {IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 135}, + {IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 140}, + {IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 145}, // uwu }; static const char* OP_SaturnTooltips[] = @@ -2219,6 +2220,7 @@ static const char* OP_SaturnTooltips[] = "How long can the game wait before it kicks you out from the server\nconnecting screen.", "Practice for online play! 0 = instant response.", "Simulate online input delay when hosting a server.\nValue choosen by Player with the lowest ping", + "Show a screen before joining a server displaying important information about it", "How much speen do you want?", "Colourize the speedlines in your skincolor if you go fast enough!", "Colourize the sneaker flame trails in your skincolor!", -- 2.54.0