diff --git a/src/deh_tables.c b/src/deh_tables.c
index c8da6cabd80a36e8f80879096b0cd3bd677a0bb7..1474296f9207ad1c64593f570047015795017a12 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -369,6 +369,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
 
 	"S_KART_LEFTOVER",
 	"S_KART_LEFTOVER_NOTIRES",
+	"S_KART_LEFTOVER_CUSTOM",
 
 	"S_KART_TIRE1",
 	"S_KART_TIRE2",
diff --git a/src/info.c b/src/info.c
index f1b24c4c12994c99afd0a4498a56819b6a854983..3b64bd0a55a6d956314198adf48d0c693f6764df 100644
--- a/src/info.c
+++ b/src/info.c
@@ -847,7 +847,7 @@ playersprite_t spr2defaults[NUMPLAYERSPRITES] = {
 state_t states[NUMSTATES] =
 {
 	// frame is masked through FF_FRAMEMASK
-	// FF_ANIMATE makes simple state animations (var1 #frames, var2 tic delay)
+	// FF_ANIMATE makes simple state animations (var1 #frames, var2 tic delay) (var1 is ignored in P_SetupStateAnimation() if sprite is SPR_PLAY)
 	// FF_FULLBRIGHT activates the fullbright colormap
 	// use FF_TRANS10 - FF_TRANS90 for easy translucency
 	// (or tr_trans10<<FF_TRANSSHIFT if you want to make it hard on yourself)
@@ -905,6 +905,7 @@ state_t states[NUMSTATES] =
 
 	{SPR_KART, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_LEFTOVER
     {SPR_DIEF, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_LEFTOVER_NOTIRES
+	{SPR_PLAY, SPR2_DKRT,3,{NULL},0,0,S_KART_LEFTOVER_CUSTOM},// S_KART_LEFTOVER_CUSTOM
 
 	{SPR_TIRE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_TIRE1
 	{SPR_TIRE, 1, -1, {NULL}, 0, 0, S_NULL}, // S_KART_TIRE2
diff --git a/src/info.h b/src/info.h
index 3246580ffa0a2f49d3dbd55907a3a95838517151..c1474dc01609db6417d92785711ca33c6f5eb7fa 100644
--- a/src/info.h
+++ b/src/info.h
@@ -1390,6 +1390,7 @@ typedef enum state
 
 	S_KART_LEFTOVER,
 	S_KART_LEFTOVER_NOTIRES,
+	S_KART_LEFTOVER_CUSTOM,
 
 	S_KART_TIRE1,
 	S_KART_TIRE2,
diff --git a/src/objects/destroyed-kart.cpp b/src/objects/destroyed-kart.cpp
index c8e0994670550e9cbd28a9f9b62340f7d90f69f1..342953ffc3c035efb5f6e24194d75c48c311601b 100644
--- a/src/objects/destroyed-kart.cpp
+++ b/src/objects/destroyed-kart.cpp
@@ -252,11 +252,6 @@ struct Kart : Mobj
 	Mobj* player() const { return Mobj::target(); }
 	void player(Mobj* n) { Mobj::target(n); }
 
-	//use cvmem as a surrogate in this class to hold the number of frames in the player's skin's SPR2_DKRT
-	//any value above 0 means they have SPR2_DKRT
-	int dkrtframecount() const { return cvmem; }
-	void dkrtframecount(int n) {mobj_t::cvmem = n; }
-
 	static void spawn(Mobj* target)
 	{
 		SRB2_ASSERT(target->player != nullptr);
@@ -279,15 +274,6 @@ struct Kart : Mobj
 		kart->exact_hitlag(15, true);
 		kart->player(target);
 
-		kart->dkrtframecount(0);
-
-		if (Mobj* p = kart->player(); Mobj::valid(p) && p->player)
-		{
-			skin_t *playerSkin = &skins[p->player->skin];
-			spritedef_t * dkrtInfo = &playerSkin->sprites[SPR2_DKRT];
-			kart->dkrtframecount(dkrtInfo->numframes);
-		}
-
 		Obj_SpawnCustomBrolyKi(target, kart->hitlag() - 2, 32 * mapobjectscale, 0);
 
 		target->exact_hitlag(kart->hitlag() + 1, true);
@@ -313,57 +299,43 @@ struct Kart : Mobj
 			timer(timer() - 1);
 			animate();
 		}
-
-		//animate SPR2_DKRT to advance a frame every 3 tics (same as SPR2_DEAD as of 06/09/24)
-		if(dkrtframecount() && leveltime%3==0)
-			frame = (frame+1) % dkrtframecount();
 	}
 
 	bool destroy()
 	{
 		if (cooldown())
-		{
-			// no-op P_DamageMobj
-			return true;
-		}
+			return true; // no-op P_DamageMobj
 
 		if (health <= 1)
-		{
 			return false;
+
+		Mobj* p = player();
+		bool pValid = Mobj::valid(p);
+		bool hasCustomHusk = pValid && p->player && skins[p->player->skin].sprites[SPR2_DKRT].numframes;
+
+		if(hasCustomHusk)
+		{
+			skin = (void*)(&skins[p->player->skin]);
+			frame = 0;
 		}
 
 		Particle::spew(this);
-		scale(3 * scale() / 2);
+		scale(!hasCustomHusk ? (3 * scale() / 2):(int)(p->scale()));
 		health = 1;
-		state(S_KART_LEFTOVER_NOTIRES);
+		state(!hasCustomHusk ? S_KART_LEFTOVER_NOTIRES : S_KART_LEFTOVER_CUSTOM);
 		cooldown(20);
 		burning(burn_duration());
 
 		if (!cv_reducevfx.value)
-		{
 			voice(sfx_die00);
-		}
 
-		if (Mobj* p = player(); Mobj::valid(p))
+		if(pValid)
 		{
-			if (p->player)
+			if((skins[p->player->skin].flags & SF_BADNIK))
 			{
-				//undo S_KART_LEFTOVER_NOTIRES setting a skin of its own if SPR2_DKRT is present
-				//also making sure the husk is the same scale as the player that made it if SPR2_DKRT is defined for consistency's sake
-				if(dkrtframecount()){
-					skin = (void*)(&skins[p->player->skin]);
-					sprite = SPR_PLAY;
-					sprite2 = SPR2_DKRT;
-					frame = 0;
-					scale(p->scale());
-				}
-
-				if(skins[p->player->skin].flags & SF_BADNIK){
-					P_SpawnBadnikExplosion(p);
-					p->spritescale({2*FRACUNIT, 2*FRACUNIT});
-					p->flags |= MF_NOSQUISH;
-				}
-
+				P_SpawnBadnikExplosion(p);
+				p->spritescale({2*FRACUNIT, 2*FRACUNIT});
+				p->flags |= MF_NOSQUISH;
 			}
 
 			p->state(S_KART_DEAD);