From 0aa736dd64fd02d077478323763e88a4385ab8f6 Mon Sep 17 00:00:00 2001
From: Hanicef <gustaf@hanicef.me>
Date: Wed, 8 May 2024 18:39:20 +0200
Subject: [PATCH] Fix numerous sprite bugs

---
 src/deh_soc.c         | 3 +++
 src/hardware/hw_md2.c | 6 +++---
 src/info.c            | 6 ++++++
 src/lua_baselib.c     | 4 ++--
 src/p_mobj.h          | 4 ++--
 src/p_saveg.c         | 8 ++++----
 src/r_picformats.c    | 7 +++++--
 src/r_skins.c         | 4 ++--
 8 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/src/deh_soc.c b/src/deh_soc.c
index f7946ccc9..a00d2aad3 100644
--- a/src/deh_soc.c
+++ b/src/deh_soc.c
@@ -1064,7 +1064,10 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
 					}
 				}
 				else
+				{
+					info->name = spriteinfo[num]->name;
 					M_Memcpy(spriteinfo[num], info, sizeof(spriteinfo_t));
+				}
 			}
 			else
 			{
diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c
index 4e152e395..4c4bd7362 100644
--- a/src/hardware/hw_md2.c
+++ b/src/hardware/hw_md2.c
@@ -1096,7 +1096,7 @@ static boolean HWR_CanInterpolateSprite2(modelspr2frames_t *spr2frame)
 	return spr2frame->interpolate;
 }
 
-static modelspr2frames_t *HWR_GetModelSprite2Frames(md2_t *md2, UINT16 spr2)
+static modelspr2frames_t *HWR_GetModelSprite2Frames(md2_t *md2, UINT32 spr2)
 {
 	if (!md2 || !md2->model)
 		return NULL;
@@ -1121,9 +1121,9 @@ static modelspr2frames_t *HWR_GetModelSprite2Frames(md2_t *md2, UINT16 spr2)
 	return NULL;
 }
 
-static modelspr2frames_t *HWR_GetModelSprite2(md2_t *md2, skin_t *skin, UINT16 spr2, player_t *player)
+static modelspr2frames_t *HWR_GetModelSprite2(md2_t *md2, skin_t *skin, UINT32 spr2, player_t *player)
 {
-	UINT16 super = 0;
+	UINT32 super = 0;
 	UINT8 i = 0;
 
 	if (!md2 || !md2->model || !skin)
diff --git a/src/info.c b/src/info.c
index aab2a7dee..7763a5c9f 100644
--- a/src/info.c
+++ b/src/info.c
@@ -22414,8 +22414,10 @@ UINT32 P_AllocateState(const char *name)
 }
 
 void R_ResizeSprites(void);
+#ifndef NOHW
 extern void HWR_AllocateMD2Model(void);
 extern void HWR_AllocateLSpr(void);
+#endif
 
 UINT32 P_AllocateSpriteinfo(const char *name)
 {
@@ -22424,8 +22426,10 @@ UINT32 P_AllocateSpriteinfo(const char *name)
 	memset(spriteinfo[numspriteinfo-1], 0, sizeof(spriteinfo_t));
 	spriteinfo[numspriteinfo-1]->name = name;
 	R_ResizeSprites();
+#ifndef NOHW
 	HWR_AllocateMD2Model();
 	HWR_AllocateLSpr();
+#endif
 	return numspriteinfo-1;
 }
 
@@ -22488,8 +22492,10 @@ void P_InitializeTables(void)
 		memset(spriteinfo[i], 0, sizeof(spriteinfo_t));
 		spriteinfo[i]->name = sprnames[i];
 	}
+#ifndef NOHW
 	HWR_AllocateMD2Model();
 	HWR_AllocateLSpr();
+#endif
 
 	numplayersprites = sizeof(startplayersprites) / sizeof(startplayersprites[0]);
 	playersprites = Z_Malloc(sizeof(*playersprites) * numplayersprites, PU_STATIC, NULL);
diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index a1e22ea57..f33ad6c0f 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -3138,8 +3138,8 @@ static int lib_pIsStateSprite2Super(lua_State *L)
 // Not a real function. Who cares? I know I don't.
 static int lib_pGetSuperSprite2(lua_State *L)
 {
-	int animID = luaL_checkinteger(L, 1) & SPR2F_MASK;
-	if (animID < 0 || animID >= numplayersprites)
+	UINT32 animID = luaL_checkinteger(L, 1) & SPR2F_MASK;
+	if (animID >= numplayersprites)
 		return luaL_error(L, "sprite2 %d out of range (0 - %d)", animID, numplayersprites-1);
 
 	lua_pushinteger(L, animID | SPR2F_SUPER);
diff --git a/src/p_mobj.h b/src/p_mobj.h
index 2f013a2f3..3c6615ee1 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -306,9 +306,9 @@ typedef struct mobj_s
 	angle_t old_angle, old_pitch, old_roll; // orientation interpolation
 	angle_t old_angle2, old_pitch2, old_roll2;
 	angle_t spriteroll, old_spriteroll, old_spriteroll2;
-	spritenum_t sprite; // used to find patch_t and flip value
+	UINT32 sprite; // used to find patch_t and flip value
 	UINT32 frame; // frame number, plus bits see p_pspr.h
-	UINT16 sprite2; // player sprites
+	UINT32 sprite2; // player sprites
 	UINT16 anim_duration; // for FF_ANIMATE states
 
 	UINT32 renderflags; // render flags
diff --git a/src/p_saveg.c b/src/p_saveg.c
index 906fc17b9..39ceff19e 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -2066,9 +2066,9 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
 	if (diff & MD_TICS)
 		WRITEINT32(save_p, mobj->tics);
 	if (diff & MD_SPRITE) {
-		WRITEUINT16(save_p, mobj->sprite);
+		WRITEUINT32(save_p, mobj->sprite);
 		if (mobj->sprite == SPR_PLAY)
-			WRITEUINT16(save_p, mobj->sprite2);
+			WRITEUINT32(save_p, mobj->sprite2);
 	}
 	if (diff & MD_FRAME)
 	{
@@ -3096,9 +3096,9 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
 	else
 		mobj->tics = mobj->state->tics;
 	if (diff & MD_SPRITE) {
-		mobj->sprite = READUINT16(save_p);
+		mobj->sprite = READUINT32(save_p);
 		if (mobj->sprite == SPR_PLAY)
-			mobj->sprite2 = READUINT16(save_p);
+			mobj->sprite2 = READUINT32(save_p);
 	}
 	else {
 		mobj->sprite = mobj->state->sprite;
diff --git a/src/r_picformats.c b/src/r_picformats.c
index 195fa9c94..ea053d036 100644
--- a/src/r_picformats.c
+++ b/src/r_picformats.c
@@ -1598,9 +1598,9 @@ static void R_ParseSpriteInfo(boolean spr2)
 	}
 	else
 	{
-		for (i = 0; i <= numplayersprites; i++)
+		for (i = 0; (UINT32)i <= numplayersprites; i++)
 		{
-			if (i == numplayersprites)
+			if ((UINT32)i == numplayersprites)
 				I_Error("Error parsing SPRTINFO lump: Unknown sprite2 name \"%s\"", newSpriteName);
 			if (!memcmp(newSpriteName,playersprites[i]->name,4))
 			{
@@ -1679,7 +1679,10 @@ static void R_ParseSpriteInfo(boolean spr2)
 					}
 				}
 				else
+				{
+					info->name = spriteinfo[sprnum]->name;
 					M_Memcpy(spriteinfo[sprnum], info, sizeof(spriteinfo_t));
+				}
 			}
 			else
 			{
diff --git a/src/r_skins.c b/src/r_skins.c
index fc9232db8..abb8c5823 100644
--- a/src/r_skins.c
+++ b/src/r_skins.c
@@ -609,10 +609,10 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski
 
 	skin->sprites = Z_Realloc(skin->sprites, sizeof(*skin->sprites) * numplayersprites, PU_STATIC, NULL);
 	skin->sprinfo = Z_Realloc(skin->sprinfo, sizeof(*skin->sprinfo) * numplayersprites, PU_STATIC, NULL);
-	memset(&skin->sprinfo[skin->numsprites], 0, sizeof(*skin->sprinfo) * (numplayersprites < skin->numsprites));
+	memset(&skin->sprinfo[skin->numsprites], 0, sizeof(*skin->sprinfo) * (numplayersprites - skin->numsprites));
 	skin->super.sprites = Z_Realloc(skin->super.sprites, sizeof(*skin->super.sprites) * numplayersprites, PU_STATIC, NULL);
 	skin->super.sprinfo = Z_Realloc(skin->super.sprinfo, sizeof(*skin->super.sprinfo) * numplayersprites, PU_STATIC, NULL);
-	memset(&skin->super.sprinfo[skin->numsprites], 0, sizeof(*skin->super.sprinfo) * (numplayersprites < skin->numsprites));
+	memset(&skin->super.sprinfo[skin->numsprites], 0, sizeof(*skin->super.sprinfo) * (numplayersprites - skin->numsprites));
 	skin->numsprites = numplayersprites;
 
 	*lump += 1; // start after S_SKIN
-- 
GitLab