//Sonic Lost World Bounce Attack. made by MotdSpork. Boing!
addHook("MobjThinker", function(sonic)
	if (sonic and sonic.skin == "sonic") 
	and sonic.player.playerstate == PST_LIVE 
	and not (sonic.player.powers[pw_super]) 
		if sonic.player.bounceattack == nil 
			sonic.player.bounceattack = 0 
		end
		if sonic.player.bouncenumber == nil 
			sonic.player.bouncenumber = 0 
			sonic.player.justchangedbouncenumber = 0 
		end
		if P_IsObjectOnGround(sonic)
		and sonic.player.bounceattack == 0 
			sonic.player.bouncenumber = 0 
		end
		if sonic.player.usedown == nil 
		or not (sonic.player.cmd.buttons & BT_USE) 
			sonic.player.usedown = 0 
			sonic.player.justchangedbouncenumber = 0 
		end
		if P_IsObjectOnGround(sonic) 
		and (sonic.player.cmd.buttons & BT_USE) 
			sonic.player.usedown = 1 
		end
		if sonic.player.pflags & PF_JUMPED 
		and not (P_IsObjectOnGround(sonic)) 
		and sonic.player.cmd.buttons & BT_USE 
		and sonic.player.bounceattack == 0 
		and sonic.player.usedown == 0 
		and not (sonic.player.exiting) 
		and sonic.health 
		and not (P_PlayerInPain(sonic.player)) 
			sonic.player.bounceattack = 1 
			P_SetObjectMomZ(sonic, -45*FRACUNIT) 

			sonic.player.pflags = $1|PF_THOKKED 
		end

		if (sonic.eflags & MFE_JUSTHITFLOOR)
		and not (sonic.player.pflags & PF_SPINNING) 
		and not (sonic.player.pflags & PF_STARTDASH)
		and not (sonic.tracer and sonic.tracer.type == MT_TUBEWAYPOINT)
		and sonic.player.bounceattack == 1 
		and sonic.health 
		and not (P_PlayerInPain(sonic.player)) 
			if sonic.player.bouncenumber == 0 
			and sonic.player.justchangedbouncenumber == 0 
				sonic.player.justchangedbouncenumber = 1 
				sonic.player.bouncenumber = 1 
				sonic.player.pflags = $1|PF_JUMPED 
				P_SetObjectMomZ(sonic, 12*FRACUNIT)
				if not (sonic.player.panim == PA_ROLL)
					sonic.state = S_PLAY_ROLL 
				end
			end
			if sonic.player.bouncenumber == 1 
			and sonic.player.justchangedbouncenumber == 0 
			and not (P_PlayerInPain(sonic.player)) 
				sonic.player.justchangedbouncenumber = 1 
				sonic.player.bouncenumber = 1 
				sonic.player.pflags = $1|PF_JUMPED 
				P_SetObjectMomZ(sonic, 13*FRACUNIT)
				if not (sonic.player.panim == PA_ROLL) 
					sonic.state = S_PLAY_ROLL 
				end
			end
			if sonic.player.bouncenumber == 2 
			and sonic.player.justchangedbouncenumber == 0 
			and not (P_PlayerInPain(sonic.player)) 
				sonic.player.justchangedbouncenumber = 1 
				sonic.player.bouncenumber = 0 
				sonic.state = S_PLAY_SPRING 
				P_SetObjectMomZ(sonic, 17*FRACUNIT) 
				sonic.player.pflags = $1 & ~PF_JUMPED 
			end
			sonic.player.bounceattack = 0 
			sonic.player.usedown = 1 

			S_StartSound(sonic, sfx_thok) 	
			
		end
		
		
		if sonic.player.bounceattack == 1
		and sonic.health 
		and not (P_PlayerInPain(sonic.player)) 
			P_SpawnThokMobj(sonic.player) 
			if not (sonic.player.panim == PA_ROLL) 
				sonic.state = S_PLAY_ROLL 
			end
			if (sonic.momz > (9000*P_MobjFlip(sonic))) 
				P_SetObjectMomZ(sonic, FixedMul(-55*FRACUNIT, sonic.scale)) 
			end
		else 
			sonic.player.bounceattack = 0 
		end
		if sonic.player.bounceattack == 1 
			sonic.player.pflags = $1 & ~PF_SPINNING 
		end
		if not (sonic.player.pflags & PF_JUMPED) 
			sonic.player.bounceattack = 0 
		end
		
		if sonic.eflags & MFE_GOOWATER 
		or sonic.player.powers[pw_carry] 
		
			sonic.player.bounceattack = 0 
		end
		if not (sonic.player.pflags & PF_JUMPED) 
			sonic.player.bounceattack = 0 
		end
	end
end, MT_PLAYER)