local TOPSPEED = 1000*FRACUNIT -- Cap speed for dashmode.
local RUNTIME = 15*FRACUNIT -- How long do you have to run for to activate dashmode.
local DEFNORMALSPEED = 40*FRACUNIT -- Put your default normal speed here.
local OVERRIDESPEED = 70*FRACUNIT -- Automaticly activates dashmode at a certain speed.
local MAXJUMPHIGHT = 2*FRACUNIT -- Maximum jump power when in dashmode.
local SKIN = "sonic" -- 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
			ghost.fuse = 2
			player.charflags = $1|SF_RUNONWATER -- Enables Running on water.
		else
			player.charflags = $1 & ~SF_RUNONWATER
		end
		if player.speeddash == true and P_IsObjectOnGround(player.mo) then
			P_SpawnSkidDust(player, 13*FRACUNIT, sfx_none) -- Spawns rundust
		end
		if P_IsObjectOnGround(player.mo) and player.runtime >= (RUNTIME/2) then
			P_SpawnSkidDust(player, 13*FRACUNIT, sfx_none) -- Spawns rundust
		end
		if player.speed >= 70*FRACUNIT and player.speeddash == true and P_IsObjectOnGround(player.mo) then
			P_SpawnSkidDust(player, 13*FRACUNIT, sfx_none) -- Spawns rundust
			P_SpawnSkidDust(player, 13*FRACUNIT, sfx_none) -- Spawns rundust
			P_SpawnSkidDust(player, 13*FRACUNIT, sfx_none) -- Spawns rundust
		end
		local skin = skins[player.mo.skin]
		if player.speed >= 60*FRACUNIT then
			player.camerascale = skin.camerascale*5/4 -- Moves the camera back allowing the player to see more.
		elseif player.speed >= 80*FRACUNIT then
			player.camerascale = skin.camerascale*9/8 -- Moves the camera back allowing the player to see more.
		else
			player.camerascale = skin.camerascale -- Resets camera.
		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)

addHook("PlayerThink", function(player) -- Override Activation.
	if player.mo.skin == SKIN then
		if player.runtime == nil then player.runtime = 0 return true end
		if player.speed >= OVERRIDESPEED
		and player.speeddash == false
			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)
		
	