//Terra the Pangolin by jayflamestar
//Code by RubyTheMii

//No, this code is NOT reusable. Cry about it.

//custom sound stuff
freeslot("sfx_sling")
freeslot("sfx_hydsh")

sfxinfo[sfx_sling].caption = "Super Sling"
sfxinfo[sfx_hydsh].caption = "Hyper Dash"

//Custom color
freeslot("SKINCOLOR_LOAMY")
skincolors[SKINCOLOR_LOAMY] = {
	name = "Loamy",
	ramp = {234,234,234,235,235,236,237,237,238,239,239,27,28,28,29,30},
	invcolor = SKINCOLOR_TAN,
	invshade = 0, 
	chatcolor = V_BROWNMAP,
	accessible = true
}

//Check stuff for the abilities.
addHook("PlayerThink", function(player)
   if player.uptime == nil
    or P_IsObjectOnGround(player.mo)
	or player.mo.eflags & MFE_JUSTHITFLOOR
	  player.uptime = 0
   end
   
   if player.upped == nil
    or P_IsObjectOnGround(player.mo)
	or player.mo.eflags & MFE_JUSTHITFLOOR
	  player.upped = false
	  player.charflags = $1|SF_NOSHIELDABILITY
   end
   
   if player.fwrdtime == nil
    or P_IsObjectOnGround(player.mo)
	or player.mo.eflags & MFE_JUSTHITFLOOR
      player.fwrdtime = 0
   end
   
   if player.forwarded == nil
    or P_IsObjectOnGround(player.mo)
	or player.mo.eflags & MFE_JUSTHITFLOOR
      player.forwarded = false
	  player.charflags = $1|SF_NOSHIELDABILITY
   end
end)

//Jump ability - the Super Sling - a straight dash up.
//But first, a quick check as to not immediately enable the jump ability.
addHook("AbilitySpecial", function(player)
  if player.mo.skin == "terra" and player.charability == CA_NONE
   
   if not (player.pflags & PF_THOKKED)
      player.pflags = $1|PF_THOKKED
   end
   
  end
end)

addHook("PlayerThink", function(player)
   if player.mo.skin ~= "terra"
      then return
   end
   
   if player.forwarded == true
   or P_PlayerInPain(player)
   or player.mo.eflags & MFE_SPRUNG
      then return
   end
   
   //Let's get to business.
   if player.pflags & PF_THOKKED
    and player.pflags & PF_JUMPED
    and player.upped == false
	and player.cmd.buttons & BT_JUMP //jump key obv
	and not (player.uptime > 0)
	  player.upped = true
	  player.pflags = $1|PF_NOJUMPDAMAGE
   end
   if player.upped == true
    if not (player.uptime == 17)
	 player.uptime = $ + 1
	 player.mo.state = S_PLAY_SPRING
	 P_SetObjectMomZ(player.mo, 11*FRACUNIT, false)
	 P_InstaThrust(player.mo, player.mo.angle, player.speed/3)
	else
	 player.upped = false
	end
   end
   //Sound cue plus visual effect.
   if player.upped == true
    and (player.uptime == 1)
	S_StartSound(player.mo, sfx_sling)
	A_OldRingExplode(player.mo, MT_SPINDUST)
   end
end)

//Super Sling recurl.
addHook("JumpSpecial", function(player)
   if (player.pflags & PF_JUMPED) and not (player.pflags & PF_JUMPDOWN) and (player.upped == true)
    if not (player.mo.state == S_PLAY_JUMP)
	  player.charflags = $ & ~SF_NOSHIELDABILITY
	  player.pflags = $ & ~PF_NOJUMPDAMAGE
	  player.mo.state = S_PLAY_JUMP
	  player.upped = false
	  P_SpawnThokMobj(player)
	  S_StartSound(player.mo, sfx_s3ka2)
	end
   end
end)


//Spin ability - the Hyper Dash - a straight dash forward.
addHook("PlayerThink", function(player)
   if player.mo.skin ~= "terra"
      then return
   end
   
   if player.upped == true
   or P_PlayerInPain(player)
   or player.mo.eflags & MFE_SPRUNG
      then return
   end
   
   //Back to business
   if player.pflags & PF_JUMPED
    and player.forwarded == false
    and player.cmd.buttons & BT_USE //spin key
	and not (player.fwrdtime > 0)
	  player.forwarded = true
   end
   if player.forwarded == true
    if not (player.fwrdtime == 28)
	 player.fwrdtime = $ + 1
	 player.mo.state = S_THEH
	 P_SetObjectMomZ(player.mo, 0, false)
	 P_InstaThrust(player.mo, player.drawangle, 40*FRACUNIT)
	else
	 player.mo.state = S_PLAY_FALL
	 player.forwarded = false
	 player.pflags = $1|PF_NOJUMPDAMAGE
	end
   end
   //Sound cue and visual effect, again
   if player.forwarded == true
    and (player.fwrdtime == 1)
	 S_StartSound(player.mo, sfx_hydsh)
	 A_OldRingExplode(player.mo, MT_SPINDUST)
     end
end)

//Hyper Dash recurl.
addHook("JumpSpinSpecial", function(player)
   if not (player.pflags & PF_USEDOWN) and (player.forwarded == true)
    if not (player.mo.state == S_PLAY_JUMP)
	  player.charflags = $ & ~SF_NOSHIELDABILITY
	  player.mo.state = S_PLAY_JUMP
	  player.forwarded = false
	  P_SpawnThokMobj(player)
	  S_StartSound(player.mo, sfx_s3ka2)
	end
   end
end)

//Rebound Dash. Literally.
addHook("MobjMoveBlocked", function(mo)
  local play = mo.player
  
  if play.mo.skin ~= "terra"
   or play.speed < 10*mo.scale
     then return
  end
  
  if play.mo.state == S_THEH
    P_SpawnMobjFromMobj(play.mo, 0, 0, play.height/2, MT_SUPERSPARK)
    S_StartSound(play.mo, sfx_s3k5d)
	P_StartQuake(11*FRACUNIT, TICRATE/4)
    play.forwarded = false
    play.mo.state = S_PLAY_JUMP
    P_BounceMove(mo)
	mo.momx = $/2
    mo.momy = $/2
  end
end, MT_PLAYER)

//Enemy rebound.
addHook("MobjDamage", function(mo, player)
 for player in players.iterate
   if player.mo.state == S_THEH
    and ((mo.flags & MF_ENEMY) or (mo.flags & MF_BOSS)) then
	P_SpawnMobjFromMobj(player.mo, 0, 0, player.height/2, MT_SUPERSPARK)
    S_StartSound(player.mo, sfx_s3k5d)
	P_StartQuake(11*FRACUNIT, TICRATE/4)
    player.forwarded = false
    player.mo.state = S_PLAY_JUMP
    P_InstaThrust(player.mo, player.drawangle, (-player.speed)/2)
  end
 end
end)