-- gotta go faster --

local TOPSPEED = 100*FRACUNIT -- Cap speed for dashmode.
local RUNTIME = 20*FRACUNIT -- How long do you have to run for to activate dashmode.
local DEFNORMALSPEED = 40*FRACUNIT -- Put your default normal speed here.
local MAXJUMPHIGHT = 1*FRACUNIT -- Maximum jump power when in dashmode.
local SKIN = "neostreak" -- Your character's skin name goes here.

local function ResetVars(player) -- Resets vars
player.runtime = 0
player.normalspeed = DEFNORMALSPEED
player.fakenormalspeed = DEFNORMALSPEED
player.jumpfactor = 1*FRACUNIT
player.maxspeedentersound = false
end

addHook("PlayerThink", function(player)
	if player.mo.skin == SKIN then
		
		if player.fakenormalspeed == nil then player.fakenormalspeed = DEFNORMALSPEED return end -- Xmom Support
		
		if player.fakenormalspeed < TOPSPEED and player.speeddash == true and player.isxmomentum
			player.fakenormalspeed = $1 + 1*FRACUNIT/5 -- This is what gets you get faster when in dashmode.
		end
		if player.normalspeed < TOPSPEED and player.speeddash == true and not player.isxmomentum
			player.normalspeed = $1 + 1*FRACUNIT/5 -- This is what gets you get faster when in dashmode.
		end
		if player.jumpfactor < MAXJUMPHIGHT and player.speeddash == true
			player.jumpfactor = $1 + 1*FRACUNIT/100
		end
		if player.speed > 27*FRACUNIT and not (leveltime % 5) -- Checks if you are running.
		if player.runtime == nil then player.runtime = 0 return true end
			player.runtime = $ + 1*FRACUNIT
		end
		if player.speed < 25*FRACUNIT and P_IsObjectOnGround(player.mo) or P_PlayerInPain(player) -- Disables dashmode
			if player.speeddash == true then
			S_StartSound(player.mo, sfx_kc65) -- Exiting dashmode soundeffect.
			player.speeddash = false
			end
			ResetVars(player)
		end
		if player.speeddash == true
			local ghost = P_SpawnGhostMobj(player.mo) -- Spawns ghosts, see, yeah, that's what it does, yeah, that's the ticket
			ghost.fuse = 2
			ghost.colorized = false
			ghost.blendmode = AST_ADD
		end
		if P_IsObjectOnGround(player.mo) and (player.runtime >= (RUNTIME/2) 
		and not (player.boosting))
			P_SpawnSkidDust(player, 13*FRACUNIT, sfx_none) -- Spawns rundust
		end
		if P_IsObjectOnGround(player.mo) and ((player.speeddash == true) 
		and not (player.boosting))
			P_SpawnSkidDust(player, 13*FRACUNIT, sfx_none) -- Spawns rundust
		end
		if P_IsObjectOnGround(player.mo) and player.boosting
		and not (player.powers[pw_super] or player.mo.eflags & MFE_TOUCHWATER or player.mo.eflags & MFE_UNDERWATER or player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_TYSSONROLL)
			local pabloo = P_SpawnMobjFromMobj(player.realmo, P_RandomRange(-10, 10) * FRACUNIT, P_RandomRange(-10, 10) * FRACUNIT, 0, MT_TNTDUST)
			pabloo.momx = P_RandomRange(-4, 4)*FRACUNIT
			pabloo.momy = P_RandomRange(-4, 4)*FRACUNIT
			pabloo.momz = P_RandomRange(0, 4)*FRACUNIT
			pabloo.destscale = 1*FRACUNIT
		end
		if P_IsObjectOnGround(player.mo) and player.boosting
		and not (player.powers[pw_super] or player.mo.eflags & MFE_TOUCHWATER or player.mo.eflags & MFE_UNDERWATER or player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_TYSSONROLL)
			local pabloo = P_SpawnMobjFromMobj(player.realmo, P_RandomRange(-10, 10) * FRACUNIT, P_RandomRange(-10, 10) * FRACUNIT, 0, MT_TNTDUST)
			pabloo.momx = P_RandomRange(-4, 4)*FRACUNIT
			pabloo.momy = P_RandomRange(-4, 4)*FRACUNIT
			pabloo.momz = P_RandomRange(0, 4)*FRACUNIT
			pabloo.destscale = FRACUNIT/2
		end
				if P_IsObjectOnGround(player.mo) and player.boosting
		and not (player.powers[pw_super] or player.mo.eflags & MFE_TOUCHWATER or player.mo.eflags & MFE_UNDERWATER or player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_TYSSONROLL)
			local pabloo = P_SpawnMobjFromMobj(player.realmo, P_RandomRange(-10, 10) * FRACUNIT, P_RandomRange(-10, 10) * FRACUNIT, 0, MT_PYREFLY_FIRE)
			pabloo.momx = P_RandomRange(-4, 4)*FRACUNIT
			pabloo.momy = P_RandomRange(-4, 4)*FRACUNIT
			pabloo.momz = P_RandomRange(0, 4)*FRACUNIT
			pabloo.scale = FRACUNIT/2
			pabloo.destscale = 1*FRACUNIT
			pabloo.colorized = true
			pabloo.color = SKINCOLOR_FLAME
			pabloo.blendmode = AST_ADD
			pabloo.flags = MF_NOCLIP
		end
		if (P_IsObjectOnGround(player.mo)) and player.boosting
		and not (player.powers[pw_super] or player.mo.eflags & MFE_TOUCHWATER or player.mo.eflags & MFE_UNDERWATER or player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_TYSSONROLL)
			local spark = P_SpawnMobjFromMobj(player.realmo, P_RandomRange(-10, 10) * FRACUNIT, P_RandomRange(-10, 10) * FRACUNIT, 0, MT_FLAMEPARTICLE)
			spark.momx = P_RandomRange(-4, 4)*FRACUNIT
			spark.momy = P_RandomRange(-4, 4)*FRACUNIT
			spark.momz = P_RandomRange(0, 4)*FRACUNIT
			spark.destscale = 1*FRACUNIT
			spark.blendmode = AST_ADD
		end
		if (P_IsObjectOnGround(player.mo)) and player.boosting
		and not (player.powers[pw_super] or player.mo.eflags & MFE_TOUCHWATER or player.mo.eflags & MFE_UNDERWATER or player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_TYSSONROLL)
			local fire = P_SpawnMobjFromMobj(player.realmo, P_RandomRange(-10, 10) * FRACUNIT, P_RandomRange(-10, 10) * FRACUNIT, 0, MT_FLAMEPARTICLE)
			fire.momx = P_RandomRange(-4, 4)*FRACUNIT
			fire.momy = P_RandomRange(-4, 4)*FRACUNIT
			fire.momz = P_RandomRange(0, 4)*FRACUNIT
			fire.destscale = 2*FRACUNIT
			fire.blendmode = AST_ADD
		end
		if (P_IsObjectOnGround(player.mo)) and player.boosting
		and not (player.powers[pw_super] or player.mo.eflags & MFE_TOUCHWATER or player.mo.eflags & MFE_UNDERWATER or player.mo.state == S_PLAY_ROLL or player.mo.state == S_PLAY_TYSSONROLL)
			local flame = P_SpawnMobjFromMobj(player.realmo, P_RandomRange(-10, 10) * FRACUNIT, P_RandomRange(-10, 10) * FRACUNIT, 0, MT_FLAMEPARTICLE)
			flame.momx = P_RandomRange(-4, 4)*FRACUNIT
			flame.momy = P_RandomRange(-4, 4)*FRACUNIT
			flame.momz = P_RandomRange(0, 4)*FRACUNIT
			flame.destscale = 4*FRACUNIT
			flame.blendmode = AST_ADD
		end
	end
end)

addHook("PlayerThink", function(player) -- Default Dashmode Activation
	if player.mo.skin == SKIN then
		if player.runtime == nil then player.runtime = 0 return true end
		if not player.speeddash == true
		and player.runtime >= RUNTIME
		and P_IsObjectOnGround(player.mo)
			S_StartSound(player.mo, sfx_s3ka2) -- Entering dashmode soundeffect
			player.speeddash = true
			if not player.xmomentum
			player.normalspeed = player.speed
			else
			player.fakenormalspeed = player.speed
			end
		end
	end
end)

--cheezboi is smart
addHook("ThinkFrame", function()
	for player in players.iterate do
		if player.mo and player.mo.skin == "neostreak" then
			if not player.mo.firerun then
				player.mo.firerun = 0
			end
			if player.boosting
				and P_IsObjectOnGround(player.mo)
				and not (player.mo.eflags & MFE_UNDERWATER)
				and not (player.mo.state == S_PLAY_TYSSONROLL)
				and not (player.mo.state == S_PLAY_ROLL) then
				P_ElementalFire(player,0,0,0)
				player.mo.firerun = 1
			end
		end
	end
end)

//Normal stuff
addHook("MobjCollide", function(mobj, playermobj)
	if playermobj.skin == "neostreak" and playermobj.player.dashmode >= 3*TICRATE and mobj.flags & MF_ENEMY then
		P_KillMobj(mobj, playermobj, playermobj)
	end
end)

addHook("MobjCollide", function(mobj, playermobj)
	if playermobj.skin == "neostreak" and playermobj.player.dashmode >= 3*TICRATE and mobj.flags & MF_MONITOR then
		P_KillMobj(mobj, playermobj, playermobj)
	end
end)

//Spikes
addHook("MobjCollide", function(mobj, playermobj)
	if playermobj.skin == "neostreak" and playermobj.player.dashmode >= 3*TICRATE  then
		P_KillMobj(mobj, playermobj, playermobj)
	end
end, MT_SPIKE)

addHook("MobjCollide", function(mobj, playermobj)
	if playermobj.skin == "neostreak" and playermobj.player.dashmode >= 3*TICRATE  then
		P_KillMobj(mobj, playermobj, playermobj)
	end
end, MT_WALLSPIKE)