local spawnx = 0
local spawny = 0
local spawnz = 0
local spawnangle = 0
local spawndrawangle = 0

freeslot("sfx_ringtk",
"MT_SUPERWARP",
"S_SUPERWARP",
"SPR_WARP")
sfxinfo[sfx_ringtk].caption = "Got Token"
states[S_SUPERWARP] = {SPR_WARP, A|FF_ANIMATE|FF_FULLBRIGHT, 7, nil, 7, 1, S_NULL}

mobjinfo[MT_SUPERWARP] = {
	spawnstate = S_SUPERWARP,
	spawnhealth = 1,
    deathstate = S_NULL,
    speed = FRACUNIT,
    radius = FRACUNIT,
    height = FRACUNIT,
	flags = MF_SCENERY|MF_NOGRAVITY|MF_NOCLIPTHING
}

addHook("NetVars", function(network)
	spawnx = network($)
	spawny = network($)
	spawnz = network($)
	spawnangle = network($)
	spawndrawangle = network($)
end)

addHook("MapLoad", function()
	for player in players.iterate
		spawnx = player.mo.x
		spawny = player.mo.y
		spawnz = player.mo.z
		spawnangle = player.mo.angle
		spawndrawangle = player.drawangle
	end
end)

addHook("ThinkFrame", do
	for player in players.iterate
		if player.mo and player.mo.valid
			if not player.mo.storedrings
				player.mo.storedrings = 0
			end
			if not player.mo.signpost
				player.mo.signpost = 0
			end
			if not player.mo.storedmusicpos
				player.mo.storedmusicpos = 0
			end
			if not player.mo.got1up
				player.mo.got1up = 0
			end
			if not player.mo.issuper
				player.mo.issuper = false
			end
			if not player.mo.switchtimer
				player.mo.switchtimer = 0
			end
			if player.mo and player.mo.valid
			and player.powers[pw_extralife]
				player.mo.got1up = true
			else
				if player.mo.got1up == true
					S_SetMusicPosition(player.mo.storedmusicpos)
					S_SetInternalMusicVolume(0, player)
					S_FadeMusic(100, MUSICRATE, player)
					player.mo.got1up = false
				end
				player.mo.storedmusicpos = S_GetMusicPosition()
			end
			if player.mo.skin == "supersonic"
				if player.mo.switchtimer < 2
					player.mo.switchtimer = $ + 1
				end
				if player.mo.issuper == false
					player.mo.issuper = true
				end
			end
			if player.mo and player.mo.valid
			and player.mo.skin ~= "supersonic"
			and player.mo.issuper == true
				player.powers[pw_super] = 0
				player.mo.color = player.skincolor
				player.mo.state = $
				player.mo.issuper = false
				player.mo.switchtimer = 0
			end
			if S_MusicName() == "_super"
			and player.mo.issuper == false
				P_RestoreMusic(player)
			end
			if player.mo and player.mo.valid and player.mo.skin == "supersonic"
				player.mo.frame = $|FF_FULLBRIGHT
				if player.rings < 1
				and not netgame
					P_DamageMobj(player.mo, nil, nil, 0, DMG_INSTAKILL)
				end
				if netgame
					if player.rings < 1
					and player.mo.switchtimer >= 2
					and player.playerstate == PST_LIVE
						player.powers[pw_carry] = CR_NONE
						player.pflags = player.pflags & ~(PF_JUMPED | PF_SPINNING | PF_STARTDASH | PF_THOKKED | PF_SHIELDABILITY | PF_GLIDING | PF_BOUNCING | PF_SLIDING)
						player.mo.momx = 0
						player.mo.momy = 0
						player.mo.momz = 0
						if not player.starpostnum
							player.mo.angle = spawnangle
							player.drawangle = spawndrawangle
						else
							player.mo.angle = player.starpostangle
							player.drawangle = player.starpostangle
						end
						player.mo.state = S_PLAY_STND
						player.mo.flags2 = player.mo.flags2 & ~MF2_TWOD
						player.mo.flags2 = player.mo.flags2 & ~MF2_OBJECTFLIP
						if not player.starpostnum
							P_TeleportMove(player.mo, spawnx, spawny, spawnz)
						else
							P_TeleportMove(player.mo, player.starpostx*FRACUNIT, player.starposty*FRACUNIT, player.starpostz*FRACUNIT)
						end
						S_StartSound(player.mo, sfx_s3kb3)
						P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_SUPERWARP)
						player.rings = 25
					end
					if not All7Emeralds(emeralds)
						R_SetPlayerSkin(player, "sonic")
						S_StartSound(player.mo, sfx_lose)
						if P_RandomChance(FRACUNIT/100*50)
							CONS_Printf(player, "\x85"+"You need all 7 Chaos Emeralds before using Super Sonic!")
						elseif P_RandomChance(FRACUNIT/100*30)
							CONS_Printf(player, "\x85"+"You must first collect all 7 gems of the chaotic variety.")
						elseif P_RandomChance(FRACUNIT/100*50)
							CONS_Printf(player, "\x85"+"Maybe collect all of those emeralds first!")
						elseif P_RandomChance(FRACUNIT/100*40)
							CONS_Printf(player, "\x85"+"He's named SUPER Sonic for a reason!")
						elseif P_RandomChance(FRACUNIT/100*30)
							CONS_Printf(player, "\x85"+"Did you get all of those Chaos Emeralds?")
						elseif P_RandomChance(FRACUNIT/100*30)
							CONS_Printf(player, "\x85"+"get all of them magic poprocks, my dude")
						elseif P_RandomChance(FRACUNIT/100*40)
							CONS_Printf(player, "\x85"+"I hope you didn't expect to go super without those Chaos Emeralds!")
						end
					end
					if player.pflags & PF_FINISHED
					or player.powers[pw_carry] == CR_MINECART
						if not player.mo.storedrings
						or player.rings > player.mo.storedrings
							player.mo.storedrings = player.rings
						end
						if player.rings < player.mo.storedrings
							player.rings = player.mo.storedrings
						end
					else
						player.mo.storedrings = 0
					end
				end
				if player.playerstate == PST_LIVE and player.lives > 0 and player.spectator == false and not netgame and All7Emeralds(emeralds) == false then
					emeralds = $ | EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7
				end
				if not player.powers[pw_super]
				and not player.exiting
					player.powers[pw_super] = 1
				end
			end
		end
	end
end)

//Give the player 25 Rings if they pick up an Emerald Token, and kill them if they hit 0 rings.
addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid and player.mo.skin == "supersonic"
		player.mo.color = player.skincolor
	end
	if player.mo and player.mo.valid
	and player.mo.ringtokengrabbed
		P_GivePlayerRings(player, 25)
		P_AddPlayerScore(player, 1000)
		S_StartSound(player.mo, sfx_ringtk)
		player.mo.ringtokengrabbed = false
	end
end)

addHook("TouchSpecial", function(emeraldtoken, mo)
	if All7Emeralds(emeralds)
	and mo.skin == "supersonic"
		if not emeraldtoken.grabbed then
			mo.ringtokengrabbed = true
			emeraldtoken.grabbed = true
			P_KillMobj(emeraldtoken)
			return true
		end
	elseif not All7Emeralds(emeralds)
		return false
	end
end, MT_TOKEN)

//Making it so you start with 25 rings and am super upon spawn.
addHook("PlayerSpawn", function(player)
	if player.mo and player.mo.valid and player.mo.skin == "supersonic"
		P_GivePlayerRings(player, 25)
		player.mo.state = $
	end
end)
		
addHook("MobjDamage", function(target, inflictor, source)
	if inflictor and inflictor.valid and inflictor.type == MT_PLAYER
		local issuper = false
		for player in players.iterate
			if player.mo and player.mo.valid
			and player.mo.skin == "supersonic"
				issuper = true
			end
		end
		if issuper
			if target.flags & MF_BOSS
				for player in players.iterate
					if target.type == MT_METALSONIC_BATTLE
						P_GivePlayerRings(player, 10)
					else
						P_GivePlayerRings(player, 5)
					end
				end
				S_StartSoundAtVolume(target.mo, sfx_kc5e, 105)
			end
			if target.flags & MF_ENEMY
			and issuper
			and inflictor.skin == "supersonic" --Double checking since the 'issuper' check isn't enough, apparently.
				P_GivePlayerRings(inflictor.player, 2)
				S_StartSoundAtVolume(inflictor, sfx_kc5d, 105)
			end
		end
	end
end)

addHook("ShouldDamage", function(target, inflictor, source, damage, damagetype)
    if target and target.valid and target.skin == "supersonic"
	and netgame
	and target.player.rings == 0
	and not (damagetype & DMG_DEATHMASK)
        return false
	end
end)

addHook("MobjThinker", function(sign)
	if sign.tracer.tracer  --tracers of tracers are dumb.
		if sign.tracer.tracer.skin == "supersonic"
			sign.tracer.tracer.tics = -1
			sign.tracer.tracer.frame = ((leveltime / 7) % 4) | (FF_FULLBRIGHT|FF_PAPERSPRITE)
		end
	end
end, MT_SIGN)