//Field Pack by Sls64LGamingBro
//Credits: PHITHGOD24 for the Hyper lua code and Inferno [But it's SuperPhanto controlling that addon] for the MCSonic Dropdash code and Bluetorch for the Custom Dashmode as the original creator!

-----------

//Links: https://mb.srb2.org/addons/hyper-forms.3749/
//Let's go on to the Stuff!


freeslot("sfx_drpdsh")


-- Up Thok
addHook("AbilitySpecial", function(player)
	if player.mo.skin == "fisonic"
		if not (player.pflags & PF_THOKKED)
		and player.mo.state == S_PLAY_JUMP
		   P_Thrust(player.mo, player.mo.angle, 20*FRACUNIT)
		   S_StartSound(player.mo, sfx_thok)
		   P_SetObjectMomZ(player.mo, 14*FRACUNIT)
		   player.pflags = $1|PF_THOKKED|PF_SPINNING
		end
	end
end)


//Dropdash (Spindash Style) [Credit to Inferno but it's SuperPhanto so... Credit to both!]

local ThokSpawnCooldown = 0

local function DropDash(player)
	if not player.mo and player.mo.valid return end
	
	if player.droptimer == nil
		player.droptimer = 0
	end
	
	if player.dropdashed == nil
		player.dropdashed = false
	end
	
	if player.dropspeed == nil
		player.dropspeed = 36*FRACUNIT
	end
	
	if player.mo.skin != "fisonic" return end
	
	if ThokSpawnCooldown > 0
		ThokSpawnCooldown = $1 - 1
	end
	
	if player.powers[pw_super] == 1
		return
	end
	
	if player.hyperdash
		return
	end
	
	if P_PlayerInPain(player) or not(player.playerstate == PST_LIVE) or player.exiting or player.powers[pw_nocontrol]
		player.triedtodash = false
		player.droptimer = 0
//		player.mo.state = S_PLAY_ROLL
	end
		
	if (player.pflags & PF_JUMPED)
		if (player.triedtodash) then
			player.droptimer = 0
			player.mo.state = S_PLAY_JUMP
		else
			if (player.pflags & PF_USEDOWN) then
				player.droptimer = $1 + 1
				if player.dropspeed < 60*FRACUNIT and not player.Xhyper
				or player.Xhyper and player.dropspeed < 120*FRACUNIT
					if player.powers[pw_super]
						player.dropspeed = $ + FRACUNIT * 6 / 4
					else
						player.dropspeed = $ + FRACUNIT * 3 / 4
					end
				end
//				print(player.dropspeed/FRACUNIT)
			elseif player.droptimer > 0 then
				player.droptimer = 0
				player.triedtodrop = true
				player.dropspeed = 36*FRACUNIT
			end
		end
	end
	
	if (player.droptimer == 15) then
//	and not player.mo.state == S_PLAY_SPINDASH
		S_StartSound(player.mo, sfx_drpdsh)
		player.mo.state = S_PLAY_SPINDASH
	end
	
	if player.mo.state == S_PLAY_SPINDASH
	and not (player.pflags & PF_USEDOWN)
		player.mo.state = S_PLAY_ROLL
	end
	
	if player.powers[pw_justsprung]
	or P_PlayerInPain(player)
		player.triedtodash = false
		player.droptimer = 0
		player.dropspeed = 36*FRACUNIT
		player.airdashed = false
	end
		
	
	if player.droptimer >= 15
	and player.powers[pw_super] 
	and P_IsObjectOnGround(player.mo)
		P_StartQuake(15*FRACUNIT,6)
	end
			
	if (player.mo.eflags & MFE_JUSTHITFLOOR or P_IsObjectOnGround(player.mo)) then
		if (player.droptimer >= 15) then
			player.mo.state = S_PLAY_ROLL
			player.pflags = $1|PF_SPINNING
			local radius = player.mo.radius >> FRACBITS
			P_SpawnMobjFromMobj(player.mo, P_RandomRange(-radius, radius) << FRACBITS, P_RandomRange(-radius, radius) << FRACBITS, 0, MT_SPINDUST)
			P_SpawnMobjFromMobj(player.mo, P_RandomRange(-radius, radius) << FRACBITS, P_RandomRange(-radius, radius) << FRACBITS, 0, MT_SPINDUST)
			P_SpawnMobjFromMobj(player.mo, P_RandomRange(-radius, radius) << FRACBITS, P_RandomRange(-radius, radius) << FRACBITS, 0, MT_SPINDUST)
			P_SpawnMobjFromMobj(player.mo, P_RandomRange(-radius, radius) << FRACBITS, P_RandomRange(-radius, radius) << FRACBITS, 0, MT_SPINDUST)
			P_InstaThrust(player.mo, player.mo.angle, FixedMul(player.dropspeed+(player.speed/8), player.mo.scale))
			S_StartSound(player.mo, sfx_zoom, player)
			if player.Xhyper
				P_StartQuake(25*FRACUNIT, 16)
				P_NukeEnemies(player.mo, player.mo, 1500*FRACUNIT)
				if player.Xflashes
					P_FlashPal(player, PAL_WHITE, 8)
				end
				S_StartSound(player.mo, sfx_s3k4e)
			end
			player.dropdashed = true
//			DoSpindust(player, player.dropspeed)
		end
		player.triedtodash = false
		player.droptimer = 0
		player.dropspeed = 36*FRACUNIT
	end
	
	if player.dropdashed
	and player.mo.state != S_PLAY_ROLL
		player.dropdashed = false
	end		
end
				
addHook("PlayerThink", DropDash)


-- Bonuce (Custom 1)
addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fisonic"
		if(player.mo.state == S_PLAY_JUMP)
		and(player.cmd.buttons & BT_CUSTOM1)
		and(player.playerstate == PST_LIVE)
		and not (player.pflags & PF_STASIS)
		and not (player.pflags & PF_FULLSTASIS)
        and(P_IsObjectOnGround(player.mo) == false)
           P_SpawnThokMobj(player)
		   player.mo.state = S_PLAY_ROLL
		   player.bonuce = true
		   P_SetObjectMomZ(player.mo, -32*FRACUNIT)
		   S_StartSound(player.mo, sfx_zoom, player)
		   P_SpawnSkidDust(player, 10*FRACUNIT, sfx_none)
		end
		
		if(player.bonuce)
		and(P_IsObjectOnGround(player.mo) == true)
		and not(player.powers[pw_carry])
		and not(P_PlayerInPain(player))
		   player.mo.state = S_PLAY_ROLL
		   player.bonuce = false
		   P_SetObjectMomZ(player.mo, 15*FRACUNIT)
		   player.mo.state = S_PLAY_SPRING
		   S_StartSound(player.mo, sfx_bnce2, player)
		   P_SpawnSkidDust(player, 10*FRACUNIT, sfx_none)
		end
	end
end)


-- Recurl (It's a version of Flight Drop and Glide Drop stolen from my addon Staromenutm since I created it)
addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fisonic" and (player.cmd.buttons & BT_SPIN)
	    if player.mo.state == S_PLAY_FALL or player.mo.state == S_PLAY_SPRING
		   S_StartSound(player.mo, sfx_spin, player)
           player.pflags = $1|PF_THOKKED|PF_JUMPED
		   player.mo.state = S_PLAY_ROLL
		end
	end
end)


-- Hyper Invulnerability
addHook("ThinkFrame", do
	for player in players.iterate
	if player.mo and player.mo.skin == "fisonic"
		and(player.Xhyper)
		player.powers[pw_invulnerability] = TICRATE/5
		end
	end
end)


//Field Knuckles Main Lua Script 


-- Abilities



// Dash Punch Mid-Air (Spin)
addHook("SpinSpecial", function(player)
	if player.mo and player.mo.skin == "fiknux"
	    if(player.cmd.buttons & BT_SPIN)
		and(player.mo.state == S_PLAY_JUMP)
		and(player.playerstate == PST_LIVE)
		and not (player.pflags & PF_STASIS)
		and not (player.pflags & PF_FULLSTASIS)
		and not (player.powers[pw_shield])
		   player.midairdpunch = true
		   P_SetObjectMomZ(player.mo, 0*FRACUNIT)
		   player.mo.state = S_PLAY_WALK
		   player.mo.frame = B
		   P_InstaThrust(player.mo, player.mo.angle, 50*FRACUNIT)
		   S_StartSound(player.mo, sfx_zoom, player)
		   P_SpawnSkidDust(player, 7*FRACUNIT, sfx_none)
		end
	end
end)


// Stomp (Custom 1) [Stolen from Staromentum v1.1 but I created anyway]
addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fiknux"
		if(player.mo.state == S_PLAY_JUMP)
		and(player.cmd.buttons & BT_CUSTOM1)
		and(player.playerstate == PST_LIVE)
		and not (player.pflags & PF_STASIS)
		and not (player.pflags & PF_FULLSTASIS)
        and(P_IsObjectOnGround(player.mo) == false)
           P_SpawnThokMobj(player)
		   player.mo.state = S_PLAY_FALL
		   player.stomp = true
		   P_SetObjectMomZ(player.mo, -35*FRACUNIT)
		   S_StartSound(player.mo, sfx_zoom, player)
		   P_SpawnSkidDust(player, 10*FRACUNIT, sfx_none)
		end
		
		if(player.stomp)
	    and not(player.powers[pw_super])
        and(P_IsObjectOnGround(player.mo) == true)
		and not(player.powers[pw_carry])
		and not(P_PlayerInPain(player))
		   player.mo.state = S_PLAY_FALL
		   player.stomp = false
		   player.mo.momx = 0
		   player.mo.momy = 0
		   P_SetObjectMomZ(player.mo, 0*FRACUNIT)
		   player.mo.state = S_PLAY_GLIDE_LANDING
		   S_StartSound(player.mo, sfx_s3k4c, player)
		end
		
		if(player.stomp)
		and(player.powers[pw_super])
        and(P_IsObjectOnGround(player.mo) == true)
		and not(player.powers[pw_carry])
		and not(P_PlayerInPain(player))
		   player.mo.state = S_PLAY_FALL
		   player.stomp = false
		   player.mo.momx = 0
		   player.mo.momy = 0
		   P_SetObjectMomZ(player.mo, 0*FRACUNIT)
		   player.mo.state = S_PLAY_GLIDE_LANDING
		   S_StartSound(player.mo, sfx_s3k49, player)
		   P_StartQuake(15*FRACUNIT, 11)
		   P_NukeEnemies(player.mo, player.mo, 1100*FRACUNIT)
		end
	end
end)


// Recurl (It's a version of Flight Drop and Glide Drop stolen from my addon Staromenutm since I created it)
addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fiknux" and (player.cmd.buttons & BT_SPIN)
	    if player.mo.state == S_PLAY_FALL or player.mo.state == S_PLAY_SPRING
		   S_StartSound(player.mo, sfx_spin, player)
           player.pflags = $1|PF_THOKKED|PF_JUMPED
		   player.mo.state = S_PLAY_ROLL
		end
	end
end)


// Hyper Invulnerability
addHook("ThinkFrame", do
	for player in players.iterate
	if player.mo and player.mo.skin == "fiknux"
		and(player.Xhyper)
		player.powers[pw_invulnerability] = TICRATE/5
		end
	end
end)


//Field Amy Rose Main Lua Script 


-- Twinspin Up (Spin)
addHook("SpinSpecial", function(player)
	if player.mo and player.mo.skin == "fiamy"
	    if(player.cmd.buttons & BT_SPIN)
		and(player.mo.state == S_PLAY_TWINSPIN)
		and(player.playerstate == PST_LIVE)
		and not (player.pflags & PF_STASIS)
		and not (player.pflags & PF_FULLSTASIS)
		and not (player.powers[pw_shield])
		   player.twinspinup = true
		   P_SetObjectMomZ(player.mo, 16*FRACUNIT)
		end
	end
end)


// Hammer Flip (Spin) [Stolen from Staromentum v1.1.1, but I created anyway]
addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fiamy"
		if(player.mo.state == S_PLAY_MELEE_LANDING)
		and(player.playerstate == PST_LIVE)
		and not (player.pflags & PF_STASIS)
		and not (player.pflags & PF_FULLSTASIS)
        and(P_IsObjectOnGround(player.mo) == true)
		   player.mo.state = S_PLAY_SPRING
		   P_SetObjectMomZ(player.mo, 15*FRACUNIT)
		end
	end
end)


// Hyper Invulnerability
addHook("ThinkFrame", do
	for player in players.iterate
	if player.mo and player.mo.skin == "fiamy"
		and(player.Xhyper)
		player.powers[pw_invulnerability] = TICRATE/5
		end
	end
end)


// Others


// Hyper colors. 


// Red Starts

freeslot("SKINCOLOR_HYPER1")
skincolors[SKINCOLOR_HYPER1] = {
	name = "Hyper 1",
	ramp = {0,0,0,0,0,0,0,0,209,209,210,210,32,32,33,33},
	invcolor = SKINCOLOR_ORANGE,
	invshade = 9,
	chatcolor = V_BLUEMAP,
	accessible = false
}

// Blue

freeslot("SKINCOLOR_HYPER2")
skincolors[SKINCOLOR_HYPER2] = {
	name = "Hyper 2",
	ramp = {0,0,0,0,0,0,0,0,129,129,130,130,131,131,132,132},
	invcolor = SKINCOLOR_ORANGE,
	invshade = 9,
	chatcolor = V_BLUEMAP,
	accessible = false
}

// Green

freeslot("SKINCOLOR_HYPER3")
skincolors[SKINCOLOR_HYPER3] = {
	name = "Hyper 3",
	ramp = {0,0,0,0,0,0,0,0,98,98,99,99,100,100,101,101},
	invcolor = SKINCOLOR_ORANGE,
	invshade = 9,
	chatcolor = V_BLUEMAP,
	accessible = false
}

// Yellow

freeslot("SKINCOLOR_HYPER4")
skincolors[SKINCOLOR_HYPER4] = {
	name = "Hyper 4",
	ramp = {0,0,0,0,0,0,0,0,82,82,83,83,72,72,74,74},
	invcolor = SKINCOLOR_ORANGE,
	invshade = 9,
	chatcolor = V_BLUEMAP,
	accessible = false
}

// White

freeslot("SKINCOLOR_HYPER5")
skincolors[SKINCOLOR_HYPER5] = {
	name = "Hyper 5",
	ramp = {0,0,0,0,0,0,0,0,1,1,2,2,3,3,4,4},
	invcolor = SKINCOLOR_ORANGE,
	invshade = 9,
	chatcolor = V_BLUEMAP,
	accessible = false
}

// Violet

freeslot("SKINCOLOR_HYPER6")
skincolors[SKINCOLOR_HYPER6] = {
	name = "Hyper 6",
	ramp = {0,0,0,0,0,0,0,0,160,160,161,161,162,162,163,163},
	invcolor = SKINCOLOR_ORANGE,
	invshade = 9,
	chatcolor = V_BLUEMAP,
	accessible = false
}

// Red ending

freeslot("SKINCOLOR_HYPER7")
skincolors[SKINCOLOR_HYPER7] = {
	name = "Hyper 7",
	ramp = {0,0,0,0,0,0,0,0,200,200,201,201,202,202,203,203},
	invcolor = SKINCOLOR_ORANGE,
	invshade = 9,
	chatcolor = V_BLUEMAP,
	accessible = false
}

// Field Colors (little of them...)


// Dark Rosy


freeslot("SKINCOLOR_DARKROSY")
skincolors[SKINCOLOR_DARKROSY] = {
	name = "DarkRosy",
	ramp = {201,201,202,202,203,203,204,204,205,205,206,206,207,207,207,207},
	invcolor = SKINCOLOR_AQUA,
	invshade = 1,
	chatcolor = V_MAGENTAMAP,
	accessible = true
}


//Trails for Field Pack!

addHook("PlayerThink", function(player)
	if (player.mo.skin == "fisonic")
	and (player.pflags & PF_THOKKED)
		local thoktrail = P_SpawnGhostMobj(player.mo)
		thoktrail.fuse = 7
		thoktrail.state = S_THOK
		thoktrail.scalespeed = FRACUNIT/15
		thoktrail.destscale = 0
		thoktrail.frame = TR_TRANS80|A
		thoktrail.frame = $ & ~FF_TRANSMASK | TR_TRANS30	
	end
end)


//Custom Dashmode (Credit to Bluetorch as the Original Creator for creating this)
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 = 39*FRACUNIT -- Put your default normal speed here.
local OVERRIDESPEED = 85*FRACUNIT -- Automaticly activates dashmode at a certain speed.
local MAXJUMPHIGHT = 1*FRACUNIT -- Maximum jump power when in dashmode.
local SKIN = "fisonic" -- 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)
		
	
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 = 39*FRACUNIT -- Put your default normal speed here.
local OVERRIDESPEED = 85*FRACUNIT -- Automaticly activates dashmode at a certain speed.
local MAXJUMPHIGHT = 1*FRACUNIT -- Maximum jump power when in dashmode.
local SKIN = "fiknux" -- 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)
		

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 = 39*FRACUNIT -- Put your default normal speed here.
local OVERRIDESPEED = 85*FRACUNIT -- Automaticly activates dashmode at a certain speed.
local MAXJUMPHIGHT = 1*FRACUNIT -- Maximum jump power when in dashmode.
local SKIN = "fiamy" -- 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)
		
	