From c5765c20bc38647b7cf0a76429566023db7f0625 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 16 Dec 2024 20:34:28 +0100 Subject: [PATCH 001/325] =?UTF-8?q?delay=20NetXCmd=C2=B4s=20instead=20of?= =?UTF-8?q?=20dropping=20them=20when=20the=20buffer=20is=20full?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit credits and many thanks to Hanicef! https://git.do.srb2.org/STJr/SRB2/-/merge_requests/2568 --- src/d_clisrv.c | 73 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 5b307f160..86a5ab2ca 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -187,6 +187,16 @@ typedef struct textcmdtic_s struct textcmdtic_s *next; } textcmdtic_t; +typedef struct textcmdbuf_s textcmdbuf_t; + +struct textcmdbuf_s +{ + textcmdbuf_t *next; + UINT8 cmd[MAXTEXTCMD]; +}; + +static textcmdbuf_t *textcmdbuf[MAXSPLITSCREENPLAYERS]; + ticcmd_t netcmds[TICQUEUE][MAXPLAYERS]; static textcmdtic_t *textcmds[TEXTCMD_HASH_SIZE] = {NULL}; @@ -271,25 +281,53 @@ void RegisterNetXCmd(netxcmd_t id, void (*cmd_f)(UINT8 **p, INT32 playernum)) listnetxcmd[id] = cmd_f; } -void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_t nparam) +static void WriteNetXCmd(UINT8 *cmd, netxcmd_t id, const void *param, size_t nparam) { - if ((localtextcmd[playerid])[0]+2+nparam > MAXTEXTCMD) - { - // for future reference: if (cht_debug) != debug disabled. - CONS_Alert(CONS_ERROR, M_GetText("NetXCmd buffer full, cannot add netcmd %d! (size: %d, needed: %s)\n"), id, localtextcmd[playerid][0], sizeu1(nparam)); - return; - } - - localtextcmd[playerid][0]++; - localtextcmd[playerid][localtextcmd[playerid][0]] = (UINT8)id; - + cmd[0]++; + cmd[cmd[0]] = (UINT8)id; if (param && nparam) { - M_Memcpy(&localtextcmd[playerid][localtextcmd[playerid][0] + 1], param, nparam); - localtextcmd[playerid][0] = (UINT8)(localtextcmd[playerid][0] + (UINT8)nparam); + M_Memcpy(&cmd[cmd[0]+1], param, nparam); + cmd[0] = (UINT8)(cmd[0] + (UINT8)nparam); } } +void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_t nparam) +{ + if (localtextcmd[playerid][0]+2+nparam > MAXTEXTCMD) + { + textcmdbuf_t *buf = textcmdbuf[playerid]; + + // for future reference: if (cv_debug) != debug disabled. + CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %d... (size: %d, needed: %s)\n"), id, localtextcmd[playerid][0], sizeu1(nparam)); + if (buf == NULL) + { + textcmdbuf[playerid] = Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL); + textcmdbuf[playerid]->cmd[0] = 0; + textcmdbuf[playerid]->next = NULL; + WriteNetXCmd(textcmdbuf[playerid]->cmd, id, param, nparam); + return; + } + + while (buf->next != NULL) + buf = buf->next; + + if (buf->cmd[0]+2+nparam > MAXTEXTCMD) + { + WriteNetXCmd(buf->cmd, id, param, nparam); + } + else + { + buf->next = Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL); + buf->next->cmd[0] = 0; + buf->next->next = NULL; + WriteNetXCmd(buf->next->cmd, id, param, nparam); + } + return; + } + WriteNetXCmd(localtextcmd[playerid], id, param, nparam); +} + /*UINT8 GetFreeXCmdSize(UINT8 playerid) { // -1 for the size and another -1 for the ID. @@ -5937,7 +5975,16 @@ static void CL_SendClientCmd(void) M_Memcpy(netbuffer->u.textcmd, localtextcmd[i], localtextcmd[i][0]+1); // All extra data have been sent if (HSendPacket(servernode, true, 0, localtextcmd[i][0]+1)) // Send can fail... + { localtextcmd[i][0] = 0; + if (textcmdbuf[i] != NULL) + { + textcmdbuf_t *buf = textcmdbuf[i]; + M_Memcpy(localtextcmd[i], textcmdbuf[i]->cmd, textcmdbuf[i]->cmd[0]+1); + textcmdbuf[i] = textcmdbuf[i]->next; + Z_Free(buf); + } + } } } } -- 2.54.0 From 13579785968104d7b092da4c0cbeb31fa6a2cb16 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 16 Dec 2024 20:40:36 +0100 Subject: [PATCH 002/325] init textcmdbuf to NULL just in case --- src/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 86a5ab2ca..22139ad02 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -195,7 +195,7 @@ struct textcmdbuf_s UINT8 cmd[MAXTEXTCMD]; }; -static textcmdbuf_t *textcmdbuf[MAXSPLITSCREENPLAYERS]; +static textcmdbuf_t *textcmdbuf[MAXSPLITSCREENPLAYERS] = {NULL}; ticcmd_t netcmds[TICQUEUE][MAXPLAYERS]; static textcmdtic_t *textcmds[TEXTCMD_HASH_SIZE] = {NULL}; -- 2.54.0 From bed0e6554807c347119c6b3408129c60d81abac1 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 16 Dec 2024 18:27:53 +0100 Subject: [PATCH 003/325] potential fix for clients locking up due to never receiving acks back apparently, if the client doesent receive an ack back which may happen due to duplicate packets/bad net conditions, it may spam resend the packet until its netxcmd buffer is full and locks up --- src/d_net.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/d_net.c b/src/d_net.c index 2725fca14..c9f80c9ee 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -325,10 +325,10 @@ static void RemoveAck(INT32 i) } // We have got a packet, proceed the ack request and ack return -static boolean Processackpak(void) +static int Processackpak(void) { INT32 i; - boolean goodpacket = true; + int goodpacket = 0; node_t *node = &nodes[doomcom->remotenode]; // Received an ack return, so remove the ack in the list @@ -353,7 +353,7 @@ static boolean Processackpak(void) { DEBFILE(va("Discard(1) ack %d (duplicated)\n", ack)); duppacket++; - goodpacket = false; // Discard packet (duplicate) + goodpacket = 1; // Discard packet (duplicate) } else { @@ -363,10 +363,10 @@ static boolean Processackpak(void) { DEBFILE(va("Discard(2) ack %d (duplicated)\n", ack)); duppacket++; - goodpacket = false; // Discard packet (duplicate) + goodpacket = 1; // Discard packet (duplicate) break; } - if (goodpacket) + if (goodpacket == 0) { // Is a good packet so increment the acknowledge number, // Then search for a "hole" in the queue @@ -427,12 +427,13 @@ static boolean Processackpak(void) else // Buffer full discard packet, sender will resend it { // We can admit the packet but we will not detect the duplication after :( DEBFILE("no more freeackret\n"); - goodpacket = false; + goodpacket = 2; } } } } } + // return values: 0 = ok, 1 = duplicate, 2 = out of order return goodpacket; } #endif @@ -1158,6 +1159,7 @@ boolean HGetPacket(void) while(true) { //nodejustjoined = I_NetGet(); + int goodpacket; I_NetGet(); if (doomcom->remotenode == -1) // No packet received @@ -1202,8 +1204,15 @@ boolean HGetPacket(void) }*/ // Proceed the ack and ackreturn field - if (!Processackpak()) + goodpacket = Processackpak(); + if (goodpacket != 0) + { + // resend the ACK in case the previous ACK didn't reach the client. + // prevents the client's netbuffer from locking up. + if (goodpacket == 1) + Net_SendAcks(doomcom->remotenode); continue; // discarded (duplicated) + } // A packet with just ackreturn if (netbuffer->packettype == PT_NOTHING) -- 2.54.0 From 3174d8fb1c0480abac3bb1c790391d22e81aa81f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 18 Dec 2024 18:57:02 +0100 Subject: [PATCH 004/325] Fix segfault when sending excessively large netcmds https://git.do.srb2.org/STJr/SRB2/-/merge_requests/2568/diffs?commit_id=457b761d9301b1904c414a8e8ba908f74b9ab959 --- src/d_clisrv.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 22139ad02..50e4a9183 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -298,6 +298,12 @@ void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_ { textcmdbuf_t *buf = textcmdbuf[playerid]; + if (2+nparam > MAXTEXTCMD) + { + CONS_Alert(CONS_ERROR, M_GetText("packet too large to fit NetXCmd, cannot add netcmd %d! (size: %s, max: %d)\n"), id, sizeu1(2+nparam), MAXTEXTCMD); + return; + } + // for future reference: if (cv_debug) != debug disabled. CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %d... (size: %d, needed: %s)\n"), id, localtextcmd[playerid][0], sizeu1(nparam)); if (buf == NULL) @@ -313,16 +319,16 @@ void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_ buf = buf->next; if (buf->cmd[0]+2+nparam > MAXTEXTCMD) - { - WriteNetXCmd(buf->cmd, id, param, nparam); - } - else { buf->next = Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL); buf->next->cmd[0] = 0; buf->next->next = NULL; WriteNetXCmd(buf->next->cmd, id, param, nparam); } + else + { + WriteNetXCmd(buf->cmd, id, param, nparam); + } return; } WriteNetXCmd(localtextcmd[playerid], id, param, nparam); -- 2.54.0 From 0acb8e6a63226f7d7a3c14d4589a280ef7f2ca21 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 22 Dec 2024 18:38:09 +0100 Subject: [PATCH 005/325] fix compile --- src/p_mobj.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index e68288f2b..03e7e9f99 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3234,7 +3234,6 @@ void P_DestroyRobots(void) // the below is chasecam only, if you're curious. check out P_CalcPostImg in p_user.c for first person static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) { - boolean itsatwodlevel = false; const boolean flipcam = (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP); UINT16 postimgflags = 0; UINT8 i; @@ -3244,21 +3243,6 @@ static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) if (flipcam) postimgflags |= POSTIMG_FLIP; - if (twodlevel) - itsatwodlevel = true; - else - { - for (i = 0; i <= splitscreen; i++) - { - if (thiscam == &camera[i] && players[displayplayers[i]].mo - && (players[displayplayers[i]].mo->flags2 & MF2_TWOD)) - { - itsatwodlevel = true; - break; - } - } - } - if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) // Camera must obviously exist { camera_t dummycam; @@ -3300,12 +3284,30 @@ static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) // Process the mobj-ish required functions of the camera boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled) { + boolean itsatwodlevel = false; + UINT8 i; + // This can happen when joining if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) return true; P_CalcChasePostImg(player, thiscam); + if (twodlevel) + itsatwodlevel = true; + else + { + for (i = 0; i <= splitscreen; i++) + { + if (thiscam == &camera[i] && players[displayplayers[i]].mo + && (players[displayplayers[i]].mo->flags2 & MF2_TWOD)) + { + itsatwodlevel = true; + break; + } + } + } + if (thiscam->momx || thiscam->momy) { if (!P_TryCameraMove(thiscam->x + thiscam->momx, thiscam->y + thiscam->momy, thiscam)) // Never fails for 2D mode. @@ -3333,7 +3335,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled } if (!itsatwodlevel) - P_CheckCameraPosition(thiscam->x, thiscam->y, thiscam); + P_CheckCameraPosition(thiscam->x, thiscam->y, thiscam); thiscam->subsector = R_PointInSubsectorFast(thiscam->x, thiscam->y); thiscam->floorz = tmfloorz; -- 2.54.0 From 0290c738e1d2ee2e72beb5ed6a57c20e7a6e41ee Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 22 Dec 2024 18:38:09 +0100 Subject: [PATCH 006/325] fix compile --- src/p_mobj.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index e68288f2b..03e7e9f99 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3234,7 +3234,6 @@ void P_DestroyRobots(void) // the below is chasecam only, if you're curious. check out P_CalcPostImg in p_user.c for first person static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) { - boolean itsatwodlevel = false; const boolean flipcam = (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP); UINT16 postimgflags = 0; UINT8 i; @@ -3244,21 +3243,6 @@ static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) if (flipcam) postimgflags |= POSTIMG_FLIP; - if (twodlevel) - itsatwodlevel = true; - else - { - for (i = 0; i <= splitscreen; i++) - { - if (thiscam == &camera[i] && players[displayplayers[i]].mo - && (players[displayplayers[i]].mo->flags2 & MF2_TWOD)) - { - itsatwodlevel = true; - break; - } - } - } - if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) // Camera must obviously exist { camera_t dummycam; @@ -3300,12 +3284,30 @@ static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) // Process the mobj-ish required functions of the camera boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled) { + boolean itsatwodlevel = false; + UINT8 i; + // This can happen when joining if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) return true; P_CalcChasePostImg(player, thiscam); + if (twodlevel) + itsatwodlevel = true; + else + { + for (i = 0; i <= splitscreen; i++) + { + if (thiscam == &camera[i] && players[displayplayers[i]].mo + && (players[displayplayers[i]].mo->flags2 & MF2_TWOD)) + { + itsatwodlevel = true; + break; + } + } + } + if (thiscam->momx || thiscam->momy) { if (!P_TryCameraMove(thiscam->x + thiscam->momx, thiscam->y + thiscam->momy, thiscam)) // Never fails for 2D mode. @@ -3333,7 +3335,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled } if (!itsatwodlevel) - P_CheckCameraPosition(thiscam->x, thiscam->y, thiscam); + P_CheckCameraPosition(thiscam->x, thiscam->y, thiscam); thiscam->subsector = R_PointInSubsectorFast(thiscam->x, thiscam->y); thiscam->floorz = tmfloorz; -- 2.54.0 From 378382f3ad5a34f760d1cc0234ba4d625099b6db Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 27 Dec 2024 23:34:09 +0100 Subject: [PATCH 007/325] use demo freecam for spec its more versataile and lets you pass through walls and floors just like in replays --- src/d_clisrv.c | 5 ++ src/d_clisrv.h | 2 + src/g_game.c | 1 - src/m_menu.c | 15 +----- src/p_local.h | 10 ++-- src/p_mobj.c | 24 +++++++--- src/p_setup.c | 2 + src/p_tick.c | 4 +- src/p_user.c | 128 ++++++++++++++++++++++++++++++++++++++----------- src/r_main.c | 13 +++-- src/s_sound.c | 25 ++++------ 11 files changed, 155 insertions(+), 74 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 4820515ca..178309b80 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -467,6 +467,11 @@ void D_ResetTiccmds(void) D_Clearticcmd(textcmds[i]->tic); } +ticcmd_t *D_LocalTiccmd(UINT8 ss) +{ + return &localcmds[ss]; +} + // ----------------------------------------------------------------- // end of extra data function // ----------------------------------------------------------------- diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 4e81621d9..94c7c6827 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -645,7 +645,9 @@ extern char motd[254], server_context[8]; extern UINT8 playernode[MAXPLAYERS]; INT32 D_NumPlayers(void); + void D_ResetTiccmds(void); +ticcmd_t *D_LocalTiccmd(UINT8 ss); tic_t GetLag(INT32 node); //UINT8 GetFreeXCmdSize(UINT8 playerid); diff --git a/src/g_game.c b/src/g_game.c index 6c45c99a4..dadcee0e2 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -7854,7 +7854,6 @@ void G_StopDemo(void) demo.freecam = false; // reset democam shit too: democam.cam = NULL; - democam.soundmobj = NULL; democam.localangle = 0; democam.localaiming = 0; democam.turnheld = false; diff --git a/src/m_menu.c b/src/m_menu.c index a4121d448..cf34db301 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -7712,20 +7712,7 @@ static void M_PlaybackToggleFreecam(INT32 choice) splitscreen = 0; R_ExecuteSetViewSize(); - P_InitCameraCmd(); // init camera controls - if (!demo.freecam) // toggle on - { - demo.freecam = true; - democam.cam = &camera[0]; // this is rather useful - } - else // toggle off - { - demo.freecam = false; - // reset democam vars: - democam.cam = NULL; - democam.turnheld = false; - democam.keyboardlook = false; // reset only these. localangle / aiming gets set before the cam does anything anyway - } + P_ToggleDemoCamera(); } diff --git a/src/p_local.h b/src/p_local.h index ea0bff603..63dbed216 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -81,6 +81,10 @@ typedef struct camera_s boolean chase; angle_t aiming; + // Freecam: aiming needs to be reset after switching from chasecam + boolean reset_aiming; + + // Things used by FS cameras. fixed_t viewheight; angle_t startangle; @@ -114,14 +118,14 @@ typedef struct camera_s // demo freecam or something before i commit die struct demofreecam_s { - camera_t *cam; // this is useful when the game is paused, notably - mobj_t *soundmobj; // mobj to play sound from, used in s_sound angle_t localangle; // keeps track of the cam angle for cmds angle_t localaiming; // ditto with aiming boolean turnheld; // holding turn button for gradual turn speed boolean keyboardlook; // keyboard look + + UINT8 button_a_held; // A button was held since entering from menu, so don't move camera }; extern struct demofreecam_s democam; @@ -153,7 +157,7 @@ void P_SlideCameraMove(camera_t *thiscam); void P_DemoCameraMovement(camera_t *cam); boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); void P_ResetLocalCamAiming(player_t *player); -void P_InitCameraCmd(void); +void P_ToggleDemoCamera(void); boolean P_PlayerInPain(player_t *player); void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor); void P_ResetPlayer(player_t *player); diff --git a/src/p_mobj.c b/src/p_mobj.c index 03e7e9f99..d68cf9dcc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10755,6 +10755,15 @@ void P_SpawnPlayer(INT32 playernum) P_SetScale(karmahitbox, mobj->scale); } } + + // TODO: handle splitscreen + // Spectators can switch to freecam. This should be + // disabled when they enter the race, or when the level + // changes. + if (playernum == consoleplayer && !demo.playback) + { + demo.freecam = false; + } } void P_AfterPlayerSpawn(INT32 playernum) @@ -10797,15 +10806,18 @@ void P_AfterPlayerSpawn(INT32 playernum) SV_SpawnPlayer(playernum, mobj->x, mobj->y, mobj->angle); - for (i = 0; i <= splitscreen; i++) + if (p->spectator == false) { - if (!camera[i].chase) - continue; + for (i = 0; i <= splitscreen; i++) + { + if (!camera[i].chase) + continue; - if (displayplayers[i] != playernum) - continue; + if (displayplayers[i] != playernum) + continue; - P_ResetCamera(p, &camera[i]); + P_ResetCamera(p, &camera[i]); + } } if (CheckForReverseGravity) diff --git a/src/p_setup.c b/src/p_setup.c index c0ca1d0a6..75143d6c3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2464,6 +2464,8 @@ static void P_SetupCamera(UINT8 pnum, camera_t *cam) cam->angle = FixedAngle((fixed_t)thing->angle << FRACBITS); cam->subsector = R_PointInSubsectorFast(cam->x, cam->y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18) } + + cam->chase = false; // tell camera to reset its position next tic } static void P_InitCamera(void) diff --git a/src/p_tick.c b/src/p_tick.c index 3b0cadde8..0784957f3 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -497,8 +497,8 @@ void P_Ticker(boolean run) timeinmap = (timeinmap-1) & ~3; G_PreviewRewind(leveltime); } - else if (demo.freecam && democam.cam) // special case: allow freecam to MOVE during pause! - P_DemoCameraMovement(democam.cam); + else + P_RunChaseCameras(); // special case: allow freecam to MOVE during pause! return; } diff --git a/src/p_user.c b/src/p_user.c index 3133ee49b..59b223e9a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1056,6 +1056,15 @@ boolean P_IsDisplayPlayer(const player_t *player) { UINT8 i; + // Freecam still techically has a player in + // displayplayers. But since the camera is detached, it + // would be weird if sounds were heard from that player's + // perspective. + if (demo.freecam) + { + return false; + } + for (i = 0; i <= splitscreen; i++) // DON'T skip P1 { if (player == &players[displayplayers[i]]) @@ -3129,16 +3138,9 @@ static fixed_t forwardmove[2] = {25<>16, 50<>16}; static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn -static ticcmd_t cameracmd; - struct demofreecam_s democam; // called by m_menu to reinit cam input every time it's toggled -void P_InitCameraCmd(void) -{ - memset(&cameracmd, 0, sizeof(ticcmd_t)); // initialize cmd -} - static ticcmd_t *P_CameraCmd(camera_t *cam) { INT32 laim, th, tspeed, forward, side, axis; //i @@ -3150,12 +3152,12 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) INT32 player_invert; INT32 screen_invert; - ticcmd_t *cmd = &cameracmd; + ticcmd_t *cmd = D_LocalTiccmd(0); (void)cam; - if (!demo.playback) - return cmd; // empty cmd, no. + //if (!demo.playback) + //return cmd; // empty cmd, no. lang = democam.localangle; laim = democam.localaiming; @@ -3295,11 +3297,32 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) return cmd; } +void P_ToggleDemoCamera(void) +{ + if (!demo.freecam) // toggle on + { + demo.freecam = true; + democam.button_a_held = 2; + camera[0].reset_aiming = true; + democam.cam = &camera[0]; // this is rather useful + } + else // toggle off + { + demo.freecam = false; + // reset democam vars: + democam.cam = NULL; + democam.turnheld = false; + democam.keyboardlook = false; // reset only these. localangle / aiming gets set before the cam does anything anyway + } +} + +#define intsign(n) \ + ((n) < 0 ? -1 : (n) > 0 ? 1 : 0) + void P_DemoCameraMovement(camera_t *cam) { ticcmd_t *cmd; angle_t thrustangle; - mobj_t *awayviewmobj_hack; player_t *lastp; // update democam stuff with what we got here: @@ -3307,6 +3330,8 @@ void P_DemoCameraMovement(camera_t *cam) democam.localangle = cam->angle; democam.localaiming = cam->aiming; + boolean moving = false; + // first off we need to get button input cmd = P_CameraCmd(cam); @@ -3314,11 +3339,24 @@ void P_DemoCameraMovement(camera_t *cam) cam->angle = cmd->angleturn<<16; // camera movement: + if (!democam.button_a_held) + { + if (cmd->buttons & BT_ACCELERATE) + { + cam->z += 32*mapobjectscale; + moving = true; + } + else if (cmd->buttons & BT_BRAKE) + { + cam->z -= 32*mapobjectscale; + moving = true; + } + } - if (cmd->buttons & BT_ACCELERATE) - cam->z += 32*mapobjectscale; - else if (cmd->buttons & BT_BRAKE) - cam->z -= 32*mapobjectscale; + if (!(cmd->buttons & (BT_ACCELERATE | BT_DRIFT)) && democam.button_a_held) + { + democam.button_a_held--; + } // if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"") if (cmd->buttons & BT_ATTACK) @@ -3326,35 +3364,64 @@ void P_DemoCameraMovement(camera_t *cam) lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); cam->aiming = R_PointToAngle2(0, cam->z, R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y), lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads. + + cam->reset_aiming = false; } + if (cmd->forwardmove != 0) + { + moving = true; + } + + // After switching to democam, the vertical angle of + // chasecam is inherited. This is intentional because it + // creates a smooth transition. However, moving + // forward/back will have a slope. So, as long as democam + // controls haven't been used to alter the vertical angle, + // slowly reset it to flat. + if ((cam->reset_aiming && moving) || ((cmd->buttons & BT_DRIFT) && !democam.button_a_held)) + { + INT32 aiming = cam->aiming; + INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(cam->aiming)); + + if (abs(smooth) < abs(aiming)) + { + cam->aiming -= smooth * intsign(aiming); + } + else + { + cam->aiming = 0; + cam->reset_aiming = false; // completely smoothed out + } + } + + G_ClipAimingPitch((INT32 *)&cam->aiming); + cam->momx = cam->momy = cam->momz = 0; if (cmd->forwardmove != 0) { - thrustangle = cam->angle >> ANGLETOFINESHIFT; cam->x += FixedMul(cmd->forwardmove*mapobjectscale, FINECOSINE(thrustangle)); cam->y += FixedMul(cmd->forwardmove*mapobjectscale, FINESINE(thrustangle)); - cam->z += FixedMul(cmd->forwardmove*mapobjectscale, AIMINGTOSLOPE(cam->aiming)); + + if (!cam->reset_aiming) + { + cam->z += FixedMul(cmd->forwardmove*mapobjectscale, AIMINGTOSLOPE(cam->aiming)); + } + // momentums are useless here, directly add to the coordinates // this.......... doesn't actually check for floors and walls and whatnot but the function to do that is a pure mess so fuck that. // besides freecam going inside walls sounds pretty cool on paper. } - // awayviewmobj hack; this is to prevent us from hearing sounds from the player's perspective - - awayviewmobj_hack = P_SpawnMobj(cam->x, cam->y, cam->z, MT_THOK); - awayviewmobj_hack->tics = 2; - awayviewmobj_hack->flags2 |= MF2_DONTDRAW; - - democam.soundmobj = awayviewmobj_hack; - // update subsector to avoid crashes; cam->subsector = R_PointInSubsectorFast(cam->x, cam->y); } +#undef intsign + void P_ResetCamera(player_t *player, camera_t *thiscam) { tic_t tries = 0; @@ -3399,6 +3466,9 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) thiscam->radius = 20*FRACUNIT; thiscam->height = 16*FRACUNIT; + thiscam->reset_aiming = true; + + while (!P_MoveChaseCamera(player,thiscam,true) && ++tries < 2*TICRATE); } @@ -3420,8 +3490,6 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall subsector_t *newsubsec; #endif - democam.soundmobj = NULL; // reset this each frame, we don't want the game crashing for stupid reasons now do we - // We probably shouldn't move the camera if there is no player or player mobj somehow if (!player || !player->mo) return true; @@ -3430,12 +3498,16 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) return true; - if (demo.freecam) + if (demo.freecam || player->spectator) { P_DemoCameraMovement(thiscam); return true; } + if (paused || P_AutoPause()) + return true; + + if (thiscam == &camera[1]) // Camera 2 { num = 1; diff --git a/src/r_main.c b/src/r_main.c index 9541fef41..a6caf8614 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1224,9 +1224,14 @@ void R_SetupFrame(int s, boolean skybox) thiscam->reset = false; } - if (player->spectator) // no spectator chasecam - chasecam = false; // force chasecam off - else if (player->playerstate == PST_DEAD || player->exiting) + if (player->spectator) + { + // Free flying spectator uses demo freecam. This + // requires chasecam to be enabled. + chasecam = true; + } + + if (player->playerstate == PST_DEAD || player->exiting) chasecam = true; // force chasecam on if (chasecam && (thiscam && !thiscam->chase)) @@ -1255,7 +1260,7 @@ void R_SetupFrame(int s, boolean skybox) R_SetupCommonFrame(player, subsector); } - else if (!player->spectator && (thiscam && chasecam)) // use outside cam view + else if (thiscam && chasecam) // use outside cam view { viewmobj = NULL; diff --git a/src/s_sound.c b/src/s_sound.c index c770957b6..fa56ab8ad 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -491,11 +491,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) memset(&listener[i], 0, sizeof (listener[i])); listenmobj[i] = NULL; - if (i == 0 && democam.soundmobj) - { - listenmobj[i] = democam.soundmobj; - } - else if (player->awayviewtics) + if (player->awayviewtics) { listenmobj[i] = player->awayviewmobj; } @@ -504,7 +500,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) listenmobj[i] = player->mo; } - if (origin && origin == listenmobj[i]) + if (origin && origin == listenmobj[i] && !demo.freecam) { itsUs = true; } @@ -775,12 +771,6 @@ void S_UpdateSounds(void) memset(&listener[i], 0, sizeof (listener[i])); listenmobj[i] = NULL; - if (i == 0 && democam.soundmobj) - { - listenmobj[i] = democam.soundmobj; - continue; - } - if (player->awayviewtics) { listenmobj[i] = player->awayviewmobj; @@ -843,12 +833,15 @@ void S_UpdateSounds(void) { boolean itsUs = false; - for (i = splitscreen; i >= 0; i--) + if (!demo.freecam) { - if (c->origin != listenmobj[i]) - continue; + for (i = splitscreen; i >= 0; i--) + { + if (c->origin != listenmobj[i]) + continue; - itsUs = true; + itsUs = true; + } } if (itsUs == false) -- 2.54.0 From 6bb72c363f159397af8ab930123bcc5354e8680c Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 27 Dec 2024 23:37:23 +0100 Subject: [PATCH 008/325] fix freecam not being interpolated when ingame --- src/r_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_main.c b/src/r_main.c index a6caf8614..7bd9f8630 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1078,7 +1078,7 @@ R_SetupCommonFrame else newview->sector = R_PointInSubsector(newview->x, newview->y)->sector; - R_InterpolateView(R_UsingFrameInterpolation() ? (demo.playback && demo.freecam) ? rendertimefrac_unpaused : rendertimefrac : FRACUNIT, false); + R_InterpolateView(R_UsingFrameInterpolation() ? (demo.freecam ? rendertimefrac_unpaused : rendertimefrac) : FRACUNIT, false); } static void R_SetupAimingFrame(player_t *player, camera_t *thiscam) -- 2.54.0 From 1922b32799dd3c2ff0ca61fef433bc4fa8a74248 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 27 Dec 2024 23:55:19 +0100 Subject: [PATCH 009/325] add bindable freecam toggle --- src/g_game.c | 5 ++++ src/g_input.c | 1 + src/g_input.h | 1 + src/m_menu.c | 64 +++++++++++++++++++++++++++------------------------ 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index dadcee0e2..b5569fbe0 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1554,6 +1554,11 @@ boolean G_Responder(event_t *ev) { K_ToggleDirector(); } + if (ev->data1 == gamecontrol[gc_freecam][0] + || ev->data1 == gamecontrol[gc_freecam][1]) + { + P_ToggleDemoCamera(); + } return true; diff --git a/src/g_input.c b/src/g_input.c index 7f2fff283..3e6e056f6 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -902,6 +902,7 @@ static const char *gamecontrolname[num_gamecontrols] = "custom2", "custom3", "director", + "freecam", }; #define NUMKEYNAMES (sizeof (keynames)/sizeof (keyname_t)) diff --git a/src/g_input.h b/src/g_input.h index 18fff51a4..76d3a50c7 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -100,6 +100,7 @@ typedef enum gc_custom2, // Lua scriptable gc_custom3, // Lua scriptable gc_director, + gc_freecam, // Toggle for freecam while ingame num_gamecontrols } gamecontrols_e; diff --git a/src/m_menu.c b/src/m_menu.c index cf34db301..57be0699d 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1182,6 +1182,7 @@ static menuitem_t OP_AllControlsMenu[] = { {IT_SUBMENU|IT_STRING, NULL, "Gamepad Options...", &OP_Joystick1Def, 0}, {IT_CALL|IT_STRING, NULL, "Reset to defaults", M_ResetControls, 8}, + //{IT_SPACE, NULL, NULL, NULL, 0}, {IT_HEADER, NULL, "Gameplay Controls", NULL, 0}, {IT_SPACE, NULL, NULL, NULL, 0}, @@ -1194,26 +1195,33 @@ static menuitem_t OP_AllControlsMenu[] = {IT_CONTROL, NULL, "Aim Forward", M_ChangeControl, gc_aimforward }, {IT_CONTROL, NULL, "Aim Backward", M_ChangeControl, gc_aimbackward}, {IT_CONTROL, NULL, "Look Backward", M_ChangeControl, gc_lookback }, + {IT_HEADER, NULL, "Miscelleanous Controls", NULL, 0}, {IT_SPACE, NULL, NULL, NULL, 0}, {IT_CONTROL, NULL, "Chat", M_ChangeControl, gc_talkkey }, - //{IT_CONTROL, NULL, "Team Chat", M_ChangeControl, gc_teamkey }, + //{IT_CONTROL, NULL, "Team Chat", M_ChangeControl, gc_teamkey }, {IT_CONTROL, NULL, "Show Rankings", M_ChangeControl, gc_scores }, - {IT_CONTROL, NULL, "Change Viewpoint", M_ChangeControl, gc_viewpoint }, - {IT_CONTROL, NULL, "Reset Camera", M_ChangeControl, gc_camreset }, - {IT_CONTROL, NULL, "Toggle First-Person", M_ChangeControl, gc_camtoggle }, {IT_CONTROL, NULL, "Pause", M_ChangeControl, gc_pause }, {IT_CONTROL, NULL, "Screenshot", M_ChangeControl, gc_screenshot }, {IT_CONTROL, NULL, "Toggle GIF Recording", M_ChangeControl, gc_recordgif }, {IT_CONTROL, NULL, "Open/Close Menu (ESC)", M_ChangeControl, gc_systemmenu }, {IT_CONTROL, NULL, "Developer Console", M_ChangeControl, gc_console }, - {IT_HEADER, NULL, "Spectator Controls", NULL, 0}, + + {IT_HEADER, NULL, "Camera Controls", NULL, 0}, {IT_SPACE, NULL, NULL, NULL, 0}, - {IT_CONTROL, NULL, "Become Spectator", M_ChangeControl, gc_spectate }, + {IT_CONTROL, NULL, "Toggle Freecam", M_ChangeControl, gc_freecam }, {IT_CONTROL, NULL, "Look Up", M_ChangeControl, gc_lookup }, {IT_CONTROL, NULL, "Look Down", M_ChangeControl, gc_lookdown }, {IT_CONTROL, NULL, "Center View", M_ChangeControl, gc_centerview }, + {IT_CONTROL, NULL, "Change Viewpoint", M_ChangeControl, gc_viewpoint }, + {IT_CONTROL, NULL, "Reset Camera", M_ChangeControl, gc_camreset }, + //{IT_CONTROL, NULL, "Toggle First-Person", M_ChangeControl, gc_camtoggle }, + + {IT_HEADER, NULL, "Spectator Controls", NULL, 0}, + {IT_SPACE, NULL, NULL, NULL, 0}, + {IT_CONTROL, NULL, "Become Spectator", M_ChangeControl, gc_spectate }, {IT_CONTROL, NULL, "Toggle Director", M_ChangeControl, gc_director }, + {IT_HEADER, NULL, "Custom Lua Actions", NULL, 0}, {IT_SPACE, NULL, NULL, NULL, 0}, {IT_CONTROL, NULL, "Custom Action 1", M_ChangeControl, gc_custom1 }, @@ -12082,12 +12090,11 @@ static void M_Setup1PControlsMenu(INT32 choice) // Unhide P1-only controls OP_AllControlsMenu[15].status = IT_CONTROL; // Chat OP_AllControlsMenu[16].status = IT_CONTROL; // Rankings - // 18 is Reset Camera, 19 is Toggle Chasecam - OP_AllControlsMenu[20].status = IT_CONTROL; // Pause - OP_AllControlsMenu[21].status = IT_CONTROL; // Screenshot - OP_AllControlsMenu[22].status = IT_CONTROL; // GIF - OP_AllControlsMenu[23].status = IT_CONTROL; // System Menu - OP_AllControlsMenu[24].status = IT_CONTROL; // Console + OP_AllControlsMenu[17].status = IT_CONTROL; // Pause + OP_AllControlsMenu[18].status = IT_CONTROL; // Screenshot + OP_AllControlsMenu[19].status = IT_CONTROL; // GIF + OP_AllControlsMenu[20].status = IT_CONTROL; // System Menu + OP_AllControlsMenu[21].status = IT_CONTROL; // Console M_SetupNextMenu(&OP_AllControlsDef); } @@ -12105,12 +12112,11 @@ static void M_Setup2PControlsMenu(INT32 choice) // Hide P1-only controls OP_AllControlsMenu[15].status = IT_GRAYEDOUT2; // Chat OP_AllControlsMenu[16].status = IT_GRAYEDOUT2; // Rankings - // 18 is Reset Camera, 19 is Toggle Chasecam - OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // Pause - OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Screenshot - OP_AllControlsMenu[22].status = IT_GRAYEDOUT2; // GIF - OP_AllControlsMenu[23].status = IT_GRAYEDOUT2; // System Menu - OP_AllControlsMenu[24].status = IT_GRAYEDOUT2; // Console + OP_AllControlsMenu[17].status = IT_GRAYEDOUT2; // Pause + OP_AllControlsMenu[18].status = IT_GRAYEDOUT2; // Screenshot + OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF + OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu + OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console M_SetupNextMenu(&OP_AllControlsDef); } @@ -12128,12 +12134,11 @@ static void M_Setup3PControlsMenu(INT32 choice) // Hide P1-only controls OP_AllControlsMenu[15].status = IT_GRAYEDOUT2; // Chat OP_AllControlsMenu[16].status = IT_GRAYEDOUT2; // Rankings - // 18 is Reset Camera, 19 is Toggle Chasecam - OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // Pause - OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Screenshot - OP_AllControlsMenu[22].status = IT_GRAYEDOUT2; // GIF - OP_AllControlsMenu[23].status = IT_GRAYEDOUT2; // System Menu - OP_AllControlsMenu[24].status = IT_GRAYEDOUT2; // Console + OP_AllControlsMenu[17].status = IT_GRAYEDOUT2; // Pause + OP_AllControlsMenu[18].status = IT_GRAYEDOUT2; // Screenshot + OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF + OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu + OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console M_SetupNextMenu(&OP_AllControlsDef); } @@ -12151,12 +12156,11 @@ static void M_Setup4PControlsMenu(INT32 choice) // Hide P1-only controls OP_AllControlsMenu[15].status = IT_GRAYEDOUT2; // Chat OP_AllControlsMenu[16].status = IT_GRAYEDOUT2; // Rankings - // 18 is Reset Camera, 19 is Toggle Chasecam - OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // Pause - OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Screenshot - OP_AllControlsMenu[22].status = IT_GRAYEDOUT2; // GIF - OP_AllControlsMenu[23].status = IT_GRAYEDOUT2; // System Menu - OP_AllControlsMenu[24].status = IT_GRAYEDOUT2; // Console + OP_AllControlsMenu[17].status = IT_GRAYEDOUT2; // Pause + OP_AllControlsMenu[18].status = IT_GRAYEDOUT2; // Screenshot + OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF + OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu + OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console M_SetupNextMenu(&OP_AllControlsDef); } -- 2.54.0 From 45d33b951ccec52b038fa89e1dd083e7186c01db Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 00:04:49 +0100 Subject: [PATCH 010/325] add alternative cam float and sink buttons --- src/g_input.c | 2 ++ src/g_input.h | 2 ++ src/m_menu.c | 2 ++ src/p_user.c | 4 ++-- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 3e6e056f6..c948ed751 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -903,6 +903,8 @@ static const char *gamecontrolname[num_gamecontrols] = "custom3", "director", "freecam", + "camfloat", + "camsink", }; #define NUMKEYNAMES (sizeof (keynames)/sizeof (keyname_t)) diff --git a/src/g_input.h b/src/g_input.h index 76d3a50c7..1dbbb937f 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -101,6 +101,8 @@ typedef enum gc_custom3, // Lua scriptable gc_director, gc_freecam, // Toggle for freecam while ingame + gc_camfloat, // alternative button for raising cam + gc_camsink, // alternative button for sinking num_gamecontrols } gamecontrols_e; diff --git a/src/m_menu.c b/src/m_menu.c index 57be0699d..ac6fc90db 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1213,6 +1213,8 @@ static menuitem_t OP_AllControlsMenu[] = {IT_CONTROL, NULL, "Look Up", M_ChangeControl, gc_lookup }, {IT_CONTROL, NULL, "Look Down", M_ChangeControl, gc_lookdown }, {IT_CONTROL, NULL, "Center View", M_ChangeControl, gc_centerview }, + {IT_CONTROL, NULL, "Float", M_ChangeControl, gc_camfloat }, + {IT_CONTROL, NULL, "Sink", M_ChangeControl, gc_camsink }, {IT_CONTROL, NULL, "Change Viewpoint", M_ChangeControl, gc_viewpoint }, {IT_CONTROL, NULL, "Reset Camera", M_ChangeControl, gc_camreset }, //{IT_CONTROL, NULL, "Toggle First-Person", M_ChangeControl, gc_camtoggle }, diff --git a/src/p_user.c b/src/p_user.c index 59b223e9a..54f67eec8 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3341,12 +3341,12 @@ void P_DemoCameraMovement(camera_t *cam) // camera movement: if (!democam.button_a_held) { - if (cmd->buttons & BT_ACCELERATE) + if (cmd->buttons & BT_ACCELERATE || PLAYER1INPUTDOWN(gc_camfloat)) { cam->z += 32*mapobjectscale; moving = true; } - else if (cmd->buttons & BT_BRAKE) + else if (cmd->buttons & BT_BRAKE || PLAYER1INPUTDOWN(gc_camsink)) { cam->z -= 32*mapobjectscale; moving = true; -- 2.54.0 From 3381f6af3a4b3a99dca672bce8b9eb3f700485f6 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 00:21:41 +0100 Subject: [PATCH 011/325] set default controls for float and sink ig --- src/g_input.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/g_input.c b/src/g_input.c index c948ed751..606f20770 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1142,6 +1142,12 @@ void G_Controldefault(UINT8 player) //gamecontrol[gc_screenshot ][1] = KEY_HAT1+1; // D-Pad Down // absolutely fucking NOT gamecontrol[gc_talkkey ][1] = KEY_HAT1+1; // D-Pad Down gamecontrol[gc_scores ][1] = KEY_HAT1+0; // D-Pad Up + + gamecontrol[gc_camfloat ][1] = 'a'; + gamecontrol[gc_camsink ][1] = 'd'; + + gamecontrol[gc_camfloat ][1] = KEY_JOY1+0; // A + gamecontrol[gc_camsink ][1] = KEY_JOY1+1; // B } if (player == 0 || player == 2) -- 2.54.0 From 332f7db32f79c5b6d482b5d02dca9edd170e61b5 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 01:38:08 +0100 Subject: [PATCH 012/325] make freecam work in splitscreen banish cameracmd shit --- src/d_netcmd.c | 2 +- src/g_game.c | 49 +++++---- src/k_kart.c | 25 ++--- src/m_menu.c | 6 +- src/p_local.h | 24 ++--- src/p_mobj.c | 7 +- src/p_user.c | 279 ++++++++++++------------------------------------- src/r_fps.h | 4 + src/r_main.c | 3 +- src/s_sound.c | 16 +-- src/st_stuff.c | 4 +- 11 files changed, 135 insertions(+), 284 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e49f6c17a..5e1927ff0 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2301,7 +2301,7 @@ static void Command_View_f(void) return; } - if (demo.freecam) + if (camera[viewnum-1].freecam) return; displayplayerp = &displayplayers[viewnum-1]; diff --git a/src/g_game.c b/src/g_game.c index b5569fbe0..1be80c944 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1402,7 +1402,7 @@ boolean G_Responder(event_t *ev) } } - if (gamestate == GS_LEVEL && ev->type == ev_keydown && multiplayer && demo.playback && !demo.freecam) + if (gamestate == GS_LEVEL && ev->type == ev_keydown && multiplayer && demo.playback) { if (ev->data1 == gamecontrolbis[gc_viewpoint][0] || ev->data1 == gamecontrolbis[gc_viewpoint][1]) { @@ -1554,10 +1554,22 @@ boolean G_Responder(event_t *ev) { K_ToggleDirector(); } - if (ev->data1 == gamecontrol[gc_freecam][0] - || ev->data1 == gamecontrol[gc_freecam][1]) + + if (ev->data1 == gamecontrol[gc_freecam][0] || ev->data1 == gamecontrol[gc_freecam][1]) { - P_ToggleDemoCamera(); + P_ToggleDemoCamera(0); + } + else if (ev->data1 == gamecontrolbis[gc_freecam][0] || ev->data1 == gamecontrolbis[gc_freecam][1]) + { + P_ToggleDemoCamera(1); + } + else if (ev->data1 == gamecontrol3[gc_freecam][0] || ev->data1 == gamecontrol3[gc_freecam][1]) + { + P_ToggleDemoCamera(2); + } + else if (ev->data1 == gamecontrol4[gc_freecam][0] || ev->data1 == gamecontrol4[gc_freecam][1]) + { + P_ToggleDemoCamera(3); } return true; @@ -1740,13 +1752,6 @@ void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive) viewnum = playersviewable; splitscreen = viewnum-1; - /* Prepare extra views for G_FindView to pass. */ - for (viewd = splits+1; viewd < viewnum; ++viewd) - { - displayplayerp = (&displayplayers[viewd-1]); - (*displayplayerp) = INT32_MAX; - } - R_ExecuteSetViewSize(); } @@ -5769,9 +5774,6 @@ void G_ConfirmRewind(tic_t rewindtime) COM_BufInsertText("renderview on\n"); - if (demo.freecam) - return; // don't touch from there - splitscreen = oldss; displayplayers[0] = olddp1; displayplayers[1] = olddp2; @@ -7154,15 +7156,14 @@ void G_DoPlayDemo(char *defdemoname) //LUA_HookInt(gamemap, HOOK(MapChange)); - displayplayers[0] = consoleplayer = 0; + consoleplayer = 0; memset(playeringame,0,sizeof(playeringame)); + memset(displayplayers,0,sizeof(displayplayers)); + memset(camera,0,sizeof(camera)); // reset freecam // Load players that were in-game when the map started p = READUINT8(demo_p); - for (i = 1; i < MAXSPLITSCREENPLAYERS; i++) - displayplayers[i] = INT32_MAX; - while (p != 0xFF) { spectator = false; @@ -7856,13 +7857,11 @@ void G_StopDemo(void) demo.timing = false; singletics = false; - demo.freecam = false; - // reset democam shit too: - democam.cam = NULL; - democam.localangle = 0; - democam.localaiming = 0; - democam.turnheld = false; - democam.keyboardlook = false; + UINT8 i; + for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i) + { + camera[i].freecam = false; + } CV_SetValue(&cv_playbackspeed, 1); demo.rewinding = false; diff --git a/src/k_kart.c b/src/k_kart.c index a6aa76e4d..7a9f43f55 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1233,7 +1233,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) dontforcespb = true; // This makes the roulette produce the random noises. - if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsDisplayPlayer(player) && !demo.freecam) + if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsDisplayPlayer(player)) { #define PLAYROULETTESND S_StartSound(NULL, sfx_itrol1 + ((player->kartstuff[k_itemroulette] / 3) % 8)) for (i = 0; i <= splitscreen; i++) @@ -1267,7 +1267,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) //player->kartstuff[k_itemblinkmode] = 1; player->kartstuff[k_itemroulette] = 0; player->kartstuff[k_roulettetype] = 0; - if (P_IsDisplayPlayer(player) && !demo.freecam) + if (P_IsDisplayPlayer(player)) S_StartSound(NULL, sfx_itrole); return; } @@ -1280,7 +1280,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemblinkmode] = 2; player->kartstuff[k_itemroulette] = 0; player->kartstuff[k_roulettetype] = 0; - if (P_IsDisplayPlayer(player) && !demo.freecam) + if (P_IsDisplayPlayer(player)) S_StartSound(NULL, sfx_dbgsal); return; } @@ -1312,7 +1312,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemamount] = 1; } - if (P_IsDisplayPlayer(player) && !demo.freecam) + if (P_IsDisplayPlayer(player)) S_StartSound(NULL, ((player->kartstuff[k_roulettetype] == 1) ? sfx_itrolk : (mashed ? sfx_itrolm : sfx_itrolf))); player->kartstuff[k_itemblink] = TICRATE; @@ -9311,7 +9311,7 @@ static void K_drawDriftGauge(void) 0, 31, 47, 63, 79, 95, 111, 119, 127, 143, 159, 175, 183, 191, 199, 207, 223, 247 }; - if (demo.playback && demo.freecam) + if (demo.playback && camera[R_GetViewNumber()].freecam) return; if (P_MobjWasRemoved(stplyr->mo) || (!splitscreen && !camera->chase)) @@ -10419,22 +10419,19 @@ void K_drawKartHUD(void) { boolean isfreeplay = false; boolean battlefullscreen = false; - boolean freecam = demo.freecam; //disable some hud elements w/ freecam - UINT8 i; + UINT8 viewnum = R_GetViewNumber(); + boolean freecam = camera[viewnum].freecam; //disable some hud elements w/ freecam // Define the X and Y for each drawn object // This is handled by console/menu values K_initKartHUD(); // Draw that fun first person HUD! Drawn ASAP so it looks more "real". - for (i = 0; i <= splitscreen; i++) - { - if (stplyr == &players[displayplayers[i]] && !camera[i].chase && !freecam) - K_drawKartFirstPerson(); - } + if (!camera[viewnum].chase && !freecam) + K_drawKartFirstPerson(); // Draw full screen stuff that turns off the rest of the HUD - if (mapreset && stplyr == &players[displayplayers[0]]) + if (mapreset && R_GetViewNumber() == 0) { K_drawChallengerScreen(); return; @@ -10527,7 +10524,7 @@ void K_drawKartHUD(void) } } - if (!stplyr->spectator && !demo.freecam) // Bottom of the screen elements, don't need in spectate mode + if (!stplyr->spectator && !freecam) // Bottom of the screen elements, don't need in spectate mode { if (!(splitscreen || demo.title)) { diff --git a/src/m_menu.c b/src/m_menu.c index ac6fc90db..0bfacba82 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -7722,7 +7722,11 @@ static void M_PlaybackToggleFreecam(INT32 choice) splitscreen = 0; R_ExecuteSetViewSize(); - P_ToggleDemoCamera(); + UINT8 i; + for (i = 0; i <= splitscreen; ++i) + { + P_ToggleDemoCamera(i); + } } diff --git a/src/p_local.h b/src/p_local.h index 63dbed216..368779983 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -79,12 +79,16 @@ void P_UnlinkThinker(thinker_t *thinker); typedef struct camera_s { boolean chase; + boolean freecam; + angle_t aiming; + // Freecam: A button was held since entering from menu, so don't move camera + UINT8 button_a_held; + // Freecam: aiming needs to be reset after switching from chasecam boolean reset_aiming; - // Things used by FS cameras. fixed_t viewheight; angle_t startangle; @@ -116,20 +120,6 @@ typedef struct camera_s fixed_t pan; } camera_t; -// demo freecam or something before i commit die -struct demofreecam_s { - camera_t *cam; // this is useful when the game is paused, notably - - angle_t localangle; // keeps track of the cam angle for cmds - angle_t localaiming; // ditto with aiming - boolean turnheld; // holding turn button for gradual turn speed - boolean keyboardlook; // keyboard look - - UINT8 button_a_held; // A button was held since entering from menu, so don't move camera -}; - -extern struct demofreecam_s democam; - extern camera_t camera[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_dist[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_still[MAXSPLITSCREENPLAYERS]; @@ -154,10 +144,10 @@ void P_AddPlayerScore(player_t *player, UINT32 amount); void P_ResetCamera(player_t *player, camera_t *thiscam); boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam); void P_SlideCameraMove(camera_t *thiscam); -void P_DemoCameraMovement(camera_t *cam); +void P_DemoCameraMovement(camera_t *cam, UINT8 num); boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); void P_ResetLocalCamAiming(player_t *player); -void P_ToggleDemoCamera(void); +void P_ToggleDemoCamera(UINT8 viewnum); boolean P_PlayerInPain(player_t *player); void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor); void P_ResetPlayer(player_t *player); diff --git a/src/p_mobj.c b/src/p_mobj.c index d68cf9dcc..bdf6b1a93 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10760,9 +10760,12 @@ void P_SpawnPlayer(INT32 playernum) // Spectators can switch to freecam. This should be // disabled when they enter the race, or when the level // changes. - if (playernum == consoleplayer && !demo.playback) + if (!demo.playback) { - demo.freecam = false; + if (!p->spectator) + { + camera[playernum].freecam = false; + } } } diff --git a/src/p_user.c b/src/p_user.c index 54f67eec8..b562ca33c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1056,17 +1056,17 @@ boolean P_IsDisplayPlayer(const player_t *player) { UINT8 i; - // Freecam still techically has a player in - // displayplayers. But since the camera is detached, it - // would be weird if sounds were heard from that player's - // perspective. - if (demo.freecam) - { - return false; - } - for (i = 0; i <= splitscreen; i++) // DON'T skip P1 { + if (camera[i].freecam) + { + // Freecam still techically has a player in + // displayplayers. But since the camera is + // detached, it would be weird if sounds were + // heard from that player's perspective. + continue; + } + if (player == &players[displayplayers[i]]) return true; } @@ -3130,232 +3130,69 @@ fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42, -42, -42, -42}; #define MAXCAMERADIST 140*FRACUNIT // Max distance the camera can be in front of the player (2D mode) -// Heavily simplified version of G_BuildTicCmd that only takes the local first player's control input and converts it to readable ticcmd_t -// we then throw that ticcmd garbage in the camera and make it move - -// redefine this -static fixed_t forwardmove[2] = {25<>16, 50<>16}; -static fixed_t sidemove[2] = {2<>16, 4<>16}; -static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn - -struct demofreecam_s democam; - -// called by m_menu to reinit cam input every time it's toggled -static ticcmd_t *P_CameraCmd(camera_t *cam) +void P_ToggleDemoCamera(UINT8 viewnum) { - INT32 laim, th, tspeed, forward, side, axis; //i - const INT32 speed = 1; - // these ones used for multiple conditions - boolean turnleft, turnright, mouseaiming; - boolean invertmouse, lookaxis, usejoystick, kbl; - angle_t lang; - INT32 player_invert; - INT32 screen_invert; + camera_t *cam = &camera[viewnum]; - ticcmd_t *cmd = D_LocalTiccmd(0); - - (void)cam; - - //if (!demo.playback) - //return cmd; // empty cmd, no. - - lang = democam.localangle; - laim = democam.localaiming; - th = democam.turnheld; - kbl = democam.keyboardlook; - - G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver - - cmd->angleturn = (INT16)(lang >> 16); - cmd->aiming = G_ClipAimingPitch(&laim); - - mouseaiming = true; - invertmouse = cv_invertmouse.value; - lookaxis = cv_lookaxis[0].value; - - usejoystick = true; - turnright = InputDown(gc_turnright, 1); - turnleft = InputDown(gc_turnleft, 1); - - axis = JoyAxis(AXISTURN, 1); - - if (encoremode) + if (!cam->freecam) // toggle on { - turnright ^= turnleft; // swap these using three XORs - turnleft ^= turnright; - turnright ^= turnleft; - axis = -axis; - } - - if (axis != 0) - { - turnright = turnright || (axis > 0); - turnleft = turnleft || (axis < 0); - } - forward = side = 0; - - // use two stage accelerative turning - // on the keyboard and joystick - if (turnleft || turnright) - th += 1; - else - th = 0; - - if (th < SLOWTURNTICS) - tspeed = 2; // slow turn - else - tspeed = speed; - - // let movement keys cancel each other out - if (turnright && !(turnleft)) - { - cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed])); - side += sidemove[1]; - } - else if (turnleft && !(turnright)) - { - cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed])); - side -= sidemove[1]; - } - - cmd->angleturn = (INT16)(cmd->angleturn - ((mousex*(encoremode ? -1 : 1)*8))); - - axis = JoyAxis(AXISMOVE, 1); - if (InputDown(gc_accelerate, 1) || (usejoystick && axis > 0)) - cmd->buttons |= BT_ACCELERATE; - axis = JoyAxis(AXISBRAKE, 1); - if (InputDown(gc_brake, 1) || (usejoystick && axis > 0)) - cmd->buttons |= BT_BRAKE; - axis = JoyAxis(AXISAIM, 1); - if (InputDown(gc_aimforward, 1) || (usejoystick && axis < 0)) - forward += forwardmove[1]; - if (InputDown(gc_aimbackward, 1) || (usejoystick && axis > 0)) - forward -= forwardmove[1]; - - // fire with any button/key - axis = JoyAxis(AXISFIRE, 1); - if (InputDown(gc_fire, 1) || (usejoystick && axis > 0)) - cmd->buttons |= BT_ATTACK; - - // spectator aiming shit, ahhhh... - player_invert = invertmouse ? -1 : 1; - screen_invert = 1; // nope - - // mouse look stuff (mouse look is not the same as mouse aim) - kbl = false; - - // looking up/down - laim += (mlooky<<19)*player_invert*screen_invert; - - axis = JoyAxis(AXISLOOK, 1); - - // spring back if not using keyboard neither mouselookin' - if (!kbl && !lookaxis && !mouseaiming) - laim = 0; - - if (InputDown(gc_lookup, 1) || (axis < 0)) - { - laim += KB_LOOKSPEED * screen_invert; - kbl = true; - } - else if (InputDown(gc_lookdown, 1) || (axis > 0)) - { - laim -= KB_LOOKSPEED * screen_invert; - kbl = true; - } - - if (InputDown(gc_centerview, 1)) // No need to put a spectator limit on this one though :V - laim = 0; - - cmd->aiming = G_ClipAimingPitch(&laim); - - mousex = mousey = mlooky = 0; - - if (forward > MAXPLMOVE) - forward = MAXPLMOVE; - else if (forward < -MAXPLMOVE) - forward = -MAXPLMOVE; - - if (side > MAXPLMOVE) - side = MAXPLMOVE; - else if (side < -MAXPLMOVE) - side = -MAXPLMOVE; - - if (forward || side) - { - cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); - cmd->sidemove = (SINT8)(cmd->sidemove + side); - } - - lang += (cmd->angleturn<<16); - - democam.localangle = lang; - democam.localaiming = laim; - democam.turnheld = th; - democam.keyboardlook = kbl; - - return cmd; -} - -void P_ToggleDemoCamera(void) -{ - if (!demo.freecam) // toggle on - { - demo.freecam = true; - democam.button_a_held = 2; - camera[0].reset_aiming = true; - democam.cam = &camera[0]; // this is rather useful + cam->freecam = true; + cam->button_a_held = 2; + cam->reset_aiming = true; } else // toggle off { - demo.freecam = false; - // reset democam vars: - democam.cam = NULL; - democam.turnheld = false; - democam.keyboardlook = false; // reset only these. localangle / aiming gets set before the cam does anything anyway + cam->freecam = false; } } #define intsign(n) \ ((n) < 0 ? -1 : (n) > 0 ? 1 : 0) -void P_DemoCameraMovement(camera_t *cam) +void P_DemoCameraMovement(camera_t *cam, UINT8 num) { ticcmd_t *cmd; angle_t thrustangle; player_t *lastp; - - // update democam stuff with what we got here: - democam.cam = cam; - democam.localangle = cam->angle; - democam.localaiming = cam->aiming; + angle_t turning; boolean moving = false; // first off we need to get button input - cmd = P_CameraCmd(cam); + cmd = D_LocalTiccmd(num); - cam->aiming = cmd->aiming<angle = cmd->angleturn<<16; + if (cmd->aiming != 0) + { + cam->aiming = cmd->aiming << FRACBITS; + + cam->reset_aiming = false; + } + + turning = cmd->angleturn << 16; + if (encoremode) + { + turning = -turning; + } + cam->angle = turning; // camera movement: - if (!democam.button_a_held) + if (!cam->button_a_held) { - if (cmd->buttons & BT_ACCELERATE || PLAYER1INPUTDOWN(gc_camfloat)) + if (InputDown(gc_camfloat, num+1)) { cam->z += 32*mapobjectscale; moving = true; } - else if (cmd->buttons & BT_BRAKE || PLAYER1INPUTDOWN(gc_camsink)) + else if (InputDown(gc_camsink, num+1)) { cam->z -= 32*mapobjectscale; moving = true; } } - if (!(cmd->buttons & (BT_ACCELERATE | BT_DRIFT)) && democam.button_a_held) + if (!(InputDown(gc_camfloat, num+1) || InputDown(gc_camsink, num+1)) && cam->button_a_held) { - democam.button_a_held--; + cam->button_a_held--; } // if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"") @@ -3379,7 +3216,7 @@ void P_DemoCameraMovement(camera_t *cam) // forward/back will have a slope. So, as long as democam // controls haven't been used to alter the vertical angle, // slowly reset it to flat. - if ((cam->reset_aiming && moving) || ((cmd->buttons & BT_DRIFT) && !democam.button_a_held)) + if ((cam->reset_aiming && moving) || ((InputDown(gc_camsink, num+1)) && !cam->button_a_held)) { INT32 aiming = cam->aiming; INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(cam->aiming)); @@ -3395,7 +3232,23 @@ void P_DemoCameraMovement(camera_t *cam) } } - G_ClipAimingPitch((INT32 *)&cam->aiming); + if (rendermode == render_soft +#ifdef HWRENDER + || (rendermode == render_opengl && (cv_glshearing.value == 1)) +#endif + ) + { + // Extra restriction on this so it's not possible to + // distort the view too much. + if ((INT32)cam->aiming > ANGLE_45) + cam->aiming = ANGLE_45; + else if ((INT32)cam->aiming < -ANGLE_45) + cam->aiming = -ANGLE_45; + } + else + { + G_ClipAimingPitch((INT32 *)&cam->aiming); + } cam->momx = cam->momy = cam->momz = 0; if (cmd->forwardmove != 0) @@ -3427,7 +3280,7 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) tic_t tries = 0; fixed_t x, y, z; - if (demo.freecam) + if (thiscam->freecam) return; // do not reset the camera there. if (!player->mo) @@ -3468,7 +3321,6 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) thiscam->reset_aiming = true; - while (!P_MoveChaseCamera(player,thiscam,true) && ++tries < 2*TICRATE); } @@ -3498,16 +3350,6 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) return true; - if (demo.freecam || player->spectator) - { - P_DemoCameraMovement(thiscam); - return true; - } - - if (paused || P_AutoPause()) - return true; - - if (thiscam == &camera[1]) // Camera 2 { num = 1; @@ -3525,6 +3367,15 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall num = 0; } + if (thiscam->freecam || player->spectator) + { + P_DemoCameraMovement(thiscam, num); + return true; + } + + if (paused || P_AutoPause()) + return true; + if (player == &players[consoleplayer]) { plyrnum = 0; diff --git a/src/r_fps.h b/src/r_fps.h index 5ac6cfe90..563989fa6 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -37,6 +37,10 @@ enum viewcontext_e VIEWCONTEXT_SKY4 }; +extern enum viewcontext_e viewcontext; + +#define R_GetViewNumber() ((viewcontext - VIEWCONTEXT_PLAYER1) & 3) + typedef struct { fixed_t x; fixed_t y; diff --git a/src/r_main.c b/src/r_main.c index 7bd9f8630..79950a458 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -841,6 +841,7 @@ static inline int intsign(int n) { angle_t R_ViewRollAngle(const player_t *player) { angle_t roll = 0; + const UINT8 viewnum = R_GetViewNumber(); if (gamestate != GS_LEVEL) { @@ -859,7 +860,7 @@ angle_t R_ViewRollAngle(const player_t *player) if (cv_tilting.value) { - if (!player->spectator && !demo.freecam) + if (!player->spectator && !camera[viewnum].freecam) roll += player->tilt; if (cv_actionmovie.value) diff --git a/src/s_sound.c b/src/s_sound.c index fa56ab8ad..9a7dd5542 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -500,7 +500,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) listenmobj[i] = player->mo; } - if (origin && origin == listenmobj[i] && !demo.freecam) + if (origin && origin == listenmobj[i] && !camera[i].freecam) { itsUs = true; } @@ -833,15 +833,15 @@ void S_UpdateSounds(void) { boolean itsUs = false; - if (!demo.freecam) + for (i = splitscreen; i >= 0; i--) { - for (i = splitscreen; i >= 0; i--) - { - if (c->origin != listenmobj[i]) - continue; + if (camera[i].freecam) + continue; - itsUs = true; - } + if (c->origin != listenmobj[i]) + continue; + + itsUs = true; } if (itsUs == false) diff --git a/src/st_stuff.c b/src/st_stuff.c index 30b8b5cf7..398dc7dbe 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -657,6 +657,8 @@ static void ST_drawLevelTitle(void) // static void ST_overlayDrawer(void) { + const UINT8 viewnum = R_GetViewNumber(); + //hu_showscores = auto hide score/time/rings when tab rankings are shown if (!(hu_showscores && (netgame || multiplayer))) { @@ -665,7 +667,7 @@ static void ST_overlayDrawer(void) if (!hu_showscores) // hide the following if TAB is held { - if (cv_showdirectorhud.value && !splitscreen && ((demo.playback && !demo.freecam && (!demo.title || !modeattacking)) || !P_IsLocalPlayer(stplyr)) && !K_DirectorIsPlayerAlone()) + if (cv_showdirectorhud.value && !splitscreen && ((demo.playback && !camera[viewnum].freecam && (!demo.title || !modeattacking)) || !P_IsLocalPlayer(stplyr)) && !K_DirectorIsPlayerAlone()) { char directortext[20] = {0}; -- 2.54.0 From 2c769f804341960feff6663d37758e9da2de44ec Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 01:41:49 +0100 Subject: [PATCH 013/325] changable freecam speed --- src/p_local.h | 2 ++ src/p_user.c | 17 ++++++++++++----- src/r_main.c | 2 ++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/p_local.h b/src/p_local.h index 368779983..b45cebdc2 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -128,6 +128,8 @@ extern consvar_t cv_cam_speed[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_rotate[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_rotspeed[MAXSPLITSCREENPLAYERS]; +extern consvar_t cv_freecam_speed; + extern consvar_t cv_tilting; extern consvar_t cv_quaketilt; extern consvar_t cv_tiltsmoothing; diff --git a/src/p_user.c b/src/p_user.c index b562ca33c..9484197ef 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3117,6 +3117,9 @@ consvar_t cv_cam_rotspeed[MAXSPLITSCREENPLAYERS] = { {"cam4_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} }; +static CV_PossibleValue_t freecam_speed_cons_t[] = {{0, "MIN"}, {10, "MAX"}, {0, NULL}}; +consvar_t cv_freecam_speed = {"freecam_speed", "1", CV_SAVE, freecam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + consvar_t cv_tilting = {"tilting", "Off", CV_SAVE|CV_CALL, CV_OnOff, Bird_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_quaketilt = {"quaketilt", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_tiltsmoothing = {"tiltsmoothing", "32", CV_SAVE, CV_Natural, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -3178,14 +3181,16 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) // camera movement: if (!cam->button_a_held) { + fixed_t spd = 32*mapobjectscale*cv_freecam_speed.value; + if (InputDown(gc_camfloat, num+1)) { - cam->z += 32*mapobjectscale; + cam->z += spd; moving = true; } else if (InputDown(gc_camsink, num+1)) { - cam->z -= 32*mapobjectscale; + cam->z -= spd; moving = true; } } @@ -3253,14 +3258,16 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->momx = cam->momy = cam->momz = 0; if (cmd->forwardmove != 0) { + fixed_t spd = cmd->forwardmove*mapobjectscale*cv_freecam_speed.value; + thrustangle = cam->angle >> ANGLETOFINESHIFT; - cam->x += FixedMul(cmd->forwardmove*mapobjectscale, FINECOSINE(thrustangle)); - cam->y += FixedMul(cmd->forwardmove*mapobjectscale, FINESINE(thrustangle)); + cam->x += FixedMul(spd, FINECOSINE(thrustangle)); + cam->y += FixedMul(spd, FINESINE(thrustangle)); if (!cam->reset_aiming) { - cam->z += FixedMul(cmd->forwardmove*mapobjectscale, AIMINGTOSLOPE(cam->aiming)); + cam->z += FixedMul(spd, AIMINGTOSLOPE(cam->aiming)); } // momentums are useless here, directly add to the coordinates diff --git a/src/r_main.c b/src/r_main.c index 79950a458..b863d8141 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1537,6 +1537,8 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_cam_rotspeed[i]); } + CV_RegisterVar(&cv_freecam_speed); + CV_RegisterVar(&cv_tilting); CV_RegisterVar(&cv_quaketilt); CV_RegisterVar(&cv_tiltsmoothing); -- 2.54.0 From 2639f94dfff0301a53e4a3512babca15dfd24872 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 03:44:21 +0100 Subject: [PATCH 014/325] fix freecam not being steerable when not in spec ugh this is godawful its literally almost a complete copy of --- src/g_game.c | 4 ++ src/p_local.h | 7 +- src/p_user.c | 191 ++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 187 insertions(+), 15 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 1be80c944..79e94a24b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -886,6 +886,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) thiscam = (player->bot == 2 ? &camera[0] : &camera[forplayer]); else thiscam = &camera[forplayer]; + lang = localangle[forplayer]; laim = localaiming[forplayer]; th = turnheld[forplayer]; @@ -7861,6 +7862,9 @@ void G_StopDemo(void) for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i) { camera[i].freecam = false; + camera[i].localangle = 0; + camera[i].localaiming = 0; + camera[i].keyboardlook = false; } CV_SetValue(&cv_playbackspeed, 1); diff --git a/src/p_local.h b/src/p_local.h index b45cebdc2..13219c429 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -81,6 +81,11 @@ typedef struct camera_s boolean chase; boolean freecam; + angle_t localangle; + INT32 localaiming; + + boolean keyboardlook; // keyboard look + angle_t aiming; // Freecam: A button was held since entering from menu, so don't move camera @@ -146,7 +151,7 @@ void P_AddPlayerScore(player_t *player, UINT32 amount); void P_ResetCamera(player_t *player, camera_t *thiscam); boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam); void P_SlideCameraMove(camera_t *thiscam); -void P_DemoCameraMovement(camera_t *cam, UINT8 num); +//void P_DemoCameraMovement(camera_t *cam, UINT8 num); boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); void P_ResetLocalCamAiming(player_t *player); void P_ToggleDemoCamera(UINT8 viewnum); diff --git a/src/p_user.c b/src/p_user.c index 9484197ef..8b0f15cf3 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3133,10 +3133,18 @@ fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42, -42, -42, -42}; #define MAXCAMERADIST 140*FRACUNIT // Max distance the camera can be in front of the player (2D mode) +static fixed_t forwardmove[2] = {25<>16, 50<>16}; +static fixed_t sidemove[2] = {2<>16, 4<>16}; +static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn + +static ticcmd_t cameracmd[MAXSPLITSCREENPLAYERS]; + void P_ToggleDemoCamera(UINT8 viewnum) { camera_t *cam = &camera[viewnum]; + memset(&cameracmd[viewnum], 0, sizeof(ticcmd_t)); + if (!cam->freecam) // toggle on { cam->freecam = true; @@ -3149,20 +3157,180 @@ void P_ToggleDemoCamera(UINT8 viewnum) } } +static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) +{ + INT32 laim, forward, side, axis; //i + // these ones used for multiple conditions + boolean turnleft, turnright; + boolean usejoystick, kbl; + angle_t lang; + INT32 screen_invert; + const UINT8 forplayer = num+1; + + ticcmd_t *cmd = &cameracmd[num]; + + lang = cam->localangle; + laim = cam->localaiming; + kbl = cam->keyboardlook; + + if (!cam->freecam) + return cmd; // empty cmd, no. + + switch (num) + { + case 1: + G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); + break; + case 2: + G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); + break; + case 3: + G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); + break; + case 0: + default: + G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver + break; + } + + cmd->angleturn = (INT16)(lang >> 16); + cmd->aiming = G_ClipAimingPitch(&laim); + + const boolean lookaxis = cv_lookaxis[num].value; + const boolean analogjoystickmove = cv_usejoystick[num].value && !Joystick[num].bGamepadStyle; + const boolean gamepadjoystickmove = cv_usejoystick[num].value && Joystick[num].bGamepadStyle; + + usejoystick = (analogjoystickmove || gamepadjoystickmove); + + turnright = InputDown(gc_turnright, forplayer); + turnleft = InputDown(gc_turnleft, forplayer); + + axis = JoyAxis(AXISTURN, forplayer); + + if (encoremode) + { + turnright ^= turnleft; // swap these using three XORs + turnleft ^= turnright; + turnright ^= turnleft; + axis = -axis; + } + + if (gamepadjoystickmove && axis != 0) + { + turnright = turnright || (axis > 0); + turnleft = turnleft || (axis < 0); + } + forward = side = 0; + + // let movement keys cancel each other out + if (turnright && !(turnleft)) + { + cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[1])); + side += sidemove[1]; + } + else if (turnleft && !(turnright)) + { + cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[1])); + side -= sidemove[1]; + } + + if (analogjoystickmove && axis != 0) + { + // JOYAXISRANGE should be 1023 (divide by 1024) + cmd->angleturn = (INT16)(cmd->angleturn - (((axis * angleturn[1]) >> 10))); // ANALOG! + side += ((axis * sidemove[0]) >> 10); + } + + cmd->angleturn = (INT16)(cmd->angleturn - ((mousex*(encoremode ? -1 : 1)*8))); + + axis = JoyAxis(AXISAIM, forplayer); + if (InputDown(gc_aimforward, forplayer) || (usejoystick && axis < 0)) + forward += forwardmove[1]; + if (InputDown(gc_aimbackward, forplayer) || (usejoystick && axis > 0)) + forward -= forwardmove[1]; + + // fire with any button/key + axis = JoyAxis(AXISFIRE, forplayer); + if (InputDown(gc_fire, 1) || (usejoystick && axis > 0)) + cmd->buttons |= BT_ATTACK; + + // spectator aiming shit, ahhhh... + screen_invert = 1; // nope + + // mouse look stuff (mouse look is not the same as mouse aim) + kbl = false; + + // looking up/down + laim += (mlooky<<19)*screen_invert; + + axis = JoyAxis(AXISLOOK, forplayer); + + if (analogjoystickmove && axis != 0 && lookaxis) + laim += (axis<<16) * screen_invert; + + // spring back if not using keyboard neither mouselookin' + if (!kbl && !lookaxis) + laim = 0; + + if (InputDown(gc_lookup, forplayer) || (gamepadjoystickmove && axis < 0)) + { + laim += KB_LOOKSPEED * screen_invert; + kbl = true; + } + else if (InputDown(gc_lookdown, forplayer) || (gamepadjoystickmove && axis > 0)) + { + laim -= KB_LOOKSPEED * screen_invert; + kbl = true; + } + + if (InputDown(gc_centerview, forplayer)) // No need to put a spectator limit on this one though :V + laim = 0; + + cmd->aiming = G_ClipAimingPitch(&laim); + + mousex = mousey = mlooky = 0; + + if (forward > MAXPLMOVE) + forward = MAXPLMOVE; + else if (forward < -MAXPLMOVE) + forward = -MAXPLMOVE; + + if (side > MAXPLMOVE) + side = MAXPLMOVE; + else if (side < -MAXPLMOVE) + side = -MAXPLMOVE; + + if (forward || side) + { + cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); + cmd->sidemove = (SINT8)(cmd->sidemove + side); + } + + lang += (cmd->angleturn<<16); + + cam->localangle = lang; + cam->localaiming = laim; + cam->keyboardlook = kbl; + + return cmd; +} + #define intsign(n) \ ((n) < 0 ? -1 : (n) > 0 ? 1 : 0) -void P_DemoCameraMovement(camera_t *cam, UINT8 num) +static void P_DemoCameraMovement(camera_t *cam, UINT8 num) { ticcmd_t *cmd; angle_t thrustangle; player_t *lastp; - angle_t turning; - + const UINT8 forplayer = num+1; boolean moving = false; + cam->localangle = cam->angle; + cam->localaiming = cam->aiming; + // first off we need to get button input - cmd = D_LocalTiccmd(num); + cmd = P_CameraCmd(cam, num); if (cmd->aiming != 0) { @@ -3171,31 +3339,26 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->reset_aiming = false; } - turning = cmd->angleturn << 16; - if (encoremode) - { - turning = -turning; - } - cam->angle = turning; + cam->angle = cmd->angleturn << 16; // camera movement: if (!cam->button_a_held) { fixed_t spd = 32*mapobjectscale*cv_freecam_speed.value; - if (InputDown(gc_camfloat, num+1)) + if (InputDown(gc_camfloat, forplayer)) { cam->z += spd; moving = true; } - else if (InputDown(gc_camsink, num+1)) + else if (InputDown(gc_camsink, forplayer)) { cam->z -= spd; moving = true; } } - if (!(InputDown(gc_camfloat, num+1) || InputDown(gc_camsink, num+1)) && cam->button_a_held) + if (!(InputDown(gc_camfloat, forplayer) || InputDown(gc_camsink, forplayer)) && cam->button_a_held) { cam->button_a_held--; } @@ -3221,7 +3384,7 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) // forward/back will have a slope. So, as long as democam // controls haven't been used to alter the vertical angle, // slowly reset it to flat. - if ((cam->reset_aiming && moving) || ((InputDown(gc_camsink, num+1)) && !cam->button_a_held)) + if ((cam->reset_aiming && moving) || ((InputDown(gc_camsink, forplayer)) && !cam->button_a_held)) { INT32 aiming = cam->aiming; INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(cam->aiming)); -- 2.54.0 From a19cb5f2bcf0c4790cfda772d6a3131e40c24499 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 04:00:56 +0100 Subject: [PATCH 015/325] fix speccam again --- src/p_user.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 8b0f15cf3..37a5ee0df 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3137,14 +3137,10 @@ static fixed_t forwardmove[2] = {25<>16, 50<>16}; static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn -static ticcmd_t cameracmd[MAXSPLITSCREENPLAYERS]; - void P_ToggleDemoCamera(UINT8 viewnum) { camera_t *cam = &camera[viewnum]; - memset(&cameracmd[viewnum], 0, sizeof(ticcmd_t)); - if (!cam->freecam) // toggle on { cam->freecam = true; @@ -3167,15 +3163,15 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) INT32 screen_invert; const UINT8 forplayer = num+1; - ticcmd_t *cmd = &cameracmd[num]; + ticcmd_t *cmd = D_LocalTiccmd(num); + + if (!cam->freecam) + return cmd; // empty cmd, no. lang = cam->localangle; laim = cam->localaiming; kbl = cam->keyboardlook; - if (!cam->freecam) - return cmd; // empty cmd, no. - switch (num) { case 1: -- 2.54.0 From 3156851554096001904be635e6528e5b4ba85a77 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 04:01:09 +0100 Subject: [PATCH 016/325] fix cam interp during pause again --- src/r_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/r_main.c b/src/r_main.c index b863d8141..2a97136be 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1066,6 +1066,8 @@ R_SetupCommonFrame ( player_t * player, subsector_t * subsector) { + const UINT8 viewnum = R_GetViewNumber(); + newview->player = player; newview->x += quake.x; @@ -1079,7 +1081,7 @@ R_SetupCommonFrame else newview->sector = R_PointInSubsector(newview->x, newview->y)->sector; - R_InterpolateView(R_UsingFrameInterpolation() ? (demo.freecam ? rendertimefrac_unpaused : rendertimefrac) : FRACUNIT, false); + R_InterpolateView(R_UsingFrameInterpolation() ? (camera[viewnum].freecam ? rendertimefrac_unpaused : rendertimefrac) : FRACUNIT, false); } static void R_SetupAimingFrame(player_t *player, camera_t *thiscam) -- 2.54.0 From da9c19bba430891d382e2cb7722aa79f7b446b86 Mon Sep 17 00:00:00 2001 From: Indev Date: Sat, 28 Dec 2024 18:48:58 +0300 Subject: [PATCH 017/325] Update replayfreecam lua global to use camera.freecam for currently viewed player --- src/dehacked.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index e4b4028ef..54ea4e510 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8542,6 +8542,16 @@ static int lua_enumlib_mariomode_get(lua_State *L) return 1; } +static int lua_enumlib_replayfreecam_get(lua_State *L) +{ + if (dedicated) // huh? + lua_pushboolean(L, false); + else + lua_pushboolean(L, camera[R_GetViewNumber()].freecam); + + return 1; +} + static int lua_enumlib_twodlevel_get(lua_State *L) { lua_pushboolean(L, twodlevel); @@ -9219,7 +9229,7 @@ int LUA_EnumLib(lua_State *L) lua_pushcfunction(L, lua_glib_new_getter); lua_pushliteral(L, "replayfreecam"); - lua_glib_push_bool_getter(L, &demo.freecam); + lua_pushcfunction(L, lua_enumlib_replayfreecam_get); lua_call(L, 2, 0); if (!mathlib) -- 2.54.0 From f355b2269c8a5b27c34d9296f126ac11e2c3f319 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 05:00:41 +0100 Subject: [PATCH 018/325] toggle off freecam when f12ing --- src/g_game.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 79e94a24b..2c3e2fa02 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1773,7 +1773,7 @@ void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive) G_FixCamera(viewd); } - if (viewnum == 1 && demo.playback) + if (demo.playback && viewnum == 1) consoleplayer = displayplayers[0]; } @@ -1787,6 +1787,10 @@ void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive) INT32 *displayplayerp, oldview; displayplayerp = &displayplayers[viewnum-1]; oldview = (*displayplayerp); + + // turn off the freecam + camera[viewnum].freecam = false; + G_ResetView(viewnum, ( (*displayplayerp) + offset ), onlyactive); // If no other view could be found, go back to what we had. -- 2.54.0 From 3d39f5038805d3f1e3796a7449e94bdbef8cb4f5 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 06:03:10 +0100 Subject: [PATCH 019/325] make function to return button names to use with new rebindable cam controls --- src/st_stuff.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index 398dc7dbe..da5628827 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -652,6 +652,20 @@ static void ST_drawLevelTitle(void) V_DrawLevelTitle(ttlnumxpos+12, bary+6, V_SNAPTOBOTTOM, actnum); } +static const char *ST_GetButtonName(INT32 control, const char *inputtext) +{ + static char buttname[32] = {0}; // Static buffer + const char *item1 = gamecontrol[control][0] != 0 ? G_KeynumToString(gamecontrol[control][0]) : NULL; + const char *item2 = gamecontrol[control][1] != 0 ? G_KeynumToString(gamecontrol[control][1]) : NULL; + + if (item1 != NULL && item2 != NULL) + snprintf(buttname, 32, "%s/%s - %s", item1, item2, inputtext); + else + snprintf(buttname, 32, "%s - %s", item1 != NULL ? item1 : item2 != NULL ? item2 : "Not Bound", inputtext); + + return buttname; +} + // Draw the status bar overlay, customisable: the user chooses which // kind of information to overlay // @@ -780,19 +794,9 @@ static void ST_overlayDrawer(void) { V_DrawString(2, BASEVIDHEIGHT-50, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Accelerate - Float")); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Brake - Sink")); - - char directortoggle[32] = {0}; - const char *item1 = gamecontrol[gc_director][0] != 0 ? G_KeynumToString(gamecontrol[gc_director][0]) : NULL; - const char *item2 = gamecontrol[gc_director][1] != 0 ? G_KeynumToString(gamecontrol[gc_director][1]) : NULL; - - if (item1 != NULL && item2 != NULL) - snprintf(directortoggle, 32, "%s/%s - Toggle Director", item1, item2); - else - snprintf(directortoggle, 32, "%s - Toggle Director", item1 != NULL ? item1 : item2 != NULL ? item2 : "Not Bound"); - - V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, directortoggle); + V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camfloat, "Float")); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camsink, "Sink")); + V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_director, "Toggle Director")); directortextactive = true; } @@ -800,8 +804,8 @@ static void ST_overlayDrawer(void) { V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Accelerate - Float")); - V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Brake - Sink")); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camfloat, "Float")); + V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camsink, "Sink")); } } } -- 2.54.0 From 6b9900ad4ed25237bffa1f1f7187d0e76ce741c7 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 06:27:18 +0100 Subject: [PATCH 020/325] clean up cam stuff for good --- src/g_game.c | 1 - src/p_local.h | 2 -- src/p_user.c | 78 +++++++++++++++++++++------------------------------ 3 files changed, 32 insertions(+), 49 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 2c3e2fa02..f612b813d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -7868,7 +7868,6 @@ void G_StopDemo(void) camera[i].freecam = false; camera[i].localangle = 0; camera[i].localaiming = 0; - camera[i].keyboardlook = false; } CV_SetValue(&cv_playbackspeed, 1); diff --git a/src/p_local.h b/src/p_local.h index 13219c429..c2a2ee017 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -84,8 +84,6 @@ typedef struct camera_s angle_t localangle; INT32 localaiming; - boolean keyboardlook; // keyboard look - angle_t aiming; // Freecam: A button was held since entering from menu, so don't move camera diff --git a/src/p_user.c b/src/p_user.c index 37a5ee0df..1456f1cbf 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3155,12 +3155,12 @@ void P_ToggleDemoCamera(UINT8 viewnum) static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) { - INT32 laim, forward, side, axis; //i + INT32 laim, th, tspeed, forward, side, axis; + // these ones used for multiple conditions boolean turnleft, turnright; - boolean usejoystick, kbl; + boolean usejoystick; angle_t lang; - INT32 screen_invert; const UINT8 forplayer = num+1; ticcmd_t *cmd = D_LocalTiccmd(num); @@ -3170,24 +3170,6 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) lang = cam->localangle; laim = cam->localaiming; - kbl = cam->keyboardlook; - - switch (num) - { - case 1: - G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); - break; - case 2: - G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); - break; - case 3: - G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); - break; - case 0: - default: - G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver - break; - } cmd->angleturn = (INT16)(lang >> 16); cmd->aiming = G_ClipAimingPitch(&laim); @@ -3218,15 +3200,27 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) } forward = side = 0; + // use two stage accelerative turning + // on the keyboard and joystick + if (turnleft || turnright) + th += 1; + else + th = 0; + + if (th < SLOWTURNTICS) + tspeed = 2; // slow turn + else + tspeed = 1; + // let movement keys cancel each other out if (turnright && !(turnleft)) { - cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[1])); + cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed])); side += sidemove[1]; } else if (turnleft && !(turnright)) { - cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[1])); + cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed])); side -= sidemove[1]; } @@ -3251,32 +3245,22 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) cmd->buttons |= BT_ATTACK; // spectator aiming shit, ahhhh... - screen_invert = 1; // nope - - // mouse look stuff (mouse look is not the same as mouse aim) - kbl = false; // looking up/down - laim += (mlooky<<19)*screen_invert; + laim += (mlooky<<19); axis = JoyAxis(AXISLOOK, forplayer); if (analogjoystickmove && axis != 0 && lookaxis) - laim += (axis<<16) * screen_invert; - - // spring back if not using keyboard neither mouselookin' - if (!kbl && !lookaxis) - laim = 0; + laim += (axis<<16); if (InputDown(gc_lookup, forplayer) || (gamepadjoystickmove && axis < 0)) { - laim += KB_LOOKSPEED * screen_invert; - kbl = true; + laim += KB_LOOKSPEED; } else if (InputDown(gc_lookdown, forplayer) || (gamepadjoystickmove && axis > 0)) { - laim -= KB_LOOKSPEED * screen_invert; - kbl = true; + laim -= KB_LOOKSPEED; } if (InputDown(gc_centerview, forplayer)) // No need to put a spectator limit on this one though :V @@ -3306,7 +3290,6 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) cam->localangle = lang; cam->localaiming = laim; - cam->keyboardlook = kbl; return cmd; } @@ -3341,16 +3324,19 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) if (!cam->button_a_held) { fixed_t spd = 32*mapobjectscale*cv_freecam_speed.value; + int dir = ((InputDown(gc_camfloat, forplayer)) ? 1 : 0) + ((InputDown(gc_camsink, forplayer)) ? -1 : 0); - if (InputDown(gc_camfloat, forplayer)) + switch (dir) { - cam->z += spd; - moving = true; - } - else if (InputDown(gc_camsink, forplayer)) - { - cam->z -= spd; - moving = true; + case 1: + cam->z += spd; + moving = true; + break; + + case -1: + cam->z -= spd; + moving = true; + break; } } -- 2.54.0 From 4110130ca7dc96980df6ad6b437cc393ce741057 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 06:36:36 +0100 Subject: [PATCH 021/325] block freecam toggling when player is in spec --- src/p_user.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 1456f1cbf..31f2820bb 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3141,13 +3141,17 @@ void P_ToggleDemoCamera(UINT8 viewnum) { camera_t *cam = &camera[viewnum]; + // dont let freecam be toggled when in spec lel + if (players[displayplayers[viewnum]].spectator) + return; + if (!cam->freecam) // toggle on { cam->freecam = true; cam->button_a_held = 2; cam->reset_aiming = true; } - else // toggle off + else // toggle off { cam->freecam = false; } -- 2.54.0 From 11546cd9060622bd858fb7b2ea750c399aa157da Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 06:37:10 +0100 Subject: [PATCH 022/325] fix centerview --- src/p_user.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index 31f2820bb..22ea6454c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3315,6 +3315,10 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // first off we need to get button input cmd = P_CameraCmd(cam, num); + // let centerview work proper + if (InputDown(gc_centerview, forplayer)) + cam->aiming = 0; + if (cmd->aiming != 0) { cam->aiming = cmd->aiming << FRACBITS; -- 2.54.0 From ca09a5dd465267d68c6a01b8982ac0c380dc6037 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 06:40:13 +0100 Subject: [PATCH 023/325] dont need to do this twice --- src/p_user.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 22ea6454c..7a9e1f67c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3390,24 +3390,6 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) } } - if (rendermode == render_soft -#ifdef HWRENDER - || (rendermode == render_opengl && (cv_glshearing.value == 1)) -#endif - ) - { - // Extra restriction on this so it's not possible to - // distort the view too much. - if ((INT32)cam->aiming > ANGLE_45) - cam->aiming = ANGLE_45; - else if ((INT32)cam->aiming < -ANGLE_45) - cam->aiming = -ANGLE_45; - } - else - { - G_ClipAimingPitch((INT32 *)&cam->aiming); - } - cam->momx = cam->momy = cam->momz = 0; if (cmd->forwardmove != 0) { -- 2.54.0 From 267e2be69b6a34f42e2b741d86f9642d699c7ada Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 15:39:39 +0100 Subject: [PATCH 024/325] fix offbyone issue --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 961dfbf8f..6732e8c70 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1786,7 +1786,7 @@ void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive) oldview = (*displayplayerp); // turn off the freecam - camera[viewnum].freecam = false; + camera[viewnum-1].freecam = false; G_ResetView(viewnum, ( (*displayplayerp) + offset ), onlyactive); -- 2.54.0 From b23020435f58636fb54957c7dea8509d7323cc28 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 16:43:09 +0100 Subject: [PATCH 025/325] replace all this crap with either stplyrnum or R_GetViewNumber --- src/hardware/hw_main.c | 6 ++--- src/k_kart.c | 59 +++++++++++++++++------------------------- src/lua_hudlib.c | 2 +- src/r_bsp.c | 16 +++--------- src/st_stuff.c | 8 +++--- 5 files changed, 34 insertions(+), 57 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 5eefc9c7e..638b450a2 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3232,11 +3232,11 @@ static void HWR_DrawSpriteShadow(gl_vissprite_t *spr, GLPatch_t *gpatch) angle_t shadowdir; // Set direction - if (splitscreen && stplyr == &players[displayplayers[1]]) + if (splitscreen && R_GetViewNumber() == 1) shadowdir = localangle[1] + FixedAngle(cv_cam_rotate[1].value); - else if (splitscreen > 1 && stplyr == &players[displayplayers[2]]) + else if (splitscreen > 1 && R_GetViewNumber() == 2) shadowdir = localangle[2] + FixedAngle(cv_cam_rotate[2].value); - else if (splitscreen > 2 && stplyr == &players[displayplayers[3]]) + else if (splitscreen > 2 && R_GetViewNumber() == 3) shadowdir = localangle[3] + FixedAngle(cv_cam_rotate[3].value); else shadowdir = localangle[0] + FixedAngle(cv_cam_rotate[0].value); diff --git a/src/k_kart.c b/src/k_kart.c index 7a9f43f55..f386b5ad9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7618,17 +7618,17 @@ INT32 K_calcSplitFlags(INT32 snapflags) if (splitscreen == 0) return snapflags; - if (stplyr != &players[displayplayers[0]]) + if (stplyrnum != 0) { - if (splitscreen == 1 && stplyr == &players[displayplayers[1]]) + if (splitscreen == 1 && stplyrnum == 1) { splitflags |= V_SPLITSCREEN; } else if (splitscreen > 1) { - if (stplyr == &players[displayplayers[2]] || (splitscreen == 3 && stplyr == &players[displayplayers[3]])) + if (stplyrnum == 2 || (splitscreen == 3 && stplyrnum == 3)) splitflags |= V_SPLITSCREEN; - if (stplyr == &players[displayplayers[1]] || (splitscreen == 3 && stplyr == &players[displayplayers[3]])) + if (stplyrnum == 1 || (splitscreen == 3 && stplyrnum == 3)) splitflags |= V_HORZSCREEN; } } @@ -7748,7 +7748,7 @@ static void K_drawKartStats(void) for (; splitnum < MAXSPLITSCREENPLAYERS; ++splitnum) { - if (stplyr == &players[displayplayers[splitnum]]) + if (stplyrnum == splitnum) break; } @@ -8334,7 +8334,7 @@ static void K_DrawKartPositionNum(INT32 num) else if (splitscreen == 1) // for this splitscreen, we'll use case by case because it's a bit different. { fx = POSI_X; - if (stplyr == &players[displayplayers[0]]) // for player 1: display this at the top right, above the minimap. + if (stplyrnum == 0) // for player 1: display this at the top right, above the minimap. { fy = 30 + cv_posi_yoffset.value; fflags = V_SNAPTOTOP|V_SNAPTORIGHT; @@ -8349,11 +8349,11 @@ static void K_DrawKartPositionNum(INT32 num) } else { - if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3... + if (!(stplyrnum & 1)) // If we are P1 or P3... { fx = POSI_X; fy = POSI_Y; - fflags = V_SNAPTOLEFT|((stplyr == &players[displayplayers[2]]) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom. + fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom. flipdraw = true; if (num && num >= 10) fx += W; // this seems dumb, but we need to do this in order for positions above 10 going off screen. @@ -8362,7 +8362,7 @@ static void K_DrawKartPositionNum(INT32 num) { fx = POSI2_X; fy = POSI2_Y; - fflags = V_SNAPTORIGHT|((stplyr == &players[displayplayers[3]]) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P4 to the bottom + fflags = V_SNAPTORIGHT|((stplyrnum == 3) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P4 to the bottom } } @@ -9311,7 +9311,7 @@ static void K_drawDriftGauge(void) 0, 31, 47, 63, 79, 95, 111, 119, 127, 143, 159, 175, 183, 191, 199, 207, 223, 247 }; - if (demo.playback && camera[R_GetViewNumber()].freecam) + if (demo.playback && camera[stplyrnum].freecam) return; if (P_MobjWasRemoved(stplyr->mo) || (!splitscreen && !camera->chase)) @@ -9469,7 +9469,7 @@ static void K_drawKartWanted(void) UINT8 *colormap = NULL; INT32 basex = 0, basey = 0; - if (stplyr != &players[displayplayers[0]]) + if (stplyrnum != 0) return; for (i = 0; i < 4; i++) @@ -9666,7 +9666,7 @@ static void K_drawKartMinimap(void) if (gamestate != GS_LEVEL) return; - if (stplyr != &players[displayplayers[0]]) + if (stplyrnum != 0) return; if (minimapinfo.minimap_pic == NULL) @@ -9828,7 +9828,7 @@ static void K_drawKartFinish(void) xval = (SHORT(kp_racefinish[pnum]->width)<kartstuff[k_cardanimation])< x ? xval : x))/TICRATE; - if (splitscreen && stplyr == &players[displayplayers[1]]) + if (splitscreen && stplyrnum == 1) x = -x; V_DrawFixedPatch(x + (STCD_X<>1), @@ -9985,14 +9985,9 @@ static void K_drawKartFirstPerson(void) if (stplyr->spectator || !stplyr->mo || (stplyr->mo->flags2 & MF2_DONTDRAW)) return; - if (stplyr == &players[displayplayers[1]] && splitscreen) - { pn = pnum[1]; tn = turn[1]; dr = drift[1]; } - else if (stplyr == &players[displayplayers[2]] && splitscreen > 1) - { pn = pnum[2]; tn = turn[2]; dr = drift[2]; } - else if (stplyr == &players[displayplayers[3]] && splitscreen > 2) - { pn = pnum[3]; tn = turn[3]; dr = drift[3]; } - else - { pn = pnum[0]; tn = turn[0]; dr = drift[0]; } + pn = pnum[stplyrnum]; + tn = turn[stplyrnum]; + dr = drift[stplyrnum]; if (splitscreen) { @@ -10114,14 +10109,9 @@ static void K_drawKartFirstPerson(void) V_DrawFixedPatch(x, y, scale, splitflags, kp_fpview[target], colmap); - if (stplyr == &players[displayplayers[1]] && splitscreen) - { pnum[1] = pn; turn[1] = tn; drift[1] = dr; } - else if (stplyr == &players[displayplayers[2]] && splitscreen > 1) - { pnum[2] = pn; turn[2] = tn; drift[2] = dr; } - else if (stplyr == &players[displayplayers[3]] && splitscreen > 2) - { pnum[3] = pn; turn[3] = tn; drift[3] = dr; } - else - { pnum[0] = pn; turn[0] = tn; drift[0] = dr; } + pnum[stplyrnum] = pn; + turn[stplyrnum] = tn; + drift[stplyrnum] = dr; } // doesn't need to ever support 4p @@ -10341,7 +10331,7 @@ static void K_drawDistributionDebugger(void) boolean dontforcespb = false; boolean spbrush = false; - if (stplyr != &players[displayplayers[0]]) // only for p1 + if (stplyrnum != 0) // only for p1 return; // The only code duplication from the Kart, just to avoid the actual item function from calculating pingame twice @@ -10405,7 +10395,7 @@ static void K_drawDistributionDebugger(void) static void K_drawCheckpointDebugger(void) { - if (stplyr != &players[displayplayers[0]]) // only for p1 + if (stplyrnum != 0) // only for p1 return; if (stplyr->starpostnum >= (numstarposts - (numstarposts/2))) @@ -10419,19 +10409,18 @@ void K_drawKartHUD(void) { boolean isfreeplay = false; boolean battlefullscreen = false; - UINT8 viewnum = R_GetViewNumber(); - boolean freecam = camera[viewnum].freecam; //disable some hud elements w/ freecam + boolean freecam = camera[stplyrnum].freecam; //disable some hud elements w/ freecam // Define the X and Y for each drawn object // This is handled by console/menu values K_initKartHUD(); // Draw that fun first person HUD! Drawn ASAP so it looks more "real". - if (!camera[viewnum].chase && !freecam) + if (!camera[stplyrnum].chase && !freecam) K_drawKartFirstPerson(); // Draw full screen stuff that turns off the rest of the HUD - if (mapreset && R_GetViewNumber() == 0) + if (mapreset && stplyrnum == 0) { K_drawChallengerScreen(); return; diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index f3c01f4eb..708eb8740 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -649,7 +649,7 @@ static int libd_drawOnMinimap(lua_State *L) if (gamestate != GS_LEVEL) return 0; - if (stplyr != &players[displayplayers[0]]) + if (stplyrnum != 0) return 0; AutomapPic = minimapinfo.minimap_pic; diff --git a/src/r_bsp.c b/src/r_bsp.c index db6a4378d..dbb6fb4d3 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -263,21 +263,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, mobj_t *pviewmobj = viewplayer->mo; INT32 heightsec; boolean underwater; - UINT8 i; - - for (i = 0; i <= splitscreen; i++) - { - if (viewplayer != &players[displayplayers[i]]) - continue; - - if (!camera[i].chase) - continue; + UINT8 i = R_GetViewNumber(); + if (camera[i].chase) heightsec = R_PointInSubsector(camera[i].x, camera[i].y)->sector->heightsec; - break; - } - - if (i > splitscreen && pviewmobj) + else if (i > splitscreen && viewmobj) heightsec = R_PointInSubsector(pviewmobj->x, pviewmobj->y)->sector->heightsec; else return sec; diff --git a/src/st_stuff.c b/src/st_stuff.c index da5628827..d5d438414 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -671,8 +671,6 @@ static const char *ST_GetButtonName(INT32 control, const char *inputtext) // static void ST_overlayDrawer(void) { - const UINT8 viewnum = R_GetViewNumber(); - //hu_showscores = auto hide score/time/rings when tab rankings are shown if (!(hu_showscores && (netgame || multiplayer))) { @@ -681,7 +679,7 @@ static void ST_overlayDrawer(void) if (!hu_showscores) // hide the following if TAB is held { - if (cv_showdirectorhud.value && !splitscreen && ((demo.playback && !camera[viewnum].freecam && (!demo.title || !modeattacking)) || !P_IsLocalPlayer(stplyr)) && !K_DirectorIsPlayerAlone()) + if (cv_showdirectorhud.value && !splitscreen && ((demo.playback && !camera[stplyrnum].freecam && (!demo.title || !modeattacking)) || !P_IsLocalPlayer(stplyr)) && !K_DirectorIsPlayerAlone()) { char directortext[20] = {0}; @@ -721,7 +719,7 @@ static void ST_overlayDrawer(void) V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-32, V_SNAPTOBOTTOM|V_HUDTRANS|V_ALLOWLOWERCASE, player_names[stplyr-players]); } } - else if (!demo.title && !demo.freecam) + else if (!demo.title && !camera[stplyrnum].freecam) { if (!splitscreen) { @@ -732,7 +730,7 @@ static void ST_overlayDrawer(void) { char name[MAXPLAYERNAME+12]; - INT32 y = (stplyr == &players[displayplayers[0]]) ? 4 : BASEVIDHEIGHT/2-12; + INT32 y = (stplyrnum == 0) ? 4 : BASEVIDHEIGHT/2-12; sprintf(name, "VIEWPOINT: %s", player_names[stplyr-players]); V_DrawRightAlignedThinString(BASEVIDWIDTH-40, y, V_HUDTRANSHALF|V_ALLOWLOWERCASE|K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOBOTTOM|V_SNAPTORIGHT), name); } -- 2.54.0 From 26480882c847713ef32784ff8dc2fcd8df7a19b4 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 16:43:34 +0100 Subject: [PATCH 026/325] remove the remainder or demo.freecam --- src/k_director.c | 2 +- src/m_menu.c | 19 +++++++++---------- src/p_setup.c | 6 +++++- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/k_director.c b/src/k_director.c index dafea6072..1385754f0 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -69,7 +69,7 @@ static fixed_t ScaleFromMap(fixed_t n, fixed_t scale) static boolean K_DirectorIsEnabled(void) { - return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !demo.freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); + return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !camera[0].freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); } void K_InitDirector(void) diff --git a/src/m_menu.c b/src/m_menu.c index 0bfacba82..3c7153d2c 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4033,19 +4033,19 @@ boolean M_Responder(event_t *ev) // switch viewpoints: case '1': // viewpoint for p1 (also f12) // maximum laziness: - if (!demo.freecam) + if (!camera[0].freecam) G_AdjustView(1, 1, true); break; case '2': // viewpoint for p2 - if (!demo.freecam) + if (!camera[1].freecam) G_AdjustView(2, 1, true); break; case '3': // viewpoint for p3 - if (!demo.freecam) + if (!camera[2].freecam) G_AdjustView(3, 1, true); break; case '4': // viewpoint for p4 - if (!demo.freecam) + if (!camera[3].freecam) G_AdjustView(4, 1, true); break; @@ -4272,19 +4272,19 @@ boolean M_DemoResponder(event_t *ev) // switch viewpoints: case '1': // viewpoint for p1 (also f12) // maximum laziness: - if (!demo.freecam) + if (!camera[0].freecam) G_AdjustView(1, 1, true); break; case '2': // viewpoint for p2 - if (!demo.freecam) + if (!camera[1].freecam) G_AdjustView(2, 1, true); break; case '3': // viewpoint for p3 - if (!demo.freecam) + if (!camera[2].freecam) G_AdjustView(3, 1, true); break; case '4': // viewpoint for p4 - if (!demo.freecam) + if (!camera[3].freecam) G_AdjustView(4, 1, true); break; @@ -7691,8 +7691,7 @@ static void M_PlaybackAdvance(INT32 choice) static void M_PlaybackSetViews(INT32 choice) { - - if (demo.freecam) + if (camera[0].freecam || camera[1].freecam || camera[2].freecam || camera[3].freecam) return; // not here. if (choice > 0) diff --git a/src/p_setup.c b/src/p_setup.c index b87c6e843..bcfb20978 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2474,9 +2474,13 @@ static void P_InitCamera(void) if (!dedicated) { - if (!demo.freecam) for (i = 0; i <= splitscreen; i++) + { + if (camera[i].freecam) + continue; + P_SetupCamera(displayplayers[i], &camera[i]); + } // Though, I don't think anyone would care about cam_rotate being reset back to the only value that makes sense :P for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) -- 2.54.0 From 27d6447a83393f0250b8a6d0d7caf79439300285 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 16:51:07 +0100 Subject: [PATCH 027/325] fix wrong cam default controls --- src/g_input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 606f20770..b99874b8d 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1143,8 +1143,8 @@ void G_Controldefault(UINT8 player) gamecontrol[gc_talkkey ][1] = KEY_HAT1+1; // D-Pad Down gamecontrol[gc_scores ][1] = KEY_HAT1+0; // D-Pad Up - gamecontrol[gc_camfloat ][1] = 'a'; - gamecontrol[gc_camsink ][1] = 'd'; + gamecontrol[gc_camfloat ][0] = 'a'; + gamecontrol[gc_camsink ][0] = 'd'; gamecontrol[gc_camfloat ][1] = KEY_JOY1+0; // A gamecontrol[gc_camsink ][1] = KEY_JOY1+1; // B -- 2.54.0 From cd566ac9c070b49a98d0d134dcae95a59296359e Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 26 Dec 2024 23:24:23 +0100 Subject: [PATCH 028/325] refactor intermission standings drawer abstract the data stuff too --- src/y_inter.c | 450 +++++++++++++++++++++++++------------------------- src/y_inter.h | 17 ++ 2 files changed, 240 insertions(+), 227 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 61f4a069b..fc06c5fca 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -55,27 +55,8 @@ typedef struct UINT8 display; } y_bonus_t; -typedef union -{ - struct - { - UINT8 *color[MAXPLAYERS]; // Winner's color # - INT32 *character[MAXPLAYERS]; // Winner's character # - INT32 num[MAXPLAYERS]; // Winner's player # - char *name[MAXPLAYERS]; // Winner's name - INT32 numplayers; // Number of players being displayed - char levelstring[64]; // holds levelnames up to 64 characters - // SRB2kart - UINT8 increase[MAXPLAYERS]; // how much did the score increase by? - UINT8 jitter[MAXPLAYERS]; // wiggle - UINT32 val[MAXPLAYERS]; // Gametype-specific value - UINT8 pos[MAXPLAYERS]; // player positions. used for ties - boolean rankingsmode; // rankings mode - boolean encore; // encore mode - } match; -} y_data; +static y_data_t data; -static y_data data; // graphics static patch_t *bgpatch = NULL; // INTERSCR @@ -159,11 +140,11 @@ static void Y_CompareRace(INT32 i) UINT32 val = ((players[i].pflags & PF_TIMEOVER || players[i].realtime == UINT32_MAX) ? (UINT32_MAX-1) : players[i].realtime); - if (!(val < data.match.val[data.match.numplayers])) + if (!(val < data.val[data.numplayers])) return; - data.match.val[data.match.numplayers] = val; - data.match.num[data.match.numplayers] = i; + data.val[data.numplayers] = val; + data.num[data.numplayers] = i; } static void Y_CompareBattle(INT32 i) @@ -171,22 +152,22 @@ static void Y_CompareBattle(INT32 i) UINT32 val = ((players[i].pflags & PF_TIMEOVER) ? (UINT32_MAX-1) : players[i].marescore); - if (!(data.match.val[data.match.numplayers] == UINT32_MAX - || (!(players[i].pflags & PF_TIMEOVER) && val > data.match.val[data.match.numplayers]))) + if (!(data.val[data.numplayers] == UINT32_MAX + || (!(players[i].pflags & PF_TIMEOVER) && val > data.val[data.numplayers]))) return; - data.match.val[data.match.numplayers] = val; - data.match.num[data.match.numplayers] = i; + data.val[data.numplayers] = val; + data.num[data.numplayers] = i; } static void Y_CompareRank(INT32 i) { - UINT8 increase = ((data.match.increase[i] == UINT8_MAX) ? 0 : data.match.increase[i]); - if (!(data.match.val[data.match.numplayers] == UINT32_MAX || (players[i].score - increase) > data.match.val[data.match.numplayers])) + UINT8 increase = ((data.increase[i] == UINT8_MAX) ? 0 : data.increase[i]); + if (!(data.val[data.numplayers] == UINT32_MAX || (players[i].score - increase) > data.val[data.numplayers])) return; - data.match.val[data.match.numplayers] = (players[i].score - increase); - data.match.num[data.match.numplayers] = i; + data.val[data.numplayers] = (players[i].score - increase); + data.num[data.numplayers] = i; } static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) @@ -198,10 +179,10 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) // Initialize variables if (rankingsmode > 1) ; - else if ((data.match.rankingsmode = (boolean)rankingsmode)) + else if ((data.rankingsmode = (boolean)rankingsmode)) { - sprintf(data.match.levelstring, "* Total Rankings *"); - data.match.encore = false; + sprintf(data.levelstring, "* Total Rankings *"); + data.encore = false; } else { @@ -209,13 +190,13 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) if (mapheaderinfo[prevmap]->levelflags & LF_NOZONE) { if (mapheaderinfo[prevmap]->actnum[0]) - snprintf(data.match.levelstring, - sizeof data.match.levelstring, + snprintf(data.levelstring, + sizeof data.levelstring, "* %s %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else - snprintf(data.match.levelstring, - sizeof data.match.levelstring, + snprintf(data.levelstring, + sizeof data.levelstring, "* %s *", mapheaderinfo[prevmap]->lvlttl); } @@ -223,44 +204,44 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) { const char *zonttl = (mapheaderinfo[prevmap]->zonttl[0] ? mapheaderinfo[prevmap]->zonttl : "Zone"); if (mapheaderinfo[prevmap]->actnum[0]) - snprintf(data.match.levelstring, - sizeof data.match.levelstring, + snprintf(data.levelstring, + sizeof data.levelstring, "* %s %s %s *", mapheaderinfo[prevmap]->lvlttl, zonttl, mapheaderinfo[prevmap]->actnum); else - snprintf(data.match.levelstring, - sizeof data.match.levelstring, + snprintf(data.levelstring, + sizeof data.levelstring, "* %s %s *", mapheaderinfo[prevmap]->lvlttl, zonttl); } - data.match.levelstring[sizeof data.match.levelstring - 1] = '\0'; + data.levelstring[sizeof data.levelstring - 1] = '\0'; - data.match.encore = encoremode; + data.encore = encoremode; - memset(data.match.jitter, 0, sizeof (data.match.jitter)); + memset(data.jitter, 0, sizeof (data.jitter)); } for (i = 0; i < MAXPLAYERS; i++) { - data.match.val[i] = UINT32_MAX; + data.val[i] = UINT32_MAX; if (!playeringame[i] || players[i].spectator) { - data.match.increase[i] = UINT8_MAX; + data.increase[i] = UINT8_MAX; continue; } if (!rankingsmode) - data.match.increase[i] = UINT8_MAX; + data.increase[i] = UINT8_MAX; numplayersingame++; } - memset(data.match.color, 0, sizeof (data.match.color)); - memset(data.match.character, 0, sizeof (data.match.character)); + memset(data.color, 0, sizeof (data.color)); + memset(data.character, 0, sizeof (data.character)); memset(completed, 0, sizeof (completed)); - data.match.numplayers = 0; + data.numplayers = 0; for (j = 0; j < numplayersingame; j++) { @@ -274,35 +255,35 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) comparison(i); } - i = data.match.num[data.match.numplayers]; + i = data.num[data.numplayers]; completed[i] = true; - data.match.color[data.match.numplayers] = &players[i].skincolor; - data.match.character[data.match.numplayers] = &players[i].skin; - data.match.name[data.match.numplayers] = player_names[i]; + data.color[data.numplayers] = &players[i].skincolor; + data.character[data.numplayers] = &players[i].skin; + data.name[data.numplayers] = player_names[i]; - if (data.match.numplayers && (data.match.val[data.match.numplayers] == data.match.val[data.match.numplayers-1])) - data.match.pos[data.match.numplayers] = data.match.pos[data.match.numplayers-1]; + if (data.numplayers && (data.val[data.numplayers] == data.val[data.numplayers-1])) + data.pos[data.numplayers] = data.pos[data.numplayers-1]; else - data.match.pos[data.match.numplayers] = data.match.numplayers+1; + data.pos[data.numplayers] = data.numplayers+1; - if (!rankingsmode && !(players[i].pflags & PF_TIMEOVER) && (data.match.pos[data.match.numplayers] < nump)) + if (!rankingsmode && !(players[i].pflags & PF_TIMEOVER) && (data.pos[data.numplayers] < nump)) { - data.match.increase[i] = nump - data.match.pos[data.match.numplayers]; - players[i].score += data.match.increase[i]; + data.increase[i] = nump - data.pos[data.numplayers]; + players[i].score += data.increase[i]; } if (demo.recording && !rankingsmode) G_WriteStanding( - data.match.pos[data.match.numplayers], - data.match.name[data.match.numplayers], - *data.match.character[data.match.numplayers], - *data.match.color[data.match.numplayers], - data.match.val[data.match.numplayers] + data.pos[data.numplayers], + data.name[data.numplayers], + *data.character[data.numplayers], + *data.color[data.numplayers], + data.val[data.numplayers] ); - data.match.numplayers++; + data.numplayers++; } } @@ -353,6 +334,169 @@ static void Y_AnimatedVoteScreenCheck(void) } } +// Y_PlayerStandingsDrawer +// +// Handles drawing the center-of-screen player standings. +// +void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) +{ + if (standings->numplayers == 0) + { + return; + } + + INT32 i, whiteplayer = MAXPLAYERS; + + if (!splitscreen) + whiteplayer = (demo.playback ? displayplayers[0] : consoleplayer); + +#define NUMFORNEWCOLUMN 8 + INT32 y = 41, gutter = ((standings->numplayers > NUMFORNEWCOLUMN) ? 0 : (BASEVIDWIDTH/2)); + INT32 dupadjust = cv_betainterscreen.value ? 314 : (vid.width/vid.dupx), duptweak = cv_betainterscreen.value ? -3 : (dupadjust - BASEVIDWIDTH)/2; + const char *timeheader; + + if (standings->rankingsmode) + timeheader = "RANK"; + else + timeheader = (intertype == int_race ? "TIME" : "SCORE"); + + // draw the level name + V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 12, 0, standings->levelstring); + V_DrawFill((x-3) - duptweak, 34, dupadjust-2, 1, 0); + + if (standings->encore) + V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 12-8, hilicol, "ENCORE MODE"); + + if (standings->numplayers > NUMFORNEWCOLUMN) + { + V_DrawFill(x+156, 24, 1, 158, 0); + V_DrawFill((x-3) - duptweak, 182, dupadjust-2, 1, 0); + + V_DrawCenteredString(x+6+(BASEVIDWIDTH/2), 24, hilicol, "#"); + V_DrawString(x+36+(BASEVIDWIDTH/2), 24, hilicol, "NAME"); + + V_DrawRightAlignedString(x+152, 24, hilicol, timeheader); + } + + V_DrawCenteredString(x+6, 24, hilicol, "#"); + V_DrawString(x+36, 24, hilicol, "NAME"); + + V_DrawRightAlignedString(x+(BASEVIDWIDTH/2)+152, 24, hilicol, timeheader); + + for (i = 0; i < standings->numplayers; i++) + { + if (standings->num[i] != MAXPLAYERS && playeringame[standings->num[i]] && !players[standings->num[i]].spectator) + { + char strtime[MAXPLAYERNAME+1]; + + // Apply the jitter offset (later reversed) + if (standings->jitter[standings->num[i]] > 0) + y--; + + V_DrawCenteredString(x+6, y, 0, va("%d", standings->pos[i])); + + if (standings->color[i] != SKINCOLOR_NONE) + { + UINT8 *colormap = R_GetTranslationColormap(*standings->character[i], *standings->color[i], GTC_CACHE); + // i fucking hate this i fucking hate this i hate this so much + if (!players[standings->num[i]].skinlocal) + { + int skinIndex = players[standings->num[i]].localskin ? players[standings->num[i]].localskin - 1 : *standings->character[i]; + + if (cv_highresportrait.value) + V_DrawSmallMappedPatch(x + 16, y - 4, 0, facewantprefix[skinIndex], colormap); + else + V_DrawMappedPatch(x + 16, y - 4, 0, facerankprefix[skinIndex], colormap); + } + else + { + if (cv_highresportrait.value) + V_DrawSmallMappedPatch(x + 16, y - 4, 0, localfacewantprefix[players[standings->num[i]].localskin - 1], colormap); + else + V_DrawMappedPatch(x + 16, y - 4, 0, localfacerankprefix[players[standings->num[i]].localskin - 1], colormap); + } + } + + if (standings->num[i] == whiteplayer) + { + UINT8 cursorframe = (intertic / 4) % 8; + V_DrawScaledPatch(x+16, y-4, 0, W_CachePatchName(va("K_CHILI%d", cursorframe+1), PU_CACHE)); + } + + STRBUFCPY(strtime, standings->name[i]); + + if (standings->numplayers > NUMFORNEWCOLUMN) + V_DrawThinString(x+36, y-1, ((standings->num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + else + V_DrawString(x+36, y, ((standings->num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); + + if (standings->rankingsmode) + { + if (standings->increase[standings->num[i]] != UINT8_MAX) + { + if (standings->increase[standings->num[i]] > 9) + snprintf(strtime, sizeof strtime, "(+%02d)", standings->increase[standings->num[i]]); + else + snprintf(strtime, sizeof strtime, "(+ %d)", standings->increase[standings->num[i]]); + + if (standings->numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+135+gutter, y-1, V_6WIDTHSPACE, strtime); + else + V_DrawRightAlignedString(x+120+gutter, y, 0, strtime); + } + + snprintf(strtime, sizeof strtime, "%d", standings->val[i]); + + if (standings->numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, strtime); + else + V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); + } + else + { + if (standings->val[i] == (UINT32_MAX-1)) + V_DrawRightAlignedThinString(x+152+gutter, y-1, (standings->numplayers > NUMFORNEWCOLUMN ? V_6WIDTHSPACE : 0), "NO CONTEST."); + else + { + if (intertype == int_race) + { + snprintf(strtime, sizeof strtime, "%i'%02i\"%02i", G_TicsToMinutes(standings->val[i], true), + G_TicsToSeconds(standings->val[i]), G_TicsToCentiseconds(standings->val[i])); + strtime[sizeof strtime - 1] = '\0'; + + if (standings->numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, strtime); + else + V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); + } + else + { + if (standings->numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, va("%i", standings->val[i])); + else + V_DrawRightAlignedString(x+152+gutter, y, 0, va("%i", standings->val[i])); + } + } + } + + // Apply the jitter offset (later reversed) + if (standings->jitter[standings->num[i]] > 0) + y++; + } + else + standings->num[i] = MAXPLAYERS; // this should be the only field setting in this function + + y += 18; + + if (i == NUMFORNEWCOLUMN-1) + { + y = 41; + x += BASEVIDWIDTH/2; + } +#undef NUMFORNEWCOLUMN + } +} + // // Y_IntermissionDrawer // @@ -361,7 +505,7 @@ static void Y_AnimatedVoteScreenCheck(void) // void Y_IntermissionDrawer(void) { - INT32 i, whiteplayer = MAXPLAYERS, x = 4, hilicol = V_YELLOWMAP; // fallback + INT32 x = 4, hilicol = V_YELLOWMAP; // fallback if (intertype == int_none || rendermode == render_none) return; @@ -385,9 +529,6 @@ void Y_IntermissionDrawer(void) // Fade everything out V_DrawFadeScreen(0xFF00, 22); - if (!splitscreen) - whiteplayer = demo.playback ? displayplayers[0] : consoleplayer; - if (cons_menuhighlight.value) hilicol = cons_menuhighlight.value; else if (modeattacking) @@ -407,152 +548,7 @@ void Y_IntermissionDrawer(void) } if (intertype == int_race || intertype == int_match) - { -#define NUMFORNEWCOLUMN 8 - INT32 y = 41, gutter = ((data.match.numplayers > NUMFORNEWCOLUMN) ? 0 : (BASEVIDWIDTH/2)); - INT32 dupadjust = cv_betainterscreen.value ? 314 : (vid.width/vid.dupx), duptweak = cv_betainterscreen.value ? -3 : (dupadjust - BASEVIDWIDTH)/2; - const char *timeheader; - - if (data.match.rankingsmode) - timeheader = "RANK"; - else - timeheader = (intertype == int_race ? "TIME" : "SCORE"); - - // draw the level name - V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 12, 0, data.match.levelstring); - V_DrawFill((x-3) - duptweak, 34, dupadjust-2, 1, 0); - - if (data.match.encore) - V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 12-8, hilicol, "ENCORE MODE"); - - if (data.match.numplayers > NUMFORNEWCOLUMN) - { - V_DrawFill(x+156, 24, 1, 158, 0); - V_DrawFill((x-3) - duptweak, 182, dupadjust-2, 1, 0); - - V_DrawCenteredString(x+6+(BASEVIDWIDTH/2), 24, hilicol, "#"); - V_DrawString(x+36+(BASEVIDWIDTH/2), 24, hilicol, "NAME"); - - V_DrawRightAlignedString(x+152, 24, hilicol, timeheader); - } - - V_DrawCenteredString(x+6, 24, hilicol, "#"); - V_DrawString(x+36, 24, hilicol, "NAME"); - - V_DrawRightAlignedString(x+(BASEVIDWIDTH/2)+152, 24, hilicol, timeheader); - - for (i = 0; i < data.match.numplayers; i++) - { - if (data.match.num[i] != MAXPLAYERS && playeringame[data.match.num[i]] && !players[data.match.num[i]].spectator) - { - char strtime[MAXPLAYERNAME+1]; - - // Apply the jitter offset (later reversed) - if (data.match.jitter[data.match.num[i]] > 0) - y--; - - V_DrawCenteredString(x+6, y, 0, va("%d", data.match.pos[i])); - - if (data.match.color[i]) - { - UINT8 *colormap = R_GetTranslationColormap(*data.match.character[i], *data.match.color[i], GTC_CACHE); - // i fucking hate this i fucking hate this i hate this so much - if (!players[data.match.num[i]].skinlocal) - { - int skinIndex = players[data.match.num[i]].localskin ? players[data.match.num[i]].localskin - 1 : *data.match.character[i]; - - if (cv_highresportrait.value) - V_DrawSmallMappedPatch(x + 16, y - 4, 0, facewantprefix[skinIndex], colormap); - else - V_DrawMappedPatch(x + 16, y - 4, 0, facerankprefix[skinIndex], colormap); - } - else - { - if (cv_highresportrait.value) - V_DrawSmallMappedPatch(x + 16, y - 4, 0, localfacewantprefix[players[data.match.num[i]].localskin - 1], colormap); - else - V_DrawMappedPatch(x + 16, y - 4, 0, localfacerankprefix[players[data.match.num[i]].localskin - 1], colormap); - } - } - - if (data.match.num[i] == whiteplayer) - { - UINT8 cursorframe = (intertic / 4) % 8; - V_DrawScaledPatch(x+16, y-4, 0, W_CachePatchName(va("K_CHILI%d", cursorframe+1), PU_CACHE)); - } - - STRBUFCPY(strtime, data.match.name[i]); - - if (data.match.numplayers > NUMFORNEWCOLUMN) - V_DrawThinString(x+36, y-1, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); - else - V_DrawString(x+36, y, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); - - if (data.match.rankingsmode) - { - if (data.match.increase[data.match.num[i]] != UINT8_MAX) - { - if (data.match.increase[data.match.num[i]] > 9) - snprintf(strtime, sizeof strtime, "(+%02d)", data.match.increase[data.match.num[i]]); - else - snprintf(strtime, sizeof strtime, "(+ %d)", data.match.increase[data.match.num[i]]); - - if (data.match.numplayers > NUMFORNEWCOLUMN) - V_DrawRightAlignedThinString(x+135+gutter, y-1, V_6WIDTHSPACE, strtime); - else - V_DrawRightAlignedString(x+120+gutter, y, 0, strtime); - } - - snprintf(strtime, sizeof strtime, "%d", data.match.val[i]); - - if (data.match.numplayers > NUMFORNEWCOLUMN) - V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, strtime); - else - V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); - } - else - { - if (data.match.val[i] == (UINT32_MAX-1)) - V_DrawRightAlignedThinString(x+152+gutter, y-1, (data.match.numplayers > NUMFORNEWCOLUMN ? V_6WIDTHSPACE : 0), "NO CONTEST."); - else - { - if (intertype == int_race) - { - snprintf(strtime, sizeof strtime, "%i'%02i\"%02i", G_TicsToMinutes(data.match.val[i], true), - G_TicsToSeconds(data.match.val[i]), G_TicsToCentiseconds(data.match.val[i])); - strtime[sizeof strtime - 1] = '\0'; - - if (data.match.numplayers > NUMFORNEWCOLUMN) - V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, strtime); - else - V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); - } - else - { - if (data.match.numplayers > NUMFORNEWCOLUMN) - V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, va("%i", data.match.val[i])); - else - V_DrawRightAlignedString(x+152+gutter, y, 0, va("%i", data.match.val[i])); - } - } - } - - if (data.match.jitter[data.match.num[i]] > 0) - y++; - } - else - data.match.num[i] = MAXPLAYERS; // this should be the only field setting in this function - - y += 18; - - if (i == NUMFORNEWCOLUMN-1) - { - y = 41; - x += BASEVIDWIDTH/2; - } -#undef NUMFORNEWCOLUMN - } - } + Y_PlayerStandingsDrawer(&data, x, hilicol); if (timer) { @@ -651,9 +647,9 @@ void Y_Ticker(void) return; } - if (data.match.rankingsmode && intertic & 1) + if (data.rankingsmode && intertic & 1) { - memset(data.match.jitter, 0, sizeof (data.match.jitter)); + memset(data.jitter, 0, sizeof (data.jitter)); return; } @@ -665,24 +661,24 @@ void Y_Ticker(void) sorttic = intertic + max((cv_inttime.value/2)-2, 2)*TICRATE; // 8 second pause after match results else if (!(multiplayer && demo.playback)) // Don't advance to rankings in replays { - if (!data.match.rankingsmode && (intertic >= sorttic + 8)) + if (!data.rankingsmode && (intertic >= sorttic + 8)) Y_CalculateMatchData(1, Y_CompareRank); - if (data.match.rankingsmode && intertic > sorttic+16+(2*TICRATE)) + if (data.rankingsmode && intertic > sorttic+16+(2*TICRATE)) { INT32 q=0,r=0; boolean kaching = true; - for (q = 0; q < data.match.numplayers; q++) + for (q = 0; q < data.numplayers; q++) { - if (data.match.num[q] == MAXPLAYERS - || !data.match.increase[data.match.num[q]] - || data.match.increase[data.match.num[q]] == UINT8_MAX) + if (data.num[q] == MAXPLAYERS + || !data.increase[data.num[q]] + || data.increase[data.num[q]] == UINT8_MAX) continue; r++; - data.match.jitter[data.match.num[q]] = 1; - if (--data.match.increase[data.match.num[q]]) + data.jitter[data.num[q]] = 1; + if (--data.increase[data.num[q]]) kaching = false; } diff --git a/src/y_inter.h b/src/y_inter.h index ee320d474..be0192a27 100644 --- a/src/y_inter.h +++ b/src/y_inter.h @@ -23,6 +23,23 @@ void Y_StartVote(void); void Y_EndVote(void); void Y_SetupVoteFinish(SINT8 pick, SINT8 level); +typedef struct +{ + UINT8 *color[MAXPLAYERS]; // Winner's color # + INT32 *character[MAXPLAYERS]; // Winner's character # + INT32 num[MAXPLAYERS]; // Winner's player # + char *name[MAXPLAYERS]; // Winner's name + INT32 numplayers; // Number of players being displayed + char levelstring[64]; // holds levelnames up to 64 characters + // SRB2kart + UINT8 increase[MAXPLAYERS]; // how much did the score increase by? + UINT8 jitter[MAXPLAYERS]; // wiggle + UINT32 val[MAXPLAYERS]; // Gametype-specific value + UINT8 pos[MAXPLAYERS]; // player positions. used for ties + boolean rankingsmode; // rankings mode + boolean encore; // encore mode +} y_data_t; + typedef enum { int_none, -- 2.54.0 From ecf55e64ae0565a1b8aa1758af0314083c8bd18a Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 26 Dec 2024 23:46:52 +0100 Subject: [PATCH 029/325] more smol refactoring --- src/y_inter.c | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index fc06c5fca..c8a80e068 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -338,7 +338,7 @@ static void Y_AnimatedVoteScreenCheck(void) // // Handles drawing the center-of-screen player standings. // -void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) +static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) { if (standings->numplayers == 0) { @@ -385,12 +385,18 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) for (i = 0; i < standings->numplayers; i++) { - if (standings->num[i] != MAXPLAYERS && playeringame[standings->num[i]] && !players[standings->num[i]].spectator) + const UINT8 pnum = standings->num[i]; + + if (pnum == MAXPLAYERS) + ; + else if (!playeringame[pnum] || players[pnum].spectator == true) + standings->num[i] = MAXPLAYERS; // this should be the only field setting in this function + else { char strtime[MAXPLAYERNAME+1]; // Apply the jitter offset (later reversed) - if (standings->jitter[standings->num[i]] > 0) + if (standings->jitter[pnum] > 0) y--; V_DrawCenteredString(x+6, y, 0, va("%d", standings->pos[i])); @@ -398,10 +404,11 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) if (standings->color[i] != SKINCOLOR_NONE) { UINT8 *colormap = R_GetTranslationColormap(*standings->character[i], *standings->color[i], GTC_CACHE); + // i fucking hate this i fucking hate this i hate this so much - if (!players[standings->num[i]].skinlocal) + if (!players[pnum].skinlocal) { - int skinIndex = players[standings->num[i]].localskin ? players[standings->num[i]].localskin - 1 : *standings->character[i]; + int skinIndex = (players[pnum].localskin ? (players[pnum].localskin - 1) : *standings->character[i]); if (cv_highresportrait.value) V_DrawSmallMappedPatch(x + 16, y - 4, 0, facewantprefix[skinIndex], colormap); @@ -411,13 +418,13 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) else { if (cv_highresportrait.value) - V_DrawSmallMappedPatch(x + 16, y - 4, 0, localfacewantprefix[players[standings->num[i]].localskin - 1], colormap); + V_DrawSmallMappedPatch(x + 16, y - 4, 0, localfacewantprefix[players[pnum].localskin - 1], colormap); else - V_DrawMappedPatch(x + 16, y - 4, 0, localfacerankprefix[players[standings->num[i]].localskin - 1], colormap); + V_DrawMappedPatch(x + 16, y - 4, 0, localfacerankprefix[players[pnum].localskin - 1], colormap); } } - if (standings->num[i] == whiteplayer) + if (pnum == whiteplayer) { UINT8 cursorframe = (intertic / 4) % 8; V_DrawScaledPatch(x+16, y-4, 0, W_CachePatchName(va("K_CHILI%d", cursorframe+1), PU_CACHE)); @@ -426,18 +433,18 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) STRBUFCPY(strtime, standings->name[i]); if (standings->numplayers > NUMFORNEWCOLUMN) - V_DrawThinString(x+36, y-1, ((standings->num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + V_DrawThinString(x+36, y-1, ((pnum == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); else - V_DrawString(x+36, y, ((standings->num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); + V_DrawString(x+36, y, ((pnum == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); if (standings->rankingsmode) { - if (standings->increase[standings->num[i]] != UINT8_MAX) + if (standings->increase[pnum] != UINT8_MAX) { - if (standings->increase[standings->num[i]] > 9) - snprintf(strtime, sizeof strtime, "(+%02d)", standings->increase[standings->num[i]]); + if (standings->increase[pnum] > 9) + snprintf(strtime, sizeof strtime, "(+%02d)", standings->increase[pnum]); else - snprintf(strtime, sizeof strtime, "(+ %d)", standings->increase[standings->num[i]]); + snprintf(strtime, sizeof strtime, "(+ %d)", standings->increase[pnum]); if (standings->numplayers > NUMFORNEWCOLUMN) V_DrawRightAlignedThinString(x+135+gutter, y-1, V_6WIDTHSPACE, strtime); @@ -479,12 +486,9 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) } } - // Apply the jitter offset (later reversed) - if (standings->jitter[standings->num[i]] > 0) + if (standings->jitter[pnum] > 0) y++; } - else - standings->num[i] = MAXPLAYERS; // this should be the only field setting in this function y += 18; @@ -521,7 +525,7 @@ void Y_IntermissionDrawer(void) if (rendermode == render_soft) VID_BlitLinearScreen(screens[1], screens[0], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); #ifdef HWRENDER - else if(rendermode == render_opengl) + else if (rendermode == render_opengl) HWR_DrawIntermissionBG(); #endif } @@ -560,8 +564,7 @@ void Y_IntermissionDrawer(void) else string = va("%s starts in %d", cv_advancemap.string, tickdown); - V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol, - string); + V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol, string); } if ((demo.recording || demo.savemode == DSM_SAVED) && !demo.playback) -- 2.54.0 From 6f5a0b9a3f0a8775b7e111ad2d3ca4e3ed55a2a4 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 27 Dec 2024 00:34:51 +0100 Subject: [PATCH 030/325] also add playernum var to tabrankings drawer --- src/k_kart.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a6aa76e4d..3c1b51c07 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8582,13 +8582,14 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I for (i = 0; i < scorelines; i++) { char strtime[MAXPLAYERNAME+1]; + const UINT8 pnum = tab[i].num; - if (players[tab[i].num].spectator || !players[tab[i].num].mo) + if (players[pnum].spectator || !players[pnum].mo) continue; //ignore them. if (netgame // don't draw it offline - && tab[i].num != serverplayer) - HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[tab[i].num], 0); + && pnum != serverplayer) + HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[pnum], 0); STRBUFCPY(strtime, tab[i].name); @@ -8597,27 +8598,28 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I else V_DrawString(x + 20, y, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); - if (players[tab[i].num].mo->color) + if (players[pnum].mo->color) { - colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); - if (players[tab[i].num].mo->colorized) - colormap = R_GetTranslationColormap(TC_RAINBOW, players[tab[i].num].mo->color, GTC_CACHE); + colormap = R_GetTranslationColormap(players[pnum].skin, players[pnum].mo->color, GTC_CACHE); + + if (players[pnum].mo->colorized) + colormap = R_GetTranslationColormap(TC_RAINBOW, players[pnum].mo->color, GTC_CACHE); else - colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); + colormap = R_GetTranslationColormap(players[pnum].skin, players[pnum].mo->color, GTC_CACHE); { player_t *p; - p = &players[tab[i].num]; + p = &players[pnum]; if (cv_highresportrait.value) V_DrawSmallMappedPatch(x, y-4, 0, R_GetSkinFaceWant(p), colormap); else V_DrawMappedPatch(x, y-4, 0, R_GetSkinFaceRank(p), colormap); } - /*if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] > 0) -- not enough space for this + /*if (G_BattleGametype() && players[pnum].kartstuff[k_bumper] > 0) -- not enough space for this { INT32 bumperx = x+19; V_DrawMappedPatch(bumperx-2, y-4, 0, kp_tinybumper[0], colormap); - for (j = 1; j < players[tab[i].num].kartstuff[k_bumper]; j++) + for (j = 1; j < players[pnum].kartstuff[k_bumper]; j++) { bumperx += 5; V_DrawMappedPatch(bumperx, y-4, 0, kp_tinybumper[1], colormap); @@ -8628,11 +8630,11 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (tab[i].num == whiteplayer) V_DrawScaledPatch(x, y-4, 0, kp_facehighlight[(leveltime / 4) % 8]); - if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] <= 0) + if (G_BattleGametype() && players[pnum].kartstuff[k_bumper] <= 0) V_DrawScaledPatch(x-4, y-7, 0, kp_ranknobumpers); else { - INT32 pos = players[tab[i].num].kartstuff[k_position]; + INT32 pos = players[pnum].kartstuff[k_position]; if (pos < 0 || pos > MAXPLAYERS) pos = 0; // Draws the little number over the face @@ -8644,18 +8646,18 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I #define timestring(time) va("%i'%02i\"%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time)) if (scorelines > 8) { - if (players[tab[i].num].exiting) - V_DrawRightAlignedThinString(x+rightoffset, y-1, hilicol|V_6WIDTHSPACE, timestring(players[tab[i].num].realtime)); - else if (players[tab[i].num].pflags & PF_TIMEOVER) + if (players[pnum].exiting) + V_DrawRightAlignedThinString(x+rightoffset, y-1, hilicol|V_6WIDTHSPACE, timestring(players[pnum].realtime)); + else if (players[pnum].pflags & PF_TIMEOVER) V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, "NO CONTEST."); else if (circuitmap) V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, va("Lap %d", tab[i].count)); } else { - if (players[tab[i].num].exiting) - V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[tab[i].num].realtime)); - else if (players[tab[i].num].pflags & PF_TIMEOVER) + if (players[pnum].exiting) + V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[pnum].realtime)); + else if (players[pnum].pflags & PF_TIMEOVER) V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST."); else if (circuitmap) V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count)); -- 2.54.0 From 43f9bd52390d228efba55e4229dc964c01d9dcc3 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 18:43:31 +0100 Subject: [PATCH 031/325] make highlight color in scoreboard and tab ranking player coloured also make it appear in splitscreen similar to hostmod things --- src/hu_stuff.c | 8 +--- src/hu_stuff.h | 2 +- src/k_kart.c | 14 ++++-- src/v_video.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++ src/v_video.h | 2 + src/y_inter.c | 9 +++- 6 files changed, 147 insertions(+), 14 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 6cbb46148..c3fa5c9ae 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2615,7 +2615,6 @@ static void HU_DrawRankings(void) playersort_t tab[MAXPLAYERS]; INT32 i, j, scorelines, hilicol, numplayersingame = 0; boolean completed[MAXPLAYERS]; - UINT32 whiteplayer = MAXPLAYERS; if (!automapactive) V_DrawFadeScreen(0xFF00, 16); // A little more readable, and prevents cheating the fades under other circumstances. @@ -2703,11 +2702,6 @@ static void HU_DrawRankings(void) V_DrawCenteredString(256, 16, hilicol, cv_kartspeed.string); } - // When you play, you quickly see your score because your name is displayed in white. - // When playing back a demo, you quickly see who's the view. - if (!splitscreen) - whiteplayer = demo.playback ? displayplayers[0] : consoleplayer; - scorelines = 0; memset(completed, 0, sizeof (completed)); memset(tab, 0, sizeof (playersort_t)*MAXPLAYERS); @@ -2763,7 +2757,7 @@ static void HU_DrawRankings(void) #endif } - HU_DrawTabRankings(((scorelines > 8) ? 32 : 40), 33, tab, scorelines, whiteplayer, hilicol); + HU_DrawTabRankings(((scorelines > 8) ? 32 : 40), 33, tab, scorelines, hilicol); // draw spectators in a ticker across the bottom if (netgame && G_GametypeHasSpectators()) diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 66459c716..258e16c9d 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -128,7 +128,7 @@ void HU_clearChatChars(void); void HU_drawPing(INT32 x, INT32 y, UINT32 ping, INT32 flags); // Lat': Ping drawer for scoreboard. //void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer); //void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer); -void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol); +void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol); void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds); const char *HU_SkinColorToConsoleColor(skincolors_t color); diff --git a/src/k_kart.c b/src/k_kart.c index 3c1b51c07..f5b220a04 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8562,12 +8562,14 @@ static boolean K_drawKartPositionFaces(void) // // HU_DrawTabRankings -- moved here to take advantage of kart stuff! // -void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol) +void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol) { INT32 i, rightoffset = 240; const UINT8 *colormap; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; + boolean (*_isHighlightedPlayer)(const player_t *) = (demo.playback ? P_IsDisplayPlayer : P_IsLocalPlayer); + //this function is designed for 9 or less score lines only //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up @@ -8587,6 +8589,10 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[pnum].spectator || !players[pnum].mo) continue; //ignore them. + const boolean whiteplayer = _isHighlightedPlayer(&players[pnum]); + + const INT32 philicol = (whiteplayer ? V_SkinColorToHighlightcolor(players[pnum].skincolor) : 0); + if (netgame // don't draw it offline && pnum != serverplayer) HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[pnum], 0); @@ -8594,9 +8600,9 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I STRBUFCPY(strtime, tab[i].name); if (scorelines > 8) - V_DrawThinString(x + 20, y, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + V_DrawThinString(x + 20, y, philicol|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); else - V_DrawString(x + 20, y, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); + V_DrawString(x + 20, y, philicol|V_ALLOWLOWERCASE, strtime); if (players[pnum].mo->color) { @@ -8627,7 +8633,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I }*/ } - if (tab[i].num == whiteplayer) + if (whiteplayer) V_DrawScaledPatch(x, y-4, 0, kp_facehighlight[(leveltime / 4) % 8]); if (G_BattleGametype() && players[pnum].kartstuff[k_bumper] <= 0) diff --git a/src/v_video.c b/src/v_video.c index 987a40a03..b381f6bc1 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -3165,6 +3165,132 @@ char V_GetSkincolorChar(INT32 color) return cstart; } +INT32 V_SkinColorToHighlightcolor(skincolors_t color) +{ + switch (color) + { + case SKINCOLOR_WHITE: + case SKINCOLOR_SILVER: + case SKINCOLOR_SLATE: + return 0; // White + case SKINCOLOR_GREY: + case SKINCOLOR_NICKEL: + case SKINCOLOR_BLACK: + case SKINCOLOR_SKUNK: + case SKINCOLOR_JET: + return V_GRAYMAP; + case SKINCOLOR_SEPIA: + case SKINCOLOR_BEIGE: + case SKINCOLOR_WALNUT: + case SKINCOLOR_BROWN: + case SKINCOLOR_LEATHER: + case SKINCOLOR_RUST: + case SKINCOLOR_WRISTWATCH: + return V_BROWNMAP; + case SKINCOLOR_FAIRY: + case SKINCOLOR_SALMON: + case SKINCOLOR_PINK: + case SKINCOLOR_ROSE: + case SKINCOLOR_BRICK: + case SKINCOLOR_LEMONADE: + case SKINCOLOR_BUBBLEGUM: + case SKINCOLOR_LILAC: + return V_PINKMAP; + case SKINCOLOR_CINNAMON: + case SKINCOLOR_RUBY: + case SKINCOLOR_RASPBERRY: + case SKINCOLOR_CHERRY: + case SKINCOLOR_RED: + case SKINCOLOR_CRIMSON: + case SKINCOLOR_MAROON: + case SKINCOLOR_FLAME: + case SKINCOLOR_SCARLET: + case SKINCOLOR_KETCHUP: + return V_REDMAP; + case SKINCOLOR_DAWN: + case SKINCOLOR_SUNSET: + case SKINCOLOR_CREAMSICLE: + case SKINCOLOR_ORANGE: + case SKINCOLOR_PUMPKIN: + case SKINCOLOR_ROSEWOOD: + case SKINCOLOR_BURGUNDY: + case SKINCOLOR_TANGERINE: + return V_ORANGEMAP; + case SKINCOLOR_PEACH: + case SKINCOLOR_CARAMEL: + case SKINCOLOR_CREAM: + return V_PEACHMAP; + case SKINCOLOR_GOLD: + case SKINCOLOR_ROYAL: + case SKINCOLOR_BRONZE: + case SKINCOLOR_COPPER: + case SKINCOLOR_THUNDER: + return V_GOLDMAP; + case SKINCOLOR_POPCORN: + case SKINCOLOR_QUARRY: + case SKINCOLOR_YELLOW: + case SKINCOLOR_MUSTARD: + case SKINCOLOR_CROCODILE: + case SKINCOLOR_OLIVE: + return V_YELLOWMAP; + case SKINCOLOR_ARTICHOKE: + case SKINCOLOR_VOMIT: + case SKINCOLOR_GARDEN: + case SKINCOLOR_TEA: + case SKINCOLOR_PISTACHIO: + return V_TEAMAP; + case SKINCOLOR_LIME: + case SKINCOLOR_HANDHELD: + case SKINCOLOR_MOSS: + case SKINCOLOR_CAMOUFLAGE: + case SKINCOLOR_ROBOHOOD: + case SKINCOLOR_MINT: + case SKINCOLOR_GREEN: + case SKINCOLOR_PINETREE: + case SKINCOLOR_EMERALD: + case SKINCOLOR_SWAMP: + case SKINCOLOR_DREAM: + case SKINCOLOR_PLAGUE: + case SKINCOLOR_ALGAE: + return V_GREENMAP; + case SKINCOLOR_CARIBBEAN: + case SKINCOLOR_AZURE: + case SKINCOLOR_AQUA: + case SKINCOLOR_TEAL: + case SKINCOLOR_CYAN: + case SKINCOLOR_JAWZ: + case SKINCOLOR_CERULEAN: + case SKINCOLOR_NAVY: + case SKINCOLOR_SAPPHIRE: + return V_SKYMAP; + case SKINCOLOR_PIGEON: + case SKINCOLOR_PLATINUM: + case SKINCOLOR_STEEL: + return V_STEELMAP; + case SKINCOLOR_PERIWINKLE: + case SKINCOLOR_BLUE: + case SKINCOLOR_BLUEBERRY: + case SKINCOLOR_NOVA: + return V_BLUEMAP; + case SKINCOLOR_ULTRAVIOLET: + case SKINCOLOR_PURPLE: + case SKINCOLOR_FUCHSIA: + return V_PURPLEMAP; + case SKINCOLOR_PASTEL: + case SKINCOLOR_MOONSLAM: + case SKINCOLOR_DUSK: + case SKINCOLOR_TOXIC: + case SKINCOLOR_MAUVE: + case SKINCOLOR_LAVENDER: + case SKINCOLOR_BYZANTIUM: + case SKINCOLOR_POMEGRANATE: + return V_LAVENDERMAP; + + default: + return 0; + } +} + boolean *heatshifter = NULL; INT32 lastheight = 0; INT32 heatindex[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; diff --git a/src/v_video.h b/src/v_video.h index dfab7dfde..1898f438b 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -254,6 +254,8 @@ INT32 V_SubStringLengthToFit(const char *string, INT32 width, INT32 option); char V_GetSkincolorChar(INT32 color); +INT32 V_SkinColorToHighlightcolor(skincolors_t color); + typedef struct player_s player_t; void V_DoPostProcessor(INT32 view, player_t *player, INT32 param); diff --git a/src/y_inter.c b/src/y_inter.c index c8a80e068..7aa4c4d6f 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -383,6 +383,8 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) V_DrawRightAlignedString(x+(BASEVIDWIDTH/2)+152, 24, hilicol, timeheader); + boolean (*_isHighlightedPlayer)(const player_t *) = (demo.playback ? P_IsDisplayPlayer : P_IsLocalPlayer); + for (i = 0; i < standings->numplayers; i++) { const UINT8 pnum = standings->num[i]; @@ -395,6 +397,9 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) { char strtime[MAXPLAYERNAME+1]; + const boolean whiteplayer = _isHighlightedPlayer(&players[pnum]); + const INT32 philicol = (whiteplayer ? V_SkinColorToHighlightcolor(players[pnum].skincolor) : 0); + // Apply the jitter offset (later reversed) if (standings->jitter[pnum] > 0) y--; @@ -433,9 +438,9 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) STRBUFCPY(strtime, standings->name[i]); if (standings->numplayers > NUMFORNEWCOLUMN) - V_DrawThinString(x+36, y-1, ((pnum == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + V_DrawThinString(x+36, y-1, philicol|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); else - V_DrawString(x+36, y, ((pnum == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); + V_DrawString(x+36, y, philicol|V_ALLOWLOWERCASE, strtime); if (standings->rankingsmode) { -- 2.54.0 From 3a8e4e065e66639dbc9d328cd22e84db8ae7de01 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 27 Dec 2024 00:44:10 +0100 Subject: [PATCH 032/325] draw gametype in tabrankings during replay playback replays already show the mapname in there so --- src/hu_stuff.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index c3fa5c9ae..90c598a47 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2626,20 +2626,25 @@ static void HU_DrawRankings(void) else hilicol = ((gametype == GT_RACE) ? V_SKYMAP : V_REDMAP); - // draw the current gametype in the lower right - //if (modeattacking) - //V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, "Record Attack"); - //else - //V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, gametype_cons_t[gametype].strvalue); - - // draw the current map in the lower right if theres none just say its unknown - char *maptitle = G_BuildMapTitle(gamemap); - if (!maptitle) - V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, "UNKNOWN"); + if (!demo.playback) + { + // draw the current map in the lower right + char *maptitle = G_BuildMapTitle(gamemap); + + if (maptitle) + { + V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, maptitle); + Z_Free(maptitle); + } + else + { + V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, "UNKNOWN"); + } + } else { - V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, maptitle); - Z_Free(maptitle); + // draw the current gametype in the lower right + V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, (modeattacking)? "Record Attack" : gametype_cons_t[gametype].strvalue); } if (G_GametypeHasTeams()) -- 2.54.0 From 4b856fba2a0ab14579c94fc001b5a97704f9afcb Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 27 Dec 2024 00:44:20 +0100 Subject: [PATCH 033/325] z --- src/hu_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 90c598a47..3f8a0c13b 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2644,7 +2644,7 @@ static void HU_DrawRankings(void) else { // draw the current gametype in the lower right - V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, (modeattacking)? "Record Attack" : gametype_cons_t[gametype].strvalue); + V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, (modeattacking) ? "Record Attack" : gametype_cons_t[gametype].strvalue); } if (G_GametypeHasTeams()) -- 2.54.0 From 17f6f1cd4c4182cdb4e5ed6a641e8c0c799746e4 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 27 Dec 2024 18:41:50 +0100 Subject: [PATCH 034/325] use V_STEELMAP for white skincolours instead cause white on white be weird --- src/v_video.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v_video.c b/src/v_video.c index b381f6bc1..d3c65b4c5 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -3172,7 +3172,7 @@ INT32 V_SkinColorToHighlightcolor(skincolors_t color) case SKINCOLOR_WHITE: case SKINCOLOR_SILVER: case SKINCOLOR_SLATE: - return 0; // White + return V_STEELMAP; case SKINCOLOR_GREY: case SKINCOLOR_NICKEL: case SKINCOLOR_BLACK: -- 2.54.0 From 7d6cce5881770f3055abcfd54c3500436c6a0b7d Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 19:21:23 +0100 Subject: [PATCH 035/325] readd cam cmd stuff cause it may break the cam in replays or smth a --- src/p_user.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 7a9e1f67c..a91bebd79 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3157,9 +3157,11 @@ void P_ToggleDemoCamera(UINT8 viewnum) } } +static ticcmd_t cameracmd[MAXSPLITSCREENPLAYERS]; + static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) { - INT32 laim, th, tspeed, forward, side, axis; + INT32 laim, forward, side, axis; // these ones used for multiple conditions boolean turnleft, turnright; @@ -3167,14 +3169,30 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) angle_t lang; const UINT8 forplayer = num+1; - ticcmd_t *cmd = D_LocalTiccmd(num); + memset(&cameracmd[num], 0, sizeof(ticcmd_t)); // initialize cmd - if (!cam->freecam) - return cmd; // empty cmd, no. + ticcmd_t *cmd = &cameracmd[num]; lang = cam->localangle; laim = cam->localaiming; + switch (num) + { + case 1: + G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); + break; + case 2: + G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); + break; + case 3: + G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); + break; + case 0: + default: + G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver + break; + } + cmd->angleturn = (INT16)(lang >> 16); cmd->aiming = G_ClipAimingPitch(&laim); @@ -3204,27 +3222,15 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) } forward = side = 0; - // use two stage accelerative turning - // on the keyboard and joystick - if (turnleft || turnright) - th += 1; - else - th = 0; - - if (th < SLOWTURNTICS) - tspeed = 2; // slow turn - else - tspeed = 1; - // let movement keys cancel each other out if (turnright && !(turnleft)) { - cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed])); + cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[1])); side += sidemove[1]; } else if (turnleft && !(turnright)) { - cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed])); + cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[1])); side -= sidemove[1]; } -- 2.54.0 From 92a3e974b046e32a14f678ffb61950fe17d79064 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 19:21:40 +0100 Subject: [PATCH 036/325] fix driftgauge showing with freecam while ingame --- 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 f386b5ad9..ef73e4b2b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9311,7 +9311,7 @@ static void K_drawDriftGauge(void) 0, 31, 47, 63, 79, 95, 111, 119, 127, 143, 159, 175, 183, 191, 199, 207, 223, 247 }; - if (demo.playback && camera[stplyrnum].freecam) + if (camera[stplyrnum].freecam) return; if (P_MobjWasRemoved(stplyr->mo) || (!splitscreen && !camera->chase)) -- 2.54.0 From f72c64d7d15974a86e8e694e6c2ed139a0f6a728 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 19:29:12 +0100 Subject: [PATCH 037/325] fix some potential issues with viewinterp now unpaused disabled interp on netlag also fixes screencoord stuff not being interpolated during pause --- src/d_main.c | 9 ++++++++- src/k_kart.c | 2 +- src/r_main.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 642870a86..a46ba11c0 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -825,7 +825,14 @@ void D_SRB2Loop(void) rendertimefrac = FRACUNIT; } - rendertimefrac_unpaused = g_time.timefrac; + if (!hu_stopped) + { + rendertimefrac_unpaused = g_time.timefrac; + } + else + { + rendertimefrac_unpaused = FRACUNIT; + } } else { diff --git a/src/k_kart.c b/src/k_kart.c index ef73e4b2b..ec8e5aa73 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7608,7 +7608,7 @@ static void K_initKartHUD(void) // K_GetScreenCoords needs the right view* variables R_SetViewContext(stplyrnum); - R_InterpolateView(R_UsingFrameInterpolation() ? rendertimefrac : FRACUNIT, !cv_uncappedhud.value); + R_InterpolateView(R_UsingFrameInterpolation() ? rendertimefrac_unpaused : FRACUNIT, !cv_uncappedhud.value); } INT32 K_calcSplitFlags(INT32 snapflags) diff --git a/src/r_main.c b/src/r_main.c index 2a97136be..dbbd1ee54 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1081,7 +1081,7 @@ R_SetupCommonFrame else newview->sector = R_PointInSubsector(newview->x, newview->y)->sector; - R_InterpolateView(R_UsingFrameInterpolation() ? (camera[viewnum].freecam ? rendertimefrac_unpaused : rendertimefrac) : FRACUNIT, false); + R_InterpolateView(R_UsingFrameInterpolation() ? rendertimefrac_unpaused : FRACUNIT, false); } static void R_SetupAimingFrame(player_t *player, camera_t *thiscam) -- 2.54.0 From 6d01ec4c553f687c11315a9642642a98dfb2702f Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 19:46:14 +0100 Subject: [PATCH 038/325] dont need this anymore --- src/r_main.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/r_main.c b/src/r_main.c index dbbd1ee54..cd38fab85 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1066,8 +1066,6 @@ R_SetupCommonFrame ( player_t * player, subsector_t * subsector) { - const UINT8 viewnum = R_GetViewNumber(); - newview->player = player; newview->x += quake.x; -- 2.54.0 From 761df3f2cf6db55abe3b3e8a816a8384187fd225 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 11:29:49 +0100 Subject: [PATCH 039/325] hide director control stuff for others than player 1 --- src/m_menu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/m_menu.c b/src/m_menu.c index ff4096244..d78e41274 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -12098,6 +12098,7 @@ static void M_Setup1PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_CONTROL; // GIF OP_AllControlsMenu[20].status = IT_CONTROL; // System Menu OP_AllControlsMenu[21].status = IT_CONTROL; // Console + OP_AllControlsMenu[35].status = IT_CONTROL; // Director M_SetupNextMenu(&OP_AllControlsDef); } @@ -12120,6 +12121,7 @@ static void M_Setup2PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console + OP_AllControlsMenu[35].status = IT_GRAYEDOUT2; // Director M_SetupNextMenu(&OP_AllControlsDef); } @@ -12142,6 +12144,7 @@ static void M_Setup3PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console + OP_AllControlsMenu[35].status = IT_GRAYEDOUT2; // Director M_SetupNextMenu(&OP_AllControlsDef); } @@ -12164,6 +12167,7 @@ static void M_Setup4PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console + OP_AllControlsMenu[35].status = IT_GRAYEDOUT2; // Director M_SetupNextMenu(&OP_AllControlsDef); } -- 2.54.0 From b2823c81e46fdc077f38addc2b5b363cbd5ad51e Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 04:09:43 +0100 Subject: [PATCH 040/325] fix jitter when toggling freecam off --- src/g_game.c | 4 +--- src/g_game.h | 2 ++ src/p_user.c | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 18c67e4f9..385b7b6cf 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -358,8 +358,6 @@ void SendWeaponPref2(void); void SendWeaponPref3(void); void SendWeaponPref4(void); -static void G_FixCamera(UINT8 view); - // don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler. // chat timer thingy @@ -1701,7 +1699,7 @@ INT32 G_CountPlayersPotentiallyViewable(boolean active) // Reset camera position, angle and interpolation on a view // after changing state. // -static void G_FixCamera(UINT8 view) +void G_FixCamera(UINT8 view) { player_t *player = &players[displayplayers[view - 1]]; diff --git a/src/g_game.h b/src/g_game.h index 3a957d00a..ba26cd507 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -444,4 +444,6 @@ INT16 G_TOLFlag(INT32 pgametype); INT16 G_RandMap(INT16 tolflags, INT16 pprevmap, boolean ignorebuffer, UINT8 maphell, boolean callagainsoon, INT16 *extbuffer); void G_AddMapToBuffer(INT16 map); +void G_FixCamera(UINT8 view); + #endif diff --git a/src/p_user.c b/src/p_user.c index a91bebd79..ce404866e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3154,6 +3154,7 @@ void P_ToggleDemoCamera(UINT8 viewnum) else // toggle off { cam->freecam = false; + G_FixCamera(viewnum+1); } } -- 2.54.0 From 6fcfb9cf36d44ffd662738bde07bc4b5bd5e28de Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 22:21:26 +0100 Subject: [PATCH 041/325] readd this check lel --- src/r_bsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index dbb6fb4d3..66861c49a 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -265,7 +265,7 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, boolean underwater; UINT8 i = R_GetViewNumber(); - if (camera[i].chase) + if (viewplayer == &players[displayplayers[i]] && camera[i].chase) heightsec = R_PointInSubsector(camera[i].x, camera[i].y)->sector->heightsec; else if (i > splitscreen && viewmobj) heightsec = R_PointInSubsector(pviewmobj->x, pviewmobj->y)->sector->heightsec; -- 2.54.0 From 3910e66905bd928b62c824a5caa6ca490bbd758e Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 30 Dec 2024 23:10:51 +0100 Subject: [PATCH 042/325] dont try to chase after your spec mobj lel --- src/p_user.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index ce404866e..652fd0fea 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3364,10 +3364,15 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) if (cmd->buttons & BT_ATTACK) { lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. - cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); - cam->aiming = R_PointToAngle2(0, cam->z, R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y), lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads. - cam->reset_aiming = false; + // dont chase after your spectator self + if (!lastp->spectator) + { + const fixed_t dist = R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); + cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); + cam->aiming = R_PointToAngle2(0, cam->z, dist, lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads. + cam->reset_aiming = false; + } } if (cmd->forwardmove != 0) -- 2.54.0 From 487018f1467ac64fab0fb6b86ace257820840f47 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 1 Jan 2025 05:37:30 +0100 Subject: [PATCH 043/325] hack: only let freecam for spec move when youre actually able to move as spec cause kart weird, and we cant remove the spec movement due to synch reasons and letting the cam move instantly instead of waiting, may put you in a weird cam position --- src/p_user.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 652fd0fea..e160068ae 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -67,6 +67,8 @@ static boolean onground; +static boolean speccam = false; + // // P_Thrust // Moves the given origin along a given angle. @@ -2278,8 +2280,11 @@ static void P_MovePlayer(player_t *player) if (player->spectator) { P_SpectatorMovement(player); + speccam = true; return; } + else + speccam = false; ////////////////////// // MOVEMENT CODE // @@ -3521,7 +3526,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall num = 0; } - if (thiscam->freecam || player->spectator) + if (thiscam->freecam || (player->spectator && speccam == true)) { P_DemoCameraMovement(thiscam, num); return true; -- 2.54.0 From f7ca8fb9436d6b37aa572491358c7bbe67e14ced Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 03:28:21 +0100 Subject: [PATCH 044/325] add speccam playerflag the other thing was weird and dumb lol --- src/d_player.h | 2 ++ src/p_mobj.c | 6 ++++++ src/p_user.c | 10 ++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 140a4a748..a34094572 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -538,6 +538,8 @@ typedef struct player_s INT32 awayviewtics; angle_t awayviewaiming; // Used for cut-away view + boolean speccam; + boolean spectator; UINT8 bot; diff --git a/src/p_mobj.c b/src/p_mobj.c index bdf6b1a93..35f0b9883 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10618,7 +10618,10 @@ void P_SpawnPlayer(INT32 playernum) if (multiplayer && demo.playback) ; // Don't mess with spectator values since the demo setup handles them already. else if (!G_GametypeHasSpectators()) + { p->spectator = false; + p->speccam = false; + } else if (netgame && p->jointime <= 1 && pcount) { p->spectator = true; @@ -10650,7 +10653,10 @@ void P_SpawnPlayer(INT32 playernum) SendNetXCmd(XD_TEAMCHANGE, &usvalue, sizeof(usvalue)); } else // Otherwise, never spectator. + { p->spectator = false; + p->speccam = false; + } } if (G_GametypeHasTeams()) diff --git a/src/p_user.c b/src/p_user.c index e160068ae..168de782a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -67,8 +67,6 @@ static boolean onground; -static boolean speccam = false; - // // P_Thrust // Moves the given origin along a given angle. @@ -2279,12 +2277,10 @@ static void P_MovePlayer(player_t *player) if (player->spectator) { + player->speccam = true; P_SpectatorMovement(player); - speccam = true; return; } - else - speccam = false; ////////////////////// // MOVEMENT CODE // @@ -3526,7 +3522,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall num = 0; } - if (thiscam->freecam || (player->spectator && speccam == true)) + if (thiscam->freecam || (player->spectator && player->speccam == true)) { P_DemoCameraMovement(thiscam, num); return true; @@ -4098,6 +4094,7 @@ boolean P_SpectatorJoinGame(player_t *player) player->mo = NULL; } player->spectator = false; + player->speccam = false; player->pflags &= ~PF_WANTSTOJOIN; player->kartstuff[k_spectatewait] = 0; player->ctfteam = changeto; @@ -4126,6 +4123,7 @@ boolean P_SpectatorJoinGame(player_t *player) player->mo = NULL; } player->spectator = false; + player->speccam = false; player->pflags &= ~PF_WANTSTOJOIN; player->kartstuff[k_spectatewait] = 0; player->playerstate = PST_REBORN; -- 2.54.0 From 854cb7ee49dc6e1c0cf2b458fc8ec6879a43f7f4 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 05:21:25 +0100 Subject: [PATCH 045/325] this doesent work for us --- src/p_user.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 168de782a..29eeb585a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3362,13 +3362,13 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) } // if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"") - if (cmd->buttons & BT_ATTACK) + // well this only really works in replays for us, since we still move our spec player around which causes displayplayer to be the spec player + if (demo.playback) { - lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. - - // dont chase after your spectator self - if (!lastp->spectator) + if (cmd->buttons & BT_ATTACK) { + lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. + const fixed_t dist = R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); cam->aiming = R_PointToAngle2(0, cam->z, dist, lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads. -- 2.54.0 From a7a6e9edfca72029ada5d8b2d9b128014fc86388 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 17:07:41 +0100 Subject: [PATCH 046/325] move camera noclip stuff into its own function its not used in kart anyways and moving it makes crap more readable --- src/p_user.c | 406 ++++++++++++++++++++++++++------------------------- 1 file changed, 208 insertions(+), 198 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 29eeb585a..2bc50d2e0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3479,6 +3479,212 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) while (!P_MoveChaseCamera(player,thiscam,true) && ++tries < 2*TICRATE); } +#ifndef NOCLIPCAM // Disable all z-clipping for noclip cam +static boolean P_CheckNoclipCameraPosition(player_t *player, camera_t *thiscam, fixed_t x, fixed_t y, fixed_t z, boolean resetcalled) +{ + subsector_t *newsubsec; + boolean cameranoclip; + mobj_t *mo = player->mo; + + cameranoclip = ((player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) + || (mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)) // Noclipping player camera noclips too!! + || (leveltime < introtime)); // Kart intro cam + + // move camera down to move under lower ceilings + newsubsec = R_IsPointInSubsector(((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1), ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1)); + + if (!newsubsec) + newsubsec = thiscam->subsector; + + if (newsubsec) + { + fixed_t myfloorz, myceilingz; + fixed_t midz = thiscam->z + (thiscam->z - mo->z)/2; + fixed_t midx = ((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1); + fixed_t midy = ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1); + + // Cameras use the heightsec's heights rather then the actual sector heights. + // If you can see through it, why not move the camera through it too? + if (newsubsec->sector->camsec >= 0) + { + myfloorz = sectors[newsubsec->sector->camsec].floorheight; + myceilingz = sectors[newsubsec->sector->camsec].ceilingheight; + } + else if (newsubsec->sector->heightsec >= 0) + { + myfloorz = sectors[newsubsec->sector->heightsec].floorheight; + myceilingz = sectors[newsubsec->sector->heightsec].ceilingheight; + } + else + { + myfloorz = P_CameraGetFloorZ(thiscam, newsubsec->sector, midx, midy, NULL); + myceilingz = P_CameraGetCeilingZ(thiscam, newsubsec->sector, midx, midy, NULL); + } + + // Check list of fake floors and see if floorz/ceilingz need to be altered. + if (newsubsec->sector->ffloors) + { + ffloor_t *rover; + fixed_t delta1, delta2; + INT32 thingtop = midz + thiscam->height; + + for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + continue; + + topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + + delta1 = midz - (bottomheight + + ((topheight - bottomheight)/2)); + delta2 = thingtop - (bottomheight + + ((topheight - bottomheight)/2)); + if (topheight > myfloorz && abs(delta1) < abs(delta2)) + myfloorz = topheight; + if (bottomheight < myceilingz && abs(delta1) >= abs(delta2)) + myceilingz = bottomheight; + } + } + + // Check polyobjects and see if floorz/ceilingz need to be altered + { + INT32 xl, xh, yl, yh, bx, by; + validcount++; + + xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT; + xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT; + yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT; + yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT; + + BMBOUNDFIX(xl, xh, yl, yh); + + for (by = yl; by <= yh; by++) + { + for (bx = xl; bx <= xh; bx++) + { + INT32 offset; + polymaplink_t *plink; // haleyjd 02/22/06 + + if (bx < 0 || by < 0 || bx >= bmapwidth || by >= bmapheight) + continue; + + offset = by*bmapwidth + bx; + + // haleyjd 02/22/06: consider polyobject lines + plink = polyblocklinks[offset]; + + while (plink) + { + polyobj_t *po = plink->po; + + if (po->validcount != validcount) // if polyobj hasn't been checked + { + sector_t *polysec; + fixed_t delta1, delta2, thingtop; + fixed_t polytop, polybottom; + + po->validcount = validcount; + + if (!P_PointInsidePolyobj(po, x, y) || !(po->flags & POF_SOLID)) + { + plink = (polymaplink_t *)(plink->link.next); + continue; + } + + // We're inside it! Yess... + polysec = po->lines[0]->backsector; + + if (GETSECSPECIAL(polysec->special, 4) == 12) + { // Camera noclip polyobj. + plink = (polymaplink_t *)(plink->link.next); + continue; + } + + if (po->flags & POF_CLIPPLANES) + { + polytop = polysec->ceilingheight; + polybottom = polysec->floorheight; + } + else + { + polytop = INT32_MAX; + polybottom = INT32_MIN; + } + + thingtop = midz + thiscam->height; + delta1 = midz - (polybottom + ((polytop - polybottom)/2)); + delta2 = thingtop - (polybottom + ((polytop - polybottom)/2)); + + if (polytop > myfloorz && abs(delta1) < abs(delta2)) + myfloorz = polytop; + + if (polybottom < myceilingz && abs(delta1) >= abs(delta2)) + myceilingz = polybottom; + } + plink = (polymaplink_t *)(plink->link.next); + } + } + } + } + + // crushed camera + if (myceilingz <= myfloorz + thiscam->height && !resetcalled && !cameranoclip) + { + P_ResetCamera(player, thiscam); + return true; + } + + // camera fit? + if (myceilingz != myfloorz + && myceilingz - thiscam->height < z) + { + z = myceilingz - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); + // is the camera fit is there own sector + } + + // Make the camera a tad smarter with 3d floors + if (newsubsec->sector->ffloors && !cameranoclip) + { + ffloor_t *rover; + + for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + if ((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + { + topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); + + if (bottomheight - thiscam->height < z + && midz < bottomheight) + z = bottomheight - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); + + else if (topheight + thiscam->height > z + && midz > topheight) + z = topheight; + + if ((mo->z >= topheight && midz < bottomheight) + || ((mo->z < bottomheight && mo->z+mo->height < topheight) && midz >= topheight)) + { + // Can't see + if (!resetcalled) + P_ResetCamera(player, thiscam); + return true; + } + } + } + } + } + + if (thiscam->z < thiscam->floorz && !cameranoclip) + thiscam->z = thiscam->floorz; + + return false; +} +#endif + boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled) { static boolean lookbackactive[MAXSPLITSCREENPLAYERS]; @@ -3492,10 +3698,6 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall UINT8 timeover; mobj_t *mo; fixed_t f1, f2; -#ifndef NOCLIPCAM - boolean cameranoclip; - subsector_t *newsubsec; -#endif // We probably shouldn't move the camera if there is no player or player mobj somehow if (!player || !player->mo) @@ -3554,12 +3756,6 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall mo = player->mo; -#ifndef NOCLIPCAM - cameranoclip = ((player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) - || (mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)) // Noclipping player camera noclips too!! - || (leveltime < introtime)); // Kart intro cam -#endif - if (player->pflags & PF_TIMEOVER) // 1 for momentum keep, 2 for turnaround timeover = (player->kartstuff[k_timeovercam] > 2*TICRATE ? 2 : 1); else @@ -3745,194 +3941,8 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall z = mo->z + pviewheight + camheight; #ifndef NOCLIPCAM // Disable all z-clipping for noclip cam - // move camera down to move under lower ceilings - newsubsec = R_IsPointInSubsector(((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1), ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1)); - - if (!newsubsec) - newsubsec = thiscam->subsector; - - if (newsubsec) - { - fixed_t myfloorz, myceilingz; - fixed_t midz = thiscam->z + (thiscam->z - mo->z)/2; - fixed_t midx = ((mo->x>>FRACBITS) + (thiscam->x>>FRACBITS))<<(FRACBITS-1); - fixed_t midy = ((mo->y>>FRACBITS) + (thiscam->y>>FRACBITS))<<(FRACBITS-1); - - // Cameras use the heightsec's heights rather then the actual sector heights. - // If you can see through it, why not move the camera through it too? - if (newsubsec->sector->camsec >= 0) - { - myfloorz = sectors[newsubsec->sector->camsec].floorheight; - myceilingz = sectors[newsubsec->sector->camsec].ceilingheight; - } - else if (newsubsec->sector->heightsec >= 0) - { - myfloorz = sectors[newsubsec->sector->heightsec].floorheight; - myceilingz = sectors[newsubsec->sector->heightsec].ceilingheight; - } - else - { - myfloorz = P_CameraGetFloorZ(thiscam, newsubsec->sector, midx, midy, NULL); - myceilingz = P_CameraGetCeilingZ(thiscam, newsubsec->sector, midx, midy, NULL); - } - - // Check list of fake floors and see if floorz/ceilingz need to be altered. - if (newsubsec->sector->ffloors) - { - ffloor_t *rover; - fixed_t delta1, delta2; - INT32 thingtop = midz + thiscam->height; - - for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) - continue; - - topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - - delta1 = midz - (bottomheight - + ((topheight - bottomheight)/2)); - delta2 = thingtop - (bottomheight - + ((topheight - bottomheight)/2)); - if (topheight > myfloorz && abs(delta1) < abs(delta2)) - myfloorz = topheight; - if (bottomheight < myceilingz && abs(delta1) >= abs(delta2)) - myceilingz = bottomheight; - } - } - - // Check polyobjects and see if floorz/ceilingz need to be altered - { - INT32 xl, xh, yl, yh, bx, by; - validcount++; - - xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT; - xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT; - yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT; - yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT; - - BMBOUNDFIX(xl, xh, yl, yh); - - for (by = yl; by <= yh; by++) - for (bx = xl; bx <= xh; bx++) - { - INT32 offset; - polymaplink_t *plink; // haleyjd 02/22/06 - - if (bx < 0 || by < 0 || bx >= bmapwidth || by >= bmapheight) - continue; - - offset = by*bmapwidth + bx; - - // haleyjd 02/22/06: consider polyobject lines - plink = polyblocklinks[offset]; - - while (plink) - { - polyobj_t *po = plink->po; - - if (po->validcount != validcount) // if polyobj hasn't been checked - { - sector_t *polysec; - fixed_t delta1, delta2, thingtop; - fixed_t polytop, polybottom; - - po->validcount = validcount; - - if (!P_PointInsidePolyobj(po, x, y) || !(po->flags & POF_SOLID)) - { - plink = (polymaplink_t *)(plink->link.next); - continue; - } - - // We're inside it! Yess... - polysec = po->lines[0]->backsector; - - if (GETSECSPECIAL(polysec->special, 4) == 12) - { // Camera noclip polyobj. - plink = (polymaplink_t *)(plink->link.next); - continue; - } - - if (po->flags & POF_CLIPPLANES) - { - polytop = polysec->ceilingheight; - polybottom = polysec->floorheight; - } - else - { - polytop = INT32_MAX; - polybottom = INT32_MIN; - } - - thingtop = midz + thiscam->height; - delta1 = midz - (polybottom + ((polytop - polybottom)/2)); - delta2 = thingtop - (polybottom + ((polytop - polybottom)/2)); - - if (polytop > myfloorz && abs(delta1) < abs(delta2)) - myfloorz = polytop; - - if (polybottom < myceilingz && abs(delta1) >= abs(delta2)) - myceilingz = polybottom; - } - plink = (polymaplink_t *)(plink->link.next); - } - } - } - - // crushed camera - if (myceilingz <= myfloorz + thiscam->height && !resetcalled && !cameranoclip) - { - P_ResetCamera(player, thiscam); - return true; - } - - // camera fit? - if (myceilingz != myfloorz - && myceilingz - thiscam->height < z) - { - z = myceilingz - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); - // is the camera fit is there own sector - } - - // Make the camera a tad smarter with 3d floors - if (newsubsec->sector->ffloors && !cameranoclip) - { - ffloor_t *rover; - - for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - if ((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) - { - topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); - - if (bottomheight - thiscam->height < z - && midz < bottomheight) - z = bottomheight - thiscam->height-FixedMul(11*FRACUNIT, mo->scale); - - else if (topheight + thiscam->height > z - && midz > topheight) - z = topheight; - - if ((mo->z >= topheight && midz < bottomheight) - || ((mo->z < bottomheight && mo->z+mo->height < topheight) && midz >= topheight)) - { - // Can't see - if (!resetcalled) - P_ResetCamera(player, thiscam); - return true; - } - } - } - } - } - - if (thiscam->z < thiscam->floorz && !cameranoclip) - thiscam->z = thiscam->floorz; + if (P_CheckNoclipCameraPosition(player, thiscam, x, y, z, resetcalled)) + return true; #endif // NOCLIPCAM // point viewed by the camera -- 2.54.0 From 3388d35fe0ac9801a2f3835d403e142d87a5c70a Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 16:40:43 +0100 Subject: [PATCH 047/325] fix encore mirroring not applyingg to freecam/democam --- src/p_user.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index 2bc50d2e0..1919cc007 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3317,6 +3317,9 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) const UINT8 forplayer = num+1; boolean moving = false; + if (encoremode) + players[displayplayers[num]].postimgflags |= POSTIMG_MIRROR; + cam->localangle = cam->angle; cam->localaiming = cam->aiming; -- 2.54.0 From 01b942e1fcecedc1f671abf78197e1bac678bdaf Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 06:47:04 +0100 Subject: [PATCH 048/325] giga shizo spec synch "fix" ok so, for whatever dumb reason, spectatormovement will desynch at random, even on localhost. with this we just literally fucking ignore almost every button input locally and just wont move our spectator player at all. but since we are indeed still runiing specatotr movement code, and this is localcmd shit, the server just thinks we dont want to move and thus is "synchsave". sadly this does not fix desynchs from vanilla players the only code we keep is for button inputs that do certain actions like "item" so we can still join from spec with it and other crap --- src/g_game.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/p_user.c | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 385b7b6cf..59ff420cd 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -905,6 +905,46 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) break; } + if (player->spectator) + { + axis = JoyAxis(AXISMOVE, ssplayer); + if (InputDown(gc_accelerate, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_ACCELERATE; + axis = JoyAxis(AXISBRAKE, ssplayer); + if (InputDown(gc_brake, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_BRAKE; + axis = JoyAxis(AXISFIRE, ssplayer); + if (InputDown(gc_fire, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_ATTACK; + + // drift with any button/key + axis = JoyAxis(AXISDRIFT, ssplayer); + if (InputDown(gc_drift, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_DRIFT; + + // Lua scriptable buttons + axis = JoyAxis(AXISCUSTOM1, ssplayer); + if (InputDown(gc_custom1, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_CUSTOM1; + axis = JoyAxis(AXISCUSTOM2, ssplayer); + if (InputDown(gc_custom2, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_CUSTOM2; + axis = JoyAxis(AXISCUSTOM3, ssplayer); + if (InputDown(gc_custom3, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_CUSTOM3; + + // Reset camera + if (InputDown(gc_camreset, ssplayer)) + { + if (thiscam->chase && !rd) + P_ResetCamera(player, thiscam); + rd = true; + } + else + rd = false; + return; + } + // why build a ticcmd if we're paused? // Or, for that matter, if we're being reborn. // Kart, don't build a ticcmd if someone is resynching or the server is stopped too so we don't fly off course in bad conditions diff --git a/src/p_user.c b/src/p_user.c index 1919cc007..19a25513b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2109,7 +2109,7 @@ static void P_SpectatorMovement(player_t *player) { ticcmd_t *cmd = &player->cmd; - player->mo->angle = (cmd->angleturn<<16 /* not FRACBITS */); + player->mo->angle = (angle_t)(cmd->angleturn<<16 /* not FRACBITS */); ticruned++; if (!(cmd->angleturn & TICCMD_RECEIVED)) -- 2.54.0 From 7de32c74e6befb1df1b5efc6262336380e65c7f5 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 16:44:30 +0100 Subject: [PATCH 049/325] move spectator hack after pause/desynch code this should take priority over everything --- src/g_game.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 59ff420cd..51ce128e8 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -905,6 +905,17 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) break; } + // why build a ticcmd if we're paused? + // Or, for that matter, if we're being reborn. + // Kart, don't build a ticcmd if someone is resynching or the server is stopped too so we don't fly off course in bad conditions + if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN) || hu_resynching) + { + cmd->angleturn = (INT16)(lang >> 16); + cmd->aiming = G_ClipAimingPitch(&laim); + return; + } + + // lmfao this is beyond hellish if (player->spectator) { axis = JoyAxis(AXISMOVE, ssplayer); @@ -942,16 +953,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) } else rd = false; - return; - } - // why build a ticcmd if we're paused? - // Or, for that matter, if we're being reborn. - // Kart, don't build a ticcmd if someone is resynching or the server is stopped too so we don't fly off course in bad conditions - if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN) || hu_resynching) - { - cmd->angleturn = (INT16)(lang >> 16); - cmd->aiming = G_ClipAimingPitch(&laim); return; } -- 2.54.0 From 45237c9298da97046a4e29b313055e645e7fdd93 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 16:54:54 +0100 Subject: [PATCH 050/325] fix unitialised use of controller stuff --- src/g_game.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 51ce128e8..5c033e74e 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -918,6 +918,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // lmfao this is beyond hellish if (player->spectator) { + usejoystick = (analogjoystickmove || gamepadjoystickmove); + axis = JoyAxis(AXISMOVE, ssplayer); if (InputDown(gc_accelerate, ssplayer) || (usejoystick && axis > 0)) cmd->buttons |= BT_ACCELERATE; -- 2.54.0 From 575e46c3db9047b70ed19498b3e1ef2558afd41f Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 2 Jan 2025 16:55:20 +0100 Subject: [PATCH 051/325] let playercmd lua hook run during "spectator" input crap lmao --- src/g_game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 5c033e74e..bfa265030 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -956,6 +956,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else rd = false; + if (gamestate == GS_LEVEL) + LUA_HookTiccmd(player, cmd, HOOK(PlayerCmd)); + return; } -- 2.54.0 From ba4329e623c2774ba07f3ffe3c049662c53a0b34 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 01:18:30 +0100 Subject: [PATCH 052/325] add another local ticcmd builder so it can guess if we "moved" and put us into freecam state and shit --- src/d_player.h | 2 - src/g_game.c | 108 ++++++++++++++++++++++++++++++++----------------- src/p_mobj.c | 2 - src/p_user.c | 21 ++++------ 4 files changed, 79 insertions(+), 54 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index a34094572..140a4a748 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -538,8 +538,6 @@ typedef struct player_s INT32 awayviewtics; angle_t awayviewaiming; // Used for cut-away view - boolean speccam; - boolean spectator; UINT8 bot; diff --git a/src/g_game.c b/src/g_game.c index bfa265030..7968e1f5f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -850,6 +850,76 @@ static fixed_t forwardmove[2] = {25<>16, 50<>16}; static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn +// this is absolutely awful +// but we need this if we dont want spectators to move but be able to go to freecam from watching someone +static void G_BuildLocalTiccmd(UINT8 ssplayer) +{ + const UINT8 forplayer = ssplayer-1; + boolean forward, side, axis; //i + boolean usejoystick; + boolean turnleft, turnright; + + ticcmd_t *cmd = D_LocalTiccmd(forplayer); + + const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle; + const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle; + + usejoystick = (analogjoystickmove || gamepadjoystickmove); + + turnright = InputDown(gc_turnright, ssplayer); + turnleft = InputDown(gc_turnleft, ssplayer); + + axis = JoyAxis(AXISTURN, ssplayer); + + if (gamepadjoystickmove && axis != 0) + { + turnright = turnright || (axis > 0); + turnleft = turnleft || (axis < 0); + } + side = (turnright || turnleft || (analogjoystickmove && axis != 0)); + + forward = false; + axis = JoyAxis(AXISAIM, ssplayer); + if (InputDown(gc_aimforward, ssplayer) || (usejoystick && axis < 0)) + forward = true; + if (InputDown(gc_aimbackward, ssplayer) || (usejoystick && axis > 0)) + forward = true; + + axis = JoyAxis(AXISMOVE, ssplayer); + if (InputDown(gc_accelerate, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_ACCELERATE; + axis = JoyAxis(AXISBRAKE, ssplayer); + if (InputDown(gc_brake, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_BRAKE; + axis = JoyAxis(AXISFIRE, ssplayer); + if (InputDown(gc_fire, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_ATTACK; + + // drift with any button/key + axis = JoyAxis(AXISDRIFT, ssplayer); + if (InputDown(gc_drift, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_DRIFT; + + // Lua scriptable buttons + axis = JoyAxis(AXISCUSTOM1, ssplayer); + if (InputDown(gc_custom1, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_CUSTOM1; + axis = JoyAxis(AXISCUSTOM2, ssplayer); + if (InputDown(gc_custom2, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_CUSTOM2; + axis = JoyAxis(AXISCUSTOM3, ssplayer); + if (InputDown(gc_custom3, ssplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_CUSTOM3; + + //Reset away view if a command is given. + if ((forward || side || cmd->buttons) + && displayplayers[0] != consoleplayer && ssplayer == 1) + { + displayplayers[0] = consoleplayer; + G_FixCamera(1); + } +} + void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { const UINT8 forplayer = ssplayer-1; @@ -918,43 +988,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // lmfao this is beyond hellish if (player->spectator) { - usejoystick = (analogjoystickmove || gamepadjoystickmove); - - axis = JoyAxis(AXISMOVE, ssplayer); - if (InputDown(gc_accelerate, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_ACCELERATE; - axis = JoyAxis(AXISBRAKE, ssplayer); - if (InputDown(gc_brake, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_BRAKE; - axis = JoyAxis(AXISFIRE, ssplayer); - if (InputDown(gc_fire, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_ATTACK; - - // drift with any button/key - axis = JoyAxis(AXISDRIFT, ssplayer); - if (InputDown(gc_drift, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_DRIFT; - - // Lua scriptable buttons - axis = JoyAxis(AXISCUSTOM1, ssplayer); - if (InputDown(gc_custom1, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_CUSTOM1; - axis = JoyAxis(AXISCUSTOM2, ssplayer); - if (InputDown(gc_custom2, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_CUSTOM2; - axis = JoyAxis(AXISCUSTOM3, ssplayer); - if (InputDown(gc_custom3, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_CUSTOM3; - - // Reset camera - if (InputDown(gc_camreset, ssplayer)) - { - if (thiscam->chase && !rd) - P_ResetCamera(player, thiscam); - rd = true; - } - else - rd = false; + G_BuildLocalTiccmd(ssplayer); if (gamestate == GS_LEVEL) LUA_HookTiccmd(player, cmd, HOOK(PlayerCmd)); diff --git a/src/p_mobj.c b/src/p_mobj.c index 35f0b9883..b46c542a0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10620,7 +10620,6 @@ void P_SpawnPlayer(INT32 playernum) else if (!G_GametypeHasSpectators()) { p->spectator = false; - p->speccam = false; } else if (netgame && p->jointime <= 1 && pcount) { @@ -10655,7 +10654,6 @@ void P_SpawnPlayer(INT32 playernum) else // Otherwise, never spectator. { p->spectator = false; - p->speccam = false; } } diff --git a/src/p_user.c b/src/p_user.c index 19a25513b..6f4b2c471 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2275,9 +2275,9 @@ static void P_MovePlayer(player_t *player) } } + // have to keep this crap for synch reasons if (player->spectator) { - player->speccam = true; P_SpectatorMovement(player); return; } @@ -3366,17 +3366,14 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"") // well this only really works in replays for us, since we still move our spec player around which causes displayplayer to be the spec player - if (demo.playback) + if (cmd->buttons & BT_ATTACK) { - if (cmd->buttons & BT_ATTACK) - { - lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. + lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. - const fixed_t dist = R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); - cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); - cam->aiming = R_PointToAngle2(0, cam->z, dist, lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads. - cam->reset_aiming = false; - } + const fixed_t dist = R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); + cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); + cam->aiming = R_PointToAngle2(0, cam->z, dist, lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads. + cam->reset_aiming = false; } if (cmd->forwardmove != 0) @@ -3727,7 +3724,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall num = 0; } - if (thiscam->freecam || (player->spectator && player->speccam == true)) + if (thiscam->freecam || player->spectator) { P_DemoCameraMovement(thiscam, num); return true; @@ -4107,7 +4104,6 @@ boolean P_SpectatorJoinGame(player_t *player) player->mo = NULL; } player->spectator = false; - player->speccam = false; player->pflags &= ~PF_WANTSTOJOIN; player->kartstuff[k_spectatewait] = 0; player->ctfteam = changeto; @@ -4136,7 +4132,6 @@ boolean P_SpectatorJoinGame(player_t *player) player->mo = NULL; } player->spectator = false; - player->speccam = false; player->pflags &= ~PF_WANTSTOJOIN; player->kartstuff[k_spectatewait] = 0; player->playerstate = PST_REBORN; -- 2.54.0 From caa09cbcfbcafc539609e69e457bff3a1c04d68e Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 07:01:04 +0100 Subject: [PATCH 053/325] try and clean up this mess + fix cam angle being wrong when you switch to freecam from viewing someone --- src/g_game.c | 94 ++++++++++++++++++---------------------------------- 1 file changed, 33 insertions(+), 61 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 7968e1f5f..207513fd7 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -834,14 +834,6 @@ boolean InputDown(INT32 gc, UINT8 p) } } -// -// G_BuildTiccmd -// Builds a ticcmd from all of the available inputs -// or reads it from the demo buffer. -// If recording a demo, write it out -// -// set secondaryplayer true to build player 2's ticcmd in splitscreen mode -// INT32 localaiming[MAXSPLITSCREENPLAYERS]; angle_t localangle[MAXSPLITSCREENPLAYERS]; boolean camspin[MAXSPLITSCREENPLAYERS]; @@ -852,79 +844,59 @@ static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // this is absolutely awful // but we need this if we dont want spectators to move but be able to go to freecam from watching someone -static void G_BuildLocalTiccmd(UINT8 ssplayer) +static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer) { - const UINT8 forplayer = ssplayer-1; - boolean forward, side, axis; //i - boolean usejoystick; - boolean turnleft, turnright; - - ticcmd_t *cmd = D_LocalTiccmd(forplayer); - - const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle; - const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle; - - usejoystick = (analogjoystickmove || gamepadjoystickmove); - - turnright = InputDown(gc_turnright, ssplayer); - turnleft = InputDown(gc_turnleft, ssplayer); + boolean forward = false; + INT32 axis = 0; + const UINT8 forplayer = (ssplayer-1); + const boolean usejoystick = (cv_usejoystick[forplayer].value); + boolean turn = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer)); axis = JoyAxis(AXISTURN, ssplayer); + boolean side = (turn || (usejoystick && axis != 0)); - if (gamepadjoystickmove && axis != 0) - { - turnright = turnright || (axis > 0); - turnleft = turnleft || (axis < 0); - } - side = (turnright || turnleft || (analogjoystickmove && axis != 0)); - - forward = false; axis = JoyAxis(AXISAIM, ssplayer); if (InputDown(gc_aimforward, ssplayer) || (usejoystick && axis < 0)) forward = true; if (InputDown(gc_aimbackward, ssplayer) || (usejoystick && axis > 0)) forward = true; - axis = JoyAxis(AXISMOVE, ssplayer); - if (InputDown(gc_accelerate, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_ACCELERATE; - axis = JoyAxis(AXISBRAKE, ssplayer); - if (InputDown(gc_brake, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_BRAKE; - axis = JoyAxis(AXISFIRE, ssplayer); - if (InputDown(gc_fire, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_ATTACK; + // check for inputs and return button commands + // for stuff like joining with item button, etc. +#define CHECKINPUT(button, AXIS, buttflag) \ + axis = JoyAxis(AXIS, ssplayer); \ + if (InputDown(button, ssplayer) || (usejoystick && axis > 0)) cmd->buttons |= buttflag; - // drift with any button/key - axis = JoyAxis(AXISDRIFT, ssplayer); - if (InputDown(gc_drift, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_DRIFT; + CHECKINPUT(gc_accelerate, AXISMOVE, BT_ACCELERATE); + CHECKINPUT(gc_brake, AXISBRAKE, BT_BRAKE); + CHECKINPUT(gc_fire, AXISFIRE, BT_ATTACK); + CHECKINPUT(gc_drift, AXISDRIFT, BT_DRIFT); + CHECKINPUT(gc_custom1, AXISCUSTOM1, BT_CUSTOM1); + CHECKINPUT(gc_custom2, AXISCUSTOM2, BT_CUSTOM2); + CHECKINPUT(gc_custom3, AXISCUSTOM3, BT_CUSTOM3); - // Lua scriptable buttons - axis = JoyAxis(AXISCUSTOM1, ssplayer); - if (InputDown(gc_custom1, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_CUSTOM1; - axis = JoyAxis(AXISCUSTOM2, ssplayer); - if (InputDown(gc_custom2, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_CUSTOM2; - axis = JoyAxis(AXISCUSTOM3, ssplayer); - if (InputDown(gc_custom3, ssplayer) || (usejoystick && axis > 0)) - cmd->buttons |= BT_CUSTOM3; +#undef CHECKINPUT - //Reset away view if a command is given. + // Reset to our spec player if we watch someone else. if ((forward || side || cmd->buttons) && displayplayers[0] != consoleplayer && ssplayer == 1) { displayplayers[0] = consoleplayer; - G_FixCamera(1); + R_ResetViewInterpolation(0); } } +// +// G_BuildTiccmd +// Builds a ticcmd from all of the available inputs +// or reads it from the demo buffer. +// If recording a demo, write it out +// void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { - const UINT8 forplayer = ssplayer-1; - INT32 laim, th, tspeed, forward, side, axis; //i - const INT32 speed = 1; + const UINT8 forplayer = (ssplayer-1); + INT32 laim, th, tspeed, forward, side, axis; + // these ones used for multiple conditions boolean turnleft, turnright, mouseaiming; boolean invertmouse, usejoystick, kbl, rd; @@ -988,7 +960,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // lmfao this is beyond hellish if (player->spectator) { - G_BuildLocalTiccmd(ssplayer); + G_BuildLocalTiccmd(cmd, ssplayer); if (gamestate == GS_LEVEL) LUA_HookTiccmd(player, cmd, HOOK(PlayerCmd)); @@ -1048,7 +1020,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (th < SLOWTURNTICS) tspeed = cv_turnsmooth.value == 2 ? 2 : 0; // slow turn else - tspeed = speed; + tspeed = 1; cmd->driftturn = 0; -- 2.54.0 From 64a2fe141060f29eb40e85470a684dece9802277 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 07:33:28 +0100 Subject: [PATCH 054/325] clean shit up even more + fix cam aiming reset dont really care about which input anyways. --- src/g_game.c | 17 ++++++----------- src/p_user.c | 9 ++++++--- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 207513fd7..ad14a83f6 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -846,20 +846,14 @@ static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // but we need this if we dont want spectators to move but be able to go to freecam from watching someone static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer) { - boolean forward = false; + boolean moveinput = false; INT32 axis = 0; const UINT8 forplayer = (ssplayer-1); const boolean usejoystick = (cv_usejoystick[forplayer].value); - boolean turn = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer)); - axis = JoyAxis(AXISTURN, ssplayer); - boolean side = (turn || (usejoystick && axis != 0)); - - axis = JoyAxis(AXISAIM, ssplayer); - if (InputDown(gc_aimforward, ssplayer) || (usejoystick && axis < 0)) - forward = true; - if (InputDown(gc_aimbackward, ssplayer) || (usejoystick && axis > 0)) - forward = true; + moveinput = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer) + || InputDown(gc_aimforward, ssplayer) || InputDown(gc_aimbackward, ssplayer) || + (usejoystick && JoyAxis(AXISAIM, ssplayer) != 0) || (usejoystick && JoyAxis(AXISTURN, ssplayer) != 0)); // check for inputs and return button commands // for stuff like joining with item button, etc. @@ -878,11 +872,12 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer) #undef CHECKINPUT // Reset to our spec player if we watch someone else. - if ((forward || side || cmd->buttons) + if ((moveinput || cmd->buttons) && displayplayers[0] != consoleplayer && ssplayer == 1) { displayplayers[0] = consoleplayer; R_ResetViewInterpolation(0); + camera[0].reset_aiming = true; } } diff --git a/src/p_user.c b/src/p_user.c index 6f4b2c471..9182001c6 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3144,7 +3144,9 @@ void P_ToggleDemoCamera(UINT8 viewnum) // dont let freecam be toggled when in spec lel if (players[displayplayers[viewnum]].spectator) + { return; + } if (!cam->freecam) // toggle on { @@ -3328,13 +3330,14 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // let centerview work proper if (InputDown(gc_centerview, forplayer)) + { cam->aiming = 0; + cam->reset_aiming = false; + } if (cmd->aiming != 0) { cam->aiming = cmd->aiming << FRACBITS; - - cam->reset_aiming = false; } cam->angle = cmd->angleturn << 16; @@ -3366,7 +3369,7 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"") // well this only really works in replays for us, since we still move our spec player around which causes displayplayer to be the spec player - if (cmd->buttons & BT_ATTACK) + if (cam->freecam && cmd->buttons & BT_ATTACK) { lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. -- 2.54.0 From 2e1120dc5010f674b39eed9a1b0fe3ae69f094c4 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 18:18:20 +0100 Subject: [PATCH 055/325] move postimg flags to camera struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - also dont let water and heat be applied on top of each other since it does not look good (water postimg takes priority over heat) - also save a little time in opengl splitscreen since it does not support heat or wöter effects --- src/d_main.c | 2 +- src/d_player.h | 2 - src/hardware/hw_main.c | 23 ++++-- src/hardware/hw_main.h | 2 +- src/hardware/hw_portal.c | 4 +- src/p_local.h | 3 + src/p_mobj.c | 36 ++++----- src/p_user.c | 158 +++++++++++++++++++++------------------ src/v_video.c | 45 +++++------ src/v_video.h | 2 +- 10 files changed, 151 insertions(+), 126 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index a46ba11c0..dc464b0d6 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -517,7 +517,7 @@ static boolean D_Display(void) for (i = 0; i <= splitscreen; i++) { - V_DoPostProcessor(i, &players[displayplayers[i]], postimgparam[i]); + V_DoPostProcessor(i, postimgparam[i]); } } diff --git a/src/d_player.h b/src/d_player.h index 140a4a748..6ddca1622 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -412,8 +412,6 @@ typedef struct player_s // See pflags_t, above. pflags_t pflags; - UINT16 postimgflags; - // playing animation. panim_t panim; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 638b450a2..7bbad95b3 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5133,8 +5133,11 @@ static void HWR_SetTransformAiming(FTransform *trans) trans->anglex = (float)(gl_aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); } -void HWR_SetTransform(float fpov, player_t *player) +void HWR_SetTransform(float fpov) { + UINT8 viewnum = R_GetViewNumber(); + camera_t *thiscam = &camera[viewnum]; + gl_viewx = FIXED_TO_FLOAT(viewx); gl_viewy = FIXED_TO_FLOAT(viewy); gl_viewz = FIXED_TO_FLOAT(viewz); @@ -5164,15 +5167,15 @@ void HWR_SetTransform(float fpov, player_t *player) atransform.splitscreen = splitscreen; atransform.flip = false; - if ((player->postimgflags & POSTIMG_FLIP) && !(player->postimgflags & POSTIMG_MIRROR)) + if ((thiscam->postimg & POSTIMG_FLIP) && !(thiscam->postimg & POSTIMG_MIRROR)) atransform.flip = true; atransform.mirror = false; - if ((player->postimgflags & POSTIMG_MIRROR) && !(player->postimgflags & POSTIMG_FLIP)) + if ((thiscam->postimg & POSTIMG_MIRROR) && !(thiscam->postimg & POSTIMG_FLIP)) atransform.mirror = true; atransform.mirrorflip = false; - if ((player->postimgflags & POSTIMG_FLIP) && (player->postimgflags & POSTIMG_MIRROR)) + if ((thiscam->postimg & POSTIMG_FLIP) && (thiscam->postimg & POSTIMG_MIRROR)) atransform.mirrorflip = true; // Set transform. @@ -5239,7 +5242,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl // draw normal things in current frame in current incremented stencil buffer area HWR_SetStencilState(HWR_STENCIL_NORMAL, stencil_level); - HWR_SetTransform(fpov, player); + HWR_SetTransform(fpov); HWR_ClearSprites(); HWR_ClearClipper(); @@ -5296,7 +5299,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl HWR_DrawSkyBackground(); HWR_SetStencilState(HWR_STENCIL_NORMAL, 0); GL_ClearBuffer(false, false, true, 0);// clear skywall markings from the stencil buffer - HWR_SetTransform(fpov, player);// restore transform + HWR_SetTransform(fpov);// restore transform } gl_collect_skywalls = false; @@ -5745,8 +5748,12 @@ static void HWR_DoPostProcessor(player_t *player) if (splitscreen) // Not supported in splitscreen - someone want to add support? return; + //UINT8 viewnum = R_GetViewNumber(); // see above + //camera_t *thiscam = &camera[viewnum]; + camera_t *thiscam = &camera[0]; + // Drunken vision! WooOOooo~ - if (player->postimgflags & POSTIMG_WATER || player->postimgflags & POSTIMG_HEAT) + if (thiscam->postimg & POSTIMG_WATER || thiscam->postimg & POSTIMG_HEAT) { // 10 by 10 grid. 2 coordinates (xy) float v[SCREENVERTS][SCREENVERTS][2]; @@ -5758,7 +5765,7 @@ static void HWR_DoPostProcessor(player_t *player) INT32 FREQUENCY; // Modifies the wave. - if (player->postimgflags & POSTIMG_WATER) + if (thiscam->postimg & POSTIMG_WATER) { WAVELENGTH = 5; AMPLITUDE = 20; diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 52616b7e4..07c77ba98 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -108,7 +108,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl void HWR_ClearSkyDome(void); void HWR_BuildSkyDome(void); -void HWR_SetTransform(float fpov, player_t *player); +void HWR_SetTransform(float fpov); void HWR_ClearClipper(void); void HWR_SetStencilState(int state, int level); diff --git a/src/hardware/hw_portal.c b/src/hardware/hw_portal.c index f26e71331..2109fb851 100644 --- a/src/hardware/hw_portal.c +++ b/src/hardware/hw_portal.c @@ -160,7 +160,7 @@ static void HWR_RenderPortalSeg(gl_portal_t* portal, SINT8 state) void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, player_t *player, int stencil_level) { // draw portal seg to stencil buffer with increment - HWR_SetTransform(fpov, player); + HWR_SetTransform(fpov); HWR_ClearClipper(); HWR_SetStencilState(HWR_STENCIL_BEGIN, stencil_level); @@ -180,7 +180,7 @@ void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float } // remove portal seg from stencil buffer - HWR_SetTransform(fpov, player); + HWR_SetTransform(fpov); HWR_ClearClipper(); HWR_SetStencilState(HWR_STENCIL_REVERSE, stencil_level); diff --git a/src/p_local.h b/src/p_local.h index c2a2ee017..452b92dff 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -121,6 +121,9 @@ typedef struct camera_s // SRB2Kart: camera pans while drifting fixed_t pan; + + // postproccess effects + UINT16 postimg; } camera_t; extern camera_t camera[MAXSPLITSCREENPLAYERS]; diff --git a/src/p_mobj.c b/src/p_mobj.c index b46c542a0..5860d2137 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3235,13 +3235,20 @@ void P_DestroyRobots(void) static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) { const boolean flipcam = (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP); - UINT16 postimgflags = 0; - UINT8 i; + UINT16 postimgtype = 0; if (encoremode) - postimgflags |= POSTIMG_MIRROR; + postimgtype |= POSTIMG_MIRROR; if (flipcam) - postimgflags |= POSTIMG_FLIP; + postimgtype |= POSTIMG_FLIP; + +#ifdef HWRENDER + if (rendermode == render_opengl && splitscreen) + { + thiscam->postimg = postimgtype; + return; + } +#endif if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) // Camera must obviously exist { @@ -3256,27 +3263,20 @@ static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) // Are we in water? if (P_CameraCheckWater(&dummycam)) - postimgflags |= POSTIMG_WATER; - if (P_CameraCheckHeat(&dummycam)) - postimgflags |= POSTIMG_HEAT; + postimgtype |= POSTIMG_WATER; + else if (P_CameraCheckHeat(&dummycam)) + postimgtype |= POSTIMG_HEAT; } else { // Are we in water? if (P_CameraCheckWater(thiscam)) - postimgflags |= POSTIMG_WATER; - if (P_CameraCheckHeat(thiscam)) - postimgflags |= POSTIMG_HEAT; + postimgtype |= POSTIMG_WATER; + else if (P_CameraCheckHeat(thiscam)) + postimgtype |= POSTIMG_HEAT; } - for (i = 0; i <= splitscreen; i++) - { - if (player != &players[displayplayers[i]]) - continue; - - players[displayplayers[i]].postimgflags = postimgflags; - break; - } + thiscam->postimg = postimgtype; } // P_CameraThinker diff --git a/src/p_user.c b/src/p_user.c index 9182001c6..c6fac5c8d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3320,7 +3320,7 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) boolean moving = false; if (encoremode) - players[displayplayers[num]].postimgflags |= POSTIMG_MIRROR; + cam->postimg |= POSTIMG_MIRROR; cam->localangle = cam->angle; cam->localaiming = cam->aiming; @@ -4152,26 +4152,66 @@ boolean P_SpectatorJoinGame(player_t *player) return false; } -// the below is first person only, if you're curious. check out P_CalcChasePostImg in p_mobj.c for chasecam -static void P_CalcPostImg(player_t *player) +static boolean P_CameraCheckHeatFirstperson(player_t *player, sector_t *sector, fixed_t pviewheight) { - sector_t *sector = player->mo->subsector->sector; - INT16 typeflag = 0; - //INT32 *param; - fixed_t pviewheight; - UINT8 i; + if (P_FindSpecialLineFromTag(13, sector->tag, -1) != -1) + return true; - if (player->mo->eflags & MFE_VERTICALFLIP) - pviewheight = player->mo->z + player->mo->height - player->viewheight; - else - pviewheight = player->mo->z + player->viewheight; - - if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) + if (sector->ffloors) { - sector = player->awayviewmobj->subsector->sector; - pviewheight = player->awayviewmobj->z + 20*FRACUNIT; + ffloor_t *rover; + + for (rover = sector->ffloors; rover; rover = rover->next) + { + if (!(rover->flags & FF_EXISTS)) + continue; + + if (pviewheight >= P_GetFFloorTopZAt(rover, player->mo->x, player->mo->y)) + continue; + + if (pviewheight <= P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y)) + continue; + + if (P_FindSpecialLineFromTag(13, rover->master->frontsector->tag, -1) != -1) + return true; + } } + return false; +} + +static boolean P_CameraCheckWaterFirstperson(player_t *player, sector_t *sector, fixed_t pviewheight) +{ + if (sector->ffloors) + { + ffloor_t *rover; + + for (rover = sector->ffloors; rover; rover = rover->next) + { + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->flags & FF_BLOCKPLAYER) + continue; + + if (pviewheight >= P_GetFFloorTopZAt(rover, player->mo->x, player->mo->y)) + continue; + + if (pviewheight <= P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y)) + continue; + + return true; + } + } + + return false; +} + +// the below is first person only, if you're curious. check out P_CalcChasePostImg in p_mobj.c for chasecam +static void P_CalcPostImg(player_t *player, camera_t *thiscam) +{ + sector_t *sector = NULL; + INT16 postimgtype = 0; + //INT32 *param; + fixed_t pviewheight = 0; + /*for (i = 0; i <= splitscreen; i++) { if (player == &players[displayplayers[i]]) @@ -4181,79 +4221,55 @@ static void P_CalcPostImg(player_t *player) } }*/ - // see if we are in heat (no, not THAT kind of heat...) + if (encoremode) // srb2kart + postimgtype |= POSTIMG_MIRROR; - if (P_FindSpecialLineFromTag(13, sector->tag, -1) != -1) - typeflag |= POSTIMG_HEAT; - else if (sector->ffloors) + if (player->mo->eflags & MFE_VERTICALFLIP) + postimgtype |= POSTIMG_FLIP; + +#ifdef HWRENDER + if (rendermode == render_opengl && splitscreen) { - ffloor_t *rover; - fixed_t topheight; - fixed_t bottomheight; + thiscam->postimg = postimgtype; + return; + } +#endif - for (rover = sector->ffloors; rover; rover = rover->next) + sector = player->mo->subsector->sector; + + if (sector->ffloors) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + pviewheight = player->mo->z + player->mo->height - player->viewheight; + else + pviewheight = player->mo->z + player->viewheight; + + if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) { - if (!(rover->flags & FF_EXISTS)) - continue; - - topheight = *rover->t_slope ? P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y) : *rover->topheight; - bottomheight = *rover->b_slope ? P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y) : *rover->bottomheight; - - if (pviewheight >= topheight || pviewheight <= bottomheight) - continue; - - if (P_FindSpecialLineFromTag(13, rover->master->frontsector->tag, -1) != -1) - typeflag |= POSTIMG_HEAT; + sector = player->awayviewmobj->subsector->sector; + pviewheight = player->awayviewmobj->z + 20*FRACUNIT; } } // see if we are in water (water trumps heat) - if (sector->ffloors) - { - ffloor_t *rover; - fixed_t topheight; - fixed_t bottomheight; - - for (rover = sector->ffloors; rover; rover = rover->next) - { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->flags & FF_BLOCKPLAYER) - continue; - - topheight = *rover->t_slope ? P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y) : *rover->topheight; - bottomheight = *rover->b_slope ? P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y) : *rover->bottomheight; - - if (pviewheight >= topheight || pviewheight <= bottomheight) - continue; - - typeflag |= POSTIMG_WATER; - } - } - - if (encoremode) // srb2kart - typeflag |= POSTIMG_MIRROR; - - if (player->mo->eflags & MFE_VERTICALFLIP) - typeflag |= POSTIMG_FLIP; + if (P_CameraCheckWaterFirstperson(player, sector, pviewheight)) + postimgtype |= POSTIMG_WATER; + // see if we are in heat (no, not THAT kind of heat...) + else if (P_CameraCheckHeatFirstperson(player, sector, pviewheight)) + postimgtype |= POSTIMG_HEAT; // Motion blur // unused /*if (player->speed > (35<speed - 32)/4; if (*param > 5) *param = 5; }*/ - for (i = 0; i <= splitscreen; i++) - { - if (player != &players[displayplayers[i]]) - continue; - - players[displayplayers[i]].postimgflags = typeflag; - break; - } + thiscam->postimg = postimgtype; } void P_DoTimeOver(player_t *player) @@ -5038,7 +5054,7 @@ void P_PlayerAfterThink(player_t *player) if (!thiscam->chase) // bob view only if looking through the player's eyes { P_CalcHeight(player); - P_CalcPostImg(player); + P_CalcPostImg(player, thiscam); } else { diff --git a/src/v_video.c b/src/v_video.c index 987a40a03..da2b0677a 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -3175,7 +3175,7 @@ INT32 heatindex[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; // Perform a particular image postprocessing function. // -void V_DoPostProcessor(INT32 view, player_t *player, INT32 param) +void V_DoPostProcessor(INT32 view, INT32 param) { #if NUMSCREENS < 5 // do not enable image post processing for ARM, SH and MIPS CPUs @@ -3194,7 +3194,9 @@ void V_DoPostProcessor(INT32 view, player_t *player, INT32 param) if (view < 0 || view > 3 || view > splitscreen) return; - if (!player->postimgflags) + camera_t *thiscam = &camera[view]; + + if (!thiscam->postimg) return; if ((view == 1 && splitscreen == 1) || view >= 2) @@ -3210,7 +3212,7 @@ void V_DoPostProcessor(INT32 view, player_t *player, INT32 param) UINT8 *tmpscr = screens[4]; UINT8 *srcscr = screens[0]; - if (player->postimgflags & POSTIMG_WATER) + if (thiscam->postimg & POSTIMG_WATER) { INT32 y; // Set disStart to a range from 0 to FINEANGLE, incrementing by 128 per tic @@ -3269,22 +3271,7 @@ void V_DoPostProcessor(INT32 view, player_t *player, INT32 param) tmpscr = srcscr; srcscr = tmp; } - - /*if (player->postimgflags & POSTIMG_MOTION) // Motion Blur! - { - INT32 x, y; - - // TODO: Add a postimg_param so that we can pick the translucency level... - UINT8 *transme = transtables + ((param-1)<postimgflags & POSTIMG_HEAT) // Heat wave + else if (thiscam->postimg & POSTIMG_HEAT) // Heat wave { INT32 y; @@ -3331,7 +3318,21 @@ void V_DoPostProcessor(INT32 view, player_t *player, INT32 param) srcscr = tmp; } - if ((player->postimgflags & POSTIMG_FLIP) && !(player->postimgflags & POSTIMG_MIRROR)) // Flip the screen upside-down + /*if (thiscam->postimg & POSTIMG_MOTION) // Motion Blur! + { + INT32 x, y; + + // TODO: Add a postimg_param so that we can pick the translucency level... + UINT8 *transme = transtables + ((param-1)<postimg & POSTIMG_FLIP) && !(thiscam->postimg & POSTIMG_MIRROR)) // Flip the screen upside-down { INT32 y, y2; @@ -3342,7 +3343,7 @@ void V_DoPostProcessor(INT32 view, player_t *player, INT32 param) tmpscr = srcscr; srcscr = tmp; } - else if ((player->postimgflags & POSTIMG_MIRROR) && !(player->postimgflags & POSTIMG_FLIP)) // Flip the screen on the x axis + else if ((thiscam->postimg & POSTIMG_MIRROR) && !(thiscam->postimg & POSTIMG_FLIP)) // Flip the screen on the x axis { INT32 y, x, x2; @@ -3354,7 +3355,7 @@ void V_DoPostProcessor(INT32 view, player_t *player, INT32 param) tmpscr = srcscr; srcscr = tmp; } - else if ((player->postimgflags & POSTIMG_MIRROR) && (player->postimgflags & POSTIMG_FLIP)) // Flip the screen upside-down and on the x axis + else if ((thiscam->postimg & POSTIMG_MIRROR) && (thiscam->postimg & POSTIMG_FLIP)) // Flip the screen upside-down and on the x axis { INT32 y, x; diff --git a/src/v_video.h b/src/v_video.h index dfab7dfde..2513825c2 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -256,7 +256,7 @@ char V_GetSkincolorChar(INT32 color); typedef struct player_s player_t; -void V_DoPostProcessor(INT32 view, player_t *player, INT32 param); +void V_DoPostProcessor(INT32 view, INT32 param); void V_DrawPatchFill(patch_t *pat); -- 2.54.0 From 7d47834e55d6295056415537556721dc9ec6a953 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 18:29:21 +0100 Subject: [PATCH 056/325] oops smol error --- src/p_user.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index c6fac5c8d..e7f8ea009 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4237,18 +4237,15 @@ static void P_CalcPostImg(player_t *player, camera_t *thiscam) sector = player->mo->subsector->sector; - if (sector->ffloors) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - pviewheight = player->mo->z + player->mo->height - player->viewheight; - else - pviewheight = player->mo->z + player->viewheight; + if (player->mo->eflags & MFE_VERTICALFLIP) + pviewheight = player->mo->z + player->mo->height - player->viewheight; + else + pviewheight = player->mo->z + player->viewheight; - if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) - { - sector = player->awayviewmobj->subsector->sector; - pviewheight = player->awayviewmobj->z + 20*FRACUNIT; - } + if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) + { + sector = player->awayviewmobj->subsector->sector; + pviewheight = player->awayviewmobj->z + 20*FRACUNIT; } // see if we are in water (water trumps heat) -- 2.54.0 From f9b107153964876844702aa9281109c1533be5f6 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 3 Jan 2025 19:35:29 +0100 Subject: [PATCH 057/325] simplify this --- src/g_game.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index ad14a83f6..2dae7dfbf 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -848,8 +848,7 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer) { boolean moveinput = false; INT32 axis = 0; - const UINT8 forplayer = (ssplayer-1); - const boolean usejoystick = (cv_usejoystick[forplayer].value); + const boolean usejoystick = (cv_usejoystick[(ssplayer-1)].value); moveinput = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer) || InputDown(gc_aimforward, ssplayer) || InputDown(gc_aimbackward, ssplayer) || @@ -914,8 +913,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else player = &players[displayplayers[forplayer]]; - if (ssplayer == 2) - thiscam = (player->bot == 2 ? &camera[0] : &camera[forplayer]); + if ((ssplayer == 2) && (player->bot == 2)) + thiscam = &camera[0]; else thiscam = &camera[forplayer]; -- 2.54.0 From 8cb7396f33cff00000e0236f10f136096ea22f4d Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 4 Jan 2025 01:53:44 +0100 Subject: [PATCH 058/325] check for consoleplayer since displayplayer is who youre watching --- src/p_user.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index e7f8ea009..03cf054d9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3142,9 +3142,11 @@ void P_ToggleDemoCamera(UINT8 viewnum) { camera_t *cam = &camera[viewnum]; - // dont let freecam be toggled when in spec lel - if (players[displayplayers[viewnum]].spectator) + // dont toggle freecam when in spec + // special case since only non splitscreen can change viewpoints + if ((!splitscreen && players[consoleplayer].spectator) || players[displayplayers[viewnum]].spectator) { + cam->freecam = false; return; } -- 2.54.0 From 338bcf0d2d8e38c21d68c650be6ac065a1bc17f3 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 4 Jan 2025 01:54:32 +0100 Subject: [PATCH 059/325] forgor about lookback ig --- src/g_game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 2dae7dfbf..cd96729fc 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -870,6 +870,9 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer) #undef CHECKINPUT + axis = JoyAxis(AXISLOOKBACK, ssplayer); + camspin[ssplayer-1] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0)); + // Reset to our spec player if we watch someone else. if ((moveinput || cmd->buttons) && displayplayers[0] != consoleplayer && ssplayer == 1) -- 2.54.0 From f512a080513669e15e36dc5c00122f87a102e643 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 4 Jan 2025 19:33:43 +0100 Subject: [PATCH 060/325] dont do this while not in replay this is kinda awkward tbh, but its useful for replay stuff --- src/p_user.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 03cf054d9..e5c1c86b2 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3370,8 +3370,8 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) } // if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"") - // well this only really works in replays for us, since we still move our spec player around which causes displayplayer to be the spec player - if (cam->freecam && cmd->buttons & BT_ATTACK) + // this feels kinda pointless for ingame freecam so keep it for replays only + if (demo.playback && cmd->buttons & BT_ATTACK) { lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. -- 2.54.0 From 2f4a113685bea06fbe512bd4dd0a757f15e7715b Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 4 Jan 2025 19:37:52 +0100 Subject: [PATCH 061/325] more hAx: dont move player during freecam state besides hop and honk useful if you wanna take pics and dont feel like driving away --- src/g_game.c | 38 +++++++++++++++++++++++++------------- src/p_user.c | 11 +++++++---- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index cd96729fc..861c09497 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -842,34 +842,45 @@ static fixed_t forwardmove[2] = {25<>16, 50<>16}; static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn -// this is absolutely awful -// but we need this if we dont want spectators to move but be able to go to freecam from watching someone -static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer) +// +// G_BuildLocalTiccmd +// extremely basic cut down ticcmd builder +// for spectator and freecam +// this does not make the player move at all but keeps important things working +// +static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam) { boolean moveinput = false; INT32 axis = 0; const boolean usejoystick = (cv_usejoystick[(ssplayer-1)].value); - moveinput = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer) - || InputDown(gc_aimforward, ssplayer) || InputDown(gc_aimbackward, ssplayer) || - (usejoystick && JoyAxis(AXISAIM, ssplayer) != 0) || (usejoystick && JoyAxis(AXISTURN, ssplayer) != 0)); - // check for inputs and return button commands - // for stuff like joining with item button, etc. + // for stuff like joining with item button, saltyhop, honking, etc. #define CHECKINPUT(button, AXIS, buttflag) \ axis = JoyAxis(AXIS, ssplayer); \ if (InputDown(button, ssplayer) || (usejoystick && axis > 0)) cmd->buttons |= buttflag; - CHECKINPUT(gc_accelerate, AXISMOVE, BT_ACCELERATE); - CHECKINPUT(gc_brake, AXISBRAKE, BT_BRAKE); CHECKINPUT(gc_fire, AXISFIRE, BT_ATTACK); CHECKINPUT(gc_drift, AXISDRIFT, BT_DRIFT); CHECKINPUT(gc_custom1, AXISCUSTOM1, BT_CUSTOM1); CHECKINPUT(gc_custom2, AXISCUSTOM2, BT_CUSTOM2); CHECKINPUT(gc_custom3, AXISCUSTOM3, BT_CUSTOM3); + // we dont need the rest of this if were in freecam state + if (freecam) + { + return; + } + + CHECKINPUT(gc_accelerate, AXISMOVE, BT_ACCELERATE); + CHECKINPUT(gc_brake, AXISBRAKE, BT_BRAKE); + #undef CHECKINPUT + moveinput = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer) + || InputDown(gc_aimforward, ssplayer) || InputDown(gc_aimbackward, ssplayer) || + (usejoystick && JoyAxis(AXISAIM, ssplayer) != 0) || (usejoystick && JoyAxis(AXISTURN, ssplayer) != 0)); + axis = JoyAxis(AXISLOOKBACK, ssplayer); camspin[ssplayer-1] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0)); @@ -954,11 +965,12 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) return; } - // lmfao this is beyond hellish - if (player->spectator) + // dumbass thing so we can use a few buttons but dont accidentally drive away + if (player->spectator || camera[forplayer].freecam) { - G_BuildLocalTiccmd(cmd, ssplayer); + G_BuildLocalTiccmd(cmd, ssplayer, !player->spectator); + // let lua override everything if (gamestate == GS_LEVEL) LUA_HookTiccmd(player, cmd, HOOK(PlayerCmd)); diff --git a/src/p_user.c b/src/p_user.c index e5c1c86b2..ca2616461 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3155,6 +3155,12 @@ void P_ToggleDemoCamera(UINT8 viewnum) cam->freecam = true; cam->button_a_held = 2; cam->reset_aiming = true; + + // get rid of some hud elements + if (displayplayers[0] != consoleplayer) + { + displayplayers[0] = consoleplayer; + } } else // toggle off { @@ -3255,13 +3261,10 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) if (InputDown(gc_aimbackward, forplayer) || (usejoystick && axis > 0)) forward -= forwardmove[1]; - // fire with any button/key axis = JoyAxis(AXISFIRE, forplayer); - if (InputDown(gc_fire, 1) || (usejoystick && axis > 0)) + if (InputDown(gc_fire, forplayer) || (usejoystick && axis > 0)) cmd->buttons |= BT_ATTACK; - // spectator aiming shit, ahhhh... - // looking up/down laim += (mlooky<<19); -- 2.54.0 From 5c8b318a937c2cc1f2c74a2b8278a1d3ba3bbaa7 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 4 Jan 2025 21:03:22 +0100 Subject: [PATCH 062/325] make float and sink use accel and brake again but also keep rebindable controls keeps intended behaviour since we now dont need to worry about player controls anymore but keeps the rebindable buttons incase someone wants to do a crazy control setup for some reason --- src/g_input.c | 6 ------ src/p_user.c | 10 +++++++++- src/st_stuff.c | 26 ++++++++++++++------------ 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index b99874b8d..c948ed751 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1142,12 +1142,6 @@ void G_Controldefault(UINT8 player) //gamecontrol[gc_screenshot ][1] = KEY_HAT1+1; // D-Pad Down // absolutely fucking NOT gamecontrol[gc_talkkey ][1] = KEY_HAT1+1; // D-Pad Down gamecontrol[gc_scores ][1] = KEY_HAT1+0; // D-Pad Up - - gamecontrol[gc_camfloat ][0] = 'a'; - gamecontrol[gc_camsink ][0] = 'd'; - - gamecontrol[gc_camfloat ][1] = KEY_JOY1+0; // A - gamecontrol[gc_camsink ][1] = KEY_JOY1+1; // B } if (player == 0 || player == 2) diff --git a/src/p_user.c b/src/p_user.c index 45889d327..a2b6b01c8 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3261,6 +3261,14 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) if (InputDown(gc_fire, forplayer) || (usejoystick && axis > 0)) cmd->buttons |= BT_ATTACK; + // float and sink + axis = JoyAxis(AXISMOVE, forplayer); + if (InputDown(gc_accelerate, forplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_ACCELERATE; + axis = JoyAxis(AXISBRAKE, forplayer); + if (InputDown(gc_brake, forplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_BRAKE; + // looking up/down laim += (mlooky<<19); @@ -3347,7 +3355,7 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) if (!cam->button_a_held) { fixed_t spd = 32*mapobjectscale*cv_freecam_speed.value; - int dir = ((InputDown(gc_camfloat, forplayer)) ? 1 : 0) + ((InputDown(gc_camsink, forplayer)) ? -1 : 0); + int dir = ((cmd->buttons & BT_ACCELERATE || InputDown(gc_camfloat, forplayer)) ? 1 : 0) + ((cmd->buttons & BT_BRAKE || InputDown(gc_camsink, forplayer)) ? -1 : 0); switch (dir) { diff --git a/src/st_stuff.c b/src/st_stuff.c index 6f0777919..527d7af76 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -651,16 +651,18 @@ static void ST_drawLevelTitle(void) V_DrawLevelTitle(ttlnumxpos+12, bary+6, V_SNAPTOBOTTOM, actnum); } -static const char *ST_GetButtonName(INT32 control, const char *inputtext) +// returns the actual button name for any gamecontrol +// if unbound is set, it returns "Unbound" as a string should there be no button bound to a gamecontrol +static const char *ST_GetButtonName(INT32 control, const char *inputtext, boolean unbound) { - static char buttname[32] = {0}; // Static buffer - const char *item1 = gamecontrol[control][0] != 0 ? G_KeynumToString(gamecontrol[control][0]) : NULL; - const char *item2 = gamecontrol[control][1] != 0 ? G_KeynumToString(gamecontrol[control][1]) : NULL; + static char buttname[32] = {0}; + const char *butt1 = (gamecontrol[control][0] != 0 ? G_KeynumToString(gamecontrol[control][0]) : NULL); + const char *butt2 = (gamecontrol[control][1] != 0 ? G_KeynumToString(gamecontrol[control][1]) : NULL); // alternative bind - if (item1 != NULL && item2 != NULL) - snprintf(buttname, 32, "%s/%s - %s", item1, item2, inputtext); + if (butt1 != NULL && butt2 != NULL) + snprintf(buttname, 32, "%s/%s - %s", butt1, butt2, inputtext); else - snprintf(buttname, 32, "%s - %s", item1 != NULL ? item1 : item2 != NULL ? item2 : "Not Bound", inputtext); + snprintf(buttname, 32, (unbound ? "%s - %s" : "- %s - %s"), (butt1 != NULL ? butt1 : butt2 != NULL ? butt2 : unbound ? "Unbound" : ""), inputtext); return buttname; } @@ -789,16 +791,16 @@ static void ST_overlayDrawer(void) { V_DrawString(2, BASEVIDHEIGHT-50, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camfloat, "Float")); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camsink, "Sink")); - V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_director, "Toggle Director")); + V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false))); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false))); + V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_director, "Toggle Director", true)); } else { V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camfloat, "Float")); - V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camsink, "Sink")); + V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false))); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false))); } } } -- 2.54.0 From e53c6bb4da0507a324ba367df41dd814c3878a83 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 4 Jan 2025 21:54:45 +0100 Subject: [PATCH 063/325] reduce ternary hell a little lel --- src/st_stuff.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index 527d7af76..523bbc44a 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -655,14 +655,16 @@ static void ST_drawLevelTitle(void) // if unbound is set, it returns "Unbound" as a string should there be no button bound to a gamecontrol static const char *ST_GetButtonName(INT32 control, const char *inputtext, boolean unbound) { - static char buttname[32] = {0}; + static char buttname[32] = ""; const char *butt1 = (gamecontrol[control][0] != 0 ? G_KeynumToString(gamecontrol[control][0]) : NULL); const char *butt2 = (gamecontrol[control][1] != 0 ? G_KeynumToString(gamecontrol[control][1]) : NULL); // alternative bind - if (butt1 != NULL && butt2 != NULL) + if (butt1 == NULL && butt2 == NULL) // not bound to a button + snprintf(buttname, 32, (unbound ? "%s - %s" : "- %s - %s"), (unbound ? "Unbound" : ""), inputtext); + else if (butt1 != NULL && butt2 != NULL) // bound to two buttons snprintf(buttname, 32, "%s/%s - %s", butt1, butt2, inputtext); - else - snprintf(buttname, 32, (unbound ? "%s - %s" : "- %s - %s"), (butt1 != NULL ? butt1 : butt2 != NULL ? butt2 : unbound ? "Unbound" : ""), inputtext); + else // bound to only one + snprintf(buttname, 32, "- %s - %s", (butt1 != NULL ? butt1 : butt2 != NULL ? butt2 : ""), inputtext); return buttname; } -- 2.54.0 From 077076532f3f701562d91a97dfcc84817749b299 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 14:17:44 +0100 Subject: [PATCH 064/325] slight cleanup buildticcmd --- src/g_game.c | 64 ++++------ src/p_maputl.c | 335 ++++++++++++++++++++++++++----------------------- 2 files changed, 201 insertions(+), 198 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index e76d0ef5f..00d3f861b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -898,36 +898,30 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam) // void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { - const UINT8 forplayer = (ssplayer-1); INT32 laim, th, tspeed, forward, side, axis; // these ones used for multiple conditions boolean turnleft, turnright, mouseaiming; boolean invertmouse, usejoystick, kbl, rd; - player_t *player; - camera_t *thiscam; angle_t lang; static INT32 turnheld[MAXSPLITSCREENPLAYERS]; // for accelerative turning static boolean keyboard_look[MAXSPLITSCREENPLAYERS]; // true if lookup/down using keyboard static boolean resetdown[MAXSPLITSCREENPLAYERS]; // don't cam reset every frame + if (demo.playback) + return; + + const UINT8 forplayer = (ssplayer-1); + player_t *player = ((ssplayer == 1) ? &players[consoleplayer] : &players[displayplayers[forplayer]]); + + camera_t *thiscam = &camera[forplayer]; + const boolean freecam = camera[forplayer].freecam; + const boolean lookaxis = cv_lookaxis[forplayer].value; const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle; const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle; - if (demo.playback) return; - - if (ssplayer == 1) - player = &players[consoleplayer]; - else - player = &players[displayplayers[forplayer]]; - - if ((ssplayer == 2) && (player->bot == 2)) - thiscam = &camera[0]; - else - thiscam = &camera[forplayer]; - lang = localangle[forplayer]; laim = localaiming[forplayer]; th = turnheld[forplayer]; @@ -938,16 +932,23 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { case 2: G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); + mouseaiming = player->spectator; + invertmouse = cv_invertmouse2.value; break; case 3: G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); + mouseaiming = false; + invertmouse = false; break; case 4: G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); + mouseaiming = false; + invertmouse = false; break; case 1: - default: G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver + mouseaiming = player->spectator; + invertmouse = cv_invertmouse.value; break; } @@ -962,9 +963,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) } // dumbass thing so we can use a few buttons but dont accidentally drive away - if (player->spectator || camera[forplayer].freecam) + if (player->spectator || freecam) { - G_BuildLocalTiccmd(cmd, ssplayer, !player->spectator); + G_BuildLocalTiccmd(cmd, ssplayer, freecam); // let lua override everything if (gamestate == GS_LEVEL) @@ -973,27 +974,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) return; } - switch (ssplayer) - { - case 2: - mouseaiming = player->spectator; //(PLAYER2INPUTDOWN(gc_mouseaiming)) ^ cv_alwaysfreelook2.value; - invertmouse = cv_invertmouse2.value; - break; - case 3: - mouseaiming = false; - invertmouse = false; - break; - case 4: - mouseaiming = false; - invertmouse = false; - break; - case 1: - default: - mouseaiming = player->spectator; //(PLAYER1INPUTDOWN(gc_mouseaiming)) ^ cv_alwaysfreelook.value; - invertmouse = cv_invertmouse.value; - break; - } - usejoystick = (analogjoystickmove || gamepadjoystickmove); turnright = InputDown(gc_turnright, ssplayer); turnleft = InputDown(gc_turnleft, ssplayer); @@ -1145,7 +1125,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) INT32 player_invert = invertmouse ? -1 : 1; INT32 screen_invert = (player->mo && (player->mo->eflags & MFE_VERTICALFLIP) - && (!thiscam->chase || player->pflags & PF_FLIPCAM)) //because chasecam's not inverted + && (!thiscam->chase || player->pflags & PF_FLIPCAM)) // because chasecam's not inverted ? -1 : 1; // set to -1 or 1 to multiply // mouse look stuff (mouse look is not the same as mouse aim) @@ -1260,8 +1240,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) LUA_HookTiccmd(player, cmd, HOOK(PlayerCmd)); //Reset away view if a command is given. - if ((cmd->forwardmove || cmd->sidemove || cmd->buttons) - && displayplayers[0] != consoleplayer && ssplayer == 1) + if (displayplayers[0] != consoleplayer && ssplayer == 1 + && (cmd->forwardmove || cmd->sidemove || cmd->buttons)) { displayplayers[0] = consoleplayer; G_FixCamera(1); diff --git a/src/p_maputl.c b/src/p_maputl.c index 3c91dc922..13dd85592 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -296,7 +296,7 @@ void P_CameraLineOpening(line_t *linedef) { frontfloor = sectors[front->camsec].floorheight; frontceiling = sectors[front->camsec].ceilingheight; - if (sectors[front->camsec].f_slope) // SRB2CBTODO: ESLOPE (sectors[front->heightsec].f_slope) + if (sectors[front->camsec].f_slope) frontfloor = P_GetZAt(sectors[front->camsec].f_slope, camera[0].x, camera[0].y); if (sectors[front->camsec].c_slope) frontceiling = P_GetZAt(sectors[front->camsec].c_slope, camera[0].x, camera[0].y); @@ -306,7 +306,7 @@ void P_CameraLineOpening(line_t *linedef) { frontfloor = sectors[front->heightsec].floorheight; frontceiling = sectors[front->heightsec].ceilingheight; - if (sectors[front->heightsec].f_slope) // SRB2CBTODO: ESLOPE (sectors[front->heightsec].f_slope) + if (sectors[front->heightsec].f_slope) frontfloor = P_GetZAt(sectors[front->heightsec].f_slope, camera[0].x, camera[0].y); if (sectors[front->heightsec].c_slope) frontceiling = P_GetZAt(sectors[front->heightsec].c_slope, camera[0].x, camera[0].y); @@ -316,11 +316,12 @@ void P_CameraLineOpening(line_t *linedef) frontfloor = P_CameraGetFloorZ(mapcampointer, front, tmx, tmy, linedef); frontceiling = P_CameraGetCeilingZ(mapcampointer, front, tmx, tmy, linedef); } + if (back->camsec >= 0) { backfloor = sectors[back->camsec].floorheight; backceiling = sectors[back->camsec].ceilingheight; - if (sectors[back->camsec].f_slope) // SRB2CBTODO: ESLOPE (sectors[front->heightsec].f_slope) + if (sectors[back->camsec].f_slope) frontfloor = P_GetZAt(sectors[back->camsec].f_slope, camera[0].x, camera[0].y); if (sectors[back->camsec].c_slope) frontceiling = P_GetZAt(sectors[back->camsec].c_slope, camera[0].x, camera[0].y); @@ -329,7 +330,7 @@ void P_CameraLineOpening(line_t *linedef) { backfloor = sectors[back->heightsec].floorheight; backceiling = sectors[back->heightsec].ceilingheight; - if (sectors[back->heightsec].f_slope) // SRB2CBTODO: ESLOPE (sectors[front->heightsec].f_slope) + if (sectors[back->heightsec].f_slope) frontfloor = P_GetZAt(sectors[back->heightsec].f_slope, camera[0].x, camera[0].y); if (sectors[back->heightsec].c_slope) frontceiling = P_GetZAt(sectors[back->heightsec].c_slope, camera[0].x, camera[0].y); @@ -340,104 +341,111 @@ void P_CameraLineOpening(line_t *linedef) backceiling = P_CameraGetCeilingZ(mapcampointer, back, tmx, tmy, linedef); } + fixed_t thingtop = mapcampointer->z + mapcampointer->height; + + if (frontceiling < backceiling) { - fixed_t thingtop = mapcampointer->z + mapcampointer->height; - - if (frontceiling < backceiling) - { - opentop = frontceiling; - highceiling = backceiling; - } - else - { - opentop = backceiling; - highceiling = frontceiling; - } - - if (frontfloor > backfloor) - { - openbottom = frontfloor; - lowfloor = backfloor; - } - else - { - openbottom = backfloor; - lowfloor = frontfloor; - } - - // Check for fake floors in the sector. - if (front->ffloors || back->ffloors) - { - ffloor_t *rover; - fixed_t highestceiling = highceiling; - fixed_t lowestceiling = opentop; - fixed_t highestfloor = openbottom; - fixed_t lowestfloor = lowfloor; - fixed_t delta1, delta2; - - // Check for frontsector's fake floors - if (front->ffloors) - for (rover = front->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) - continue; - - topheight = P_CameraGetFOFTopZ(mapcampointer, front, rover, tmx, tmy, linedef); - bottomheight = P_CameraGetFOFBottomZ(mapcampointer, front, rover, tmx, tmy, linedef); - - delta1 = abs(mapcampointer->z - (bottomheight + ((topheight - bottomheight)/2))); - delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2))); - if (bottomheight < lowestceiling && delta1 >= delta2) - lowestceiling = bottomheight; - else if (bottomheight < highestceiling && delta1 >= delta2) - highestceiling = bottomheight; - - if (topheight > highestfloor && delta1 < delta2) - highestfloor = topheight; - else if (topheight > lowestfloor && delta1 < delta2) - lowestfloor = topheight; - } - - // Check for backsectors fake floors - if (back->ffloors) - for (rover = back->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) - continue; - - topheight = P_CameraGetFOFTopZ(mapcampointer, back, rover, tmx, tmy, linedef); - bottomheight = P_CameraGetFOFBottomZ(mapcampointer, back, rover, tmx, tmy, linedef); - - delta1 = abs(mapcampointer->z - (bottomheight + ((topheight - bottomheight)/2))); - delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2))); - if (bottomheight < lowestceiling && delta1 >= delta2) - lowestceiling = bottomheight; - else if (bottomheight < highestceiling && delta1 >= delta2) - highestceiling = bottomheight; - - if (topheight > highestfloor && delta1 < delta2) - highestfloor = topheight; - else if (topheight > lowestfloor && delta1 < delta2) - lowestfloor = topheight; - } - - if (highestceiling < highceiling) - highceiling = highestceiling; - - if (highestfloor > openbottom) - openbottom = highestfloor; - - if (lowestceiling < opentop) - opentop = lowestceiling; - - if (lowestfloor > lowfloor) - lowfloor = lowestfloor; - } - openrange = opentop - openbottom; - return; + opentop = frontceiling; + highceiling = backceiling; } + else + { + opentop = backceiling; + highceiling = frontceiling; + } + + if (frontfloor > backfloor) + { + openbottom = frontfloor; + lowfloor = backfloor; + } + else + { + openbottom = backfloor; + lowfloor = frontfloor; + } + + // Check for fake floors in the sector. + if (front->ffloors || back->ffloors) + { + ffloor_t *rover; + fixed_t highestceiling = highceiling; + fixed_t lowestceiling = opentop; + fixed_t highestfloor = openbottom; + fixed_t lowestfloor = lowfloor; + fixed_t delta1, delta2; + + // Check for frontsector's fake floors + if (front->ffloors) + { + for (rover = front->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + continue; + + topheight = P_CameraGetFOFTopZ(mapcampointer, front, rover, tmx, tmy, linedef); + bottomheight = P_CameraGetFOFBottomZ(mapcampointer, front, rover, tmx, tmy, linedef); + + delta1 = abs(mapcampointer->z - (bottomheight + ((topheight - bottomheight)/2))); + delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2))); + + if (bottomheight < lowestceiling && delta1 >= delta2) + lowestceiling = bottomheight; + else if (bottomheight < highestceiling && delta1 >= delta2) + highestceiling = bottomheight; + + if (topheight > highestfloor && delta1 < delta2) + highestfloor = topheight; + else if (topheight > lowestfloor && delta1 < delta2) + lowestfloor = topheight; + } + } + + // Check for backsectors fake floors + if (back->ffloors) + { + for (rover = back->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + continue; + + topheight = P_CameraGetFOFTopZ(mapcampointer, back, rover, tmx, tmy, linedef); + bottomheight = P_CameraGetFOFBottomZ(mapcampointer, back, rover, tmx, tmy, linedef); + + delta1 = abs(mapcampointer->z - (bottomheight + ((topheight - bottomheight)/2))); + delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2))); + + if (bottomheight < lowestceiling && delta1 >= delta2) + lowestceiling = bottomheight; + else if (bottomheight < highestceiling && delta1 >= delta2) + highestceiling = bottomheight; + + if (topheight > highestfloor && delta1 < delta2) + highestfloor = topheight; + else if (topheight > lowestfloor && delta1 < delta2) + lowestfloor = topheight; + } + } + + if (highestceiling < highceiling) + highceiling = highestceiling; + + if (highestfloor > openbottom) + openbottom = highestfloor; + + if (lowestceiling < opentop) + opentop = lowestceiling; + + if (lowestfloor > lowfloor) + lowfloor = lowestfloor; + } + + openrange = opentop - openbottom; + return; } void P_LineOpening(line_t *linedef, mobj_t *mobj) @@ -466,40 +474,39 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) I_Assert(front != NULL); I_Assert(back != NULL); - { // Set open and high/low values here - fixed_t frontheight, backheight; + // Set open and high/low values here + fixed_t frontheight, backheight; - frontheight = P_GetCeilingZ(mobj, front, tmx, tmy, linedef); - backheight = P_GetCeilingZ(mobj, back, tmx, tmy, linedef); + frontheight = P_GetCeilingZ(mobj, front, tmx, tmy, linedef); + backheight = P_GetCeilingZ(mobj, back, tmx, tmy, linedef); - if (frontheight < backheight) - { - opentop = frontheight; - highceiling = backheight; - opentopslope = front->c_slope; - } - else - { - opentop = backheight; - highceiling = frontheight; - opentopslope = back->c_slope; - } + if (frontheight < backheight) + { + opentop = frontheight; + highceiling = backheight; + opentopslope = front->c_slope; + } + else + { + opentop = backheight; + highceiling = frontheight; + opentopslope = back->c_slope; + } - frontheight = P_GetFloorZ(mobj, front, tmx, tmy, linedef); - backheight = P_GetFloorZ(mobj, back, tmx, tmy, linedef); + frontheight = P_GetFloorZ(mobj, front, tmx, tmy, linedef); + backheight = P_GetFloorZ(mobj, back, tmx, tmy, linedef); - if (frontheight > backheight) - { - openbottom = frontheight; - lowfloor = backheight; - openbottomslope = front->f_slope; - } - else - { - openbottom = backheight; - lowfloor = frontheight; - openbottomslope = back->f_slope; - } + if (frontheight > backheight) + { + openbottom = frontheight; + lowfloor = backheight; + openbottomslope = front->f_slope; + } + else + { + openbottom = backheight; + lowfloor = frontheight; + openbottomslope = back->f_slope; } if (mobj) @@ -508,29 +515,33 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) // Check for collision with front side's midtexture if Effect 4 is set if (linedef->flags & ML_EFFECT4 - && !linedef->polyobj // don't do anything for polyobjects! ...for now - ) { + && !linedef->polyobj) // don't do anything for polyobjects! ...for now + { side_t *side = &sides[linedef->sidenum[0]]; fixed_t textop, texbottom, texheight; fixed_t texmid, delta1, delta2; INT32 texnum = R_GetTextureNum(side->midtexture); // make sure the texture is actually valid - if (texnum) { + if (texnum) + { // Get the midtexture's height texheight = textures[texnum]->height << FRACBITS; // Set texbottom and textop to the Z coordinates of the texture's boundaries + if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) // "infinite" repeat { - if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat - texbottom = openbottom + side->rowoffset; - textop = opentop + side->rowoffset; - } else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) { - texbottom = openbottom + side->rowoffset; - textop = texbottom + texheight*(side->repeatcnt+1); - } else { - textop = opentop + side->rowoffset; - texbottom = textop - texheight*(side->repeatcnt+1); - } + texbottom = openbottom + side->rowoffset; + textop = opentop + side->rowoffset; + } + else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) + { + texbottom = openbottom + side->rowoffset; + textop = texbottom + texheight*(side->repeatcnt+1); + } + else + { + textop = opentop + side->rowoffset; + texbottom = textop - texheight*(side->repeatcnt+1); } texmid = texbottom+(textop-texbottom)/2; @@ -538,10 +549,13 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) delta1 = abs(mobj->z - texmid); delta2 = abs(thingtop - texmid); - if (delta1 > delta2) { // Below + if (delta1 > delta2) // Below + { if (opentop > texbottom) opentop = texbottom; - } else { // Above + } + else // Above + { if (openbottom < textop) openbottom = textop; } @@ -549,9 +563,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) } // Check for fake floors in the sector. - if (front->ffloors || back->ffloors - || linedef->polyobj - ) + if (front->ffloors || back->ffloors || linedef->polyobj) { ffloor_t *rover; @@ -567,6 +579,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) for (rover = front->ffloors; rover; rover = rover->next) { fixed_t topheight, bottomheight; + if (!(rover->flags & FF_EXISTS)) continue; @@ -584,7 +597,8 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) if (delta1 >= delta2 && !(rover->flags & FF_PLATFORM)) // thing is below FOF { - if (bottomheight < lowestceiling) { + if (bottomheight < lowestceiling) + { lowestceiling = bottomheight; ceilingslope = *rover->b_slope; } @@ -594,7 +608,8 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) if (delta1 < delta2 && !(rover->flags & FF_REVERSEPLATFORM)) // thing is above FOF { - if (topheight > highestfloor) { + if (topheight > highestfloor) + { highestfloor = topheight; floorslope = *rover->t_slope; } @@ -624,7 +639,8 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) if (delta1 >= delta2 && !(rover->flags & FF_PLATFORM)) // thing is below FOF { - if (bottomheight < lowestceiling) { + if (bottomheight < lowestceiling) + { lowestceiling = bottomheight; ceilingslope = *rover->b_slope; } @@ -634,7 +650,8 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) if (delta1 < delta2 && !(rover->flags & FF_REVERSEPLATFORM)) // thing is above FOF { - if (topheight > highestfloor) { + if (topheight > highestfloor) + { highestfloor = topheight; floorslope = *rover->t_slope; } @@ -650,29 +667,35 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) delta1 = abs(mobj->z - (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight)/2))); delta2 = abs(thingtop - (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight)/2))); - if (polysec->floorheight < lowestceiling && delta1 >= delta2) { + + if (polysec->floorheight < lowestceiling && delta1 >= delta2) + { lowestceiling = polysec->floorheight; ceilingslope = NULL; } else if (polysec->floorheight < highestceiling && delta1 >= delta2) highestceiling = polysec->floorheight; - if (polysec->ceilingheight > highestfloor && delta1 < delta2) { + if (polysec->ceilingheight > highestfloor && delta1 < delta2) + { highestfloor = polysec->ceilingheight; floorslope = NULL; } else if (polysec->ceilingheight > lowestfloor && delta1 < delta2) lowestfloor = polysec->ceilingheight; } + if (highestceiling < highceiling) highceiling = highestceiling; - if (highestfloor > openbottom) { + if (highestfloor > openbottom) + { openbottom = highestfloor; openbottomslope = floorslope; } - if (lowestceiling < opentop) { + if (lowestceiling < opentop) + { opentop = lowestceiling; opentopslope = ceilingslope; } -- 2.54.0 From a90c51ec0fb182892edf5dbeff268de284f4ce2a Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 14:51:32 +0100 Subject: [PATCH 065/325] no u may be used uninitialised --- src/g_game.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_game.c b/src/g_game.c index 00d3f861b..47b975b92 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -946,6 +946,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) invertmouse = false; break; case 1: + default: G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver mouseaiming = player->spectator; invertmouse = cv_invertmouse.value; -- 2.54.0 From 1d8be20962a528966c641c8c87cea10adb2ef807 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 19:01:54 +0100 Subject: [PATCH 066/325] disable director while in replay freecam --- src/k_director.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_director.c b/src/k_director.c index 611c64701..eca7903f5 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -73,7 +73,7 @@ boolean K_DirectorIsAvailable(void) { if ((demo.playback && demo.title) || modeattacking) return false; - return ((gamestate == GS_LEVEL) && (demo.playback || (players[consoleplayer].spectator && !K_DirectorIsPlayerAlone()))); + return ((gamestate == GS_LEVEL) && ((demo.playback && !camera[0].freecam) || (players[consoleplayer].spectator && !K_DirectorIsPlayerAlone()))); } static boolean K_DirectorIsEnabled(void) -- 2.54.0 From c4c995a9a35c8fba364c067d822a249b87f0d029 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 5 Jan 2025 20:37:39 +0100 Subject: [PATCH 067/325] disable pause vhs effect when in freecam mode --- src/hu_stuff.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 6cbb46148..7097e36a2 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -26,6 +26,7 @@ #include "i_video.h" #include "i_system.h" +#include "r_fps.h" #include "st_stuff.h" // ST_HEIGHT #include "r_local.h" @@ -2231,7 +2232,7 @@ void HU_DrawSongCredits(void) // void HU_Drawer(void) { - if (cv_vhseffect.value && (paused || (demo.playback && cv_playbackspeed.value > 1))) + if (cv_vhseffect.value && ((paused && !camera[R_GetViewNumber()].freecam) || (demo.playback && cv_playbackspeed.value > 1))) V_DrawVhsEffect(demo.rewinding); #ifndef NONET -- 2.54.0 From 03259aeca0876c392875a2c780ea56bdb8717620 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 6 Jan 2025 22:02:34 +0100 Subject: [PATCH 068/325] let postimg stuff also apply to freecam --- src/p_local.h | 1 + src/p_mobj.c | 2 +- src/p_user.c | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/p_local.h b/src/p_local.h index 452b92dff..d330c8c34 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -156,6 +156,7 @@ void P_SlideCameraMove(camera_t *thiscam); boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); void P_ResetLocalCamAiming(player_t *player); void P_ToggleDemoCamera(UINT8 viewnum); +void P_CalcChasePostImg(player_t *player, camera_t *thiscam); boolean P_PlayerInPain(player_t *player); void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor); void P_ResetPlayer(player_t *player); diff --git a/src/p_mobj.c b/src/p_mobj.c index e69e9192b..46fb35f65 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3232,7 +3232,7 @@ void P_DestroyRobots(void) } // the below is chasecam only, if you're curious. check out P_CalcPostImg in p_user.c for first person -static void P_CalcChasePostImg(player_t *player, camera_t *thiscam) +void P_CalcChasePostImg(player_t *player, camera_t *thiscam) { const boolean flipcam = (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP); UINT16 postimgtype = 0; diff --git a/src/p_user.c b/src/p_user.c index a2b6b01c8..13750c594 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3739,6 +3739,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (thiscam->freecam || player->spectator) { P_DemoCameraMovement(thiscam, num); + P_CalcChasePostImg(player, thiscam); return true; } -- 2.54.0 From eff6b31ee8a40d03cae83f15784960545b75e7d8 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 6 Jan 2025 22:40:36 +0100 Subject: [PATCH 069/325] change director toggling handling - now not changable over console anymore, bind only! - it doesent save anymore so its always disabled at game start - moving while in spec state will disable director when active so stand still - disable it in splitscreen completely - only adjust view when toggling it on --- src/d_netcmd.c | 3 ++- src/g_game.c | 17 +++++------------ src/g_game.h | 2 -- src/k_director.c | 5 ++--- src/st_stuff.c | 3 +++ src/st_stuff.h | 2 ++ 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5156ed0c5..9b293aef6 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -572,7 +572,8 @@ static CV_PossibleValue_t ps_descriptor_cons_t[] = { {1, "Average"}, {2, "SD"}, {3, "Minimum"}, {4, "Maximum"}, {0, NULL}}; consvar_t cv_ps_descriptor = {"ps_descriptor", "Average", 0, ps_descriptor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_director = {"director", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +// only there to better keep track of it globally +consvar_t cv_director = {"director", "Off", CV_HIDEN, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartdebugdirector = {"debugdirector", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showdirectorhud = {"showdirectorhud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/g_game.c b/src/g_game.c index 47b975b92..1bcd9778c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -334,11 +334,6 @@ boolean precache = true; // if true, load all graphics at start INT16 prevmap, nextmap; -// save if director is enabled -// so demos can disable it by default and restore it after -static int directorstate = 0; -tic_t directortoggletimer = 0; - static CV_PossibleValue_t recordmultiplayerdemos_cons_t[] = {{0, "Disabled"}, {1, "Manual Save"}, {2, "Auto Save"}, {0, NULL}}; consvar_t cv_recordmultiplayerdemos = {"netdemo_record", "Manual Save", CV_SAVE, recordmultiplayerdemos_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -884,6 +879,9 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam) if ((moveinput || cmd->buttons) && displayplayers[0] != consoleplayer && ssplayer == 1) { + if (cv_director.value) + CV_SetValue(&cv_director, 0); + displayplayers[0] = consoleplayer; R_ResetViewInterpolation(0); camera[0].reset_aiming = true; @@ -7359,8 +7357,8 @@ post_compat: players[i].kartweight = kartweight[i]; } - directorstate = cv_director.value; - CV_SetValue(&cv_director, 0); + if (cv_director.value) + CV_SetValue(&cv_director, 0); demo.deferstart = true; } @@ -7925,11 +7923,6 @@ void G_StopDemo(void) { Z_Free(demobuf.buffer); demobuf.buffer = NULL; - if (demo.playback) - { - CV_SetValue(&cv_director, directorstate); - directorstate = 0; - } demo.playback = false; if (demo.title) modeattacking = false; diff --git a/src/g_game.h b/src/g_game.h index ba26cd507..10c2a6156 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -229,8 +229,6 @@ extern angle_t localangle[MAXSPLITSCREENPLAYERS]; extern INT32 localaiming[MAXSPLITSCREENPLAYERS]; // should be an angle_t but signed extern boolean camspin[MAXSPLITSCREENPLAYERS]; // SRB2Kart -extern tic_t directortoggletimer; - // // GAME // diff --git a/src/k_director.c b/src/k_director.c index eca7903f5..402f5d039 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -71,7 +71,7 @@ static fixed_t ScaleFromMap(fixed_t n, fixed_t scale) boolean K_DirectorIsAvailable(void) { - if ((demo.playback && demo.title) || modeattacking) + if (splitscreen || (demo.playback && demo.title) || modeattacking) return false; return ((gamestate == GS_LEVEL) && ((demo.playback && !camera[0].freecam) || (players[consoleplayer].spectator && !K_DirectorIsPlayerAlone()))); } @@ -422,10 +422,9 @@ void K_ToggleDirector(void) if (!K_DirectorIsAvailable()) return; - G_AdjustView(1, 1, true); - if (!K_DirectorIsEnabled()) { + G_AdjustView(1, 1, true); directorinfo.cooldown = 0; // switch immediately } diff --git a/src/st_stuff.c b/src/st_stuff.c index 523bbc44a..64e244b78 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -53,6 +53,9 @@ UINT16 objectsdrawn = 0; +// dumb fade thing for director toggle +tic_t directortoggletimer = 0; + // // STATUS BAR DATA // diff --git a/src/st_stuff.h b/src/st_stuff.h index 250db1e7f..d289e64ce 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -23,6 +23,8 @@ // STATUS BAR // +extern tic_t directortoggletimer; + // Called by main loop. void ST_Ticker(void); -- 2.54.0 From c8737bd43f35d7af2c5436d6afcaf9d3292043e3 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 6 Jan 2025 22:50:15 +0100 Subject: [PATCH 070/325] make this more complicated due to a "-" --- src/st_stuff.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index 64e244b78..d189e2c23 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -656,18 +656,19 @@ static void ST_drawLevelTitle(void) // returns the actual button name for any gamecontrol // if unbound is set, it returns "Unbound" as a string should there be no button bound to a gamecontrol -static const char *ST_GetButtonName(INT32 control, const char *inputtext, boolean unbound) +// if gamectrl is set, it adds an extra "-" for cases where theres also a hardcoded button like accelerate +static const char *ST_GetButtonName(INT32 control, const char *inputtext, boolean unbound, boolean gamectrl) { static char buttname[32] = ""; const char *butt1 = (gamecontrol[control][0] != 0 ? G_KeynumToString(gamecontrol[control][0]) : NULL); const char *butt2 = (gamecontrol[control][1] != 0 ? G_KeynumToString(gamecontrol[control][1]) : NULL); // alternative bind if (butt1 == NULL && butt2 == NULL) // not bound to a button - snprintf(buttname, 32, (unbound ? "%s - %s" : "- %s - %s"), (unbound ? "Unbound" : ""), inputtext); + snprintf(buttname, 32, (unbound ? "%s - %s" : (gamectrl ? "-%s - %s" : "%s - %s")), (unbound ? "Unbound" : ""), inputtext); else if (butt1 != NULL && butt2 != NULL) // bound to two buttons snprintf(buttname, 32, "%s/%s - %s", butt1, butt2, inputtext); else // bound to only one - snprintf(buttname, 32, "- %s - %s", (butt1 != NULL ? butt1 : butt2 != NULL ? butt2 : ""), inputtext); + snprintf(buttname, 32, (gamectrl ? "-%s - %s" : "%s - %s"), (butt1 != NULL ? butt1 : butt2 != NULL ? butt2 : ""), inputtext); return buttname; } @@ -796,16 +797,16 @@ static void ST_overlayDrawer(void) { V_DrawString(2, BASEVIDHEIGHT-50, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false))); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false))); - V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_director, "Toggle Director", true)); + V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false, true))); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false, true))); + V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_director, "Toggle Director", true, false)); } else { V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false))); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false))); + V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false, true))); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false, true))); } } } -- 2.54.0 From 03e45f459008315749cecc8a04c0c83be10ae039 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 16:28:38 +0100 Subject: [PATCH 071/325] check for cam subsector since we can move it around and i added this to freecam mode, subsector may be null for reason so better be safe than sorry --- src/p_mobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 46fb35f65..2b120b99c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3141,7 +3141,7 @@ static boolean P_CameraCheckHeat(camera_t *thiscam) sector_t *sector; fixed_t halfheight; - if (!thiscam) + if (!thiscam || !thiscam->subsector) return false; halfheight = thiscam->z + (thiscam->height >> 1); @@ -3179,7 +3179,7 @@ static boolean P_CameraCheckWater(camera_t *thiscam) sector_t *sector; fixed_t halfheight; - if (!thiscam) + if (!thiscam || !thiscam->subsector) return false; halfheight = thiscam->z + (thiscam->height >> 1); -- 2.54.0 From d41b6c185a1c0f296d45037eb26da165c3491d9c Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 18:47:12 +0100 Subject: [PATCH 072/325] fix freecam aim getting stuck and other issues - gamepads now aim like they used to and at same speed as keyboard - aim reset has been changed so it resets automatically, but also can be manually reset with centerview - aiming is locked during cam reset --- src/p_local.h | 2 + src/p_user.c | 126 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 82 insertions(+), 46 deletions(-) diff --git a/src/p_local.h b/src/p_local.h index d330c8c34..d80223531 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -81,6 +81,8 @@ typedef struct camera_s boolean chase; boolean freecam; + boolean keyboardlook; + angle_t localangle; INT32 localaiming; diff --git a/src/p_user.c b/src/p_user.c index 13750c594..0675808b0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3167,15 +3167,20 @@ void P_ToggleDemoCamera(UINT8 viewnum) static ticcmd_t cameracmd[MAXSPLITSCREENPLAYERS]; +#define intsign(n) \ + ((n) < 0 ? -1 : (n) > 0 ? 1 : 0) + static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) { INT32 laim, forward, side, axis; // these ones used for multiple conditions - boolean turnleft, turnright; - boolean usejoystick; + boolean turnleft, turnright, mouseaiming; + boolean invertmouse, usejoystick, kbl; angle_t lang; + INT32 player_invert; const UINT8 forplayer = num+1; + player_t *player = ((forplayer == 1) ? &players[consoleplayer] : &players[displayplayers[forplayer]]); memset(&cameracmd[num], 0, sizeof(ticcmd_t)); // initialize cmd @@ -3183,21 +3188,30 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) lang = cam->localangle; laim = cam->localaiming; + kbl = cam->keyboardlook; - switch (num) + switch (forplayer) { - case 1: - G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); - break; case 2: - G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); + G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); + mouseaiming = player->spectator; + invertmouse = cv_invertmouse2.value; break; case 3: - G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); + G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); + mouseaiming = false; + invertmouse = false; break; - case 0: + case 4: + G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); + mouseaiming = false; + invertmouse = false; + break; + case 1: default: G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver + mouseaiming = player->spectator; + invertmouse = cv_invertmouse.value; break; } @@ -3223,7 +3237,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) axis = -axis; } - if (gamepadjoystickmove && axis != 0) + if (usejoystick && axis != 0) { turnright = turnright || (axis > 0); turnleft = turnleft || (axis < 0); @@ -3242,13 +3256,6 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) side -= sidemove[1]; } - if (analogjoystickmove && axis != 0) - { - // JOYAXISRANGE should be 1023 (divide by 1024) - cmd->angleturn = (INT16)(cmd->angleturn - (((axis * angleturn[1]) >> 10))); // ANALOG! - side += ((axis * sidemove[0]) >> 10); - } - cmd->angleturn = (INT16)(cmd->angleturn - ((mousex*(encoremode ? -1 : 1)*8))); axis = JoyAxis(AXISAIM, forplayer); @@ -3261,6 +3268,11 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) if (InputDown(gc_fire, forplayer) || (usejoystick && axis > 0)) cmd->buttons |= BT_ATTACK; + // drift with any button/key + axis = JoyAxis(AXISDRIFT, forplayer); + if (InputDown(gc_drift, forplayer) || (usejoystick && axis > 0)) + cmd->buttons |= BT_DRIFT; + // float and sink axis = JoyAxis(AXISMOVE, forplayer); if (InputDown(gc_accelerate, forplayer) || (usejoystick && axis > 0)) @@ -3269,27 +3281,59 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) if (InputDown(gc_brake, forplayer) || (usejoystick && axis > 0)) cmd->buttons |= BT_BRAKE; + // spectator aiming shit, ahhhh... + player_invert = invertmouse ? -1 : 1; + + // mouse look stuff (mouse look is not the same as mouse aim) + kbl = false; + // looking up/down - laim += (mlooky<<19); + laim += (mlooky<<19)*player_invert; axis = JoyAxis(AXISLOOK, forplayer); - if (analogjoystickmove && axis != 0 && lookaxis) - laim += (axis<<16); + // spring back if not using keyboard neither mouselookin' + if (!kbl && !lookaxis && !mouseaiming) + laim = 0; - if (InputDown(gc_lookup, forplayer) || (gamepadjoystickmove && axis < 0)) + if (InputDown(gc_lookup, forplayer) || (usejoystick && axis < 0)) { laim += KB_LOOKSPEED; + kbl = true; } - else if (InputDown(gc_lookdown, forplayer) || (gamepadjoystickmove && axis > 0)) + else if (InputDown(gc_lookdown, forplayer) || (usejoystick && axis > 0)) { laim -= KB_LOOKSPEED; + kbl = true; } if (InputDown(gc_centerview, forplayer)) // No need to put a spectator limit on this one though :V + { laim = 0; + cam->reset_aiming = false; + } - cmd->aiming = G_ClipAimingPitch(&laim); + //if (cam->reset_aiming || ((cmd->buttons & BT_DRIFT) && !cam->button_a_held)) + if (cam->reset_aiming) + { + INT32 aiming = laim; + INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(laim)); + + if (abs(smooth) < abs(aiming)) + { + laim -= (angle_t)(smooth * intsign(aiming)); + } + else + { + laim = 0; + cam->reset_aiming = false; // completely smoothed out + } + } + + if (!cam->reset_aiming) + { + cmd->aiming = G_ClipAimingPitch(&laim); + } mousex = mousey = mlooky = 0; @@ -3312,24 +3356,21 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) lang += (cmd->angleturn<<16); cam->localangle = lang; - cam->localaiming = laim; + if (!cam->reset_aiming) + { + cam->localaiming = laim; + } + cam->keyboardlook = kbl; return cmd; } -#define intsign(n) \ - ((n) < 0 ? -1 : (n) > 0 ? 1 : 0) - static void P_DemoCameraMovement(camera_t *cam, UINT8 num) { ticcmd_t *cmd; angle_t thrustangle; player_t *lastp; const UINT8 forplayer = num+1; - boolean moving = false; - - if (encoremode) - cam->postimg |= POSTIMG_MIRROR; cam->localangle = cam->angle; cam->localaiming = cam->aiming; @@ -3337,14 +3378,8 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // first off we need to get button input cmd = P_CameraCmd(cam, num); - // let centerview work proper - if (InputDown(gc_centerview, forplayer)) - { - cam->aiming = 0; - cam->reset_aiming = false; - } - - if (cmd->aiming != 0) + // make sure we dont aim away during reset + if (!cam->reset_aiming) { cam->aiming = cmd->aiming << FRACBITS; } @@ -3361,17 +3396,15 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) { case 1: cam->z += spd; - moving = true; break; case -1: cam->z -= spd; - moving = true; break; } } - if (!(InputDown(gc_camfloat, forplayer) || InputDown(gc_camsink, forplayer)) && cam->button_a_held) + if (!(cmd->buttons & (BT_ACCELERATE | BT_DRIFT) || InputDown(gc_camfloat, forplayer)) && cam->button_a_held) { cam->button_a_held--; } @@ -3388,9 +3421,10 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->reset_aiming = false; } - if (cmd->forwardmove != 0) + if (InputDown(gc_centerview, forplayer)) // No need to put a spectator limit on this one though :V { - moving = true; + cam->aiming = 0; + cam->reset_aiming = false; } // After switching to democam, the vertical angle of @@ -3399,7 +3433,8 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // forward/back will have a slope. So, as long as democam // controls haven't been used to alter the vertical angle, // slowly reset it to flat. - if ((cam->reset_aiming && moving) || ((InputDown(gc_camsink, forplayer)) && !cam->button_a_held)) + //if (cam->reset_aiming || ((cmd->buttons & BT_DRIFT) && !cam->button_a_held)) + if (cam->reset_aiming) { INT32 aiming = cam->aiming; INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(cam->aiming)); @@ -3424,7 +3459,6 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->x += FixedMul(spd, FINECOSINE(thrustangle)); cam->y += FixedMul(spd, FINESINE(thrustangle)); - if (!cam->reset_aiming) { cam->z += FixedMul(spd, AIMINGTOSLOPE(cam->aiming)); -- 2.54.0 From 274c9904e6744ac017e92ad4af3910e6c7c2e47a Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 04:12:51 +0100 Subject: [PATCH 073/325] forgor to delet this --- src/y_inter.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 7aa4c4d6f..a436b9080 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -345,10 +345,7 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) return; } - INT32 i, whiteplayer = MAXPLAYERS; - - if (!splitscreen) - whiteplayer = (demo.playback ? displayplayers[0] : consoleplayer); + INT32 i;; #define NUMFORNEWCOLUMN 8 INT32 y = 41, gutter = ((standings->numplayers > NUMFORNEWCOLUMN) ? 0 : (BASEVIDWIDTH/2)); -- 2.54.0 From 0e1f843f5078158458ebafba6f2dee20529a9e1c Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 05:52:01 +0100 Subject: [PATCH 074/325] ; --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index a436b9080..985057571 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -345,7 +345,7 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) return; } - INT32 i;; + INT32 i; #define NUMFORNEWCOLUMN 8 INT32 y = 41, gutter = ((standings->numplayers > NUMFORNEWCOLUMN) ? 0 : (BASEVIDWIDTH/2)); -- 2.54.0 From bc1f21961c10e9405e591835eb04af08b0a6b9a1 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 06:29:17 +0100 Subject: [PATCH 075/325] smol cleanup localskin ranking shit --- src/k_kart.c | 16 +++++----------- src/y_inter.c | 25 ++++++++++--------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f5b220a04..a2392e487 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8590,7 +8590,6 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I continue; //ignore them. const boolean whiteplayer = _isHighlightedPlayer(&players[pnum]); - const INT32 philicol = (whiteplayer ? V_SkinColorToHighlightcolor(players[pnum].skincolor) : 0); if (netgame // don't draw it offline @@ -8606,21 +8605,16 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[pnum].mo->color) { - colormap = R_GetTranslationColormap(players[pnum].skin, players[pnum].mo->color, GTC_CACHE); - if (players[pnum].mo->colorized) colormap = R_GetTranslationColormap(TC_RAINBOW, players[pnum].mo->color, GTC_CACHE); else colormap = R_GetTranslationColormap(players[pnum].skin, players[pnum].mo->color, GTC_CACHE); - { - player_t *p; - p = &players[pnum]; - if (cv_highresportrait.value) - V_DrawSmallMappedPatch(x, y-4, 0, R_GetSkinFaceWant(p), colormap); - else - V_DrawMappedPatch(x, y-4, 0, R_GetSkinFaceRank(p), colormap); - } + if (cv_highresportrait.value) + V_DrawSmallMappedPatch(x, y-4, 0, R_GetSkinFaceWant(&players[pnum]), colormap); + else + V_DrawMappedPatch(x, y-4, 0, R_GetSkinFaceRank(&players[pnum]), colormap); + /*if (G_BattleGametype() && players[pnum].kartstuff[k_bumper] > 0) -- not enough space for this { INT32 bumperx = x+19; diff --git a/src/y_inter.c b/src/y_inter.c index 985057571..86072e904 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -406,24 +406,19 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) if (standings->color[i] != SKINCOLOR_NONE) { UINT8 *colormap = R_GetTranslationColormap(*standings->character[i], *standings->color[i], GTC_CACHE); + INT32 skinnum = (players[pnum].localskin ? (players[pnum].localskin - 1) : *standings->character[i]); + patch_t *faceprefix = NULL; - // i fucking hate this i fucking hate this i hate this so much if (!players[pnum].skinlocal) - { - int skinIndex = (players[pnum].localskin ? (players[pnum].localskin - 1) : *standings->character[i]); - - if (cv_highresportrait.value) - V_DrawSmallMappedPatch(x + 16, y - 4, 0, facewantprefix[skinIndex], colormap); - else - V_DrawMappedPatch(x + 16, y - 4, 0, facerankprefix[skinIndex], colormap); - } + faceprefix = (cv_highresportrait.value ? facewantprefix[skinnum] : facerankprefix[skinnum]); else - { - if (cv_highresportrait.value) - V_DrawSmallMappedPatch(x + 16, y - 4, 0, localfacewantprefix[players[pnum].localskin - 1], colormap); - else - V_DrawMappedPatch(x + 16, y - 4, 0, localfacerankprefix[players[pnum].localskin - 1], colormap); - } + faceprefix = (cv_highresportrait.value ? localfacewantprefix[skinnum] : localfacerankprefix[skinnum]); + + + if (cv_highresportrait.value) + V_DrawSmallMappedPatch(x + 16, y - 4, 0, faceprefix, colormap); + else + V_DrawMappedPatch(x + 16, y - 4, 0, faceprefix, colormap); } if (pnum == whiteplayer) -- 2.54.0 From a11227b15a2ed5e8ef595271d07e678d52ff044d Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 18:23:25 +0100 Subject: [PATCH 076/325] fix postimg data types mismatch also remove the "postimgflag_t" typedef since its useless and use smoler type for everything we dont need much space lol --- src/doomtype.h | 9 --------- src/p_local.h | 13 ++++++++++++- src/p_mobj.c | 2 +- src/p_user.c | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/doomtype.h b/src/doomtype.h index 429eba77e..116d5cdfb 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -342,15 +342,6 @@ union FColorRGBA } ATTRPACK; typedef union FColorRGBA RGBA_t; -typedef enum -{ - POSTIMG_WATER = 1, // Underwater screen effect. - POSTIMG_MOTION = 1<<1, // Unused motion blur effect. - POSTIMG_FLIP = 1<<2, // Flipcam screen effect. - POSTIMG_HEAT = 1<<3, // Heatwave screen effect. - POSTIMG_MIRROR = 1<<4, // encore screen effect. -} postimgflag_t; - typedef UINT32 lumpnum_t; // 16 : 16 unsigned long (wad num: lump num) #define LUMPERROR UINT32_MAX diff --git a/src/p_local.h b/src/p_local.h index d80223531..318f99f87 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -76,6 +76,7 @@ void P_UnlinkThinker(thinker_t *thinker); // // P_USER // + typedef struct camera_s { boolean chase; @@ -125,9 +126,19 @@ typedef struct camera_s fixed_t pan; // postproccess effects - UINT16 postimg; + UINT8 postimg; } camera_t; +// post process types +enum +{ + POSTIMG_WATER = 1, // Underwater screen effect. + POSTIMG_MOTION = 1<<1, // Unused motion blur effect. + POSTIMG_FLIP = 1<<2, // Flipcam screen effect. + POSTIMG_HEAT = 1<<3, // Heatwave screen effect. + POSTIMG_MIRROR = 1<<4, // encore screen effect. +}; + extern camera_t camera[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_dist[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_still[MAXSPLITSCREENPLAYERS]; diff --git a/src/p_mobj.c b/src/p_mobj.c index 2b120b99c..dd3f62169 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3235,7 +3235,7 @@ void P_DestroyRobots(void) void P_CalcChasePostImg(player_t *player, camera_t *thiscam) { const boolean flipcam = (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP); - UINT16 postimgtype = 0; + UINT8 postimgtype = 0; if (encoremode) postimgtype |= POSTIMG_MIRROR; diff --git a/src/p_user.c b/src/p_user.c index 0675808b0..52399e56f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4252,7 +4252,7 @@ static boolean P_CameraCheckWaterFirstperson(player_t *player, sector_t *sector, static void P_CalcPostImg(player_t *player, camera_t *thiscam) { sector_t *sector = NULL; - INT16 postimgtype = 0; + UINT8 postimgtype = 0; //INT32 *param; fixed_t pviewheight = 0; -- 2.54.0 From 1a9865ebc45bff2d65835d4451b3bf85f42a4532 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 9 Jan 2025 17:25:50 +0100 Subject: [PATCH 077/325] this should also use unpaused rendertimefrac --- src/d_main.c | 2 +- src/r_things.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index d74950b65..5b24c5c00 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -334,7 +334,7 @@ static boolean D_Display(void) if (rendermode == render_soft && !splitscreen) { - R_InterpolateViewRollAngle(rendertimefrac); + R_InterpolateViewRollAngle(rendertimefrac_unpaused); R_CheckViewMorph(); } diff --git a/src/r_things.c b/src/r_things.c index 9bdb9ea67..8f4677bcf 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -584,7 +584,7 @@ void R_DrawMaskedColumn(column_t *column) basetexturemid = dc_texturemid; - if (!column || column == 0) + if (column == NULL) return; for (; column->topdelta != 0xff ;) -- 2.54.0 From d39fd5bb5c4e4f4df16f2d234d9f2dfcf91dd30f Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 10 Jan 2025 18:31:40 +0100 Subject: [PATCH 078/325] strafe controls for speccam/freecam TODO: seperate cam turning axis from gameplay turn axis for gamepads --- src/d_netcmd.c | 1 + src/g_game.c | 10 ++ src/g_game.h | 2 + src/g_input.c | 2 + src/g_input.h | 2 + src/m_menu.c | 265 ++++++++++++++++++++++--------------------------- src/p_user.c | 51 +++++++++- 7 files changed, 185 insertions(+), 148 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 9b293aef6..1f2a0e95a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1033,6 +1033,7 @@ void D_RegisterClientCommands(void) { CV_RegisterVar(&cv_turnaxis[i]); CV_RegisterVar(&cv_moveaxis[i]); + CV_RegisterVar(&cv_strafeaxis[i]); CV_RegisterVar(&cv_brakeaxis[i]); CV_RegisterVar(&cv_aimaxis[i]); CV_RegisterVar(&cv_lookaxis[i]); diff --git a/src/g_game.c b/src/g_game.c index 1bcd9778c..87fd1b1d5 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -440,6 +440,13 @@ consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS] = { {"joyaxis4_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} }; +consvar_t cv_strafeaxis[MAXSPLITSCREENPLAYERS] = { + {"joyaxis_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis2_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis3_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis4_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} +}; + consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS] = { {"joyaxis_brake", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, {"joyaxis2_brake", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, @@ -732,6 +739,9 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 player) case AXISMOVE: axisval = cv_moveaxis[player-1].value; break; + case AXISSTRAFE: + axisval = cv_strafeaxis[player-1].value; + break; case AXISBRAKE: axisval = cv_brakeaxis[player-1].value; break; diff --git a/src/g_game.h b/src/g_game.h index 10c2a6156..9ca6dce09 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -124,6 +124,7 @@ extern consvar_t cv_invertmouse2/*, cv_alwaysfreelook2, cv_chasefreelook2, cv_mo extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS]; +extern consvar_t cv_strafeaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_aimaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_lookaxis[MAXSPLITSCREENPLAYERS]; @@ -192,6 +193,7 @@ typedef enum AXISNONE = 0, AXISTURN, AXISMOVE, + AXISSTRAFE, AXISBRAKE, AXISAIM, AXISLOOK, diff --git a/src/g_input.c b/src/g_input.c index c948ed751..e80bbacd1 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -905,6 +905,8 @@ static const char *gamecontrolname[num_gamecontrols] = "freecam", "camfloat", "camsink", + "strafeleft", + "straferight", }; #define NUMKEYNAMES (sizeof (keynames)/sizeof (keyname_t)) diff --git a/src/g_input.h b/src/g_input.h index 1dbbb937f..1475af582 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -103,6 +103,8 @@ typedef enum gc_freecam, // Toggle for freecam while ingame gc_camfloat, // alternative button for raising cam gc_camsink, // alternative button for sinking + gc_strafeleft, + gc_straferight, num_gamecontrols } gamecontrols_e; diff --git a/src/m_menu.c b/src/m_menu.c index 664f734e5..b899efa30 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -643,23 +643,23 @@ static menuitem_t MISC_ReplayOptionsMenu[] = static tic_t playback_last_menu_interaction_leveltime = 0; static menuitem_t PlaybackMenu[] = { - {IT_CALL | IT_STRING, "M_PHIDE", "Hide Menu (Esc)", M_SelectableClearMenus, 0}, + {IT_CALL | IT_STRING, "M_PHIDE", "Hide Menu (Esc)", M_SelectableClearMenus, 0}, - {IT_CALL | IT_STRING, "M_PREW", "Rewind ([)", M_PlaybackRewind, 20}, - {IT_CALL | IT_STRING, "M_PPAUSE", "Pause (\\)", M_PlaybackPause, 36}, - {IT_CALL | IT_STRING, "M_PFFWD", "Fast-Forward (])", M_PlaybackFastForward, 52}, - {IT_CALL | IT_STRING, "M_PSTEPB", "Backup Frame ([)", M_PlaybackRewind, 20}, - {IT_CALL | IT_STRING, "M_PRESUM", "Resume", M_PlaybackPause, 36}, - {IT_CALL | IT_STRING, "M_PFADV", "Advance Frame (])", M_PlaybackAdvance, 52}, + {IT_CALL | IT_STRING, "M_PREW", "Rewind ([)", M_PlaybackRewind, 20}, + {IT_CALL | IT_STRING, "M_PPAUSE", "Pause (\\)", M_PlaybackPause, 36}, + {IT_CALL | IT_STRING, "M_PFFWD", "Fast-Forward (])", M_PlaybackFastForward, 52}, + {IT_CALL | IT_STRING, "M_PSTEPB", "Backup Frame ([)", M_PlaybackRewind, 20}, + {IT_CALL | IT_STRING, "M_PRESUM", "Resume", M_PlaybackPause, 36}, + {IT_CALL | IT_STRING, "M_PFADV", "Advance Frame (])", M_PlaybackAdvance, 52}, - {IT_ARROWS | IT_STRING, "M_PVIEWS", "View Count (- and =)", M_PlaybackSetViews, 72}, - {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint (1)", M_PlaybackAdjustView, 88}, - {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint 2 (2)", M_PlaybackAdjustView, 104}, - {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint 3 (3)", M_PlaybackAdjustView, 120}, - {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint 4 (4)", M_PlaybackAdjustView, 136}, + {IT_ARROWS | IT_STRING, "M_PVIEWS", "View Count (- and =)", M_PlaybackSetViews, 72}, + {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint (1)", M_PlaybackAdjustView, 88}, + {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint 2 (2)", M_PlaybackAdjustView, 104}, + {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint 3 (3)", M_PlaybackAdjustView, 120}, + {IT_ARROWS | IT_STRING, "M_PNVIEW", "Viewpoint 4 (4)", M_PlaybackAdjustView, 136}, {IT_CALL | IT_STRING, "M_PVIEWS", "Toggle Free Camera (')", M_PlaybackToggleFreecam, 156}, - {IT_CALL | IT_STRING, "M_PEXIT", "Stop Playback", M_PlaybackQuit, 172}, + {IT_CALL | IT_STRING, "M_PEXIT", "Stop Playback", M_PlaybackQuit, 172}, }; typedef enum { @@ -702,8 +702,8 @@ typedef enum // --------------------- static menuitem_t MPauseMenu[] = { - {IT_STRING | IT_CALL, NULL, "Addons...", M_Addons, 8}, - {IT_STRING | IT_CALL, NULL, "Add local skins...", M_LocalSkins, 16}, + {IT_STRING | IT_CALL, NULL, "Addons...", M_Addons, 8}, + {IT_STRING | IT_CALL, NULL, "Add local skins...", M_LocalSkins, 16}, {IT_STRING | IT_SUBMENU, NULL, "Scramble Teams...", &MISC_ScrambleTeamDef, 24}, {IT_STRING | IT_CALL, NULL, "Switch Map..." , M_MapChange, 32}, @@ -766,7 +766,7 @@ static menuitem_t SPauseMenu[] = // Pandora's Box will be shifted up if both options are available {IT_CALL | IT_STRING, NULL, "Pandora's Box...", M_PandorasBox, 16}, {IT_CALL | IT_STRING, NULL, "Medal Hints...", M_EmblemHints, 24}, - //{IT_CALL | IT_STRING, NULL, "Level Select...", M_LoadGameLevelSelect, 32}, + //{IT_CALL | IT_STRING, NULL, "Level Select...", M_LoadGameLevelSelect, 32}, {IT_CALL | IT_STRING, NULL, "Continue", M_SelectableClearMenus,48}, {IT_CALL | IT_STRING, NULL, "Retry", M_Retry, 56}, @@ -1034,13 +1034,13 @@ menuitem_t PlayerMenu[MAXSKINS]; static menuitem_t MP_MainMenu[] = { {IT_HEADER, NULL, "Players", NULL, 0}, - {IT_STRING|IT_CVAR, NULL, "Number of local players", &cv_splitplayers, 10}, + {IT_STRING|IT_CVAR, NULL, "Number of local players", &cv_splitplayers, 10}, - {IT_STRING|IT_KEYHANDLER,NULL, "Player setup...", M_SetupMultiHandler,18}, + {IT_STRING|IT_KEYHANDLER,NULL, "Player setup...", M_SetupMultiHandler, 18}, {IT_HEADER, NULL, "Host a game", NULL, 100-24}, #ifndef NONET - {IT_STRING|IT_CALL, NULL, "Internet/LAN...", M_PreStartServerMenu, 110-24}, + {IT_STRING|IT_CALL, NULL, "Internet/LAN...", M_PreStartServerMenu, 110-24}, #else {IT_GRAYEDOUT, NULL, "Internet/LAN...", NULL, 110-24}, #endif @@ -1049,11 +1049,11 @@ static menuitem_t MP_MainMenu[] = {IT_HEADER, NULL, "Join a game", NULL, 132-24}, #ifndef NONET #ifndef MASTERSERVER - {IT_GRAYEDOUT, NULL, "Internet server browser...",NULL, 142-24}, + {IT_GRAYEDOUT, NULL, "Internet server browser...",NULL, 142-24}, #else - {IT_STRING|IT_CALL, NULL, "Internet server browser...",M_PreConnectMenu, 142-24}, + {IT_STRING|IT_CALL, NULL, "Internet server browser...",M_PreConnectMenu, 142-24}, #endif - {IT_STRING|IT_CALL, NULL, "Join last server", M_ConnectLastServer, 150-24}, + {IT_STRING|IT_CALL, NULL, "Join last server", M_ConnectLastServer, 150-24}, {IT_STRING|IT_KEYHANDLER, NULL, "Specify IPv4 address:", M_HandleConnectIP, 158-24}, #else {IT_GRAYEDOUT, NULL, "Internet server browser...",NULL, 142-24}, @@ -1149,7 +1149,7 @@ static menuitem_t OP_MainMenu[] = {IT_SUBMENU|IT_STRING, NULL, "Saturn Options...", &OP_SaturnDef, 135}, - {IT_SUBMENU|IT_STRING, NULL, "Bird...", &OP_BirdDef, 145}, + {IT_SUBMENU|IT_STRING, NULL, "Bird...", &OP_BirdDef, 145}, {IT_CALL|IT_STRING, NULL, "Local Skin Options...", M_LocalSkinMenu, 155}, }; @@ -1158,13 +1158,13 @@ static menuitem_t OP_ControlsMenu[] = {IT_CALL | IT_STRING, NULL, "Player 1 Controls...", M_Setup1PControlsMenu, 10}, {IT_CALL | IT_STRING, NULL, "Player 2 Controls...", M_Setup2PControlsMenu, 20}, - {IT_CALL | IT_STRING, NULL, "Player 3 Controls...", &M_Setup3PControlsMenu, 30}, - {IT_CALL | IT_STRING, NULL, "Player 4 Controls...", &M_Setup4PControlsMenu, 40}, + {IT_CALL | IT_STRING, NULL, "Player 3 Controls...", &M_Setup3PControlsMenu, 30}, + {IT_CALL | IT_STRING, NULL, "Player 4 Controls...", &M_Setup4PControlsMenu, 40}, - {IT_SUBMENU | IT_STRING, NULL, "Mouse Options...", &OP_MouseOptionsDef, 60}, + {IT_SUBMENU | IT_STRING, NULL, "Mouse Options...", &OP_MouseOptionsDef, 60}, - {IT_STRING | IT_CVAR, NULL, "Controls per key", &cv_controlperkey, 80}, - {IT_STRING | IT_CVAR, NULL, "Digital turn easing", &cv_turnsmooth, 90}, + {IT_STRING | IT_CVAR, NULL, "Controls per key", &cv_controlperkey, 80}, + {IT_STRING | IT_CVAR, NULL, "Digital turn easing", &cv_turnsmooth, 90}, }; static const char* OP_ControlsTooltips[] = @@ -1217,6 +1217,8 @@ static menuitem_t OP_AllControlsMenu[] = {IT_CONTROL, NULL, "Sink", M_ChangeControl, gc_camsink }, {IT_CONTROL, NULL, "Change Viewpoint", M_ChangeControl, gc_viewpoint }, {IT_CONTROL, NULL, "Reset Camera", M_ChangeControl, gc_camreset }, + {IT_CONTROL, NULL, "Strafe Left", M_ChangeControl, gc_strafeleft }, + {IT_CONTROL, NULL, "Strafe Right", M_ChangeControl, gc_straferight}, //{IT_CONTROL, NULL, "Toggle First-Person", M_ChangeControl, gc_camtoggle }, {IT_HEADER, NULL, "Spectator Controls", NULL, 0}, @@ -1233,90 +1235,94 @@ static menuitem_t OP_AllControlsMenu[] = static menuitem_t OP_Joystick1Menu[] = { - {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup1PJoystickMenu, 10}, + {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup1PJoystickMenu , 10}, {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[0] , 20}, {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[0] , 25}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[0] , 30}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[0] , 35}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[0] , 40}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[0] , 45}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[0] , 50}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[0] , 55}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[0] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[0] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[0] , 70}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[0] , 75}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[0] , 80}, + {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[0] , 30}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[0] , 35}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[0] , 40}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[0] , 45}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[0] , 50}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[0] , 55}, + {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[0] , 60}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[0] , 65}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[0] , 70}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[0] , 75}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[0] , 80}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[0] , 85}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[0] , 90}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[0] , 95}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[0] , 100}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[0] , 95}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[0] , 100}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[0] , 105}, }; static menuitem_t OP_Joystick2Menu[] = { - {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup2PJoystickMenu, 10}, - {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[1] , 20}, - {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[1] , 25}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[1] , 30}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[1] , 35}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[1] , 40}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[1] , 45}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[1] , 50}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[1] , 55}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[1] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[1] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[1] , 70}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[1] , 75}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[1] , 80}, + {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup2PJoystickMenu , 10}, + {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[1] , 20}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[1] , 25}, + {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[1] , 30}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[1] , 35}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[1] , 40}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[1] , 45}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[1] , 50}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[1] , 55}, + {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[1] , 60}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[1] , 65}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[1] , 70}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[1] , 75}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[1] , 80}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[1] , 85}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[1] , 90}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[1] , 95}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[1] , 100}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[1] , 95}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[1] , 100}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[1] , 105}, }; static menuitem_t OP_Joystick3Menu[] = { - {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup3PJoystickMenu, 10}, - {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[2] , 20}, - {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[2] , 25}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[2] , 30}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[2] , 35}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[2] , 40}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[2] , 45}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[2] , 50}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[2] , 55}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[2] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[2] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[2] , 70}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[2] , 75}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[2] , 80}, + {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup3PJoystickMenu , 10}, + {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[2] , 20}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[2] , 25}, + {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[2] , 30}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[2] , 35}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[2] , 40}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[2] , 45}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[2] , 50}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[2] , 55}, + {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[2] , 60}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[2] , 65}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[2] , 70}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[2] , 75}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[2] , 80}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[2] , 85}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[2] , 90}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[2] , 95}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[2] , 100}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[2] , 95}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[2] , 100}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[2] , 105}, }; static menuitem_t OP_Joystick4Menu[] = { - {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup4PJoystickMenu, 10}, - {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[3] , 20}, - {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[3] , 25}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[3] , 30}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[3] , 35}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[3] , 40}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[3] , 45}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[3] , 50}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[3] , 55}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[3] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[3] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[3] , 70}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[3] , 75}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[3] , 80}, + {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup4PJoystickMenu , 10}, + {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[3] , 20}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[3] , 25}, + {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[3] , 30}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[3] , 35}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[3] , 40}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[3] , 45}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[3] , 50}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[3] , 55}, + {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[3] , 60}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[3] , 65}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[3] , 70}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[3] , 75}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[3] , 80}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[3] , 85}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[3] , 90}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[3] , 95}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[3] , 100}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[3] , 95}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[3] , 100}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[3] , 105}, }; static menuitem_t OP_JoystickSetMenu[] = @@ -12063,7 +12069,7 @@ static void M_Setup1PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_CONTROL; // GIF OP_AllControlsMenu[20].status = IT_CONTROL; // System Menu OP_AllControlsMenu[21].status = IT_CONTROL; // Console - OP_AllControlsMenu[35].status = IT_CONTROL; // Director + OP_AllControlsMenu[37].status = IT_CONTROL; // Director M_SetupNextMenu(&OP_AllControlsDef); } @@ -12086,7 +12092,7 @@ static void M_Setup2PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console - OP_AllControlsMenu[35].status = IT_GRAYEDOUT2; // Director + OP_AllControlsMenu[37].status = IT_GRAYEDOUT2; // Director M_SetupNextMenu(&OP_AllControlsDef); } @@ -12109,7 +12115,7 @@ static void M_Setup3PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console - OP_AllControlsMenu[35].status = IT_GRAYEDOUT2; // Director + OP_AllControlsMenu[37].status = IT_GRAYEDOUT2; // Director M_SetupNextMenu(&OP_AllControlsDef); } @@ -12132,7 +12138,7 @@ static void M_Setup4PControlsMenu(INT32 choice) OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console - OP_AllControlsMenu[35].status = IT_GRAYEDOUT2; // Director + OP_AllControlsMenu[37].status = IT_GRAYEDOUT2; // Director M_SetupNextMenu(&OP_AllControlsDef); } @@ -12388,53 +12394,24 @@ static void M_ResetControlsResponse(INT32 ch) G_Controldefault(setupcontrolplayer); // Setup gamepad option defaults (yucky) - switch (setupcontrolplayer) + for (UINT8 j = 0; j < MAXSPLITSCREENPLAYERS; j++) { - case 4: - CV_StealthSet(&cv_usejoystick[3], cv_usejoystick[3].defaultvalue); - CV_StealthSet(&cv_turnaxis[3], cv_turnaxis[3].defaultvalue); - CV_StealthSet(&cv_moveaxis[3], cv_moveaxis[3].defaultvalue); - CV_StealthSet(&cv_brakeaxis[3], cv_brakeaxis[3].defaultvalue); - CV_StealthSet(&cv_aimaxis[3], cv_aimaxis[3].defaultvalue); - CV_StealthSet(&cv_lookaxis[3], cv_lookaxis[3].defaultvalue); - CV_StealthSet(&cv_fireaxis[3], cv_fireaxis[3].defaultvalue); - CV_StealthSet(&cv_driftaxis[3], cv_driftaxis[3].defaultvalue); - CV_StealthSet(&cv_lookbackaxis[3], cv_lookbackaxis[3].defaultvalue); - break; - case 3: - CV_StealthSet(&cv_usejoystick[2], cv_usejoystick[2].defaultvalue); - CV_StealthSet(&cv_turnaxis[2], cv_turnaxis[2].defaultvalue); - CV_StealthSet(&cv_moveaxis[2], cv_moveaxis[2].defaultvalue); - CV_StealthSet(&cv_brakeaxis[2], cv_brakeaxis[2].defaultvalue); - CV_StealthSet(&cv_aimaxis[2], cv_aimaxis[2].defaultvalue); - CV_StealthSet(&cv_lookaxis[2], cv_lookaxis[2].defaultvalue); - CV_StealthSet(&cv_fireaxis[2], cv_fireaxis[2].defaultvalue); - CV_StealthSet(&cv_driftaxis[2], cv_driftaxis[2].defaultvalue); - CV_StealthSet(&cv_lookbackaxis[2], cv_lookbackaxis[2].defaultvalue); - break; - case 2: - CV_StealthSet(&cv_usejoystick[1], cv_usejoystick[1].defaultvalue); - CV_StealthSet(&cv_turnaxis[1], cv_turnaxis[1].defaultvalue); - CV_StealthSet(&cv_moveaxis[1], cv_moveaxis[1].defaultvalue); - CV_StealthSet(&cv_brakeaxis[1], cv_brakeaxis[1].defaultvalue); - CV_StealthSet(&cv_aimaxis[1], cv_aimaxis[1].defaultvalue); - CV_StealthSet(&cv_lookaxis[1], cv_lookaxis[1].defaultvalue); - CV_StealthSet(&cv_fireaxis[1], cv_fireaxis[1].defaultvalue); - CV_StealthSet(&cv_driftaxis[1], cv_driftaxis[1].defaultvalue); - CV_StealthSet(&cv_lookbackaxis[1], cv_lookbackaxis[1].defaultvalue); - break; - case 1: - default: - CV_StealthSet(&cv_usejoystick[0], cv_usejoystick[0].defaultvalue); - CV_StealthSet(&cv_turnaxis[0], cv_turnaxis[0].defaultvalue); - CV_StealthSet(&cv_moveaxis[0], cv_moveaxis[0].defaultvalue); - CV_StealthSet(&cv_brakeaxis[0], cv_brakeaxis[0].defaultvalue); - CV_StealthSet(&cv_aimaxis[0], cv_aimaxis[0].defaultvalue); - CV_StealthSet(&cv_lookaxis[0], cv_lookaxis[0].defaultvalue); - CV_StealthSet(&cv_fireaxis[0], cv_fireaxis[0].defaultvalue); - CV_StealthSet(&cv_driftaxis[0], cv_driftaxis[0].defaultvalue); - CV_StealthSet(&cv_lookbackaxis[0], cv_lookbackaxis[0].defaultvalue); - break; + if (setupcontrolplayer != j) + continue; + + CV_StealthSet(&cv_usejoystick[j], cv_usejoystick[j].defaultvalue); + CV_StealthSet(&cv_turnaxis[j], cv_turnaxis[j].defaultvalue); + CV_StealthSet(&cv_strafeaxis[j], cv_strafeaxis[j].defaultvalue); + CV_StealthSet(&cv_moveaxis[j], cv_moveaxis[j].defaultvalue); + CV_StealthSet(&cv_brakeaxis[j], cv_brakeaxis[j].defaultvalue); + CV_StealthSet(&cv_aimaxis[j], cv_aimaxis[j].defaultvalue); + CV_StealthSet(&cv_lookaxis[j], cv_lookaxis[j].defaultvalue); + CV_StealthSet(&cv_fireaxis[j], cv_fireaxis[j].defaultvalue); + CV_StealthSet(&cv_driftaxis[j], cv_driftaxis[j].defaultvalue); + CV_StealthSet(&cv_lookbackaxis[j], cv_lookbackaxis[j].defaultvalue); + CV_StealthSet(&cv_custom1axis[j], cv_custom1axis[j].defaultvalue); + CV_StealthSet(&cv_custom2axis[j], cv_custom2axis[j].defaultvalue); + CV_StealthSet(&cv_custom3axis[j], cv_custom3axis[j].defaultvalue); } S_StartSound(NULL, sfx_s224); diff --git a/src/p_user.c b/src/p_user.c index 52399e56f..6dfe4d0af 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3131,8 +3131,9 @@ fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42, -42, -42, -42}; #define MAXCAMERADIST 140*FRACUNIT // Max distance the camera can be in front of the player (2D mode) static fixed_t forwardmove[2] = {25<>16, 50<>16}; -static fixed_t sidemove[2] = {2<>16, 4<>16}; +//static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn +static fixed_t strafemove[2] = {25<>16, 50<>16}; // faster! void P_ToggleDemoCamera(UINT8 viewnum) { @@ -3176,6 +3177,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) // these ones used for multiple conditions boolean turnleft, turnright, mouseaiming; + boolean strafeleft, straferight; boolean invertmouse, usejoystick, kbl; angle_t lang; INT32 player_invert; @@ -3242,18 +3244,48 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) turnright = turnright || (axis > 0); turnleft = turnleft || (axis < 0); } - forward = side = 0; + forward = 0; // let movement keys cancel each other out if (turnright && !(turnleft)) { cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[1])); - side += sidemove[1]; + //side += sidemove[1]; } else if (turnleft && !(turnright)) { cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[1])); - side -= sidemove[1]; + //side -= sidemove[1]; + } + + straferight = InputDown(gc_straferight, forplayer); + strafeleft = InputDown(gc_strafeleft, forplayer); + + axis = JoyAxis(AXISSTRAFE, forplayer); + + if (encoremode) + { + straferight ^= strafeleft; // swap these using three XORs + strafeleft ^= straferight; + straferight ^= strafeleft; + axis = -axis; + } + + if (usejoystick && axis != 0) + { + straferight = straferight || (axis > 0); + strafeleft = strafeleft || (axis < 0); + } + side = 0; + + // let strafe keys cancel each other out + if (straferight && !(strafeleft)) + { + side += strafemove[1]; + } + else if (strafeleft && !(straferight)) + { + side -= strafemove[1]; } cmd->angleturn = (INT16)(cmd->angleturn - ((mousex*(encoremode ? -1 : 1)*8))); @@ -3470,6 +3502,17 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // besides freecam going inside walls sounds pretty cool on paper. } + // cmd->strafemove -- cant really add stuff to ticcmd struct so im reusing this + if (cmd->sidemove != 0) // was disabled in practice anyways, since sidemove was suppressed + { + //False I fixed this shit - Nep + fixed_t spd = cmd->sidemove*mapobjectscale; + + thrustangle = (cam->angle-ANGLE_90) >> ANGLETOFINESHIFT; + cam->x += FixedMul(spd, FINECOSINE(thrustangle)); + cam->y += FixedMul(spd, FINESINE(thrustangle)); + } + // update subsector to avoid crashes; cam->subsector = R_PointInSubsector(cam->x, cam->y); } -- 2.54.0 From 50d2bf5d8da6604f8c141f613c44ecdd26a82953 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 10 Jan 2025 22:23:28 +0100 Subject: [PATCH 079/325] seperate game turn axis from cam turn axis both are bound to the same value by default, so vanilla controls remain intact theres no other good way to have gamepad controls for this sadly --- src/d_netcmd.c | 3 +- src/g_game.c | 24 +++++-- src/g_game.h | 6 +- src/m_menu.c | 176 +++++++++++++++++++++++++++++-------------------- src/p_user.c | 4 +- 5 files changed, 129 insertions(+), 84 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1f2a0e95a..13d7bd679 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1033,7 +1033,8 @@ void D_RegisterClientCommands(void) { CV_RegisterVar(&cv_turnaxis[i]); CV_RegisterVar(&cv_moveaxis[i]); - CV_RegisterVar(&cv_strafeaxis[i]); + CV_RegisterVar(&cv_camturnaxis[i]); + CV_RegisterVar(&cv_camstrafeaxis[i]); CV_RegisterVar(&cv_brakeaxis[i]); CV_RegisterVar(&cv_aimaxis[i]); CV_RegisterVar(&cv_lookaxis[i]); diff --git a/src/g_game.c b/src/g_game.c index 87fd1b1d5..60dca3870 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -440,11 +440,18 @@ consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS] = { {"joyaxis4_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} }; -consvar_t cv_strafeaxis[MAXSPLITSCREENPLAYERS] = { - {"joyaxis_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"joyaxis2_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"joyaxis3_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"joyaxis4_strafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} +consvar_t cv_camstrafeaxis[MAXSPLITSCREENPLAYERS] = { + {"joyaxis_camstrafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis2_camstrafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis3_camstrafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis4_camstrafe", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} +}; + +consvar_t cv_camturnaxis[MAXSPLITSCREENPLAYERS] = { + {"joyaxis_camturn", "Left X", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis2_camturn", "Left X", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis3_camturn", "Left X", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"joyaxis4_camturn", "Left X", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} }; consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS] = { @@ -739,8 +746,11 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 player) case AXISMOVE: axisval = cv_moveaxis[player-1].value; break; - case AXISSTRAFE: - axisval = cv_strafeaxis[player-1].value; + case AXISCAMTURN: + axisval = cv_camturnaxis[player-1].value; + break; + case AXISCAMSTRAFE: + axisval = cv_camstrafeaxis[player-1].value; break; case AXISBRAKE: axisval = cv_brakeaxis[player-1].value; diff --git a/src/g_game.h b/src/g_game.h index 9ca6dce09..53da464a5 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -124,7 +124,8 @@ extern consvar_t cv_invertmouse2/*, cv_alwaysfreelook2, cv_chasefreelook2, cv_mo extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_strafeaxis[MAXSPLITSCREENPLAYERS]; +extern consvar_t cv_camturnaxis[MAXSPLITSCREENPLAYERS]; +extern consvar_t cv_camstrafeaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_aimaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_lookaxis[MAXSPLITSCREENPLAYERS]; @@ -193,7 +194,8 @@ typedef enum AXISNONE = 0, AXISTURN, AXISMOVE, - AXISSTRAFE, + AXISCAMTURN, + AXISCAMSTRAFE, AXISBRAKE, AXISAIM, AXISLOOK, diff --git a/src/m_menu.c b/src/m_menu.c index b899efa30..41bae3132 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1196,7 +1196,7 @@ static menuitem_t OP_AllControlsMenu[] = {IT_CONTROL, NULL, "Aim Backward", M_ChangeControl, gc_aimbackward}, {IT_CONTROL, NULL, "Look Backward", M_ChangeControl, gc_lookback }, - {IT_HEADER, NULL, "Miscelleanous Controls", NULL, 0}, + {IT_HEADER, NULL, "Miscellaneous Controls", NULL, 0}, {IT_SPACE, NULL, NULL, NULL, 0}, {IT_CONTROL, NULL, "Chat", M_ChangeControl, gc_talkkey }, //{IT_CONTROL, NULL, "Team Chat", M_ChangeControl, gc_teamkey }, @@ -1235,94 +1235,126 @@ static menuitem_t OP_AllControlsMenu[] = static menuitem_t OP_Joystick1Menu[] = { - {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup1PJoystickMenu , 10}, - {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[0] , 20}, - {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[0] , 25}, - {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[0] , 30}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[0] , 35}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[0] , 40}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[0] , 45}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[0] , 50}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[0] , 55}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[0] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[0] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[0] , 70}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[0] , 75}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[0] , 80}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[0] , 85}, + {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup1PJoystickMenu , 0}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[0] , 95}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[0] , 100}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[0] , 105}, + {IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, + {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[0] , 15}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[0] , 20}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[0] , 25}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[0] , 30}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[0] , 35}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[0] , 40}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[0] , 45}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[0] , 50}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[0] , 55}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[0] , 60}, + + {IT_HEADER, NULL, "Camera Controls", NULL, 67}, + {IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[0] , 75}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[0] , 80}, + {IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[0] , 85}, + + {IT_HEADER, NULL, "Deadzones", NULL, 92}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[0] , 100}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[0] , 105}, + + {IT_HEADER, NULL, "Miscellaneous", NULL, 112}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[0] , 120}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[0] , 125}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[0] , 130}, }; static menuitem_t OP_Joystick2Menu[] = { {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup2PJoystickMenu , 10}, - {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[1] , 20}, - {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[1] , 25}, - {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[1] , 30}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[1] , 35}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[1] , 40}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[1] , 45}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[1] , 50}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[1] , 55}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[1] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[1] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[1] , 70}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[1] , 75}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[1] , 80}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[1] , 85}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[1] , 95}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[1] , 100}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[1] , 105}, + {IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, + {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[1] , 15}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[1] , 20}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[1] , 25}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[1] , 30}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[1] , 35}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[1] , 40}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[1] , 45}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[1] , 50}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[1] , 55}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[1] , 60}, + + {IT_HEADER, NULL, "Camera Controls", NULL, 67}, + {IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[1] , 75}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[1] , 80}, + {IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[1] , 85}, + + {IT_HEADER, NULL, "Deadzones", NULL, 92}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[1] , 100}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[1] , 105}, + + {IT_HEADER, NULL, "Miscellaneous", NULL, 112}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[1] , 120}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[1] , 125}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[1] , 130}, }; static menuitem_t OP_Joystick3Menu[] = { {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup3PJoystickMenu , 10}, - {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[2] , 20}, - {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[2] , 25}, - {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[2] , 30}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[2] , 35}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[2] , 40}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[2] , 45}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[2] , 50}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[2] , 55}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[2] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[2] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[2] , 70}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[2] , 75}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[2] , 80}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[2] , 85}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[2] , 95}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[2] , 100}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[2] , 105}, + {IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, + {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[2] , 15}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[2] , 20}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[2] , 25}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[2] , 30}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[2] , 35}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[2] , 40}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[2] , 45}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[2] , 50}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[2] , 55}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[2] , 60}, + + {IT_HEADER, NULL, "Camera Controls", NULL, 67}, + {IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[2] , 75}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[2] , 80}, + {IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[2] , 85}, + + {IT_HEADER, NULL, "Deadzones", NULL, 92}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[2] , 100}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[2] , 105}, + + {IT_HEADER, NULL, "Miscellaneous", NULL, 112}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[2] , 120}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[2] , 125}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[2] , 130}, }; static menuitem_t OP_Joystick4Menu[] = { {IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup4PJoystickMenu , 10}, - {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[3] , 20}, - {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[3] , 25}, - {IT_STRING | IT_CVAR, NULL, "Cam Strafe Left/Right", &cv_strafeaxis[3] , 30}, - {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[3] , 35}, - {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[3] , 40}, - {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[3] , 45}, - {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[3] , 50}, - {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[3] , 55}, - {IT_STRING | IT_CVAR, NULL, "Spec. Look Up/Down" , &cv_lookaxis[3] , 60}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[3] , 65}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[3] , 70}, - {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[3] , 75}, - {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[3] , 80}, - {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[3] , 85}, - {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[3] , 95}, - {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[3] , 100}, - {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[3] , 105}, + {IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, + {IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[3] , 15}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[3] , 20}, + {IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[3] , 25}, + {IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[3] , 30}, + {IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[3] , 35}, + {IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[3] , 40}, + {IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[3] , 45}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[3] , 50}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[3] , 55}, + {IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[3] , 60}, + + {IT_HEADER, NULL, "Camera Controls", NULL, 67}, + {IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[3] , 75}, + {IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[3] , 80}, + {IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[3] , 85}, + + {IT_HEADER, NULL, "Deadzones", NULL, 92}, + {IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[3] , 100}, + {IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[3] , 105}, + + {IT_HEADER, NULL, "Miscellaneous", NULL, 112}, + {IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[3] , 120}, + {IT_STRING | IT_CVAR, NULL, "Set LED to skin color" , &cv_gamepadled[3] , 125}, + {IT_STRING | IT_CVAR, NULL, "Flash LED on powerups" , &cv_ledpowerup[3] , 130}, }; static menuitem_t OP_JoystickSetMenu[] = @@ -12401,7 +12433,8 @@ static void M_ResetControlsResponse(INT32 ch) CV_StealthSet(&cv_usejoystick[j], cv_usejoystick[j].defaultvalue); CV_StealthSet(&cv_turnaxis[j], cv_turnaxis[j].defaultvalue); - CV_StealthSet(&cv_strafeaxis[j], cv_strafeaxis[j].defaultvalue); + CV_StealthSet(&cv_camturnaxis[j], cv_camturnaxis[j].defaultvalue); + CV_StealthSet(&cv_camstrafeaxis[j], cv_camstrafeaxis[j].defaultvalue); CV_StealthSet(&cv_moveaxis[j], cv_moveaxis[j].defaultvalue); CV_StealthSet(&cv_brakeaxis[j], cv_brakeaxis[j].defaultvalue); CV_StealthSet(&cv_aimaxis[j], cv_aimaxis[j].defaultvalue); @@ -12413,7 +12446,6 @@ static void M_ResetControlsResponse(INT32 ch) CV_StealthSet(&cv_custom2axis[j], cv_custom2axis[j].defaultvalue); CV_StealthSet(&cv_custom3axis[j], cv_custom3axis[j].defaultvalue); } - S_StartSound(NULL, sfx_s224); } diff --git a/src/p_user.c b/src/p_user.c index 6dfe4d0af..48287b187 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3229,7 +3229,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) turnright = InputDown(gc_turnright, forplayer); turnleft = InputDown(gc_turnleft, forplayer); - axis = JoyAxis(AXISTURN, forplayer); + axis = JoyAxis(AXISCAMTURN, forplayer); if (encoremode) { @@ -3261,7 +3261,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) straferight = InputDown(gc_straferight, forplayer); strafeleft = InputDown(gc_strafeleft, forplayer); - axis = JoyAxis(AXISSTRAFE, forplayer); + axis = JoyAxis(AXISCAMSTRAFE, forplayer); if (encoremode) { -- 2.54.0 From 67aa31439b0d4d27fe4e0029efdd54d65ca6010a Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 12 Jan 2025 17:24:50 +0100 Subject: [PATCH 080/325] dont rumble in freecam state --- src/p_tick.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/p_tick.c b/src/p_tick.c index 8f5454ed6..ba1c8fa91 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -386,7 +386,12 @@ static void P_DeviceRumbleTick(void) continue; } - if (player->mo == NULL) + if (camera[i].freecam) + { + continue; + } + + if (P_MobjWasRemoved(player->mo)) { continue; } @@ -619,10 +624,7 @@ void P_Ticker(boolean run) PS_STOP_TIMING(ps_lua_thinkframe_time); } - // Run shield positioning - //P_RunShields(); P_RunOverlays(); - P_RunShadows(); P_UpdateSpecials(); -- 2.54.0 From 4942db2806bac1f097e5ce913c18a67ce73da907 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 13 Jan 2025 17:13:40 +0300 Subject: [PATCH 081/325] Add kartstats --- src/CMakeLists.txt | 2 + src/Makefile | 1 + src/doomstat.h | 3 - src/g_game.c | 15 ++--- src/k_kart.c | 3 + src/k_stats.c | 146 +++++++++++++++++++++++++++++++++++++++++++++ src/k_stats.h | 56 +++++++++++++++++ src/m_cond.c | 5 +- src/m_menu.c | 12 ++-- src/m_random.c | 4 +- src/p_map.c | 5 ++ src/p_tick.c | 4 +- 12 files changed, 232 insertions(+), 24 deletions(-) create mode 100644 src/k_stats.c create mode 100644 src/k_stats.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f31a9bd26..121cb9925 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -173,6 +173,7 @@ set(SRB2_CORE_GAME_SOURCES p_user.c k_director.c k_kart.c + k_stats.c i_time.c p_local.h @@ -187,6 +188,7 @@ set(SRB2_CORE_GAME_SOURCES p_tick.h k_director.h k_kart.h + k_stats.h ) if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) diff --git a/src/Makefile b/src/Makefile index 3b090873f..caaa36f4c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -506,6 +506,7 @@ OBJS:=$(i_main_o) \ $(OBJDIR)/st_stuff.o \ $(OBJDIR)/k_director.o \ $(OBJDIR)/k_kart.o \ + $(OBJDIR)/k_stats.o \ $(OBJDIR)/m_aatree.o \ $(OBJDIR)/m_anigif.o \ $(OBJDIR)/m_argv.o \ diff --git a/src/doomstat.h b/src/doomstat.h index f70f97059..7e83eab04 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -338,9 +338,6 @@ enum GameType // SRB2Kart // String names for gametypes extern const char *Gametype_Names[NUMGAMETYPES]; -extern tic_t totalplaytime; -extern UINT32 matchesplayed; - extern UINT8 stagefailed; // Emeralds stored as bits to throw savegame hackers off. diff --git a/src/g_game.c b/src/g_game.c index f12a72620..23dbade67 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -52,6 +52,7 @@ #include "md5.h" // demo checksums #include "k_director.h" // SRB2kart #include "k_kart.h" // SRB2kart +#include "k_stats.h" // SRB2kart #include "r_fps.h" // frame interpolation/uncapped #ifdef HAVE_DISCORDRPC @@ -175,8 +176,6 @@ INT32 tokenbits; // Used for setting token bits // Old Special Stage INT32 sstimer; // Time allotted in the special stage -tic_t totalplaytime; -UINT32 matchesplayed; // SRB2Kart boolean gamedataloaded = false; // Time attack data for levels @@ -2011,7 +2010,7 @@ static inline void G_PlayerFinishLevel(INT32 player) { if (legitimateexit && !demo.playback && !mapreset) // (yes you're allowed to unlock stuff this way when the game is modified) { - matchesplayed++; + kartstats.matchesplayed++; if (M_UpdateUnlockablesAndExtraEmblems(true)) S_StartSound(NULL, sfx_ncitem); G_SaveGameData(true); @@ -3139,6 +3138,8 @@ static void G_DoCompleted(void) if (demo.playback) goto demointermission; + K_StatRound(); + // go to next level // nextmap is 0-based, unlike gamemap if (nextmapoverride != 0) @@ -3482,8 +3483,6 @@ void G_LoadGameData(void) // to new gamedata G_ClearRecords(); // main and nights records M_ClearSecrets(); // emblems, unlocks, maps visited, etc - totalplaytime = 0; // total play time (separate from all) - matchesplayed = 0; // SRB2Kart: matches played & finished if (M_CheckParm("-nodata")) return; // Don't load. @@ -3512,8 +3511,7 @@ void G_LoadGameData(void) I_Error("Game data is from another version of SRB2.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } - totalplaytime = READUINT32(save.p); - matchesplayed = READUINT32(save.p); + K_ReadStats(&save, true); modded = READUINT8(save.p); @@ -3627,8 +3625,7 @@ void G_SaveGameData(boolean force) // Version test WRITEUINT32(save.p, 0xFCAFE211); - WRITEUINT32(save.p, totalplaytime); - WRITEUINT32(save.p, matchesplayed); + K_WriteStats(&save, true); btemp = (UINT8)(savemoddata); // what used to be here was profoundly dunderheaded WRITEUINT8(save.p, btemp); diff --git a/src/k_kart.c b/src/k_kart.c index 209f083e1..259ea8a3a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -34,6 +34,7 @@ #include "m_cond.h" #include "k_director.h" #include "k_kart.h" +#include "k_stats.h" #include "f_finale.h" #include "lua_hud.h" // For Lua hud checks #include "lua_hook.h" // For MobjDamage and ShouldDamage @@ -2518,6 +2519,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto if (LUA_HookPlayerSpin(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case. return; + K_StatPlayerHit(player, source ? source->player : NULL); + if (source && source != player->mo && source->player) K_PlayHitEmSound(source, player->mo); diff --git a/src/k_stats.c b/src/k_stats.c new file mode 100644 index 000000000..9b0c409df --- /dev/null +++ b/src/k_stats.c @@ -0,0 +1,146 @@ +#include "k_stats.h" +#include "doomstat.h" +#include "g_game.h" +#include "byteptr.h" + +kartstats_t kartstats = {0}; + +void K_StatTicker(void) +{ + if (demo.playback) + return; + + kartstats.totalplaytime++; + + if (netgame) + kartstats.onlineplaytime++; + else if (modeattacking) + kartstats.raplaytime++; + + if (G_RaceGametype()) + kartstats.raceplaytime++; + else + kartstats.battleplaytime++; + + // Should this also track splitscreen players? + if (!players[consoleplayer].spectator) + { + player_t *p = &players[consoleplayer]; + + if (p->kartstuff[k_position] == spbplace) + kartstats.spbtargettime++; + + if (max(p->kartstuff[k_spinouttimer], p->kartstuff[k_wipeoutslow]) > 0) + kartstats.spinouttime++; + } +} + +void K_StatPlayerHit(player_t *victim, player_t *source) +{ + if (demo.playback) + return; + + if (victim == &players[consoleplayer]) + { + if (victim == source) + kartstats.selfhits++; + } + else if (source == &players[consoleplayer]) + kartstats.hits++; +} + +void K_StatPlayerSink(player_t *victim, player_t *source) +{ + if (demo.playback) + return; + + if (victim == &players[consoleplayer]) + kartstats.sinked++; + else if (source == &players[consoleplayer]) + kartstats.sinks++; +} + +void K_StatRound(void) +{ + if (demo.playback) + return; + + int numplayers = 0; + + for (int i = 0; i < MAXPLAYERS; ++i) + { + if (playeringame[i] && !players[i].spectator) + ++numplayers; + } + + if (numplayers > 1) + { + if (players[consoleplayer].kartstuff[k_position] == 1) + kartstats.totalwins++; + else if (players[consoleplayer].kartstuff[k_position] <= 3) // Should this check if there are more than 3 players in game? + kartstats.totalpodium++; + } +} + +void K_EraseStats(void) +{ + // The only field we want to remember + boolean vanilla = kartstats.vanilla; + + memset(&kartstats, 0, sizeof(kartstats_t)); + + kartstats.vanilla = vanilla; +} + +void K_ReadStats(savebuffer_t *save, boolean vanilla) +{ + memset(&kartstats, 0, sizeof(kartstats_t)); + + kartstats.vanilla = vanilla; + + kartstats.totalplaytime = READUINT32(save->p); + kartstats.matchesplayed = READUINT32(save->p); + + // Vanilla only has those 2 + if (vanilla) + return; + + // So many similar-looking read's... scary... + kartstats.raplaytime = READUINT32(save->p); + kartstats.onlineplaytime = READUINT32(save->p); + kartstats.raceplaytime = READUINT32(save->p); + kartstats.battleplaytime = READUINT32(save->p); + kartstats.spbtargettime = READUINT32(save->p); + kartstats.spinouttime = READUINT32(save->p); + kartstats.totalwins = READUINT32(save->p); + kartstats.totalpodium = READUINT32(save->p); + kartstats.hits = READUINT32(save->p); + kartstats.selfhits = READUINT32(save->p); + kartstats.sinks = READUINT32(save->p); + kartstats.sinked = READUINT32(save->p); + kartstats.respawns = READUINT32(save->p); +} + +void K_WriteStats(savebuffer_t *save, boolean vanilla) +{ + WRITEUINT32(save->p, kartstats.totalplaytime); + WRITEUINT32(save->p, kartstats.matchesplayed); + + // Vanilla only has those 2 + if (vanilla) + return; + + WRITEUINT32(save->p, kartstats.raplaytime); + WRITEUINT32(save->p, kartstats.onlineplaytime); + WRITEUINT32(save->p, kartstats.raceplaytime); + WRITEUINT32(save->p, kartstats.battleplaytime); + WRITEUINT32(save->p, kartstats.spbtargettime); + WRITEUINT32(save->p, kartstats.spinouttime); + WRITEUINT32(save->p, kartstats.totalwins); + WRITEUINT32(save->p, kartstats.totalpodium); + WRITEUINT32(save->p, kartstats.hits); + WRITEUINT32(save->p, kartstats.selfhits); + WRITEUINT32(save->p, kartstats.sinks); + WRITEUINT32(save->p, kartstats.sinked); + WRITEUINT32(save->p, kartstats.respawns); +} diff --git a/src/k_stats.h b/src/k_stats.h new file mode 100644 index 000000000..87a173653 --- /dev/null +++ b/src/k_stats.h @@ -0,0 +1,56 @@ +#ifndef __K_STATS__ +#define __K_STATS__ + +#include "doomtype.h" +#include "d_player.h" +#include "p_saveg.h" + +typedef struct kartstats_s { + // Remember if stats we loaded are vanilla ones or not + boolean vanilla; + + // Vanilla + tic_t totalplaytime; + UINT32 matchesplayed; + + tic_t raplaytime; + tic_t onlineplaytime; + tic_t raceplaytime; + tic_t battleplaytime; + tic_t spbtargettime; + tic_t spinouttime; + UINT32 totalwins; // 1st place + UINT32 totalpodium; // 2nd and 3rd place, *but not 1st* + UINT32 hits; + UINT32 selfhits; + UINT32 sinks; // Times hitting *others* by kitchen sink + UINT32 sinked; // Times *being hit* by kitchen sink + UINT32 respawns; +} kartstats_t; + +extern kartstats_t kartstats; + +// Note: All stat-tracking functions check for demo.playback and early return if its true + +// Update global stats such as total play time, etc +void K_StatTicker(void); + +// Update hit-related stats (PlayerSpin, PlayerSquish, PlayerExplode) +void K_StatPlayerHit(player_t *victim, player_t *source); + +// Separate from stuff above +void K_StatPlayerSink(player_t *victim, player_t *source); + +// Update round-related stats (such as matchesplayed, totalwins, etc) +void K_StatRound(void); + +void K_EraseStats(void); + +// If vanilla is true, only read vanilla-supported fields. Everything else is initialized to 0 +void K_ReadStats(savebuffer_t *save, boolean vanilla); + +// Same as above, except it just doesn't write non-vanilla fields if vanilla is true +void K_WriteStats(savebuffer_t *save, boolean vanilla); + + +#endif diff --git a/src/m_cond.c b/src/m_cond.c index b777e7d22..fc33f36c6 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -21,6 +21,7 @@ #include "r_things.h" // numskins //#include "r_draw.h" // R_GetColorByName #include "k_kart.h" // K_GetKartColorByName +#include "k_stats.h" // Map triggers for linedef executors // 32 triggers, one bit each @@ -286,9 +287,9 @@ UINT8 M_CheckCondition(condition_t *cn) switch (cn->type) { case UC_PLAYTIME: // Requires total playing time >= x - return (totalplaytime >= (unsigned)cn->requirement); + return (kartstats.totalplaytime >= (unsigned)cn->requirement); case UC_MATCHESPLAYED: // Requires any level completed >= x times - return (matchesplayed >= (unsigned)cn->requirement); + return (kartstats.matchesplayed >= (unsigned)cn->requirement); case UC_GAMECLEAR: // Requires game beaten >= x times return (timesBeaten >= (unsigned)cn->requirement); case UC_ALLEMERALDS: // Requires game beaten with all 7 emeralds >= x times diff --git a/src/m_menu.c b/src/m_menu.c index fbe7e0ffb..d8c7dbc62 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -70,6 +70,7 @@ #include "st_stuff.h" #include "i_sound.h" #include "k_kart.h" // SRB2kart +#include "k_stats.h" // SRB2kart #include "d_player.h" // KITEM_ constants #include "i_joy.h" // for joystick menu controls @@ -8759,11 +8760,11 @@ static void M_DrawLevelStats(void) V_DrawString(20, 24, highlightflags|MENUCAPS, "Total Play Time:"); V_DrawCenteredString(BASEVIDWIDTH/2, 32, MENUCAPS, va("%i hours, %i minutes, %i seconds", - G_TicsToHours(totalplaytime), - G_TicsToMinutes(totalplaytime, false), - G_TicsToSeconds(totalplaytime))); + G_TicsToHours(kartstats.totalplaytime), + G_TicsToMinutes(kartstats.totalplaytime, false), + G_TicsToSeconds(kartstats.totalplaytime))); V_DrawString(20, 42, highlightflags|MENUCAPS, "Total Matches:"); - V_DrawRightAlignedString(BASEVIDWIDTH-16, 42, MENUCAPS, va("%i played", matchesplayed)); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 42, MENUCAPS, va("%i played", kartstats.matchesplayed)); for (i = 0; i < NUMMAPS; i++) { @@ -11745,8 +11746,7 @@ static void M_EraseDataResponse(INT32 ch) if (erasecontext == 2) { // SRB2Kart: This actually needs to be done FIRST, so that you don't immediately regain playtime/matches secrets - totalplaytime = 0; - matchesplayed = 0; + K_EraseStats(); F_StartIntro(); } if (erasecontext != 1) diff --git a/src/m_random.c b/src/m_random.c index 197f37239..9b4396cbd 100644 --- a/src/m_random.c +++ b/src/m_random.c @@ -14,7 +14,7 @@ #include "doomdef.h" #include "doomtype.h" -#include "doomstat.h" // totalplaytime +#include "k_stats.h" // kartstats.totalplaytime #include "m_random.h" #include "m_fixed.h" @@ -252,5 +252,5 @@ void P_SetRandSeedD(const char *rfile, INT32 rline, UINT32 seed) */ UINT32 M_RandomizedSeed(void) { - return ((totalplaytime & 0xFFFF) << 16)|M_RandomFixed(); + return ((kartstats.totalplaytime & 0xFFFF) << 16)|M_RandomFixed(); } diff --git a/src/p_map.c b/src/p_map.c index df03bcb76..e60142443 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -26,6 +26,7 @@ #include "s_sound.h" #include "w_wad.h" #include "k_kart.h" // SRB2kart 011617 +#include "k_stats.h" #include "hu_stuff.h" // SRB2kart #include "i_system.h" // SRB2kart @@ -719,6 +720,8 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->type == MT_PLAYER) { + K_StatPlayerSink(thing->player, P_MobjWasRemoved(tmthing->target) ? NULL : tmthing->target->player); + S_StartSound(NULL, sfx_bsnipe); //let all players hear it. HU_SetCEchoFlags(0); HU_SetCEchoDuration(5); @@ -986,6 +989,8 @@ static boolean PIT_CheckThing(mobj_t *thing) if ((thing->target == tmthing) && (thing->threshold > 0)) return true; + K_StatPlayerSink(tmthing->player, P_MobjWasRemoved(thing->target) ? NULL : thing->target->player); + S_StartSound(NULL, sfx_cgot); //let all players hear it. HU_SetCEchoFlags(0); HU_SetCEchoDuration(5); diff --git a/src/p_tick.c b/src/p_tick.c index 6996b4d4d..34bc28847 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -25,6 +25,7 @@ #include "lua_hook.h" #include "k_director.h" #include "k_kart.h" +#include "k_stats.h" #include "i_system.h" #include "r_main.h" #include "r_fps.h" @@ -610,8 +611,7 @@ void P_Ticker(boolean run) } // Keep track of how long they've been playing! - if (!demo.playback) // Don't increment if a demo is playing. - totalplaytime++; + K_StatTicker(); if (run) { -- 2.54.0 From 46e0c882802938acedc3e16f139c226615ff27cf Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 13 Jan 2025 10:47:38 +0100 Subject: [PATCH 082/325] make game use seperate save when addons are loaded so you can record attack and it will also keep saving to statistics also added a few things it now keeps track of TODO: unfuck the statistics page and add a 2nd one perhaps? due to space reasons menucode is hell --- src/dehacked.c | 9 ++++----- src/g_game.c | 34 +++++++++++++++++++++++++++++++--- src/m_menu.c | 2 +- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index e4b4028ef..6d5b8d4bc 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1756,7 +1756,7 @@ static void readsound(MYFILE *f, INT32 num, const char *savesfxnames[]) * \sa readmaincfg() * \author Graue */ -static boolean GoodDataFileName(const char *s) +/*static boolean GoodDataFileName(const char *s) { const char *p; const char *tail = ".dat"; @@ -1776,7 +1776,7 @@ static boolean GoodDataFileName(const char *s) if (fasticmp(s, "online.dat")) return false; // SRB2Kart online replay folder return true; -} +}*/ static void reademblemdata(MYFILE *f, INT32 num) { @@ -2554,8 +2554,7 @@ static void readmaincfg(MYFILE *f) { maxXtraLife = (UINT8)get_number(word2); } - - else if (fastcmp(word, "GAMEDATA")) + /*else if (fastcmp(word, "GAMEDATA")) { size_t filenamelen; @@ -2582,7 +2581,7 @@ static void readmaincfg(MYFILE *f) strcatbf(savegamename, srb2home, PATHSEP); refreshdirmenu |= REFRESHDIR_GAMEDATA; - } + }*/ else if (fastcmp(word, "RESETDATA")) { P_ResetData(value); diff --git a/src/g_game.c b/src/g_game.c index 23dbade67..19f31e4b9 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -599,6 +599,31 @@ tic_t G_GetBestTime(INT16 map) return mainrecords[map-1]->time; } +// hack t +static void G_SetSaveGameModified(void) +{ + size_t filenamelen; + + savemoddata = true; + majormods = false; // FIXME: this breaks the menu warning screen from popping up, id still want to use it to mention the diff savefile + + strlcpy(gamedatafilename, "modkartdata.dat", sizeof (gamedatafilename)); + strlwr(gamedatafilename); + + // Also save a time attack folder + filenamelen = strlen(gamedatafilename)-4; // Strip off the extension + filenamelen = min(filenamelen, sizeof (timeattackfolder)); + memcpy(timeattackfolder, gamedatafilename, filenamelen); + timeattackfolder[min(filenamelen, sizeof (timeattackfolder) - 1)] = '\0'; + + strcpy(savegamename, timeattackfolder); + strlcat(savegamename, "%u.ssg", sizeof(savegamename)); + // can't use sprintf since there is %u in savegamename + strcatbf(savegamename, srb2home, PATHSEP); + + G_LoadGameData(); +} + // for consistency among messages: this modifies the game and removes savemoddata. void G_SetGameModified(boolean silent, boolean major) { @@ -613,8 +638,10 @@ void G_SetGameModified(boolean silent, boolean major) //savemoddata = false; -- there is literally no reason to do this anymore. majormods = true; + G_SetSaveGameModified(); + if (!silent) - CONS_Alert(CONS_NOTICE, M_GetText("Game must be restarted to play Record Attack.\n")); + CONS_Alert(CONS_NOTICE, M_GetText("Record Attack data will be saved to seperate save.\n")); // If in record attack recording, cancel it. if (modeattacking) @@ -3511,7 +3538,8 @@ void G_LoadGameData(void) I_Error("Game data is from another version of SRB2.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } - K_ReadStats(&save, true); + // well no clue but dont think it would like reading garbage from vanilla files + K_ReadStats(&save, strcmp(gamedatafilename, "modkartdata.dat") == 0); modded = READUINT8(save.p); @@ -3625,7 +3653,7 @@ void G_SaveGameData(boolean force) // Version test WRITEUINT32(save.p, 0xFCAFE211); - K_WriteStats(&save, true); + K_WriteStats(&save, strcmp(gamedatafilename, "modkartdata.dat") == 0); btemp = (UINT8)(savemoddata); // what used to be here was profoundly dunderheaded WRITEUINT8(save.p, btemp); diff --git a/src/m_menu.c b/src/m_menu.c index d8c7dbc62..36330f1b7 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -6194,7 +6194,7 @@ static boolean M_AddonsRefresh(void) else if (majormods && !prevmajormods) { S_StartSound(NULL, sfx_s221); - message = va("%c%s\x80\nYou've loaded a gameplay-modifying addon.\n\nRecord Attack has been disabled, but you\ncan still play alone in local Multiplayer.\n\nIf you wish to play Record Attack mode, restart the game to disable loaded addons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); + message = va("%c%s\x80\nYou've loaded a gameplay-modifying addon.\n\nRecord Attack data will be saved to seperate save.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); prevmajormods = majormods; } -- 2.54.0 From cae9b754bc49aa8bd45050f426009661ce923da3 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 13 Jan 2025 17:37:50 +0300 Subject: [PATCH 083/325] Oops --- src/g_game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 19f31e4b9..260ac9cdb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3539,7 +3539,7 @@ void G_LoadGameData(void) } // well no clue but dont think it would like reading garbage from vanilla files - K_ReadStats(&save, strcmp(gamedatafilename, "modkartdata.dat") == 0); + K_ReadStats(&save, strcmp(gamedatafilename, "modkartdata.dat") != 0); modded = READUINT8(save.p); @@ -3653,7 +3653,7 @@ void G_SaveGameData(boolean force) // Version test WRITEUINT32(save.p, 0xFCAFE211); - K_WriteStats(&save, strcmp(gamedatafilename, "modkartdata.dat") == 0); + K_WriteStats(&save, strcmp(gamedatafilename, "modkartdata.dat") != 0); btemp = (UINT8)(savemoddata); // what used to be here was profoundly dunderheaded WRITEUINT8(save.p, btemp); -- 2.54.0 From 4e4871fe93a0ce89ec8f995ae80b69ee821d4a74 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 13 Jan 2025 15:52:12 +0100 Subject: [PATCH 084/325] remove "errorshitspam" hooklib refactor indirectly fixed the root issue, so this is not needed anymore --- src/m_menu.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index fbe7e0ffb..6c14bdef8 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -6154,8 +6154,6 @@ static void M_AddonsClearName(INT32 choice) M_StopMessage(choice); } -int errorshitspam = 0; // prevent the warning screen from crapping itself when errors get spammed lmao - // returns whether to do message draw static boolean M_AddonsRefresh(void) { @@ -6184,11 +6182,10 @@ static boolean M_AddonsRefresh(void) else message = va("%c%s\x80\nA file was not loaded.\nCheck the console log for more information.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); } - else if ((refreshdirmenu & (REFRESHDIR_WARNING | REFRESHDIR_ERROR)) && !errorshitspam) + else if (refreshdirmenu & (REFRESHDIR_WARNING | REFRESHDIR_ERROR)) { S_StartSound(NULL, sfx_s224); message = va("%c%s\x80\nA file was loaded with %s.\nCheck the console log for more information.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname, ((refreshdirmenu & REFRESHDIR_ERROR) ? "errors" : "warnings")); - errorshitspam = 1; // you already said that shit } else if (majormods && !prevmajormods) { @@ -6540,7 +6537,6 @@ static void M_HandleAddons(INT32 choice) if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING) || DumbStartsWith("kc_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) { M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); - errorshitspam = 0; // reset it so it can show the warning screen again lmao } else S_StartSound(NULL, sfx_s26d); @@ -6548,7 +6544,6 @@ static void M_HandleAddons(INT32 choice) else { COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); - errorshitspam = 0; // reset it so it can show the warning screen again lmao } break; default: -- 2.54.0 From 591a2e5dbb0d4e8fdd9c50a2807e960c4798f420 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 13 Jan 2025 17:52:41 +0300 Subject: [PATCH 085/325] Forgor respawns --- src/g_game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 260ac9cdb..34c1463cc 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2341,6 +2341,9 @@ void G_PlayerReborn(INT32 player) // If NiGHTS, find lowest mare to start with. p->mare = 0; + + if (!demo.playback && p == &players[consoleplayer]) + kartstats.respawns++; } // -- 2.54.0 From e7d3e031699481e4829896ca40daca5bf84490e8 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 13 Jan 2025 14:25:14 +0300 Subject: [PATCH 086/325] Clear menus when running 'map' command --- src/d_netcmd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index b01f87e5a..0fd28fc25 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2702,6 +2702,8 @@ static void Command_Map_f(void) return; } + M_ClearMenus(true); + last_map_cmd = I_GetTime(); size_t first_option; @@ -2894,6 +2896,7 @@ static void Command_Map_f(void) } fromlevelselect = false; + D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false); Z_Free(realmapname); -- 2.54.0 From cd3e664e6a9080350747b5a1cf1ffb40c9a13c82 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 12 Jan 2025 03:07:46 +0100 Subject: [PATCH 087/325] oops fix menu stuff --- src/k_kart.c | 23 ++++++++++++----------- src/m_menu.c | 8 ++++---- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 209f083e1..0b801dbfd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -798,18 +798,19 @@ void K_RegisterKartStuff(void) REG_HUD_OFFSET_X(name)\ REG_HUD_OFFSET_Y(name) - REG_HUD_OFFSET(item); // Item box - REG_HUD_OFFSET(time); // Time - REG_HUD_OFFSET(laps); // Number of laps - REG_HUD_OFFSET(dnft); // Countdown (did not finish timer) - REG_HUD_OFFSET(speed); // Speedometer - REG_HUD_OFFSET(posi); // Position in race - REG_HUD_OFFSET(face); // Mini rankings - REG_HUD_OFFSET(stcd); // Starting countdown + REG_HUD_OFFSET(item); // Item box + REG_HUD_OFFSET(time); // Time + REG_HUD_OFFSET(laps); // Number of laps + REG_HUD_OFFSET(dnft); // Countdown (did not finish timer) + REG_HUD_OFFSET(speed); // Speedometer + REG_HUD_OFFSET(posi); // Position in race + REG_HUD_OFFSET(wheel); // Position in race + REG_HUD_OFFSET(face); // Mini rankings + REG_HUD_OFFSET(stcd); // Starting countdown REG_HUD_OFFSET_Y(chek); // Check gfx - REG_HUD_OFFSET(mini); // Minimap - REG_HUD_OFFSET(want); // Wanted - REG_HUD_OFFSET(stat); // Stats + REG_HUD_OFFSET(mini); // Minimap + REG_HUD_OFFSET(want); // Wanted + REG_HUD_OFFSET(stat); // Stats #undef REG_HUD_OFFSET #undef REG_HUD_OFFSET_X diff --git a/src/m_menu.c b/src/m_menu.c index 6c14bdef8..91ca80b58 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2386,12 +2386,12 @@ static menuitem_t OP_HudOffsetMenu[] = {IT_STRING | IT_CVAR, NULL, "Vertical Offset", &cv_mini_yoffset, 125}, {IT_HEADER, NULL, "Position Number", NULL, 135}, - {IT_STRING | IT_CVAR, NULL, "Horizontal Offset", &cv_wheel_xoffset, 140}, - {IT_STRING | IT_CVAR, NULL, "Vertical Offset", &cv_wheel_yoffset, 145}, + {IT_STRING | IT_CVAR, NULL, "Horizontal Offset", &cv_posi_xoffset, 140}, + {IT_STRING | IT_CVAR, NULL, "Vertical Offset", &cv_posi_yoffset, 145}, {IT_HEADER, NULL, "R.A. Wheel", NULL, 155}, - {IT_STRING | IT_CVAR, NULL, "Horizontal Offset", &cv_posi_xoffset, 160}, - {IT_STRING | IT_CVAR, NULL, "Vertical Offset", &cv_posi_yoffset, 165}, + {IT_STRING | IT_CVAR, NULL, "Horizontal Offset", &cv_wheel_xoffset, 160}, + {IT_STRING | IT_CVAR, NULL, "Vertical Offset", &cv_wheel_yoffset, 165}, {IT_HEADER, NULL, "Stat Display", NULL, 175}, {IT_STRING | IT_CVAR, NULL, "Horizontal Offset", &cv_stat_xoffset, 180}, -- 2.54.0 From bb7c217ccc63ea26c3b42e573e67fedac19ac905 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 13 Jan 2025 16:37:56 +0100 Subject: [PATCH 088/325] remove "majormods" checks from stuff that saves to savegame so its only there to throw a notice when you load an addon --- src/d_netcmd.c | 8 ++------ src/g_game.c | 12 +++--------- src/m_cond.c | 4 +--- src/m_menu.c | 11 ----------- src/p_setup.c | 4 ++-- src/y_inter.c | 2 +- 6 files changed, 9 insertions(+), 32 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index b01f87e5a..3a2b90369 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5801,12 +5801,8 @@ static void Fishcake_OnChange(void) */ static void Command_Isgamemodified_f(void) { - if (majormods) - CONS_Printf("The game has been modified with major addons, so you cannot play Record Attack.\n"); - else if (savemoddata) - CONS_Printf("The game has been modified with an addon with its own save data, so you can play Record Attack and earn medals.\n"); - else if (modifiedgame) - CONS_Printf("The game has been modified with only minor addons. You can play Record Attack, earn medals and unlock extras.\n"); + if (majormods || modifiedgame) + CONS_Printf("The game has been modified, Record Attack data will be saved to a seperate savegame.\n"); else CONS_Printf("The game has not been modified. You can play Record Attack, earn medals and unlock extras.\n"); } diff --git a/src/g_game.c b/src/g_game.c index 34c1463cc..76b837dcf 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -599,13 +599,12 @@ tic_t G_GetBestTime(INT16 map) return mainrecords[map-1]->time; } -// hack t +// kinda hacky way to do this, but this sets the game to use a seperate savefile if you have addons loaded static void G_SetSaveGameModified(void) { size_t filenamelen; savemoddata = true; - majormods = false; // FIXME: this breaks the menu warning screen from popping up, id still want to use it to mention the diff savefile strlcpy(gamedatafilename, "modkartdata.dat", sizeof (gamedatafilename)); strlwr(gamedatafilename); @@ -638,6 +637,7 @@ void G_SetGameModified(boolean silent, boolean major) //savemoddata = false; -- there is literally no reason to do this anymore. majormods = true; + // should this only be done when you load a "major" gameplay modifieng addon? G_SetSaveGameModified(); if (!silent) @@ -3635,6 +3635,7 @@ void G_SaveGameData(boolean force) INT32 i, j; UINT8 btemp; savebuffer_t save; + (void)force; if (!gamedataloaded) return; // If never loaded (-nodata), don't save @@ -3646,13 +3647,6 @@ void G_SaveGameData(boolean force) return; } - if (majormods && !force) - { - free(save.buffer); - save.p = save.buffer = NULL; - return; - } - // Version test WRITEUINT32(save.p, 0xFCAFE211); diff --git a/src/m_cond.c b/src/m_cond.c index fc33f36c6..f9d871969 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -385,9 +385,7 @@ UINT8 M_UpdateUnlockablesAndExtraEmblems(boolean force) INT32 i; char cechoText[992] = ""; UINT8 cechoLines = 0; - - if (majormods && !force) // SRB2Kart: for enabling unlocks online in modified servers - return false; + (void)force; M_CheckUnlockConditions(); diff --git a/src/m_menu.c b/src/m_menu.c index 36330f1b7..696cffbdd 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4100,17 +4100,6 @@ boolean M_Responder(event_t *ev) if (routine) { - if (((currentMenu->menuitems[itemOn].status & IT_TYPE)==IT_CALL - || (currentMenu->menuitems[itemOn].status & IT_TYPE)==IT_SUBMENU) - && (currentMenu->menuitems[itemOn].status & IT_CALLTYPE)) - { - if (((currentMenu->menuitems[itemOn].status & IT_CALLTYPE) & IT_CALL_NOTMODIFIED) && majormods) - { - S_StartSound(NULL, sfx_menu1); - M_StartMessage(M_GetText("This cannot be done with complex addons\nor in a cheated game.\n\n(Press a key)\n"), NULL, MM_NOTHING); - return true; - } - } S_StartSound(NULL, sfx_menu1); switch (currentMenu->menuitems[itemOn].status & IT_TYPE) { diff --git a/src/p_setup.c b/src/p_setup.c index 3b2ed7714..362cd71d0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -988,7 +988,7 @@ static inline void P_SpawnEmblems(void) static void P_SpawnSecretItems(boolean loademblems) { // Now let's spawn those funky emblem things! Tails 12-08-2002 - if (netgame || multiplayer || majormods) // No cheating!! + if (netgame || multiplayer) // No cheating!! return; if (loademblems) @@ -2976,7 +2976,7 @@ boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate) nextmapoverride = 0; skipstats = false; - if (!(netgame || multiplayer) && !majormods) + if (!(netgame || multiplayer)) mapvisited[gamemap-1] |= MV_VISITED; levelloading = false; diff --git a/src/y_inter.c b/src/y_inter.c index 61f4a069b..cce19ad7f 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -844,7 +844,7 @@ void Y_StartIntermission(void) } case int_race: // (time-only race) { - if (!majormods && !multiplayer && !demo.playback) // remove this once we have a proper time attack screen + if (!multiplayer && !demo.playback) // remove this once we have a proper time attack screen { // Update visitation flags mapvisited[gamemap-1] |= MV_BEATEN; -- 2.54.0 From e2e356d0c201fb15d9883a7e65f96fec7d0029b9 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 13 Jan 2025 16:41:45 +0100 Subject: [PATCH 089/325] save vanilla save when switching to modified savegame also add check so we dont rerun this everytime setgamemodified is called --- src/g_game.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 76b837dcf..7058bd215 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -604,6 +604,12 @@ static void G_SetSaveGameModified(void) { size_t filenamelen; + if (savemoddata) + return; + + // save vanilla data just to be sure + G_SaveGameData(true); + savemoddata = true; strlcpy(gamedatafilename, "modkartdata.dat", sizeof (gamedatafilename)); -- 2.54.0 From cd76cc0e9f6f50c585d9c475f74126d3a0c476b4 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 13 Jan 2025 17:42:22 +0100 Subject: [PATCH 090/325] no need to strcmp just check for "savemoddata" that bool only ever gets set to true if the savegame has been switched to the modded one and unlike in srb2 this WILL never be reset to false again --- src/g_game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 7058bd215..cc69f3510 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3548,7 +3548,7 @@ void G_LoadGameData(void) } // well no clue but dont think it would like reading garbage from vanilla files - K_ReadStats(&save, strcmp(gamedatafilename, "modkartdata.dat") != 0); + K_ReadStats(&save, !savemoddata); modded = READUINT8(save.p); @@ -3656,7 +3656,7 @@ void G_SaveGameData(boolean force) // Version test WRITEUINT32(save.p, 0xFCAFE211); - K_WriteStats(&save, strcmp(gamedatafilename, "modkartdata.dat") != 0); + K_WriteStats(&save, !savemoddata); btemp = (UINT8)(savemoddata); // what used to be here was profoundly dunderheaded WRITEUINT8(save.p, btemp); -- 2.54.0 From e3adcfb62e5e331d35dbb1ad4b9c79cc60a028f6 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 13 Jan 2025 23:10:56 +0300 Subject: [PATCH 091/325] Player kartstuff's get reset in G_PlayerFinishLevel, so need to call K_StatRound earlier --- src/g_game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index cc69f3510..52481b948 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3148,6 +3148,8 @@ static void G_DoCompleted(void) if (metalrecording) G_StopMetalRecording(); + K_StatRound(); + for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) { @@ -3174,8 +3176,6 @@ static void G_DoCompleted(void) if (demo.playback) goto demointermission; - K_StatRound(); - // go to next level // nextmap is 0-based, unlike gamemap if (nextmapoverride != 0) -- 2.54.0 From 976c74d69450b826a7914c6bf4e23d2035c7ad3a Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 13 Jan 2025 23:17:51 +0300 Subject: [PATCH 092/325] G_PlayerReborn didn't work for 'respawns' stats, maybe G_DoReborn will? --- src/g_game.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 52481b948..59b5c58e1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2347,9 +2347,6 @@ void G_PlayerReborn(INT32 player) // If NiGHTS, find lowest mare to start with. p->mare = 0; - - if (!demo.playback && p == &players[consoleplayer]) - kartstats.respawns++; } // @@ -2719,6 +2716,9 @@ void G_DoReborn(INT32 playernum) G_SpawnPlayer(playernum, starpost); if (oldmo) G_ChangePlayerReferences(oldmo, players[playernum].mo); + + if (!demo.playback && playernum == consoleplayer) + kartstats.respawns++; } } -- 2.54.0 From 2c3ff3a628a7902be9e927ff3aa1292024eaf0ec Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 15 Jan 2025 11:54:56 +0100 Subject: [PATCH 093/325] dont throw a warning about addons with custom gamedata just ignore it --- src/dehacked.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 6d5b8d4bc..9acf2006b 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2554,9 +2554,10 @@ static void readmaincfg(MYFILE *f) { maxXtraLife = (UINT8)get_number(word2); } - /*else if (fastcmp(word, "GAMEDATA")) + else if (fastcmp(word, "GAMEDATA")) { - size_t filenamelen; + // just ignore it but dont throw a warning + /*size_t filenamelen; // Check the data filename so that mods // can't write arbitrary files. @@ -2580,8 +2581,8 @@ static void readmaincfg(MYFILE *f) // can't use sprintf since there is %u in savegamename strcatbf(savegamename, srb2home, PATHSEP); - refreshdirmenu |= REFRESHDIR_GAMEDATA; - }*/ + refreshdirmenu |= REFRESHDIR_GAMEDATA;*/ + } else if (fastcmp(word, "RESETDATA")) { P_ResetData(value); -- 2.54.0 From 6f7a52a6a6f62229afc88f58568707e6feb6469b Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 15 Jan 2025 12:57:35 +0100 Subject: [PATCH 094/325] make freecam strafe be affected by freecamspeed cvar --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index d0cbc9670..698401129 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3511,7 +3511,7 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) if (cmd->sidemove != 0) // was disabled in practice anyways, since sidemove was suppressed { //False I fixed this shit - Nep - fixed_t spd = cmd->sidemove*mapobjectscale; + fixed_t spd = cmd->forwardmove*mapobjectscale*cv_freecam_speed.value; thrustangle = (cam->angle-ANGLE_90) >> ANGLETOFINESHIFT; cam->x += FixedMul(spd, FINECOSINE(thrustangle)); -- 2.54.0 From 1db9bcd6c97e62160d27f97dc79488d4ef2c1a0f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 15 Jan 2025 12:59:00 +0100 Subject: [PATCH 095/325] oops --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 698401129..3068e7b67 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3511,7 +3511,7 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) if (cmd->sidemove != 0) // was disabled in practice anyways, since sidemove was suppressed { //False I fixed this shit - Nep - fixed_t spd = cmd->forwardmove*mapobjectscale*cv_freecam_speed.value; + fixed_t spd = cmd->sidemove*mapobjectscale*cv_freecam_speed.value; thrustangle = (cam->angle-ANGLE_90) >> ANGLETOFINESHIFT; cam->x += FixedMul(spd, FINECOSINE(thrustangle)); -- 2.54.0 From 7991dafe644d34afb5bd2d338d1aa35dd9430b6c Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 19 Jan 2025 02:28:16 +0300 Subject: [PATCH 096/325] Make custom stats fully compatible between different versions, so new fields can be added in future without save corruptions --- src/k_stats.c | 98 +++++++++++++++++++++++++++++++++++++++++++-------- src/k_stats.h | 10 ++++++ 2 files changed, 94 insertions(+), 14 deletions(-) diff --git a/src/k_stats.c b/src/k_stats.c index 9b0c409df..590d3b8df 100644 --- a/src/k_stats.c +++ b/src/k_stats.c @@ -2,6 +2,7 @@ #include "doomstat.h" #include "g_game.h" #include "byteptr.h" +#include "z_zone.h" kartstats_t kartstats = {0}; @@ -65,6 +66,8 @@ void K_StatRound(void) if (demo.playback) return; + kartstats.somenewfield = 42; + int numplayers = 0; for (int i = 0; i < MAXPLAYERS; ++i) @@ -87,23 +90,18 @@ void K_EraseStats(void) // The only field we want to remember boolean vanilla = kartstats.vanilla; + if (kartstats.copy) + Z_Free(kartstats.copy); + memset(&kartstats, 0, sizeof(kartstats_t)); kartstats.vanilla = vanilla; } -void K_ReadStats(savebuffer_t *save, boolean vanilla) +static void K_ReadStatsCustom(savebuffer_t *save) { - memset(&kartstats, 0, sizeof(kartstats_t)); - - kartstats.vanilla = vanilla; - - kartstats.totalplaytime = READUINT32(save->p); - kartstats.matchesplayed = READUINT32(save->p); - - // Vanilla only has those 2 - if (vanilla) - return; + kartstats.size = READUINT32(save->p); + kartstats.version = READUINT32(save->p); // So many similar-looking read's... scary... kartstats.raplaytime = READUINT32(save->p); @@ -119,17 +117,51 @@ void K_ReadStats(savebuffer_t *save, boolean vanilla) kartstats.sinks = READUINT32(save->p); kartstats.sinked = READUINT32(save->p); kartstats.respawns = READUINT32(save->p); + + // If kartstats gets updated, uncomment this and read next fields after this early return. Do same on next updates, + // this way even data is read on different versions, it doesn't get corrupted (as long as fields aren't removed, which shouldn't happen) + //if (kartstats.version < 2) + // return; + // + //kartstats.somenewfield = READUINT32(save->p); } -void K_WriteStats(savebuffer_t *save, boolean vanilla) +void K_ReadStats(savebuffer_t *save, boolean vanilla) { - WRITEUINT32(save->p, kartstats.totalplaytime); - WRITEUINT32(save->p, kartstats.matchesplayed); + // Basically, free old kartstats.copy if needed and memset kartstats with zeros + K_EraseStats(); + + kartstats.vanilla = vanilla; + + kartstats.totalplaytime = READUINT32(save->p); + kartstats.matchesplayed = READUINT32(save->p); // Vanilla only has those 2 if (vanilla) return; + // Save where block of custom stats starts + UINT8 *customblockstart = save->p; + + K_ReadStatsCustom(save); + + // Make a copy of entire custom stats block, so unread values will still be written back + kartstats.copy = Z_Malloc(kartstats.size, PU_STATIC, NULL); + memcpy(kartstats.copy, customblockstart, kartstats.size); + + // If there were extra fields we couldn't read, skip them + save->p = customblockstart + kartstats.size; +} + +static void K_WriteStatsCustom(savebuffer_t *save) +{ + // Update, if needed + kartstats.version = max(kartstats.version, KARTSTATSVERSION); + + WRITEUINT32(save->p, kartstats.size); // Note: if we will end up writing more that stored in there, this field in save file would be updated + WRITEUINT32(save->p, kartstats.version); + + // Version 1 WRITEUINT32(save->p, kartstats.raplaytime); WRITEUINT32(save->p, kartstats.onlineplaytime); WRITEUINT32(save->p, kartstats.raceplaytime); @@ -143,4 +175,42 @@ void K_WriteStats(savebuffer_t *save, boolean vanilla) WRITEUINT32(save->p, kartstats.sinks); WRITEUINT32(save->p, kartstats.sinked); WRITEUINT32(save->p, kartstats.respawns); + + // No need for early returns, but please mark each new block of write's with version it corresponds to :3 + + // Version 2 + //WRITEUINT32(save->p, kartstats.somenewfield); +} + +void K_WriteStats(savebuffer_t *save, boolean vanilla) +{ + WRITEUINT32(save->p, kartstats.totalplaytime); + WRITEUINT32(save->p, kartstats.matchesplayed); + + // Vanilla only has those 2 + if (vanilla) + return; + + // Now need to be careful... We save start of custom stats block + UINT8 *customblockstart = save->p; + + // Write everything we know how to write + K_WriteStatsCustom(save); + + // Calculate size of data that we wrote + UINT32 size = (UINT32)(save->p - customblockstart); + + // Now, if we wrote less data than save originally had, that means our copy that we kept in K_ReadStats + // has stats from newer version that we need to append + if (size < kartstats.size) + { + I_Assert(kartstats.copy != NULL); // If kartstats.copy is null, kartstats.size **always** should be 0, this can only happen if we create new save + WRITEMEM(save->p, kartstats.copy + size, kartstats.size - size); + } + else if (size > kartstats.size) // No need to do anything if we wrote exactly same amount... + { + // ...but, if we wrote more, we need to update size field in header. **It's always located at start of block** + // So we can just: + WRITEUINT32(customblockstart, size); + } } diff --git a/src/k_stats.h b/src/k_stats.h index 87a173653..bd145de56 100644 --- a/src/k_stats.h +++ b/src/k_stats.h @@ -5,6 +5,8 @@ #include "d_player.h" #include "p_saveg.h" +#define KARTSTATSVERSION 1 + typedef struct kartstats_s { // Remember if stats we loaded are vanilla ones or not boolean vanilla; @@ -13,6 +15,12 @@ typedef struct kartstats_s { tic_t totalplaytime; UINT32 matchesplayed; + // Custom data, fields go in same order as they are written into game save + + // IMPORTANT: size **must be first**, so K_WriteStats can overwrite it (not that we're gonna change order, but just in case) + UINT32 size; // Size required for our stats. If older version reads save from newer one, it will just skip unread fields, avoiding reading corrupted values + UINT32 version; // Version, so we know which fields we actually can read + tic_t raplaytime; tic_t onlineplaytime; tic_t raceplaytime; @@ -26,6 +34,8 @@ typedef struct kartstats_s { UINT32 sinks; // Times hitting *others* by kitchen sink UINT32 sinked; // Times *being hit* by kitchen sink UINT32 respawns; + + UINT8 *copy; // Copy of stats block that has been read from file. In case we're older version that reads newer save, we will keep values that we couldn't read } kartstats_t; extern kartstats_t kartstats; -- 2.54.0 From 7260c2c77ecdb753bd127cd1797a96034f5d2f35 Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 19 Jan 2025 02:29:41 +0300 Subject: [PATCH 097/325] That was from testing a --- src/k_stats.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/k_stats.c b/src/k_stats.c index 590d3b8df..0af547780 100644 --- a/src/k_stats.c +++ b/src/k_stats.c @@ -66,8 +66,6 @@ void K_StatRound(void) if (demo.playback) return; - kartstats.somenewfield = 42; - int numplayers = 0; for (int i = 0; i < MAXPLAYERS; ++i) -- 2.54.0 From 8ceda27817330d6ed938fb23606c9cb0c57e62b5 Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 19 Jan 2025 02:43:18 +0300 Subject: [PATCH 098/325] Wipe kart stats on game data reload --- src/g_game.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_game.c b/src/g_game.c index 59b5c58e1..b644e2796 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3519,6 +3519,7 @@ void G_LoadGameData(void) // to new gamedata G_ClearRecords(); // main and nights records M_ClearSecrets(); // emblems, unlocks, maps visited, etc + K_EraseStats(); // stats if (M_CheckParm("-nodata")) return; // Don't load. -- 2.54.0 From c589d04a324ca3bf66ce221cb3bc98631f5eb0b9 Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 19 Jan 2025 02:55:39 +0300 Subject: [PATCH 099/325] New statistics menu (WIP) --- src/m_menu.c | 170 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 133 insertions(+), 37 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 696cffbdd..d9bc816f8 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -8605,9 +8605,28 @@ static void M_Credits(INT32 choice) // STATISTICS MENU // =============== +static void M_DrawStatsMaps(void); +static void M_DrawStatsPlaytime(void); +static void M_DrawStatsExtra(void); // dunno how to name this one + static INT32 statsLocation; static INT32 statsMax; static INT16 statsMapList[NUMMAPS+1]; +static UINT8 statsCurrentPage = 0; + +typedef struct statpage_s { + const char *title; + void (*drawer)(void); +} statpage_t; + +static statpage_t statsPages[] = { + { "Level Statistics", M_DrawStatsMaps, }, + { "Play Time Statistics", M_DrawStatsPlaytime, }, + { "Extra Statistics", M_DrawStatsExtra, }, +}; + +#define LENSTATSPAGES (sizeof(statsPages)/sizeof(statsPages[0])) +#define NUMSTATSPAGES (kartstats.vanilla ? 2 : LENSTATSPAGES) static void M_Statistics(INT32 choice) { @@ -8634,6 +8653,7 @@ static void M_Statistics(INT32 choice) statsMapList[j] = -1; statsMax = j - 11 + numextraemblems; statsLocation = 0; + statsCurrentPage = 0; if (statsMax < 0) statsMax = 0; @@ -8641,13 +8661,45 @@ static void M_Statistics(INT32 choice) M_SetupNextMenu(&SP_LevelStatsDef); } -static void M_DrawStatsMaps(int location) +static void M_DrawStatsMaps(void) { - INT32 y = 80, i = -1; + char beststr[40]; + tic_t besttime = 0; + INT32 mapsunfinished = 0; + + int location = statsLocation; + INT32 y = 62, i = -1, j; INT16 mnum; extraemblem_t *exemblem; boolean dotopname = true, dobottomarrow = (location < statsMax); + for (j = 0; j < NUMMAPS; j++) + { + if (!mapheaderinfo[j] || !(mapheaderinfo[j]->menuflags & LF2_RECORDATTACK)) + continue; + + if (!mainrecords[j] || mainrecords[j]->time <= 0) + { + mapsunfinished++; + continue; + } + + besttime += mainrecords[j]->time; + } + + V_DrawString(20, 42, highlightflags|MENUCAPS, "Combined time records:"); + + sprintf(beststr, "%i:%02i:%02i.%02i", G_TicsToHours(besttime), G_TicsToMinutes(besttime, false), G_TicsToSeconds(besttime), G_TicsToCentiseconds(besttime)); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 42, (mapsunfinished ? warningflags : 0), beststr); + + if (mapsunfinished) + V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, warningflags|MENUCAPS, va("(%d unfinished)", mapsunfinished)); + else + V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, recommendedflags|MENUCAPS, "(complete)"); + + V_DrawString(32, 50, MENUCAPS, va("x %d/%d", M_CountEmblems(), numemblems+numextraemblems)); + V_DrawSmallScaledPatch(20, 50, 0, W_CachePatchName("GOTITA", PU_STATIC)); + if (location) V_DrawCharacter(10, y-(skullAnimCounter/5), '\x1A' | highlightflags, false); // up arrow @@ -8736,53 +8788,74 @@ bottomarrow: '\x1B' | highlightflags, false); // down arrow } -static void M_DrawLevelStats(void) +#define DRAWTIMESTAT(y, title, field) { \ + char timebuf[80]; \ + V_DrawString(20, (y), highlightflags|MENUCAPS, title); \ + tic_t timeval = kartstats.field; \ + snprintf(timebuf, 80, "%02i:%02i:%02i", G_TicsToHours(timeval), G_TicsToMinutes(timeval, false), G_TicsToSeconds(timeval)); \ + V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), MENUCAPS, timebuf); \ + } + +#define DRAWAMOUNTSTAT(y, title, field) { \ + V_DrawString(20, (y), highlightflags|MENUCAPS, title); \ + unsigned amountval = kartstats.field; \ + V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), MENUCAPS, va("%u", amountval)); \ + } + +static void M_DrawStatsPlaytime(void) { - char beststr[40]; - - tic_t besttime = 0; - - INT32 i; - INT32 mapsunfinished = 0; - - M_DrawMenuTitle(); - - V_DrawString(20, 24, highlightflags|MENUCAPS, "Total Play Time:"); - V_DrawCenteredString(BASEVIDWIDTH/2, 32, MENUCAPS, va("%i hours, %i minutes, %i seconds", + V_DrawString(20, 42, highlightflags|MENUCAPS, "Total Play Time:"); + V_DrawCenteredString(BASEVIDWIDTH/2, 52, MENUCAPS, va("%i hours, %i minutes, %i seconds", G_TicsToHours(kartstats.totalplaytime), G_TicsToMinutes(kartstats.totalplaytime, false), G_TicsToSeconds(kartstats.totalplaytime))); - V_DrawString(20, 42, highlightflags|MENUCAPS, "Total Matches:"); - V_DrawRightAlignedString(BASEVIDWIDTH-16, 42, MENUCAPS, va("%i played", kartstats.matchesplayed)); + V_DrawString(20, 62, highlightflags|MENUCAPS, "Total Matches:"); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 62, MENUCAPS, va("%i played", kartstats.matchesplayed)); - for (i = 0; i < NUMMAPS; i++) - { - if (!mapheaderinfo[i] || !(mapheaderinfo[i]->menuflags & LF2_RECORDATTACK)) - continue; + // Nothing else to draw + if (kartstats.vanilla) + return; - if (!mainrecords[i] || mainrecords[i]->time <= 0) - { - mapsunfinished++; - continue; - } + DRAWTIMESTAT(82, "RA Play Time:", raplaytime); + DRAWTIMESTAT(92, "Online Play Time:", onlineplaytime); + DRAWTIMESTAT(102, "Race Play Time:", raceplaytime); + DRAWTIMESTAT(112, "Battle Play Time:", battleplaytime); +} - besttime += mainrecords[i]->time; - } +// Note: only available with non-vanilla stats loaded, so it doesn't check for that +static void M_DrawStatsExtra(void) +{ + DRAWTIMESTAT(42, "Time being SPB target:", spbtargettime); + DRAWTIMESTAT(52, "Time spent in spinout:", spinouttime); - V_DrawString(20, 62, highlightflags|MENUCAPS, "Combined time records:"); + DRAWAMOUNTSTAT(72, "Total wins:", totalwins); + DRAWAMOUNTSTAT(82, "Total podium (2nd/3rd place):", totalwins); - sprintf(beststr, "%i:%02i:%02i.%02i", G_TicsToHours(besttime), G_TicsToMinutes(besttime, false), G_TicsToSeconds(besttime), G_TicsToCentiseconds(besttime)); - V_DrawRightAlignedString(BASEVIDWIDTH-16, 62, (mapsunfinished ? warningflags : 0), beststr); + DRAWAMOUNTSTAT(102, "Hits landed:", hits); + DRAWAMOUNTSTAT(112, "Self-hits landed:", selfhits); - if (mapsunfinished) - V_DrawRightAlignedString(BASEVIDWIDTH-16, 70, warningflags|MENUCAPS, va("(%d unfinished)", mapsunfinished)); - else - V_DrawRightAlignedString(BASEVIDWIDTH-16, 70, recommendedflags|MENUCAPS, "(complete)"); + DRAWAMOUNTSTAT(132, "Sinks landed:", sinks); + DRAWAMOUNTSTAT(142, "Times hit by sink:", sinked); - V_DrawString(32, 70, MENUCAPS, va("x %d/%d", M_CountEmblems(), numemblems+numextraemblems)); - V_DrawSmallScaledPatch(20, 70, 0, W_CachePatchName("GOTITA", PU_STATIC)); + DRAWAMOUNTSTAT(162, "Total respawns:", respawns); +} - M_DrawStatsMaps(statsLocation); +#undef DRAWAMOUNTSTAT +#undef DRAWTIMESTAT + +static void M_DrawLevelStats(void) +{ + M_DrawMenuTitle(); + + V_DrawCenteredString(BASEVIDWIDTH/2, 28, highlightflags|MENUCAPS, statsPages[statsCurrentPage].title); + + INT32 w = V_StringWidth(statsPages[statsCurrentPage].title, highlightflags|MENUCAPS); + V_DrawCharacter(BASEVIDWIDTH/2 - w/2 - 10 - (skullAnimCounter/5), 28, + '\x1C' | highlightflags, false); // left arrow + V_DrawCharacter(BASEVIDWIDTH/2 + w/2 + 2 + (skullAnimCounter/5), 28, + '\x1D' | highlightflags, false); // right arrow + + statsPages[statsCurrentPage].drawer(); } // Handle statistics. @@ -8793,23 +8866,46 @@ static void M_HandleLevelStats(INT32 choice) switch (choice) { case KEY_DOWNARROW: + if (statsCurrentPage != 0) // Must be on level stats page + break; S_StartSound(NULL, sfx_menu1); if (statsLocation < statsMax) ++statsLocation; break; case KEY_UPARROW: + if (statsCurrentPage != 0) // Must be on level stats page + break; S_StartSound(NULL, sfx_menu1); if (statsLocation) --statsLocation; break; + case KEY_RIGHTARROW: + S_StartSound(NULL, sfx_menu1); + statsCurrentPage++; + if (statsCurrentPage >= NUMSTATSPAGES) + statsCurrentPage = 0; + break; + + case KEY_LEFTARROW: + S_StartSound(NULL, sfx_menu1); + if (statsCurrentPage == 0) + statsCurrentPage = NUMSTATSPAGES-1; + else + --statsCurrentPage; + break; + case KEY_PGDN: + if (statsCurrentPage != 0) // Must be on level stats page + break; S_StartSound(NULL, sfx_menu1); statsLocation += (statsLocation+13 >= statsMax) ? statsMax-statsLocation : 13; break; case KEY_PGUP: + if (statsCurrentPage != 0) // Must be on level stats page + break; S_StartSound(NULL, sfx_menu1); statsLocation -= (statsLocation < 13) ? statsLocation : 13; break; -- 2.54.0 From 8959d3aec408ee2c9837c562b46772045f22ef11 Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 19 Jan 2025 03:04:24 +0300 Subject: [PATCH 100/325] Put playtime statistics at first page instead of RA medals --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index d9bc816f8..341dcdcd6 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -8620,8 +8620,8 @@ typedef struct statpage_s { } statpage_t; static statpage_t statsPages[] = { - { "Level Statistics", M_DrawStatsMaps, }, { "Play Time Statistics", M_DrawStatsPlaytime, }, + { "Level Statistics", M_DrawStatsMaps, }, { "Extra Statistics", M_DrawStatsExtra, }, }; -- 2.54.0 From aa0bf396e73a9937ede2ed19a28d07b1a2d5c9d9 Mon Sep 17 00:00:00 2001 From: Indev Date: Wed, 15 Jan 2025 21:17:56 +0300 Subject: [PATCH 101/325] Fix spectator control text overlapping when showdirectorhud is off --- src/st_stuff.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index d189e2c23..f99c19fd3 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -805,8 +805,8 @@ static void ST_overlayDrawer(void) { V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false, true))); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false, true))); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Accelerate %s", ST_GetButtonName(gc_camfloat, "Float", false, true))); + V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, va("Brake %s", ST_GetButtonName(gc_camsink, "Sink", false, true))); } } } -- 2.54.0 From 4d355f99c0ed72f074375f910622d6602ee9abb1 Mon Sep 17 00:00:00 2001 From: Indev Date: Thu, 16 Jan 2025 02:47:50 +0300 Subject: [PATCH 102/325] Add spb music to list of exceptions for keepmusic --- src/s_sound.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index 453778027..b18dc4c66 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1961,10 +1961,11 @@ boolean S_FadeOutStopMusic(UINT32 ms) static boolean skipmusic = false; boolean skipintromus = false; -static const char *musicexception_list[17] = { +static const char *musicexception_list[] = { "vote", "voteea", "voteeb", "racent", "krwin", "krok", "krlose", "krfail", "kbwin", "kbok", "kblose", "kstart", "estart", "wait2j", "titles", + "SPBA_W", "SPBA_L", // SPB Attack music "CHRSHF", "CHRSHP" // no clue what those are tbh }; @@ -1982,7 +1983,7 @@ static void S_CheckEventMus(const char *newmus) if (!cv_keepmusic.value) return; - for (int i = 0; i < 17; i++) + for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++) if (stricmp(music_name, musicexception_list[i]) == 0 || stricmp(newmus, musicexception_list[i]) == 0) // weird? sure! but were lucky enough newmus reflects whats being replaced { skipmusic = true; -- 2.54.0 From 8dc2d229963054b6d9987dded6b299372322be37 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 16 Jan 2025 00:58:52 +0100 Subject: [PATCH 103/325] Clear acktosend when initializing node since it was never reset, values might been taken over from former node --- src/d_net.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/d_net.c b/src/d_net.c index 2725fca14..16156ca06 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -638,6 +638,7 @@ void Net_WaitAllAckReceived(UINT32 timeout) static void InitNode(node_t *node) { node->acktosend_head = node->acktosend_tail = 0; + memset(node->acktosend, 0, sizeof(node->acktosend)); node->firstacktosend = 0; node->nextacknum = 1; node->remotefirstack = 0; -- 2.54.0 From a29f8d5f3857d151296cdb96fe5740db600666a4 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 16 Jan 2025 00:57:39 +0100 Subject: [PATCH 104/325] dont keep music if there is no music --- 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 b18dc4c66..ed3ee01fa 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -2008,7 +2008,7 @@ void S_CheckMap(void) return; } - keepmusic = (!skipmusic && gamestate == GS_LEVEL && oldmap == gamemap && oldencore == encoremode); + keepmusic = (!skipmusic && (gamestate == GS_LEVEL) && (music_name[0] != 0) && (oldmap == gamemap) && (oldencore == encoremode)); //CONS_Printf("keepmusic = %s\n", keepmusic); -- 2.54.0 From 15185e04504dd678da0ac6301bce15da896b91cc Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 16 Jan 2025 21:00:47 +0100 Subject: [PATCH 105/325] simplify keepmusic honestly no clue why i made stuff check on every music change --- src/g_game.c | 2 +- src/s_sound.c | 80 +++++++++++++-------------------------------------- src/s_sound.h | 2 +- 3 files changed, 22 insertions(+), 62 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index f12a72620..1bf435dca 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1197,7 +1197,7 @@ static void G_DoLoadLevel(boolean resetplayer) // Saturn Music Feature stuffs S_ResetKeepAndSpecialMus(); - S_CheckMap(); + S_KeepMusic(); // Make sure objectplace is OFF when you first start the level! OP_ResetObjectplace(); diff --git a/src/s_sound.c b/src/s_sound.c index ed3ee01fa..ce856b36c 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -118,8 +118,8 @@ consvar_t cv_keepmusic = {"keepmusic", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, N consvar_t cv_skipintromusic = {"skipintromusic", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; //consvar_t cv_ignoremusicchanges = {"ignoremusicchanges", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; -boolean keepmusic = false; -static void S_CheckEventMus(const char *newmus); +boolean keepmusic = false; // keep the current music on map restart +boolean skipintromus = false; // skip the intro fanfare #ifdef HAVE_OPENMPT openmpt_module *openmpt_mhandle = NULL; @@ -1748,8 +1748,6 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 strncpy(newmusic, mmusic, 6); - S_CheckEventMus(newmusic); - if (LUA_HookMusicChange(music_name, &hook_param)) return; @@ -1938,29 +1936,6 @@ boolean S_FadeOutStopMusic(UINT32 ms) /// Init & Others /// ------------------------ -/*static boolean S_KeepMusic(void) -{ - //if (!cv_keepmusic.value) - //return false; - - // should i compare songs or maps? - static char oldmusname[7] = ""; - - if (strcmp(music_name, mapmusname) != 0) - return false; - - if (strcmp(oldmusname, mapmusname) == 0) - return true; - - strncpy(oldmusname, mapmusname, 7); - oldmusname[6] = '\0'; - - return false; -}*/ - -static boolean skipmusic = false; -boolean skipintromus = false; - static const char *musicexception_list[] = { "vote", "voteea", "voteeb", "racent", "krwin", "krok", "krlose", "krfail", "kbwin", "kbok", @@ -1974,43 +1949,30 @@ void S_ResetKeepAndSpecialMus(void) keepmusic = skipintromus = false; } -//checks for any kind of event music like intermission, vote etc. -//always runs when musicchange gets invoked -static void S_CheckEventMus(const char *newmus) -{ - skipmusic = false; - - if (!cv_keepmusic.value) - return; - - for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++) - if (stricmp(music_name, musicexception_list[i]) == 0 || stricmp(newmus, musicexception_list[i]) == 0) // weird? sure! but were lucky enough newmus reflects whats being replaced - { - skipmusic = true; - break; - } - - //CONS_Printf("music_name = %s\n", music_name); - //CONS_Printf("newmus = %s\n", newmus); - //CONS_Printf("skipmusic = %d\n", skipmusic); -} - -//this one compares map and encoremode instead of the music itself -//makes tunes work and stuff -void S_CheckMap(void) +// determine if we should keep the music on a map restart +void S_KeepMusic(void) { static INT16 oldmap = 0; static boolean oldencore = false; - if (!cv_keepmusic.value) + if (!cv_keepmusic.value || gamestate != GS_LEVEL || music_name[0] == 0) { keepmusic = false; - return; } + else if (oldmap == gamemap && oldencore == encoremode) + { + keepmusic = true; - keepmusic = (!skipmusic && (gamestate == GS_LEVEL) && (music_name[0] != 0) && (oldmap == gamemap) && (oldencore == encoremode)); - - //CONS_Printf("keepmusic = %s\n", keepmusic); + // check if the current music is smth we dont want to keep (vote music, etc) + for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++) + { + if (stricmp(music_name, musicexception_list[i]) == 0) + { + keepmusic = false; + break; + } + } + } oldencore = encoremode; oldmap = gamemap; @@ -2023,8 +1985,6 @@ void S_CheckMap(void) // void S_InitMapMusic(void) { - skipintromus = false; - if (mapmusflags & MUSIC_RELOADRESET) { strncpy(mapmusname, mapheaderinfo[gamemap-1]->musname, 7); @@ -2045,7 +2005,7 @@ void S_InitMapMusic(void) { char *maptitle = G_BuildMapTitle(gamemap); // for some reason, occasionally the title screen music doesent seem to be reset in time, so skipping the intro may make it just continue playing it instead, weird.. - skipintromus = gamestate == GS_LEVEL && (stricmp(music_name, "titles") != 0) && (maptitle && (stricmp(maptitle, "Wandering Falls") != 0)); // thanks diggle! + skipintromus = (stricmp(music_name, "titles") != 0) && (maptitle && (stricmp(maptitle, "Wandering Falls") != 0)); // thanks diggle! if (maptitle) Z_Free(maptitle); } @@ -2060,7 +2020,7 @@ void S_InitMapMusic(void) void S_StartMapMusic(void) { - //no need to constantly run this after race has started + // no need to constantly run this after race has started if (leveltime > MUSICSTARTTIME) return; diff --git a/src/s_sound.h b/src/s_sound.h index 124b74de3..a22e0aaeb 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -114,7 +114,7 @@ void S_ResetKeepAndSpecialMus(void); void S_InitMapMusic(void); void S_StartMapMusic(void); -void S_CheckMap(void); +void S_KeepMusic(void); // Stops music and restarts it from same position. Used for instant applying changes to amiga filters. void S_RestartMusic(void); -- 2.54.0 From ed97d282544ad7c200b33c62b92023d2c39ba44d Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 11 Jan 2025 23:04:35 +0100 Subject: [PATCH 106/325] split HWR_RenderBSPNode to reduce function call overhead its only microscopicly faster lel --- src/hardware/hw_main.c | 50 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b2877444e..74bbbf17c 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3072,11 +3072,42 @@ static void HWR_Subsector(size_t num) // Renders all subsectors below a given node, // traversing subtree recursively. // Just call with BSP root. +// static void HWR_RenderBSPNode(INT32 bspnum) { - const node_t *bsp; - INT32 side; + register const node_t *bsp; + register INT32 side; + ps_numbspcalls.value.i++; + + while (!(bspnum & NF_SUBSECTOR)) // Keep going until found a subsector + { + bsp = &nodes[bspnum]; + + // Decide which side the view point is on. + side = R_PointOnSideFast(viewx, viewy, bsp); + + // Recursively divide front space (toward the viewer). + HWR_RenderBSPNode(bsp->children[side]); + + // Possibly divide back space (away from the viewer). + if (!(HWR_CheckBBox(bsp->bbox[side^1]))) + return; + + bspnum = bsp->children[side^1]; + } + + // e6y: support for extended nodes + HWR_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); +} + +// +// Same thing but with extra portal checks +// +static void HWR_RenderPortalBSPNode(INT32 bspnum) +{ + register const node_t *bsp; + register INT32 side; ps_numbspcalls.value.i++; while (!(bspnum & NF_SUBSECTOR)) // Keep going until found a subsector @@ -3088,7 +3119,7 @@ static void HWR_RenderBSPNode(INT32 bspnum) // Recursively divide front space (toward the viewer). if (HWR_PortalCheckBBox(bsp->bbox[side])) - HWR_RenderBSPNode(bsp->children[side]); + HWR_RenderPortalBSPNode(bsp->children[side]); // Possibly divide back space (away from the viewer). if (!(HWR_CheckBBox(bsp->bbox[side^1]) && HWR_PortalCheckBBox(bsp->bbox[side^1]))) @@ -3098,7 +3129,7 @@ static void HWR_RenderBSPNode(INT32 bspnum) } // PORTAL CULLING - if (portalclipline && portalcullsector) + if (portalcullsector) { // skip all subsectors encountered before the portal // destination's front sector @@ -5208,7 +5239,11 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl validcount++; - HWR_RenderBSPNode((INT32)numnodes-1);// no actual rendering happens + // no actual rendering happens + if (portalclipline) + HWR_RenderPortalBSPNode((INT32)numnodes-1); + else + HWR_RenderBSPNode((INT32)numnodes-1); // for each found portal: // note: if necessary, could sort the portals here? @@ -5259,7 +5294,10 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl HWR_SetPortalState(GLPORTAL_INSIDE); // TURN IT OFF // Recursively "render" the BSP tree. - HWR_RenderBSPNode((INT32)numnodes-1); + if (!portalclipline) + HWR_RenderBSPNode((INT32)numnodes-1); + else + HWR_RenderPortalBSPNode((INT32)numnodes-1); // woo we back HWR_SetPortalState(oldgl_portal_state); -- 2.54.0 From 4900177e8ca2c28d83b7ae13f3b9479231c90c28 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 11 Jan 2025 23:27:44 +0100 Subject: [PATCH 107/325] TEST: skip prepping 3d floors for fofs without planes or if they were already checked --- src/hardware/hw_main.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 74bbbf17c..9d330582b 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2826,6 +2826,12 @@ static void HWR_Subsector(size_t num) { for (rover = gl_frontsector->ffloors; rover; rover = rover->next) { + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES)) + continue; + + if (sub->validcount == validcount) + continue; + sector_t *controlSec = §ors[rover->secnum]; if (controlSec->moved != true) -- 2.54.0 From 017646e704817e151c39ada39e3be6c851768642 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 12 Jan 2025 00:01:57 +0100 Subject: [PATCH 108/325] forgor about software again --- src/r_bsp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/r_bsp.c b/src/r_bsp.c index db6a4378d..946302db9 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -907,6 +907,9 @@ static void R_Subsector(size_t num) { for (rover = frontsector->ffloors; rover; rover = rover->next) { + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES)) + continue; + sector_t *controlSec = §ors[rover->secnum]; if (controlSec->moved != true) -- 2.54.0 From 923e0500df6caf4b62ad28a38f423da266fd2fbf Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 16 Jan 2025 22:33:17 +0100 Subject: [PATCH 109/325] fix typo lel --- src/screen.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/screen.h b/src/screen.h index be8cd9614..000957ed9 100644 --- a/src/screen.h +++ b/src/screen.h @@ -44,7 +44,7 @@ #define BASEVIDWIDTH 320 // NEVER CHANGE THIS! This is the original #define BASEVIDHEIGHT 200 // resolution of the graphics. -// max res for png capture; just here to prevent some crashes on very high resoltions; tho you should never go this high cause ogl allocs certain things with MAXVIDWIDTH and MAXVIDHEIGHT too Zzz... +// max res for png capture; just here to prevent some crashes on very high resolutions; tho you should never go this high cause ogl allocs certain things with MAXVIDWIDTH and MAXVIDHEIGHT too Zzz... #define MAXPNGWIDTH 7680 #define MAXPNGHEIGHT 4320 @@ -94,6 +94,7 @@ typedef struct INT32 vesamode; // vesa mode number plus LINEAR_MODE bit void *plinearmem; // linear address of start of frame buffer } vesa_extra_t; + // a video modes from the video modes list, // note: video mode 0 is always standard VGA320x200. typedef struct vmode_s -- 2.54.0 From bce9990826bf608b77f1941e787677ad6d1e39aa Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 19 Jan 2025 17:27:51 +0100 Subject: [PATCH 110/325] only rumble banan when on ground --- src/p_tick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_tick.c b/src/p_tick.c index 6996b4d4d..95870fc2e 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -436,7 +436,7 @@ static void P_DeviceRumbleTick(void) low = high = FRACUNIT / 64; } } - else if (player->kartstuff[k_bananadrag] > TICRATE) + else if (player->kartstuff[k_bananadrag] > TICRATE && P_IsObjectOnGround(player->mo)) { if (leveltime & 1) // this is actually funny lel high = FRACUNIT / 64; -- 2.54.0 From 33e1cfc2ba7e4afdb5d1eee9e7df45e86d82a0ce Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 8 Jan 2025 18:34:54 +0100 Subject: [PATCH 111/325] le funny banan drag jumpy --- src/k_kart.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 0b801dbfd..3d55dfc12 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4822,6 +4822,16 @@ static void K_MoveHeldObjects(player_t *player) targz -= 8*(2*FRACUNIT)/7; }*/ + cur->spriteyoffset = 0; + if (P_IsObjectOnGround(player->mo) && player->speed > 0 && player->kartstuff[k_bananadrag] > TICRATE + && M_RandomChance(min(FRACUNIT/2, FixedDiv(player->speed, K_GetKartSpeed(player, false))/2))) + { + if (leveltime & 1) + cur->spriteyoffset += 8*(2*FRACUNIT)/7; + else + cur->spriteyoffset -= 8*(2*FRACUNIT)/7; + } + if (speed > dist) P_InstaThrust(cur, cur->angle, speed-dist); -- 2.54.0 From c4d1f9c6a2d3e2cd3c28523e41b93d552cbc36bd Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 16 Jan 2025 23:42:21 +0100 Subject: [PATCH 112/325] add toggle for bananjitter --- src/k_kart.c | 8 +++++++- src/k_kart.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3d55dfc12..630069f4a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -81,6 +81,8 @@ consvar_t cv_coloredspeedlines = {"colorizedspeedlines", "Off", CV_SAVE, colorsp consvar_t cv_coloredsneakertrail = {"sneakertrailcolor", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_bananajitter = {"bananadragjitter", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + //extra hud things consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -821,6 +823,9 @@ void K_RegisterKartStuff(void) // Colored trails CV_RegisterVar(&cv_coloredsneakertrail); + // makes banans do funny jitter jumpy when dragged + CV_RegisterVar(&cv_bananajitter); + CV_RegisterVar(&cv_showstats); CV_RegisterVar(&cv_showinput); @@ -4823,7 +4828,8 @@ static void K_MoveHeldObjects(player_t *player) }*/ cur->spriteyoffset = 0; - if (P_IsObjectOnGround(player->mo) && player->speed > 0 && player->kartstuff[k_bananadrag] > TICRATE + + if (cv_bananajitter.value && P_IsObjectOnGround(player->mo) && player->speed > 0 && player->kartstuff[k_bananadrag] > TICRATE && M_RandomChance(min(FRACUNIT/2, FixedDiv(player->speed, K_GetKartSpeed(player, false))/2))) { if (leveltime & 1) diff --git a/src/k_kart.h b/src/k_kart.h index d913d215c..be32055f2 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -25,6 +25,7 @@ boolean K_UseColorHud(void); void K_RegisterKartStuff(void); extern consvar_t cv_coloredspeedlines, cv_coloredsneakertrail; +extern consvar_t cv_bananajitter; extern consvar_t cv_colorizedhud, cv_colorizeditembox, cv_colorizedhudcolor; extern consvar_t cv_darkitembox; extern consvar_t cv_biglaps; -- 2.54.0 From 816ad7c2fc124810f216d4791cc10fc3da832535 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 12:37:23 +0100 Subject: [PATCH 113/325] add banan jitter toggle to menu --- src/m_menu.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 91ca80b58..1aca298a9 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2183,16 +2183,18 @@ static menuitem_t OP_SaturnMenu[] = {IT_STRING | IT_CVAR, NULL, "Colourized Speedlines", &cv_coloredspeedlines, 30}, {IT_STRING | IT_CVAR, NULL, "Colourized Sneakertrails", &cv_coloredsneakertrail, 35}, - {IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 45}, - {IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 55}, + {IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 45}, - {IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 60}, + {IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 55}, + {IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 65}, - {IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 70}, + {IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 70}, - {IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 80}, - {IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 85}, - {IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 95}, // uwu + {IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 80}, + + {IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 90}, + {IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 95}, + {IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 105}, // uwu }; static const char* OP_SaturnTooltips[] = @@ -2202,6 +2204,7 @@ static const char* OP_SaturnTooltips[] = "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!", + "Makes bananas and other items jump and jitter\nwhen dragged behind.", "Show Localskin Menus.", "Force menu to only use uppercase.", "Use your desired Keyboard Layout for Text Input\nthis is either the Default, Native or Azerty\nNative does not affect Gameplay only Text!", @@ -2218,6 +2221,7 @@ enum sm_skinselspeed, sm_colorlines, sm_colorflames, + sm_bananjumpy, sm_showlocalskin, op_uppercase_menu, sm_nativkey, -- 2.54.0 From 37d28464ea09a5c83af85ffcc35b53044f8c171e Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 01:31:12 +0100 Subject: [PATCH 114/325] change how spritescales and offsets work - now theres realoffsets aswell - allows better control of changing things per lua and still do funky stuff in hardcode without conflicts - spritescales and offsets now get reset centralised before any thinkers run --- src/k_kart.c | 63 ++++++++++++++--------------------------------- src/k_kart.h | 1 - src/lua_mobjlib.c | 25 +++++++++++++++++-- src/p_mobj.c | 4 ++- src/p_mobj.h | 2 ++ src/p_saveg.c | 10 +++----- src/p_tick.c | 25 +++++++++++++++++++ 7 files changed, 76 insertions(+), 54 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 630069f4a..c0ce59eae 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -105,21 +105,11 @@ consvar_t cv_newspeedometer = {"newspeedometer", "Default", CV_SAVE, speedo_cons consvar_t cv_battlespeedo = {"battlespeedo", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //toggle for showing the speedometer in battlemode // funn-E streeetch -static void gravstretch_onchange(void); static CV_PossibleValue_t stretchfactor_t[] = { {0, "Off"}, {FRACUNIT/4, "0.250"}, {3*FRACUNIT/8, "0.375"}, {FRACUNIT/2, "0.500"}, {5*FRACUNIT/8, "0.625"}, {3*FRACUNIT/4, "0.750"}, {7*FRACUNIT/8, "0.875"}, {FRACUNIT, "Max"}, {0, NULL}}; -consvar_t cv_gravstretch = {"gravstretch", "0", CV_SAVE|CV_CALL|CV_NOINIT, stretchfactor_t, gravstretch_onchange, 0, NULL, NULL, 0, 0, NULL}; - -static void gravstretch_onchange(void) -{ - // reset everything when toggling gravstretch off - if (cv_gravstretch.value == 0) - { - K_ResetPlayerSpriteStuff(); - } -} +consvar_t cv_gravstretch = {"gravstretch", "0", CV_SAVE, stretchfactor_t, 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}; @@ -147,7 +137,24 @@ static void saltyhop_onchange(void) // reset everything when toggling saltyhop off if (!cv_saltyhop.value) { - K_ResetPlayerSpriteStuff(); + if (gamestate != GS_LEVEL) + return; + + for (INT32 i = 0; i < MAXPLAYERS; i++) + { + player_t *player = &players[i]; + + if (!playeringame[i] || P_MobjWasRemoved(player->mo)) + continue; + + player->mo->salty_jump = false; + player->mo->salty_zoffset = 0; + player->mo->salty_momz = 0; + + player->mo->salty_ready = false; + player->mo->salty_tapping = false; + player->mo->init_salty = false; + } } } @@ -886,34 +893,6 @@ void K_RegisterKartStuff(void) //} -void K_ResetPlayerSpriteStuff(void) -{ - if (gamestate != GS_LEVEL) - return; - - for (INT32 i = 0; i < MAXPLAYERS; i++) - { - player_t *player = &players[i]; - - if (!playeringame[i] || P_MobjWasRemoved(player->mo)) - continue; - - player->mo->spritexoffset = 0; - player->mo->spriteyoffset = 0; - player->mo->spritexscale = player->mo->realxscale; - player->mo->spriteyscale = player->mo->realyscale; - - // reset saltyhop stuffs too - player->mo->salty_jump = false; - player->mo->salty_zoffset = 0; - player->mo->salty_momz = 0; - - player->mo->salty_ready = false; - player->mo->salty_tapping = false; - player->mo->init_salty = false; - } -} - boolean K_IsPlayerLosing(player_t *player) { INT32 winningpos = 1; @@ -3347,8 +3326,6 @@ static void K_StretchPlayerGravity(player_t *p) { if (cv_gravstretch.value == 0) { - p->mo->spritexscale = p->mo->realxscale; - p->mo->spriteyscale = p->mo->realyscale; return; } @@ -4827,8 +4804,6 @@ static void K_MoveHeldObjects(player_t *player) targz -= 8*(2*FRACUNIT)/7; }*/ - cur->spriteyoffset = 0; - if (cv_bananajitter.value && P_IsObjectOnGround(player->mo) && player->speed > 0 && player->kartstuff[k_bananadrag] > TICRATE && M_RandomChance(min(FRACUNIT/2, FixedDiv(player->speed, K_GetKartSpeed(player, false))/2))) { diff --git a/src/k_kart.h b/src/k_kart.h index be32055f2..3f98a6059 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -11,7 +11,6 @@ #define KART_FULLTURN 800 -void K_ResetPlayerSpriteStuff(void); extern UINT8 colortranslations[MAXTRANSLATIONS][16]; extern const char *KartColor_Names[MAXSKINCOLORS]; diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 7385cccf6..4c4e29e62 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -40,6 +40,7 @@ int mobj_sprev_unimplemented(lua_State *L); int mobj_angle_setter(lua_State *L); int mobj_sloperoll_noop(lua_State *L); int mobj_spritescale_setter(lua_State *L); +int mobj_spriteoffset_setter(lua_State *L); int mobj_touching_sectorlist_unimplemented(lua_State *L); int mobj_radius_setter(lua_State *L); int mobj_height_setter(lua_State *L); @@ -94,8 +95,8 @@ static const udata_field_t mobj_fields[] = { FIELD(mobj_t, anim_duration, udatalib_getter_uint16, udatalib_setter_uint16), FIELD(mobj_t, spritexscale, udatalib_getter_fixed, mobj_spritescale_setter), FIELD(mobj_t, spriteyscale, udatalib_getter_fixed, mobj_spritescale_setter), - FIELD(mobj_t, spritexoffset, udatalib_getter_fixed, udatalib_setter_fixed), - FIELD(mobj_t, spriteyoffset, udatalib_getter_fixed, udatalib_setter_fixed), + FIELD(mobj_t, spritexoffset, udatalib_getter_fixed, mobj_spriteoffset_setter), + FIELD(mobj_t, spriteyoffset, udatalib_getter_fixed, mobj_spriteoffset_setter), FIELD(mobj_t, touching_sectorlist, mobj_touching_sectorlist_unimplemented, mobj_touching_sectorlist_unimplemented), FIELD(mobj_t, subsector, udatalib_getter_subsector, mobj_nosetpos_subsector), FIELD(mobj_t, floorz, udatalib_getter_fixed, mobj_nosetpos_floorz), @@ -277,6 +278,26 @@ int mobj_spritescale_setter(lua_State *L) return 0; } +int mobj_spriteoffset_setter(lua_State *L) +{ + mobj_t *mo = GETMO(); + + fixed_t *spriteoffset; + UDATALIB_GETFIELD(fixed_t, spriteoffset); + + if (!mo->player) + *spriteoffset = luaL_checkfixed(L, 2); + else + { + // Mmm yea + if (spriteoffset == &mo->spritexoffset) + mo->realxoffset = luaL_checkfixed(L, 2); + else + mo->realyoffset = luaL_checkfixed(L, 2); + } + return 0; +} + int mobj_radius_setter(lua_State *L) { mobj_t *mo = GETMO(); diff --git a/src/p_mobj.c b/src/p_mobj.c index b198056af..e98eb1bdf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9449,7 +9449,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->realxscale = mobj->realyscale = mobj->scale; mobj->spritexscale = mobj->realxscale; mobj->spriteyscale = mobj->realyscale; - mobj->spritexoffset = mobj->spriteyoffset = 0; + mobj->realxoffset = mobj->realyoffset = 0; + mobj->spritexoffset = mobj->realxoffset; + mobj->spriteyoffset = mobj->realyoffset; // Funni slam sound when landing mobj->slamsoundtimer = 0; diff --git a/src/p_mobj.h b/src/p_mobj.h index cd7c64dc1..9002d7642 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -295,6 +295,7 @@ typedef struct mobj_s fixed_t old_spritexoffset, old_spriteyoffset; fixed_t realxscale, realyscale; // funn-E streeetch + fixed_t realxoffset, realyoffset; fixed_t stretchslam; // "squish" effect when you land @@ -447,6 +448,7 @@ typedef struct precipmobj_s fixed_t old_spritexoffset, old_spriteyoffset; fixed_t realxscale, realyscale; // funn-E streeetch + fixed_t realxoffset, realyoffset; fixed_t stretchslam; // "squish" effect when you land diff --git a/src/p_saveg.c b/src/p_saveg.c index 7bdea61b4..0de6b781b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2147,12 +2147,10 @@ static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) mobj->mirrored = 0; // Sprite Rendering stuff - mobj->spritexoffset = 0; - mobj->spriteyoffset = 0; - mobj->spritexscale = FRACUNIT; - mobj->spriteyscale = FRACUNIT; - mobj->realxscale = FRACUNIT; - mobj->realyscale = FRACUNIT; + mobj->spritexoffset = mobj->realxoffset = 0; + mobj->spriteyoffset = mobj->realxoffset = 0; + mobj->spritexscale = mobj->realxscale = FRACUNIT; + mobj->spriteyscale = mobj->realyscale = FRACUNIT; mobj->stretchslam = 0; // Timer for slam sound effect diff --git a/src/p_tick.c b/src/p_tick.c index 95870fc2e..15c523b37 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -498,6 +498,29 @@ static void P_RunQuakes(void) --quake.time; } +static inline void P_ResetSpriteStuff(void) +{ + thinker_t *th; + + for (th = thinkercap.next; th != &thinkercap; th = th->next) + { + mobj_t *mo; + + if (th->function.acp1 != (actionf_p1)P_MobjThinker) // not a mobj + continue; + + mo = (mobj_t *)th; + + if (mo->type == MT_SHADOW || mo->sprite == SPR_NULL) + continue; + + mo->spritexscale = mo->realxscale; + mo->spriteyscale = mo->realyscale; + mo->spritexoffset = mo->realxoffset; + mo->spriteyoffset = mo->realyoffset; + } +} + // // P_Ticker // @@ -598,6 +621,8 @@ void P_Ticker(boolean run) ps_lua_mobjhooks.value.i = 0; ps_checkposition_calls.value.i = 0; + P_ResetSpriteStuff(); + PS_START_TIMING(ps_lua_prethinkframe_time); LUA_HookPreThinkFrame(); PS_STOP_TIMING(ps_lua_prethinkframe_time); -- 2.54.0 From ada779a97d00fabfd16cf51aef46064b1de416de Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 17 Jan 2025 15:47:37 +0300 Subject: [PATCH 115/325] Fancy :D --- src/k_kart.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index c0ce59eae..0d1700c74 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8306,6 +8306,16 @@ static void K_drawKartItem(void) V_DrawMappedPatch(fx, fy, V_HUDTRANS|fflags, localbg, cv_colorizeditembox.value ? colormap : NULL); + fixed_t rfy = fy<kartstuff[k_itemroulette]) + { + fixed_t frac = R_UsingFrameInterpolation() ? (rendertimefrac & FRACMASK) : 0; + UINT8 fancystep = (offset ? 6 : 10); + fixed_t fancyoffset = (stplyr->kartstuff[k_itemroulette] % 3)-1; + rfy += (fancystep * fancyoffset * FRACUNIT) + FixedMul(fancystep*FRACUNIT, frac) - fancystep/2*FRACUNIT; + } + // Then, the numbers: if (stplyr->kartstuff[k_itemamount] >= numberdisplaymin && !stplyr->kartstuff[k_itemroulette]) { @@ -8324,7 +8334,7 @@ static void K_drawKartItem(void) } } else - V_DrawFixedPatch(fx< Date: Fri, 17 Jan 2025 13:58:14 +0100 Subject: [PATCH 116/325] dont fancy during respawn --- 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 0d1700c74..b4b53285c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8308,7 +8308,7 @@ static void K_drawKartItem(void) fixed_t rfy = fy<kartstuff[k_itemroulette]) + if (stplyr->kartstuff[k_itemroulette] && !stplyr->deadtimer) { fixed_t frac = R_UsingFrameInterpolation() ? (rendertimefrac & FRACMASK) : 0; UINT8 fancystep = (offset ? 6 : 10); -- 2.54.0 From d75c16bab542affff97695cf26a414a4599c7961 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 13:58:29 +0100 Subject: [PATCH 117/325] add the fancy hudtrans flags --- src/k_kart.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index b4b53285c..2ca9ccd1b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8307,12 +8307,18 @@ static void K_drawKartItem(void) V_DrawMappedPatch(fx, fy, V_HUDTRANS|fflags, localbg, cv_colorizeditembox.value ? colormap : NULL); fixed_t rfy = fy<kartstuff[k_itemroulette] && !stplyr->deadtimer) { fixed_t frac = R_UsingFrameInterpolation() ? (rendertimefrac & FRACMASK) : 0; UINT8 fancystep = (offset ? 6 : 10); fixed_t fancyoffset = (stplyr->kartstuff[k_itemroulette] % 3)-1; + if (fancyoffset != 0) + { + fancyflags &= ~V_HUDTRANS; + fancyflags |=V_HUDTRANSHALF; + } rfy += (fancystep * fancyoffset * FRACUNIT) + FixedMul(fancystep*FRACUNIT, frac) - fancystep/2*FRACUNIT; } @@ -8334,7 +8340,7 @@ static void K_drawKartItem(void) } } else - V_DrawFixedPatch(fx< Date: Wed, 8 Jan 2025 04:31:11 +0100 Subject: [PATCH 118/325] reorder saturn hud menu a little also remove uncapped hud from it, since why would you ever wanna turn it off? --- src/m_menu.c | 61 +++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 1aca298a9..426d3d835 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2281,34 +2281,35 @@ static menuitem_t OP_SaturnHudMenu[] = {IT_STRING | IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10}, {IT_STRING | IT_CVAR, NULL, "Battle Speedometer", &cv_battlespeedo, 15}, - {IT_STRING | IT_CVAR, NULL, "Input Display outside of RA", &cv_showinput, 20}, + {IT_STRING | IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25}, + {IT_STRING | IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 30}, + {IT_STRING | IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35}, - {IT_STRING | IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 25}, + {IT_STRING | IT_CVAR, NULL, "Input Display outside of RA", &cv_showinput, 45}, - {IT_STRING | IT_CVAR, NULL, "Stat Display", &cv_showstats, 30}, + {IT_STRING | IT_CVAR, NULL, "Stat Display", &cv_showstats, 55}, - {IT_STRING | IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 35}, + {IT_STRING | IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 65}, - {IT_STRING | IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 40}, - {IT_STRING | IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 45}, - {IT_STRING | IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 50}, + {IT_STRING | IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 75}, + {IT_STRING | IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 80}, - {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 60}, - {IT_STRING | IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 65}, + {IT_STRING | IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 90}, - {IT_STRING | IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 70}, - {IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 75}, + {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 100}, + {IT_STRING | IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 105}, - {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 80}, + {IT_STRING | IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 115}, + {IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 120}, - {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 90}, + {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 130}, - {IT_STRING | IT_CVAR, NULL, "Uncapped HUD", &cv_uncappedhud, 100}, + {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 140}, - {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 110}, - {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 115}, + {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 150}, + {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 155}, - {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 125}, + {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 165}, }; static const char* OP_SaturnHudTooltips[] = @@ -2316,20 +2317,21 @@ static const char* OP_SaturnHudTooltips[] = NULL, "Change what style the speedometer is.", "Draw the Speedometer in Battle.", - "Displays the input display outside of Record Attack. Also adjusts the\nposition scale to match.", - "Flash current Lap Time when doing a Lap on the Timer.", - "Enable the stat display.", - "Enable the use of the higher resolution want icons instead of rank\nfor some places.", "Enable colourized hud.", "Enable the colourized itembox when colourized hud is enabled.", "The color to use instead of the player color when\ncolourized hud is enabled.", + "Displays the input display outside of Record Attack. Also adjusts the\nposition scale to match.", + "Enable the stat display.", + "Enable the use of the higher resolution want icons instead of rank\nfor some places.", + "Make the Postionnumber half the size.", + "Disable the animation of the Positionnumber\nwhen overtaking someone.", + "Flash current Lap Time when doing a Lap on the Timer.", "Show the big 'LAP' text on a lap change.", "Show the big Cecho Messages.", "Show player names on the minimap.", "Minimize the player icons on the minimap.", - "Show the Director Toggle prompt when spectating.", "Make the Intermission screen look like in beta versions of Kart!\nEither with background or just the rest.", - "Uncaps the HUD framerate, making it appear smoother.", + "Show the Director Toggle prompt when spectating.", "Nametag Options.", "Driftgauge Options.", "Move position of HUD elements.", @@ -2340,20 +2342,21 @@ enum sh_header, sh_speedometer, sh_battlespeedo, - sh_input, - sh_laptime, - sh_statdisplay, - sh_highresport, sh_colorhud, sh_coloritem, sh_colorhud_customcolor, + sh_input, + sh_statdisplay, + sh_highresport, + sh_smolpos, + sh_posanim, + sh_laptime, sh_lapemblem, sh_cechotogle, sh_mapname, sh_smallmap, - sh_directorhud, sh_betainter, - sh_uncappedhud, + sh_directorhud, sh_nametagmen, sh_driftgaugemen, sh_hudoffsets, -- 2.54.0 From b6d50da809b8e7f5407fca71e7a008724d26da32 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 14:12:07 +0100 Subject: [PATCH 119/325] add fancyroulette toggle --- src/k_kart.c | 6 +++++- src/k_kart.h | 1 + src/m_menu.c | 22 +++++++++++++--------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 2ca9ccd1b..56b44d862 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -91,6 +91,8 @@ consvar_t cv_showlaptimes = {"showlaptimes", "Off", CV_SAVE, CV_OnOff, NULL, 0, consvar_t cv_posanim = {"postitionanimation", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_smallposnum = {"smallpositionnumber", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_fancyroulette = {"animatedroulette", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + consvar_t cv_minihead = {"smallminimapplayers", "Off", 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}; @@ -839,6 +841,8 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_posanim); CV_RegisterVar(&cv_smallposnum); + CV_RegisterVar(&cv_fancyroulette); + CV_RegisterVar(&cv_showlaptimes); CV_RegisterVar(&cv_newspeedometer); @@ -8309,7 +8313,7 @@ static void K_drawKartItem(void) fixed_t rfy = fy<kartstuff[k_itemroulette] && !stplyr->deadtimer) + if (cv_fancyroulette.value && stplyr->kartstuff[k_itemroulette] && !stplyr->deadtimer) { fixed_t frac = R_UsingFrameInterpolation() ? (rendertimefrac & FRACMASK) : 0; UINT8 fancystep = (offset ? 6 : 10); diff --git a/src/k_kart.h b/src/k_kart.h index 3f98a6059..c4d24fae8 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -31,6 +31,7 @@ extern consvar_t cv_biglaps; extern consvar_t cv_highresportrait; extern consvar_t cv_stat_xoffset, cv_stat_yoffset; extern consvar_t cv_showstats; +extern consvar_t cv_fancyroulette; extern consvar_t cv_showlaptimes; extern consvar_t cv_battlespeedo; diff --git a/src/m_menu.c b/src/m_menu.c index 426d3d835..01899f2e9 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2296,20 +2296,22 @@ static menuitem_t OP_SaturnHudMenu[] = {IT_STRING | IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 90}, - {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 100}, - {IT_STRING | IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 105}, + {IT_STRING | IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 100}, - {IT_STRING | IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 115}, - {IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 120}, + {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 110}, + {IT_STRING | IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 115}, - {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 130}, + {IT_STRING | IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 125}, + {IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 130}, - {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 140}, + {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 140}, - {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 150}, - {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 155}, + {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 150}, - {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 165}, + {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 160}, + {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 165}, + + {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 175}, }; static const char* OP_SaturnHudTooltips[] = @@ -2326,6 +2328,7 @@ static const char* OP_SaturnHudTooltips[] = "Make the Postionnumber half the size.", "Disable the animation of the Positionnumber\nwhen overtaking someone.", "Flash current Lap Time when doing a Lap on the Timer.", + "Enables an animation while the roulette is active.", "Show the big 'LAP' text on a lap change.", "Show the big Cecho Messages.", "Show player names on the minimap.", @@ -2351,6 +2354,7 @@ enum sh_smolpos, sh_posanim, sh_laptime, + sh_fancy, sh_lapemblem, sh_cechotogle, sh_mapname, -- 2.54.0 From cd9df8065d997ce4ff1a6be429e15309447ac003 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 14:12:19 +0100 Subject: [PATCH 120/325] use R_GetHudUncap --- 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 56b44d862..9d7d7a3c3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8315,7 +8315,7 @@ static void K_drawKartItem(void) if (cv_fancyroulette.value && stplyr->kartstuff[k_itemroulette] && !stplyr->deadtimer) { - fixed_t frac = R_UsingFrameInterpolation() ? (rendertimefrac & FRACMASK) : 0; + fixed_t frac = R_GetHudUncap(); UINT8 fancystep = (offset ? 6 : 10); fixed_t fancyoffset = (stplyr->kartstuff[k_itemroulette] % 3)-1; if (fancyoffset != 0) -- 2.54.0 From 8abe40cc817ae623f8eb434db0350fee9f08fee8 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 14:17:44 +0100 Subject: [PATCH 121/325] cap console animation if uncappedhud is disabled since thats "how vanilla done it" before --- src/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console.c b/src/console.c index f36b3b7cb..1f5e28bed 100644 --- a/src/console.c +++ b/src/console.c @@ -608,7 +608,7 @@ static void CON_MoveConsole(void) } // Not instant - Increment fracmovement fractionally - fracmovement += FixedMul(cons_speed.value*vid.fdupy, renderdeltatics); + fracmovement += FixedMul(cons_speed.value*vid.fdupy, (cv_uncappedhud.value ? renderdeltatics : FRACUNIT)); if (con_curlines < con_destlines) // Move the console downwards { -- 2.54.0 From 60d81037fdafa749cc62c6b302967267ecbc60fe Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 14:22:56 +0100 Subject: [PATCH 122/325] "Fix console text bleeding " read https://git.do.srb2.org/STJr/SRB2/-/merge_requests/1434 --- src/console.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/console.c b/src/console.c index 1f5e28bed..3212521b0 100644 --- a/src/console.c +++ b/src/console.c @@ -1466,7 +1466,10 @@ static void CON_DrawHudlines(void) { charflags = (*p & 0x7f) << V_CHARCOLORSHIFT; p++; + c++; } + if (c >= con_width) + break; if (*p < HU_FONTSTART) ;//charwidth = 4 * con_scalefactor; else @@ -1546,7 +1549,10 @@ static void CON_DrawConsole(void) { charflags = (*p & 0x7f) << V_CHARCOLORSHIFT; p++; + c++; } + if (c >= con_width) + break; V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value); } } -- 2.54.0 From 56ed32d094750bdb506b5cc686307e5ed2694315 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 19 Jan 2025 17:31:55 +0100 Subject: [PATCH 123/325] merge conflict moment --- src/d_main.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 209e7fb76..0c0432fd4 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -774,15 +774,15 @@ void D_SRB2Loop(void) debugload--; #endif - interp = R_UsingFrameInterpolation() && !dedicated; + refreshdirmenu = 0; // not sure where to put this, here as good as any? + + interp = (R_UsingFrameInterpolation() && !dedicated); doDisplay = false; renderisnewtic = (realtics > 0 || singletics); if (renderisnewtic) { - refreshdirmenu = 0; // not sure where to put this, here as good as any? - // don't skip more than 10 frames at a time // (fadein / fadeout cause massive frame skip!) if (realtics > 8) @@ -859,7 +859,6 @@ void D_SRB2Loop(void) // consoleplayer -> displayplayers (hear sounds from viewpoint) S_UpdateSounds(); // move positional sounds - LUA_Step(); #ifdef HAVE_DISCORDRPC -- 2.54.0 From 28b294f48a6b8230d4fcb767a746a86bbd67490b Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 12 Jan 2025 03:51:35 +0100 Subject: [PATCH 124/325] add support for multiitem patches (thx neppy!) needs new patches, unsure if we just gonna add em to the extra file or make a new one so it ambigous for now --- src/d_main.c | 35 +++++++++------- src/d_main.h | 30 ++++++++------ src/k_kart.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++---- src/k_kart.h | 1 + 4 files changed, 145 insertions(+), 35 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 0c0432fd4..85c86d1ee 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1196,19 +1196,22 @@ boolean found_extra_kart; boolean found_extra2_kart; boolean found_extra3_kart; -boolean xtra_speedo; // extra speedometer check -boolean xtra_speedo_clr; // extra speedometer colour check -boolean xtra_speedo3; // 80x 11 extra speedometer check -boolean xtra_speedo_clr3; // 80x 11 extra speedometer colour check -boolean achi_speedo; // achiiro speedometer check -boolean achi_speedo_clr; // extra speedometer colour check -boolean clr_hud; // colour hud check -boolean big_lap; // bigger lap counter -boolean big_lap_color; // bigger lap counter but colour -boolean kartzspeedo; // kartZ speedo -boolean statdp; // stat display for extended player setup -boolean nametaggfx; // Nametag stuffs -boolean driftgaugegfx; +boolean xtra_speedo; // extra speedometer check +boolean xtra_speedo_clr; // extra speedometer colour check +boolean xtra_speedo3; // 80x 11 extra speedometer check +boolean xtra_speedo_clr3; // 80x 11 extra speedometer colour check +boolean achi_speedo; // achiiro speedometer check +boolean achi_speedo_clr; // extra speedometer colour check +boolean kartzspeedo; // kartZ speedo + +boolean clr_hud; // colour hud check +boolean big_lap; // bigger lap counter +boolean big_lap_color; // bigger lap counter but colour +boolean statdp; // stat display for extended player setup +boolean nametaggfx; // Nametag stuffs +boolean driftgaugegfx; // Driftgauge stuffs +boolean multiitem_icon; // Extra icons for Sneakers, Banana and Jawz +// static void IdentifyVersion(void) { @@ -1638,9 +1641,11 @@ void D_SRB2Main(void) nametaggfx = true; if (W_CheckMultipleLumps("K_DGAU","K_DCAU","K_DGSU","K_DCSU", NULL)) - { driftgaugegfx = true; - } + + // extra item icons + if (W_CheckMultipleLumps("K_ITSHO2", "K_ITSHO3", "K_ITBAN2", "K_ITBAN3", "K_ITBAN4", "K_ITJAW2", NULL)) + multiitem_icon = true; if (found_extra3_kart) { diff --git a/src/d_main.h b/src/d_main.h index ddd6c3ab4..397aabdf8 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -27,23 +27,27 @@ extern boolean usehome; //Alam: which path? extern const char *pandf; //Alam: how to path? extern char srb2path[256]; //Alam: SRB2's Home +// extra graphic patches for saturn specific thingies extern boolean found_extra_kart; // for use in k_kart.c extern boolean found_extra2_kart; // for use in k_kart.c extern boolean found_extra3_kart; // for use in k_kart.c -extern boolean xtra_speedo; // extra speedometer check -extern boolean xtra_speedo_clr; // extra speedometer colour check -extern boolean xtra_speedo3; // 80x11 extra speedometer check -extern boolean xtra_speedo_clr3; // 80x11 extra speedometer colour check -extern boolean achi_speedo; // achiiro speedometer check -extern boolean achi_speedo_clr; // extra speedometer colour check -extern boolean clr_hud; // colour hud check -extern boolean big_lap; // bigger lap counter -extern boolean big_lap_color; // bigger lap counter but colour -extern boolean kartzspeedo; // kartZ speedo -extern boolean statdp; // stat display for extended player setup -extern boolean nametaggfx; // Nametag stuffs -extern boolean driftgaugegfx; +extern boolean xtra_speedo; // extra speedometer check +extern boolean xtra_speedo_clr; // extra speedometer colour check +extern boolean xtra_speedo3; // 80x11 extra speedometer check +extern boolean xtra_speedo_clr3; // 80x11 extra speedometer colour check +extern boolean achi_speedo; // achiiro speedometer check +extern boolean achi_speedo_clr; // extra speedometer colour check +extern boolean kartzspeedo; // kartZ speedo + +extern boolean clr_hud; // colour hud check +extern boolean big_lap; // bigger lap counter +extern boolean big_lap_color; // bigger lap counter but colour +extern boolean statdp; // stat display for extended player setup +extern boolean nametaggfx; // Nametag stuffs +extern boolean driftgaugegfx; // Driftgauge stuffs +extern boolean multiitem_icon; // Extra icons for Sneakers, Banana and Jawz +// // autoload stuff extern boolean autoloading; diff --git a/src/k_kart.c b/src/k_kart.c index 9d7d7a3c3..62dd0abfc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -99,9 +99,11 @@ consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, N consvar_t cv_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //make char potraits use their high-res version instead consvar_t cv_showlapemblem = {"showlapemblem", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //itembox gets a dark box with specific items consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //here for ppl who dont want to make 2 more patches for their custom hud +consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //itembox gets a dark box with specific items +consvar_t cv_multiitemicon = {"multiitemicon", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; consvar_t cv_newspeedometer = {"newspeedometer", "Default", CV_SAVE, speedo_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_battlespeedo = {"battlespeedo", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //toggle for showing the speedometer in battlemode @@ -854,14 +856,16 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_stagetitle); - //Colourized HUD + // Colourized HUD CV_RegisterVar(&cv_colorizedhud); CV_RegisterVar(&cv_colorizedhudcolor); CV_RegisterVar(&cv_colorizeditembox); + CV_RegisterVar(&cv_biglaps); + CV_RegisterVar(&cv_darkitembox); - CV_RegisterVar(&cv_biglaps); + CV_RegisterVar(&cv_multiitemicon); CV_RegisterVar(&cv_highresportrait); @@ -7217,12 +7221,15 @@ static patch_t *kp_itemmulsticker[2]; static patch_t *kp_itemx; static patch_t *kp_sneaker[2]; +static patch_t *kp_multsneaker[2]; static patch_t *kp_rocketsneaker[2]; static patch_t *kp_invincibility[13]; static patch_t *kp_banana[2]; +static patch_t *kp_multbanana[3]; static patch_t *kp_eggman[2]; static patch_t *kp_orbinaut[5]; static patch_t *kp_jawz[2]; +static patch_t *kp_multjawz[1]; static patch_t *kp_mine[2]; static patch_t *kp_ballhog[2]; static patch_t *kp_selfpropelledbomb[2]; @@ -7484,6 +7491,11 @@ void K_LoadKartHUDGraphics(void) kp_itemx = W_CachePatchName("K_ITX", PU_HUDGFX); kp_sneaker[0] = W_CachePatchName("K_ITSHOE", PU_HUDGFX); + if (multiitem_icon) + { + kp_multsneaker[0] = W_CachePatchName("K_ITSHO2", PU_HUDGFX); + kp_multsneaker[1] = W_CachePatchName("K_ITSHO3", PU_HUDGFX); + } kp_rocketsneaker[0] = W_CachePatchName("K_ITRSHE", PU_HUDGFX); sprintf(buffer, "K_ITINVx"); @@ -7492,7 +7504,14 @@ void K_LoadKartHUDGraphics(void) buffer[7] = '1'+i; kp_invincibility[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } + kp_banana[0] = W_CachePatchName("K_ITBANA", PU_HUDGFX); + if (multiitem_icon) + { + kp_multbanana[0] = W_CachePatchName("K_ITBAN2", PU_HUDGFX); + kp_multbanana[1] = W_CachePatchName("K_ITBAN3", PU_HUDGFX); + kp_multbanana[2] = W_CachePatchName("K_ITBAN4", PU_HUDGFX); + } kp_eggman[0] = W_CachePatchName("K_ITEGGM", PU_HUDGFX); sprintf(buffer, "K_ITORBx"); for (i = 0; i < 4; i++) @@ -7501,6 +7520,10 @@ void K_LoadKartHUDGraphics(void) kp_orbinaut[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } kp_jawz[0] = W_CachePatchName("K_ITJAWZ", PU_HUDGFX); + if (multiitem_icon) + { + kp_multjawz[0] = W_CachePatchName("K_ITJAW2", PU_HUDGFX); + } kp_mine[0] = W_CachePatchName("K_ITMINE", PU_HUDGFX); kp_ballhog[0] = W_CachePatchName("K_ITBHOG", PU_HUDGFX); kp_selfpropelledbomb[0] = W_CachePatchName("K_ITSPB", PU_HUDGFX); @@ -8067,7 +8090,7 @@ static void K_drawKartItem(void) patch_t *localinv = ((offset) ? kp_invincibility[((leveltime % (6*3)) / 3) + 7] : kp_invincibility[(leveltime % (7*3)) / 3]); INT32 fx = 0, fy = 0, fflags = 0; // final coords for hud and flags... //INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT); - const INT32 numberdisplaymin = ((!offset && stplyr->kartstuff[k_itemtype] == KITEM_ORBINAUT) ? 5 : 2); + INT32 numberdisplaymin = 2; // No longer a constant so other things can modify this value INT32 itembar = 0; INT32 maxl = 0; // itembar's normal highest value const INT32 barlength = (splitscreen > 1 ? 12 : 26); @@ -8078,6 +8101,8 @@ static void K_drawKartItem(void) boolean flipamount = splitscreen > 1 && stplyrnum & 1; // Used for 3P/4P splitscreen to flip item amount stuff + const boolean usemultiicon = (multiitem_icon && cv_multiitemicon.value); + if (stplyr->kartstuff[k_itemroulette]) { if (K_GetHudColor()) @@ -8216,57 +8241,132 @@ static void K_drawKartItem(void) switch(stplyr->kartstuff[k_itemtype]) { case KITEM_SNEAKER: - localpatch = kp_sneaker[offset]; + if (usemultiicon) + { + if (offset) + { + numberdisplaymin = 2; + localpatch = kp_sneaker[offset]; + } + else + { + numberdisplaymin = 4; + switch(stplyr->kartstuff[k_itemamount]) + { + case 1: + localpatch = kp_sneaker[offset]; + break; + case 2: + localpatch = kp_multsneaker[0]; + break; + default: + localpatch = kp_multsneaker[1]; + break; + } + } + + } + else + { + numberdisplaymin = 2; + localpatch = kp_sneaker[offset]; + } break; case KITEM_ROCKETSNEAKER: + numberdisplaymin = 2; localpatch = kp_rocketsneaker[offset]; break; case KITEM_INVINCIBILITY: + numberdisplaymin = 2; localpatch = localinv; dark = true; break; case KITEM_BANANA: - localpatch = kp_banana[offset]; + if (usemultiicon) + { + numberdisplaymin = 4; + switch(stplyr->kartstuff[k_itemamount]) + { + case 1: + localpatch = kp_banana[offset]; + break; + case 2: + localpatch = kp_multbanana[0]; + break; + case 10: + localpatch = kp_multbanana[2]; + break; + default: + localpatch = kp_multbanana[1]; + break; + } + } + else + { + numberdisplaymin = 2; + localpatch = kp_banana[offset]; + } break; case KITEM_EGGMAN: + numberdisplaymin = 2; localpatch = kp_eggman[offset]; break; case KITEM_ORBINAUT: + numberdisplaymin = offset ? 2 : 5; localpatch = kp_orbinaut[(offset ? 4 : min(stplyr->kartstuff[k_itemamount]-1, 3))]; break; case KITEM_JAWZ: - localpatch = kp_jawz[offset]; + if (usemultiicon) + { + numberdisplaymin = 3; + localpatch = ((stplyr->kartstuff[k_itemamount] == 1) ? kp_jawz[offset] : kp_multjawz[0]); + } + else + { + numberdisplaymin = 2; + localpatch = kp_jawz[offset]; + } break; case KITEM_MINE: + numberdisplaymin = 2; localpatch = kp_mine[offset]; break; case KITEM_BALLHOG: + numberdisplaymin = 2; localpatch = kp_ballhog[offset]; break; case KITEM_SPB: + numberdisplaymin = 2; localpatch = kp_selfpropelledbomb[offset]; dark = true; break; case KITEM_GROW: + numberdisplaymin = 2; localpatch = kp_grow[offset]; break; case KITEM_SHRINK: + numberdisplaymin = 2; localpatch = kp_shrink[offset]; break; case KITEM_THUNDERSHIELD: + numberdisplaymin = 2; localpatch = kp_thundershield[offset]; dark = true; break; case KITEM_HYUDORO: + numberdisplaymin = 2; localpatch = kp_hyudoro[offset]; break; case KITEM_POGOSPRING: + numberdisplaymin = 2; localpatch = kp_pogospring[offset]; break; case KITEM_KITCHENSINK: + numberdisplaymin = 2; localpatch = kp_kitchensink[offset]; break; case KITEM_SAD: + numberdisplaymin = 2; localpatch = kp_sadface[offset]; break; default: diff --git a/src/k_kart.h b/src/k_kart.h index c4d24fae8..a719eb3e4 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -34,6 +34,7 @@ extern consvar_t cv_showstats; extern consvar_t cv_fancyroulette; extern consvar_t cv_showlaptimes; extern consvar_t cv_battlespeedo; +extern consvar_t cv_multiitemicon; #define NUMSPEEDOSTUFF 6 extern CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; -- 2.54.0 From 44b6c5345267f0c87c501fc4c213cb8fe87e82dc Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 12 Jan 2025 04:10:11 +0100 Subject: [PATCH 125/325] change banana default patch to match lua roulette hud behaviour --- src/k_kart.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 62dd0abfc..1132af73b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8293,11 +8293,11 @@ static void K_drawKartItem(void) case 2: localpatch = kp_multbanana[0]; break; - case 10: - localpatch = kp_multbanana[2]; + case 3: + localpatch = kp_multbanana[1]; break; default: - localpatch = kp_multbanana[1]; + localpatch = kp_multbanana[2]; break; } } -- 2.54.0 From 82bd65eebd9867748daac282c6c6ee84d1a165ec Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 16 Jan 2025 21:58:37 +0100 Subject: [PATCH 126/325] don use multiicon patches in 3/4p splitscreen since it uses the smoler patches also removes redundant assignments --- src/k_kart.c | 49 ++++++++++++------------------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1132af73b..4e4369d19 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8101,7 +8101,7 @@ static void K_drawKartItem(void) boolean flipamount = splitscreen > 1 && stplyrnum & 1; // Used for 3P/4P splitscreen to flip item amount stuff - const boolean usemultiicon = (multiitem_icon && cv_multiitemicon.value); + const boolean usemultiicon = (multiitem_icon && cv_multiitemicon.value && !offset); if (stplyr->kartstuff[k_itemroulette]) { @@ -8243,41 +8243,29 @@ static void K_drawKartItem(void) case KITEM_SNEAKER: if (usemultiicon) { - if (offset) + numberdisplaymin = 4; + switch(stplyr->kartstuff[k_itemamount]) { - numberdisplaymin = 2; - localpatch = kp_sneaker[offset]; + case 1: + localpatch = kp_sneaker[offset]; + break; + case 2: + localpatch = kp_multsneaker[0]; + break; + default: + localpatch = kp_multsneaker[1]; + break; } - else - { - numberdisplaymin = 4; - switch(stplyr->kartstuff[k_itemamount]) - { - case 1: - localpatch = kp_sneaker[offset]; - break; - case 2: - localpatch = kp_multsneaker[0]; - break; - default: - localpatch = kp_multsneaker[1]; - break; - } - } - } else { - numberdisplaymin = 2; localpatch = kp_sneaker[offset]; } break; case KITEM_ROCKETSNEAKER: - numberdisplaymin = 2; localpatch = kp_rocketsneaker[offset]; break; case KITEM_INVINCIBILITY: - numberdisplaymin = 2; localpatch = localinv; dark = true; break; @@ -8303,12 +8291,10 @@ static void K_drawKartItem(void) } else { - numberdisplaymin = 2; localpatch = kp_banana[offset]; } break; case KITEM_EGGMAN: - numberdisplaymin = 2; localpatch = kp_eggman[offset]; break; case KITEM_ORBINAUT: @@ -8323,50 +8309,39 @@ static void K_drawKartItem(void) } else { - numberdisplaymin = 2; localpatch = kp_jawz[offset]; } break; case KITEM_MINE: - numberdisplaymin = 2; localpatch = kp_mine[offset]; break; case KITEM_BALLHOG: - numberdisplaymin = 2; localpatch = kp_ballhog[offset]; break; case KITEM_SPB: - numberdisplaymin = 2; localpatch = kp_selfpropelledbomb[offset]; dark = true; break; case KITEM_GROW: - numberdisplaymin = 2; localpatch = kp_grow[offset]; break; case KITEM_SHRINK: - numberdisplaymin = 2; localpatch = kp_shrink[offset]; break; case KITEM_THUNDERSHIELD: - numberdisplaymin = 2; localpatch = kp_thundershield[offset]; dark = true; break; case KITEM_HYUDORO: - numberdisplaymin = 2; localpatch = kp_hyudoro[offset]; break; case KITEM_POGOSPRING: - numberdisplaymin = 2; localpatch = kp_pogospring[offset]; break; case KITEM_KITCHENSINK: - numberdisplaymin = 2; localpatch = kp_kitchensink[offset]; break; case KITEM_SAD: - numberdisplaymin = 2; localpatch = kp_sadface[offset]; break; default: -- 2.54.0 From 516bea6e8a24f48f821668fc979740cf6893804b Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 17:15:00 +0100 Subject: [PATCH 127/325] add toggle for item amount number display --- src/k_kart.c | 25 ++++++++++++++++--------- src/k_kart.h | 1 + 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4e4369d19..6abe561e6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -96,17 +96,19 @@ consvar_t cv_fancyroulette = {"animatedroulette", "Off", CV_SAVE, CV_OnOff, NULL consvar_t cv_minihead = {"smallminimapplayers", "Off", 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_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //make char potraits use their high-res version instead +consvar_t cv_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // make char potraits use their high-res version instead consvar_t cv_showlapemblem = {"showlapemblem", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //here for ppl who dont want to make 2 more patches for their custom hud +consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // here for ppl who dont want to make 2 more patches for their custom hud -consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //itembox gets a dark box with specific items +consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // itembox gets a dark box with specific items consvar_t cv_multiitemicon = {"multiitemicon", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +static CV_PossibleValue_t huditemamount_cons_t[] = {{0, "Vanilla"}, {1, "Multiple"}, {1, "Always"},{0, NULL}}; +consvar_t cv_huditemamount = {"showitemamountnumber", "Vanilla", CV_SAVE, huditemamount_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; consvar_t cv_newspeedometer = {"newspeedometer", "Default", CV_SAVE, speedo_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_battlespeedo = {"battlespeedo", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //toggle for showing the speedometer in battlemode +consvar_t cv_battlespeedo = {"battlespeedo", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // toggle for showing the speedometer in battlemode // funn-E streeetch static CV_PossibleValue_t stretchfactor_t[] = { @@ -866,6 +868,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_darkitembox); CV_RegisterVar(&cv_multiitemicon); + CV_RegisterVar(&cv_huditemamount); CV_RegisterVar(&cv_highresportrait); @@ -8090,7 +8093,7 @@ static void K_drawKartItem(void) patch_t *localinv = ((offset) ? kp_invincibility[((leveltime % (6*3)) / 3) + 7] : kp_invincibility[(leveltime % (7*3)) / 3]); INT32 fx = 0, fy = 0, fflags = 0; // final coords for hud and flags... //INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT); - INT32 numberdisplaymin = 2; // No longer a constant so other things can modify this value + INT32 numberdisplaymin = cv_huditemamount.value == 2 ? 1 : 2; // No longer a constant so other things can modify this value INT32 itembar = 0; INT32 maxl = 0; // itembar's normal highest value const INT32 barlength = (splitscreen > 1 ? 12 : 26); @@ -8243,7 +8246,8 @@ static void K_drawKartItem(void) case KITEM_SNEAKER: if (usemultiicon) { - numberdisplaymin = 4; + if (!cv_huditemamount.value) + numberdisplaymin = 4; switch(stplyr->kartstuff[k_itemamount]) { case 1: @@ -8272,7 +8276,8 @@ static void K_drawKartItem(void) case KITEM_BANANA: if (usemultiicon) { - numberdisplaymin = 4; + if (!cv_huditemamount.value) + numberdisplaymin = 4; switch(stplyr->kartstuff[k_itemamount]) { case 1: @@ -8298,13 +8303,15 @@ static void K_drawKartItem(void) localpatch = kp_eggman[offset]; break; case KITEM_ORBINAUT: - numberdisplaymin = offset ? 2 : 5; + if (!cv_huditemamount.value) + numberdisplaymin = offset ? 2 : 5; localpatch = kp_orbinaut[(offset ? 4 : min(stplyr->kartstuff[k_itemamount]-1, 3))]; break; case KITEM_JAWZ: if (usemultiicon) { - numberdisplaymin = 3; + if (!cv_huditemamount.value) + numberdisplaymin = 3; localpatch = ((stplyr->kartstuff[k_itemamount] == 1) ? kp_jawz[offset] : kp_multjawz[0]); } else diff --git a/src/k_kart.h b/src/k_kart.h index a719eb3e4..bf3f4f71a 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -35,6 +35,7 @@ extern consvar_t cv_fancyroulette; extern consvar_t cv_showlaptimes; extern consvar_t cv_battlespeedo; extern consvar_t cv_multiitemicon; +extern consvar_t cv_huditemamount; #define NUMSPEEDOSTUFF 6 extern CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; -- 2.54.0 From af7393832a30f29feca4590ac66a3866e98234fe Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 23:42:50 +0100 Subject: [PATCH 128/325] add stuff to menu --- src/m_menu.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 01899f2e9..a4db8f736 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2296,22 +2296,24 @@ static menuitem_t OP_SaturnHudMenu[] = {IT_STRING | IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 90}, - {IT_STRING | IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 100}, + {IT_STRING | IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 100}, + {IT_STRING | IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 105}, + {IT_STRING | IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 110}, - {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 110}, - {IT_STRING | IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 115}, + {IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 120}, + {IT_STRING | IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 125}, - {IT_STRING | IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 125}, - {IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 130}, + {IT_STRING | IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 135}, + {IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 140}, - {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 140}, + {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 150}, - {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 150}, + {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 160}, - {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 160}, - {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 165}, + {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 170}, + {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 175}, - {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 175}, + {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 185}, }; static const char* OP_SaturnHudTooltips[] = @@ -2328,6 +2330,8 @@ static const char* OP_SaturnHudTooltips[] = "Make the Postionnumber half the size.", "Disable the animation of the Positionnumber\nwhen overtaking someone.", "Flash current Lap Time when doing a Lap on the Timer.", + "Use graphics for multiple sneakers, bananas and jawz.", + "Change when the item amount is to be displayed\nMultiple will always display the number\nwhen you have multiple of the same Item\nAlways will always display the number regardless of Item amount.", "Enables an animation while the roulette is active.", "Show the big 'LAP' text on a lap change.", "Show the big Cecho Messages.", @@ -2353,6 +2357,8 @@ enum sh_highresport, sh_smolpos, sh_posanim, + sh_multicon, + sh_itamnum, sh_laptime, sh_fancy, sh_lapemblem, -- 2.54.0 From 2a25328ce012b238dbc5b2cfda5a79a694277086 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 23:44:17 +0100 Subject: [PATCH 129/325] change tooltips slightly --- src/m_menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index a4db8f736..564ce4e33 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2330,8 +2330,8 @@ static const char* OP_SaturnHudTooltips[] = "Make the Postionnumber half the size.", "Disable the animation of the Positionnumber\nwhen overtaking someone.", "Flash current Lap Time when doing a Lap on the Timer.", - "Use graphics for multiple sneakers, bananas and jawz.", - "Change when the item amount is to be displayed\nMultiple will always display the number\nwhen you have multiple of the same Item\nAlways will always display the number regardless of Item amount.", + "Use extra graphics for multiple sneakers, bananas and jawz.", + "Change when the item amount is to be displayed\nMultiple will always display the number.\nwhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.", "Enables an animation while the roulette is active.", "Show the big 'LAP' text on a lap change.", "Show the big Cecho Messages.", -- 2.54.0 From 04bf086a9e48bf55f31fb92ad1e6c214a125169a Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 18 Jan 2025 11:44:09 +0100 Subject: [PATCH 130/325] forgor to check for that flag --- src/p_tick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_tick.c b/src/p_tick.c index 15c523b37..3be79bf68 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -511,7 +511,7 @@ static inline void P_ResetSpriteStuff(void) mo = (mobj_t *)th; - if (mo->type == MT_SHADOW || mo->sprite == SPR_NULL) + if (mo->sprite == SPR_NULL || mo->flags2 & MF2_DONTDRAW || mo->type == MT_SHADOW) continue; mo->spritexscale = mo->realxscale; -- 2.54.0 From 913c0f4ae74bbe0898647d7a9019e7a07573ee38 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 18 Jan 2025 11:45:20 +0100 Subject: [PATCH 131/325] idk why we check this --- src/r_things.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 1cca7bbed..42764a16f 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2776,9 +2776,6 @@ boolean R_ThingVisible (mobj_t *thing) if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) return false; - if (!P_MobjWasRemoved(viewmobj) && (thing == viewmobj)) - return false; - if (splitscreen) { if ((viewssnum == 0 && (thing->eflags & MFE_DRAWONLYFORP1)) -- 2.54.0 From 3d394bb621774aaf7230397c3f37cfe71ebf7bfe Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 18 Jan 2025 14:29:44 +0100 Subject: [PATCH 132/325] refactor weather switching from srb2 makes this more sane and makes PRECIP_STORM_NORAIN not spawn a crapton of invisible mobjs --- src/p_mobj.c | 16 ++------ src/p_spec.c | 103 ++++++++++++++++++--------------------------------- 2 files changed, 41 insertions(+), 78 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index e98eb1bdf..0063be33f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10235,7 +10235,7 @@ void P_SpawnPrecipitation(void) subsector_t *precipsector = NULL; precipmobj_t *rainmo = NULL; - if (dedicated || !cv_drawdist_precip.value || curWeather == PRECIP_NONE) // SRB2Kart + if (dedicated || !cv_drawdist_precip.value || curWeather == PRECIP_NONE || curWeather == PRECIP_STORM_NORAIN) return; fixed_t density = (cv_mobjscaleprecip.value ? mapobjectscale : FRACUNIT); @@ -10289,6 +10289,9 @@ void P_SpawnPrecipitation(void) else // everything else. rainmo = P_SpawnPrecipMobj(x, y, z, MT_RAIN); + if (curWeather == PRECIP_BLANK) + rainmo->precipflags |= PCF_INVISIBLE; + floorz = rainmo->floorz >> FRACBITS; ceilingz = rainmo->ceilingz >> FRACBITS; @@ -10304,17 +10307,6 @@ void P_SpawnPrecipitation(void) } } } - - if (curWeather == PRECIP_BLANK) - { - curWeather = PRECIP_RAIN; - P_SwitchWeather(PRECIP_BLANK); - } - else if (curWeather == PRECIP_STORM_NORAIN) - { - curWeather = PRECIP_RAIN; - P_SwitchWeather(PRECIP_STORM_NORAIN); - } } // diff --git a/src/p_spec.c b/src/p_spec.c index fc25a94ad..659945af2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1718,6 +1718,22 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) } } +static boolean is_rain_type (INT32 weathernum) +{ + switch (weathernum) + { + case PRECIP_SNOW: + case PRECIP_RAIN: + case PRECIP_STORM: + case PRECIP_STORM_NOSTRIKES: + case PRECIP_BLANK: + return true; + + default: + return false; + } +} + // // P_SwitchWeather // @@ -1725,53 +1741,14 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) // void P_SwitchWeather(INT32 weathernum) { - boolean purge = false; - INT32 swap = 0; + boolean purge = true; - switch (weathernum) - { - case PRECIP_NONE: // None - if (curWeather == PRECIP_NONE) - return; // Nothing to do. - purge = true; - break; - case PRECIP_STORM: // Storm - case PRECIP_STORM_NOSTRIKES: // Storm w/ no lightning - case PRECIP_RAIN: // Rain - if (curWeather == PRECIP_SNOW || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) - swap = PRECIP_RAIN; - break; - case PRECIP_SNOW: // Snow - if (curWeather == PRECIP_SNOW) - return; // Nothing to do. - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) - swap = PRECIP_SNOW; // Need to delete the other precips. - break; - case PRECIP_STORM_NORAIN: // Storm w/o rain - if (curWeather == PRECIP_SNOW - || curWeather == PRECIP_STORM - || curWeather == PRECIP_STORM_NOSTRIKES - || curWeather == PRECIP_RAIN - || curWeather == PRECIP_BLANK) - swap = PRECIP_STORM_NORAIN; - else if (curWeather == PRECIP_STORM_NORAIN) - return; - break; - case PRECIP_BLANK: - if (curWeather == PRECIP_SNOW - || curWeather == PRECIP_STORM - || curWeather == PRECIP_STORM_NOSTRIKES - || curWeather == PRECIP_RAIN) - swap = PRECIP_BLANK; - else if (curWeather == PRECIP_STORM_NORAIN) - swap = PRECIP_BLANK; - else if (curWeather == PRECIP_BLANK) - return; - break; - default: - CONS_Debug(DBG_GAMELOGIC, "P_SwitchWeather: Unknown weather type %d.\n", weathernum); - break; - } + if (weathernum == curWeather) + return; + + if (is_rain_type(weathernum) && + is_rain_type(curWeather)) + purge = false; if (purge) { @@ -1792,7 +1769,7 @@ void P_SwitchWeather(INT32 weathernum) P_FreePrecipMobj(precipmobj); } } - else if (swap && !((swap == PRECIP_BLANK && curWeather == PRECIP_STORM_NORAIN) || (swap == PRECIP_STORM_NORAIN && curWeather == PRECIP_BLANK))) // Rather than respawn all that crap, reuse it! + else // Rather than respawn all that crap, reuse it! { thinker_t *think; precipmobj_t *precipmobj; @@ -1810,17 +1787,16 @@ void P_SwitchWeather(INT32 weathernum) mobjtype_t type = 0; INT32 z = 0; - if (swap == PRECIP_BLANK || swap == PRECIP_STORM_NORAIN) // Remove precip, but keep it around for reuse. + if (weathernum == PRECIP_NONE || weathernum == PRECIP_BLANK || weathernum == PRECIP_STORM_NORAIN) // Remove precip, but keep it around for reuse. { precipmobj->precipflags |= PCF_INVISIBLE; continue; } - - if (swap == PRECIP_RAIN) // Snow To Rain + else if (weathernum == PRECIP_RAIN || weathernum == PRECIP_STORM || weathernum == PRECIP_STORM_NOSTRIKES) // Snow To Rain { type = MT_RAIN; } - else if (swap == PRECIP_SNOW) // Rain To Snow + else if (weathernum == PRECIP_SNOW) // Rain To Snow { type = MT_SNOWFLAKE; @@ -1850,50 +1826,45 @@ void P_SwitchWeather(INT32 weathernum) } } - boolean dontspawn = false; + boolean spawnprecip = false; switch (weathernum) { case PRECIP_SNOW: // snow curWeather = PRECIP_SNOW; - break; + spawnprecip = true; + break; case PRECIP_RAIN: // rain { - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) - dontspawn = true; - curWeather = PRECIP_RAIN; + spawnprecip = true; break; } case PRECIP_STORM: // storm { - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) - dontspawn = true; - curWeather = PRECIP_STORM; + spawnprecip = true; break; } case PRECIP_STORM_NOSTRIKES: // storm w/o lightning { - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) - dontspawn = true; - curWeather = PRECIP_STORM_NOSTRIKES; + spawnprecip = true; break; } case PRECIP_STORM_NORAIN: // storm w/o rain curWeather = PRECIP_STORM_NORAIN; break; - case PRECIP_BLANK: + case PRECIP_BLANK: //preloaded curWeather = PRECIP_BLANK; - break; + spawnprecip = true; + break; default: - dontspawn = true; curWeather = PRECIP_NONE; break; } - if (!dontspawn && !swap) + if (spawnprecip && purge) P_SpawnPrecipitation(); } -- 2.54.0 From f9ee18584e5c6098349629aaf42cabcd912c4aa6 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 18 Jan 2025 14:36:35 +0100 Subject: [PATCH 133/325] use MT_NULL instead of number --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 659945af2..c233626a0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1784,8 +1784,8 @@ void P_SwitchWeather(INT32 weathernum) precipmobj = (precipmobj_t *)think; - mobjtype_t type = 0; INT32 z = 0; + mobjtype_t type = MT_NULL; if (weathernum == PRECIP_NONE || weathernum == PRECIP_BLANK || weathernum == PRECIP_STORM_NORAIN) // Remove precip, but keep it around for reuse. { -- 2.54.0 From 676265a92ac8baf47696bf1440f32f457325d26f Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 18 Jan 2025 21:24:47 +0100 Subject: [PATCH 134/325] fix "lessprecip" logic error lul --- src/p_mobj.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 0063be33f..103e7dfb8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10230,28 +10230,26 @@ consvar_t cv_suddendeath = {"suddendeath", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHE void P_SpawnPrecipitation(void) { - INT32 i, mrand; - fixed_t basex, basey, j, x, y, z; + INT32 i, j, mrand; + fixed_t basex, basey, x, y, z; subsector_t *precipsector = NULL; precipmobj_t *rainmo = NULL; if (dedicated || !cv_drawdist_precip.value || curWeather == PRECIP_NONE || curWeather == PRECIP_STORM_NORAIN) return; - fixed_t density = (cv_mobjscaleprecip.value ? mapobjectscale : FRACUNIT); - - if (cv_lessprecip.value) - density *= 2; // just spawn half the precip + const fixed_t precipmoscale = (cv_mobjscaleprecip.value ? mapobjectscale : FRACUNIT); + const INT32 density = (cv_lessprecip.value ? 2 : 1); // only spawn half as much // Use the blockmap to narrow down our placing patterns - for (i = 0; i < bmapwidth*bmapheight; ++i) + for (i = 0; i < bmapwidth*bmapheight; i += density) { basex = bmaporgx + (i % bmapwidth) * MAPBLOCKSIZE; basey = bmaporgy + (i / bmapwidth) * MAPBLOCKSIZE; // If mobjscale < FRACUNIT, each blockmap cell covers // more area so spawn more precipitation in that area. - for (j = 0; j < FRACUNIT; j += density) + for (j = 0; j < FRACUNIT; j += precipmoscale) { INT32 floorz; INT32 ceilingz; -- 2.54.0 From f7df80f763e30674e44b1283fcccd7b271973b8b Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 18 Jan 2025 21:35:22 +0100 Subject: [PATCH 135/325] ; moment --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 103e7dfb8..a032cf685 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11602,7 +11602,7 @@ ML_NOCLIMB : Direction not controllable mobj_t *elecmobj; elecmobj = P_SpawnMobj(x, y, z, MT_CYBRAKDEMON_ELECTRIC_BARRIER); P_SetTarget(&elecmobj->target, mobj); - elecmobj->angle = FixedAngle(mthing->angle*FRACUNIT);; + elecmobj->angle = FixedAngle(mthing->angle*FRACUNIT); elecmobj->destscale = mobj->scale*2; P_SetScale(elecmobj, elecmobj->destscale); } -- 2.54.0 From 0c2e285d2e7f55f3ed60927d4c4aaa7e99de532c Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 19 Jan 2025 00:03:46 +0100 Subject: [PATCH 136/325] remove some code dupe in R_AddLine --- src/r_bsp.c | 80 +++++++++++++++++++++++------------------------------ 1 file changed, 34 insertions(+), 46 deletions(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index 946302db9..2999f27a8 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -433,7 +433,7 @@ static void R_AddLine(seg_t *line) span = angle1 - angle2; // Back side? i.e. backface culling? - if (span >= ANGLE_180) + if (span >= ANGLE_180 || !line->linedef) return; // Global angle needed by segcalc. @@ -504,11 +504,12 @@ static void R_AddLine(seg_t *line) doorclosed = 0; + fixed_t frontf1,frontf2, frontc1, frontc2; // front floor/ceiling ends + fixed_t backf1, backf2, backc1, backc2; // back floor ceiling ends + // Closed door. if (frontsector->f_slope || frontsector->c_slope || backsector->f_slope || backsector->c_slope) { - fixed_t frontf1,frontf2, frontc1, frontc2; // front floor/ceiling ends - fixed_t backf1, backf2, backc1, backc2; // back floor ceiling ends #define SLOPEPARAMS(slope, end1, end2, normalheight) \ if (slope) { \ end1 = P_GetZAt(slope, line->v1->x, line->v1->y); \ @@ -521,57 +522,44 @@ static void R_AddLine(seg_t *line) SLOPEPARAMS( backsector->f_slope, backf1, backf2, backsector->floorheight) SLOPEPARAMS( backsector->c_slope, backc1, backc2, backsector->ceilingheight) #undef SLOPEPARAMS - if (viewsector != backsector && viewsector != frontsector) - { - if ((backc1 <= frontf1 && backc2 <= frontf2) - || (backf1 >= frontc1 && backf2 >= frontc2)) - { - goto clipsolid; - } - - // Check for automap fix. Store in doorclosed for r_segs.c - doorclosed = (backc1 <= backf1 && backc2 <= backf2 - && ((backc1 >= frontc1 && backc2 >= frontc2) || curline->sidedef->toptexture) - && ((backf1 <= frontf1 && backf2 >= frontf2) || curline->sidedef->bottomtexture) - && (backsector->ceilingpic != skyflatnum || frontsector->ceilingpic != skyflatnum)); - - if (doorclosed) - goto clipsolid; - } - - // Window. - if (backc1 != frontc1 || backc2 != frontc2 - || backf1 != frontf1 || backf2 != frontf2) - { - goto clippass; - } } else { - if (viewsector != backsector && viewsector != frontsector) + frontf1 = frontf2 = frontsector->floorheight; + frontc1 = frontc2 = frontsector->ceilingheight; + backf1 = backf2 = backsector->floorheight; + backc1 = backc2 = backsector->ceilingheight; + } + + if (viewsector != backsector && viewsector != frontsector) + { + // here we're talking about a CEILING lower than a floor. ...yeah we don't even need to bother. + if (backc1 <= frontf1 && backc2 <= frontf2) { - if (backsector->ceilingheight <= frontsector->floorheight - || backsector->floorheight >= frontsector->ceilingheight) - { - goto clipsolid; - } - - // Check for automap fix. Store in doorclosed for r_segs.c - doorclosed = (backsector->ceilingheight <= backsector->floorheight - && (backsector->ceilingheight >= frontsector->ceilingheight || curline->sidedef->toptexture) - && (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture) - && (backsector->ceilingpic != skyflatnum || frontsector->ceilingpic != skyflatnum)); - - if (doorclosed) - goto clipsolid; + goto clipsolid; } - // Window. - if (backsector->ceilingheight != frontsector->ceilingheight - || backsector->floorheight != frontsector->floorheight) + // here we're talking about floors higher than ceilings, don't even bother either. + if (backf1 >= frontc1 && backf2 >= frontc2) { - goto clippass; + goto clipsolid; } + + // Check for automap fix. Store in doorclosed for r_segs.c + doorclosed = (backc1 <= backf1 && backc2 <= backf2 + && ((backc1 >= frontc1 && backc2 >= frontc2) || curline->sidedef->toptexture) + && ((backf1 <= frontf1 && backf2 >= frontf2) || curline->sidedef->bottomtexture) + && (backsector->ceilingpic != skyflatnum || frontsector->ceilingpic != skyflatnum)); + + if (doorclosed) + goto clipsolid; + } + + // Window. + if (backc1 != frontc1 || backc2 != frontc2 + || backf1 != frontf1 || backf2 != frontf2) + { + goto clippass; } // Reject empty lines used for triggers and special events. -- 2.54.0 From 5106c391bbc69dd15994e314f722ac9439a81178 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 16:29:33 +0100 Subject: [PATCH 137/325] readd check for banan this time without mobjwasremoved just check if banan exists --- src/k_kart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 6abe561e6..8c3b89554 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4327,6 +4327,10 @@ void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source) mobj_t *cachenext; killnext: + + if (!banana) + return; + cachenext = banana->hnext; if (banana->health) -- 2.54.0 From db8b1ca0a31fbb03eabb3e3b25287f550694568b Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 7 Jan 2025 16:30:32 +0100 Subject: [PATCH 138/325] replace common damage magic numbers with named macros that stuff always confused me before lol --- src/d_netcmd.c | 4 ++-- src/g_game.c | 4 ++-- src/p_enemy.c | 10 ++++++---- src/p_inter.c | 13 ++++++------- src/p_local.h | 4 ++++ src/p_map.c | 8 ++++---- src/p_mobj.c | 31 +++++++++++++++++-------------- src/p_spec.c | 4 ++-- src/p_tick.c | 2 +- src/p_user.c | 8 ++------ 10 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 0fd28fc25..41b9c97e9 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3180,7 +3180,7 @@ static void Got_Respawn(UINT8 **cp, INT32 playernum) return; if (players[respawnplayer].mo) - P_DamageMobj(players[respawnplayer].mo, NULL, NULL, 10000); + P_DamageMobj(players[respawnplayer].mo, NULL, NULL, DMG_INSTAKILL); demo_extradata[playernum] |= DXD_RESPAWN; } @@ -3882,7 +3882,7 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) if (!players[playernum].spectator) { if (players[playernum].mo) - P_DamageMobj(players[playernum].mo, NULL, NULL, 10000); + P_DamageMobj(players[playernum].mo, NULL, NULL, DMG_INSTAKILL); else players[playernum].playerstate = PST_REBORN; } diff --git a/src/g_game.c b/src/g_game.c index 1bf435dca..d30e07c00 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4510,7 +4510,7 @@ void G_ReadDemoExtraData(void) if (extradata & DXD_RESPAWN) { if (players[p].mo) - P_DamageMobj(players[p].mo, NULL, NULL, 10000); // Is this how this should work..? + P_DamageMobj(players[p].mo, NULL, NULL, DMG_INSTAKILL); // Is this how this should work..? } if (extradata & DXD_SKIN) { @@ -4576,7 +4576,7 @@ void G_ReadDemoExtraData(void) { players[p].spectator = true; if (players[p].mo) - P_DamageMobj(players[p].mo, NULL, NULL, 10000); + P_DamageMobj(players[p].mo, NULL, NULL, DMG_INSTAKILL); else players[p].playerstate = PST_REBORN; } diff --git a/src/p_enemy.c b/src/p_enemy.c index dfb237d74..1ee8b9a2c 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3920,10 +3920,12 @@ void A_MineExplode(mobj_t *actor) for (d = 0; d < 16; d++) K_SpawnKartExplosion(actor->x, actor->y, actor->z, explodedist + 32*mapobjectscale, 32, type, d*(ANGLE_45/4), true, false, actor->target); // 32 <-> 64 + skincolors_t color = SKINCOLOR_KETCHUP; + if (actor->target && actor->target->player) - K_SpawnMineExplosion(actor, actor->target->player->skincolor); - else - K_SpawnMineExplosion(actor, SKINCOLOR_KETCHUP); + color = actor->target->player->skincolor; + + K_SpawnMineExplosion(actor, color); P_SpawnMobj(actor->x, actor->y, actor->z, MT_MINEEXPLOSIONSOUND); @@ -10137,7 +10139,7 @@ void A_RemoteDamage(mobj_t *actor) if (locvar2 == 1) // Kill mobj! { if (target->player) // players die using P_DamageMobj instead for some reason - P_DamageMobj(target, source, source, 10000); + P_DamageMobj(target, source, source, DMG_INSTAKILL); else P_KillMobj(target, source, source); } diff --git a/src/p_inter.c b/src/p_inter.c index d4a5b3c1d..ce7494ef8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2364,10 +2364,9 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN * player is hit by a ring, the player who shot it. In some * cases, the target will go after this object after * receiving damage. This can be NULL. - * \param damage Amount of damage to be dealt. 10000 is instant death. + * \param damage Amount of damage to be dealt. DMG_INSTAKILL is instant death. * \return True if the target sustained damage, otherwise false. * \todo Clean up this mess, split into multiple functions. - * \todo Get rid of the magic number 10000. * \sa P_KillMobj */ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage) @@ -2384,8 +2383,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // Spectator handling if (netgame) { - if (damage == 42000 && target->player && target->player->spectator) - damage = 10000; + if (damage == DMG_SPECTATOR && target->player && target->player->spectator) + damage = DMG_INSTAKILL; else if (target->player && target->player->spectator) return false; @@ -2524,7 +2523,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { if ((G_BattleGametype()) && cv_suddendeath.value && !player->powers[pw_flashing] && !player->powers[pw_invulnerability]) - damage = 10000; + damage = DMG_INSTAKILL; } // Player hits another player @@ -2538,7 +2537,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; // Instant-Death - if (damage == 10000) + if (damage == DMG_INSTAKILL) P_KillPlayer(player, source, damage); else if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->powers[pw_flashing]) { @@ -2591,7 +2590,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da else { player->health -= damage; // mirror mobj health here - if (damage < 10000) + if (damage < DMG_INSTAKILL) { target->player->powers[pw_flashing] = K_GetKartFlashing(target->player); if (damage > 0) // don't spill emeralds/ammo/panels for shield damage diff --git a/src/p_local.h b/src/p_local.h index 0c699c35d..95f15243c 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -432,6 +432,10 @@ typedef struct BasicFF_s INT32 Magnitude; ///< Magnitude of the effect, in the range from 0 through 10,000. } BasicFF_t; +// replace damage magic numbers with smth readable +#define DMG_INSTAKILL 10000 +#define DMG_SPECTATOR 42000 + void P_ForceFeed(const player_t *player, INT32 attack, INT32 fade, tic_t duration, INT32 period); void P_ForceConstant(const BasicFF_t *FFInfo); void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End); diff --git a/src/p_map.c b/src/p_map.c index df03bcb76..1f21d8ccb 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -724,7 +724,7 @@ static boolean PIT_CheckThing(mobj_t *thing) HU_SetCEchoDuration(5); HU_DoCEcho(va("%s\\was hit by a kitchen sink.\\\\\\\\", player_names[thing->player-players])); I_OutputMsg("%s was hit by a kitchen sink.\n", player_names[thing->player-players]); - P_DamageMobj(thing, tmthing, tmthing->target, 10000); + P_DamageMobj(thing, tmthing, tmthing->target, DMG_INSTAKILL); P_KillMobj(tmthing, thing, thing); } @@ -991,7 +991,7 @@ static boolean PIT_CheckThing(mobj_t *thing) HU_SetCEchoDuration(5); HU_DoCEcho(va("%s\\was hit by a kitchen sink.\\\\\\\\", player_names[tmthing->player-players])); I_OutputMsg("%s was hit by a kitchen sink.\n", player_names[tmthing->player-players]); - P_DamageMobj(tmthing, thing, thing->target, 10000); + P_DamageMobj(tmthing, thing, thing->target, DMG_INSTAKILL); P_KillMobj(thing, tmthing, tmthing); } @@ -3676,7 +3676,7 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush) { // Crush the object if (netgame && thing->player && thing->player->spectator) - P_DamageMobj(thing, NULL, NULL, 42000); // Respawn crushed spectators + P_DamageMobj(thing, NULL, NULL, DMG_SPECTATOR); // Respawn crushed spectators else { if (!killer) @@ -3686,7 +3686,7 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush) killer->threshold = 44; // Special flag for crushing } if (!thing->player) - P_DamageMobj(thing, killer, killer, 10000); + P_DamageMobj(thing, killer, killer, DMG_INSTAKILL); else K_SquishPlayer(thing->player, killer, killer); // SRB2kart - Squish instead of kill } diff --git a/src/p_mobj.c b/src/p_mobj.c index a032cf685..e2099c861 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -435,7 +435,7 @@ void P_ExplodeMissile(mobj_t *mo) } // Hack: Release an animal. - P_DamageMobj(mo, NULL, NULL, 10000); + P_DamageMobj(mo, NULL, NULL, DMG_INSTAKILL); } mo->flags &= ~MF_MISSILE; @@ -1357,12 +1357,16 @@ void P_XYMovement(mobj_t *mo) oldy = mo->y; // adjust various things based on slope - if (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8) { - if (!P_IsObjectOnGround(mo)) { // We fell off at some point? Do the twisty thing! + if (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8) + { + if (!P_IsObjectOnGround(mo)) // We fell off at some point? Do the twisty thing! + { P_SlopeLaunch(mo); xmove = mo->momx; ymove = mo->momy; - } else { // Still on the ground. + } + else // Still on the ground. + { slopemom.x = xmove; slopemom.y = ymove; slopemom.z = 0; @@ -1375,7 +1379,8 @@ void P_XYMovement(mobj_t *mo) oldslope = mo->standingslope; } - } else if (P_IsObjectOnGround(mo) && !mo->momz) + } + else if (P_IsObjectOnGround(mo) && !mo->momz) predictedz = mo->z; // Pushables can break some blocks @@ -3002,11 +3007,6 @@ void P_MobjCheckWater(mobj_t *mobj) else if (mobj->eflags & MFE_VERTICALFLIP && mobj->momz > FixedMul(-min, mobj->scale)) mobj->momz = FixedMul(-min, mobj->scale); - /*if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->momz > FixedMul(max, mobj->scale)) - mobj->momz = FixedMul(max, mobj->scale); - else if (mobj->eflags & MFE_VERTICALFLIP && mobj->momz < FixedMul(-max, mobj->scale)) - mobj->momz = FixedMul(-max, mobj->scale);*/ - p->kartstuff[k_waterskip]++; } @@ -4850,7 +4850,13 @@ static void P_Boss7Thinker(mobj_t *mobj) continue; mo2 = (mobj_t *)th; - if (mo2->type == MT_BOSS3WAYPOINT && mo2->spawnpoint && (mo2->spawnpoint->options & 7) == waypointNum) + + if (mo2->type != MT_BOSS3WAYPOINT) + continue; + if (!mo2->spawnpoint) + continue; + + if ((mo2->spawnpoint->options & 7) == waypointNum) { hitspot = mo2; break; @@ -5693,9 +5699,6 @@ void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on y if (!dest || dest->health <= 0 || !dest->player || !source->tracer) return; - // change angle - //source->angle = R_PointToAngle2(source->x, source->y, tx, ty); - // change slope dist = P_AproxDistance(P_AproxDistance(tx - source->x, ty - source->y), tz - source->z); diff --git a/src/p_spec.c b/src/p_spec.c index c233626a0..1051c6103 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3310,10 +3310,10 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers case 6: // Death Pit (Camera Tilt) case 7: // Death Pit (No Camera Tilt) if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - P_DamageMobj(player->mo, NULL, NULL, 10000); + P_DamageMobj(player->mo, NULL, NULL, DMG_INSTAKILL); break; case 8: // Instant Kill - P_DamageMobj(player->mo, NULL, NULL, 10000); + P_DamageMobj(player->mo, NULL, NULL, DMG_INSTAKILL); break; case 9: // Ring Drainer (Floor Touch) case 10: // Ring Drainer (No Floor Touch) diff --git a/src/p_tick.c b/src/p_tick.c index 3be79bf68..b014c3c5d 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -697,7 +697,7 @@ void P_Ticker(boolean run) if (!players[i].mo) continue; - P_DamageMobj(players[i].mo, NULL, NULL, 10000); + P_DamageMobj(players[i].mo, NULL, NULL, DMG_INSTAKILL); } } diff --git a/src/p_user.c b/src/p_user.c index 17f778ad3..01c0b3a88 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -362,7 +362,6 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor) if (inflictor) { ang = R_PointToAngle2(inflictor->x, inflictor->y, player->mo->x, player->mo->y); // SRB2kart - //ang = R_PointToAngle2(inflictor->x-inflictor->momx, inflictor->y - inflictor->momy, player->mo->x - player->mo->momx, player->mo->y - player->mo->momy); // explosion and rail rings send you farther back, making it more difficult // to recover @@ -2475,7 +2474,7 @@ static void P_MovePlayer(player_t *player) && !(player->mo->flags & MF_NOCLIP)) { if ((netgame || multiplayer) && player->spectator) - P_DamageMobj(player->mo, NULL, NULL, 42000); // Respawn crushed spectators + P_DamageMobj(player->mo, NULL, NULL, DMG_SPECTATOR); // Respawn crushed spectators else { K_SquishPlayer(player, NULL, NULL); // SRB2kart - we don't kill when squished, we squish when squished. @@ -2664,9 +2663,6 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius) if (mo->flags & MF_MONITOR) continue; // Monitors cannot be 'nuked'. - //if (!G_BattleGametype() && mo->type == MT_PLAYER) - // continue; // Don't hurt players in Co-Op! - if (abs(inflictor->x - mo->x) > radius || abs(inflictor->y - mo->y) > radius || abs(inflictor->z - mo->z) > radius) continue; // Workaround for possible integer overflow in the below -Red @@ -4191,7 +4187,7 @@ void P_DoTimeOver(player_t *player) if (player->mo) { S_StopSound(player->mo); - P_DamageMobj(player->mo, NULL, NULL, 10000); + P_DamageMobj(player->mo, NULL, NULL, DMG_INSTAKILL); } player->lives = 0; -- 2.54.0 From a763d851222f66111d585f5e0b9d26f2154af331 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 19 Jan 2025 17:45:28 +0100 Subject: [PATCH 139/325] make function for driftsparkcolour reduce some code dupe --- src/k_kart.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8c3b89554..6cdbcfb89 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3193,6 +3193,29 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I return NULL; } +static UINT16 K_DriftSparkColor(player_t *player, INT32 charge) +{ + UINT16 color = SKINCOLOR_NONE; + + if (charge >= K_GetKartDriftSparkValue(player)*4) + { + color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + } + else if (charge >= K_GetKartDriftSparkValue(player)*2) + { + if (charge <= (K_GetKartDriftSparkValue(player)*2)+(24*3)) + color = SKINCOLOR_RASPBERRY; // transition + else + color = SKINCOLOR_KETCHUP; + } + else + { + color = SKINCOLOR_SAPPHIRE; + } + + return color; +} + #define DRIFTSPARKGROWTICS 8 static void K_SpawnDriftSparks(player_t *player) @@ -3254,21 +3277,7 @@ static void K_SpawnDriftSparks(player_t *player) spark->sloperoll = player->mo->sloperoll; } - if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*4) - { - spark->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); - } - else if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*2) - { - if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*2)+(24*3)) - spark->color = SKINCOLOR_RASPBERRY; // transition - else - spark->color = SKINCOLOR_KETCHUP; - } - else - { - spark->color = SKINCOLOR_SAPPHIRE; - } + spark->color = K_DriftSparkColor(player, player->kartstuff[k_driftcharge]); if ((player->kartstuff[k_drift] > 0 && player->cmd.driftturn > 0) // Inward drifts || (player->kartstuff[k_drift] < 0 && player->cmd.driftturn < 0)) -- 2.54.0 From fa98b06dbaaf0a56276b5c73b7b8e3cdddc20472 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 17 Jan 2025 19:53:30 +0100 Subject: [PATCH 140/325] :chaosleep: --- 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 6cdbcfb89..6f7555786 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -103,7 +103,7 @@ consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NUL consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // itembox gets a dark box with specific items consvar_t cv_multiitemicon = {"multiitemicon", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t huditemamount_cons_t[] = {{0, "Vanilla"}, {1, "Multiple"}, {1, "Always"},{0, NULL}}; +static CV_PossibleValue_t huditemamount_cons_t[] = {{0, "Vanilla"}, {1, "Multiple"}, {2, "Always"},{0, NULL}}; consvar_t cv_huditemamount = {"showitemamountnumber", "Vanilla", CV_SAVE, huditemamount_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF]; -- 2.54.0 From 56563507b659241e937111a1c38fe44870ec32c8 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 12 Jan 2025 17:23:21 +0100 Subject: [PATCH 141/325] null check target in P_DamageMobj apparently this may be null --- src/p_inter.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/p_inter.c b/src/p_inter.c index ce7494ef8..0cbe6577f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2377,6 +2377,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (objectplacing) return false; + // well no clue but this may happen ig + if (!target) + return false; + if (target->health <= 0) return false; @@ -2396,6 +2400,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (!metalrecording) { UINT8 shouldForce = LUA_HookShouldDamage(target, inflictor, source, damage); + if (P_MobjWasRemoved(target)) return (shouldForce == 1); // mobj was removed if (shouldForce == 1) -- 2.54.0 From 9bd2da04e2c224fca3d03699fef19dd32b612bd8 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 15:28:51 +0100 Subject: [PATCH 142/325] put this thing onto its original place --- src/d_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 85c86d1ee..b97f46028 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -774,13 +774,13 @@ void D_SRB2Loop(void) debugload--; #endif - refreshdirmenu = 0; // not sure where to put this, here as good as any? - interp = (R_UsingFrameInterpolation() && !dedicated); doDisplay = false; renderisnewtic = (realtics > 0 || singletics); + refreshdirmenu = 0; // not sure where to put this, here as good as any? + if (renderisnewtic) { // don't skip more than 10 frames at a time -- 2.54.0 From cccf6449f9a1ee0a06a727b80712e259bdc43d9c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 18:04:05 +0100 Subject: [PATCH 143/325] fix freecam vertical look for the 500th thousand time truly amazing code --- src/p_local.h | 2 -- src/p_user.c | 40 ++++++++-------------------------------- 2 files changed, 8 insertions(+), 34 deletions(-) diff --git a/src/p_local.h b/src/p_local.h index 8ce9568f2..4f670bc74 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -84,8 +84,6 @@ typedef struct camera_s boolean chase; boolean freecam; - boolean keyboardlook; - angle_t localangle; INT32 localaiming; diff --git a/src/p_user.c b/src/p_user.c index 3068e7b67..13c98f81e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3136,7 +3136,7 @@ fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42, -42, -42, -42}; #define MAXCAMERADIST 140*FRACUNIT // Max distance the camera can be in front of the player (2D mode) static fixed_t forwardmove[2] = {25<>16, 50<>16}; -//static fixed_t sidemove[2] = {2<>16, 4<>16}; +static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn static fixed_t strafemove[2] = {25<>16, 50<>16}; // faster! @@ -3181,13 +3181,13 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) INT32 laim, forward, side, axis; // these ones used for multiple conditions - boolean turnleft, turnright, mouseaiming; + boolean turnleft, turnright; boolean strafeleft, straferight; - boolean invertmouse, usejoystick, kbl; + boolean usejoystick; angle_t lang; - INT32 player_invert; const UINT8 forplayer = num+1; - player_t *player = ((forplayer == 1) ? &players[consoleplayer] : &players[displayplayers[forplayer]]); + + SINT8 player_invert = cv_invertmouse.value ? -1 : 1; // who tf uses two mice? memset(&cameracmd[num], 0, sizeof(ticcmd_t)); // initialize cmd @@ -3195,37 +3195,27 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) lang = cam->localangle; laim = cam->localaiming; - kbl = cam->keyboardlook; switch (forplayer) { case 2: G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); - mouseaiming = player->spectator; - invertmouse = cv_invertmouse2.value; break; case 3: G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); - mouseaiming = false; - invertmouse = false; break; case 4: G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); - mouseaiming = false; - invertmouse = false; break; case 1: default: G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver - mouseaiming = player->spectator; - invertmouse = cv_invertmouse.value; break; } cmd->angleturn = (INT16)(lang >> 16); cmd->aiming = G_ClipAimingPitch(&laim); - const boolean lookaxis = cv_lookaxis[num].value; const boolean analogjoystickmove = cv_usejoystick[num].value && !Joystick[num].bGamepadStyle; const boolean gamepadjoystickmove = cv_usejoystick[num].value && Joystick[num].bGamepadStyle; @@ -3255,12 +3245,12 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) if (turnright && !(turnleft)) { cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[1])); - //side += sidemove[1]; + side += sidemove[1]; } else if (turnleft && !(turnright)) { cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[1])); - //side -= sidemove[1]; + side -= sidemove[1]; } straferight = InputDown(gc_straferight, forplayer); @@ -3318,30 +3308,17 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) if (InputDown(gc_brake, forplayer) || (usejoystick && axis > 0)) cmd->buttons |= BT_BRAKE; - // spectator aiming shit, ahhhh... - player_invert = invertmouse ? -1 : 1; - - // mouse look stuff (mouse look is not the same as mouse aim) - kbl = false; - - // looking up/down - laim += (mlooky<<19)*player_invert; - axis = JoyAxis(AXISLOOK, forplayer); - // spring back if not using keyboard neither mouselookin' - if (!kbl && !lookaxis && !mouseaiming) - laim = 0; + laim += (mlooky<<19)*player_invert; if (InputDown(gc_lookup, forplayer) || (usejoystick && axis < 0)) { laim += KB_LOOKSPEED; - kbl = true; } else if (InputDown(gc_lookdown, forplayer) || (usejoystick && axis > 0)) { laim -= KB_LOOKSPEED; - kbl = true; } if (InputDown(gc_centerview, forplayer)) // No need to put a spectator limit on this one though :V @@ -3397,7 +3374,6 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) { cam->localaiming = laim; } - cam->keyboardlook = kbl; return cmd; } -- 2.54.0 From 8cdb920f5471e11aab9187ee021e8ae7a6b07fcb Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 19:00:10 +0100 Subject: [PATCH 144/325] dont turn 90 degrees when switching to freecam --- src/g_game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 642449bbc..4692f84c2 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -964,6 +964,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // dumbass thing so we can use a few buttons but dont accidentally drive away if (player->spectator || freecam) { + cmd->angleturn = (INT16)(lang >> 16); G_BuildLocalTiccmd(cmd, ssplayer, freecam); // let lua override everything @@ -1030,7 +1031,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) side += ((axis * sidemove[0]) >> 10); } - if (player->spectator || cv_mouseturn.value) + if (cv_mouseturn.value) { //THIS WORKS WTF???????? cmd->angleturn = (INT16)(cmd->angleturn - ((mousex*(encoremode ? -1 : 1)*8))); -- 2.54.0 From 24ca9fdafa3c60eb9cc1b0d719cd12317073e877 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 19:17:41 +0100 Subject: [PATCH 145/325] oops didnt init this --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 13c98f81e..722cf78a0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3239,7 +3239,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) turnright = turnright || (axis > 0); turnleft = turnleft || (axis < 0); } - forward = 0; + forward = side = 0; // let movement keys cancel each other out if (turnright && !(turnleft)) -- 2.54.0 From ebfafd7b6e8d0fc234033a659db551d867385ea6 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 19:21:33 +0100 Subject: [PATCH 146/325] a --- src/p_user.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 722cf78a0..bdab2b92d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3271,7 +3271,6 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) straferight = straferight || (axis > 0); strafeleft = strafeleft || (axis < 0); } - side = 0; // let strafe keys cancel each other out if (straferight && !(strafeleft)) -- 2.54.0 From 5dc76d07ec7df933098b1a624c4eb53ac5ee7ef9 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 19:33:47 +0100 Subject: [PATCH 147/325] Hold up/down for 2 seconds while not moving to pan the camera vertically from RR --- src/doomtype.h | 3 +++ src/p_local.h | 3 +++ src/p_tick.c | 15 ++++++++++++++- src/p_user.c | 11 +++++------ src/r_main.c | 4 ---- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/doomtype.h b/src/doomtype.h index 116d5cdfb..174bba5b1 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -380,6 +380,9 @@ unset_bit_array (bitarray_t * const array, const int value) array[value >> 3] &= ~(1<<(value & 7)); } +#define intsign(n) \ + ((n) < 0 ? -1 : (n) > 0 ? 1 : 0) + typedef UINT64 precise_t; #endif //__DOOMTYPE__ diff --git a/src/p_local.h b/src/p_local.h index 4f670bc74..fb2f31485 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -95,6 +95,9 @@ typedef struct camera_s // Freecam: aiming needs to be reset after switching from chasecam boolean reset_aiming; + // Hold up/down to pan the camera vertically + SINT8 dpad_y_held; + // Things used by FS cameras. fixed_t viewheight; angle_t startangle; diff --git a/src/p_tick.c b/src/p_tick.c index 898be3efa..25934a0f1 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -469,7 +469,20 @@ void P_RunChaseCameras(void) for (i = 0; i <= splitscreen; i++) { if (camera[i].chase) - P_MoveChaseCamera(&players[displayplayers[i]], &camera[i], false); + { + player_t *p = &players[displayplayers[i]]; + camera_t *cam = &camera[i]; + + if (p->mo && p->kartstuff[k_throwdir] != 0) + { + if (p->speed < 6 * p->mo->scale && abs(cam->dpad_y_held) < 2*TICRATE) + cam->dpad_y_held += intsign(p->kartstuff[k_throwdir]); + } + else + cam->dpad_y_held = 0; + + P_MoveChaseCamera(p, cam, false); + } } } diff --git a/src/p_user.c b/src/p_user.c index bdab2b92d..f31190343 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3172,10 +3172,6 @@ void P_ToggleDemoCamera(UINT8 viewnum) } static ticcmd_t cameracmd[MAXSPLITSCREENPLAYERS]; - -#define intsign(n) \ - ((n) < 0 ? -1 : (n) > 0 ? 1 : 0) - static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num) { INT32 laim, forward, side, axis; @@ -3497,8 +3493,6 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->subsector = R_PointInSubsector(cam->x, cam->y); } -#undef intsign - void P_ResetCamera(player_t *player, camera_t *thiscam) { tic_t tries = 0; @@ -3886,6 +3880,11 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall focusaiming = player->aiming; } + if (abs(thiscam->dpad_y_held) >= 2*TICRATE) + { + focusaiming += ANGLE_45 * intsign(thiscam->dpad_y_held) * P_MobjFlip(mo); + } + if (P_CameraThinker(player, thiscam, resetcalled)) return true; diff --git a/src/r_main.c b/src/r_main.c index 1b575dd11..20461b4a6 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -839,10 +839,6 @@ void R_ApplyViewMorph(void) vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.width); } -static inline int intsign(int n) { - return n < 0 ? -1 : n > 0 ? 1 : 0; -} - angle_t R_ViewRollAngle(const player_t *player) { angle_t roll = 0; -- 2.54.0 From 2b09e74dcf76ab49e80f1d7149f944206913158d Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 18:53:26 +0100 Subject: [PATCH 148/325] kill aiming stuff in BuildTiccmd --- src/g_game.c | 67 ++++------------------------------------------------ 1 file changed, 4 insertions(+), 63 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 4692f84c2..3c511ee6d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -899,12 +899,11 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) INT32 laim, th, tspeed, forward, side, axis; // these ones used for multiple conditions - boolean turnleft, turnright, mouseaiming; - boolean invertmouse, usejoystick, kbl, rd; + boolean turnleft, turnright; + boolean usejoystick, rd; angle_t lang; static INT32 turnheld[MAXSPLITSCREENPLAYERS]; // for accelerative turning - static boolean keyboard_look[MAXSPLITSCREENPLAYERS]; // true if lookup/down using keyboard static boolean resetdown[MAXSPLITSCREENPLAYERS]; // don't cam reset every frame if (demo.playback) @@ -916,38 +915,28 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) camera_t *thiscam = &camera[forplayer]; const boolean freecam = camera[forplayer].freecam; - const boolean lookaxis = cv_lookaxis[forplayer].value; const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle; const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle; lang = localangle[forplayer]; laim = localaiming[forplayer]; th = turnheld[forplayer]; - kbl = keyboard_look[forplayer]; rd = resetdown[forplayer]; switch (ssplayer) { case 2: G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); - mouseaiming = player->spectator; - invertmouse = cv_invertmouse2.value; break; case 3: G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); - mouseaiming = false; - invertmouse = false; break; case 4: G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); - mouseaiming = false; - invertmouse = false; break; case 1: default: G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver - mouseaiming = player->spectator; - invertmouse = cv_invertmouse.value; break; } @@ -957,7 +946,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN) || hu_resynching) { cmd->angleturn = (INT16)(lang >> 16); - cmd->aiming = G_ClipAimingPitch(&laim); + cmd->aiming = 0; return; } @@ -1120,54 +1109,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else rd = false; - // spectator aiming shit, ahhhh... - { - INT32 player_invert = invertmouse ? -1 : 1; - INT32 screen_invert = - (player->mo && (player->mo->eflags & MFE_VERTICALFLIP) - && (!thiscam->chase || player->pflags & PF_FLIPCAM)) // because chasecam's not inverted - ? -1 : 1; // set to -1 or 1 to multiply - - // mouse look stuff (mouse look is not the same as mouse aim) - if (mouseaiming && player->spectator) - { - kbl = false; - - // looking up/down - laim += (mlooky<<19)*player_invert*screen_invert; - } - - axis = JoyAxis(AXISLOOK, ssplayer); - if (analogjoystickmove && axis != 0 && lookaxis && player->spectator) - laim += (axis<<16) * screen_invert; - - // spring back if not using keyboard neither mouselookin' - if (!kbl && !lookaxis && !mouseaiming) - laim = 0; - - if (player->spectator) - { - if (InputDown(gc_lookup, ssplayer) || (gamepadjoystickmove && axis < 0)) - { - laim += KB_LOOKSPEED * screen_invert; - kbl = true; - } - else if (InputDown(gc_lookdown, ssplayer) || (gamepadjoystickmove && axis > 0)) - { - laim -= KB_LOOKSPEED * screen_invert; - kbl = true; - } - } - - if (InputDown(gc_centerview, ssplayer)) // No need to put a spectator limit on this one though :V - laim = 0; - - // accept no mlook for network games - if (!cv_allowmlook.value) - laim = 0; - - cmd->aiming = G_ClipAimingPitch(&laim); - } + cmd->aiming = 0; mousex = mousey = mlooky = 0; @@ -1219,7 +1161,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { localangle[forplayer] = lang; localaiming[forplayer] = laim; - keyboard_look[forplayer] = kbl; turnheld[forplayer] = th; resetdown[forplayer] = rd; axis = JoyAxis(AXISLOOKBACK, ssplayer); -- 2.54.0 From 3bbdd1ea720f99d0bb64d40ed803d79bbbcc0a3c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 22:26:07 +0100 Subject: [PATCH 149/325] e better play it safe --- src/g_game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 3c511ee6d..b527009db 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -946,7 +946,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN) || hu_resynching) { cmd->angleturn = (INT16)(lang >> 16); - cmd->aiming = 0; + cmd->aiming = G_ClipAimingPitch(&laim); return; } @@ -1109,7 +1109,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else rd = false; - cmd->aiming = 0; + cmd->aiming = G_ClipAimingPitch(&laim); mousex = mousey = mlooky = 0; -- 2.54.0 From 9634bc99bdbb5a2274af991b022c764a38b24532 Mon Sep 17 00:00:00 2001 From: Indev Date: Tue, 21 Jan 2025 17:38:09 +0300 Subject: [PATCH 150/325] Check for spectator in K_StatRound --- src/k_stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_stats.c b/src/k_stats.c index 0af547780..538b4e3e3 100644 --- a/src/k_stats.c +++ b/src/k_stats.c @@ -74,7 +74,7 @@ void K_StatRound(void) ++numplayers; } - if (numplayers > 1) + if (numplayers > 1 && !players[consoleplayer].spectator) { if (players[consoleplayer].kartstuff[k_position] == 1) kartstats.totalwins++; -- 2.54.0 From f8472721ee672fc23243777550890864981f192f Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 21 Jan 2025 16:54:28 +0100 Subject: [PATCH 151/325] fix level statistics page controls --- src/m_menu.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 341dcdcd6..0c1882fef 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -8866,7 +8866,7 @@ static void M_HandleLevelStats(INT32 choice) switch (choice) { case KEY_DOWNARROW: - if (statsCurrentPage != 0) // Must be on level stats page + if (statsCurrentPage != 1) // Must be on level stats page break; S_StartSound(NULL, sfx_menu1); if (statsLocation < statsMax) @@ -8874,7 +8874,7 @@ static void M_HandleLevelStats(INT32 choice) break; case KEY_UPARROW: - if (statsCurrentPage != 0) // Must be on level stats page + if (statsCurrentPage != 1) // Must be on level stats page break; S_StartSound(NULL, sfx_menu1); if (statsLocation) @@ -8897,14 +8897,14 @@ static void M_HandleLevelStats(INT32 choice) break; case KEY_PGDN: - if (statsCurrentPage != 0) // Must be on level stats page + if (statsCurrentPage != 1) // Must be on level stats page break; S_StartSound(NULL, sfx_menu1); statsLocation += (statsLocation+13 >= statsMax) ? statsMax-statsLocation : 13; break; case KEY_PGUP: - if (statsCurrentPage != 0) // Must be on level stats page + if (statsCurrentPage != 1) // Must be on level stats page break; S_StartSound(NULL, sfx_menu1); statsLocation -= (statsLocation < 13) ? statsLocation : 13; -- 2.54.0 From 7213f0dd5dba77b707ab906c73c6d1d5881a0292 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 22 Jan 2025 15:23:30 +0100 Subject: [PATCH 152/325] split HWR_DrawSprites MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit saves on ALOT of conditional branching in a lööp when models are disabled --- src/hardware/hw_main.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 9d330582b..54399fbb5 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4286,6 +4286,24 @@ static void HWR_DrawSprites(void) { UINT32 i; + for (i = 0; i < gl_visspritecount; i++) + { + gl_vissprite_t *spr = gl_vsprorder[i]; + + if (spr->precip) + { + HWR_DrawPrecipitationSprite(spr); + continue; + } + + HWR_DrawSprite(spr); + } +} + +static void HWR_DrawModels(void) +{ + UINT32 i; + for (i = 0; i < gl_visspritecount; i++) { gl_vissprite_t *spr = gl_vsprorder[i]; @@ -4311,14 +4329,14 @@ static void HWR_DrawSprites(void) md2 = &md2_playermodels[(skin_t *)spr->mobj->skin - skins]; // 8/1/19: Only don't display player models if no default SPR_PLAY is found. - if (!cv_glmdls.value || ((md2->notfound || md2->scale < 0.0f) && ((!cv_glfallbackplayermodel.value) || md2_models[SPR_PLAY].notfound || md2_models[SPR_PLAY].scale < 0.0f)) || spr->mobj->state == &states[S_PLAY_SIGN]) + if (((md2->notfound || md2->scale < 0.0f) && ((!cv_glfallbackplayermodel.value) || md2_models[SPR_PLAY].notfound || md2_models[SPR_PLAY].scale < 0.0f)) || spr->mobj->state == &states[S_PLAY_SIGN]) HWR_DrawSprite(spr); else HWR_DrawMD2(spr); } else { - if (!cv_glmdls.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f) + if (md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f) HWR_DrawSprite(spr); else HWR_DrawMD2(spr); @@ -5335,7 +5353,10 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl HWR_SortVisSprites(); PS_STOP_TIMING(ps_hw_spritesorttime); PS_START_TIMING(ps_hw_spritedrawtime); - HWR_DrawSprites(); + if (!cv_glmdls.value) + HWR_DrawSprites(); + else + HWR_DrawModels(); PS_STOP_TIMING(ps_hw_spritedrawtime); ps_numdrawnodes.value.i = 0; -- 2.54.0 From a3e2d3ec71d0fb69f1d3961c10d7c971d2c42c80 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 22 Jan 2025 15:46:38 +0100 Subject: [PATCH 153/325] also fix potential use-after-free in HWR_AddPrecipitationSprites no clue why ogl didnt do it since its effectively the same code as software --- src/hardware/hw_main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 54399fbb5..9c5289baa 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4396,7 +4396,7 @@ static void HWR_AddSprites(sector_t *sec) static void HWR_AddPrecipitationSprites(void) { INT32 xl, xh, yl, yh, bx, by; - precipmobj_t *th; + precipmobj_t *th, *next; fixed_t drawdist; @@ -4428,6 +4428,9 @@ static void HWR_AddPrecipitationSprites(void) { for (th = precipblocklinks[(by * bmapwidth) + bx]; th; th = th->bnext) { + // Store this beforehand because HWR_ProjectPrecipitationSprite may free th (see P_PrecipThinker) + next = th->bnext; + if (th->precipflags & PCF_INVISIBLE) continue; -- 2.54.0 From 883cd3f516abbf034c8dc7f31741a8277a209a71 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 22 Jan 2025 15:45:08 +0100 Subject: [PATCH 154/325] more smol ogl sprite drawer optimizations --- src/hardware/hw_main.c | 53 +++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 9c5289baa..7d442ad83 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3875,7 +3875,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) } // Sprite drawer for precipitation -static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) +static void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) { FBITFIELD blend = 0; FOutVector wallVerts[4]; @@ -3884,10 +3884,7 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) INT32 shader = SHADER_NONE; - if (!spr->mobj) - return; - - if (!spr->mobj->subsector) + if (!spr->mobj || !spr->mobj->subsector) return; // cache sprite graphics @@ -4502,30 +4499,27 @@ static void HWR_ProjectSprite(mobj_t *thing) if (interp.spritexscale < 1 || interp.spriteyscale < 1) return; + const boolean papersprite = (thing->frame & FF_PAPERSPRITE); + + // transform the origin point + tr_x = FIXED_TO_FLOAT(interp.x); + tr_y = FIXED_TO_FLOAT(interp.y); + + // rotation around vertical axis + tz = ((tr_x - gl_viewx) * gl_viewcos) + ((tr_y - gl_viewy) * gl_viewsin); + + // thing is behind view plane? + if (tz < ZCLIP_PLANE && !papersprite && (!cv_glmdls.value || md2_models[thing->sprite].notfound == true)) // Yellow: Only MD2's dont disappear + return; + const boolean mirrored = thing->mirrored; const boolean vflip = (thing->eflags & MFE_VERTICALFLIP); const boolean hflip = (!(thing->frame & FF_HORIZONTALFLIP) != !mirrored); - const boolean papersprite = (thing->frame & FF_PAPERSPRITE); this_scale = FIXED_TO_FLOAT(interp.scale); spritexscale = FIXED_TO_FLOAT(interp.spritexscale); spriteyscale = FIXED_TO_FLOAT(interp.spriteyscale); - // transform the origin point - tr_x = FIXED_TO_FLOAT(interp.x) - gl_viewx; - tr_y = FIXED_TO_FLOAT(interp.y) - gl_viewy; - - // rotation around vertical axis - tz = (tr_x * gl_viewcos) + (tr_y * gl_viewsin); - - // thing is behind view plane? - if (tz < ZCLIP_PLANE && !papersprite && (!cv_glmdls.value || md2_models[thing->sprite].notfound == true)) //Yellow: Only MD2's dont disappear - return; - - // The above can stay as it works for cutting sprites that are too close - tr_x = FIXED_TO_FLOAT(interp.x); - tr_y = FIXED_TO_FLOAT(interp.y); - // decide which patch to use for sprite relative to player #ifdef RANGECHECK if ((unsigned)thing->sprite >= numsprites) @@ -4848,40 +4842,41 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) R_InterpolatePrecipMobjState(thing, FRACUNIT, &interp); } - this_scale = FIXED_TO_FLOAT(interp.scale); - // transform the origin point - tr_x = FIXED_TO_FLOAT(interp.x) - gl_viewx; - tr_y = FIXED_TO_FLOAT(interp.y) - gl_viewy; + tr_x = FIXED_TO_FLOAT(interp.x); + tr_y = FIXED_TO_FLOAT(interp.y); // rotation around vertical axis - tz = (tr_x * gl_viewcos) + (tr_y * gl_viewsin); + tz = ((tr_x - gl_viewx) * gl_viewcos) + ((tr_y - gl_viewy) * gl_viewsin); // thing is behind view plane? if (tz < ZCLIP_PLANE) return; - tr_x = FIXED_TO_FLOAT(interp.x); - tr_y = FIXED_TO_FLOAT(interp.y); - // decide which patch to use for sprite relative to player if ((unsigned)thing->sprite >= numsprites) + { #ifdef RANGECHECK I_Error("HWR_ProjectPrecipitationSprite: invalid sprite number %i ", thing->sprite); #else return; #endif + } sprdef = &sprites[thing->sprite]; if ((size_t)(thing->frame&FF_FRAMEMASK) >= sprdef->numframes) + { #ifdef RANGECHECK I_Error("HWR_ProjectPrecipitationSprite: invalid sprite frame %i : %i for %s", thing->sprite, thing->frame, sprnames[thing->sprite]); #else return; #endif + } + + this_scale = FIXED_TO_FLOAT(interp.scale); sprframe = &sprdef->spriteframes[thing->frame & FF_FRAMEMASK]; -- 2.54.0 From 7f9edddbcce43617d3e656cc22b661e4b9999db3 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 22 Jan 2025 16:46:58 +0100 Subject: [PATCH 155/325] remove redundand FTransform field --- src/hardware/hw_defs.h | 2 +- src/hardware/hw_main.c | 3 +-- src/hardware/r_opengl/r_opengl.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 91146f228..2df49f09e 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -140,7 +140,7 @@ typedef struct #endif FLOAT scalex, scaley, scalez; FLOAT spritexscale, spriteyscale; - FLOAT fovxangle, fovyangle; + FLOAT fovangle; UINT8 splitscreen; boolean flip; // screenflip boolean roll; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 7d442ad83..6f3fc797f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5197,8 +5197,7 @@ void HWR_SetTransform(float fpov, player_t *player) gl_viewludsin = FIXED_TO_FLOAT(FINECOSINE(gl_aimingangle>>ANGLETOFINESHIFT)); gl_viewludcos = FIXED_TO_FLOAT(-FINESINE(gl_aimingangle>>ANGLETOFINESHIFT)); - atransform.fovxangle = fpov; // Tails - atransform.fovyangle = fpov; // Tails + atransform.fovangle = fpov; // Tails HWR_RollTransform(&atransform, viewroll); atransform.splitscreen = splitscreen; diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 6cd27987d..f5e34855b 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -2743,7 +2743,7 @@ void GL_SetTransform(FTransform *stransform) if (stransform) { - used_fov = stransform->fovxangle; + used_fov = stransform->fovangle; shearing = stransform->shearing; // keep a trace of the transformation for md2 memcpy(&md2_transform, stransform, sizeof (md2_transform)); -- 2.54.0 From bfabdb7b6a00815c2bde43b01177fd3929e2bd64 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 22 Jan 2025 17:24:03 +0100 Subject: [PATCH 156/325] bruh --- src/hardware/hw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 6f3fc797f..97f6d9795 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4423,7 +4423,7 @@ static void HWR_AddPrecipitationSprites(void) { for (by = yl; by <= yh; by++) { - for (th = precipblocklinks[(by * bmapwidth) + bx]; th; th = th->bnext) + for (th = precipblocklinks[(by * bmapwidth) + bx]; th; th = next) { // Store this beforehand because HWR_ProjectPrecipitationSprite may free th (see P_PrecipThinker) next = th->bnext; -- 2.54.0 From 6d94ff8d1f513133e9bf45f00b4949bff8bac948 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 22 Jan 2025 19:42:01 +0100 Subject: [PATCH 157/325] fix freecam not resetting online idk local player handling is fucking awful in kart --- src/p_mobj.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index cd3054b59..abb82c5f4 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10774,7 +10774,19 @@ void P_SpawnPlayer(INT32 playernum) { if (!p->spectator) { - camera[playernum].freecam = false; + if (playernum == consoleplayer) + camera[0].freecam = false; + else if (splitscreen) + { + for (i = 1; i <= splitscreen; i++) + { + if (playernum == displayplayers[i]) + { + camera[i].freecam = false; + break; + } + } + } } } } -- 2.54.0 From 861d35e8d3c8cb0e51da7f05ebd49dd5977728a2 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 18:10:18 +0100 Subject: [PATCH 158/325] port clientsided gentlemens delay cant do the serverside stuff due to netvars --- src/d_clisrv.c | 163 ++++++++++++++++++++++++++++++++++++++++++++----- src/d_clisrv.h | 14 +++++ src/d_netcmd.c | 1 + 3 files changed, 164 insertions(+), 14 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7b20c78fe..694fa288c 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -103,6 +103,17 @@ static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the UINT16 pingmeasurecount = 1; UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone. UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. + +#define GENTLEMANSMOOTHING (TICRATE) +static tic_t reference_lag; +static UINT8 spike_time; + +static tic_t lowest_lag; +boolean server_lagless; + +static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; +consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) SINT8 nodetoplayer3[MAXNETNODES]; // say the numplayer for this node if any (splitscreen == 2) @@ -140,7 +151,7 @@ static UINT8 gamestate_resend_counter[MAXNETNODES]; boolean hu_stopped = false; // Client specific -static ticcmd_t localcmds[MAXSPLITSCREENPLAYERS]; +static ticcmd_t localcmds[MAXSPLITSCREENPLAYERS][MAXGENTLEMENDELAY]; static boolean cl_packetmissed; // here it is for the secondary local player (splitscreen) static UINT8 mynode; // my address pointofview server @@ -456,10 +467,15 @@ static void D_Clearticcmd(tic_t tic) void D_ResetTiccmds(void) { - INT32 i; + INT32 i, j; for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) - memset(&localcmds[i], 0, sizeof(ticcmd_t)); + { + for (j = 0; j < MAXGENTLEMENDELAY; j++) + { + memset(&localcmds[i][j], 0, sizeof(ticcmd_t)); + } + } // Reset the net command list for (i = 0; i < TEXTCMD_HASH_SIZE; i++) @@ -4233,7 +4249,7 @@ void SV_ResetServer(void) memset(playeringame, false, sizeof playeringame); memset(playernode, UINT8_MAX, sizeof playernode); - pingmeasurecount = 1; + pingmeasurecount = 0; //Reset count memset(realpingtable, 0, sizeof realpingtable); memset(playerpingtable, 0, sizeof playerpingtable); @@ -6020,27 +6036,78 @@ static void CL_SendClientCmd(void) } else if (gamestate != GS_NULL) { + UINT8 lagDelay = 0; + + if (lowest_lag > 0) + { + // Gentlemens' ping. + lagDelay = min(lowest_lag, MAXGENTLEMENDELAY); + + // Is our connection worse than our current gentleman point? + // Make sure it stays that way for a bit before increasing delay levels. + if (lagDelay > reference_lag) + { + spike_time++; + if (spike_time >= GENTLEMANSMOOTHING) + { + // Okay, this is genuinely the new baseline delay. + reference_lag = lagDelay; + spike_time = 0; + } + else + { + // Just a temporary fluctuation, ignore it. + lagDelay = reference_lag; + } + } + else + { + reference_lag = lagDelay; // Adjust quickly if the connection improves. + spike_time = 0; + } + + /* + if (server) // Clients have to wait for the gamestate to make it back. Servers don't! + lagDelay *= 2; // Simulate the HELLFUCK NIGHTMARE of a complete round trip. + */ + + // [deep breath in] + // Plausible, elegant explanation that is WRONG AND SUPER HARMFUL. + // Clients with stable connections were adding their mindelay to network delay, + // even when their mindelay was as high or higher than network delay—which made + // client delay APPEAR slower than host mindelay, by the exact value that made + // "lmao just double it" make sense at the time. + // + // While this fix made client connections match server mindelay in our most common + // test environment, it also masked an issue that seriously affected online handling + // responsiveness, completely ruining our opportunity to further investigate it! + // + // See UpdatePingTable. + // I am taking this shitty code to my grave as an example of "never trust your brain". + // -Tyron 2024-05-15 + } + packetsize = sizeof (clientcmd_pak); - G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds[0], 1); - netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic%TICQUEUE]); + G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds[0][lagDelay], 1); + netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic % TICQUEUE]); if (splitscreen || botingame) // Send a special packet with 2 cmd for splitscreen { netbuffer->packettype = (mis ? PT_CLIENT2MIS : PT_CLIENT2CMD); packetsize = sizeof (client2cmd_pak); - G_MoveTiccmd(&netbuffer->u.client2pak.cmd2, &localcmds[1], 1); + G_MoveTiccmd(&netbuffer->u.client2pak.cmd2, &localcmds[1][lagDelay], 1); if (splitscreen > 1) { netbuffer->packettype = (mis ? PT_CLIENT3MIS : PT_CLIENT3CMD); packetsize = sizeof (client3cmd_pak); - G_MoveTiccmd(&netbuffer->u.client3pak.cmd3, &localcmds[2], 1); + G_MoveTiccmd(&netbuffer->u.client3pak.cmd3, &localcmds[2][lagDelay], 1); if (splitscreen > 2) { netbuffer->packettype = (mis ? PT_CLIENT4MIS : PT_CLIENT4CMD); packetsize = sizeof (client4cmd_pak); - G_MoveTiccmd(&netbuffer->u.client4pak.cmd4, &localcmds[3], 1); + G_MoveTiccmd(&netbuffer->u.client4pak.cmd4, &localcmds[3][lagDelay], 1); } } } @@ -6207,8 +6274,15 @@ static void SV_SendTics(void) // static inline void CreateNewLocalCMD(UINT8 p, INT32 realtics) { - G_BuildTiccmd(&localcmds[p], realtics, p+1); - localcmds[p].angleturn |= TICCMD_RECEIVED; + INT32 i; + + for (i = MAXGENTLEMENDELAY-1; i > 0; i--) + { + G_MoveTiccmd(&localcmds[p][i], &localcmds[p][i-1], 1); + } + + G_BuildTiccmd(&localcmds[p][0], realtics, p+1); + localcmds[p][0].angleturn |= TICCMD_RECEIVED; } static void Local_Maketic(INT32 realtics) @@ -6510,16 +6584,77 @@ static tic_t gametime = 0; static void UpdatePingTable(void) { + tic_t fastest; + tic_t lag; + INT32 i; + if (server) { - if (netgame && !(gametime % 35)) // update once per second. + if (Playing() && !(gametime % 8)) // Value chosen based on _my vibes man_ PingUpdate(); + + fastest = 0; + // update node latency values so we can take an average later. for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && playernode[i] != UINT8_MAX) - realpingtable[i] += GetLag(playernode[i]); + { + if (playeringame[i] && playernode[i] > 0 && playernode[i] != UINT8_MAX) + { + if (playernode[i] > 0 && !players[i].spectator) + { + lag = GetLag(playernode[i]); + realpingtable[i] += (lag); + + if (! fastest || lag < fastest) + fastest = lag; + } + else + realpingtable[i] += (GetLag(playernode[i])); + } + } + + // Don't gentleman below your mindelay + if (fastest < (tic_t)cv_mindelay.value) + fastest = (tic_t)cv_mindelay.value; + pingmeasurecount++; + + lowest_lag = fastest; + + if (fastest) + lag = fastest; + else + lag = GetLag(0); + + lag = (realpingtable[0] + lag); + + switch (playerpernode[0]) + { + case 4: + realpingtable[nodetoplayer4[0]] = lag; + /*FALLTHRU*/ + case 3: + realpingtable[nodetoplayer3[0]] = lag; + /*FALLTHRU*/ + case 2: + realpingtable[nodetoplayer2[0]] = lag; + /*FALLTHRU*/ + case 1: + realpingtable[nodetoplayer[0]] = lag; + } + } + else // We're a client, handle mindelay on the way out. + { + // Previously (neededtic - gametic) - WRONG VALUE! + // Pretty sure that's measuring jitter, not RTT. + // Stable connections would be punished by adding their mindelay to network delay! + tic_t mydelay = playerpingtable[consoleplayer]; + + if (mydelay < (tic_t)cv_mindelay.value) + lowest_lag = cv_mindelay.value - mydelay; + else + lowest_lag = 0; } } diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 4e81621d9..1e86ec567 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -41,6 +41,15 @@ applications may follow different packet versions. #define BACKUPTICS 32 #define TICQUEUE 512 // more than enough for most timeouts.... #define MAXTEXTCMD 256 + +// No. of tics your controls can be delayed by. + +// TODO: Instead of storing a ton of extra cmds for gentlemens' delay, +// keep them in a linked-list, with timestamps to discard everything that's older than already sent. +// That will support any amount of lag, and be less wasteful for clients who don't use it. +// This just works as a quick implementation. +#define MAXGENTLEMENDELAY TICRATE + // // Packet structure // @@ -576,6 +585,9 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; +extern boolean server_lagless; +extern consvar_t cv_mindelay; + extern consvar_t #ifdef VANILLAJOINNEXTROUND cv_joinnextround, @@ -645,6 +657,8 @@ extern char motd[254], server_context[8]; extern UINT8 playernode[MAXPLAYERS]; INT32 D_NumPlayers(void); +boolean D_IsPlayerHumanAndGaming(INT32 player_number); + void D_ResetTiccmds(void); tic_t GetLag(INT32 node); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 41b9c97e9..b8efd3392 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -916,6 +916,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_rollingdemos); CV_RegisterVar(&cv_netstat); CV_RegisterVar(&cv_netticbuffer); + CV_RegisterVar(&cv_mindelay); #ifdef NETGAME_DEVMODE CV_RegisterVar(&cv_fishcake); -- 2.54.0 From 1d5092cf22958b0d59af18d44575a2eb46d5162d Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 16:16:46 +0100 Subject: [PATCH 159/325] smol cleanup --- src/d_clisrv.c | 35 +++++++++++++---------------------- src/d_clisrv.h | 1 - 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 694fa288c..1d10ec4c2 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -109,7 +109,6 @@ static tic_t reference_lag; static UINT8 spike_time; static tic_t lowest_lag; -boolean server_lagless; static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -6601,47 +6600,39 @@ static void UpdatePingTable(void) { if (playeringame[i] && playernode[i] > 0 && playernode[i] != UINT8_MAX) { - if (playernode[i] > 0 && !players[i].spectator) - { - lag = GetLag(playernode[i]); - realpingtable[i] += (lag); + // TicsToMilliseconds can't handle pings over 1000ms lol + realpingtable[i] += GetLag(playernode[i]); + if (!players[i].spectator) + { + lag = playerpingtable[i]; if (! fastest || lag < fastest) fastest = lag; } - else - realpingtable[i] += (GetLag(playernode[i])); } } - // Don't gentleman below your mindelay - if (fastest < (tic_t)cv_mindelay.value) - fastest = (tic_t)cv_mindelay.value; - - pingmeasurecount++; - lowest_lag = fastest; - if (fastest) - lag = fastest; - else - lag = GetLag(0); + // Don't gentleman below your mindelay + if (lowest_lag < (tic_t)cv_mindelay.value) + lowest_lag = (tic_t)cv_mindelay.value; - lag = (realpingtable[0] + lag); + pingmeasurecount++; switch (playerpernode[0]) { case 4: - realpingtable[nodetoplayer4[0]] = lag; + realpingtable[nodetoplayer4[0]] = lowest_lag; /*FALLTHRU*/ case 3: - realpingtable[nodetoplayer3[0]] = lag; + realpingtable[nodetoplayer3[0]] = lowest_lag; /*FALLTHRU*/ case 2: - realpingtable[nodetoplayer2[0]] = lag; + realpingtable[nodetoplayer2[0]] = lowest_lag; /*FALLTHRU*/ case 1: - realpingtable[nodetoplayer[0]] = lag; + realpingtable[nodetoplayer[0]] = lowest_lag; } } else // We're a client, handle mindelay on the way out. diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 1e86ec567..25bbdf054 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -585,7 +585,6 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; -extern boolean server_lagless; extern consvar_t cv_mindelay; extern consvar_t -- 2.54.0 From 064e9d58af21f250c9b586a0eb7400206c177ee1 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 18:10:53 +0100 Subject: [PATCH 160/325] add gentlemens delay to ping display + display ping even offline if you have mindelay active --- src/hu_stuff.c | 16 +++++++++++++--- src/k_kart.c | 15 ++++++++++++--- src/screen.c | 7 ++++++- src/sdl/i_video.c | 13 +++++++++---- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 6cbb46148..96ba8cec6 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2425,7 +2425,7 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) UINT8 *colormap = NULL; INT32 measureid = cv_pingmeasurement.value ? 1 : 0; INT32 gfxnum; // gfx to draw - + //SRB2/Kart v1.0 style UINT8 numbars = 0; // how many ping bars do we draw? UINT8 barcolor = 31; // color we use for the bars (green, yellow, red or black) @@ -2522,6 +2522,7 @@ static inline void HU_DrawSpectatorTicker(void) INT32 length = 0, height = 174; INT32 totallength = 0, templength = -8; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; + UINT32 ping = 0; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) @@ -2595,8 +2596,17 @@ static inline void HU_DrawSpectatorTicker(void) } } - if (netgame && i != serverplayer) - HU_drawPing((templength - duptweak)+8, height-20, playerpingtable[i], V_TRANSLUCENT); + if ((netgame && i != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[i]))) + { + ping = playerpingtable[i]; + + if (P_IsLocalPlayer(&players[i]) && ping <= (tic_t)cv_mindelay.value) + { + ping = cv_mindelay.value; + } + + HU_drawPing((templength - duptweak)+8, height-20, ping, V_TRANSLUCENT); + } } if ((length += len) >= dupadjust+8) diff --git a/src/k_kart.c b/src/k_kart.c index 6f7555786..5ab4481fa 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8885,6 +8885,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I INT32 i, rightoffset = 240; const UINT8 *colormap; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; + UINT32 ping = 0; //this function is designed for 9 or less score lines only //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up @@ -8904,9 +8905,17 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[tab[i].num].spectator || !players[tab[i].num].mo) continue; //ignore them. - if (netgame // don't draw it offline - && tab[i].num != serverplayer) - HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[tab[i].num], 0); + if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[pnum]))) + { + ping = playerpingtable[pnum]; + + if (P_IsLocalPlayer(&players[pnum]) && ping <= (tic_t)cv_mindelay.value) + { + ping = cv_mindelay.value; + } + + HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, ping, 0); + } STRBUFCPY(strtime, tab[i].name); diff --git a/src/screen.c b/src/screen.c index 249c7225c..9d293ec7a 100644 --- a/src/screen.c +++ b/src/screen.c @@ -521,7 +521,12 @@ void SCR_DisplayLocalPing(void) if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain - + + if (ping <= (tic_t)cv_mindelay.value) + { + ping = cv_mindelay.value; + } + HU_drawPing(308, dispy, ping, pingflags); } } diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 609afc30a..c4dec0400 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1464,11 +1464,16 @@ void I_FinishUpdate(void) if (I_SkipFrame()) return; - if (cv_ticrate.value && st_overlay) - SCR_DisplayTicRate(); + if (st_overlay) + { + if (cv_ticrate.value) + SCR_DisplayTicRate(); - if (cv_showping.value && netgame && consoleplayer != serverplayer && st_overlay) - SCR_DisplayLocalPing(); + if (cv_showping.value && netgame && consoleplayer != serverplayer) + SCR_DisplayLocalPing(); + if (cv_showping.value && cv_mindelay.value && consoleplayer == serverplayer && Playing()) + SCR_DisplayLocalPing(); + } #ifdef HAVE_DISCORDRPC if (discordRequestList != NULL) -- 2.54.0 From 6b951d2773094d172de4d9edcd354ad71b0ae643 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 17:38:20 +0100 Subject: [PATCH 161/325] division by zero moment --- src/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 1d10ec4c2..e94cef84e 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4248,7 +4248,7 @@ void SV_ResetServer(void) memset(playeringame, false, sizeof playeringame); memset(playernode, UINT8_MAX, sizeof playernode); - pingmeasurecount = 0; //Reset count + pingmeasurecount = 1; memset(realpingtable, 0, sizeof realpingtable); memset(playerpingtable, 0, sizeof playerpingtable); -- 2.54.0 From 6ef9c0b305b295dcb9617522d5ba3ca6a0e4361b Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 18:06:06 +0100 Subject: [PATCH 162/325] colourise pingnumber when gentlemens is active --- src/hu_stuff.c | 24 ++++++++++++------------ src/hu_stuff.h | 2 +- src/k_kart.c | 10 +--------- src/screen.c | 9 ++------- src/sdl/i_video.c | 4 +--- 5 files changed, 17 insertions(+), 32 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 96ba8cec6..625668831 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2433,6 +2433,14 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) SINT8 yoffset = 6; //INT32 dx; + UINT32 lag = playerpingtable[pnum]; + + if (P_IsLocalPlayer(&players[pnum]) && lag < (tic_t)cv_mindelay.value) + { + lag = cv_mindelay.value; + colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); + } + gfxnum = Ping_gfx_num(lag); if (!cv_pingstyle.value) @@ -2452,7 +2460,7 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) x = V_DrawPingNum(x + (measureid == 1 ? 11 - pingmeasure[measureid]->width : 10), y+9, flags, lag, colormap); if (measureid == 0) - V_DrawScaledPatch(x+1 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); + V_DrawScaledPatch(x+1 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); } else if (cv_pingstyle.value) // old style ping { @@ -2500,8 +2508,8 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) } if (cv_pingicon.value) - { - for (i=0; (i<3); i++) // Draw the ping bar + { + for (i = 0; (i < 3); i++) // Draw the ping bar { V_DrawFill(x+2 *(i-1)+7, y+8+yoffset-4, 2, 8-yoffset, 31|flags); if (i < numbars) @@ -2522,7 +2530,6 @@ static inline void HU_DrawSpectatorTicker(void) INT32 length = 0, height = 174; INT32 totallength = 0, templength = -8; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; - UINT32 ping = 0; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) @@ -2598,14 +2605,7 @@ static inline void HU_DrawSpectatorTicker(void) if ((netgame && i != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[i]))) { - ping = playerpingtable[i]; - - if (P_IsLocalPlayer(&players[i]) && ping <= (tic_t)cv_mindelay.value) - { - ping = cv_mindelay.value; - } - - HU_drawPing((templength - duptweak)+8, height-20, ping, V_TRANSLUCENT); + HU_drawPlayerPing((templength - duptweak)+8, height-20, i, V_TRANSLUCENT); } } diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 66459c716..7578ed526 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -125,7 +125,7 @@ void HU_Drawer(void); char HU_dequeueChatChar(void); void HU_Erase(void); void HU_clearChatChars(void); -void HU_drawPing(INT32 x, INT32 y, UINT32 ping, INT32 flags); // Lat': Ping drawer for scoreboard. +void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard. //void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer); //void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer); void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol); diff --git a/src/k_kart.c b/src/k_kart.c index 5ab4481fa..3e6c97df5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8885,7 +8885,6 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I INT32 i, rightoffset = 240; const UINT8 *colormap; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; - UINT32 ping = 0; //this function is designed for 9 or less score lines only //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up @@ -8907,14 +8906,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[pnum]))) { - ping = playerpingtable[pnum]; - - if (P_IsLocalPlayer(&players[pnum]) && ping <= (tic_t)cv_mindelay.value) - { - ping = cv_mindelay.value; - } - - HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, ping, 0); + HU_drawPlayerPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, pnum, 0); } STRBUFCPY(strtime, tab[i].name); diff --git a/src/screen.c b/src/screen.c index 9d293ec7a..5ae4f8d72 100644 --- a/src/screen.c +++ b/src/screen.c @@ -515,18 +515,13 @@ void SCR_DisplayTicRate(void) void SCR_DisplayLocalPing(void) { - UINT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P + UINT32 ping = playerpingtable[consoleplayer]; INT32 pingflags = V_LocalTransFlag()|V_SNAPTOBOTTOM|V_SNAPTORIGHT; if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain - if (ping <= (tic_t)cv_mindelay.value) - { - ping = cv_mindelay.value; - } - - HU_drawPing(308, dispy, ping, pingflags); + HU_drawPlayerPing(308, dispy, consoleplayer, pingflags); // consoleplayer's ping is everyone's ping in a splitnetgame :P } } diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index c4dec0400..e17dd87f7 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1469,9 +1469,7 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - if (cv_showping.value && netgame && consoleplayer != serverplayer) - SCR_DisplayLocalPing(); - if (cv_showping.value && cv_mindelay.value && consoleplayer == serverplayer && Playing()) + if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || (cv_mindelay.value && consoleplayer == serverplayer && Playing()))) SCR_DisplayLocalPing(); } -- 2.54.0 From 9354a0ab88e72c2087b93e54960762bb1d167883 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:27:07 +0100 Subject: [PATCH 163/325] conflict fix --- src/hu_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 625668831..e94bd6598 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2420,7 +2420,7 @@ Ping_gfx_num (int lag) // HU_drawPing // -void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) +void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { UINT8 *colormap = NULL; INT32 measureid = cv_pingmeasurement.value ? 1 : 0; -- 2.54.0 From f4f3f6e29c194312bfb724982bedad733c84a71c Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:27:42 +0100 Subject: [PATCH 164/325] slight cleanup HU_drawPlayerPing --- src/hu_stuff.c | 63 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index e94bd6598..0677bf2a6 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2416,13 +2416,43 @@ Ping_gfx_num (int lag) return 4; } +static const UINT8 * +Ping_gfx_colormap (UINT32 lag, boolean gentleman) +{ + const UINT8 *colormap = NULL; + + if (gentleman) + { + colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); + } + + if (servermaxping && lag > servermaxping && hu_tick < 4) + { + // flash ping red if too high + colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_RASPBERRY, GTC_CACHE); + } + + return colormap; +} + +static UINT32 +Ping_conversion (UINT32 lag) +{ + if (cv_pingmeasurement.value) + { + lag = (INT32)(lag * (1000.00f / TICRATE)); + } + + return lag; +} + + // // HU_drawPing // void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { - UINT8 *colormap = NULL; INT32 measureid = cv_pingmeasurement.value ? 1 : 0; INT32 gfxnum; // gfx to draw @@ -2434,35 +2464,29 @@ void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) //INT32 dx; UINT32 lag = playerpingtable[pnum]; + const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])); - if (P_IsLocalPlayer(&players[pnum]) && lag < (tic_t)cv_mindelay.value) + if (gentleman) { lag = cv_mindelay.value; - colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); } - gfxnum = Ping_gfx_num(lag); - - if (!cv_pingstyle.value) + if (cv_pingstyle.value == 0) // kart { + gfxnum = Ping_gfx_num(lag); + if (measureid == 1) V_DrawScaledPatch(x+11 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); if (cv_pingicon.value) V_DrawScaledPatch(x+2, y, flags, pinggfx[gfxnum]); - if (servermaxping && lag > servermaxping && hu_tick < 4) - colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_RASPBERRY, GTC_CACHE); // flash ping red if too high - - if (cv_pingmeasurement.value) - lag = (INT32)(lag * (1000.00f / TICRATE)); - - x = V_DrawPingNum(x + (measureid == 1 ? 11 - pingmeasure[measureid]->width : 10), y+9, flags, lag, colormap); + x = V_DrawPingNum(x + (measureid == 1 ? 11 - pingmeasure[measureid]->width : 10), y+9, flags, Ping_conversion(lag), Ping_gfx_colormap(lag, gentleman)); if (measureid == 0) V_DrawScaledPatch(x+1 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); } - else if (cv_pingstyle.value) // old style ping + else if (cv_pingstyle.value == 1) // old style ping { if (cv_pingicon.value) { @@ -2488,22 +2512,15 @@ void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) } } - if (cv_pingmeasurement.value) - lag = (INT32)(lag * (1000.00f / TICRATE)); - if (vid.width >= 640) // how sad, we're using a shit resolution. { if (measureid == 1) { - //dx = x+1 - (V_SmallStringWidth(va("%dms", lag), V_ALLOWLOWERCASE|flags)/2); - //V_DrawSmallString(dx, y+4, V_ALLOWLOWERCASE|flags, va("%dms", lag)); - V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", lag)); + V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", Ping_conversion(lag))); } else if (measureid == 0) { - //dx = x+1 - (V_SmallStringWidth(va("d%d", lag), flags)/2); - //V_DrawSmallString(dx, y+4, flags, va("d%d", lag)); - V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", lag)); + V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", Ping_conversion(lag))); } } -- 2.54.0 From 1857ce5113d276268fd1d834480b940de2bdb9ef Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:29:08 +0100 Subject: [PATCH 165/325] conflict fix 2 --- src/hu_stuff.c | 2 +- src/k_kart.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 0677bf2a6..4f99ca0eb 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2451,7 +2451,7 @@ Ping_conversion (UINT32 lag) // HU_drawPing // -void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) +void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { INT32 measureid = cv_pingmeasurement.value ? 1 : 0; INT32 gfxnum; // gfx to draw diff --git a/src/k_kart.c b/src/k_kart.c index 3e6c97df5..9048d1fc6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8904,9 +8904,9 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[tab[i].num].spectator || !players[tab[i].num].mo) continue; //ignore them. - if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[pnum]))) + if ((netgame && tab[i].num != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[tab[i].num]))) { - HU_drawPlayerPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, pnum, 0); + HU_drawPlayerPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, tab[i].num, 0); } STRBUFCPY(strtime, tab[i].name); -- 2.54.0 From ac64428abb92e7b4e66f569e076a32abafdf5e9d Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:55:37 +0100 Subject: [PATCH 166/325] dont mess up realpingtable when serverplayer has mindelay active this was supposed to show mindelay for serverplayers but that doesent work :chaosleep: so just do not mess with it --- src/d_clisrv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e94cef84e..465a95300 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -6600,7 +6600,6 @@ static void UpdatePingTable(void) { if (playeringame[i] && playernode[i] > 0 && playernode[i] != UINT8_MAX) { - // TicsToMilliseconds can't handle pings over 1000ms lol realpingtable[i] += GetLag(playernode[i]); if (!players[i].spectator) @@ -6620,6 +6619,7 @@ static void UpdatePingTable(void) pingmeasurecount++; +#if 0 switch (playerpernode[0]) { case 4: @@ -6634,6 +6634,7 @@ static void UpdatePingTable(void) case 1: realpingtable[nodetoplayer[0]] = lowest_lag; } +#endif } else // We're a client, handle mindelay on the way out. { -- 2.54.0 From b97841b6fdb1814387409d403292757c49d7c61e Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 06:39:57 +0100 Subject: [PATCH 167/325] proper add server gentlemans this should be a netvar, but we cant really do that, thought not a huge deal however id wish to send some kinda message to all players but idk --- src/d_clisrv.c | 39 +++++++++++++++++++-------------------- src/d_clisrv.h | 4 +++- src/d_netcmd.c | 1 + src/g_game.c | 2 ++ src/hu_stuff.c | 4 ++-- src/sdl/i_video.c | 2 +- 6 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 465a95300..7c7cb7d07 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -107,11 +107,24 @@ UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. #define GENTLEMANSMOOTHING (TICRATE) static tic_t reference_lag; static UINT8 spike_time; +tic_t lowest_lag; +boolean server_lagless; -static tic_t lowest_lag; +static void Lagless_OnChange(void) +{ + /* don't back out of dishonesty, or go lagless after playing honestly */ + if (cv_lagless.value && gamestate == GS_LEVEL) + server_lagless = true; + + /*if (cv_lagless.value) + HU_AddChatText(M_GetText("\x82*Gentlemans Delay has been enabled for Serverplayer."), false); + else + HU_AddChatText(M_GetText("\x82*Gentlemans Delay will be disabled for Serverplayer."), false);*/ +} static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_lagless = {"serverlagless", "On", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, Lagless_OnChange, 0, NULL, NULL, 0, 0, NULL}; // this should be a netvar Zzz... SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) @@ -6602,7 +6615,7 @@ static void UpdatePingTable(void) { realpingtable[i] += GetLag(playernode[i]); - if (!players[i].spectator) + if (!server_lagless && !players[i].spectator) { lag = playerpingtable[i]; if (! fastest || lag < fastest) @@ -6611,30 +6624,16 @@ static void UpdatePingTable(void) } } - lowest_lag = fastest; + if (server_lagless) + lowest_lag = 0; + else + lowest_lag = fastest; // Don't gentleman below your mindelay if (lowest_lag < (tic_t)cv_mindelay.value) lowest_lag = (tic_t)cv_mindelay.value; pingmeasurecount++; - -#if 0 - switch (playerpernode[0]) - { - case 4: - realpingtable[nodetoplayer4[0]] = lowest_lag; - /*FALLTHRU*/ - case 3: - realpingtable[nodetoplayer3[0]] = lowest_lag; - /*FALLTHRU*/ - case 2: - realpingtable[nodetoplayer2[0]] = lowest_lag; - /*FALLTHRU*/ - case 1: - realpingtable[nodetoplayer[0]] = lowest_lag; - } -#endif } else // We're a client, handle mindelay on the way out. { diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 25bbdf054..c24356e94 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -585,7 +585,9 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; -extern consvar_t cv_mindelay; +extern boolean server_lagless; +extern tic_t lowest_lag; +extern consvar_t cv_mindelay, cv_lagless; extern consvar_t #ifdef VANILLAJOINNEXTROUND diff --git a/src/d_netcmd.c b/src/d_netcmd.c index b8efd3392..759b3b6a4 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -917,6 +917,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_netstat); CV_RegisterVar(&cv_netticbuffer); CV_RegisterVar(&cv_mindelay); + CV_RegisterVar(&cv_lagless); #ifdef NETGAME_DEVMODE CV_RegisterVar(&cv_fishcake); diff --git a/src/g_game.c b/src/g_game.c index d30e07c00..fa58ca81c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1265,6 +1265,8 @@ static void G_DoLoadLevel(boolean resetplayer) // clear hud messages remains (usually from game startup) CON_ClearHUD(); + server_lagless = cv_lagless.value; + G_ResetAllDeviceRumbles(); } diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 4f99ca0eb..62b29de59 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2464,11 +2464,11 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) //INT32 dx; UINT32 lag = playerpingtable[pnum]; - const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])); + const boolean gentleman = ((cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])) || (pnum == serverplayer && lowest_lag != 0)); // for serverplayer lowest_lag actually reflects mindelay if (gentleman) { - lag = cv_mindelay.value; + lag = (pnum == serverplayer) ? lowest_lag : (tic_t)cv_mindelay.value; } if (cv_pingstyle.value == 0) // kart diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index e17dd87f7..934491e9c 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1469,7 +1469,7 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || (cv_mindelay.value && consoleplayer == serverplayer && Playing()))) + if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || ((cv_mindelay.value || (!server_lagless && lowest_lag != 0)) && consoleplayer == serverplayer && Playing()))) SCR_DisplayLocalPing(); } -- 2.54.0 From b55c654a81691544f33a3c60acace0c745c8e459 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 06:43:46 +0100 Subject: [PATCH 168/325] oop --- 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 7c7cb7d07..ccc700325 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -117,9 +117,9 @@ static void Lagless_OnChange(void) server_lagless = true; /*if (cv_lagless.value) - HU_AddChatText(M_GetText("\x82*Gentlemans Delay has been enabled for Serverplayer."), false); + HU_AddChatText(M_GetText("\x82*Gentlemans Delay has been disabled for Serverplayer."), false); else - HU_AddChatText(M_GetText("\x82*Gentlemans Delay will be disabled for Serverplayer."), false);*/ + HU_AddChatText(M_GetText("\x82*Gentlemans Delay will be enabled for Serverplayer."), false);*/ } static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; -- 2.54.0 From af3a23ce6689ade41a21b8ac8ccb2ac1a8fbd49e Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 17:56:50 +0100 Subject: [PATCH 169/325] make trailing items also be able to rotate on slopes mostly stuff from RR thx! --- src/k_kart.c | 206 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 6f7555786..b267e90db 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3554,6 +3554,62 @@ void K_RollMobjBySlopes(mobj_t* mo, boolean usedistance) } } +static void K_SetPitchRollFromSlope(mobj_t* mo, pslope_t *slope, boolean usedistance) +{ + if (P_MobjWasRemoved(mo)) + return; + + I_Assert(mo->subsector != NULL); + I_Assert(mo->subsector->sector != NULL); + + // lifted from hw_md2 + if (slope) + { + angle_t an; + const boolean flip = (mo->eflags & MFE_VERTICALFLIP); + const fixed_t m_dist = usedistance ? R_PointToDist(mo->x, mo->y) : 0; + const fixed_t rolldist = cv_sloperolldist.value * mapobjectscale; + + fixed_t tempz = slope->normal.z; + fixed_t tempy = slope->normal.y; + fixed_t tempx = slope->normal.x; + fixed_t tempangle = -(R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx)); + + // admittedly this is a very hacky way to do the pitch and roll easing + + // pitch + if (!usedistance || (m_dist <= (rolldist))) + { + an = (INT32)((angle_t)tempangle - mo->pitch_sprite) / SLOPEROLL_DIV; + + mo->pitch_sprite = an ? mo->pitch_sprite + an : (angle_t)tempangle; + } + else + mo->pitch_sprite = FixedAngle(0); + + mo->slopepitch = flip ? InvAngle(mo->pitch_sprite) : mo->pitch_sprite; + + // roll + tempangle = (R_PointToAngle2(0, 0, tempz, tempy)); + + if (!usedistance || (m_dist <= (rolldist))) + { + an = (INT32)((angle_t)tempangle - mo->roll_sprite) / SLOPEROLL_DIV; + + mo->roll_sprite = an ? mo->roll_sprite + an : (angle_t)tempangle; + } + else + mo->roll_sprite = FixedAngle(0); + + mo->sloperoll = flip ? InvAngle(mo->roll_sprite) : mo->roll_sprite; + } + else if (P_IsObjectOnGround(mo)) + { + mo->sloperoll = FixedAngle(0); + mo->slopepitch = FixedAngle(0); + } +} + void K_SpawnBoostTrail(player_t *player) { fixed_t newx; @@ -4650,6 +4706,150 @@ void K_RepairOrbitChain(mobj_t *orbit) } } +// Simplified version of a code bit in P_MobjFloorZ +static fixed_t K_BananaSlopeZ(pslope_t *slope, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, boolean ceiling) +{ + fixed_t testx, testy; + fixed_t slopez = 0; + + if (slope == NULL) + { + testx = x; + testy = y; + } + else + { + if (slope->d.x < 0) + testx = radius; + else + testx = -radius; + + if (slope->d.y < 0) + testy = radius; + else + testy = -radius; + + if ((slope->zdelta > 0) ^ !!(ceiling)) + { + testx = -testx; + testy = -testy; + } + + testx += x; + testy += y; + } + + if (slope) + { + slopez = P_GetZAt(slope, testx, testy); + } + else + slopez = z; + + return slopez; +} + +static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, fixed_t height, boolean flip, boolean player) +{ + fixed_t newz; + sector_t *sec; + pslope_t *slope = NULL; + + //sec = R_PointInSubsector(x, y)->sector; + + if (mobj->x != x || mobj->y != y || mobj->subsector == NULL) + sec = R_PointInSubsector(x, y)->sector; + else + sec = mobj->subsector->sector; + + if (flip) + { + slope = sec->c_slope; + newz = K_BananaSlopeZ(slope, x, y, sec->ceilingheight, radius, true); + } + else + { + slope = sec->f_slope; + newz = K_BananaSlopeZ(slope, x, y, sec->floorheight, radius, true); + } + + // Check FOFs for a better suited slope + if (sec->ffloors) + { + ffloor_t *rover; + + for (rover = sec->ffloors; rover; rover = rover->next) + { + fixed_t top, bottom; + fixed_t d1, d2; + + if (!(rover->flags & FF_EXISTS)) + continue; + + if ((!(((rover->flags & FF_BLOCKPLAYER && player) + || (rover->flags & FF_BLOCKOTHERS && !player)) + || (rover->flags & FF_QUICKSAND)) + || (rover->flags & FF_SWIMMABLE))) + continue; + + top = K_BananaSlopeZ(*rover->t_slope, x, y, *rover->topheight, radius, false); + bottom = K_BananaSlopeZ(*rover->b_slope, x, y, *rover->bottomheight, radius, true); + + if (flip) + { + if (rover->flags & FF_QUICKSAND) + { + if (z < top && (z + height) > bottom) + { + if (newz > (z + height)) + { + newz = (z + height); + slope = NULL; + } + } + continue; + } + + d1 = (z + height) - (top + ((bottom - top)/2)); + d2 = z - (top + ((bottom - top)/2)); + + if (bottom < newz && abs(d1) < abs(d2)) + { + newz = bottom; + slope = *rover->b_slope; + } + } + else + { + if (rover->flags & FF_QUICKSAND) + { + if (z < top && (z + height) > bottom) + { + if (newz < z) + { + newz = z; + slope = NULL; + } + } + continue; + } + + d1 = z - (bottom + ((top - bottom)/2)); + d2 = (z + height) - (bottom + ((top - bottom)/2)); + + if (top > newz && abs(d1) < abs(d2)) + { + newz = top; + slope = *rover->t_slope; + } + } + } + } + + //mobj->standingslope = slope; + K_SetPitchRollFromSlope(mobj, slope, (cv_sloperolldist.value && !splitscreen)); +} + // Move the hnext chain! static void K_MoveHeldObjects(player_t *player) { @@ -4845,6 +5045,12 @@ static void K_MoveHeldObjects(player_t *player) if (R_PointToDist2(cur->x, cur->y, targx, targy) > 768*FRACUNIT) P_MoveOrigin(cur, targx, targy, cur->z); + if (cv_sloperoll.value == 2 && P_IsObjectOnGround(cur)) + { + K_CalculateBananaSlope(cur, cur->x, cur->y, cur->z, + cur->radius, cur->height, (cur->eflags & MFE_VERTICALFLIP), false); + } + cur = cur->hnext; } } -- 2.54.0 From a15de64160688d1938ee30823b61884d2f06a557 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 18:04:38 +0100 Subject: [PATCH 170/325] think we should copy this --- src/p_user.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_user.c b/src/p_user.c index 01c0b3a88..7df5dfd5d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1197,6 +1197,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->spriteyscale = mobj->spriteyscale; ghost->spritexoffset = mobj->spritexoffset; ghost->spriteyoffset = mobj->spriteyoffset; + ghost->rollangle = mobj->rollangle; if (mobj->flags2 & MF2_OBJECTFLIP) ghost->flags |= MF2_OBJECTFLIP; -- 2.54.0 From b1fa124032e5b8ce760bdcd5cb70b1b8b046dcb8 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 19:24:56 +0100 Subject: [PATCH 171/325] add funny banan throw rotate thing like rr --- src/k_kart.c | 12 ++++++++++++ src/k_kart.h | 1 + src/m_menu.c | 15 ++++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b267e90db..926ce7622 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -82,6 +82,8 @@ consvar_t cv_coloredspeedlines = {"colorizedspeedlines", "Off", CV_SAVE, colorsp consvar_t cv_coloredsneakertrail = {"sneakertrailcolor", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_bananajitter = {"bananadragjitter", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +static CV_PossibleValue_t bananthrowroll_cons_t[] = {{0, "Off"}, {1, "Throw"}, {2, "+Onground"}, {0, NULL}}; +consvar_t cv_bananthrowroll = {"bananthrowroll", "0", CV_SAVE, bananthrowroll_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; //extra hud things consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -838,6 +840,7 @@ void K_RegisterKartStuff(void) // makes banans do funny jitter jumpy when dragged CV_RegisterVar(&cv_bananajitter); + CV_RegisterVar(&cv_bananthrowroll); CV_RegisterVar(&cv_showstats); CV_RegisterVar(&cv_showinput); @@ -3971,6 +3974,15 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map if (mo->eflags & MFE_UNDERWATER) mo->momz = (117 * mo->momz) / 200; + + if (cv_sloperoll.value == 2 && cv_bananthrowroll.value && mapthing == MT_BANANA) + { + //mo->angle = FixedAngle(M_RandomRange(-180, 180) << FRACBITS); + if (cv_bananthrowroll.value == 1) + mo->sloperoll = FixedAngle(M_RandomRange(-180, 180) << FRACBITS); // im lazy but this makes sure the banan goes back to upright when it lands lmao + else if (cv_bananthrowroll.value == 2) + mo->rollangle = FixedAngle(M_RandomRange(-180, 180) << FRACBITS); + } } // this is the small graphic effect that plops in you when you throw an item: diff --git a/src/k_kart.h b/src/k_kart.h index bf3f4f71a..c491c3477 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -25,6 +25,7 @@ void K_RegisterKartStuff(void); extern consvar_t cv_coloredspeedlines, cv_coloredsneakertrail; extern consvar_t cv_bananajitter; +extern consvar_t cv_bananthrowroll; extern consvar_t cv_colorizedhud, cv_colorizeditembox, cv_colorizedhudcolor; extern consvar_t cv_darkitembox; extern consvar_t cv_biglaps; diff --git a/src/m_menu.c b/src/m_menu.c index 564ce4e33..ec4f1bca0 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2237,13 +2237,16 @@ static menuitem_t OP_PlayerDistortMenu[] = {IT_STRING | IT_CVAR, NULL, "Sprite Slope Rotation", &cv_sloperoll, 15}, {IT_STRING | IT_CVAR, NULL, "Slope Rotation Distance", &cv_sloperolldist, 30}, + {IT_STRING | IT_CVAR, NULL, "Rotate Players when Sliptiding", &cv_sliptideroll, 45}, {IT_STRING | IT_CVAR, NULL, "Rotate Sparks and Boost Trails", &cv_sparkroll, 60}, - {IT_STRING | IT_CVAR, NULL, "Player Stretch Factor", &cv_gravstretch, 75}, - {IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 90}, - {IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 105}, - {IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 120}, - {IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 135}, + {IT_STRING | IT_CVAR, NULL, "Rotate Bananas on Throw", &cv_bananthrowroll, 75}, + + {IT_STRING | IT_CVAR, NULL, "Player Stretch Factor", &cv_gravstretch, 90}, + {IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 105}, + {IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 120}, + {IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 135}, + {IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 150}, }; static const char* OP_PlayerDistortTooltips[] = @@ -2253,6 +2256,7 @@ static const char* OP_PlayerDistortTooltips[] = "Distance object rotation should be visable.", "Player rotation when sliptiding.", "Rotation of a player's boost trails and drift sparks.", + "Should banans rotate when thrown?\nAnd should they stay rotated when on the ground?.", "Player squash and stretch.", "Player landing sound effect.", "Kart hopping while drifting. This is purely visual.", @@ -2267,6 +2271,7 @@ enum slrotatedist, sliptide, sparkrotate, + bananrotat, stretchyplayer, squishsound, salthmmm, -- 2.54.0 From 97a5c15c360d23cb509dbf6ff6b57e769788da44 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 15:50:45 +0100 Subject: [PATCH 172/325] just use D_NumPlayers --- src/k_director.c | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/src/k_director.c b/src/k_director.c index 402f5d039..70fd66bbf 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -40,25 +40,6 @@ struct directorinfo INT32 boredom[MAXPLAYERS]; // how long has a given position had no credible attackers? } directorinfo; -static boolean K_DirectorIsPlayerAlone(void) -{ - UINT8 pingame = 0; - - // Gotta check how many players are active at this moment. - for (UINT8 i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - continue; - - pingame++; - - if (pingame >= 2) // we dont need to check further - break; - } - - return (pingame <= 1); -} - static inline boolean race_rules(void) { return gametype == GT_RACE; @@ -73,7 +54,7 @@ boolean K_DirectorIsAvailable(void) { if (splitscreen || (demo.playback && demo.title) || modeattacking) return false; - return ((gamestate == GS_LEVEL) && ((demo.playback && !camera[0].freecam) || (players[consoleplayer].spectator && !K_DirectorIsPlayerAlone()))); + return ((gamestate == GS_LEVEL) && ((demo.playback && !camera[0].freecam) || (players[consoleplayer].spectator && (D_NumPlayers() > 1)))); } static boolean K_DirectorIsEnabled(void) -- 2.54.0 From 30f11e4e463208e8e0b3d482050dd78321d11c34 Mon Sep 17 00:00:00 2001 From: Indev Date: Sat, 25 Jan 2025 01:09:43 +0300 Subject: [PATCH 173/325] Fix 'total podium' stat display using totalwins --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index 0c1882fef..e1b00d4ac 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -8829,7 +8829,7 @@ static void M_DrawStatsExtra(void) DRAWTIMESTAT(52, "Time spent in spinout:", spinouttime); DRAWAMOUNTSTAT(72, "Total wins:", totalwins); - DRAWAMOUNTSTAT(82, "Total podium (2nd/3rd place):", totalwins); + DRAWAMOUNTSTAT(82, "Total podium (2nd/3rd place):", totalpodium); DRAWAMOUNTSTAT(102, "Hits landed:", hits); DRAWAMOUNTSTAT(112, "Self-hits landed:", selfhits); -- 2.54.0 From 49cefa92e23938f51cb3d1cda57019343af1f68e Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 25 Jan 2025 09:33:14 +0100 Subject: [PATCH 174/325] dont banan drag rumble when not driving lel --- src/p_tick.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_tick.c b/src/p_tick.c index b014c3c5d..5909a8c59 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -436,7 +436,8 @@ static void P_DeviceRumbleTick(void) low = high = FRACUNIT / 64; } } - else if (player->kartstuff[k_bananadrag] > TICRATE && P_IsObjectOnGround(player->mo)) + else if ((player->kartstuff[k_bananadrag] > TICRATE) + && P_IsObjectOnGround(player->mo) && player->speed != 0) { if (leveltime & 1) // this is actually funny lel high = FRACUNIT / 64; -- 2.54.0 From 0dd4f3b3d32b0751c7a41eaab4ff98b2c42d9e07 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 09:19:25 +0100 Subject: [PATCH 175/325] make old ping bar be blue on d1 aswell as purple with mindelay --- src/hu_stuff.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 62b29de59..b22e69b2b 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2490,25 +2490,33 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { if (cv_pingicon.value) { - if (lag < 4) + switch (lag) { - numbars = 3; - barcolor = 184; + case 0 ... 1: + numbars = 3; + barcolor = 215; // Blue + break; + case 2 ... 3: + numbars = 3; + barcolor = 184; // Green + break; + case 4 ... 6: + numbars = 2; // Apparently ternaries w/ multiple statements don't look good in C so I decided against it. + barcolor = 103; // Yellow + break; + case 7 ... 9: + numbars = 1; + barcolor = 155; // Red + break; + default: // Brazil + numbars = 0; + barcolor = 31; // black + break; } - else if (lag < 7) + + if (gentleman) { - numbars = 2; // Apparently ternaries w/ multiple statements don't look good in C so I decided against it. - barcolor = 103; - } - else if (lag < 10) - { - numbars = 1; - barcolor = 155; // need a better red - } - else // brazil - { - numbars = 0; - barcolor = 31; + barcolor = 194; // make it purplish } } -- 2.54.0 From 7ab7193592d0ff25e34c7048b2541cc76492e618 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 25 Jan 2025 15:39:40 +0100 Subject: [PATCH 176/325] remove noshowhelp from bunch of debug cvars doesent make too much sense those are hidden tbh --- src/d_netcmd.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 41b9c97e9..b527f9c6f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -404,18 +404,18 @@ static CV_PossibleValue_t kartvoices_cons_t[] = {{0, "Never"}, {1, "Tasteful"}, consvar_t cv_kartvoices = {"kartvoices", "Tasteful", CV_SAVE, kartvoices_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_karthitemdialog = {"karthitemdialog", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_karteliminatelast = {"karteliminatelast", "Yes", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOSHOWHELP, CV_YesNo, KartEliminateLast_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_karteliminatelast = {"karteliminatelast", "Yes", CV_NETVAR|CV_CHEAT|CV_CALL, CV_YesNo, KartEliminateLast_OnChange, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartdebugitem_cons_t[] = {{-1, "MIN"}, {NUMKARTITEMS-1, "MAX"}, {0, NULL}}; -consvar_t cv_kartdebugitem = {"kartdebugitem", "0", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, kartdebugitem_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugitem = {"kartdebugitem", "0", CV_NETVAR|CV_CHEAT, kartdebugitem_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartdebugamount_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}}; -consvar_t cv_kartdebugamount = {"kartdebugamount", "1", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, kartdebugamount_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartdebugshrink = {"kartdebugshrink", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartdebugdistribution = {"kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartdebughuddrop = {"kartdebughuddrop", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugamount = {"kartdebugamount", "1", CV_NETVAR|CV_CHEAT, kartdebugamount_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugshrink = {"kartdebugshrink", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugdistribution = {"kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebughuddrop = {"kartdebughuddrop", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartdebugcheckpoint = {"kartdebugcheckpoint", "Off", CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartdebugnodes = {"kartdebugnodes", "Off", CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugcheckpoint = {"kartdebugcheckpoint", "Off", NULL, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugnodes = {"kartdebugnodes", "Off", NULL, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartdebugcolorize = {"kartdebugcolorize", "Off", CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t votetime_cons_t[] = {{1, "MIN"}, {3600, "MAX"}, {0, NULL}}; -- 2.54.0 From 40660f237974d316d31b80d0af343d6f188158e3 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 25 Jan 2025 16:59:31 +0100 Subject: [PATCH 177/325] "makes integer from pointer without a cast" deez nuts --- src/d_netcmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index b527f9c6f..184fdd70f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -414,8 +414,8 @@ consvar_t cv_kartdebugshrink = {"kartdebugshrink", "Off", CV_NETVAR|CV_CHEAT, CV consvar_t cv_kartdebugdistribution = {"kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartdebughuddrop = {"kartdebughuddrop", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartdebugcheckpoint = {"kartdebugcheckpoint", "Off", NULL, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartdebugnodes = {"kartdebugnodes", "Off", NULL, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugcheckpoint = {"kartdebugcheckpoint", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartdebugnodes = {"kartdebugnodes", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartdebugcolorize = {"kartdebugcolorize", "Off", CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t votetime_cons_t[] = {{1, "MIN"}, {3600, "MAX"}, {0, NULL}}; -- 2.54.0 From 3b90038b621b3e5fb3746e6a652ee08482738b82 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 21:19:50 +0100 Subject: [PATCH 178/325] inline G_TicsTo stuff theyre smol and get called often --- src/g_game.c | 30 ------------------------------ src/g_game.h | 31 ++++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index d30e07c00..cfc99b9a8 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -7814,7 +7814,6 @@ void G_DoneLevelLoad(void) // Stops metal sonic's demo. Separate from other functions because metal + replays can coexist void G_StopMetalDemo(void) { - // Metal Sonic finishing doesn't end the game, dammit. Z_Free(metalbuffer); metalbuffer = NULL; @@ -8155,32 +8154,3 @@ boolean G_GetRetryFlag(void) { return retrying; } - -// Time utility functions -INT32 G_TicsToHours(tic_t tics) -{ - return tics/(3600*TICRATE); -} - -INT32 G_TicsToMinutes(tic_t tics, boolean full) -{ - if (full) - return tics/(60*TICRATE); - else - return tics/(60*TICRATE)%60; -} - -INT32 G_TicsToSeconds(tic_t tics) -{ - return (tics/TICRATE)%60; -} - -INT32 G_TicsToCentiseconds(tic_t tics) -{ - return (INT32)((tics%TICRATE) * (100.00f/TICRATE)); -} - -INT32 G_TicsToMilliseconds(tic_t tics) -{ - return (INT32)((tics%TICRATE) * (1000.00f/TICRATE)); -} diff --git a/src/g_game.h b/src/g_game.h index d82946684..107741d75 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -435,11 +435,32 @@ void G_ClearRecords(void); tic_t G_GetBestTime(INT16 map); -FUNCMATH INT32 G_TicsToHours(tic_t tics); -FUNCMATH INT32 G_TicsToMinutes(tic_t tics, boolean full); -FUNCMATH INT32 G_TicsToSeconds(tic_t tics); -FUNCMATH INT32 G_TicsToCentiseconds(tic_t tics); -FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics); +// Time utility functions + +FUNCINLINE static ATTRINLINE FUNCMATH INT32 G_TicsToHours(tic_t tics) +{ + return tics/(3600*TICRATE); +} + +FUNCINLINE static ATTRINLINE FUNCMATH INT32 G_TicsToMinutes(tic_t tics, boolean full) +{ + return full ? (tics/(60*TICRATE)) : (tics/(60*TICRATE)%60); +} + +FUNCINLINE static ATTRINLINE FUNCMATH INT32 G_TicsToSeconds(tic_t tics) +{ + return (tics/TICRATE)%60; +} + +FUNCINLINE static ATTRINLINE FUNCMATH INT32 G_TicsToCentiseconds(tic_t tics) +{ + return (INT32)((tics%TICRATE) * (100.00f/TICRATE)); +} + +FUNCINLINE static ATTRINLINE FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics) +{ + return (INT32)((tics%TICRATE) * (1000.00f/TICRATE)); +} // Don't split up TOL handling INT16 G_TOLFlag(INT32 pgametype); -- 2.54.0 From 36404fd93d7c05e25b1b6d8fb6fc65e6380aaad5 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 30 Jan 2025 10:27:36 +0100 Subject: [PATCH 179/325] inline bunch of one line HWR things --- src/hardware/hw_main.c | 52 +--------------------------------- src/hardware/hw_main.h | 64 ++++++++++++++++++++++++++++++++++-------- src/sdl/ogl_sdl.c | 2 +- 3 files changed, 54 insertions(+), 64 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 97f6d9795..6a6c5db4f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -317,26 +317,11 @@ static void CV_glpalettedepth_OnChange(void) // Lighting // ========================================================================== -boolean HWR_UseShader(void) -{ - return (cv_glshaders.value && gl_shadersavailable); -} - static void HWR_SetShaderState(void) { GL_SetSpecialState(HWD_SET_SHADERS, HWR_UseShader() ? 1 : 0); } -boolean HWR_ShouldUsePaletteRendering(void) -{ - return (cv_glpaletterendering.value && (pLocalPalette != NULL) && HWR_UseShader()); -} - -boolean HWR_PalRenderFlashpal(void) -{ - return (HWR_ShouldUsePaletteRendering() && cv_glflashpal.value); -} - void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *colormap) { RGBA_t poly_color, tint_color, fade_color; @@ -3163,7 +3148,7 @@ static gl_vissprite_t *gl_visspritechunks[MAXVISSPRITES >> VISSPRITECHUNKBITS] = // HWR_ClearSprites // Called at frame start. // -------------------------------------------------------------------------- -static void HWR_ClearSprites(void) +static inline void HWR_ClearSprites(void) { gl_visspritecount = 0; } @@ -5747,11 +5732,6 @@ static void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD #endif } -INT32 HWR_GetTextureUsed(void) -{ - return GL_GetTextureUsed(); -} - static void HWR_DoPostProcessor(player_t *player) { GL_UnSetShader(); @@ -5835,21 +5815,6 @@ static void HWR_DoPostProcessor(player_t *player) // Flipping of the screen isn't done here anymore } -void HWR_StartScreenWipe(void) -{ - GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_START); -} - -void HWR_EndScreenWipe(void) -{ - GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_END); -} - -void HWR_DrawIntermissionBG(void) -{ - GL_DrawScreenTexture(HWD_SCREENTEXTURE_GENERIC1, NULL, 0); -} - void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum) { static char lumpname[9] = "FADEmmss"; @@ -5884,19 +5849,4 @@ void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum) GL_DoScreenWipe(HWD_SCREENTEXTURE_WIPE_START, HWD_SCREENTEXTURE_WIPE_END); } -void HWR_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize) -{ - GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize); -} - -void HWR_MakeScreenFinalTexture(void) -{ - GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2); -} - -void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader) -{ - GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader); -} - #endif // HWRENDER diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 93fbd9c1e..9d25ff97f 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -20,6 +20,7 @@ #ifndef __HWR_MAIN_H__ #define __HWR_MAIN_H__ +#include "hw_gl.h" #include "hw_glob.h" #include "hw_data.h" #include "hw_defs.h" @@ -29,6 +30,7 @@ #include "../d_player.h" #include "../r_defs.h" #include "../m_perfstats.h" +#include "../v_video.h" #define GLENCORE @@ -112,10 +114,6 @@ void HWR_SetTransform(float fpov, player_t *player); void HWR_ClearClipper(void); void HWR_SetStencilState(int state, int level); -boolean HWR_UseShader(void); -boolean HWR_ShouldUsePaletteRendering(void); -boolean HWR_PalRenderFlashpal(void); - // My original intention was to split hw_main.c // into files like hw_bsp.c, hw_sprites.c... @@ -124,17 +122,44 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf); -// Get amount of memory used by gpu textures in bytes -INT32 HWR_GetTextureUsed(void); +// Get amount of memory used by gpu textures in bytes; +FUNCINLINE static ATTRINLINE INT32 HWR_GetTextureUsed(void) +{ + return GL_GetTextureUsed(); +} // hw_main.c: Post-rendering -void HWR_StartScreenWipe(void); -void HWR_EndScreenWipe(void); -void HWR_DrawIntermissionBG(void); void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum); -void HWR_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize); -void HWR_MakeScreenFinalTexture(void); -void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader); + +FUNCINLINE static ATTRINLINE void HWR_StartScreenWipe(void) +{ + GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_START); +} + +FUNCINLINE static ATTRINLINE void HWR_EndScreenWipe(void) +{ + GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_END); +} + +FUNCINLINE static ATTRINLINE void HWR_DrawIntermissionBG(void) +{ + GL_DrawScreenTexture(HWD_SCREENTEXTURE_GENERIC1, NULL, 0); +} + +FUNCINLINE static ATTRINLINE void HWR_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize) +{ + GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize); +} + +FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void) +{ + GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2); +} + +FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader) +{ + GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader); +} // hw_main.c: Segs void HWR_ProcessSeg(void); // Sort of like GLWall::Process in GZDoom @@ -185,4 +210,19 @@ extern consvar_t cv_glpaletterendering; extern consvar_t cv_glpalettedepth; extern consvar_t cv_glflashpal; +FUNCINLINE static ATTRINLINE boolean HWR_UseShader(void) +{ + return (cv_glshaders.value && gl_shadersavailable); +} + +FUNCINLINE static ATTRINLINE boolean HWR_ShouldUsePaletteRendering(void) +{ + return (cv_glpaletterendering.value && (pLocalPalette != NULL) && HWR_UseShader()); +} + +FUNCINLINE static ATTRINLINE boolean HWR_PalRenderFlashpal(void) +{ + return (HWR_ShouldUsePaletteRendering() && cv_glflashpal.value); +} + #endif diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c index 8a3a0eabb..7f84adcea 100644 --- a/src/sdl/ogl_sdl.c +++ b/src/sdl/ogl_sdl.c @@ -264,7 +264,7 @@ void OglSdlFinishUpdate(boolean waitvbl) } #endif - GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, sdlw, sdlh, HWR_ShouldUsePaletteRendering()); + HWR_DrawScreenFinalTexture(sdlw, sdlh, HWR_ShouldUsePaletteRendering()); #ifdef USE_FBO_OGL if (usefbo) -- 2.54.0 From bab120235d2d693dedcd5b4a395b7c963c87f681 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 25 Jan 2025 22:13:39 +0100 Subject: [PATCH 180/325] draw non widescreen anim vote bg before falling back to vanilla bg how it was before, the game just fallback to the vanila widescreen patch if there was no animated widescreen bg provided, just fall back to the non widescreen anim patch instead if it exists --- src/y_inter.c | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 61f4a069b..115967509 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -319,7 +319,7 @@ static void Y_AnimatedVoteScreenCheck(void) strncpy(tmpPrefix, luaVoteScreen, 4); else { - if(G_BattleGametype()) + if (G_BattleGametype()) strcpy(tmpPrefix, "BTLS"); } @@ -923,20 +923,12 @@ static void Y_UnloadData(void) static inline void Y_DrawAnimatedVoteScreenPatch(boolean widePatch) { char tempAnimPrefix[7]; - (widePatch) ? strcpy(tempAnimPrefix, animWidePrefix) : strcpy(tempAnimPrefix, animPrefix); - INT32 tempFoundAnimVoteFrames = (widePatch) ? foundAnimVoteWideFrames : foundAnimVoteFrames; + widePatch ? strcpy(tempAnimPrefix, animWidePrefix) : strcpy(tempAnimPrefix, animPrefix); + const INT32 tempFoundAnimVoteFrames = widePatch ? foundAnimVoteWideFrames : foundAnimVoteFrames; // Just in case someone provides LESS widescreen frames than normal frames or vice versa, reset the frame counter to 0 - if (widePatch) - { - if (currentAnimFrame > foundAnimVoteWideFrames-1) - currentAnimFrame = 0; - } - else - { - if (currentAnimFrame > foundAnimVoteFrames-1) - currentAnimFrame = 0; - } + if (currentAnimFrame > tempFoundAnimVoteFrames - 1) + currentAnimFrame = 0; patch_t *background = W_CachePatchName(va("%s%d", tempAnimPrefix, currentAnimFrame + 1), PU_CACHE); V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(background->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) @@ -973,23 +965,27 @@ void Y_VoteDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - if (widebgpatch && vid.width / vid.dupx > 320) + const boolean widescreen = (vid.width / vid.dupx > 320); + + if (foundAnimVoteWideFrames && widescreen) { - if (foundAnimVoteWideFrames == 0) - V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(widebgpatch->width)/2), - (vid.height / vid.dupy) - SHORT(widebgpatch->height), - V_SNAPTOTOP|V_SNAPTOLEFT, widebgpatch); - else - Y_DrawAnimatedVoteScreenPatch(true); + Y_DrawAnimatedVoteScreenPatch(true); + } + else if (foundAnimVoteFrames) + { + Y_DrawAnimatedVoteScreenPatch(false); + } + else if (widebgpatch && widescreen) + { + V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(widebgpatch->width)/2), + (vid.height / vid.dupy) - SHORT(widebgpatch->height), + V_SNAPTOTOP|V_SNAPTOLEFT, widebgpatch); } else { - if (foundAnimVoteFrames == 0) - V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(bgpatch->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) - (vid.height / vid.dupy) - SHORT(bgpatch->height), - V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); - else - Y_DrawAnimatedVoteScreenPatch(false); + V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(bgpatch->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) + (vid.height / vid.dupy) - SHORT(bgpatch->height), + V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); } for (i = 0; i < 4; i++) // First, we need to figure out the height of this thing... -- 2.54.0 From 1e972cbb658f0227dd289e7a543d84a6dbf763b2 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 25 Jan 2025 22:44:22 +0100 Subject: [PATCH 181/325] reduce scope of those makes it look slightly neater --- src/screen.c | 18 ++++++++++-------- src/y_inter.c | 3 +-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/screen.c b/src/screen.c index 249c7225c..6b25c2ce0 100644 --- a/src/screen.c +++ b/src/screen.c @@ -443,22 +443,20 @@ void SCR_CalculateFPS(void) void SCR_DisplayTicRate(void) { - const UINT8 *ticcntcolor = NULL; UINT32 cap = R_GetFramerateCap(); UINT32 benchmark = (cap == 0) ? I_GetRefreshRate() : cap; - INT32 x = 318; double fps = round(averageFPS); INT32 fpsflags = V_LocalTransFlag()|V_SNAPTOBOTTOM|V_SNAPTORIGHT; - const char *fps_string; - - INT32 ticcntcolor2 = 0; - + if (gamestate == GS_NULL) return; // new kart counter if (cv_ticrate.value == 1 || cv_ticrate.value == 2) { + const UINT8 *ticcntcolor = NULL; + INT32 x = 318; + // draw "FPS" if (cv_ticrate.value == 1) V_DrawFixedPatch(306< (benchmark - 5)) ticcntcolor2 = V_GREENMAP; else if (fps < 20) @@ -502,7 +503,8 @@ void SCR_DisplayTicRate(void) fps_string = va("%d/%d\x82", (INT32)fps, cap); else fps_string = va("%d\x82", (INT32)fps); - + + // draw "FPS" if (cv_ticrate.value == 3) V_DrawRightAlignedString(319, 181, V_YELLOWMAP|fpsflags, "FPS"); @@ -518,7 +520,7 @@ void SCR_DisplayLocalPing(void) UINT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P INT32 pingflags = V_LocalTransFlag()|V_SNAPTOBOTTOM|V_SNAPTORIGHT; - if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level + if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain diff --git a/src/y_inter.c b/src/y_inter.c index 86072e904..77e49f206 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -314,7 +314,7 @@ static void Y_AnimatedVoteScreenCheck(void) currentAnimFrame = 0; INT32 i = 1; - while(!stopSearching) + while (!stopSearching) { boolean normalLumpExists = W_LumpExists(va("%sC%d", tmpPrefix, i)); boolean wideLumpExists = W_LumpExists(va("%sW%d", tmpPrefix, i)); @@ -414,7 +414,6 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) else faceprefix = (cv_highresportrait.value ? localfacewantprefix[skinnum] : localfacerankprefix[skinnum]); - if (cv_highresportrait.value) V_DrawSmallMappedPatch(x + 16, y - 4, 0, faceprefix, colormap); else -- 2.54.0 From 2ebf66b99c046d00797e409e5ec7f7454dca0bbb Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 19:33:35 +0100 Subject: [PATCH 182/325] kill P_TeleportMove P_MoveOrigin literally just calls that so replace it with that --- src/p_map.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 1f21d8ccb..00a3bb1b2 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -76,9 +76,9 @@ camera_t *mapcampointer; // // -// P_TeleportMove +// P_MoveOrigin - P_TeleportMove which KEEPS interpolation values. // -static boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z) +boolean P_MoveOrigin(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z) { // the move is ok, // so link the thing into its new position @@ -108,28 +108,19 @@ static boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z) return true; } +// // P_SetOrigin - P_TeleportMove which RESETS interpolation values. // boolean P_SetOrigin(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z) { - boolean result = P_TeleportMove(thing, x, y, z); - - if (result == true) + if (P_MoveOrigin(thing, x, y, z)) { thing->old_x = thing->x; thing->old_y = thing->y; thing->old_z = thing->z; } - return result; -} - -// -// P_MoveOrigin - P_TeleportMove which KEEPS interpolation values. -// -boolean P_MoveOrigin(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z) -{ - return P_TeleportMove(thing, x, y, z); + return true; } // ========================================================================= -- 2.54.0 From 2f5648729058c70f1fe35a283e5d6cb589f54142 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 20:40:05 +0100 Subject: [PATCH 183/325] assign player later --- src/p_tick.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_tick.c b/src/p_tick.c index 5909a8c59..e9ea16ed0 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -383,8 +383,6 @@ static void P_DeviceRumbleTick(void) UINT16 low = 0; UINT16 high = 0; - player_t *player = ((i == 0) ? &players[consoleplayer] : &players[displayplayers[i]]); - if (!cv_usejoystick[i].value) { continue; @@ -395,6 +393,8 @@ static void P_DeviceRumbleTick(void) continue; } + player_t *player = ((i == 0) ? &players[consoleplayer] : &players[displayplayers[i]]); + if (player->spectator) { continue; -- 2.54.0 From a1d5a2e1f97c8b404990d004cbf31959118a7d4c Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 19:45:23 +0100 Subject: [PATCH 184/325] simplify camtoggledelay and spectatedelay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit just make em an array and use lööp --- src/g_game.c | 59 ++++++++++++++++++++++----------------------------- src/p_local.h | 2 +- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index cfc99b9a8..b8f793b7f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1269,8 +1269,8 @@ static void G_DoLoadLevel(boolean resetplayer) } static INT32 pausedelay = 0; -static INT32 camtoggledelay, camtoggledelay2, camtoggledelay3, camtoggledelay4 = 0; -static INT32 spectatedelay, spectatedelay2, spectatedelay3, spectatedelay4 = 0; +static INT32 camtoggledelay[MAXSPLITSCREENPLAYERS] = {0,0,0,0}; +static INT32 spectatedelay[MAXSPLITSCREENPLAYERS] = {0,0,0,0}; // // G_Responder @@ -1451,72 +1451,72 @@ boolean G_Responder(event_t *ev) if (ev->data1 == gamecontrol[gc_camtoggle][0] || ev->data1 == gamecontrol[gc_camtoggle][1]) { - if (!camtoggledelay) + if (!camtoggledelay[0]) { - camtoggledelay = NEWTICRATE / 7; + camtoggledelay[0] = NEWTICRATE / 7; CV_SetValue(&cv_chasecam[0], cv_chasecam[0].value ? 0 : 1); } } if (ev->data1 == gamecontrolbis[gc_camtoggle][0] || ev->data1 == gamecontrolbis[gc_camtoggle][1]) { - if (!camtoggledelay2) + if (!camtoggledelay[1]) { - camtoggledelay2 = NEWTICRATE / 7; + camtoggledelay[1] = NEWTICRATE / 7; CV_SetValue(&cv_chasecam[1], cv_chasecam[1].value ? 0 : 1); } } if (ev->data1 == gamecontrol3[gc_camtoggle][0] || ev->data1 == gamecontrol3[gc_camtoggle][1]) { - if (!camtoggledelay3) + if (!camtoggledelay[2]) { - camtoggledelay3 = NEWTICRATE / 7; + camtoggledelay[2] = NEWTICRATE / 7; CV_SetValue(&cv_chasecam[2], cv_chasecam[2].value ? 0 : 1); } } if (ev->data1 == gamecontrol4[gc_camtoggle][0] || ev->data1 == gamecontrol4[gc_camtoggle][1]) { - if (!camtoggledelay4) + if (!camtoggledelay[3]) { - camtoggledelay4 = NEWTICRATE / 7; + camtoggledelay[3] = NEWTICRATE / 7; CV_SetValue(&cv_chasecam[3], cv_chasecam[3].value ? 0 : 1); } } if (ev->data1 == gamecontrol[gc_spectate][0] || ev->data1 == gamecontrol[gc_spectate][1]) { - if (!spectatedelay) + if (!spectatedelay[0]) { - spectatedelay = NEWTICRATE / 7; + spectatedelay[0] = NEWTICRATE / 7; COM_ImmedExecute("changeteam spectator"); } } if (ev->data1 == gamecontrolbis[gc_spectate][0] || ev->data1 == gamecontrolbis[gc_spectate][1]) { - if (!spectatedelay2) + if (!spectatedelay[1]) { - spectatedelay2 = NEWTICRATE / 7; + spectatedelay[1] = NEWTICRATE / 7; COM_ImmedExecute("changeteam2 spectator"); } } if (ev->data1 == gamecontrol3[gc_spectate][0] || ev->data1 == gamecontrol3[gc_spectate][1]) { - if (!spectatedelay3) + if (!spectatedelay[2]) { - spectatedelay3 = NEWTICRATE / 7; + spectatedelay[2] = NEWTICRATE / 7; COM_ImmedExecute("changeteam3 spectator"); } } if (ev->data1 == gamecontrol4[gc_spectate][0] || ev->data1 == gamecontrol4[gc_spectate][1]) { - if (!spectatedelay4) + if (!spectatedelay[3]) { - spectatedelay4 = NEWTICRATE / 7; + spectatedelay[3] = NEWTICRATE / 7; COM_ImmedExecute("changeteam4 spectator"); } } @@ -1953,23 +1953,14 @@ void G_Ticker(boolean run) if (pausedelay) pausedelay--; - if (camtoggledelay) - camtoggledelay--; - if (camtoggledelay2) - camtoggledelay2--; - if (camtoggledelay3) - camtoggledelay3--; - if (camtoggledelay4) - camtoggledelay4--; + for (UINT8 j = 0; j < MAXSPLITSCREENPLAYERS;j++) + { + if (camtoggledelay[i]) + camtoggledelay[i]--; - if (spectatedelay) - spectatedelay--; - if (spectatedelay2) - spectatedelay2--; - if (spectatedelay3) - spectatedelay3--; - if (spectatedelay4) - spectatedelay4--; + if (spectatedelay[i]) + spectatedelay[i]--; + } if (gametic % NAMECHANGERATE == 0) { diff --git a/src/p_local.h b/src/p_local.h index 95f15243c..fd2af3e70 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -299,7 +299,7 @@ void P_ColorTeamMissile(mobj_t *missile, player_t *source); // Special utility to return +1 or -1 depending on mobj's gravity FUNCINLINE static ATTRINLINE SINT8 P_MobjFlip(const mobj_t *mobj) { - return (mobj && mobj->eflags & MFE_VERTICALFLIP) ? -1 : 1; + return (mobj && (mobj->eflags & MFE_VERTICALFLIP)) ? -1 : 1; } fixed_t P_GetMobjGravity(mobj_t *mo); -- 2.54.0 From 8ccb747dcddab13b3e6de18f0922f74c749e51e5 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 20:16:32 +0100 Subject: [PATCH 185/325] j moment --- src/g_game.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index b8f793b7f..419704b70 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1955,11 +1955,11 @@ void G_Ticker(boolean run) for (UINT8 j = 0; j < MAXSPLITSCREENPLAYERS;j++) { - if (camtoggledelay[i]) - camtoggledelay[i]--; + if (camtoggledelay[j]) + camtoggledelay[j]--; - if (spectatedelay[i]) - spectatedelay[i]--; + if (spectatedelay[j]) + spectatedelay[j]--; } if (gametic % NAMECHANGERATE == 0) -- 2.54.0 From 305d408e021ed652063cf69958312821b5420ee2 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 26 Jan 2025 16:18:41 +0100 Subject: [PATCH 186/325] forgor about the banan spin --- src/p_mobj.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index e2099c861..d21afd0d8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7060,8 +7060,22 @@ void P_MobjThinker(mobj_t *mobj) } break; //{ SRB2kart Items - Death States - case MT_ORBINAUT: case MT_BANANA: + { + if (cv_sloperoll.value == 2 && cv_bananthrowroll.value) + { + angle_t spin = FixedMul(FixedDiv(abs(mobj->momz), 8 * mobj->scale), ANGLE_67h); + //mobj->angle -= spin; + + if (cv_bananthrowroll.value == 1) + mobj->sloperoll += spin; // im lazy but this makes sure the banan goes back to upright when it lands lmao + else if (cv_bananthrowroll.value == 2) + mobj->rollangle += spin; + + //if (P_IsObjectOnGround(mobj) && mobj->momz * P_MobjFlip(mobj) <= 0) + } + } + case MT_ORBINAUT: case MT_EGGMANITEM: case MT_SPB: if (P_IsObjectOnGround(mobj)) @@ -7802,6 +7816,18 @@ void P_MobjThinker(mobj_t *mobj) break; } case MT_BANANA: + if (cv_sloperoll.value == 2 && cv_bananthrowroll.value && !P_IsObjectOnGround(mobj)) + { + // tilt n tumble + angle_t spin = FixedMul(FixedDiv(mobj->momz, 8 * mobj->scale), ANGLE_67h); + //mobj->angle += spin; + + if (cv_bananthrowroll.value == 1) + mobj->sloperoll -= spin; // im lazy but this makes sure the banan goes back to upright when it lands lmao + else if (cv_bananthrowroll.value == 2) + mobj->rollangle -= spin; + } + case MT_EGGMANITEM: mobj->friction = ORIG_FRICTION/4; if (mobj->momx || mobj->momy) -- 2.54.0 From 520f92e892c25681872e736ec41debdae8087672 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 26 Jan 2025 17:57:27 +0100 Subject: [PATCH 187/325] handle vote bg fallbacks more gracefully if someone doesent provide a widescreen patch it now falls back to the replaced non widescreen one and vice versa instead of just falling back to what vanilla provides --- src/p_setup.c | 41 +++++++++++++++++++++++++++++++ src/p_setup.h | 5 ++++ src/y_inter.c | 67 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 90 insertions(+), 23 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 3b2ed7714..652062079 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3074,6 +3074,12 @@ boolean P_AddWadFileLocal(const char *wadfilename) return true; } +// check for replacement votescreen backgrounds +boolean wideracereplaced = false; +boolean racereplaced = false; +boolean widebattlereplaced = false; +boolean battlereplaced = false; + // // Add a WAD file and do the per-WAD setup stages. // Call P_MultiSetupWadFiles as soon as possible after any number of these. @@ -3198,6 +3204,41 @@ UINT16 P_PartialAddWadFile(const char *wadfilename, boolean local) // TODO: Experimental SPRTINFO support, test first R_LoadSpriteInfoLumps(wadnum, wadfiles[wadnum]->numlumps); + // + // check for votescreen replacements + // + lumpinfo = wadfiles[wadnum]->lumpinfo; + for (i = 0; i < numlumps; i++, lumpinfo++) + { + name = lumpinfo->name; + + // widescreen patch Race + if (!wideracereplaced && !strncmp(name, "INTERSCW", 8)) + { + wideracereplaced = true; + continue; + } + + if (!racereplaced && !strncmp(name, "INTERSCR", 8)) + { + racereplaced = true; + continue; + } + + // widescreen patch Battle + if (!widebattlereplaced && !strncmp(name, "BATTLSCW", 8)) + { + widebattlereplaced = true; + continue; + } + + if (!battlereplaced && !strncmp(name, "BATTLSCR", 8)) + { + battlereplaced = true; + continue; + } + } + refreshdirmenu &= ~REFRESHDIR_GAMEDATA; // Under usual circumstances we'd wait for REFRESHDIR_GAMEDATA to disappear the next frame, but it's a bit too dangerous for that... partadd_stage = 0; return wadnum; diff --git a/src/p_setup.h b/src/p_setup.h index 7f90564e0..e40169a76 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -67,6 +67,11 @@ void HWR_LoadLevel(void); boolean P_AddWadFile(const char *wadfilename, boolean local); boolean P_AddWadFileLocal(const char *wadfilename); +extern boolean wideracereplaced; +extern boolean racereplaced; +extern boolean widebattlereplaced; +extern boolean battlereplaced; + // WARNING: The following functions should be grouped as follows: // any amount of PartialAdds followed by MultiSetups until returned true, // as soon as possible. diff --git a/src/y_inter.c b/src/y_inter.c index 115967509..2603db48a 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -920,7 +920,7 @@ static void Y_UnloadData(void) // // Draw animated patch based on frame counter on vote screen // -static inline void Y_DrawAnimatedVoteScreenPatch(boolean widePatch) +static void Y_DrawAnimatedVoteScreenPatch(boolean widePatch) { char tempAnimPrefix[7]; widePatch ? strcpy(tempAnimPrefix, animWidePrefix) : strcpy(tempAnimPrefix, animPrefix); @@ -939,6 +939,47 @@ static inline void Y_DrawAnimatedVoteScreenPatch(boolean widePatch) currentAnimFrame = (currentAnimFrame + 1 > tempFoundAnimVoteFrames - 1) ? 0 : currentAnimFrame + 1; } +static void Y_DrawVoteScreenPatch(void) +{ + const boolean widescreen = (vid.width / vid.dupx > 320); + const boolean animvote = (foundAnimVoteWideFrames || foundAnimVoteFrames); + + if (animvote) + { + Y_DrawAnimatedVoteScreenPatch((foundAnimVoteWideFrames && widescreen)); + return; + } + + patch_t *votebg = bgpatch; + UINT8 prefgametype = (votelevels[0][1] & ~0x80); + const boolean widebgreplaced = (prefgametype == GT_MATCH) ? widebattlereplaced : wideracereplaced; + const boolean bgreplaced = (prefgametype == GT_MATCH) ? battlereplaced : racereplaced; + + // this is horrid + if (widescreen) + { + if (widebgreplaced) + votebg = widebgpatch; + else if (bgreplaced) + votebg = bgpatch; + else + votebg = widebgpatch; + } + else + { + if (bgreplaced) + votebg = bgpatch; + else if (widebgreplaced) + votebg = widebgpatch; + else + votebg = bgpatch; + } + + V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(votebg->width)/2), + (vid.height / vid.dupy) - SHORT(votebg->height), + V_SNAPTOTOP|V_SNAPTOLEFT, votebg); +} + // // Y_VoteDrawer // @@ -965,28 +1006,8 @@ void Y_VoteDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - const boolean widescreen = (vid.width / vid.dupx > 320); - - if (foundAnimVoteWideFrames && widescreen) - { - Y_DrawAnimatedVoteScreenPatch(true); - } - else if (foundAnimVoteFrames) - { - Y_DrawAnimatedVoteScreenPatch(false); - } - else if (widebgpatch && widescreen) - { - V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(widebgpatch->width)/2), - (vid.height / vid.dupy) - SHORT(widebgpatch->height), - V_SNAPTOTOP|V_SNAPTOLEFT, widebgpatch); - } - else - { - V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(bgpatch->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) - (vid.height / vid.dupy) - SHORT(bgpatch->height), - V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); - } + // decides which votebg to draw and draws it + Y_DrawVoteScreenPatch(); for (i = 0; i < 4; i++) // First, we need to figure out the height of this thing... { -- 2.54.0 From a2c1fa5e233791881f9bd5721227b395cf290b02 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 26 Jan 2025 18:18:23 +0100 Subject: [PATCH 188/325] delet if else hell --- src/y_inter.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 2603db48a..42fdb346f 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -950,29 +950,16 @@ static void Y_DrawVoteScreenPatch(void) return; } - patch_t *votebg = bgpatch; + patch_t *votebg = bgpatch; // non widescreen patch + UINT8 prefgametype = (votelevels[0][1] & ~0x80); const boolean widebgreplaced = (prefgametype == GT_MATCH) ? widebattlereplaced : wideracereplaced; const boolean bgreplaced = (prefgametype == GT_MATCH) ? battlereplaced : racereplaced; - // this is horrid - if (widescreen) + if ((widescreen && (widebgreplaced || !bgreplaced)) + || (!widescreen && (widebgreplaced && !bgreplaced))) { - if (widebgreplaced) - votebg = widebgpatch; - else if (bgreplaced) - votebg = bgpatch; - else - votebg = widebgpatch; - } - else - { - if (bgreplaced) - votebg = bgpatch; - else if (widebgreplaced) - votebg = widebgpatch; - else - votebg = bgpatch; + votebg = widebgpatch; } V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(votebg->width)/2), -- 2.54.0 From 5edb0d0e3d80c3d9e9f26aced7dcc6fec60cc590 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 26 Jan 2025 17:29:19 +0100 Subject: [PATCH 189/325] fall through deez --- src/p_mobj.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index d21afd0d8..45688e510 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7061,7 +7061,6 @@ void P_MobjThinker(mobj_t *mobj) break; //{ SRB2kart Items - Death States case MT_BANANA: - { if (cv_sloperoll.value == 2 && cv_bananthrowroll.value) { angle_t spin = FixedMul(FixedDiv(abs(mobj->momz), 8 * mobj->scale), ANGLE_67h); @@ -7074,7 +7073,7 @@ void P_MobjThinker(mobj_t *mobj) //if (P_IsObjectOnGround(mobj) && mobj->momz * P_MobjFlip(mobj) <= 0) } - } + /* FALLTHRU */ case MT_ORBINAUT: case MT_EGGMANITEM: case MT_SPB: @@ -7827,7 +7826,7 @@ void P_MobjThinker(mobj_t *mobj) else if (cv_bananthrowroll.value == 2) mobj->rollangle -= spin; } - + /* FALLTHRU */ case MT_EGGMANITEM: mobj->friction = ORIG_FRICTION/4; if (mobj->momx || mobj->momy) -- 2.54.0 From 7016b77ee89f52cc68cd0fd196ed1171ffa13d7a Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 26 Jan 2025 21:17:20 +0100 Subject: [PATCH 190/325] also rotate eggboxes in air --- src/p_mobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 45688e510..0334f7925 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7815,6 +7815,7 @@ void P_MobjThinker(mobj_t *mobj) break; } case MT_BANANA: + case MT_EGGMANITEM: if (cv_sloperoll.value == 2 && cv_bananthrowroll.value && !P_IsObjectOnGround(mobj)) { // tilt n tumble @@ -7826,8 +7827,7 @@ void P_MobjThinker(mobj_t *mobj) else if (cv_bananthrowroll.value == 2) mobj->rollangle -= spin; } - /* FALLTHRU */ - case MT_EGGMANITEM: + mobj->friction = ORIG_FRICTION/4; if (mobj->momx || mobj->momy) P_SpawnGhostMobj(mobj); -- 2.54.0 From 5215fa47476d0a8ec42b96157ff8073668a1977c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 11:21:23 +0100 Subject: [PATCH 191/325] smol optimization comparePolygon return slightly earlier for skywalls and horizonlines --- src/hardware/hw_batching.c | 40 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/src/hardware/hw_batching.c b/src/hardware/hw_batching.c index 82cfd31db..3a8161ab3 100644 --- a/src/hardware/hw_batching.c +++ b/src/hardware/hw_batching.c @@ -141,27 +141,19 @@ static int comparePolygons(const void *p1, const void *p2) PolygonArrayEntry *poly2 = *(PolygonArrayEntry *const *)p2; int diff; INT64 diff64; - UINT32 downloaded1 = 0; - UINT32 downloaded2 = 0; - int shader1 = poly1->shader; - int shader2 = poly2->shader; - // make skywalls and horizon lines first in order - if (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) - shader1 = -1; - if (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) - shader2 = -1; - diff = shader1 - shader2; - if (diff != 0) return diff; + int shader1 = (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? -1 : poly1->shader; + int shader2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? -1 : poly2->shader; // skywalls and horizon lines must retain their order for horizon lines to work if (shader1 == -1 && shader2 == -1) return poly1 - poly2; - if (poly1->texture) - downloaded1 = poly1->texture->downloaded; // there should be a opengl texture name here, usable for comparisons - if (poly2->texture) - downloaded2 = poly2->texture->downloaded; + diff = shader1 - shader2; + if (diff != 0) return diff; + + UINT32 downloaded1 = poly1->texture ? poly1->texture->downloaded : 0; // there should be a opengl texture name here, usable for comparisons + UINT32 downloaded2 = poly2->texture ? poly2->texture->downloaded : 0; diff64 = downloaded1 - downloaded2; if (diff64 != 0) return diff64; @@ -190,21 +182,15 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2) int diff; INT64 diff64; - GLMipmap_t *texture1 = poly1->texture; - GLMipmap_t *texture2 = poly2->texture; - UINT32 downloaded1 = 0; - UINT32 downloaded2 = 0; - if (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) - texture1 = NULL; - if (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) - texture2 = NULL; - if (texture1) - downloaded1 = texture1->downloaded; // there should be a opengl texture name here, usable for comparisons - if (texture2) - downloaded2 = texture2->downloaded; + GLMipmap_t *texture1 = (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? NULL : poly1->texture; + GLMipmap_t *texture2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? NULL : poly2->texture; + // skywalls and horizon lines must retain their order for horizon lines to work if (!texture1 && !texture2) return poly1 - poly2; + + UINT32 downloaded1 = texture1 ? texture1->downloaded : 0; // there should be a opengl texture name here, usable for comparisons + UINT32 downloaded2 = texture2 ? texture2->downloaded : 0; diff64 = downloaded1 - downloaded2; if (diff64 != 0) return diff64; -- 2.54.0 From 80f7ddfb312e619ac91ffc5b417c0d591f2a571c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 14:54:49 +0100 Subject: [PATCH 192/325] i hate conditions --- src/s_sound.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/s_sound.c b/src/s_sound.c index ce856b36c..b55d59853 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -2005,7 +2005,10 @@ void S_InitMapMusic(void) { char *maptitle = G_BuildMapTitle(gamemap); // for some reason, occasionally the title screen music doesent seem to be reset in time, so skipping the intro may make it just continue playing it instead, weird.. - skipintromus = (stricmp(music_name, "titles") != 0) && (maptitle && (stricmp(maptitle, "Wandering Falls") != 0)); // thanks diggle! + skipintromus = true; + if (!stricmp(music_name, "titles") || (maptitle && (!stricmp(maptitle, "Wandering Falls")))) // thanks diggle! + skipintromus = false; + if (maptitle) Z_Free(maptitle); } -- 2.54.0 From 9872640e778ec97c373ffa125763e34bff9ae25b Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 15:32:47 +0100 Subject: [PATCH 193/325] the music system is truly amazing --- src/p_spec.c | 2 +- src/s_sound.c | 31 ++++++++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 1051c6103..78fdb9e12 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2080,7 +2080,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 413: // Change music - if (keepmusic && (leveltime <= MUSICSTARTTIME)) //why check for starttime? cause encore music Zzz... + if (keepmusic && (leveltime <= MUSICSTARTTIME)) // why check for starttime? cause encore music Zzz... return; //if (cv_ignoremusicchanges.value && (leveltime >= MUSICSTARTTIME) && !fromlapexec) // keep lap music intanct tho diff --git a/src/s_sound.c b/src/s_sound.c index b55d59853..4c20019d0 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1728,6 +1728,9 @@ static void S_ChangeMusicToQueue(void) S_ClearQueue(); } +static boolean skipmusic = false; +static boolean S_CheckMusicException(const char *music); + void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 position, UINT32 prefadems, UINT32 fadeinms) { char newmusic[7] = {0}; @@ -1748,6 +1751,8 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 strncpy(newmusic, mmusic, 6); + skipmusic = S_CheckMusicException(newmusic); + if (LUA_HookMusicChange(music_name, &hook_param)) return; @@ -1944,6 +1949,20 @@ static const char *musicexception_list[] = { "CHRSHF", "CHRSHP" // no clue what those are tbh }; +// check if the current music is smth we dont want to keep (vote music, etc) +static boolean S_CheckMusicException(const char *music) +{ + for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++) + { + if (!stricmp(music, musicexception_list[i])) + { + return true; + } + } + + return false; +} + void S_ResetKeepAndSpecialMus(void) { keepmusic = skipintromus = false; @@ -1961,17 +1980,7 @@ void S_KeepMusic(void) } else if (oldmap == gamemap && oldencore == encoremode) { - keepmusic = true; - - // check if the current music is smth we dont want to keep (vote music, etc) - for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++) - { - if (stricmp(music_name, musicexception_list[i]) == 0) - { - keepmusic = false; - break; - } - } + keepmusic = !skipmusic && !S_CheckMusicException(music_name); // have to recheck cause lua may have overwritten initial music_change } oldencore = encoremode; -- 2.54.0 From 22c48f19bab8895a629ef739d9d881d1eb3b38e8 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 16:11:53 +0100 Subject: [PATCH 194/325] grow an invinc music also broke stuff cant put it into the music exception list, otherwise it will always disable keepmusic when either one was used even once --- 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 4c20019d0..99d3a7e8b 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1980,7 +1980,7 @@ void S_KeepMusic(void) } else if (oldmap == gamemap && oldencore == encoremode) { - keepmusic = !skipmusic && !S_CheckMusicException(music_name); // have to recheck cause lua may have overwritten initial music_change + keepmusic = !skipmusic && !S_CheckMusicException(music_name) && stricmp(music_name, "kgrow") && stricmp(music_name, "kinvnc"); // have to recheck cause lua may have overwritten initial music_change } oldencore = encoremode; -- 2.54.0 From 6276243cc4371c8f8e79e5b3e79fbd58c99b360a Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 16:43:48 +0100 Subject: [PATCH 195/325] just keep a copy of musicchange before the lua hook keep music can check for what was it stuff changed last to --- src/s_sound.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index 99d3a7e8b..be9e10234 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1728,8 +1728,9 @@ static void S_ChangeMusicToQueue(void) S_ClearQueue(); } -static boolean skipmusic = false; -static boolean S_CheckMusicException(const char *music); +// keep copy of music name before lua hook change +// for custom vote music etc +static char checkmusic[7] = {0}; void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 position, UINT32 prefadems, UINT32 fadeinms) { @@ -1750,8 +1751,7 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 return; strncpy(newmusic, mmusic, 6); - - skipmusic = S_CheckMusicException(newmusic); + strncpy(checkmusic, mmusic, 6); if (LUA_HookMusicChange(music_name, &hook_param)) return; @@ -1945,16 +1945,17 @@ static const char *musicexception_list[] = { "vote", "voteea", "voteeb", "racent", "krwin", "krok", "krlose", "krfail", "kbwin", "kbok", "kblose", "kstart", "estart", "wait2j", "titles", + "kinvnc", "kgrow", // grow and invinc "SPBA_W", "SPBA_L", // SPB Attack music - "CHRSHF", "CHRSHP" // no clue what those are tbh + "CHRSHF", "CHRSHP" // no clue what those are tbh }; // check if the current music is smth we dont want to keep (vote music, etc) -static boolean S_CheckMusicException(const char *music) +static boolean S_CheckMusicException(void) { for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++) { - if (!stricmp(music, musicexception_list[i])) + if (!stricmp(music_name, musicexception_list[i]) || !stricmp(checkmusic, musicexception_list[i])) { return true; } @@ -1980,7 +1981,7 @@ void S_KeepMusic(void) } else if (oldmap == gamemap && oldencore == encoremode) { - keepmusic = !skipmusic && !S_CheckMusicException(music_name) && stricmp(music_name, "kgrow") && stricmp(music_name, "kinvnc"); // have to recheck cause lua may have overwritten initial music_change + keepmusic = !S_CheckMusicException(); } oldencore = encoremode; -- 2.54.0 From 50fced2867b4374d497c105e16a038bebff8651f Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 21 Jan 2025 00:50:21 +0100 Subject: [PATCH 196/325] =?UTF-8?q?use=20SRB2.2=C2=B4s=20logging=20system?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - creates a new logfile each start instead of overwriting it everytime --- src/filesrch.c | 2 +- src/m_misc.c | 91 +++++++++++++++++++++++++++++++++ src/m_misc.h | 5 ++ src/sdl/i_main.c | 123 ++++++++++++++++++++++++++++++++++++--------- src/sdl/i_system.c | 45 +++++++++++++++++ 5 files changed, 241 insertions(+), 25 deletions(-) diff --git a/src/filesrch.c b/src/filesrch.c index 84766f395..8af9118ba 100644 --- a/src/filesrch.c +++ b/src/filesrch.c @@ -797,7 +797,7 @@ boolean preparefilemenu(boolean samedepth, boolean replayhut) } else if (ext == EXT_TXT) { - if (!strcmp(dent->d_name, "log.txt") || !strcmp(dent->d_name, "errorlog.txt")) + if (!strncmp(dent->d_name, "log-", 4) || !strcmp(dent->d_name, "errorlog.txt")) ext |= EXT_LOADED; } diff --git a/src/m_misc.c b/src/m_misc.c index a3768120d..6e6658a0a 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -2076,3 +2076,94 @@ const char *M_FileError(FILE *fp) else return "end-of-file"; } + +/** Return the number of parts of this path. +*/ +int M_PathParts(const char *path) +{ + int n; + const char *p; + const char *t; + if (path == NULL) + return 0; + for (n = 0, p = path ;; ++n) + { + t = p; + if (( p = strchr(p, PATHSEP[0]) )) + p += strspn(p, PATHSEP); + else + { + if (*t)/* there is something after the final delimiter */ + n++; + break; + } + } + return n; +} + +/** Check whether a path is an absolute path. +*/ +boolean M_IsPathAbsolute(const char *path) +{ +#ifdef _WIN32 + return ( strncmp(&path[1], ":\\", 2) == 0 ); +#else + return ( path[0] == '/' ); +#endif +} + +/** I_mkdir for each part of the path. +*/ +void M_MkdirEachUntil(const char *cpath, int start, int end, int mode) +{ + char path[MAX_WADPATH]; + char *p; + char *t; + + if (end > 0 && end <= start) + return; + + strlcpy(path, cpath, sizeof path); +#ifdef _WIN32 + if (strncmp(&path[1], ":\\", 2) == 0) + p = &path[3]; + else +#endif + p = path; + + if (end > 0) + end -= start; + + for (; start > 0; --start) + { + p += strspn(p, PATHSEP); + if (!( p = strchr(p, PATHSEP[0]) )) + return; + } + p += strspn(p, PATHSEP); + for (;;) + { + if (end > 0 && !--end) + break; + + t = p; + if (( p = strchr(p, PATHSEP[0]) )) + { + *p = '\0'; + I_mkdir(path, mode); + *p = PATHSEP[0]; + p += strspn(p, PATHSEP); + } + else + { + if (*t) + I_mkdir(path, mode); + break; + } + } +} + +void M_MkdirEach(const char *path, int start, int mode) +{ + M_MkdirEachUntil(path, start, -1, mode); +} diff --git a/src/m_misc.h b/src/m_misc.h index c858ae128..a84493ee1 100644 --- a/src/m_misc.h +++ b/src/m_misc.h @@ -99,6 +99,11 @@ void strcatbf(char *s1, const char *s2, const char *s3); const char *M_FileError(FILE *handle); +int M_PathParts (const char *path); +boolean M_IsPathAbsolute (const char *path); +void M_MkdirEach (const char *path, int start, int mode); +void M_MkdirEachUntil (const char *path, int start, int end, int mode); + // counting bits, for weapon ammo code, usually FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size); diff --git a/src/sdl/i_main.c b/src/sdl/i_main.c index 1d2e2395f..d6a007919 100644 --- a/src/sdl/i_main.c +++ b/src/sdl/i_main.c @@ -20,12 +20,19 @@ #include "../doomdef.h" #include "../m_argv.h" #include "../d_main.h" +#include "../m_misc.h"/* path shit */ #include "../i_system.h" -#ifdef __GNUC__ +#if defined (__GNUC__) || defined (__unix__) #include #endif +#ifdef __unix__ +#include +#endif + +#include "time.h" // For log timestamps + #ifdef HAVE_SDL #ifdef HAVE_TTF @@ -89,6 +96,93 @@ ChDirToExe (void) } #endif +#ifdef LOGMESSAGES +static void InitLogging(void) +{ + const char *logdir = NULL; + time_t my_time; + struct tm * timeinfo; + const char *format; + const char *reldir; + int left; + boolean fileabs; +#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) + const char *link; +#endif + + logdir = D_Home(); + + my_time = time(NULL); + timeinfo = localtime(&my_time); + + if (M_CheckParm("-logfile") && M_IsNextParm()) + { + format = M_GetNextParm(); + fileabs = M_IsPathAbsolute(format); + } + else + { + format = "log-%Y-%m-%d_%H-%M-%S.txt"; + fileabs = false; + } + + if (fileabs) + { + strftime(logfilename, sizeof logfilename, format, timeinfo); + } + else + { + if (M_CheckParm("-logdir") && M_IsNextParm()) + reldir = M_GetNextParm(); + else + reldir = "logs"; + + if (M_IsPathAbsolute(reldir)) + { + left = snprintf(logfilename, sizeof logfilename, + "%s"PATHSEP, reldir); + } + else +#ifdef DEFAULTDIR + if (logdir) + { + left = snprintf(logfilename, sizeof logfilename, + "%s"PATHSEP DEFAULTDIR PATHSEP"%s"PATHSEP, logdir, reldir); + } + else +#endif/*DEFAULTDIR*/ + { + left = snprintf(logfilename, sizeof logfilename, + "."PATHSEP"%s"PATHSEP, reldir); + } + + strftime(&logfilename[left], sizeof logfilename - left, + format, timeinfo); + } + + M_MkdirEachUntil(logfilename, + M_PathParts(logdir) - 1, + M_PathParts(logfilename) - 1, 0755); + +#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) + logstream = fopen(logfilename, "w"); +#ifdef DEFAULTDIR + if (logdir) + link = va("%s/"DEFAULTDIR"/latest-log.txt", logdir); + else +#endif/*DEFAULTDIR*/ + link = "latest-log.txt"; + unlink(link); + if (symlink(logfilename, link) == -1) + { + I_OutputMsg("Error symlinking latest-log.txt: %s\n", strerror(errno)); + } +#else/*defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)*/ + logstream = fopen("latest-log.txt", "wt+"); +#endif/*defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)*/ +} +#endif + /** \brief The main function @@ -107,7 +201,6 @@ int SDL_main(int argc, char **argv) int main(int argc, char **argv) #endif { - const char *logdir = NULL; myargc = argc; myargv = argv; /// \todo pull out path to exe from this string @@ -136,36 +229,18 @@ int main(int argc, char **argv) ChDirToExe(); #endif - logdir = D_Home(); - #ifdef LOGMESSAGES -#ifdef DEFAULTDIR - if (logdir) - strcpy(logfilename, va("%s/"DEFAULTDIR"/log.txt",logdir)); - else -#endif - strcpy(logfilename, "./log.txt"); - - logstream = fopen(logfilename, "wt"); -#endif + if (!M_CheckParm("-nolog")) + InitLogging(); +#endif/*LOGMESSAGES*/ //I_OutputMsg("I_StartupSystem() ...\n"); I_StartupSystem(); #if defined (_WIN32) { -#if 0 // just load the DLL - p_IsDebuggerPresent pfnIsDebuggerPresent = (p_IsDebuggerPresent)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsDebuggerPresent"); - if ((!pfnIsDebuggerPresent || !pfnIsDebuggerPresent()) -#ifdef BUGTRAP - && !InitBugTrap() -#endif - ) -#endif - { #ifdef DRMINGW - ExcHndlInit(); + ExcHndlInit(); #endif - } } #endif diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 7302a12e1..20514f105 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2502,6 +2502,48 @@ void I_RemoveExitFunc(void (*func)()) } } +#if !(defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)) +static void Shittycopyerror(const char *name) +{ + I_OutputMsg( + "Error copying log file: %s: %s\n", + name, + strerror(errno) + ); +} + +static void Shittylogcopy(void) +{ + char buf[8192]; + FILE *fp; + size_t r; + if (fseek(logstream, 0, SEEK_SET) == -1) + { + Shittycopyerror("fseek"); + } + else if (( fp = fopen(logfilename, "wt") )) + { + while (( r = fread(buf, 1, sizeof buf, logstream) )) + { + if (fwrite(buf, 1, r, fp) < r) + { + Shittycopyerror("fwrite"); + break; + } + } + if (ferror(logstream)) + { + Shittycopyerror("fread"); + } + fclose(fp); + } + else + { + Shittycopyerror(logfilename); + } +} +#endif/*!(defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON))*/ + // // Closes down everything. This includes restoring the initial // palette and video mode, and removing whatever mouse, keyboard, and @@ -2524,6 +2566,9 @@ void I_ShutdownSystem(void) if (logstream) { I_OutputMsg("I_ShutdownSystem(): end of logstream.\n"); +#if !(defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)) + Shittylogcopy(); +#endif fclose(logstream); logstream = NULL; } -- 2.54.0 From bf9b738a0f7bad27bdbd1889207f2282782c558c Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 21 Jan 2025 01:35:10 +0100 Subject: [PATCH 197/325] use SRB2.2s general folder structure - seperate addons folder (download folder remains in home directory unlike RR) - seperate gif and screenshot folders --- src/d_main.c | 7 +++++-- src/d_netcmd.c | 2 ++ src/m_menu.c | 53 +++++++++++++++++++++++++++++--------------------- src/m_menu.h | 3 +++ src/m_misc.c | 44 ++++++++++++++++++++++++++++------------- src/m_misc.h | 2 +- 6 files changed, 72 insertions(+), 39 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index b97f46028..af25ae2ea 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -133,6 +133,7 @@ char srb2home[256] = "."; char srb2path[256] = "."; boolean usehome = true; const char *pandf = "%s" PATHSEP "%s"; +static char addonsdir[MAX_WADPATH]; // // EVENT HANDLING @@ -1437,8 +1438,6 @@ void D_SRB2Main(void) // can't use sprintf since there is %u in savegamename strcatbf(savegamename, srb2home, PATHSEP); - - I_mkdir(srb2home, 0700); #else snprintf(srb2home, sizeof srb2home, "%s", userhome); snprintf(downloaddir, sizeof downloaddir, "%s", userhome); @@ -1475,6 +1474,10 @@ void D_SRB2Main(void) } } + // Create addons dir + snprintf(addonsdir, sizeof addonsdir, "%s%s%s", srb2home, PATHSEP, "addons"); + I_mkdir(addonsdir, 0755); + D_SetupProtocol(); // rand() needs seeded regardless of password diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 184fdd70f..5e647ff70 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -868,6 +868,8 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_screenshot_option); CV_RegisterVar(&cv_screenshot_folder); CV_RegisterVar(&cv_moviemode); + CV_RegisterVar(&cv_movie_option); + CV_RegisterVar(&cv_movie_folder); // PNG variables CV_RegisterVar(&cv_zlib_level); CV_RegisterVar(&cv_zlib_memory); diff --git a/src/m_menu.c b/src/m_menu.c index ec4f1bca0..a3a3901f1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1737,37 +1737,40 @@ static menuitem_t OP_DataOptionsMenu[] = static menuitem_t OP_ScreenshotOptionsMenu[] = { - {IT_STRING|IT_CVAR, NULL, "Storage Location", &cv_screenshot_option, 10}, - {IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_screenshot_folder, 20}, + {IT_HEADER, NULL, "Screenshots (F8)", NULL, 5}, + {IT_STRING|IT_CVAR, NULL, "Storage Location", &cv_screenshot_option, 15}, + {IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_screenshot_folder, 25}, + {IT_STRING|IT_CVAR, NULL, "Memory Level", &cv_zlib_memory, 55}, + {IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_level, 65}, + {IT_STRING|IT_CVAR, NULL, "Strategy", &cv_zlib_strategy, 75}, + {IT_STRING|IT_CVAR, NULL, "Window Size", &cv_zlib_window_bits, 85}, - {IT_HEADER, NULL, "Screenshots (F8)", NULL, 50}, - {IT_STRING|IT_CVAR, NULL, "Memory Level", &cv_zlib_memory, 60}, - {IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_level, 70}, - {IT_STRING|IT_CVAR, NULL, "Strategy", &cv_zlib_strategy, 80}, - {IT_STRING|IT_CVAR, NULL, "Window Size", &cv_zlib_window_bits, 90}, + {IT_HEADER, NULL, "Movie Mode (F9)", NULL, 100}, + {IT_STRING|IT_CVAR, NULL, "Storage Location", &cv_movie_option, 110}, + {IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_movie_folder, 120}, + {IT_STRING|IT_CVAR, NULL, "Capture Mode", &cv_moviemode, 150}, - {IT_HEADER, NULL, "Movie Mode (F9)", NULL, 105}, - {IT_STRING|IT_CVAR, NULL, "Capture Mode", &cv_moviemode, 115}, + {IT_STRING|IT_CVAR, NULL, "Region Optimizing", &cv_gif_optimize, 160}, + {IT_STRING|IT_CVAR, NULL, "Downscaling", &cv_gif_downscale, 170}, - {IT_STRING|IT_CVAR, NULL, "Region Optimizing", &cv_gif_optimize, 125}, - {IT_STRING|IT_CVAR, NULL, "Downscaling", &cv_gif_downscale, 135}, - - {IT_STRING|IT_CVAR, NULL, "Memory Level", &cv_zlib_memorya, 125}, - {IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_levela, 135}, - {IT_STRING|IT_CVAR, NULL, "Strategy", &cv_zlib_strategya, 145}, - {IT_STRING|IT_CVAR, NULL, "Window Size", &cv_zlib_window_bitsa, 155}, + {IT_STRING|IT_CVAR, NULL, "Memory Level", &cv_zlib_memorya, 160}, + {IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_levela, 170}, + {IT_STRING|IT_CVAR, NULL, "Strategy", &cv_zlib_strategya, 180}, + {IT_STRING|IT_CVAR, NULL, "Window Size", &cv_zlib_window_bitsa, 190}, }; enum { - op_screenshot_folder = 1, - op_screenshot_capture = 8, - op_screenshot_gif_start = 9, - op_screenshot_gif_end = 10, - op_screenshot_apng_start = 11, - op_screenshot_apng_end = 14, + op_screenshot_folder = 2, + op_movie_folder = 9, + op_screenshot_capture = 10, + op_screenshot_gif_start = 11, + op_screenshot_gif_end = 12, + op_screenshot_apng_start = 13, + op_screenshot_apng_end = 16, }; + static menuitem_t OP_EraseDataMenu[] = { {IT_STRING | IT_CALL, NULL, "Erase Record Data", M_EraseData, 10}, @@ -3425,6 +3428,12 @@ void Addons_option_Onchange(void) (cv_addons_option.value == 3 ? IT_CVAR|IT_STRING|IT_CV_STRING : IT_DISABLED); } +void Moviemode_option_Onchange(void) +{ + OP_ScreenshotOptionsMenu[op_movie_folder].status = + (cv_movie_option.value == 3 ? IT_CVAR|IT_STRING|IT_CV_STRING : IT_DISABLED); +} + void PDistort_menu_Onchange(void) { if (!cv_sloperoll.value) diff --git a/src/m_menu.h b/src/m_menu.h index 72864c669..4ee8615ce 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -286,6 +286,9 @@ void Screenshot_option_Onchange(void); // Addons menu updating void Addons_option_Onchange(void); +// Moviemode menu updating +void Moviemode_option_Onchange(void); + // Player distortion menu updating void PDistort_menu_Onchange(void); diff --git a/src/m_misc.c b/src/m_misc.c index 6e6658a0a..c6dd4175c 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -110,6 +110,9 @@ consvar_t cv_screenshot_folder = {"screenshot_folder", "", CV_SAVE, NULL, NULL, static CV_PossibleValue_t moviemode_cons_t[] = {{MM_GIF, "GIF"}, {MM_APNG, "aPNG"}, {MM_SCREENSHOT, "Screenshots"}, {0, NULL}}; consvar_t cv_moviemode = {"moviemode_mode", "GIF", CV_SAVE|CV_CALL, moviemode_cons_t, Moviemode_mode_Onchange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_movie_option = {"movie_option", "Default", CV_SAVE|CV_CALL, screenshot_cons_t, Moviemode_option_Onchange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_movie_folder = {"movie_folder", "", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; + static CV_PossibleValue_t zlib_mem_level_t[] = { {1, "(Min Memory) 1"}, {2, "2"}, {3, "3"}, {4, "4"}, {5, "5"}, {6, "6"}, {7, "7"}, @@ -1144,19 +1147,25 @@ static inline moviemode_t M_StartMovieGIF(const char *pathname) void M_StartMovie(void) { #if NUMSCREENS > 2 - const char *pathname = "."; + char pathname[MAX_WADPATH]; if (moviemode) return; - if (cv_screenshot_option.value == 0) - pathname = usehome ? srb2home : srb2path; - else if (cv_screenshot_option.value == 1) - pathname = srb2home; - else if (cv_screenshot_option.value == 2) - pathname = srb2path; - else if (cv_screenshot_option.value == 3 && *cv_screenshot_folder.string != '\0') - pathname = cv_screenshot_folder.string; + if (cv_movie_option.value == 0) + strcpy(pathname, usehome ? srb2home : srb2path); + else if (cv_movie_option.value == 1) + strcpy(pathname, srb2home); + else if (cv_movie_option.value == 2) + strcpy(pathname, srb2path); + else if (cv_movie_option.value == 3 && *cv_movie_folder.string != '\0') + strcpy(pathname, cv_movie_folder.string); + + if (cv_movie_option.value != 3) + { + strcat(pathname, PATHSEP"gifs"PATHSEP); + I_mkdir(pathname, 0755); + } if (rendermode == render_none) I_Error("Can't make a movie without a render system\n"); @@ -1482,7 +1491,8 @@ void M_ScreenShot(void) void M_DoScreenShot(void) { #if NUMSCREENS > 2 - const char *freename = NULL, *pathname = "."; + const char *freename = NULL; + char pathname[MAX_WADPATH]; boolean ret = false; UINT8 *linear = NULL; @@ -1494,13 +1504,19 @@ void M_DoScreenShot(void) return; if (cv_screenshot_option.value == 0) - pathname = usehome ? srb2home : srb2path; + strcpy(pathname, usehome ? srb2home : srb2path); else if (cv_screenshot_option.value == 1) - pathname = srb2home; + strcpy(pathname, srb2home); else if (cv_screenshot_option.value == 2) - pathname = srb2path; + strcpy(pathname, srb2path); else if (cv_screenshot_option.value == 3 && *cv_screenshot_folder.string != '\0') - pathname = cv_screenshot_folder.string; + strcpy(pathname, cv_screenshot_folder.string); + + if (cv_screenshot_option.value != 3) + { + strcat(pathname, PATHSEP"screenshots"PATHSEP); + I_mkdir(pathname, 0755); + } #ifdef USE_PNG freename = Newsnapshotfile(pathname,"png"); diff --git a/src/m_misc.h b/src/m_misc.h index a84493ee1..013da2235 100644 --- a/src/m_misc.h +++ b/src/m_misc.h @@ -30,7 +30,7 @@ typedef enum { extern moviemode_t moviemode; extern consvar_t cv_screenshot_option, cv_screenshot_folder; -extern consvar_t cv_moviemode; +extern consvar_t cv_moviemode, cv_movie_folder, cv_movie_option; extern consvar_t cv_zlib_memory, cv_zlib_level, cv_zlib_strategy, cv_zlib_window_bits; extern consvar_t cv_zlib_memorya, cv_zlib_levela, cv_zlib_strategya, cv_zlib_window_bitsa; extern consvar_t cv_apng_delay; -- 2.54.0 From 2a05f630b3f948d35af6588580c32e78b9e6d92f Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 21:12:06 +0100 Subject: [PATCH 198/325] dont cache all those unused hud graphics --- src/hu_stuff.c | 1 - src/hu_stuff.h | 1 - src/st_stuff.c | 153 ------------------------------------------------- src/st_stuff.h | 6 -- 4 files changed, 161 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 6cbb46148..d7beb2f1c 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -100,7 +100,6 @@ patch_t *rflagico; patch_t *bflagico; patch_t *rmatcico; patch_t *bmatcico; -patch_t *tagico; patch_t *tallminus; //------------------------------------------- diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 66459c716..efea1f9c4 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -101,7 +101,6 @@ extern patch_t *rflagico; extern patch_t *bflagico; extern patch_t *rmatcico; extern patch_t *bmatcico; -extern patch_t *tagico; extern patch_t *tallminus; // set true whenever the tab rankings are being shown for any reason diff --git a/src/st_stuff.c b/src/st_stuff.c index 8b431b2f0..45d364914 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -77,73 +77,6 @@ char *localfacemmapprefix_name[MAXLOCALSKINS]; // minimap*/ // status bar overlay // ------------------------------------------ -// icons for overlay -patch_t *sboscore; // Score logo -patch_t *sbotime; // Time logo -patch_t *sbocolon; // Colon for time -patch_t *sboperiod; // Period for time centiseconds -patch_t *livesback; // Lives icon background -static patch_t *nrec_timer; // Timer for NiGHTS records -static patch_t *sborings; -static patch_t *sboover; -static patch_t *timeover; -static patch_t *stlivex; -static patch_t *rrings; -static patch_t *getall; // Special Stage HUD -static patch_t *timeup; // Special Stage HUD -static patch_t *hunthoming[6]; -static patch_t *itemhoming[6]; -static patch_t *race1; -static patch_t *race2; -static patch_t *race3; -static patch_t *racego; -//static patch_t *ttlnum; -static patch_t *nightslink; -static patch_t *count5; -static patch_t *count4; -static patch_t *count3; -static patch_t *count2; -static patch_t *count1; -static patch_t *count0; -static patch_t *curweapon; -static patch_t *normring; -static patch_t *bouncering; -static patch_t *infinityring; -static patch_t *autoring; -static patch_t *explosionring; -static patch_t *scatterring; -static patch_t *grenadering; -static patch_t *railring; -static patch_t *jumpshield; -static patch_t *forceshield; -static patch_t *ringshield; -static patch_t *watershield; -static patch_t *bombshield; -static patch_t *pityshield; -static patch_t *invincibility; -static patch_t *sneakers; -static patch_t *gravboots; -static patch_t *nonicon; -static patch_t *bluestat; -static patch_t *byelstat; -static patch_t *orngstat; -static patch_t *redstat; -static patch_t *yelstat; -static patch_t *nbracket; -static patch_t *nhud[12]; -static patch_t *nsshud; -static patch_t *narrow[9]; -static patch_t *nredar[8]; // Red arrow -static patch_t *drillbar; -static patch_t *drillfill[3]; -static patch_t *capsulebar; -static patch_t *capsulefill; -patch_t *ngradeletters[7]; -static patch_t *minus5sec; -static patch_t *minicaps; -static patch_t *gotrflag; -static patch_t *gotbflag; - // Midnight Channel: static patch_t *hud_tv1; static patch_t *hud_tv2; @@ -280,8 +213,6 @@ void ST_UnloadGraphics(void) void ST_LoadGraphics(void) { - int i; - // SRB2 border patch st_borderpatchnum = W_GetNumForName("GFZFLR01"); scr_borderpatch = W_CacheLumpNum(st_borderpatchnum, PU_HUDGFX); @@ -291,95 +222,11 @@ void ST_LoadGraphics(void) // but load them in R_AddSkins, that gets called // first anyway // cache the status bar overlay icons (fullscreen mode) - sborings = W_CachePatchName("SBORINGS", PU_HUDGFX); - sboscore = W_CachePatchName("SBOSCORE", PU_HUDGFX); - sboover = W_CachePatchName("SBOOVER", PU_HUDGFX); - timeover = W_CachePatchName("TIMEOVER", PU_HUDGFX); - stlivex = W_CachePatchName("STLIVEX", PU_HUDGFX); - livesback = W_CachePatchName("STLIVEBK", PU_HUDGFX); - rrings = W_CachePatchName("RRINGS", PU_HUDGFX); - sbotime = W_CachePatchName("SBOTIME", PU_HUDGFX); // Time logo - sbocolon = W_CachePatchName("SBOCOLON", PU_HUDGFX); // Colon for time - sboperiod = W_CachePatchName("SBOPERIO", PU_HUDGFX); // Period for time centiseconds - nrec_timer = W_CachePatchName("NGRTIMER", PU_HUDGFX); // Timer for NiGHTS - getall = W_CachePatchName("GETALL", PU_HUDGFX); // Special Stage HUD - timeup = W_CachePatchName("TIMEUP", PU_HUDGFX); // Special Stage HUD - race1 = W_CachePatchName("RACE1", PU_HUDGFX); - race2 = W_CachePatchName("RACE2", PU_HUDGFX); - race3 = W_CachePatchName("RACE3", PU_HUDGFX); - racego = W_CachePatchName("RACEGO", PU_HUDGFX); - nightslink = W_CachePatchName("NGHTLINK", PU_HUDGFX); - count5 = W_CachePatchName("DRWNF0", PU_HUDGFX); - count4 = W_CachePatchName("DRWNE0", PU_HUDGFX); - count3 = W_CachePatchName("DRWND0", PU_HUDGFX); - count2 = W_CachePatchName("DRWNC0", PU_HUDGFX); - count1 = W_CachePatchName("DRWNB0", PU_HUDGFX); - count0 = W_CachePatchName("DRWNA0", PU_HUDGFX); - for (i = 0; i < 6; ++i) - { - hunthoming[i] = W_CachePatchName(va("HOMING%d", i+1), PU_HUDGFX); - itemhoming[i] = W_CachePatchName(va("HOMITM%d", i+1), PU_HUDGFX); - } - - curweapon = W_CachePatchName("CURWEAP", PU_HUDGFX); - normring = W_CachePatchName("RINGIND", PU_HUDGFX); - bouncering = W_CachePatchName("BNCEIND", PU_HUDGFX); - infinityring = W_CachePatchName("INFNIND", PU_HUDGFX); - autoring = W_CachePatchName("AUTOIND", PU_HUDGFX); - explosionring = W_CachePatchName("BOMBIND", PU_HUDGFX); - scatterring = W_CachePatchName("SCATIND", PU_HUDGFX); - grenadering = W_CachePatchName("GRENIND", PU_HUDGFX); - railring = W_CachePatchName("RAILIND", PU_HUDGFX); - jumpshield = W_CachePatchName("WHTVB0", PU_HUDGFX); - forceshield = W_CachePatchName("BLTVB0", PU_HUDGFX); - ringshield = W_CachePatchName("YLTVB0", PU_HUDGFX); - watershield = W_CachePatchName("ELTVB0", PU_HUDGFX); - bombshield = W_CachePatchName("BKTVB0", PU_HUDGFX); - pityshield = W_CachePatchName("GRTVB0", PU_HUDGFX); - invincibility = W_CachePatchName("PINVB0", PU_HUDGFX); - sneakers = W_CachePatchName("SHTVB0", PU_HUDGFX); - gravboots = W_CachePatchName("GBTVB0", PU_HUDGFX); - - tagico = W_CachePatchName("TAGICO", PU_HUDGFX); rflagico = W_CachePatchName("RFLAGICO", PU_HUDGFX); bflagico = W_CachePatchName("BFLAGICO", PU_HUDGFX); rmatcico = W_CachePatchName("RMATCICO", PU_HUDGFX); bmatcico = W_CachePatchName("BMATCICO", PU_HUDGFX); - gotrflag = W_CachePatchName("GOTRFLAG", PU_HUDGFX); - gotbflag = W_CachePatchName("GOTBFLAG", PU_HUDGFX); - nonicon = W_CachePatchName("NONICON", PU_HUDGFX); - - // NiGHTS HUD things - bluestat = W_CachePatchName("BLUESTAT", PU_HUDGFX); - byelstat = W_CachePatchName("BYELSTAT", PU_HUDGFX); - orngstat = W_CachePatchName("ORNGSTAT", PU_HUDGFX); - redstat = W_CachePatchName("REDSTAT", PU_HUDGFX); - yelstat = W_CachePatchName("YELSTAT", PU_HUDGFX); - nbracket = W_CachePatchName("NBRACKET", PU_HUDGFX); - for (i = 0; i < 12; ++i) - nhud[i] = W_CachePatchName(va("NHUD%d", i+1), PU_HUDGFX); - nsshud = W_CachePatchName("NSSHUD", PU_HUDGFX); - minicaps = W_CachePatchName("MINICAPS", PU_HUDGFX); - - for (i = 0; i < 8; ++i) - { - narrow[i] = W_CachePatchName(va("NARROW%d", i+1), PU_HUDGFX); - nredar[i] = W_CachePatchName(va("NREDAR%d", i+1), PU_HUDGFX); - } - - // non-animated version - narrow[8] = W_CachePatchName("NARROW9", PU_HUDGFX); - - drillbar = W_CachePatchName("DRILLBAR", PU_HUDGFX); - for (i = 0; i < 3; ++i) - drillfill[i] = W_CachePatchName(va("DRILLFI%d", i+1), PU_HUDGFX); - capsulebar = W_CachePatchName("CAPSBAR", PU_HUDGFX); - capsulefill = W_CachePatchName("CAPSFILL", PU_HUDGFX); - minus5sec = W_CachePatchName("MINUS5", PU_HUDGFX); - - for (i = 0; i < 7; ++i) - ngradeletters[i] = W_CachePatchName(va("GRADE%d", i), PU_HUDGFX); K_LoadKartHUDGraphics(); diff --git a/src/st_stuff.h b/src/st_stuff.h index 250db1e7f..bb15e827d 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -71,10 +71,6 @@ extern UINT8 stplyrnum; extern lumpnum_t st_borderpatchnum; // patches, also used in intermission extern patch_t *tallnum[10]; -extern patch_t *sboscore; -extern patch_t *sbotime; -extern patch_t *sbocolon; -extern patch_t *sboperiod; extern patch_t *facerankprefix[MAXSKINS]; // ranking extern patch_t *facewantprefix[MAXSKINS]; // wanted extern patch_t *facemmapprefix[MAXSKINS]; // minimap @@ -87,8 +83,6 @@ extern char *facemmapprefix_name[MAXSKINS]; // minimap extern char *localfacerankprefix_name[MAXLOCALSKINS]; // ranking extern char *localfacewantprefix_name[MAXLOCALSKINS]; // wanted extern char *localfacemmapprefix_name[MAXLOCALSKINS]; // minimap*/ -extern patch_t *livesback; -extern patch_t *ngradeletters[7]; /** HUD location information (don't move this comment) */ -- 2.54.0 From 6e81cdcb0184beabe13f7637bae2f466ff5f9335 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 21:30:37 +0100 Subject: [PATCH 199/325] kill even more unused patches + nonexistant crosshair stuff --- src/d_netcmd.c | 4 ---- src/g_game.c | 5 ----- src/g_game.h | 1 - src/hu_stuff.c | 60 -------------------------------------------------- src/hu_stuff.h | 5 ----- src/v_video.c | 2 +- 6 files changed, 1 insertion(+), 76 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5e647ff70..0168acc0e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -972,10 +972,6 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_showlocalskinmenus); - //CV_RegisterVar(&cv_crosshair); - //CV_RegisterVar(&cv_crosshair2); - //CV_RegisterVar(&cv_crosshair3); - //CV_RegisterVar(&cv_crosshair4); //CV_RegisterVar(&cv_alwaysfreelook); //CV_RegisterVar(&cv_alwaysfreelook2); //CV_RegisterVar(&cv_chasefreelook); diff --git a/src/g_game.c b/src/g_game.c index 419704b70..86be0e159 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -401,10 +401,6 @@ static CV_PossibleValue_t powermusic_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "SFX consvar_t cv_growmusic = {"growmusic", "On", CV_SAVE, powermusic_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_supermusic = {"supermusic", "On", CV_SAVE, powermusic_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -/*consvar_t cv_crosshair = {"crosshair", "Off", CV_SAVE, crosshair_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_crosshair2 = {"crosshair2", "Off", CV_SAVE, crosshair_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_crosshair3 = {"crosshair3", "Off", CV_SAVE, crosshair_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_crosshair4 = {"crosshair4", "Off", CV_SAVE, crosshair_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};*/ consvar_t cv_invertmouse = {"invertmouse", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_invertmouse2 = {"invertmouse2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; /*consvar_t cv_alwaysfreelook = {"alwaysmlook", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -414,7 +410,6 @@ consvar_t cv_chasefreelook2 = {"chasemlook2", "Off", CV_SAVE, CV_OnOff, NULL, 0, consvar_t cv_mousemove = {"mousemove", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_mousemove2 = {"mousemove2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};*/ -//static CV_PossibleValue_t crosshair_cons_t[] = {{0, "Off"}, {1, "Cross"}, {2, "Angle"}, {3, "Point"}, {0, NULL}}; static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"}, {1, "Left X"}, {2, "Left Y"}, {-1, "Left X-"}, {-2, "Left Y-"}, #if JOYAXISSET > 1 diff --git a/src/g_game.h b/src/g_game.h index 107741d75..9fad6b0c8 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -118,7 +118,6 @@ extern consvar_t cv_songcredits; extern consvar_t cv_showfreeplay; extern consvar_t cv_growmusic, cv_supermusic; extern consvar_t cv_pauseifunfocused; -//extern consvar_t cv_crosshair, cv_crosshair2, cv_crosshair3, cv_crosshair4; extern consvar_t cv_invertmouse/*, cv_alwaysfreelook, cv_chasefreelook, cv_mousemove*/; extern consvar_t cv_invertmouse2/*, cv_alwaysfreelook2, cv_chasefreelook2, cv_mousemove2*/; diff --git a/src/hu_stuff.c b/src/hu_stuff.c index d7beb2f1c..d279c37b9 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -69,7 +69,6 @@ patch_t *hu_font[HU_FONTSIZE]; patch_t *kart_font[KART_FONTSIZE]; // SRB2kart patch_t *tny_font[HU_FONTSIZE]; patch_t *tallnum[10]; // 0-9 -patch_t *nightsnum[10]; // 0-9 // Level title and credits fonts patch_t *lt_font[LT_FONTSIZE]; @@ -102,21 +101,6 @@ patch_t *rmatcico; patch_t *bmatcico; patch_t *tallminus; -//------------------------------------------- -// coop hud -//------------------------------------------- - -patch_t *emeraldpics[7]; -patch_t *tinyemeraldpics[7]; -static patch_t *emblemicon; -static patch_t *tokenicon; - -//------------------------------------------- -// misc vars -//------------------------------------------- - -// crosshair 0 = off, 1 = cross, 2 = angle, 3 = point, see m_menu.c -static patch_t *crosshair[HU_CROSSHAIRS]; // 3 precached crosshair graphics // song credits static patch_t *songcreditbg; @@ -380,8 +364,6 @@ void HU_LoadGraphics(void) { sprintf(buffer, "STTNUM%d", i); tallnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); - sprintf(buffer, "NGTNUM%d", i); - nightsnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); sprintf(buffer, "PINGN%d", i); pingnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); sprintf(buffer, "OPPRNK0%d", i); @@ -391,32 +373,6 @@ void HU_LoadGraphics(void) // minus for negative tallnums tallminus = (patch_t *)W_CachePatchName("STTMINUS", PU_HUDGFX); - // cache the crosshairs, don't bother to know which one is being used, - // just cache all 3, they're so small anyway. - for (i = 0; i < HU_CROSSHAIRS; i++) - { - sprintf(buffer, "CROSHAI%c", '1'+i); - crosshair[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); - } - - emblemicon = W_CachePatchName("EMBLICON", PU_HUDGFX); - tokenicon = W_CachePatchName("TOKNICON", PU_HUDGFX); - - emeraldpics[0] = W_CachePatchName("CHAOS1", PU_HUDGFX); - emeraldpics[1] = W_CachePatchName("CHAOS2", PU_HUDGFX); - emeraldpics[2] = W_CachePatchName("CHAOS3", PU_HUDGFX); - emeraldpics[3] = W_CachePatchName("CHAOS4", PU_HUDGFX); - emeraldpics[4] = W_CachePatchName("CHAOS5", PU_HUDGFX); - emeraldpics[5] = W_CachePatchName("CHAOS6", PU_HUDGFX); - emeraldpics[6] = W_CachePatchName("CHAOS7", PU_HUDGFX); - tinyemeraldpics[0] = W_CachePatchName("TEMER1", PU_HUDGFX); - tinyemeraldpics[1] = W_CachePatchName("TEMER2", PU_HUDGFX); - tinyemeraldpics[2] = W_CachePatchName("TEMER3", PU_HUDGFX); - tinyemeraldpics[3] = W_CachePatchName("TEMER4", PU_HUDGFX); - tinyemeraldpics[4] = W_CachePatchName("TEMER5", PU_HUDGFX); - tinyemeraldpics[5] = W_CachePatchName("TEMER6", PU_HUDGFX); - tinyemeraldpics[6] = W_CachePatchName("TEMER7", PU_HUDGFX); - songcreditbg = W_CachePatchName("K_SONGCR", PU_HUDGFX); // cache ping gfx: @@ -2288,22 +2244,6 @@ void HU_Drawer(void) if (gamestate != GS_LEVEL) return; - // draw the crosshair, not when viewing demos nor with chasecam - /*if (!automapactive && !demo.playback) - { - if (cv_crosshair.value && !camera[0].chase && !players[displayplayers[0]].spectator) - HU_DrawCrosshair(); - - if (cv_crosshair2.value && !camera[1].chase && !players[displayplayers[1]].spectator) - HU_DrawCrosshair2(); - - if (cv_crosshair3.value && !camera[2].chase && !players[displayplayers[2]].spectator) - HU_DrawCrosshair3(); - - if (cv_crosshair4.value && !camera[3].chase && !players[displayplayers[3]].spectator) - HU_DrawCrosshair4(); - }*/ - // draw song credits if (cv_songcredits.value) HU_DrawSongCredits(); diff --git a/src/hu_stuff.h b/src/hu_stuff.h index efea1f9c4..acc815617 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -42,8 +42,6 @@ #define CRED_FONTEND 'Z' // the last font character #define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1) -#define HU_CROSSHAIRS 3 // maximum of 9 - see HU_Init(); - extern char *shiftxform; // english translation shift table extern char english_shiftxform[]; @@ -90,13 +88,10 @@ extern patch_t *tallnum[10]; extern patch_t *pingnum[10]; extern patch_t *pinggfx[5]; extern patch_t *ranknum[10]; -extern patch_t *nightsnum[10]; extern patch_t *framecounter; extern patch_t *frameslash; extern patch_t *lt_font[LT_FONTSIZE]; extern patch_t *cred_font[CRED_FONTSIZE]; -extern patch_t *emeraldpics[7]; -extern patch_t *tinyemeraldpics[7]; extern patch_t *rflagico; extern patch_t *bflagico; extern patch_t *rmatcico; diff --git a/src/v_video.c b/src/v_video.c index 987a40a03..6a0ad5f16 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -714,7 +714,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca // TODO: make some kind of vertical version of V_FLIP, maybe by deprecating V_OFFSET in future?!? offsety = FixedMul(SHORT(patch->topoffset)< Date: Mon, 23 Dec 2024 18:06:56 +0100 Subject: [PATCH 200/325] make those const --- src/p_floor.c | 18 +++++++++--------- src/p_map.c | 10 ++++------ src/p_mobj.c | 4 ++-- src/p_spec.c | 8 ++++---- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 17e32c089..8e6912523 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2119,11 +2119,11 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) sec = §ors[secnum]; FOFsector = false; - INT32 special = GETSECSPECIAL(sec->special, 2); + const INT32 secspecial = GETSECSPECIAL(sec->special, 2); - if (special == 3 || special == 5) + if (secspecial == 3 || secspecial == 5) floortouch = true; - else if (special >= 1 && special <= 8) + else if (secspecial >= 1 && secspecial <= 8) floortouch = false; else continue; @@ -2255,7 +2255,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) continue; if (!(players[i].mo->subsector->sector == sec - || P_PlayerTouchingSectorSpecial(&players[i], 2, special) == sec)) + || P_PlayerTouchingSectorSpecial(&players[i], 2, secspecial) == sec)) continue; if (floortouch == true && P_IsObjectOnRealGround(players[i].mo, sec)) @@ -2299,9 +2299,9 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) while ((affectPlayer = P_HavePlayersEnteredArea(playersArea, oldPlayersArea, inAndOut)) != -1) { - INT32 special = GETSECSPECIAL(sec->special, 2); + const INT32 secspecial = GETSECSPECIAL(sec->special, 2); - if (special == 2 || special == 3) + if (secspecial == 2 || secspecial == 3) { for (i = 0; i < MAXPLAYERS; i++) { @@ -2920,12 +2920,12 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) fixed_t a, b, c; mobjtype_t type = MT_ROCKCRUMBLE1; const fixed_t spacing = 48*mapobjectscale; - INT32 special = GETSECSPECIAL(rover->master->frontsector->special, 3); + const INT32 secspecial = GETSECSPECIAL(rover->master->frontsector->special, 3); // If the control sector has a special // of Section3:7-15, use the custom debris. - if (special >= 8) - type = MT_ROCKCRUMBLE1+(special-7); + if (secspecial >= 8) + type = MT_ROCKCRUMBLE1+(secspecial-7); // soundorg z height never gets set normally, so MEH. sec->soundorg.z = sec->floorheight; diff --git a/src/p_map.c b/src/p_map.c index 00a3bb1b2..21965da0b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2407,19 +2407,17 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) { //All things are affected by their scale. fixed_t maxstep = FixedMul(MAXSTEPMOVE, mapobjectscale); - INT32 special = 0; + const INT32 secspecial = (thing->player) ? GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) : 0; if (thing->player) { - special = GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1); - // If using type Section1:13, double the maxstep. if (P_PlayerTouchingSectorSpecial(thing->player, 1, 13) - || special == 13) + || secspecial == 13) maxstep <<= 1; // If using type Section1:12, no maxstep. For ledges you don't want the player to climb! (see: Egg Zeppelin & SMK port walls) else if (P_PlayerTouchingSectorSpecial(thing->player, 1, 12) - || special == 12) + || secspecial == 12) maxstep = 0; } @@ -2465,7 +2463,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) else if (maxstep > 0 && !( thing->player && ( P_PlayerTouchingSectorSpecial(thing->player, 1, 14) - || special == 14) + || secspecial == 14) )) // Step down { // If the floor difference is MAXSTEPMOVE or less, and the sector isn't Section1:14, ALWAYS diff --git a/src/p_mobj.c b/src/p_mobj.c index 0334f7925..77e65c24f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1887,13 +1887,13 @@ boolean P_CheckDeathPitCollide(mobj_t *mo) I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); - INT32 special = GETSECSPECIAL(mo->subsector->sector->special, 1); + const INT32 secspecial = GETSECSPECIAL(mo->subsector->sector->special, 1); if (((mo->z <= mo->subsector->sector->floorheight && !(mo->eflags & MFE_VERTICALFLIP) && (mo->subsector->sector->flags & SF_FLIPSPECIAL_FLOOR)) || (mo->z + mo->height >= mo->subsector->sector->ceilingheight && (mo->eflags & MFE_VERTICALFLIP) && (mo->subsector->sector->flags & SF_FLIPSPECIAL_CEILING))) - && (special == 6 || special == 7)) + && (secspecial == 6 || secspecial == 7)) return true; return false; diff --git a/src/p_spec.c b/src/p_spec.c index 78fdb9e12..3f9dfd626 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1427,14 +1427,14 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller } else if (caller) { - INT32 special = GETSECSPECIAL(caller->special, 2); + const INT32 secspecial = GETSECSPECIAL(caller->special, 2); - if (special == 6) + if (secspecial == 6) { if (!(ALL7EMERALDS(emeralds))) return false; } - else if (special == 7) // SRB2Kart: reusing for Race Lap executor + else if (secspecial == 7) // SRB2Kart: reusing for Race Lap executor { UINT8 lap; @@ -1468,7 +1468,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller // If we were not triggered by a sector type especially for the purpose, // a Linedef Executor linedef trigger is not handling sector triggers properly, return. - else if ((!special || special > 7) && (specialtype > 322)) + else if ((!secspecial || secspecial > 7) && (specialtype > 322)) { CONS_Alert(CONS_WARNING, M_GetText("Linedef executor trigger isn't handling sector triggers properly!\nspecialtype = %d, if you are not a dev, report this warning instance\nalong with the wad that caused it!\n"), -- 2.54.0 From ce00aef8b14738527f29b6f1d18cbd03ebc73469 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 30 Jan 2025 13:25:12 +0100 Subject: [PATCH 201/325] partly revert this some of those "mightve" been changed at the point of the check --- src/p_floor.c | 2 +- src/p_map.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 8e6912523..2277de838 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2255,7 +2255,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) continue; if (!(players[i].mo->subsector->sector == sec - || P_PlayerTouchingSectorSpecial(&players[i], 2, secspecial) == sec)) + || P_PlayerTouchingSectorSpecial(&players[i], 2, GETSECSPECIAL(sec->special, 2)) == sec)) continue; if (floortouch == true && P_IsObjectOnRealGround(players[i].mo, sec)) diff --git a/src/p_map.c b/src/p_map.c index 21965da0b..f0ef1fe37 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2407,10 +2407,11 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) { //All things are affected by their scale. fixed_t maxstep = FixedMul(MAXSTEPMOVE, mapobjectscale); - const INT32 secspecial = (thing->player) ? GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) : 0; if (thing->player) { + const INT32 secspecial = GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1); + // If using type Section1:13, double the maxstep. if (P_PlayerTouchingSectorSpecial(thing->player, 1, 13) || secspecial == 13) @@ -2463,7 +2464,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) else if (maxstep > 0 && !( thing->player && ( P_PlayerTouchingSectorSpecial(thing->player, 1, 14) - || secspecial == 14) + || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 14) )) // Step down { // If the floor difference is MAXSTEPMOVE or less, and the sector isn't Section1:14, ALWAYS -- 2.54.0 From 88d5ca0b8af558cc3c1413b40637a62862c5c7b3 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 2 Feb 2025 00:19:38 +0100 Subject: [PATCH 202/325] should revert this completely --- src/p_map.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index f0ef1fe37..f3fe96868 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2410,15 +2410,13 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) if (thing->player) { - const INT32 secspecial = GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1); - // If using type Section1:13, double the maxstep. if (P_PlayerTouchingSectorSpecial(thing->player, 1, 13) - || secspecial == 13) + || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 13) maxstep <<= 1; // If using type Section1:12, no maxstep. For ledges you don't want the player to climb! (see: Egg Zeppelin & SMK port walls) else if (P_PlayerTouchingSectorSpecial(thing->player, 1, 12) - || secspecial == 12) + || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 12) maxstep = 0; } -- 2.54.0 From 36a1662afb03157e4a01d5f080b1657a75be3658 Mon Sep 17 00:00:00 2001 From: Chearii Date: Sun, 2 Feb 2025 20:37:19 -0500 Subject: [PATCH 203/325] Add blending modes --- src/dehacked.c | 28 +++++ src/f_wipe.c | 2 +- src/hardware/hw_defs.h | 26 ++--- src/hardware/hw_draw.c | 14 ++- src/hardware/hw_main.c | 146 ++++++++++++++++++++---- src/hardware/hw_main.h | 5 +- src/hardware/hw_md2.c | 9 ++ src/hardware/r_opengl/r_opengl.c | 163 ++++++++++++++++---------- src/k_kart.c | 6 +- src/lua_hudlib.c | 23 ++-- src/lua_hudlib_drawlist.c | 19 +++- src/lua_hudlib_drawlist.h | 9 +- src/lua_mobjlib.c | 14 +++ src/m_anigif.c | 11 +- src/p_mobj.c | 1 + src/p_mobj.h | 2 + src/p_pspr.h | 28 ++++- src/p_saveg.c | 1 + src/r_data.c | 107 +++++++++++++++++ src/r_data.h | 3 + src/r_defs.h | 3 + src/r_draw.c | 190 ++++++++++++++++++++++++++++++- src/r_draw.h | 23 +++- src/r_main.c | 4 +- src/r_plane.c | 22 ++-- src/r_segs.c | 24 ++-- src/r_things.c | 84 +++++++++++--- src/r_things.h | 7 ++ src/v_video.c | 72 ++++++++---- src/v_video.h | 36 ++++-- 30 files changed, 872 insertions(+), 210 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index dc4288be5..007324764 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7721,7 +7721,18 @@ struct { {"FF_HORIZONTALFLIP",FF_HORIZONTALFLIP}, {"FF_PAPERSPRITE",FF_PAPERSPRITE}, {"FF_ANIMATE",FF_ANIMATE}, + // brightness + {"FF_BRIGHTMASK",FF_BRIGHTMASK}, {"FF_FULLBRIGHT",FF_FULLBRIGHT}, + {"FF_SEMIBRIGHT",FF_SEMIBRIGHT}, + {"FF_FULLDARK",FF_FULLDARK}, + // blending + {"FF_BLENDMASK",FF_BLENDMASK}, + {"FF_BLENDSHIFT",FF_BRIGHTMASK}, + {"FF_ADD",FF_ADD}, + {"FF_SUBTRACT",FF_SUBTRACT}, + {"FF_REVERSESUBTRACT",FF_REVERSESUBTRACT}, + {"FF_MODULATE",FF_MODULATE}, {"FF_TRANSMASK",FF_TRANSMASK}, {"FF_TRANSSHIFT",FF_TRANSSHIFT}, // new preshifted translucency (used in source) @@ -7757,6 +7768,15 @@ struct { {"tr_trans90",tr_trans90}, {"NUMTRANSMAPS",NUMTRANSMAPS}, + // Alpha styles (blend modes) + {"AST_COPY",AST_COPY}, + {"AST_TRANSLUCENT",AST_TRANSLUCENT}, + {"AST_ADD",AST_ADD}, + {"AST_SUBTRACT",AST_SUBTRACT}, + {"AST_REVERSESUBTRACT",AST_REVERSESUBTRACT}, + {"AST_MODULATE",AST_MODULATE}, + {"AST_OVERLAY",AST_OVERLAY}, + // Type of levels {"TOL_SP",TOL_SP}, {"TOL_COOP",TOL_COOP}, @@ -8121,6 +8141,14 @@ struct { {"V_CHARCOLORSHIFT",V_CHARCOLORSHIFT}, {"V_ALPHASHIFT",V_ALPHASHIFT}, + // Blending + {"V_BLENDSHIFT",V_BLENDSHIFT}, + {"V_BLENDMASK",V_BLENDMASK}, + {"B_ADD",B_ADD}, + {"B_SUBTRACT",B_SUBTRACT}, + {"B_REVERSESUBTRACT",B_REVERSESUBTRACT}, + {"B_MODULATE",B_MODULATE}, + //Kick Reasons {"KR_KICK",KR_KICK}, {"KR_PINGLIMIT",KR_PINGLIMIT}, diff --git a/src/f_wipe.c b/src/f_wipe.c index da5b9dac1..1523ca1d3 100644 --- a/src/f_wipe.c +++ b/src/f_wipe.c @@ -273,7 +273,7 @@ static void F_DoWipe(fademask_t *fademask) else { // pointer to transtable that this mask would use - transtbl = transtables + ((9 - *mask)< FlatColor PF_NoTexture = 0x00002000, // Disable texture diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index e39398ff2..b2d69861a 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -125,13 +125,14 @@ void HWR_DrawPatch(GLPatch_t *gpatch, INT32 x, INT32 y, INT32 option) HWD.pfnDrawPolygon(NULL, v, 4, flags); } -void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 option, const UINT8 *colormap) +void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 option, const UINT8 *colormap, INT32 bflags) { FOutVector v[4]; FBITFIELD flags; float cx = FIXED_TO_FLOAT(x); float cy = FIXED_TO_FLOAT(y); UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT); + UINT8 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT); // 3--2 // | /| @@ -286,22 +287,27 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t v[0].t = v[1].t = 0.0f; v[2].t = v[3].t = gpatch->max_t; - flags = PF_Translucent|PF_NoDepthTest; - if (option & V_WRAPX) flags |= PF_ForceWrapX; if (option & V_WRAPY) flags |= PF_ForceWrapY; // clip it since it is used for bunny scroll in doom I + if (blendmode) + flags = HWR_GetBlendModeFlag(blendmode+1)|PF_NoDepthTest; + else + flags = PF_Translucent|PF_NoDepthTest; + if (alphalevel) { FSurfaceInfo Surf; Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff; + if (alphalevel == 13) Surf.PolyColor.s.alpha = softwaretranstogl_lo[hudtrans]; else if (alphalevel == 14) Surf.PolyColor.s.alpha = softwaretranstogl[hudtrans]; else if (alphalevel == 15) Surf.PolyColor.s.alpha = softwaretranstogl_hi[hudtrans]; else Surf.PolyColor.s.alpha = softwaretranstogl[10-alphalevel]; + flags |= PF_Modulated; HWD.pfnDrawPolygon(&Surf, v, 4, flags); } @@ -455,10 +461,12 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal { FSurfaceInfo Surf; Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff; + if (alphalevel == 13) Surf.PolyColor.s.alpha = softwaretranstogl_lo[cv_translucenthud.value]; else if (alphalevel == 14) Surf.PolyColor.s.alpha = softwaretranstogl[cv_translucenthud.value]; else if (alphalevel == 15) Surf.PolyColor.s.alpha = softwaretranstogl_hi[cv_translucenthud.value]; else Surf.PolyColor.s.alpha = softwaretranstogl[10-alphalevel]; + flags |= PF_Modulated; HWD.pfnDrawPolygon(&Surf, v, 4, flags); } diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b02730814..1fd05d947 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -654,7 +654,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool HWR_Lighting(&Surf, lightlevel, planecolormap); - if (PolyFlags & (PF_Translucent|PF_Fog)) + if (PolyFlags & (PF_Translucent|PF_Fog|PF_Additive|PF_Subtractive|PF_ReverseSubtract|PF_Multiplicative|PF_Environment)) { Surf.PolyColor.s.alpha = (UINT8)alpha; PolyFlags |= PF_Modulated; @@ -836,20 +836,67 @@ static void HWR_DrawSegsSplats(FSurfaceInfo * pSurf) } #endif -FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf) +FBITFIELD HWR_GetBlendModeFlag(INT32 ast) +{ + switch (ast) + { + case AST_TRANSLUCENT: + return PF_Translucent; + case AST_ADD: + return PF_Additive; + case AST_SUBTRACT: + return PF_Subtractive; + case AST_REVERSESUBTRACT: + return PF_ReverseSubtract; + case AST_MODULATE: + return PF_Multiplicative; + default: + return PF_Masked; + } + + return 0; +} + +UINT8 HWR_GetTranstableAlpha(INT32 transtablenum) { switch (transtablenum) { - case tr_trans10 : pSurf->PolyColor.s.alpha = 0xe6;return PF_Translucent; - case tr_trans20 : pSurf->PolyColor.s.alpha = 0xcc;return PF_Translucent; - case tr_trans30 : pSurf->PolyColor.s.alpha = 0xb3;return PF_Translucent; - case tr_trans40 : pSurf->PolyColor.s.alpha = 0x99;return PF_Translucent; - case tr_trans50 : pSurf->PolyColor.s.alpha = 0x80;return PF_Translucent; - case tr_trans60 : pSurf->PolyColor.s.alpha = 0x66;return PF_Translucent; - case tr_trans70 : pSurf->PolyColor.s.alpha = 0x4c;return PF_Translucent; - case tr_trans80 : pSurf->PolyColor.s.alpha = 0x33;return PF_Translucent; - case tr_trans90 : pSurf->PolyColor.s.alpha = 0x19;return PF_Translucent; + case 0 : return 0xff; + case tr_trans10 : return 0xe6; + case tr_trans20 : return 0xcc; + case tr_trans30 : return 0xb3; + case tr_trans40 : return 0x99; + case tr_trans50 : return 0x80; + case tr_trans60 : return 0x66; + case tr_trans70 : return 0x4c; + case tr_trans80 : return 0x33; + case tr_trans90 : return 0x19; } + + return 0xff; +} + +FBITFIELD HWR_SurfaceBlend(INT32 style, INT32 transtablenum, FSurfaceInfo *pSurf) +{ + if (!transtablenum || style <= AST_COPY || style >= AST_OVERLAY) + { + pSurf->PolyColor.s.alpha = 0xff; + return PF_Masked; + } + + pSurf->PolyColor.s.alpha = HWR_GetTranstableAlpha(transtablenum); + return HWR_GetBlendModeFlag(style); +} + +FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf) +{ + if (!transtablenum) + { + pSurf->PolyColor.s.alpha = 0x00; + return PF_Masked; + } + + pSurf->PolyColor.s.alpha = HWR_GetTranstableAlpha(transtablenum); return PF_Translucent; } @@ -1067,8 +1114,8 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, if (cutflag & FF_FOG) HWR_AddTransparentWall(wallVerts, Surf, texnum, noencore, PF_Fog|PF_NoTexture|polyflags, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) - HWR_AddTransparentWall(wallVerts, Surf, texnum, noencore, PF_Translucent|polyflags, false, lightnum, colormap); + else if (polyflags & (PF_Translucent|PF_Additive|PF_Subtractive|PF_ReverseSubtract|PF_Multiplicative|PF_Environment)) + HWR_AddTransparentWall(wallVerts, Surf, texnum, noencore, polyflags, false, lightnum, colormap); else HWR_ProjectWall(wallVerts, Surf, PF_Masked|polyflags, lightnum, colormap); } @@ -3562,6 +3609,12 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) // co-ordinates memcpy(wallVerts, baseWallVerts, sizeof(baseWallVerts)); + INT32 blendmode; + if (spr->mobj->frame & FF_BLENDMASK) + blendmode = ((spr->mobj->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1; + else + blendmode = spr->mobj->blendmode; + if (!cv_translucency.value) // translucency disabled { Surf.PolyColor.s.alpha = 0xFF; @@ -3570,10 +3623,13 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) else if (spr->mobj->flags2 & MF2_SHADOW) { Surf.PolyColor.s.alpha = 0x40; - blend = PF_Translucent; + blend = HWR_GetBlendModeFlag(blendmode); } else if (spr->mobj->frame & FF_TRANSMASK) - blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); + { + INT32 trans = (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT; + blend = HWR_SurfaceBlend(blendmode, trans, &Surf); + } else { // BP: i agree that is little better in environement but it don't @@ -3581,7 +3637,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) // Hurdler: PF_Environement would be cool, but we need to fix // the issue with the fog before Surf.PolyColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; + blend = HWR_GetBlendModeFlag(blendmode)|PF_Occlude; } if (HWR_UseShader()) @@ -3599,8 +3655,10 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) i = 0; temp = FLOAT_TO_FIXED(realtop); - if (spr->mobj->frame & FF_FULLBRIGHT) + if (R_ThingIsFullBright(spr->mobj)) lightlevel = 255; + else if (R_ThingIsFullDark(spr->mobj)) + lightlevel = 0; for (i = 1; i < sector->numlights; i++) { @@ -3614,6 +3672,9 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) break; } + if (R_ThingIsSemiBright(spr->mobj)) + lightlevel = 128 + (lightlevel>>1); + for (i = 0; i < sector->numlights; i++) { if (endtop < endrealbot && top < realbot) @@ -3832,11 +3893,22 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) UINT8 lightlevel = 255; extracolormap_t *colormap = sector->extra_colormap; - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (R_ThingIsFullDark(spr->mobj)) + lightlevel = 0; + else if (!(R_ThingIsFullBright(spr->mobj))) lightlevel = min(sector->lightlevel, 255); + if (R_ThingIsSemiBright(spr->mobj)) + lightlevel = 128 + (lightlevel>>1); + HWR_Lighting(&Surf, lightlevel, colormap); + INT32 blendmode; + if (spr->mobj->frame & FF_BLENDMASK) + blendmode = ((spr->mobj->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1; + else + blendmode = spr->mobj->blendmode; + if (!cv_translucency.value) // translucency disabled { Surf.PolyColor.s.alpha = 0xFF; @@ -3845,10 +3917,13 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) else if (spr->mobj->flags2 & MF2_SHADOW) { Surf.PolyColor.s.alpha = 0x40; - blend = PF_Translucent; + blend = HWR_GetBlendModeFlag(blendmode); } else if (spr->mobj->frame & FF_TRANSMASK) - blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); + { + INT32 trans = (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT; + blend = HWR_SurfaceBlend(blendmode, trans, &Surf); + } else { // BP: i agree that is little better in environement but it don't @@ -3856,7 +3931,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) // Hurdler: PF_Environement would be cool, but we need to fix // the issue with the fog before Surf.PolyColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; + blend = HWR_GetBlendModeFlag(blendmode)|PF_Occlude; } if (HWR_UseShader()) @@ -3946,7 +4021,10 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) HWR_Lighting(&Surf, lightlevel, colormap); if (spr->mobj->frame & FF_TRANSMASK) - blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); + { + INT32 trans = (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT; + blend = HWR_SurfaceBlend(AST_TRANSLUCENT, trans, &Surf); + } else { // BP: i agree that is little better in environement but it don't @@ -3954,7 +4032,7 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) // Hurdler: PF_Environement would be cool, but we need to fix // the issue with the fog before Surf.PolyColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; + blend = HWR_GetBlendModeFlag(AST_TRANSLUCENT)|PF_Occlude; } if (HWR_UseShader()) @@ -4473,6 +4551,19 @@ static void HWR_ProjectSprite(mobj_t *thing) if (interp.spritexscale < 1 || interp.spriteyscale < 1) return; + INT32 blendmode; + if (thing->frame & FF_BLENDMASK) + blendmode = ((thing->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1; + else + blendmode = thing->blendmode; + + // Visibility check by the blend mode. + if (thing->frame & FF_TRANSMASK) + { + if (!R_BlendLevelVisible(blendmode, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT)) + return; + } + this_scale = FIXED_TO_FLOAT(interp.scale); spritexscale = FIXED_TO_FLOAT(interp.spritexscale); spriteyscale = FIXED_TO_FLOAT(interp.spriteyscale); @@ -4797,6 +4888,13 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) R_InterpolatePrecipMobjState(thing, FRACUNIT, &interp); } + // Visibility check by the blend mode. + if (thing->frame & FF_TRANSMASK) + { + if (!R_BlendLevelVisible(thing->blendmode, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT)) + return; + } + this_scale = FIXED_TO_FLOAT(interp.scale); // transform the origin point @@ -5190,7 +5288,7 @@ static void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox) for (x = vid.width>>1; x < vid.width; x += pw) { for (y = vid.height>>1; y < vid.height; y += ph) - HWR_DrawStretchyFixedPatch(gpatch, (x)<mobj->flags2 & MF2_SHADOW) + { Surf.PolyColor.s.alpha = 0x40; + Surf.PolyFlags = HWR_GetBlendModeFlag(spr->mobj->blendmode); + } else if (spr->mobj->frame & FF_TRANSMASK) + { HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); + Surf.PolyFlags = HWR_SurfaceBlend(spr->mobj->blendmode, (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); + } else + { Surf.PolyColor.s.alpha = 0xFF; + Surf.PolyFlags = 0; + } // dont forget to enabled the depth test because we can't do this like // before: polygons models are not sorted diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 4b98f332d..231f2b01e 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -490,6 +490,10 @@ static PFNglDeleteBuffers pglDeleteBuffers; typedef void (APIENTRY *PFNglColorPointer) (GLint, GLenum, GLsizei, const GLvoid*); static PFNglColorPointer pglColorPointer; +/* 2.0 functions */ +typedef void (APIENTRY * PFNglBlendEquation) (GLenum mode); +static PFNglBlendEquation pglBlendEquation; + /* 1.2 Parms */ /* GL_CLAMP_TO_EDGE_EXT */ #ifndef GL_CLAMP_TO_EDGE @@ -734,6 +738,9 @@ void SetupGLFunc4(void) pglBufferData = GetGLFunc("glBufferData"); pglDeleteBuffers = GetGLFunc("glDeleteBuffers"); pglColorPointer = GetGLFunc("glColorPointer"); + + /* 2.0 funcs */ + pglBlendEquation = GetGLFunc("glBlendEquation"); pglStencilFuncSeparate = GetGLFunc("glStencilFuncSeparate"); pglStencilOpSeparate = GetGLFunc("glStencilOpSeparate"); @@ -1397,7 +1404,11 @@ EXPORT void HWRAPI(Draw2DLine) (F2DCoord * v1, pglEnableClientState(GL_TEXTURE_COORD_ARRAY); pglEnable(GL_TEXTURE_2D); } - +// -----------------+ +// SetBlend : Set render mode +// -----------------+ +// PF_Masked - we could use an ALPHA_TEST of GL_EQUAL, and alpha ref of 0, +// is it faster when pixels are discarded ? static void Clamp2D(GLenum pname) { pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP); // fallback clamp @@ -1406,57 +1417,95 @@ static void Clamp2D(GLenum pname) #endif } -// -----------------+ -// SetBlend : Set render mode -// -----------------+ -// PF_Masked - we could use an ALPHA_TEST of GL_EQUAL, and alpha ref of 0, -// is it faster when pixels are discarded ? +static void SetBlendEquation(GLenum mode) +{ + if (pglBlendEquation) + pglBlendEquation(mode); +} + +static void SetBlendMode(FBITFIELD flags) +{ + // Set blending function + switch (flags) + { + case PF_Translucent & PF_Blending: + pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency + break; + case PF_Masked & PF_Blending: + // Hurdler: does that mean lighting is only made by alpha src? + // it sounds ok, but not for polygonsmooth + pglBlendFunc(GL_SRC_ALPHA, GL_ZERO); // 0 alpha = holes in texture + break; + case PF_Additive & PF_Blending: + case PF_Subtractive & PF_Blending: + case PF_ReverseSubtract & PF_Blending: + pglBlendFunc(GL_SRC_ALPHA, GL_ONE); // src * alpha + dest + break; + case PF_Environment & PF_Blending: + pglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + break; + case PF_Multiplicative & PF_Blending: + pglBlendFunc(GL_DST_COLOR, GL_ZERO); + break; + case PF_Fog & PF_Fog: + // Sryder: Fog + // multiplies input colour by input alpha, and destination colour by input colour, then adds them + pglBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR); + break; + default: // must be 0, otherwise it's an error + // No blending + pglBlendFunc(GL_ONE, GL_ZERO); // the same as no blending + break; + } + + // Set blending equation + switch (flags) + { + case PF_Subtractive & PF_Blending: + SetBlendEquation(GL_FUNC_SUBTRACT); + break; + case PF_ReverseSubtract & PF_Blending: + // good for shadow + // not really but what else ? + SetBlendEquation(GL_FUNC_REVERSE_SUBTRACT); + break; + default: + SetBlendEquation(GL_FUNC_ADD); + break; + } + + // Alpha test + switch (flags) + { + case PF_Masked & PF_Blending: + pglAlphaFunc(GL_GREATER, 0.5f); + break; + case PF_Translucent & PF_Blending: + case PF_Additive & PF_Blending: + case PF_Subtractive & PF_Blending: + case PF_ReverseSubtract & PF_Blending: + case PF_Environment & PF_Blending: + case PF_Multiplicative & PF_Blending: + pglAlphaFunc(GL_NOTEQUAL, 0.0f); + break; + case PF_Fog & PF_Fog: + pglAlphaFunc(GL_ALWAYS, 0.0f); // Don't discard zero alpha fragments + break; + default: + pglAlphaFunc(GL_GREATER, 0.5f); + break; + } +} + EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags) { FBITFIELD Xor; Xor = CurrentPolyFlags^PolyFlags; - if (Xor & (PF_Blending|PF_RemoveYWrap|PF_ForceWrapX|PF_ForceWrapY|PF_Occlude|PF_NoTexture|PF_Modulated|PF_NoDepthTest|PF_Decal|PF_Invisible|PF_NoAlphaTest)) + if (Xor & (PF_Blending|PF_RemoveYWrap|PF_ForceWrapX|PF_ForceWrapY|PF_Occlude|PF_NoTexture|PF_Modulated|PF_NoDepthTest|PF_Decal|PF_Invisible)) { - if (Xor&(PF_Blending)) // if blending mode must be changed - { - switch (PolyFlags & PF_Blending) { - case PF_Translucent & PF_Blending: - pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency - pglAlphaFunc(GL_NOTEQUAL, 0.0f); - break; - case PF_Masked & PF_Blending: - // Hurdler: does that mean lighting is only made by alpha src? - // it sounds ok, but not for polygonsmooth - pglBlendFunc(GL_SRC_ALPHA, GL_ZERO); // 0 alpha = holes in texture - pglAlphaFunc(GL_GREATER, 0.5f); - break; - case PF_Additive & PF_Blending: - pglBlendFunc(GL_SRC_ALPHA, GL_ONE); // src * alpha + dest - pglAlphaFunc(GL_NOTEQUAL, 0.0f); - break; - case PF_Environment & PF_Blending: - pglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - pglAlphaFunc(GL_NOTEQUAL, 0.0f); - break; - case PF_Substractive & PF_Blending: - // good for shadow - // not really but what else ? - pglBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); - pglAlphaFunc(GL_NOTEQUAL, 0.0f); - break; - case PF_Fog & PF_Fog: - // Sryder: Fog - // multiplies input colour by input alpha, and destination colour by input colour, then adds them - pglBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR); - pglAlphaFunc(GL_ALWAYS, 0.0f); // Don't discard zero alpha fragments - break; - default : // must be 0, otherwise it's an error - // No blending - pglBlendFunc(GL_ONE, GL_ZERO); // the same as no blending - pglAlphaFunc(GL_GREATER, 0.5f); - break; - } - } + if (Xor & PF_Blending) // if blending mode must be changed + SetBlendMode(PolyFlags & PF_Blending); + if (Xor & PF_NoAlphaTest) { if (PolyFlags & PF_NoAlphaTest) @@ -1472,7 +1521,8 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags) else pglDisable(GL_POLYGON_OFFSET_FILL); } - if (Xor&PF_NoDepthTest) + + if (Xor & PF_NoDepthTest) { if (PolyFlags & PF_NoDepthTest) pglDepthFunc(GL_ALWAYS); //pglDisable(GL_DEPTH_TEST); @@ -1480,25 +1530,25 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags) pglDepthFunc(GL_LEQUAL); //pglEnable(GL_DEPTH_TEST); } - if (Xor&PF_RemoveYWrap) + if (Xor & PF_RemoveYWrap) { if (PolyFlags & PF_RemoveYWrap) Clamp2D(GL_TEXTURE_WRAP_T); } - if (Xor&PF_ForceWrapX) + if (Xor & PF_ForceWrapX) { if (PolyFlags & PF_ForceWrapX) pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); } - if (Xor&PF_ForceWrapY) + if (Xor & PF_ForceWrapY) { if (PolyFlags & PF_ForceWrapY) pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } - if (Xor&PF_Modulated) + if (Xor & PF_Modulated) { #if defined (__unix__) || defined (UNIXCOMMON) if (oglflags & GLF_NOTEXENV) @@ -2721,14 +2771,11 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float poly.green = byte2float[Surface->PolyColor.s.green]; poly.blue = byte2float[Surface->PolyColor.s.blue]; poly.alpha = byte2float[Surface->PolyColor.s.alpha]; - - if (poly.alpha < 1) - SetBlend(PF_Translucent|PF_Modulated); - else - SetBlend(PF_Masked|PF_Modulated|PF_Occlude); - + pglColor4ubv((GLubyte*)&Surface->PolyColor.s); + SetBlend((poly.alpha < 1 ? Surface->PolyFlags : (PF_Masked|PF_Occlude))|PF_Modulated); + tint.red = byte2float[Surface->TintColor.s.red]; tint.green = byte2float[Surface->TintColor.s.green]; tint.blue = byte2float[Surface->TintColor.s.blue]; diff --git a/src/k_kart.c b/src/k_kart.c index c27ffec4c..15b649dac 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8851,10 +8851,10 @@ static void K_drawKartSpeedometer(void) if (K_UseColorHud() && xtra_speedo_clr3) //Colourized hud { UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE); - V_DrawStretchyFixedPatch((SPDM_X-1)<patch = patch; item->flags = flags; item->colormap = colormap; + item->blend = blend; } void LUA_HUD_AddDrawScaled( @@ -366,7 +369,8 @@ void LUA_HUD_AddDrawScaled( fixed_t scale, patch_t *patch, INT32 flags, - UINT8 *colormap + UINT8 *colormap, + INT32 blend ) { size_t i = AllocateDrawItem(list); @@ -379,6 +383,7 @@ void LUA_HUD_AddDrawScaled( item->patch = patch; item->flags = flags; item->colormap = colormap; + item->blend = blend; } void LUA_HUD_AddDrawStretched( @@ -389,7 +394,8 @@ void LUA_HUD_AddDrawStretched( fixed_t vscale, patch_t *patch, INT32 flags, - UINT8 *colormap + UINT8 *colormap, + INT32 blend ) { size_t i = AllocateDrawItem(list); @@ -403,6 +409,7 @@ void LUA_HUD_AddDrawStretched( item->patch = patch; item->flags = flags; item->colormap = colormap; + item->blend = blend; } void LUA_HUD_AddDrawNum( @@ -634,17 +641,17 @@ void LUA_HUD_DrawList(huddrawlist_h list) case DI_Draw: if (!item->patch || item->patch == NULL) return; - V_DrawFixedPatch(LERPS(x), LERPS(y), FRACUNIT, item->flags, item->patch, item->colormap); + V_DrawBlendingFixedPatch(LERPS(x), LERPS(y), FRACUNIT, item->flags, item->patch, item->colormap, item->blend); break; case DI_DrawScaled: if (!item->patch || item->patch == NULL) return; - V_DrawFixedPatch(LERPS(x), LERPS(y), LERP(scale), item->flags, item->patch, item->colormap); + V_DrawBlendingFixedPatch(LERPS(x), LERPS(y), LERP(scale), item->flags, item->patch, item->colormap, item->blend); break; case DI_DrawStretched: if (!item->patch || item->patch == NULL) return; - V_DrawStretchyFixedPatch(LERPS(x), LERPS(y), LERP(hscale), LERP(vscale), item->flags, item->patch, item->colormap); + V_DrawStretchyFixedPatch(LERPS(x), LERPS(y), LERP(hscale), LERP(vscale), item->flags, item->patch, item->colormap, item->blend); break; case DI_DrawNum: V_DrawTallNum(LERPS(x), LERPS(y), item->flags, item->num); diff --git a/src/lua_hudlib_drawlist.h b/src/lua_hudlib_drawlist.h index 4354b6f95..4d19bcae2 100644 --- a/src/lua_hudlib_drawlist.h +++ b/src/lua_hudlib_drawlist.h @@ -40,7 +40,8 @@ void LUA_HUD_AddDraw( INT32 y, patch_t *patch, INT32 flags, - UINT8 *colormap + UINT8 *colormap, + INT32 blend ); void LUA_HUD_AddDrawStretched( huddrawlist_h list, @@ -50,7 +51,8 @@ void LUA_HUD_AddDrawStretched( fixed_t vscale, patch_t *patch, INT32 flags, - UINT8 *colormap + UINT8 *colormap, + INT32 blend ); void LUA_HUD_AddDrawScaled( huddrawlist_h list, @@ -59,7 +61,8 @@ void LUA_HUD_AddDrawScaled( fixed_t scale, patch_t *patch, INT32 flags, - UINT8 *colormap + UINT8 *colormap, + INT32 blend ); void LUA_HUD_AddDrawNum( huddrawlist_h list, diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 7385cccf6..13b3a1286 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -52,6 +52,7 @@ int mobj_skin_setter(lua_State *L); int mobj_localskin_getter(lua_State *L); int mobj_localskin_setter(lua_State *L); int mobj_color_setter(lua_State *L); +int mobj_blendmode_setter(lua_State *L); int mobj_bnext_noset(lua_State *L); int mobj_bprev_unimplemented(lua_State *L); int mobj_hnext_setter(lua_State *L); @@ -114,6 +115,7 @@ static const udata_field_t mobj_fields[] = { FIELD(mobj_t, skin, mobj_skin_getter, mobj_skin_setter), FIELD(mobj_t, localskin, mobj_localskin_getter, mobj_localskin_setter), FIELD(mobj_t, color, udatalib_getter_uint8, mobj_color_setter), + FIELD(mobj_t, blendmode, udatalib_getter_int32, mobj_blendmode_setter), FIELD(mobj_t, bnext, udatalib_getter_mobj, mobj_bnext_noset), FIELD(mobj_t, bprev, mobj_bprev_unimplemented, mobj_bprev_unimplemented), FIELD(mobj_t, hnext, udatalib_getter_mobj, mobj_hnext_setter), @@ -476,6 +478,18 @@ int mobj_color_setter(lua_State *L) return 0; } +int mobj_blendmode_setter(lua_State *L) +{ + mobj_t *mo = GETMO(); + + INT32 blendmode = (INT32)luaL_checkinteger(L, 2); + if (blendmode < 0 || blendmode > AST_OVERLAY) + return luaL_error(L, "mobj.blendmode %d out of range (0 - %d).", blendmode, AST_OVERLAY); + mo->blendmode = blendmode; + + return 0; +} + int mobj_hnext_setter(lua_State *L) { mobj_t *mo = GETMO(); diff --git a/src/m_anigif.c b/src/m_anigif.c index 44b5a96c0..05b1f8287 100644 --- a/src/m_anigif.c +++ b/src/m_anigif.c @@ -32,6 +32,7 @@ consvar_t cv_gif_downscale = {"gif_downscale", "On", CV_SAVE, CV_OnOff, NULL, 0 #ifdef HAVE_ANIGIF static boolean gif_optimize = false; // So nobody can do something dumb static boolean gif_downscale = false; // like changing cvars mid output +static RGBA_t *gif_palette = NULL; static FILE *gif_out = NULL; static INT32 gif_frames = 0; @@ -461,13 +462,15 @@ static size_t gifframe_size = 8192; // converts an RGB frame to a frame with a palette. // #ifdef HWRENDER +static colorlookup_t gif_colorlookup; + static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr) { UINT8 r, g, b; size_t src, dest; int x, y; - InitColorLUT(); + InitColorLUT(&gif_colorlookup, gif_palette, true); for (x = 0; x < vid.width; x += scrbuf_downscaleamt) { @@ -479,7 +482,7 @@ static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr) r = (UINT8)linear[src]; g = (UINT8)linear[src + 1]; b = (UINT8)linear[src + 2]; - scr[dest] = colorlookup[r >> SHIFTCOLORBITS][g >> SHIFTCOLORBITS][b >> SHIFTCOLORBITS]; + scr[dest] = GetColorLUTDirect(&gif_colorlookup, r, g, b); } } } @@ -636,6 +639,10 @@ INT32 GIF_open(const char *filename) gif_optimize = (!!cv_gif_optimize.value); gif_downscale = (!!cv_gif_downscale.value); + + // no master palettes in SRB2Kart land + gif_palette = pLocalPalette; + GIF_headwrite(); gif_frames = 0; return 1; diff --git a/src/p_mobj.c b/src/p_mobj.c index ad296c576..a916190a9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9413,6 +9413,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) } // Sprite rendering + mobj->blendmode = AST_TRANSLUCENT; mobj->realxscale = mobj->realyscale = mobj->scale; mobj->spritexscale = mobj->realxscale; mobj->spriteyscale = mobj->realyscale; diff --git a/src/p_mobj.h b/src/p_mobj.h index cd7c64dc1..2aecf73b5 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -289,6 +289,7 @@ typedef struct mobj_s UINT32 frame; // frame number, plus bits see p_pspr.h UINT16 anim_duration; // for FF_ANIMATE states + INT32 blendmode; // blend mode fixed_t spritexscale, spriteyscale; fixed_t spritexoffset, spriteyoffset; fixed_t old_spritexscale, old_spriteyscale; @@ -441,6 +442,7 @@ typedef struct precipmobj_s UINT32 frame; // frame number, plus bits see p_pspr.h UINT16 anim_duration; // for FF_ANIMATE states + INT32 blendmode; // blend mode fixed_t spritexscale, spriteyscale; fixed_t spritexoffset, spriteyoffset; fixed_t old_spritexscale, old_spriteyscale; diff --git a/src/p_pspr.h b/src/p_pspr.h index 5ac1d1d84..90cfc40fc 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -41,10 +41,18 @@ #define FF_HORIZONTALFLIP 0x400 /// \brief Frame flags: Thin, paper-like sprite (for collision equivalent, see MF_PAPERCOLLISION) #define FF_PAPERSPRITE 0x800 -/// \brief Frame flags: Simple stateless animation -#define FF_ANIMATE 0x4000 -/// \brief Frame flags: frame always appears full bright -#define FF_FULLBRIGHT 0x8000 + +/// \brief Frame flags: blend types +#define FF_BLENDMASK 0x7000 +/// \brief shift for FF_BLENDMASK +#define FF_BLENDSHIFT 12 +/// \brief preshifted blend flags minus 1 as effects don't distinguish between AST_COPY and AST_TRANSLUCENT +#define FF_ADD ((AST_ADD-1)<mirrored = 0; // Sprite Rendering stuff + mobj->blendmode = AST_TRANSLUCENT; mobj->spritexoffset = 0; mobj->spriteyoffset = 0; mobj->spritexscale = FRACUNIT; diff --git a/src/r_data.c b/src/r_data.c index 98431510d..b88554c9f 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -126,6 +126,113 @@ size_t flatmemory, spritememory, texturememory; // gotta play by 2.2 rules to ge INT16 color8to16[256]; // remap color index to highcolor rgb value INT16 *hicolormaps; // test a 32k colormap remaps high -> high +// Blends two pixels together, using the equation +// that matches the specified alpha style. +UINT32 ASTBlendPixel(RGBA_t background, RGBA_t foreground, int style, UINT8 alpha) +{ + RGBA_t output; + INT16 fullalpha = (alpha - (0xFF - foreground.s.alpha)); + if (style == AST_TRANSLUCENT) + { + if (fullalpha <= 0) + output.rgba = background.rgba; + else + { + // don't go too high + if (fullalpha >= 0xFF) + fullalpha = 0xFF; + alpha = (UINT8)fullalpha; + + // if the background pixel is empty, + // match software and don't blend anything + if (!background.s.alpha) + { + // ...unless the foreground pixel ISN'T actually translucent. + if (alpha == 0xFF) + output.rgba = foreground.rgba; + else + output.rgba = 0; + } + else + { + UINT8 beta = (0xFF - alpha); + output.s.red = ((background.s.red * beta) + (foreground.s.red * alpha)) / 0xFF; + output.s.green = ((background.s.green * beta) + (foreground.s.green * alpha)) / 0xFF; + output.s.blue = ((background.s.blue * beta) + (foreground.s.blue * alpha)) / 0xFF; + output.s.alpha = 0xFF; + } + } + return output.rgba; + } +#define clamp(c) max(min(c, 0xFF), 0x00); + else + { + float falpha = ((float)alpha / 256.0f); + float fr = ((float)foreground.s.red * falpha); + float fg = ((float)foreground.s.green * falpha); + float fb = ((float)foreground.s.blue * falpha); + if (style == AST_ADD) + { + output.s.red = clamp((int)(background.s.red + fr)); + output.s.green = clamp((int)(background.s.green + fg)); + output.s.blue = clamp((int)(background.s.blue + fb)); + } + else if (style == AST_SUBTRACT) + { + output.s.red = clamp((int)(background.s.red - fr)); + output.s.green = clamp((int)(background.s.green - fg)); + output.s.blue = clamp((int)(background.s.blue - fb)); + } + else if (style == AST_REVERSESUBTRACT) + { + output.s.red = clamp((int)((-background.s.red) + fr)); + output.s.green = clamp((int)((-background.s.green) + fg)); + output.s.blue = clamp((int)((-background.s.blue) + fb)); + } + else if (style == AST_MODULATE) + { + fr = ((float)foreground.s.red / 256.0f); + fg = ((float)foreground.s.green / 256.0f); + fb = ((float)foreground.s.blue / 256.0f); + output.s.red = clamp((int)(background.s.red * fr)); + output.s.green = clamp((int)(background.s.green * fg)); + output.s.blue = clamp((int)(background.s.blue * fb)); + } + // just copy the pixel + else if (style == AST_COPY) + output.rgba = foreground.rgba; + + output.s.alpha = 0xFF; + return output.rgba; + } +#undef clamp + return 0; +} + +INT32 ASTTextureBlendingThreshold[2] = {255/11, (10*255/11)}; + +// Blends a pixel for a texture patch. +UINT32 ASTBlendTexturePixel(RGBA_t background, RGBA_t foreground, int style, UINT8 alpha) +{ + // Alpha style set to translucent? + if (style == AST_TRANSLUCENT) + { + // Is the alpha small enough for translucency? + if (alpha <= ASTTextureBlendingThreshold[1]) + { + // Is the patch way too translucent? Don't blend then. + if (alpha < ASTTextureBlendingThreshold[0]) + return background.rgba; + + return ASTBlendPixel(background, foreground, style, alpha); + } + else // just copy the pixel + return foreground.rgba; + } + else + return ASTBlendPixel(background, foreground, style, alpha); +} + // Painfully simple texture id cacheing to make maps load faster. :3 static struct { char name[9]; diff --git a/src/r_data.h b/src/r_data.h index ec1146322..f27dd0822 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -56,6 +56,9 @@ extern INT32 *texturewidthmask; extern fixed_t *textureheight; // needed for texture pegging +UINT32 ASTBlendPixel(RGBA_t background, RGBA_t foreground, int style, UINT8 alpha); +UINT32 ASTBlendTexturePixel(RGBA_t background, RGBA_t foreground, int style, UINT8 alpha); + extern INT16 color8to16[256]; // remap color index to highcolor extern INT16 *hicolormaps; // remap high colors to high colors.. diff --git a/src/r_defs.h b/src/r_defs.h index bc95649bb..7c063505c 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -687,6 +687,9 @@ typedef struct #pragma pack() #endif +// Possible alpha types for a patch. +enum patchalphastyle {AST_COPY, AST_TRANSLUCENT, AST_ADD, AST_SUBTRACT, AST_REVERSESUBTRACT, AST_MODULATE, AST_OVERLAY}; + typedef enum { SRF_SINGLE = 0, // 0-angle for all rotations diff --git a/src/r_draw.c b/src/r_draw.c index faa9ba638..d41e542a5 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -86,6 +86,7 @@ INT32 dc_sourcelength; #define NUMTRANSTABLES 9 // how many translucency tables are used UINT8 *transtables; // translucency tables +UINT8 *blendtables[NUMBLENDMAPS]; /** \brief R_DrawTransColumn uses this */ @@ -213,11 +214,11 @@ const UINT8 Color_Opposite[MAXSKINCOLORS*2] = CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1]; -/** \brief The R_InitTranslationTables +#define TRANSTAB_AMTMUL10 (256.0f / 10.0f) - load in color translation tables +/** \brief Initializes the translucency tables used by the Software renderer. */ -void R_InitTranslationTables(void) +void R_InitTranslucencyTables(void) { // Load here the transparency lookup tables 'TINTTAB' // NOTE: the TINTTAB resource MUST BE aligned on 64k for the asm @@ -234,6 +235,189 @@ void R_InitTranslationTables(void) W_ReadLump(W_GetNumForName("TRANS70"), transtables+0x60000); W_ReadLump(W_GetNumForName("TRANS80"), transtables+0x70000); W_ReadLump(W_GetNumForName("TRANS90"), transtables+0x80000); + + R_GenerateBlendTables(); +} + +static colorlookup_t transtab_lut; + +static void BlendTab_Translucent(UINT8 *table, int style, UINT8 blendamt) +{ + INT16 bg, fg; + + if (table == NULL) + I_Error("BlendTab_Translucent: input table was NULL!"); + + for (bg = 0; bg < 0xFF; bg++) + { + for (fg = 0; fg < 0xFF; fg++) + { + RGBA_t backrgba = V_GetColor(bg); + RGBA_t frontrgba = V_GetColor(fg); + RGBA_t result; + + result.rgba = ASTBlendPixel(backrgba, frontrgba, style, 0xFF); + result.rgba = ASTBlendPixel(result, frontrgba, AST_TRANSLUCENT, blendamt); + + table[((bg * 0x100) + fg)] = GetColorLUT(&transtab_lut, result.s.red, result.s.green, result.s.blue); + } + } +} + +static void BlendTab_Subtractive(UINT8 *table, int style, UINT8 blendamt) +{ + INT16 bg, fg; + + if (table == NULL) + I_Error("BlendTab_Subtractive: input table was NULL!"); + + if (blendamt == 0xFF) + { + memset(table, GetColorLUT(&transtab_lut, 0, 0, 0), 0x10000); + return; + } + + for (bg = 0; bg < 0xFF; bg++) + { + for (fg = 0; fg < 0xFF; fg++) + { + RGBA_t backrgba = V_GetColor(bg); + RGBA_t frontrgba = V_GetColor(fg); + RGBA_t result; + + result.rgba = ASTBlendPixel(backrgba, frontrgba, style, 0xFF); + result.s.red = max(0, result.s.red - blendamt); + result.s.green = max(0, result.s.green - blendamt); + result.s.blue = max(0, result.s.blue - blendamt); + + table[((bg * 0x100) + fg)] = GetColorLUT(&transtab_lut, result.s.red, result.s.green, result.s.blue); + } + } +} + +static void BlendTab_Modulative(UINT8 *table) +{ + INT16 bg, fg; + + if (table == NULL) + I_Error("BlendTab_Modulative: input table was NULL!"); + + for (bg = 0; bg < 0xFF; bg++) + { + for (fg = 0; fg < 0xFF; fg++) + { + RGBA_t backrgba = V_GetColor(bg); + RGBA_t frontrgba = V_GetColor(fg); + RGBA_t result; + result.rgba = ASTBlendPixel(backrgba, frontrgba, AST_MODULATE, 0); + table[((bg * 0x100) + fg)] = GetColorLUT(&transtab_lut, result.s.red, result.s.green, result.s.blue); + } + } +} + +static INT32 BlendTab_Count[NUMBLENDMAPS] = +{ + NUMTRANSTABLES, // blendtab_add + NUMTRANSTABLES+1, // blendtab_subtract + NUMTRANSTABLES+1, // blendtab_reversesubtract + 1 // blendtab_modulate +}; + +static INT32 BlendTab_FromStyle[] = +{ + 0, // AST_COPY + 0, // AST_TRANSLUCENT + blendtab_add, // AST_ADD + blendtab_subtract, // AST_SUBTRACT + blendtab_reversesubtract, // AST_REVERSESUBTRACT + blendtab_modulate, // AST_MODULATE + 0 // AST_OVERLAY +}; + +static void BlendTab_GenerateMaps(INT32 tab, INT32 style, void (*genfunc)(UINT8 *, int, UINT8)) +{ + INT32 i = 0, num = BlendTab_Count[tab]; + const float amtmul = (256.0f / (float)(NUMTRANSTABLES)); + for (; i < num; i++) + { + const size_t offs = (0x10000 * i); + const UINT16 alpha = min(amtmul * i, 0xFF); + genfunc(blendtables[tab] + offs, style, alpha); + } +} + +void R_GenerateBlendTables(void) +{ + INT32 i; + + for (i = 0; i < NUMBLENDMAPS; i++) + blendtables[i] = Z_MallocAlign(BlendTab_Count[i] * 0x10000, PU_STATIC, NULL, 16); + + InitColorLUT(&transtab_lut, pLocalPalette, false); + + // Additive + BlendTab_GenerateMaps(blendtab_add, AST_ADD, BlendTab_Translucent); + + // Subtractive +#if 1 + BlendTab_GenerateMaps(blendtab_subtract, AST_SUBTRACT, BlendTab_Subtractive); +#else + BlendTab_GenerateMaps(blendtab_subtract, AST_SUBTRACT, BlendTab_Translucent); +#endif + + // Reverse subtractive + BlendTab_GenerateMaps(blendtab_reversesubtract, AST_REVERSESUBTRACT, BlendTab_Translucent); + + // Modulative blending only requires a single table + BlendTab_Modulative(blendtables[blendtab_modulate]); +} + +#define ClipBlendLevel(style, trans) max(min((trans), BlendTab_Count[BlendTab_FromStyle[style]]-1), 0) +#define ClipTransLevel(trans) max(min((trans), NUMTRANSMAPS-2), 0) + +UINT8 *R_GetTranslucencyTable(INT32 alphalevel) +{ + return transtables + (ClipTransLevel(alphalevel-1) << FF_TRANSSHIFT); +} + +UINT8 *R_GetBlendTable(int style, INT32 alphalevel) +{ + size_t offs; + + if (style == AST_COPY || style == AST_OVERLAY) + return NULL; + + offs = (ClipBlendLevel(style, alphalevel) << FF_TRANSSHIFT); + + // Lactozilla: Returns the equivalent to AST_TRANSLUCENT + // if no alpha style matches any of the blend tables. + switch (style) + { + case AST_ADD: + return blendtables[blendtab_add] + offs; + case AST_SUBTRACT: + return blendtables[blendtab_subtract] + offs; + case AST_REVERSESUBTRACT: + return blendtables[blendtab_reversesubtract] + offs; + case AST_MODULATE: + return blendtables[blendtab_modulate]; + default: + break; + } + + // Return a normal translucency table + if (--alphalevel >= 0) + return transtables + (ClipTransLevel(alphalevel) << FF_TRANSSHIFT); + else + return NULL; +} + +boolean R_BlendLevelVisible(INT32 blendmode, INT32 alphalevel) +{ + if (blendmode == AST_COPY || blendmode == AST_SUBTRACT || blendmode == AST_MODULATE || blendmode == AST_OVERLAY) + return true; + + return (alphalevel < BlendTab_Count[BlendTab_FromStyle[blendmode]]); } /** \brief Retrieves a translation colormap from the cache. diff --git a/src/r_draw.h b/src/r_draw.h index 7dbeda7c9..39587a696 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -40,7 +40,6 @@ extern UINT8 dc_hires; extern UINT8 *dc_source; // first pixel in a column // translucency stuff here -extern UINT8 *transtables; // translucency tables, should be (*transtables)[5][256][256] extern UINT8 *dc_transmap; // translation stuff here @@ -117,7 +116,6 @@ extern lumpnum_t viewborderlump[8]; #define TC_BLINK -6 // For item blinking // Initialize color translation tables, for player rendering etc. -void R_InitTranslationTables(void); UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags); UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local); patch_t* R_GetSkinFaceRank(player_t* ply); @@ -126,6 +124,27 @@ patch_t* R_GetSkinFaceMini(player_t* ply); void R_FlushTranslationColormapCache(void); UINT8 R_GetColorByName(const char *name); +extern UINT8 *transtables; // translucency tables, should be (*transtables)[5][256][256] + +enum +{ + blendtab_add, + blendtab_subtract, + blendtab_reversesubtract, + blendtab_modulate, + NUMBLENDMAPS +}; + +extern UINT8 *blendtables[NUMBLENDMAPS]; + +void R_InitTranslucencyTables(void); +void R_GenerateBlendTables(void); + +UINT8 *R_GetTranslucencyTable(INT32 alphalevel); +UINT8 *R_GetBlendTable(int style, INT32 alphalevel); + +boolean R_BlendLevelVisible(INT32 blendmode, INT32 alphalevel); + // Custom player skin translation void R_InitViewBuffer(INT32 width, INT32 height); void R_InitViewBorder(void); diff --git a/src/r_main.c b/src/r_main.c index 1c45d4112..9c90e108f 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1036,8 +1036,8 @@ void R_Init(void) //I_OutputMsg("\nR_InitLightTables"); R_InitLightTables(); - //I_OutputMsg("\nR_InitTranslationTables\n"); - R_InitTranslationTables(); + //I_OutputMsg("\nR_InitTranslucencyTables\n"); + R_InitTranslucencyTables(); R_InitDrawNodes(); diff --git a/src/r_plane.c b/src/r_plane.c index d8d77457f..9b13bb062 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -796,7 +796,7 @@ void R_DrawSinglePlane(visplane_t *pl) if (pl->polyobj->translucency >= 10) return; // Don't even draw it else if (pl->polyobj->translucency > 0) - ds_transmap = transtables + ((pl->polyobj->translucency-1)<polyobj->translucency); else // Opaque, but allow transparent flat pixels spanfunc = splatfunc; @@ -836,23 +836,23 @@ void R_DrawSinglePlane(visplane_t *pl) if (pl->ffloor->alpha < 12) return; // Don't even draw it else if (pl->ffloor->alpha < 38) - ds_transmap = transtables + ((tr_trans90-1)<ffloor->alpha < 64) - ds_transmap = transtables + ((tr_trans80-1)<ffloor->alpha < 89) - ds_transmap = transtables + ((tr_trans70-1)<ffloor->alpha < 115) - ds_transmap = transtables + ((tr_trans60-1)<ffloor->alpha < 140) - ds_transmap = transtables + ((tr_trans50-1)<ffloor->alpha < 166) - ds_transmap = transtables + ((tr_trans40-1)<ffloor->alpha < 192) - ds_transmap = transtables + ((tr_trans30-1)<ffloor->alpha < 217) - ds_transmap = transtables + ((tr_trans20-1)<ffloor->alpha < 243) - ds_transmap = transtables + ((tr_trans10-1)<special-900)<special-899)); colfunc = fuzzcolfunc; break; case 909: @@ -343,7 +343,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) if (curline->polyseg->translucency >= NUMTRANSMAPS) return; - dc_transmap = transtables + ((curline->polyseg->translucency-1)<polyseg->translucency); colfunc = fuzzcolfunc; } @@ -714,23 +714,23 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) if (pfloor->alpha < 12) return; // Don't even draw it else if (pfloor->alpha < 38) - dc_transmap = transtables + ((tr_trans90-1)<alpha < 64) - dc_transmap = transtables + ((tr_trans80-1)<alpha < 89) - dc_transmap = transtables + ((tr_trans70-1)<alpha < 115) - dc_transmap = transtables + ((tr_trans60-1)<alpha < 140) - dc_transmap = transtables + ((tr_trans50-1)<alpha < 166) - dc_transmap = transtables + ((tr_trans40-1)<alpha < 192) - dc_transmap = transtables + ((tr_trans30-1)<alpha < 217) - dc_transmap = transtables + ((tr_trans20-1)<alpha < 243) - dc_transmap = transtables + ((tr_trans10-1)<extra_colormap = sector->lightlist[i].extra_colormap; - if (!((thing->frame & (FF_FULLBRIGHT|FF_TRANSMASK) || thing->flags2 & MF2_SHADOW) + if (!((newsprite->cut & SC_FULLBRIGHT) && (!newsprite->extra_colormap || !(newsprite->extra_colormap->fog & 1)))) { lindex = FixedMul(sprite->xscale, LIGHTRESOLUTIONFIX)>>(LIGHTSCALESHIFT); @@ -1040,6 +1040,9 @@ static void R_SplitSprite(vissprite_t *sprite, mobj_t *thing) // Mitigate against negative xscale and arithmetic overflow lindex = CLAMP(lindex, 0, MAXLIGHTSCALE - 1); + if (newsprite->cut & SC_SEMIBRIGHT) + lindex = (MAXLIGHTSCALE/2) + (lindex >>1); + newsprite->colormap = spritelights[lindex]; } } @@ -1138,6 +1141,7 @@ static void R_ProjectSprite(mobj_t *thing) boolean hflip = (!(thing->frame & FF_HORIZONTALFLIP) != !mirrored); INT32 lindex; + INT32 trans; vissprite_t *vis; @@ -1535,6 +1539,24 @@ static void R_ProjectSprite(mobj_t *thing) return; } + INT32 blendmode; + if (oldthing->frame & FF_BLENDMASK) + blendmode = ((oldthing->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1; + else + blendmode = oldthing->blendmode; + + // Determine the translucency value. + if (oldthing->flags2 & MF2_SHADOW || thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility) + trans = tr_trans80; // because now the translucency is set through FF_TRANSMASK + else if (oldthing->frame & FF_TRANSMASK) + { + trans = (oldthing->frame & FF_TRANSMASK) >> FF_TRANSSHIFT; + if (!R_BlendLevelVisible(blendmode, trans)) + return; + } + else + trans = 0; + //SoM: 3/17/2000: Disregard sprites that are out of view.. if (thing->eflags & MFE_VERTICALFLIP) { @@ -1661,6 +1683,18 @@ static void R_ProjectSprite(mobj_t *thing) vis->scale += FixedMul(scalestep, spriteyscale) * (vis->x1 - x1); } + if ((blendmode != AST_COPY) && cv_translucency.value) + vis->transmap = R_GetBlendTable(blendmode, trans); + else + vis->transmap = NULL; + + if (R_ThingIsFullBright(oldthing) || oldthing->flags2 & MF2_SHADOW || thing->flags2 & MF2_SHADOW) + vis->cut |= SC_FULLBRIGHT; + else if (R_ThingIsSemiBright(oldthing)) + vis->cut |= SC_SEMIBRIGHT; + else if (R_ThingIsFullDark(oldthing)) + vis->cut |= SC_FULLDARK; + //Fab: lumppat is the lump number of the patch to use, this is different // than lumpid for sprites-in-pwad : the graphics are patched #ifdef ROTSPRITE @@ -1670,25 +1704,18 @@ static void R_ProjectSprite(mobj_t *thing) #endif vis->patch = W_CachePatchNum(sprframe->lumppat[rot], PU_CACHE); -// -// determine the colormap (lightlevel & special effects) -// - vis->transmap = NULL; + // + // determine the colormap (lightlevel & special effects) + // - // specific translucency - if (!cv_translucency.value) - ; // no translucency - else if (thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility) - vis->transmap = transtables + ((tr_trans80-1)<frame & FF_TRANSMASK) - vis->transmap = transtables + (thing->frame & FF_TRANSMASK) - 0x10000; - - if (((thing->frame & FF_FULLBRIGHT) || (thing->flags2 & MF2_SHADOW)) + if ((vis->cut & SC_FULLBRIGHT) && (!vis->extra_colormap || !(vis->extra_colormap->fog & 1))) { // full bright: goggles vis->colormap = colormaps; } + else if (vis->cut & SC_FULLDARK) + vis->colormap = scalelight[0][0]; else { // diminished light @@ -1697,6 +1724,9 @@ static void R_ProjectSprite(mobj_t *thing) // Mitigate against negative xscale and arithmetic overflow lindex = CLAMP(lindex, 0, MAXLIGHTSCALE - 1); + if (vis->cut & SC_SEMIBRIGHT) + lindex = (MAXLIGHTSCALE/2) + (lindex >> 1); + vis->colormap = spritelights[lindex]; } @@ -1738,6 +1768,7 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) fixed_t this_scale; INT32 dist = 1; + INT32 trans; if (cv_maxinterpdist.value) dist = R_QuickCamDist(thing->x, thing->y); @@ -1838,6 +1869,12 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) return; } + // Determine the translucency value. + if (thing->frame & FF_TRANSMASK) + trans = (thing->frame & FF_TRANSMASK) >> FF_TRANSSHIFT; + else + trans = 0; + //SoM: 3/17/2000: Disregard sprites that are out of view.. gzt = interp.z + FixedMul(spritecachedinfo[lump].topoffset, this_scale); gz = gzt - FixedMul(spritecachedinfo[lump].height, this_scale); @@ -1886,8 +1923,8 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) vis->patch = W_CachePatchNum(sprframe->lumppat[0], PU_CACHE); // specific translucency - if (thing->frame & FF_TRANSMASK) - vis->transmap = (thing->frame & FF_TRANSMASK) - 0x10000 + transtables; + if ((thing->blendmode != AST_COPY) && cv_translucency.value) + vis->transmap = R_GetTranslucencyTable((thing->frame & FF_TRANSMASK) >> FF_TRANSSHIFT); else vis->transmap = NULL; @@ -2788,6 +2825,21 @@ boolean R_ThingWithinDist (mobj_t *thing, fixed_t limit_dist) return true; } +boolean R_ThingIsFullBright(mobj_t *thing) +{ + return ((thing->frame & FF_BRIGHTMASK) == FF_FULLBRIGHT); +} + +boolean R_ThingIsSemiBright(mobj_t *thing) +{ + return ((thing->frame & FF_BRIGHTMASK) == FF_SEMIBRIGHT); +} + +boolean R_ThingIsFullDark(mobj_t *thing) +{ + return ((thing->frame & FF_BRIGHTMASK) == FF_FULLDARK); +} + // // R_DrawMasked // diff --git a/src/r_things.h b/src/r_things.h index 898cc7ecd..899400598 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -76,6 +76,10 @@ void R_DrawMasked(void); boolean R_ThingVisible (mobj_t *thing); boolean R_ThingWithinDist (mobj_t *thing, fixed_t limit_dist); +boolean R_ThingIsFullBright (mobj_t *thing); +boolean R_ThingIsSemiBright (mobj_t *thing); +boolean R_ThingIsFullDark (mobj_t *thing); + // ----------- // SKINS STUFF // ----------- @@ -128,6 +132,9 @@ typedef enum SC_BOTTOM = 2, SC_VFLIP = 3, SC_NOTVISIBLE = 4, + SC_FULLBRIGHT = 8, + SC_SEMIBRIGHT = 16, + SC_FULLDARK = 32, SC_CUTMASK = SC_TOP|SC_BOTTOM|SC_NOTVISIBLE, SC_FLAGMASK = ~SC_CUTMASK } spritecut_e; diff --git a/src/v_video.c b/src/v_video.c index d2604b5e8..02a37798e 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -635,10 +635,11 @@ static inline UINT8 transmappedpdraw(const UINT8 *dest, const UINT8 *source, fix } // Draws a patch scaled to arbitrary size. -void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 scrn, patch_t *patch, const UINT8 *colormap) +void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 scrn, patch_t *patch, const UINT8 *colormap, INT32 bflags) { UINT8 (*patchdrawfunc)(const UINT8*, const UINT8*, fixed_t); - UINT32 alphalevel = 0; + UINT32 alphalevel = ((scrn & V_ALPHAMASK) >> V_ALPHASHIFT); + UINT32 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT); fixed_t col, ofs, colfrac, rowfrac, fdup, vdup; INT32 dupx, dupy; @@ -655,7 +656,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca //if (rendermode != render_soft && !con_startup) // Why? if (rendermode == render_opengl) { - HWR_DrawStretchyFixedPatch((GLPatch_t *)patch, x, y, pscale, vscale, scrn, colormap); + HWR_DrawStretchyFixedPatch((GLPatch_t *)patch, x, y, pscale, vscale, scrn, colormap, bflags); return; } #endif @@ -663,7 +664,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca patchdrawfunc = standardpdraw; v_translevel = NULL; - if ((alphalevel = ((scrn & V_ALPHAMASK) >> V_ALPHASHIFT))) + if (alphalevel || blendmode) { if (alphalevel == 13) alphalevel = hudminusalpha[hudtrans]; @@ -675,9 +676,9 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca if (alphalevel >= 10) return; // invis - if (alphalevel) + if (alphalevel || blendmode) { - v_translevel = transtables + ((alphalevel-1)<init || memcmp(lut->palette, palette, palsize)) { - for (r = 0; r < CLUTSIZE; r++) - for (g = 0; g < CLUTSIZE; g++) - for (b = 0; b < CLUTSIZE; b++) - colorlookup[r][g][b] = NearestColor(r << SHIFTCOLORBITS, g << SHIFTCOLORBITS, b << SHIFTCOLORBITS); - clutinit = true; - lastpalette = pLocalPalette; + INT32 i; + + lut->init = true; + memcpy(lut->palette, palette, palsize); + + for (i = 0; i < 0xFFFF; i++) + lut->table[i] = 0xFFFF; + + if (makecolors) + { + UINT8 r, g, b; + + for (r = 0; r < 0xFF; r++) + for (g = 0; g < 0xFF; g++) + for (b = 0; b < 0xFF; b++) + { + i = CLUTINDEX(r, g, b); + if (lut->table[i] == 0xFFFF) + lut->table[i] = NearestPaletteColor(r, g, b, palette); + } + } } } +UINT8 GetColorLUT(colorlookup_t *lut, UINT8 r, UINT8 g, UINT8 b) +{ + INT32 i = CLUTINDEX(r, g, b); + if (lut->table[i] == 0xFFFF) + lut->table[i] = NearestPaletteColor(r, g, b, lut->palette); + return lut->table[i]; +} + +UINT8 GetColorLUTDirect(colorlookup_t *lut, UINT8 r, UINT8 g, UINT8 b) +{ + INT32 i = CLUTINDEX(r, g, b); + return lut->table[i]; +} + // V_Init // old software stuff, buffers are allocated at video mode setup // here we set the screens[x] pointers accordingly diff --git a/src/v_video.h b/src/v_video.h index a06760215..6b07bbb65 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -37,17 +37,19 @@ cv_rsaturation, cv_ysaturation, cv_gsaturation, cv_csaturation, cv_bsaturation, // Allocates buffer screens, call before R_Init. void V_Init(void); -// Taken from my videos-in-SRB2 project -// Generates a color look-up table -// which has up to 64 colors at each channel +// Color look-up table +#define CLUTINDEX(r, g, b) (((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3) -#define COLORBITS 6 -#define SHIFTCOLORBITS (8-COLORBITS) -#define CLUTSIZE (1< Date: Sun, 2 Feb 2025 21:14:48 -0500 Subject: [PATCH 204/325] Prelim: Linedef alpha variable realistically this was just because I'm Lazy this makes figuring out linedef blending less of a brain twister --- src/hardware/hw_main.c | 32 +++--------------------- src/lua_maplib.c | 5 ++++ src/p_setup.c | 13 ++++++++++ src/r_defs.h | 2 ++ src/r_segs.c | 56 ++++++++++++++++++++++++++---------------- src/r_segs.h | 1 + 6 files changed, 60 insertions(+), 49 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 1fd05d947..10d3c8c23 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1208,33 +1208,6 @@ static boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf) // set alpha for transparent walls switch (gl_linedef->special) { - case 900: - blendmode = HWR_TranstableToAlpha(tr_trans10, pSurf); - break; - case 901: - blendmode = HWR_TranstableToAlpha(tr_trans20, pSurf); - break; - case 902: - blendmode = HWR_TranstableToAlpha(tr_trans30, pSurf); - break; - case 903: - blendmode = HWR_TranstableToAlpha(tr_trans40, pSurf); - break; - case 904: - blendmode = HWR_TranstableToAlpha(tr_trans50, pSurf); - break; - case 905: - blendmode = HWR_TranstableToAlpha(tr_trans60, pSurf); - break; - case 906: - blendmode = HWR_TranstableToAlpha(tr_trans70, pSurf); - break; - case 907: - blendmode = HWR_TranstableToAlpha(tr_trans80, pSurf); - break; - case 908: - blendmode = HWR_TranstableToAlpha(tr_trans90, pSurf); - break; // Translucent case 102: case 121: @@ -1255,7 +1228,10 @@ static boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf) blendmode = PF_Translucent; break; default: - blendmode = PF_Masked; + if (gl_linedef->alpha > 0 && gl_linedef->alpha < FRACUNIT) + blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), pSurf); + else + blendmode = PF_Masked; break; } } diff --git a/src/lua_maplib.c b/src/lua_maplib.c index a6bca2ff6..c1442b98c 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -94,6 +94,7 @@ enum line_e { line_sidenum, line_frontside, line_backside, + line_alpha, line_slopetype, line_frontsector, line_backsector, @@ -115,6 +116,7 @@ static const char *const line_opt[] = { "sidenum", "frontside", "backside", + "alpha", "slopetype", "frontsector", "backsector", @@ -652,6 +654,9 @@ static int line_get(lua_State *L) return 0; LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE); return 1; + case line_alpha: + lua_pushfixed(L, line->alpha); + return 1; case line_slopetype: switch(line->slopetype) { diff --git a/src/p_setup.c b/src/p_setup.c index ce1dd6efb..751ba94f0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1071,6 +1071,8 @@ static void P_SetupLines(void) ld->dx = v2->x - v1->x; ld->dy = v2->y - v1->y; + ld->alpha = FRACUNIT; + if (!ld->dx) ld->slopetype = ST_VERTICAL; else if (!ld->dy) @@ -1177,6 +1179,17 @@ static void P_LoadLineDefs2(void) M_Memcpy(ld->text+strlen(ld->text)+1, sides[ld->sidenum[1]].text, strlen(sides[ld->sidenum[1]].text)+1); } break; + case 900: //Translucent wall (10%) + case 901: //Translucent wall (20%) + case 902: //Translucent wall (30%) + case 903: //Translucent wall (40%) + case 904: //Translucent wall (50%) + case 905: //Translucent wall (60%) + case 906: //Translucent wall (70%) + case 907: //Translucent wall (80%) + case 908: //Translucent wall (90%) + ld->alpha = ((909 - ld->special) << FRACBITS)/10; + break; } } } diff --git a/src/r_defs.h b/src/r_defs.h index 7c063505c..58cd0f1b1 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -402,6 +402,8 @@ typedef struct line_s // Visual appearance: sidedefs. UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided + fixed_t alpha; // translucency + UINT8 blendmode; // blendmode fixed_t bbox[4]; // bounding box for the extent of the linedef diff --git a/src/r_segs.c b/src/r_segs.c index 86a1ff1cf..b0cfc494e 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -287,6 +287,28 @@ static void R_Render2sidedMultiPatchColumn(column_t *column) } } +transnum_t R_GetLinedefTransTable(fixed_t alpha) +{ + if (alpha < 9830) + return tr_trans90; + else if (alpha < 16384) + return tr_trans80; + else if (alpha < 22937) + return tr_trans70; + else if (alpha < 29491) + return tr_trans60; + else if (alpha < 36044) + return tr_trans50; + else if (alpha < 42598) + return tr_trans40; + else if (alpha < 49152) + return tr_trans30; + else if (alpha < 55705) + return tr_trans20; + else + return tr_trans10; +} + void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) { size_t pindex; @@ -314,28 +336,20 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) // hack translucent linedef types (900-909 for transtables 1-9) ldef = curline->linedef; - switch (ldef->special) + if (ldef->alpha > 0 && ldef->alpha < FRACUNIT) { - case 900: - case 901: - case 902: - case 903: - case 904: - case 905: - case 906: - case 907: - case 908: - dc_transmap = R_GetTranslucencyTable((ldef->special-899)); - colfunc = fuzzcolfunc; - break; - case 909: - colfunc = R_DrawFogColumn_8; - windowtop = frontsector->ceilingheight; - windowbottom = frontsector->floorheight; - break; - default: - colfunc = wallcolfunc; - break; + dc_transmap = transtables + ((R_GetLinedefTransTable(ldef->alpha) - 1) << FF_TRANSSHIFT); + colfunc = fuzzcolfunc; + } + else if (ldef->special == 909) + { + colfunc = R_DrawFogColumn_8; + windowtop = frontsector->ceilingheight; + windowbottom = frontsector->floorheight; + } + else + { + colfunc = wallcolfunc; } if (curline->polyseg && curline->polyseg->translucency > 0) diff --git a/src/r_segs.h b/src/r_segs.h index 92d0100e2..006e81279 100644 --- a/src/r_segs.h +++ b/src/r_segs.h @@ -18,6 +18,7 @@ #pragma interface #endif +transnum_t R_GetLinedefTransTable(fixed_t alpha); void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2); void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pffloor); void R_StoreWallRange(INT32 start, INT32 stop); -- 2.54.0 From d39e9447f32463e3e51d09a3250024ed262c3734 Mon Sep 17 00:00:00 2001 From: Chearii Date: Mon, 3 Feb 2025 04:46:27 -0500 Subject: [PATCH 205/325] Add line and FOF blending, fix model and shadow blending also a bit of cleanup in r_things but it's too minor to headline --- src/hardware/hw_main.c | 51 +++++++++++++++++++++++++++++------------- src/hardware/hw_md2.c | 17 ++++++++++---- src/lua_maplib.c | 8 +++++++ src/p_mobj.c | 1 + src/p_setup.c | 38 ++++++++++++++++++++----------- src/p_spec.c | 22 ++++++++++++++++-- src/r_defs.h | 1 + src/r_plane.c | 33 +++++++++------------------ src/r_segs.c | 47 +++++++++++++++++++------------------- src/r_things.c | 7 ------ 10 files changed, 138 insertions(+), 87 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 10d3c8c23..ccd292cf3 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1225,10 +1225,20 @@ static boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf) case 221: case 253: case 256: - blendmode = PF_Translucent; + if (gl_linedef->blendmode) + blendmode = HWR_SurfaceBlend(gl_linedef->blendmode, R_GetLinedefTransTable(gl_linedef->alpha), pSurf); + else + blendmode = PF_Translucent; break; default: - if (gl_linedef->alpha > 0 && gl_linedef->alpha < FRACUNIT) + if (gl_linedef->blendmode) + { + if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT) + blendmode = HWR_SurfaceBlend(gl_linedef->blendmode, R_GetLinedefTransTable(gl_linedef->alpha), pSurf); + else + blendmode = HWR_GetBlendModeFlag(gl_linedef->blendmode); + } + else if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT) blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), pSurf); else blendmode = PF_Masked; @@ -1777,7 +1787,9 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); if (gl_frontsector->numlights) + { HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, noencore, &Surf, FF_CUTLEVEL, NULL, 0); + } else // I don't think that solid walls can use translucent linedef types... { if (glTex->mipmap.flags & TF_TRANSPARENT) @@ -1958,7 +1970,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom lightnum = (HWR_ShouldUsePaletteRendering() && colormap) ? lightnum : HWR_CalcWallLight(lightnum, gl_curline); if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, 0, false, &Surf, rover->flags, rover, 0); + HWR_SplitWall(gl_frontsector, wallVerts, 0, false, &Surf, rover->flags, rover, blendmode); else HWR_AddTransparentWall(wallVerts, &Surf, 0, false, blendmode, true, lightnum, colormap); } @@ -1966,14 +1978,14 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) { - blendmode = PF_Translucent; + blendmode = rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent; Surf.PolyColor.s.alpha = CLAMP(rover->alpha, 0, 255); } if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, texnum, noencore, &Surf, rover->flags, rover, 0); + HWR_SplitWall(gl_frontsector, wallVerts, texnum, noencore, &Surf, rover->flags, rover, blendmode); else { if (blendmode != PF_Masked) @@ -2073,7 +2085,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom lightnum = (HWR_ShouldUsePaletteRendering() && colormap) ? lightnum : HWR_CalcWallLight(lightnum, gl_curline); if (gl_backsector->numlights) - HWR_SplitWall(gl_backsector, wallVerts, 0, false, &Surf, rover->flags, rover, 0); + HWR_SplitWall(gl_backsector, wallVerts, 0, false, &Surf, rover->flags, rover, blendmode); else HWR_AddTransparentWall(wallVerts, &Surf, 0, false, blendmode, true, lightnum, colormap); } @@ -2081,14 +2093,14 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) { - blendmode = PF_Translucent; + blendmode = rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent; Surf.PolyColor.s.alpha = CLAMP(rover->alpha, 0, 255); } if (gl_backsector->numlights) - HWR_SplitWall(gl_backsector, wallVerts, texnum, noencore, &Surf, rover->flags, rover, 0); + HWR_SplitWall(gl_backsector, wallVerts, texnum, noencore, &Surf, rover->flags, rover, blendmode); else { if (blendmode != PF_Masked) @@ -2797,6 +2809,13 @@ static inline void HWR_PortalSubsector(seg_t *line, subsector_t *sub, INT16 coun sub->validcount = validcount; } +static FBITFIELD HWR_RippleBlend(sector_t *sector, ffloor_t *rover, boolean ceiling) +{ + (void)sector; + (void)ceiling; + return /*R_IsRipplePlane(sector, rover, ceiling)*/ (rover->flags & FF_RIPPLE) ? PF_Ripple : 0; +} + // -----------------+ // HWR_Subsector : Determine floor/ceiling planes. // : Add sprites of things in sector. @@ -2981,7 +3000,7 @@ static void HWR_Subsector(size_t num) alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient + else if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) // SoM: Flags are more efficient { light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false); @@ -2990,7 +3009,7 @@ static void HWR_Subsector(size_t num) false, *rover->bottomheight, *gl_frontsector->lightlist[light].lightlevel, - CLAMP(rover->alpha, 0 ,255), rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent, + CLAMP(rover->alpha, 0 ,255), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent), false, gl_frontsector->lightlist[light].extra_colormap); } else @@ -2998,7 +3017,7 @@ static void HWR_Subsector(size_t num) HWR_GetFlat(levelflats[*rover->bottompic].lumpnum, R_NoEncore(gl_frontsector, false)); light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false); - HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum, + HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum, rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap); } } @@ -3027,7 +3046,7 @@ static void HWR_Subsector(size_t num) alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + else if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) { light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false); @@ -3036,7 +3055,7 @@ static void HWR_Subsector(size_t num) true, *rover->topheight, *gl_frontsector->lightlist[light].lightlevel, - CLAMP(rover->alpha, 0 ,255), rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent, + CLAMP(rover->alpha, 0 ,255), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent), false, gl_frontsector->lightlist[light].extra_colormap); } else @@ -3044,7 +3063,7 @@ static void HWR_Subsector(size_t num) HWR_GetFlat(levelflats[*rover->toppic].lumpnum, R_NoEncore(gl_frontsector, true)); light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false); - HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum, + HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum, rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap); } } diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 5622497dc..1130745aa 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1178,21 +1178,30 @@ void HWR_DrawMD2(gl_vissprite_t *spr) // Apparently people don't like jump frames like that, so back it goes //if (tics > durs) //durs = tics; + + INT32 blendmode; + if (spr->mobj->frame & FF_BLENDMASK) + blendmode = ((spr->mobj->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1; + else + blendmode = spr->mobj->blendmode; + + blendmode = min(AST_MODULATE, blendmode); if (spr->mobj->flags2 & MF2_SHADOW) { Surf.PolyColor.s.alpha = 0x40; - Surf.PolyFlags = HWR_GetBlendModeFlag(spr->mobj->blendmode); + Surf.PolyFlags = HWR_GetBlendModeFlag(blendmode); } else if (spr->mobj->frame & FF_TRANSMASK) { HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); - Surf.PolyFlags = HWR_SurfaceBlend(spr->mobj->blendmode, (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); + Surf.PolyFlags = HWR_SurfaceBlend(blendmode, (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); } else { - Surf.PolyColor.s.alpha = 0xFF; - Surf.PolyFlags = 0; + // this hack is dumb, but the blendmodes refuse to work otherwise + Surf.PolyColor.s.alpha = (blendmode == AST_TRANSLUCENT) ? 0xFF : 0xFE; + Surf.PolyFlags = HWR_GetBlendModeFlag(blendmode); } // dont forget to enabled the depth test because we can't do this like diff --git a/src/lua_maplib.c b/src/lua_maplib.c index c1442b98c..c4718ae90 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -188,6 +188,7 @@ enum ffloor_e { ffloor_next, ffloor_prev, ffloor_alpha, + ffloor_blend, }; static const char *const ffloor_opt[] = { @@ -206,6 +207,7 @@ static const char *const ffloor_opt[] = { "next", "prev", "alpha", + "blend", NULL}; static int ffloor_fields_ref = LUA_NOREF; @@ -1173,6 +1175,9 @@ static int ffloor_get(lua_State *L) case ffloor_alpha: lua_pushinteger(L, ffloor->alpha); return 1; + case ffloor_blend: + lua_pushinteger(L, ffloor->blend); + return 1; } return 0; } @@ -1251,6 +1256,9 @@ static int ffloor_set(lua_State *L) case ffloor_alpha: ffloor->alpha = (INT32)luaL_checkinteger(L, 3); break; + case ffloor_blend: + ffloor->blend = (INT32)luaL_checkinteger(L, 3); + break; } return 0; } diff --git a/src/p_mobj.c b/src/p_mobj.c index a916190a9..ed5f0a578 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9837,6 +9837,7 @@ mobj_t *P_SpawnShadowMobj(mobj_t * caster) mobj->radius = info->radius; mobj->height = info->height; mobj->flags = info->flags; + mobj->blendmode = AST_TRANSLUCENT; mobj->health = info->spawnhealth; diff --git a/src/p_setup.c b/src/p_setup.c index 751ba94f0..124b57504 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1072,6 +1072,7 @@ static void P_SetupLines(void) ld->dy = v2->y - v1->y; ld->alpha = FRACUNIT; + ld->blendmode = 0; if (!ld->dx) ld->slopetype = ST_VERTICAL; @@ -1179,18 +1180,27 @@ static void P_LoadLineDefs2(void) M_Memcpy(ld->text+strlen(ld->text)+1, sides[ld->sidenum[1]].text, strlen(sides[ld->sidenum[1]].text)+1); } break; - case 900: //Translucent wall (10%) - case 901: //Translucent wall (20%) - case 902: //Translucent wall (30%) - case 903: //Translucent wall (40%) - case 904: //Translucent wall (50%) - case 905: //Translucent wall (60%) - case 906: //Translucent wall (70%) - case 907: //Translucent wall (80%) - case 908: //Translucent wall (90%) - ld->alpha = ((909 - ld->special) << FRACBITS)/10; - break; } + + // Set alpha for translucent walls + if (ld->special >= 900 && ld->special < 909) + ld->alpha = ((909 - ld->special) << FRACBITS)/10; + + // Set alpha for additive/subtractive/reverse subtractive walls + if (ld->special >= 910 && ld->special <= 939) + ld->alpha = ((10 - ld->special % 10) << FRACBITS)/10; + + if (ld->special >= 910 && ld->special <= 919) // additive + ld->blendmode = AST_ADD; + + if (ld->special >= 920 && ld->special <= 929) // subtractive + ld->blendmode = AST_SUBTRACT; + + if (ld->special >= 930 && ld->special <= 939) // reverse subtractive + ld->blendmode = AST_REVERSESUBTRACT; + + if (ld->special == 940) // modulate + ld->blendmode = AST_MODULATE; } } @@ -1469,8 +1479,10 @@ static void P_LoadRawSideDefs2(void *data) if (msd->toptexture[0] == '#') { char *col = msd->toptexture; - sd->toptexture = sd->bottomtexture = - ((col[1]-'0')*100 + (col[2]-'0')*10 + col[3]-'0') + 1; + sd->toptexture = + ((col[1]-'0')*100 + (col[2]-'0')*10 + col[3]-'0')+1; + if (col[4]) // extra num for blendmode + sd->toptexture += (col[4]-'0')*1000; sd->midtexture = R_TextureNumForName(msd->midtexture); } else diff --git a/src/p_spec.c b/src/p_spec.c index 997cc437c..518a411eb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4807,16 +4807,34 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f else th = th->next; } - if (flags & FF_TRANSLUCENT) { if (sides[master->sidenum[0]].toptexture > 0) - ffloor->alpha = sides[master->sidenum[0]].toptexture; // for future reference, "#0" is 1, and "#255" is 256. Be warned + { + // for future reference, "#0" is 1, and "#255" is 256. Be warned + ffloor->alpha = sides[master->sidenum[0]].toptexture; + + if (ffloor->alpha >= 1001) // fourth digit + { + ffloor->blend = (ffloor->alpha/1000)+1; // becomes an AST + ffloor->alpha %= 1000; + } + else + { + ffloor->blend = 0; + } + } else + { ffloor->alpha = 0x80; + ffloor->blend = 0; + } } else + { ffloor->alpha = 0xff; + ffloor->blend = 0; + } ffloor->spawnalpha = ffloor->alpha; // save for netgames diff --git a/src/r_defs.h b/src/r_defs.h index 58cd0f1b1..c3f14236e 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -172,6 +172,7 @@ typedef struct ffloor_s INT32 lastlight; INT32 alpha; + UINT8 blend; // blendmode tic_t norender; // for culling // these are saved for netgames, so do not let Lua touch these! diff --git a/src/r_plane.c b/src/r_plane.c index 9b13bb062..9a3facce2 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -833,28 +833,17 @@ void R_DrawSinglePlane(visplane_t *pl) spanfunc = R_DrawTranslucentSpan_8; // Hacked up support for alpha value in software mode Tails 09-24-2002 - if (pl->ffloor->alpha < 12) - return; // Don't even draw it - else if (pl->ffloor->alpha < 38) - ds_transmap = R_GetTranslucencyTable(tr_trans90); - else if (pl->ffloor->alpha < 64) - ds_transmap = R_GetTranslucencyTable(tr_trans80); - else if (pl->ffloor->alpha < 89) - ds_transmap = R_GetTranslucencyTable(tr_trans70); - else if (pl->ffloor->alpha < 115) - ds_transmap = R_GetTranslucencyTable(tr_trans60); - else if (pl->ffloor->alpha < 140) - ds_transmap = R_GetTranslucencyTable(tr_trans50); - else if (pl->ffloor->alpha < 166) - ds_transmap = R_GetTranslucencyTable(tr_trans40); - else if (pl->ffloor->alpha < 192) - ds_transmap = R_GetTranslucencyTable(tr_trans30); - else if (pl->ffloor->alpha < 217) - ds_transmap = R_GetTranslucencyTable(tr_trans20); - else if (pl->ffloor->alpha < 243) - ds_transmap = R_GetTranslucencyTable(tr_trans10); - else // Opaque, but allow transparent flat pixels - spanfunc = splatfunc; + // ...unhacked by toaster 04-01-2021, re-hacked a little by sphere 19-11-2021 + // and mercilessly shoved into saturn by chearii 02-02-2025 + { + INT32 trans = (10*((256+12) - pl->ffloor->alpha))/255; + if (trans >= 10) + return; // Don't even draw it + if (pl->ffloor->blend) // additive, (reverse) subtractive, modulative + ds_transmap = R_GetBlendTable(pl->ffloor->blend, trans); + else if (!(ds_transmap = R_GetTranslucencyTable(trans)) || trans == 0) + spanfunc = splatfunc; // Opaque, but allow transparent flat pixels + } #ifdef SHITPLANESPARENCY if (spanfunc == splatfunc || (pl->extra_colormap && pl->extra_colormap->fog)) diff --git a/src/r_segs.c b/src/r_segs.c index b0cfc494e..b9c1277ab 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -336,7 +336,19 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) // hack translucent linedef types (900-909 for transtables 1-9) ldef = curline->linedef; - if (ldef->alpha > 0 && ldef->alpha < FRACUNIT) + + if (!ldef->alpha) + return; + + if (ldef->blendmode) + { + if (ldef->alpha == NUMTRANSMAPS || ldef->blendmode == AST_MODULATE) + dc_transmap = R_GetBlendTable(ldef->blendmode, 0); + else + dc_transmap = R_GetBlendTable(ldef->blendmode, R_GetLinedefTransTable(ldef->alpha)); + colfunc = fuzzcolfunc; + } + else if (ldef->alpha > 0 && ldef->alpha < FRACUNIT) { dc_transmap = transtables + ((R_GetLinedefTransTable(ldef->alpha) - 1) << FF_TRANSSHIFT); colfunc = fuzzcolfunc; @@ -725,28 +737,17 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) boolean fuzzy = true; // Hacked up support for alpha value in software mode Tails 09-24-2002 - if (pfloor->alpha < 12) - return; // Don't even draw it - else if (pfloor->alpha < 38) - dc_transmap = R_GetTranslucencyTable(tr_trans90); - else if (pfloor->alpha < 64) - dc_transmap = R_GetTranslucencyTable(tr_trans80); - else if (pfloor->alpha < 89) - dc_transmap = R_GetTranslucencyTable(tr_trans70); - else if (pfloor->alpha < 115) - dc_transmap = R_GetTranslucencyTable(tr_trans60); - else if (pfloor->alpha < 140) - dc_transmap = R_GetTranslucencyTable(tr_trans50); - else if (pfloor->alpha < 166) - dc_transmap = R_GetTranslucencyTable(tr_trans40); - else if (pfloor->alpha < 192) - dc_transmap = R_GetTranslucencyTable(tr_trans30); - else if (pfloor->alpha < 217) - dc_transmap = R_GetTranslucencyTable(tr_trans20); - else if (pfloor->alpha < 243) - dc_transmap = R_GetTranslucencyTable(tr_trans10); - else - fuzzy = false; // Opaque + // ...unhacked by toaster 04-01-2021, re-hacked a little by sphere 19-11-2021 + // and mercilessly shoved into saturn by chearii 02-02-2025 + { + INT32 trans = (10*((256+12) - pfloor->alpha))/255; + if (trans >= 10) + return; // Don't even draw it + if (pfloor->blend) // additive, (reverse) subtractive, modulative + dc_transmap = R_GetBlendTable(pfloor->blend, trans); + else if (!(dc_transmap = R_GetTranslucencyTable(trans)) || trans == 0) + fuzzy = false; // Opaque + } if (fuzzy) colfunc = fuzzcolfunc; diff --git a/src/r_things.c b/src/r_things.c index 410da8ec3..95b5a66ff 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1768,7 +1768,6 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) fixed_t this_scale; INT32 dist = 1; - INT32 trans; if (cv_maxinterpdist.value) dist = R_QuickCamDist(thing->x, thing->y); @@ -1869,12 +1868,6 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) return; } - // Determine the translucency value. - if (thing->frame & FF_TRANSMASK) - trans = (thing->frame & FF_TRANSMASK) >> FF_TRANSSHIFT; - else - trans = 0; - //SoM: 3/17/2000: Disregard sprites that are out of view.. gzt = interp.z + FixedMul(spritecachedinfo[lump].topoffset, this_scale); gz = gzt - FixedMul(spritecachedinfo[lump].height, this_scale); -- 2.54.0 From ccc1c07930001d973ca7b36686766ec6f79e9238 Mon Sep 17 00:00:00 2001 From: Chearii Date: Tue, 4 Feb 2025 16:34:17 -0500 Subject: [PATCH 206/325] Fix white pixel bug due to oversight many thanks to indev for catching this! --- src/r_draw.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/r_draw.c b/src/r_draw.c index d41e542a5..ef4496349 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -248,9 +248,9 @@ static void BlendTab_Translucent(UINT8 *table, int style, UINT8 blendamt) if (table == NULL) I_Error("BlendTab_Translucent: input table was NULL!"); - for (bg = 0; bg < 0xFF; bg++) + for (bg = 0; bg < 0x100; bg++) { - for (fg = 0; fg < 0xFF; fg++) + for (fg = 0; fg < 0x100; fg++) { RGBA_t backrgba = V_GetColor(bg); RGBA_t frontrgba = V_GetColor(fg); @@ -277,9 +277,9 @@ static void BlendTab_Subtractive(UINT8 *table, int style, UINT8 blendamt) return; } - for (bg = 0; bg < 0xFF; bg++) + for (bg = 0; bg < 0x100; bg++) { - for (fg = 0; fg < 0xFF; fg++) + for (fg = 0; fg < 0x100; fg++) { RGBA_t backrgba = V_GetColor(bg); RGBA_t frontrgba = V_GetColor(fg); @@ -302,9 +302,9 @@ static void BlendTab_Modulative(UINT8 *table) if (table == NULL) I_Error("BlendTab_Modulative: input table was NULL!"); - for (bg = 0; bg < 0xFF; bg++) + for (bg = 0; bg < 0x100; bg++) { - for (fg = 0; fg < 0xFF; fg++) + for (fg = 0; fg < 0x100; fg++) { RGBA_t backrgba = V_GetColor(bg); RGBA_t frontrgba = V_GetColor(fg); -- 2.54.0 From a6a53f6b9c898ba2d68013f803bff6c686e55923 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 6 Feb 2025 02:06:57 +0100 Subject: [PATCH 207/325] dont pass bogus values to I_GamepadRumble and I_SetGamepadIndicatorColor - fixes rumble and led stuff not working after hotplugging - also fixes sdl2-compat breaking - i hate karts controller code --- src/g_input.c | 41 ++++++----------------------------------- src/i_system.h | 4 ++-- src/sdl/i_system.c | 14 ++++++++++---- 3 files changed, 18 insertions(+), 41 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 1f3c69464..168d51bf3 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -946,18 +946,12 @@ UINT16 G_GetSkinColor(INT32 playernum) void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color) { - INT32 device; UINT16 skincolor; byteColor_t byte_color; I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS); if (cv_gamepadled[playernum].value == 0) - return; - - device = cv_usejoystick[playernum].value; - - if (device <= 0) { return; } @@ -965,19 +959,14 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color) skincolor = color ? color : G_GetSkinColor(playernum); byte_color = V_GetColor(colortranslations[skincolor][8]).s; - I_SetGamepadIndicatorColor(device, byte_color.red, byte_color.green, byte_color.blue); + I_SetGamepadIndicatorColor(playernum, byte_color.red, byte_color.green, byte_color.blue); } static void G_ResetPlayerGamepadIndicatorColor(INT32 playernum) { if (cv_gamepadled[playernum].value == 0) { - INT32 device = cv_usejoystick[playernum].value; - - if (device <= 0) - return; - - I_SetGamepadIndicatorColor(device, 0, 0, 255); + I_SetGamepadIndicatorColor(playernum, 0, 0, 255); } else G_SetPlayerGamepadIndicatorColor(playernum, 0); @@ -985,16 +974,7 @@ static void G_ResetPlayerGamepadIndicatorColor(INT32 playernum) static void G_ResetPlayerDeviceRumble(INT32 playernum) { - INT32 device_id; - - device_id = cv_usejoystick[playernum].value; - - if (device_id < 1) - { - return; - } - - I_GamepadRumble(device_id, 0, 0, 0); + I_GamepadRumble(playernum, 0, 0, 0); } void G_ResetAllDeviceRumbles(void) @@ -1006,29 +986,20 @@ void G_ResetAllDeviceRumbles(void) for (i = 0; i < devices; i++) { - INT32 device_id = cv_usejoystick[i].value; - - I_GamepadRumble(device_id, 0, 0, 0); + I_GamepadRumble(devices, 0, 0, 0); } } void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration) { - INT32 device_id; + I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS); if (cv_rumble[playernum].value == 0) { return; } - device_id = cv_usejoystick[playernum].value; - - if (device_id < 1) - { - return; - } - - I_GamepadRumble(device_id, low_strength, high_strength, duration); + I_GamepadRumble(playernum, low_strength, high_strength, duration); } // diff --git a/src/i_system.h b/src/i_system.h index baaa0d446..81cd80b68 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -234,8 +234,8 @@ INT32 I_NumJoys(void); */ const char *I_GetJoyName(INT32 joyindex); -void I_GamepadRumble(INT32 device_id, UINT16 low_strength, UINT16 high_strength, UINT32 duration); -void I_SetGamepadIndicatorColor(INT32 device_id, UINT8 red, UINT8 green, UINT8 blue); +void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration); +void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue); #ifndef NOMUMBLE #include "p_mobj.h" // mobj_t diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 20514f105..6ea659b70 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -1483,7 +1483,7 @@ const char *I_GetJoyName(INT32 joyindex) return joyname; } -void I_GamepadRumble(INT32 device_id, UINT16 low_strength, UINT16 high_strength, UINT32 duration) +void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration) { #if !(SDL_VERSION_ATLEAST(2,0,14)) (void)device_id; @@ -1491,9 +1491,12 @@ void I_GamepadRumble(INT32 device_id, UINT16 low_strength, UINT16 high_strength, (void)high_strength; (void)duration; #else + + INT32 device_id = I_GetJoystickDeviceIndex(JoyInfo[playernum].dev); + I_Assert(device_id > 0); // Gamepad devices are always ID 1 or higher - SDL_GameController *controller = SDL_GameControllerFromInstanceID(device_id - 1); + SDL_GameController *controller = SDL_GameControllerFromInstanceID(device_id); if (controller == NULL) { return; @@ -1503,7 +1506,7 @@ void I_GamepadRumble(INT32 device_id, UINT16 low_strength, UINT16 high_strength, #endif } -void I_SetGamepadIndicatorColor(INT32 device_id, UINT8 red, UINT8 green, UINT8 blue) +void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue) { #if !(SDL_VERSION_ATLEAST(2,0,14)) (void)device_id; @@ -1511,9 +1514,12 @@ void I_SetGamepadIndicatorColor(INT32 device_id, UINT8 red, UINT8 green, UINT8 b (void)green; (void)blue; #else + + INT32 device_id = I_GetJoystickDeviceIndex(JoyInfo[playernum].dev); + I_Assert(device_id > 0); // Gamepad devices are always ID 1 or higher - SDL_GameController *controller = SDL_GameControllerFromInstanceID(device_id - 1); + SDL_GameController *controller = SDL_GameControllerFromInstanceID(device_id); if (controller == NULL) { return; -- 2.54.0 From b398dacf29d19ab50986bf20e01b47c4e3beb29e Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 6 Feb 2025 14:43:18 +0100 Subject: [PATCH 208/325] update controller led when connecting a controller --- src/sdl/i_video.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 609afc30a..2ba945467 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1238,7 +1238,10 @@ void I_GetEvent(void) //////////////////////////////////////////////////////////// for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { I_InitJoystick(i); + G_SetPlayerGamepadIndicatorColor(i, G_GetSkinColor(i)); // gotta update the controller led again on reconnect + } //////////////////////////////////////////////////////////// -- 2.54.0 From 7d62b330d0b20b449ba6e9ca6ea710d7fe269d1e Mon Sep 17 00:00:00 2001 From: chromaticpipe <127907268+chromaticpipe@users.noreply.github.com> Date: Thu, 6 Feb 2025 16:15:16 -0600 Subject: [PATCH 209/325] Add proxy makefile at top level --- Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..0a17f3214 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +ifdef SILENT +MAKEFLAGS+=--no-print-directory +endif + +all : + +% :: + @$(MAKE) -C src $(MAKECMDGOALS) \ No newline at end of file -- 2.54.0 From 73ea95ae61c90f7b1ad0d28718ef9c7573ae68e4 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 7 Feb 2025 04:05:10 +0100 Subject: [PATCH 210/325] just pass the controller directly simplifies this alot --- src/sdl/i_system.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 6ea659b70..65239b6a4 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -1491,12 +1491,7 @@ void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, (void)high_strength; (void)duration; #else - - INT32 device_id = I_GetJoystickDeviceIndex(JoyInfo[playernum].dev); - - I_Assert(device_id > 0); // Gamepad devices are always ID 1 or higher - - SDL_GameController *controller = SDL_GameControllerFromInstanceID(device_id); + SDL_GameController *controller = JoyInfo[playernum].dev; if (controller == NULL) { return; @@ -1514,12 +1509,7 @@ void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 b (void)green; (void)blue; #else - - INT32 device_id = I_GetJoystickDeviceIndex(JoyInfo[playernum].dev); - - I_Assert(device_id > 0); // Gamepad devices are always ID 1 or higher - - SDL_GameController *controller = SDL_GameControllerFromInstanceID(device_id); + SDL_GameController *controller = JoyInfo[playernum].dev; if (controller == NULL) { return; -- 2.54.0 From 5f0b2b0604c939a78da62add85f46b5dcca094fa Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Feb 2025 20:47:33 +0100 Subject: [PATCH 211/325] fix some level userdata not being invalidated maybe fixed the random issues we had with the server? --- src/lua_script.c | 27 ++++++++++++++++++++++++++- src/p_slopes.c | 2 +- src/p_slopes.h | 2 ++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/lua_script.c b/src/lua_script.c index 7ef6f0217..12192b0b2 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -504,6 +504,8 @@ void LUA_InvalidateLevel(void) { thinker_t *th; size_t i; + ffloor_t *rover = NULL; + if (!gL) return; @@ -515,32 +517,55 @@ void LUA_InvalidateLevel(void) for (i = 0; i < numsubsectors; i++) LUA_InvalidateUserdata(&subsectors[i]); for (i = 0; i < numsectors; i++) + { LUA_InvalidateUserdata(§ors[i]); + LUA_InvalidateUserdata(§ors[i].lines); + + if (sectors[i].ffloors) + { + for (rover = sectors[i].ffloors; rover; rover = rover->next) + LUA_InvalidateUserdata(rover); + } + } + for (i = 0; i < numlines; i++) { LUA_InvalidateUserdata(&lines[i]); LUA_InvalidateUserdata(lines[i].sidenum); } + for (i = 0; i < numsides; i++) LUA_InvalidateUserdata(&sides[i]); for (i = 0; i < numvertexes; i++) LUA_InvalidateUserdata(&vertexes[i]); + + for (pslope_t *slope = slopelist; slope; slope = slope->next) + { + LUA_InvalidateUserdata(slope); + LUA_InvalidateUserdata(&slope->normal); + LUA_InvalidateUserdata(&slope->o); + LUA_InvalidateUserdata(&slope->d); + } } void LUA_InvalidateMapthings(void) { size_t i; + if (!gL) return; for (i = 0; i < nummapthings; i++) + { LUA_InvalidateUserdata(&mapthings[i]); + } } void LUA_InvalidatePlayer(player_t *player) { if (!gL) return; + LUA_InvalidateUserdata(player); LUA_InvalidateUserdata(player->powers); LUA_InvalidateUserdata(player->kartstuff); @@ -586,7 +611,7 @@ static const struct { {META_SUBSECTOR,ARCH_SUBSECTOR}, {META_SECTOR, ARCH_SECTOR}, {META_SLOPE, ARCH_SLOPE}, - {META_MAPHEADER, ARCH_MAPHEADER}, + {META_MAPHEADER,ARCH_MAPHEADER}, {NULL, ARCH_NULL} }; diff --git a/src/p_slopes.c b/src/p_slopes.c index 0ba37a816..542ce244d 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -24,7 +24,7 @@ #include "w_wad.h" -static pslope_t *slopelist = NULL; +pslope_t *slopelist = NULL; static UINT16 slopecount = 0; // Calculate light diff --git a/src/p_slopes.h b/src/p_slopes.h index 82dd90738..89cfdc343 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -33,6 +33,8 @@ void P_CopySectorSlope(line_t *line); pslope_t *P_SlopeById(UINT16 id); +extern pslope_t *slopelist; + // // P_GetZAt // -- 2.54.0 From 14881e968a3d77f1adb8be4c9417ca9817c051bb Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 12 Feb 2025 12:00:54 +0100 Subject: [PATCH 212/325] simplify local ping display --- src/d_clisrv.c | 12 ++++++++--- src/d_clisrv.h | 1 + src/hu_stuff.c | 51 +++++++++++++++-------------------------------- src/sdl/i_video.c | 2 +- 4 files changed, 27 insertions(+), 39 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index ccc700325..79bf5e2d8 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -108,6 +108,7 @@ UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. static tic_t reference_lag; static UINT8 spike_time; tic_t lowest_lag; +tic_t simulated_lag; // just for ping readout without netticbuffer added boolean server_lagless; static void Lagless_OnChange(void) @@ -6306,8 +6307,8 @@ static void Local_Maketic(INT32 realtics) // game responder calls HU_Responder, AM_Responder, F_Responder, // and G_MapEventsToControls if (!dedicated) rendergametic = gametic; - // translate inputs (keyboard/mouse/joystick) into game controls + // translate inputs (keyboard/mouse/joystick) into game controls for (i = 0; i <= splitscreen; i++) { CreateNewLocalCMD(i, realtics); @@ -6633,6 +6634,8 @@ static void UpdatePingTable(void) if (lowest_lag < (tic_t)cv_mindelay.value) lowest_lag = (tic_t)cv_mindelay.value; + simulated_lag = lowest_lag; + pingmeasurecount++; } else // We're a client, handle mindelay on the way out. @@ -6643,9 +6646,12 @@ static void UpdatePingTable(void) tic_t mydelay = playerpingtable[consoleplayer]; if (mydelay < (tic_t)cv_mindelay.value) - lowest_lag = cv_mindelay.value - mydelay; + { + lowest_lag = ((tic_t)cv_mindelay.value - mydelay); + simulated_lag = (tic_t)cv_mindelay.value; + } else - lowest_lag = 0; + lowest_lag = simulated_lag = 0; } } diff --git a/src/d_clisrv.h b/src/d_clisrv.h index c24356e94..abef27904 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -586,6 +586,7 @@ extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; extern boolean server_lagless; +extern tic_t simulated_lag; extern tic_t lowest_lag; extern consvar_t cv_mindelay, cv_lagless; diff --git a/src/hu_stuff.c b/src/hu_stuff.c index b22e69b2b..191aaee9f 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1198,7 +1198,7 @@ void HU_Ticker(void) || hu_redownloadinggamestate #endif ) - resynch_ticker++; //tic tic tic tic tic + resynch_ticker++; //tic tic tic tic tic HU_TickSongCredits(); } @@ -2289,22 +2289,6 @@ void HU_Drawer(void) if (gamestate != GS_LEVEL) return; - // draw the crosshair, not when viewing demos nor with chasecam - /*if (!automapactive && !demo.playback) - { - if (cv_crosshair.value && !camera[0].chase && !players[displayplayers[0]].spectator) - HU_DrawCrosshair(); - - if (cv_crosshair2.value && !camera[1].chase && !players[displayplayers[1]].spectator) - HU_DrawCrosshair2(); - - if (cv_crosshair3.value && !camera[2].chase && !players[displayplayers[2]].spectator) - HU_DrawCrosshair3(); - - if (cv_crosshair4.value && !camera[3].chase && !players[displayplayers[3]].spectator) - HU_DrawCrosshair4(); - }*/ - // draw song credits if (cv_songcredits.value) HU_DrawSongCredits(); @@ -2461,14 +2445,13 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) UINT8 barcolor = 31; // color we use for the bars (green, yellow, red or black) SINT8 i = 0; SINT8 yoffset = 6; - //INT32 dx; UINT32 lag = playerpingtable[pnum]; - const boolean gentleman = ((cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])) || (pnum == serverplayer && lowest_lag != 0)); // for serverplayer lowest_lag actually reflects mindelay + const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)simulated_lag)); if (gentleman) { - lag = (pnum == serverplayer) ? lowest_lag : (tic_t)cv_mindelay.value; + lag = simulated_lag; } if (cv_pingstyle.value == 0) // kart @@ -2488,6 +2471,18 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) } else if (cv_pingstyle.value == 1) // old style ping { + if (vid.width >= 640) // how sad, we're using a shit resolution. + { + if (measureid == 1) + { + V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", Ping_conversion(lag))); + } + else if (measureid == 0) + { + V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", Ping_conversion(lag))); + } + } + if (cv_pingicon.value) { switch (lag) @@ -2517,23 +2512,9 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) if (gentleman) { barcolor = 194; // make it purplish + // bars get indirectly set earlier } - } - if (vid.width >= 640) // how sad, we're using a shit resolution. - { - if (measureid == 1) - { - V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", Ping_conversion(lag))); - } - else if (measureid == 0) - { - V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", Ping_conversion(lag))); - } - } - - if (cv_pingicon.value) - { for (i = 0; (i < 3); i++) // Draw the ping bar { V_DrawFill(x+2 *(i-1)+7, y+8+yoffset-4, 2, 8-yoffset, 31|flags); diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 934491e9c..51515bb20 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1469,7 +1469,7 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || ((cv_mindelay.value || (!server_lagless && lowest_lag != 0)) && consoleplayer == serverplayer && Playing()))) + if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || (simulated_lag != 0 && consoleplayer == serverplayer && Playing()))) SCR_DisplayLocalPing(); } -- 2.54.0 From 1eae8c6ea32d149edbe2ad4b835275ef61c129b3 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 12 Feb 2025 11:56:41 +0100 Subject: [PATCH 213/325] use correct type in P_InitMinimapInfo --- src/p_setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 652062079..633c4094e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2495,7 +2495,7 @@ static boolean P_CanSave(void) struct minimapinfo minimapinfo; static void P_InitMinimapInfo(void) { - INT32 lumpnum; + lumpnum_t lumpnum; fixed_t a; fixed_t b; node_t *bsp = &nodes[numnodes-1]; @@ -2504,7 +2504,7 @@ static void P_InitMinimapInfo(void) lumpnum = W_CheckNumForName(va("%sR", G_BuildMapName(gamemap))); - if (lumpnum != -1) + if (lumpnum != LUMPERROR) minimapinfo.minimap_pic = W_CachePatchName(va("%sR", G_BuildMapName(gamemap)), PU_HUDGFX); minimapinfo.min_x = bsp->bbox[0][BOXLEFT]; -- 2.54.0 From 9efd24e3765cbaf9dbb35e777b3f70def4645146 Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 16 Feb 2025 17:49:43 +0300 Subject: [PATCH 214/325] camara --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d5a3d2b41..1c0ee936d 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ Crashlogs now contain alot more informations. and even more if your build has de Also allows 64bit Windows builds to produce Crashlogs! ## MISC -- Bird's Camara Tilting feature is no longer turned on by default +- Bird's Camera Tilting feature is no longer turned on by default - Bird's warning on the title screen has been removed ## Bugs -- 2.54.0 From 7322d553ba6a832868fe9c70780ee6b09e94eee2 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 17 Feb 2025 18:05:30 +0100 Subject: [PATCH 215/325] Revert "Merge pull request #151 from Indev450/fixdupeacks" This reverts commit 1fabc14ac9c4b4dd7283aca19183b8cd3ca59185, reversing changes made to d9492eee282834066bd06e9fba96fca09582f772. --- src/d_net.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/d_net.c b/src/d_net.c index 6f43147b9..16156ca06 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -325,10 +325,10 @@ static void RemoveAck(INT32 i) } // We have got a packet, proceed the ack request and ack return -static int Processackpak(void) +static boolean Processackpak(void) { INT32 i; - int goodpacket = 0; + boolean goodpacket = true; node_t *node = &nodes[doomcom->remotenode]; // Received an ack return, so remove the ack in the list @@ -353,7 +353,7 @@ static int Processackpak(void) { DEBFILE(va("Discard(1) ack %d (duplicated)\n", ack)); duppacket++; - goodpacket = 1; // Discard packet (duplicate) + goodpacket = false; // Discard packet (duplicate) } else { @@ -363,10 +363,10 @@ static int Processackpak(void) { DEBFILE(va("Discard(2) ack %d (duplicated)\n", ack)); duppacket++; - goodpacket = 1; // Discard packet (duplicate) + goodpacket = false; // Discard packet (duplicate) break; } - if (goodpacket == 0) + if (goodpacket) { // Is a good packet so increment the acknowledge number, // Then search for a "hole" in the queue @@ -427,13 +427,12 @@ static int Processackpak(void) else // Buffer full discard packet, sender will resend it { // We can admit the packet but we will not detect the duplication after :( DEBFILE("no more freeackret\n"); - goodpacket = 2; + goodpacket = false; } } } } } - // return values: 0 = ok, 1 = duplicate, 2 = out of order return goodpacket; } #endif @@ -1160,7 +1159,6 @@ boolean HGetPacket(void) while(true) { //nodejustjoined = I_NetGet(); - int goodpacket; I_NetGet(); if (doomcom->remotenode == -1) // No packet received @@ -1205,15 +1203,8 @@ boolean HGetPacket(void) }*/ // Proceed the ack and ackreturn field - goodpacket = Processackpak(); - if (goodpacket != 0) - { - // resend the ACK in case the previous ACK didn't reach the client. - // prevents the client's netbuffer from locking up. - if (goodpacket == 1) - Net_SendAcks(doomcom->remotenode); + if (!Processackpak()) continue; // discarded (duplicated) - } // A packet with just ackreturn if (netbuffer->packettype == PT_NOTHING) -- 2.54.0 From 115eea3828467bae694a13e70a45664f2772700c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 17 Feb 2025 20:40:22 +0100 Subject: [PATCH 216/325] revert all the server ticking stuff --- src/d_clisrv.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 107597223..16fc0e187 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -6394,21 +6394,19 @@ boolean TryRunTics(tic_t realtics) } #endif - ticking = neededtic > gametic; - - if (ticking) + if (neededtic > gametic) { - if (realtics) - hu_stopped = false; + hu_stopped = false; } if (player_joining) { - if (realtics) - hu_stopped = true; + hu_stopped = true; return false; } + ticking = neededtic > gametic; + if (ticking) { // run the count * tics @@ -6668,14 +6666,6 @@ void NetUpdate(void) if (realtics <= 0) // nothing new to update return; - if (realtics > 5) - { - if (server) - realtics = 1; - else - realtics = 5; - } - #ifdef DEDICATEDIDLETIME if (server && dedicated && gamestate == GS_LEVEL) { @@ -6724,6 +6714,14 @@ void NetUpdate(void) } #endif + if (realtics > 5) + { + if (server) + realtics = 1; + else + realtics = 5; + } + gametime = nowtime; UpdatePingTable(); @@ -6817,8 +6815,6 @@ void NetUpdate(void) Net_AckTicker(); HandleNodeTimeouts(); - nowtime /= NEWTICRATERATIO; - if (nowtime > resptime) { resptime = nowtime; -- 2.54.0 From 75d69dc90ddef61b0c11aac67ea17895f13cbfa4 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 17 Feb 2025 20:54:37 +0100 Subject: [PATCH 217/325] skip a bunch of stuff in dedi/render_none --- src/d_main.c | 5 ++++- src/p_mobj.c | 4 ++++ src/p_tick.c | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index af25ae2ea..0bfda85a2 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -183,6 +183,9 @@ static void D_GamePadMenuScrollTicker(void) static SINT8 menuInputDelayTimer = 0; int key = 0; // butt-on output + if (dedicated) + return; + // wish i had a switch ono if (DPADUPSCROLL) key = KEY_UPARROW; @@ -214,7 +217,7 @@ static void D_DeviceLEDTick(void) UINT16 color[MAXSPLITSCREENPLAYERS]; UINT16 curcolor[MAXSPLITSCREENPLAYERS]; - if (I_NumJoys() == 0) + if (dedicated || I_NumJoys() == 0) { return; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 77e65c24f..09f246a85 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6039,6 +6039,10 @@ static void P_KoopaThinker(mobj_t *koopa) // void P_RollPitchMobj(mobj_t* mobj) { + // we dont need this in dedi do we? + if (rendermode == render_none) + return; + if (P_MobjWasRemoved(mobj)) return; diff --git a/src/p_tick.c b/src/p_tick.c index e9ea16ed0..5a55d23e3 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -373,7 +373,7 @@ static void P_DeviceRumbleTick(void) { UINT8 i; - if (I_NumJoys() == 0 || gamestate != GS_LEVEL) + if (dedicated || I_NumJoys() == 0 || gamestate != GS_LEVEL) { return; } @@ -503,6 +503,9 @@ static inline void P_ResetSpriteStuff(void) { thinker_t *th; + if (rendermode == render_none) + return; + for (th = thinkercap.next; th != &thinkercap; th = th->next) { mobj_t *mo; -- 2.54.0 From f15f24914d63fcc4e5b4b94423b0197ca69f809e Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 17 Feb 2025 21:23:55 +0100 Subject: [PATCH 218/325] initialize this --- src/d_main.c | 4 ++-- src/g_input.c | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 0bfda85a2..7c6105a28 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -214,8 +214,8 @@ static void D_GamePadMenuScrollTicker(void) static void D_DeviceLEDTick(void) { UINT8 i; - UINT16 color[MAXSPLITSCREENPLAYERS]; - UINT16 curcolor[MAXSPLITSCREENPLAYERS]; + static UINT16 color[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; + static UINT16 curcolor[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; if (dedicated || I_NumJoys() == 0) { diff --git a/src/g_input.c b/src/g_input.c index 168d51bf3..6f9d77cca 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -928,20 +928,17 @@ UINT16 G_GetSkinColor(INT32 playernum) { case 0: return cv_playercolor.value; - break; case 1: return cv_playercolor2.value; - break; case 2: return cv_playercolor3.value; - break; case 3: return cv_playercolor4.value; - break; default: return 0; - break; } + + return 0; } void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color) -- 2.54.0 From 70a985e27444c4ce617c73c391c3faf0015caadc Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 17 Feb 2025 21:16:12 +0100 Subject: [PATCH 219/325] dont check number of controllers every frame --- src/d_main.c | 2 +- src/i_system.h | 2 ++ src/p_tick.c | 2 +- src/sdl/i_system.c | 4 ++++ src/sdl/i_video.c | 2 ++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 7c6105a28..b167bc60a 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -217,7 +217,7 @@ static void D_DeviceLEDTick(void) static UINT16 color[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; static UINT16 curcolor[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; - if (dedicated || I_NumJoys() == 0) + if (dedicated || numcontrollers == 0) { return; } diff --git a/src/i_system.h b/src/i_system.h index 81cd80b68..2154d5db0 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -226,6 +226,8 @@ void I_InitJoystick4(void); */ INT32 I_NumJoys(void); +extern INT32 numcontrollers; + /** \brief The *I_GetJoyName function \param joyindex which joystick diff --git a/src/p_tick.c b/src/p_tick.c index 5a55d23e3..717bffdc0 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -373,7 +373,7 @@ static void P_DeviceRumbleTick(void) { UINT8 i; - if (dedicated || I_NumJoys() == 0 || gamestate != GS_LEVEL) + if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL) { return; } diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 65239b6a4..5e5df2c11 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -201,6 +201,8 @@ static char returnWadPath[256]; #include "../byteptr.h" #endif +INT32 numcontrollers = 0; + #ifdef HAVE_LIBBACKTRACE #include // TODO - move this to some header file instead @@ -1397,6 +1399,8 @@ void I_InitJoystick(UINT8 index) joystick_started[index] = 0; } + numcontrollers = I_NumJoys(); + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { if (JoyInfo[i].dev == newcontroller) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 2ba945467..820186c0f 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1243,6 +1243,8 @@ void I_GetEvent(void) G_SetPlayerGamepadIndicatorColor(i, G_GetSkinColor(i)); // gotta update the controller led again on reconnect } + numcontrollers = I_NumJoys(); + //////////////////////////////////////////////////////////// for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) -- 2.54.0 From b4269cba3e68c01b7fede2f3e997837092f6e26d Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 17 Feb 2025 21:30:36 +0100 Subject: [PATCH 220/325] properly init numcontrollers --- src/sdl/i_system.c | 12 +++++------- src/sdl/i_video.c | 7 +++++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 5e5df2c11..60d0b4cce 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -1172,21 +1172,21 @@ void I_ShutdownJoystick(UINT8 index) { INT32 i; event_t event; - event.type=ev_keyup; + event.type = ev_keyup; event.data2 = 0; event.data3 = 0; lastjoybuttons[index] = lastjoyhats[index] = 0; // emulate the up of all joystick buttons - for (i=0;i Date: Tue, 18 Feb 2025 12:29:47 +0300 Subject: [PATCH 221/325] Fix compilation with old sdl --- src/sdl/i_system.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 60d0b4cce..353fd0f82 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -1488,7 +1488,7 @@ const char *I_GetJoyName(INT32 joyindex) void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration) { #if !(SDL_VERSION_ATLEAST(2,0,14)) - (void)device_id; + (void)playernum; (void)low_strength; (void)high_strength; (void)duration; @@ -1506,7 +1506,7 @@ void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue) { #if !(SDL_VERSION_ATLEAST(2,0,14)) - (void)device_id; + (void)playernum; (void)red; (void)green; (void)blue; -- 2.54.0 From 8f342110c985546af47b9ac303448d49da3efbd6 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 27 Feb 2025 19:40:32 +0100 Subject: [PATCH 222/325] color ping numbers for color hud --- src/hu_stuff.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 191aaee9f..d697a431c 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2403,12 +2403,10 @@ Ping_gfx_num (int lag) static const UINT8 * Ping_gfx_colormap (UINT32 lag, boolean gentleman) { - const UINT8 *colormap = NULL; + UINT8 *colormap = NULL; - if (gentleman) - { - colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); - } + if (K_UseColorHud()) + colormap = R_GetTranslationColormap(TC_RAINBOW, Ping_gfx_color(lag), GTC_CACHE); if (servermaxping && lag > servermaxping && hu_tick < 4) { -- 2.54.0 From 58fd729bec7ab409b3be16e120708681702d3a04 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 3 Mar 2025 00:14:25 +0100 Subject: [PATCH 223/325] temp revert nanosleep for nix --- src/sdl/i_system.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 353fd0f82..337f24de3 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2130,16 +2130,7 @@ void I_Sleep(UINT32 ms) void I_SleepDuration(precise_t duration) { -#if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) - UINT64 precision = I_GetPrecisePrecision(); - struct timespec ts = { - .tv_sec = duration / precision, - .tv_nsec = duration * 1000000000 / precision % 1000000000, - }; - int status; - do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts); - while (status == EINTR); -#elif defined (MIN_SLEEP_DURATION_MS) +#if defined (MIN_SLEEP_DURATION_MS) UINT64 precision = I_GetPrecisePrecision(); INT32 sleepvalue = cv_sleep.value; UINT64 delaygranularity; -- 2.54.0 From fac2e8ec9837fcc57c149adced523be815456021 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 3 Mar 2025 09:56:49 +0100 Subject: [PATCH 224/325] tiny cleanup keyboard stuff --- src/sdl/i_video.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 83564bfab..bca0a7840 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -417,13 +417,15 @@ static INT32 Impl_SDL_Scancode_To_Keycode(SDL_Scancode code) } // Get the equivalent ASCII (Unicode?) character for a keypress. -static INT32 GetTypedChar(SDL_Scancode code, SDL_Keysym *sym) +static INT32 GetTypedChar(SDL_Keysym keysym) { SDL_Event next_event; - boolean Text_Input_Only = (chat_on || CON_Ready() || (menu_text_input && menuactive)); //only use this this if on chat or console or the current menu wants inputs from us (except if its the control setup menu ig) + SDL_Keycode keycode = keysym.sym; + SDL_Scancode scancode = keysym.scancode; + const boolean Text_Input_Only = (chat_on || CON_Ready() || (menu_text_input && menuactive)); // only use this this if on chat or console or the current menu wants inputs from us (except if its the control setup menu ig) // Special cases, where we always return a fixed value. - switch (sym->sym) + switch (keycode) { case SDLK_BACKSPACE: return KEY_BACKSPACE; case SDLK_RETURN: return KEY_ENTER; @@ -440,13 +442,13 @@ static INT32 GetTypedChar(SDL_Scancode code, SDL_Keysym *sym) } } - return Impl_SDL_Scancode_To_Keycode(code); //fallback + return Impl_SDL_Scancode_To_Keycode(scancode); // fallback } static INT32 Impl_SDL_Keysym_To_Keycode(SDL_Keysym keysym) { - SDL_Keycode keycode= keysym.sym; - SDL_Scancode scancode= keysym.scancode; + SDL_Keycode keycode = keysym.sym; + SDL_Scancode scancode = keysym.scancode; if (keycode >= SDLK_a && keycode <= SDLK_z) { @@ -457,15 +459,14 @@ static INT32 Impl_SDL_Keysym_To_Keycode(SDL_Keysym keysym) { return KEY_F1 + (keycode - SDLK_F1); } - if(scancode == SDL_SCANCODE_APOSTROPHE) + + switch (scancode) { - return KEY_FR_U_GRAVE; - } - switch(scancode){ case SDL_SCANCODE_APOSTROPHE: return KEY_FR_U_GRAVE; case SDL_SCANCODE_LEFTBRACKET: return '^'; default: break; } + switch (keycode) { // F11 and F12 are separated from the rest of the function keys @@ -858,6 +859,7 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt) static void Impl_HandleKeyboardEvent(SDL_KeyboardEvent evt, Uint32 type) { event_t event; + if (type == SDL_KEYUP) { event.type = ev_keyup; @@ -871,12 +873,18 @@ static void Impl_HandleKeyboardEvent(SDL_KeyboardEvent evt, Uint32 type) return; } - if (cv_keyboardlayout.value == 2) - event.data1 = GetTypedChar(evt.keysym.scancode, &evt.keysym); - else if (cv_keyboardlayout.value == 3) - event.data1 = Impl_SDL_Keysym_To_Keycode(evt.keysym); - else - event.data1 = Impl_SDL_Scancode_To_Keycode(evt.keysym.scancode); + switch (cv_keyboardlayout.value) + { + case 2: // "native" + event.data1 = GetTypedChar(evt.keysym); + break; + case 3: // AZERTY + event.data1 = Impl_SDL_Keysym_To_Keycode(evt.keysym); + break; + default: + event.data1 = Impl_SDL_Scancode_To_Keycode(evt.keysym.scancode); + break; + } if (event.data1) D_PostEvent(&event); } -- 2.54.0 From 54d73206caf1f82be4c9adcc7596b08311dd8dbb Mon Sep 17 00:00:00 2001 From: Chearii Date: Tue, 4 Mar 2025 19:42:59 -0500 Subject: [PATCH 225/325] Fix ``hw_draw`` gaffe --- src/hardware/hw_draw.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index b2d69861a..29e735822 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -287,16 +287,18 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t v[0].t = v[1].t = 0.0f; v[2].t = v[3].t = gpatch->max_t; + // whoops + if (blendmode) + flags = HWR_GetBlendModeFlag(blendmode+1)|PF_NoDepthTest; + else + flags = PF_Translucent|PF_NoDepthTest; + if (option & V_WRAPX) flags |= PF_ForceWrapX; if (option & V_WRAPY) flags |= PF_ForceWrapY; // clip it since it is used for bunny scroll in doom I - if (blendmode) - flags = HWR_GetBlendModeFlag(blendmode+1)|PF_NoDepthTest; - else - flags = PF_Translucent|PF_NoDepthTest; if (alphalevel) { -- 2.54.0 From 72d94b77ac2bdcc8b00ab3137cb5ede2312cff3d Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 00:08:30 +0100 Subject: [PATCH 226/325] fix blendmode oopsie --- src/hardware/hw_main.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index ccd292cf3..c89c6c876 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1085,8 +1085,8 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, if (cutflag & FF_FOG) HWR_AddTransparentWall(wallVerts, Surf, texnum, noencore, PF_Fog|PF_NoTexture|polyflags, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) - HWR_AddTransparentWall(wallVerts, Surf, texnum, noencore, PF_Translucent|polyflags, false, lightnum, colormap); + else if (polyflags & (PF_Translucent|PF_Additive|PF_Subtractive|PF_ReverseSubtract|PF_Multiplicative|PF_Environment)) + HWR_AddTransparentWall(wallVerts, Surf, texnum, noencore, polyflags, false, lightnum, colormap); else HWR_ProjectWall(wallVerts, Surf, PF_Masked|polyflags, lightnum, colormap); @@ -1732,7 +1732,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom blendmode |= PF_Decal; if (!gl_drawing_stencil && gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, noencore, &Surf, (!(blendmode & PF_Masked)) ? FF_TRANSLUCENT : FF_CUTLEVEL, NULL, PF_Decal); + HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, noencore, &Surf, (!(blendmode & PF_Masked)) ? FF_TRANSLUCENT : FF_CUTLEVEL, NULL, blendmode); else if (!gl_drawing_stencil && !(blendmode & PF_Masked)) HWR_AddTransparentWall(wallVerts, &Surf, gl_midtexture, noencore, blendmode, false, lightnum, colormap); else @@ -1956,10 +1956,10 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[0].s = wallVerts[3].s = cliplow * glTex->scaleX; wallVerts[2].s = wallVerts[1].s = cliphigh * glTex->scaleX; } + FBITFIELD blendmode; + if (rover->flags & FF_FOG) { - FBITFIELD blendmode; - blendmode = PF_Fog|PF_NoTexture; lightnum = rover->master->frontsector->lightlevel; @@ -1976,7 +1976,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom } else { - FBITFIELD blendmode = PF_Masked; + blendmode = PF_Masked; if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) { @@ -2071,10 +2071,10 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].s = wallVerts[1].s = cliphigh * glTex->scaleX; } + FBITFIELD blendmode; + if (rover->flags & FF_FOG) { - FBITFIELD blendmode; - blendmode = PF_Fog|PF_NoTexture; lightnum = rover->master->frontsector->lightlevel; @@ -2091,7 +2091,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom } else { - FBITFIELD blendmode = PF_Masked; + blendmode = PF_Masked; if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) { -- 2.54.0 From 9ed242cde22cd5e2b7e1aa089262d4854a60716f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:27:09 +0100 Subject: [PATCH 227/325] where did this go? lel --- src/hu_stuff.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 1ca5b7099..e18f4e872 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2356,6 +2356,21 @@ Ping_gfx_num (int lag) return 4; } +static int +Ping_gfx_color (int lag) +{ + if (lag < 2) + return SKINCOLOR_JAWZ; + else if (lag < 4) + return SKINCOLOR_MINT; + else if (lag < 7) + return SKINCOLOR_GOLD; + else if (lag < 10) + return SKINCOLOR_RED; + else + return SKINCOLOR_WHITE; // SKINCOLOR_MAGENTA +} + static const UINT8 * Ping_gfx_colormap (UINT32 lag, boolean gentleman) { @@ -2384,7 +2399,6 @@ Ping_conversion (UINT32 lag) return lag; } - // // HU_drawPing // -- 2.54.0 From 54747c6b538a1f582480ffebea02dc09524fcda7 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 15:05:11 +0100 Subject: [PATCH 228/325] Prevent dropped ticcmds due to interp timing jutter kinda figured out what this does, and makes clients on uncapped listen servers alot less prone to drop gametics --- src/d_clisrv.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 320c36996..44f733eae 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5332,6 +5332,12 @@ static void HandlePacketFromPlayer(SINT8 node) /// \todo Use a separate cvar for that kind of timeout? freezetimeout[node] = I_GetTime() + connectiontimeout; + // If we've alredy received a ticcmd for this tic, just submit it for the next one. + tic_t faketic = maketic; + if ((!!(netcmds[maketic % TICQUEUE][netconsole].angleturn & TICCMD_RECEIVED)) + && (maketic - firstticstosend < TICQUEUE - 1)) + faketic++; + // Don't do anything for packets of type NODEKEEPALIVE? // Sryder 2018/07/01: Update the freezetimeout still! if (netbuffer->packettype == PT_NODEKEEPALIVE @@ -5339,7 +5345,7 @@ static void HandlePacketFromPlayer(SINT8 node) break; // Copy ticcmd - G_MoveTiccmd(&netcmds[maketic%TICQUEUE][netconsole], &netbuffer->u.clientpak.cmd, 1); + G_MoveTiccmd(&netcmds[faketic%TICQUEUE][netconsole], &netbuffer->u.clientpak.cmd, 1); // Check ticcmd for "speed hacks" if (CheckForSpeedHacks((UINT8)netconsole)) @@ -5351,7 +5357,7 @@ static void HandlePacketFromPlayer(SINT8 node) || (netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS)) && (nodetoplayer2[node] >= 0)) { - G_MoveTiccmd(&netcmds[maketic%TICQUEUE][(UINT8)nodetoplayer2[node]], + G_MoveTiccmd(&netcmds[faketic%TICQUEUE][(UINT8)nodetoplayer2[node]], &netbuffer->u.client2pak.cmd2, 1); if (CheckForSpeedHacks((UINT8)nodetoplayer2[node])) @@ -5362,7 +5368,7 @@ static void HandlePacketFromPlayer(SINT8 node) || (netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS)) && (nodetoplayer3[node] >= 0)) { - G_MoveTiccmd(&netcmds[maketic%TICQUEUE][(UINT8)nodetoplayer3[node]], + G_MoveTiccmd(&netcmds[faketic%TICQUEUE][(UINT8)nodetoplayer3[node]], &netbuffer->u.client3pak.cmd3, 1); if (CheckForSpeedHacks((UINT8)nodetoplayer3[node])) @@ -5372,7 +5378,7 @@ static void HandlePacketFromPlayer(SINT8 node) if ((netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS) && (nodetoplayer4[node] >= 0)) { - G_MoveTiccmd(&netcmds[maketic%TICQUEUE][(UINT8)nodetoplayer4[node]], + G_MoveTiccmd(&netcmds[faketic%TICQUEUE][(UINT8)nodetoplayer4[node]], &netbuffer->u.client4pak.cmd4, 1); if (CheckForSpeedHacks((UINT8)nodetoplayer4[node])) -- 2.54.0 From e4e1f0c645817640f3361421a6a5378e270a1832 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 17 Feb 2025 20:40:22 +0100 Subject: [PATCH 229/325] revert all the server ticking stuff --- src/d_clisrv.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 44f733eae..ec338a6e6 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -6405,21 +6405,19 @@ boolean TryRunTics(tic_t realtics) } #endif - ticking = neededtic > gametic; - - if (ticking) + if (neededtic > gametic) { - if (realtics) - hu_stopped = false; + hu_stopped = false; } if (player_joining) { - if (realtics) - hu_stopped = true; + hu_stopped = true; return false; } + ticking = neededtic > gametic; + if (ticking) { // run the count * tics @@ -6679,14 +6677,6 @@ void NetUpdate(void) if (realtics <= 0) // nothing new to update return; - if (realtics > 5) - { - if (server) - realtics = 1; - else - realtics = 5; - } - #ifdef DEDICATEDIDLETIME if (server && dedicated && gamestate == GS_LEVEL) { @@ -6735,6 +6725,14 @@ void NetUpdate(void) } #endif + if (realtics > 5) + { + if (server) + realtics = 1; + else + realtics = 5; + } + gametime = nowtime; UpdatePingTable(); @@ -6828,8 +6826,6 @@ void NetUpdate(void) Net_AckTicker(); HandleNodeTimeouts(); - nowtime /= NEWTICRATERATIO; - if (nowtime > resptime) { resptime = nowtime; -- 2.54.0 From 7235f9864ea6cc6b734e55014f1c9e5bf3900565 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 20 Jan 2025 22:02:08 +0100 Subject: [PATCH 230/325] delete nonfunctional second mouse stuff --- src/android/i_system.c | 4 - src/d_event.h | 1 - src/d_netcmd.c | 30 +--- src/d_netcmd.h | 7 - src/dummy/i_system.c | 4 - src/g_game.c | 9 +- src/g_game.h | 3 +- src/g_input.c | 40 +---- src/g_input.h | 12 +- src/hu_stuff.c | 2 +- src/i_system.h | 8 - src/m_menu.c | 29 +--- src/sdl/i_system.c | 337 ----------------------------------------- src/sdl/i_video.c | 2 - 14 files changed, 12 insertions(+), 476 deletions(-) diff --git a/src/android/i_system.c b/src/android/i_system.c index f190699a4..7f034c752 100644 --- a/src/android/i_system.c +++ b/src/android/i_system.c @@ -184,8 +184,6 @@ void I_OutputMsg(const char *fmt, ...) void I_StartupMouse(void){} -void I_StartupMouse2(void){} - void I_StartupKeyboard(void){} INT32 I_GetKey(void) @@ -242,8 +240,6 @@ void I_GetJoystickEvents(void){} void I_GetJoystick2Events(void){} -void I_GetMouseEvents(void){} - char *I_GetEnv(const char *name) { LOGW("I_GetEnv() called?!"); diff --git a/src/d_event.h b/src/d_event.h index 8cbf8560d..b76e5c6a4 100644 --- a/src/d_event.h +++ b/src/d_event.h @@ -25,7 +25,6 @@ typedef enum ev_console, ev_mouse, ev_joystick, - ev_mouse2, ev_joystick2, ev_joystick3, ev_joystick4, diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a12257ba2..1496b9eb8 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -209,13 +209,6 @@ void SendWeaponPref3(void); void SendWeaponPref4(void); static CV_PossibleValue_t usemouse_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Force"}, {0, NULL}}; -#if defined (__unix__) || defined (__APPLE__) || defined (UNIXCOMMON) -static CV_PossibleValue_t mouse2port_cons_t[] = {{0, "/dev/gpmdata"}, {1, "/dev/ttyS0"}, - {2, "/dev/ttyS1"}, {3, "/dev/ttyS2"}, {4, "/dev/ttyS3"}, {0, NULL}}; -#else -static CV_PossibleValue_t mouse2port_cons_t[] = {{1, "COM1"}, {2, "COM2"}, {3, "COM3"}, {4, "COM4"}, - {0, NULL}}; -#endif #ifdef LJOYSTICK static CV_PossibleValue_t joyport_cons_t[] = {{1, "/dev/js0"}, {2, "/dev/js1"}, {3, "/dev/js2"}, @@ -298,7 +291,7 @@ consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, INT32 cv_debug; consvar_t cv_usemouse = {"use_mouse", "Off", CV_SAVE|CV_CALL,usemouse_cons_t, I_StartupMouse, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_usemouse2 = {"use_mouse2", "Off", CV_SAVE|CV_CALL,usemouse_cons_t, I_StartupMouse2, 0, NULL, NULL, 0, 0, NULL}; + //WTF consvar_t cv_mouseturn = {"mouseturn", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -331,12 +324,6 @@ consvar_t cv_joyscale[2] = { //Alam: Dummy for save {"joyscale", "1", CV_SAVE|CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL} }; #endif -#if defined (__unix__) || defined (__APPLE__) || defined (UNIXCOMMON) -consvar_t cv_mouse2port = {"mouse2port", "/dev/gpmdata", CV_SAVE, mouse2port_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_mouse2opt = {"mouse2opt", "0", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; -#else -consvar_t cv_mouse2port = {"mouse2port", "COM2", CV_SAVE, mouse2port_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -#endif consvar_t cv_matchboxes = {"matchboxes", "Normal", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, matchboxes_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_specialrings = {"specialrings", "On", CV_NETVAR|CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -973,10 +960,6 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_showlocalskinmenus); - //CV_RegisterVar(&cv_alwaysfreelook); - //CV_RegisterVar(&cv_alwaysfreelook2); - //CV_RegisterVar(&cv_chasefreelook); - //CV_RegisterVar(&cv_chasefreelook2); CV_RegisterVar(&cv_replaysearchrate); CV_RegisterVar(&cv_showfocuslost); CV_RegisterVar(&cv_pauseifunfocused); @@ -1009,12 +992,6 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_addons_search_type); CV_RegisterVar(&cv_addons_search_case); - // WARNING: the order is important when initialising mouse2 - // we need the mouse2port - CV_RegisterVar(&cv_mouse2port); -#if defined (__unix__) || defined (__APPLE__) || defined (UNIXCOMMON) - CV_RegisterVar(&cv_mouse2opt); -#endif CV_RegisterVar(&cv_controlperkey); CV_RegisterVar(&cv_turnsmooth); @@ -1026,15 +1003,10 @@ void D_RegisterClientCommands(void) } CV_RegisterVar(&cv_usemouse); - CV_RegisterVar(&cv_usemouse2); CV_RegisterVar(&cv_invertmouse); - CV_RegisterVar(&cv_invertmouse2); CV_RegisterVar(&cv_mousesens); - CV_RegisterVar(&cv_mousesens2); CV_RegisterVar(&cv_mouseysens); - CV_RegisterVar(&cv_mouseysens2); //CV_RegisterVar(&cv_mousemove); - //CV_RegisterVar(&cv_mousemove2); for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 87d96b40d..3cffcf4bc 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -50,13 +50,6 @@ extern consvar_t cv_joyport2; #endif extern consvar_t cv_joyscale[4]; //MAXSPLITSCREENPLAYERS -// splitscreen with second mouse -extern consvar_t cv_mouse2port; -extern consvar_t cv_usemouse2; -#if defined (__unix__) || defined (__APPLE__) || defined (UNIXCOMMON) -extern consvar_t cv_mouse2opt; -#endif - // normally in p_mobj but the .h is not read extern consvar_t cv_itemrespawntime; extern consvar_t cv_itemrespawn; diff --git a/src/dummy/i_system.c b/src/dummy/i_system.c index f0c7e48ef..32af5f9c8 100644 --- a/src/dummy/i_system.c +++ b/src/dummy/i_system.c @@ -92,8 +92,6 @@ void I_OutputMsg(const char *error, ...) void I_StartupMouse(void){} -void I_StartupMouse2(void){} - void I_StartupKeyboard(void){} INT32 I_GetKey(void) @@ -146,8 +144,6 @@ void I_GetJoystickEvents(void){} void I_GetJoystick2Events(void){} -void I_GetMouseEvents(void){} - char *I_GetEnv(const char *name) { (void)name; diff --git a/src/g_game.c b/src/g_game.c index 33e58cb8a..9618d2e50 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -395,13 +395,7 @@ consvar_t cv_growmusic = {"growmusic", "On", CV_SAVE, powermusic_cons_t, NULL, consvar_t cv_supermusic = {"supermusic", "On", CV_SAVE, powermusic_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_invertmouse = {"invertmouse", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_invertmouse2 = {"invertmouse2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -/*consvar_t cv_alwaysfreelook = {"alwaysmlook", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_alwaysfreelook2 = {"alwaysmlook2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_chasefreelook = {"chasemlook", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_chasefreelook2 = {"chasemlook2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_mousemove = {"mousemove", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_mousemove2 = {"mousemove2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};*/ +//consvar_t cv_mousemove = {"mousemove", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"}, {1, "Left X"}, {2, "Left Y"}, {-1, "Left X-"}, {-2, "Left Y-"}, @@ -1256,7 +1250,6 @@ static void G_DoLoadLevel(boolean resetplayer) joy4xmove[i] = joy4ymove[i] = 0; } mousex = mousey = 0; - mouse2x = mouse2y = 0; // clear hud messages remains (usually from game startup) CON_ClearHUD(); diff --git a/src/g_game.h b/src/g_game.h index a1d8764cf..1b618f4e0 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -118,8 +118,7 @@ extern consvar_t cv_songcredits; extern consvar_t cv_showfreeplay; extern consvar_t cv_growmusic, cv_supermusic; extern consvar_t cv_pauseifunfocused; -extern consvar_t cv_invertmouse/*, cv_alwaysfreelook, cv_chasefreelook, cv_mousemove*/; -extern consvar_t cv_invertmouse2/*, cv_alwaysfreelook2, cv_chasefreelook2, cv_mousemove2*/; +extern consvar_t cv_invertmouse; extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS]; diff --git a/src/g_input.c b/src/g_input.c index b86d68ca6..f0121f37d 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -33,9 +33,7 @@ static CV_PossibleValue_t turnsmooth_cons_t[] = {{2, "Slow"}, {1, "Fast"}, {0, " // mouse values are used once consvar_t cv_mousesens = {"mousesens", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_mousesens2 = {"mousesens2", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_mouseysens = {"mouseysens", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_mouseysens2 = {"mouseysens2", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_controlperkey = {"controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_turnsmooth = {"turnsmoothing", "Slow", CV_SAVE, turnsmooth_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -125,8 +123,6 @@ static void led_off_handle4(void) INT32 mousex, mousey; INT32 mlooky; // like mousey but with a custom sensitivity for mlook -INT32 mouse2x, mouse2y, mlook2y; - // joystick values are repeated INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET], joy3xmove[JOYAXISSET], joy3ymove[JOYAXISSET], joy4xmove[JOYAXISSET], joy4ymove[JOYAXISSET]; @@ -148,7 +144,6 @@ typedef struct } dclick_t; static dclick_t mousedclicks[MOUSEBUTTONS]; static dclick_t joydclicks[JOYBUTTONS + JOYHATS*4]; -static dclick_t mouse2dclicks[MOUSEBUTTONS]; static dclick_t joy2dclicks[JOYBUTTONS + JOYHATS*4]; static dclick_t joy3dclicks[JOYBUTTONS + JOYHATS*4]; static dclick_t joy4dclicks[JOYBUTTONS + JOYHATS*4]; @@ -233,14 +228,6 @@ void G_MapEventsToControls(event_t *ev) if (ev->data3 != INT32_MAX) joy4ymove[i] = ev->data3; break; - case ev_mouse2: // buttons are virtual keys - if (menuactive || CON_Ready() || chat_on) - break; - mouse2x = (INT32)(ev->data2*((cv_mousesens2.value*cv_mousesens2.value)/110.0f + 0.1f)); - mouse2y = (INT32)(ev->data3*((cv_mousesens2.value*cv_mousesens2.value)/110.0f + 0.1f)); - mlook2y = (INT32)(ev->data3*((cv_mouseysens2.value*cv_mousesens2.value)/110.0f + 0.1f)); - break; - default: break; } @@ -258,12 +245,6 @@ void G_MapEventsToControls(event_t *ev) gamekeydown[KEY_DBLJOY1+i] = flag; } - for (i = 0; i < MOUSEBUTTONS; i++) - { - flag = G_CheckDoubleClick(gamekeydown[KEY_2MOUSE1+i], &mouse2dclicks[i]); - gamekeydown[KEY_DBL2MOUSE1+i] = flag; - } - for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++) { flag = G_CheckDoubleClick(gamekeydown[KEY_2JOY1+i], &joy2dclicks[i]); @@ -401,18 +382,8 @@ static keyname_t keynames[] = {KEY_MOUSE1+5,"MOUSE6"}, {KEY_MOUSE1+6,"MOUSE7"}, {KEY_MOUSE1+7,"MOUSE8"}, - {KEY_2MOUSE1+0,"SEC_MOUSE2"}, // BP: sorry my mouse handler swap button 1 and 2 - {KEY_2MOUSE1+1,"SEC_MOUSE1"}, - {KEY_2MOUSE1+2,"SEC_MOUSE3"}, - {KEY_2MOUSE1+3,"SEC_MOUSE4"}, - {KEY_2MOUSE1+4,"SEC_MOUSE5"}, - {KEY_2MOUSE1+5,"SEC_MOUSE6"}, - {KEY_2MOUSE1+6,"SEC_MOUSE7"}, - {KEY_2MOUSE1+7,"SEC_MOUSE8"}, {KEY_MOUSEWHEELUP, "Wheel 1 UP"}, {KEY_MOUSEWHEELDOWN, "Wheel 1 Down"}, - {KEY_2MOUSEWHEELUP, "Wheel 2 UP"}, - {KEY_2MOUSEWHEELDOWN, "Wheel 2 Down"}, {KEY_JOY1+0, "JOY1"}, {KEY_JOY1+1, "JOY2"}, @@ -423,7 +394,7 @@ static keyname_t keynames[] = {KEY_JOY1+6, "JOY7"}, {KEY_JOY1+7, "JOY8"}, {KEY_JOY1+8, "JOY9"}, - + #if !defined (NOMOREJOYBTN_1S) // we use up to 32 buttons in DirectInput {KEY_JOY1+9, "JOY10"}, @@ -476,14 +447,6 @@ static keyname_t keynames[] = {KEY_DBLMOUSE1+5, "DBLMOUSE6"}, {KEY_DBLMOUSE1+6, "DBLMOUSE7"}, {KEY_DBLMOUSE1+7, "DBLMOUSE8"}, - {KEY_DBL2MOUSE1+0, "DBLSEC_MOUSE2"}, // BP: sorry my mouse handler swap button 1 and 2 - {KEY_DBL2MOUSE1+1, "DBLSEC_MOUSE1"}, - {KEY_DBL2MOUSE1+2, "DBLSEC_MOUSE3"}, - {KEY_DBL2MOUSE1+3, "DBLSEC_MOUSE4"}, - {KEY_DBL2MOUSE1+4, "DBLSEC_MOUSE5"}, - {KEY_DBL2MOUSE1+5, "DBLSEC_MOUSE6"}, - {KEY_DBL2MOUSE1+6, "DBLSEC_MOUSE7"}, - {KEY_DBL2MOUSE1+7, "DBLSEC_MOUSE8"}, {KEY_DBLJOY1+0, "DBLJOY1"}, {KEY_DBLJOY1+1, "DBLJOY2"}, @@ -868,7 +831,6 @@ static keyname_t keynames[] = {KEY_DBL4HAT1+13, "DBLFOR_HATDOWN4"}, {KEY_DBL4HAT1+14, "DBLFOR_HATLEFT4"}, {KEY_DBL4HAT1+15, "DBLFOR_HATRIGHT4"}, - }; static const char *gamecontrolname[num_gamecontrols] = diff --git a/src/g_input.h b/src/g_input.h index 124734004..505d210f8 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -41,12 +41,10 @@ typedef enum KEY_DBLJOY1 = KEY_DBLMOUSE1 + MOUSEBUTTONS, KEY_DBLHAT1 = KEY_DBLJOY1 + JOYBUTTONS, - KEY_2MOUSE1 = KEY_DBLHAT1 + JOYHATS*4, - KEY_2JOY1 = KEY_2MOUSE1 + MOUSEBUTTONS, + KEY_2JOY1 = KEY_DBLHAT1 + MOUSEBUTTONS, KEY_2HAT1 = KEY_2JOY1 + JOYBUTTONS, - KEY_DBL2MOUSE1 = KEY_2HAT1 + JOYHATS*4, - KEY_DBL2JOY1 = KEY_DBL2MOUSE1 + MOUSEBUTTONS, + KEY_DBL2JOY1 = KEY_2HAT1 + MOUSEBUTTONS, KEY_DBL2HAT1 = KEY_DBL2JOY1 + JOYBUTTONS, KEY_3JOY1 = KEY_DBL2HAT1 + JOYHATS*4, @@ -63,10 +61,8 @@ typedef enum KEY_MOUSEWHEELUP = KEY_DBL4HAT1 + JOYHATS*4, KEY_MOUSEWHEELDOWN = KEY_MOUSEWHEELUP + 1, - KEY_2MOUSEWHEELUP = KEY_MOUSEWHEELDOWN + 1, - KEY_2MOUSEWHEELDOWN = KEY_2MOUSEWHEELUP + 1, - NUMINPUTS = KEY_2MOUSEWHEELDOWN + 1, + NUMINPUTS = KEY_MOUSEWHEELDOWN + 1, } key_input_e; typedef enum @@ -110,7 +106,6 @@ typedef enum // mouse values are used once extern consvar_t cv_mousesens, cv_mouseysens; -extern consvar_t cv_mousesens2, cv_mouseysens2; extern consvar_t cv_controlperkey, cv_turnsmooth; extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS]; @@ -118,7 +113,6 @@ extern consvar_t cv_ledpowerup[MAXSPLITSCREENPLAYERS]; extern INT32 mousex, mousey; extern INT32 mlooky; //mousey with mlookSensitivity -extern INT32 mouse2x, mouse2y, mlook2y; extern INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET], joy3xmove[JOYAXISSET], joy3ymove[JOYAXISSET], joy4xmove[JOYAXISSET], joy4ymove[JOYAXISSET]; diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 934e3ea43..c7834679d 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1154,7 +1154,7 @@ void HU_Ticker(void) || hu_redownloadinggamestate #endif ) - resynch_ticker++; //tic tic tic tic tic + resynch_ticker++; //tic tic tic tic tic HU_TickSongCredits(); } diff --git a/src/i_system.h b/src/i_system.h index 2154d5db0..90887444f 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -251,10 +251,6 @@ void I_UpdateMumble(const mobj_t *mobj, const listener_t listener); */ void I_StartupMouse(void); -/** \brief Startup the second mouse -*/ -void I_StartupMouse2(void); - /** \brief setup timer irq and user timer routine. */ void I_StartupTimer(void); @@ -317,10 +313,6 @@ const char *I_LocateWad(void); */ void I_GetJoystickEvents(UINT8 index); -/** \brief Mouses events -*/ -void I_GetMouseEvents(void); - char *I_GetEnv(const char *name); INT32 I_PutEnv(char *variable); diff --git a/src/m_menu.c b/src/m_menu.c index 069f88917..0a06ab566 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -311,7 +311,7 @@ static void M_SetupMultiHandler(INT32 choice); // Split into multiple parts due to size // Controls menu_t OP_ControlsDef, OP_AllControlsDef; -menu_t OP_MouseOptionsDef, OP_Mouse2OptionsDef; +menu_t OP_MouseOptionsDef; menu_t OP_Joystick1Def, OP_Joystick2Def, OP_Joystick3Def, OP_Joystick4Def; menu_t OP_CustomCvarMenuDef; static void M_VideoModeMenu(INT32 choice); @@ -1374,15 +1374,12 @@ static menuitem_t OP_MouseOptionsMenu[] = { {IT_STRING | IT_CVAR, NULL, "Use Mouse", &cv_usemouse, 10}, - - //{IT_STRING | IT_CVAR, NULL, "First-Person MouseLook", &cv_alwaysfreelook, 30}, - //{IT_STRING | IT_CVAR, NULL, "Third-Person MouseLook", &cv_chasefreelook, 40}, - {IT_STRING | IT_CVAR, NULL, "Mouse Turning", &cv_mouseturn, 20}, + {IT_STRING | IT_CVAR, NULL, "Mouse Turning", &cv_mouseturn, 20}, {IT_STRING | IT_CVAR, NULL, "Invert Mouse", &cv_invertmouse, 30}, {IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Mouse X Speed", &cv_mousesens, 40}, {IT_STRING | IT_CVAR | IT_CV_SLIDER, - NULL, "Mouse Y Speed", &cv_mouseysens, 50}, + NULL, "Mouse Y Speed", &cv_mouseysens, 50}, }; static const char* OP_MouseTooltips[] = @@ -1394,21 +1391,6 @@ static const char* OP_MouseTooltips[] = "Mouse vertical sensitivity.", }; -/*static menuitem_t OP_Mouse2OptionsMenu[] = -{ - {IT_STRING | IT_CVAR, NULL, "Use Mouse 2", &cv_usemouse2, 10}, - {IT_STRING | IT_CVAR, NULL, "Second Mouse Serial Port", - &cv_mouse2port, 20}, - {IT_STRING | IT_CVAR, NULL, "First-Person MouseLook", &cv_alwaysfreelook2, 30}, - {IT_STRING | IT_CVAR, NULL, "Third-Person MouseLook", &cv_chasefreelook2, 40}, - {IT_STRING | IT_CVAR, NULL, "Mouse Move", &cv_mousemove2, 50}, - {IT_STRING | IT_CVAR, NULL, "Invert Mouse", &cv_invertmouse2, 60}, - {IT_STRING | IT_CVAR | IT_CV_SLIDER, - NULL, "Mouse X Speed", &cv_mousesens2, 70}, - {IT_STRING | IT_CVAR | IT_CV_SLIDER, - NULL, "Mouse Y Speed", &cv_mouseysens2, 80}, -};*/ - static menuitem_t OP_VideoOptionsMenu[] = { {IT_STRING | IT_CALL, NULL, "Set Resolution...", M_VideoModeMenu, 10}, @@ -4028,7 +4010,7 @@ boolean M_Responder(event_t *ev) else { // dirty hack: for customising controls, I want only buttons/keys, not moves - if (ev->type == ev_mouse || ev->type == ev_mouse2 || ev->type == ev_joystick + if (ev->type == ev_mouse || ev->type == ev_joystick || ev->type == ev_joystick2 || ev->type == ev_joystick3 || ev->type == ev_joystick4) return true; if (routine) @@ -12329,7 +12311,6 @@ static void M_ChangecontrolResponse(event_t *ev) { // ignore mouse/joy movements, just get buttons case ev_mouse: - case ev_mouse2: case ev_joystick: case ev_joystick2: case ev_joystick3: @@ -12362,8 +12343,6 @@ static void M_ChangecontrolResponse(event_t *ev) setupcontrols[control][found] = ch-KEY_MOUSE1+KEY_DBLMOUSE1; else if (ch >= KEY_JOY1 && ch <= KEY_JOY1+JOYBUTTONS) setupcontrols[control][found] = ch-KEY_JOY1+KEY_DBLJOY1; - else if (ch >= KEY_2MOUSE1 && ch <= KEY_2MOUSE1+MOUSEBUTTONS) - setupcontrols[control][found] = ch-KEY_2MOUSE1+KEY_DBL2MOUSE1; else if (ch >= KEY_2JOY1 && ch <= KEY_2JOY1+JOYBUTTONS) setupcontrols[control][found] = ch-KEY_2JOY1+KEY_DBL2JOY1; else if (ch >= KEY_3JOY1 && ch <= KEY_3JOY1+JOYBUTTONS) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 353fd0f82..214d4264f 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -422,12 +422,6 @@ static INT32 joystick_started[MAXSPLITSCREENPLAYERS] = {0, 0, 0, 0}; */ SDLJoyInfo_t JoyInfo[MAXSPLITSCREENPLAYERS]; - -#ifdef HAVE_TERMIOS -static INT32 fdmouse2 = -1; -static INT32 mouse2_started = 0; -#endif - SDL_bool consolevent = SDL_FALSE; SDL_bool framebuffer = SDL_FALSE; @@ -1649,337 +1643,6 @@ void I_UpdateMumble(const mobj_t *mobj, const listener_t listener) #undef WINMUMBLE #endif // NOMUMBLE -#ifdef HAVE_TERMIOS - -void I_GetMouseEvents(void) -{ - static UINT8 mdata[5]; - static INT32 i = 0,om2b = 0; - INT32 di, j, mlp, button; - event_t event; - const INT32 mswap[8] = {0, 4, 1, 5, 2, 6, 3, 7}; - - if (!mouse2_started) return; - for (mlp = 0; mlp < 20; mlp++) - { - for (; i < 5; i++) - { - di = read(fdmouse2, mdata+i, 1); - if (di == -1) return; - } - if ((mdata[0] & 0xf8) != 0x80) - { - for (j = 1; j < 5; j++) - if ((mdata[j] & 0xf8) == 0x80) - for (i = 0; i < 5-j; i++) // shift - mdata[i] = mdata[i+j]; - if (i < 5) continue; - } - else - { - button = mswap[~mdata[0] & 0x07]; - for (j = 0; j < MOUSEBUTTONS; j++) - { - if (om2b & (1<> 4); - } - else if (bytenum == 3) - { - dx = (char)((combytes[0] & 3) << 6); - dy = (char)((combytes[0] & 12) << 4); - dx = (char)(dx + combytes[1]); - dy = (char)(dy + combytes[2]); - handlermouse2x+= dx; - handlermouse2y+= dy; - } - else if (bytenum == 4) // fourth UINT8 (logitech mouses) - { - if (buffer[i] & 32) - handlermouse2buttons |= 4; - else - handlermouse2buttons &= ~4; - } - } -} - -void I_GetMouseEvents(void) -{ - static UINT8 lastbuttons2 = 0; //mouse movement - event_t event; - - if (mouse2filehandle == INVALID_HANDLE_VALUE) - return; - - I_PoolMouse2(); - // post key event for buttons - if (handlermouse2buttons != lastbuttons2) - { - INT32 i, j = 1, k; - k = (handlermouse2buttons ^ lastbuttons2); // only changed bit to 1 - lastbuttons2 = (UINT8)handlermouse2buttons; - - for (i = 0; i < MOUSEBUTTONS; i++, j <<= 1) - if (k & j) - { - if (handlermouse2buttons & j) - event.type = ev_keydown; - else - event.type = ev_keyup; - event.data1 = KEY_2MOUSE1+i; - D_PostEvent(&event); - } - } - - if (handlermouse2x != 0 || handlermouse2y != 0) - { - event.type = ev_mouse2; - event.data1 = 0; -// event.data1 = buttons; // not needed - event.data2 = handlermouse2x << 1; - event.data3 = -handlermouse2y << 1; - handlermouse2x = 0; - handlermouse2y = 0; - - D_PostEvent(&event); - } -} -#else -void I_GetMouseEvents(void){}; -#endif - -// -// I_StartupMouse2 -// -void I_StartupMouse2(void) -{ -#ifdef HAVE_TERMIOS - struct termios m2tio; - size_t i; - INT32 dtr = -1, rts = -1;; - I_ShutdownMouse2(); - if (cv_usemouse2.value == 0) return; - if ((fdmouse2 = open(cv_mouse2port.string, O_RDONLY|O_NONBLOCK|O_NOCTTY)) == -1) - { - CONS_Printf(M_GetText("Error opening %s!\n"), cv_mouse2port.string); - return; - } - tcflush(fdmouse2, TCIOFLUSH); - m2tio.c_iflag = IGNBRK; - m2tio.c_oflag = 0; - m2tio.c_cflag = CREAD|CLOCAL|HUPCL|CS8|CSTOPB|B1200; - m2tio.c_lflag = 0; - m2tio.c_cc[VTIME] = 0; - m2tio.c_cc[VMIN] = 1; - tcsetattr(fdmouse2, TCSANOW, &m2tio); - for (i = 0; i < strlen(cv_mouse2opt.string); i++) - { - if (toupper(cv_mouse2opt.string[i]) == 'D') - { - if (cv_mouse2opt.string[i+1] == '-') - dtr = 0; - else - dtr = 1; - } - if (toupper(cv_mouse2opt.string[i]) == 'R') - { - if (cv_mouse2opt.string[i+1] == '-') - rts = 0; - else - rts = 1; - } - if (dtr != -1 || rts != -1) - { - INT32 c; - if (!ioctl(fdmouse2, TIOCMGET, &c)) - { - if (!dtr) - c &= ~TIOCM_DTR; - else if (dtr > 0) - c |= TIOCM_DTR; - } - if (!rts) - c &= ~TIOCM_RTS; - else if (rts > 0) - c |= TIOCM_RTS; - ioctl(fdmouse2, TIOCMSET, &c); - } - } - mouse2_started = 1; - I_AddExitFunc(I_ShutdownMouse2); -#elif defined (_WIN32) - DCB dcb; - - if (mouse2filehandle != INVALID_HANDLE_VALUE) - I_ShutdownMouse2(); - - if (cv_usemouse2.value == 0) - return; - - if (mouse2filehandle == INVALID_HANDLE_VALUE) - { - // COM file handle - mouse2filehandle = CreateFileA(cv_mouse2port.string, GENERIC_READ | GENERIC_WRITE, - 0, // exclusive access - NULL, // no security attrs - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - if (mouse2filehandle == INVALID_HANDLE_VALUE) - { - INT32 e = GetLastError(); - if (e == 5) - CONS_Alert(CONS_ERROR, M_GetText("Can't open %s: Access denied\n"), cv_mouse2port.string); - else - CONS_Alert(CONS_ERROR, M_GetText("Can't open %s: error %d\n"), cv_mouse2port.string, e); - return; - } - } - - // getevent when somthing happens - //SetCommMask(mouse2filehandle, EV_RXCHAR); - - // buffers - SetupComm(mouse2filehandle, MOUSECOMBUFFERSIZE, MOUSECOMBUFFERSIZE); - - // purge buffers - PurgeComm(mouse2filehandle, PURGE_TXABORT | PURGE_RXABORT - | PURGE_TXCLEAR | PURGE_RXCLEAR); - - // setup port to 1200 7N1 - dcb.DCBlength = sizeof (DCB); - - GetCommState(mouse2filehandle, &dcb); - - dcb.BaudRate = CBR_1200; - dcb.ByteSize = 7; - dcb.Parity = NOPARITY; - dcb.StopBits = ONESTOPBIT; - - dcb.fDtrControl = DTR_CONTROL_ENABLE; - dcb.fRtsControl = RTS_CONTROL_ENABLE; - - dcb.fBinary = TRUE; - dcb.fParity = TRUE; - - SetCommState(mouse2filehandle, &dcb); - I_AddExitFunc(I_ShutdownMouse2); -#endif -} - // // I_Tactile // diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 83564bfab..e6c5ef2c6 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1384,8 +1384,6 @@ void I_OsPolling(void) I_GetJoystickEvents(i); } - I_GetMouseEvents(); - I_GetEvent(); mod = SDL_GetModState(); -- 2.54.0 From b069c2cb3e39494909eab2c869ac015ac136639c Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:37:10 +0100 Subject: [PATCH 231/325] tiny d_main cleanup --- src/d_clisrv.c | 2 +- src/d_main.c | 25 ++++++++++--------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index ec338a6e6..e2a07a233 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -6284,8 +6284,8 @@ static void Local_Maketic(INT32 realtics) // game responder calls HU_Responder, AM_Responder, F_Responder, // and G_MapEventsToControls if (!dedicated) rendergametic = gametic; - // translate inputs (keyboard/mouse/joystick) into game controls + // translate inputs (keyboard/mouse/joystick) into game controls for (i = 0; i <= splitscreen; i++) { CreateNewLocalCMD(i, realtics); diff --git a/src/d_main.c b/src/d_main.c index 96d1867cd..9c13ce18f 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -356,6 +356,7 @@ static boolean D_Display(void) // save the current screen if about to wipe wipe = (gamestate != wipegamestate); + if (wipe) { // set for all later @@ -745,11 +746,9 @@ void D_SRB2Loop(void) precise_t enterprecise = I_GetPreciseTime(); precise_t finishprecise = enterprecise; - { - // 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; - } + // 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; boolean ranwipe = false; @@ -795,7 +794,7 @@ void D_SRB2Loop(void) // process tics (but maybe not if realtic == 0) TryRunTics(realtics); - if (lastdraw || singletics || gametic > rendergametic) + if (lastdraw || singletics || (gametic > rendergametic)) { rendergametic = gametic; rendertimeout = entertic + TICRATE/17; @@ -809,7 +808,7 @@ void D_SRB2Loop(void) { // Evaluate the chase cam once for every local realtic // This might actually be better suited inside G_Ticker or TryRunTics - for (tic_t chasecamtics = 0; chasecamtics < realtics; chasecamtics++) + for (tic_t chasecamtics = 0; (chasecamtics < realtics); chasecamtics++) { P_RunChaseCameras(); } @@ -840,7 +839,7 @@ void D_SRB2Loop(void) rendertimefrac = FRACUNIT; } - if (!hu_stopped) + if ((deltatics < 1.0) && !hu_stopped) { rendertimefrac_unpaused = g_time.timefrac; } @@ -895,7 +894,7 @@ void D_SRB2Loop(void) // // Wipes run an inner loop and artificially increase // the measured time. - if (!ranwipe && frameskip < 3 && deltatics > 1.0) + if (!ranwipe && (frameskip < 3) && (deltatics > 1.0)) { frameskip++; } @@ -911,7 +910,7 @@ void D_SRB2Loop(void) // in the case of "match refresh rate" + vsync, don't sleep at all const boolean vsync_with_match_refresh = cv_vidwait.value && cv_fpscap.value == 0; - if (elapsed > 0 && (INT64)capbudget > elapsed && !vsync_with_match_refresh) + if ((elapsed > 0) && ((INT64)capbudget > elapsed) && !vsync_with_match_refresh) { I_SleepDuration(capbudget - (finishprecise - enterprecise)); } @@ -986,10 +985,6 @@ void D_StartTitle(void) S_ResetKeepAndSpecialMus(); // just in case F_StartTitleScreen(); - - // Reset the palette -- SRB2Kart: actually never mind let's do this in the middle of every fade - /*if (rendermode != render_none) - V_SetPaletteLump("PLAYPAL");*/ } // @@ -2087,7 +2082,7 @@ void D_SRB2Main(void) } #ifdef HAVE_DISCORDRPC - if (! dedicated) + if (!dedicated) { DRPC_Init(); } -- 2.54.0 From e5d832a6421648475bda8c025cdf95c306023fdd Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 28 Feb 2025 09:51:36 +0100 Subject: [PATCH 232/325] slight cleanup kart hud --- src/d_main.c | 4 +- src/d_main.h | 2 +- src/k_kart.c | 176 ++++++++++++++++++++++++++++----------------------- src/m_menu.c | 6 +- 4 files changed, 102 insertions(+), 86 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 9c13ce18f..249edc75c 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1208,7 +1208,7 @@ boolean xtra_speedo3; // 80x 11 extra speedometer check boolean xtra_speedo_clr3; // 80x 11 extra speedometer colour check boolean achi_speedo; // achiiro speedometer check boolean achi_speedo_clr; // extra speedometer colour check -boolean kartzspeedo; // kartZ speedo +boolean kartz_speedo; // kartZ speedo boolean clr_hud; // colour hud check boolean big_lap; // bigger lap counter @@ -1635,7 +1635,7 @@ void D_SRB2Main(void) "K_KZSP13", "K_KZSP14", "K_KZSP15", "K_KZSP16", "K_KZSP17", "K_KZSP18", "K_KZSP19", \ "K_KZSP20", "K_KZSP21", "K_KZSP22", "K_KZSP23", "K_KZSP24", "K_KZSP25", NULL)) { - kartzspeedo = true; + kartz_speedo = true; PUSHCONS(speedo_cons_temp, last_speedo_i, 4, "P-Meter"); } diff --git a/src/d_main.h b/src/d_main.h index 397aabdf8..d5b5189eb 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -38,7 +38,7 @@ extern boolean xtra_speedo3; // 80x11 extra speedometer check extern boolean xtra_speedo_clr3; // 80x11 extra speedometer colour check extern boolean achi_speedo; // achiiro speedometer check extern boolean achi_speedo_clr; // extra speedometer colour check -extern boolean kartzspeedo; // kartZ speedo +extern boolean kartz_speedo; // kartZ speedo extern boolean clr_hud; // colour hud check extern boolean big_lap; // bigger lap counter diff --git a/src/k_kart.c b/src/k_kart.c index 48723365c..3ec947d04 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7604,7 +7604,7 @@ void K_LoadKartHUDGraphics(void) } // KartZ speedo - if (kartzspeedo) + if (kartz_speedo) { const char* patchNames[] = { "K_KZSP1", "K_KZSP2", "K_KZSP3", "K_KZSP4", "K_KZSP5", @@ -8299,6 +8299,7 @@ static void K_drawKartStats(void) V_DrawSmallMappedPatch(x, y, flags, R_GetSkinFaceWant(stplyr), R_GetLocalTranslationColormap(fakeskin, fakeskin, stplyr->skincolor, GTC_CACHE, stplyr->skinlocal)); else V_DrawMappedPatch(x, y, flags, R_GetSkinFaceRank(stplyr), R_GetLocalTranslationColormap(fakeskin, fakeskin, stplyr->skincolor, GTC_CACHE, stplyr->skinlocal)); + V_DrawMappedPatch(x-3, y-2, flags, kp_facenum[min(9, max(1, stplyr->kartspeed))], R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_BLUEBERRY, GTC_CACHE)); V_DrawMappedPatch(x+10, y+10, flags, kp_facenum[min(9, max(1, stplyr->kartweight))], R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_BURGUNDY, GTC_CACHE)); } @@ -8616,8 +8617,6 @@ static void K_drawKartItem(void) fy = info.y; fflags = info.flags; - if (localcolor != SKINCOLOR_NONE) - colmap = R_GetTranslationColormap(colormode, localcolor, GTC_CACHE); if (K_UseColorHud()) colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE); @@ -8631,25 +8630,32 @@ static void K_drawKartItem(void) fixed_t frac = R_GetHudUncap(); UINT8 fancystep = (offset ? 6 : 10); fixed_t fancyoffset = (stplyr->kartstuff[k_itemroulette] % 3)-1; + if (fancyoffset != 0) { fancyflags &= ~V_HUDTRANS; fancyflags |=V_HUDTRANSHALF; } + rfy += (fancystep * fancyoffset * FRACUNIT) + FixedMul(fancystep*FRACUNIT, frac) - fancystep/2*FRACUNIT; } + if (localcolor != SKINCOLOR_NONE) + colmap = R_GetTranslationColormap(colormode, localcolor, GTC_CACHE); + // Then, the numbers: if (stplyr->kartstuff[k_itemamount] >= numberdisplaymin && !stplyr->kartstuff[k_itemroulette]) { localbg = K_getItemMulPatch((boolean)offset); + V_DrawMappedPatch(fx + (flipamount ? 48 : 0), fy, V_HUDTRANS|fflags|(flipamount ? V_FLIP : 0), localbg, colormap); // flip this graphic for p2 and p4 in split and shift it. V_DrawFixedPatch(fx<kartstuff[k_itemamount])); - else - V_DrawString(fx+24, fy+31, V_ALLOWLOWERCASE|V_HUDTRANS|fflags, va("x%d", stplyr->kartstuff[k_itemamount])); + { + const INT32 xofs = flipamount ? 2 : 24; // reminder that this is for 3/4p's right end of the screen. + V_DrawString(fx+xofs, fy+31, V_ALLOWLOWERCASE|V_HUDTRANS|fflags, va("x%d", stplyr->kartstuff[k_itemamount])); + } else { V_DrawScaledPatch(fx+28, fy+41, V_HUDTRANS|fflags, kp_itemx); @@ -8724,7 +8730,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI { tic_t worktime = drawtime/(60*TICRATE); - if ((G_BattleGametype() && cv_timelimit.value) && (!players[consoleplayer].exiting && (leveltime > (timelimitintics + starttime + TICRATE/2)) && cv_overtime.value)) // i hate this so much + if (cv_timelimit.value && cv_overtime.value && G_BattleGametype() && !players[consoleplayer].exiting && (leveltime > (timelimitintics + starttime + TICRATE/2))) // i hate this so much { V_DrawKartString(TX, TY+3, splitflags, va("OVERTIME")); } @@ -8823,6 +8829,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI if (!mode) splitflags = (splitflags &~ V_HUDTRANSHALF)|V_HUDTRANS; + while (curemb--) { workx -= 12; @@ -9038,28 +9045,32 @@ static boolean K_drawKartPositionFaces(void) for (; i < ranklines; i++) { - if (!playeringame[rankplayer[i]]) continue; - if (players[rankplayer[i]].spectator) continue; - if (!players[rankplayer[i]].mo) continue; + if (!playeringame[rankplayer[i]]) + continue; + if (players[rankplayer[i]].spectator) + continue; + if (!players[rankplayer[i]].mo) + continue; + + const UINT8 mocolor = players[rankplayer[i]].mo->color; bumperx = FACE_X+19; - if (players[rankplayer[i]].mo->color) + if (mocolor) { - colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE); - if (players[rankplayer[i]].mo->colorized) - colormap = R_GetTranslationColormap(TC_RAINBOW, players[rankplayer[i]].mo->color, GTC_CACHE); - else - colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE); + player_t *p; - { - player_t *p; - p = &players[rankplayer[i]]; - if (cv_highresportrait.value) - V_DrawSmallMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, R_GetSkinFaceWant(p), colormap); - else - V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, R_GetSkinFaceRank(p), colormap); - } + colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, mocolor, GTC_CACHE); + + if (players[rankplayer[i]].mo->colorized) + colormap = R_GetTranslationColormap(TC_RAINBOW, mocolor, GTC_CACHE); + + p = &players[rankplayer[i]]; + + if (cv_highresportrait.value) + V_DrawSmallMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, R_GetSkinFaceWant(p), colormap); + else + V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, R_GetSkinFaceRank(p), colormap); if (LUA_HudEnabled(hud_battlebumpers)) { @@ -9221,6 +9232,7 @@ static void K_drawKartLaps(void) INT32 fx = 0, fy = 0, fflags = 0; // stuff for 3p / 4p splitscreen. boolean flipstring = splitscreen > 1 && stplyrnum & 1; // used for 3p or 4p INT32 stringw = 0; // used with the above + const char *laps; drawinfo_t info; K_getLapsDrawinfo(&info); @@ -9228,26 +9240,23 @@ static void K_drawKartLaps(void) fy = info.y; fflags = info.flags; + laps = (stplyr->exiting ? "FIN" : va("%d/%d", stplyr->laps+1, cv_numlaps.value)); + + // draw stuff as god intended. if (splitscreen > 1) { - if (stplyr->exiting) // draw stuff as god intended. + if (flipstring) + { + stringw = V_StringWidth(laps, 0); + + V_DrawScaledPatch(fx-stringw-13, fy, V_HUDTRANS|fflags, kp_splitlapflag); + V_DrawRightAlignedString(fx, fy+1, V_HUDTRANS|fflags, laps); + } + else // draw stuff NORMALLY. { V_DrawScaledPatch(fx, fy, V_HUDTRANS|fflags, kp_splitlapflag); - V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, "FIN"); + V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, laps); } - else // take flipstring into account here since we may have more laps than just 10 - if (flipstring) - { - stringw = V_StringWidth(va("%d/%d", stplyr->laps+1, cv_numlaps.value), 0); - - V_DrawScaledPatch(fx-stringw-13, fy, V_HUDTRANS|fflags, kp_splitlapflag); - V_DrawRightAlignedString(fx, fy+1, V_HUDTRANS|fflags, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); - } - else // draw stuff NORMALLY. - { - V_DrawScaledPatch(fx, fy, V_HUDTRANS|fflags, kp_splitlapflag); - V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); - } } else { @@ -9263,10 +9272,7 @@ static void K_drawKartLaps(void) V_DrawScaledPatch(fx, fy, V_HUDTRANS|splitflags, biglap); } - if (stplyr->exiting) - V_DrawKartString(fx+33, fy+3, V_HUDTRANS|splitflags, "FIN"); - else - V_DrawKartString(fx+33, fy+3, V_HUDTRANS|splitflags, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); + V_DrawKartString(fx+33, fy+3, V_HUDTRANS|splitflags, laps); } } @@ -9277,59 +9283,56 @@ static void K_drawKartSpeedometer(void) return; fixed_t convSpeed = 0; - - //KartZ speedo - fixed_t fuspeed = 0; - INT32 spdpatch = 0; - - INT32 speedtype = 0; INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTOLEFT); + // man. + const boolean useoldspeedo = ((cv_newspeedometer.value == 1) || (cv_newspeedometer.value == 2 && !xtra_speedo) || (cv_newspeedometer.value == 3 && !achi_speedo) || (cv_newspeedometer.value == 4 && !kartz_speedo) || (cv_newspeedometer.value == 5 && !xtra_speedo3)); + const char *metric = ""; + switch (cv_kartspeedometer.value) { case 1: convSpeed = FixedDiv(FixedMul(stplyr->speed, 142371), mapobjectscale)/FRACUNIT; // 2.172409058 - speedtype = 1; break; case 2: convSpeed = FixedDiv(FixedMul(stplyr->speed, 88465), mapobjectscale)/FRACUNIT; // 1.349868774 - speedtype = 2; break; case 3: convSpeed = FixedDiv(stplyr->speed, mapobjectscale)/FRACUNIT; - speedtype = 3; break; case 4: if (stplyr->mo) convSpeed = (FixedDiv(stplyr->speed, FixedMul(K_GetKartSpeed(stplyr, false), ORIG_FRICTION))*100)>>FRACBITS; - speedtype = 4; break; default: break; } - // man. - if ((cv_newspeedometer.value == 1) || (cv_newspeedometer.value == 2 && !xtra_speedo) || (cv_newspeedometer.value == 3 && !achi_speedo) || (cv_newspeedometer.value == 4 && !kartzspeedo) || (cv_newspeedometer.value == 5 && !xtra_speedo3)) + if (useoldspeedo) { - switch (speedtype) { + switch (cv_kartspeedometer.value) + { case 1: - V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, va("%3d km/h", convSpeed)); + metric = va("%3d km/h", convSpeed); break; case 2: - V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, va("%3d mph", convSpeed)); + metric = va("%3d mph", convSpeed); break; case 3: - V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, va("%3d fu/t", convSpeed)); + metric = va("%3d fu/t", convSpeed); break; - case 4: // if extra.kart is found, use its included % symbol + case 4: + // if extra.kart is found, use its included % symbol if (!xtra_speedo) - V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, va("%4d P", convSpeed)); + metric = va("%4d P", convSpeed); else - V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, va("%4d %%", convSpeed)); - break; + metric = va("%4d %%", convSpeed); + break; default: break; } + + V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, metric); } else if (cv_newspeedometer.value == 2 && xtra_speedo) // why bother if we dont? { @@ -9373,17 +9376,20 @@ static void K_drawKartSpeedometer(void) V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed, 3, NULL); V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatches[cv_kartspeedometer.value]); } - // Kart Z speedo bullshit... // Draw the Speed counter. - else if (cv_newspeedometer.value == 4 && kartzspeedo) + else if (cv_newspeedometer.value == 4 && kartz_speedo) { + fixed_t fuspeed = 0; + INT32 spdpatch = 0; + static const INT32 speedIntervals[22] = {2, 5, 7, 10, 12, 15, 17, + 20, 22, 25, 27, 30, 32, + 35, 37, 40, 42, 45, 47, + 50, 52, 55}; + fuspeed = FixedDiv(stplyr->speed, mapobjectscale)/FRACUNIT; -#define NUM_INTERVALS 22 - const int speedIntervals[NUM_INTERVALS] = {2, 5, 7, 10, 12, 15, 17, 20, 22, 25, 27, 30, 32, 35, 37, 40, 42, 45, 47, 50, 52, 55}; - - for (int i = 0; i < NUM_INTERVALS; ++i) + for (INT32 i = 0; i < 22; ++i) { if (fuspeed < speedIntervals[i]) { @@ -9391,7 +9397,6 @@ static void K_drawKartSpeedometer(void) break; } } -#undef NUM_INTERVALS if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && (leveltime & 4)) spdpatch = 24; @@ -9408,6 +9413,7 @@ static void K_drawKartBumpersOrKarma(void) INT32 fx, fy, fflags; boolean flipstring = splitscreen > 1 && stplyrnum & 1; // same as laps, used for splitscreen INT32 stringw = 0; // used with the above + const char *bumpval = ""; drawinfo_t info; K_getLapsDrawinfo(&info); @@ -9427,43 +9433,52 @@ static void K_drawKartBumpersOrKarma(void) { if (stplyr->kartstuff[k_bumper] <= 0) { + bumpval = va("%d/2", stplyr->kartstuff[k_comebackpoints]); + if (flipstring) fx -= 37; V_DrawMappedPatch(fx, fy-1, V_HUDTRANS|fflags, kp_splitkarmabomb, colormap); - V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, va("%d/2", stplyr->kartstuff[k_comebackpoints])); + V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, bumpval); } else // the above doesn't need to account for weird stuff since the max amount of karma necessary is always 2 ^^^^ { + bumpval = va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value); + if (flipstring) // for p2 and p4, assume we can have more than 10 bumpers. It's retarded but who knows. { - stringw = V_StringWidth(va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value), 0); + stringw = V_StringWidth(bumpval, 0); V_DrawMappedPatch(fx-stringw-13, fy-1, V_HUDTRANS|fflags, kp_rankbumper, colormap); - V_DrawRightAlignedString(fx, fy+1, V_HUDTRANS|fflags, va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value)); + V_DrawRightAlignedString(fx, fy+1, V_HUDTRANS|fflags, bumpval); } else // draw bumpers normally. { V_DrawMappedPatch(fx, fy-1, V_HUDTRANS|fflags, kp_rankbumper, colormap); - V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value)); + V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, bumpval); } } } else { + patch_t *patch; + if (stplyr->kartstuff[k_bumper] <= 0) { - V_DrawMappedPatch(fx, fy, V_HUDTRANS|fflags, (K_UseColorHud() ? kp_karmastickerclr : kp_karmasticker), colormap); - V_DrawKartString(fx+47, fy+3, V_HUDTRANS|fflags, va("%d/2", stplyr->kartstuff[k_comebackpoints])); + patch = (K_UseColorHud() ? kp_karmastickerclr : kp_karmasticker); + bumpval = va("%d/2", stplyr->kartstuff[k_comebackpoints]); } else { if (stplyr->kartstuff[k_bumper] > 9 && cv_kartbumpers.value > 9) - V_DrawMappedPatch(fx, fy, V_HUDTRANS|fflags, (K_UseColorHud() ? kp_bumperstickerwideclr : kp_bumperstickerwide), colormap); + patch = (K_UseColorHud() ? kp_bumperstickerwideclr : kp_bumperstickerwide); else - V_DrawMappedPatch(fx, fy, V_HUDTRANS|fflags, (K_UseColorHud() ? kp_bumperstickerclr : kp_bumpersticker), colormap); + patch = (K_UseColorHud() ? kp_bumperstickerclr : kp_bumpersticker); - V_DrawKartString(fx+47, fy+3, V_HUDTRANS|fflags, va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value)); + bumpval = va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value); } + + V_DrawMappedPatch(fx, fy, V_HUDTRANS|fflags, patch, colormap); + V_DrawKartString(fx+47, fy+3, V_HUDTRANS|fflags, bumpval); } } @@ -10038,6 +10053,7 @@ static void K_drawKartWanted(void) if (battlewanted[0] != -1) colormap = R_GetTranslationColormap(0, players[battlewanted[0]].skincolor, GTC_CACHE); + V_DrawFixedPatch(basex< 1 ? kp_wantedsplit : kp_wanted), colormap); /*if (basey2) V_DrawFixedPatch(basex< Date: Fri, 28 Feb 2025 18:54:38 +0100 Subject: [PATCH 233/325] more kart hud cleanup also removes erronous nametag toggles --- src/d_netcmd.h | 2 - src/k_kart.c | 175 ++++++++++++++++++++++++------------------------- src/m_menu.c | 11 +--- 3 files changed, 87 insertions(+), 101 deletions(-) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 3cffcf4bc..63839cf12 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -172,9 +172,7 @@ extern consvar_t cv_nametagdist; extern consvar_t cv_showownnametag; extern consvar_t cv_smallnametags; extern consvar_t cv_nametagrestat; -extern consvar_t cv_nametaghop; extern consvar_t cv_nametagscore; -extern consvar_t cv_shownametagfinish; extern consvar_t cv_shownametagspectator; #define SKINSELECTSPIN_PAIN 25 diff --git a/src/k_kart.c b/src/k_kart.c index 3ec947d04..7e3179772 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -207,9 +207,7 @@ consvar_t cv_nametagmaxlenght = {"kartnametagmaxlenght", "12", CV_SAVE, CV_Unsig //consvar_t cv_nametagscaling = {"nametagscaling", "160", CV_SAVE, nametagscaling_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showownnametag = {"kartnametagshowown", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_smallnametags = {"kartnametagsmall", "Off", CV_SAVE, nametagsize_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_nametaghop = {"kartnametaghop", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_nametagscore = {"kartnametagscore", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_shownametagfinish = {"kartshownametagfinished", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_shownametagspectator = {"kartshownametagspectator", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -885,9 +883,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_showownnametag); CV_RegisterVar(&cv_smallnametags); CV_RegisterVar(&cv_nametagrestat); - CV_RegisterVar(&cv_nametaghop); CV_RegisterVar(&cv_nametagscore); - CV_RegisterVar(&cv_shownametagfinish); CV_RegisterVar(&cv_shownametagspectator); CV_RegisterVar(&cv_driftgauge); @@ -9287,7 +9283,6 @@ static void K_drawKartSpeedometer(void) // man. const boolean useoldspeedo = ((cv_newspeedometer.value == 1) || (cv_newspeedometer.value == 2 && !xtra_speedo) || (cv_newspeedometer.value == 3 && !achi_speedo) || (cv_newspeedometer.value == 4 && !kartz_speedo) || (cv_newspeedometer.value == 5 && !xtra_speedo3)); - const char *metric = ""; switch (cv_kartspeedometer.value) { @@ -9310,6 +9305,8 @@ static void K_drawKartSpeedometer(void) if (useoldspeedo) { + const char *metric = ""; + switch (cv_kartspeedometer.value) { case 1: @@ -9387,7 +9384,7 @@ static void K_drawKartSpeedometer(void) 35, 37, 40, 42, 45, 47, 50, 52, 55}; - fuspeed = FixedDiv(stplyr->speed, mapobjectscale)/FRACUNIT; + fuspeed = FixedDiv(stplyr->speed, mapobjectscale)/FRACUNIT; for (INT32 i = 0; i < 22; ++i) { @@ -9622,27 +9619,31 @@ static void K_drawNameTags(void) UINT8 i,j; INT32 trans = 0; vector2_t pos = {0}; - fixed_t tagwidth; - fixed_t tagwidthsmall; fixed_t namex,namey; int tagsdisplayed = 0; + fixed_t distance = 0; + fixed_t maxdistance = 0; + boolean flipped = false; + fixed_t z; + char *tag; patch_t *icon; - const INT32 hudtransflag = V_LocalTransFlag(); - if (P_MobjWasRemoved(stplyr->mo) || (stplyr->spectator && !cv_shownametagspectator.value) || (stplyr->exiting && !cv_shownametagfinish.value)) + INT32 dup = 0; + UINT8 *cm = NULL; + UINT8 tagcolor = 0; + INT32 vflags = 0; + boolean usenametagrestat = false; + fixed_t tagwidthsmall; + fixed_t tagwidth; + + if (P_MobjWasRemoved(stplyr->mo) || (stplyr->spectator && !cv_shownametagspectator.value) || stplyr->exiting) return; - // True if currently viewed player is flipped and has flipcam on - const boolean flipcam = ((stplyr->pflags & PF_FLIPCAM) && (stplyr->mo->eflags & MFE_VERTICALFLIP)); + maxdistance = ((10*cv_nametagdist.value) * mapobjectscale); for (i = 0; i < MAXPLAYERS; i++) { - fixed_t distance = 0; - const fixed_t maxdistance = ((10*cv_nametagdist.value)* mapobjectscale); - boolean flipped = 0; - fixed_t z; - if (i > PLAYERSMASK) continue; if (P_MobjWasRemoved(players[i].mo) || players[i].spectator || !playeringame[i]) @@ -9660,6 +9661,19 @@ static void K_drawNameTags(void) if (!P_CheckSightFast(stplyr->mo, players[i].mo)) continue; + z = players[i].mo->height; + + //Saltyhop hehe + z += lerp(players[i].mo->old_spriteyoffset, players[i].mo->spriteyoffset); + + if (!K_GetScreenCoords(&pos, stplyr, players[i].mo, z, false)) + continue; + + tagsdisplayed += 1; + + if (tagsdisplayed > cv_nametagmaxplayers.value) + break; + switch (cv_nametagtrans.value) { case 0: @@ -9689,49 +9703,34 @@ static void K_drawNameTags(void) trans = V_40TRANS; break; case 4: - trans = hudtransflag; + trans = V_LocalTransFlag(); break; default: break; } - const INT32 dup = vid.dupx; - - // If flipcam is on, other player is flipped relative to us when we have different - // verticalflip flag value. Otherwise, they are simply flipped when verticalflip flag says - // so - if (flipcam) - flipped = (players[i].mo->eflags & MFE_VERTICALFLIP) != (stplyr->mo->eflags & MFE_VERTICALFLIP); - else - flipped = players[i].mo->eflags & MFE_VERTICALFLIP; - - z = players[i].mo->height; - - //Saltyhop hehe - if (cv_saltyhop.value && cv_nametaghop.value) - z += lerp(players[i].mo->old_spriteyoffset, players[i].mo->spriteyoffset); - - if (!K_GetScreenCoords(&pos, stplyr, players[i].mo, z, false)) - continue; - - tagsdisplayed += 1; - - if (tagsdisplayed > cv_nametagmaxplayers.value) - break; - namex = pos.x>>FRACBITS; namey = pos.y>>FRACBITS; tag = va("%s%s ", HU_SkinColorToConsoleColor(players[i].mo->color),player_names[i]); icon = R_GetSkinFaceMini(players[i].mo->player); - const UINT8 *cm = R_GetTranslationColormap(players[i].skin, players[i].mo->color, GTC_CACHE); - const INT32 tagcolor = colortranslations[players[i].mo->color][7]; - const INT32 vflags = trans | V_NOSCALESTART; - tagwidth = cv_smallnametags.value ? dup*V_SmallStringWidth(player_names[i], V_ALLOWLOWERCASE) : dup*V_ThinStringWidth(player_names[i], V_ALLOWLOWERCASE); + dup = vid.dupx; + cm = R_GetTranslationColormap(players[i].skin, players[i].mo->color, GTC_CACHE); + tagcolor = colortranslations[players[i].mo->color][7]; + vflags = trans | V_NOSCALESTART; + usenametagrestat = ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2); tagwidthsmall = cv_smallnametags.value ? V_SmallStringWidth(player_names[i], V_ALLOWLOWERCASE) : V_ThinStringWidth(player_names[i], V_ALLOWLOWERCASE); + tagwidth = dup*tagwidthsmall; - if (cv_smallnametags.value == 2 || cv_smallnametags.value == 1 || !nametaggfx) + // If flipcam is on, other player is flipped relative to us when we have different + // verticalflip flag value. Otherwise, they are simply flipped when verticalflip flag says so + if ((stplyr->pflags & PF_FLIPCAM) && (stplyr->mo->eflags & MFE_VERTICALFLIP)) + flipped = (players[i].mo->eflags & MFE_VERTICALFLIP) != (stplyr->mo->eflags & MFE_VERTICALFLIP); + else + flipped = players[i].mo->eflags & MFE_VERTICALFLIP; + + if (cv_smallnametags.value || !nametaggfx) { if (flipped) namey += dup*5; @@ -9746,6 +9745,7 @@ static void K_drawNameTags(void) // Have to draw the nametag using patches here since drawfill can't draw at this scale... if (!flipped) V_DrawFixedPatch(namex<height/2)<width/2); // add offset to other stuff + V_DrawFixedPatch(namex<height/2)<width/2); // add offset to other stuff } //Name V_DrawSmallString(namex, namey, V_ALLOWLOWERCASE | vflags, tag); - if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2) + if (usenametagrestat) { V_DrawSmallString(namex, namey - dup*5, vflags, va("\x84S%d ", players[i].kartspeed)); V_DrawSmallString(namex + dup*10, namey - dup*5, vflags, va("\x87W%d ", players[i].kartweight)); @@ -9770,10 +9770,8 @@ static void K_drawNameTags(void) if (cv_nametagscore.value) { - if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2) - V_DrawSmallString(namex, namey - dup*10, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score)); - else - V_DrawSmallString(namex, namey - dup*5, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score)); + INT32 yofs = usenametagrestat ? 10 : 5; + V_DrawSmallString(namex, namey - dup*yofs, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score)); } } else @@ -9798,16 +9796,17 @@ static void K_drawNameTags(void) } else { - for (j = 0; j < 4; j++) + for (j = 0; j < 4; j++) { namey -= dup*4; V_DrawFill(namex, namey, dup*3, dup*4, 31 | vflags); V_DrawFill(namex+dup, namey, dup, dup*4, tagcolor | vflags); namex += dup; } - V_DrawFill(namex, namey, dup, dup, 31 | vflags); - V_DrawFill(namex+dup, namey, tagwidth - dup*2, dup*3, 31 | vflags); - V_DrawFill(namex+dup, namey+dup, tagwidth - dup*3, dup, tagcolor | vflags); + + V_DrawFill(namex, namey, dup, dup, 31 | vflags); + V_DrawFill(namex+dup, namey, tagwidth - dup*2, dup*3, 31 | vflags); + V_DrawFill(namex+dup, namey+dup, tagwidth - dup*3, dup, tagcolor | vflags); } if (cv_nametagfacerank.value) @@ -9818,7 +9817,7 @@ static void K_drawNameTags(void) V_DrawThinString(namex, namey - dup*10, V_ALLOWLOWERCASE | vflags, tag); - if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2) + if (usenametagrestat) { V_DrawScaledPatch(namex, namey - dup*20, vflags, nametagspeed); V_DrawScaledPatch(namex + dup*18, namey - dup*20, vflags, nametagweight); @@ -9828,10 +9827,8 @@ static void K_drawNameTags(void) if (cv_nametagscore.value) { - if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2) - V_DrawSmallString(namex, namey - dup*25, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score)); - else - V_DrawSmallString(namex, namey - dup*15, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score)); + INT32 yofs = usenametagrestat ? 25 : 15; + V_DrawSmallString(namex, namey - dup*yofs, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score)); } } } @@ -9842,23 +9839,23 @@ static void K_drawDriftGauge(void) { vector2_t pos = {0}; fixed_t basex, basey; - const INT32 hudtransflag = V_LocalTransFlag(); const int dup = vid.dupx; int i; + UINT8 *cmap; - UINT8 driftcolors[3][4] = { + static UINT8 driftcolors[3][4] = { {0, 0, 10, 16}, // no drift {215, 215, 204, 253}, // blue {125, 125, 151, 159} // red }; - UINT8 driftskins[3] = { + static UINT8 driftskins[3] = { SKINCOLOR_NONE, SKINCOLOR_TEAL, SKINCOLOR_SALMON, }; - UINT8 driftrainbow[18] = { + static UINT8 driftrainbow[18] = { 0, 31, 47, 63, 79, 95, 111, 119, 127, 143, 159, 175, 183, 191, 199, 207, 223, 247 }; @@ -9879,17 +9876,17 @@ skipcrap: if (!K_GetScreenCoords(&pos, stplyr, stplyr->mo, FixedMul(cv_driftgaugeofs.value, cv_driftgaugeofs.value > 0 ? stplyr->mo->scale : mapobjectscale), false)) return; - const INT32 driftval = K_GetKartDriftSparkValue(stplyr); - const INT32 driftcharge = min(driftval*4, stplyr->kartstuff[k_driftcharge]); - - basex = pos.x>>FRACBITS; - basey = pos.y>>FRACBITS; - fixed_t barx; fixed_t bary; INT32 BAR_WIDTH; - const INT32 drifttrans = ((cv_driftgaugetrans.value) ? hudtransflag : 0); + const INT32 driftval = K_GetKartDriftSparkValue(stplyr); + const INT32 driftcharge = min(driftval*4, stplyr->kartstuff[k_driftcharge]); + const INT32 driftlevel = min(driftcharge / driftval, 2); + const INT32 drifttrans = ((cv_driftgaugetrans.value) ? V_LocalTransFlag() : 0); + + basex = pos.x>>FRACBITS; + basey = pos.y>>FRACBITS; switch (cv_driftgaugestyle.value) { @@ -9916,11 +9913,6 @@ skipcrap: bary = basey - dup*2; - UINT8 *cmap; - const INT32 limit = driftval * (driftcharge >= driftval*2 ? 2 : 1); - const INT32 width = ((driftcharge - (driftcharge >= driftval ? limit : 0)) * BAR_WIDTH) / limit; - const INT32 level = min(driftcharge / driftval, 2); - if (usescaledpatch) // i hate hud code i hate hud code i hate hud code i hate hud code i hate hud code..... { if (K_UseColorHud() && xtra_speedo_clr3) // Colourized hud @@ -9946,18 +9938,23 @@ skipcrap: if (driftcharge >= driftval*4) // rainbow sparks { cmap = R_GetTranslationColormap(TC_RAINBOW, 1 + leveltime % (MAXSKINCOLORS-1),GTC_CACHE); - for (i = 0; i < 4; i++) + + for (i = 0; i < 4; i++) V_DrawFill(barx, bary+dup*1+dup*i, BAR_WIDTH, dup, (driftrainbow[min((leveltime % 18) + 1, 18 - 1)] + i*2) | V_NOSCALESTART|drifttrans); } else // none/blue/red { - cmap = R_GetTranslationColormap(TC_RAINBOW, driftskins[level],GTC_CACHE); + const INT32 limit = (driftval * (driftcharge >= driftval*2 ? 2 : 1)); + const INT32 width = ((driftcharge - (driftcharge >= driftval ? limit : 0)) * BAR_WIDTH) / limit; + + cmap = R_GetTranslationColormap(TC_RAINBOW, driftskins[driftlevel],GTC_CACHE); + for (i = 0; i < 4; i++) { if (driftcharge >= driftval) - V_DrawFill(barx, bary+dup*1+dup*i, BAR_WIDTH, dup, driftcolors[level-1][i] | V_NOSCALESTART|drifttrans); + V_DrawFill(barx, bary+dup*1+dup*i, BAR_WIDTH, dup, driftcolors[driftlevel-1][i] | V_NOSCALESTART|drifttrans); - V_DrawFill(barx, bary+dup*1+dup*i, width, dup, driftcolors[level][i] | V_NOSCALESTART|drifttrans); + V_DrawFill(barx, bary+dup*1+dup*i, width, dup, driftcolors[driftlevel][i] | V_NOSCALESTART|drifttrans); } } @@ -9971,12 +9968,10 @@ skipcrap: break; case 4: { - UINT8 *cmap; - const INT32 level = min(driftcharge / driftval, 2); + cmap = R_GetTranslationColormap(TC_RAINBOW, driftskins[driftlevel],GTC_CACHE); + if (driftcharge >= driftval*4) cmap = R_GetTranslationColormap(TC_RAINBOW, 1 + leveltime % (MAXSKINCOLORS-1),GTC_CACHE); - else - cmap = R_GetTranslationColormap(TC_RAINBOW, driftskins[level],GTC_CACHE); V_DrawPaddedTallColorNum(basex + (dup*16), basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftcharge*100 / driftval, 3, cmap); } @@ -9996,17 +9991,17 @@ static fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fix dist = abs(R_PointToDist2(px, py, mx, my)); if (dist > range) - return -320; + return -BASEVIDWIDTH; diff = R_PointToAngle2(px, py, mx, my) - ang; if (diff < ANGLE_90 || diff > ANGLE_270) - return -320; + return -BASEVIDWIDTH; else x = (FixedMul(FINETANGENT(((diff+ANGLE_90)>>ANGLETOFINESHIFT) & 4095), 160<>FRACBITS; if (encoremode) - x = 320-x; + x = BASEVIDWIDTH-x; if (splitscreen > 1) x /= 2; diff --git a/src/m_menu.c b/src/m_menu.c index b7063a65d..eb8b8bd33 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2566,10 +2566,8 @@ static menuitem_t OP_NametagMenu[] = {IT_STRING | IT_CVAR, NULL, "Nametag Transparency", &cv_nametagtrans, 70}, {IT_STRING | IT_CVAR, NULL, "Nametag Score", &cv_nametagscore, 80}, {IT_STRING | IT_CVAR, NULL, "Nametag Restat", &cv_nametagrestat, 90}, - {IT_STRING | IT_CVAR, NULL, "Nametag Hop", &cv_nametaghop, 100}, - {IT_STRING | IT_CVAR, NULL, "Small Nametags", &cv_smallnametags, 110}, - {IT_STRING | IT_CVAR, NULL, "Show Nametags after Race finish", &cv_shownametagfinish, 120}, - {IT_STRING | IT_CVAR, NULL, "Show Nametags in Spectator Mode", &cv_shownametagspectator, 130}, + {IT_STRING | IT_CVAR, NULL, "Small Nametags", &cv_smallnametags, 100}, + {IT_STRING | IT_CVAR, NULL, "Show Nametags while Spectating", &cv_shownametagspectator, 110}, //{IT_STRING | IT_CVAR, NULL, "Nametag Scaling", &cv_nametagscaling, 70} }; @@ -2584,9 +2582,7 @@ static const char* OP_NametagTooltips[] = "Transparency of nametags.", "Show player score in nametag.", "Show stats in nametags.", - "Enable Saltyhop support for nametags.", "Alternative smaller nametags.", - "Show Nametags after Race finish.", "Show Nametags when you are spectating.", }; @@ -2601,13 +2597,10 @@ enum nt_nttrans, nt_ntpscore, nt_ntrestat, - nt_nthop, nt_smol, - nt_finish, nt_spec, }; - static menuitem_t OP_DriftGaugeMenu[] = { {IT_HEADER, NULL, "Driftgauge", NULL, 0}, -- 2.54.0 From 02b411f7ee175a71e13f6d810430b20cabe345c0 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 29 Jan 2025 23:23:54 +0100 Subject: [PATCH 234/325] kill redundant laptime code just use the newer one --- src/d_player.h | 1 + src/doomstat.h | 1 - src/g_game.c | 2 -- src/p_setup.c | 6 +++++- src/p_spec.c | 8 ++------ src/p_user.c | 37 ++++++++++--------------------------- src/y_inter.c | 6 +++--- 7 files changed, 21 insertions(+), 40 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index b18fea1eb..d6702e2c0 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -351,6 +351,7 @@ typedef enum typedef enum { LAP_CUR, + LAP_BEST, LAP_LAST, LAP__MAX } laptime_e; diff --git a/src/doomstat.h b/src/doomstat.h index f70f97059..e68f1da89 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -482,7 +482,6 @@ extern boolean startedInFreePlay; extern boolean legitimateexit; extern boolean comebackshowninfo; -extern tic_t curlap, bestlap; extern INT16 votelevels[4][2]; extern SINT8 votes[MAXPLAYERS]; diff --git a/src/g_game.c b/src/g_game.c index 9618d2e50..52e13968d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -279,8 +279,6 @@ boolean startedInFreePlay; // Map was started in free play // Client-sided, unsynched variables (NEVER use in anything that needs to be synced with other players) boolean legitimateexit; // Did this client actually finish the match? boolean comebackshowninfo; // Have you already seen the "ATTACK OR PROTECT" message? -tic_t curlap; // Current lap time -tic_t bestlap; // Best lap time static INT16 randmapbuffer[NUMMAPS+1]; // Buffer for maps RandMap is allowed to roll tic_t hidetime; diff --git a/src/p_setup.c b/src/p_setup.c index 30e5a09f2..f4c34c17e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2116,7 +2116,11 @@ static void P_LevelInitStuff(boolean reloadinggamestate) players[i].lives = 1; // SRB2Kart players[i].realtime = racecountdown = exitcountdown = 0; - curlap = bestlap = 0; // SRB2Kart + + for (INT32 j = 0; j < LAP__MAX; j++) + { + players[i].laptime[j] = 0; + } players[i].gotcontinue = false; diff --git a/src/p_spec.c b/src/p_spec.c index 2e10770ac..55eb0671a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3912,17 +3912,13 @@ DoneSection2: CON_LogMessage(va(M_GetText("%s has finished the race.\n"), player_names[player-players])); // SRB2Kart: save best lap for record attack - if (player == &players[consoleplayer]) + if (player->laptime[LAP_CUR] < player->laptime[LAP_BEST] || player->laptime[LAP_BEST] == 0) { - if (curlap < bestlap || bestlap == 0) - bestlap = curlap; - curlap = 0; + player->laptime[LAP_BEST] = player->laptime[LAP_CUR]; } - // ONLY FOR HUD player->laptime[LAP_LAST] = player->laptime[LAP_CUR]; player->laptime[LAP_CUR] = 0; - // player->starposttime = player->realtime; player->starpostnum = 0; diff --git a/src/p_user.c b/src/p_user.c index 0d52fea00..a51a9507c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2927,24 +2927,15 @@ static void P_DeathThink(player_t *player) if (leveltime >= starttime) { player->realtime = leveltime - starttime; - if (player == &players[consoleplayer]) - { - if (player->spectator || !circuitmap) - curlap = 0; - else - curlap++; // This is too complicated to sync to realtime, just sorta hope for the best :V - } if (player->spectator) player->laptime[LAP_CUR] = 0; - else + else if (player->laptime[LAP_CUR] != UINT32_MAX) player->laptime[LAP_CUR]++; // This is too complicated to sync to realtime, just sorta hope for the best :V } else { player->realtime = 0; - if (player == &players[consoleplayer]) - curlap = 0; player->laptime[LAP_CUR] = 0; } @@ -4691,25 +4682,15 @@ void P_PlayerThink(player_t *player) if (leveltime >= starttime) { player->realtime = leveltime - starttime; - if (player == &players[consoleplayer]) - { - if (player->spectator || !circuitmap) - curlap = 0; - else - curlap++; // This is too complicated to sync to realtime, just sorta hope for the best :V - } if (player->spectator) player->laptime[LAP_CUR] = 0; - else + else if (player->laptime[LAP_CUR] != UINT32_MAX) player->laptime[LAP_CUR]++; // This is too complicated to sync to realtime, just sorta hope for the best :V } else { player->realtime = 0; - if (player == &players[consoleplayer]) - curlap = 0; - player->laptime[LAP_CUR] = 0; } } @@ -4821,21 +4802,23 @@ void P_PlayerThink(player_t *player) player->linkcount = 0; } - // Move around. - // Reactiontime is used to prevent movement - // for a bit after a teleport. if (player->mo->reactiontime) + { + // Reactiontime is used to prevent movement + // for a bit after a teleport. player->mo->reactiontime--; + } else if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT) { - { - P_DoZoomTube(player); - } + P_DoZoomTube(player); player->rmomx = player->rmomy = 0; // no actual momentum from your controls P_ResetScore(player); } else + { + // Move around. P_MovePlayer(player); + } if (!player->mo) { diff --git a/src/y_inter.c b/src/y_inter.c index 42fdb346f..994d44199 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -721,13 +721,13 @@ static void Y_UpdateRecordReplays(void) if ((mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < mainrecords[gamemap-1]->time)) mainrecords[gamemap-1]->time = players[consoleplayer].realtime; - if ((mainrecords[gamemap-1]->lap == 0) || (bestlap < mainrecords[gamemap-1]->lap)) - mainrecords[gamemap-1]->lap = bestlap; + if ((mainrecords[gamemap-1]->lap == 0) || (players[consoleplayer].laptime[LAP_BEST] < mainrecords[gamemap-1]->lap)) + mainrecords[gamemap-1]->lap = players[consoleplayer].laptime[LAP_BEST]; // Save demo! bestdemo[255] = '\0'; lastdemo[255] = '\0'; - G_SetDemoTime(players[consoleplayer].realtime, bestlap); + G_SetDemoTime(players[consoleplayer].realtime, players[consoleplayer].laptime[LAP_BEST]); G_CheckDemoStatus(); I_mkdir(va("%s"PATHSEP"replay", srb2home), 0755); -- 2.54.0 From ac8e25865e5fb8867f7f846d8740ca9d597afe39 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 29 Jan 2025 23:57:25 +0100 Subject: [PATCH 235/325] turn driftsparkGrowTimer into a player field less hacky and avoids 3 loops lol --- src/d_netcmd.c | 5 ----- src/d_netcmd.h | 2 -- src/d_player.h | 2 ++ src/k_kart.c | 41 ++++------------------------------------- src/p_setup.c | 2 ++ 5 files changed, 8 insertions(+), 44 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1496b9eb8..fdf913778 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2428,8 +2428,6 @@ static void Command_StopMovie_f(void) INT32 mapchangepending = 0; -tic_t driftsparkGrowTimer[MAXPLAYERS]; - /** Runs a map change. * The supplied data are assumed to be good. If provided by a user, they will * have already been checked in Command_Map_f(). @@ -2463,9 +2461,6 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pencoremode, boolean r CONS_Debug(DBG_GAMELOGIC, "Map change: mapnum=%d gametype=%d encoremode=%d resetplayers=%d delay=%d skipprecutscene=%d\n", mapnum, newgametype, pencoremode, resetplayers, delay, skipprecutscene); - // just gonna hack in a timer reset here... - memset(driftsparkGrowTimer, 0, sizeof(driftsparkGrowTimer)); - if (netgame || multiplayer) FLS = false; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 63839cf12..4ec6f43ba 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -295,8 +295,6 @@ typedef union { #pragma pack() #endif -extern tic_t driftsparkGrowTimer[16]; - // add game commands, needs cleanup void D_RegisterServerCommands(void); void D_RegisterClientCommands(void); diff --git a/src/d_player.h b/src/d_player.h index d6702e2c0..0991144fb 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -551,6 +551,8 @@ typedef struct player_s UINT8 splitscreenindex; + tic_t driftsparkGrowTimer; + fixed_t fovadd; // adjust FOV for hw rendering } player_t; diff --git a/src/k_kart.c b/src/k_kart.c index 7e3179772..6ef1ec594 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3242,7 +3242,6 @@ static void K_SpawnDriftSparks(player_t *player) for (i = 0; i < 2; i++) { - UINT8 pindex; fixed_t driftExtraScale = 0; newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); newy = player->mo->y + P_ReturnThrustY(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); @@ -3252,16 +3251,7 @@ static void K_SpawnDriftSparks(player_t *player) spark->angle = travelangle-(ANGLE_45/5)*player->kartstuff[k_drift]; // scale increase while driftspark level gained timer is running - - // hack to find the correct player number - for (pindex = 0; pindex < MAXPLAYERS; pindex++) - { - if (player == &players[pindex]) - { - driftExtraScale = FixedDiv(driftsparkGrowTimer[pindex], DRIFTSPARKGROWTICS); - break; - } - } + driftExtraScale = FixedDiv(player->driftsparkGrowTimer, DRIFTSPARKGROWTICS); spark->destscale = FixedMul(player->mo->scale, FRACUNIT + FixedMul(driftExtraScale, cv_driftsparkpulse.value)); P_SetScale(spark, FixedMul(player->mo->scale, FRACUNIT + FixedMul(driftExtraScale, cv_driftsparkpulse.value))); @@ -6041,7 +6031,6 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - // Incease/decrease the drift value to continue drifting in that direction if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) { @@ -6081,20 +6070,11 @@ static void K_KartDrift(player_t *player, boolean onground) || (player->kartstuff[k_driftcharge] < dstwo && player->kartstuff[k_driftcharge]+driftadditive >= dstwo) || (player->kartstuff[k_driftcharge] < dsthree && player->kartstuff[k_driftcharge]+driftadditive >= dsthree)) { - UINT8 pindex; //S_StartSound(player->mo, sfx_s3ka2); if (P_IsLocalPlayer(player)) // UGHGHGH... S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); // Ugh... - // hack to find the correct player number - for (pindex = 0; pindex < MAXPLAYERS; pindex++) - { - if (player == &players[pindex]) - { - driftsparkGrowTimer[pindex] = DRIFTSPARKGROWTICS; - break; - } - } + player->driftsparkGrowTimer = DRIFTSPARKGROWTICS; } @@ -6107,21 +6087,8 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - { - //im putting this in a block because i want the variables here, not at the top of the block - UINT8 pindex; - - // hack to find the correct player number - for (pindex = 0; pindex < MAXPLAYERS; pindex++) - { - if (player == &players[pindex]) - { - if (driftsparkGrowTimer[pindex]) - driftsparkGrowTimer[pindex]--; - break; - } - } - } + if (player->driftsparkGrowTimer) + player->driftsparkGrowTimer--; // Stop drifting if (player->kartstuff[k_spinouttimer] > 0 || player->speed < minspeed) diff --git a/src/p_setup.c b/src/p_setup.c index f4c34c17e..4503dad62 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2122,6 +2122,8 @@ static void P_LevelInitStuff(boolean reloadinggamestate) players[i].laptime[j] = 0; } + players[i].driftsparkGrowTimer = 0; + players[i].gotcontinue = false; players[i].xtralife = players[i].deadtimer = players[i].numboxes = players[i].totalring = players[i].laps = 0; -- 2.54.0 From 9f7aca5fe322ac4b377190e1f401c47911053f4f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 29 Jan 2025 23:57:42 +0100 Subject: [PATCH 236/325] lmao --- src/k_kart.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 6ef1ec594..716004380 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6095,12 +6095,6 @@ static void K_KartDrift(player_t *player, boolean onground) { player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; - - if (!player->sliproll) - { - player->sliproll = 0; - } - player->kartstuff[k_getsparks] = 0; } -- 2.54.0 From b5803e878741232efa0ad421edaddf3b53cc176f Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 30 Jan 2025 00:04:21 +0100 Subject: [PATCH 237/325] move this after the early returns save some time when drifting --- src/k_kart.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 716004380..209e6cf06 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5902,11 +5902,6 @@ static INT16 K_GetKartDriftValue(player_t *player, fixed_t countersteer) INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) { - fixed_t p_topspeed = K_GetKartSpeed(player, false); - fixed_t p_curspeed = min(player->speed, p_topspeed * 2); - fixed_t p_maxspeed = p_topspeed * 3; - fixed_t adjustangle = FixedDiv((p_maxspeed>>16) - (p_curspeed>>16), (p_maxspeed>>16) + player->kartweight); - if (player->spectator) return turnvalue; @@ -5925,6 +5920,11 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) return turnvalue; } + fixed_t p_topspeed = K_GetKartSpeed(player, false); + fixed_t p_curspeed = min(player->speed, p_topspeed * 2); + fixed_t p_maxspeed = p_topspeed * 3; + fixed_t adjustangle = FixedDiv((p_maxspeed>>16) - (p_curspeed>>16), (p_maxspeed>>16) + player->kartweight); + turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_sneakertimer] || player->kartstuff[k_growshrinktimer] > 0) -- 2.54.0 From fe42f1bd3edf52dc789afabf7a9d840db0b4abdd Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 4 Mar 2025 19:11:38 +0100 Subject: [PATCH 238/325] change syntax will stay uppercase to not conflict with some crap Zzz... --- src/doomdef.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 8751b6a86..d57cb53b8 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -530,9 +530,8 @@ UINT32 quickncasehash (const char *p, size_t n) #ifndef max // Double-Check with WATTCP-32's cdefs.h #define max(x, y) (((x) > (y)) ? (x) : (y)) #endif - #ifndef CLAMP -#define CLAMP(x, min_val, max_val) ((x) < (min_val) ? (min_val) : ((x) > (max_val) ? (max_val) : (x))) +#define CLAMP(x, y, z) ((x) < (y) ? (y) : ((x) > (z) ? (z) : (x))) #endif #ifndef M_PIl -- 2.54.0 From 84d3d0d89182c99b481801af3404628d2337297e Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:44:56 +0100 Subject: [PATCH 239/325] smol cleanup portal code again --- src/hardware/hw_main.c | 60 ++++++++++++------------------------------ src/hardware/hw_main.h | 30 ++++++++++----------- 2 files changed, 32 insertions(+), 58 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index f2056a2ad..69ef1b22d 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -822,9 +822,9 @@ static void HWR_DrawSegsSplats(FSurfaceInfo * pSurf) } #endif -FBITFIELD HWR_GetBlendModeFlag(INT32 ast) +FBITFIELD HWR_GetBlendModeFlag(INT32 style) { - switch (ast) + switch (style) { case AST_TRANSLUCENT: return PF_Translucent; @@ -839,8 +839,6 @@ FBITFIELD HWR_GetBlendModeFlag(INT32 ast) default: return PF_Masked; } - - return 0; } UINT8 HWR_GetTranstableAlpha(INT32 transtablenum) @@ -1190,7 +1188,7 @@ static inline boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf) // set alpha for transparent walls switch (gl_linedef->special) { - // Translucent + // Translucent linedef types case 102: case 121 ... 125: case 141 ... 145: @@ -2292,6 +2290,9 @@ static void HWR_AddLine(seg_t *line) gl_backsector = line->backsector; + if (!cv_glportals.value || !gl_maphasportals) + goto doaddline; + // do extra checks on the seg when rendering portals: // don't render segs that are behind the portal destination line if (portalclipline && @@ -2753,29 +2754,6 @@ static boolean HWR_DoCulling(line_t *cullheight, line_t *viewcullheight, float v return false; } -static inline void HWR_PortalSubsector(seg_t *line, subsector_t *sub, INT16 count) -{ - if (line) - { - //Hurdler: at this point validcount must be the same, but is not because - // gl_frontsector doesn't point anymore to sub->sector due to - // the call gl_frontsector = R_FakeFlat(...) - // if it's not done, the sprite is drawn more than once, - // what looks really bad with translucency or dynamic light, - // without talking about the overdraw of course. - sub->sector->validcount = validcount;/// \todo fix that in a better way - - while (count--) - { - if (!line->polyseg) // ignore segs that belong to polyobjects - HWR_AddLine(line); - line++; - } - } - - sub->validcount = validcount; -} - static FBITFIELD HWR_RippleBlend(sector_t *sector, ffloor_t *rover, boolean ceiling) { (void)sector; @@ -2835,8 +2813,7 @@ static void HWR_Subsector(size_t num) if (gl_portal_state == GLPORTAL_SEARCH) { - HWR_PortalSubsector(line, sub, count); - return; + goto doaddline; } floorcolormap = ceilingcolormap = gl_frontsector->extra_colormap; @@ -2929,8 +2906,7 @@ static void HWR_Subsector(size_t num) if (gl_frontsector->ffloors) { /// \todo fix light, xoffs, yoffs, extracolormap ? - for (rover = gl_frontsector->ffloors; - rover; rover = rover->next) + for (rover = gl_frontsector->ffloors; rover; rover = rover->next) { fixed_t bottomCullHeight, topCullHeight, centerHeight; @@ -3073,6 +3049,7 @@ static void HWR_Subsector(size_t num) } } +doaddline: // Hurdler: here interesting things are happening! // we have just drawn the floor and ceiling // we now draw the sprites first and then the walls @@ -3093,9 +3070,9 @@ static void HWR_Subsector(size_t num) while (count--) { - if (!line->polyseg) // ignore segs that belong to polyobjects - HWR_AddLine(line); - line++; + if (!line->polyseg) // ignore segs that belong to polyobjects + HWR_AddLine(line); + line++; } } @@ -5316,6 +5293,8 @@ void HWR_SetStencilState(int state, int level) GL_SetSpecialState(HWD_SET_PORTAL_MODE, state); } +typedef void (*bspfunc)(INT32 bspnum); + // Renders the current viewpoint, though takes portal arguments for recursive portals. void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *player, int stencil_level, boolean allow_portals) { @@ -5323,6 +5302,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl const boolean skybox = (skyboxmo[0] && cv_skybox.value); const boolean useportals = cv_glportals.value && gl_maphasportals && allow_portals; + bspfunc bspFunc = portalclipline ? HWR_RenderPortalBSPNode : HWR_RenderBSPNode; portallist.base = portallist.cap = NULL; @@ -5342,10 +5322,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl validcount++; // no actual rendering happens - if (portalclipline) - HWR_RenderPortalBSPNode((INT32)numnodes-1); - else - HWR_RenderBSPNode((INT32)numnodes-1); + bspFunc((INT32)numnodes-1); // for each found portal: // note: if necessary, could sort the portals here? @@ -5396,10 +5373,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl HWR_SetPortalState(GLPORTAL_INSIDE); // TURN IT OFF // Recursively "render" the BSP tree. - if (!portalclipline) - HWR_RenderBSPNode((INT32)numnodes-1); - else - HWR_RenderPortalBSPNode((INT32)numnodes-1); + bspFunc((INT32)numnodes-1); // woo we back HWR_SetPortalState(oldgl_portal_state); diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 4387a7723..333cd4cab 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -58,11 +58,11 @@ extern sector_t *gl_backsector; enum { - HWR_STENCIL_NORMAL, - HWR_STENCIL_BEGIN, - HWR_STENCIL_REVERSE, - HWR_STENCIL_DEPTH, - HWR_STENCIL_SKY + HWR_STENCIL_NORMAL, + HWR_STENCIL_BEGIN, + HWR_STENCIL_REVERSE, + HWR_STENCIL_DEPTH, + HWR_STENCIL_SKY }; // Performance stats @@ -128,7 +128,7 @@ FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf); // Get amount of memory used by gpu textures in bytes; FUNCINLINE static ATTRINLINE INT32 HWR_GetTextureUsed(void) { - return GL_GetTextureUsed(); + return GL_GetTextureUsed(); } // hw_main.c: Post-rendering @@ -136,32 +136,32 @@ void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum); FUNCINLINE static ATTRINLINE void HWR_StartScreenWipe(void) { - GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_START); + GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_START); } FUNCINLINE static ATTRINLINE void HWR_EndScreenWipe(void) { - GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_END); + GL_MakeScreenTexture(HWD_SCREENTEXTURE_WIPE_END); } FUNCINLINE static ATTRINLINE void HWR_DrawIntermissionBG(void) { - GL_DrawScreenTexture(HWD_SCREENTEXTURE_GENERIC1, NULL, 0); + GL_DrawScreenTexture(HWD_SCREENTEXTURE_GENERIC1, NULL, 0); } FUNCINLINE static ATTRINLINE void HWR_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize) { - GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize); + GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize); } FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void) { - GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2); + GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2); } FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader) { - GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader); + GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader); } // hw_main.c: Segs @@ -215,17 +215,17 @@ extern consvar_t cv_glflashpal; FUNCINLINE static ATTRINLINE boolean HWR_UseShader(void) { - return (cv_glshaders.value && gl_shadersavailable); + return (cv_glshaders.value && gl_shadersavailable); } FUNCINLINE static ATTRINLINE boolean HWR_ShouldUsePaletteRendering(void) { - return (cv_glpaletterendering.value && (pLocalPalette != NULL) && HWR_UseShader()); + return (cv_glpaletterendering.value && (pLocalPalette != NULL) && HWR_UseShader()); } FUNCINLINE static ATTRINLINE boolean HWR_PalRenderFlashpal(void) { - return (HWR_ShouldUsePaletteRendering() && cv_glflashpal.value); + return (HWR_ShouldUsePaletteRendering() && cv_glflashpal.value); } #endif -- 2.54.0 From c8a0a2bdaea2a48b59adc9732a7431cb07b982d5 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:46:30 +0100 Subject: [PATCH 240/325] dont need to pass the viewnumber around --- src/d_main.c | 2 +- src/hardware/hw_main.c | 20 ++++++++++++-------- src/hardware/hw_main.h | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 249edc75c..3041f9a57 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -509,7 +509,7 @@ static boolean D_Display(void) #ifdef HWRENDER if (rendermode == render_opengl) - HWR_RenderPlayerView(i, &players[displayplayers[i]]); + HWR_RenderPlayerView(); else #endif if (rendermode != render_none) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 69ef1b22d..bba811dc8 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5423,7 +5423,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *pl // ========================================================================== // Render the current frame. // ========================================================================== -static void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox) +static void HWR_RenderFrame(player_t *player, boolean skybox) { const float fpov = FixedToFloat(R_GetPlayerFov(player)); @@ -5431,12 +5431,12 @@ static void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox) gl_viewwindowx = gl_baseviewwindowx; gl_viewwindowy = gl_baseviewwindowy; - if ((splitscreen == 1 && viewnumber == 1) || (splitscreen > 1 && viewnumber > 1)) + if ((splitscreen == 1 && viewssnum == 1) || (splitscreen > 1 && viewssnum > 1)) { gl_viewwindowy += gl_viewheight; } - if (splitscreen > 1 && viewnumber & 1) + if (splitscreen > 1 && viewssnum & 1) { gl_viewwindowx += gl_viewwidth; } @@ -5503,15 +5503,19 @@ static void HWR_RollTransform(FTransform *tr, angle_t roll) { tr->rollangle = roll / (float)ANG1; tr->roll = true; + tr->rollx = 1.0f; + tr->rollz = 0.0f; } } -void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) +void HWR_RenderPlayerView(void) { + player_t * player = &players[displayplayers[viewssnum]]; + const boolean skybox = (skyboxmo[0] && cv_skybox.value); // True if there's a skybox object and skyboxes are on // Clear the color buffer, stops HOMs. Also seems to fix the skybox issue on Intel GPUs. - if (viewnumber == 0) // Only do it if it's the first screen being rendered + if (viewssnum == 0) // Only do it if it's the first screen being rendered { FRGBAFloat ClearColor; @@ -5528,7 +5532,7 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) GL_SetShaderInfo(HWD_SHADERINFO_LEVELTIME, (INT32)leveltime); // The water surface shader needs the leveltime. } - if (viewnumber > 3) + if (viewssnum > 3) return; // Render the skybox if there is one. @@ -5537,13 +5541,13 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) if (skybox) { R_SkyboxFrame(viewssnum); - HWR_RenderFrame(viewnumber, player, true); + HWR_RenderFrame(player, true); } PS_STOP_TIMING(ps_skyboxtime); R_SetupFrame(viewssnum, false); // This can stay false because it is only used to set viewsky in r_main.c, which isn't used here framecount++; // for timedemo - HWR_RenderFrame(viewnumber, player, false); + HWR_RenderFrame(player, false); } void HWR_LoadLevel(void) diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 333cd4cab..8263fa438 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -104,7 +104,7 @@ boolean HWR_Screenshot(const char *lbmname); void HWR_SetViewSize(void); void HWR_AddCommands(void); -void HWR_RenderPlayerView(INT32 viewnumber, player_t *player); +void HWR_RenderPlayerView(void); void HWR_RenderViewpoint(gl_portal_t *rootportal, const float fpov, player_t *player, int stencil_level, boolean allow_portals); void HWR_ClearSkyDome(void); -- 2.54.0 From b9c89b381be708111ba824ebcd38c0ce9709f2b6 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:47:12 +0100 Subject: [PATCH 241/325] nullcheck for realpatch --- src/hardware/hw_cache.c | 11 +++++++---- src/hardware/hw_clip.c | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index af06ecba6..f41547912 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -384,8 +384,11 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) { realpatch = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE); - HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch); - Z_ChangeTag(realpatch, PU_HWRCACHE_UNLOCKED); + if (realpatch != NULL) + { + HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch); + Z_ChangeTag(realpatch, PU_HWRCACHE_UNLOCKED); + } } //Hurdler: not efficient at all but I don't remember exactly how HWR_DrawPatchInCache works :( @@ -637,8 +640,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum) glMipmap->height = (UINT16)pflatsize; // the flat raw data needn't be converted with palettized textures - W_ReadLump(flatlumpnum, Z_Malloc(W_LumpLength(flatlumpnum), - PU_HWRCACHE, &glMipmap->data)); + W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data)); #ifdef GLENCORE flat = glMipmap->data; @@ -833,6 +835,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32 stepy = ((INT32)SHORT(fmheight)<= 180.0) return 0xffffffff; -- 2.54.0 From b3ce832753611d053995447586b249f2216dd360 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:47:59 +0100 Subject: [PATCH 242/325] check for shader cvar ealier --- src/hardware/hw_shaders.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/hardware/hw_shaders.c b/src/hardware/hw_shaders.c index 31ee2c066..b4041fcae 100644 --- a/src/hardware/hw_shaders.c +++ b/src/hardware/hw_shaders.c @@ -36,7 +36,7 @@ static struct { {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, // Model shader - {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, + {GLSL_MODEL_LIGHTING_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, // Water shader {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WATER_FRAGMENT_SHADER}, @@ -400,17 +400,18 @@ void HWR_CompileShaders(void) int HWR_GetShaderFromTarget(int shader_target) { - int custom_shader = gl_shadertargets[shader_target].custom_shader; - // use custom shader if following are true - // - custom shader exists - // - custom shader has been compiled successfully - // - custom shaders are enabled - // - custom shaders are allowed by the server - if (custom_shader != -1 && gl_shaders[custom_shader].compiled && - cv_glshaders.value == 1) - return custom_shader; - else - return gl_shadertargets[shader_target].base_shader; + if (cv_glshaders.value == 1) + { + int custom_shader = gl_shadertargets[shader_target].custom_shader; + // use custom shader if following are true + // - custom shader exists + // - custom shader has been compiled successfully + // - custom shaders are enabled + if (custom_shader != -1 && gl_shaders[custom_shader].compiled) + return custom_shader; + } + + return gl_shadertargets[shader_target].base_shader; } static inline UINT16 HWR_FindShaderDefs(UINT16 wadnum) -- 2.54.0 From 64dd17d75dfcca0cdcda4d347f3d2b13e8021225 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:48:25 +0100 Subject: [PATCH 243/325] ensure proper casting --- src/i_time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i_time.c b/src/i_time.c index a1ef580bd..931696379 100644 --- a/src/i_time.c +++ b/src/i_time.c @@ -61,7 +61,7 @@ void I_UpdateTime(fixed_t timescale) ticratescaled = (double)TICRATE * FIXED_TO_FLOAT(timescale); enterprecise = I_GetPreciseTime(); - elapsedseconds = (double)(enterprecise - oldenterprecise) / I_GetPrecisePrecision(); + elapsedseconds = (double)((INT64)enterprecise - oldenterprecise) / I_GetPrecisePrecision(); tictimer += elapsedseconds; while (tictimer > 1.0/ticratescaled) { -- 2.54.0 From f693ca8333bd01ef4492dd616055d8a4fc4724e7 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 8 Feb 2025 23:17:43 +0100 Subject: [PATCH 244/325] optimize ogl drawer functions by avoiding excessive interger to float conversions --- src/hardware/hw_draw.c | 146 +++++++++++++++++++++++------------------ 1 file changed, 82 insertions(+), 64 deletions(-) diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index a0f413f3d..a5d3a1c1a 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -62,6 +62,9 @@ static UINT8 softwaretranstogl[11] = { 0, 25, 51, 76,102,127,153,178,204,229 static UINT8 softwaretranstogl_hi[11] = { 0, 51,102,153,204,255,255,255,255,255,255}; static UINT8 softwaretranstogl_lo[11] = { 0, 12, 24, 36, 48, 60, 71, 83, 95,111,127}; +static const float FLOATBASEVIDWIDTH = (float)BASEVIDWIDTH; +static const float FLOATBASEVIDHEIGHT = (float)BASEVIDHEIGHT; + // // -----------------+ // HWR_DrawPatch : Draw a 'tile' graphic @@ -144,6 +147,9 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t if (alphalevel >= 10 && alphalevel < 13) return; + const float fvw = (float)vid.width; + const float fvh = (float)vid.height; + // make patch ready in hardware cache if (!colormap) HWR_GetPatch(gpatch); @@ -227,21 +233,21 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t Z_Free(realpatch); } // centre screen - if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) + if (fabsf(fvw - FLOATBASEVIDWIDTH * dupx) > 1.0E-36f) { if (option & V_SNAPTORIGHT) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); + cx += (fvw - (FLOATBASEVIDWIDTH * dupx)); else if (!(option & V_SNAPTOLEFT)) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; + cx += (fvw - (FLOATBASEVIDWIDTH * dupx))/2; } - if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) + if (fabsf(fvh - FLOATBASEVIDHEIGHT * dupy) > 1.0E-36f) { if ((option & (V_SPLITSCREEN|V_SNAPTOTOP)) == (V_SPLITSCREEN|V_SNAPTOTOP)) - cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy)); + cy += (fvh/2 - (FLOATBASEVIDHEIGHT/2 * dupy)); else if (option & V_SNAPTOBOTTOM) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); + cy += (fvh - (FLOATBASEVIDHEIGHT * dupy)); else if (!(option & V_SNAPTOTOP)) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; + cy += (fvh - (FLOATBASEVIDHEIGHT * dupy))/2; } } } @@ -258,12 +264,12 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t } // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 - cx = -1 + (cx / (vid.width/2)); - cy = 1 - (cy / (vid.height/2)); + cx = -1.0f + (cx / (vid.width / 2.0f)); + cy = 1.0f - (cy / (vid.height / 2.0f)); // fwidth and fheight are similar - fwidth /= vid.width / 2; - fheight /= vid.height / 2; + fwidth /= fvw / 2; + fheight /= fvh / 2; // set the polygon vertices to the right positions v[0].x = v[3].x = cx; @@ -335,6 +341,9 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal if (alphalevel >= 10 && alphalevel < 13) return; + const float fvw = (float)vid.width; + const float fvh = (float)vid.height; + // make patch ready in hardware cache HWR_GetPatch(gpatch); @@ -385,21 +394,21 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal Z_Free(realpatch); } // centre screen - if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) + if (fabsf(fvw - FLOATBASEVIDWIDTH * dupx) > 1.0E-36f) { if (option & V_SNAPTORIGHT) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); + cx += (fvw - (FLOATBASEVIDWIDTH * dupx)); else if (!(option & V_SNAPTOLEFT)) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; + cx += (fvw - (FLOATBASEVIDWIDTH * dupx))/2; } - if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) + if (fabsf(fvh - FLOATBASEVIDHEIGHT * dupy) > 1.0E-36f) { if ((option & (V_SPLITSCREEN|V_SNAPTOTOP)) == (V_SPLITSCREEN|V_SNAPTOTOP)) - cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy)); + cy += (fvh/2 - (FLOATBASEVIDHEIGHT/2 * dupy)); else if (option & V_SNAPTOBOTTOM) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); + cy += (fvh - (FLOATBASEVIDHEIGHT * dupy)); else if (!(option & V_SNAPTOTOP)) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; + cy += (fvh - (FLOATBASEVIDHEIGHT * dupy))/2; } } } @@ -431,12 +440,12 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal } // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 - cx = -1 + (cx / (vid.width/2)); - cy = 1 - (cy / (vid.height/2)); + cx = -1.0f + (cx / (vid.width / 2.0f)); + cy = 1.0f - (cy / (vid.height / 2.0f)); // fwidth and fheight are similar - fwidth /= vid.width / 2; - fheight /= vid.height / 2; + fwidth /= fvw / 2; + fheight /= fvh / 2; // set the polygon vertices to the right positions v[0].x = v[3].x = cx; @@ -821,6 +830,9 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color) fy = (float)y; fw = fh = (float)wh; + const float fvw = (float)vid.width; + const float fvh = (float)vid.height; + if (!(color & V_NOSCALESTART)) { float dupx = (float)vid.dupx, dupy = (float)vid.dupy; @@ -830,20 +842,20 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color) fw *= dupx; fh *= dupy; - if (fabsf((float)vid.width - ((float)BASEVIDWIDTH * dupx)) > 1.0E-36f) + if (fabsf(fvw - (FLOATBASEVIDWIDTH * dupx)) > 1.0E-36f) { if (color & V_SNAPTORIGHT) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); + fx += (fvw - (FLOATBASEVIDWIDTH * dupx)); else if (!(color & V_SNAPTOLEFT)) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; + fx += (fvw - (FLOATBASEVIDWIDTH * dupx)) / 2; } - if (fabsf((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) > 1.0E-36f) + if (fabsf(fvh - (FLOATBASEVIDHEIGHT * dupy)) > 1.0E-36f) { // same thing here if (color & V_SNAPTOBOTTOM) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); + fy += (fvh - (FLOATBASEVIDHEIGHT * dupy)); else if (!(color & V_SNAPTOTOP)) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; + fy += (fvh - (FLOATBASEVIDHEIGHT * dupy)) / 2; } } @@ -864,16 +876,16 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color) return; if (fx + fw > vid.width) { - fwait = fw - ((float)vid.width - fx); - fw = (float)vid.width - fx; + fwait = fw - (fvw- fx); + fw = fvw - fx; } if (fy + fh > vid.height) - fh = (float)vid.height - fy; + fh = fvh - fy; - fx = -1 + fx / (vid.width / 2); - fy = 1 - fy / (vid.height / 2); - fw = fw / (vid.width / 2); - fh = fh / (vid.height / 2); + fx = -1.0f + fx / (vid.width / 2.0f); + fy = 1.0f - fy / (vid.height / 2.0f); + fw = fw / (fvw / 2); + fh = fh / (fvh / 2); v[0].x = v[3].x = fx; v[2].x = v[1].x = fx + fw; @@ -917,6 +929,9 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 fw = (float)w; fh = (float)h; + const float fvw = (float)vid.width; + const float fvh = (float)vid.height; + if (!(options & V_NOSCALESTART)) { float dupx = (float)vid.dupx, dupy = (float)vid.dupy; @@ -938,25 +953,25 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 fw *= dupx; fh *= dupy; - if (fabsf((float)vid.width - ((float)BASEVIDWIDTH * dupx)) > 1.0E-36f) + if (fabsf(fvw - (FLOATBASEVIDWIDTH * dupx)) > 1.0E-36f) { if (options & V_SNAPTORIGHT) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); + fx += (fvw - (FLOATBASEVIDWIDTH * dupx)); else if (!(options & V_SNAPTOLEFT)) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; + fx += (fvw - (FLOATBASEVIDWIDTH * dupx)) / 2; } - if (fabsf((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) > 1.0E-36f) + if (fabsf(fvh - (FLOATBASEVIDHEIGHT * dupy)) > 1.0E-36f) { // same thing here if (options & V_SNAPTOBOTTOM) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); + fy += (fvh - (FLOATBASEVIDHEIGHT * dupy)); else if (!(options & V_SNAPTOTOP)) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; + fy += (fvh - (FLOATBASEVIDHEIGHT * dupy)) / 2; } if (options & V_SPLITSCREEN) - fy += ((float)BASEVIDHEIGHT * dupy)/2; + fy += (FLOATBASEVIDHEIGHT * dupy)/2; if (options & V_HORZSCREEN) - fx += ((float)BASEVIDWIDTH * dupx)/2; + fx += (FLOATBASEVIDWIDTH * dupx)/2; } @@ -976,14 +991,14 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 if (fw <= 0 || fh <= 0) return; if (fx + fw > vid.width) - fw = (float)vid.width - fx; + fw = fvw - fx; if (fy + fh > vid.height) - fh = (float)vid.height - fy; + fh = fvh - fy; - fx = -1 + fx / (vid.width / 2); - fy = 1 - fy / (vid.height / 2); - fw = fw / (vid.width / 2); - fh = fh / (vid.height / 2); + fx = -1.0f + fx / (vid.width / 2.0f); + fy = 1.0f - fy / (vid.height / 2.0f); + fw = fw / (fvw / 2); + fh = fh / (fvh / 2); v[0].x = v[3].x = fx; v[2].x = v[1].x = fx + fw; @@ -1028,6 +1043,9 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) fw = (float)w; fh = (float)h; + const float fvw = (float)vid.width; + const float fvh = (float)vid.height; + if (!(color & V_NOSCALESTART)) { float dupx = (float)vid.dupx, dupy = (float)vid.dupy; @@ -1049,25 +1067,25 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) fw *= dupx; fh *= dupy; - if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) + if (fabsf(fvw - FLOATBASEVIDWIDTH * dupx) > 1.0E-36f) { if (color & V_SNAPTORIGHT) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); + fx += (fvw - (FLOATBASEVIDWIDTH * dupx)); else if (!(color & V_SNAPTOLEFT)) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; + fx += (fvw - (FLOATBASEVIDWIDTH * dupx)) / 2; } - if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) + if (fabsf(fvh - FLOATBASEVIDHEIGHT * dupy) > 1.0E-36f) { // same thing here if (color & V_SNAPTOBOTTOM) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); + fy += (fvh - (FLOATBASEVIDHEIGHT * dupy)); else if (!(color & V_SNAPTOTOP)) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; + fy += (fvh - (FLOATBASEVIDHEIGHT * dupy)) / 2; } if (color & V_SPLITSCREEN) - fy += ((float)BASEVIDHEIGHT * dupy)/2; + fy += (FLOATBASEVIDHEIGHT * dupy)/2; if (color & V_HORZSCREEN) - fx += ((float)BASEVIDWIDTH * dupx)/2; + fx += (FLOATBASEVIDWIDTH * dupx)/2; } @@ -1087,14 +1105,14 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) if (fw <= 0 || fh <= 0) return; if (fx + fw > vid.width) - fw = (float)vid.width - fx; + fw = fvw - fx; if (fy + fh > vid.height) - fh = (float)vid.height - fy; + fh = fvh - fy; - fx = -1 + fx / (vid.width / 2); - fy = 1 - fy / (vid.height / 2); - fw = fw / (vid.width / 2); - fh = fh / (vid.height / 2); + fx = -1.0f + fx / (vid.width / 2.0f); + fy = 1.0f - fy / (vid.height / 2.0f); + fw = fw / (fvw / 2); + fh = fh / (fvh / 2); v[0].x = v[3].x = fx; v[2].x = v[1].x = fx + fw; @@ -1137,7 +1155,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) #define _FILE_OFFSET_BITS 0 #endif - #include "png.h" +#include "png.h" #ifdef PNG_WRITE_SUPPORTED #define USE_PNG // PNG is only used if write is supported (see ../m_misc.c) #endif -- 2.54.0 From 84028f52d82bd2a08c152c89fa3d1557d1b29f82 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 19 Feb 2025 11:10:27 +0100 Subject: [PATCH 245/325] few instances of int float conversions i forgor --- src/hardware/hw_draw.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index a5d3a1c1a..b6daad7b6 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -268,8 +268,8 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t cy = 1.0f - (cy / (vid.height / 2.0f)); // fwidth and fheight are similar - fwidth /= fvw / 2; - fheight /= fvh / 2; + fwidth /= fvw / 2.0f; + fheight /= fvh / 2.0f; // set the polygon vertices to the right positions v[0].x = v[3].x = cx; @@ -444,8 +444,8 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal cy = 1.0f - (cy / (vid.height / 2.0f)); // fwidth and fheight are similar - fwidth /= fvw / 2; - fheight /= fvh / 2; + fwidth /= fvw / 2.0f; + fheight /= fvh / 2.0f; // set the polygon vertices to the right positions v[0].x = v[3].x = cx; @@ -884,8 +884,8 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color) fx = -1.0f + fx / (vid.width / 2.0f); fy = 1.0f - fy / (vid.height / 2.0f); - fw = fw / (fvw / 2); - fh = fh / (fvh / 2); + fw = fw / (fvw / 2.0f); + fh = fh / (fvh / 2.0f); v[0].x = v[3].x = fx; v[2].x = v[1].x = fx + fw; @@ -997,8 +997,8 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 fx = -1.0f + fx / (vid.width / 2.0f); fy = 1.0f - fy / (vid.height / 2.0f); - fw = fw / (fvw / 2); - fh = fh / (fvh / 2); + fw = fw / (fvw / 2.0f); + fh = fh / (fvh / 2.0f); v[0].x = v[3].x = fx; v[2].x = v[1].x = fx + fw; @@ -1086,7 +1086,6 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) fy += (FLOATBASEVIDHEIGHT * dupy)/2; if (color & V_HORZSCREEN) fx += (FLOATBASEVIDWIDTH * dupx)/2; - } if (fx >= vid.width || fy >= vid.height) @@ -1111,8 +1110,8 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) fx = -1.0f + fx / (vid.width / 2.0f); fy = 1.0f - fy / (vid.height / 2.0f); - fw = fw / (fvw / 2); - fh = fh / (fvh / 2); + fw = fw / (fvw / 2.0f); + fh = fh / (fvh / 2.0f); v[0].x = v[3].x = fx; v[2].x = v[1].x = fx + fw; -- 2.54.0 From de977167ca7b60a066d4c3e1e41dd9de72db1502 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 3 Mar 2025 11:20:03 +0100 Subject: [PATCH 246/325] pointless inline --- src/hardware/r_opengl/r_opengl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 7dd36a838..60d6a4e7c 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -1148,7 +1148,7 @@ static void GL_Framebuffer_Delete(void) FramebufferObject = 0; } -inline void GL_Framebuffer_Unbind(void) +void GL_Framebuffer_Unbind(void) { if (!supportFBO || fboinit == false) return; @@ -1160,7 +1160,7 @@ inline void GL_Framebuffer_Unbind(void) pglBindRenderbuffer(GL_RENDERBUFFER, 0); } -inline void GL_Framebuffer_Enable(void) +void GL_Framebuffer_Enable(void) { if (!supportFBO || !UseScreenFBO()) return; -- 2.54.0 From 4f88a97739bf99fc28d20ae39ef7fd8b0c8a1b77 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 28 Jan 2025 18:10:10 +0100 Subject: [PATCH 247/325] inline a few hooklib functions --- src/lua_hooklib.c | 57 ++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 0a8ee9cae..3a4cf555e 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -64,7 +64,7 @@ static UINT8 * hooksErrored; static int errorRef; -static boolean mobj_hook_available(int hook_type, mobjtype_t mobj_type) +FUNCINLINE static ATTRINLINE boolean mobj_hook_available(int hook_type, mobjtype_t mobj_type) { return ( @@ -73,7 +73,7 @@ static boolean mobj_hook_available(int hook_type, mobjtype_t mobj_type) ); } -static unsigned hook_in_list +FUNCINLINE static ATTRINLINE unsigned hook_in_list ( const char * const name, const char * const * const list @@ -106,7 +106,7 @@ static void get_table(lua_State *L) lua_remove(L, -2); } -static void add_hook_to_table(lua_State *L, int n) +FUNCINLINE static ATTRINLINE void add_hook_to_table(lua_State *L, int n) { lua_pushnumber(L, nextid); lua_rawseti(L, -2, n); @@ -175,14 +175,14 @@ static void add_string_hook(lua_State *L, int type) add_hook_to_table(L, ++hook->numGeneric); } -static void add_hook(hook_t *map) +FUNCINLINE static ATTRINLINE void add_hook(hook_t *map) { Z_Realloc(map->ids, (map->numHooks + 1) * sizeof *map->ids, PU_STATIC, &map->ids); map->ids[map->numHooks++] = nextid; } -static void add_mobj_hook(lua_State *L, int hook_type) +FUNCINLINE static ATTRINLINE void add_mobj_hook(lua_State *L, int hook_type) { mobjtype_t mobj_type = luaL_optnumber(L, 3, MT_NULL); @@ -191,7 +191,7 @@ static void add_mobj_hook(lua_State *L, int hook_type) add_hook(&mobjHookIds[mobj_type][hook_type]); } -static void add_hud_hook(lua_State *L, int idx) +FUNCINLINE static ATTRINLINE void add_hud_hook(lua_State *L, int idx) { add_hook(&hudHookIds[luaL_checkoption(L, idx, "game", hudHookNames)]); @@ -263,7 +263,6 @@ int LUA_HookLib(lua_State *L) return 0; } - int lib_hudadd(lua_State *L);/* yeah compiler */ int lib_hudadd(lua_State *L) { @@ -297,24 +296,24 @@ enum { SINDEX = 2,/* string itself is pushed in case of string hook */ }; -static void push_error_handler(void) +FUNCINLINE static ATTRINLINE void push_error_handler(void) { lua_getref(gL, errorRef); } /* repush hook string */ -static void push_string(void) +FUNCINLINE static ATTRINLINE void push_string(void) { lua_pushvalue(gL, SINDEX); } -static boolean begin_hook_values(Hook_State *hook) +FUNCINLINE static ATTRINLINE boolean begin_hook_values(Hook_State *hook) { hook->top = lua_gettop(gL); return true; } -static void start_hook_stack(void) +FUNCINLINE static ATTRINLINE void start_hook_stack(void) { lua_settop(gL, 0); push_error_handler(); @@ -343,7 +342,7 @@ static boolean init_hook_type return false; } -static boolean prepare_hook +FUNCINLINE static ATTRINLINE boolean prepare_hook ( Hook_State * hook, int default_status, @@ -356,7 +355,7 @@ static boolean prepare_hook hookIds[hook_type].numHooks); } -static boolean prepare_mobj_hook +FUNCINLINE static ATTRINLINE boolean prepare_mobj_hook ( Hook_State * hook, int default_status, @@ -373,7 +372,7 @@ static boolean prepare_mobj_hook mobj_hook_available(hook_type, mobj_type)); } -static boolean prepare_string_hook +FUNCINLINE static ATTRINLINE boolean prepare_string_hook ( Hook_State * hook, int default_status, @@ -393,7 +392,7 @@ static boolean prepare_string_hook return false; } -static void init_hook_call +FUNCINLINE static ATTRINLINE void init_hook_call ( Hook_State * hook, int results, @@ -406,13 +405,13 @@ static void init_hook_call hook->results_handler = results_handler; } -static void get_hook(Hook_State *hook, const int *ids, int n) +FUNCINLINE static ATTRINLINE void get_hook(Hook_State *hook, const int *ids, int n) { hook->id = ids[n]; lua_getref(gL, hookRefs[hook->id]); } -static void get_hook_from_table(Hook_State *hook, int n) +FUNCINLINE static ATTRINLINE void get_hook_from_table(Hook_State *hook, int n) { lua_rawgeti(gL, -1, n); hook->id = lua_tonumber(gL, -1); @@ -444,7 +443,7 @@ static int call_single_hook_no_copy(Hook_State *hook) return 1; } -static int call_single_hook(Hook_State *hook) +FUNCINLINE static ATTRINLINE int call_single_hook(Hook_State *hook) { int i; @@ -454,7 +453,7 @@ static int call_single_hook(Hook_State *hook) return call_single_hook_no_copy(hook); } -static int call_hook_table_for(Hook_State *hook, int n) +FUNCINLINE static ATTRINLINE int call_hook_table_for(Hook_State *hook, int n) { int k; @@ -467,12 +466,12 @@ static int call_hook_table_for(Hook_State *hook, int n) return n; } -static int call_hook_table(Hook_State *hook) +FUNCINLINE static ATTRINLINE int call_hook_table(Hook_State *hook) { return call_hook_table_for(hook, lua_objlen(gL, -1)); } -static int call_mapped(Hook_State *hook, const hook_t *map) +FUNCINLINE static ATTRINLINE int call_mapped(Hook_State *hook, const hook_t *map) { int k; @@ -503,7 +502,7 @@ static int call_string_hooks(Hook_State *hook) return calls; } -static int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type) +FUNCINLINE static ATTRINLINE int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type) { return call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]); } @@ -546,7 +545,7 @@ static int call_hooks #define res_none NULL -static void res_true(Hook_State *hook) +FUNCINLINE static ATTRINLINE void res_true(Hook_State *hook) { if (lua_toboolean(gL, -1)) hook->status = true; @@ -558,7 +557,7 @@ static void res_true(Hook_State *hook) hook->status = false; }*/ -static void res_force(Hook_State *hook) +FUNCINLINE static ATTRINLINE void res_force(Hook_State *hook) { if (!lua_isnil(gL, -1)) { @@ -569,7 +568,7 @@ static void res_force(Hook_State *hook) } } -static void res_hud(Hook_State *hook) +FUNCINLINE static ATTRINLINE void res_hud(Hook_State *hook) { (void)hook; @@ -700,6 +699,8 @@ static void hook_think_frame(int type) const hook_t * map = &hookIds[type]; int k; + const boolean perfstats = (cv_perfstats.value >= 3); + if (prepare_hook(&hook, 0, type)) { init_hook_call(&hook, 0, res_none); @@ -708,7 +709,7 @@ static void hook_think_frame(int type) { get_hook(&hook, map->ids, k); - if (cv_perfstats.value >= 3) + if (perfstats) { lua_pushvalue(gL, -1);/* need the function again */ time_taken = I_GetPreciseTime(); @@ -716,7 +717,7 @@ static void hook_think_frame(int type) call_single_hook(&hook); - if (cv_perfstats.value >= 3) + if (perfstats) { lua_Debug ar; time_taken = I_GetPreciseTime() - time_taken; @@ -808,7 +809,7 @@ typedef struct { ticcmd_t * cmd; } BotAI_State; -static boolean checkbotkey(const char *field) +FUNCINLINE static ATTRINLINE boolean checkbotkey(const char *field) { return lua_toboolean(gL, -1) && strcmp(lua_tostring(gL, -2), field) == 0; } -- 2.54.0 From 390e3db25d0287b7fcb86231871c0f7813520ff9 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:55:16 +0100 Subject: [PATCH 248/325] tiny cleanup keyboard stuff --- src/sdl/i_video.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index ec9ec68b0..3f5f07d94 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -417,13 +417,15 @@ static INT32 Impl_SDL_Scancode_To_Keycode(SDL_Scancode code) } // Get the equivalent ASCII (Unicode?) character for a keypress. -static INT32 GetTypedChar(SDL_Scancode code, SDL_Keysym *sym) +static INT32 GetTypedChar(SDL_Keysym keysym) { SDL_Event next_event; - boolean Text_Input_Only = (chat_on || CON_Ready() || (menu_text_input && menuactive)); //only use this this if on chat or console or the current menu wants inputs from us (except if its the control setup menu ig) + SDL_Keycode keycode = keysym.sym; + SDL_Scancode scancode = keysym.scancode; + const boolean Text_Input_Only = (chat_on || CON_Ready() || (menu_text_input && menuactive)); // only use this this if on chat or console or the current menu wants inputs from us (except if its the control setup menu ig) // Special cases, where we always return a fixed value. - switch (sym->sym) + switch (keycode) { case SDLK_BACKSPACE: return KEY_BACKSPACE; case SDLK_RETURN: return KEY_ENTER; @@ -440,13 +442,13 @@ static INT32 GetTypedChar(SDL_Scancode code, SDL_Keysym *sym) } } - return Impl_SDL_Scancode_To_Keycode(code); //fallback + return Impl_SDL_Scancode_To_Keycode(scancode); // fallback } static INT32 Impl_SDL_Keysym_To_Keycode(SDL_Keysym keysym) { - SDL_Keycode keycode= keysym.sym; - SDL_Scancode scancode= keysym.scancode; + SDL_Keycode keycode = keysym.sym; + SDL_Scancode scancode = keysym.scancode; if (keycode >= SDLK_a && keycode <= SDLK_z) { @@ -457,15 +459,14 @@ static INT32 Impl_SDL_Keysym_To_Keycode(SDL_Keysym keysym) { return KEY_F1 + (keycode - SDLK_F1); } - if(scancode == SDL_SCANCODE_APOSTROPHE) + + switch (scancode) { - return KEY_FR_U_GRAVE; - } - switch(scancode){ case SDL_SCANCODE_APOSTROPHE: return KEY_FR_U_GRAVE; case SDL_SCANCODE_LEFTBRACKET: return '^'; default: break; } + switch (keycode) { // F11 and F12 are separated from the rest of the function keys @@ -858,6 +859,7 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt) static void Impl_HandleKeyboardEvent(SDL_KeyboardEvent evt, Uint32 type) { event_t event; + if (type == SDL_KEYUP) { event.type = ev_keyup; @@ -871,12 +873,18 @@ static void Impl_HandleKeyboardEvent(SDL_KeyboardEvent evt, Uint32 type) return; } - if (cv_keyboardlayout.value == 2) - event.data1 = GetTypedChar(evt.keysym.scancode, &evt.keysym); - else if (cv_keyboardlayout.value == 3) - event.data1 = Impl_SDL_Keysym_To_Keycode(evt.keysym); - else - event.data1 = Impl_SDL_Scancode_To_Keycode(evt.keysym.scancode); + switch (cv_keyboardlayout.value) + { + case 2: // "native" + event.data1 = GetTypedChar(evt.keysym); + break; + case 3: // AZERTY + event.data1 = Impl_SDL_Keysym_To_Keycode(evt.keysym); + break; + default: + event.data1 = Impl_SDL_Scancode_To_Keycode(evt.keysym.scancode); + break; + } if (event.data1) D_PostEvent(&event); } -- 2.54.0 From a0af6f24611480dbb3fea9caa0d4282c05c65d3f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:57:55 +0100 Subject: [PATCH 249/325] remove unused stuff i_video --- src/sdl/i_video.c | 42 ++---------------------------------------- 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 3f5f07d94..740acf552 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -659,11 +659,6 @@ static void VID_Command_Mode_f (void) setmodeneeded = modenum+1; // request vid mode change } -static inline void SDLJoyRemap(event_t *event) -{ - (void)event; -} - static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which) { // -32768 to 32767 @@ -1109,6 +1104,7 @@ static void Impl_HandleControllerButtonEvent(SDL_ControllerButtonEvent evt, Uint event.data1 = KEY_4JOY1; } else return; + if (type == SDL_CONTROLLERBUTTONUP) { event.type = ev_keyup; @@ -1118,13 +1114,13 @@ static void Impl_HandleControllerButtonEvent(SDL_ControllerButtonEvent evt, Uint event.type = ev_keydown; } else return; + if (evt.button < JOYBUTTONS) { event.data1 += evt.button; } else return; - SDLJoyRemap(&event); if (event.type != ev_console) D_PostEvent(&event); } @@ -1432,37 +1428,6 @@ void I_UpdateNoBlit(void) exposevideo = SDL_FALSE; } -// I_SkipFrame -// -// Returns true if it thinks we can afford to skip this frame -// from PrBoom's src/SDL/i_video.c -static inline boolean I_SkipFrame(void) -{ -#if 1 - // While I fixed the FPS counter bugging out with this, - // I actually really like being able to pause and - // use perfstats to measure rendering performance - // without game logic changes. - return false; -#else - static boolean skip = false; - - skip = !skip; - - switch (gamestate) - { - case GS_LEVEL: - if (!paused) - return false; - /* FALLTHRU */ - case GS_WAITINGPLAYERS: - return skip; // Skip odd frames - default: - return false; - } -#endif -} - // // I_FinishUpdate // @@ -1475,9 +1440,6 @@ void I_FinishUpdate(void) SCR_CalculateFPS(); - if (I_SkipFrame()) - return; - if (st_overlay) { if (cv_ticrate.value) -- 2.54.0 From 1e21f6a378376fbc25afdfc8abac79ed82500978 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:59:03 +0100 Subject: [PATCH 250/325] only do mouse stuff if we wanna do mouse stuff --- src/sdl/i_video.c | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 740acf552..76d95a897 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -929,8 +929,6 @@ static void Impl_HandleMouseButtonEvent(SDL_MouseButtonEvent evt, Uint32 type) { event_t event; - SDL_memset(&event, 0, sizeof(event_t)); - // Ignore the event if the mouse is not actually focused on the window. // This can happen if you used the mouse to restore keyboard focus; // this apparently makes a mouse button down event but not a mouse button up event, @@ -942,6 +940,8 @@ static void Impl_HandleMouseButtonEvent(SDL_MouseButtonEvent evt, Uint32 type) /// \todo inputEvent.button.which if (USE_MOUSEINPUT) { + SDL_memset(&event, 0, sizeof(event_t)); + if (type == SDL_MOUSEBUTTONUP) { event.type = ev_keyup; @@ -972,26 +972,29 @@ static void Impl_HandleMouseWheelEvent(SDL_MouseWheelEvent evt) { event_t event; - SDL_memset(&event, 0, sizeof(event_t)); + if (USE_MOUSEINPUT) + { + SDL_memset(&event, 0, sizeof(event_t)); - if (evt.y > 0) - { - event.data1 = KEY_MOUSEWHEELUP; - event.type = ev_keydown; - } - if (evt.y < 0) - { - event.data1 = KEY_MOUSEWHEELDOWN; - event.type = ev_keydown; - } - if (evt.y == 0) - { - event.data1 = 0; - event.type = ev_keyup; - } - if (event.type == ev_keyup || event.type == ev_keydown) - { - D_PostEvent(&event); + if (evt.y > 0) + { + event.data1 = KEY_MOUSEWHEELUP; + event.type = ev_keydown; + } + if (evt.y < 0) + { + event.data1 = KEY_MOUSEWHEELDOWN; + event.type = ev_keydown; + } + if (evt.y == 0) + { + event.data1 = 0; + event.type = ev_keyup; + } + if (event.type == ev_keyup || event.type == ev_keydown) + { + D_PostEvent(&event); + } } } -- 2.54.0 From 8cce4f3ccfe8c89b312c5883f7498c8e9f631d51 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:59:18 +0100 Subject: [PATCH 251/325] whitespace lul --- src/sdl/ogl_sdl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c index 7f84adcea..f590d2a0f 100644 --- a/src/sdl/ogl_sdl.c +++ b/src/sdl/ogl_sdl.c @@ -44,6 +44,7 @@ #include "hwsym_sdl.h" #include "../m_argv.h" #include "../i_video.h" +#include "../f_finale.h" #include "../f_finale.h" @@ -289,8 +290,8 @@ void OglSdlFinishUpdate(boolean waitvbl) #if defined (__unix__) #ifdef USE_FBO_OGL - if (loaded_config == true) - xwaylandcrap = false; + if (loaded_config == true) + xwaylandcrap = false; #endif #endif } -- 2.54.0 From 55cd0fa08fd42435526a9f44788c059c3e91707e Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:59:34 +0100 Subject: [PATCH 252/325] ensure proper cast --- src/sdl/mixer_sound.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c index 8059a93df..647958653 100644 --- a/src/sdl/mixer_sound.c +++ b/src/sdl/mixer_sound.c @@ -619,7 +619,7 @@ Countstutter (int len) else bytes = ( music_bytes - music_stutter_bytes ); - I_SetSongPosition((int)( bytes/4/44100.0*1000 )); + I_SetSongPosition((int)( (float)bytes/4/44100.0*1000 )); } } } -- 2.54.0 From f4ed9b43cd25ab75cb9bd5eb0672bd17ce7efce0 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:06:57 +0100 Subject: [PATCH 253/325] refactor keepmusic again - puts all music stuff into a struct "music_t" - should hopefully fix numerous issues with keepmusic and skipintromusic - keepmusic can now "recover" from a few cases, like restarting the map from intermission --- src/dehacked.c | 14 +++- src/doomstat.h | 20 +++-- src/g_game.c | 15 +--- src/p_saveg.c | 2 +- src/s_sound.c | 219 +++++++++++++++++++++++++++++++------------------ src/s_sound.h | 3 +- 6 files changed, 172 insertions(+), 101 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index ee4b50684..b8d5f72a7 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9184,8 +9184,6 @@ int LUA_EnumLib(lua_State *L) PUSHGETTER(globalweather, u8); PUSHGETTER(levelskynum, i32); PUSHGETTER(globallevelskynum, i32); - PUSHGETTER(mapmusflags, u16); - PUSHGETTER(mapmusposition, u32); PUSHGETTER(gravity, fxp); PUSHGETTER(gamespeed, u8); PUSHGETTER(encoremode, bool); @@ -9200,9 +9198,19 @@ int LUA_EnumLib(lua_State *L) PUSHGETTER(racecountdown, u32); PUSHGETTER(exitcountdown, u32); + lua_pushcfunction(L, lua_glib_new_getter); + lua_pushliteral(L, "mapmusflags"); + lua_glib_push_u16_getter(L, &mapmusic.flags); + lua_call(L, 2, 0); + + lua_pushcfunction(L, lua_glib_new_getter); + lua_pushliteral(L, "mapmusposition"); + lua_glib_push_u32_getter(L, &mapmusic.position); + lua_call(L, 2, 0); + lua_pushcfunction(L, lua_glib_new_getter); lua_pushliteral(L, "mapmusname"); - lua_glib_push_str_getter(L, mapmusname); + lua_glib_push_str_getter(L, mapmusic.name); lua_call(L, 2, 0); lua_pushcfunction(L, lua_glib_new_getter); diff --git a/src/doomstat.h b/src/doomstat.h index e68f1da89..73e0b17b4 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -30,16 +30,26 @@ // ============================= // Selected by user. -extern INT16 gamemap; -extern char mapmusname[7]; -extern UINT16 mapmusflags; -extern UINT32 mapmusposition; -extern UINT32 mapmusresume; + +typedef struct +{ + char name[7]; // Music name, up to 6-character name + void *data; // Music lump + UINT16 flags; // Track and reset bit + boolean looping; // Is this music looping? + UINT32 position; // Position to jump to + UINT32 resume; // Saved Position when music was stopped + UINT32 fadeinms; // Fade in time in ms (used for queue) +} music_t; + +extern music_t mapmusic; + #define MUSIC_TRACKMASK 0x0FFF // ----************ #define MUSIC_RELOADRESET 0x8000 // *--------------- #define MUSIC_FORCERESET 0x4000 // -*-------------- // Use other bits if necessary. +extern INT16 gamemap; extern INT16 maptol; extern UINT8 globalweather; extern INT32 curWeather; diff --git a/src/g_game.c b/src/g_game.c index c218527a0..7b2b147df 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -84,10 +84,7 @@ static void G_DoStartVote(void); static void G_ResetDemoPlayback(char *pdemoname); -char mapmusname[7]; // Music name -UINT16 mapmusflags; // Track and reset bit -UINT32 mapmusposition; // Position to jump to -UINT32 mapmusresume; +music_t mapmusic; INT16 gamemap = 1; INT16 maptol; @@ -2260,13 +2257,9 @@ void G_PlayerReborn(INT32 player) if (p-players == consoleplayer) { - if (mapmusflags & MUSIC_RELOADRESET) + if (mapmusic.flags & MUSIC_RELOADRESET) { - strncpy(mapmusname, mapheaderinfo[gamemap-1]->musname, 7); - mapmusname[6] = 0; - mapmusflags = (mapheaderinfo[gamemap-1]->mustrack & MUSIC_TRACKMASK); - mapmusposition = mapheaderinfo[gamemap-1]->muspos; - mapmusresume = 0; + S_HandleReloadResetMusic(); songcredit = true; } } @@ -4024,7 +4017,7 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool globalweather = mapheaderinfo[gamemap-1]->weather; // Don't carry over custom music change to another map. - mapmusflags |= MUSIC_RELOADRESET; + mapmusic.flags |= MUSIC_RELOADRESET; automapactive = false; imcontinuing = false; diff --git a/src/p_saveg.c b/src/p_saveg.c index dc8dfd39b..3525f58e3 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3348,7 +3348,7 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool // tell the sound code to reset the music since we're skipping what // normally sets this flag if (!reloading) - mapmusflags |= MUSIC_RELOADRESET; + mapmusic.flags |= MUSIC_RELOADRESET; G_SetGamestate(READINT16(save->p)); diff --git a/src/s_sound.c b/src/s_sound.c index 7061eaea3..abd5afbd9 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -113,13 +113,15 @@ consvar_t cv_resume = {"resume", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0 consvar_t cv_fading = {"fading", "Off", CV_SAVE|CV_CALL, CV_OnOff, Bird_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_birdmusic = {"birdmusicstuff", "No", CV_SAVE|CV_CALL, CV_YesNo, Bird_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; - consvar_t cv_keepmusic = {"keepmusic", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skipintromusic = {"skipintromusic", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; //consvar_t cv_ignoremusicchanges = {"ignoremusicchanges", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; -boolean keepmusic = false; // keep the current music on map restart +boolean keepmapmusic = false; // keep the current music on map restart boolean skipintromus = false; // skip the intro fanfare +static boolean resumekeepmusic = false; +static music_t keepmusic; +static void S_SetKeepMusResume(void); #ifdef HAVE_OPENMPT openmpt_module *openmpt_mhandle = NULL; @@ -342,7 +344,7 @@ lumpnum_t S_GetSfxLumpNum(sfxinfo_t *sfx) if (sfxlump != LUMPERROR) return sfxlump; - strlcpy(namebuf, sfx->name, sizeof namebuf); + strlcpy(namebuf, sfx->name, sizeof(namebuf)); sfxlump = W_CheckNumForName(namebuf); if (sfxlump != LUMPERROR) @@ -1192,17 +1194,10 @@ const char *compat_special_music_slots[16] = }; #endif -static char music_name[7]; // up to 6-character name -static void *music_data; -static UINT16 music_flags; -static boolean music_looping; -static consvar_t *music_refade_cv; +static music_t music; +static music_t queue; -static char queue_name[7]; -static UINT16 queue_flags; -static boolean queue_looping; -static UINT32 queue_position; -static UINT32 queue_fadeinms; +static consvar_t *music_refade_cv; /// ------------------------ /// Music Definitions @@ -1474,7 +1469,7 @@ void S_ShowSpecifiedMusicCredit(const char *musname) // void S_ShowMusicCredit(void) { - S_ShowSpecifiedMusicCredit(music_name); + S_ShowSpecifiedMusicCredit(music.name); } musicdef_t **soundtestdefs = NULL; @@ -1553,7 +1548,7 @@ musictype_t S_MusicType(void) const char *S_MusicName(void) { - return music_name; + return music.name; } boolean S_MusicInfo(char *mname, UINT16 *mflags, boolean *looping) @@ -1561,10 +1556,10 @@ boolean S_MusicInfo(char *mname, UINT16 *mflags, boolean *looping) if (!I_SongPlaying()) return false; - strncpy(mname, music_name, 7); + strncpy(mname, music.name, 7); mname[6] = 0; - *mflags = music_flags; - *looping = music_looping; + *mflags = music.flags; + *looping = music.looping; return (boolean)mname[0]; } @@ -1654,9 +1649,9 @@ static boolean S_LoadMusic(const char *mname) if (I_LoadSong(mdata, W_LumpLength(mlumpnum))) { - strncpy(music_name, mname, 7); - music_name[6] = 0; - music_data = mdata; + strncpy(music.name, mname, 7); + music.name[6] = 0; + music.data = mdata; return true; } else @@ -1668,13 +1663,13 @@ static void S_UnloadMusic(void) I_UnloadSong(); #ifndef HAVE_SDL //SDL uses RWOPS - Z_ChangeTag(music_data, PU_CACHE); + Z_ChangeTag(music.data, PU_CACHE); #endif - music_data = NULL; + music.data = NULL; - music_name[0] = 0; - music_flags = 0; - music_looping = false; + music.name[0] = 0; + music.flags = 0; + music.looping = false; music_refade_cv = 0; } @@ -1703,21 +1698,21 @@ static boolean S_PlayMusic(boolean looping, UINT32 fadeinms) static void S_QueueMusic(const char *mmusic, UINT16 mflags, boolean looping, UINT32 position, UINT32 fadeinms) { - strncpy(queue_name, mmusic, 7); - queue_flags = mflags; - queue_looping = looping; - queue_position = position; - queue_fadeinms = fadeinms; + strncpy(queue.name, mmusic, 7); + queue.flags = mflags; + queue.looping = looping; + queue.position = position; + queue.fadeinms = fadeinms; } static void S_ClearQueue(void) { - queue_name[0] = queue_flags = queue_looping = queue_position = queue_fadeinms = 0; + queue.name[0] = queue.flags = queue.looping = queue.position = queue.fadeinms = 0; } static void S_ChangeMusicToQueue(void) { - S_ChangeMusicEx(queue_name, queue_flags, queue_looping, queue_position, 0, queue_fadeinms); + S_ChangeMusicEx(queue.name, queue.flags, queue.looping, queue.position, 0, queue.fadeinms); S_ClearQueue(); } @@ -1746,7 +1741,7 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 strncpy(newmusic, mmusic, 6); strncpy(checkmusic, mmusic, 6); - if (LUA_HookMusicChange(music_name, &hook_param)) + if (LUA_HookMusicChange(music.name, &hook_param)) return; // No Music (empty string) @@ -1761,12 +1756,12 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 if (prefadems && S_MusicPlaying()) // queue music change for after fade // allow even if the music is the same { - CONS_Debug(DBG_DETAILED, "Now fading out song %s\n", music_name); + CONS_Debug(DBG_DETAILED, "Now fading out song %s\n", music.name); S_QueueMusic(newmusic, mflags, looping, position, fadeinms); I_FadeSong(0, prefadems, S_ChangeMusicToQueue); return; } - else if (strnicmp(music_name, newmusic, 6) || (mflags & MUSIC_FORCERESET)) + else if (strnicmp(music.name, newmusic, 6) || (mflags & MUSIC_FORCERESET)) { CONS_Debug(DBG_DETAILED, "Now playing song %s\n", newmusic); @@ -1778,8 +1773,8 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32 return; } - music_flags = mflags; - music_looping = looping; + music.flags = mflags; + music.looping = looping; if (!S_PlayMusic(looping, fadeinms)) { @@ -1819,7 +1814,9 @@ void S_StopMusic(void) || demo.title) // SRB2Kart: Demos don't interrupt title screen music return; - mapmusresume = (cv_birdmusic.value && (strcasecmp(music_name, mapmusname) == 0)) ? I_GetSongPosition() : 0; + mapmusic.resume = (cv_birdmusic.value && (strcasecmp(music.name, mapmusic.name) == 0)) ? I_GetSongPosition() : 0; + + S_SetKeepMusResume(); if (I_SongPaused()) I_ResumeSong(); @@ -1946,9 +1943,13 @@ static const char *musicexception_list[] = { // check if the current music is smth we dont want to keep (vote music, etc) static boolean S_CheckMusicException(void) { + if (stricmp(music.name, mapmusic.name)) + return true; + + // in case somehow the mapmusic was replaced with smth we dont want to keep for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++) { - if (!stricmp(music_name, musicexception_list[i]) || !stricmp(checkmusic, musicexception_list[i])) + if (!stricmp(music.name, musicexception_list[i]) || !stricmp(checkmusic, musicexception_list[i])) { return true; } @@ -1959,28 +1960,94 @@ static boolean S_CheckMusicException(void) void S_ResetKeepAndSpecialMus(void) { - keepmusic = skipintromus = false; + keepmapmusic = skipintromus = false; +} + +// saves the current song position everytime a song stops +// so we can resume it in some cases +static void S_SetKeepMusResume(void) +{ + keepmusic.resume = 0; + + if (strcasecmp(music.name, mapmusic.name) == 0) + { + keepmusic.resume = I_GetSongPosition(); + } } // determine if we should keep the music on a map restart +// this gets called BEFORE the level gets loaded in G_DoLoadLevel void S_KeepMusic(void) { - static INT16 oldmap = 0; + static INT16 oldmap = -1; static boolean oldencore = false; - if (!cv_keepmusic.value || gamestate != GS_LEVEL || music_name[0] == 0) + keepmapmusic = resumekeepmusic = false; + + if (!cv_keepmusic.value) { - keepmusic = false; + return; } - else if (oldmap == gamemap && oldencore == encoremode) + + // copy over mapmusicname stuff into temporary var + memset(keepmusic.name, 0, sizeof(keepmusic.name)); + strlcpy(keepmusic.name, mapmusic.name, sizeof(keepmusic.name)); + keepmusic.name[6] = 0; + + if (oldmap == gamemap && oldencore == encoremode) { - keepmusic = !S_CheckMusicException(); + const boolean musicchanged = S_CheckMusicException(); + + resumekeepmusic = (musicchanged && keepmusic.resume); + keepmapmusic = (!musicchanged || resumekeepmusic); } oldencore = encoremode; oldmap = gamemap; } +// Sets up the map music in case it should be reloaded +// Special case for keep music +void S_HandleReloadResetMusic(void) +{ + if (!(mapmusic.flags & MUSIC_RELOADRESET)) + return; + + // replace mapmusic with our saved keepmusic stuff + if (keepmapmusic) + { + // this is horrible, but oh well + strlcpy(mapmusic.name, keepmusic.name, sizeof(mapmusic.name)); + } + else + { + strlcpy(mapmusic.name, mapheaderinfo[gamemap-1]->musname, sizeof(mapmusic.name)); + } + + mapmusic.name[6] = 0; + mapmusic.flags = (mapheaderinfo[gamemap-1]->mustrack & MUSIC_TRACKMASK); + mapmusic.position = mapheaderinfo[gamemap-1]->muspos; + mapmusic.resume = 0; +} + +static boolean S_SkipIntroMusic(void) +{ + boolean skip = cv_skipintromusic.value; + + if (!skip) + return false; + + char *maptitle = G_BuildMapTitle(gamemap); // Zzz... + + // check if menu music is playing, otherwise it may continue playing + if (!stricmp(music.name, "titles") || (maptitle && (!stricmp(maptitle, "Wandering Falls")))) // wandering balls changes its song when the race starts Zzz... + skip = false; + + Z_Free(maptitle); + + return skip; +} + // // Per level startup code. // Kills playing sounds at start of level, @@ -1988,40 +2055,29 @@ void S_KeepMusic(void) // void S_InitMapMusic(void) { - if (mapmusflags & MUSIC_RELOADRESET) - { - strncpy(mapmusname, mapheaderinfo[gamemap-1]->musname, 7); - mapmusname[6] = 0; - mapmusflags = (mapheaderinfo[gamemap-1]->mustrack & MUSIC_TRACKMASK); - mapmusposition = mapheaderinfo[gamemap-1]->muspos; - mapmusresume = 0; - } + S_HandleReloadResetMusic(); - if (keepmusic) + if (keepmapmusic) + { + // this is kinda silly, but we can use it to fade back into the map song at the saved point, should the current music be different from the map music + if (resumekeepmusic) + { + S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, keepmusic.resume, 0, 500); + } return; + } // Starting ambience should always be restarted // lug: but not when we keep the map music lol S_StopMusic(); - if (cv_skipintromusic.value) - { - char *maptitle = G_BuildMapTitle(gamemap); - // for some reason, occasionally the title screen music doesent seem to be reset in time, so skipping the intro may make it just continue playing it instead, weird.. - skipintromus = true; - if (!stricmp(music_name, "titles") || (maptitle && (!stricmp(maptitle, "Wandering Falls")))) // thanks diggle! - skipintromus = false; - - if (maptitle) - Z_Free(maptitle); - } + skipintromus = S_SkipIntroMusic(); if (skipintromus) return; if (leveltime < MUSICSTARTTIME) // SRB2Kart S_ChangeMusicInternal((encoremode ? "estart" : "kstart"), false); //S_StopMusic(); - //S_ChangeMusicEx((encoremode ? "estart" : "kstart"), 0, false, mapmusposition, 0, 0); } void S_StartMapMusic(void) @@ -2030,15 +2086,18 @@ void S_StartMapMusic(void) if (leveltime > MUSICSTARTTIME) return; - if (keepmusic) + if (keepmapmusic) + { return; + } if (skipintromus) { if (leveltime < starttime) - S_ChangeMusicEx(mapmusname, mapmusflags, true, mapmusposition, 0, 0); - if (leveltime == MUSICSTARTTIME) + S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, mapmusic.position, 0, 0); + else if (leveltime == MUSICSTARTTIME) S_ShowMusicCredit(); + return; } @@ -2048,7 +2107,7 @@ void S_StartMapMusic(void) S_StopMusic(); else if (leveltime == MUSICSTARTTIME) // Plays the music after the starting countdown. { - S_ChangeMusicEx(mapmusname, mapmusflags, true, mapmusposition, 0, 0); + S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, mapmusic.position, 0, 0); S_ShowMusicCredit(); } } @@ -2098,7 +2157,7 @@ static void Command_Tunes_f(void) if (!strcasecmp(tunearg, "-show")) { CONS_Printf(M_GetText("The current tune is: %s [track %d]\n"), - mapmusname, (mapmusflags & MUSIC_TRACKMASK)); + mapmusic.name, (mapmusic.flags & MUSIC_TRACKMASK)); return; } if (!strcasecmp(tunearg, "-none")) @@ -2126,19 +2185,19 @@ static void Command_Tunes_f(void) track = (UINT16)atoi(COM_Argv(2))-1; if (tunenum) - snprintf(mapmusname, 7, "%sM", G_BuildMapName(tunenum)); + snprintf(mapmusic.name, 7, "%sM", G_BuildMapName(tunenum)); else - strncpy(mapmusname, tunearg, 7); + strncpy(mapmusic.name, tunearg, 7); if (argc > 4) position = (UINT32)atoi(COM_Argv(4)); - mapmusname[6] = 0; - mapmusflags = (track & MUSIC_TRACKMASK); - mapmusposition = position; - mapmusresume = 0; + mapmusic.name[6] = 0; + mapmusic.flags = (track & MUSIC_TRACKMASK); + mapmusic.position = position; + mapmusic.resume = 0; - S_ChangeMusicEx(mapmusname, mapmusflags, true, mapmusposition, 0, 0); + S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, mapmusic.position, 0, 0); if (argc > 3) { @@ -2186,7 +2245,7 @@ static void Command_RestartMusic_f(void) //same as RestartAudio but only music g static void Command_ShowMusicCredit_f(void) { - const char *musname = music_name; + const char *musname = music.name; if (COM_Argc() > 1) { diff --git a/src/s_sound.h b/src/s_sound.h index a22e0aaeb..92e206e1b 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -71,7 +71,7 @@ extern consvar_t cv_birdmusic; extern consvar_t cv_keepmusic; extern consvar_t cv_skipintromusic; //extern consvar_t cv_ignoremusicchanges; -extern boolean keepmusic; +extern boolean keepmapmusic; extern boolean skipintromus; #define MUSICSTARTTIME (starttime + (TICRATE/2)) @@ -113,6 +113,7 @@ void S_ResetKeepAndSpecialMus(void); void S_InitMapMusic(void); void S_StartMapMusic(void); +void S_HandleReloadResetMusic(void); void S_KeepMusic(void); -- 2.54.0 From e3af2b0d5872cd9892ca95b7fcf432cc7cf48c8f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:08:06 +0100 Subject: [PATCH 254/325] better prints if a replay desynchs --- src/g_game.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 7b2b147df..a376071e6 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4590,18 +4590,23 @@ void G_ReadDemoExtraData(void) while (p != DW_END) { UINT32 rng; + UINT32 checkrng; switch (p) { case DW_RNG: rng = READUINT32(demobuf.p); - if (P_GetRandSeed() != rng) + checkrng = P_GetRandSeed(); + if (checkrng != rng) { - P_SetRandSeed(rng); - if (demosynced) - CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); + { + CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (RNG)!\n")); + CONS_Printf("expected rng %d got %d\n", rng, checkrng); + } demosynced = false; + + P_SetRandSeed(rng); } } @@ -5224,7 +5229,10 @@ void G_ConsGhostTic(INT32 playernum) if (mobj && mobj->health != health) // Wasn't damaged?! This is desync! Fix it! { if (demosynced) - CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); + { + CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (health)!\n")); + CONS_Printf("expected health %d got %d\n", health, mobj->health); + } demosynced = false; P_DamageMobj(mobj, players[0].mo, players[0].mo, 1); } @@ -5257,7 +5265,7 @@ void G_ConsGhostTic(INT32 playernum) if (ghostext[playernum].desyncframes >= 2) { if (demosynced) - CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); + CONS_Alert(CONS_WARNING, "Demo playback has desynced (player %s)!\n", player_names[playernum]); demosynced = false; P_UnsetThingPosition(testmo); @@ -5287,7 +5295,11 @@ void G_ConsGhostTic(INT32 playernum) ) { if (demosynced) - CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); + { + CONS_Alert(CONS_WARNING, "Demo playback has desynced (item/bumpers)!(player %s)!\n", player_names[playernum]); + CONS_Printf("expected item type %d got %d\n", ghostext[playernum].kartitem, players[playernum].kartstuff[k_itemtype]); + CONS_Printf("expected item amount %d got %d\n", ghostext[playernum].kartamount, players[playernum].kartstuff[k_itemamount]); + } demosynced = false; players[playernum].kartstuff[k_itemtype] = ghostext[playernum].kartitem; -- 2.54.0 From 4d7c223565d358e7bb0be52f814d4d6a3fee2995 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 29 Jan 2025 00:08:50 +0100 Subject: [PATCH 255/325] Have replay recording of "hits" use the reference count system https://git.srb2.org/KartKrew/RingRacers/-/commit/fa8bffabfc51ea1d7be86d833190bb7dcf494fca --- src/g_game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index a376071e6..127a4ad80 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4872,7 +4872,7 @@ void G_GhostAddHit(INT32 playernum, mobj_t *victim) ghostext[playernum].flags |= EZT_HIT; ghostext[playernum].hits++; ghostext[playernum].hitlist = Z_Realloc(ghostext[playernum].hitlist, ghostext[playernum].hits * sizeof(mobj_t *), PU_LEVEL, NULL); - ghostext[playernum].hitlist[ghostext[playernum].hits-1] = victim; + P_SetTarget(ghostext[playernum].hitlist + (ghostext[playernum].hits-1), victim); } void G_WriteAllGhostTics(void) @@ -5081,6 +5081,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) WRITEFIXED(demobuf.p,mo->y); WRITEFIXED(demobuf.p,mo->z); WRITEANGLE(demobuf.p,mo->angle); + P_SetTarget(ghostext[playernum].hitlist+i, NULL); } Z_Free(ghostext[playernum].hitlist); ghostext[playernum].hits = 0; -- 2.54.0 From 47d41e2c2abda2047f4f2a0ab10b97da0b290fa6 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 29 Jan 2025 19:33:57 +0100 Subject: [PATCH 256/325] refactor M_DrawSlider apparently fixes weird framerate issues with gamma slider also shows the values on sliders --- src/m_menu.c | 79 ++++++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index eb8b8bd33..774f8344e 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4971,53 +4971,60 @@ static void M_DrawSlider(INT32 x, INT32 y, const consvar_t *cv, boolean ontop) INT32 range; patch_t *p; - for (i = 0; cv->PossibleValue[i+1].strvalue; i++); - x = BASEVIDWIDTH - x - SLIDER_WIDTH; - if (ontop) - { - V_DrawCharacter(x - 16 - (skullAnimCounter/5), y, - '\x1C' | highlightflags, false); // left arrow - V_DrawCharacter(x+(SLIDER_RANGE*8) + 8 + (skullAnimCounter/5), y, - '\x1D' | highlightflags, false); // right arrow - } - - if ((range = atoi(cv->defaultvalue)) != cv->value) - { - range = ((range - cv->PossibleValue[0].value) * 100 / - (cv->PossibleValue[1].value - cv->PossibleValue[0].value)); - - if (range < 0) - range = 0; - if (range > 100) - range = 100; - - // draw the default - p = W_CachePatchName("M_SLIDEC", PU_CACHE); - V_DrawScaledPatch(x - 4 + (((SLIDER_RANGE)*8 + 4)*range)/100, y, 0, p); - } - - V_DrawScaledPatch(x - 8, y, 0, W_CachePatchName("M_SLIDEL", PU_CACHE)); + p = W_CachePatchName("M_SLIDEL", PU_CACHE); + V_DrawScaledPatch(x - 8, y, 0, p); p = W_CachePatchName("M_SLIDEM", PU_CACHE); for (i = 0; i < SLIDER_RANGE; i++) V_DrawScaledPatch (x+i*8, y, 0,p); p = W_CachePatchName("M_SLIDER", PU_CACHE); - V_DrawScaledPatch(x+SLIDER_RANGE*8, y, 0, p); - - range = ((cv->value - cv->PossibleValue[0].value) * 100 / - (cv->PossibleValue[1].value - cv->PossibleValue[0].value)); - - if (range < 0) - range = 0; - if (range > 100) - range = 100; + V_DrawScaledPatch(x+i*8, y, 0, p); // draw the slider cursor p = W_CachePatchName("M_SLIDEC", PU_CACHE); - V_DrawScaledPatch(x - 4 + (((SLIDER_RANGE)*8 + 4)*range)/100, y, 0, p); + + for (i = 0; cv->PossibleValue[i+1].strvalue; i++); + + if (cv->flags & CV_FLOAT) + range = (INT32)(atof(cv->defaultvalue)*FRACUNIT); + else + range = atoi(cv->defaultvalue); + + if (range != cv->value) + { + range = ((range - cv->PossibleValue[0].value) * 100 / + (cv->PossibleValue[i].value - cv->PossibleValue[0].value)); + + if (range < 0) + range = 0; + else if (range > 100) + range = 100; + + V_DrawMappedPatch(x - 4 + (((SLIDER_RANGE)*8 + 4)*range)/100, y, 0, p, yellowmap); + } + + range = ((cv->value - cv->PossibleValue[0].value) * 100 / + (cv->PossibleValue[i].value - cv->PossibleValue[0].value)); + + if (range < 0) + range = 0; + else if (range > 100) + range = 100; + + V_DrawMappedPatch(x - 4 + (((SLIDER_RANGE)*8 + 4)*range)/100, y, 0, p, yellowmap); + + if (ontop) + { + V_DrawCharacter(x - 16 - (skullAnimCounter/5), y, + '\x1C' | highlightflags, false); + V_DrawCharacter(x+(SLIDER_RANGE*8) + 8 + (skullAnimCounter/5), y, + '\x1D' | highlightflags, false); + V_DrawCenteredString(x + ((SLIDER_RANGE*8) + 8)/2, y, V_30TRANS, + (cv->flags & CV_FLOAT) ? va("%.2f", FIXED_TO_FLOAT(cv->value)) : va("%d", cv->value)); + } } // -- 2.54.0 From 178c942dc6d1a0c9cccfe8113c143cd65a01de3f Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 28 Jan 2025 17:33:44 +0100 Subject: [PATCH 257/325] pass slope to K_RollMobjBySlopes removing some code dupe in the process and allows some more flexability --- src/k_kart.c | 65 ++++------------------------------------------------ src/k_kart.h | 2 +- src/p_mobj.c | 2 +- 3 files changed, 7 insertions(+), 62 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 19a706af4..5cd754e09 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3487,63 +3487,7 @@ static void K_QuiteSaltyHop(player_t *p) } #define SLOPEROLL_DIV 3 -void K_RollMobjBySlopes(mobj_t* mo, boolean usedistance) -{ - if (P_MobjWasRemoved(mo)) - return; - - I_Assert(mo->subsector != NULL); - I_Assert(mo->subsector->sector != NULL); - - // lifted from hw_md2 - if (mo->standingslope) - { - angle_t an; - const boolean flip = (mo->eflags & MFE_VERTICALFLIP); - const fixed_t m_dist = usedistance ? R_PointToDist(mo->x, mo->y) : 0; - const fixed_t rolldist = cv_sloperolldist.value * mapobjectscale; - - fixed_t tempz = mo->standingslope->normal.z; - fixed_t tempy = mo->standingslope->normal.y; - fixed_t tempx = mo->standingslope->normal.x; - fixed_t tempangle = -(R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx)); - - // admittedly this is a very hacky way to do the pitch and roll easing - - // pitch - if (!usedistance || (m_dist <= (rolldist))) - { - an = (INT32)((angle_t)tempangle - mo->pitch_sprite) / SLOPEROLL_DIV; - - mo->pitch_sprite = an ? mo->pitch_sprite + an : (angle_t)tempangle; - } - else - mo->pitch_sprite = FixedAngle(0); - - mo->slopepitch = flip ? InvAngle(mo->pitch_sprite) : mo->pitch_sprite; - - // roll - tempangle = (R_PointToAngle2(0, 0, tempz, tempy)); - - if (!usedistance || (m_dist <= (rolldist))) - { - an = (INT32)((angle_t)tempangle - mo->roll_sprite) / SLOPEROLL_DIV; - - mo->roll_sprite = an ? mo->roll_sprite + an : (angle_t)tempangle; - } - else - mo->roll_sprite = FixedAngle(0); - - mo->sloperoll = flip ? InvAngle(mo->roll_sprite) : mo->roll_sprite; - } - else if (P_IsObjectOnGround(mo)) - { - mo->sloperoll = FixedAngle(0); - mo->slopepitch = FixedAngle(0); - } -} - -static void K_SetPitchRollFromSlope(mobj_t* mo, pslope_t *slope, boolean usedistance) +void K_RollMobjBySlopes(mobj_t* mo, pslope_t *slope) { if (P_MobjWasRemoved(mo)) return; @@ -3556,8 +3500,9 @@ static void K_SetPitchRollFromSlope(mobj_t* mo, pslope_t *slope, boolean usedist { angle_t an; const boolean flip = (mo->eflags & MFE_VERTICALFLIP); - const fixed_t m_dist = usedistance ? R_PointToDist(mo->x, mo->y) : 0; + const boolean usedistance = cv_sloperolldist.value && !splitscreen; const fixed_t rolldist = cv_sloperolldist.value * mapobjectscale; + const fixed_t m_dist = usedistance ? R_PointToDist(mo->x, mo->y) : 0; fixed_t tempz = slope->normal.z; fixed_t tempy = slope->normal.y; @@ -4845,7 +4790,7 @@ static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z } //mobj->standingslope = slope; - K_SetPitchRollFromSlope(mobj, slope, (cv_sloperolldist.value && !splitscreen)); + K_RollMobjBySlopes(mobj, slope); } // Move the hnext chain! @@ -6893,7 +6838,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (cv_sloperoll.value && !player->mo->salty_jump) // seeing a character rotate mid-hop looks really janky { - K_RollMobjBySlopes(player->mo, (cv_sloperolldist.value && !splitscreen)); + K_RollMobjBySlopes(player->mo, player->mo->standingslope); } else { diff --git a/src/k_kart.h b/src/k_kart.h index c491c3477..dde5e21af 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -60,7 +60,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor); void K_StealBumper(player_t *player, player_t *victim, boolean force); void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); void K_SpawnMineExplosion(mobj_t *source, UINT8 color); -void K_RollMobjBySlopes(mobj_t *mo, boolean usedistance); +void K_RollMobjBySlopes(mobj_t *mo, pslope_t *slope); void K_SpawnBoostTrail(player_t *player); void K_SpawnSparkleTrail(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent); diff --git a/src/p_mobj.c b/src/p_mobj.c index dccd9c86b..81f4ec4c2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6053,7 +6053,7 @@ void P_RollPitchMobj(mobj_t* mobj) return; } - K_RollMobjBySlopes(mobj, cv_sloperolldist.value && !splitscreen); + K_RollMobjBySlopes(mobj, mobj->standingslope); } angle_t P_MobjPitchAndRoll(mobj_t *mobj) -- 2.54.0 From 0c4661c2a7f6a459bf445e48970cf2c0dab46051 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:11:27 +0100 Subject: [PATCH 258/325] remove this --- src/d_clisrv.c | 5 ----- src/d_clisrv.h | 1 - 2 files changed, 6 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 8276b8a06..5758fceb2 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -540,11 +540,6 @@ void D_ResetTiccmds(void) D_Clearticcmd(textcmds[i]->tic); } -ticcmd_t *D_LocalTiccmd(UINT8 ss) -{ - return &localcmds[ss]; -} - // ----------------------------------------------------------------- // end of extra data function // ----------------------------------------------------------------- diff --git a/src/d_clisrv.h b/src/d_clisrv.h index d8a1acc22..fd3fcca0e 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -661,7 +661,6 @@ extern UINT8 playernode[MAXPLAYERS]; INT32 D_NumPlayers(void); void D_ResetTiccmds(void); -ticcmd_t *D_LocalTiccmd(UINT8 ss); tic_t GetLag(INT32 node); //UINT8 GetFreeXCmdSize(UINT8 playerid); -- 2.54.0 From 24387b50bd4eac413cfc8b8967d15c74a835cde1 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:12:22 +0100 Subject: [PATCH 259/325] missed this for keepmusic --- src/p_spec.c | 20 ++++++++++---------- src/p_user.c | 11 +++++------ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 55eb0671a..7ae71f61b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2080,7 +2080,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 413: // Change music - if (keepmusic && (leveltime <= MUSICSTARTTIME)) // why check for starttime? cause encore music Zzz... + if (keepmapmusic && (leveltime <= MUSICSTARTTIME)) // why check for starttime? cause encore music Zzz... return; //if (cv_ignoremusicchanges.value && (leveltime >= MUSICSTARTTIME) && !fromlapexec) // keep lap music intanct tho @@ -2128,19 +2128,19 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // Change the music and apply position/fade operations else { - strncpy(mapmusname, sides[line->sidenum[0]].text, 7); - mapmusname[6] = 0; + strncpy(mapmusic.name, sides[line->sidenum[0]].text, 7); + mapmusic.name[6] = 0; - mapmusflags = tracknum & MUSIC_TRACKMASK; + mapmusic.flags = tracknum & MUSIC_TRACKMASK; if (!(line->flags & ML_BLOCKMONSTERS)) - mapmusflags |= MUSIC_RELOADRESET; + mapmusic.flags |= MUSIC_RELOADRESET; if (line->flags & ML_BOUNCY) - mapmusflags |= MUSIC_FORCERESET; + mapmusic.flags |= MUSIC_FORCERESET; - mapmusposition = position; - mapmusresume = 0; + mapmusic.position = position; + mapmusic.resume = 0; - S_ChangeMusicEx(mapmusname, mapmusflags, !(line->flags & ML_EFFECT4), position, + S_ChangeMusicEx(mapmusic.name, mapmusic.flags, !(line->flags & ML_EFFECT4), position, !(line->flags & ML_EFFECT2) ? prefadems : 0, !(line->flags & ML_EFFECT2) ? postfadems : 0); @@ -2167,7 +2167,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT32 sfxnum; //dont play any funky sound intros that may interfere with the music - if (skipintromus && (leveltime < MUSICSTARTTIME)) + if ((skipintromus || keepmapmusic) && (leveltime < MUSICSTARTTIME)) return; sfxnum = sides[line->sidenum[0]].toptexture; //P_AproxDistance(line->dx, line->dy)>>FRACBITS; diff --git a/src/p_user.c b/src/p_user.c index a51a9507c..67784b3c4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -788,14 +788,14 @@ void P_RestoreMusic(player_t *player) if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value - 1)) S_SpeedMusic(1.2f); #endif - if (mapmusresume && cv_resume.value) // mapmusresume will be 0 anyways when birdmusic stuff is disabled - position = mapmusresume; + if (mapmusic.resume && cv_resume.value) // mapmusresume will be 0 anyways when birdmusic stuff is disabled + position = mapmusic.resume; else - position = mapmusposition; + position = mapmusic.position; - S_ChangeMusicEx(mapmusname, mapmusflags, true, position, 0, S_GetRestoreMusicFadeIn()); + S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, position, 0, S_GetRestoreMusicFadeIn()); S_ClearRestoreMusicFadeInCvar(); - mapmusresume = 0; + mapmusic.resume = 0; } } } @@ -2479,7 +2479,6 @@ static void P_MovePlayer(player_t *player) K_DriftDustHandling(player->mo); - // Crush test... if ((player->mo->ceilingz - player->mo->floorz < player->mo->height) && !(player->mo->flags & MF_NOCLIP)) -- 2.54.0 From 105b3f37eb07672f58bef800db0f2b888ab800a9 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 22:25:34 +0100 Subject: [PATCH 260/325] only recalc floorz for visible precip mobjs before it apparently recalced it a crapton for the crapton not visible precipmobjs, which even on vanilla maps led to noticable jitter --- src/p_floor.c | 28 +++---- src/p_local.h | 4 - src/p_map.c | 220 ------------------------------------------------- src/p_maputl.c | 7 -- src/p_mobj.c | 31 +------ src/r_defs.h | 14 ---- 6 files changed, 15 insertions(+), 289 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 2277de838..07d8a8f91 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -327,7 +327,7 @@ void T_MoveFloor(floormove_t *movefloor) movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); + movefloor->sector->moved = true; return; // not break, why did this work? Graue 04-03-2004 case bounceFloorCrush: // Graue 03-27-2004 if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) @@ -343,14 +343,14 @@ void T_MoveFloor(floormove_t *movefloor) movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); + movefloor->sector->moved = true; return; // not break, why did this work? Graue 04-03-2004 case crushFloorOnce: movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; movefloor->direction = -1; movefloor->sector->soundorg.z = movefloor->sector->floorheight; S_StartSound(&movefloor->sector->soundorg,sfx_pstop); - P_RecalcPrecipInSector(movefloor->sector); + movefloor->sector->moved = true; return; default: break; @@ -376,7 +376,7 @@ void T_MoveFloor(floormove_t *movefloor) movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); + movefloor->sector->moved = true; return; // not break, why did this work? Graue 04-03-2004 case bounceFloorCrush: // Graue 03-27-2004 if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) @@ -392,13 +392,13 @@ void T_MoveFloor(floormove_t *movefloor) movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); + movefloor->sector->moved = true; return; // not break, why did this work? Graue 04-03-2004 case crushFloorOnce: movefloor->sector->floordata = NULL; // Clear up the thinker so others can use it P_RemoveThinker(&movefloor->thinker); movefloor->sector->floorspeed = 0; - P_RecalcPrecipInSector(movefloor->sector); + movefloor->sector->moved = true; return; default: break; @@ -415,7 +415,7 @@ void T_MoveFloor(floormove_t *movefloor) else movefloor->sector->floorspeed = 0; - P_RecalcPrecipInSector(movefloor->sector); + movefloor->sector->moved = true; } // @@ -817,7 +817,6 @@ void T_BounceCheese(levelspecthink_t *bouncer) bouncer->sector->floorheight = bouncer->sector->ceilingheight - (halfheight*2); T_MovePlane(bouncer->sector, 0, bouncer->sector->ceilingheight, 0, 1, -1); // update things on ceiling T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor - P_RecalcPrecipInSector(actionsector); bouncer->sector->ceilingdata = NULL; bouncer->sector->floordata = NULL; bouncer->sector->floorspeed = 0; @@ -833,7 +832,6 @@ void T_BounceCheese(levelspecthink_t *bouncer) bouncer->sector->floorheight = floorheight; T_MovePlane(bouncer->sector, 0, bouncer->sector->ceilingheight, 0, 1, -1); // update things on ceiling T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor - P_RecalcPrecipInSector(actionsector); bouncer->sector->ceilingdata = NULL; bouncer->sector->floordata = NULL; bouncer->sector->floorspeed = 0; @@ -913,9 +911,6 @@ void T_BounceCheese(levelspecthink_t *bouncer) if (bouncer->distance > 0) bouncer->distance--; - - if (actionsector) - P_RecalcPrecipInSector(actionsector); } #undef speed #undef distance @@ -1102,7 +1097,6 @@ void T_StartCrumble(elevator_t *elevator) { sector = §ors[i]; sector->moved = true; - P_RecalcPrecipInSector(sector); } } @@ -1156,7 +1150,7 @@ void T_MarioBlock(levelspecthink_t *block) } for (i = -1; (i = P_FindSectorFromTag((INT16)block->vars[0], i)) >= 0 ;) - P_RecalcPrecipInSector(§ors[i]); + sectors[i].moved = true; #undef speed #undef direction @@ -1272,7 +1266,7 @@ void T_FloatSector(levelspecthink_t *floater) else if (floater->sector->crumblestate == 0 || floater->sector->crumblestate >= 3/* || floatanyway*/) EV_BounceSector(floater->sector, FRACUNIT, floater->sourceline); - P_RecalcPrecipInSector(actionsector); + actionsector->moved = true; } } @@ -1974,7 +1968,7 @@ void T_ThwompSector(levelspecthink_t *thwomp) thwomp->sector->floorspeed = 0; } - P_RecalcPrecipInSector(actionsector); + actionsector->moved = true; #undef speed #undef direction #undef distance @@ -2503,7 +2497,7 @@ void T_RaiseSector(levelspecthink_t *raise) raise->sector->floorspeed = raise->vars[3]*raise->vars[8]; for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->tag, i)) >= 0 ;) - P_RecalcPrecipInSector(§ors[i]); + sectors[i].moved = true; } void T_CameraScanner(elevator_t *elevator) diff --git a/src/p_local.h b/src/p_local.h index 6f61d9cd7..6043f794f 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -258,7 +258,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type); mobj_t *P_SpawnShadowMobj(mobj_t * caster); -void P_RecalcPrecipInSector(sector_t *sector); void P_PrecipitationEffects(void); void P_RemoveMobj(mobj_t *th); @@ -373,8 +372,6 @@ extern line_t *ceilingline; extern line_t *blockingline; extern msecnode_t *sector_list; -extern mprecipsecnode_t *precipsector_list; - void P_UnsetThingPosition(mobj_t *thing); void P_SetThingPosition(mobj_t *thing); void P_SetUnderlayPosition(mobj_t *thing); @@ -398,7 +395,6 @@ void P_CheckHoopPosition(mobj_t *hoopthing, fixed_t x, fixed_t y, fixed_t z, fix boolean P_CheckSector(sector_t *sector, boolean crunch); void P_DelSeclist(msecnode_t *node); -void P_DelPrecipSeclist(mprecipsecnode_t *node); void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y); void P_Initsecnode(void); diff --git a/src/p_map.c b/src/p_map.c index f3fe96868..51307b01c 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -46,9 +46,6 @@ static INT32 tmflags; fixed_t tmx; fixed_t tmy; -static precipmobj_t *tmprecipthing; -static fixed_t preciptmbbox[4]; - // If "floatok" true, move would be ok // if within "tmfloorz - tmceilingz". boolean floatok; @@ -68,7 +65,6 @@ line_t *ceilingline; line_t *blockingline; msecnode_t *sector_list = NULL; -mprecipsecnode_t *precipsector_list = NULL; camera_t *mapcampointer; // @@ -3720,8 +3716,6 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) sec->moved = true; - P_RecalcPrecipInSector(sec); - if (!sector->attachedsolid[i]) continue; @@ -3782,8 +3776,6 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) sec->moved = true; - P_RecalcPrecipInSector(sec); - if (!sector->attachedsolid[i]) continue; @@ -3834,12 +3826,10 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) */ static msecnode_t *headsecnode = NULL; -static mprecipsecnode_t *headprecipsecnode = NULL; void P_Initsecnode(void) { headsecnode = NULL; - headprecipsecnode = NULL; } // P_GetSecnode() retrieves a node from the freelist. The calling routine @@ -3859,20 +3849,6 @@ static msecnode_t *P_GetSecnode(void) return node; } -static mprecipsecnode_t *P_GetPrecipSecnode(void) -{ - mprecipsecnode_t *node; - - if (headprecipsecnode) - { - node = headprecipsecnode; - headprecipsecnode = headprecipsecnode->m_thinglist_next; - } - else - node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL); - return node; -} - // P_PutSecnode() returns a node to the freelist. static inline void P_PutSecnode(msecnode_t *node) @@ -3881,13 +3857,6 @@ static inline void P_PutSecnode(msecnode_t *node) headsecnode = node; } -// Tails 08-25-2002 -static inline void P_PutPrecipSecnode(mprecipsecnode_t *node) -{ - node->m_thinglist_next = headprecipsecnode; - headprecipsecnode = node; -} - // P_AddSecnode() searches the current list to see if this sector is // already there. If not, it adds a sector node at the head of the list of // sectors this object appears in. This is called when creating a list of @@ -3933,47 +3902,6 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode return node; } -// More crazy crap Tails 08-25-2002 -static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mprecipsecnode_t *nextnode) -{ - mprecipsecnode_t *node; - - node = nextnode; - while (node) - { - if (node->m_sector == s) // Already have a node for this sector? - { - node->m_thing = thing; // Yes. Setting m_thing says 'keep it'. - return nextnode; - } - node = node->m_sectorlist_next; - } - - // Couldn't find an existing node for this sector. Add one at the head - // of the list. - - node = P_GetPrecipSecnode(); - - // mark new nodes unvisited. - node->visited = 0; - - node->m_sector = s; // sector - node->m_thing = thing; // mobj - node->m_sectorlist_prev = NULL; // prev node on Thing thread - node->m_sectorlist_next = nextnode; // next node on Thing thread - if (nextnode) - nextnode->m_sectorlist_prev = node; // set back link on Thing - - // Add new node at head of sector thread starting at s->touching_thinglist - - node->m_thinglist_prev = NULL; // prev node on sector thread - node->m_thinglist_next = s->touching_preciplist; // next node on sector thread - if (s->touching_preciplist) - node->m_thinglist_next->m_thinglist_prev = node; - s->touching_preciplist = node; - return node; -} - // P_DelSecnode() deletes a sector node from the list of // sectors this object appears in. Returns a pointer to the next node // on the linked list, or NULL. @@ -4016,45 +3944,6 @@ static msecnode_t *P_DelSecnode(msecnode_t *node) return tn; } -// Tails 08-25-2002 -static mprecipsecnode_t *P_DelPrecipSecnode(mprecipsecnode_t *node) -{ - mprecipsecnode_t *tp; // prev node on thing thread - mprecipsecnode_t *tn; // next node on thing thread - mprecipsecnode_t *sp; // prev node on sector thread - mprecipsecnode_t *sn; // next node on sector thread - - if (!node) - return NULL; - - // Unlink from the Thing thread. The Thing thread begins at - // sector_list and not from mobj_t->touching_sectorlist. - - tp = node->m_sectorlist_prev; - tn = node->m_sectorlist_next; - if (tp) - tp->m_sectorlist_next = tn; - if (tn) - tn->m_sectorlist_prev = tp; - - // Unlink from the sector thread. This thread begins at - // sector_t->touching_thinglist. - - sp = node->m_thinglist_prev; - sn = node->m_thinglist_next; - if (sp) - sp->m_thinglist_next = sn; - else - node->m_sector->touching_preciplist = sn; - if (sn) - sn->m_thinglist_prev = sp; - - // Return this node to the freelist - - P_PutPrecipSecnode(node); - return tn; -} - // Delete an entire sector list void P_DelSeclist(msecnode_t *node) { @@ -4062,13 +3951,6 @@ void P_DelSeclist(msecnode_t *node) node = P_DelSecnode(node); } -// Tails 08-25-2002 -void P_DelPrecipSeclist(mprecipsecnode_t *node) -{ - while (node) - node = P_DelPrecipSecnode(node); -} - // PIT_GetSectors // Locates all the sectors the object is in by looking at the lines that // cross through it. You have already decided that the object is allowed @@ -4109,41 +3991,6 @@ static inline boolean PIT_GetSectors(line_t *ld) return true; } -// Tails 08-25-2002 -static inline boolean PIT_GetPrecipSectors(line_t *ld) -{ - if (preciptmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || - preciptmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT] || - preciptmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || - preciptmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP]) - return true; - - if (P_BoxOnLineSide(preciptmbbox, ld) != -1) - return true; - - if (ld->polyobj) // line belongs to a polyobject, don't add it - return true; - - // This line crosses through the object. - - // Collect the sector(s) from the line and add to the - // sector_list you're examining. If the Thing ends up being - // allowed to move to this position, then the sector_list - // will be attached to the Thing's mobj_t at touching_sectorlist. - - precipsector_list = P_AddPrecipSecnode(ld->frontsector, tmprecipthing, precipsector_list); - - // Don't assume all lines are 2-sided, since some Things - // like MT_TFOG are allowed regardless of whether their radius takes - // them beyond an impassable linedef. - - // Use sidedefs instead of 2s flag to determine two-sidedness. - if (ld->backsector) - precipsector_list = P_AddPrecipSecnode(ld->backsector, tmprecipthing, precipsector_list); - - return true; -} - // P_CreateSecNodeList alters/creates the sector_list that shows what sectors // the object resides in. @@ -4230,73 +4077,6 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y) } } -// More crazy crap Tails 08-25-2002 -void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y) -{ - INT32 xl, xh, yl, yh, bx, by; - mprecipsecnode_t *node = precipsector_list; - precipmobj_t *saved_tmthing = tmprecipthing; /* cph - see comment at func end */ - - // First, clear out the existing m_thing fields. As each node is - // added or verified as needed, m_thing will be set properly. When - // finished, delete all nodes where m_thing is still NULL. These - // represent the sectors the Thing has vacated. - - while (node) - { - node->m_thing = NULL; - node = node->m_sectorlist_next; - } - - tmprecipthing = thing; - - preciptmbbox[BOXTOP] = y + 2*FRACUNIT; - preciptmbbox[BOXBOTTOM] = y - 2*FRACUNIT; - preciptmbbox[BOXRIGHT] = x + 2*FRACUNIT; - preciptmbbox[BOXLEFT] = x - 2*FRACUNIT; - - validcount++; // used to make sure we only process a line once - - xl = (unsigned)(preciptmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT; - xh = (unsigned)(preciptmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT; - yl = (unsigned)(preciptmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT; - yh = (unsigned)(preciptmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT; - - BMBOUNDFIX(xl, xh, yl, yh); - - for (bx = xl; bx <= xh; bx++) - for (by = yl; by <= yh; by++) - P_BlockLinesIterator(bx, by, PIT_GetPrecipSectors); - - // Add the sector of the (x, y) point to sector_list. - precipsector_list = P_AddPrecipSecnode(thing->subsector->sector, thing, precipsector_list); - - // Now delete any nodes that won't be used. These are the ones where - // m_thing is still NULL. - node = precipsector_list; - while (node) - { - if (!node->m_thing) - { - if (node == precipsector_list) - precipsector_list = node->m_sectorlist_next; - node = P_DelPrecipSecnode(node); - } - else - node = node->m_sectorlist_next; - } - - /* cph - - * This is the strife we get into for using global variables. tmthing - * is being used by several different functions calling - * P_BlockThingIterator, including functions that can be called *from* - * P_BlockThingIterator. Using a global tmthing is not reentrant. - * OTOH for Boom/MBF demos we have to preserve the buggy behavior. - * Fun. We restore its previous value unless we're in a Boom/MBF demo. - */ - tmprecipthing = saved_tmthing; -} - /* cphipps 2004/08/30 - * Must clear tmthing at tic end, as it might contain a pointer to a removed thinker, or the level might have ended/been ended and we clear the objects it was pointing too. Hopefully we don't need to carry this between tics for sync. */ void P_MapStart(void) diff --git a/src/p_maputl.c b/src/p_maputl.c index 13dd85592..a88545135 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -782,9 +782,6 @@ void P_UnsetPrecipThingPosition(precipmobj_t *thing) if (bprev && (*bprev = bnext) != NULL) // unlink from block map bnext->bprev = bprev; - - precipsector_list = thing->touching_sectorlist; - thing->touching_sectorlist = NULL; //to be restored by P_SetPrecipThingPosition } static void P_LinkToBlockMap(mobj_t *thing, mobj_t **bmap) @@ -929,10 +926,6 @@ void P_SetPrecipitationThingPosition(precipmobj_t *thing) { thing->subsector = R_PointInSubsector(thing->x, thing->y); - P_CreatePrecipSecNodeList(thing, thing->x, thing->y); - thing->touching_sectorlist = precipsector_list; // Attach to Thing's precipmobj_t - precipsector_list = NULL; // clear for next time - // NOTE: this works because bnext/bprev are at the same // offsets in precipmobj_t and mobj_t P_LinkToBlockMap((mobj_t*)thing, (mobj_t**)precipblocklinks); diff --git a/src/p_mobj.c b/src/p_mobj.c index 81f4ec4c2..322669bc9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3567,7 +3567,7 @@ animonly: } } -static void CalculatePrecipFloor(precipmobj_t *mobj) +static void P_CalculatePrecipFloor(precipmobj_t *mobj) { // recalculate floorz each time const sector_t *mobjsecsubsec; @@ -3601,19 +3601,6 @@ static void CalculatePrecipFloor(precipmobj_t *mobj) } } -void P_RecalcPrecipInSector(sector_t *sector) -{ - mprecipsecnode_t *psecnode; - - if (!sector) - return; - - sector->moved = true; // Recalc lighting and things too, maybe - - for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_thinglist_next) - CalculatePrecipFloor(psecnode->m_thing); -} - // // P_NullPrecipThinker // @@ -3680,6 +3667,8 @@ boolean P_PrecipThinker(precipmobj_t *mobj) if (mobj->precipflags & PCF_SPLASH) return true; + P_CalculatePrecipFloor(mobj); + // adjust height if ((mobj->z += mobj->momz) <= mobj->floorz) { @@ -10047,7 +10036,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype mobj->thinker.function.acp1 = (actionf_p1)P_NullPrecipThinker; P_AddPrecipThinker(&mobj->thinker); - CalculatePrecipFloor(mobj); + P_CalculatePrecipFloor(mobj); if (mobj->floorz != starting_floorz) mobj->precipflags |= PCF_FOF; @@ -10207,12 +10196,6 @@ void P_FreePrecipMobj(precipmobj_t *mobj) // unlink from sector and block lists P_UnsetPrecipThingPosition(mobj); - if (precipsector_list) - { - P_DelPrecipSeclist(precipsector_list); - precipsector_list = NULL; - } - // free block // Precipmobjs don't actually think using their thinker, // so the free cannot be delayed. @@ -10226,12 +10209,6 @@ void P_RemoveSavegameMobj(mobj_t *mobj) if (((thinker_t *)mobj)->function.acp1 == (actionf_p1)P_NullPrecipThinker) { P_UnsetPrecipThingPosition((precipmobj_t *)mobj); - - if (precipsector_list) - { - P_DelPrecipSeclist(precipsector_list); - precipsector_list = NULL; - } } else { diff --git a/src/r_defs.h b/src/r_defs.h index c3f14236e..389dd497d 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -355,9 +355,6 @@ typedef struct sector_s // Current speed of ceiling/floor. For Knuckles to hold onto stuff. fixed_t floorspeed, ceilspeed; - // list of precipitation mobjs in sector - struct mprecipsecnode_s *touching_preciplist; - // Eternity engine slope pslope_t *f_slope; // floor slope pslope_t *c_slope; // ceiling slope @@ -495,17 +492,6 @@ typedef struct msecnode_s boolean visited; // used in search algorithms } msecnode_t; -typedef struct mprecipsecnode_s -{ - sector_t *m_sector; // a sector containing this object - struct precipmobj_s *m_thing; // this object - struct mprecipsecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing - struct mprecipsecnode_s *m_sectorlist_next; // next msecnode_t for this thing - struct mprecipsecnode_s *m_thinglist_prev; // prev msecnode_t for this sector - struct mprecipsecnode_s *m_thinglist_next; // next msecnode_t for this sector - boolean visited; // used in search algorithms -} mprecipsecnode_t; - // // The lineseg. // -- 2.54.0 From 96f842fd966d39abec58fec14ec0a3b610c78ed7 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 23:13:34 +0100 Subject: [PATCH 261/325] only need to recalc this once a tic precip thinker thinks slightly more often, but we really dont need that tbh --- src/p_mobj.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 322669bc9..f9568a428 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3667,7 +3667,8 @@ boolean P_PrecipThinker(precipmobj_t *mobj) if (mobj->precipflags & PCF_SPLASH) return true; - P_CalculatePrecipFloor(mobj); + if (renderisnewtic) + P_CalculatePrecipFloor(mobj); // adjust height if ((mobj->z += mobj->momz) <= mobj->floorz) -- 2.54.0 From d397a07d96897d8f32504820b75311e4df60af53 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 23:24:01 +0100 Subject: [PATCH 262/325] dont recalc if precip sector didnt move forgor i can just check this --- src/p_mobj.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f9568a428..1fec5ac72 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3567,7 +3567,7 @@ animonly: } } -static void P_CalculatePrecipFloor(precipmobj_t *mobj) +static void P_CalculatePrecipFloor(precipmobj_t *mobj, boolean spawn) { // recalculate floorz each time const sector_t *mobjsecsubsec; @@ -3577,6 +3577,10 @@ static void P_CalculatePrecipFloor(precipmobj_t *mobj) else return; + // no need to recalc anything if not moved + if (!spawn && !mobjsecsubsec->moved) + return; + mobj->floorz = P_GetSectorFloorZAt(mobjsecsubsec, mobj->x, mobj->y); if (mobjsecsubsec->ffloors) @@ -3668,7 +3672,7 @@ boolean P_PrecipThinker(precipmobj_t *mobj) return true; if (renderisnewtic) - P_CalculatePrecipFloor(mobj); + P_CalculatePrecipFloor(mobj, false); // adjust height if ((mobj->z += mobj->momz) <= mobj->floorz) @@ -10037,7 +10041,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype mobj->thinker.function.acp1 = (actionf_p1)P_NullPrecipThinker; P_AddPrecipThinker(&mobj->thinker); - P_CalculatePrecipFloor(mobj); + P_CalculatePrecipFloor(mobj, true); if (mobj->floorz != starting_floorz) mobj->precipflags |= PCF_FOF; -- 2.54.0 From d09c8bb8fd4c9f0fb7ce2c7a588834626700935e Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 28 Jan 2025 18:29:23 +0100 Subject: [PATCH 263/325] ss->touching_preciplist deez --- src/p_setup.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 4503dad62..c88ee02fb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -740,8 +740,6 @@ static void P_LoadRawSectors(UINT8 *data) ss->thinglist = NULL; ss->touching_thinglist = NULL; - ss->touching_preciplist = NULL; - ss->floordata = NULL; ss->ceilingdata = NULL; ss->lightingdata = NULL; -- 2.54.0 From 8c0294898e93740ec4a4242126eeb9c1ef5ef546 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 28 Jan 2025 16:05:20 +0100 Subject: [PATCH 264/325] fix issues with models - Sloperotation was weird, it now uses what we calculate in K_RollMobjsBySlopes - in general uses srb2s newer system - alot of cleanup of pointless variables - sprinfo pivots should now work - removed roillmodel since it was smth weird and broke rollangle --- src/hardware/hw_defs.h | 16 +--- src/hardware/hw_md2.c | 121 +++++++++---------------------- src/hardware/r_opengl/r_opengl.c | 38 ++-------- src/lua_mobjlib.c | 1 - src/p_mobj.h | 1 - 5 files changed, 41 insertions(+), 136 deletions(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 037e9a0ac..82c8c690c 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -121,38 +121,24 @@ typedef struct poly_t *planepoly; // the generated convex polygon } extrasubsector_t; -// Kart features -#define USE_FTRANSFORM_ANGLEZ -#define USE_FTRANSFORM_MIRROR - // Vanilla features //#define USE_MODEL_NEXTFRAME typedef struct { FLOAT x,y,z; // position -#ifdef USE_FTRANSFORM_ANGLEZ FLOAT anglex, angley, anglez; // aimingangle / viewangle FLOAT anglex2, anglez2; // secondaries -#else - FLOAT anglex, angley; // aimingangle / viewangle - FLOAT anglex2; // secondaries -#endif FLOAT scalex, scaley, scalez; - FLOAT spritexscale, spriteyscale; FLOAT fovangle; UINT8 splitscreen; boolean flip; // screenflip boolean roll; - boolean rollmodel; - SINT8 rollflip; FLOAT rollangle; - UINT8 rotaxis; FLOAT centerx, centery; -#ifdef USE_FTRANSFORM_MIRROR + FLOAT rollx, rollz; boolean mirror; // SRB2Kart: Encore Mode boolean mirrorflip; // Encore Mode with Flipcam -#endif boolean shearing; // 14042019 float viewaiming; // 17052019 } FTransform; diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index db0fd5bb2..7eaa698f7 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1161,8 +1161,6 @@ void HWR_DrawMD2(gl_vissprite_t *spr) spritedef_t *sprdef; spriteframe_t *sprframe; spriteinfo_t *sprinfo; - INT32 rollfactor = 0; - angle_t ang; interpmobjstate_t interp; if (R_UsingFrameInterpolation() && !paused && (!cv_maxinterpdist.value || R_QuickCamDist(spr->mobj->x, spr->mobj->y) < cv_maxinterpdist.value)) @@ -1359,7 +1357,7 @@ void HWR_DrawMD2(gl_vissprite_t *spr) p.x = FIXED_TO_FLOAT(interp.x); p.y = FIXED_TO_FLOAT(interp.y)+md2->offset; - if (spr->mobj->eflags & MFE_VERTICALFLIP) + if (flip) p.z = FIXED_TO_FLOAT(interp.z + spr->mobj->height); else p.z = FIXED_TO_FLOAT(interp.z); @@ -1382,109 +1380,58 @@ void HWR_DrawMD2(gl_vissprite_t *spr) const fixed_t anglef = AngleFixed((R_PointToAngle(interp.x, interp.y))-ANGLE_180); p.angley = FIXED_TO_FLOAT(anglef); } - - p.rollangle = 0.0f; - p.rollflip = 1; - p.rotaxis = 0; - - p.spritexscale = FIXED_TO_FLOAT(spr->mobj->spritexscale); - p.spriteyscale = FIXED_TO_FLOAT(spr->mobj->spriteyscale); - angle_t sliptideroll = ((cv_sloperoll.value && cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0); + const angle_t sliptideroll = ((cv_sloperoll.value && cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0); + const SINT8 flipfactor = flip ? -1 : 1; if (spr->mobj->rollangle || sliptideroll) { - angle_t rollang = 0; - rollfactor = ((spr->mobj->rollmodel == true) ? 1 : 0); + angle_t rollang = sliptideroll + ? (spr->mobj->rollangle) + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat]) + : (spr->mobj->rollangle); - rollang = sliptideroll - ? (spr->mobj->rollangle * rollfactor) + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat]) - : (spr->mobj->rollangle * rollfactor); - fixed_t anglef = AngleFixed(rollang); - p.rollangle = FIXED_TO_FLOAT(anglef); - p.rollmodel = (spr->mobj->rollmodel); - p.roll = true; - // rotation pivot - p.centerx = FIXED_TO_FLOAT(spr->mobj->radius/2)*(p.spritexscale); - p.centery = FIXED_TO_FLOAT(spr->mobj->height/2)*(p.spriteyscale); + p.rollangle = 0.0f; - // rotation axis - if (sprinfo->available) - p.rotaxis = (UINT8)(sprinfo->pivot[(spr->mobj->frame & FF_FRAMEMASK)].rotaxis); + if (anglef) + { + fixed_t camAngleDiff = AngleFixed(viewangle) - FLOAT_TO_FIXED(p.angley); // dumb reconversion back, I know - // for NiGHTS specifically but should work everywhere else - ang = R_PointToAngle (spr->mobj->x, spr->mobj->y) - (spr->mobj->player ? spr->mobj->player->frameangle : spr->mobj->angle); - if ((sprframe->rotate & SRF_RIGHT) && (ang < ANGLE_180)) // See from right - p.rollflip = 1; - else if ((sprframe->rotate & SRF_LEFT) && (ang >= ANGLE_180)) // See from left - p.rollflip = -1; + p.rollangle = FIXED_TO_FLOAT(anglef); + p.roll = true; + + // rotation pivot + if (sprinfo->available) + { + p.centerx = FIXED_TO_FLOAT(sprinfo->pivot[frame].x); + p.centery = FIXED_TO_FLOAT(sprinfo->pivot[frame].y); + } + else + { + p.centerx = FIXED_TO_FLOAT(spr->mobj->radius/2); + p.centery = FIXED_TO_FLOAT(spr->mobj->height/2); + } + + // rotation axes relative to camera + p.rollx = FIXED_TO_FLOAT(FINECOSINE(FixedAngle(camAngleDiff) >> ANGLETOFINESHIFT)); + p.rollz = FIXED_TO_FLOAT(FINESINE(FixedAngle(camAngleDiff) >> ANGLETOFINESHIFT)); + } } - - p.anglex = 0.0f; - p.anglex2 = 0.0f; -#ifdef USE_FTRANSFORM_ANGLEZ - // Slope rotation from Kart - p.anglez = 0.0f; - p.anglez2 = 0.0f; - - // use secondary angles for the slope rotation - if (spr->mobj->standingslope) - { - fixed_t tempz = spr->mobj->standingslope->normal.z; - fixed_t tempy = spr->mobj->standingslope->normal.y; - fixed_t tempx = spr->mobj->standingslope->normal.x; - fixed_t tempangle = AngleFixed(R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx)); - p.anglez2 = FIXED_TO_FLOAT(tempangle); - tempangle = -AngleFixed(R_PointToAngle2(0, 0, tempz, tempy)); - p.anglex2 = FIXED_TO_FLOAT(tempangle); - } - else if ((spr->mobj->sloperoll || spr->mobj->slopepitch) && (!P_IsObjectOnGround(spr->mobj)) && (!paused)) - { - SINT8 flipfactor = flip ? -1 : 1; - - angle_t camang = R_PointToAngle(interp.x, interp.y); - angle_t mobjang; - - if (spr->mobj->flags & (MF_NOTHINK|MF_SCENERY)) - mobjang = spr->mobj->angle; - else - mobjang = interp.angle; - - angle_t fmoang; - fmoang = camang - mobjang; - - // slopepitch - p.anglex += flipfactor*FIXED_TO_FLOAT( AngleFixed(FixedMul(FINESINE((camang-fmoang) >> ANGLETOFINESHIFT), interp.slopepitch)) ); - p.anglez -= flipfactor*FIXED_TO_FLOAT( AngleFixed(FixedMul(FINECOSINE((camang-fmoang) >> ANGLETOFINESHIFT), interp.slopepitch)) ); - - // sloperoll - p.anglex += flipfactor*FIXED_TO_FLOAT( AngleFixed(FixedMul(FINECOSINE((camang-fmoang) >> ANGLETOFINESHIFT), interp.sloperoll)) ); - p.anglez += flipfactor*FIXED_TO_FLOAT( AngleFixed(FixedMul(FINESINE((camang-fmoang) >> ANGLETOFINESHIFT), interp.sloperoll)) ); - p.roll = true; - } + // slope pitch and roll + p.anglex += flipfactor*FIXED_TO_FLOAT(AngleFixed(interp.sloperoll)); + p.anglez -= flipfactor*FIXED_TO_FLOAT(AngleFixed(interp.slopepitch)); // pitch and roll - if (interp.roll || interp.pitch) - { - SINT8 flipfactor = flip ? -1 : 1; - p.anglex += flipfactor*FIXED_TO_FLOAT(AngleFixed(interp.roll)); - p.anglez -= flipfactor*FIXED_TO_FLOAT(AngleFixed(interp.pitch)); - p.roll = true; - } -#endif + p.anglex += flipfactor*FIXED_TO_FLOAT(AngleFixed(interp.roll)); + p.anglez -= flipfactor*FIXED_TO_FLOAT(AngleFixed(interp.pitch)); p.flip = atransform.flip; -#ifdef USE_FTRANSFORM_MIRROR p.mirror = atransform.mirror; // from Kart -#endif GL_SetShader(SHADER_MODEL); // model shader { - SINT8 flipfactor = flip ? -1 : 1; - float this_scale = FIXED_TO_FLOAT(interp.scale); float xs = this_scale * FIXED_TO_FLOAT(interp.spritexscale); diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 60d6a4e7c..0db93e19d 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -2615,7 +2615,6 @@ void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics pglEnable(GL_CULL_FACE); pglEnable(GL_NORMALIZE); -#ifdef USE_FTRANSFORM_MIRROR // flipped is if the object is vertically flipped // hflipped is if the object is horizontally flipped // pos->flip is if the screen is flipped vertically @@ -2628,13 +2627,6 @@ void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics else pglCullFace(GL_BACK); } -#else - // pos->flip is if the screen is flipped too - if (flipped ^ hflipped ^ pos->flip) // If one or three of these are active, but not two, invert the model's culling - pglCullFace(GL_FRONT); - else - pglCullFace(GL_BACK); -#endif pglPushMatrix(); // should be the same as glLoadIdentity pglTranslatef(pos->x, pos->z, pos->y); @@ -2642,30 +2634,15 @@ void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics scaley = -scaley; if (hflipped) scalez = -scalez; -#ifdef USE_FTRANSFORM_ANGLEZ - pglRotatef(pos->anglez2, 0.0f, 0.0f, -1.0f); // rotate by slope from Kart -#endif - pglRotatef(pos->anglex2, -1.0f, 0.0f, 0.0f); + + pglRotatef(pos->anglez, 0.0f, 0.0f, -1.0f); + pglRotatef(pos->anglex, 1.0f, 0.0f, 0.0f); pglRotatef(pos->angley, 0.0f, -1.0f, 0.0f); if (pos->roll) { - float roll = (1.0f * pos->rollflip); pglTranslatef(pos->centerx, pos->centery, 0); - - // rotate model for pitch and roll - pglRotatef(pos->anglex, 1.0f, 0.0f, 0.0f); -#ifdef USE_FTRANSFORM_ANGLEZ - pglRotatef(pos->anglez, 0.0f, 0.0f, -1.0f); -#endif - - if (pos->rotaxis == 2) // Z - pglRotatef(pos->rollangle, 0.0f, 0.0f, roll); - else if (pos->rotaxis == 1) // Y - pglRotatef(pos->rollangle, 0.0f, roll, 0.0f); - else // X - pglRotatef(pos->rollangle, roll, 0.0f, 0.0f); - + pglRotatef(pos->rollangle, pos->rollx, 0.0f, pos->rollz); pglTranslatef(-pos->centerx, -pos->centery, 0); } @@ -2793,15 +2770,12 @@ void GL_SetTransform(FTransform *stransform) // keep a trace of the transformation for md2 memcpy(&md2_transform, stransform, sizeof (md2_transform)); -#ifdef USE_FTRANSFORM_MIRROR - // mirroring from Kart + if (stransform->mirror) pglScalef(-stransform->scalex, stransform->scaley, -stransform->scalez); else if (stransform->mirrorflip) pglScalef(-stransform->scalex, -stransform->scaley, -stransform->scalez); - else -#endif - if (stransform->flip) + else if (stransform->flip) pglScalef(stransform->scalex, -stransform->scaley, -stransform->scalez); else pglScalef(stransform->scalex, stransform->scaley, -stransform->scalez); diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 304946680..8b01b4ce3 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -149,7 +149,6 @@ static const udata_field_t mobj_fields[] = { FIELD(mobj_t, standingslope, udatalib_getter_slope, mobj_standingslope_noset), FIELD(mobj_t, colorized, udatalib_getter_boolean, udatalib_setter_boolean), FIELD(mobj_t, mirrored, udatalib_getter_boolean, udatalib_setter_boolean), - FIELD(mobj_t, rollmodel, udatalib_getter_boolean, udatalib_setter_boolean), { NULL, 0, NULL, NULL }, }; #undef FIELD diff --git a/src/p_mobj.h b/src/p_mobj.h index 5dca5e344..f0dd9e836 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -395,7 +395,6 @@ typedef struct mobj_s boolean resetinterp; // if true, some fields should not be interpolated (see R_InterpolateMobjState implementation) boolean colorized; // Whether the mobj uses the rainbow colormap boolean mirrored; // The object's rotations will be mirrored left to right, e.g., see frame AL from the right and AR from the left - boolean rollmodel; // OpenGL: Should this model rotate? tic_t slamsoundtimer; -- 2.54.0 From c82eb256286cde2c8bb35705ba924d88b7d3449e Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:14:45 +0100 Subject: [PATCH 265/325] where did this come from --- src/hardware/hw_shaders.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_shaders.c b/src/hardware/hw_shaders.c index b4041fcae..8f039e4e8 100644 --- a/src/hardware/hw_shaders.c +++ b/src/hardware/hw_shaders.c @@ -36,7 +36,7 @@ static struct { {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, // Model shader - {GLSL_MODEL_LIGHTING_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, + {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, // Water shader {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WATER_FRAGMENT_SHADER}, -- 2.54.0 From 883c382a1d8e037cbacab21458eef3fdb86145b5 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:16:23 +0100 Subject: [PATCH 266/325] slightly refactor chasecam stuff again --- src/p_user.c | 123 +++++++++++++++++++++++---------------------------- 1 file changed, 56 insertions(+), 67 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 67784b3c4..a355a34af 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3484,6 +3484,7 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) { tic_t tries = 0; fixed_t x, y, z; + UINT8 i; if (thiscam->freecam) return; // do not reset the camera there. @@ -3508,13 +3509,14 @@ void P_ResetCamera(player_t *player, camera_t *thiscam) thiscam->z = z; thiscam->reset = true; - if (!(thiscam == &camera[0] && (cv_cam_still[0].value)) - && !(thiscam == &camera[1] && (cv_cam_still[1].value)) - && !(thiscam == &camera[2] && (cv_cam_still[2].value)) - && !(thiscam == &camera[3] && (cv_cam_still[3].value))) + for (i = 0; i <= splitscreen; i++) { - thiscam->angle = player->mo->angle; - thiscam->aiming = 0; + if (!(thiscam == &camera[i] && cv_cam_still[i].value)) + { + thiscam->angle = player->mo->angle; + thiscam->aiming = 0; + break; + } } thiscam->relativex = 0; @@ -3739,7 +3741,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall { static boolean lookbackactive[MAXSPLITSCREENPLAYERS]; static UINT8 lookbackdelay[MAXSPLITSCREENPLAYERS]; - UINT8 num, plyrnum; + UINT8 num = 0; angle_t angle = 0, focusangle = 0, focusaiming = 0; fixed_t x, y, z, dist, viewpointx, viewpointy, camspeed, camdist, camheight, pviewheight; fixed_t pan, xpan, ypan; @@ -3757,21 +3759,13 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) return true; - if (thiscam == &camera[1]) // Camera 2 + for (UINT8 i = 0; i <= splitscreen; i++) { - num = 1; - } - else if (thiscam == &camera[2]) // Camera 3 - { - num = 2; - } - else if (thiscam == &camera[3]) // Camera 4 - { - num = 3; - } - else // Camera 1 - { - num = 0; + if (thiscam == &camera[i]) + { + num = i; + break; + } } if (thiscam->freecam || player->spectator) @@ -3784,29 +3778,10 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (paused || P_AutoPause()) return true; - if (player == &players[consoleplayer]) - { - plyrnum = 0; - } - else if (player == &players[displayplayers[1]]) - { - plyrnum = 1; - } - else if (player == &players[displayplayers[2]]) - { - plyrnum = 2; - } - else if (player == &players[displayplayers[3]]) - { - plyrnum = 3; - } - else - { - plyrnum = 255; - } - mo = player->mo; + const boolean vflip = (mo->eflags & MFE_VERTICALFLIP); + if (cv_cam_timeover[num].value && (player->pflags & PF_TIMEOVER)) timeover = (player->kartstuff[k_timeovercam] > 2*TICRATE ? 2 : 1); // 1 for momentum keep, 2 for turnaround else @@ -3823,19 +3798,8 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (!thiscam->chase && !resetcalled) { - if (plyrnum != 255) - { - focusangle = localangle[plyrnum]; - } - else - { - focusangle = mo->angle; - } - - if (thiscam == &camera[num]) - camrotate = cv_cam_rotate[num].value; - else - camrotate = 0; + focusangle = ((P_IsLocalPlayer(player)) ? localangle[num] : mo->angle); + camrotate = ((thiscam == &camera[num]) ? cv_cam_rotate[num].value : 0); if (leveltime < introtime) // Whoooshy camera! { @@ -3856,10 +3820,10 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall focusangle = mo->angle; focusaiming = 0; } - else if (plyrnum != 255) + else if (P_IsLocalPlayer(player)) { - focusangle = localangle[plyrnum]; - focusaiming = localaiming[plyrnum]; + focusangle = localangle[num]; + focusaiming = localaiming[num]; } else { @@ -3895,7 +3859,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall camheight += (introcam * mapobjectscale)*2; } else if (player->exiting) // SRB2Kart: Leave the camera behind while exiting, for dramatic effect! + { camstill = true; + } else if (lookback || lookbackdelay[num]) // SRB2kart - Camera flipper { #define MAXLOOKBACKDELAY 2 @@ -3908,26 +3874,35 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall else lookbackdelay[num]--; } + lookbackdown = (lookbackdelay[num] == MAXLOOKBACKDELAY) != lookbackactive[num]; lookbackactive[num] = (lookbackdelay[num] == MAXLOOKBACKDELAY); #undef MAXLOOKBACKDELAY - if (mo->eflags & MFE_VERTICALFLIP) + if (vflip) camheight += thiscam->height; if (camspeed > FRACUNIT) camspeed = FRACUNIT; if (timeover) + { angle = mo->angle + FixedAngle(camrotate*FRACUNIT); + } else if (leveltime < starttime) + { angle = focusangle + FixedAngle(camrotate*FRACUNIT); + } else if (camstill || resetcalled || player->playerstate == PST_DEAD) + { angle = thiscam->angle; + } else { if (camspeed == FRACUNIT) + { angle = focusangle + FixedAngle(camrotate<angle; @@ -3965,7 +3940,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall // SRB2Kart: set camera panning if (camstill || resetcalled || player->playerstate == PST_DEAD) + { pan = xpan = ypan = 0; + } else { if (player->kartstuff[k_drift] != 0) @@ -3991,7 +3968,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall pviewheight = FixedMul(32<scale); - if (mo->eflags & MFE_VERTICALFLIP) + if (vflip) z = mo->z + mo->height - pviewheight - camheight; else z = mo->z + pviewheight + camheight; @@ -4019,7 +3996,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall thiscam->momz = 0; } else if (player->exiting || timeover == 2) + { thiscam->momx = thiscam->momy = thiscam->momz = 0; + } else if (leveltime < starttime) { thiscam->momx = FixedMul(x - thiscam->x, camspeed); @@ -4050,7 +4029,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall f2 = viewpointy-thiscam->y; dist = FixedHypot(f1, f2); - if (mo->eflags & MFE_VERTICALFLIP) + if (vflip) angle = R_PointToAngle2(0, thiscam->z + thiscam->height, dist, mo->z + mo->height - P_GetPlayerHeight(player)); else angle = R_PointToAngle2(0, thiscam->z, dist, mo->z + P_GetPlayerHeight(player)); @@ -4063,7 +4042,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall G_ClipAimingPitch((INT32 *)&angle); if (camspeed == FRACUNIT) + { thiscam->aiming = angle; + } else { angle_t input; @@ -4086,12 +4067,13 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall { // Don't let the camera match your movement. thiscam->momz = 0; + if (player->spectator) thiscam->aiming = 0; // Only let the camera go a little bit downwards. - else if (!(mo->eflags & MFE_VERTICALFLIP) && thiscam->aiming < ANGLE_337h && thiscam->aiming > ANGLE_180) + else if (!vflip && thiscam->aiming < ANGLE_337h && thiscam->aiming > ANGLE_180) thiscam->aiming = ANGLE_337h; - else if (mo->eflags & MFE_VERTICALFLIP && thiscam->aiming > ANGLE_22h && thiscam->aiming < ANGLE_180) + else if (vflip && thiscam->aiming > ANGLE_22h && thiscam->aiming < ANGLE_180) thiscam->aiming = ANGLE_22h; } @@ -4106,12 +4088,19 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall void P_ResetLocalCamAiming(player_t *player) { - for (int i = 0; i <= splitscreen; i++) + UINT8 i; + + if (player == &players[consoleplayer]) + localaiming[0] = 0; + else if (splitscreen) { - UINT8 id = (i == 0) ? consoleplayer : displayplayers[i]; - if (player - players == id) + for (i = 1; i <= splitscreen; i++) // Skip P1 { - localaiming[i] = 0; + if (player == &players[displayplayers[i]]) + { + localaiming[i] = 0; + break; + } } } } -- 2.54.0 From d18afa1781d5f0c9afe7cf6bf5d5739d1577f21a Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:16:56 +0100 Subject: [PATCH 267/325] dont run this if cam tilt disabled --- src/p_user.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index a355a34af..852d2b6be 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4749,8 +4749,6 @@ void P_PlayerThink(player_t *player) { player->pflags ^= PF_WANTSTOJOIN; player->powers[pw_flashing] = TICRATE/2 + 1; - /*if (P_SpectatorJoinGame(player)) - return; // player->mo was removed.*/ } // Even if not NiGHTS, pull in nearby objects when walking around as John Q. Elliot. @@ -4987,7 +4985,7 @@ void P_PlayerThink(player_t *player) K_KartPlayerThink(player, cmd); // SRB2kart - if (rendermode != render_none) + if (rendermode != render_none && cv_tilting.value) DoABarrelRoll(player); LUA_HookPlayer(player, HOOK(PlayerThink)); -- 2.54.0 From 95daa7eacc8f307e4abf06d31c497fea7b985a6e Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:18:05 +0100 Subject: [PATCH 268/325] just set this directly no need for all of this --- src/p_spec.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 7ae71f61b..a09b8b423 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5287,20 +5287,8 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate) } } - if (mapheaderinfo[gamemap-1]->weather == 2) // snow - curWeather = PRECIP_SNOW; - else if (mapheaderinfo[gamemap-1]->weather == 3) // rain - curWeather = PRECIP_RAIN; - else if (mapheaderinfo[gamemap-1]->weather == 1) // storm - curWeather = PRECIP_STORM; - else if (mapheaderinfo[gamemap-1]->weather == 5) // storm w/o rain - curWeather = PRECIP_STORM_NORAIN; - else if (mapheaderinfo[gamemap-1]->weather == 6) // storm w/o lightning - curWeather = PRECIP_STORM_NOSTRIKES; - else if (mapheaderinfo[gamemap-1]->weather == 4) // blank - curWeather = PRECIP_BLANK; - else - curWeather = PRECIP_NONE; + // set current weather + curWeather = mapheaderinfo[gamemap-1]->weather; P_InitTagLists(); // Create xref tables for tags P_SearchForDisableLinedefs(); // Disable linedefs are now allowed to disable *any* line -- 2.54.0 From 06ccb4f7b0826fec9c75be1eaad98b73330670c1 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 9 Jan 2025 17:06:45 +0100 Subject: [PATCH 269/325] dont reset cam using f12 when only one player is ingame --- src/g_game.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 127a4ad80..68dd71d08 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1726,7 +1726,14 @@ void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive) (*displayplayerp) = playernumd; /* If a viewpoint changes, reset the camera to clear uninitialized memory. */ - G_FixCamera(viewd); + if (viewnum > splits) + { + G_FixCamera(viewd); + } + else if ((*displayplayerp) != olddisplayplayer) + { + G_FixCamera(viewnum); + } } if (demo.playback && viewnum == 1) -- 2.54.0 From ec263086d853e4039488f380347d72884377642a Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 9 Jan 2025 17:11:02 +0100 Subject: [PATCH 270/325] =?UTF-8?q?use=20l=C3=B6=C3=B6ps=20for=20those=20t?= =?UTF-8?q?o=20look=20a=20little=20better=20lel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/p_map.c | 17 +++++++++-------- src/p_spec.c | 54 +++++++++++++++++++--------------------------------- 2 files changed, 29 insertions(+), 42 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 51307b01c..01965c423 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -222,14 +222,15 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) if (!demo.playback || P_AnalogMove(object->player)) { - if (object->player == &players[consoleplayer]) - localangle[0] = spring->angle; - else if (object->player == &players[displayplayers[1]]) - localangle[1] = spring->angle; - else if (object->player == &players[displayplayers[2]]) - localangle[2] = spring->angle; - else if (object->player == &players[displayplayers[3]]) - localangle[3] = spring->angle; + for (UINT8 j = 0; j <= splitscreen; ++j) + { + INT32 id = (j == 0 ? consoleplayer : displayplayers[j]); + if (object->player == &players[id]) + { + localangle[j] = spring->angle; + break; + } + } } } diff --git a/src/p_spec.c b/src/p_spec.c index a09b8b423..43f543fdf 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3561,14 +3561,15 @@ DoneSection2: if (!demo.playback || P_AnalogMove(player)) { - if (player == &players[consoleplayer]) - localangle[0] = player->mo->angle; - else if (player == &players[displayplayers[1]]) - localangle[1] = player->mo->angle; - else if (player == &players[displayplayers[2]]) - localangle[2] = player->mo->angle; - else if (player == &players[displayplayers[3]]) - localangle[3] = player->mo->angle; + for (UINT8 j = 0; j <= splitscreen; ++j) + { + INT32 id = (j == 0 ? consoleplayer : displayplayers[j]); + if (player == &players[id]) + { + localangle[j] = player->mo->angle; + break; + } + } } if (!(lines[i].flags & ML_EFFECT4)) @@ -7406,33 +7407,18 @@ void T_Pusher(pusher_t *p) if (!demo.playback || P_AnalogMove(thing->player)) { - if (thing->player == &players[consoleplayer]) + for (UINT8 i = 0; i <= splitscreen; ++i) { - if (thing->angle - localangle[0] > ANGLE_180) - localangle[0] -= (localangle[0] - thing->angle) / 8; - else - localangle[0] += (thing->angle - localangle[0]) / 8; - } - else if (thing->player == &players[displayplayers[1]]) - { - if (thing->angle - localangle[1] > ANGLE_180) - localangle[1] -= (localangle[1] - thing->angle) / 8; - else - localangle[1] += (thing->angle - localangle[1]) / 8; - } - else if (thing->player == &players[displayplayers[2]]) - { - if (thing->angle - localangle[2] > ANGLE_180) - localangle[2] -= (localangle[2] - thing->angle) / 8; - else - localangle[2] += (thing->angle - localangle[2]) / 8; - } - else if (thing->player == &players[displayplayers[3]]) - { - if (thing->angle - localangle[3] > ANGLE_180) - localangle[3] -= (localangle[3] - thing->angle) / 8; - else - localangle[3] += (thing->angle - localangle[3]) / 8; + INT32 id = (i == 0 ? consoleplayer : displayplayers[i]); + if (thing->player == &players[id]) + { + if (thing->angle - localangle[i] > ANGLE_180) + localangle[i] -= (localangle[i] - thing->angle) / 8; + else + localangle[i] += (thing->angle - localangle[i]) / 8; + + break; + } } } } -- 2.54.0 From 8d9c6ec65fbd4c32b620e2c36cb1b28fe79e382d Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:21:22 +0100 Subject: [PATCH 271/325] localping color was lost --- src/hu_stuff.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index e18f4e872..3acad0823 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2374,7 +2374,7 @@ Ping_gfx_color (int lag) static const UINT8 * Ping_gfx_colormap (UINT32 lag, boolean gentleman) { - UINT8 *colormap = NULL; + const UINT8 *colormap = NULL; if (K_UseColorHud()) colormap = R_GetTranslationColormap(TC_RAINBOW, Ping_gfx_color(lag), GTC_CACHE); @@ -2384,6 +2384,10 @@ Ping_gfx_colormap (UINT32 lag, boolean gentleman) // flash ping red if too high colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_RASPBERRY, GTC_CACHE); } + else if (gentleman) + { + colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); + } return colormap; } @@ -2428,7 +2432,7 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) if (measureid == 1) V_DrawScaledPatch(x+11 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); - + if (cv_pingicon.value) V_DrawScaledPatch(x+2, y, flags, pinggfx[gfxnum]); -- 2.54.0 From 9e070a651672aea982febafc1b253bbca10364bf Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 11:22:51 +0100 Subject: [PATCH 272/325] tiny cleanup SCR_DisplayTicRate --- src/screen.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/screen.c b/src/screen.c index 5ae4f8d72..f6a94c052 100644 --- a/src/screen.c +++ b/src/screen.c @@ -443,22 +443,20 @@ void SCR_CalculateFPS(void) void SCR_DisplayTicRate(void) { - const UINT8 *ticcntcolor = NULL; UINT32 cap = R_GetFramerateCap(); UINT32 benchmark = (cap == 0) ? I_GetRefreshRate() : cap; - INT32 x = 318; double fps = round(averageFPS); INT32 fpsflags = V_LocalTransFlag()|V_SNAPTOBOTTOM|V_SNAPTORIGHT; - const char *fps_string; - - INT32 ticcntcolor2 = 0; - + if (gamestate == GS_NULL) return; // new kart counter if (cv_ticrate.value == 1 || cv_ticrate.value == 2) { + const UINT8 *ticcntcolor = NULL; + INT32 x = 318; + // draw "FPS" if (cv_ticrate.value == 1) V_DrawFixedPatch(306< (benchmark - 5)) ticcntcolor2 = V_GREENMAP; else if (fps < 20) @@ -502,7 +503,8 @@ void SCR_DisplayTicRate(void) fps_string = va("%d/%d\x82", (INT32)fps, cap); else fps_string = va("%d\x82", (INT32)fps); - + + // draw "FPS" if (cv_ticrate.value == 3) V_DrawRightAlignedString(319, 181, V_YELLOWMAP|fpsflags, "FPS"); @@ -518,7 +520,7 @@ void SCR_DisplayLocalPing(void) UINT32 ping = playerpingtable[consoleplayer]; INT32 pingflags = V_LocalTransFlag()|V_SNAPTOBOTTOM|V_SNAPTORIGHT; - if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level + if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain -- 2.54.0 From 3bde3b04aeab6f6ae5275b042e71826dc0cf20c8 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 22 Jan 2025 19:05:10 +0100 Subject: [PATCH 273/325] try just passing the sector + add 50 trillion extra checks idk anymore but this is literally now how vanilla kart behaved --- src/r_main.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/r_main.c b/src/r_main.c index abe049acd..1feec3dc6 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1071,7 +1071,7 @@ subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y) mobj_t *viewmobj; -static void R_SetupCommonFrame(player_t * player, subsector_t * subsector) +static void R_SetupCommonFrame(player_t * player, sector_t * sector) { newview->player = player; @@ -1081,8 +1081,8 @@ static void R_SetupCommonFrame(player_t * player, subsector_t * subsector) newview->roll = R_ViewRollAngle(player); - if (subsector && subsector->sector) - newview->sector = subsector->sector; + if (sector != NULL) + newview->sector = sector; else newview->sector = R_PointInSubsector(newview->x, newview->y)->sector; @@ -1212,10 +1212,10 @@ void R_SkyboxFrame(int s) } #undef SETUPSKYVIEW - if (!P_MobjWasRemoved(viewmobj)) + if (!P_MobjWasRemoved(viewmobj) && viewmobj->subsector && viewmobj->subsector->sector) subsector = viewmobj->subsector; - R_SetupCommonFrame(player, subsector); + R_SetupCommonFrame(player, subsector->sector); } void R_SetupFrame(int s, boolean skybox) @@ -1223,7 +1223,7 @@ void R_SetupFrame(int s, boolean skybox) player_t *player = &players[displayplayers[s]]; camera_t *thiscam = &camera[s]; boolean chasecam = (cv_chasecam[s].value); - subsector_t * subsector = NULL; + sector_t * sector = NULL; R_SetViewContext(VIEWCONTEXT_PLAYER1 + s); if (thiscam->reset) @@ -1263,10 +1263,10 @@ void R_SetupFrame(int s, boolean skybox) newview->y = viewmobj->y; newview->z = viewmobj->z + 20*FRACUNIT; - if (!P_MobjWasRemoved(viewmobj)) - subsector = viewmobj->subsector; + if (!P_MobjWasRemoved(viewmobj) && viewmobj->subsector && viewmobj->subsector->sector) + sector = viewmobj->subsector->sector; - R_SetupCommonFrame(player, subsector); + R_SetupCommonFrame(player, sector); } else if (thiscam && chasecam) // use outside cam view { @@ -1276,10 +1276,10 @@ void R_SetupFrame(int s, boolean skybox) newview->y = thiscam->y; newview->z = thiscam->z + (thiscam->height>>1); - if (thiscam != NULL) - subsector = thiscam->subsector; + if (thiscam != NULL && thiscam->subsector && thiscam->subsector->sector) + sector = thiscam->subsector->sector; - R_SetupCommonFrame(player, subsector); + R_SetupCommonFrame(player, sector); } else // use the player's eyes view { @@ -1290,10 +1290,10 @@ void R_SetupFrame(int s, boolean skybox) newview->y = viewmobj->y; newview->z = player->viewz; - if (!P_MobjWasRemoved(viewmobj)) - subsector = viewmobj->subsector; + if (!P_MobjWasRemoved(viewmobj) && viewmobj->subsector && viewmobj->subsector->sector) + sector = viewmobj->subsector->sector; - R_SetupCommonFrame(player, subsector); + R_SetupCommonFrame(player, sector); } } -- 2.54.0 From 341d592001501da67c704dde0460b433fcd380c4 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 7 Mar 2025 14:45:28 +0100 Subject: [PATCH 274/325] show smol notice in stat and ra menu when game is modded --- src/m_menu.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/m_menu.c b/src/m_menu.c index e1b00d4ac..be0b3131f 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -475,6 +475,12 @@ static void Dummystaff_OnChange(void); // crap to force hud to show when in saturns hud options boolean forceshowhud = false; +// smol text indicating if game is modified +// so ppl dont wonder where their ra times went and stuff +#define SHOWMODDEDGAME \ + if (savemoddata) \ + V_DrawThinString(0, 0, V_REDMAP|V_SNAPTOTOP|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, ("Modified Game")); + // ========================================================================== // CONSOLE VARIABLES AND THEIR POSSIBLE VALUES GO HERE. // ========================================================================== @@ -8673,6 +8679,8 @@ static void M_DrawStatsMaps(void) extraemblem_t *exemblem; boolean dotopname = true, dobottomarrow = (location < statsMax); + SHOWMODDEDGAME + for (j = 0; j < NUMMAPS; j++) { if (!mapheaderinfo[j] || !(mapheaderinfo[j]->menuflags & LF2_RECORDATTACK)) @@ -8816,6 +8824,8 @@ static void M_DrawStatsPlaytime(void) if (kartstats.vanilla) return; + SHOWMODDEDGAME + DRAWTIMESTAT(82, "RA Play Time:", raplaytime); DRAWTIMESTAT(92, "Online Play Time:", onlineplaytime); DRAWTIMESTAT(102, "Race Play Time:", raceplaytime); @@ -8825,6 +8835,8 @@ static void M_DrawStatsPlaytime(void) // Note: only available with non-vanilla stats loaded, so it doesn't check for that static void M_DrawStatsExtra(void) { + SHOWMODDEDGAME + DRAWTIMESTAT(42, "Time being SPB target:", spbtargettime); DRAWTIMESTAT(52, "Time spent in spinout:", spinouttime); @@ -8946,6 +8958,8 @@ void M_DrawTimeAttackMenu(void) x = currentMenu->x; y = currentMenu->y; + SHOWMODDEDGAME + // Character face! if (W_CheckNumForName(skins[cv_chooseskin.value-1].facewant) != LUMPERROR) { -- 2.54.0 From e9831745591a5ffc6006175171e024a8c0976b81 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Mar 2025 12:47:46 +0100 Subject: [PATCH 275/325] another check for realpatch lel --- src/r_data.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/r_data.c b/src/r_data.c index b88554c9f..26fdb06aa 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -389,6 +389,11 @@ static UINT8 *R_GenerateTexture(size_t texnum) for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) { realpatch = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE); + + // Well, it's not valid... + if (realpatch == NULL) + continue; + x1 = patch->originx; x2 = x1 + SHORT(realpatch->width); -- 2.54.0 From af2b22e91f8b538fe56e60a37471fb45841e020e Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 12 Feb 2025 17:32:07 +0100 Subject: [PATCH 276/325] cleanup P_SetupLevel removed bunch of pointless vars, moved some things into functions changed some stuff to be boolean --- src/p_setup.c | 445 +++++++++++++++++++++++++------------------------- src/p_setup.h | 7 +- src/w_wad.c | 3 +- 3 files changed, 224 insertions(+), 231 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index c88ee02fb..aaea89564 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -91,6 +91,9 @@ // unsigned char mapmd5[16]; +// true when level was loaded from netsave +boolean midgamejoin = false; + // // MAP related Lookup tables. // Store VERTEXES, LINEDEFS, SIDEDEFS, etc. @@ -247,8 +250,6 @@ static SINT8 partadd_stage = -1; static boolean partadd_replacescurrentmap = false; static boolean partadd_important = false; -SINT8 midgamejoin = 0; - /** Logs an error about a map being corrupt, then terminate. * This allows reporting highly technical errors for usefulness, without * confusing a novice map designer who simply needs to run ZenNode. @@ -2590,72 +2591,8 @@ static void P_InitMinimapInfo(void) minimapinfo.offs_y = FixedMul((minimapinfo.min_y + minimapinfo.map_h/2) << FRACBITS, minimapinfo.zoom); } -/** Loads a level from a lump or external wad. - * - * \param skipprecip If true, don't spawn precipitation. - * \todo Clean up, refactor, split up; get rid of the bloat. - */ -boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate) +static boolean P_RunSpecialWipe(boolean reloadinggamestate) { - // use gamemap to get map number. - // 99% of the things already did, so. - // Map header should always be in place at this point - INT32 i, loadprecip = 1, ranspecialwipe = 0; - INT32 loademblems = 1; - INT32 fromnetsave = 0; - midgamejoin = 0; - sector_t *ss; - boolean chase; - - levelloading = true; - - // This is needed. Don't touch. - maptol = mapheaderinfo[gamemap-1]->typeoflevel; - - CON_Drawer(); // let the user know what we are going to do - I_FinishUpdate(); // page flip or blit buffer - - // Initialize sector node list. - P_Initsecnode(); - - if (netgame || multiplayer) - cv_debug = botskin = 0; - - if (metalplayback) - G_StopMetalDemo(); - - // Clear CECHO messages - HU_ClearCEcho(); - - if (mapheaderinfo[gamemap-1]->runsoc[0] != '#') - P_RunSOC(mapheaderinfo[gamemap-1]->runsoc); - - if (cv_runscripts.value && mapheaderinfo[gamemap-1]->scriptname[0] != '#') - P_RunLevelScript(mapheaderinfo[gamemap-1]->scriptname); - - P_LevelInitStuff(reloadinggamestate); - - if (mapheaderinfo[gamemap-1]->forcecharacter[0] != '\0' - && atoi(mapheaderinfo[gamemap-1]->forcecharacter) != 255) - P_ForceCharacter(mapheaderinfo[gamemap-1]->forcecharacter); - - // chasecam on in chaos, race, coop - // chasecam off in match, tag, capture the flag - chase = true; // srb2kart: always on - - if (!dedicated) - { - for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) - { - if (!cv_chasecam[i].changed) - CV_SetValue(&cv_chasecam[i], chase); - } - } - - // Initial height of PointOfView - // will be set by player think. - players[consoleplayer].viewz = 1; - // Cancel all d_main.c fadeouts (keep fade in though). if (reloadinggamestate) wipegamestate = gamestate; // Don't fade if reloading the gamestate @@ -2688,7 +2625,7 @@ boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate) F_RunWipe(wipedefs[wipe_speclevel_towhite], false); F_RunWipe(wipedefs[wipe_level_final], false); } - + locstarttime = nowtime = lastwipetic; endtime = locstarttime + (3*TICRATE)/2; @@ -2709,162 +2646,15 @@ boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate) NetKeepAlive(); } - ranspecialwipe = 1; + return true; } - // Make sure all sounds are stopped before Z_FreeTags. - S_StopSounds(); + return false; +} - if (!S_PrecacheSound()) - S_ClearSfx(); - - // As oddly named as this is, this handles music only. - // We should be fine starting it here. - if (!reloadinggamestate) - S_InitMapMusic(); - - levelfadecol = (encoremode && !ranspecialwipe ? 122 : 120); - - // Let's fade to white here - // But only if we didn't do the encore startup wipe - if (!ranspecialwipe && !demo.rewinding && !reloadinggamestate) - { - if (rendermode != render_none) - { - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, levelfadecol); - - F_WipeEndScreen(); - F_RunWipe(wipedefs[(encoremode ? wipe_level_final : wipe_level_toblack)], false); - } - else //dedicated servers - { - F_RunWipe(wipedefs[(encoremode ? wipe_level_final : wipe_level_toblack)], false); - } - } - - // Reset the palette now all fades have been done - if (rendermode != render_none) - V_SetPaletteLump(GetPalette()); // Set the level palette - - // Print "SPEEDING OFF TO [ZONE] [ACT 1]..." - /*if (rendermode != render_none) - { - // Don't include these in the fade! - char tx[64]; - V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to...")); - snprintf(tx, 63, "%s%s%s", - mapheaderinfo[gamemap-1]->lvlttl, - (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart - ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " Zone"), - (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) ? va(", Act %s",mapheaderinfo[gamemap-1]->actnum) : ""); - V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); - I_UpdateNoVsync(); - }*/ - - LUA_InvalidateLevel(); - - for (ss = sectors; sectors+numsectors != ss; ss++) - { - Z_Free(ss->attached); - Z_Free(ss->attachedsolid); - } - - // Clear pointers that would be left dangling by the purge - R_FlushTranslationColormapCache(); - - Z_FreeTags(PU_LEVEL, PU_PURGELEVEL - 1); - -#if defined (WALLSPLATS) || defined (FLOORSPLATS) - // clear the splats from previous level - R_ClearLevelSplats(); -#endif - - mobjcache = NULL; - - R_InitializeLevelInterpolators(); - - P_InitThinkers(); - R_InitMobjInterpolators(); - P_InitCachedActions(); - - /// \note for not spawning precipitation, etc. when loading netgame snapshots - if (skipprecip) - { - fromnetsave = 1; - loadprecip = 0; - loademblems = 0; - midgamejoin = 1; - } - - // internal game map - maplumpname = G_BuildMapName(gamemap); - lastloadedmaplumpnum = W_CheckNumForName(maplumpname); - if (lastloadedmaplumpnum == INT16_MAX) - I_Error("Map %s not found.\n", maplumpname); - - curmapvirt = vres_GetMap(lastloadedmaplumpnum); - - R_ReInitColormaps(mapheaderinfo[gamemap-1]->palette, - (encoremode ? W_CheckNumForName(va("%sE", maplumpname)) : LUMPERROR)); - CON_SetupBackColormap(); - - // SRB2 determines the sky texture to be used depending on the map header. - P_SetupLevelSky(mapheaderinfo[gamemap-1]->skynum, true); - - numdmstarts = numredctfstarts = numbluectfstarts = 0; - - // reset the player starts - for (i = 0; i < MAXPLAYERS; i++) - playerstarts[i] = NULL; - for (i = 0; i < 2; i++) - skyboxmo[i] = NULL; - - P_ResetWaypoints(); - - P_MapStart(); - - if (lastloadedmaplumpnum) - P_LoadMapFromFile(); - - P_ResetDynamicSlopes(); - - P_LoadThings(); - - P_SpawnSecretItems(loademblems); - - P_InitMinimapInfo(); - - for (numcoopstarts = 0; numcoopstarts < MAXPLAYERS; numcoopstarts++) - if (!playerstarts[numcoopstarts]) - break; - - globalweather = mapheaderinfo[gamemap-1]->weather; - - // set up world state - P_SpawnSpecials(fromnetsave, reloadinggamestate); - - if (loadprecip) // ugly hack for P_NetUnArchiveMisc (and P_LoadNetGame) - P_SpawnPrecipitation(); - -#ifdef HWRENDER // not win32 only 19990829 by Kin - if (rendermode == render_opengl) - { - HWR_FreeExtraSubsectors(); - - // stuff like HWR_CreatePlanePolygons is called there - HWR_LoadLevel(); - } -#endif - - // oh god I hope this helps - // (addendum: apparently it does! - // none of this needs to be done because it's not the beginning of the map when - // a netgame save is being loaded, and could actively be harmful by messing with - // the client's view of the data.) - if (fromnetsave) - goto netgameskip; - // ========== +static void P_SetupPlayer(void) +{ + INT32 i; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) @@ -2915,7 +2705,7 @@ boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate) } } - if (realnumplayers) //this should also fix the dedicated crash bug. You only pick a player if one exists to be picked. + if (realnumplayers) // this should also fix the dedicated crash bug. You only pick a player if one exists to be picked. { i = P_RandomKey(realnumplayers); players[playersactive[i]].pflags |= PF_TAGIT; //choose our initial tagger before map starts. @@ -2984,10 +2774,213 @@ boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate) startedInFreePlay = true; } } +} - // =========== - // landing point for netgames. - netgameskip: +/** Loads a level from a lump or external wad. + * + * \param fromnetsave If true, skip some stuff because we're loading a netgame snapshot. + * \todo Clean up, refactor, split up; get rid of the bloat. + */ +boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate) +{ + // use gamemap to get map number. + // 99% of the things already did, so. + // Map header should always be in place at this point + INT32 i; + boolean ranspecialwipe = false; + sector_t *ss; + + midgamejoin = fromnetsave; // makes dynslopes run in P_Ticker/P_PreTicker to avoid synch issues and other stuff + + levelloading = true; + + // This is needed. Don't touch. + maptol = mapheaderinfo[gamemap-1]->typeoflevel; + + CON_Drawer(); // let the user know what we are going to do + I_FinishUpdate(); // page flip or blit buffer + + // Initialize sector node list. + P_Initsecnode(); + + if (netgame || multiplayer) + cv_debug = botskin = 0; + + if (metalplayback) + G_StopMetalDemo(); + + // Clear CECHO messages + HU_ClearCEcho(); + + if (mapheaderinfo[gamemap-1]->runsoc[0] != '#') + P_RunSOC(mapheaderinfo[gamemap-1]->runsoc); + + if (cv_runscripts.value && mapheaderinfo[gamemap-1]->scriptname[0] != '#') + P_RunLevelScript(mapheaderinfo[gamemap-1]->scriptname); + + P_LevelInitStuff(reloadinggamestate); + + if (mapheaderinfo[gamemap-1]->forcecharacter[0] != '\0' + && atoi(mapheaderinfo[gamemap-1]->forcecharacter) != 255) + P_ForceCharacter(mapheaderinfo[gamemap-1]->forcecharacter); + + if (!dedicated) + { + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + if (!cv_chasecam[i].changed) + CV_SetValue(&cv_chasecam[i], true); // srb2kart: always on + } + } + + // Initial height of PointOfView + // will be set by player think. + players[consoleplayer].viewz = 1; + + ranspecialwipe = P_RunSpecialWipe(reloadinggamestate); + + // Make sure all sounds are stopped before Z_FreeTags. + S_StopSounds(); + + if (!S_PrecacheSound()) + S_ClearSfx(); + + // As oddly named as this is, this handles music only. + // We should be fine starting it here. + if (!reloadinggamestate) + S_InitMapMusic(); + + levelfadecol = (encoremode && !ranspecialwipe ? 122 : 120); + + // Let's fade to white here + // But only if we didn't do the encore startup wipe + if (!ranspecialwipe && !demo.rewinding && !reloadinggamestate) + { + if (rendermode != render_none) + { + F_WipeStartScreen(); + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, levelfadecol); + F_WipeEndScreen(); + F_RunWipe(wipedefs[(encoremode ? wipe_level_final : wipe_level_toblack)], false); + } + else //dedicated servers + { + F_RunWipe(wipedefs[(encoremode ? wipe_level_final : wipe_level_toblack)], false); + } + } + + // Reset the palette now all fades have been done + if (rendermode != render_none) + V_SetPaletteLump(GetPalette()); // Set the level palette + + // Print "SPEEDING OFF TO [ZONE] [ACT 1]..." + /*if (rendermode != render_none) + { + // Don't include these in the fade! + char tx[64]; + V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to...")); + snprintf(tx, 63, "%s%s%s", + mapheaderinfo[gamemap-1]->lvlttl, + (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart + ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " Zone"), + (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) ? va(", Act %s",mapheaderinfo[gamemap-1]->actnum) : ""); + V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); + I_UpdateNoVsync(); + }*/ + + LUA_InvalidateLevel(); + + for (ss = sectors; sectors+numsectors != ss; ss++) + { + Z_Free(ss->attached); + Z_Free(ss->attachedsolid); + } + + // Clear pointers that would be left dangling by the purge + R_FlushTranslationColormapCache(); + + Z_FreeTags(PU_LEVEL, PU_PURGELEVEL - 1); + +#if defined (WALLSPLATS) || defined (FLOORSPLATS) + // clear the splats from previous level + R_ClearLevelSplats(); +#endif + + mobjcache = NULL; + + R_InitializeLevelInterpolators(); + + P_InitThinkers(); + R_InitMobjInterpolators(); + P_InitCachedActions(); + + // internal game map + maplumpname = G_BuildMapName(gamemap); + lastloadedmaplumpnum = W_CheckNumForName(maplumpname); + if (lastloadedmaplumpnum == INT16_MAX) + I_Error("Map %s not found.\n", maplumpname); + + curmapvirt = vres_GetMap(lastloadedmaplumpnum); + + R_ReInitColormaps(mapheaderinfo[gamemap-1]->palette, + (encoremode ? W_CheckNumForName(va("%sE", maplumpname)) : LUMPERROR)); + CON_SetupBackColormap(); + + // SRB2 determines the sky texture to be used depending on the map header. + P_SetupLevelSky(mapheaderinfo[gamemap-1]->skynum, true); + + numdmstarts = numredctfstarts = numbluectfstarts = 0; + + // reset the player starts + for (i = 0; i < MAXPLAYERS; i++) + playerstarts[i] = NULL; + for (i = 0; i < 2; i++) + skyboxmo[i] = NULL; + + P_ResetWaypoints(); + + P_MapStart(); + + if (lastloadedmaplumpnum) + P_LoadMapFromFile(); + + P_ResetDynamicSlopes(); + + P_LoadThings(); + + P_SpawnSecretItems(!fromnetsave); + + P_InitMinimapInfo(); + + for (numcoopstarts = 0; numcoopstarts < MAXPLAYERS; numcoopstarts++) + if (!playerstarts[numcoopstarts]) + break; + + globalweather = mapheaderinfo[gamemap-1]->weather; + + // set up world state + P_SpawnSpecials(fromnetsave, reloadinggamestate); + + if (!fromnetsave) // ugly hack for P_NetUnArchiveMisc (and P_LoadNetGame) + P_SpawnPrecipitation(); + +#ifdef HWRENDER // not win32 only 19990829 by Kin + if (rendermode == render_opengl) + { + HWR_FreeExtraSubsectors(); + + // stuff like HWR_CreatePlanePolygons is called there + HWR_LoadLevel(); + } +#endif + + // oh god I hope this helps + // (addendum: apparently it does! + // none of this needs to be done because it's not the beginning of the map when + // a netgame save is being loaded, and could actively be harmful by messing with + // the client's view of the data.) + if (!fromnetsave) + P_SetupPlayer(); if (!reloadinggamestate) { @@ -3037,7 +3030,7 @@ boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate) skyVisible = true; memset(skyVisiblePerPlayer, true, sizeof(skyVisiblePerPlayer)); - if (loadprecip) // uglier hack + if (!fromnetsave) // uglier hack { // to make a newly loaded level start on the second frame. INT32 buf = gametic % TICQUEUE; for (i = 0; i < MAXPLAYERS; i++) diff --git a/src/p_setup.h b/src/p_setup.h index e40169a76..5985fb016 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -19,11 +19,12 @@ #include "r_defs.h" #include "w_wad.h" -extern SINT8 midgamejoin; - // map md5, sent to players via PT_SERVERINFO extern unsigned char mapmd5[16]; +// true when level was loaded from netsave +extern boolean midgamejoin; + // Player spawn spots for deathmatch. #define MAX_DM_STARTS 64 extern mapthing_t *deathmatchstarts[MAX_DM_STARTS]; @@ -60,7 +61,7 @@ extern mapthing_t *mapthings; void P_SetupLevelSky(INT32 skynum, boolean global); void P_LoadThingsOnly(void); -boolean P_SetupLevel(boolean skipprecip, boolean reloadinggamestate); +boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate); #ifdef HWRENDER void HWR_LoadLevel(void); #endif diff --git a/src/w_wad.c b/src/w_wad.c index ad506240d..d49eff1b6 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1021,8 +1021,7 @@ UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump) return INT16_MAX; } -UINT16 -W_CheckNumForMarkerStartPwad (const char *name, UINT16 wad, UINT16 startlump) +UINT16 W_CheckNumForMarkerStartPwad (const char *name, UINT16 wad, UINT16 startlump) { UINT16 marker; marker = W_CheckNumForNamePwad(name, wad, startlump); -- 2.54.0 From 7d55c469795b2fa7d2bdcea63c8613f72ea31338 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 12 Feb 2025 17:55:23 +0100 Subject: [PATCH 277/325] make P_InitCamera slightly prettier --- src/p_setup.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index aaea89564..25ff8a94a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2502,25 +2502,25 @@ static void P_InitCamera(void) { INT32 i; - if (!dedicated) + if (dedicated) + return; + + for (i = 0; i <= splitscreen; i++) { - for (i = 0; i <= splitscreen; i++) - { - if (camera[i].freecam) - continue; + if (camera[i].freecam) + continue; - P_SetupCamera(displayplayers[i], &camera[i]); - } - - // Though, I don't think anyone would care about cam_rotate being reset back to the only value that makes sense :P - for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) - { - if (!cv_cam_rotate[i].changed) - CV_Set(&cv_cam_rotate[i], cv_cam_rotate[i].defaultvalue); - } - - displayplayers[0] = consoleplayer; // Start with your OWN view, please! + P_SetupCamera(displayplayers[i], &camera[i]); } + + // Though, I don't think anyone would care about cam_rotate being reset back to the only value that makes sense :P + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + if (!cv_cam_rotate[i].changed) + CV_Set(&cv_cam_rotate[i], cv_cam_rotate[i].defaultvalue); + } + + displayplayers[0] = consoleplayer; // Start with your OWN view, please! } static boolean P_CanSave(void) -- 2.54.0 From 2e6c1d9df44b4b9186b2adf5c3d7495cf772a9d0 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Mar 2025 12:51:50 +0100 Subject: [PATCH 278/325] revert this behaviour be more like vanilla --- src/d_main.c | 12 +++++------- src/d_net.c | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 3041f9a57..bbe81145d 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -187,13 +187,13 @@ static void D_GamePadMenuScrollTicker(void) return; // wish i had a switch ono - if (DPADUPSCROLL) + if (DPADUPSCROLL) key = KEY_UPARROW; - else if (DPADDOWNSCROLL) + else if (DPADDOWNSCROLL) key = KEY_DOWNARROW; - else if (DPADLEFTSCROLL) + else if (DPADLEFTSCROLL) key = KEY_LEFTARROW; - else if (DPADRIGHTSCROLL) + else if (DPADRIGHTSCROLL) key = KEY_RIGHTARROW; if (key) @@ -584,8 +584,6 @@ static boolean D_Display(void) PS_START_TIMING(ps_uitime); ST_Drawer(); HU_Drawer(); - - NetUpdate(); // TEST: run this EVERY frame } else { @@ -830,7 +828,7 @@ void D_SRB2Loop(void) { renderdeltatics = FLOAT_TO_FIXED(deltatics); - if (!(paused || P_AutoPause()) && !hu_stopped) + if (!(paused || P_AutoPause()) && deltatics < 1.0 && !hu_stopped) { rendertimefrac = g_time.timefrac; } diff --git a/src/d_net.c b/src/d_net.c index 16156ca06..d6b0e2f80 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -1340,9 +1340,9 @@ boolean D_CheckNetGame(void) I_Error("Too many nodes (%d), max:%d", doomcom->numnodes, MAXNETNODES); netbuffer = (doomdata_t *)(void *)&doomcom->data; - #ifdef HOLEPUNCH +#ifdef HOLEPUNCH holepunchpacket = (holepunch_t *)(void *)&doomcom->data; - #endif +#endif #ifdef DEBUGFILE if (M_CheckParm("-debugfile")) -- 2.54.0 From ec7fa833d50181c80a14e3ffa76f4717116e6f1c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Mar 2025 12:53:44 +0100 Subject: [PATCH 279/325] only ever touch this if player has a mobj angleturn is broken in kart --- src/g_game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 68dd71d08..426a70a9d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1669,7 +1669,8 @@ void G_FixCamera(UINT8 view) // The order of displayplayers can change, which would // invalidate localangle. - localangle[view - 1] = (angle_t)(player->cmd.angleturn << 16); + if (!P_MobjWasRemoved(player->mo)) + localangle[view - 1] = player->mo->angle; P_ResetCamera(player, &camera[view - 1]); -- 2.54.0 From d55d7e0efc46ad9f408dd937792004cd813df37f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 29 Jan 2025 00:32:20 +0100 Subject: [PATCH 280/325] smol replay fixes from rr --- src/g_game.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 426a70a9d..b9a23ca16 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4891,6 +4891,7 @@ void G_WriteAllGhostTics(void) UINT8 *save_demo_p = demobuf.p; #define CHECKSPACE(num) if (demobuf.p+(num) > demoend) { demobuf.p = save_demo_p; G_CheckDemoStatus(); return; } + boolean toobig = false; INT32 i, counter = leveltime; for (i = 0; i < MAXPLAYERS; i++) @@ -4903,18 +4904,32 @@ void G_WriteAllGhostTics(void) counter++; - if (counter % cv_netdemosyncquality.value != 0) // Only write 1 in this many ghost datas per tic to cut down on multiplayer replay size. + if (multiplayer && ((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(demobuf.p, i); G_WriteGhostTic(players[i].mo, i); + + // attention here for the ticcmd size! + // latest demos with mouse aiming byte in ticcmd + if (demobuf.p >= demoend - (13 + 9 + 9)) + { + toobig = true; + break; + } } CHECKSPACE(1); WRITEUINT8(demobuf.p, 0xFF); + if (toobig) + { + G_CheckDemoStatus(); // no more space + return; + } + #undef CHECKSPACE } @@ -5112,23 +5127,17 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) } *ziptic_p = ziptic; - - // attention here for the ticcmd size! - // latest demos with mouse aiming byte in ticcmd - if (demobuf.p >= demoend - (13 + 9)) - { - G_CheckDemoStatus(); // no more space - return; - } #undef CHECKSPACE } void G_ConsAllGhostTics(void) { - if (!demobuf.p) + UINT8 p; + + if (!demobuf.p || !demo.deferstart) return; - UINT8 p = READUINT8(demobuf.p); + p = READUINT8(demobuf.p); while (p != 0xFF) { @@ -5154,8 +5163,6 @@ void G_ConsGhostTic(INT32 playernum) fixed_t syncleeway; boolean nightsfail = false; - if (!demobuf.p || !demo.deferstart) - return; if (!(demoflags & DF_GHOST)) return; // No ghost data to use. -- 2.54.0 From ad65e3e9689b05aa68738b9ab50354f10fb0781e Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 17:56:35 +0100 Subject: [PATCH 281/325] allocate some extra buffer for demobuffer incase this might overflow that we dont write to unvalid memory thx indev <3 --- src/g_game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index b9a23ca16..b75060cff 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -6004,7 +6004,7 @@ void G_RecordDemo(const char *name) maxsize = cv_maxdemosize.value*1024*1024; - demobuf.buffer = Z_Malloc(maxsize, PU_STATIC, NULL); + demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL); demoend = demobuf.buffer + maxsize; if (demobuf.buffer) @@ -6022,7 +6022,7 @@ void G_RecordMetal(void) Z_Free(demobuf.buffer); demobuf.p = NULL; metalrecording = false; - demobuf.buffer = Z_Malloc(maxsize, PU_STATIC, NULL); + demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL); demoend = demobuf.buffer + maxsize; if (demobuf.buffer) -- 2.54.0 From 0ed21a171da111495652aa94f72c1ec7a37c70e1 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Mar 2025 12:58:18 +0100 Subject: [PATCH 282/325] remove stray bool in demovars struct --- src/g_game.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/g_game.h b/src/g_game.h index 1b618f4e0..fa427b752 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -66,9 +66,6 @@ struct demovars_s { DSM_WILLSAVE, DSM_SAVED } savemode; - - boolean freecam; - }; extern struct demovars_s demo; -- 2.54.0 From ad39ade2862973b9de8cae4e731d185c3e845c73 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 11 Feb 2025 19:21:38 +0100 Subject: [PATCH 283/325] split screentexture width and height most displays are widescreen, so their width and height differ quite significantly, this may make the overall screentexture alot smaller --- src/hardware/r_opengl/r_opengl.c | 78 ++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 0db93e19d..d2224e118 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -2853,7 +2853,7 @@ void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2]) INT32 x, y; float float_x, float_y, float_nextx, float_nexty; float xfix, yfix; - INT32 texsize = 512; + INT32 texsizew = 512, texsizey = 512; const float blackBack[16] = { @@ -2867,12 +2867,15 @@ void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2]) return; // look for power of two that is large enough for the screen - while (texsize < screen_width || texsize < screen_height) - texsize <<= 1; + while (texsizew < screen_width) + texsizew <<= 1; + + while (texsizey < screen_height) + texsizey <<= 1; // X/Y stretch fix for all resolutions(!) - xfix = (float)(texsize)/((float)((screen_width)/(float)(SCREENVERTS-1))); - yfix = (float)(texsize)/((float)((screen_height)/(float)(SCREENVERTS-1))); + xfix = (float)(texsizew)/((float)((screen_width)/(float)(SCREENVERTS-1))); + yfix = (float)(texsizey)/((float)((screen_height)/(float)(SCREENVERTS-1))); pglDisable(GL_DEPTH_TEST); pglDisable(GL_BLEND); @@ -2945,7 +2948,7 @@ void GL_FlushScreenTextures(void) void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags) { float xfix, yfix; - INT32 texsize = 512; + INT32 texsizew = 512, texsizey = 512; const float screenVerts[12] = { @@ -2961,11 +2964,14 @@ void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags) return; // look for power of two that is large enough for the screen - while (texsize < screen_width || texsize < screen_height) - texsize <<= 1; + while (texsizew < screen_width) + texsizew <<= 1; - xfix = 1/((float)(texsize)/((float)((screen_width)))); - yfix = 1/((float)(texsize)/((float)((screen_height)))); + while (texsizey < screen_height) + texsizey <<= 1; + + xfix = 1/((float)(texsizew)/((float)((screen_width)))); + yfix = 1/((float)(texsizey)/((float)((screen_height)))); // const float screenVerts[12] @@ -2998,7 +3004,7 @@ void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags) // Do screen fades! void GL_DoScreenWipe(int wipeStart, int wipeEnd) { - INT32 texsize = 512; + INT32 texsizew = 512, texsizey = 512; float xfix, yfix; INT32 fademaskdownloaded = tex_downloaded; // the fade mask that has been set @@ -3025,11 +3031,14 @@ void GL_DoScreenWipe(int wipeStart, int wipeEnd) return; // look for power of two that is large enough for the screen - while (texsize < screen_width || texsize < screen_height) - texsize <<= 1; + while (texsizew < screen_width) + texsizew <<= 1; - xfix = 1/((float)(texsize)/((float)((screen_width)))); - yfix = 1/((float)(texsize)/((float)((screen_height)))); + while (texsizey < screen_height) + texsizey <<= 1; + + xfix = 1/((float)(texsizew)/((float)((screen_width)))); + yfix = 1/((float)(texsizey)/((float)((screen_height)))); // const float screenVerts[12] @@ -3089,7 +3098,7 @@ void GL_DoScreenWipe(int wipeStart, int wipeEnd) void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize) { - INT32 texsize = 512; + INT32 texsizew = 512, texsizey = 512; int tex = HWD_SCREENTEXTURE_VHS; float xfix, yfix; float fix[8]; @@ -3108,11 +3117,14 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 return; // look for power of two that is large enough for the screen - while (texsize < screen_width || texsize < screen_height) - texsize <<= 1; + while (texsizew < screen_width) + texsizew <<= 1; - xfix = 1/((float)(texsize)/((float)((screen_width)))); - yfix = 1/((float)(texsize)/((float)((screen_height)))); + while (texsizey < screen_height) + texsizey <<= 1; + + xfix = 1/((float)(texsizew)/((float)((screen_width)))); + yfix = 1/((float)(texsizey)/((float)((screen_height)))); // Slight fuzziness GL_MakeScreenTexture(tex); @@ -3196,15 +3208,18 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 // Create a texture from the screen. void GL_MakeScreenTexture(int tex) { - INT32 texsize = 512; + INT32 texsizew = 512, texsizey = 512; boolean firstTime = (screenTextures[tex] == 0); if (!gl_enable_screen_textures) return; // look for power of two that is large enough for the screen - while (texsize < screen_width || texsize < screen_height) - texsize <<= 1; + while (texsizew < screen_width) + texsizew <<= 1; + + while (texsizey < screen_height) + texsizey <<= 1; // Create screen texture if (firstTime) @@ -3217,10 +3232,10 @@ void GL_MakeScreenTexture(int tex) pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); Clamp2D(GL_TEXTURE_WRAP_S); Clamp2D(GL_TEXTURE_WRAP_T); - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsizew, texsizey, 0); } else - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsizew, texsizey); tex_downloaded = screenTextures[tex]; } @@ -3231,7 +3246,7 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh float origaspect, newaspect; float xoff = 1, yoff = 1; // xoffset and yoffset for the polygon to have black bars around the screen FRGBAFloat clearColour; - INT32 texsize = 512; + INT32 texsizew = 512, texsizey = 512; float off[12]; float fix[8]; @@ -3240,11 +3255,14 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh return; // look for power of two that is large enough for the screen - while (texsize < screen_width || texsize < screen_height) - texsize <<= 1; + while (texsizew < screen_width) + texsizew <<= 1; - xfix = 1/((float)(texsize)/((float)((screen_width)))); - yfix = 1/((float)(texsize)/((float)((screen_height)))); + while (texsizey < screen_height) + texsizey <<= 1; + + xfix = 1/((float)(texsizew)/((float)((screen_width)))); + yfix = 1/((float)(texsizey)/((float)((screen_height)))); origaspect = (float)screen_width / screen_height; newaspect = (float)width / height; -- 2.54.0 From e2b42b164753b52f3af351f74c064e5a68046914 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 3 Mar 2025 11:14:09 +0100 Subject: [PATCH 284/325] delet memcpy doing nothing --- src/hardware/r_opengl/r_opengl.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index d2224e118..3b9c3bac5 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -109,7 +109,6 @@ static GLint min_filter = GL_LINEAR; static GLint mag_filter = GL_LINEAR; static GLint anisotropic_filter = 0; boolean supportMipMap = false; -static FTransform md2_transform; const GLubyte *gl_version = NULL; const GLubyte *gl_renderer = NULL; @@ -2767,9 +2766,6 @@ void GL_SetTransform(FTransform *stransform) { used_fov = stransform->fovangle; shearing = stransform->shearing; - // keep a trace of the transformation for md2 - memcpy(&md2_transform, stransform, sizeof (md2_transform)); - if (stransform->mirror) pglScalef(-stransform->scalex, stransform->scaley, -stransform->scalez); @@ -3319,7 +3315,7 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh pglVertexPointer(3, GL_FLOAT, 0, off); pglDrawArrays(GL_TRIANGLE_FAN, 0, 4); - + if (useshader) pglUseProgram(0); -- 2.54.0 From 0b57389dcda4d6394a15835a4bcc58ed68815b97 Mon Sep 17 00:00:00 2001 From: Anonimus Date: Wed, 5 Mar 2025 22:37:32 -0500 Subject: [PATCH 285/325] HUD patch rotation --- LUASTUFF.md | 4 +++ src/lua_hudlib.c | 23 ++++++++++++++++ src/w_wad.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ src/w_wad.h | 8 ++++++ 4 files changed, 105 insertions(+) diff --git a/LUASTUFF.md b/LUASTUFF.md index d753723f1..881cbe4f7 100644 --- a/LUASTUFF.md +++ b/LUASTUFF.md @@ -28,6 +28,10 @@ exist. Returns the values of the given HUD item's `xoffset`/`yoffset` cvars. Available for any HUD item with offset cvars. +## patch = v.cachePatchRotated(name, rollangle) +Like v.cachePatch, it caches a new patch with the corresponding name. Unlike v.cachePatch, however, +a rollangle can be supplied to the function so that it returns a rotated patch instead. + ## x, y, flags = v.getDrawInfo(item) Returns the X, Y and flags where the given HUD item will be drawn for the current displayplayer. diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index f7847b4a6..318ba279b 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -397,6 +397,25 @@ static int libd_cachePatch(lua_State *L) return 1; } +#ifdef ROTSPRITE +static int libd_cachePatchRotated(lua_State *L) +{ + HUDONLY + if ((cv_spriteroll.value)) + { + angle_t rollangle = luaL_checkangle(L, 2); + INT32 rot = R_GetRollAngle(rollangle); + + LUA_PushUserdata(L, W_CachePatchNameRotated(luaL_checkstring(L, 1), rot, PU_STATIC), META_PATCH); + } + else + { + LUA_PushUserdata(L, W_CachePatchName(luaL_checkstring(L, 1), PU_STATIC), META_PATCH); + } + return 1; +} +#endif + // this is structured like getSprite2Patch in vanilla 2.2 // v.getSpritePatch(skin, sprite, [frame, [angle, [rollangle]]]) static int libd_getSpritePatch(lua_State *L) @@ -1175,6 +1194,10 @@ static int libd_interpLatch(lua_State *L) static luaL_Reg lib_draw[] = { {"patchExists", libd_patchExists}, {"cachePatch", libd_cachePatch}, +#ifdef ROTSPRITE + // Is this ifdef nonsense? Yes. + {"cachePatchRotated", libd_cachePatchRotated}, +#endif {"draw", libd_draw}, {"drawScaled", libd_drawScaled}, {"drawStretched", libd_drawStretched}, diff --git a/src/w_wad.c b/src/w_wad.c index d49eff1b6..95e5c31ac 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -71,6 +71,10 @@ #include "hardware/hw_glob.h" #endif +#ifdef ROTSPRITE +#include "r_patch.h" // RotatedPatch_Create +#endif + #ifndef O_BINARY #define O_BINARY 0 #endif @@ -822,6 +826,11 @@ UINT16 W_InitFile(const char *filename, boolean local) wadfile->hwrcache = M_AATreeAlloc(AATREE_ZUSER); #endif +#ifdef ROTSPRITE + // allocates rotsprite structures and store them in a tree + wadfile->rotcache = M_AATreeAlloc(AATREE_ZUSER); +#endif + // // add the wadfile // @@ -1738,6 +1747,24 @@ void *W_CachePatchNum(lumpnum_t lumpnum, INT32 tag) #endif // HWRENDER +#ifdef ROTSPRITE +// Caches a rotsprite for patch rotation. +void *W_GetCachedRotPatchPwad(UINT16 wadnum, UINT16 lumpnum) +{ + aatree_t *rotcache = wadfiles[wadnum]->rotcache; + rotsprite_t *rspr; + + if (!(rspr = M_AATreeGet(rotcache, lumpnum))) + { + rspr = RotatedPatch_Create(ROTANGLES); + M_AATreeSet(rotcache, lumpnum, rspr); + } + + return (void *)rspr; +} + +#endif // ROTSPRITE + void W_UnlockCachedPatch(void *patch) { if (!patch) @@ -1766,6 +1793,49 @@ void *W_CachePatchName(const char *name, INT32 tag) return W_CachePatchNum(num, tag); } +#ifdef ROTSPRITE +// Caches a patch, and if needed, rotates said patch. +void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag) +{ + lumpnum_t num; + patch_t *ptr; + rotsprite_t *rspr; + INT32 idx = rotationangle; + + const char *finalname = name; + + num = W_CheckNumForName(finalname); + + // No rotation? No need to do any of this nonsense. + if (rotationangle < 1 || rotationangle >= ROTANGLES) + return W_CachePatchNum(num, tag); + + rspr = (rotsprite_t *)W_GetCachedRotPatchPwad(WADFILENUM(num),LUMPNUM(num)); + + if (rspr->patches[idx] == NULL) + { + INT32 xpivot = 0, ypivot = 0; + + if (num == LUMPERROR) + ptr = (patch_t *)(W_CacheLumpNum(W_GetNumForName("MISSING"), PU_STATIC)); + ptr = (patch_t *)(W_CacheLumpNum(num, PU_STATIC)); + + // >y pivot centered + // >x pivot not centered + // Why? + xpivot = ptr->width / 2; + ypivot = ptr->height / 2; + + RotatedPatch_DoRotation(rspr, ptr, rotationangle, xpivot, ypivot, false); + + // free image data + Z_Free(ptr); + } + + return rspr->patches[idx]; +} +#endif + #ifndef NOMD5 /** diff --git a/src/w_wad.h b/src/w_wad.h index fd2038db2..fd350f6b8 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -129,6 +129,9 @@ typedef struct wadfile_s lumpcache_t *lumpcache; #ifdef HWRENDER aatree_t *hwrcache; // patches are cached in renderer's native format +#endif +#ifdef ROTSPRITE + aatree_t *rotcache; // Cache rotsprites for rotating patches. #endif UINT16 numlumps; // this wad's number of resources FILE *handle; @@ -220,6 +223,11 @@ void *W_CachePatchNum(lumpnum_t lumpnum, INT32 tag); // return a patch_t #define W_CachePatchNum(lumpnum, tag) W_CacheLumpNum(lumpnum, tag) #endif +#ifdef ROTSPRITE +void *W_GetCachedRotPatchPwad(UINT16 wadnum, UINT16 lumpnum); // Get patch-based rotsprites from the cache. +void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag); +#endif + void W_UnlockCachedPatch(void *patch); void W_VerifyFileMD5(UINT16 wadfilenum, const char *matchmd5); -- 2.54.0 From ac9926eb178673098c545c6e6083af42e138fd3c Mon Sep 17 00:00:00 2001 From: Indev Date: Thu, 6 Mar 2025 19:43:24 +0300 Subject: [PATCH 286/325] spriteroll doesn't exist now :p --- src/lua_hudlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 318ba279b..7d5d03a80 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -401,7 +401,7 @@ static int libd_cachePatch(lua_State *L) static int libd_cachePatchRotated(lua_State *L) { HUDONLY - if ((cv_spriteroll.value)) + if (cv_sloperoll.value) { angle_t rollangle = luaL_checkangle(L, 2); INT32 rot = R_GetRollAngle(rollangle); -- 2.54.0 From ffe9a89552a8d32f85c2e442c820aa272b924333 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 7 Mar 2025 09:51:29 +0100 Subject: [PATCH 287/325] remove erronous cv_sloperoll checks this cvar is meant to be only the toggle for the player slope rotation, however, spriterotation should still be usable in any case with this disabled. the global toggle "cv_spriteroll" has been removed --- src/hardware/hw_main.c | 4 ++-- src/hardware/hw_md2.c | 2 +- src/lua_hudlib.c | 18 ++++++------------ src/m_menu.c | 15 ++------------- src/r_main.c | 2 +- src/r_things.c | 4 ++-- 6 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index bba811dc8..44415d486 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4578,8 +4578,8 @@ static void HWR_ProjectSprite(mobj_t *thing) #ifdef ROTSPRITE // determine here if sprite should rotate for optimization - const boolean sliprollrotate = (cv_sloperoll.value && cv_sliptideroll.value && (thing->player && thing->player->sliproll)); - const boolean shouldrotate = (cv_sloperoll.value && (interp.roll || interp.pitch || interp.sloperoll || interp.slopepitch || thing->rollangle || sliprollrotate)); + const boolean sliprollrotate = (cv_sliptideroll.value && (thing->player && thing->player->sliproll)); + const boolean shouldrotate = (interp.roll || interp.pitch || interp.sloperoll || interp.slopepitch || thing->rollangle || sliprollrotate); #endif //Fab : 02-08-98: 'skin' override spritedef currently used for skin diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 7eaa698f7..cf934d725 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1381,7 +1381,7 @@ void HWR_DrawMD2(gl_vissprite_t *spr) p.angley = FIXED_TO_FLOAT(anglef); } - const angle_t sliptideroll = ((cv_sloperoll.value && cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0); + const angle_t sliptideroll = ((cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0); const SINT8 flipfactor = flip ? -1 : 1; if (spr->mobj->rollangle || sliptideroll) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 7d5d03a80..ccafd59aa 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -401,17 +401,10 @@ static int libd_cachePatch(lua_State *L) static int libd_cachePatchRotated(lua_State *L) { HUDONLY - if (cv_sloperoll.value) - { - angle_t rollangle = luaL_checkangle(L, 2); - INT32 rot = R_GetRollAngle(rollangle); + angle_t rollangle = luaL_checkangle(L, 2); + INT32 rot = R_GetRollAngle(rollangle); + LUA_PushUserdata(L, W_CachePatchNameRotated(luaL_checkstring(L, 1), rot, PU_STATIC), META_PATCH); - LUA_PushUserdata(L, W_CachePatchNameRotated(luaL_checkstring(L, 1), rot, PU_STATIC), META_PATCH); - } - else - { - LUA_PushUserdata(L, W_CachePatchName(luaL_checkstring(L, 1), PU_STATIC), META_PATCH); - } return 1; } #endif @@ -508,12 +501,13 @@ static int libd_getSpritePatch(lua_State *L) angle = (angle & 7); // modulus angle by 8 // rotsprite????? - if (lua_isnumber(L, 4) && cv_sloperoll.value) + if (lua_isnumber(L, 4)) { angle_t rollangle = luaL_checkangle(L, 4); INT32 rot = R_GetRollAngle(rollangle); - if (rot) { + if (rot) + { patch_t *rotsprite = Patch_GetRotatedSprite(sprframe, frame, angle, sprframe->flip & (1<mo)) + if (!cv_sliptideroll.value || !player || P_MobjWasRemoved(player->mo)) return 0; mo = player->mo; diff --git a/src/r_things.c b/src/r_things.c index 7d7538941..5f4e6810a 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1233,8 +1233,8 @@ static void R_ProjectSprite(mobj_t *thing) #ifdef ROTSPRITE // determine here if sprite should rotate for optimization - const boolean sliprollrotate = (cv_sloperoll.value && cv_sliptideroll.value && (thing->player && thing->player->sliproll)); - const boolean shouldrotate = (cv_sloperoll.value && (interp.roll || interp.pitch || interp.sloperoll || interp.slopepitch || thing->rollangle || sliprollrotate)); + const boolean sliprollrotate = (cv_sliptideroll.value && (thing->player && thing->player->sliproll)); + const boolean shouldrotate = (interp.roll || interp.pitch || interp.sloperoll || interp.slopepitch || thing->rollangle || sliprollrotate); #endif //Fab : 02-08-98: 'skin' override spritedef currently used for skin -- 2.54.0 From 71378285b262596ae180ccd6b289493a32ad4799 Mon Sep 17 00:00:00 2001 From: Indev Date: Sat, 8 Mar 2025 18:13:40 +0300 Subject: [PATCH 288/325] Check for missing patch earlier in W_CachePatchNameRotated --- src/w_wad.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index 95e5c31ac..5445e2969 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1806,6 +1806,9 @@ void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag) num = W_CheckNumForName(finalname); + if (num == LUMPERROR) + num = W_GetNumForName("MISSING"); + // No rotation? No need to do any of this nonsense. if (rotationangle < 1 || rotationangle >= ROTANGLES) return W_CachePatchNum(num, tag); @@ -1816,8 +1819,6 @@ void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag) { INT32 xpivot = 0, ypivot = 0; - if (num == LUMPERROR) - ptr = (patch_t *)(W_CacheLumpNum(W_GetNumForName("MISSING"), PU_STATIC)); ptr = (patch_t *)(W_CacheLumpNum(num, PU_STATIC)); // >y pivot centered -- 2.54.0 From e802ecf0b5ddf884dbf5a3f2a1b826a5c83bf4d6 Mon Sep 17 00:00:00 2001 From: Indev Date: Sat, 8 Mar 2025 18:14:19 +0300 Subject: [PATCH 289/325] Add SHORT here for consistency with other code --- src/w_wad.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index 5445e2969..82d71c814 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1824,8 +1824,8 @@ void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag) // >y pivot centered // >x pivot not centered // Why? - xpivot = ptr->width / 2; - ypivot = ptr->height / 2; + xpivot = SHORT(ptr->width) / 2; + ypivot = SHORT(ptr->height) / 2; RotatedPatch_DoRotation(rspr, ptr, rotationangle, xpivot, ypivot, false); -- 2.54.0 From d2975d2dcb0e58f4977147a35fb5d4e17d651fd1 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 19 Feb 2025 12:05:29 +0100 Subject: [PATCH 290/325] toggle for keeping driftsparks while in air --- src/k_kart.c | 6 +++++- src/k_kart.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5cd754e09..6349e7bd9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -85,6 +85,8 @@ consvar_t cv_bananajitter = {"bananadragjitter", "Off", CV_SAVE, CV_OnOff, NULL, static CV_PossibleValue_t bananthrowroll_cons_t[] = {{0, "Off"}, {1, "Throw"}, {2, "+Onground"}, {0, NULL}}; consvar_t cv_bananthrowroll = {"bananthrowroll", "0", CV_SAVE, bananthrowroll_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_airsparks = {"airdriftsparks", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + //extra hud things consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -840,6 +842,8 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_bananajitter); CV_RegisterVar(&cv_bananthrowroll); + CV_RegisterVar(&cv_airsparks); + CV_RegisterVar(&cv_showstats); CV_RegisterVar(&cv_showinput); @@ -3232,7 +3236,7 @@ static void K_SpawnDriftSparks(player_t *player) if (leveltime % 2 == 1) return; - if (!P_IsObjectOnGround(player->mo)) + if (!cv_airsparks.value && !P_IsObjectOnGround(player->mo)) return; if (!player->kartstuff[k_drift] || player->kartstuff[k_driftcharge] < K_GetKartDriftSparkValue(player)) diff --git a/src/k_kart.h b/src/k_kart.h index dde5e21af..75727f072 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -26,6 +26,7 @@ void K_RegisterKartStuff(void); extern consvar_t cv_coloredspeedlines, cv_coloredsneakertrail; extern consvar_t cv_bananajitter; extern consvar_t cv_bananthrowroll; +extern consvar_t cv_airsparks; extern consvar_t cv_colorizedhud, cv_colorizeditembox, cv_colorizedhudcolor; extern consvar_t cv_darkitembox; extern consvar_t cv_biglaps; -- 2.54.0 From b8cab84d2a5125718e46ff5c22174726228cc093 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 28 Jan 2025 17:37:52 +0100 Subject: [PATCH 291/325] super smol optimization --- src/k_kart.c | 17 +++++++++-------- src/p_mobj.c | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 6349e7bd9..1177543cf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3507,6 +3507,7 @@ void K_RollMobjBySlopes(mobj_t* mo, pslope_t *slope) const boolean usedistance = cv_sloperolldist.value && !splitscreen; const fixed_t rolldist = cv_sloperolldist.value * mapobjectscale; const fixed_t m_dist = usedistance ? R_PointToDist(mo->x, mo->y) : 0; + const boolean usepitchnroll = (!usedistance || (m_dist <= rolldist)); fixed_t tempz = slope->normal.z; fixed_t tempy = slope->normal.y; @@ -3516,35 +3517,35 @@ void K_RollMobjBySlopes(mobj_t* mo, pslope_t *slope) // admittedly this is a very hacky way to do the pitch and roll easing // pitch - if (!usedistance || (m_dist <= (rolldist))) + if (usepitchnroll) { an = (INT32)((angle_t)tempangle - mo->pitch_sprite) / SLOPEROLL_DIV; mo->pitch_sprite = an ? mo->pitch_sprite + an : (angle_t)tempangle; } else - mo->pitch_sprite = FixedAngle(0); + mo->pitch_sprite = 0; mo->slopepitch = flip ? InvAngle(mo->pitch_sprite) : mo->pitch_sprite; // roll tempangle = (R_PointToAngle2(0, 0, tempz, tempy)); - if (!usedistance || (m_dist <= (rolldist))) + if (usepitchnroll) { an = (INT32)((angle_t)tempangle - mo->roll_sprite) / SLOPEROLL_DIV; mo->roll_sprite = an ? mo->roll_sprite + an : (angle_t)tempangle; } else - mo->roll_sprite = FixedAngle(0); + mo->roll_sprite = 0; mo->sloperoll = flip ? InvAngle(mo->roll_sprite) : mo->roll_sprite; } else if (P_IsObjectOnGround(mo)) { - mo->sloperoll = FixedAngle(0); - mo->slopepitch = FixedAngle(0); + mo->sloperoll = 0; + mo->slopepitch = 0; } } @@ -6846,8 +6847,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else { - player->mo->sloperoll = FixedAngle(0); - player->mo->slopepitch = FixedAngle(0); + player->mo->sloperoll = 0; + player->mo->slopepitch = 0; } // Quick Turning diff --git a/src/p_mobj.c b/src/p_mobj.c index 1fec5ac72..d22ad3bb8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6042,8 +6042,8 @@ void P_RollPitchMobj(mobj_t* mobj) if (cv_sloperoll.value != 2) { - mobj->sloperoll = FixedAngle(0); - mobj->slopepitch = FixedAngle(0); + mobj->sloperoll = 0; + mobj->slopepitch = 0; return; } -- 2.54.0 From 5ff125a429571b2622535efd3352a6e1d5898313 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 17:14:30 +0100 Subject: [PATCH 292/325] spawn speedlines with non synched rng if ur in eggbox status and well only if you have colourisation enabled --- src/k_kart.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1177543cf..64c6ccbcd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5397,11 +5397,15 @@ void K_KartPlayerHUDUpdate(player_t *player) player->kartstuff[k_cardanimation] = 0; } -static inline void K_SpawnNormalSpeedLines(player_t *player) +typedef INT32 (*randomFunc)(INT32 min, INT32 max); + +static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) { - mobj_t *fast = P_SpawnMobj(player->mo->x + (P_RandomRange(-36,36) * player->mo->scale), - player->mo->y + (P_RandomRange(-36,36) * player->mo->scale), - player->mo->z + (player->mo->height/2) + (P_RandomRange(-20,20) * player->mo->scale), + randomFunc randomfunc = synched ? P_RandomRange : M_RandomRange; + + mobj_t *fast = P_SpawnMobj(player->mo->x + (randomfunc(-36,36) * player->mo->scale), + player->mo->y + (randomfunc(-36,36) * player->mo->scale), + player->mo->z + (player->mo->height/2) + (randomfunc(-20,20) * player->mo->scale), MT_FASTLINE); fast->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); @@ -5416,7 +5420,6 @@ static inline void K_SpawnNormalSpeedLines(player_t *player) { const boolean goodSpeed = (player->speed >= (3*K_GetKartSpeed(player, false))/4); - // cant have nice shit cause of synched rng if (player->kartstuff[k_eggmanexplode]) { // Make it red when you have the eggman speed boost @@ -5467,9 +5470,13 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_GetKartBoostPower(player); // Speed lines - if ((player->kartstuff[k_sneakertimer] || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost] /*|| player->kartstuff[k_eggmanexplode]*/) && player->speed > 0) // gotta love the speedlines calling synched rng :chaosleep: + if ((player->kartstuff[k_sneakertimer] || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost]) && player->speed > 0) { - K_SpawnNormalSpeedLines(player); + K_SpawnNormalSpeedLines(player, true); + } + else if (cv_coloredspeedlines.value && player->kartstuff[k_eggmanexplode]) // gotta love the speedlines calling synched rng :chaosleep: + { + K_SpawnNormalSpeedLines(player, false); } if (player->playerstate == PST_DEAD || player->kartstuff[k_respawn] > 1) // Ensure these are set correctly here -- 2.54.0 From c133f0d7512ca44b1a637bd8a234a155f3a24671 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 3 Feb 2025 20:43:30 +0100 Subject: [PATCH 293/325] add additive blending to fast speedlines --- src/k_kart.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/k_kart.c b/src/k_kart.c index 64c6ccbcd..47cf7aa58 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5447,6 +5447,7 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) fast->color = (leveltime & 1) ? player->mo->color : driftcolor; fast->colorized = true; + fast->frame |= FF_ADD; } } } -- 2.54.0 From a686b29a7aff27ff585d69d87dc05e3394548353 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 6 Feb 2025 17:25:43 +0100 Subject: [PATCH 294/325] only apply additive blend to speedlines when any kind of boost is happening to emphasize that ure boosting or smth --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 47cf7aa58..67199bf93 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5449,6 +5449,9 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) fast->colorized = true; fast->frame |= FF_ADD; } + + if (goodSpeed && ((player->kartstuff[k_growshrinktimer] > 0) || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_sneakertimer])) + fast->blendmode = AST_ADD; } } -- 2.54.0 From 6932a52463a2ca7fa0646c70bf4a1ad1d8bd8f56 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 8 Feb 2025 15:36:33 +0100 Subject: [PATCH 295/325] change speelines blending condition uuuhh, so, if you have sneakerboost they always will apply additive blending otherwise if you go really fast (faster than sneakerboost) --- src/k_kart.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 67199bf93..3a5e6fdb8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5397,6 +5397,25 @@ void K_KartPlayerHUDUpdate(player_t *player) player->kartstuff[k_cardanimation] = 0; } +static boolean K_SpeedLinesShouldBlend(player_t *player) +{ + fixed_t percentspeed = 0; + + if (!player->mo) + return false; + + if (player->kartstuff[k_sneakertimer]) + return true; + + // this is how the percentage speedometer calcs, i suck at maths so this was the easiest thing to fo lmao + percentspeed = (FixedDiv(player->speed, FixedMul(K_GetKartSpeed(player, false), ORIG_FRICTION))*100)>>FRACBITS; + + if (percentspeed > 127) // sneaker boost is around 25% + return true; + + return false; +} + typedef INT32 (*randomFunc)(INT32 min, INT32 max); static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) @@ -5418,7 +5437,7 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) if (cv_coloredspeedlines.value) { - const boolean goodSpeed = (player->speed >= (3*K_GetKartSpeed(player, false))/4); + const boolean colorSpeed = (player->speed >= (3*K_GetKartSpeed(player, false))/4); if (player->kartstuff[k_eggmanexplode]) { @@ -5431,7 +5450,7 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) fast->color = player->mo->color; fast->colorized = true; } - else if (goodSpeed) + else if (colorSpeed) { UINT8 driftcolor = SKINCOLOR_NONE; @@ -5450,7 +5469,7 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) fast->frame |= FF_ADD; } - if (goodSpeed && ((player->kartstuff[k_growshrinktimer] > 0) || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_sneakertimer])) + if (colorSpeed && K_SpeedLinesShouldBlend(player)) fast->blendmode = AST_ADD; } } -- 2.54.0 From a277d70ce23c339ffea1d7e24df18f7c8ea6069a Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 7 Feb 2025 20:03:13 +0300 Subject: [PATCH 296/325] Don't force specific characters in M_HandleConnectIP --- src/m_menu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index c92b62983..6e9e58a82 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -10472,8 +10472,9 @@ static void M_HandleConnectIP(INT32 choice) default: // Rudimentary number and period enforcing - also allows letters so hostnames can be used instead - if ((choice >= '-' && choice <= ':') || (choice >= 'A' && choice <= 'Z') || (choice >= 'a' && choice <= 'z') - || (choice >= 199 && choice <= 211 && choice != 202 && choice != 206)) //numpad too! + // ctrl-v allows to bypass that anyway, so we just remove that for now to allow stuff like shift+insert + /*if ((choice >= '-' && choice <= ':') || (choice >= 'A' && choice <= 'Z') || (choice >= 'a' && choice <= 'z') + || (choice >= 199 && choice <= 211 && choice != 202 && choice != 206))*/ //numpad too! { if (M_TextInputHandle(&setupm_input_ip, choice)) S_StartSound(NULL,sfx_menu1); // Tails -- 2.54.0 From e16ef100b8e20d3b8f9bca38aa41572efdfed011 Mon Sep 17 00:00:00 2001 From: Alug Date: Tue, 4 Mar 2025 19:27:26 +0100 Subject: [PATCH 297/325] try make this slightly more readable --- src/r_things.c | 51 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 5f4e6810a..cfb79ac06 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2818,12 +2818,11 @@ boolean R_ThingVisible (mobj_t *thing) return true; } -boolean R_ThingWithinDist (mobj_t *thing, fixed_t limit_dist) +boolean R_ThingWithinDist(mobj_t *thing, fixed_t limit_dist) { if (limit_dist) { - const fixed_t dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); - if (dist > limit_dist) + if (P_AproxDistance(viewx-thing->x, viewy-thing->y) > limit_dist) { return false; } @@ -2939,7 +2938,7 @@ static void Sk_SetDefaultValue(skin_t *skin, boolean local) // memset(skin, 0, sizeof (skin_t)); snprintf(skin->name, - sizeof skin->name, "skin %u", (UINT32)(skin-( (local) ? localskins : skins ))); + sizeof skin->name, "skin %u", (UINT32)(skin-(local ? localskins : skins))); skin->name[sizeof skin->name - 1] = '\0'; skin->wadnum = INT16_MAX; strcpy(skin->sprite, ""); @@ -3109,8 +3108,8 @@ boolean SetPlayerSkin(INT32 playernum, const char *skinname) void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) { - player_t *player = &players[playernum]; INT32 i; + player_t *player = &players[playernum]; if (strcasecmp(skinname, "none")) { @@ -3160,8 +3159,8 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) { if (player->localskin > 0) { - CV_StealthSet(&cv_fakelocalskin, ( (player->skinlocal) ? localskins : skins )[player->localskin - 1].name); - CV_StealthSet(cvar, ( (player->skinlocal) ? localskins : skins )[player->localskin - 1].name); + CV_StealthSet(&cv_fakelocalskin, (player->skinlocal ? localskins : skins)[player->localskin-1].name); + CV_StealthSet(cvar, (player->skinlocal ? localskins : skins)[player->localskin-1].name); } else { @@ -3350,6 +3349,9 @@ void R_AddSkins(UINT16 wadnum, boolean local) skin_t *skin; boolean hudname, realname; +#define lskin (local ? localskins : skins) +#define lnumskins (local ? numlocalskins : numskins) + // // search for all skin markers in pwad // @@ -3381,7 +3383,7 @@ void R_AddSkins(UINT16 wadnum, boolean local) buf2[size] = '\0'; // set defaults - skin = &( (local) ? localskins : skins )[( (local) ? numlocalskins : numskins )]; + skin = &lskin[lnumskins]; Sk_SetDefaultValue(skin, local); skin->wadnum = wadnum; hudname = realname = false; @@ -3607,34 +3609,29 @@ next_token: CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name); #ifdef SKINVALUES - (local ? localskin_cons_t : skin_cons_t)[(local ? numlocalskins : numskins)].value = (local ? numlocalskins : numskins); - (local ? localskin_cons_t : skin_cons_t)[(local ? numlocalskins : numskins)].strvalue = skin->name; + (local ? localskin_cons_t : skin_cons_t)[lnumskins].value = lnumskins; + (local ? localskin_cons_t : skin_cons_t)[lnumskins].strvalue = skin->name; #endif - // Update the forceskin possiblevalues if (!local) { + // Update the forceskin possiblevalues Forceskin_cons_t[numskins+1].value = numskins; Forceskin_cons_t[numskins+1].strvalue = skins[numskins].name; - } - - skin->localskin = local; - - // so we dont have to guess - if (local) - skin->localnum = numlocalskins; - else + skin->localskin = false; skin->localnum = numskins; - - // add face graphics - if (local) - ST_LoadLocalFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numlocalskins); - else ST_LoadFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numskins); + } + else + { + skin->localskin = true; + skin->localnum = numlocalskins; + ST_LoadLocalFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numlocalskins); + } #ifdef HWRENDER if (rendermode == render_opengl) - HWR_AddPlayerMD2(((local) ? numlocalskins : numskins), local); + HWR_AddPlayerMD2(lnumskins, local); #endif if (!local) { @@ -3645,12 +3642,14 @@ next_token: skinsorted[numskins] = numskins; } - allskins[numallskins] = ( (local) ? localskins : skins )[( (local) ? numlocalskins : numskins )]; + allskins[numallskins] = lskin[lnumskins]; local ? numlocalskins++ : numskins++; numallskins++; } +#undef lskin +#undef lnumskins //sortSkinGrid(); return; -- 2.54.0 From 537aa30cfe38f04dec22f222f63c846e46fca6a3 Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 28 Feb 2025 18:48:56 +0300 Subject: [PATCH 298/325] Don't reset demo recording if player is still entering replay name in intermission --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index 994d44199..009980919 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -616,7 +616,7 @@ void Y_Ticker(void) if (demo.savemode == DSM_WILLSAVE || demo.savemode == DSM_WILLAUTOSAVE) G_SaveDemo(); - else + else if (demo.savemode != DSM_TITLEENTRY) G_ResetDemoRecording(); } -- 2.54.0 From 4465b05bc8c438acf8c32cd8b7fde5837d73821f Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 8 Mar 2025 16:16:39 +0100 Subject: [PATCH 299/325] p_sight stuff idk --- src/p_sight.c | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/p_sight.c b/src/p_sight.c index 1d71e5553..874ba5ae5 100644 --- a/src/p_sight.c +++ b/src/p_sight.c @@ -42,15 +42,16 @@ static INT32 sightcounts[2]; static INT32 P_DivlineSide(fixed_t x, fixed_t y, const divline_t *node) { fixed_t left, right; - return + + return( !node->dx ? x == node->x ? 2 : x <= node->x ? node->dy > 0 : node->dy < 0 : !node->dy ? y == node->y ? 2 : y <= node->y ? node->dx < 0 : node->dx > 0 : (right = ((y - node->y) >> FRACBITS) * (node->dx >> FRACBITS)) < (left = ((x - node->x) >> FRACBITS) * (node->dy >> FRACBITS)) ? 0 : - right == left ? 2 : 1; + right == left ? 2 : 1); } -static INT32 P_DivlineCrossed(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, const divline_t *node) +static inline INT32 P_DivlineCrossed(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, const divline_t *node) { return (P_DivlineSide(x1, y1, node) == P_DivlineSide(x2, y2, node)); } @@ -100,10 +101,6 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los) if (P_DivlineCrossed(los->strace.x, los->strace.y, los->t2x, los->t2y, &divl)) continue; - // stop because it is not two sided - //if (!(po->flags & POF_TESTHEIGHT)) - //return false; - frac = P_InterceptVector(&los->strace, &divl); // get slopes of top and bottom of this polyobject line @@ -112,17 +109,11 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los) if (topslope >= los->topslope && bottomslope <= los->bottomslope) return false; // view completely blocked - - // TODO: figure out if it's worth considering partially blocked cases or not? - // maybe to adjust los's top/bottom slopes if needed - //if (los->topslope <= los->bottomslope) - //return false; } return true; } - // // P_CrossSubsector // @@ -305,24 +296,19 @@ static boolean P_CrossBSPNode(INT32 bspnum, register los_t *los, boolean fast) { register node_t *bsp = nodes + bspnum; - INT32 side = (fast ? R_PointOnSideFast(los->strace.x, los->strace.y, bsp) : (P_DivlineSide(los->strace.x,los->strace.y, (divline_t *)bsp) & 1)); + INT32 side = (fast ? R_PointOnSideFast(los->strace.x, los->strace.y, bsp) : (P_DivlineSide(los->strace.x, los->strace.y, (divline_t *)bsp) & 1)); INT32 side2 = (fast ? R_PointOnSideFast(los->t2x, los->t2y, bsp) : P_DivlineSide(los->t2x, los->t2y, (divline_t *) bsp)); if (side == side2) { bspnum = bsp->children[side]; // doesn't touch the other side } - else + else // the partition plane is crossed here { - // the partition plane is crossed here if (!P_CrossBSPNode(bsp->children[side], los, fast)) - { return false; // cross the starting side - } - else - { - bspnum = bsp->children[side^1]; // cross the ending side - } + + bspnum = bsp->children[side^1]; // cross the ending side } } -- 2.54.0 From 288bcbd419d4b7d5be87010df336147e67e3ad9c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Mar 2025 14:06:12 +0100 Subject: [PATCH 300/325] bruh --- src/k_kart.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3a5e6fdb8..e90cc7f72 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5466,7 +5466,6 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) fast->color = (leveltime & 1) ? player->mo->color : driftcolor; fast->colorized = true; - fast->frame |= FF_ADD; } if (colorSpeed && K_SpeedLinesShouldBlend(player)) -- 2.54.0 From fe6b5a83f86b0c4e77a21d47806410a2d3fc812c Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Mar 2025 17:29:13 +0100 Subject: [PATCH 301/325] consolidate those --- src/d_main.c | 5 +---- src/p_tick.c | 14 ++------------ 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index bbe81145d..fb7a98a6e 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -224,10 +224,7 @@ static void D_DeviceLEDTick(void) for (i = 0; i <= splitscreen; i++) { - if (!cv_usejoystick[i].value) - continue; - - if (!cv_gamepadled[i].value) + if (!cv_usejoystick[i].value || !cv_gamepadled[i].value) continue; color[i] = G_GetSkinColor(i); diff --git a/src/p_tick.c b/src/p_tick.c index 5743f18ff..3a49319f7 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -383,19 +383,14 @@ static void P_DeviceRumbleTick(void) UINT16 low = 0; UINT16 high = 0; - if (!cv_usejoystick[i].value) - { - continue; - } - - if (!cv_rumble[i].value) + if (!cv_usejoystick[i].value || !cv_rumble[i].value) { continue; } player_t *player = ((i == 0) ? &players[consoleplayer] : &players[displayplayers[i]]); - if (player->spectator) + if (player->spectator || !player->mo) { continue; } @@ -405,11 +400,6 @@ static void P_DeviceRumbleTick(void) continue; } - if (P_MobjWasRemoved(player->mo)) - { - continue; - } - if (player->exiting) { G_PlayerDeviceRumble(i, low, high, 0); -- 2.54.0 From 8775e5abc1264fbd2862bdd3081970f0b73abdfc Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 10 Mar 2025 17:52:08 +0100 Subject: [PATCH 302/325] fix compile without ROTSPRITE --- src/hardware/hw_main.c | 4 ++-- src/lua_hudlib.c | 6 ++++++ src/r_things.c | 4 ++-- src/st_stuff.c | 3 +-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 44415d486..88d3322b3 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4620,9 +4620,9 @@ static void HWR_ProjectSprite(mobj_t *thing) I_Error("sprframes NULL for sprite %d\n", thing->sprite); #endif - if (sprframe->rotate != SRF_SINGLE || papersprite || + if (sprframe->rotate != SRF_SINGLE || papersprite #ifdef ROTSPRITE - (shouldrotate) + || (shouldrotate) #endif ) { diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index ccafd59aa..45570b2cd 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -474,12 +474,16 @@ static int libd_getSpritePatch(lua_State *L) if (skn < 0) // standard sprite { sprdef = &sprites[i]; +#ifdef ROTSPRITE sprinfo = &spriteinfo[i]; +#endif } else // player skin { sprdef = &skins[skn].spritedef; +#ifdef ROTSPRITE sprinfo = &skins[skn].sprinfo; +#endif } // set frame number @@ -500,6 +504,7 @@ static int libd_getSpritePatch(lua_State *L) if (angle >= 8) // out of range? angle = (angle & 7); // modulus angle by 8 +#ifdef ROTSPRITE // rotsprite????? if (lua_isnumber(L, 4)) { @@ -515,6 +520,7 @@ static int libd_getSpritePatch(lua_State *L) return 3; } } +#endif // push both the patch and its "flip" value LUA_PushUserdata(L, W_CachePatchNum(sprframe->lumppat[angle], PU_STATIC), META_PATCH); diff --git a/src/r_things.c b/src/r_things.c index cfb79ac06..4235c81df 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1281,9 +1281,9 @@ static void R_ProjectSprite(mobj_t *thing) I_Error("R_ProjectSprite: sprframes NULL for sprite %d\n", thing->sprite); #endif - if (sprframe->rotate != SRF_SINGLE || papersprite || + if (sprframe->rotate != SRF_SINGLE || papersprite #ifdef ROTSPRITE - (shouldrotate) + || (shouldrotate) #endif ) { diff --git a/src/st_stuff.c b/src/st_stuff.c index 13bb9a007..6e39661e7 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -277,9 +277,8 @@ void ST_ReloadSkinFaceGraphics(void) for (i = 0; i < numskins; i++) ST_LoadFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); - for (i = 0; i < numlocalskins; i++) { + for (i = 0; i < numlocalskins; i++) ST_LoadLocalFaceGraphics(localskins[i].facerank, localskins[i].facewant, localskins[i].facemmap, i); - } } static inline void ST_InitData(void) -- 2.54.0 From cf9e7ff37ba53a0f4ea3183f97189ce74728da56 Mon Sep 17 00:00:00 2001 From: Indev Date: Sun, 23 Feb 2025 14:21:24 +0300 Subject: [PATCH 303/325] Add toggle for look up/down, also don't trigger it during countdown or when player is respawning --- src/d_netcmd.c | 4 ++++ src/d_netcmd.h | 2 ++ src/m_menu.c | 10 ++++++---- src/p_tick.c | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 625352bb5..c7ba62636 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -298,6 +298,8 @@ consvar_t cv_mouseturn = {"mouseturn", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, // Lagless camera! Yay! consvar_t cv_laglesscam = {"laglesscamera", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_verticallook = {"verticallook", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + #if defined(HAVE_SDL) || defined(_WINDOWS) //joystick 1 and 2 consvar_t cv_usejoystick[MAXSPLITSCREENPLAYERS] = { {"use_joystick", "1", CV_SAVE|CV_CALL, usejoystick_cons_t, I_InitJoystick1, 0, NULL, NULL, 0, 0, NULL}, @@ -1066,6 +1068,8 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_laglesscam); + CV_RegisterVar(&cv_verticallook); + // ingame object placing COM_AddCommand("objectplace", Command_ObjectPlace_f); COM_AddCommand("writethings", Command_Writethings_f); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 4ec6f43ba..9e1744e00 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -198,6 +198,8 @@ extern consvar_t cv_betainterscreen; extern consvar_t cv_laglesscam; +extern consvar_t cv_verticallook; + typedef enum { SKINMENUTYPE_SCROLL = 0, diff --git a/src/m_menu.c b/src/m_menu.c index 6e9e58a82..437a03570 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1882,11 +1882,12 @@ static menuitem_t OP_CamOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "Lagless Camera", &cv_laglesscam, 50}, {IT_STRING | IT_CVAR, NULL, "Camera Lookback Momentum", &cv_lookbackmom, 60}, + {IT_STRING | IT_CVAR, NULL, "Camera Vertical Look", &cv_verticallook, 70}, - {IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", &OP_Player1CamOptionsDef, 80}, - {IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", &OP_Player2CamOptionsDef, 90}, - {IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", &OP_Player3CamOptionsDef, 100}, - {IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", &OP_Player4CamOptionsDef, 110}, + {IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", &OP_Player1CamOptionsDef, 90}, + {IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", &OP_Player2CamOptionsDef, 100}, + {IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", &OP_Player3CamOptionsDef, 110}, + {IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", &OP_Player4CamOptionsDef, 120}, }; static const char* OP_CamOptionsTooltips[] = @@ -1895,6 +1896,7 @@ static const char* OP_CamOptionsTooltips[] = "Player field of view.", "Removes Camera Lag in netgames\nMay cause Camera stutters in poor net conditions.", "Should looking back inherit the Players Momentum?\nEither inherit Player Momentum or double of it\nmay make looking back while boosting or going in high speed less jarring", + "Allows looking up/down by holding aim forward/backward while standing still.", NULL, NULL, NULL, diff --git a/src/p_tick.c b/src/p_tick.c index 3a49319f7..0db1d5d48 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -464,7 +464,7 @@ void P_RunChaseCameras(void) player_t *p = &players[displayplayers[i]]; camera_t *cam = &camera[i]; - if (p->mo && p->kartstuff[k_throwdir] != 0) + if (cv_verticallook.value && leveltime > starttime && p->mo && p->kartstuff[k_respawn] == 0 && p->kartstuff[k_throwdir] != 0) { if (p->speed < 6 * p->mo->scale && abs(cam->dpad_y_held) < 2*TICRATE) cam->dpad_y_held += intsign(p->kartstuff[k_throwdir]); -- 2.54.0 From 88b78a5bf76b884701a9de9c4673b86341abd9e4 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 12 Mar 2025 06:52:46 +0100 Subject: [PATCH 304/325] delet cam rotspeed cvar lmao forgor this did nothing --- src/m_menu.c | 5 ----- src/p_local.h | 1 - src/p_user.c | 30 +++++++++++------------------- src/r_main.c | 1 - 4 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 437a03570..f7d8bf960 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1911,7 +1911,6 @@ static menuitem_t OP_Player1CamOptionsMenu[] = {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[0], 40}, {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[0], 50}, {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[0], 60}, - {IT_STRING | IT_CVAR, NULL, "Camera Rotation Speed", &cv_cam_rotspeed[0], 70}, {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[0], 85}, }; @@ -1924,7 +1923,6 @@ static menuitem_t OP_Player2CamOptionsMenu[] = {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[1], 40}, {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[1], 50}, {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[1], 60}, - {IT_STRING | IT_CVAR, NULL, "Camera Rotation Speed", &cv_cam_rotspeed[1], 70}, {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[1], 85}, }; @@ -1937,7 +1935,6 @@ static menuitem_t OP_Player3CamOptionsMenu[] = {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[2], 40}, {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[2], 50}, {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[2], 60}, - {IT_STRING | IT_CVAR, NULL, "Camera Rotation Speed", &cv_cam_rotspeed[2], 70}, {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[2], 85}, }; @@ -1950,7 +1947,6 @@ static menuitem_t OP_Player4CamOptionsMenu[] = {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[3], 40}, {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[3], 50}, {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[3], 60}, - {IT_STRING | IT_CVAR, NULL, "Camera Rotation Speed", &cv_cam_rotspeed[3], 70}, {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[3], 85}, }; @@ -1962,7 +1958,6 @@ static const char* OP_PlayerCamOptionsTooltips[] = "Camera distance relative to the Player.", "Height of the Camera", "Speed of the Camera", - "Speed of the Camera rotation", "Toggle between Third or First Person camera", }; diff --git a/src/p_local.h b/src/p_local.h index 6043f794f..ddb090090 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -148,7 +148,6 @@ extern consvar_t cv_cam_still[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_height[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_speed[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_rotate[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_cam_rotspeed[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_timeover[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_freecam_speed; diff --git a/src/p_user.c b/src/p_user.c index 852d2b6be..cf9be8bd0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2989,10 +2989,6 @@ static void CV_CamRotate4_OnChange(void) CV_SetValue(&cv_cam_rotate[3], cv_cam_rotate[3].value % 360); } -static CV_PossibleValue_t CV_CamSpeed[] = {{0, "MIN"}, {1*FRACUNIT, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t rotation_cons_t[] = {{1, "MIN"}, {45, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t CV_CamRotate[] = {{-720, "MIN"}, {720, "MAX"}, {0, NULL}}; - static void CV_PlayerCam1_OnChange(void) { if (gamestate != GS_LEVEL) @@ -3078,25 +3074,21 @@ consvar_t cv_cam_still[MAXSPLITSCREENPLAYERS] = { {"cam4_still", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL} }; +static CV_PossibleValue_t cam_speed_cons_t[] = {{0, "MIN"}, {1*FRACUNIT, "MAX"}, {0, NULL}}; consvar_t cv_cam_speed[MAXSPLITSCREENPLAYERS] = { - {"cam_speed", "0.4", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"cam2_speed", "0.4", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"cam3_speed", "0.4", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"cam4_speed", "0.4", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL} + {"cam_speed", "0.4", CV_FLOAT|CV_SAVE, cam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"cam2_speed", "0.4", CV_FLOAT|CV_SAVE, cam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"cam3_speed", "0.4", CV_FLOAT|CV_SAVE, cam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"cam4_speed", "0.4", CV_FLOAT|CV_SAVE, cam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} }; + +static CV_PossibleValue_t cam_rotate_cons_t[] = {{-720, "MIN"}, {720, "MAX"}, {0, NULL}}; consvar_t cv_cam_rotate[MAXSPLITSCREENPLAYERS] = { - {"cam_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate_OnChange, 0, NULL, NULL, 0, 0, NULL}, - {"cam2_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate2_OnChange, 0, NULL, NULL, 0, 0, NULL}, - {"cam3_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate3_OnChange, 0, NULL, NULL, 0, 0, NULL}, - {"cam4_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate4_OnChange, 0, NULL, NULL, 0, 0, NULL} -}; - -consvar_t cv_cam_rotspeed[MAXSPLITSCREENPLAYERS] = { - {"cam_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"cam2_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"cam3_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, - {"cam4_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL} + {"cam_rotate", "0", CV_CALL|CV_NOINIT, cam_rotate_cons_t, CV_CamRotate_OnChange, 0, NULL, NULL, 0, 0, NULL}, + {"cam2_rotate", "0", CV_CALL|CV_NOINIT, cam_rotate_cons_t, CV_CamRotate2_OnChange, 0, NULL, NULL, 0, 0, NULL}, + {"cam3_rotate", "0", CV_CALL|CV_NOINIT, cam_rotate_cons_t, CV_CamRotate3_OnChange, 0, NULL, NULL, 0, 0, NULL}, + {"cam4_rotate", "0", CV_CALL|CV_NOINIT, cam_rotate_cons_t, CV_CamRotate4_OnChange, 0, NULL, NULL, 0, 0, NULL} }; consvar_t cv_cam_timeover[MAXSPLITSCREENPLAYERS] = { diff --git a/src/r_main.c b/src/r_main.c index 78e099bd9..5ecff64cc 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1560,7 +1560,6 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_cam_height[i]); CV_RegisterVar(&cv_cam_speed[i]); CV_RegisterVar(&cv_cam_rotate[i]); - CV_RegisterVar(&cv_cam_rotspeed[i]); CV_RegisterVar(&cv_cam_timeover[i]); } -- 2.54.0 From c081349f9b89feefb4039f3fd73ccd08ebe002c2 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 12 Mar 2025 07:00:50 +0100 Subject: [PATCH 305/325] make freecam speed per splitscreenplayer + add to menu --- src/m_menu.c | 49 +++++++++++++++++++++++++++++-------------------- src/p_local.h | 2 +- src/p_user.c | 25 ++++++++++--------------- src/r_main.c | 3 +-- 4 files changed, 41 insertions(+), 38 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index f7d8bf960..8127c8c80 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1907,48 +1907,56 @@ static menuitem_t OP_Player1CamOptionsMenu[] = { {IT_HEADER, NULL, "Player 1 Camera Options", NULL, 0}, - {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[0], 30}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[0], 40}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[0], 50}, - {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[0], 60}, + {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[0], 30}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[0], 50}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[0], 60}, + {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[0], 70}, - {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[0], 85}, + {IT_STRING | IT_CVAR, NULL, "Freecam Speed", &cv_freecam_speed[0], 90}, + + {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[0], 105}, }; static menuitem_t OP_Player2CamOptionsMenu[] = { {IT_HEADER, NULL, "Player 2 Camera Options", NULL, 0}, - {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[1], 30}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[1], 40}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[1], 50}, - {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[1], 60}, + {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[1], 30}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[1], 50}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[1], 60}, + {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[1], 70}, - {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[1], 85}, + {IT_STRING | IT_CVAR, NULL, "Freecam Speed", &cv_freecam_speed[1], 90}, + + {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[1], 105}, }; static menuitem_t OP_Player3CamOptionsMenu[] = { {IT_HEADER, NULL, "Player 3 Camera Options", NULL, 0}, - {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[2], 30}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[2], 40}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[2], 50}, - {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[2], 60}, + {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[2], 30}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[2], 50}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[2], 60}, + {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[2], 70}, - {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[2], 85}, + {IT_STRING | IT_CVAR, NULL, "Freecam Speed", &cv_freecam_speed[2], 90}, + + {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[2], 105}, }; static menuitem_t OP_Player4CamOptionsMenu[] = { {IT_HEADER, NULL, "Player 4 Camera Options", NULL, 0}, - {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[3], 30}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[3], 40}, - {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[3], 50}, - {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[3], 60}, + {IT_STRING | IT_CVAR, NULL, "Flipcam", &cv_flipcam[3], 30}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Distance", &cv_cam_dist[3], 50}, + {IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Camera Height", &cv_cam_height[3], 60}, + {IT_STRING | IT_CVAR, NULL, "Camera Speed", &cv_cam_speed[3], 70}, - {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[3], 85}, + {IT_STRING | IT_CVAR, NULL, "Freecam Speed", &cv_freecam_speed[3], 90}, + + {IT_STRING | IT_CVAR, NULL, "Third Person Camera", &cv_chasecam[3], 105}, }; static const char* OP_PlayerCamOptionsTooltips[] = @@ -1958,6 +1966,7 @@ static const char* OP_PlayerCamOptionsTooltips[] = "Camera distance relative to the Player.", "Height of the Camera", "Speed of the Camera", + "Speed of the Freecam/Spectator Camera", "Toggle between Third or First Person camera", }; diff --git a/src/p_local.h b/src/p_local.h index ddb090090..ae72fee77 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -150,7 +150,7 @@ extern consvar_t cv_cam_speed[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_rotate[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_cam_timeover[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_freecam_speed; +extern consvar_t cv_freecam_speed[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_tilting; extern consvar_t cv_quaketilt; diff --git a/src/p_user.c b/src/p_user.c index cf9be8bd0..890fa2e5f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3099,7 +3099,12 @@ consvar_t cv_cam_timeover[MAXSPLITSCREENPLAYERS] = { }; static CV_PossibleValue_t freecam_speed_cons_t[] = {{0, "MIN"}, {10, "MAX"}, {0, NULL}}; -consvar_t cv_freecam_speed = {"freecam_speed", "1", CV_SAVE, freecam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_freecam_speed[MAXSPLITSCREENPLAYERS] = { + {"freecam_speed", "1", CV_SAVE, freecam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"freecam2_speed", "1", CV_SAVE, freecam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"freecam3_speed", "1", CV_SAVE, freecam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"freecam4_speed", "1", CV_SAVE, freecam_speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}, +}; consvar_t cv_tilting = {"tilting", "Off", CV_SAVE|CV_CALL, CV_OnOff, Bird_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_quaketilt = {"quaketilt", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -3376,19 +3381,9 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) // camera movement: if (!cam->button_a_held) { - fixed_t spd = 32*mapobjectscale*cv_freecam_speed.value; + fixed_t spd = (32*mapobjectscale*cv_freecam_speed[num].value); int dir = ((cmd->buttons & BT_ACCELERATE || InputDown(gc_camfloat, forplayer)) ? 1 : 0) + ((cmd->buttons & BT_BRAKE || InputDown(gc_camsink, forplayer)) ? -1 : 0); - - switch (dir) - { - case 1: - cam->z += spd; - break; - - case -1: - cam->z -= spd; - break; - } + cam->z += spd * dir; } if (!(cmd->buttons & (BT_ACCELERATE | BT_DRIFT) || InputDown(gc_camfloat, forplayer)) && cam->button_a_held) @@ -3440,7 +3435,7 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->momx = cam->momy = cam->momz = 0; if (cmd->forwardmove != 0) { - fixed_t spd = cmd->forwardmove*mapobjectscale*cv_freecam_speed.value; + fixed_t spd = cmd->forwardmove*mapobjectscale*cv_freecam_speed[num].value; thrustangle = cam->angle >> ANGLETOFINESHIFT; @@ -3461,7 +3456,7 @@ static void P_DemoCameraMovement(camera_t *cam, UINT8 num) if (cmd->sidemove != 0) // was disabled in practice anyways, since sidemove was suppressed { //False I fixed this shit - Nep - fixed_t spd = cmd->sidemove*mapobjectscale*cv_freecam_speed.value; + fixed_t spd = cmd->sidemove*mapobjectscale*cv_freecam_speed[num].value; thrustangle = (cam->angle-ANGLE_90) >> ANGLETOFINESHIFT; cam->x += FixedMul(spd, FINECOSINE(thrustangle)); diff --git a/src/r_main.c b/src/r_main.c index 5ecff64cc..ff136ba46 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1561,10 +1561,9 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_cam_speed[i]); CV_RegisterVar(&cv_cam_rotate[i]); CV_RegisterVar(&cv_cam_timeover[i]); + CV_RegisterVar(&cv_freecam_speed[i]); } - CV_RegisterVar(&cv_freecam_speed); - CV_RegisterVar(&cv_tilting); CV_RegisterVar(&cv_quaketilt); CV_RegisterVar(&cv_tiltsmoothing); -- 2.54.0 From cce363c8c86dd60abb68c4179370149ab0c69183 Mon Sep 17 00:00:00 2001 From: Anonimus Date: Thu, 6 Mar 2025 07:26:37 -0500 Subject: [PATCH 306/325] Add a cvar for minimap icon spinouts --- src/d_player.h | 5 ++++ src/g_game.c | 25 +++++++++++++++++ src/g_game.h | 1 + src/k_kart.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/m_menu.c | 47 ++++++++++++++++++++++++++++++++ src/p_setup.c | 5 ++++ src/r_main.c | 1 + 7 files changed, 158 insertions(+) diff --git a/src/d_player.h b/src/d_player.h index 0991144fb..9924a1807 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -551,8 +551,13 @@ typedef struct player_s UINT8 splitscreenindex; +<<<<<<< HEAD tic_t driftsparkGrowTimer; +======= + fixed_t spinoutrot; // When a player spins out, this value increments modulus 360. +#ifdef HWRENDER +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) fixed_t fovadd; // adjust FOV for hw rendering } player_t; diff --git a/src/g_game.c b/src/g_game.c index b75060cff..5afc3d923 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -518,6 +518,31 @@ consvar_t cv_ydeadzone[MAXSPLITSCREENPLAYERS] = { static CV_PossibleValue_t driftsparkpulse_t[] = {{0, "MIN"}, {FRACUNIT*3, "MAX"}, {0, NULL}}; consvar_t cv_driftsparkpulse = {"driftsparkpulse", "1.4", CV_FLOAT | CV_SAVE, driftsparkpulse_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +<<<<<<< HEAD +======= +static CV_PossibleValue_t stretchfactor_t[] = { + {0, "Off"}, {FRACUNIT/8, "0.125"}, {FRACUNIT/4, "0.250"}, + {3*FRACUNIT/8, "0.375"}, {FRACUNIT/2, "0.500"}, {5*FRACUNIT/8, "0.625"}, + {3*FRACUNIT/4, "0.750"}, {7*FRACUNIT/8, "0.875"}, {FRACUNIT, "Max"}, {0, NULL}}; +consvar_t cv_gravstretch = {"gravstretch", "0", CV_SAVE, stretchfactor_t, 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"}, + {3072, "3072"}, {4096, "4096"}, {6144, "6144"}, + {8192, "8192"}, {0, "Infinite"}, {0, NULL}}; +consvar_t cv_sloperolldist = {"sloperolldist", "Infinite", CV_SAVE, sloperolldist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +static CV_PossibleValue_t sloperoll_cons_t[] = {{0, "Off"}, {1, "Players"}, {2, "Everything"}, {0, NULL}}; +consvar_t cv_spriteroll = {"spriteroll", "On", CV_SAVE|CV_CALL, CV_OnOff, PDistort_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_sloperoll = {"sloperoll", "Off", CV_SAVE|CV_CALL, sloperoll_cons_t, PDistort_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_sparkroll = {"sparkroll", "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}; +consvar_t cv_spinoutroll = {"spinoutroll", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) consvar_t cv_cechotoggle = {"show_cecho", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; #if MAXPLAYERS > 16 diff --git a/src/g_game.h b/src/g_game.h index fa427b752..deec04226 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -180,6 +180,7 @@ extern consvar_t cv_sliptideroll; extern consvar_t cv_slamsound; extern consvar_t cv_sloperolldist; extern consvar_t cv_sparkroll; +extern consvar_t cv_spinoutroll; extern consvar_t cv_cechotoggle; diff --git a/src/k_kart.c b/src/k_kart.c index e90cc7f72..800dc9d75 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5397,6 +5397,7 @@ void K_KartPlayerHUDUpdate(player_t *player) player->kartstuff[k_cardanimation] = 0; } +<<<<<<< HEAD static boolean K_SpeedLinesShouldBlend(player_t *player) { fixed_t percentspeed = 0; @@ -5472,6 +5473,10 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) fast->blendmode = AST_ADD; } } +======= +#define SPINOUTROTSPEED (24 * FRACUNIT) +#define MAXSPINROT (360 * FRACUNIT) +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c @@ -5595,6 +5600,10 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->powers[pw_flashing]--; } + boolean doiconspin; + + doiconspin = false; + if (player->kartstuff[k_spinouttimer]) { if ((P_IsObjectOnGround(player->mo) || ((player->kartstuff[k_spinouttype]+1)/2 == 1)) // spinouttype 1 and 2 - explosion and spb @@ -5606,6 +5615,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_spinouttimer] == 0) player->kartstuff[k_spinouttype] = 0; // Reset type } + + doiconspin = true; } else { @@ -5622,6 +5633,31 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } + if ((doiconspin) && (player->spinoutrot == 0)) + { + player->spinoutrot = SPINOUTROTSPEED; + } + + // MKWii-styled icon spinouts: do a full 360 rotation before stopping. + if ((player->spinoutrot) && (player->spinoutrot < MAXSPINROT)) + { + if ((player->spinoutrot + SPINOUTROTSPEED) >= MAXSPINROT) + { + if (doiconspin) + { + player->spinoutrot = (player->spinoutrot + SPINOUTROTSPEED) % MAXSPINROT; + } + else + { + player->spinoutrot = 0; + } + } + else + { + player->spinoutrot += SPINOUTROTSPEED; + } + } + /*if (player->kartstuff[k_thunderanim]) player->kartstuff[k_thunderanim]--;*/ @@ -10122,14 +10158,52 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags) V_DrawSciencePatch(amxpos, amypos, flags, ((skinlocal) ? localfacemmapprefix : facemmapprefix)[skin], scale); else { + patch_t *minimaphead; + +#ifdef ROTSPRITE + angle_t rollangle; + INT32 rot; + + rot = 0; + + if (mo->player) + { + // Rotate counterclockwise. + rollangle = FixedAngle(mo->player->spinoutrot * -1); + rot = R_GetRollAngle(rollangle); + } + + if ((cv_spriteroll.value) && (cv_spinoutroll.value) && (rot)) + { + minimaphead = W_CachePatchNameRotated(((skin_t*)(mo->localskin ? mo->localskin : mo->skin))->facemmap, rot, PU_STATIC); + } + else +#endif + { + minimaphead = ((skinlocal) ? localfacemmapprefix : facemmapprefix)[skin]; + } UINT8 *colormap; if (mo->colorized) colormap = R_GetTranslationColormap(TC_RAINBOW, mo->color, GTC_CACHE); else colormap = R_GetLocalTranslationColormap(mo->skin, mo->localskin, mo->color, GTC_CACHE, skinlocal); +<<<<<<< HEAD V_DrawFixedPatch(amxpos, amypos, scale, flags, ((skinlocal) ? localfacemmapprefix : facemmapprefix)[skin], colormap); +======= + + if (cv_minihead.value) + V_DrawFixedPatch(amxpos + (2*FRACUNIT), amypos + (2*FRACUNIT), FRACUNIT/2, flags, minimaphead, colormap); + else + V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, minimaphead, 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); + } +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) if (mo->player && ((G_RaceGametype() && mo->player->kartstuff[k_position] == spbplace) || (G_BattleGametype() && K_IsPlayerWanted(mo->player)))) diff --git a/src/m_menu.c b/src/m_menu.c index 8127c8c80..622f5190a 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2274,6 +2274,7 @@ static menuitem_t OP_PlayerDistortMenu[] = { {IT_HEADER, NULL, "Sprite Distortion", NULL, 0}, +<<<<<<< HEAD {IT_STRING | IT_CVAR, NULL, "Sprite Slope Rotation", &cv_sloperoll, 15}, {IT_STRING | IT_CVAR, NULL, "Slope Rotation Distance", &cv_sloperolldist, 30}, @@ -2286,6 +2287,19 @@ static menuitem_t OP_PlayerDistortMenu[] = {IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 120}, {IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 135}, {IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 150}, +======= + {IT_STRING | IT_CVAR, NULL, "Sprite Rotation", &cv_spriteroll, 15}, + {IT_STRING | IT_CVAR, NULL, "Sprite Slope Rotation", &cv_sloperoll, 30}, + {IT_STRING | IT_CVAR, NULL, "Slope Rotation Distance", &cv_sloperolldist, 45}, + {IT_STRING | IT_CVAR, NULL, "Rotate Players when Sliptiding", &cv_sliptideroll, 60}, + {IT_STRING | IT_CVAR, NULL, "Rotate Sparks and Boost Trails", &cv_sparkroll, 75}, + {IT_STRING | IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 90}, + {IT_STRING | IT_CVAR, NULL, "Player Stretch Factor", &cv_gravstretch, 105}, + {IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 120}, + {IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 135}, + {IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 150}, + {IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 165}, +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) }; static const char* OP_PlayerDistortTooltips[] = @@ -2295,7 +2309,11 @@ static const char* OP_PlayerDistortTooltips[] = "Distance object rotation should be visable.", "Player rotation when sliptiding.", "Rotation of a player's boost trails and drift sparks.", +<<<<<<< HEAD "Should banans rotate when thrown?\nAnd should they stay rotated when on the ground?.", +======= + "Erratically rotate player icons during spinouts.", +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) "Player squash and stretch.", "Player landing sound effect.", "Kart hopping while drifting. This is purely visual.", @@ -2310,7 +2328,11 @@ enum slrotatedist, sliptide, sparkrotate, +<<<<<<< HEAD bananrotat, +======= + iconspinout, +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) stretchyplayer, squishsound, salthmmm, @@ -3465,8 +3487,33 @@ void Moviemode_option_Onchange(void) void PDistort_menu_Onchange(void) { +<<<<<<< HEAD OP_PlayerDistortMenu[slrotatedist].status = (cv_sloperoll.value) ? IT_STRING | IT_CVAR : IT_GRAYEDOUT; +======= + if (!cv_spriteroll.value) + { + OP_PlayerDistortMenu[sloperotate].status = IT_GRAYEDOUT; + OP_PlayerDistortMenu[sliptide].status = IT_GRAYEDOUT; + OP_PlayerDistortMenu[iconspinout].status = IT_GRAYEDOUT; + } + else + { + OP_PlayerDistortMenu[sloperotate].status = IT_STRING | IT_CVAR; + OP_PlayerDistortMenu[sliptide].status = IT_STRING | IT_CVAR; + OP_PlayerDistortMenu[iconspinout].status = IT_STRING | IT_CVAR; + } + + if ((cv_sloperoll.value) && (cv_spriteroll.value)) //enable/disable sloperotate distance + OP_PlayerDistortMenu[slrotatedist].status = IT_STRING | IT_CVAR; + else + OP_PlayerDistortMenu[slrotatedist].status = IT_GRAYEDOUT; + + if ((cv_sloperoll.value == 2) && (cv_spriteroll.value)) //enable/disable sparkroll depending on which setting + OP_PlayerDistortMenu[sparkrotate].status = IT_STRING | IT_CVAR; + else + OP_PlayerDistortMenu[sparkrotate].status = IT_GRAYEDOUT; +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) } void Bird_menu_Onchange(void) diff --git a/src/p_setup.c b/src/p_setup.c index 25ff8a94a..56ffd4766 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2116,12 +2116,17 @@ static void P_LevelInitStuff(boolean reloadinggamestate) players[i].realtime = racecountdown = exitcountdown = 0; +<<<<<<< HEAD for (INT32 j = 0; j < LAP__MAX; j++) { players[i].laptime[j] = 0; } players[i].driftsparkGrowTimer = 0; +======= + // Neptune + players[i].spinoutrot = 0; +>>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) players[i].gotcontinue = false; diff --git a/src/r_main.c b/src/r_main.c index ff136ba46..e82dcabc3 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1577,6 +1577,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_sliptideroll); CV_RegisterVar(&cv_sloperolldist); CV_RegisterVar(&cv_sparkroll); + CV_RegisterVar(&cv_spinoutroll); CV_RegisterVar(&cv_showhud); CV_RegisterVar(&cv_translucenthud); -- 2.54.0 From 21c267b319f308d56c8e97610bbdd0d612f34e38 Mon Sep 17 00:00:00 2001 From: Anonimus Date: Sat, 8 Mar 2025 17:36:50 -0500 Subject: [PATCH 307/325] Refactor to prevent desynchs --- src/d_player.h | 4 + src/k_kart.c | 34 +--- src/p_mobj.c | 3 + src/p_setup.c | 3 + src/p_user.c | 413 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 428 insertions(+), 29 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 9924a1807..4c2cd7268 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -551,10 +551,14 @@ typedef struct player_s UINT8 splitscreenindex; +<<<<<<< HEAD <<<<<<< HEAD tic_t driftsparkGrowTimer; ======= +======= + UINT8 doiconspin; // A boolean in practice. Tells the game to continue spinning the minimap icons. +>>>>>>> 432dcd3a3 (Refactor to prevent desynchs) fixed_t spinoutrot; // When a player spins out, this value increments modulus 360. #ifdef HWRENDER >>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) diff --git a/src/k_kart.c b/src/k_kart.c index 800dc9d75..b4eb022e9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5397,6 +5397,7 @@ void K_KartPlayerHUDUpdate(player_t *player) player->kartstuff[k_cardanimation] = 0; } +<<<<<<< HEAD <<<<<<< HEAD static boolean K_SpeedLinesShouldBlend(player_t *player) { @@ -5478,6 +5479,8 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) #define MAXSPINROT (360 * FRACUNIT) >>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) +======= +>>>>>>> 432dcd3a3 (Refactor to prevent desynchs) /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c \param player player object passed from P_PlayerThink @@ -5600,9 +5603,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->powers[pw_flashing]--; } - boolean doiconspin; - - doiconspin = false; + player->doiconspin = 0; if (player->kartstuff[k_spinouttimer]) { @@ -5616,7 +5617,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->kartstuff[k_spinouttype] = 0; // Reset type } - doiconspin = true; + player->doiconspin = 1; } else { @@ -5633,31 +5634,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } - if ((doiconspin) && (player->spinoutrot == 0)) - { - player->spinoutrot = SPINOUTROTSPEED; - } - - // MKWii-styled icon spinouts: do a full 360 rotation before stopping. - if ((player->spinoutrot) && (player->spinoutrot < MAXSPINROT)) - { - if ((player->spinoutrot + SPINOUTROTSPEED) >= MAXSPINROT) - { - if (doiconspin) - { - player->spinoutrot = (player->spinoutrot + SPINOUTROTSPEED) % MAXSPINROT; - } - else - { - player->spinoutrot = 0; - } - } - else - { - player->spinoutrot += SPINOUTROTSPEED; - } - } - /*if (player->kartstuff[k_thunderanim]) player->kartstuff[k_thunderanim]--;*/ diff --git a/src/p_mobj.c b/src/p_mobj.c index d22ad3bb8..007d59836 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10728,6 +10728,9 @@ void P_SpawnPlayer(INT32 playernum) p->hitemtimer = 0; p->hitemvictim = 255; + p->doiconspin = 0; + p->spinoutrot = 0; + if (G_BattleGametype()) // SRB2kart { mobj_t *overheadarrow = P_SpawnMobj(mobj->x, mobj->y, mobj->z + P_GetPlayerHeight(p)+16*FRACUNIT, MT_PLAYERARROW); diff --git a/src/p_setup.c b/src/p_setup.c index 56ffd4766..44b1e19a3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2116,6 +2116,7 @@ static void P_LevelInitStuff(boolean reloadinggamestate) players[i].realtime = racecountdown = exitcountdown = 0; +<<<<<<< HEAD <<<<<<< HEAD for (INT32 j = 0; j < LAP__MAX; j++) { @@ -2128,6 +2129,8 @@ static void P_LevelInitStuff(boolean reloadinggamestate) players[i].spinoutrot = 0; >>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) +======= +>>>>>>> 432dcd3a3 (Refactor to prevent desynchs) players[i].gotcontinue = false; players[i].xtralife = players[i].deadtimer = players[i].numboxes = players[i].totalring = players[i].laps = 0; diff --git a/src/p_user.c b/src/p_user.c index 890fa2e5f..a9ea372ac 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4430,6 +4430,394 @@ DoABarrelRoll (player_t *player) player->tilt = slope; } +<<<<<<< HEAD +======= +/* set follower state with our weird hacks + the reason we do this is to avoid followers ever using actions (majormods, yikes!) + without having to touch p_mobj.c. + so we give it 1more tic and change the state when tic == 1 instead of 0 + cool beans? + cool beans. +*/ +static void P_SetFollowerState(mobj_t *f, statenum_t state) +{ + if (f == NULL || P_MobjWasRemoved(f) == true) + { + // safety net + return; + } + + // No, do NOT set the follower to S_NULL. Set it to S_INVISIBLE. + if (state == S_NULL) + { + state = S_INVISIBLE; + f->threshold = 1; // Threshold = 1 means stop doing anything related to setting states, so that we don't get out of S_INVISIBLE + } + + // extravalue2 stores the last "first state" we used. + // because states default to idlestates, if we use an animation that uses an "ongoing" state line, don't reset it! + // this prevents it from looking very dumb + if (state == (statenum_t)f->extravalue2) + { + return; + } + + // we will save the state into extravalue2. + f->extravalue2 = state; + + P_SetMobjStateNF(f, state); + if (f->state->tics > 0) + { + f->tics++; + } +} + +UINT8 K_GetEffectiveFollowerColor(UINT8 followercolor, follower_t *follower, UINT8 playercolor, skin_t *playerskin) +{ + if (followercolor == SKINCOLOR_NONE && follower != NULL) // "Default" + { + followercolor = follower->defaultcolor; + } + + if (followercolor > SKINCOLOR_NONE && followercolor < MAXSKINCOLORS) // bog standard + { + return followercolor; + } + + if (playercolor == SKINCOLOR_NONE) // get default color + { + if (playerskin == NULL) + { + // Nothing from this line down is valid if playerskin is invalid, just guess Sonic? + playerskin = &skins[0]; + } + + playercolor = playerskin->prefcolor; + } + + if (followercolor == FOLLOWERCOLOR_OPPOSITE) // "Opposite" + { + return KartColor_Opposite[playercolor]; + } + + // "Match" + return playercolor; +} + +static void K_UpdateFollowerState(mobj_t *f, statenum_t state, followerstate_t type) +{ + if (f == NULL || P_MobjWasRemoved(f) == true) + { + // safety net + return; + } + + if (f->extravalue1 != (INT32)type) + { + P_SetFollowerState(f, state); + f->extravalue1 = type; + } +} + + +// +//P_HandleFollower +// +//Handle the follower's spawning and moving along with the player. Do note that some of the stuff like the removal if a player doesn't exist anymore is handled in MT_FOLLOWER's thinker. +static void P_HandleFollower(player_t *player) +{ + follower_t fl; + angle_t an; + fixed_t zoffs; + fixed_t ourheight; + fixed_t sx, sy, sz, deltaz; + fixed_t fh = INT32_MIN, ch = INT32_MAX; + angle_t destAngle; + INT32 angleDiff; + UINT16 color; + + if (!player->followerready) + return; // we aren't ready to perform anything follower related yet. + + // How about making sure our follower exists and is added before trying to spawn it n' all? + if (player->followerskin > numfollowers-1 || player->followerskin < -1) + { + //CONS_Printf("Follower skin invlaid. Setting to -1.\n"); + player->followerskin = -1; + return; + } + + // don't do anything if we can't have a follower to begin with. + // (It gets removed under those conditions) + if (player->spectator || player->followerskin < 0 + || player->mo == NULL || P_MobjWasRemoved(player->mo)) + { + if (player->follower) + { + P_RemoveMobj(player->follower); + P_SetTarget(&player->follower, NULL); + } + return; + } + // Before we do anything, let's be sure of where we're supposed to be + fl = followers[player->followerskin]; + + an = player->mo->angle + fl.atangle; + zoffs = fl.zoffs; + + // do you like angle maths? I certainly don't... + sx = player->mo->x + player->mo->momx + FixedMul(FixedMul(player->mo->scale, fl.dist), FINECOSINE((an) >> ANGLETOFINESHIFT)); + sy = player->mo->y + player->mo->momy + FixedMul(FixedMul(player->mo->scale, fl.dist), FINESINE((an) >> ANGLETOFINESHIFT)); + + // interp info helps with stretchy fix + deltaz = (player->mo->z - player->mo->old_z); + + // for the z coordinate, don't be a doof like Steel and forget that MFE_VERTICALFLIP exists :P + sz = player->mo->z + player->mo->momz + FixedMul(player->mo->scale, zoffs * P_MobjFlip(player->mo)); + ourheight = FixedMul(fl.height, player->mo->scale); + if (player->mo->eflags & MFE_VERTICALFLIP) + { + sz += ourheight; + } + + fh = player->mo->floorz; + ch = player->mo->ceilingz - ourheight; + + switch (fl.mode) + { + case FOLLOWERMODE_GROUND: + { + if (player->mo->eflags & MFE_VERTICALFLIP) + { + sz = ch; + } + else + { + sz = fh; + } + break; + } + case FOLLOWERMODE_FLOAT: + default: + { + // finally, add a cool floating effect to the z height. + // not stolen from k_kart I swear!! + fixed_t sine = FixedMul(fl.bobamp, + FINESINE((( + FixedMul(4 * M_TAU_FIXED, fl.bobspeed) * leveltime + ) >> ANGLETOFINESHIFT) & FINEMASK)); + sz += FixedMul(player->mo->scale, sine) * P_MobjFlip(player->mo); + break; + } + } + + // Set follower colour + + color = K_GetEffectiveFollowerColor(player->followercolor, &fl, player->skincolor, &skins[player->skin]); + + if (!player->follower) // follower doesn't exist / isn't valid + { + //CONS_Printf("Spawning follower...\n"); + + // so let's spawn one! + P_SetTarget(&player->follower, P_SpawnMobj(sx, sy, sz, MT_FOLLOWER)); + if (player->follower == NULL) + return; + + K_UpdateFollowerState(player->follower, fl.idlestate, FOLLOWERSTATE_IDLE); + + P_SetTarget(&player->follower->target, player->mo); // we need that to know when we need to disappear + player->follower->angle = player->follower->old_angle = player->mo->angle; + } + else // follower exists, woo! + { + + // first of all, handle states following the same model as above: + if (player->follower->tics == 1) + P_SetFollowerState(player->follower, player->follower->state->nextstate); + + // Spawn Follower Shadow + player->follower->haveshadow = true; + player->follower->shadowscale = FRACUNIT; + + // move the follower next to us (yes, this is really basic maths but it looks pretty damn clean in practice)! + player->follower->momx = FixedDiv(sx - player->follower->x, fl.horzlag); + player->follower->momy = FixedDiv(sy - player->follower->y, fl.horzlag); + + player->follower->z += FixedDiv(deltaz, fl.vertlag); + + if (fl.mode == FOLLOWERMODE_GROUND) + { + sector_t *sec = player->follower->subsector->sector; + + fh = min(fh, P_GetFloorZ(player->follower, sec, sx, sy, NULL)); + ch = max(ch, P_GetCeilingZ(player->follower, sec, sx, sy, NULL) - ourheight); + + if (P_IsObjectOnGround(player->mo) == false) + { + // In the air, match their momentum. + player->follower->momz = player->mo->momz; + if (player->follower->z <= sz) // Don't go under the floor please + player->follower->z = sz; + } + else + { + fixed_t fg = P_GetMobjGravity(player->mo); + fixed_t fz = P_GetMobjZMovement(player->follower); + + player->follower->momz = fz; + + // Player is on the ground ... try to get the follower + // back to the ground also if it is above it. + if (player->follower->z > sz) // Don't go under the floor please + player->follower->momz += FixedDiv(fg * 6, fl.vertlag); // Scaled against the default value of vertlag + + + // Other wise match current floor + player->follower->momz = sz - player->follower->z; + + } + } + else + { + player->follower->momz = FixedDiv(sz - player->follower->z, fl.vertlag); + } + + if (player->mo->colorized) + player->follower->color = player->mo->color; + else + player->follower->color = color; + + player->follower->colorized = player->mo->colorized; + + P_SetScale(player->follower, FixedMul(fl.scale, player->mo->scale)); + K_GenericExtraFlagsNoZAdjust(player->follower, player->mo); // Not K_MatchGenericExtraFlag because the Z adjust it has only works properly if master & mo have the same Z height. + + // For comeback in battle. + player->follower->flags2 = (player->follower->flags2 & ~MF2_SHADOW)|(player->mo->flags2 & MF2_SHADOW); + + // Make the follower invisible if we no contest'd rather than removing it. No one will notice the diff seriously. + if (player->pflags & PF_TIMEOVER) // there is more to it than that to check for a full no contest but this isn't used for anything else. + player->follower->flags2 |= MF2_DONTDRAW; + + if (cv_hidefollowers.value) // hide em for people who don't want them + player->follower->flags2 |= MF2_DONTDRAW; + + // if we're moving let's make the angle the direction we're moving towards. This is to avoid drifting / reverse looking awkward. + if (FixedHypot(player->follower->momx, player->follower->momy) >= player->mo->scale) + { + destAngle = R_PointToAngle2(0, 0, player->follower->momx, player->follower->momy); + } + else + { + // Face the player's angle when standing still. + destAngle = player->mo->angle; + } + + /*// Sal: Turn the follower around when looking backwards. + if ( player->cmd.buttons & BT_LOOKBACK ) + { + destAngle += ANGLE_180; + }*/ + + // Sal: Smoothly rotate angle to the destination value. + angleDiff = AngleDeltaSigned(destAngle, player->follower->angle); + + if (angleDiff != 0) + { + player->follower->angle += FixedDiv(angleDiff, fl.anglelag); + } + + // Ground follower slope rotation + if (fl.mode == FOLLOWERMODE_GROUND) + { + K_CalculateFollowerSlope( + player->follower, + player->follower->x, player->follower->y, player->follower->z, + player->follower->radius, ourheight, + (player->mo->eflags & MFE_VERTICALFLIP), + false + ); + } + + if (player->follower->threshold) + { + // Threshold means the follower was "despanwed" with S_NULL. + return; + } + + // However with how the code is factored, this is just a special case of S_INVISBLE to avoid having to add other player variables. + + // handle follower animations. Could probably be better... + + // Squish + if (player->kartstuff[k_squishedtimer] > 0) + { + // cancel hit confirm + player->follower->movecount = 0; + player->follower->cvmem = 0; + + if (player->kartstuff[k_squishedtimer] > 1) + player->follower->spriteyscale = FRACUNIT/4; + else + player->follower->spriteyscale = FRACUNIT; + + K_UpdateFollowerState(player->follower, fl.hurtstate, FOLLOWERSTATE_HURT); + + } + else if (P_PlayerInPain(player) == true || player->mo->state == &states[S_KART_SPIN] || player->mo->health <= 0) + { + // hurt or dead + // cancel hit confirm + player->follower->movecount = 0; + player->follower->cvmem = 0; + + // spin out + player->follower->angle = player->frameangle; + + K_UpdateFollowerState(player->follower, fl.hurtstate, FOLLOWERSTATE_HURT); + + if (player->mo->health <= 0) + { + // if dead, follow the player's z momentum exactly so they both look like they die at the same speed. + player->follower->momz = player->mo->momz; + } + } + else if (player->exiting) + { + // win/ loss animations + if (K_IsPlayerLosing(player)) + { + // L + K_UpdateFollowerState(player->follower, fl.losestate, FOLLOWERSTATE_LOSE); + } + else + { + // W + K_UpdateFollowerState(player->follower, fl.winstate, FOLLOWERSTATE_WIN); + } + } + else if (player->follower->movecount) + { + K_UpdateFollowerState(player->follower, fl.hitconfirmstate, FOLLOWERSTATE_HITCONFIRM); + player->follower->movecount--; + } + else if (player->speed > 10*player->mo->scale) // animation for moving fast enough + { + K_UpdateFollowerState(player->follower, fl.followstate, FOLLOWERSTATE_FOLLOW); + } + else + { + K_UpdateFollowerState(player->follower, fl.idlestate, FOLLOWERSTATE_IDLE); + } + + } +} + +#define SPINOUTROTSPEED (24 * FRACUNIT) +#define MAXSPINROT (360 * FRACUNIT) + +>>>>>>> 432dcd3a3 (Refactor to prevent desynchs) // // P_PlayerThink // @@ -4581,6 +4969,31 @@ void P_PlayerThink(player_t *player) if (player->exiting && exitcountdown) player->exiting = 99; // SRB2kart + if ((player->doiconspin) && (player->spinoutrot == 0)) + { + player->spinoutrot = SPINOUTROTSPEED; + } + + // MKWii-styled icon spinouts: do a full 360 rotation before stopping. + if ((player->spinoutrot) && (player->spinoutrot < MAXSPINROT)) + { + if ((player->spinoutrot + SPINOUTROTSPEED) >= MAXSPINROT) + { + if (player->doiconspin) + { + player->spinoutrot = (player->spinoutrot + SPINOUTROTSPEED) % MAXSPINROT; + } + else + { + player->spinoutrot = 0; + } + } + else + { + player->spinoutrot += SPINOUTROTSPEED; + } + } + if (player->exiting == 2 || exitcountdown == 2) { if (cv_playersforexit.value) // Count to be sure everyone's exited -- 2.54.0 From 30deff7697633afd9a9f46f0259856e754f2c4dc Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 15 Mar 2025 16:26:43 +0100 Subject: [PATCH 308/325] fix conflicts for minimap spinouts + some refactoring --- src/d_clisrv.c | 2 +- src/d_player.h | 9 +- src/g_game.c | 25 --- src/k_kart.c | 99 +++++------- src/m_menu.c | 60 +------- src/p_mobj.c | 1 - src/p_user.c | 407 ++----------------------------------------------- src/w_wad.c | 12 +- 8 files changed, 69 insertions(+), 546 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 5758fceb2..1b5478b62 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -108,7 +108,7 @@ UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. static tic_t reference_lag; static UINT8 spike_time; tic_t lowest_lag; -tic_t simulated_lag; // just for ping readout without netticbuffer added +tic_t simulated_lag; boolean server_lagless; static void Lagless_OnChange(void) diff --git a/src/d_player.h b/src/d_player.h index 4c2cd7268..7ecef63de 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -551,17 +551,10 @@ typedef struct player_s UINT8 splitscreenindex; -<<<<<<< HEAD -<<<<<<< HEAD tic_t driftsparkGrowTimer; -======= -======= - UINT8 doiconspin; // A boolean in practice. Tells the game to continue spinning the minimap icons. ->>>>>>> 432dcd3a3 (Refactor to prevent desynchs) fixed_t spinoutrot; // When a player spins out, this value increments modulus 360. -#ifdef HWRENDER ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) + fixed_t fovadd; // adjust FOV for hw rendering } player_t; diff --git a/src/g_game.c b/src/g_game.c index 5afc3d923..b75060cff 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -518,31 +518,6 @@ consvar_t cv_ydeadzone[MAXSPLITSCREENPLAYERS] = { static CV_PossibleValue_t driftsparkpulse_t[] = {{0, "MIN"}, {FRACUNIT*3, "MAX"}, {0, NULL}}; consvar_t cv_driftsparkpulse = {"driftsparkpulse", "1.4", CV_FLOAT | CV_SAVE, driftsparkpulse_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -<<<<<<< HEAD -======= -static CV_PossibleValue_t stretchfactor_t[] = { - {0, "Off"}, {FRACUNIT/8, "0.125"}, {FRACUNIT/4, "0.250"}, - {3*FRACUNIT/8, "0.375"}, {FRACUNIT/2, "0.500"}, {5*FRACUNIT/8, "0.625"}, - {3*FRACUNIT/4, "0.750"}, {7*FRACUNIT/8, "0.875"}, {FRACUNIT, "Max"}, {0, NULL}}; -consvar_t cv_gravstretch = {"gravstretch", "0", CV_SAVE, stretchfactor_t, 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"}, - {3072, "3072"}, {4096, "4096"}, {6144, "6144"}, - {8192, "8192"}, {0, "Infinite"}, {0, NULL}}; -consvar_t cv_sloperolldist = {"sloperolldist", "Infinite", CV_SAVE, sloperolldist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t sloperoll_cons_t[] = {{0, "Off"}, {1, "Players"}, {2, "Everything"}, {0, NULL}}; -consvar_t cv_spriteroll = {"spriteroll", "On", CV_SAVE|CV_CALL, CV_OnOff, PDistort_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_sloperoll = {"sloperoll", "Off", CV_SAVE|CV_CALL, sloperoll_cons_t, PDistort_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_sparkroll = {"sparkroll", "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}; -consvar_t cv_spinoutroll = {"spinoutroll", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; - ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) consvar_t cv_cechotoggle = {"show_cecho", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; #if MAXPLAYERS > 16 diff --git a/src/k_kart.c b/src/k_kart.c index b4eb022e9..f7c37b871 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -135,6 +135,7 @@ static CV_PossibleValue_t sloperoll_cons_t[] = {{0, "Off"}, {1, "Players"}, {2, consvar_t cv_sloperoll = {"sloperoll", "Off", CV_SAVE|CV_CALL, sloperoll_cons_t, PDistort_menu_Onchange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_sparkroll = {"sparkroll", "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}; +consvar_t cv_spinoutroll = {"spinoutroll", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; //hardcode saltyhop mhhm static void saltyhop_onchange(void); @@ -5397,8 +5398,6 @@ void K_KartPlayerHUDUpdate(player_t *player) player->kartstuff[k_cardanimation] = 0; } -<<<<<<< HEAD -<<<<<<< HEAD static boolean K_SpeedLinesShouldBlend(player_t *player) { fixed_t percentspeed = 0; @@ -5474,13 +5473,7 @@ static inline void K_SpawnNormalSpeedLines(player_t *player, boolean synched) fast->blendmode = AST_ADD; } } -======= -#define SPINOUTROTSPEED (24 * FRACUNIT) -#define MAXSPINROT (360 * FRACUNIT) ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) -======= ->>>>>>> 432dcd3a3 (Refactor to prevent desynchs) /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c \param player player object passed from P_PlayerThink @@ -5603,8 +5596,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->powers[pw_flashing]--; } - player->doiconspin = 0; - if (player->kartstuff[k_spinouttimer]) { if ((P_IsObjectOnGround(player->mo) || ((player->kartstuff[k_spinouttype]+1)/2 == 1)) // spinouttype 1 and 2 - explosion and spb @@ -5616,8 +5607,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_spinouttimer] == 0) player->kartstuff[k_spinouttype] = 0; // Reset type } - - player->doiconspin = 1; } else { @@ -8811,7 +8800,9 @@ static void K_DrawKartPositionNum(INT32 num) } if (splitscreen || cv_smallposnum.value || wheeloffs) + { scale /= 2; + } W = FixedMul(W<>FRACBITS; @@ -8900,7 +8891,9 @@ static void K_DrawKartPositionNum(INT32 num) } } else + { localpatch = kp_positionnum[num % 10][0]; + } V_DrawFixedPatch((fx<width)*scale/2) : 0), (fy<height)*scale/2) : 0), scale, V_HUDTRANSHALF|fflags, localpatch, NULL); // ^ if we overtake as p1 or p3 in splitscren, we shift it so that it doesn't go off screen. @@ -10091,18 +10084,27 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags) // The number being divided by is for how fast it moves. // The higher the number, the slower it moves. - // am xpos & ypos are the icon's starting position. Withouht + // am xpos & ypos are the icon's starting position. Without // it, they wouldn't 'spawn' on the top-right side of the HUD. - UINT8 skin = 0; - boolean skinlocal = mo->skinlocal; + UINT8 skinnum = 0; + const boolean skinlocal = mo->skinlocal; + const skin_t *skin = (skin_t*)(mo->localskin ? mo->localskin : mo->skin); fixed_t amnumxpos, amnumypos; INT32 amxpos, amypos, wntdamxpos, wntdamypos; fixed_t scale = FRACUNIT; + patch_t *minimaphead = NULL; + +#ifdef ROTSPRITE + angle_t rollangle = 0; + INT32 rot = 0; +#endif if (mo->skin) - skin = ((skin_t*)(mo->localskin ? mo->localskin : mo->skin))-(skinlocal ? localskins : skins); + skinnum = (skin-(skinlocal ? localskins : skins)); + + minimaphead = (skinlocal ? localfacemmapprefix : facemmapprefix)[skinnum]; amnumxpos = (FixedMul(lerp(mo->old_x, mo->x), minimapinfo.zoom) - minimapinfo.offs_x); amnumypos = -(FixedMul(lerp(mo->old_y, mo->y), minimapinfo.zoom) - minimapinfo.offs_y); @@ -10110,8 +10112,8 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags) if (encoremode) amnumxpos = -amnumxpos; - amxpos = amnumxpos + ((x + (SHORT(minimapinfo.minimap_pic->width)-SHORT((skinlocal ? localfacemmapprefix : facemmapprefix)[skin]->width)) / 2)<height)-SHORT((skinlocal ? localfacemmapprefix : facemmapprefix)[skin]->height)) / 2)<width)-SHORT(minimaphead->width)) / 2)<height)-SHORT(minimaphead->height)) / 2)<player && !(modeattacking || gamestate == GS_TIMEATTACK)) { @@ -10125,61 +10127,38 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags) if (cv_minihead.value) { - amxpos += (SHORT((skinlocal ? localfacemmapprefix : facemmapprefix)[skin]->width) / 4)<height) / 4)<width) / 4)<height) / 4)<player) + { + // Rotate counterclockwise. + rollangle = FixedAngle(mo->player->spinoutrot * -1); + rot = R_GetRollAngle(rollangle); + + if (rot) + { + minimaphead = W_CachePatchNameRotated(skin->facemmap, rot, PU_STATIC); + } + } +#endif + if (!mo->color) // 'default' color - V_DrawSciencePatch(amxpos, amypos, flags, ((skinlocal) ? localfacemmapprefix : facemmapprefix)[skin], scale); + V_DrawSciencePatch(amxpos, amypos, flags, minimaphead, scale); else { - patch_t *minimaphead; - -#ifdef ROTSPRITE - angle_t rollangle; - INT32 rot; - - rot = 0; - - if (mo->player) - { - // Rotate counterclockwise. - rollangle = FixedAngle(mo->player->spinoutrot * -1); - rot = R_GetRollAngle(rollangle); - } - - if ((cv_spriteroll.value) && (cv_spinoutroll.value) && (rot)) - { - minimaphead = W_CachePatchNameRotated(((skin_t*)(mo->localskin ? mo->localskin : mo->skin))->facemmap, rot, PU_STATIC); - } - else -#endif - { - minimaphead = ((skinlocal) ? localfacemmapprefix : facemmapprefix)[skin]; - } UINT8 *colormap; + if (mo->colorized) colormap = R_GetTranslationColormap(TC_RAINBOW, mo->color, GTC_CACHE); else colormap = R_GetLocalTranslationColormap(mo->skin, mo->localskin, mo->color, GTC_CACHE, skinlocal); -<<<<<<< HEAD - V_DrawFixedPatch(amxpos, amypos, scale, flags, ((skinlocal) ? localfacemmapprefix : facemmapprefix)[skin], colormap); + V_DrawFixedPatch(amxpos, amypos, scale, flags, minimaphead, colormap); -======= - - if (cv_minihead.value) - V_DrawFixedPatch(amxpos + (2*FRACUNIT), amypos + (2*FRACUNIT), FRACUNIT/2, flags, minimaphead, colormap); - else - V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, minimaphead, 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); - } ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) if (mo->player && ((G_RaceGametype() && mo->player->kartstuff[k_position] == spbplace) || (G_BattleGametype() && K_IsPlayerWanted(mo->player)))) diff --git a/src/m_menu.c b/src/m_menu.c index 622f5190a..15f6898e1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2274,7 +2274,6 @@ static menuitem_t OP_PlayerDistortMenu[] = { {IT_HEADER, NULL, "Sprite Distortion", NULL, 0}, -<<<<<<< HEAD {IT_STRING | IT_CVAR, NULL, "Sprite Slope Rotation", &cv_sloperoll, 15}, {IT_STRING | IT_CVAR, NULL, "Slope Rotation Distance", &cv_sloperolldist, 30}, @@ -2287,19 +2286,6 @@ static menuitem_t OP_PlayerDistortMenu[] = {IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 120}, {IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 135}, {IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 150}, -======= - {IT_STRING | IT_CVAR, NULL, "Sprite Rotation", &cv_spriteroll, 15}, - {IT_STRING | IT_CVAR, NULL, "Sprite Slope Rotation", &cv_sloperoll, 30}, - {IT_STRING | IT_CVAR, NULL, "Slope Rotation Distance", &cv_sloperolldist, 45}, - {IT_STRING | IT_CVAR, NULL, "Rotate Players when Sliptiding", &cv_sliptideroll, 60}, - {IT_STRING | IT_CVAR, NULL, "Rotate Sparks and Boost Trails", &cv_sparkroll, 75}, - {IT_STRING | IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 90}, - {IT_STRING | IT_CVAR, NULL, "Player Stretch Factor", &cv_gravstretch, 105}, - {IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 120}, - {IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 135}, - {IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 150}, - {IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 165}, ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) }; static const char* OP_PlayerDistortTooltips[] = @@ -2309,11 +2295,7 @@ static const char* OP_PlayerDistortTooltips[] = "Distance object rotation should be visable.", "Player rotation when sliptiding.", "Rotation of a player's boost trails and drift sparks.", -<<<<<<< HEAD "Should banans rotate when thrown?\nAnd should they stay rotated when on the ground?.", -======= - "Erratically rotate player icons during spinouts.", ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) "Player squash and stretch.", "Player landing sound effect.", "Kart hopping while drifting. This is purely visual.", @@ -2328,11 +2310,7 @@ enum slrotatedist, sliptide, sparkrotate, -<<<<<<< HEAD bananrotat, -======= - iconspinout, ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) stretchyplayer, squishsound, salthmmm, @@ -2371,15 +2349,16 @@ static menuitem_t OP_SaturnHudMenu[] = {IT_STRING | IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 135}, {IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 140}, + {IT_STRING | IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 150}, - {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 150}, + {IT_STRING | IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 160}, - {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 160}, + {IT_STRING | IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 170}, - {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 170}, - {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 175}, + {IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 180}, + {IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 185}, - {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 185}, + {IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 195}, }; static const char* OP_SaturnHudTooltips[] = @@ -2403,6 +2382,7 @@ static const char* OP_SaturnHudTooltips[] = "Show the big Cecho Messages.", "Show player names on the minimap.", "Minimize the player icons on the minimap.", + "Erratically rotate player icons during spinouts.", "Make the Intermission screen look like in beta versions of Kart!\nEither with background or just the rest.", "Show the Director Toggle prompt when spectating.", "Nametag Options.", @@ -2431,6 +2411,7 @@ enum sh_cechotogle, sh_mapname, sh_smallmap, + sh_iconspinout, sh_betainter, sh_directorhud, sh_nametagmen, @@ -3487,33 +3468,8 @@ void Moviemode_option_Onchange(void) void PDistort_menu_Onchange(void) { -<<<<<<< HEAD OP_PlayerDistortMenu[slrotatedist].status = (cv_sloperoll.value) ? IT_STRING | IT_CVAR : IT_GRAYEDOUT; -======= - if (!cv_spriteroll.value) - { - OP_PlayerDistortMenu[sloperotate].status = IT_GRAYEDOUT; - OP_PlayerDistortMenu[sliptide].status = IT_GRAYEDOUT; - OP_PlayerDistortMenu[iconspinout].status = IT_GRAYEDOUT; - } - else - { - OP_PlayerDistortMenu[sloperotate].status = IT_STRING | IT_CVAR; - OP_PlayerDistortMenu[sliptide].status = IT_STRING | IT_CVAR; - OP_PlayerDistortMenu[iconspinout].status = IT_STRING | IT_CVAR; - } - - if ((cv_sloperoll.value) && (cv_spriteroll.value)) //enable/disable sloperotate distance - OP_PlayerDistortMenu[slrotatedist].status = IT_STRING | IT_CVAR; - else - OP_PlayerDistortMenu[slrotatedist].status = IT_GRAYEDOUT; - - if ((cv_sloperoll.value == 2) && (cv_spriteroll.value)) //enable/disable sparkroll depending on which setting - OP_PlayerDistortMenu[sparkrotate].status = IT_STRING | IT_CVAR; - else - OP_PlayerDistortMenu[sparkrotate].status = IT_GRAYEDOUT; ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) } void Bird_menu_Onchange(void) diff --git a/src/p_mobj.c b/src/p_mobj.c index 007d59836..df2964df5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10728,7 +10728,6 @@ void P_SpawnPlayer(INT32 playernum) p->hitemtimer = 0; p->hitemvictim = 255; - p->doiconspin = 0; p->spinoutrot = 0; if (G_BattleGametype()) // SRB2kart diff --git a/src/p_user.c b/src/p_user.c index a9ea372ac..dacd18868 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4430,394 +4430,9 @@ DoABarrelRoll (player_t *player) player->tilt = slope; } -<<<<<<< HEAD -======= -/* set follower state with our weird hacks - the reason we do this is to avoid followers ever using actions (majormods, yikes!) - without having to touch p_mobj.c. - so we give it 1more tic and change the state when tic == 1 instead of 0 - cool beans? - cool beans. -*/ -static void P_SetFollowerState(mobj_t *f, statenum_t state) -{ - if (f == NULL || P_MobjWasRemoved(f) == true) - { - // safety net - return; - } - - // No, do NOT set the follower to S_NULL. Set it to S_INVISIBLE. - if (state == S_NULL) - { - state = S_INVISIBLE; - f->threshold = 1; // Threshold = 1 means stop doing anything related to setting states, so that we don't get out of S_INVISIBLE - } - - // extravalue2 stores the last "first state" we used. - // because states default to idlestates, if we use an animation that uses an "ongoing" state line, don't reset it! - // this prevents it from looking very dumb - if (state == (statenum_t)f->extravalue2) - { - return; - } - - // we will save the state into extravalue2. - f->extravalue2 = state; - - P_SetMobjStateNF(f, state); - if (f->state->tics > 0) - { - f->tics++; - } -} - -UINT8 K_GetEffectiveFollowerColor(UINT8 followercolor, follower_t *follower, UINT8 playercolor, skin_t *playerskin) -{ - if (followercolor == SKINCOLOR_NONE && follower != NULL) // "Default" - { - followercolor = follower->defaultcolor; - } - - if (followercolor > SKINCOLOR_NONE && followercolor < MAXSKINCOLORS) // bog standard - { - return followercolor; - } - - if (playercolor == SKINCOLOR_NONE) // get default color - { - if (playerskin == NULL) - { - // Nothing from this line down is valid if playerskin is invalid, just guess Sonic? - playerskin = &skins[0]; - } - - playercolor = playerskin->prefcolor; - } - - if (followercolor == FOLLOWERCOLOR_OPPOSITE) // "Opposite" - { - return KartColor_Opposite[playercolor]; - } - - // "Match" - return playercolor; -} - -static void K_UpdateFollowerState(mobj_t *f, statenum_t state, followerstate_t type) -{ - if (f == NULL || P_MobjWasRemoved(f) == true) - { - // safety net - return; - } - - if (f->extravalue1 != (INT32)type) - { - P_SetFollowerState(f, state); - f->extravalue1 = type; - } -} - - -// -//P_HandleFollower -// -//Handle the follower's spawning and moving along with the player. Do note that some of the stuff like the removal if a player doesn't exist anymore is handled in MT_FOLLOWER's thinker. -static void P_HandleFollower(player_t *player) -{ - follower_t fl; - angle_t an; - fixed_t zoffs; - fixed_t ourheight; - fixed_t sx, sy, sz, deltaz; - fixed_t fh = INT32_MIN, ch = INT32_MAX; - angle_t destAngle; - INT32 angleDiff; - UINT16 color; - - if (!player->followerready) - return; // we aren't ready to perform anything follower related yet. - - // How about making sure our follower exists and is added before trying to spawn it n' all? - if (player->followerskin > numfollowers-1 || player->followerskin < -1) - { - //CONS_Printf("Follower skin invlaid. Setting to -1.\n"); - player->followerskin = -1; - return; - } - - // don't do anything if we can't have a follower to begin with. - // (It gets removed under those conditions) - if (player->spectator || player->followerskin < 0 - || player->mo == NULL || P_MobjWasRemoved(player->mo)) - { - if (player->follower) - { - P_RemoveMobj(player->follower); - P_SetTarget(&player->follower, NULL); - } - return; - } - // Before we do anything, let's be sure of where we're supposed to be - fl = followers[player->followerskin]; - - an = player->mo->angle + fl.atangle; - zoffs = fl.zoffs; - - // do you like angle maths? I certainly don't... - sx = player->mo->x + player->mo->momx + FixedMul(FixedMul(player->mo->scale, fl.dist), FINECOSINE((an) >> ANGLETOFINESHIFT)); - sy = player->mo->y + player->mo->momy + FixedMul(FixedMul(player->mo->scale, fl.dist), FINESINE((an) >> ANGLETOFINESHIFT)); - - // interp info helps with stretchy fix - deltaz = (player->mo->z - player->mo->old_z); - - // for the z coordinate, don't be a doof like Steel and forget that MFE_VERTICALFLIP exists :P - sz = player->mo->z + player->mo->momz + FixedMul(player->mo->scale, zoffs * P_MobjFlip(player->mo)); - ourheight = FixedMul(fl.height, player->mo->scale); - if (player->mo->eflags & MFE_VERTICALFLIP) - { - sz += ourheight; - } - - fh = player->mo->floorz; - ch = player->mo->ceilingz - ourheight; - - switch (fl.mode) - { - case FOLLOWERMODE_GROUND: - { - if (player->mo->eflags & MFE_VERTICALFLIP) - { - sz = ch; - } - else - { - sz = fh; - } - break; - } - case FOLLOWERMODE_FLOAT: - default: - { - // finally, add a cool floating effect to the z height. - // not stolen from k_kart I swear!! - fixed_t sine = FixedMul(fl.bobamp, - FINESINE((( - FixedMul(4 * M_TAU_FIXED, fl.bobspeed) * leveltime - ) >> ANGLETOFINESHIFT) & FINEMASK)); - sz += FixedMul(player->mo->scale, sine) * P_MobjFlip(player->mo); - break; - } - } - - // Set follower colour - - color = K_GetEffectiveFollowerColor(player->followercolor, &fl, player->skincolor, &skins[player->skin]); - - if (!player->follower) // follower doesn't exist / isn't valid - { - //CONS_Printf("Spawning follower...\n"); - - // so let's spawn one! - P_SetTarget(&player->follower, P_SpawnMobj(sx, sy, sz, MT_FOLLOWER)); - if (player->follower == NULL) - return; - - K_UpdateFollowerState(player->follower, fl.idlestate, FOLLOWERSTATE_IDLE); - - P_SetTarget(&player->follower->target, player->mo); // we need that to know when we need to disappear - player->follower->angle = player->follower->old_angle = player->mo->angle; - } - else // follower exists, woo! - { - - // first of all, handle states following the same model as above: - if (player->follower->tics == 1) - P_SetFollowerState(player->follower, player->follower->state->nextstate); - - // Spawn Follower Shadow - player->follower->haveshadow = true; - player->follower->shadowscale = FRACUNIT; - - // move the follower next to us (yes, this is really basic maths but it looks pretty damn clean in practice)! - player->follower->momx = FixedDiv(sx - player->follower->x, fl.horzlag); - player->follower->momy = FixedDiv(sy - player->follower->y, fl.horzlag); - - player->follower->z += FixedDiv(deltaz, fl.vertlag); - - if (fl.mode == FOLLOWERMODE_GROUND) - { - sector_t *sec = player->follower->subsector->sector; - - fh = min(fh, P_GetFloorZ(player->follower, sec, sx, sy, NULL)); - ch = max(ch, P_GetCeilingZ(player->follower, sec, sx, sy, NULL) - ourheight); - - if (P_IsObjectOnGround(player->mo) == false) - { - // In the air, match their momentum. - player->follower->momz = player->mo->momz; - if (player->follower->z <= sz) // Don't go under the floor please - player->follower->z = sz; - } - else - { - fixed_t fg = P_GetMobjGravity(player->mo); - fixed_t fz = P_GetMobjZMovement(player->follower); - - player->follower->momz = fz; - - // Player is on the ground ... try to get the follower - // back to the ground also if it is above it. - if (player->follower->z > sz) // Don't go under the floor please - player->follower->momz += FixedDiv(fg * 6, fl.vertlag); // Scaled against the default value of vertlag - - - // Other wise match current floor - player->follower->momz = sz - player->follower->z; - - } - } - else - { - player->follower->momz = FixedDiv(sz - player->follower->z, fl.vertlag); - } - - if (player->mo->colorized) - player->follower->color = player->mo->color; - else - player->follower->color = color; - - player->follower->colorized = player->mo->colorized; - - P_SetScale(player->follower, FixedMul(fl.scale, player->mo->scale)); - K_GenericExtraFlagsNoZAdjust(player->follower, player->mo); // Not K_MatchGenericExtraFlag because the Z adjust it has only works properly if master & mo have the same Z height. - - // For comeback in battle. - player->follower->flags2 = (player->follower->flags2 & ~MF2_SHADOW)|(player->mo->flags2 & MF2_SHADOW); - - // Make the follower invisible if we no contest'd rather than removing it. No one will notice the diff seriously. - if (player->pflags & PF_TIMEOVER) // there is more to it than that to check for a full no contest but this isn't used for anything else. - player->follower->flags2 |= MF2_DONTDRAW; - - if (cv_hidefollowers.value) // hide em for people who don't want them - player->follower->flags2 |= MF2_DONTDRAW; - - // if we're moving let's make the angle the direction we're moving towards. This is to avoid drifting / reverse looking awkward. - if (FixedHypot(player->follower->momx, player->follower->momy) >= player->mo->scale) - { - destAngle = R_PointToAngle2(0, 0, player->follower->momx, player->follower->momy); - } - else - { - // Face the player's angle when standing still. - destAngle = player->mo->angle; - } - - /*// Sal: Turn the follower around when looking backwards. - if ( player->cmd.buttons & BT_LOOKBACK ) - { - destAngle += ANGLE_180; - }*/ - - // Sal: Smoothly rotate angle to the destination value. - angleDiff = AngleDeltaSigned(destAngle, player->follower->angle); - - if (angleDiff != 0) - { - player->follower->angle += FixedDiv(angleDiff, fl.anglelag); - } - - // Ground follower slope rotation - if (fl.mode == FOLLOWERMODE_GROUND) - { - K_CalculateFollowerSlope( - player->follower, - player->follower->x, player->follower->y, player->follower->z, - player->follower->radius, ourheight, - (player->mo->eflags & MFE_VERTICALFLIP), - false - ); - } - - if (player->follower->threshold) - { - // Threshold means the follower was "despanwed" with S_NULL. - return; - } - - // However with how the code is factored, this is just a special case of S_INVISBLE to avoid having to add other player variables. - - // handle follower animations. Could probably be better... - - // Squish - if (player->kartstuff[k_squishedtimer] > 0) - { - // cancel hit confirm - player->follower->movecount = 0; - player->follower->cvmem = 0; - - if (player->kartstuff[k_squishedtimer] > 1) - player->follower->spriteyscale = FRACUNIT/4; - else - player->follower->spriteyscale = FRACUNIT; - - K_UpdateFollowerState(player->follower, fl.hurtstate, FOLLOWERSTATE_HURT); - - } - else if (P_PlayerInPain(player) == true || player->mo->state == &states[S_KART_SPIN] || player->mo->health <= 0) - { - // hurt or dead - // cancel hit confirm - player->follower->movecount = 0; - player->follower->cvmem = 0; - - // spin out - player->follower->angle = player->frameangle; - - K_UpdateFollowerState(player->follower, fl.hurtstate, FOLLOWERSTATE_HURT); - - if (player->mo->health <= 0) - { - // if dead, follow the player's z momentum exactly so they both look like they die at the same speed. - player->follower->momz = player->mo->momz; - } - } - else if (player->exiting) - { - // win/ loss animations - if (K_IsPlayerLosing(player)) - { - // L - K_UpdateFollowerState(player->follower, fl.losestate, FOLLOWERSTATE_LOSE); - } - else - { - // W - K_UpdateFollowerState(player->follower, fl.winstate, FOLLOWERSTATE_WIN); - } - } - else if (player->follower->movecount) - { - K_UpdateFollowerState(player->follower, fl.hitconfirmstate, FOLLOWERSTATE_HITCONFIRM); - player->follower->movecount--; - } - else if (player->speed > 10*player->mo->scale) // animation for moving fast enough - { - K_UpdateFollowerState(player->follower, fl.followstate, FOLLOWERSTATE_FOLLOW); - } - else - { - K_UpdateFollowerState(player->follower, fl.idlestate, FOLLOWERSTATE_IDLE); - } - - } -} - #define SPINOUTROTSPEED (24 * FRACUNIT) #define MAXSPINROT (360 * FRACUNIT) ->>>>>>> 432dcd3a3 (Refactor to prevent desynchs) // // P_PlayerThink // @@ -4961,25 +4576,17 @@ void P_PlayerThink(player_t *player) } } - // If it is set, start subtracting - // Don't allow it to go back to 0 - if (player->exiting > 1 && (player->exiting < raceexittime+2 || !G_RaceGametype())) // SRB2kart - "&& player->exiting > 1" - player->exiting--; - - if (player->exiting && exitcountdown) - player->exiting = 99; // SRB2kart - - if ((player->doiconspin) && (player->spinoutrot == 0)) + if (player->kartstuff[k_spinouttimer] && (player->spinoutrot == 0)) { player->spinoutrot = SPINOUTROTSPEED; } // MKWii-styled icon spinouts: do a full 360 rotation before stopping. - if ((player->spinoutrot) && (player->spinoutrot < MAXSPINROT)) + if (player->spinoutrot && (player->spinoutrot < MAXSPINROT)) { if ((player->spinoutrot + SPINOUTROTSPEED) >= MAXSPINROT) { - if (player->doiconspin) + if (player->kartstuff[k_spinouttimer]) { player->spinoutrot = (player->spinoutrot + SPINOUTROTSPEED) % MAXSPINROT; } @@ -4994,6 +4601,14 @@ void P_PlayerThink(player_t *player) } } + // If it is set, start subtracting + // Don't allow it to go back to 0 + if (player->exiting > 1 && (player->exiting < raceexittime+2 || !G_RaceGametype())) // SRB2kart - "&& player->exiting > 1" + player->exiting--; + + if (player->exiting && exitcountdown) + player->exiting = 99; // SRB2kart + if (player->exiting == 2 || exitcountdown == 2) { if (cv_playersforexit.value) // Count to be sure everyone's exited diff --git a/src/w_wad.c b/src/w_wad.c index 82d71c814..8760fc8de 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1125,12 +1125,15 @@ lumpnum_t W_CheckNumForName(const char *name) break; //found it } - if (check == INT16_MAX) return LUMPERROR; + if (check == INT16_MAX) + { + return LUMPERROR; + } else { // Update the cache. lumpnumcacheindex = (lumpnumcacheindex + 1) & (LUMPNUMCACHESIZE - 1); - memset(lumpnumcache[lumpnumcacheindex].lumpname, '\0', 32); + memset(lumpnumcache[lumpnumcacheindex].lumpname, '\0', LUMPNUMCACHENAME); strncpy(lumpnumcache[lumpnumcacheindex].lumpname, name, 8); lumpnumcache[lumpnumcacheindex].lumpnum = (i<<16)+check; @@ -1174,7 +1177,10 @@ lumpnum_t W_CheckNumForLongName(const char *name) } } - if (check == INT16_MAX) return LUMPERROR; + if (check == INT16_MAX) + { + return LUMPERROR; + } else { if (strlen(name) < 32) -- 2.54.0 From 0f675661a62c093442c5673f02f0ca8755322d66 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 15 Mar 2025 16:29:54 +0100 Subject: [PATCH 309/325] bruh --- src/hu_stuff.c | 2 +- src/p_setup.c | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 3acad0823..3cefb74d0 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2432,7 +2432,7 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) if (measureid == 1) V_DrawScaledPatch(x+11 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); - + if (cv_pingicon.value) V_DrawScaledPatch(x+2, y, flags, pinggfx[gfxnum]); diff --git a/src/p_setup.c b/src/p_setup.c index 44b1e19a3..25ff8a94a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2116,21 +2116,13 @@ static void P_LevelInitStuff(boolean reloadinggamestate) players[i].realtime = racecountdown = exitcountdown = 0; -<<<<<<< HEAD -<<<<<<< HEAD for (INT32 j = 0; j < LAP__MAX; j++) { players[i].laptime[j] = 0; } players[i].driftsparkGrowTimer = 0; -======= - // Neptune - players[i].spinoutrot = 0; ->>>>>>> 052dcb263 (Add a cvar for minimap icon spinouts) -======= ->>>>>>> 432dcd3a3 (Refactor to prevent desynchs) players[i].gotcontinue = false; players[i].xtralife = players[i].deadtimer = players[i].numboxes = players[i].totalring = players[i].laps = 0; -- 2.54.0 From a9807847710d8ac0308f14f11d6b2f1e59e64fd0 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 15 Mar 2025 16:30:52 +0100 Subject: [PATCH 310/325] replace magic number --- src/w_wad.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index 8760fc8de..37c992d29 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -88,10 +88,11 @@ typedef struct // Must be a power of two #define LUMPNUMCACHESIZE 64 +#define LUMPNUMCACHENAME 32 typedef struct lumpnum_cache_s { - char lumpname[32]; + char lumpname[LUMPNUMCACHENAME]; lumpnum_t lumpnum; } lumpnum_cache_t; @@ -1183,12 +1184,12 @@ lumpnum_t W_CheckNumForLongName(const char *name) } else { - if (strlen(name) < 32) + if (strlen(name) < LUMPNUMCACHENAME) { // Update the cache. lumpnumcacheindex = (lumpnumcacheindex + 1) & (LUMPNUMCACHESIZE - 1); - memset(lumpnumcache[lumpnumcacheindex].lumpname, '\0', 32); - strlcpy(lumpnumcache[lumpnumcacheindex].lumpname, name, 32); + memset(lumpnumcache[lumpnumcacheindex].lumpname, '\0', LUMPNUMCACHENAME); + strlcpy(lumpnumcache[lumpnumcacheindex].lumpname, name, LUMPNUMCACHENAME); lumpnumcache[lumpnumcacheindex].lumpnum = (i << 16) + check; } -- 2.54.0 From 486f386f3598766f08b76085e8d6606587a55650 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 14 Mar 2025 20:46:25 +0100 Subject: [PATCH 311/325] New input display option for stick display thy neppy! https://codeberg.org/NepDisk/blankart/commit/52601bdfc2a6dd8916c3c401d70128d2ca11a1ff#diff-baf740b84aa99188fc2e5c1cb93e59fa2e319ff3 + hellish abomination code cause kart --- src/g_game.c | 2 +- src/k_kart.c | 134 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 100 insertions(+), 36 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index b75060cff..1c47dda5b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1011,7 +1011,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) cmd->driftturn = (INT16)(cmd->driftturn - ((mousex*(encoremode ? -1 : 1)*8))); } - if (player->spectator || objectplacing) // SRB2Kart: spectators need special controls + if (objectplacing) // SRB2Kart: spectators need special controls // not anymore huehuehue { axis = JoyAxis(AXISMOVE, ssplayer); if (InputDown(gc_accelerate, ssplayer) || (usejoystick && axis > 0)) diff --git a/src/k_kart.c b/src/k_kart.c index f7c37b871..527d923b3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -12,6 +12,7 @@ #include "d_player.h" #include "hu_stuff.h" #include "g_game.h" +#include "i_joy.h" #include "m_fixed.h" #include "m_random.h" #include "m_menu.h" // ffdhidshfuisduifigergho9igj89dgodhfih AAAAAAAAAA @@ -89,7 +90,8 @@ consvar_t cv_airsparks = {"airdriftsparks", "Off", CV_SAVE, CV_OnOff, NULL, 0, N //extra hud things consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +static CV_PossibleValue_t inputdisplay_cons_t[] = {{0, "Off"}, {1, "Wheel"}, {2, "Stick"}, {0, NULL}}; +consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, inputdisplay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showlaptimes = {"showlaptimes", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_posanim = {"postitionanimation", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -10659,7 +10661,7 @@ static void K_drawInput(void) #define BUTTH 11 #define drawbutt(xoffs, butt, symb)\ - if (stplyr->cmd.buttons & butt)\ + if (cmd->buttons & butt)\ {\ offs = 2*FRACUNIT;\ col = accent1;\ @@ -10685,43 +10687,105 @@ static void K_drawInput(void) y -= FRACUNIT; - if (!cmd->driftturn) // no turn - target = 0; - else // turning of multiple strengths! + if (cv_showinput.value == 2) { - target = ((abs(cmd->driftturn) - 1)/125)+1; - if (target > 4) - target = 4; - if (cmd->driftturn < 0) - target = -target; + INT32 joyx, joyxoffs, joyy, joyyoffs, joyflags, axis; + joyxoffs = -8, joyyoffs = -24; + joyx = x>>FRACBITS, joyy = y>>FRACBITS; + joyflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM; + + // O backing + V_DrawFill(joyx+joyxoffs, joyy+joyyoffs-1, 16, 16, joyflags|accent2); + V_DrawFill(joyx+joyxoffs, joyy+joyyoffs+15, 16, 1, joyflags|splitflags|31); + + // time for pain and suffering + // kart does not have anything we can get analogue joystick y axis values from + // during normal gameplay, so replicate shit here + INT32 hudforward[MAXSPLITSCREENPLAYERS] = {0}; // for the stick input display :chaosleep: + const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle; + const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle; + const UINT8 ssplayer = stplyrnum+1; + + axis = JoyAxis(AXISAIM, ssplayer); + + if (analogjoystickmove && axis != 0) + { + // JOYAXISRANGE is supposed to be 1023 (divide by 1024) + hudforward[stplyrnum] -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1)); + } + else + { + if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0)) + { + hudforward[stplyrnum] += KART_FULLTURN; + } + if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0)) + { + hudforward[stplyrnum] -= KART_FULLTURN; + } + } + + hudforward[stplyrnum] = CLAMP(hudforward[stplyrnum], -KART_FULLTURN, KART_FULLTURN); + + if (cmd->driftturn || hudforward[stplyrnum]) + { + INT16 turning = encoremode ? -cmd->driftturn : cmd->driftturn; + // joystick hole + V_DrawFill(joyx+joyxoffs+5, joyy+joyyoffs+4, 6, 6, joyflags|accent1); + // joystick top and back + V_DrawFill(joyx+joyxoffs+3-turning/80, + joyy+joyyoffs+2-hudforward[stplyrnum]/80, + 10, 10, joyflags|31); + V_DrawFill(joyx+joyxoffs+3-turning/64, + joyy+joyyoffs+1-hudforward[stplyrnum]/64, + 10, 10, joyflags|accent1); + } + else + { + V_DrawFill(joyx+joyxoffs+3, joyy+joyyoffs+11, 10, 1, joyflags|accent2); + V_DrawFill(joyx+joyxoffs+3, + joyy+joyyoffs+1, + 10, 10,joyflags|accent1); + } } - - if (pn != target) - { - if (abs(pn - target) == 1) - pn = target; - else if (pn < target) - pn += 2; - else //if (pn > target) - pn -= 2; - } - - if (pn < 0) - { - splitflags |= V_FLIP; // right turn - x -= FRACUNIT; - } - - target = abs(pn); - if (target > 4) - target = 4; - - if (!K_GetHudColor()) - V_DrawFixedPatch(x, y, FRACUNIT, splitflags, kp_inputwheel[target], NULL); else { - UINT8 *colormap; - colormap = R_GetTranslationColormap(0, K_GetHudColor(), GTC_CACHE); + UINT8 *colormap = NULL; + + if (!cmd->driftturn) // no turn + target = 0; + else // turning of multiple strengths! + { + target = ((abs(cmd->driftturn) - 1)/125)+1; + if (target > 4) + target = 4; + if (cmd->driftturn < 0) + target = -target; + } + + if (pn != target) + { + if (abs(pn - target) == 1) + pn = target; + else if (pn < target) + pn += 2; + else //if (pn > target) + pn -= 2; + } + + if (pn < 0) + { + splitflags |= V_FLIP; // right turn + x -= FRACUNIT; + } + + target = abs(pn); + if (target > 4) + target = 4; + + if (K_GetHudColor()) + colormap = R_GetTranslationColormap(0, K_GetHudColor(), GTC_CACHE); + V_DrawFixedPatch(x, y, FRACUNIT, splitflags, kp_inputwheel[target], colormap); } } -- 2.54.0 From b6de9e03d798377449e43f38d2300442c02365a9 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 14 Mar 2025 20:56:46 +0100 Subject: [PATCH 312/325] doesent need be an array --- src/k_kart.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 527d923b3..8a90658d0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10701,7 +10701,7 @@ static void K_drawInput(void) // time for pain and suffering // kart does not have anything we can get analogue joystick y axis values from // during normal gameplay, so replicate shit here - INT32 hudforward[MAXSPLITSCREENPLAYERS] = {0}; // for the stick input display :chaosleep: + INT32 hudforward = 0; // for the stick input display :chaosleep: const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle; const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle; const UINT8 ssplayer = stplyrnum+1; @@ -10711,33 +10711,33 @@ static void K_drawInput(void) if (analogjoystickmove && axis != 0) { // JOYAXISRANGE is supposed to be 1023 (divide by 1024) - hudforward[stplyrnum] -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1)); + hudforward -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1)); } else { if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0)) { - hudforward[stplyrnum] += KART_FULLTURN; + hudforward += KART_FULLTURN; } if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0)) { - hudforward[stplyrnum] -= KART_FULLTURN; + hudforward-= KART_FULLTURN; } } - hudforward[stplyrnum] = CLAMP(hudforward[stplyrnum], -KART_FULLTURN, KART_FULLTURN); + hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN); - if (cmd->driftturn || hudforward[stplyrnum]) + if (cmd->driftturn || hudforward) { INT16 turning = encoremode ? -cmd->driftturn : cmd->driftturn; // joystick hole V_DrawFill(joyx+joyxoffs+5, joyy+joyyoffs+4, 6, 6, joyflags|accent1); // joystick top and back V_DrawFill(joyx+joyxoffs+3-turning/80, - joyy+joyyoffs+2-hudforward[stplyrnum]/80, + joyy+joyyoffs+2-hudforward/80, 10, 10, joyflags|31); V_DrawFill(joyx+joyxoffs+3-turning/64, - joyy+joyyoffs+1-hudforward[stplyrnum]/64, + joyy+joyyoffs+1-hudforward/64, 10, 10, joyflags|accent1); } else -- 2.54.0 From 3762b18159ef6600a9763c67fd38b8050ba0de20 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 14 Mar 2025 21:00:00 +0100 Subject: [PATCH 313/325] just use splitflags --- src/k_kart.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8a90658d0..75255efa3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10689,14 +10689,13 @@ static void K_drawInput(void) if (cv_showinput.value == 2) { - INT32 joyx, joyxoffs, joyy, joyyoffs, joyflags, axis; + INT32 joyx, joyxoffs, joyy, joyyoffs, axis; joyxoffs = -8, joyyoffs = -24; joyx = x>>FRACBITS, joyy = y>>FRACBITS; - joyflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM; // O backing - V_DrawFill(joyx+joyxoffs, joyy+joyyoffs-1, 16, 16, joyflags|accent2); - V_DrawFill(joyx+joyxoffs, joyy+joyyoffs+15, 16, 1, joyflags|splitflags|31); + V_DrawFill(joyx+joyxoffs, joyy+joyyoffs-1, 16, 16, splitflags|accent2); + V_DrawFill(joyx+joyxoffs, joyy+joyyoffs+15, 16, 1, splitflags|31); // time for pain and suffering // kart does not have anything we can get analogue joystick y axis values from @@ -10731,21 +10730,21 @@ static void K_drawInput(void) { INT16 turning = encoremode ? -cmd->driftturn : cmd->driftturn; // joystick hole - V_DrawFill(joyx+joyxoffs+5, joyy+joyyoffs+4, 6, 6, joyflags|accent1); + V_DrawFill(joyx+joyxoffs+5, joyy+joyyoffs+4, 6, 6, splitflags|accent1); // joystick top and back V_DrawFill(joyx+joyxoffs+3-turning/80, joyy+joyyoffs+2-hudforward/80, - 10, 10, joyflags|31); + 10, 10, splitflags|31); V_DrawFill(joyx+joyxoffs+3-turning/64, joyy+joyyoffs+1-hudforward/64, - 10, 10, joyflags|accent1); + 10, 10, splitflags|accent1); } else { - V_DrawFill(joyx+joyxoffs+3, joyy+joyyoffs+11, 10, 1, joyflags|accent2); + V_DrawFill(joyx+joyxoffs+3, joyy+joyyoffs+11, 10, 1, splitflags|accent2); V_DrawFill(joyx+joyxoffs+3, joyy+joyyoffs+1, - 10, 10,joyflags|accent1); + 10, 10,splitflags|accent1); } } else -- 2.54.0 From 5ec0af62d97e12437e4cbe91cce1ec8496900652 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 15 Mar 2025 14:39:04 +0100 Subject: [PATCH 314/325] safe 2x "va" lel V_GetSkincolorChar is unused now lel --- src/k_kart.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 75255efa3..4c5789d16 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8231,7 +8231,7 @@ static void K_drawKartStats(void) if (!splitscreen) { // Skin name - V_DrawSmallString(x+20, y+12, flags|V_ALLOWLOWERCASE, va("%c%s", V_GetSkincolorChar(stplyr->skincolor), fakeskin->realname)); + V_DrawSmallString(x+20, y+12, flags|V_ALLOWLOWERCASE|V_SkinColorToHighlightcolor(stplyr->skincolor), fakeskin->realname); // Icon and stats if (cv_highresportrait.value) @@ -10119,8 +10119,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags) if (cv_showminimapnames.value && mo->player && !(modeattacking || gamestate == GS_TIMEATTACK)) { - const char *player_name = va("%c%s", (mo->color) ? V_GetSkincolorChar(mo->color) : 0, player_names[mo->player - players]); - V_DrawCenteredSmallStringAtFixed(amxpos + (4*FRACUNIT), amypos - (3*FRACUNIT), V_ALLOWLOWERCASE|flags, player_name); + V_DrawCenteredSmallStringAtFixed(amxpos + (4*FRACUNIT), amypos - (3*FRACUNIT), V_ALLOWLOWERCASE|flags|V_SkinColorToHighlightcolor(mo->color), player_names[mo->player - players]); } // thx wanted reticle for having weird offsets very cool -- 2.54.0 From 380c8f65c88503ba95809e34ef7326ffc4fb671d Mon Sep 17 00:00:00 2001 From: Indev Date: Sat, 15 Mar 2025 16:45:48 +0300 Subject: [PATCH 315/325] aatree is used both with HWRENDER and ROTSPRITE, so just don't guard its include --- src/w_wad.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/w_wad.h b/src/w_wad.h index fd350f6b8..d0eb28f2f 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -106,9 +106,7 @@ virtlump_t* vres_Find(const virtres_t*, const char*); #define lumpcache_t void * -#ifdef HWRENDER #include "m_aatree.h" -#endif // Resource type of the WAD. Yeah, I know this sounds dumb, but I'll leave it like this until I clean up the code further. typedef enum restype -- 2.54.0 From 8c43857bd3d0eeb32be662989648d65f96ed31db Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 15 Mar 2025 16:46:37 +0100 Subject: [PATCH 316/325] add extra check to save a little bit of time --- 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 4c5789d16..56fb9de8c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10134,7 +10134,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags) } #ifdef ROTSPRITE - if (cv_spinoutroll.value && mo->player) + if (cv_spinoutroll.value && mo->player && mo->player->spinoutrot) { // Rotate counterclockwise. rollangle = FixedAngle(mo->player->spinoutrot * -1); -- 2.54.0 From 8c8fe976d7b437eaba30d52e6363535e5b06e61d Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 16 Mar 2025 00:22:31 +0100 Subject: [PATCH 317/325] dumb hack for input display in replays since we cant get playerinput, just use throwdir to get some appoximation maybe todo: idk maybe squeeze smth into replays? --- src/k_kart.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 56fb9de8c..90f1c94d2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10700,27 +10700,35 @@ static void K_drawInput(void) // kart does not have anything we can get analogue joystick y axis values from // during normal gameplay, so replicate shit here INT32 hudforward = 0; // for the stick input display :chaosleep: - const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle; - const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle; - const UINT8 ssplayer = stplyrnum+1; - axis = JoyAxis(AXISAIM, ssplayer); - - if (analogjoystickmove && axis != 0) + if (!demo.playback) { - // JOYAXISRANGE is supposed to be 1023 (divide by 1024) - hudforward -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1)); + const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle; + const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle; + const UINT8 ssplayer = stplyrnum+1; + + axis = JoyAxis(AXISAIM, ssplayer); + + if (analogjoystickmove && axis != 0) + { + // JOYAXISRANGE is supposed to be 1023 (divide by 1024) + hudforward -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1)); + } + else + { + if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0)) + { + hudforward += KART_FULLTURN; + } + if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0)) + { + hudforward-= KART_FULLTURN; + } + } } - else + else // this is horrid but we cant get actual input in replays so uhh { - if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0)) - { - hudforward += KART_FULLTURN; - } - if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0)) - { - hudforward-= KART_FULLTURN; - } + hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN; } hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN); -- 2.54.0 From 16b74190e5169a5a83c1197a8f51ddc3ce2d9694 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 16 Mar 2025 11:22:15 +0100 Subject: [PATCH 318/325] put player into var in rankingsdrawer --- src/k_kart.c | 41 +++++++++++++++++++++-------------------- src/y_inter.c | 12 +++++++----- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 274a85c32..d9a4e9db1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9075,14 +9075,15 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I { char strtime[MAXPLAYERNAME+1]; const UINT8 pnum = tab[i].num; + player_t *player = &players[pnum]; - if (players[pnum].spectator || !players[pnum].mo) + if (player->spectator || !player->mo) continue; //ignore them. - const boolean whiteplayer = _isHighlightedPlayer(&players[pnum]); - const INT32 philicol = (whiteplayer ? V_SkinColorToHighlightcolor(players[pnum].skincolor) : 0); + const boolean whiteplayer = _isHighlightedPlayer(player); + const INT32 philicol = (whiteplayer ? V_SkinColorToHighlightcolor(player->skincolor) : 0); - if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[pnum]))) + if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(player))) { HU_drawPlayerPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, pnum, 0); } @@ -9094,23 +9095,23 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I else V_DrawString(x + 20, y, philicol|V_ALLOWLOWERCASE, strtime); - if (players[pnum].mo->color) + if (player->mo->color) { - if (players[pnum].mo->colorized) - colormap = R_GetTranslationColormap(TC_RAINBOW, players[pnum].mo->color, GTC_CACHE); + if (player->mo->colorized) + colormap = R_GetTranslationColormap(TC_RAINBOW, player->mo->color, GTC_CACHE); else - colormap = R_GetTranslationColormap(players[pnum].skin, players[pnum].mo->color, GTC_CACHE); + colormap = R_GetTranslationColormap(player->skin, player->mo->color, GTC_CACHE); if (cv_highresportrait.value) - V_DrawSmallMappedPatch(x, y-4, 0, R_GetSkinFaceWant(&players[pnum]), colormap); + V_DrawSmallMappedPatch(x, y-4, 0, R_GetSkinFaceWant(player), colormap); else - V_DrawMappedPatch(x, y-4, 0, R_GetSkinFaceRank(&players[pnum]), colormap); + V_DrawMappedPatch(x, y-4, 0, R_GetSkinFaceRank(player), colormap); - /*if (G_BattleGametype() && players[pnum].kartstuff[k_bumper] > 0) -- not enough space for this + /*if (G_BattleGametype() && player->kartstuff[k_bumper] > 0) -- not enough space for this { INT32 bumperx = x+19; V_DrawMappedPatch(bumperx-2, y-4, 0, kp_tinybumper[0], colormap); - for (j = 1; j < players[pnum].kartstuff[k_bumper]; j++) + for (j = 1; j < player->kartstuff[k_bumper]; j++) { bumperx += 5; V_DrawMappedPatch(bumperx, y-4, 0, kp_tinybumper[1], colormap); @@ -9121,11 +9122,11 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (whiteplayer) V_DrawScaledPatch(x, y-4, 0, kp_facehighlight[(leveltime / 4) % 8]); - if (G_BattleGametype() && players[pnum].kartstuff[k_bumper] <= 0) + if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) V_DrawScaledPatch(x-4, y-7, 0, kp_ranknobumpers); else { - INT32 pos = players[pnum].kartstuff[k_position]; + INT32 pos = player->kartstuff[k_position]; if (pos < 0 || pos > MAXPLAYERS) pos = 0; // Draws the little number over the face @@ -9137,18 +9138,18 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I #define timestring(time) va("%i'%02i\"%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time)) if (scorelines > 8) { - if (players[pnum].exiting) - V_DrawRightAlignedThinString(x+rightoffset, y-1, hilicol|V_6WIDTHSPACE, timestring(players[pnum].realtime)); - else if (players[pnum].pflags & PF_TIMEOVER) + if (player->exiting) + V_DrawRightAlignedThinString(x+rightoffset, y-1, hilicol|V_6WIDTHSPACE, timestring(player->realtime)); + else if (player->pflags & PF_TIMEOVER) V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, "NO CONTEST."); else if (circuitmap) V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, va("Lap %d", tab[i].count)); } else { - if (players[pnum].exiting) - V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[pnum].realtime)); - else if (players[pnum].pflags & PF_TIMEOVER) + if (player->exiting) + V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(player->realtime)); + else if (player->pflags & PF_TIMEOVER) V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST."); else if (circuitmap) V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count)); diff --git a/src/y_inter.c b/src/y_inter.c index b8bd6f53c..14adc386f 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -385,17 +385,18 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) for (i = 0; i < standings->numplayers; i++) { const UINT8 pnum = standings->num[i]; + player_t *player = &players[pnum]; if (pnum == MAXPLAYERS) ; - else if (!playeringame[pnum] || players[pnum].spectator == true) + else if (!playeringame[pnum] || player->spectator) standings->num[i] = MAXPLAYERS; // this should be the only field setting in this function else { char strtime[MAXPLAYERNAME+1]; - const boolean whiteplayer = _isHighlightedPlayer(&players[pnum]); - const INT32 philicol = (whiteplayer ? V_SkinColorToHighlightcolor(players[pnum].skincolor) : 0); + const boolean whiteplayer = _isHighlightedPlayer(player); + const INT32 philicol = (whiteplayer ? V_SkinColorToHighlightcolor(player->skincolor) : 0); // Apply the jitter offset (later reversed) if (standings->jitter[pnum] > 0) @@ -403,13 +404,14 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol) V_DrawCenteredString(x+6, y, 0, va("%d", standings->pos[i])); + // localskins are amazing if (standings->color[i] != SKINCOLOR_NONE) { UINT8 *colormap = R_GetTranslationColormap(*standings->character[i], *standings->color[i], GTC_CACHE); - INT32 skinnum = (players[pnum].localskin ? (players[pnum].localskin - 1) : *standings->character[i]); + INT32 skinnum = (player->localskin ? (player->localskin - 1) : *standings->character[i]); patch_t *faceprefix = NULL; - if (!players[pnum].skinlocal) + if (!player->skinlocal) faceprefix = (cv_highresportrait.value ? facewantprefix[skinnum] : facerankprefix[skinnum]); else faceprefix = (cv_highresportrait.value ? localfacewantprefix[skinnum] : localfacerankprefix[skinnum]); -- 2.54.0 From aba138447c03a8536a7485b8b8f3d5e13f76d4c3 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 20 Mar 2025 17:31:57 +0100 Subject: [PATCH 319/325] =?UTF-8?q?continue=20in=20P=5FNetArchiveThinkers?= =?UTF-8?q?=20l=C3=B6=C3=B6p?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit if thinker is P_RemoveThinkerDelayed --- src/p_saveg.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 3525f58e3..ea3ed47b6 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1680,8 +1680,10 @@ static void P_NetArchiveThinkers(savebuffer_t *save) // save off the current thinkers for (th = thinkercap.next; th != &thinkercap; th = th->next) { - if (th->function.acp1 != (actionf_p1)P_RemoveThinkerDelayed) - numsaved++; + if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + continue; + + numsaved++; if (th->function.acp1 == (actionf_p1)P_MobjThinker) { @@ -1864,7 +1866,7 @@ static void P_NetArchiveThinkers(savebuffer_t *save) continue; } #ifdef PARANOIA - else if (th->function.acp1 != P_RemoveThinkerDelayed) // wait garbage collection + else // wait garbage collection I_Error("unknown thinker type %p", th->function.acp1); #endif } @@ -3459,7 +3461,7 @@ void P_SaveNetGame(savebuffer_t *save, boolean resending) { thinker_t *th; mobj_t *mobj; - INT32 i = 1; // don't start from 0, it'd be confused with a blank pointer otherwise + UINT32 i = 1; // don't start from 0, it'd be confused with a blank pointer otherwise CV_SaveNetVars(&save->p, false); P_NetArchiveMisc(save, resending); -- 2.54.0 From 189a28f34953bb4398f4f04d859b8fe189be10aa Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 20 Mar 2025 18:13:53 +0100 Subject: [PATCH 320/325] delet player_joining --- src/d_clisrv.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 1b5478b62..f8bf58efb 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -151,7 +151,6 @@ static UINT32 resynch_status[MAXNETNODES]; // 0 bit means synched for that playe static UINT8 resynch_sent[MAXNETNODES][MAXPLAYERS]; // what synch packets have we attempted to send to the player static UINT8 resynch_inprogress[MAXNETNODES]; static UINT8 resynch_local_inprogress = false; // WE are desynched and getting packets to fix it. -static UINT8 player_joining = false; UINT8 hu_resynching = 0; #ifdef SATURNSYNCH @@ -4877,7 +4876,6 @@ static void HandleConnect(SINT8 node) DEBFILE("send savegame\n"); } SV_AddWaitingPlayers(); - player_joining = true; } #else #ifndef NONET @@ -5838,8 +5836,6 @@ static void GetPackets(void) { SINT8 node; // The packet sender - player_joining = false; - while (HGetPacket()) { node = (SINT8)doomcom->remotenode; @@ -6487,21 +6483,12 @@ boolean TryRunTics(tic_t realtics) } #endif - if (neededtic > gametic) - { - hu_stopped = false; - } - - if (player_joining) - { - hu_stopped = true; - return false; - } - ticking = neededtic > gametic; if (ticking) { + hu_stopped = false; + // run the count * tics while (neededtic > gametic) { -- 2.54.0 From 9283b443c146fe6575e08caa607151615986d029 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 20 Mar 2025 18:32:55 +0100 Subject: [PATCH 321/325] kill this, i want vanilla behaviour --- src/d_clisrv.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f8bf58efb..14ee18d17 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -6517,8 +6517,7 @@ boolean TryRunTics(tic_t realtics) } else { - if (realtics) - hu_stopped = true; + hu_stopped = true; } return ticking; -- 2.54.0 From ea3974d47e2ca6c6c951c20cda5e34b6ca7c3049 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 24 Mar 2025 19:18:34 +0100 Subject: [PATCH 322/325] Revert "clean up some net stuff" This reverts commit f8903e7ce7a6dc0a4184ef743ed684a2164a3cea. --- src/d_net.c | 27 ++++++++++++++++++++++++++- src/d_netfil.c | 1 + src/i_net.h | 20 ++++++++++++++++++++ src/i_tcp.c | 6 ++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/d_net.c b/src/d_net.c index d6b0e2f80..f05cc407f 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -64,6 +64,9 @@ static doomdata_t reboundstore[MAXREBOUND]; static INT16 reboundsize[MAXREBOUND]; static INT32 rebound_head, rebound_tail; +/// \brief bandwith of netgame +INT32 net_bandwidth; + /// \brief max length per packet INT16 hardware_MAXPACKETLENGTH; @@ -1264,7 +1267,10 @@ void D_SetDoomcom(void) { if (doomcom) return; doomcom = Z_Calloc(sizeof (doomcom_t), PU_STATIC, NULL); + doomcom->id = DOOMCOM_ID; doomcom->numslots = doomcom->numnodes = 1; + doomcom->gametype = 0; + doomcom->consoleplayer = 0; doomcom->extratics = 0; } @@ -1288,6 +1294,7 @@ boolean D_CheckNetGame(void) I_NetMakeNodewPort = NULL; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; + net_bandwidth = 30000; // I_InitNetwork sets doomcom and netgame // check and initialize the network driver multiplayer = false; @@ -1307,6 +1314,7 @@ boolean D_CheckNetGame(void) server = true; // WTF? server always true??? // no! The deault mode is server. Client is set elsewhere // when the client executes connect command. + doomcom->ticdup = 1; if (M_CheckParm("-extratic")) { @@ -1317,6 +1325,21 @@ boolean D_CheckNetGame(void) CONS_Printf(M_GetText("Set extratics to %d\n"), doomcom->extratics); } + if (M_CheckParm("-bandwidth")) + { + if (M_IsNextParm()) + { + net_bandwidth = atoi(M_GetNextParm()); + if (net_bandwidth < 1000) + net_bandwidth = 1000; + if (net_bandwidth > 100000) + hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; + CONS_Printf(M_GetText("Network bandwidth set to %d\n"), net_bandwidth); + } + else + I_Error("usage: -bandwidth "); + } + software_MAXPACKETLENGTH = hardware_MAXPACKETLENGTH; if (M_CheckParm("-packetsize")) { @@ -1336,6 +1359,8 @@ boolean D_CheckNetGame(void) if (netgame) multiplayer = true; + if (doomcom->id != DOOMCOM_ID) + I_Error("Doomcom buffer invalid!"); if (doomcom->numnodes > MAXNETNODES) I_Error("Too many nodes (%d), max:%d", doomcom->numnodes, MAXNETNODES); @@ -1348,7 +1373,7 @@ boolean D_CheckNetGame(void) if (M_CheckParm("-debugfile")) { char filename[21]; - INT32 k = consoleplayer - 1; + INT32 k = doomcom->consoleplayer - 1; if (M_IsNextParm()) k = atoi(M_GetNextParm()) - 1; while (!debugfile && k < MAXPLAYERS) diff --git a/src/d_netfil.c b/src/d_netfil.c index e488e083e..223a74066 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -837,6 +837,7 @@ void SV_FileSendTicker(void) netbuffer->packettype = PT_FILEFRAGMENT; + // (((sendbytes-nowsentbyte)*TICRATE)/(I_GetTime()-starttime)<(UINT32)net_bandwidth) while (packetsent-- && filestosend != 0) { for (i = currentnode, j = 0; j < MAXNETNODES; diff --git a/src/i_net.h b/src/i_net.h index 504936a3b..931392580 100644 --- a/src/i_net.h +++ b/src/i_net.h @@ -34,6 +34,7 @@ #define NO_BAN_TIME (time_t)(-1) extern INT16 hardware_MAXPACKETLENGTH; +extern INT32 net_bandwidth; // in byte/s #if defined(_MSC_VER) #pragma pack(1) @@ -41,17 +42,36 @@ extern INT16 hardware_MAXPACKETLENGTH; typedef struct { + /// Supposed to be DOOMCOM_ID + INT32 id; + + /// SRB2 executes an INT32 to execute commands. + INT16 intnum; + /// Communication between SRB2 and the driver. + /// Is CMD_SEND or CMD_GET. + INT16 command; /// Is dest for send, set by get (-1 = no packet). INT16 remotenode; + /// Number of bytes in doomdata to be sent INT16 datalength; /// Info common to all nodes. /// Console is always node 0. INT16 numnodes; + /// Flag: 1 = no duplication, 2-5 = dup for slow nets. + INT16 ticdup; /// Flag: 1 = send a backup tic in every packet. INT16 extratics; + /// kind of game + INT16 gametype; + /// Flag: -1 = new game, 0-5 = load savegame + INT16 savegame; + /// currect map + INT16 map; + /// Info specific to this node. + INT16 consoleplayer; /// Number of "slots": the highest player number in use plus one. INT16 numslots; diff --git a/src/i_tcp.c b/src/i_tcp.c index 54c446258..add396730 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -1642,6 +1642,8 @@ boolean I_InitTcpNetwork(void) // FIXME: for dedicated server, numnodes needs to be set to 0 upon start if (dedicated) doomcom->numnodes = 0; +/* else if (M_IsNextParm()) + doomcom->numnodes = (INT16)atoi(M_GetNextParm());*/ else doomcom->numnodes = 1; @@ -1655,6 +1657,7 @@ boolean I_InitTcpNetwork(void) // FIXME: // ??? and now ? // server on a big modem ??? 4*isdn + net_bandwidth = 16000; hardware_MAXPACKETLENGTH = INETPACKETLENGTH; ret = true; @@ -1681,6 +1684,7 @@ boolean I_InitTcpNetwork(void) // so we're on a LAN COM_BufAddText("connect any\n"); + net_bandwidth = 800000; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; } } @@ -1705,6 +1709,8 @@ boolean I_InitTcpNetwork(void) { // so we're on a LAN COM_BufAddText("connect any\n"); + + net_bandwidth = 800000; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; } } -- 2.54.0 From 3b43df0214d89dae1e3d1f0f0f442b1433898c83 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 24 Mar 2025 19:21:26 +0100 Subject: [PATCH 323/325] delet this --- src/d_net.c | 20 +------------------- src/i_net.h | 1 - src/i_tcp.c | 4 ---- 3 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/d_net.c b/src/d_net.c index f05cc407f..820da034a 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -64,9 +64,6 @@ static doomdata_t reboundstore[MAXREBOUND]; static INT16 reboundsize[MAXREBOUND]; static INT32 rebound_head, rebound_tail; -/// \brief bandwith of netgame -INT32 net_bandwidth; - /// \brief max length per packet INT16 hardware_MAXPACKETLENGTH; @@ -1294,7 +1291,7 @@ boolean D_CheckNetGame(void) I_NetMakeNodewPort = NULL; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; - net_bandwidth = 30000; + // I_InitNetwork sets doomcom and netgame // check and initialize the network driver multiplayer = false; @@ -1325,21 +1322,6 @@ boolean D_CheckNetGame(void) CONS_Printf(M_GetText("Set extratics to %d\n"), doomcom->extratics); } - if (M_CheckParm("-bandwidth")) - { - if (M_IsNextParm()) - { - net_bandwidth = atoi(M_GetNextParm()); - if (net_bandwidth < 1000) - net_bandwidth = 1000; - if (net_bandwidth > 100000) - hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; - CONS_Printf(M_GetText("Network bandwidth set to %d\n"), net_bandwidth); - } - else - I_Error("usage: -bandwidth "); - } - software_MAXPACKETLENGTH = hardware_MAXPACKETLENGTH; if (M_CheckParm("-packetsize")) { diff --git a/src/i_net.h b/src/i_net.h index 931392580..098a6563d 100644 --- a/src/i_net.h +++ b/src/i_net.h @@ -34,7 +34,6 @@ #define NO_BAN_TIME (time_t)(-1) extern INT16 hardware_MAXPACKETLENGTH; -extern INT32 net_bandwidth; // in byte/s #if defined(_MSC_VER) #pragma pack(1) diff --git a/src/i_tcp.c b/src/i_tcp.c index add396730..2b7af0e12 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -1657,7 +1657,6 @@ boolean I_InitTcpNetwork(void) // FIXME: // ??? and now ? // server on a big modem ??? 4*isdn - net_bandwidth = 16000; hardware_MAXPACKETLENGTH = INETPACKETLENGTH; ret = true; @@ -1684,7 +1683,6 @@ boolean I_InitTcpNetwork(void) // so we're on a LAN COM_BufAddText("connect any\n"); - net_bandwidth = 800000; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; } } @@ -1709,8 +1707,6 @@ boolean I_InitTcpNetwork(void) { // so we're on a LAN COM_BufAddText("connect any\n"); - - net_bandwidth = 800000; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; } } -- 2.54.0 From 2b299039e68a98ef21691a8026743f590c35ffb3 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 18 Apr 2025 12:35:09 +0200 Subject: [PATCH 324/325] reword this lel --- src/g_game.c | 2 +- src/m_menu.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index b644e2796..231e94ffe 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -647,7 +647,7 @@ void G_SetGameModified(boolean silent, boolean major) G_SetSaveGameModified(); if (!silent) - CONS_Alert(CONS_NOTICE, M_GetText("Record Attack data will be saved to seperate save.\n")); + CONS_Alert(CONS_NOTICE, M_GetText("Record Attack data will be saved to a seperate save file.\n")); // If in record attack recording, cancel it. if (modeattacking) diff --git a/src/m_menu.c b/src/m_menu.c index be0b3131f..09ed017c5 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -6189,7 +6189,7 @@ static boolean M_AddonsRefresh(void) else if (majormods && !prevmajormods) { S_StartSound(NULL, sfx_s221); - message = va("%c%s\x80\nYou've loaded a gameplay-modifying addon.\n\nRecord Attack data will be saved to seperate save.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); + message = va("%c%s\x80\nYou've loaded a gameplay-modifying addon.\n\nRecord Attack data will be saved to a seperate save file.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); prevmajormods = majormods; } -- 2.54.0 From c79f986a8f9c2db010f05df33c39b4af30f1ebb7 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 18 Apr 2025 12:52:24 +0200 Subject: [PATCH 325/325] make a backup of save data before writing to it --- src/g_game.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 231e94ffe..73ca41898 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3643,6 +3643,7 @@ void G_SaveGameData(boolean force) UINT8 btemp; savebuffer_t save; (void)force; + char backupfile[MAX_WADPATH+4]; if (!gamedataloaded) return; // If never loaded (-nodata), don't save @@ -3654,6 +3655,23 @@ void G_SaveGameData(boolean force) return; } + // Create backup of the save data + snprintf(backupfile, sizeof(backupfile), "%s.bak", gamedatafilename); + backupfile[sizeof(backupfile) - 1] = '\0'; + + FILE *gamedata = fopen(gamedatafilename, "r"); + + if (gamedata != NULL) + { + fclose(gamedata); + + if (!FIL_CopyFile(gamedatafilename, backupfile)) + { + CONS_Alert(CONS_WARNING,"Failed to create a backup of save data. Will not attempt to write to save data\n"); + return; + } + } + // Version test WRITEUINT32(save.p, 0xFCAFE211); -- 2.54.0