From 316cd61d9f8567cd9a1efb4b525155193892f5f0 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 4 Jan 2022 22:41:35 +0000 Subject: [PATCH 1/5] * Fix follower colour being limited to UINT8. * Fix follower colour not being set in offline mode (based on Steel's fix but no UINT8). --- src/d_netcmd.c | 8 +++++--- src/g_demo.c | 18 ++++++++++-------- src/p_user.c | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 7fa504e90..ada2302a1 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -776,10 +776,10 @@ void D_RegisterClientCommands(void) Followercolor_cons_t[i].strvalue = skincolors[i-2].name; } - Followercolor_cons_t[1].value = -1; + Followercolor_cons_t[1].value = UINT16_MAX; Followercolor_cons_t[1].strvalue = "Match"; // Add "Match" option, which will make the follower color match the player's - Followercolor_cons_t[0].value = -2; + Followercolor_cons_t[0].value = UINT16_MAX-1; Followercolor_cons_t[0].strvalue = "Opposite"; // Add "Opposite" option, ...which is like "Match", but for coloropposite. Color_cons_t[MAXSKINCOLORS].value = Followercolor_cons_t[MAXSKINCOLORS+2].value = 0; @@ -1443,6 +1443,8 @@ static void SendNameAndColor(UINT8 n) if (cv_follower[n].value >= -1 && cv_follower[n].value != player->followerskin) SetFollower(playernum, cv_follower[n].value); + player->followercolor = cv_followercolor[n].value; + if (metalrecording && n == 0) { // Starring Metal Sonic as themselves, obviously. SetPlayerSkinByNum(playernum, 5); @@ -1497,7 +1499,7 @@ static void SendNameAndColor(UINT8 n) WRITEUINT16(p, (UINT16)cv_playercolor[n].value); WRITEUINT8(p, (UINT8)cv_skin[n].value); WRITESINT8(p, (SINT8)cv_follower[n].value); - WRITEUINT16(p, (UINT8)cv_followercolor[n].value); + WRITEUINT16(p, (UINT16)cv_followercolor[n].value); SendNetXCmdForPlayer(n, XD_NAMEANDCOLOR, buf, p - buf); } diff --git a/src/g_demo.c b/src/g_demo.c index 2dd3cd277..3885ca3b0 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -299,12 +299,14 @@ void G_ReadDemoExtraData(void) // Follower's color M_Memcpy(name, demo_p, 16); demo_p += 16; - for (i = 0; i < numskincolors; i++) - if (!stricmp(skincolors[i].name, name)) // SRB2kart - { - players[p].followercolor = i; - break; - } + for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite + { + if (!stricmp(Followercolor_cons_t[i].strvalue, name)) + { + players[p].followercolor = i; + break; + } + } } if (extradata & DXD_PLAYSTATE) { @@ -443,7 +445,7 @@ void G_WriteDemoExtraData(void) // write follower color memset(name, 0, 16); - strncpy(name, Followercolor_cons_t[players[i].followercolor].strvalue, 16); // Not KartColor_Names because followercolor has extra values such as "Match" + strncpy(name, Followercolor_cons_t[(UINT16)(players[i].followercolor+2)].strvalue, 16); // Not KartColor_Names because followercolor has extra values such as "Match" M_Memcpy(demo_p,name,16); demo_p += 16; @@ -2056,7 +2058,7 @@ void G_BeginRecording(void) // Save follower's colour memset(name, 0, 16); - strncpy(name, Followercolor_cons_t[player->followercolor].strvalue, 16); // Not KartColor_Names because followercolor has extra values such as "Match" + strncpy(name, Followercolor_cons_t[(UINT16)(player->followercolor+2)].strvalue, 16); // Not KartColor_Names because followercolor has extra values such as "Match" M_Memcpy(demo_p, name, 16); demo_p += 16; diff --git a/src/p_user.c b/src/p_user.c index 5813d1ac4..0d2f77051 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3965,10 +3965,10 @@ static void P_HandleFollower(player_t *player) // Set follower colour switch (player->followercolor) { - case 255: // "Match" (-1) + case UINT16_MAX: // "Match" color = player->skincolor; break; - case 254: // "Opposite" (-2) + case UINT16_MAX-1: // "Opposite" color = skincolors[player->skincolor].invcolor; break; default: From a749160c6b233fbb6d3f84c1951877e4631f7b79 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 4 Jan 2022 22:43:54 +0000 Subject: [PATCH 2/5] Make followers only stretch for their movement *relative* to the player, not their movement in general. --- 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 0d2f77051..3041178ab 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3915,7 +3915,7 @@ static void P_HandleFollower(player_t *player) follower_t fl; angle_t an; fixed_t zoffs; - fixed_t sx, sy, sz; + fixed_t sx, sy, sz, deltaz; UINT16 color; fixed_t bubble; // bubble scale (0 if no bubble) @@ -3949,6 +3949,9 @@ static void P_HandleFollower(player_t *player) sx = player->mo->x + FixedMul((player->mo->scale*fl.dist), FINECOSINE((an)>>ANGLETOFINESHIFT)); sy = player->mo->y + 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 + FixedMul(player->mo->scale, zoffs)*P_MobjFlip(player->mo); if (player->mo->eflags & MFE_VERTICALFLIP) @@ -4032,6 +4035,7 @@ static void P_HandleFollower(player_t *player) // 02/09/2021: cast lag to int32 otherwise funny things happen since it was changed to uint32 in the struct player->follower->momx = (sx - player->follower->x)/ (INT32)fl.horzlag; player->follower->momy = (sy - player->follower->y)/ (INT32)fl.horzlag; + player->follower->z += deltaz/ (INT32)fl.vertlag; player->follower->momz = (sz - player->follower->z)/ (INT32)fl.vertlag; player->follower->angle = player->mo->angle; From 60f08f238071cf50d8d1ce5e7a0628fee74ab1a2 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 4 Jan 2022 23:02:09 +0000 Subject: [PATCH 3/5] Defines per Sal request --- src/d_netcmd.c | 4 ++-- src/p_user.c | 4 ++-- src/r_data.h | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ada2302a1..cc8425b86 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -776,10 +776,10 @@ void D_RegisterClientCommands(void) Followercolor_cons_t[i].strvalue = skincolors[i-2].name; } - Followercolor_cons_t[1].value = UINT16_MAX; + Followercolor_cons_t[1].value = FOLLOWERCOLOR_MATCH; Followercolor_cons_t[1].strvalue = "Match"; // Add "Match" option, which will make the follower color match the player's - Followercolor_cons_t[0].value = UINT16_MAX-1; + Followercolor_cons_t[0].value = FOLLOWERCOLOR_OPPOSITE; Followercolor_cons_t[0].strvalue = "Opposite"; // Add "Opposite" option, ...which is like "Match", but for coloropposite. Color_cons_t[MAXSKINCOLORS].value = Followercolor_cons_t[MAXSKINCOLORS+2].value = 0; diff --git a/src/p_user.c b/src/p_user.c index 3041178ab..ae8a1b359 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3968,10 +3968,10 @@ static void P_HandleFollower(player_t *player) // Set follower colour switch (player->followercolor) { - case UINT16_MAX: // "Match" + case FOLLOWERCOLOR_MATCH: // "Match" color = player->skincolor; break; - case UINT16_MAX-1: // "Opposite" + case FOLLOWERCOLOR_OPPOSITE: // "Opposite" color = skincolors[player->skincolor].invcolor; break; default: diff --git a/src/r_data.h b/src/r_data.h index be92c094e..1228f2420 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -41,6 +41,8 @@ extern INT16 *hicolormaps; // remap high colors to high colors.. extern CV_PossibleValue_t Color_cons_t[]; extern CV_PossibleValue_t Followercolor_cons_t[]; // follower colours table, not a duplicate because of the "Match" option. +#define FOLLOWERCOLOR_MATCH UINT16_MAX +#define FOLLOWERCOLOR_OPPOSITE (UINT16_MAX-1) // I/O, setting up the stuff. void R_InitTextureData(void); From 6651bd404326cdb217beeff75906d1fb1d153c69 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 4 Jan 2022 23:03:51 +0000 Subject: [PATCH 4/5] Also fix bubble --- src/p_user.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_user.c b/src/p_user.c index ae8a1b359..5879e4cf9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4069,6 +4069,7 @@ static void P_HandleFollower(player_t *player) // match follower's momentums and (e)flags(2). bmobj->momx = player->follower->momx; bmobj->momy = player->follower->momy; + bmobj->z += deltaz/ (INT32)fl.vertlag; bmobj->momz = player->follower->momz; P_SetScale(bmobj, FixedMul(bubble, player->mo->scale)); From 30fe1736171272f94c3331f83e4311eb52850f8b Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 4 Jan 2022 23:21:28 +0000 Subject: [PATCH 5/5] Bracketing (fixes a weird bug with bubble) --- 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 5879e4cf9..42311e4f1 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4035,7 +4035,7 @@ static void P_HandleFollower(player_t *player) // 02/09/2021: cast lag to int32 otherwise funny things happen since it was changed to uint32 in the struct player->follower->momx = (sx - player->follower->x)/ (INT32)fl.horzlag; player->follower->momy = (sy - player->follower->y)/ (INT32)fl.horzlag; - player->follower->z += deltaz/ (INT32)fl.vertlag; + player->follower->z += (deltaz/ (INT32)fl.vertlag); player->follower->momz = (sz - player->follower->z)/ (INT32)fl.vertlag; player->follower->angle = player->mo->angle; @@ -4069,7 +4069,7 @@ static void P_HandleFollower(player_t *player) // match follower's momentums and (e)flags(2). bmobj->momx = player->follower->momx; bmobj->momy = player->follower->momy; - bmobj->z += deltaz/ (INT32)fl.vertlag; + bmobj->z += (deltaz/ (INT32)fl.vertlag); bmobj->momz = player->follower->momz; P_SetScale(bmobj, FixedMul(bubble, player->mo->scale));