freeslot("MT_HOVERCHECK")

local function lockControl(player)
	if(player.powers[pw_nocontrol] <= 2)
		player.powers[pw_nocontrol] = 2
	end
	player.pflags = $1|PF_FULLSTASIS
end

local chargecolor = SKINCOLOR_BLUEBELL

addHook("PlayerSpawn", function(player)
	for player in players.iterate do
	if player.mo.skin ~= "metalsonic" then
			continue
		end
		if(player.mtsvar == nil)
		player.mtsvar = {}
		end
		// remember what dashmode was so we can reach dash mode later
		player.dashdrive = player.dashmode
		player.redirectbutton = 5
		player.redirectlimit = false
		player.redirecttimer = 0
		player.hoverhalt = false
		player.redirecting = false // useing an extra varabule anyways to prevent land cancle
		player.offencedrive = 0
		player.offencetimer = 0
		player.drivesound = false
		player.normaljumpfactor = player.jumpfactor
		player.mtsvar.restorecolor = false
		player.mo.colorized = false
		player.lastcolorflash = false // i want metal to flash twice
		end
end)

addHook("ThinkFrame", function()
	for player in players.iterate do
		if player.mo.skin ~= "metalsonic" then
			continue
		end
		
		if(player.mtsvar == nil)
		player.mtsvar = {}
		end
		
		if player.dashdrive == nill then
		// remember what dashmode was so we can reach dash mode later
		player.dashdrive = player.dashmode
		player.redirectbutton = 5
		player.redirectlimit = false
		player.redirecttimer = 0
		player.hoverhalt = false
		player.redirecting = false // useing an extra varabule anyways to prevent land cancle
		player.offencedrive = 0
		player.offencetimer = 0
		player.drivesound = false
		player.dashfall = 0
		end
		
		//I have no idea how to check if someting does not have a flag
		if player.mo.eflags&MFE_VERTICALFLIP then
		player.gravityfliped = true
		else
		player.gravityfliped = false
		end
		
		if(player.mtsvar.restorecolor)
		player.mtsvar.restorecolor = false
		player.mo.color = player.skincolor
			if((player.powers[pw_shield] & SH_STACK) == SH_FIREFLOWER)
				player.mo.color = SKINCOLOR_WHITE
			end
		player.mo.colorized = false
		end
		
		if player.dashmode <= 0 or player.mo.state == S_PLAY_SPINDASH then
			if player.mo.state != S_PLAY_SPINDASH and player.lastcolorflash == true then
				player.mtsvar.restorecolor = true
				player.mo.color = chargecolor
				player.mo.colorized = true
				S_StartSound(player.mo, sfx_s3k5c)
				player.lastcolorflash = false
			else
			player.lastcolorflash = false
			end
		player.dashdrive = 0
		elseif player.dashmode >= 108 and player.speed > player.dashdrive then
		player.dashdrive = player.speed
		//player.drivesound = true
		//player.lastcolorflash = true
		elseif player.dashmode >= 108 and player.mo.state != S_PLAY_REDIRECT and player.speed < 44*FRACUNIT then
		player.dashdrive = 44*FRACUNIT
		//player.drivesound = true
		//player.lastcolorflash = true
		end
		
		if player.dashmode <= 54 and player.drivesound == true and player.lastcolorflash == true then 
		S_StartSound(player.mo, sfx_s3k5c) //683
		player.drivesound = false
		// Colorize copied and edited from metal knux
		player.mtsvar.restorecolor = true
		player.mo.color = chargecolor
		player.mo.colorized = true
		elseif player.dashmode > 54 and player.dashdrive > 0 then
		player.drivesound = true
		player.lastcolorflash = true
		end
		
		//----------set up varabules so we can atavate redirect from pressing spin wile spinning--//
		if not (player.cmd.buttons & BT_USE) then 
		player.redirectbutton = $-1
		else
		player.redirectbutton = 5
		end
				
		if P_IsObjectOnGround(player.mo) then
			player.redirectlimit = false
			player.hoverhalt = true
			if player.redirecting == true then
				player.mo.state = S_PLAY_REDIRECT
			end
			if player.offencetimer < 0 then
			player.offencedrive = 0
			player.offencetimer = 0
			end
		end
		player.offencetimer = $-1
		
		if player.offencedrive >= 3 and player.dashmode < 108 then //get overdrive from attacking
			player.offencedrive = 2
			player.offencetimer = 3*TICRATE
			player.dashmode = 108
			player.dashdrive = 44*FRACUNIT
			S_StartSound(player.mo, 703) //power up sound
			player.drivesound = true
			player.lastcolorflash = true
		end
		
		if player.mo.state == S_PLAY_REDIRECT then
		if player.exiting != 0 or player.pflags == 1073750028 then // exit the state if exiting the level
			player.mo.state = S_PLAY_FLOAT
			player.redirecting = false
		end
		player.dashmode = 108
		player.powers[pw_nocontrol] = 2
		player.pflags = $1|PF_FULLSTASIS
		if player.mo.momz >= 0 and player.gravityfliped == true then
			player.mo.momz = 0
		elseif player.mo.momz <= 0 and player.gravityfliped == false then
			player.mo.momz = 0
		end
		player.mo.momx = FixedMul($, FRACUNIT*95/100)
		player.mo.momy = FixedMul($, FRACUNIT*95/100)
		player.redirecting = true
		player.drawangle = player.mo.angle
		player.redirecttimer = $+1
		if player.redirecttimer > 2*TICRATE then
			player.redirecting = false
			player.dashdrive = 0
			player.redirecttimer = 0
			player.mo.state = S_PLAY_FLOAT
			player.pflags = $|PF_JUMPED
			player.hoverhalt = false
				if P_IsObjectOnGround(player.mo) then
					player.pflags = $&~PF_JUMPED
				end
				if not P_IsObjectOnGround(player.mo) then
				player.pflags = $|PF_THOKKED
				end
		end
			if not (player.cmd.buttons & BT_USE) then // do the dash
			player.dashdrive = $-7*FRACUNIT
			//print("dashexit!!!!")
			player.mo.state = S_PLAY_DASH
			player.pflags = $|PF_JUMPED
			local dashdrive = FixedMul(player.mo.scale, player.dashdrive)
			if player.mo.eflags&MFE_UNDERWATER
					dashdrive = $*2/3
			end
			P_InstaThrust(player.mo, player.mo.angle, dashdrive)
			player.redirecting = false
			player.dashdrive = 0
			player.redirecttimer = 0
				if P_IsObjectOnGround(player.mo) then
					player.pflags = $&~PF_JUMPED
				end
				if not P_IsObjectOnGround(player.mo) then
					player.pflags = $|PF_THOKKED
				end
			end
		else
		player.redirecting = false
		end
		
		if player.pflags&PF_THOKKED and (player.dashmode >= 108 or player.mo.eflags&MFE_UNDERWATER)and (player.cmd.buttons & BT_JUMP)
		and player.speed > 2*FRACUNIT and (player.mo.state == S_PLAY_DASH or player.mo.state == S_PLAY_FLOAT_RUN or player.mo.state == S_PLAY_FLOAT) then
			player.mo.momz = 0
		end
		
		if player.mo.state == 11 and not P_IsObjectOnGround(player.mo) and player.pflags&PF_THOKKED
		and (player.cmd.buttons & BT_JUMP) then // fix a bug
		player.mo.state = 36
		end
		
		player.dashfall = (player.jumpfactor/2000)
		
		if player.jumpfactor > player.normaljumpfactor and player.dashmode >= 108 and 
		not (player.cmd.buttons & BT_JUMP) and player.mo.state == S_PLAY_JUMP then
			if player.gravityfliped == false and player.mo.momz > 0 then // fall faster in boost mode
			player.mo.momz = $-1*FRACUNIT
			elseif player.gravityfliped == true and player.mo.momz < 0 then
			player.mo.momz = $+1*FRACUNIT
			end
		
		end
		
		// durring netural jump increase acceleration
		if player.speed <= 219333 and player.mo.momz ~= 0 and player.mo.state != S_PLAY_SPRING //173333
		and player.speed >= 1 then
		player.thrustfactor = 7 //10
		player.accelstart = 162 //192
		player.acceleration = 60 //80
		//print("accel")
		else
		player.thrustfactor = 5
		player.accelstart = 96
		player.acceleration = 40
		end
		
	end
end)


addHook("AbilitySpecial", function(player)

	if player.mo.skin != "metalsonic"
		return 
	end
	if player.hoverhalt == true and player.dashmode < 108 then
			if player.gravityfliped == false and player.mo.momz <= 1*FRACUNIT then
			player.mo.momz = 1*FRACUNIT
			elseif player.gravityfliped == true and player.mo.momz >= -1*FRACUNIT then
			player.mo.momz = -1*FRACUNIT
			end
		player.hoverhalt = false
		if player.cmd.forwardmove >= 0  then
		player.hovercheck = P_SpawnMobj(player.mo.x+FixedMul(-44*FRACUNIT, cos(player.mo.angle)),  
		player.mo.y+FixedMul(-44*FRACUNIT, sin(player.mo.angle)), player.mo.z, MT_HOVERCHECK)
		player.hovercheck.tracer = player.mo
		elseif player.cmd.forwardmove < -45 then
		player.hovercheck = P_SpawnMobj(player.mo.x+FixedMul(44*FRACUNIT, cos(player.mo.angle)),  
		player.mo.y+FixedMul(44*FRACUNIT, sin(player.mo.angle)), player.mo.z, MT_HOVERCHECK)
		player.hovercheck.tracer = player.mo
		end
	end

end)

addHook("TouchSpecial", function(touchhovercheck, mo) 
	if mo.skin !="metalsonic"
		return
	end
	// slow doen Metal if he is going in a direction that he dos'nt wants to go
	if touchhovercheck.tracer == mo then
		mo.momx = $/2
		mo.momy = $/2
		P_RemoveMobj(touchhovercheck)
	end
	
	return true

end, MT_HOVERCHECK)

addHook("SpinSpecial", function(player)

	if player.mo.skin != "metalsonic"
		return 
	end
	local waterlimit = (player.dashdrive*2/3)
	//-----------------exaccute the redirect state----------------------//
	if player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_JUMP or player.pflags&PF_THOKKED then
		if player.redirectbutton < 5 and player.dashdrive > 0 and player.redirectlimit == false
		and player.cmd.forwardmove > -50 then
			if player.mo.eflags&MFE_UNDERWATER and waterlimit < 44*FRACUNIT then
			//print("noredirect!!!!!!!")
			return
			end
		player.dashmode = 108
		player.redirecttimer = 0
		player.mo.state = S_PLAY_REDIRECT
		player.pflags = $&~PF_SPINNING
		player.pflags = $|PF_JUMPED
		player.powers[pw_nocontrol] = 2
		player.pflags = $1|PF_FULLSTASIS
		if not player.powers[pw_super] then
		player.redirectlimit = true // multi redirect if super
		end
		player.redirecting = true
		S_StartSound(player.mo, 397)
		return true
				//lockControl(player)
		end

	end
	
end)

addHook("TouchSpecial", function(special, toucher) //add alittle bit of boost after hitting something
	if toucher.skin != "metalsonic"
		return 
	end
	local player = toucher.player
	if ((special.flags & (MF_ENEMY|MF_BOSS|MF_MONITOR))
	and (special.flags & MF_SHOOTABLE) and not (special.flags & MF_MISSILE))
	and (P_PlayerCanDamage(player, special))
	and not (special.type == MT_PTERABYTE and special.target == toucher and special.extravalue1 == 1) then
		//print("hitathing")
		player.offencedrive = $+1
		player.offencetimer = 3*TICRATE
		if special.health >= 2 and player.dashmode >= 108 then
		special.health = $-1
		//print("HITABIGBOI!!!!")
		end
	end
end)

//-------give metal takes no electric damage durring redirect.... LIKE A BOSS!------//
addHook("ShouldDamage", function(mo, enemy, s)
if mo.skin != "metalsonic"
		return 
	end
if not enemy and not s and P_PlayerTouchingSectorSpecial(mo.player, 1, 4) and
 (mo.player.dashmode >= 108 or mo.state == S_PLAY_REDIRECT) then
		mo.player.speed = 24*FRACUNIT
		mo.player.normalspeed = 2359296
		mo.player.dashmode = 108
		mo.momx = $*-1
		mo.momy = $*-1
		mo.momz = $*-1
		mo.player.redirectlimit = false //regain redirect cuz why not
		S_StartSound(mo, 477) //bumpersound
		return false
	end

end, MT_PLAYER)