-- Initiating gameplay.
COM_AddCommand("ssp_beginmatch", function(player)
	if not netgame
		CONS_Printf(player, "You can only do this in multiplayer.")
		return
	end
	if gametype != GT_SLINGERSPEED
		CONS_Printf(player, "You can only do this in Slinger Speed.")
		return
	end
	if not player.SSpeedData.beginReady
		CONS_Printf(player, "Not enough players.")
		return
	end
	if player.SSpeedData.deck != nil
		CONS_Printf(player, "You're already in a game!")
		return
	end
	
	SSpeed_InitTransition()
	S_StartSound(nil, sfx_zoom)
	chatprint("\x82* Ready? \x87Let us begin!")
	if players[0].menu.contents[1][3].value
		chatprint("* Remember: place cards down using Spin!")
	end
	player.SSpeedData.beginReady = false
	for i, play in ipairs(SSpeed_Players)
		S_StopMusic(play)
		play.SSpeedData.ready = false
		play.SSpeedData.deck = players[0].menu.contents[1][8].value+15
		play.SSpeedData.discard = {
			amount = 0,
			topType = nil,
			topColor = nil
		}
		play.SSpeedData.mashNumber = 0
		play.SSpeedData.dueling = {}
		SSpeed_DirOfPlay = 1
		SSpeed_ColorMatch = false
		SSpeed_PassItForward = false
	end
	local curTurn = SSpeed_Players[1].name
	rawset(_G, "SSpeed_CurTurn", curTurn)
	local pot = players[0].menu.contents[1][9].value
	rawset(_G, "SSpeed_Pot", pot)
end, COM_ADMIN)

COM_AddCommand("sspdebug_forcematch", function(player)
	if not player.SSpeedDebug.Enable
		CONS_Printf(player, "Access denied.")
		return
	end
	if not netgame
		CONS_Printf(player, "You can only do this in multiplayer.")
		return
	end
	if gametype != GT_SLINGERSPEED
		CONS_Printf(player, "You can only do this in Slinger Speed.")
		return
	end
	if player.SSpeedData.deck != nil
		CONS_Printf(player, "You're already in a game!")
		return
	end
	
	SSpeed_InitTransition()
	S_StartSound(nil, sfx_zoom)
	chatprint("\x82* Ready? \x87Let us begin!\x86 (forced)")
	if players[0].menu.contents[1][3].value
		chatprint("* Remember: place cards down using Spin!")
	end
	player.SSpeedData.beginReady = false
	for i, play in ipairs(SSpeed_Players)
		S_StopMusic(play)
		play.SSpeedData.ready = false
		play.SSpeedData.deck = players[0].menu.contents[1][8].value+15
		play.SSpeedData.discard = {
			amount = 0,
			topType = nil,
			topColor = nil
		}
		play.SSpeedData.mashNumber = 0
		play.SSpeedData.dueling = {}
		SSpeed_DirOfPlay = 1
		SSpeed_ColorMatch = false
		SSpeed_PassItForward = false
	end
	local curTurn = SSpeed_Players[1].name
	rawset(_G, "SSpeed_CurTurn", curTurn)
	local pot = players[0].menu.contents[1][9].value
	rawset(_G, "SSpeed_Pot", pot)
end, COM_ADMIN)

COM_AddCommand("sspdebug_abortmatch", function(player)
	if not player.SSpeedDebug.Enable
		CONS_Printf(player, "Access denied.")
		return
	end
	if not netgame
		CONS_Printf(player, "You can only do this in multiplayer.")
		return
	end
	if gametype != GT_SLINGERSPEED
		CONS_Printf(player, "You can only do this in Slinger Speed.")
		return
	end
	if player.SSpeedData.deck == nil
		CONS_Printf(player, "You're not in a game.")
		return
	end
	
	SSpeed_InitTransition()
	S_StartSound(nil, sfx_spkdth)
	chatprint("\x85* Match aborted.")
	player.SSpeedData.beginReady = false
	for i, play in ipairs(SSpeed_Players)
		P_RestoreMusic(play)
		if players[0].name != play.name
			play.SSpeedData.ready = true
		end
		play.SSpeedData.deck = nil
		play.SSpeedData.discard = nil
		play.SSpeedData.mashNumber = nil
		play.SSpeedData.dueling = nil
	end
end, COM_ADMIN)

local function PlayerByName(name)
	for player in players.iterate
		if player.name == name
			return player
		end
	end
end

rawset(_G, "SSpeed_Duel", 0)
rawset(_G, "SSpeed_AllFlip", 0)
rawset(_G, "SSpeed_AllFlipReady", {})
rawset(_G, "SSpeed_ColorMatch", false)
rawset(_G, "SSpeed_PassItForward", false)
rawset(_G, "SSpeed_DirOfPlay", 1)
local SSpeed_AllFTimer = 0
local msgsent
local duelmsgsent

local transTable = {
	V_70TRANS,
	V_60TRANS,
	V_50TRANS,
	V_40TRANS,
	V_30TRANS,
	V_20TRANS,
	V_10TRANS,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	V_10TRANS,
	V_20TRANS,
	V_30TRANS,
	V_40TRANS,
	V_50TRANS,
	V_60TRANS,
}
local transIndex = 1
local function V_OscillateTranslucency()
	return transTable[transIndex]
end

addHook("PreThinkFrame", function()
	-- Help oscillate
	if leveltime%5 == 0
		transIndex = $+1
		if transIndex > #transTable
			transIndex = 1
		end
	end
	
	if gametype != GT_SLINGERSPEED then return end
	for player in players.iterate
		if not player.SSpeedData return end
		if player.SSpeedData.deck == nil return end
	end
	
	-- Inner Hands
	if #SSpeed_InnerHands == #SSpeed_Players
		local played = SSpeed_InnerHands[#SSpeed_InnerHands]
		local playing = SSpeed_InnerHands[1]
		chatprint("\x85* "..played.name.." placed their hand on the Totem last.")
		chatprint("\x87* "..played.name.." adds their and "..playing.name.."'s played cards, as well as the cards in the pot to their deck.")
		played.SSpeedData.deck = $+played.SSpeedData.discard.amount+playing.SSpeedData.discard.amount+SSpeed_Pot
		played.SSpeedData.discard.amount = 0
		played.SSpeedData.discard.topType, played.SSpeedData.discard.topColor = nil, nil
		playing.SSpeedData.discard.amount = 0
		playing.SSpeedData.discard.topType, playing.SSpeedData.discard.topColor = nil, nil
		SSpeed_Pot = 0
		SSpeed_CurTurn = played.name
		SSpeed_InnerHands = {}
		SSpeed_PassItForward = false
		SSpeed_ColorMatch = false
		for player in players.iterate
			if player.SSpeedData.discard.topType == "CARDAHND"
				player.SSpeedData.discard.InnerHresolved = true
				break
			end
		end
	end
	
	-- All Flip
	for player in players.iterate
		if player.SSpeedData.discard.topType == "CARDAFLP"
			if (SSpeed_AllFlip == 0 or SSpeed_AllFlip >= 4)
			and not player.SSpeedData.discard.AllFresolved
				if players[0].menu.contents[1][2].value == 0
					SSpeed_AllFlip = 2
					SSpeed_AllFTimer = 20
					S_StartSound(nil, sfx_s3ka7)
				else
					SSpeed_AllFlip = 1
				end
				player.SSpeedData.discard.AllFresolved = true
				break
			elseif player.SSpeedData.discard.AllFResolved
				SSpeed_CurTurn = player.name
				break
			end
		end
	end
	
	SSpeed_AllFTimer = $ or 0
	msgsent = $ or false
	if SSpeed_AllFlip == 1 -- Ready?
		if not msgsent
			chatprint("\x82* You all ready? An All Flip is about to commence!")
			if players[0].menu.contents[1][3].value
				chatprint("* Press Jump to confirm. All players need to confirm before an All Flip.")
			end
			msgsent = true
		end
		
		if #SSpeed_AllFlipReady == #SSpeed_Players
			chatprint("\x82* Here comes...")
			SSpeed_AllFlip = 2
			SSpeed_AllFTimer = 20
			S_StartSound(nil, sfx_s3ka7)
		end
	elseif SSpeed_AllFlip == 2 -- 1...
		msgsent = false
		SSpeed_AllFlipReady = {}
		if SSpeed_AllFTimer == 0
			SSpeed_AllFTimer = 20
			SSpeed_AllFlip = 3
			S_StartSound(nil, sfx_s3ka7)
		end
	elseif SSpeed_AllFlip == 3 -- 2...
		if SSpeed_AllFTimer == 0
			SSpeed_AllFTimer = 40
			SSpeed_AllFlip = 4
			S_StartSound(nil, sfx_s3kad)
			-- Flip the cards!
			for player in players.iterate
				if not player.SSpeedData.deck then continue end
				
				player.SSpeedData.deck = $-1
				player.SSpeedData.discard.amount = $+1
				player.SSpeedData.discard.topType, player.SSpeedData.discard.topColor = SSpeed_RandomCard()
				player.SSpeedData.discard.AllFresolved = false
				player.SSpeedData.discard.InnerHresolved = false
				player.SSpeedData.discard.PIFResolved = false
				if players[0].menu.contents[1][3].value == 1
					if player.SSpeedData.discard.topType == "CARDAFST"
						chatprint("* Fast Grab: It's a rush to grab the totem! The player who grabs it first puts their card under the totem - in the pot.")
					elseif player.SSpeedData.discard.topType == "CARDAFLP"
						chatprint("* All Flip: Count to three, then everyone simultaneously flips the top card of their decks!")
					elseif player.SSpeedData.discard.topType == "CARDACLR"
						chatprint("* Color Match: Duel Action. Duels now go by color!")
					elseif player.SSpeedData.discard.topType == "CARDAHND"
						chatprint("* Inner Hands: It's a test of your reaction time! Press Jump ONCE to put your hand on the totem! Resolve like a duel between the first (winner) and the last (loser) to do so.")
					elseif player.SSpeedData.discard.topType == "CARDAPAS"
						if players[0].menu.contents[1][6].value == 0
							chatprint("* Pass It Forward: The direction of play is reversed!")
						elseif players[0].menu.contents[1][6].value == 1
							chatprint("* Pass It Forward: Duel Action. You now treat the discard of the player to your left (next in turn) as yours when comparing for a Duel!")
						end
					end
				end
			end
		end
	elseif SSpeed_AllFlip == 4 -- 3!
		if SSpeed_AllFTimer == 0
			SSpeed_AllFlip = 0
		end
	end
	
	if SSpeed_AllFTimer
		SSpeed_AllFTimer = $-1
	end
	
	-- Check duel action durations
	if players[0].menu.contents[1][7].value == 0
		SSpeed_ColorMatch = false
		SSpeed_PassItForward = false
	end
	
	-- Pass It Forward
	-- House: Reverse the direction of play house rule
	if players[0].menu.contents[1][6].value == 0
		for player in players.iterate
			if player.SSpeedData.discard.topType == "CARDAPAS"
			and not player.SSpeedData.discard.PIFResolved
				if SSpeed_DirOfPlay == 1
					SSpeed_DirOfPlay = 0
				else
					SSpeed_DirOfPlay = 1
				end
				player.SSpeedData.discard.PIFResolved = true
			end
		end
	end
	
	-- Standard: match for duels by cards in the next player's discard
	if players[0].menu.contents[1][6].value == 1
		for player in players.iterate
			if player.SSpeedData.discard.topType == "CARDAPAS"
				SSpeed_PassItForward = true
				if players[0].menu.contents[1][7].value == 1
					SSpeed_ColorMatch = false -- Take priority back if it's until next duel!
				end
			end
		end
	end
	
	-- Color Match	
	for player in players.iterate
		if player.SSpeedData.discard.topType == "CARDACLR"
			SSpeed_ColorMatch = true
			SSpeed_PassItForward = false -- Takes priority over PIF
		end
	end
	
	if SSpeed_PassItForward
	and players[0].menu.contents[1][7].value == 1
		SSpeed_ColorMatch = false -- Take priority back if it's until next duel!
	end
	if SSpeed_ColorMatch
		SSpeed_PassItForward = false -- Takes priority over PIF
	end
	
	-- Stalemate
	local playe = PlayerByName(SSpeed_CurTurn)
	local stalemated = false
	while PlayerByName(SSpeed_CurTurn).SSpeedData.deck == 0
		if SSpeed_CurTurn == playe.name
			stalemated = true
			break
		end
		
		local a = PlayerByName(SSpeed_CurTurn)
		if not SSpeed_Players[#a+(SSpeed_DirOfPlay*2)]
			if SSpeed_DirOfPlay == 0
				SSpeed_CurTurn = SSpeed_Players[#SSpeed_Players].name
			else
				SSpeed_CurTurn = SSpeed_Players[1].name
			end
		else
			SSpeed_CurTurn = SSpeed_Players[#a+(SSpeed_DirOfPlay*2)].name
		end
	end
	if stalemated
	and not SSpeed_Duel
		chatprint("\x85* Stalemate, all players reshuffle their discards (except for the top card) into a new deck.")
		for play in players.iterate
			play.SSpeedData.deck = play.SSpeedData.discard.amount-1
			play.SSpeedData.discard.amount = 1
		end
	end
	
	-- Check for duels
	local compareTable = {}
	SSpeed_Duel = 0 -- Assume no duel in progress before checking
	for player in players.iterate
		if not player.SSpeedData then return end
		-- Fast Grab and Inner Hands
		if not player.SSpeedData.discard.resolved -- Duel resolved
			if player.SSpeedData.discard.topType == "CARDAFST"
				SSpeed_Duel = 2 -- Fast Grab duel; place cards in pot
				compareTable = {}
				break
			elseif player.SSpeedData.discard.topType == "CARDAHND"
				SSpeed_Duel = 3 -- Inner Hands duel
				compareTable = {}
				break
			end
		end
		
		-- Now store the card for reference to check duels
		if not player.SSpeedData.discard.topType then continue end
		compareTable[#player+1] = {
			player.SSpeedData.discard.topType,
			player.SSpeedData.discard.topColor -- Store the color for Color Match duels
		}
	end
	for i1, v1 in ipairs(compareTable)
		for i2, v2 in ipairs(compareTable)
			if i1 == i2
				continue
			end
			if (players[i1-1].SSpeedData.discard.resolved or players[i2-1].SSpeedData.discard.resolved)
				continue
			end
			
			if SSpeed_PassItForward
				if v1[1] == v2[1]
					if not players[i1]
						table.insert(players[1].SSpeedData.dueling, players[i2])
						table.insert(players[i2].SSpeedData.dueling, players[1])
					elseif not players[i2]
						table.insert(players[i1].SSpeedData.dueling, players[1])
						table.insert(players[1].SSpeedData.dueling, players[i1])
					else
						table.insert(players[i1].SSpeedData.dueling, players[i2])
						table.insert(players[i2].SSpeedData.dueling, players[i1])
					end
					SSpeed_Duel = 4 -- Pass It Forward duel
				end
			elseif SSpeed_ColorMatch
				if v1[2] == v2[2]
				and v1[2] != nil
					table.insert(players[i1-1].SSpeedData.dueling, players[i2-1])
					table.insert(players[i2-1].SSpeedData.dueling, players[i1-1])
					SSpeed_Duel = 4 -- Color Match duel; compare color
				end
			else
				if v1[1] == v2[1]
					table.insert(players[i1-1].SSpeedData.dueling, players[i2-1])
					table.insert(players[i2-1].SSpeedData.dueling, players[i1-1])
					SSpeed_Duel = 1 -- Regular duel
				end
			end
		end
	end
	
	if (SSpeed_Duel == 1 or SSpeed_Duel == 4)
	and players[0].menu.contents[1][3].value
	and not duelmsgsent
		duelmsgsent = true
		chatprint("\x82* IT'S A DUEL! See the match, and if it's yours, press Jump "..(players[0].menu.contents[1][1].value+1).." times to grab the Totem and win!")
	end
	-- With this info, we can evaluate duels in the PlayerThink hook below!
end)

local innerHands = {}
rawset(_G, "SSpeed_InnerHands", innerHands)

addHook("PlayerThink", function(player)
	if gametype != GT_SLINGERSPEED then return end
	if player.SSpeedData.deck == nil return end
	
	if player.SSpeedData.transTimer == 1
		S_ChangeMusic("RVZ2")
	end
	player.pflags = $ | PF_FULLSTASIS -- Immobilize.
	
	-- Check duel actions
	if player.SSpeedData.discard.resolved
	and players[0].menu.contents[1][7].value == 1
		SSpeed_ColorMatch = false
		SSpeed_PassItForward = false
	end
	
	-- Grabbing the Totem / All Flip confirm
	if player.cmd.buttons & BT_JUMP
		if not player.Totem
			if SSpeed_AllFlip == 1
				local inTable
				for i, p in ipairs(SSpeed_AllFlipReady)
					if p.name == player.name
						inTable = true
						break
					end
				end
				
				if not inTable
					table.insert(SSpeed_AllFlipReady, player)
					S_StartSound(nil, sfx_tink, player)
					chatprint("\x82* "..player.name.." is ready!")
				end
				return
			elseif SSpeed_AllFlip > 0 and SSpeed_AllFlip < 4
				return
			end
			
			player.SSpeedData.mashNumber = $+1
			S_StartSound(nil, sfx_tink, player)
			
			-- Check if UD is on
			if players[0].menu.contents[1][4].value == 2 -- !!!
				if (not SSpeed_Duel
				or SSpeed_Duel == 1 and not player.SSpeedData.dueling[1]) and SSpeed_AllFlip != 1
					-- FOOL, THERE IS NO DUEL WITH YOU
					local penalty = 0
					for play in players.iterate
						if play.SSpeedData.deck == nil then continue end
						
						penalty = $+player.SSpeedData.discard.amount
						play.SSpeedData.discard.amount = 0
						play.SSpeedData.discard.topType, player.SSpeedData.discard.topColor = nil, nil
					end
					penalty = $+SSpeed_Pot
					SSpeed_Pot = 0
					player.SSpeedData.mashNumber = 0
					
					player.SSpeedData.deck = $+penalty
					S_StartSound(nil, sfx_lose)
					chatprint("\x85* FOUL! "..player.name.." tried to grab the totem without a duel!")
					chatprint("\x87* "..player.name.." adds all the played cards and the cards in the pot to their deck.")
					SSpeed_CurTurn = player.name
					SSpeed_ColorMatch = false
					SSpeed_PassItForward = false
				end
			end
			
			-- Inner Hands
			if SSpeed_Duel == 3
				local inTable
				for i, p in ipairs(SSpeed_InnerHands)
					if p.name == player.name
						inTable = true
						break
					end
				end
				
				if inTable
					-- FOOL, YOU MADE THE TOTEM FALL
					local penalty = 0
					for play in players.iterate
						if play.SSpeedData.deck == nil then continue end
						
						penalty = $+player.SSpeedData.discard.amount
						play.SSpeedData.discard.amount = 0
						play.SSpeedData.discard.topType, player.SSpeedData.discard.topColor = nil, nil
					end
					penalty = $+SSpeed_Pot
					SSpeed_Pot = 0
					player.SSpeedData.mashNumber = 0
					
					player.SSpeedData.deck = $+penalty
					S_StartSound(nil, sfx_lose)
					chatprint("\x85* FOUL! "..player.name.." made the Totem fall over!")
					chatprint("\x87* "..player.name.." adds all the played cards and the cards in the pot to their deck.")
					SSpeed_CurTurn = player.name
					SSpeed_ColorMatch = false
					SSpeed_PassItForward = false
				else
					table.insert(SSpeed_InnerHands, player)
					S_StartSound(nil, sfx_tink, player)
					chatprint("\x82* "..player.name.." places their hand on the Totem!")
				end
			end
			
			-- Other duels
			if player.SSpeedData.mashNumber >= players[0].menu.contents[1][1].value+1
				S_StartSound(nil, sfx_s3k4c)
				if not SSpeed_Duel
				or SSpeed_Duel == 1 and not player.SSpeedData.dueling[1]
					-- FOOL, THERE IS NO DUEL WITH YOU
					-- actually lemme check HB
					if players[0].menu.contents[1][4].value == 0
						-- oh ok nvm
						S_StartSound(nil, sfx_lose, player)
						CONS_Printf(player, "You can't grab yet!")
					else
						local penalty = 0
						for play in players.iterate
							if play.SSpeedData.deck == nil then continue end
							
							penalty = $+player.SSpeedData.discard.amount
							play.SSpeedData.discard.amount = 0
							play.SSpeedData.discard.topType, player.SSpeedData.discard.topColor = nil, nil
						end
						penalty = $+SSpeed_Pot
						SSpeed_Pot = 0
						
						player.SSpeedData.deck = $+penalty
						S_StartSound(nil, sfx_lose)
						chatprint("\x85* FOUL! "..player.name.." grabbed the totem without a duel!")
						chatprint("\x87* "..player.name.." adds all the played cards and the cards in the pot to their deck.")
						SSpeed_CurTurn = player.name
					end
				else
					-- Duel!
					if SSpeed_Duel == 1 or SSpeed_Duel == 4 -- regular/Color Match
						S_StartSound(nil, sfx_altow1)
						chatprint("\x83* "..player.name.." grabbed the Totem before "..player.SSpeedData.dueling[1].name.."!")
						chatprint("\x87* "..player.SSpeedData.dueling[1].name.." adds their and "..player.name.."'s cards, as well as the cards in the pot, to their deck.")
						player.SSpeedData.dueling[1].SSpeedData.deck = $+player.SSpeedData.discard.amount+player.SSpeedData.dueling[1].SSpeedData.discard.amount+SSpeed_Pot
						player.SSpeedData.dueling[1].SSpeedData.discard.topType, player.SSpeedData.dueling[1].SSpeedData.discard.topColor = nil, nil
						player.SSpeedData.dueling[1].SSpeedData.discard.resolved = true
						player.SSpeedData.dueling[1].SSpeedData.discard.amount = 0
						player.SSpeedData.discard.topType, player.SSpeedData.discard.topColor = nil, nil
						player.SSpeedData.discard.resolved = true
						player.SSpeedData.discard.amount = 0
						SSpeed_Pot = 0
						SSpeed_CurTurn = player.SSpeedData.dueling[1].name
						player.SSpeedData.dueling[1].SSpeedData.dueling = {}
						player.SSpeedData.dueling = {}
					elseif SSpeed_Duel == 2 -- Fast Grab
						SSpeed_Pot = $+player.SSpeedData.discard.amount
						player.SSpeedData.discard.amount = 0
						player.SSpeedData.discard.topType, player.SSpeedData.discard.topColor = nil, nil
						S_StartSound(nil, sfx_token)
						chatprint("\x83* "..player.name.." grabbed the Totem!")
						chatprint("\x87* "..player.name.." adds their played cards to the pot.")
						SSpeed_CurTurn = player.name
						for play in players.iterate
							play.SSpeedData.discard.resolved = true
						end
					end
					SSpeed_Duel = 0
					duelmsgsent = false
					SSpeed_ColorMatch = false
					SSpeed_PassItForward = false
				end
				player.SSpeedData.mashNumber = 0
			end
		end
		player.Totem = true
		player.mashC = 35
	else
		if player.mashC
			player.mashC = $-1
			if player.mashC == 0
				player.SSpeedData.mashNumber = 0
			end
		end
		player.Totem = false
	end
	-- Placing a card
	if player.cmd.buttons & BT_SPIN
		if not player.CardPlace
			if not player.SSpeedData.deck then return end
			if SSpeed_CurTurn != player.name then return end
			if SSpeed_AllFlip < 4 and SSpeed_AllFlip then return end
			
			player.SSpeedData.discard.resolved = false
			player.SSpeedData.deck = $-1
			player.SSpeedData.discard.amount = $+1
			player.SSpeedData.discard.topType, player.SSpeedData.discard.topColor = SSpeed_RandomCard()
			player.SSpeedData.discard.AllFresolved = false
			player.SSpeedData.discard.InnerHresolved = false
			player.SSpeedData.discard.PIFResolved = false
			if players[0].menu.contents[1][3].value == 1
				if player.SSpeedData.discard.topType == "CARDAFST"
					chatprint("* Fast Grab: It's a rush to grab the totem! The player who grabs it first puts their card under the totem - in the pot.")
				elseif player.SSpeedData.discard.topType == "CARDAFLP"
					chatprint("* All Flip: Count to three, then everyone simultaneously flips the top card of their decks!")
				elseif player.SSpeedData.discard.topType == "CARDACLR"
					chatprint("* Color Match: Duel Action. Duels now go by color!")
				elseif player.SSpeedData.discard.topType == "CARDAHND"
					chatprint("* Inner Hands: It's a test of your reaction time! Press Jump ONCE to put your hand on the totem! Resolve like a duel between the first (winner) and the last (loser) to do so.")
				elseif player.SSpeedData.discard.topType == "CARDAPAS"
					if players[0].menu.contents[1][6].value == 0
						chatprint("* Pass It Forward: The direction of play is reversed!")
					elseif players[0].menu.contents[1][6].value == 1
						chatprint("* Pass It Forward: Duel Action. You now treat the discard of the player to your left (next in turn) as yours when comparing for a Duel!")
					end
				end
			end
			if not SSpeed_Players[#player+(SSpeed_DirOfPlay*2)]
				if SSpeed_DirOfPlay == 0
					SSpeed_CurTurn = SSpeed_Players[#SSpeed_Players].name
				else
					SSpeed_CurTurn = SSpeed_Players[1].name
				end
			else
				SSpeed_CurTurn = SSpeed_Players[#player+(SSpeed_DirOfPlay*2)].name
			end
			S_StartSound(nil, sfx_appear)
		end
		player.CardPlace = true
	else
		player.CardPlace = false
	end
	
	if player.SSpeedData.deck == 0
	and player.SSpeedData.discard.amount == 0
		SSpeed_InitTransition()
		S_StartSound(nil, sfx_lvpass)
		S_StartSound(nil, sfx_s3kb8)
		chatprint("\x87* Match ended. "..player.name.." wins!")
		players[0].SSpeedData.beginReady = false
		for i, play in ipairs(SSpeed_Players)
			P_RestoreMusic(play)
			if players[0].name != play.name
				play.SSpeedData.ready = true
			end
			play.SSpeedData.deck = nil
			play.SSpeedData.discard = nil
			play.SSpeedData.mashNumber = nil
			play.SSpeedData.dueling = nil
		end
	end
end)

hud.add(function(v, player)
	if gametype != GT_SLINGERSPEED then return end
	if player.SSpeedData.deck == nil return end
	
	v.drawFill(0, 0, 320, 200, 156)
	v.drawFill(0, 100, 320, 200, 157)
	v.drawFill(0, 150, 320, 200, 158)
	v.drawFill(0, 170, 320, 200, 159)
	v.drawFill(0, 185, 320, 200, 253)
	v.drawFill(0, 195, 320, 200, 254)
	for i, play in ipairs(SSpeed_Players)
		if play.SSpeedData.deck == nil continue end
		
		local namex = 54 + ((i-1)%4)*70
		local iy = 0
		if #play > 4
			iy = 1
		end
		local namey = 5 + ((i-1)%2)*8 + (iy)*174
		v.drawString(namex, namey, play.name, skincolors[play.skincolor].chatcolor|V_ALLOWLOWERCASE, "center")
		if SSpeed_CurTurn == play.name
			namey = 5 + (i%2)*8 + (i/4%2)*174
			v.drawString(namex, namey, "YOUR TURN!", V_YELLOWMAP, "center")
		end
		namex = 54 + (i % 4 - 1)*70
		namey = 52 + (iy)*94
		local patch = v.cachePatch("CARDBACK")
		if play.SSpeedData.discard.topType
			patch = v.cachePatch(play.SSpeedData.discard.topType)
		end
		local color = v.getColormap("sonic", SKINCOLOR_GREEN)
		if play.SSpeedData.discard.topColor
			color = v.getColormap("sonic", play.SSpeedData.discard.topColor)
		end
		if play.SSpeedData.deck or play.SSpeedData.discard.amount
			v.draw(namex, namey, patch, 0, color)
		end
		local pla
		if not SSpeed_Players[#play]
			pla = SSpeed_Players[#SSpeed_Players].name
		else 
			pla = SSpeed_Players[#play].name
		end
		if (SSpeed_PassItForward and pla == player.name)
		or (not SSpeed_PassItForward and play.name == player.name)
			local s = v.cachePatch("CARDSEL")
			v.draw(namex, namey, s, V_50TRANS)
		end
		namex = 28 + ((i-1) % 4)*70
		namey = 86 + (iy)*20
		v.drawString(namex, namey, play.SSpeedData.deck, V_ORANGEMAP)
		namex = 81 + ((i-1) % 4)*70
		namey = 86 + (iy)*20
		v.drawString(namex, namey, play.SSpeedData.discard.amount, V_ORANGEMAP, "right")
	end
	v.draw(160, 100, v.cachePatch("GAMTOTEM"))
	if SSpeed_Pot
		v.drawString(160, 96, SSpeed_Pot, V_ORANGEMAP, "center")
	end
	
	-- All Flip countdown
	if SSpeed_AllFlip > 1
		if SSpeed_AllFlip == 2
			v.draw(160-8, 100-14, v.cachePatch("TTL01"), V_50TRANS)
		elseif SSpeed_AllFlip == 3
			v.draw(160-11, 100-14, v.cachePatch("TTL02"), V_50TRANS)
		elseif SSpeed_AllFlip == 4
			v.draw(160-11, 100-14, v.cachePatch("TTL03"))
		end
	end
	
	-- Mashing Number and ULTRA DISRESPECT
	v.drawString(10, 96, "M.Number: "..players[0].menu.contents[1][1].value+1, V_YELLOWMAP|V_ALLOWLOWERCASE)
	if players[0].menu.contents[1][4].value == 2
		v.drawString(310, 96, "ULTRA DISRESPECT", V_REDMAP|V_OscillateTranslucency(), "right")
	end
end, "game")