freeslot("S_HELIHAMMER")
states[S_HELIHAMMER] = {
	sprite = SPR_GLID,
	frame = FF_ANIMATE,
	tics = -1,
	var1 = 7,
	var2 = 1,
	nextstate = S_PLAY_FALL
}
//thing from (https://www.youtube.com/watch?v=8L-1mddshzo&t=57s)a
//script by neo/edited by joseph
freeslot("S_S3_NTP","S_CYCLONE_DRILL")
states[S_S3_NTP] = {SPR_PLAY, SPR2_BNCE|FF_ANIMATE, 40, nil, 2, 1, S_S3_NTP}
states[S_CYCLONE_DRILL] = {SPR_PLAY, SPR2_GLID|FF_ANIMATE, 40, nil, 2, 1, S_CYCLONE_DRILL}
//Standalone edition of Antonblast's Hammer Bounce but thokked flag
//thing from (https://www.youtube.com/watch?v=8L-1mddshzo&t=57s)
addHook("PlayerThink", function(player)
    if player.mo and player.mo.skin == "namy"
		if P_PlayerInPain(player)
		or player.exiting
		or (player.mo.eflags & MFE_SPRUNG)
			player.s3ntpa = false
		end
        if(player.pflags & PF_JUMPED)
        and(player.cmd.buttons & BT_CUSTOM1)
        and(player.playerstate == PST_LIVE)
		and not (player.pflags & PF_THOKKED)
        and not (player.pflags & PF_STASIS)
        and not (player.pflags & PF_FULLSTASIS)
        and not (P_IsObjectOnGround(player.mo))
		and not P_PlayerInPain(player)
		and not player.exiting
           player.mo.state = S_S3_NTP
           player.s3ntpa = true
		   player.pflags = $ & ~PF_JUMPED
           S_StartSound(player.mo, sfx_s3k8c, player)
        end
		if player.mo.state == S_S3_NTP //Diffrent edition (Extra Slot amy)
			if (leveltime%10) == 1
				S_StartSound(player.mo, sfx_s3k67)
			    P_SpawnSkidDust(player, 1*FRACUNIT)
			end
		end
        if(player.s3ntpa)
        and(P_IsObjectOnGround(player.mo) == true)
        and not (player.mo.eflags & MFE_SPRUNG)
        and not (player.mo.state == S_PLAY_FALL)
			for i = 0, 8 do
			local fa = (i*(ANGLE_180/4))
			local dust = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_SPINDUST)
			dust.momx = FixedMul(sin(fa),20*FRACUNIT)
            dust.momy = FixedMul(cos(fa),20*FRACUNIT)
			end
           player.s3ntpa = false
           P_SetObjectMomZ(player.mo, 16*FRACUNIT)
           player.mo.state = S_S3_NTP
		   player.pflags = $|PF_JUMPED|PF_THOKKED
           P_StartQuake(10*FRACUNIT, 11)
           S_StartSound(player.mo, sfx_s3k49, player)
           S_StartSound(player.mo, sfx_s3k8b, player)
           if player.powers[pw_super]
		   local mo = player.mo
		   P_Earthquake(mo, mo, 200*FRACUNIT)
		   end
        end
    end
end)
//dust b.c i dont need this.
/*
addHook("PlayerThink", function(player)
	if player.mo.skin == "amy"	
		if not P_IsObjectOnGround(player.mo)
		local animsfx = false
			if (player.mo.state == S_S3_NTP)
				if not animsfx and (leveltime%7) == 0
				P_SpawnSkidDust(player, 1*FRACUNIT)
				end
			end
		end
	end
end)
*/

//dude give it a damage, and keep the state
addHook("PlayerCanDamage", function(p, mo)
	if p.mo.state == S_S3_NTP
		p.mo.state = S_S3_NTP
		return true
	end
end)

//FOF
local function CheckAndCrumble2(mo, sec)
  for fof in sec.ffloors()
    if not (fof.flags & FF_EXISTS) continue end -- Does it exist?
    if not (fof.flags & FF_BUSTUP) continue end -- Is it bustable?
    
    if mo.z + mo.momz + mo.height < fof.bottomheight continue end -- Are we too low?
    if mo.z + mo.momz > fof.topheight continue end -- Are we too high?

    -- Check for whatever else you may want to    

    EV_CrumbleChain(fof) -- Crumble
  end
end

addHook("PlayerThink", function(p)
  if not p.mo return end
  if not p.s3ntpa then return end
	CheckAndCrumble2(p.mo, p.mo.subsector.sector)
end)

addHook("MobjLineCollide", function(mo, line)
  if not mo.player return end
  if not mo.player.s3ntpa then return end
  for _, sec in ipairs({line.frontsector, line.backsector})
    CheckAndCrumble2(mo, sec)
  end
end, MT_PLAYER)
//end of that
//Rolling with amy (When its done)
//joseph edit
addHook("PlayerThink", function(player)
    local mo = player.mo
    if player.mo and player.mo.skin == "namy"
    and (player.cmd.buttons & BT_CUSTOM1)
    and P_IsObjectOnGround(player.mo)
    and player.speed > 2*FRACUNIT
    and player.amywasspinned == 0
        player.amywasspinned = 1
        S_StartSound(player.mo, sfx_spin)
        player.mo.state = S_PLAY_ROLL
        player.pflags = $|PF_SPINNING
    end
end)
addHook("PostThinkFrame", function()
    for player in players.iterate()
        local mo = player.mo
        if player.amywasspinned == nil
            player.amywasspinned = 0
        end
        if player.mo.state != S_PLAY_ROLL and player.mo.skin == "namy" and player.amywasspinned
            player.amywasspinned = 0
        end
    end
end)
freeslot("S_HELIHAMMER","SPR_HLHA")
states[S_HELIHAMMER] = {
	sprite = SPR_HLHA,
	frame = FF_ANIMATE,
	tics = -1,
	var1 = 7,
	var2 = 1,
	nextstate = S_PLAY_FALL
}
//break IDIOTIC FLOORS
local function FloorBreak(mo, sec)
	if not (mo and mo.valid) then return end
	
	for x = mo.x, mo.x + mo.radius, mo.radius
		for y = mo.y, mo.y + mo.radius, mo.radius
			for fof in sec.ffloors()
				if (fof.flags & FF_EXISTS) and (fof.flags & FF_BUSTUP)
				and (mo.z + mo.height == fof.bottomheight or mo.z == fof.topheight
				or (mo.eflags & MFE_VERTICALFLIP and (mo.z - mo.height == fof.topheight or mo.z == fof.bottomheight)))
					EV_CrumbleChain(fof)
				end
			end
		end
	end
end
//thinker for Cyclone Drill sfx
addHook("PlayerThink", function(player)
	if not player.mo and player.mo.valid return end
	
	if player.mo.skin != "namy" return end
	
	if player.cyclone == nil
		player.cyclone = false
	end
	if P_IsObjectOnGround(player.mo)
	or P_PlayerInPain(player)
	or player.powers[pw_carry]
		player.cyclonelag = false
	end
	if player.cyclone
	and P_IsObjectOnGround(player.mo)
		FloorBreak(player.mo, player.mo.subsector.sector)
		player.cyclone = false
		player.cyclonelag = true
		if player.powers[pw_shield] == SH_BUBBLEWRAP
		and not player.powers[pw_super]
			player.mo.momz = FixedMul(-player.savedmomz, 5*FRACUNIT/8) // 2/4, 3/4.
			player.cyclonelag = false
		else
			P_SetObjectMomZ(player.mo, 5*FRACUNIT, false)
		end
		player.mo.state = S_PLAY_JUMP
		player.pflags = $|PF_JUMPED
		player.pflags = $|PF_NOJUMPDAMAGE
		if player.powers[pw_shield] == SH_ELEMENTAL
		and not player.powers[pw_super]
			P_ElementalFire(player, true)
		else
			for i = 0, 8
				local fa = (i*(ANGLE_180/4))
				local dust = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z, MT_SPINDUST)
				dust.momx = FixedMul(sin(fa),12*FRACUNIT)
				dust.momy = FixedMul(cos(fa),12*FRACUNIT)
				dust.scale = player.mo.scale * 3 / 4
				P_SetObjectMomZ(dust, 3*FRACUNIT, false)
			end
		end
		if player.mchyper
			P_StartQuake(25*FRACUNIT, 16)
			P_NukeEnemies(player.mo, player.mo, 1500*FRACUNIT)
			if player.mcflashes
				P_FlashPal(player, PAL_WHITE, 8)
			end
			S_StartSound(player.mo, sfx_3db16)
		end
	end
	
	if player.cyclone
	and player.mo.eflags & MFE_SPRUNG
		player.mo.momz = $*6/5
		player.mo.momx = $*4/3
		player.mo.momy = $*4/3
		S_StartSound(player.mo, sfx_sprong, player)
		player.cyclone = false
		if player.mchyper
			P_StartQuake(25*FRACUNIT, 16)
			P_NukeEnemies(player.mo, player.mo, 1500*FRACUNIT)
			if player.mcflashes
				P_FlashPal(player, PAL_WHITE, 8)
			end
			S_StartSound(player.mo, sfx_3db16)
			S_StartSound(player.mo, sfx_s3k42)
		end
	end
	
	if player.cyclone
	and P_IsObjectInGoop(player.mo)
		player.cyclone = false
		player.cyclonelag = true
		player.mo.state = S_PLAY_FALL
	end
	
	if player.cmd.buttons & BT_JUMP
		player.jumpdown = true
	else
		player.jumpdown = false
	end
end)
local function CycloneDrill(player)
	if not player.mo and player.mo.valid return end
	
	if player.mo.skin != "namy" return end
	
	if not player.cyclone
	and not player.cyclonelag
	and not (player.pflags & PF_SPINDOWN)
		player.mo.state = S_HELIHAMMER
		P_SetObjectMomZ(player.mo, -24*FRACUNIT, false)
		S_StartSound(player.mo, sfx_3db16, player)
		S_StartSound(player.mo, sfx_s3k42)
		if (player.powers[pw_shield] & SH_FORCE)
			player.mo.momx = 0
			player.mo.momy = 0
		end
		player.cyclone = true
		player.pflags = $|PF_THOKKED
	end
	return true
end

addHook("JumpSpinSpecial", CycloneDrill)

local function EnemyKillDrill(enemy, mo, source, damage)
	if not mo or not mo.valid return end
	if mo.skin != "namy" return end
	local player = mo.player
	if (player == nil) or (player.playerstate != PST_LIVE) return end	
	if not enemy and enemy.valid return end
	
	if enemy.flags & (MF_ENEMY|MF_MONITOR)
		if player.cyclone
			player.cyclone = false
			player.cyclonelag = true
			player.helilag = false
			player.mo.state = S_PLAY_JUMP
			player.pflags = $|PF_JUMPED
			player.pflags = $|PF_NOJUMPDAMAGE
			player.pflags = $ & ~PF_THOKKED
		end
	end
end

addHook("MobjDeath", EnemyKillDrill)

local function StatesWithDamage(player, badnik)
	if player.mo and player.mo.valid and player.mo.health
		if player.mo.state == S_HELIHAMMER
			return true
		end
	end
end

addHook("PlayerCanDamage", StatesWithDamage)


addHook("PlayerCanDamage", function(p, mo)
	if p.mo.state == S_HELIHAMMER
		p.mo.state = S_HELIHAMMER
		return true
	end
end)
addHook("ThinkFrame", do
	for player in players.iterate do
		if player.mo 
		and (player.mo.skin == "namy")
		and not P_IsObjectOnGround(player.mo)
			if ((player.mo.state == S_HELIHAMMER) and (player.mo.frame == A))
				if not (player.mo.eflags & MFE_GOOWATER)
					S_StartSound(player.mo, sfx_s3k42)
				end
			end
		end
	end
end)