From b4da50b7fb5861e16a856746ab95ad1c6bbcc827 Mon Sep 17 00:00:00 2001
From: toaster <rollerorbital@gmail.com>
Date: Wed, 13 Nov 2019 16:51:50 +0000
Subject: [PATCH] When you have the skin to set to in A_SignPlayer be "next
 skin", it's possible the initial skin to pick is a not-available character.
 This commit prevents that.

---
 src/p_enemy.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/p_enemy.c b/src/p_enemy.c
index 3cb2b33549..564b9bb31d 100644
--- a/src/p_enemy.c
+++ b/src/p_enemy.c
@@ -5165,15 +5165,26 @@ void A_SignPlayer(mobj_t *actor)
 		// I turned this function into a fucking mess. I'm so sorry. -Lach
 		if (locvar1 == -2) // next skin
 		{
+			player_t *player = actor->target ? actor->target->player : NULL;
+			UINT8 skinnum;
+#define skincheck(num) (player ? !R_SkinUsable(player-players, num) : skins[num].availability > 0)
 			if (ov->skin == NULL) // pick a random skin to start with!
-				skin = &skins[P_RandomKey(numskins)];
+			{
+				UINT8 skincount = 0;
+				for (skincount = 0; skincount < numskins; skincount++)
+					if (!skincheck(skincount))
+						skincount++;
+				skinnum = P_RandomKey(skincount);
+				for (skincount = skinnum; skincount < numskins; skincount++)
+					if (skincheck(skinnum))
+						skinnum++;
+			}
 			else // otherwise, advance 1 skin
 			{
-				UINT8 skinnum = (skin_t*)ov->skin-skins;
-				player_t *player = actor->target ? actor->target->player : NULL;
-				while ((skinnum = (skinnum + 1) % numskins) && (player ? !R_SkinUsable(player-players, skinnum) : skins[skinnum].availability > 0));
-				skin = &skins[skinnum];
+				skinnum = (skin_t*)ov->skin-skins;
+				while ((skinnum = (skinnum + 1) % numskins) && skincheck(skinnum));
 			}
+			skin = &skins[skinnum];
 		}
 		else // specific skin
 		{
-- 
GitLab