//GONNA HIT YOU WITH SONIC SPEED

//i wish i had this kind of skill when i coded that bum ass shell mechanic dawg :sob: :pray:

freeslot("SPR_TYPJ", "MT_TYPEJ", "MT_TYPEJ2", "S_PLAY_EXTREME","MT_TYPEJTRAIL","SPR_TYPT", "SPR_BLUS","MT_TYPEJTRAIL2",
"MT_TYPEJTRAIL3","sfx_tdrt","sfx_tgo","sfx_tctri","sfx_tland","S_PLAY_EXTREMETRICK","S_PLAY_EXTREMETRICK2",
"S_PLAY_EXTREMETRICK3","S_PLAY_EXTREMETRICK4", "S_TYPEJ", "S_TYPEJ2")

states[S_PLAY_EXTREME] = {
	sprite = SPR_PLAY,
	frame = FF_ANIMATE|SPR2_GRND,
	tics = 4,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_EXTREME
}
states[S_PLAY_EXTREMETRICK] = {
	sprite = SPR_PLAY,
	frame = FF_ANIMATE|SPR2_FALL,
	tics = 16,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_EXTREME
}
states[S_PLAY_EXTREMETRICK2] = {
	sprite = SPR_PLAY,
	frame = FF_ANIMATE|SPR2_SKID,
	tics = 16,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_EXTREME
}
states[S_PLAY_EXTREMETRICK3] = {
	sprite = SPR_PLAY,
	frame = FF_ANIMATE|SPR2_RIDE,
	tics = 16,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_EXTREME
}
states[S_PLAY_EXTREMETRICK4] = {
	sprite = SPR_PLAY,
	frame = FF_ANIMATE|SPR2_FALL,
	tics = 16,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_EXTREME
}

mobjinfo[MT_TYPEJ] = {
doomednum = -1,
spawnstate = S_TYPEJ,
spawnhealth = 8,
painstate = S_TYPEJ,
deathstate = S_TYPEJ,
speed = 0,
radius = 16*FRACUNIT,
height = 16*FRACUNIT,
dispoffset = -20,
activesound = sfx_None,
flags = MF_NOGRAVITY|MF_RUNSPAWNFUNC|MF_SPECIAL|MF_NOCLIP,
}
mobjinfo[MT_TYPEJ2] = {
//$Sprite TYPJA5
//$Arg0 Board Type
//$Arg0Type 11
//$Arg0Enum {1="Type-J"; 2="Blue Star II";}
doomednum = 7021,
spawnstate = S_TYPEJ,
spawnhealth = 8,
painstate = S_TYPEJ2,
deathstate = S_TYPEJ2,
speed = 0,
radius = 16*FRACUNIT,
height = 16*FRACUNIT,
dispoffset = -20,
activesound = sfx_None,
flags = MF_NOGRAVITY|MF_RUNSPAWNFUNC|MF_NOCLIPHEIGHT|MF_SPECIAL,
}


addHook("PlayerThink",function(player)
 

															  
															  
																 
 
 
 if player.touchedboard ~= true then return end
 
 A_FindTarget(player.mo, MT_TYPEJ, 0)
 
  //base shit
   if player.mo.valid and player.powers[pw_carry] ~= CR_GRINDRAIL and player.canboardtrick == false
   then
       player.pflags = $|PF_JUMPSTASIS
	   player.pflags = $1 & ~PF_JUMPED
	   player.pflags = $1 & ~PF_SPINNING
	   player.pflags = $1 & ~PF_STARTDASH
	   player.mo.spriteyoffset = 25*FRACUNIT
	   player.mo.state = S_PLAY_EXTREME
	   player.drawangle = player.mo.angle 
	   player.mo.friction = 1*FRACUNIT
	   end
	   
	   if player.mo.valid and player.powers[pw_carry] ~= CR_GRINDRAIL and player.canboardtrick == true
         then
	   	   player.pflags = $|PF_JUMPSTASIS
	       player.pflags = $1 & ~PF_JUMPED
	       player.pflags = $1 & ~PF_SPINNING
	       player.pflags = $1 & ~PF_STARTDASH
	       player.mo.spriteyoffset = 25*FRACUNIT
		   end
	   
	   if player.mo.state == S_PLAY_SPRING
	    then player.mo.state = S_PLAY_EXTREME
		 end
		 
		 if player.mo.state == S_PLAY_JUMP
	    then player.mo.state = S_PLAY_EXTREME
		 end
		 
		 if player.mo.state == S_PLAY_RUN
	    then player.mo.state = S_PLAY_EXTREME
		 end
		 
		 if player.mo.state == S_PLAY_WALK
	    then player.mo.state = S_PLAY_EXTREME
		 end
		
		
		
		
		
		
		if player.chargingjump == false and player.powers[pw_carry] ~= CR_GRINDRAIL and player.boardhastricked < 4 //normal behaviour
		
		
		 P_SpawnMobjFromMobj(player.mo.target, -60*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL)
		 P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL)
		 P_SpawnMobjFromMobj(player.mo.target, -40*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL)
		  end
		  
		  
						  
						  
					//for the drift levels	  
		
		           if player.driftboost1 == true and player.grounded ~= false
				  then  P_SpawnMobjFromMobj(player.mo.target, -60*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL)
		                 P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL)
		                  P_SpawnMobjFromMobj(player.mo.target, -40*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL)
				   end
				  
				  if player.driftboost2 == true and player.grounded ~= false
				  then P_SpawnMobjFromMobj(player.mo.target, -60*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL2)
		                 P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL2)
		                  P_SpawnMobjFromMobj(player.mo.target, -45*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL2)
				   end
				  
				  if player.driftboost3 == true and player.grounded ~= false
				  then P_SpawnMobjFromMobj(player.mo.target, -60*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL3)
		                 P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL3)
		                  P_SpawnMobjFromMobj(player.mo.target, -40*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL3)
				   end
				   
				   if player.mo.valid and player.isboardtrickingtimer == 0
				    then player.mo.target.angle = player.drawangle					     
					end
					
					if player.mo.valid
					 then player.mo.target.rollangle = player.mo.rollangle
					  end
					
					
					
					
					                          //Misc.
														
															  
															  if player.boardtype == 1
						                                       then player.mo.target.sprite = SPR_TYPJ
															        
						                                           end
						
						                                        if player.boardtype == 2
						                                         then player.mo.target.sprite = SPR_BLUS
																     
						                                            end	
					
					
					  
					
		
	   
	   //drift and movement related stuff
	   if player.inair == nil
	    then player.inair = false
		 end
	   
	   if player.drifttime == nil
	    then player.drifttime = 0
		 end
		 
		 if player.driftsound == nil
			then player.driftsound = 0
			 end
		 
	   
	   if player.speed <= 60*FU
	    then 
		P_Thrust(player.mo, camera.angle, 1*FU)
		 end
			 
			 if player.mo.z > player.mo.floorz + 22*FU 
			  and player.powers[pw_carry] ~= CR_GRINDRAIL
			  
			  then
			         player.inair = true
			          player.chargejumptime = 0
			          end
					  
					  
				if P_IsObjectOnGround(player.mo) and player.drifttime == 0 //make turning at high speeds harder so the player drifts
				then player.mo.movefactor = FU/2
				 end
				 
				 if not P_IsObjectOnGround(player.mo)//dont have that happen if they are in the air to not get in the way of platforming
				then player.mo.movefactor = FU
				 end
			   
			   if player.cmd.sidemove <= -5 and player.cmd.forwardmove == 35 and (player.cmd.buttons & BT_SPIN)
			    and player.speed >= 45 and mouse.dx > 20 and P_IsObjectOnGround(player.mo)
				 and not(player.cmd.buttons & BT_JUMP)
				
			      then 
				  player.drifttime = $ + 1
				  player.driftsound = $ + 1
				  player.mo.movefactor = FU
			        end
				  
				   if player.cmd.sidemove >= 5 and player.cmd.forwardmove == 35 and (player.cmd.buttons & BT_SPIN)
			        and player.speed >= 45 and mouse.dx < -20 and P_IsObjectOnGround(player.mo)
					 and not (player.cmd.buttons & BT_JUMP)
				     
					 then 
					 player.drifttime = $ + 1
					 player.driftsound = $ + 1
			            end
					
					
					  
					  
					  if not P_IsObjectOnGround(player.mo)
					   then player.driftsound = 0
					    end
						
					    if player.driftsound == 2
						 S_StartSound(player.mo, sfx_tdrt)
						  end
						
						if player.driftsound == 16	       
						   S_StartSound(player.mo, sfx_tdrt) 
						    player.driftsound = 0
						     end
							 
							 
							
					  
				  
				  if player.drifttime > 16
				   then player.driftboost1 = true
				       end

				   
				   if player.drifttime > 32
				   then player.driftboost2 = true
				   player.driftboost1 = false
				       end
				   
				   if player.drifttime > 48
				   then player.driftboost3 = true
				    player.driftboost2 = false
				   player.driftboost1 = false
				          end
				  
				  
				  
				  
				  
				  
				  
				  
	
	
	              
	
	
				 if player.drifttime >= 16 and not (player.cmd.buttons & BT_SPIN) and player.speed >= 45
				  and player.driftboost1 == true and P_IsObjectOnGround(player.mo)
				  S_StartSound(player.mo, sfx_tgo)
				  P_Thrust(player.mo, camera.angle, 30*FU) 
				  player.drifttime = 0
				  player.driftboost1 = false
				  end
				  
				  if player.drifttime >= 32 and not (player.cmd.buttons & BT_SPIN) and player.speed >= 45
				  and player.driftboost2 == true and P_IsObjectOnGround(player.mo)
				  S_StartSound(player.mo, sfx_tgo)
				  P_Thrust(player.mo, camera.angle, 60*FU) 
				  player.drifttime = 0
				  player.driftboost2 = false
				  end
				  
				  if player.drifttime >= 48 and not (player.cmd.buttons & BT_SPIN) and player.speed >= 45
				  and player.driftboost3 == true and P_IsObjectOnGround(player.mo)
				 S_StartSound(player.mo, sfx_tgo)
				 P_Thrust(player.mo, camera.angle, 90*FU) 
				  player.drifttime = 0
				  player.driftboost3 = false
				  end
				  
				  
				  if not (player.cmd.buttons & BT_SPIN) and player.drifttime > 0
		          then player.drifttime = 0
		                player.driftsound = 0
		                end
						
						if not (player.cmd.buttons & BT_SPIN)
						 then player.driftsound = 0
						  end
				  
				  if player.driftsound > 0 and not P_IsObjectOnGround(player.mo)
				   then player.driftsound = 0
				    end
				  
				   
					 
					
				  
				  
				  
				  //jump related stuff
				  
				  if player.canboardtrick == nil 
				   then player.canboardtrick = true
				    end
				  
				  if player.chargejumptime == nil
				   then player.chargejumptime = 0
				    end
					
					 if player.isholdingjump == nil 
					  then player.isholdingjump = 0
					   end
					   
					    if (player.cmd.buttons & BT_JUMP)
						 then player.isholdingjump = $ + 1
						  else player.isholdingjump = 0
						   end
				  
			if (player.cmd.buttons & BT_JUMP) and P_IsObjectOnGround(player.mo) and player.drifttime == 0
			
			       player.chargingjump = true
				   player.chargejumptime = $ + 1
			        end
				 
				 
				 
				  
				  if player.isholdingjump == 1 and (player.cmd.buttons & BT_JUMP) and P_IsObjectOnGround(player.mo)
				     and player.powers[pw_carry] ~= CR_GRINDRAIL and player.mo.standingslope == nil //normal jump 
				       then
				          P_SetObjectMomZ(player.mo, 10*FU, true) 
				            S_StartSound(player.mo, sfx_fjum)
						   player.hasboardjumped = true
						  player.inairset = 0
				         end



				   
				   if player.isholdingjump == 1 and (player.cmd.buttons & BT_JUMP) and P_IsObjectOnGround(player.mo)
				      and player.mo.standingslope ~= nil and player.powers[pw_carry] ~= CR_GRINDRAIL //for tricks
				   
				    then P_SetObjectMomZ(player.mo, 15*FU, true) 
				     S_StartSound(player.mo, sfx_fjum)
						player.hasboardjumped = true
						player.canboardtrick = true
						player.inairset = 0
				         end
				   
				   if player.hasboardjumped == true and player.mo.z < player.mo.floorz + 23*FU
				    then player.hasboardjumped = false
					     player.chargejumptime = 0
						 end
						 
						 if player.inairset == nil
						  then player.inairset = 0
						   end
						 
						 if player.inair == true
						  then player.inairset = $ + 1
						   end
						   
						   if not (player.cmd.buttons & BT_JUMP)
				           then player.chargingjump = false
				                 player.chargejumptime = 0
					             end
								 
								 
								 if player.chargejumptime > 3 and player.powers[pw_carry] ~= CR_GRINDRAIL //make the player notice that they have a fully charged jump
		                          then P_SpawnMobjFromMobj(player.mo.target, -60*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL3)
		                               P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL3)
		                               P_SpawnMobjFromMobj(player.mo.target, -40*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 20*FU, MT_TYPEJTRAIL3)
				                        end
								 
						   
						 
						 //TRICKING SHENANIGANS
						 
						  if player.boardhastricked == nil
			               then player.boardhastricked = 0
			                  end
						 
						  if player.mo.z < player.mo.floorz + 22*FU and player.canboardtrick == true and player.inair == true
						    and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 0 //LANDING NO TRICKS
						  
						   S_StartSound(player.mo, sfx_tland)					   
						   player.canboardtrick = false
						   player.inair = false
						   player.inairset = 0
						   end
						   
						   if not (player.cmd.buttons & BT_JUMP) 
				             then player.chargingjump = false
				                    player.chargejumptime = 0
				                    end
									
			
			
			      
						
						if player.boardtrickcd == nil
						 then player.boardtrickcd = 0
						  end
						  
						  if player.boardtrickcd > 0
						   then player.boardtrickcd = $ - 1
						    end
							
							if player.isboardtrickingtimer == nil
							 then player.isboardtrickingtimer = 0
							  end
						
						if player.boardfalseangle == nil
						 then player.boardfalseangle = 0
						  end
						  
						  
						  
						  
						  
						
						if player.canboardtrick == true           //THE ACT OF TRICKING
						  and player.mo.z > player.mo.floorz + 22*FU
							 and player.cmd.sidemove ~= 0
							  and player.boardtrickcd == 0
							   and player.inair == true
							   and player.inairset > 8
							    and player.powers[pw_carry] ~= CR_GRINDRAIL
								 and player.ispressingmovekeys == false
							  
							 then player.mo.state = P_RandomRange(S_PLAY_EXTREMETRICK, S_PLAY_EXTREMETRICK3)
							     player.boardtrickcd = 20
								 player.isboardtrickingtimer = 12
								 player.boardhastricked = $ + 1
								 player.boardfalseangle = player.drawangle
								 S_StartSound(player.mo, sfx_tctri)
							  end
								
								
								if player.cmd.sidemove ~= 0
						        then player.ispressingmovekeys = true
						         end 
								if player.cmd.sidemove == 0
						        then player.ispressingmovekeys = false
						         end 
								
								
							  if player.isboardtrickingtimer > 0
							   then player.isboardtrickingtimer = $ - 1
							    end
								
								if player.boardtrickfailed == nil
								 then player.boardtrickfailed = 0
								  end
	                      
						  if player.mo.z < player.mo.floorz + 22*FU and player.inair == true //YOU BUM (D RANK)
						    and player.isboardtrickingtimer > 0 and player.powers[pw_carry] ~= CR_GRINDRAIL
							
						   S_StartSound(player.mo, sfx_tland)
						   S_StartSound(player.mo, sfx_yuvocy)
						   player.inair = false
						   player.canboardtrick = false
						   player.boardtrickfailed = 16
						   player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
						   player.mo.target.unflipboard = 0
						   player.boardhastricked = 0
						   end
						   
						   if player.boardtrickfailed > 0 //STOP SPEED UPON FAILLING
						    then player.boardtrickfailed = $ - 1
							     player.mo.momx = 0*FU
								 player.mo.momy = 0*FU
								 player.mo.state = S_PLAY_PAIN
								  end
								  
								  if player.powers[pw_carry] == CR_GRINDRAIL and player.inair == true //YOU BUM (RAILS) (D RANK)
						             and player.isboardtrickingtimer > 0
							
						              S_StartSound(player.mo, sfx_tland)
									  S_StartSound(player.mo, sfx_yuvocy)
						               player.inair = false
						                player.canboardtrick = false
						                 player.boardtrickfailed = 16
										 player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
										 player.mo.target.unflipboard = 0
										 player.boardhastricked = 0
						             end
									 
					     if player.boardtrickfailed > 0 and player.powers[pw_carry] == CR_GRINDRAIL //stop speed upon failling (rails) (D Rank)
						    then player.boardtrickfailed = $ - 1
							    player.mo.GSgrind.railspeed = 0
								  player.mo.state = S_PLAY_PAIN								  
								   end
				
								  
								  
								  if player.mo.z < player.mo.floorz + 22*FU and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 1 
									and player.powers[pw_carry] ~= CR_GRINDRAIL                                     //ONE TRICK (C RANK)
									 
									  S_StartSound(player.mo, sfx_tland)
									  S_StartSound(player.mo, sfx_tgo)
									  P_Thrust(player.mo, camera.angle, 10*FU)
						              player.inair = false
						              player.canboardtrick = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  
									  end
									  
									  
								if player.powers[pw_carry] == CR_GRINDRAIL and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 1 //ONE TRICK FOR RAILS (C RANK)
									 
									  S_StartSound(player.mo, sfx_tgo)
						              player.inair = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  end
									  
									  
									  
									  if player.mo.z < player.mo.floorz + 22*FU and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 2 
									and player.powers[pw_carry] ~= CR_GRINDRAIL                                     //TWO TRICKS (B RANK)
									 
									  S_StartSound(player.mo, sfx_tland)
									  S_StartSound(player.mo, sfx_tgo)
									  P_Thrust(player.mo, camera.angle, 20*FU)
						              player.inair = false
						              player.canboardtrick = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  
									  end
									  
									  
								if player.powers[pw_carry] == CR_GRINDRAIL and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 2 //TWO TRICKS FOR RAILS (B RANK)
									 
									  S_StartSound(player.mo, sfx_tgo)
						              player.inair = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  end
									  
									  
									  
									  
									  
									  if player.mo.z < player.mo.floorz + 22*FU and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 3
									and player.powers[pw_carry] ~= CR_GRINDRAIL                                     //THREE TRICKS (A RANK)
									 
									  S_StartSound(player.mo, sfx_tland)
									  S_StartSound(player.mo, sfx_tgo)
									  S_StartSound(player.mo, sfx_yuvoci)
									  P_Thrust(player.mo, camera.angle, 30*FU)
						              player.inair = false
						              player.canboardtrick = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  
									  end
									  
									  
								if player.powers[pw_carry] == CR_GRINDRAIL and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 3 //THREE TRICKS FOR RAILS (A RANK)
									 
									  S_StartSound(player.mo, sfx_tgo)
									  S_StartSound(player.mo, sfx_yuvoci)
						              player.inair = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  end
									  
									  
									  
									   if player.mo.z < player.mo.floorz + 22*FU and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 4
									and player.powers[pw_carry] ~= CR_GRINDRAIL                                     //FOUR TRICKS (S RANK)
									 
									  S_StartSound(player.mo, sfx_tland)
									  S_StartSound(player.mo, sfx_tgo)
									  S_StartSound(player.mo, sfx_yuvocr)
									  P_Thrust(player.mo, camera.angle, 50*FU)
						              player.inair = false
						              player.canboardtrick = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  
									  end
									  
									  
								if player.powers[pw_carry] == CR_GRINDRAIL and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked == 4 //FOUR TRICKS FOR RAILS (S RANK)
									 
									  S_StartSound(player.mo, sfx_tgo)
									  S_StartSound(player.mo, sfx_yuvocr)
						              player.inair = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  end
									  
									  
									  if player.mo.z < player.mo.floorz + 22*FU and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked >= 5
									and player.powers[pw_carry] ~= CR_GRINDRAIL                                     //FIVE TRICKS (X RANK)
									 
									  S_StartSound(player.mo, sfx_tland)
									  S_StartSound(player.mo, sfx_tgo)
									  S_StartSound(player.mo, sfx_yuvocg)
									  P_Thrust(player.mo, camera.angle, 70*FU)
						              player.inair = false
						              player.canboardtrick = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  
									  end
									  
									  
								if player.powers[pw_carry] == CR_GRINDRAIL and player.canboardtrick == true
						            and player.inairset > 12 and player.isboardtrickingtimer == 0 and player.boardhastricked >= 5 //FIVE TRICKSS FOR RAILS (X RANK)
									 
									  S_StartSound(player.mo, sfx_tgo)
									  S_StartSound(player.mo, sfx_yuvocg)
						              player.inair = false
									  player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
									  player.mo.target.unflipboard = 0
									  player.boardhastricked = 0
									  end
									  
									  
									  
									  
						              
									  if player.mo.state == S_PLAY_EXTREMETRICK
									     then player.mo.target.angle = player.boardfalseangle + ANG60
										      player.boardfalseangle = player.mo.target.angle
										  end
										  
										  
										  
										  if player.mo.state == S_PLAY_EXTREMETRICK2
									      then player.drawangle = player.boardfalseangle + ANG30
										       player.mo.target.angle = player.drawangle
											   player.boardfalseangle = player.drawangle 				
										   end
										    
											if player.mo.state == S_PLAY_EXTREMETRICK3
									         then player.drawangle = player.boardfalseangle - ANG30
										       player.mo.target.angle = player.drawangle
											   player.boardfalseangle = player.drawangle 				
										       end
											   
											   player.mo.target.rollangle = player.mo.rollangle
											   
											   
											   
											    if player.boardhastricked == 3
											   then P_SpawnMobjFromMobj(player.mo.target, -55*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL)
		                                              P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL)
		                                                P_SpawnMobjFromMobj(player.mo.target, -45*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL)
						                                end
														
														
														if player.boardhastricked == 4
											         then P_SpawnMobjFromMobj(player.mo.target, -55*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL2)
		                                                    P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL2)
		                                                      P_SpawnMobjFromMobj(player.mo.target, -45*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL2)
						                                  end
														  
														  if player.boardhastricked >= 5
											         then P_SpawnMobjFromMobj(player.mo.target, -55*cos(player.mo.target.angle), -60*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL3)
		                                                    P_SpawnMobjFromMobj(player.mo.target, -50*cos(player.mo.target.angle), -50*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL3)
		                                                      P_SpawnMobjFromMobj(player.mo.target, -45*cos(player.mo.target.angle), -40*sin(player.mo.target.angle), 10*FU, MT_TYPEJTRAIL3)
						                                  end
														  
														  if player.mo.state == S_PLAY_EXTREME
														   then player.mo.target.eflags = $ & ~MFE_VERTICALFLIP
														    end
															
															if player.mo.valid and player.powers[pw_carry] ~= CR_GRINDRAIL
							                                 P_MoveOrigin(player.mo.target, player.mo.x + player.mo.momx, 
			                                                    player.mo.y + player.mo.momy, player.mo.z + player.mo.momz)
							                                     end
																 
												
		  
		  
		  												 
																 
																 
																 
	if player.playerstate == PST_DEAD
	then
	 player.inair = false
	  player.canboardtrick = false
	  player.boardhastricked = 0
	  player.touchedboard = false
	  player.mo.spriteyoffset = 1*FRACUNIT
	  player.mo.target.target = nil
	  player.mo.flags = $1 & ~MF_NOGRAVITY
	  player.mo.state = S_PLAY_FALL
	  end
			
			
	//NEW MOVEMENT STUFF
	
	
	//boost
	
	if player.pressingboost == nil
	 then player.pressingboost = 0
	  end
	  
	   if (player.cmd.buttons & BT_SPIN)
	   then player.pressingboost = $ + 1
	    else player.pressingboost = 0
	     end
		 
		 if player.boardboostcd == nil
		  then player.boardboostcd = 0
		   end
		   
		   if player.boardboostcd > 0
		    then player.boardboostcd = $ - 1
			 end
	
	if player.speed < 90*FU and (player.cmd.buttons & BT_SPIN) and player.pressingboost <= 1 and player.powers[pw_carry] ~= CR_GRINDRAIL
	 then P_InstaThrust(player.mo, camera.angle, 90*FU)
	      player.boardboostcd = 32
		  S_StartSound(player.mo, sfx_yuvoc5)
		  S_StartSound(player.mo, sfx_tgo)
	  end
					
					
		if player.speed >= 0 and player.cmd.forwardmove <= -1 and P_IsObjectOnGround(player.mo) then //braking/dont let the player move backwards, thank you Lav
                 local ang = R_PointToAngle2(0, 0, player.mo.momx, player.mo.momy)
                       player.mo.momx = P_ReturnThrustX(player.mo, ang, 1*FRACUNIT)
                        player.mo.momy = P_ReturnThrustY(player.mo, ang, 1*FRACUNIT)
                         end		
            		  
																 
				if player.speed > 130*FRACUNIT then //hard speed cap, thank you Lav
                 local ang = R_PointToAngle2(0, 0, player.mo.momx, player.mo.momy)
                       player.mo.momx = P_ReturnThrustX(player.mo, ang, 130*FRACUNIT)
                        player.mo.momy = P_ReturnThrustY(player.mo, ang, 130*FRACUNIT)
                         end			
																 
																
														
																 
															
															
	                       
						                end)
	   
addHook("TouchSpecial",function(mobj,player)
 

 A_SpawnObjectRelative(mobj, 0, MT_TYPEJ) 
 
 for player in players.iterate do
    
 
 if player.touchedboard ~= true
  then player.touchedboard = true
	   player.boardtype = mobj.boardtype
	   
	   end
	   end
	
   
    end,MT_TYPEJ2)
	

addHook("MobjThinker", function(mo,player)
   mo.spriteyscale = FU*4/10
  mo.spritexscale = FU*4/10
  end,MT_TYPEJ2)
   
addHook("MapThingSpawn", function(mo,mapthing)
 
 
 if mapthing.args[0] == 1
  
  then mo.sprite = SPR_TYPJ
        mo.boardtype = 1
		end
 
 
 
 if mapthing.args[0] == 2
  
  then mo.sprite = SPR_BLUS 
        mo.boardtype = 2
   end
   end,MT_TYPEJ2)
     

	   
addHook("MobjThinker", function(mo,player)



  mo.spriteyscale = FU*4/10
  mo.spritexscale = FU*4/10
  mo.spriteyoffset = 25*FRACUNIT
  
  if mo.target == nil then return end 
   
  
   
 
          if mo.target.player.powers[pw_carry] == CR_GRINDRAIL
           then P_MoveOrigin(mo, mo.target.x, mo.target.y + mo.target.momy, mo.target.z + mo.target.momz)
			    end
				
				if mo.target.state == S_PLAY_EXTREMETRICK
				 then 
				 P_MoveOrigin(mo, mo.target.x, 
				 
			      mo.target.y, mo.target.z)
				  end
				  
				  if mo.target.state == S_PLAY_EXTREMETRICK2
				   then 
				   P_MoveOrigin(mo, mo.target.x, 
				 
			      mo.target.y, mo.target.z)
				  end
					
					if mo.unflipboard == nil
					 then mo.unflipboard = 0
					  end
			
				  if mo.target.state == S_PLAY_EXTREMETRICK3
				   then 
				   P_MoveOrigin(mo, mo.target.x, 
				 
			         mo.target.y,
					
				    mo.target.z + 80*FU)
					
					mo.eflags = $|MFE_VERTICALFLIP
					
					mo.unflipboard = $ + 1
					
				    end
					 
					 if mo.unflipboard >= 16
					   then mo.unflipboard = 0
					        mo.eflags = $ & ~MFE_VERTICALFLIP
							end
							
							if mo.target.state == S_PLAY_EXTREME
							 then mo.unflipboard = 0
							  end
							  
						
     end,MT_TYPEJ)
	 
addHook("MobjThinker", function(mo)

if mo.valid
  A_FindTarget(mo, MT_TYPEJ, 0)
  mo.rollangle = mo.target.rollangle
  mo.spriteyscale = FU/6
  mo.spritexscale = FU/4
  end
  
  if mo.target.unflipboard > 0
   then mo.eflags = $|MFE_VERTICALFLIP
    else mo.eflags = $ & ~MFE_VERTICALFLIP
    end
   
     end,MT_TYPEJTRAIL)	
	 
addHook("MobjThinker", function(mo)

if mo.valid
  A_FindTarget(mo, MT_TYPEJ, 0)
  mo.rollangle = mo.target.rollangle
  mo.spriteyscale = FU/6
  mo.spritexscale = FU/4
  end
  
  if mo.target.unflipboard > 0
   then mo.eflags = $|MFE_VERTICALFLIP
    else mo.eflags = $ & ~MFE_VERTICALFLIP
    end
  
   
     end,MT_TYPEJTRAIL2)
	 
addHook("MobjThinker", function(mo)

if mo.valid
  A_FindTarget(mo, MT_TYPEJ, 0)
  mo.rollangle = mo.target.rollangle
  mo.spriteyscale = FU/6
  mo.spritexscale = FU/4
  end
  
  if mo.target.unflipboard > 0
   then mo.eflags = $|MFE_VERTICALFLIP
    else mo.eflags = $ & ~MFE_VERTICALFLIP
    end
   
     end,MT_TYPEJTRAIL3)
	 
 addHook("MapLoad", function()
	  for player in players.iterate
	 
	 if player.mo.valid
	  player.canboardtrick = false
	  player.boardhastricked = 0
	  player.mo.movefactor = FU
	 end
	  end
	  end)
	  
addHook("TouchSpecial",function(mobj,player)

 for player in players.iterate do
   
   

   
   player.touchedboard = true
   A_SetObjectTypeState(player.mo, S_NULL, MT_TYPEJ2)
   end
   
   
   
   
   end,MT_TYPEJ2)
   
   
addHook("MapChange", function()
 for player in players.iterate
 
 if player.mo.valid
  player.touchedboard = false
  player.canboardtrick = false
	  player.boardhastricked = 0
	  player.mo.spriteyoffset = 1*FRACUNIT
	  player.mo.flags = $1 & ~MF_NOGRAVITY
	  player.mo.state = S_PLAY_FALL
   end
    end
   
    end)
	
	
addHook("LinedefExecute", function(player)
for player in players.iterate

if player.mo.valid
	 player.inair = false
	  player.canboardtrick = false
	  player.boardhastricked = 0
	  player.touchedboard = false
	  player.mo.spriteyoffset = 1*FRACUNIT
	  player.mo.target.target = nil
	  player.mo.flags = $1 & ~MF_NOGRAVITY
	  player.mo.state = S_PLAY_FALL
	  player.mo.movefactor = FU
	  end
	  end
	  end, "UNBOARD")
   
