From c2aba462984d8fbf75f32a306aad2c9721942dac Mon Sep 17 00:00:00 2001
From: toasterbabe <rollerorbital@gmail.com>
Date: Wed, 13 Jul 2016 15:15:45 +0100
Subject: [PATCH] New S_SKIN attributes. * radius - sets the player's radius
 for that skin. * height - sets the player's normal height for that skin. *
 spinheight - sets the player's spinheight for that skin. * shieldscale - see
 http://i.imgur.com/BQ5DhKC.png for justification

---
 src/lua_skinlib.c | 20 ++++++++++++++++++++
 src/p_local.h     |  1 +
 src/p_mobj.c      |  2 +-
 src/p_user.c      | 20 ++++++++++++++++----
 src/r_things.c    | 22 +++++++++++++++++-----
 src/r_things.h    |  6 ++++++
 6 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c
index 28d5fed236..40737ccc1c 100644
--- a/src/lua_skinlib.c
+++ b/src/lua_skinlib.c
@@ -44,6 +44,10 @@ enum skin {
 	skin_accelstart,
 	skin_acceleration,
 	skin_jumpfactor,
+	skin_radius,
+	skin_height,
+	skin_spinheight,
+	skin_shieldscale,
 	skin_starttranscolor,
 	skin_prefcolor,
 	skin_highresscale,
@@ -74,6 +78,10 @@ static const char *const skin_opt[] = {
 	"accelstart",
 	"acceleration",
 	"jumpfactor",
+	"radius",
+	"height",
+	"spinheight",
+	"shieldscale",
 	"starttranscolor",
 	"prefcolor",
 	"highresscale",
@@ -173,6 +181,18 @@ static int skin_get(lua_State *L)
 	case skin_jumpfactor:
 		lua_pushfixed(L, skin->jumpfactor);
 		break;
+	case skin_radius:
+		lua_pushfixed(L, skin->radius);
+		break;
+	case skin_height:
+		lua_pushfixed(L, skin->height);
+		break;
+	case skin_spinheight:
+		lua_pushfixed(L, skin->spinheight);
+		break;
+	case skin_shieldscale:
+		lua_pushfixed(L, skin->shieldscale);
+		break;
 	case skin_starttranscolor:
 		lua_pushinteger(L, skin->starttranscolor);
 		break;
diff --git a/src/p_local.h b/src/p_local.h
index 57ca425e15..7b662ef233 100644
--- a/src/p_local.h
+++ b/src/p_local.h
@@ -119,6 +119,7 @@ extern consvar_t cv_cam2_speed, cv_cam2_rotate, cv_cam2_rotspeed;
 extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate;
 extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate;
 
+fixed_t P_GetPlayerRadius(player_t *player);
 fixed_t P_GetPlayerHeight(player_t *player);
 fixed_t P_GetPlayerSpinHeight(player_t *player);
 INT32 P_GetPlayerControlDirection(player_t *player);
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 653b6967ef..b60a5075c4 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -6097,7 +6097,7 @@ static boolean P_ShieldLook(mobj_t *thing, shieldtype_t shield)
 	thing->flags |= MF_NOCLIPHEIGHT;
 	thing->eflags = (thing->eflags & ~MFE_VERTICALFLIP)|(thing->target->eflags & MFE_VERTICALFLIP);
 
-	P_SetScale(thing, thing->target->scale);
+	P_SetScale(thing, FixedMul(thing->target->scale, skins[thing->target->player->skin].shieldscale));
 	P_UnsetThingPosition(thing);
 	thing->x = thing->target->x;
 	thing->y = thing->target->y;
diff --git a/src/p_user.c b/src/p_user.c
index b579cbfe5d..c63b577029 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -1296,6 +1296,17 @@ void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative)
 		mo->momz = value;
 }
 
+//
+// P_GetPlayerRadius
+//
+// Returns the radius
+// of the player.
+//
+fixed_t P_GetPlayerRadius(player_t *player)
+{
+	return FixedMul(skins[player->skin].radius, player->mo->scale);
+}
+
 //
 // P_GetPlayerHeight
 //
@@ -1304,7 +1315,7 @@ void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative)
 //
 fixed_t P_GetPlayerHeight(player_t *player)
 {
-	return FixedMul(player->mo->info->height, player->mo->scale);
+	return FixedMul(skins[player->skin].height, player->mo->scale);
 }
 
 //
@@ -1315,7 +1326,7 @@ fixed_t P_GetPlayerHeight(player_t *player)
 //
 fixed_t P_GetPlayerSpinHeight(player_t *player)
 {
-	return FixedMul(FixedMul(player->mo->info->height, player->mo->scale),2*FRACUNIT/3);
+	return FixedMul(skins[player->skin].spinheight, player->mo->scale);
 }
 
 //
@@ -6536,8 +6547,8 @@ static void P_MovePlayer(player_t *player)
 		|| ((((player->charflags & SF_NOJUMPSPIN) && (player->pflags & PF_JUMPED) && player->panim == PA_JUMP))
 			&& (P_MobjFlip(player->mo)*player->mo->momz < 0 || player->pflags & PF_THOKKED)))
 		P_SetPlayerMobjState(player->mo, S_PLAY_FALL);
-	// If Springing but on the ground, change back!
-	else if (onground && (player->panim == PA_SPRING || player->panim == PA_FALL || player->panim == PA_RIDE) && !player->mo->momz)
+	// If doing an air animation but on the ground, change back!
+	else if (onground && (player->panim == PA_SPRING || player->panim == PA_FALL || player->panim == PA_RIDE || player->panim == PA_JUMP) && !player->mo->momz)
 		P_SetPlayerMobjState(player->mo, S_PLAY_STND);
 
 	// If you are stopped and are still walking, stand still!
@@ -6996,6 +7007,7 @@ static void P_MovePlayer(player_t *player)
 			player->mo->height = P_GetPlayerSpinHeight(player);
 		else
 			player->mo->height = P_GetPlayerHeight(player);
+		player->mo->radius = P_GetPlayerRadius(player);
 
 		if (player->mo->eflags & MFE_VERTICALFLIP && player->mo->height != oldheight) // adjust z height for reverse gravity, similar to how it's done for scaling
 			player->mo->z -= player->mo->height - oldheight;
diff --git a/src/r_things.c b/src/r_things.c
index 9f138fdd30..1a0e6dcfe9 100644
--- a/src/r_things.c
+++ b/src/r_things.c
@@ -2300,6 +2300,12 @@ static void Sk_SetDefaultValue(skin_t *skin)
 	skin->mindash = 15<<FRACBITS;
 	skin->maxdash = 90<<FRACBITS;
 
+	skin->radius = mobjinfo[MT_PLAYER].radius;
+	skin->height = mobjinfo[MT_PLAYER].height;
+	skin->spinheight = FixedMul(skin->height, 2*FRACUNIT/3);
+
+	skin->shieldscale = FRACUNIT;
+
 	skin->thokitem = -1;
 	skin->spinitem = -1;
 	skin->revitem = -1;
@@ -2545,7 +2551,7 @@ void R_AddSkins(UINT16 wadnum)
 					value2[stringspace - 1] = '\0';
 					if (R_SkinAvailable(value2) == -1)
 						// I'm lazy so if NEW name is already used I leave the 'skin x'
--						// default skin name set in Sk_SetDefaultValue
+						// default skin name set in Sk_SetDefaultValue
 						STRBUFCPY(skin->name, value2);
 					Z_Free(value2);
 				}
@@ -2620,6 +2626,9 @@ void R_AddSkins(UINT16 wadnum)
 			GETSPEED(mindash)
 			GETSPEED(maxdash)
 			GETSPEED(actionspd)
+			GETSPEED(radius)
+			GETSPEED(height)
+			GETSPEED(spinheight)
 #undef GETSPEED
 
 #define GETINT(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value);
@@ -2652,10 +2661,13 @@ void R_AddSkins(UINT16 wadnum)
 
 			else if (!stricmp(stoken, "prefcolor"))
 				skin->prefcolor = R_GetColorByName(value);
-			else if (!stricmp(stoken, "jumpfactor"))
-				skin->jumpfactor = FLOAT_TO_FIXED(atof(value));
-			else if (!stricmp(stoken, "highresscale"))
-				skin->highresscale = FLOAT_TO_FIXED(atof(value));
+
+#define GETFLOAT(field) else if (!stricmp(stoken, #field)) skin->field = FLOAT_TO_FIXED(atof(value));
+			GETFLOAT(jumpfactor)
+			GETFLOAT(highresscale)
+			GETFLOAT(shieldscale)
+#undef GETFLOAT
+
 			else // let's check if it's a sound, otherwise error out
 			{
 				boolean found = false;
diff --git a/src/r_things.h b/src/r_things.h
index 23842094ef..cdd22ba66d 100644
--- a/src/r_things.h
+++ b/src/r_things.h
@@ -93,6 +93,12 @@ typedef struct
 
 	fixed_t jumpfactor; // multiple of standard jump height
 
+	fixed_t radius; // Bounding box changes.
+	fixed_t height;
+	fixed_t spinheight;
+
+	fixed_t shieldscale; // no change to bounding box, but helps set the shield's sprite size
+
 	// Definable color translation table
 	UINT8 starttranscolor;
 	UINT8 prefcolor;
-- 
GitLab