//Field Sonic by Sls64LGamingBro
//Credits: PHITHGOD24 for the Hyper lua code

-----------

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

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


-- Stopdash (My version)
addHook("SpinSpecial", function(player)
	if player.mo and player.mo.skin == "fisonic"
	    if(player.cmd.buttons & BT_USE)
		and (P_IsObjectOnGround(player.mo))
		and (player.pflags & PF_SPINNING)
		and (player.mo.state == S_PLAY_ROLL) 
		   player.mo.momx = 0
		   player.mo.momy = 0
		   player.mo.momz = 0
		   player.mo.state = S_PLAY_SPINDASH
		   player.pflags = $|PF_STARTDASH
		end
	end
end)


//Dropdash (Spindash Style)
addHook("SpinSpecial", function(player)
	if player.mo.skin == "fisonic"
		and not(player.pflags & PF_THOKKED)
		and not(player.powers[pw_shield])
		and not(player.pflags & PF_FULLSTASIS)
		and (player.pflags & PF_JUMPED)
		and not (player.mo.state == S_PLAY_PAIN)
		and (P_IsObjectOnGround(player.mo) == false)
		S_StartSound(player.mo, sfx_spndsh, player)
		player.mo.state = S_PLAY_SPINDASH
		player.dropcharge = true
		player.pflags = $|PF_THOKKED
	end
end)


addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fisonic"
	    if(player.dropcharge == true)
		and player.speed < 45*FRACUNIT
		and(P_IsObjectOnGround(player.mo) == true) 
		   S_StartSound(player.mo, sfx_zoom, player)
		   player.dropcharge = false
		   player.pflags = $|PF_SPINNING
		   player.mo.state = S_PLAY_ROLL
		   P_Thrust(player.mo, player.mo.angle, 20*FRACUNIT)
		end
	end
end)


addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fisonic"
	    if(player.dropcharge == true) and (player.Xhyper)
		and player.powers[pw_super]
		and player.speed < 60*FRACUNIT
		and(P_IsObjectOnGround(player.mo) == true)
		   S_StartSound(player.mo, sfx_zoom, player)
		   player.dropcharge = false
		   player.pflags = $|PF_SPINNING
		   player.mo.state = S_PLAY_ROLL
		   P_Thrust(player.mo, player.mo.angle, 40*FRACUNIT)
		   P_StartQuake(21*FRACUNIT, 19)
		   P_NukeEnemies(player.mo, player.mo, 1512*FRACUNIT)
		   S_StartSound(player.mo, sfx_bkpoof, player)
		end
	end
end)


-- 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
		   player.mo.momz = -23*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)
		   player.mo.state = S_PLAY_ROLL
		   player.bonuce = false
		   player.mo.momz = 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)




-- Gasp Taunt (Custom 2)
addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "fisonic" and (player.cmd.buttons & BT_CUSTOM2)
	    if P_IsObjectOnGround(player.mo)
		and not player.powers[pw_carry]
		and(player.mo.state == S_PLAY_STND or player.mo.state == S_PLAY_WAIT)
		   S_StartSound(player.mo, sfx_gasp, player)
		   player.pflags = PF_FULLSTASIS
		   player.mo.state = S_PLAY_GASP
		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
		   P_SpawnThokMobj(player)
		   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)


// 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
}