From 3c785cbe94359a742c305bd890fcb953fe2051f8 Mon Sep 17 00:00:00 2001
From: toasterbabe <rollerorbital@gmail.com>
Date: Sat, 9 Sep 2017 22:12:23 +0100
Subject: [PATCH] * Add Skid SPR2/state in preperation for directionchar. *
 Clean up spr2 md2 code. * Experimented but then commented out some stuff for
 homing attack.

---
 src/dehacked.c        |  1 +
 src/hardware/hw_md2.c | 23 +++++++++++------------
 src/info.c            |  3 +++
 src/info.h            |  2 ++
 src/p_mobj.c          |  1 +
 src/p_user.c          |  7 +++++--
 6 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/dehacked.c b/src/dehacked.c
index 385411748..c17bf2f8a 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -3356,6 +3356,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
 	"S_PLAY_STND",
 	"S_PLAY_WAIT",
 	"S_PLAY_WALK",
+	"S_PLAY_SKID",
 	"S_PLAY_RUN",
 	"S_PLAY_DASH",
 	"S_PLAY_PAIN",
diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c
index f89a7dc4d..708da2c15 100644
--- a/src/hardware/hw_md2.c
+++ b/src/hardware/hw_md2.c
@@ -1313,29 +1313,28 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
 		{
 			UINT8 spr2 = P_GetModelSprite2(md2, spr->mobj->skin, spr->mobj->sprite2, spr->mobj->player);
 			UINT8 mod = md2->model->spr2frames[spr2*2 + 1] ? md2->model->spr2frames[spr2*2 + 1] : md2->model->header.numFrames;
+			if (mod > ((skin_t *)spr->mobj->skin)->sprites[spr2].numframes)
+				mod = ((skin_t *)spr->mobj->skin)->sprites[spr2].numframes;
 			//FIXME: this is not yet correct
-			frame = md2->model->spr2frames[spr2*2] + ((spr->mobj->frame & FF_FRAMEMASK) % mod);
+			frame = (spr->mobj->frame & FF_FRAMEMASK);
+			if (frame >= mod)
+				frame = 0;
 			buff = md2->model->glCommandBuffer;
-			curr = &md2->model->frames[frame];
+			curr = &md2->model->frames[md2->model->spr2frames[spr2*2] + frame];
 			if (cv_grmd2.value == 1 && tics <= INTERPOLERATION_LIMIT)
 			{
 				if (durs > INTERPOLERATION_LIMIT)
 					durs = INTERPOLERATION_LIMIT;
 
-				if (spr->mobj->player && spr->mobj->player->skidtime && spr->mobj->state-states == S_PLAY_WALK) // temporary hack
-					;
-				else if (spr->mobj->frame & FF_ANIMATE
+				if (spr->mobj->frame & FF_ANIMATE
 					|| (spr->mobj->state->nextstate != S_NULL
 					&& states[spr->mobj->state->nextstate].sprite == spr->mobj->sprite
 					&& (states[spr->mobj->state->nextstate].frame & FF_FRAMEMASK) == spr->mobj->sprite2))
 				{
-					UINT32 nextframe = (spr->mobj->frame & FF_FRAMEMASK) + 1;
-					nextframe %= mod;
-					if (nextframe || !(spr->mobj->state->frame & FF_SPR2ENDSTATE))
-					{
-						nextframe += md2->model->spr2frames[spr2*2];
-						next = &md2->model->frames[nextframe];
-					}
+					if (++frame >= mod)
+						frame = 0;
+					if (frame || !(spr->mobj->state->frame & FF_SPR2ENDSTATE))
+						next = &md2->model->frames[md2->model->spr2frames[spr2*2] + frame];
 				}
 			}
 		}
diff --git a/src/info.c b/src/info.c
index 99f17884c..d62111640 100644
--- a/src/info.c
+++ b/src/info.c
@@ -405,6 +405,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
 	"STND",
 	"WAIT",
 	"WALK",
+	"SKID",
 	"RUN_",
 	"DASH",
 	"PAIN",
@@ -487,6 +488,7 @@ playersprite_t spr2defaults[NUMPLAYERSPRITES] = {
 	0, // SPR2_STND,
 	0, // SPR2_WAIT,
 	0, // SPR2_WALK,
+	SPR2_WALK, // SPR2_SKID,
 	SPR2_WALK, // SPR2_RUN ,
 	SPR2_FRUN, // SPR2_DASH,
 	0, // SPR2_PAIN,
@@ -593,6 +595,7 @@ state_t states[NUMSTATES] =
 	{SPR_PLAY, SPR2_STND|FF_ANIMATE,    105, {NULL}, 0,  7, S_PLAY_WAIT}, // S_PLAY_STND
 	{SPR_PLAY, SPR2_WAIT|FF_ANIMATE,     -1, {NULL}, 0, 16, S_NULL},      // S_PLAY_WAIT
 	{SPR_PLAY, SPR2_WALK,                 4, {NULL}, 0,  0, S_PLAY_WALK}, // S_PLAY_WALK
+	{SPR_PLAY, SPR2_SKID,                 1, {NULL}, 0,  0, S_PLAY_WALK}, // S_PLAY_SKID
 	{SPR_PLAY, SPR2_RUN ,                 2, {NULL}, 0,  0, S_PLAY_RUN},  // S_PLAY_RUN
 	{SPR_PLAY, SPR2_DASH,                 2, {NULL}, 0,  0, S_PLAY_DASH}, // S_PLAY_DASH
 	{SPR_PLAY, SPR2_PAIN|FF_ANIMATE,    350, {NULL}, 0,  4, S_PLAY_FALL}, // S_PLAY_PAIN
diff --git a/src/info.h b/src/info.h
index 4ae5fcf63..7bc7e673a 100644
--- a/src/info.h
+++ b/src/info.h
@@ -609,6 +609,7 @@ typedef enum playersprite
 	SPR2_STND = 0,
 	SPR2_WAIT,
 	SPR2_WALK,
+	SPR2_SKID,
 	SPR2_RUN ,
 	SPR2_DASH,
 	SPR2_PAIN,
@@ -713,6 +714,7 @@ typedef enum state
 	S_PLAY_STND,
 	S_PLAY_WAIT,
 	S_PLAY_WALK,
+	S_PLAY_SKID,
 	S_PLAY_RUN,
 	S_PLAY_DASH,
 	S_PLAY_PAIN,
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 8f9c44fdb..1834901ed 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -250,6 +250,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
 		player->panim = PA_EDGE;
 		break;
 	case S_PLAY_WALK:
+	case S_PLAY_SKID:
 	case S_PLAY_FLOAT:
 		player->panim = PA_WALK;
 		break;
diff --git a/src/p_user.c b/src/p_user.c
index 09cafa0b3..6f364ebc8 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -4370,6 +4370,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
 							P_SetTarget(&player->mo->target, P_SetTarget(&player->mo->tracer, lockon));
 							if (lockon)
 							{
+								P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
 								player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, lockon->x, lockon->y);
 								player->homing = 3*TICRATE;
 							}
@@ -6674,8 +6675,8 @@ static void P_SkidStuff(player_t *player)
 			// If your push angle is more than this close to a full 180 degrees, trigger a skid.
 			if (dang > ANGLE_157h)
 			{
-				if (player->panim != PA_WALK)
-					P_SetPlayerMobjState(player->mo, S_PLAY_WALK);
+				if (player->mo->state-states != S_PLAY_SKID)
+					P_SetPlayerMobjState(player->mo, S_PLAY_SKID);
 				player->mo->tics = player->skidtime = (player->mo->movefactor == FRACUNIT) ? TICRATE/2 : (FixedDiv(35<<(FRACBITS-1), FixedSqrt(player->mo->movefactor)))>>FRACBITS;
 				S_StartSound(player->mo, sfx_skid);
 			}
@@ -7418,6 +7419,8 @@ static void P_MovePlayer(player_t *player)
 
 				if (!(player->mo->tracer->flags & MF_BOSS))
 					player->pflags &= ~PF_THOKKED;
+
+				// P_SetPlayerMobjState(player->mo, S_PLAY_SPRING); -- Speed didn't like it, RIP
 			}
 		}