From e16bf1cf7578a1174eeccda8d289f10ef812cd5f Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Mon, 26 Mar 2018 20:36:16 -0400
Subject: [PATCH 01/10] WIP karma item stuff

---
 src/dehacked.c |  1 +
 src/info.c     |  3 ++-
 src/info.h     |  3 ++-
 src/k_kart.c   | 17 ++++++++++++++---
 src/p_enemy.c  |  5 ++---
 src/p_inter.c  | 37 +++++++++----------------------------
 src/p_map.c    | 39 +++++++++++++++++++++++++++++++++------
 src/p_mobj.c   | 13 ++++++-------
 src/p_setup.c  |  2 +-
 9 files changed, 70 insertions(+), 50 deletions(-)

diff --git a/src/dehacked.c b/src/dehacked.c
index 27fa61e7..3e113072 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -6598,6 +6598,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
 	"S_PLAYERARROW_ROULETTE",
 
 	"S_PLAYERBOMB", // Player bomb overlay
+	"S_PLAYERITEM", // Player item overlay
 	"S_PLAYERBOMB_WHEEL",
 
 #ifdef SEENAMES
diff --git a/src/info.c b/src/info.c
index f7b6fed7..4a75ac2c 100644
--- a/src/info.c
+++ b/src/info.c
@@ -2907,7 +2907,8 @@ state_t states[NUMSTATES] =
 	{SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE
 
 	{SPR_PBOM, FF_ANIMATE, -1, {NULL}, 3, 3, S_NULL}, // S_PLAYERBOMB
-	{SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERBOMB_WHEEL
+	{SPR_RNDM, FF_ANIMATE, -1, {NULL}, 23, 3, S_NULL}, // S_PLAYERITEM
+	{SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERWHEEL
 
 #ifdef SEENAMES
 	{SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK
diff --git a/src/info.h b/src/info.h
index c8e6758a..f619b598 100644
--- a/src/info.h
+++ b/src/info.h
@@ -3430,7 +3430,8 @@ typedef enum state
 	S_PLAYERARROW_ROULETTE,
 
 	S_PLAYERBOMB,
-	S_PLAYERBOMB_WHEEL,
+	S_PLAYERITEM,
+	S_PLAYERWHEEL,
 
 #ifdef SEENAMES
 	S_NAMECHECK,
diff --git a/src/k_kart.c b/src/k_kart.c
index 4f04f46a..ceee25f2 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -3266,6 +3266,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
 
 			if (player->kartstuff[k_comebacktimer] > 0)
 			{
+				if (player->mo->tracer->state != &states[S_PLAYERBOMB])
+					P_SetMobjState(player->mo->tracer, S_PLAYERBOMB);
+
 				if (player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1))
 					player->mo->tracer->flags2 &= ~MF2_DONTDRAW;
 				else
@@ -3273,15 +3276,23 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
 
 				player->powers[pw_flashing] = player->kartstuff[k_comebacktimer];
 			}
-			else if (player->kartstuff[k_comebackmode] != 0)
-				player->mo->tracer->flags2 |= MF2_DONTDRAW;
 			else
+			{
+				if (player->kartstuff[k_comebackmode] == 0
+					&& player->mo->tracer->state != &states[S_PLAYERBOMB])
+					P_SetMobjState(player->mo->tracer, S_PLAYERBOMB);
+				else if (player->kartstuff[k_comebackmode] == 1
+					&& player->mo->tracer->state != &states[S_PLAYERITEM])
+					P_SetMobjState(player->mo->tracer, S_PLAYERITEM);
 				player->mo->tracer->flags2 &= ~MF2_DONTDRAW;
+			}
 		}
 		else if (G_RaceGametype() || player->kartstuff[k_balloon] > 0)
 		{
 			player->mo->flags2 &= ~MF2_SHADOW;
-			if (player->mo->tracer && player->mo->tracer->state == &states[S_PLAYERBOMB])
+			if (player->mo->tracer
+				&& (player->mo->tracer->state == &states[S_PLAYERBOMB]
+				|| player->mo->tracer->state == &states[S_PLAYERITEM]))
 				P_RemoveMobj(player->mo->tracer);
 		}
 	}
diff --git a/src/p_enemy.c b/src/p_enemy.c
index 788cafa1..b8486683 100644
--- a/src/p_enemy.c
+++ b/src/p_enemy.c
@@ -3632,8 +3632,6 @@ void A_AttractChase(mobj_t *actor)
 		|| !P_CheckSight(actor, actor->tracer)) // You have to be able to SEE it...sorta
 	{
 		// Lost attracted rings don't through walls anymore.
-		if (actor->tracer && actor->tracer->player)
-			actor->tracer->player->kartstuff[k_comebackmode] = 0;
 		actor->flags &= ~MF_NOCLIP;
 		P_SetTarget(&actor->tracer, NULL);
 		return;
@@ -8145,7 +8143,8 @@ void A_ItemPop(mobj_t *actor)
 	if (actor->info->deathsound)
 		S_StartSound(remains, actor->info->deathsound);
 
-	actor->target->player->kartstuff[k_itemroulette] = 1;
+	if (!(G_BattleGametype() && actor->target->player->kartstuff[k_balloon] <= 0))
+		actor->target->player->kartstuff[k_itemroulette] = 1;
 
 	remains->flags2 &= ~MF2_AMBUSH;
 
diff --git a/src/p_inter.c b/src/p_inter.c
index e24a3ddf..d77940dc 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -158,8 +158,8 @@ boolean P_CanPickupItem(player_t *player, boolean weapon)
 	//if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics)
 	//	return false;
 
-	if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // No balloons in Match
-		return false;
+	/*if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // No balloons in Match
+		return false;*/
 
 	if (player->kartstuff[k_bootaketimer]				|| player->kartstuff[k_boostolentimer]
 		|| player->kartstuff[k_growshrinktimer] > 1	|| player->kartstuff[k_goldshroomtimer]) // Item-specific timer going off
@@ -414,34 +414,15 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 	switch (special->type)
 	{
 		case MT_RANDOMITEM:			// SRB2kart
+			if (!P_CanPickupItem(player, false))
+				return;
+
 			if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0)
 			{
-				if (player->kartstuff[k_comebackmode] == 0 && !player->kartstuff[k_comebacktimer])
-				{
-					if (special->tracer)
-						return;
-					P_SetTarget(&special->tracer, toucher);
+				if (player->kartstuff[k_comebackmode] == 1 || player->kartstuff[k_comebacktimer])
+					return;
+				if (player->kartstuff[k_comebackmode] == 0)
 					player->kartstuff[k_comebackmode] = 1;
-				}
-				return;
-			}
-
-			if (!P_CanPickupItem(player, false) && special->tracer != toucher)
-				return;
-
-			if (G_BattleGametype() && special->tracer && special->tracer->player)
-			{
-				special->tracer->player->kartstuff[k_comebackmode] = 0;
-
-				special->tracer->player->kartstuff[k_comebackpoints]++;
-
-				if (netgame && cv_hazardlog.value)
-					CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[special->tracer->player-players], player_names[player-players]);
-
-				if (special->tracer->player->kartstuff[k_comebackpoints] >= 3)
-					K_StealBalloon(special->tracer->player, player, true);
-
-				special->tracer->player->kartstuff[k_comebacktimer] = comebacktime;
 			}
 
 			special->momx = special->momy = special->momz = 0;
@@ -2128,7 +2109,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
 		{
 			P_SetTarget(&target->target, source);
 			source->player->numboxes++;
-			if ((cv_itemrespawn.value && gametype != GT_COOP && (modifiedgame || netgame || multiplayer)))
+			if (cv_itemrespawn.value && (netgame || multiplayer))
 			{
 				target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation
 			}
diff --git a/src/p_map.c b/src/p_map.c
index 15b8f7d8..6935be9d 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -1653,33 +1653,60 @@ static boolean PIT_CheckThing(mobj_t *thing)
 				|| thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer]
 				|| thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped]
 				|| (G_BattleGametype() && (thing->player->kartstuff[k_balloon] <= 0
-				&& (thing->player->kartstuff[k_comebacktimer] || thing->player->kartstuff[k_comebackmode] == 1)))
+				&& (thing->player->kartstuff[k_comebacktimer])))
 				|| tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer]
 				|| tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer]
 				|| tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped]
 				|| (G_BattleGametype() && (tmthing->player->kartstuff[k_balloon] <= 0
-				&& (tmthing->player->kartstuff[k_comebacktimer] || tmthing->player->kartstuff[k_comebackmode] == 1))))
+				&& (tmthing->player->kartstuff[k_comebacktimer]))))
 			{
 				return true;
 			}
 
 			if (G_BattleGametype())
 			{
-				if ((thing->player->kartstuff[k_balloon] <= 0 && thing->player->kartstuff[k_comebackmode] == 0)
-					|| (tmthing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_comebackmode] == 0))
+				if (thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0)
 				{
-					if (tmthing->player->kartstuff[k_balloon] > 0)
+					if (thing->player->kartstuff[k_comebackmode] == 0
+						&& tmthing->player->kartstuff[k_balloon] > 0)
 					{
 						K_ExplodePlayer(tmthing->player, thing);
 						thing->player->kartstuff[k_comebacktimer] = comebacktime;
 						return true;
 					}
-					else if (thing->player->kartstuff[k_balloon] > 0)
+					else if (tmthing->player->kartstuff[k_comebackmode] == 0
+						&& thing->player->kartstuff[k_balloon] > 0)
 					{
 						K_ExplodePlayer(thing->player, tmthing);
 						tmthing->player->kartstuff[k_comebacktimer] = comebacktime;
 						return true;
 					}
+					else if (thing->player->kartstuff[k_comebackmode] == 1
+						&& tmthing->player->kartstuff[k_balloon] > 0)
+					{
+						thing->player->kartstuff[k_comebackmode] = 0;
+						thing->player->kartstuff[k_comebackpoints]++;
+						if (netgame && cv_hazardlog.value)
+							CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[thing->player-players], player_names[tmthing->player-players]);
+						tmthing->player->kartstuff[k_itemroulette] = 1;
+						if (thing->player->kartstuff[k_comebackpoints] >= 3)
+							K_StealBalloon(thing->player, tmthing->player, true);
+						thing->player->kartstuff[k_comebacktimer] = comebacktime;
+						return true;
+					}
+					else if (tmthing->player->kartstuff[k_comebackmode] == 1
+						&& thing->player->kartstuff[k_balloon] > 0)
+					{
+						tmthing->player->kartstuff[k_comebackmode] = 0;
+						tmthing->player->kartstuff[k_comebackpoints]++;
+						if (netgame && cv_hazardlog.value)
+							CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[tmthing->player-players], player_names[thing->player-players]);
+						thing->player->kartstuff[k_itemroulette] = 1;
+						if (tmthing->player->kartstuff[k_comebackpoints] >= 3)
+							K_StealBalloon(tmthing->player, thing->player, true);
+						tmthing->player->kartstuff[k_comebacktimer] = comebacktime;
+						return true;
+					}
 				}
 			}
 
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 353f7844..6374c407 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -5969,13 +5969,6 @@ void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on y
 	if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
 		return;
 
-	if (dest->player && dest->player->kartstuff[k_comebackmode] == 1)
-	{
-		P_TeleportMove(source, dest->x+dest->momx, dest->y+dest->momy, dest->z+dest->momz);
-		source->angle = dest->angle;
-		return;
-	}
-
 	// change angle
 	source->angle = R_PointToAngle2(source->x, source->y, tx, ty);
 
@@ -8282,6 +8275,12 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
 					P_RemoveMobj(mobj); // make sure they disappear
 					return;
 				case MT_RANDOMITEM:
+					if (G_BattleGametype() && numgotboxes < (4*nummapboxes/5))
+					{
+						mobj->fuse = 2;
+						break;
+					}
+					numgotboxes = 0;
 					// Respawn from mapthing if you have one!
 					if (mobj->spawnpoint)
 					{
diff --git a/src/p_setup.c b/src/p_setup.c
index 4cecb941..1986380d 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -991,7 +991,7 @@ static void P_LoadThings(void)
 			|| mt->type == 1702) // MT_AXISTRANSFERLINE
 			continue; // These were already spawned
 
-		if (mt->type == MT_RANDOMITEM) // MT_RANDOMITEM
+		if (mt->type == mobjinfo[MT_RANDOMITEM].doomednum)
 			nummapboxes++;
 
 		mt->mobj = NULL;

From acc9abca550d9be7798ba25ae57ddfd7426ed0d0 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Tue, 27 Mar 2018 17:53:47 -0400
Subject: [PATCH 02/10] Items respawn in Battle properly again

and in a slightly less wasteful way.
---
 src/p_local.h |   1 -
 src/p_mobj.c  | 133 +++++++++++++-------------------------------------
 2 files changed, 34 insertions(+), 100 deletions(-)

diff --git a/src/p_local.h b/src/p_local.h
index 1bf1471b..47cb545e 100644
--- a/src/p_local.h
+++ b/src/p_local.h
@@ -211,7 +211,6 @@ extern size_t iquehead, iquetail;
 extern consvar_t cv_gravity, cv_viewheight;
 
 void P_RespawnSpecials(void);
-void P_RespawnBattleSpecials(void);
 
 mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
 
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 6374c407..a77b97b7 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -8275,12 +8275,9 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
 					P_RemoveMobj(mobj); // make sure they disappear
 					return;
 				case MT_RANDOMITEM:
-					if (G_BattleGametype() && numgotboxes < (4*nummapboxes/5))
-					{
-						mobj->fuse = 2;
+					if (G_BattleGametype())
 						break;
-					}
-					numgotboxes = 0;
+
 					// Respawn from mapthing if you have one!
 					if (mobj->spawnpoint)
 					{
@@ -9371,10 +9368,39 @@ void P_RespawnSpecials(void)
 	mobj_t *mo = NULL;
 	mapthing_t *mthing = NULL;
 
-	if (G_BattleGametype()) // Battle Mode vers
+	if (G_BattleGametype() && numgotboxes >= (4*nummapboxes/5)) // Battle Mode respawns all boxes in a different way
 	{
-		P_RespawnBattleSpecials();
-		return;
+		thinker_t *th;
+
+		for (th = thinkercap.next; th != &thinkercap; th = th->next)
+		{
+			mobj_t *box;
+			mobj_t *newmobj;
+
+			if (th->function.acp1 != (actionf_p1)P_MobjThinker)	// not a mobj
+				continue;
+
+			box = (mobj_t *)th;
+
+			if (box->type != MT_RANDOMITEM || box->threshold != 68 || box->fuse) // only popped items
+				continue;
+
+			// Respawn from mapthing if you have one!
+			if (box->spawnpoint)
+			{
+				P_SpawnMapThing(box->spawnpoint);
+				newmobj = box->spawnpoint->mobj; // this is set to the new mobj in P_SpawnMapThing
+			}
+			else
+				newmobj = P_SpawnMobj(box->x, box->y, box->z, box->type);
+
+			// Transfer flags2 (strongbox, objectflip)
+			newmobj->flags2 = box->flags2;
+			P_RemoveMobj(box); // make sure they disappear
+			continue;
+		}
+
+		numgotboxes = 0;
 	}
 
 	// only respawn items when cv_itemrespawn is on
@@ -9468,97 +9494,6 @@ void P_RespawnSpecials(void)
 	iquetail = (iquetail+1)&(ITEMQUESIZE-1);
 }
 
-//
-// P_RespawnBattleSpecials
-//
-void P_RespawnBattleSpecials(void)
-{
-	fixed_t x, y, z;
-	subsector_t *ss;
-	mobj_t *mo = NULL;
-	mapthing_t *mthing = NULL;
-
-	// only respawn items when cv_itemrespawn is on
-	if (!cv_itemrespawn.value)
-		return;
-
-	// Didn't collect enough boxes
-	if (numgotboxes < (4*nummapboxes/5))
-		return;
-
-	// wait a teeeensy bit after collecting everything
-	if (leveltime - itemrespawntime[iquehead-1] < (tic_t)cv_itemrespawntime.value*(5*TICRATE))
-		return;
-
-	while (iquehead != iquetail) // respawn EVERYTHING in que!
-	{
-		mthing = itemrespawnque[iquetail];
-
-#ifdef PARANOIA
-		if (!mthing)
-			I_Error("itemrespawnque[iquetail] is NULL!");
-#endif
-
-		if (mthing)
-		{
-			mobjtype_t i;
-			x = mthing->x << FRACBITS;
-			y = mthing->y << FRACBITS;
-			ss = R_PointInSubsector(x, y);
-
-			// find which type to spawn
-			for (i = 0; i < NUMMOBJTYPES; i++)
-				if (mthing->type == mobjinfo[i].doomednum)
-					break;
-
-			//CTF rings should continue to respawn as normal rings outside of CTF.
-			if (gametype != GT_CTF)
-			{
-				if (i == MT_REDTEAMRING || i == MT_BLUETEAMRING)
-					i = MT_RING;
-			}
-
-			if (mthing->options & MTF_OBJECTFLIP)
-			{
-				z = (
-#ifdef ESLOPE
-				ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) :
-#endif
-				ss->sector->ceilingheight) - (mthing->options >> ZSHIFT) * FRACUNIT;
-				if (mthing->options & MTF_AMBUSH
-				&& (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i)))
-					z -= 24*FRACUNIT;
-				z -= mobjinfo[i].height; // Don't forget the height!
-			}
-			else
-			{
-				z = (
-#ifdef ESLOPE
-				ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) :
-#endif
-				ss->sector->floorheight) + (mthing->options >> ZSHIFT) * FRACUNIT;
-				if (mthing->options & MTF_AMBUSH
-				&& (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i)))
-					z += 24*FRACUNIT;
-			}
-
-			mo = P_SpawnMobj(x, y, z, i);
-			mo->spawnpoint = mthing;
-			mo->angle = ANGLE_45 * (mthing->angle/45);
-
-			if (mthing->options & MTF_OBJECTFLIP)
-			{
-				mo->eflags |= MFE_VERTICALFLIP;
-				mo->flags2 |= MF2_OBJECTFLIP;
-			}
-		}
-		// pull it from the que
-		iquetail = (iquetail+1)&(ITEMQUESIZE-1);
-	}
-
-	numgotboxes = 0;
-}
-
 //
 // P_SpawnPlayer
 // Called when a player is spawned on the level.

From ac6a996c0dd46304c164311686eeabc716f2b018 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Tue, 27 Mar 2018 18:22:33 -0400
Subject: [PATCH 03/10] HUD improvements

Most notably, Karma & Boo no longer appear on the minimap
---
 src/k_kart.c | 58 +++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 16 deletions(-)

diff --git a/src/k_kart.c b/src/k_kart.c
index ceee25f2..a41e244f 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -4757,7 +4757,7 @@ static void K_drawKartMinimap(void)
 	x = MINI_X - (AutomapPic->width/2);
 	y = MINI_Y - (AutomapPic->height/2);
 
-	if (splitscreen == 2)
+	if (splitscreen)
 		splitflags = 0;
 
 	if (mirrormode)
@@ -4765,7 +4765,7 @@ static void K_drawKartMinimap(void)
 	else
 		V_DrawScaledPatch(x, y, splitflags, AutomapPic);
 
-	if (splitscreen != 2)
+	if (!splitscreen)
 	{
 		splitflags &= ~minimaptrans;
 		splitflags |= V_HUDTRANSHALF;
@@ -4774,13 +4774,28 @@ static void K_drawKartMinimap(void)
 	// Player's tiny icons on the Automap.
 	for (i = 0; i < MAXPLAYERS; i++)
 	{
-		if (i == displayplayer && splitscreen != 2)
+		if (i == displayplayer && !splitscreen)
 			continue; // Do displayplayer later
 		if (players[i].mo && !players[i].spectator)
+		{
+			if (G_BattleGametype() && players[i].kartstuff[k_balloon] <= 0)
+				continue;
+
+			if (players[i].kartstuff[k_bootimer] > 0)
+			{
+				if ((players[i].kartstuff[k_bootimer] < 1*TICRATE/2
+					|| players[i].kartstuff[k_bootimer] > bootime-(1*TICRATE/2))
+					&& !(leveltime & 1))
+					;
+				else
+					continue;
+			}
+
 			K_drawKartMinimapHead(&players[i], x, y, splitflags, AutomapPic);
+		}
 	}
 
-	if (splitscreen == 2)
+	if (splitscreen)
 		return; // Don't need this for splits
 
 	splitflags &= ~V_HUDTRANSHALF;
@@ -4793,13 +4808,18 @@ static void K_drawBattleFullscreen(void)
 {
 	INT32 x = BASEVIDWIDTH/2;
 	INT32 y = -64+(stplyr->kartstuff[k_cardanimation]); // card animation goes from 0 to 164, 164 is the middle of the screen
+	INT32 splitflags = V_SNAPTOTOP; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
 	fixed_t scale = FRACUNIT;
 
 	if (splitscreen)
 	{
 		if ((splitscreen == 1 && stplyr == &players[secondarydisplayplayer])
-			|| (splitscreen > 1 && (stplyr == &players[thirddisplayplayer] || stplyr == &players[fourthdisplayplayer])))
+			|| (splitscreen > 1 && (stplyr == &players[thirddisplayplayer]
+			|| (stplyr == &players[fourthdisplayplayer] && splitscreen > 2))))
+		{
 			y = 232-(stplyr->kartstuff[k_cardanimation]/2);
+			splitflags = V_SNAPTOBOTTOM;
+		}
 		else
 			y = -32+(stplyr->kartstuff[k_cardanimation]/2);
 
@@ -4807,7 +4827,8 @@ static void K_drawBattleFullscreen(void)
 		{
 			scale /= 2;
 
-			if (stplyr == &players[secondarydisplayplayer] || stplyr == &players[fourthdisplayplayer])
+			if (stplyr == &players[secondarydisplayplayer]
+				|| (stplyr == &players[fourthdisplayplayer] && splitscreen > 2))
 				x = 3*BASEVIDWIDTH/4;
 			else
 				x = BASEVIDWIDTH/4;
@@ -4826,9 +4847,9 @@ static void K_drawBattleFullscreen(void)
 		if (stplyr == &players[displayplayer])
 			V_DrawFadeScreen();
 		if (stplyr->kartstuff[k_balloon])
-			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battlewin, NULL);
+			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battlewin, NULL);
 		else if (splitscreen < 2)
-			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battlelose, NULL);
+			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battlelose, NULL);
 	}
 	else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && comeback)
 	{
@@ -4852,23 +4873,24 @@ static void K_drawBattleFullscreen(void)
 			if (splitscreen > 2)
 				ty = (BASEVIDHEIGHT/4)+33;
 			if ((splitscreen == 1 && stplyr == &players[secondarydisplayplayer])
-				|| stplyr == &players[thirddisplayplayer] || stplyr == &players[fourthdisplayplayer])
+				|| (stplyr == &players[thirddisplayplayer] && splitscreen > 1)
+				|| (stplyr == &players[fourthdisplayplayer] && splitscreen > 2))
 				ty += (BASEVIDHEIGHT/2);
 		}
 		else
 			V_DrawFadeScreen();
 
 		if (!comebackshowninfo)
-			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battleinfo, NULL);
+			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battleinfo, NULL);
 		else
-			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battlewait, NULL);
+			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battlewait, NULL);
 
 		if (splitscreen > 1)
-			V_DrawString(x-(txoff/2), ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
+			V_DrawString(x-(txoff/2), ty, splitflags, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
 		else
 		{
-			V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, K_calcSplitFlags(0), kp_timeoutsticker, NULL);
-			V_DrawKartString(x-txoff, ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
+			V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, K_calcSplitFlags(splitflags), kp_timeoutsticker, NULL);
+			V_DrawKartString(x-txoff, ty, splitflags, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
 		}
 	}
 }
@@ -4998,9 +5020,13 @@ void K_drawKartHUD(void)
 		&& comeback
 		&& stplyr->playerstate == PST_LIVE)))
 	{
+		if (splitscreen == 2)
+			K_drawKartMinimap();
 		K_drawBattleFullscreen();
 		return;
 	}
+	else if (splitscreen == 2)
+		K_drawKartMinimap();
 
 	// Draw Lakitu
 	// This is done first so that regardless of HUD layers,
@@ -5018,8 +5044,8 @@ void K_drawKartHUD(void)
 			K_drawKartPlayerCheck();
 	}
 
-	if ((splitscreen == 0 && cv_kartminimap.value) || splitscreen == 2)
-		K_drawKartMinimap();
+	if (splitscreen == 0 && cv_kartminimap.value)
+		K_drawKartMinimap(); // 3P splitscreen is handled above
 
 	// If the item window is closing, draw it closing!
 	if (stplyr->kartstuff[k_itemclose])

From 84944f1a52839aa95211f6c921930fd107e5fa24 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Tue, 27 Mar 2018 18:30:02 -0400
Subject: [PATCH 04/10] Idea: Make Boo make you invisible instead of flash in
 splitscreen

There's no way atm to make you flash on your screen but not on everyone else's, so I think just making you invisible on all of them keeps the original SMK intent of "you have to pay extra close attention to their screen to know where they are at all" better
---
 src/k_kart.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/src/k_kart.c b/src/k_kart.c
index a41e244f..008cf751 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -3225,14 +3225,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
 
 		if (player->kartstuff[k_bootimer] > 0)
 		{
-			if ((player == &players[displayplayer]
-				|| (splitscreen && player == &players[secondarydisplayplayer])
-				|| (splitscreen > 1 && player == &players[thirddisplayplayer])
-				|| (splitscreen > 2 && player == &players[fourthdisplayplayer]))
-				|| (!(player == &players[displayplayer]
-				|| (splitscreen && player == &players[secondarydisplayplayer])
-				|| (splitscreen > 1 && player == &players[thirddisplayplayer])
-				|| (splitscreen > 2 && player == &players[fourthdisplayplayer]))
+			if ((player == &players[displayplayer] && !splitscreen)
+				|| (!(player == &players[displayplayer] && !splitscreen)
 				&& (player->kartstuff[k_bootimer] < 1*TICRATE/2 || player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2))))
 			{
 				if (leveltime & 1)

From 8e9d09121edb6013da8fcbc6d14e6b8753c56a03 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Wed, 28 Mar 2018 15:28:50 -0400
Subject: [PATCH 05/10] Actually, this makes more sense :U

---
 src/k_kart.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/k_kart.c b/src/k_kart.c
index 008cf751..205e1303 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -5006,6 +5006,9 @@ void K_drawKartHUD(void)
 	// This is handled by console/menu values
 	K_initKartHUD();
 
+	if (splitscreen == 2) // Player 4 in 3P is basically the minimap :p
+		K_drawKartMinimap();
+
 	// Draw full screen stuff that turns off the rest of the HUD
 	if ((G_BattleGametype())
 		&& (stplyr->exiting
@@ -5014,13 +5017,9 @@ void K_drawKartHUD(void)
 		&& comeback
 		&& stplyr->playerstate == PST_LIVE)))
 	{
-		if (splitscreen == 2)
-			K_drawKartMinimap();
 		K_drawBattleFullscreen();
 		return;
 	}
-	else if (splitscreen == 2)
-		K_drawKartMinimap();
 
 	// Draw Lakitu
 	// This is done first so that regardless of HUD layers,

From caa000d5d6a06660c9e6a33021e51c3d4d21f344 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Wed, 28 Mar 2018 16:17:04 -0400
Subject: [PATCH 06/10] A quick credits draft

Please give me corrections and people to add. I've not been here as long
as some people, so there is 100% probably people I missed
---
 src/f_finale.c | 123 ++++++++++---------------------------------------
 src/k_kart.c   |   6 +--
 2 files changed, 28 insertions(+), 101 deletions(-)

diff --git a/src/f_finale.c b/src/f_finale.c
index 710ff78f..efd54d5a 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -451,128 +451,55 @@ boolean F_IntroResponder(event_t *event)
 //  CREDITS
 // =========
 static const char *credits[] = {
-	"\1Sonic Robo Blast II",
+	"\1Sonic Robo Blast II Kart",
 	"\1Credits",
 	"",
 	"\1Game Design",
-	"Ben \"Mystic\" Geyer",
-	"\"SSNTails\"",
-	"Johnny \"Sonikku\" Wallbank",
+	"\"Iceman404\"",
+	"\"ZarroTsu\"",
+	"Julio \"Chaos Zero 64\" Guir",
 	"",
 	"\1Programming",
-	"Alam \"GBC\" Arias",
-	"Logan \"GBA\" Arias",
-	"Tim \"RedEnchilada\" Bordelon",
-	"Callum Dickinson",
-	"Scott \"Graue\" Feeney",
-	"Nathan \"Jazz\" Giroux",
-	"Thomas \"Shadow Hog\" Igoe",
+	"\"ZarroTsu\"",
+	"Sean \"Sryder13\" Ryder",
 	"Iestyn \"Monster Iestyn\" Jealous",
-	"Ronald \"Furyhunter\" Kinard", // The SDL2 port
-	"John \"JTE\" Muniz",
+	"John \"JTE\" Muniz", // ?
 	"Ehab \"Wolfy\" Saeed",
-	"\"SSNTails\"",
-	"Matthew \"Inuyasha\" Walsh",
-	"",
-	"\1Programming",
-	"\1Assistance",
-	"\"chi.miru\"", // Red's secret weapon, the REAL reason slopes exist (also helped port drawing code from ZDoom)
-	"Andrew \"orospakr\" Clunis",
-	"Gregor \"Oogaland\" Dick",
-	"Louis-Antoine \"LJSonic\" de Moulins", // for fixing 2.1's netcode (de Rochefort doesn't quite fit on the screen sorry lol)
 	"Vivian \"toaster\" Grannell",
 	"Julio \"Chaos Zero 64\" Guir",
-	"\"Kalaron\"", // Coded some of Sryder13's collection of OpenGL fixes, especially fog
-	"Matthew \"Shuffle\" Marsalko",
-	"Steven \"StroggOnMeth\" McGranahan",
-	"\"Morph\"", // For SRB2Morphed stuff
-	"Colin \"Sonict\" Pfaff",
-	"Sean \"Sryder13\" Ryder",
-	"Ben \"Cue\" Woodford",
+	"Sally \"TehRealSalt\" Cochenour",
+	"\"Lat\'\"",
 	"",
-	"\1Sprite Artists",
-	"Odi \"Iceman404\" Atunzu",
-	"Victor \"VAdaPEGA\" Ara\x1Fjo", // Araújo -- sorry for our limited font! D:
-	"Jim \"MotorRoach\" DeMello",
+	"\1Artists",
+	"\"Iceman404\"",
 	"Desmond \"Blade\" DesJardins",
 	"Sherman \"CoatRack\" DesJardins",
-	"Andrew \"Senku Niola\" Moran",
-	"David \"Instant Sonic\" Spencer Jr.",
-	"\"SSNTails\"",
-	"",
-	"\1Texture Artists",
-	"Ryan \"Blaze Hedgehog\" Bloom",
-	"Buddy \"KinkaJoy\" Fischer",
-	"Vivian \"toaster\" Grannell",
-	"Kepa \"Nev3r\" Iceta",
-	"Jarrett \"JEV3\" Voight",
+	"Sally \"TehRealSalt\" Cochenour", // Eggman
 	"",
 	"\1Music and Sound",
 	"\1Production",
-	"Malcolm \"RedXVI\" Brown",
-	"David \"Bulmybag\" Bulmer",
-	"Paul \"Boinciel\" Clempson",
-	"Cyan Helkaraxe",
-	"Kepa \"Nev3r\" Iceta",
-	"Iestyn \"Monster Iestyn\" Jealous",
-	"Jarel \"Arrow\" Jones",
-	"Stefan \"Stuf\" Rimalia",
-	"Shane Mychal Sexton",
-	"\"Spazzo\"",
-	"David \"Big Wave Dave\" Spencer Sr.",
-	"David \"Instant Sonic\" Spencer Jr.",
-	"\"SSNTails\"",
+	"\"Charyb\"",
+	"James \"SeventhSentinel\" Hall",
 	"",
 	"\1Level Design",
-	"Matthew \"Fawfulfan\" Chapman",
 	"Paul \"Boinciel\" Clempson",
 	"Desmond \"Blade\" DesJardins",
 	"Sherman \"CoatRack\" DesJardins",
-	"Ben \"Mystic\" Geyer",
-	"Nathan \"Jazz\" Giroux",
-	"Dan \"Blitzzo\" Hagerstrand",
-	"Kepa \"Nev3r\" Iceta",
-	"Thomas \"Shadow Hog\" Igoe",
-	"Erik \"Torgo\" Nielsen",
-	"Wessel \"Spherallic\" Smit",
-	"\"Spazzo\"",
-	"\"SSNTails\"",
-	"Rob Tisdell",
-	"Jarrett \"JEV3\" Voight",
-	"Johnny \"Sonikku\" Wallbank",
-	"Matthew \"Inuyasha\" Walsh",
-	"Marco \"Digiku\" Zafra",
-	"",
-	"\1Boss Design",
-	"Ben \"Mystic\" Geyer",
-	"Thomas \"Shadow Hog\" Igoe",
-	"John \"JTE\" Muniz",
-	"Samuel \"Prime 2.0\" Peters",
-	"\"SSNTails\"",
-	"Johnny \"Sonikku\" Wallbank",
-	"",
-	"\1Testing",
-	"Hank \"FuriousFox\" Brannock",
-	"Cody \"SRB2 Playah\" Koester",
-	"Skye \"OmegaVelocity\" Meredith",
-	"Stephen \"HEDGESMFG\" Moellering",
-	"Nick \"ST218\" Molina",
-	"Samuel \"Prime 2.0\" Peters",
-	"Colin \"Sonict\" Pfaff",
-	"Bill \"Tets\" Reed",
+	"\"Blitz-T\"",
+	"\"Chromatian\"",
+	"\"Tyrannosaur Chao\"",
+	"\"Ryuspark\"",
+	"James \"SeventhSentinel\" Hall",
+	"Sally \"TehRealSalt\" Cochenour",
 	"",
+	//"\1Testing", // Should we have this? If so, please gimmie who would be on here
+	//"",
 	"\1Special Thanks",
-	"Doom Legacy Project",
-	"iD Software",
-	"Alex \"MistaED\" Fuller",
-	"FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak
-	"Randi Heit (<!>)", // For their MSPaint <!> sprite that we nicked
+	"Sonic Team Jr. & SRB2",
+	"Bandit \"Bippy\" Cochenour", // i <3 my dog
 	"",
 	"\1Produced By",
-	"Sonic Team Junior",
-	"",
-	"\1Published By",
-	"A 28K dialup modem",
+	"Kart Krew",
 	"",
 	"\1Thank you",
 	"\1for playing!",
diff --git a/src/k_kart.c b/src/k_kart.c
index 205e1303..4c2568a1 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -4880,11 +4880,11 @@ static void K_drawBattleFullscreen(void)
 			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battlewait, NULL);
 
 		if (splitscreen > 1)
-			V_DrawString(x-(txoff/2), ty, splitflags, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
+			V_DrawString(x-(txoff/2), ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
 		else
 		{
-			V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, K_calcSplitFlags(splitflags), kp_timeoutsticker, NULL);
-			V_DrawKartString(x-txoff, ty, splitflags, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
+			V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutsticker, NULL);
+			V_DrawKartString(x-txoff, ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
 		}
 	}
 }

From 38b59aaaf1ef1ff44b443f6c5609682abc0a0008 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Wed, 28 Mar 2018 16:25:43 -0400
Subject: [PATCH 07/10] Actually, ehhh, let's remove full names for everyone
 who hasn't went "yes, I want my full name on Kart's credits

---
 src/f_finale.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/f_finale.c b/src/f_finale.c
index efd54d5a..013499b2 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -457,23 +457,23 @@ static const char *credits[] = {
 	"\1Game Design",
 	"\"Iceman404\"",
 	"\"ZarroTsu\"",
-	"Julio \"Chaos Zero 64\" Guir",
+	"\"Chaos Zero 64\"",
 	"",
 	"\1Programming",
 	"\"ZarroTsu\"",
-	"Sean \"Sryder13\" Ryder",
-	"Iestyn \"Monster Iestyn\" Jealous",
-	"John \"JTE\" Muniz", // ?
-	"Ehab \"Wolfy\" Saeed",
-	"Vivian \"toaster\" Grannell",
-	"Julio \"Chaos Zero 64\" Guir",
+	"\"Sryder13\"",
+	"\"Monster Iestyn\"",
+	"\"JTE\"", // Did they do anything for Kart, or was it just TD?
+	"\"Wolfy\"",
+	"\"toaster\"",
+	"\"Chaos Zero 64\"",
 	"Sally \"TehRealSalt\" Cochenour",
 	"\"Lat\'\"",
 	"",
 	"\1Artists",
 	"\"Iceman404\"",
-	"Desmond \"Blade\" DesJardins",
-	"Sherman \"CoatRack\" DesJardins",
+	"\"Blade\"",
+	"\"CoatRack\"",
 	"Sally \"TehRealSalt\" Cochenour", // Eggman
 	"",
 	"\1Music and Sound",
@@ -482,9 +482,9 @@ static const char *credits[] = {
 	"James \"SeventhSentinel\" Hall",
 	"",
 	"\1Level Design",
-	"Paul \"Boinciel\" Clempson",
-	"Desmond \"Blade\" DesJardins",
-	"Sherman \"CoatRack\" DesJardins",
+	"\"Boinciel\"",
+	"\"Blade\"",
+	"\"CoatRack\"",
 	"\"Blitz-T\"",
 	"\"Chromatian\"",
 	"\"Tyrannosaur Chao\"",

From 9dd14531ee5770fb611509ee26abe188b33703e2 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Wed, 28 Mar 2018 19:27:26 -0400
Subject: [PATCH 08/10] More credit stuff

---
 src/f_finale.c | 63 +++++++++++++++++++++++++++++++++-----------------
 1 file changed, 42 insertions(+), 21 deletions(-)

diff --git a/src/f_finale.c b/src/f_finale.c
index 013499b2..f20ac7b3 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -451,49 +451,63 @@ boolean F_IntroResponder(event_t *event)
 //  CREDITS
 // =========
 static const char *credits[] = {
-	"\1Sonic Robo Blast II Kart",
+	"\1SRBTwo Kart",
 	"\1Credits",
 	"",
 	"\1Game Design",
-	"\"Iceman404\"",
+	"\"Iceman404\" aka \"VelocitOni\"",
 	"\"ZarroTsu\"",
 	"\"Chaos Zero 64\"",
 	"",
 	"\1Programming",
+	"\"Sryder\"",
+	"\"wolfs\"",
 	"\"ZarroTsu\"",
-	"\"Sryder13\"",
-	"\"Monster Iestyn\"",
-	"\"JTE\"", // Did they do anything for Kart, or was it just TD?
-	"\"Wolfy\"",
-	"\"toaster\"",
-	"\"Chaos Zero 64\"",
 	"Sally \"TehRealSalt\" Cochenour",
 	"\"Lat\'\"",
+	"\"Chaos Zero 64\"",
+	"\"Monster Iestyn\"",
+	"Vivian \"toaster\" Grannell",
 	"",
 	"\1Artists",
 	"\"Iceman404\"",
 	"\"Blade\"",
 	"\"CoatRack\"",
+	"James \"SeventhSentinel\" Hall",
 	"Sally \"TehRealSalt\" Cochenour", // Eggman
+	"\"Chaos Zero 64\"",
+	"\"ZarroTsu\"",
+	"\"Spherallic\"",
 	"",
 	"\1Music and Sound",
-	"\1Production",
 	"\"Charyb\"",
 	"James \"SeventhSentinel\" Hall",
+	"Karl Brueggemann",
+	"\"MaxieDaMan\"",
 	"",
 	"\1Level Design",
-	"\"Boinciel\"",
-	"\"Blade\"",
-	"\"CoatRack\"",
 	"\"Blitz-T\"",
 	"\"Chromatian\"",
-	"\"Tyrannosaur Chao\"",
+	"\"Sryder\"",
+	"\"Blade\"",
+	"\"CoatRack\"",
+	"\"Boinciel\"",
 	"\"Ryuspark\"",
+	"\"ZarroTsu\"",
+	"\"Tyrannosaur Chao\" aka \"Chaotic Chao\"",
 	"James \"SeventhSentinel\" Hall",
 	"Sally \"TehRealSalt\" Cochenour",
+	"\"Chaos Zero 64\"",
+	"\"D00D64-X\"",
+	"\"Simsmagic\"",
+	"",
+	"\1Testing",
+	"\"Jeck Jims\"",
+	"\"Fooruman\"",
+	"\"CyberIF\"",
+	"\"Dani\"",
+	"\"VirtAnderson\"",
 	"",
-	//"\1Testing", // Should we have this? If so, please gimmie who would be on here
-	//"",
 	"\1Special Thanks",
 	"Sonic Team Jr. & SRB2",
 	"Bandit \"Bippy\" Cochenour", // i <3 my dog
@@ -501,6 +515,9 @@ static const char *credits[] = {
 	"\1Produced By",
 	"Kart Krew",
 	"",
+	"\1In Memory of",
+	"\"Tyler52\"",
+	"",
 	"\1Thank you",
 	"\1for playing!",
 	NULL
@@ -510,7 +527,7 @@ static struct {
 	UINT32 x, y;
 	const char *patch;
 } credits_pics[] = {
-	{  8, 80+200* 1, "CREDIT01"},
+	/*{  8, 80+200* 1, "CREDIT01"},
 	{  4, 80+200* 2, "CREDIT13"},
 	{250, 80+200* 3, "CREDIT12"},
 	{  8, 80+200* 4, "CREDIT03"},
@@ -518,10 +535,8 @@ static struct {
 	{  8, 80+200* 6, "CREDIT04"},
 	{112, 80+200* 7, "CREDIT10"},
 	{240, 80+200* 8, "CREDIT05"},
-	{120, 80+200* 9, "CREDIT06"},
-	{  8, 80+200*10, "CREDIT07"},
-	{  8, 80+200*11, "CREDIT08"},
-	{112, 80+200*12, "CREDIT09"},
+	{120, 80+200* 9, "CREDIT06"},*/
+	{112, 80+200*10, "TYLER52"},
 	{0, 0, NULL}
 };
 
@@ -563,7 +578,13 @@ void F_CreditDrawer(void)
 
 	V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
 
-	// Draw background pictures first
+	// Draw background
+	V_DrawSciencePatch(0, 0 - FixedMul(32<<FRACBITS, FixedDiv(animtimer%280, 280)), V_SNAPTOTOP, W_CachePatchName("CREDTILE", PU_CACHE), FRACUNIT);
+
+	V_DrawSciencePatch(0, 0 - FixedMul(40<<FRACBITS, FixedDiv(animtimer%70, 70)), V_SNAPTOTOP, ttcheckers, FRACUNIT);
+	V_DrawSciencePatch(280<<FRACBITS, 0 - FixedMul(40<<FRACBITS, FixedDiv(animtimer%70, 70)), V_SNAPTOTOP, ttcheckers, FRACUNIT);
+
+	// Draw pictures
 	for (i = 0; credits_pics[i].patch; i++)
 		V_DrawSciencePatch(credits_pics[i].x<<FRACBITS, (credits_pics[i].y<<FRACBITS) - 4*(animtimer<<FRACBITS)/5, 0, W_CachePatchName(credits_pics[i].patch, PU_CACHE), FRACUNIT>>1);
 

From ad42a9f63cace18cd4357a2b4f57232ed4a931d1 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Wed, 28 Mar 2018 20:32:53 -0400
Subject: [PATCH 09/10] Some more credit adjustments

---
 src/f_finale.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/f_finale.c b/src/f_finale.c
index f20ac7b3..c576c4da 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -451,7 +451,7 @@ boolean F_IntroResponder(event_t *event)
 //  CREDITS
 // =========
 static const char *credits[] = {
-	"\1SRBTwo Kart",
+	"\1SRB2 Kart",
 	"\1Credits",
 	"",
 	"\1Game Design",
@@ -460,8 +460,8 @@ static const char *credits[] = {
 	"\"Chaos Zero 64\"",
 	"",
 	"\1Programming",
-	"\"Sryder\"",
-	"\"wolfs\"",
+	"Sean \"Sryder\" Ryder",
+	"Ehab \"wolfs\" Saeed",
 	"\"ZarroTsu\"",
 	"Sally \"TehRealSalt\" Cochenour",
 	"\"Lat\'\"",
@@ -488,7 +488,7 @@ static const char *credits[] = {
 	"\1Level Design",
 	"\"Blitz-T\"",
 	"\"Chromatian\"",
-	"\"Sryder\"",
+	"Sean \"Sryder\" Ryder",
 	"\"Blade\"",
 	"\"CoatRack\"",
 	"\"Boinciel\"",

From d07419b6accf03875cdce739d8a393ead7650c77 Mon Sep 17 00:00:00 2001
From: TehRealSalt <tehrealsalt@gmail.com>
Date: Wed, 28 Mar 2018 21:52:35 -0400
Subject: [PATCH 10/10] Allow skipping

---
 src/f_finale.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/f_finale.c b/src/f_finale.c
index c576c4da..280d6831 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -666,7 +666,7 @@ boolean F_CreditResponder(event_t *event)
 			break;
 	}
 
-	if (!(timesBeaten) && !(netgame || multiplayer))
+	if (/*!(timesBeaten) && */!(netgame || multiplayer))
 		return false;
 
 	if (event->type != ev_keydown)