From 11fce987c00d22085955e01b887b18514dbd0c18 Mon Sep 17 00:00:00 2001
From: James R <justsomejames2@gmail.com>
Date: Sun, 5 May 2024 03:02:53 -0700
Subject: [PATCH] autoring: replace followerskin Goddess cases with
 K_GetEffectiveFollowerSkin function

---
 src/k_follower.c | 42 ++++++++++++++++++++++++------------------
 src/k_follower.h | 15 +++++++++++++++
 src/k_kart.c     | 23 +++++++++--------------
 3 files changed, 48 insertions(+), 32 deletions(-)

diff --git a/src/k_follower.c b/src/k_follower.c
index 1052ec019..dc02685b6 100644
--- a/src/k_follower.c
+++ b/src/k_follower.c
@@ -338,7 +338,7 @@ void K_HandleFollower(player_t *player)
 	angle_t destAngle;
 	INT32 angleDiff;
 
-	boolean fallbackfollower;
+	INT32 followerskin;
 
 	if (player->followerready == false)
 	{
@@ -353,14 +353,11 @@ void K_HandleFollower(player_t *player)
 		player->followerskin = -1;
 	}
 
-	if (player->pflags & PF_AUTORING && player->followerskin == -1)
-		fallbackfollower = true;
-	else
-		fallbackfollower = false;
+	followerskin = K_GetEffectiveFollowerSkin(player);
 
 	// 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 && !fallbackfollower)
+	if (player->spectator || followerskin < 0
 	|| player->mo == NULL || P_MobjWasRemoved(player->mo))
 	{
 		if (player->follower)
@@ -371,10 +368,7 @@ void K_HandleFollower(player_t *player)
 	}
 
 	// Before we do anything, let's be sure of where we're supposed to be
-	if (fallbackfollower)
-		fl = &followers[K_FollowerAvailable("Goddess")];
-	else
-		fl = &followers[player->followerskin];
+	fl = &followers[followerskin];
 
 	an = player->mo->angle + fl->atangle;
 	zoffs = fl->zoffs;
@@ -427,7 +421,7 @@ void K_HandleFollower(player_t *player)
 	}
 
 	// Set follower colour
-	if (fallbackfollower)
+	if (player->followerskin < 0) // using a fallback follower
 		color = fl->defaultcolor;
 	else
 		color = K_GetEffectiveFollowerColor(player->followercolor, fl, player->skincolor, &skins[player->skin]);
@@ -762,22 +756,21 @@ void K_HandleFollower(player_t *player)
 --------------------------------------------------*/
 void K_FollowerHornTaunt(player_t *taunter, player_t *victim, boolean mysticmelodyspecial)
 {
+	// special case for checking for fallback follower for autoring
+	const INT32 followerskin = K_GetEffectiveFollowerSkin(taunter);
+
 	// Basic checks
 	if (
 		taunter == NULL
 		|| victim == NULL
-		|| taunter->followerskin < -1
-		|| taunter->followerskin >= numfollowers
+		|| followerskin < 0
+		|| followerskin >= numfollowers
 	)
 	{
 		return;
 	}
 
-	follower_t *fl;
-	if (taunter->followerskin == -1) /// mmm spaghetti
-		fl = &followers[K_FollowerAvailable("Goddess")]; // special case for checking for fallback follower for autoring
-	else
-		fl = &followers[taunter->followerskin];
+	const follower_t *fl = &followers[followerskin];
 
 	// Restrict mystic melody special status
 	if (mysticmelodyspecial == true)
@@ -902,3 +895,16 @@ void K_FollowerHornTaunt(player_t *taunter, player_t *victim, boolean mysticmelo
 		}
 	}
 }
+
+/*--------------------------------------------------
+	INT32 K_GetEffectiveFollowerSkin(const player_t *player);
+
+		See header file for description.
+--------------------------------------------------*/
+INT32 K_GetEffectiveFollowerSkin(const player_t *player)
+{
+	if ((player->pflags & PF_AUTORING) && player->followerskin == -1)
+		return K_FollowerAvailable("Goddess");
+	else
+		return player->followerskin;
+}
diff --git a/src/k_follower.h b/src/k_follower.h
index 579532d4a..edab92f8e 100644
--- a/src/k_follower.h
+++ b/src/k_follower.h
@@ -246,6 +246,21 @@ void K_RemoveFollower(player_t *player);
 
 void K_FollowerHornTaunt(player_t *taunter, player_t *victim, boolean mysticmelodyspecial);
 
+/*--------------------------------------------------
+	INT32 K_GetEffectiveFollowerSkin(const player_t *player)
+
+		Returns the player's follower, set by profile or as
+		a fallback.
+
+	Input Arguments:-
+		player - The player.
+
+	Return:-
+		The resultant skin id for the follower, or -1 for None
+--------------------------------------------------*/
+
+INT32 K_GetEffectiveFollowerSkin(const player_t *player);
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
diff --git a/src/k_kart.c b/src/k_kart.c
index dfc23d61f..bfd837f24 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -2865,16 +2865,12 @@ void K_TryHurtSoundExchange(mobj_t *victim, mobj_t *attacker)
 	attacker->player->confirmVictim = (victim->player - players);
 	attacker->player->confirmVictimDelay = TICRATE/2;
 
+	const INT32 followerskin = K_GetEffectiveFollowerSkin(attacker->player);
 	if (attacker->player->follower != NULL
-		&& attacker->player->followerskin >= -1
-		&& attacker->player->followerskin < numfollowers)
+		&& followerskin >= 0
+		&& followerskin < numfollowers)
 	{
-		follower_t *fl;
-		if (attacker->player->followerskin == -1) /// mmm spaghetti
-			fl = &followers[K_FollowerAvailable("Goddess")]; // special case for checking for fallback follower for autoring
-		else
-			fl = &followers[attacker->player->followerskin];
-
+		const follower_t *fl = &followers[followerskin];
 		attacker->player->follower->movecount = fl->hitconfirmtime; // movecount is used to play the hitconfirm animation for followers.
 	}
 }
@@ -12665,15 +12661,14 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
 					ring->shadowscale = 0;
 					P_SetTarget(&ring->target, player->mo); // user
 
+					const INT32 followerskin = K_GetEffectiveFollowerSkin(player);
 					if (player->autoring
 						&& player->follower != NULL
-						&& P_MobjWasRemoved(player->follower) == false)
+						&& P_MobjWasRemoved(player->follower) == false
+						&& followerskin >= 0
+						&& followerskin < numfollowers)
 					{
-						const follower_t *fl = &followers[
-							player->followerskin == -1
-								? K_FollowerAvailable("Goddess")
-								: player->followerskin
-						];
+						const follower_t *fl = &followers[followerskin];
 
 						ring->cusval = player->follower->x - player->mo->x;
 						ring->cvmem = player->follower->y - player->mo->y;
-- 
GitLab