-- gotta go faster --

local TOPSPEED = 106*FRACUNIT -- Cap speed for dashmode.
local RUNTIME = 23*FRACUNIT -- How long do you have to run for to activate dashmode.
local DEFNORMALSPEED = 38*FRACUNIT -- Put your default normal speed here.
local OVERRIDESPEED = 85*FRACUNIT -- Automaticly activates dashmode at a certain speed.
local MAXJUMPHIGHT = 3*FRACUNIT -- Maximum jump power when in dashmode.
local SKIN = "kaysonic" -- 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 == nil then return end
	if player.mo == nil then return end
	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
		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 == nil then return end
	if player.mo == nil then return end
	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 == nil then return end
	if player.mo == nil then return end
	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)

-- invulnerability Dash Mode
addHook("ThinkFrame", function()
	for player in players.iterate do
		if player and player.mo and player.mo.skin ~= "kaysonic" then
			continue
		end
		
		if player and player.dashmode > 3*TICRATE then
			player.powers[pw_invulnerability] = 5
		end
	end
end)

-- Hyper kaysonic star's by Sls64LGamingBro

addHook("PlayerThink", function(player)
	if player == nil then return end
	if player.mo == nil then return end
    if player.powers[pw_super]
	and player.mo.skin == "kaysonic"
		player.powers[pw_underwater] = 100*TICRATE
		player.powers[pw_spacetime] = 100*TICRATE		 
	 end
end)

addHook("PlayerThink", function(player)
	if player == nil then return end
	if player.mo == nil then return end
	 if player.powers[pw_super] then
	     if leveltime % 1 == 0
	     and player.mo.skin == "kaysonic"
			local strikesparkle = P_SpawnMobjFromMobj(player.mo, P_RandomRange(-14, 13) *FixedMul(5, player.mo.scale),  P_RandomRange(-15, 14) * FRACUNIT, 9*FRACUNIT, MT_SUPERSPARK)
			strikesparkle.fuse = 7
			strikesparkle.scale = player.mo.scale * 26 / 18
			strikesparkle.momx = P_RandomRange(-14, 14) * FRACUNIT + FixedMul(-12, 12, player.mo.scale)
			strikesparkle.momy = P_RandomRange(-14, 14) * FRACUNIT + FixedMul(-12, 12, player.mo.scale)
			strikesparkle.momz = P_RandomRange(-8, 8) * FRACUNIT + FixedMul(-12, 12, player.mo.scale)
	     end
	 end	 
end)

addHook("PlayerThink", function(player)
	if player == nil then return end
	if player.mo == nil then return end
	if player.hypertrans
		if player.powers[pw_super] == 1
		and player.mo.skin == "kaysonic"
		and (player.mo.state != S_PLAY_SUPER_TRANS1)
	    and (player.mo.state != S_PLAY_SUPER_TRANS2)
	    and (player.mo.state != S_PLAY_SUPER_TRANS3)
		end
	end
end)

addHook('PlayerThink', do
	for player in players.iterate do
		if player and player.mo and player.mo.valid
			if player.powers[pw_super] == 0
			and player.mo.skin == "kaysonic"
				P_RestoreMusic(player)
				player.mo.color = player.skincolor
			end
		end
	end
end)

addHook("ThinkFrame", do
	for player in players.iterate
		if not (player and player.mo and player.mo.skin == "kaysonic") then continue end
		if player.mo.state ~= S_PLAY_ROLL       //You holding C1 bro?
			player.granigo = true   //Your true running speed, restored as long as you're holding C1.
		end
	end
end)

local function SpikeLogic(player,spike)
	if player ~= nil and player.player ~= nil and player.skin == "kaysonic" then
		if spike ~= nil and (spike.type == MT_SPIKE
		or spike.type == MT_WALLSPIKE) then
			if (player.z + player.height < spike.z) 
			or (player.z > spike.z + spike.height)
				return false
			else
				P_KillMobj(spike,player,player)
			end
		end
	end
end
addHook ("MobjMoveCollide", function (player,spike)
	SpikeLogic(player,spike)
end,MT_PLAYER)