From d5b28577c113d413e00dce5904a92a717bd827a6 Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 25 Aug 2023 13:59:53 +0300 Subject: [PATCH 01/19] Attempt to fix demo buffer overflow crash. Also don't record demos at all when netdemo_record is set to Disabled --- src/g_game.c | 72 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 93c502d06..a2130aed0 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5699,6 +5699,9 @@ void G_GhostAddHit(INT32 playernum, mobj_t *victim) void G_WriteAllGhostTics(void) { + UINT8 *save_demo_p = demo_p; +#define CHECKSPACE(num) if (demo_p+(num) > demoend) { demo_p = save_demo_p; G_CheckDemoStatus(); return; } + INT32 i, counter = leveltime; for (i = 0; i < MAXPLAYERS; i++) { @@ -5713,10 +5716,16 @@ void G_WriteAllGhostTics(void) if (counter % cv_netdemosyncquality.value != 0) // Only write 1 in this many ghost datas per tic to cut down on multiplayer replay size. continue; + CHECKSPACE(1); + WRITEUINT8(demo_p, i); G_WriteGhostTic(players[i].mo, i); } + + CHECKSPACE(1); WRITEUINT8(demo_p, 0xFF); + +#undef CHECKSPACE } void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) @@ -5727,6 +5736,9 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) UINT8 sprite; UINT8 frame; + UINT8 *save_demo_p = demo_p; +#define CHECKSPACE(num) if (demo_p+(num) > demoend) { demo_p = save_demo_p; G_CheckDemoStatus(); return; } + if (!demo_p) return; if (!(demoflags & DF_GHOST)) @@ -5753,6 +5765,8 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) oldghost[playernum].y = ghost->y; oldghost[playernum].z = ghost->z; ziptic |= GZT_XYZ; + + CHECKSPACE(sizeof(fixed_t)*3); WRITEFIXED(demo_p,oldghost[playernum].x); WRITEFIXED(demo_p,oldghost[playernum].y); WRITEFIXED(demo_p,oldghost[playernum].z); @@ -5769,6 +5783,9 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) oldghost[playernum].momx = momx; oldghost[playernum].momy = momy; ziptic |= GZT_MOMXY; + + CHECKSPACE(4); + WRITEINT16(demo_p,momx); WRITEINT16(demo_p,momy); } @@ -5777,6 +5794,9 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) { oldghost[playernum].momz = momx; ziptic |= GZT_MOMZ; + + CHECKSPACE(2); + WRITEINT16(demo_p,momx); } @@ -5797,6 +5817,9 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) { oldghost[playernum].angle = ghost->angle>>24; ziptic |= GZT_ANGLE; + + CHECKSPACE(1); + WRITEUINT8(demo_p,oldghost[playernum].angle); } @@ -5806,6 +5829,9 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) { oldghost[playernum].frame = frame; ziptic |= GZT_SPRITE; + + CHECKSPACE(1); + WRITEUINT8(demo_p,oldghost[playernum].frame); } @@ -5845,20 +5871,26 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) if (ghostext[playernum].flags & EZT_COLOR) { + CHECKSPACE(1); WRITEUINT8(demo_p,ghostext[playernum].color); ghostext[playernum].lastcolor = ghostext[playernum].color; } if (ghostext[playernum].flags & EZT_SCALE) { + CHECKSPACE(sizeof(fixed_t)); WRITEFIXED(demo_p,ghostext[playernum].scale); ghostext[playernum].lastscale = ghostext[playernum].scale; } if (ghostext[playernum].flags & EZT_HIT) { + CHECKSPACE(2); WRITEUINT16(demo_p,ghostext[playernum].hits); for (i = 0; i < ghostext[playernum].hits; i++) { mobj_t *mo = ghostext[playernum].hitlist[i]; + + CHECKSPACE(4+4+2+sizeof(fixed_t)*3+sizeof(angle_t)); + WRITEUINT32(demo_p,UINT32_MAX); // reserved for some method of determining exactly which mobj this is. (mobjnum doesn't work here.) WRITEUINT32(demo_p,mo->type); WRITEUINT16(demo_p,(UINT16)mo->health); @@ -5872,9 +5904,14 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) ghostext[playernum].hitlist = NULL; } if (ghostext[playernum].flags & EZT_SPRITE) + { + CHECKSPACE(1); WRITEUINT8(demo_p,sprite); + } if (ghostext[playernum].flags & EZT_KART) { + CHECKSPACE(12); + WRITEINT32(demo_p, ghostext[playernum].kartitem); WRITEINT32(demo_p, ghostext[playernum].kartamount); WRITEINT32(demo_p, ghostext[playernum].kartbumpers); @@ -5891,6 +5928,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) G_CheckDemoStatus(); // no more space return; } +#undef CHECKSPACE } void G_ConsAllGhostTics(void) @@ -6743,22 +6781,30 @@ void G_RecordDemo(const char *name) { INT32 maxsize; - CONS_Printf("Recording demo %s.lmp\n", name); - - strcpy(demoname, name); - strcat(demoname, ".lmp"); - maxsize = cv_maxdemosize.value*1024*1024; - if (demobuffer) - free(demobuffer); demo_p = NULL; demo.recording = false; - demobuffer = malloc(maxsize); - demoend = demobuffer + maxsize; - if (demobuffer) - demo.recording = true; - else - CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); + free(demobuffer); + demobuffer = NULL; + demoend = NULL; + + if (cv_recordmultiplayerdemos.value) + { + CONS_Printf("Recording demo %s.lmp\n", name); + + strcpy(demoname, name); + strcat(demoname, ".lmp"); + + maxsize = cv_maxdemosize.value*1024*1024; + + demobuffer = malloc(maxsize); + demoend = demobuffer + maxsize; + + if (demobuffer) + demo.recording = true; + else + CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); + } } void G_RecordMetal(void) -- 2.54.0 From 5a7626d88ecdc0610f6141d12ba86f05ee800924 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Fri, 25 Aug 2023 19:19:04 +0200 Subject: [PATCH 02/19] add toggable sound effect when player squishes after landing "slamsound" toggles it --- src/d_netcmd.c | 2 ++ src/g_game.c | 4 ++++ src/g_game.h | 1 + src/k_kart.c | 8 +++++++- src/p_mobj.c | 2 ++ src/p_mobj.h | 2 ++ 6 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 84bfc364c..ed28202db 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -700,6 +700,8 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_powerstones); CV_RegisterVar(&cv_competitionboxes); CV_RegisterVar(&cv_matchboxes); + + CV_RegisterVar(&cv_slamsound); /*CV_RegisterVar(&cv_recycler); CV_RegisterVar(&cv_teleporters); diff --git a/src/g_game.c b/src/g_game.c index 93c502d06..d5f6998d5 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -545,8 +545,12 @@ static CV_PossibleValue_t stretchfactor_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0 consvar_t cv_gravstretch = {"gravstretch", "0", CV_FLOAT | CV_SAVE, stretchfactor_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_sloperoll = {"sloperoll", "Off", CV_SAVE|CV_CALL, CV_OnOff, PDistort_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; + consvar_t cv_sliptideroll = {"sliptideroll", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +static CV_PossibleValue_t slamsound_t[] = {{0, "Off"}, {1, "On"}, {0, NULL}}; +consvar_t cv_slamsound = {"slamsound", "1", CV_SAVE, slamsound_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + static CV_PossibleValue_t sloperolldist_cons_t[] = { /*{256, "256"},*/ {512, "512"}, {768, "768"}, {1024, "1024"}, {1536, "1536"}, {2048, "2048"}, diff --git a/src/g_game.h b/src/g_game.h index c99404a35..48743ecbf 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -150,6 +150,7 @@ extern consvar_t cv_driftsparkpulse; extern consvar_t cv_gravstretch; extern consvar_t cv_sloperoll; extern consvar_t cv_sliptideroll; +extern consvar_t cv_slamsound; extern consvar_t cv_sloperolldist; extern consvar_t cv_invincmusicfade; diff --git a/src/k_kart.c b/src/k_kart.c index 1f62f7c72..7de4cfaae 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3000,6 +3000,9 @@ static void K_StretchPlayerGravity(player_t *p) I_Assert(p != NULL); I_Assert(p->mo != NULL); I_Assert(!P_MobjWasRemoved(p->mo)); + + if (!p->mo->stretchonground && P_IsObjectOnGround(p->mo) && (cv_slamsound.value == 1)) + S_StartSound(p->mo, sfx_s3k4c); if (!P_IsObjectOnGround(p->mo)) { @@ -3019,6 +3022,7 @@ static void K_StretchPlayerGravity(player_t *p) { p->mo->spritexscale = (dxs); p->mo->spriteyscale = (dys); + p->mo->stretchonground = false; } } else @@ -3033,8 +3037,10 @@ static void K_StretchPlayerGravity(player_t *p) p->mo->stretchslam -= (4*mos); else p->mo->stretchslam = 0; - + p->mo->stretchonground = true; } + + } static INT32 K_FindPlayerNum(player_t *plyr) diff --git a/src/p_mobj.c b/src/p_mobj.c index f29a63f43..bd561c034 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9563,6 +9563,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->spritexscale = mobj->realxscale; mobj->spriteyscale = mobj->realyscale; mobj->spritexoffset = mobj->spriteyoffset = 0; + + mobj->stretchonground = true; // set subsector and/or block links P_SetThingPosition(mobj); diff --git a/src/p_mobj.h b/src/p_mobj.h index 872c9dd5e..5e72408e5 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -299,6 +299,8 @@ typedef struct mobj_s fixed_t realxscale, realyscale; // funn-E streeetch fixed_t stretchslam; // "squish" effect when you land + + boolean stretchonground; // Play funni sound when player lands on ground with stretch //sloperollangle angle_t sloperoll, reservezangle, reservexydir; -- 2.54.0 From 9a8ef2c7e0429c1071340ee9505632596644f67f Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Fri, 25 Aug 2023 19:26:02 +0200 Subject: [PATCH 03/19] aaaand add it to the menu --- src/m_menu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/m_menu.c b/src/m_menu.c index a68d11b52..495a67202 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1712,6 +1712,7 @@ static menuitem_t OP_PlayerDistortMenu[] = {IT_STRING | IT_CVAR, NULL, "Slope rotation distance", &cv_sloperolldist, 35}, {IT_STRING | IT_CVAR, NULL, "Rotate players when sliptiding", &cv_sliptideroll, 50}, {IT_STRING | IT_CVAR, NULL, "Player stretch factor", &cv_gravstretch, 65}, + {IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 80}, }; enum -- 2.54.0 From 117524761443354827442659422aadb55c5df538 Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 25 Aug 2023 21:32:26 +0300 Subject: [PATCH 04/19] Move stretchonground in mobj_t at the end of struct because game assumes precipmobj and mobj have same layout in rendering code -_- --- src/p_mobj.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.h b/src/p_mobj.h index 5e72408e5..42d2bae07 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -299,8 +299,6 @@ typedef struct mobj_s fixed_t realxscale, realyscale; // funn-E streeetch fixed_t stretchslam; // "squish" effect when you land - - boolean stretchonground; // Play funni sound when player lands on ground with stretch //sloperollangle angle_t sloperoll, reservezangle, reservexydir; @@ -396,6 +394,8 @@ typedef struct mobj_s boolean colorized; // Whether the mobj uses the rainbow colormap boolean rollmodel; // OpenGL: Should this model rotate? + boolean stretchonground; // Play funni sound when player lands on ground with stretch + // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; -- 2.54.0 From 00112bc4c85e02d83724ecfdf4660d189a4398a0 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Sat, 26 Aug 2023 07:27:23 +0200 Subject: [PATCH 05/19] Two small things from Snowy-Kart - small position number (has been made toggable) - toggable minimap playernames from: https://github.com/JadenArcm/Snowy-Kart --- src/console.c | 34 +++---- src/d_netcmd.c | 7 ++ src/d_netcmd.h | 3 + src/k_kart.c | 39 ++++---- src/m_menu.c | 13 ++- src/v_video.c | 263 +++++++++++++++++++++++++++++++++++++++++++++++++ src/v_video.h | 6 ++ 7 files changed, 322 insertions(+), 43 deletions(-) diff --git a/src/console.c b/src/console.c index f3e56aae8..99d032b7f 100644 --- a/src/console.c +++ b/src/console.c @@ -153,25 +153,25 @@ consvar_t cons_backcolor = {"con_backcolor", "Black", CV_CALL|CV_SAVE, backcolor static CV_PossibleValue_t menuhighlight_cons_t[] = { - {0, "Game type"}, - {V_YELLOWMAP, "Always yellow"}, - {V_PURPLEMAP, "Always purple"}, - {V_GREENMAP, "Always green"}, - {V_BLUEMAP, "Always blue"}, - {V_REDMAP, "Always red"}, - {V_GRAYMAP, "Always gray"}, - {V_ORANGEMAP, "Always orange"}, - {V_SKYMAP, "Always sky-blue"}, - {V_GOLDMAP, "Always gold"}, - {V_LAVENDERMAP, "Always lavender"}, - {V_TEAMAP, "Always tea-green"}, - {V_STEELMAP, "Always steel-blue"}, - {V_PINKMAP, "Always pink"}, - {V_BROWNMAP, "Always brown"}, - {V_PEACHMAP, "Always peach"}, + {0, "Gametype Default"}, + {V_YELLOWMAP, "Always Yellow"}, + {V_PURPLEMAP, "Always Purple"}, + {V_GREENMAP, "Always Green"}, + {V_BLUEMAP, "Always Blue"}, + {V_REDMAP, "Always Red"}, + {V_GRAYMAP, "Always Gray"}, + {V_ORANGEMAP, "Always Orange"}, + {V_SKYMAP, "Always Sky-Blue"}, + {V_GOLDMAP, "Always Gold"}, + {V_LAVENDERMAP, "Always Lavender"}, + {V_TEAMAP, "Always Tea-Green"}, + {V_STEELMAP, "Always Steel-Blue"}, + {V_PINKMAP, "Always Pink"}, + {V_BROWNMAP, "Always Brown"}, + {V_PEACHMAP, "Always Peach"}, {0, NULL} }; -consvar_t cons_menuhighlight = {"menuhighlight", "Game type", CV_SAVE, menuhighlight_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cons_menuhighlight = {"menuhighlight", "Gametype Default", CV_SAVE, menuhighlight_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static void CON_Print(char *msg); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 84bfc364c..2ee2b5cd2 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -466,6 +466,10 @@ consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0 static CV_PossibleValue_t pingmeasurement_cons_t[] = {{0, "Frames"}, {1, "Milliseconds"}, {0, NULL}}; consvar_t cv_pingmeasurement = {"pingmeasurement", "Frames", CV_SAVE, pingmeasurement_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_smallpos = {"smallpositionnumber", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + +consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + consvar_t cv_showviewpointtext = {"showviewpointtext", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL}; // Intermission time Tails 04-19-2002 @@ -765,6 +769,9 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_pingtimeout); CV_RegisterVar(&cv_showping); CV_RegisterVar(&cv_pingmeasurement); + + CV_RegisterVar(&cv_smallpos); + CV_RegisterVar(&cv_showminimapnames); CV_RegisterVar(&cv_showtrackaddon); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index e92289397..aece0c319 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -150,6 +150,9 @@ extern consvar_t cv_pingtimeout; extern consvar_t cv_showping; extern consvar_t cv_pingmeasurement; +extern consvar_t cv_smallpos; +extern consvar_t cv_showminimapnames; + extern consvar_t cv_showviewpointtext; extern consvar_t cv_skipmapcheck; diff --git a/src/k_kart.c b/src/k_kart.c index 1f62f7c72..19bc3f774 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7768,13 +7768,13 @@ static void K_DrawKartPositionNum(INT32 num) // POSI_X = BASEVIDWIDTH - 51; // 269 // POSI_Y = BASEVIDHEIGHT- 64; // 136 - boolean win = (stplyr->exiting && num == 1); - //INT32 X = POSI_X; - INT32 W = SHORT(kp_positionnum[0][0]->width); - fixed_t scale = FRACUNIT; + fixed_t scale = (cv_smallpos.value) ? FRACUNIT / 2 : FRACUNIT; patch_t *localpatch = kp_positionnum[0][0]; - //INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT); + INT32 W = SHORT(kp_positionnum[0][0]->width); INT32 fx = 0, fy = 0, fflags = 0; + INT32 xoffs = (cv_smallpos.value) ? -18 : 0; + + boolean win = (stplyr->exiting && num == 1); boolean flipdraw = false; // flip the order we draw it in for MORE splitscreen bs. fun. boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen. boolean overtake = false; @@ -7784,7 +7784,8 @@ static void K_DrawKartPositionNum(INT32 num) scale *= 2; overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw. } - if (splitscreen) + + if ((splitscreen) && (cv_smallpos.value == 0)) scale /= 2; W = FixedMul(W<>FRACBITS; @@ -7792,7 +7793,7 @@ static void K_DrawKartPositionNum(INT32 num) // pain and suffering defined below if (!splitscreen) { - fx = POSI_X; + fx = POSI_X + xoffs; fy = BASEVIDHEIGHT - 8; fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT; } @@ -8518,28 +8519,24 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat amxpos = amnumxpos + ((x + AutomapPic->width/2 - (facemmapprefix[skin]->width/2))<height/2 - (facemmapprefix[skin]->height/2))<width/2 + (facemmapprefix[skin]->width/2))<color) // 'default' color V_DrawSciencePatch(amxpos, amypos, flags, facemmapprefix[skin], FRACUNIT); else { - UINT8 *colormap; - if (mo->colorized) - colormap = R_GetTranslationColormap(TC_RAINBOW, mo->color, GTC_CACHE); - else - colormap = R_GetTranslationColormap(skin, mo->color, GTC_CACHE); - V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, facemmapprefix[skin], colormap); + UINT8 *colormap = R_GetTranslationColormap((mo->colorized) ? TC_RAINBOW : skin, mo->color, GTC_CACHE); + V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT / 2, flags, facemmapprefix[skin], colormap); + + if (cv_showminimapnames.value && !(modeattacking || gamestate == GS_TIMEATTACK)) + { + const char *player_name = va("%c%s", V_GetSkincolorChar(mo->color), player_names[mo->player - players]); + V_DrawCenteredSmallStringAtFixed(amxpos + (4 * FRACUNIT), amypos - (3 * FRACUNIT), V_ALLOWLOWERCASE|flags, player_name); + } + if (mo->player && ((G_RaceGametype() && mo->player->kartstuff[k_position] == spbplace) || (G_BattleGametype() && K_IsPlayerWanted(mo->player)))) { - V_DrawFixedPatch(amxpos - (4<= HU_FONTSIZE || !hu_font[c]) + { + cx += (spacewidth * dupx)<width*(dupx/4); + } + else + w = hu_font[c]->width * dupx / 2; + if ((cx>>FRACBITS) > scrwidth) + break; + if ((cx>>FRACBITS)+left + w < 0) //left boundary check + { + cx += w< Date: Sun, 27 Aug 2023 00:45:04 +0200 Subject: [PATCH 06/19] Toggable Lap Emblem Animation hides the animation that happens when you do a lap toggable with "showlapemblem" and in saturn options --- src/d_netcmd.c | 4 ++++ src/d_netcmd.h | 2 ++ src/k_kart.c | 3 +++ src/m_menu.c | 1 + 4 files changed, 10 insertions(+) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 84bfc364c..b2d86794a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -466,6 +466,8 @@ consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0 static CV_PossibleValue_t pingmeasurement_cons_t[] = {{0, "Frames"}, {1, "Milliseconds"}, {0, NULL}}; consvar_t cv_pingmeasurement = {"pingmeasurement", "Frames", CV_SAVE, pingmeasurement_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_showlapemblem = {"showlapemblem", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + consvar_t cv_showviewpointtext = {"showviewpointtext", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL}; // Intermission time Tails 04-19-2002 @@ -765,6 +767,8 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_pingtimeout); CV_RegisterVar(&cv_showping); CV_RegisterVar(&cv_pingmeasurement); + + CV_RegisterVar(&cv_showlapemblem); CV_RegisterVar(&cv_showtrackaddon); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index e92289397..b201d8639 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -150,6 +150,8 @@ extern consvar_t cv_pingtimeout; extern consvar_t cv_showping; extern consvar_t cv_pingmeasurement; +extern consvar_t cv_showlapemblem; + extern consvar_t cv_showviewpointtext; extern consvar_t cv_skipmapcheck; diff --git a/src/k_kart.c b/src/k_kart.c index 1f62f7c72..faa207ebb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9112,6 +9112,9 @@ static void K_drawChallengerScreen(void) static void K_drawLapStartAnim(void) { + if (! cv_showlapemblem.value) + return; + // This is an EVEN MORE insanely complicated animation. const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, GTC_CACHE); diff --git a/src/m_menu.c b/src/m_menu.c index a68d11b52..1c5c63664 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1697,6 +1697,7 @@ static menuitem_t OP_SaturnMenu[] = {IT_STRING | IT_CVAR, NULL, "Serverqueue waittime", &cv_connectawaittime, 30}, //{IT_STRING | IT_CVAR, NULL, "Addon Download Speed", &cv_downloadspeed, 55}, //no idea why you would wanna change it anyways {IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 50}, + {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 60}, {IT_STRING | IT_CVAR, NULL, "No Midnight Channel Flicker", &cv_lessflicker, 75}, {IT_SUBMENU|IT_STRING, NULL, "Player distortion...", &OP_PlayerDistortDef, 100}, {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 115}, -- 2.54.0 From 9208a7233f4d49a4eae4edd2880b312d815666a0 Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 27 Aug 2023 11:13:47 +0300 Subject: [PATCH 07/19] Redo slamsound using MFE_JUSTHITFLOOR --- src/k_kart.c | 8 ++------ src/p_mobj.c | 2 -- src/p_mobj.h | 2 -- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7de4cfaae..6b5769776 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3000,8 +3000,8 @@ static void K_StretchPlayerGravity(player_t *p) I_Assert(p != NULL); I_Assert(p->mo != NULL); I_Assert(!P_MobjWasRemoved(p->mo)); - - if (!p->mo->stretchonground && P_IsObjectOnGround(p->mo) && (cv_slamsound.value == 1)) + + if (p->mo->eflags & MFE_JUSTHITFLOOR && (cv_slamsound.value == 1)) S_StartSound(p->mo, sfx_s3k4c); if (!P_IsObjectOnGround(p->mo)) @@ -3022,7 +3022,6 @@ static void K_StretchPlayerGravity(player_t *p) { p->mo->spritexscale = (dxs); p->mo->spriteyscale = (dys); - p->mo->stretchonground = false; } } else @@ -3037,10 +3036,7 @@ static void K_StretchPlayerGravity(player_t *p) p->mo->stretchslam -= (4*mos); else p->mo->stretchslam = 0; - p->mo->stretchonground = true; } - - } static INT32 K_FindPlayerNum(player_t *plyr) diff --git a/src/p_mobj.c b/src/p_mobj.c index bd561c034..f29a63f43 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9563,8 +9563,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->spritexscale = mobj->realxscale; mobj->spriteyscale = mobj->realyscale; mobj->spritexoffset = mobj->spriteyoffset = 0; - - mobj->stretchonground = true; // set subsector and/or block links P_SetThingPosition(mobj); diff --git a/src/p_mobj.h b/src/p_mobj.h index 42d2bae07..872c9dd5e 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -394,8 +394,6 @@ typedef struct mobj_s boolean colorized; // Whether the mobj uses the rainbow colormap boolean rollmodel; // OpenGL: Should this model rotate? - boolean stretchonground; // Play funni sound when player lands on ground with stretch - // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; -- 2.54.0 From 911264ccb3a47ab324524b105ed6e8a0b481fe8f Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Sun, 27 Aug 2023 22:33:21 +0200 Subject: [PATCH 08/19] kill smallposition toggle for now and add minimap head size toggle instead eeeeeeeeeeeeeeeeeeee --- src/d_netcmd.c | 7 +++++-- src/d_netcmd.h | 3 ++- src/k_kart.c | 27 ++++++++++++++++----------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 2ee2b5cd2..63b94c151 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -466,9 +466,10 @@ consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0 static CV_PossibleValue_t pingmeasurement_cons_t[] = {{0, "Frames"}, {1, "Milliseconds"}, {0, NULL}}; consvar_t cv_pingmeasurement = {"pingmeasurement", "Frames", CV_SAVE, pingmeasurement_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_smallpos = {"smallpositionnumber", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +//consvar_t cv_smallpos = {"smallpositionnumber", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_minihead = {"smallminimapplayers", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showviewpointtext = {"showviewpointtext", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL}; @@ -770,8 +771,10 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_showping); CV_RegisterVar(&cv_pingmeasurement); - CV_RegisterVar(&cv_smallpos); + //CV_RegisterVar(&cv_smallpos); CV_RegisterVar(&cv_showminimapnames); + CV_RegisterVar(&cv_minihead); + CV_RegisterVar(&cv_showtrackaddon); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index aece0c319..dfde12969 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -150,8 +150,9 @@ extern consvar_t cv_pingtimeout; extern consvar_t cv_showping; extern consvar_t cv_pingmeasurement; -extern consvar_t cv_smallpos; +//extern consvar_t cv_smallpos; extern consvar_t cv_showminimapnames; +extern consvar_t cv_minihead; extern consvar_t cv_showviewpointtext; diff --git a/src/k_kart.c b/src/k_kart.c index 19bc3f774..e48fef9c2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7768,13 +7768,14 @@ static void K_DrawKartPositionNum(INT32 num) // POSI_X = BASEVIDWIDTH - 51; // 269 // POSI_Y = BASEVIDHEIGHT- 64; // 136 - fixed_t scale = (cv_smallpos.value) ? FRACUNIT / 2 : FRACUNIT; - patch_t *localpatch = kp_positionnum[0][0]; - INT32 W = SHORT(kp_positionnum[0][0]->width); - INT32 fx = 0, fy = 0, fflags = 0; - INT32 xoffs = (cv_smallpos.value) ? -18 : 0; - boolean win = (stplyr->exiting && num == 1); + //INT32 X = POSI_X; + INT32 W = SHORT(kp_positionnum[0][0]->width); + fixed_t scale = FRACUNIT; + patch_t *localpatch = kp_positionnum[0][0]; + //INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT); + INT32 fx = 0, fy = 0, fflags = 0; + INT32 xoffs = (cv_showinput.value) ? -48 : 0; boolean flipdraw = false; // flip the order we draw it in for MORE splitscreen bs. fun. boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen. boolean overtake = false; @@ -7784,8 +7785,9 @@ static void K_DrawKartPositionNum(INT32 num) scale *= 2; overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw. } - - if ((splitscreen) && (cv_smallpos.value == 0)) + if (splitscreen) + scale /= 2; + if (cv_showinput.value && !splitscreen) // anuther one. scale /= 2; W = FixedMul(W<>FRACBITS; @@ -8524,19 +8526,22 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat else { UINT8 *colormap = R_GetTranslationColormap((mo->colorized) ? TC_RAINBOW : skin, mo->color, GTC_CACHE); - V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT / 2, flags, facemmapprefix[skin], colormap); + + if (cv_minihead.value == 1) + V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT/2, flags, facemmapprefix[skin], colormap); + else if (cv_minihead.value == 0) + V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT, flags, facemmapprefix[skin], colormap); if (cv_showminimapnames.value && !(modeattacking || gamestate == GS_TIMEATTACK)) { const char *player_name = va("%c%s", V_GetSkincolorChar(mo->color), player_names[mo->player - players]); V_DrawCenteredSmallStringAtFixed(amxpos + (4 * FRACUNIT), amypos - (3 * FRACUNIT), V_ALLOWLOWERCASE|flags, player_name); } - if (mo->player && ((G_RaceGametype() && mo->player->kartstuff[k_position] == spbplace) || (G_BattleGametype() && K_IsPlayerWanted(mo->player)))) { - V_DrawFixedPatch(amxpos, amypos, FRACUNIT / 2, flags, kp_wantedreticle, NULL); + V_DrawFixedPatch(amxpos - (4< Date: Mon, 28 Aug 2023 10:29:44 +0300 Subject: [PATCH 09/19] Don't play landing sound on really small jumps --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 6b5769776..c6d4397ce 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3001,7 +3001,7 @@ static void K_StretchPlayerGravity(player_t *p) I_Assert(p->mo != NULL); I_Assert(!P_MobjWasRemoved(p->mo)); - if (p->mo->eflags & MFE_JUSTHITFLOOR && (cv_slamsound.value == 1)) + if (cv_slamsound.value == 1 && (p->mo->eflags & MFE_JUSTHITFLOOR) && p->mo->stretchslam > 4*mos) S_StartSound(p->mo, sfx_s3k4c); if (!P_IsObjectOnGround(p->mo)) -- 2.54.0 From 5da6739077891ef70d8fac5f5d4b551303f6df10 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 28 Aug 2023 13:56:19 +0300 Subject: [PATCH 10/19] Don't play slam sound too often --- src/k_kart.c | 8 +++++++- src/p_mobj.c | 3 +++ src/p_mobj.h | 2 ++ src/p_saveg.c | 1 + 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index c6d4397ce..b1866e684 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3001,8 +3001,14 @@ static void K_StretchPlayerGravity(player_t *p) I_Assert(p->mo != NULL); I_Assert(!P_MobjWasRemoved(p->mo)); - if (cv_slamsound.value == 1 && (p->mo->eflags & MFE_JUSTHITFLOOR) && p->mo->stretchslam > 4*mos) + if (p->mo->slamsoundtimer) + p->mo->slamsoundtimer--; + + if (cv_slamsound.value == 1 && (p->mo->eflags & MFE_JUSTHITFLOOR) && p->mo->stretchslam > 4*mos && !p->mo->slamsoundtimer) + { S_StartSound(p->mo, sfx_s3k4c); + p->mo->slamsoundtimer = TICRATE; + } if (!P_IsObjectOnGround(p->mo)) { diff --git a/src/p_mobj.c b/src/p_mobj.c index f29a63f43..090f83290 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9564,6 +9564,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->spriteyscale = mobj->realyscale; mobj->spritexoffset = mobj->spriteyoffset = 0; + // Funni slam sound when landing + mobj->slamsoundtimer = 0; + // set subsector and/or block links P_SetThingPosition(mobj); I_Assert(mobj->subsector != NULL); diff --git a/src/p_mobj.h b/src/p_mobj.h index 872c9dd5e..adb8b6196 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -394,6 +394,8 @@ typedef struct mobj_s boolean colorized; // Whether the mobj uses the rainbow colormap boolean rollmodel; // OpenGL: Should this model rotate? + tic_t slamsoundtimer; + // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; diff --git a/src/p_saveg.c b/src/p_saveg.c index 673f1cb40..bc836b6e5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1984,6 +1984,7 @@ static void LoadMobjThinker(actionf_p1 thinker) mobj->spritexscale = mobj->spriteyscale = mobj->old_spritexscale = mobj->old_spriteyscale = FRACUNIT; mobj->realxscale = mobj->realyscale = FRACUNIT; mobj->stretchslam = 0; + mobj->slamsoundtimer = 0; mobj->sloperoll = mobj->reservezangle = mobj->reservexydir = 0; -- 2.54.0 From 47f194b82ea9028284b7a9f5bc544c9e71f89618 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Mon, 28 Aug 2023 22:28:41 +0200 Subject: [PATCH 11/19] fix the wanted recticle also small fix to big players --- src/k_kart.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index e48fef9c2..f270718a5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8530,7 +8530,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat if (cv_minihead.value == 1) V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT/2, flags, facemmapprefix[skin], colormap); else if (cv_minihead.value == 0) - V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT, flags, facemmapprefix[skin], colormap); + V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, facemmapprefix[skin], colormap); if (cv_showminimapnames.value && !(modeattacking || gamestate == GS_TIMEATTACK)) { @@ -8541,6 +8541,9 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat && ((G_RaceGametype() && mo->player->kartstuff[k_position] == spbplace) || (G_BattleGametype() && K_IsPlayerWanted(mo->player)))) { + if (cv_minihead.value == 1) + V_DrawFixedPatch(amxpos, amypos, FRACUNIT / 2, flags, kp_wantedreticle, NULL); + else if (cv_minihead.value == 0) V_DrawFixedPatch(amxpos - (4< Date: Tue, 29 Aug 2023 06:49:10 +0200 Subject: [PATCH 12/19] don't check flippedness in HWR_RotateSpritePolyToAim if the mobj is actually a precipmobj! precipmobj_t does not have eflags, so P_MobjFlip checking it would actually be accessing memory addresses beyond the end of the struct perhaps this fixes a rare crash in P_MobjFlip on maps with snow and rain See: https://git.do.srb2.org/STJr/SRB2/-/commit/197da95a232da92e61f88ee27c754e8671a6624f --- src/hardware/hw_main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 13b6b7911..ad63cbc08 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3755,7 +3755,7 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t } // This is expecting a pointer to an array containing 4 wallVerts for a sprite -static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts) +static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts, const boolean precip) { if (cv_grspritebillboarding.value && spr && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE) && wallVerts) { @@ -3787,7 +3787,7 @@ static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts } } - if (P_MobjFlip(spr->mobj) == -1) + if (!precip && P_MobjFlip(spr->mobj) == -1) // precip doesn't have eflags so they can't flip { basey = FIXED_TO_FLOAT(interp.z + spr->mobj->height); } @@ -3907,7 +3907,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) } // Let dispoffset work first since this adjust each vertex - HWR_RotateSpritePolyToAim(spr, baseWallVerts); + HWR_RotateSpritePolyToAim(spr, baseWallVerts, false); // push it toward the camera to mitigate floor-clipping sprites { @@ -4254,7 +4254,7 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) // Let dispoffset work first since this adjust each vertex // ...nah - HWR_RotateSpritePolyToAim(spr, wallVerts); + HWR_RotateSpritePolyToAim(spr, wallVerts, false); // push it toward the camera to mitigate floor-clipping sprites { @@ -4348,7 +4348,7 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) wallVerts[1].z = wallVerts[2].z = spr->z2; // Let dispoffset work first since this adjust each vertex - HWR_RotateSpritePolyToAim(spr, wallVerts); + HWR_RotateSpritePolyToAim(spr, wallVerts, true); wallVerts[0].s = wallVerts[3].s = 0; wallVerts[2].s = wallVerts[1].s = gpatch->max_s; -- 2.54.0 From e91c90329dd06dfd5deb31e3826f8a50ea675fdb Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 29 Aug 2023 06:57:52 +0200 Subject: [PATCH 13/19] Fix precip interpolation See: https://git.do.srb2.org/STJr/SRB2/-/commit/6c54af377481a42f639da2db6cefe33d02918bce --- src/p_mobj.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f29a63f43..264a25db7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3792,12 +3792,11 @@ void P_NullPrecipThinker(precipmobj_t *mobj) { //(void)mobj; mobj->precipflags &= ~PCF_THUNK; + R_ResetPrecipitationMobjInterpolationState(mobj); } void P_SnowThinker(precipmobj_t *mobj) { - R_ResetPrecipitationMobjInterpolationState(mobj); - P_CycleStateAnimation((mobj_t *)mobj); // adjust height @@ -3810,8 +3809,6 @@ void P_SnowThinker(precipmobj_t *mobj) void P_RainThinker(precipmobj_t *mobj) { - R_ResetPrecipitationMobjInterpolationState(mobj); - P_CycleStateAnimation((mobj_t *)mobj); if (mobj->state != &states[S_RAIN1]) -- 2.54.0 From 52b4f6558255a0dc8f64fe1247cbf5468795a519 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 29 Aug 2023 07:19:31 +0200 Subject: [PATCH 14/19] Improve rain/weather. * Better thinker with more return optimisation. * Better placement of thinking in rendering, to avoid ceiling-mounted sprite glitches. See: https://git.do.srb2.org/STJr/SRB2/-/commit/6371de806b932d1026904937b19e13feb10fa322 --- src/hardware/hw_main.c | 42 +++++++++++++++++++++++++++++------------- src/p_mobj.c | 19 ++++++++++--------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index ad63cbc08..7008e87c7 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3787,7 +3787,7 @@ static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts } } - if (!precip && P_MobjFlip(spr->mobj) == -1) // precip doesn't have eflags so they can't flip + if (P_MobjFlip(spr->mobj) == -1) { basey = FIXED_TO_FLOAT(interp.z + spr->mobj->height); } @@ -3797,6 +3797,7 @@ static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts } lowy = wallVerts[0].y; + // Rotate sprites to fully billboard with the camera // X, Y, AND Z need to be manipulated for the polys to rotate around the // origin, because of how the origin setting works I believe that should @@ -5255,6 +5256,7 @@ void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) // uncapped/interpolation interpmobjstate_t interp = {0}; + float basey, lowy; if (!thing) return; @@ -5262,11 +5264,25 @@ void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) // do interpolation if (R_UsingFrameInterpolation() && !paused) { - R_InterpolatePrecipMobjState(thing, rendertimefrac, &interp); + if (precip) + { + R_InterpolatePrecipMobjState(spr->mobj, rendertimefrac, &interp); + } + else + { + R_InterpolateMobjState(spr->mobj, rendertimefrac, &interp); + } } else { - R_InterpolatePrecipMobjState(thing, FRACUNIT, &interp); + if (precip) + { + R_InterpolatePrecipMobjState(spr->mobj, FRACUNIT, &interp); + } + else + { + R_InterpolateMobjState(spr->mobj, FRACUNIT, &interp); + } } // transform the origin point @@ -5326,16 +5342,6 @@ void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) x1 = tr_x + x1 * rightcos; x2 = tr_x - x2 * rightcos; - // okay, we can't return now... this is a hack, but weather isn't networked, so it should be ok - if (!(thing->precipflags & PCF_THUNK)) - { - if (thing->precipflags & PCF_RAIN) - P_RainThinker(thing); - else - P_SnowThinker(thing); - thing->precipflags |= PCF_THUNK; - } - // // store information in a vissprite // @@ -5364,6 +5370,16 @@ void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) vis->gz = vis->gzt - FIXED_TO_FLOAT(spritecachedinfo[lumpoff].height); vis->precip = true; + + // okay... this is a hack, but weather isn't networked, so it should be ok + if (!(thing->precipflags & PCF_THUNK)) + { + if (thing->precipflags & PCF_RAIN) + P_RainThinker(thing); + else + P_SnowThinker(thing); + thing->precipflags |= PCF_THUNK; + } } static boolean drewsky = false; diff --git a/src/p_mobj.c b/src/p_mobj.c index 264a25db7..bcf08951b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3835,17 +3835,18 @@ void P_RainThinker(precipmobj_t *mobj) } // adjust height - if ((mobj->z += mobj->momz) <= mobj->floorz) + if ((mobj->z += mobj->momz) > mobj->floorz) + return; + + // no splashes on sky or bottomless pits + if (mobj->precipflags & PCF_PIT) { - // no splashes on sky or bottomless pits - if (mobj->precipflags & PCF_PIT) - mobj->z = mobj->ceilingz; - else - { - mobj->z = mobj->floorz; - P_SetPrecipMobjState(mobj, S_SPLASH1); - } + mobj->z = mobj->ceilingz; + return; } + + mobj->z = mobj->floorz; + P_SetPrecipMobjState(mobj, S_SPLASH1); } static void P_RingThinker(mobj_t *mobj) -- 2.54.0 From b5269ebbb58381ff4b39638a288f38a028145df1 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 29 Aug 2023 07:25:55 +0200 Subject: [PATCH 15/19] oops --- src/hardware/hw_main.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 7008e87c7..c0e703ab5 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3797,7 +3797,6 @@ static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts } lowy = wallVerts[0].y; - // Rotate sprites to fully billboard with the camera // X, Y, AND Z need to be manipulated for the polys to rotate around the // origin, because of how the origin setting works I believe that should @@ -5254,35 +5253,20 @@ void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) unsigned rot = 0; UINT8 flip; - // uncapped/interpolation - interpmobjstate_t interp = {0}; - float basey, lowy; - if (!thing) return; + + // uncapped/interpolation + interpmobjstate_t interp = {0}; // do interpolation if (R_UsingFrameInterpolation() && !paused) { - if (precip) - { - R_InterpolatePrecipMobjState(spr->mobj, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(spr->mobj, rendertimefrac, &interp); - } + R_InterpolatePrecipMobjState(thing, rendertimefrac, &interp); } else { - if (precip) - { - R_InterpolatePrecipMobjState(spr->mobj, FRACUNIT, &interp); - } - else - { - R_InterpolateMobjState(spr->mobj, FRACUNIT, &interp); - } + R_InterpolatePrecipMobjState(thing, FRACUNIT, &interp); } // transform the origin point -- 2.54.0 From 664e8c363bd001c5aec84c61dcc1513b1851ba82 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 29 Aug 2023 07:57:35 +0200 Subject: [PATCH 16/19] raise max precip distance a bit basically twice as far, cant go higher or else we hit sprite limit and stuff starts disappearing --- src/r_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/r_main.c b/src/r_main.c index cd4c99b69..dc914e79a 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -160,6 +160,7 @@ static CV_PossibleValue_t drawdist_cons_t[] = { static CV_PossibleValue_t drawdist_precip_cons_t[] = { {256, "256"}, {512, "512"}, {768, "768"}, {1024, "1024"}, {1536, "1536"}, {2048, "2048"}, + {3072, "3072"}, {4096, "4096"}, {0, "None"}, {0, NULL}}; static CV_PossibleValue_t fov_cons_t[] = {{5*FRACUNIT, "MIN"}, {178*FRACUNIT, "MAX"}, {0, NULL}}; -- 2.54.0 From c4746962bd48c0587049f371e3b07548ad311c62 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 29 Aug 2023 08:18:59 +0200 Subject: [PATCH 17/19] do the thing for software renderer too i forgor --- src/r_things.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index a33f908dc..26dad2f0b 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1796,17 +1796,6 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) return; } - // okay, we can't return now except for vertical clipping... this is a hack, but weather isn't networked, so it should be ok - if (!(thing->precipflags & PCF_THUNK)) - { - if (thing->precipflags & PCF_RAIN) - P_RainThinker(thing); - else - P_SnowThinker(thing); - thing->precipflags |= PCF_THUNK; - } - - //SoM: 3/17/2000: Disregard sprites that are out of view.. gzt = interp.z + spritecachedinfo[lump].topoffset; gz = gzt - spritecachedinfo[lump].height; @@ -1814,7 +1803,7 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) if (thing->subsector->sector->cullheight) { if (R_DoCulling(thing->subsector->sector->cullheight, viewsector->cullheight, viewz, gz, gzt)) - return; + goto weatherthink; } // store information in a vissprite @@ -1878,6 +1867,18 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) vis->precip = true; vis->vflip = false; vis->isScaled = false; + +weatherthink: + // okay... this is a hack, but weather isn't networked, so it should be ok + if (!(thing->precipflags & PCF_THUNK)) + { + if (thing->precipflags & PCF_RAIN) + P_RainThinker(thing); + else + P_SnowThinker(thing); + thing->precipflags |= PCF_THUNK; + } + } // R_AddSprites -- 2.54.0 From daa747805da3f1356ffb0bbeaace5765464bf129 Mon Sep 17 00:00:00 2001 From: Indev Date: Tue, 29 Aug 2023 10:32:35 +0300 Subject: [PATCH 18/19] Return null in S_FindMusicCredit if there are no musicdefs at all (thanks NepDisk for pointing at that) --- src/s_sound.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/s_sound.c b/src/s_sound.c index 7658ec6a7..977d3be55 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1527,7 +1527,7 @@ musicdef_t *S_FindMusicCredit(const char *musname) musicdef_t *def = musicdefstart; if (!def) // No definitions - return; + return NULL; while (def) { -- 2.54.0 From 44a31e756105d67b056d54f153e91ed3fd5e995e Mon Sep 17 00:00:00 2001 From: Indev Date: Tue, 29 Aug 2023 10:38:36 +0300 Subject: [PATCH 19/19] Comment out cv_smallpos --- src/m_menu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 2c2e05779..c3f6e2fbb 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1703,12 +1703,12 @@ static menuitem_t OP_SaturnMenu[] = {IT_STRING | IT_CVAR, NULL, "Input Display outside of RA", &cv_showinput, 60}, {IT_STRING | IT_CVAR, NULL, "V2-ish Speedometer", &cv_newspeedometer, 70}, {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 80}, - {IT_STRING | IT_CVAR, NULL, "Small Position Number", &cv_smallpos, 90}, - {IT_STRING | IT_CVAR, NULL, "No Midnight Channel Flicker", &cv_lessflicker, 100}, - {IT_SUBMENU|IT_STRING, NULL, "Player distortion...", &OP_PlayerDistortDef, 115}, - {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 130}, +// {IT_STRING | IT_CVAR, NULL, "Small Position Number", &cv_smallpos, 90}, + {IT_STRING | IT_CVAR, NULL, "No Midnight Channel Flicker", &cv_lessflicker, 90}, + {IT_SUBMENU|IT_STRING, NULL, "Player distortion...", &OP_PlayerDistortDef, 105}, + {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 120}, - {IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 145}, // uwu + {IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 135}, // uwu }; enum -- 2.54.0