--=============================SAMUS HEALTH SYSTEM==================================
--Samus' energy systems are here, determining how much damage things deal and what interactions they cause.
--At the bottom there's also some custom linedefs for the custom stages, like ACZ4's Phazon goo.
--====================================================================================

rawset(_G, "HighPain", function(s, rng) --Special pain sound when taking heavy damage. Can choose specific one if you like.
if rng == nil --No sound given? Choose randomly.
rng = P_RandomRange(0,2)
end
P_PlayRinglossSound(s)
	if not rng
	S_StartSound(s, sfx_h1pain)
	elseif rng == 1
	S_StartSound(s, sfx_h2pain)
	else
	S_StartSound(s, sfx_h3pain)	
	end
end)

local function SamPlayerPrism(s,p,so, big,amount) --Lazy shortcut
	if ((so.player.score+300) < (p.score))
		for d = 1,amount
		SpawnSamusPrism(s, so, var1)
		end
	end
end

--How much energy to subtract? Auto-calculates defense or kills Samus. Only used for custom damage atm.
rawset(_G, "TakeSamusEnergy", function(p, energy, noflinch, inflictor, source) 
	if not tonumber(energy)
	or not (p and p.mo and p.mo.valid and p.mo.health and YouAreSamus(p.mo) )
	return false
	end
	
	p.beampain = 4
	p.visorclosein = 9
	p.mo.sams_shineframe = 0
	
		if p.sam_screwattacking
			p.aiming = 0
			CancelScrewAttack(p.mo,p)
		end

		if not (p.sam_energy-(energy*8/p.gravityrd) <= 0)
			p.sam_energy = $-energy*8/p.gravityrd		
			if not noflinch
			P_DoPlayerPain(s.player, i, so)
			P_PlayerEmeraldBurst(s.player)
			P_PlayerFlagBurst(s.player)
			else
			if not p.powers[pw_flashing] p.powers[pw_flashing] = 70 end
			end
			
			if (energy > 55)
			HighPain(s)
			else
			P_PlayRinglossSound(s)
			end
			
			P_PlayerWeaponAmmoBurst(s.player)
		
		else
		P_KillMobj(p.mo, inflictor, source)
		end
		return true
end)

--The great elseif tower for MobjDamage. Really would've been nice if I knew about tables and local references back then, but oh well.
addHook("MobjDamage", function(s, i, so, dmg, dmgtype)
  if not s.player or (s.player and s.player.powers[pw_carry] == CR_NIGHTSMODE)
    return
  elseif (so and ((so.type == MT_METROID or so.type == MT_SUPERMETROID) or so.skin == "duke")) --Let duke do his own thing.
    return true
  elseif (i and i.waverstunned and (i.flags & MF_ENEMY))
    return true
  else
  local p = s.player
  	if p.samtoken and not YouAreSamus(s)
	and not (p.pflags & PF_FINISHED)
	p.samtoken = 0
	P_SamFP(p, PAL_NUKE, 3)
	print("\x85"+p.name+" got hit and lost the emerald tokens...")
	end
	if not YouAreSamus(s) and so and so.player and YouAreSamus(so)
	   so.player.sam_hithud = 18
	   if not p.samshieldhp or (p.samshieldhp and (p.samshieldhp < 0)) or P_PlayerInPain(p)
	      p.samshieldhp = 3
	   end
	   if s.skin == "duke" and not so.player.rings
	   and so.player.duke and so.player.duke.health and (so.player.duke.health > 30)
	      so.player.rings = 1 --Give Duke a ring so he doesn't get instakilled.
	   elseif s.skin == "tailsguy" and not so.player.rings
	   and so.player.tgvars and so.player.tgvars.health and (so.player.tgvars.health > 30)
	      so.player.rings = 1 --Give TailsGuy a ring so he doesn't get instakilled.
	   end
	   if i
		if (i.type == MT_PBSHOT)
			if not (p.rings <= 0) or p.powers[pw_shield]
			P_AddPlayerScore(so.player, 3*8/so.player.samcmult)
				if p.powers[pw_shield] and p.samshieldhp and p.samshieldhp > 1
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
				S_StartSound(s, sfx_shldls)
				p.samshieldhp = $-1
				elseif p.powers[pw_shield]
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 70 end
				P_RemoveShield(p)
				p.samshieldhp = 3
				S_StartSound(s, sfx_shldls)
				elseif (p.rings >= 2)
				P_PlayRinglossSound(s)
				p.rings = $-2
				
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end

				elseif not s.saniccdflinch
				P_SamFP(p, 4, PAL_NUKE)
				p.rings = 0
				s.saniccdflinch = 300
				P_DoPlayerPain(p, so, i)
				P_PlayerRingBurst(p, 6)
				P_PlayRinglossSound(s)

				else
				p.rings = 0
				P_PlayRinglossSound(s)
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 P_SamFP(p, 4, PAL_NUKE) end
				end
			P_Thrust(s, i.angle, 2*FRACUNIT)
			return true
			else
			print(so.player.name+" killed "+p.name+" with the Power Beam!")
			P_AddPlayerScore(so.player, 53*8/so.player.samcmult)
			p.pflags = $ & ~PF_JUMPED & ~PF_SPINNING
			P_KillMobj(s, i, so)
			if s and s.valid and not s.health s.state = S_PLAY_DEAD end
			return true
			end
		elseif (i.type == MT_PBCHARGESHOT) 
			if so and so.player and so.player.score != nil
				if (so.player.score >= 20)
				so.player.score = $-20
				end
			end			
		elseif (i.type == MT_SPSHOT)
			if not (p.rings <= 0) or p.powers[pw_shield]
			P_AddPlayerScore(so.player, 9*8/so.player.samcmult)
				if p.powers[pw_shield] and p.samshieldhp and p.samshieldhp > 2
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
				S_StartSound(s, sfx_shldls)
				p.samshieldhp = $-2
				elseif p.powers[pw_shield]
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 55 end
				P_RemoveShield(p)
				p.samshieldhp = 3
				S_StartSound(s, sfx_shldls)
				elseif (p.rings > 4)
				P_PlayRinglossSound(s)
				p.rings = $-5
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
				elseif not s.saniccdflinch
				P_SamFP(p, 4, PAL_NUKE)
				p.rings = 0
				s.saniccdflinch = 300
				P_DoPlayerPain(p, so, i)
				P_PlayerRingBurst(p, 5)
				P_PlayRinglossSound(s)
				else
				p.rings = 0
				P_PlayRinglossSound(s)
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 P_SamFP(p, 4, PAL_NUKE) end
				end
			P_Thrust(s, i.angle, 7*FRACUNIT)
			return true
			else
			print(so.player.name+" killed "+p.name+" with the Spazer Beam!")
			P_AddPlayerScore(so.player, 59*8/so.player.samcmult)
			p.pflags = $ & ~PF_JUMPED & ~PF_SPINNING
			P_KillMobj(s, i, so)
			if s and s.valid and not s.health s.state = S_PLAY_DEAD end
			return true
			end
		elseif (i.type == MT_WVSHOT)
			if not (p.rings <= 0) or p.powers[pw_shield]
			P_AddPlayerScore(so.player, 12*8/so.player.samcmult)
				if p.powers[pw_shield] and p.samshieldhp and p.samshieldhp > 2
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
				S_StartSound(s, sfx_shldls)
				p.samshieldhp = $-2
				elseif p.powers[pw_shield]
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 end
				P_RemoveShield(p)
				p.samshieldhp = 3
				S_StartSound(s, sfx_shldls)
				elseif (p.rings > 5)
				P_PlayRinglossSound(s)
				p.rings = $-6
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 4 end
				elseif not s.saniccdflinch
				P_SamFP(p, 4, PAL_NUKE)
				p.rings = 0
				s.saniccdflinch = 300
				P_DoPlayerPain(p, so, i)
				P_PlayRinglossSound(s)
				P_PlayerRingBurst(p, 4)
				else
				p.rings = 0
				P_PlayRinglossSound(s)
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 P_SamFP(p, 4, PAL_NUKE) end
				end
			s.momx = $*3/5
			s.momy = $*3/5
			s.momz = $*2/3
			return true
			else
			print(so.player.name+" killed "+p.name+" with the Wave Beam!")
			P_AddPlayerScore(so.player, 62*8/so.player.samcmult)
			p.pflags = $ & ~PF_JUMPED & ~PF_SPINNING
			P_KillMobj(s, i, so)
			if s and s.valid and not s.health s.state = S_PLAY_DEAD end
			return true
			end
		elseif (i.type == MT_ICSHOT)
			if not (p.rings <= 0) or p.powers[pw_shield]
			P_AddPlayerScore(so.player, 11*8/so.player.samcmult)
				if p.powers[pw_shield] and p.samshieldhp and p.samshieldhp > 2
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
				S_StartSound(s, sfx_shldls)
				p.samshieldhp = $-2
				elseif p.powers[pw_shield]
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 end
				P_RemoveShield(p)
				p.samshieldhp = 3
				S_StartSound(s, sfx_shldls)
				elseif (p.rings > 6)
				P_PlayRinglossSound(s)
				p.rings = $-7
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
				elseif not s.saniccdflinch
				P_SamFP(p, 4, PAL_NUKE)
				p.rings = 0
				s.saniccdflinch = 300
				P_DoPlayerPain(p, so, i)
				P_PlayRinglossSound(s)
				P_PlayerRingBurst(p, 3)
				else 
				p.rings = 0
				P_PlayRinglossSound(s)
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 P_SamFP(p, 4, PAL_NUKE) end
				end
			s.momx = $*20/21
			s.momy = $*20/21
			s.momz = $*20/21
			P_Thrust(s, i.angle, FRACUNIT)
			return true
			else
			print(so.player.name+" killed "+p.name+" with the Ice Beam!")
			P_AddPlayerScore(so.player, 61*8/so.player.samcmult)
			p.pflags = $ & ~PF_JUMPED & ~PF_SPINNING
			P_KillMobj(s, i, so)
			if s and s.valid and not s.health s.state = S_PLAY_DEAD end
			return true
			end
		elseif (i.type == MT_PLSHOT)
			if not (p.rings <= 0) or p.powers[pw_shield]
			P_AddPlayerScore(so.player, 14*8/so.player.samcmult)
				if p.powers[pw_shield]
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 30 end
				P_RemoveShield(p)
				p.samshieldhp = 3
				S_StartSound(s, sfx_shldls)
				elseif (p.rings > 6)
				p.rings = $-7
				P_PlayRinglossSound(s)
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
				elseif not s.saniccdflinch
				P_SamFP(p, 4, PAL_NUKE)
				p.rings = 0
				s.saniccdflinch = 300
				P_DoPlayerPain(p, so, i)
				P_PlayerRingBurst(p, 3)
				P_PlayRinglossSound(s)
				else 
				p.rings = 0
				P_PlayRinglossSound(s)
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 P_SamFP(p, 4, PAL_NUKE) end
				end
			P_Thrust(s, i.angle, 2*FRACUNIT)
			return true
			else
			print(so.player.name+" killed "+p.name+" with the Plasma Beam!")
			P_AddPlayerScore(so.player, 64*8/so.player.samcmult)
			p.pflags = $ & ~PF_JUMPED & ~PF_SPINNING
			P_KillMobj(s, i, so)
			if s and s.valid and not s.health s.state = S_PLAY_DEAD end
			return true
			end
		elseif (i.type == MT_SAMMISSILE)
			if not (p.rings <= 0) or p.powers[pw_shield]
			P_AddPlayerScore(so.player, 20*8/so.player.samcmult)
			P_SamFP(p, PAL_NUKE, 2) 
				if p.powers[pw_shield]
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 35 end
				P_RemoveShield(p)
				p.samshieldhp = 3
				S_StartSound(s, sfx_shldls)
				elseif (p.rings > 7)
				p.rings = $-8
				P_PlayRinglossSound(s)
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
				elseif not s.saniccdflinch
				P_SamFP(p, 4, PAL_NUKE)
				p.rings = 0
				s.saniccdflinch = 300
				P_DoPlayerPain(p, so, i)
				P_PlayRinglossSound(s)
				P_PlayerRingBurst(p, 4)
				else
				P_PlayRinglossSound(s)
				p.rings = 0
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 P_SamFP(p, 4, PAL_NUKE) end
				end
			P_Thrust(s, i.angle, 6*FRACUNIT)
			return true
			else
			print(so.player.name+" barraged "+p.name+" to death with missiles")
			P_AddPlayerScore(so.player, 70*8/so.player.samcmult)
			p.pflags = $ & ~PF_JUMPED & ~PF_SPINNING
			P_KillMobj(s, i, so)
			if s and s.valid and not s.health s.state = S_PLAY_DEAD end
			return true
			end
		elseif (i.type == MT_SAMMORPHBOMB) or (i.type == MT_SAMMBOP)
			if not (p.rings <= 0) or p.powers[pw_shield]
			P_PlayerFlagBurst(p)
			P_AddPlayerScore(so.player, 11*8/so.player.samcmult)
				if p.powers[pw_shield] and p.samshieldhp and p.samshieldhp > 2
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
				S_StartSound(s, sfx_shldls)
				p.samshieldhp = $-2
				elseif p.powers[pw_shield]
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 end
				P_RemoveShield(p)
				p.samshieldhp = 3
				S_StartSound(s, sfx_shldls)
				elseif (p.rings > 4)
				P_PlayRinglossSound(s)
				p.samshieldhp = 3
				p.rings = $-5
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
				elseif not s.saniccdflinch
				P_SamFP(p, 4, PAL_NUKE)
				p.rings = 0
				s.saniccdflinch = 300
				P_DoPlayerPain(p, so, i)
				p.samshieldhp = 3
				P_PlayRinglossSound(s)
				else 
				p.rings = 0
				P_PlayRinglossSound(s)
				p.samshieldhp = 3
				if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 P_SamFP(p, 4, PAL_NUKE) end
				end
			P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -11*FRACUNIT)
			return true
			else
			print(so.player.name+" bombed "+p.name+" to death")
			P_AddPlayerScore(so.player, 61*8/so.player.samcmult)
			p.pflags = $ & ~PF_JUMPED & ~PF_SPINNING
			P_KillMobj(s, i, so)
			if s and s.valid and not s.health s.state = S_PLAY_DEAD end
			return true
			end
		elseif (i.type == MT_HBSHOT) or (i.hypered and (i.type == MT_SPAZERSHOCK))
			s.state = S_PLAY_PAIN
			P_AddPlayerScore(so.player, 30*8/so.player.samcmult)
			P_SetObjectMomZ(s, 9*FRACUNIT)
			p.samshieldhp = 3
			P_SamFP(p, PAL_MIXUP, 11)
			P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50*FRACUNIT)
		elseif i and ( (i.type == MT_SAMPOWERBOMB) and ((i.phase == nil) or (i.phase and (i.phase < 2))) )
		or ( (i.sam_deathball or i.player and i.player.sam_shinesparkfly) and YouAreSamus(i) )
			P_RemoveShield(p)
			p.samshieldhp = 3
			P_AddPlayerScore(so.player, 100*8/so.player.samcmult)
			P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -35*FRACUNIT)
		end
	   end
	elseif not (YouAreSamus(s))	
	and so and (so.omegacharge or so.omega and so.omega.omegacharge)
			P_DoPlayerPain(s.player, i, so)
			S_StartSound(s, sfx_bowl)
			P_PlayRinglossSound(s)
			P_SamFP(s.player, PAL_NUKE, 6)
			s.myorammer = true
			s.momz = 20*FRACUNIT
			P_InstaThrust(s, R_PointToAngle2(s.x, s.y, so.x, so.y), -75*FRACUNIT)
			so.rammedher = true
			return true
	elseif (YouAreSamus(s))
		if dmgtype and dmgtype == DMG_FIRE
		and (p.sam_gravitysuit and p.sam_gravitysuit >= 2)
		and ((i and i.flags & MF_SCENERY) or not (so or i)) 
		return true
		end
		p.beampain = 4
		p.visorclosein = 9
		s.sams_shineframe = 0
  		if p.samtoken and not (p.pflags & PF_FINISHED)
			if p.sam_gravitysuit and P_RandomRange(0,1)
			P_SamFP(p, PAL_RECYCLE, 3)
			CONS_Printf(p, "\x82"+"The Varia Suit protected you from losing your tokens!")
			else
			p.samtoken = 0
			P_SamFP(p, PAL_NUKE, 3)
			print("\x85"+p.name+" got hit and lost the emerald tokens...")
			end
		end
		if so and so.valid --Show where you've got hit from
			s.sam_hitwarn = 19
			s.sam_hitwarnang = nil
			s.sam_hitwarntarget = so
			if so.player
			s.sam_unstuck = 2
			end
		end
		if p.sam_screwattacking --Assuming your Screw Attack got pierced, cancel it.
			p.aiming = 0
			CancelScrewAttack(s,p)
		end
		if not (so and so.player) and s.valid and s.sambsblchargelvl and p.sammorphed
			s.sambsblchargelvl = 0
			p.sams_firecd = 0
			p.sams_c1cd = 0
		end
		if so and so.valid and ((so.type == MT_METROIDBOSS) or (so.type == MT_METROIDPART) or (so.type == MT_METROIDSLASH))
		and (so and (so.omegacharge or so.omega and so.omega.omegacharge) or (so.type == MT_METROIDSLASH))
			if (so.type == MT_METROIDSLASH) --These stun you for little damage.
				if SAM_Damage(p, 15)
				P_DoPlayerPain(p, i, so)
				s.momz = 0
				A_samquake(p.mo, 20*FRACUNIT, 12, 50*FRACUNIT)
				P_SamFP(p, PAL_RECYCLE, 2)
				s.angle = R_PointToAngle2(s.x, s.y, so.x, so.y)
				p.aiming = 0
				p.powers[pw_flashing] = 8
				p.powers[pw_nocontrol] = 18
				S_StartSound(s, sfx_cmol)
				P_InstaThrust(s, s.angle, -24*FRACUNIT)
				s.sam_systemreboot = 24
					if not p.sam_sensitive
					p.viewrollangle = P_RandomRange(-40, 40)*ANG1
					end
				p.sams_shotcd = 28
				p.sams_mshotcd = 22
				P_PlayRinglossSound(s)
				p.sam_energy = max($-15*8/p.gravityrd, 1)
					if so.target and so.target.valid
					so.target.omegarng = 1
					so.target.omegarngset = true			
					end
				return true
				else
				P_KillMobj(s, i, so)
				return true
				end				
			else
				P_DoPlayerPain(s.player, i, so)
				HighPain(s)
				P_SamFP(s.player, PAL_NUKE, 6)
				s.myorammer = true
				s.momz = 17*FRACUNIT
				s.angle = R_PointToAngle2(s.x, s.y, so.x, so.y)
				P_InstaThrust(s, s.angle, -75*FRACUNIT)
				so.rammedher = true
				p.beampain = 6
				s.sams_shineframe = 0
				return true
			end
		elseif s.myorammer --Consequence damage of getting rammed
			s.myorammer = nil
			if SAM_Damage(p, 65)
				P_DoPlayerPain(s.player, i, so)
				P_PlayRinglossSound(s)
				p.sam_energy = max($-65*8/p.gravityrd, 1)
				return true
			elseif (p.sam_energy > 30)
				P_DoPlayerPain(s.player, i, so)
				P_PlayRinglossSound(s)
				p.sam_energy = 1 --Showing mercy, especially for 0% runners
				return true
			else
				P_KillMobj(s, i, so)
				return true
			end

		elseif (so and so.type == MT_PZWAVEHOMER) --These heavily stun you. Steer clear
			if SAM_Damage(p, 31)
				P_DoPlayerPain(p, i, so)
				s.momz = 0
				A_samquake(p.mo, 20*FRACUNIT, 9, 50*FRACUNIT)
				P_SamFP(p, PAL_RECYCLE, 5)
				s.angle = R_PointToAngle2(s.x, s.y, so.x, so.y)
				p.aiming = 0
				p.powers[pw_flashing] = 30
				p.powers[pw_nocontrol] = 8
				S_StartSound(s, sfx_cmol)
				P_InstaThrust(s, s.angle, -44*FRACUNIT)
				s.sam_systemreboot = 70
				s.sam_wavestunned = 70
				P_PlayRinglossSound(s)
				p.sam_energy = max($-31*8/p.gravityrd, 1)
					if so and so.valid
					P_KillMobj(so)
					end
					for m in mobjs.iterate(mobjs) --Don't let yourself get combo'd, that's mean.
						if m and m.valid and (m.type == MT_PZWAVEHOMER)
						and (FixedHypot(s.x-m.x, s.y-m.y) < 5000*FRACUNIT)
						m.ghs = P_SpawnGhostMobj(m)
						m.ghs.tics = 22 m.ghs.fuse = 22 m.ghs.destscale = 99*FRACUNIT
					//	P_KillMobj(m)
						m.state = S_NULL
						end
					end
				return true
			else
				P_KillMobj(s, i, so)
				return true
			end
		elseif i and i.darkhyper or (i and so and (so.type == MT_PZBOSS)) -- Phazon Weaponry
			if (i.type == MT_PLSHOT) --Gatling Vortex.
					if SAM_Damage(p, 3)	
					
						if not (p.sam_energy-((12*8/p.gravityrd)) <= 0)
						p.sam_energy = $-(12*8/p.gravityrd)
							P_PlayRinglossSound(s)
							P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -6*FRACUNIT)
							if not p.powers[pw_flashing] p.powers[pw_flashing] = 5 end
							return true
						else
							p.sam_energy = 1 --Mercy shot
							if not p.powers[pw_flashing] p.powers[pw_flashing] = 105 end
						P_PlayRinglossSound(s)	
						P_SamFP(p, PAL_NUKE, 2)
						P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -14*FRACUNIT)
						return true
						end
					else
						P_KillMobj(s, i, so)
						return true
					end			
			elseif (i.type == MT_HBSHOT) or (i.hypered)
					if SAM_Damage(p, 30)	
						s.state = S_PLAY_PAIN
						s.sam_systemreboot = 70
						HighPain(s)
						s.myorammer = true
						if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					
						if not (p.sam_energy-((77*8/p.gravityrd)) <= 0)
							p.sam_energy = $-(77*8/p.gravityrd)
						else
							p.sam_energy = 1 --Mercy shot
						end
						P_SetObjectMomZ(s, 13*FRACUNIT)
						P_SamFP(p, PAL_MIXUP, 11)
						P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50*FRACUNIT)
						return true
					else
						P_KillMobj(s, i, so)
						return true
					end
			else //if (i.type == MT_SAMSUPERMISSILE) or i.phazondive
					if SAM_Damage(p, 30)	
					P_DoPlayerPain(p, i, so)
					P_PlayRinglossSound(s)
					P_SamFP(p, PAL_NUKE, 6)
						if not (p.sam_energy-((50*8/p.gravityrd)) <= 0)
							p.sam_energy = $-(50*8/p.gravityrd)
						else
							p.sam_energy = 1 --Mercy mechanic
						end					
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 5 end
					P_InstaThrust(s, s.angle+ANGLE_180, 30*FRACUNIT)
					return true
					else
					P_KillMobj(s, i, so)
					return true
					end
			end
		
		elseif i and (i.flags & (MF_ENEMY)) -- On second thought, a local function or table would've been so much better, but I'm too deep in now.
										--At the very least, this method gives the highest rate of easy customizability.
			if ((i.type == MT_MINUS) or (i.type == MT_BLUECRAWLA))
				if SAM_Damage(p, 26)
					P_DoPlayerPain(s.player, i, so)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					P_PlayerWeaponAmmoBurst(s.player)
					P_PlayRinglossSound(s)
					p.sam_energy = $-26*8/p.gravityrd
					return true
				else
					P_KillMobj(s, i, so)
					return true
				end
			elseif ((i.type == MT_UNIDUS) or (i.type == MT_BUGGLE) or (i.type == MT_FACESTABBER) or (i.type == MT_GSNAPPER))
				if SAM_Damage(p, 55)
				P_DoPlayerPain(s.player, i, so)
				P_PlayerEmeraldBurst(s.player)
				P_PlayerFlagBurst(s.player)
				P_PlayerWeaponAmmoBurst(s.player)
				P_PlayRinglossSound(s)
				p.sam_energy = $-55*8/p.gravityrd
				return true
				else
				P_KillMobj(s, i, so)
				return true
				end
			elseif ( (i.type == MT_VULTURE) or (i.type == MT_FACESTABBER) or (i.type == MT_UNIDUS) or (i.type == MT_CYBRAKDEMON))
				if SAM_Damage(p, 45)
				P_DoPlayerPain(s.player, i, so)
				P_PlayerEmeraldBurst(s.player)
				P_PlayerFlagBurst(s.player)
				P_PlayRinglossSound(s)
				p.sam_energy = $-45*8/p.gravityrd
				return true
				else
				P_KillMobj(s, i, so)
				return true
				end
			elseif i.customsamusdamage --Deal custom damage to Samus.
				TakeSamusEnergy(s.player, i.customsamusdamage, i.customsamusflinch, i, so)
				return true				
			else --Non specified enemies.
				if SAM_Damage(p, 38)
					P_DoPlayerPain(s.player, i, so)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					P_PlayerWeaponAmmoBurst(s.player)
					P_PlayRinglossSound(s)
					p.sam_energy = $-38*8/p.gravityrd
					return true
				else
					P_KillMobj(s, i, so)
					return true
				end
			end
		elseif i and so and so.player
			if (YouAreSamus(so))
				so.player.sam_hithud = 18
			end
			if not so.player.samcmult
				so.player.samcmult = 8
			end
			if s.sam_emstress == nil
				s.sam_emstress = 0
			elseif (s.sam_emstress >= 220)
				P_PlayerFlagBurst(p)
				P_PlayerEmeraldBurst(p)
				P_PlayerWeaponAmmoBurst(p)
				p.samhands = 80
				s.sam_emstress = 0 --Drop all your stuff, you've taken too many shots.
			end
			if i
				if i.player and i.sam_deathball and i.player.sam_shinesparkfly and YouAreSamus(i)
					if not (p.sam_energy-((200*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					print(so.player.name+" bashed "+p.name+" with a Death Ball shinespark! It's a miracle they're alive!")
					P_StartQuake(16*FRACUNIT, 20)
					P_PlayerFlagBurst(p)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					
					InflictWaveOverLoad(s, 120, so)
					
					for d = 1,8 --Even I couldn't stand the old code for this one...
						local ghs = P_SpawnMobj(s.x+FixedMul(-180*FRACUNIT, cos(s.angle+(ANGLE_45*d))), s.y+FixedMul(-180*FRACUNIT, sin (s.angle+(ANGLE_45*d))), s.z+FixedMul(FRACUNIT*20, (P_MobjFlip(s)*s.scale)), MT_SAMMORPHBOMB)
						if ghs and ghs.valid
							ghs.flags = $|MF_GRENADEBOUNCE|MF_BOUNCE & ~MF_NOGRAVITY
							ghs.target = i
							ghs.flags2 = $|MF2_DONTDRAW
							S_StopSound(ghs)
							if (ghs.floorz > s.floorz+140*FRACUNIT) --Oh, geez, don't clip up there.
								ghs.state = S_NULL
							end
						end
						local ghs = P_SpawnMobj(s.x+FixedMul(-180*FRACUNIT, cos(s.angle+(ANGLE_45*d))), s.y+FixedMul(-180*FRACUNIT, sin (s.angle+(ANGLE_45*d))), s.z+FixedMul(FRACUNIT*20, (P_MobjFlip(s)*s.scale)), MT_MINIFIRE)
						if ghs and ghs.valid
							ghs.flags = $ & ~MF_NOGRAVITY
							ghs.target = i
							ghs.morning = 140
							S_StopSound(ghs)
							if (ghs.floorz > s.floorz+140*FRACUNIT)
								ghs.state = S_NULL
							end
						end
						local ghs = P_SpawnMobj(s.x+FixedMul(-180*FRACUNIT, cos(s.angle+(ANGLE_45*d))), s.y+FixedMul(-180*FRACUNIT, sin (s.angle+(ANGLE_45*d))), s.z+FixedMul(FRACUNIT*20, (P_MobjFlip(s)*s.scale)), MT_THOK)
						ghs.sprite = SPR_MPR9
						ghs.frame = 26|FF_FULLBRIGHT|TR_TRANS10
						ghs.scale = 160000
						ghs.destscale = $*99					
					end
					
					P_AddPlayerScore(so.player, 200*8/so.player.samcmult)
					DeathBallImpact(s, i)
					P_SamFP(p, PAL_NUKE, 7)
					p.sam_energy = $-(200*8/p.gravityrd)*8/so.player.samcmult
					P_InstaThrust(s, i.angle, 64*FRACUNIT)
					i.player.sam_shinesparkfly = 0
					i.momx = 0
					i.momy = 0
					HighPain(s)
					SamPlayerPrism(s,p,so,true,5)
					S_StartSound(i, sfx_sprnh)
					S_StartSound(s, sfx_bkpoof)
					S_StartSound(nil, sfx_nxbump)
					S_StartSound(nil, sfx_nxbump)
					S_StartSound(nil, sfx_nxbump)
					return true
					else
					DeathBallImpact(s, i)
					print(so.player.name+" annihilated "+p.name+" with a Death Ball shinespark! They couldn't be more dead if they tried!")
					P_AddPlayerScore(so.player, 250*8/so.player.samcmult)
					s.dsp = P_SpawnMobj(s.x, s.y, s.z+s.height, MT_THOK)
					s.dsp.height = 40*FRACUNIT
					s.dsp.eflags = s.eflags
					s.dsp.target = s
					s.dsp.sprite = SPR_MPR9
					s.dsp.frame = 26|FF_FULLBRIGHT|TR_TRANS10
					s.dsp.scale = 160000
					s.dsp.deathbolt = true
					S_StartSound(s, sfx_bkpoof)
					SamPlayerPrism(s,p,so,true,5)
					P_KillMobj(s, i, so)
					return true
					end
				elseif i.player and i.sam_deathball and not i.player.sam_shinesparkfly and YouAreSamus(i)
					if not (p.sam_energy-((120*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_StartQuake(11*FRACUNIT, 11)
					P_PlayerFlagBurst(p)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					P_AddPlayerScore(so.player, 120*8/so.player.samcmult)
					P_SamFP(p, PAL_NUKE, 5)

					InflictWaveOverLoad(s, 60, so)
					DeathBallImpact(s, i)
					
					S_StartSound(s, sfx_bkpoof)
					s.dsp = P_SpawnMobj(s.x, s.y, s.z+s.height, MT_THOK)
					s.dsp.height = 40*FRACUNIT
					s.dsp.eflags = s.eflags
					s.dsp.target = s
					s.dsp.sprite = SPR_MPR9
					s.dsp.frame = 26|FF_FULLBRIGHT|TR_TRANS10
					s.dsp.scale = 160000
					s.dsp.deathbolt = true
					p.sam_energy = $-120*8/p.gravityrd
					HighPain(s)
					P_Thrust(s, i.angle, 30*FRACUNIT)
					SamPlayerPrism(s,p,so,true,2)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 19 end
					return true
					else
					print(so.player.name+" annihilated "+p.name+" with the Death Ball!")
					DeathBallImpact(s, i)
					s.dsp = P_SpawnMobj(s.x, s.y, s.z+s.height, MT_THOK)
					s.dsp.height = 40*FRACUNIT
					s.dsp.eflags = s.eflags
					s.dsp.target = s
					s.dsp.sprite = SPR_MPR9
					s.dsp.frame = 26|FF_FULLBRIGHT|TR_TRANS10
					s.dsp.scale = 160000
					s.dsp.deathbolt = true
					SamPlayerPrism(s,p,so,true,2)
					P_AddPlayerScore(so.player, 120*8/so.player.samcmult)
					S_StartSound(s, sfx_bkpoof)
					P_KillMobj(s, i, so)
					return true
					end
				elseif i.player and i.player.sam_shinesparkfly and YouAreSamus(i)
					if not (p.sam_energy-((98*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					print(so.player.name+" shoulder bashed "+p.name+" with a Shinespark tackle!")
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					P_AddPlayerScore(i.player, 98*8/so.player.samcmult)
					p.sam_energy = $-(98*8/p.gravityrd)*8/so.player.samcmult
					P_InstaThrust(s, i.angle, 44*FRACUNIT)
					i.player.sam_shinesparkfly = 0
					i.momx = 0
					i.momy = 0
					HighPain(s)
					i.state = S_PLAY_SPRING
					P_SetObjectMomZ(i, 4*FRACUNIT*i.player.sampers)
					P_SamFP(i.player, PAL_NUKE, 2)
					SamPlayerPrism(s,p,so,true,2)
					S_StartSound(i, sfx_sprnh)
					S_StartSound(nil, sfx_nxbump)
					S_StartSound(nil, sfx_nxbump)
					S_StartSound(nil, sfx_nxbump)
					return true
					else
					print(so.player.name+" rammed "+p.name+" into outter space with a Shinespark!")
					P_AddPlayerScore(i.player, 148*8/so.player.samcmult)
					i.player.sam_shinesparkfly = 0
					i.momx = 0
					i.momy = 0
					i.state = S_PLAY_SPRING
					P_SetObjectMomZ(i, 4*FRACUNIT*i.player.sampers)
					P_SamFP(i.player, PAL_NUKE, 2)
					S_StartSound(i, sfx_sprnh)
					SamPlayerPrism(s,p,so,true,2)
					P_KillMobj(s, i, so)
					return true
					end
				elseif i.player and i.player.sam_screwattacking and YouAreSamus(i)
					if not (p.sam_energy-((75*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					P_AddPlayerScore(i.player, 75*8/so.player.samcmult)
					P_InstaThrust(s, i.angle, 16*FRACUNIT)
					P_InstaThrust(i, i.angle, -5*FRACUNIT)
					SamPlayerPrism(s,p,so,true,1)
					HighPain(s)
					p.sam_energy = $-(75*8/p.gravityrd)*8/so.player.samcmult
					return true
					else
					print(so.player.name+" shred "+p.name+" to pieces with the Screw Attack!")
					P_AddPlayerScore(i.player, 125*8/so.player.samcmult)
					SamPlayerPrism(s,p,so,true,1)
					P_KillMobj(s, i, so)
					P_InstaThrust(i, i.angle, -5*FRACUNIT)
					return true
					end
					i.momz = 0
					if not P_IsObjectOnGround(i)
						i.player.sam_walljumpsound = 5
						i.player.sam_walljumping = 13
						i.state = S_PLAY_ROLL
					end
				elseif i.player and i.player.sams_screwattackcd and YouAreSamus(i)
					if not (p.sam_energy-((46*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					P_PlayRinglossSound(s)
					P_AddPlayerScore(i.player, 46*8/so.player.samcmult)
					p.sam_energy = $-(46*8/p.gravityrd)*8/so.player.samcmult
					SamPlayerPrism(s,p,so,false,2)
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Screw Attack's impact wave!")
					P_AddPlayerScore(i.player, 96*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif i.player and i.player.bsblboostattack and YouAreSamus(i)
					if not (p.sam_energy-((30*8/p.gravityrd)*8/so.player.samcmult) <= 0) or not G_GametypeHasSpectators()
						P_DoPlayerPain(p, i, so)
						P_PlayerEmeraldBurst(p)
						P_PlayerFlagBurst(p)
						P_PlayerWeaponAmmoBurst(p)
						P_PlayRinglossSound(s)
						p.samhands = 80
						if not p.powers[pw_flashing] p.powers[pw_flashing] = 12 end
						P_Thrust(s, i.angle, 11*FRACUNIT)
						P_SetObjectMomZ(s, -2*FRACUNIT, true)
						
						if G_GametypeHasSpectators() --The tackle deals damageless knockback in coop.
							--Steal missile tank with the Boost Ball!
							if (p.sammissilesmax and p.sammissilesmax > 15) 
							and (i.player.sammissilesmax and i.player.sammissilesmax < 246)
							local rng = P_RandomRange(0,100+p.sammissilesmax)
								if (rng > 90)
									p.sammissilesmax = $-5
									P_SamFP(p, PAL_NUKE, 7)
									SamusMission(s, "\x85  MISSILES STOLEN!", nil, nil, 3, 0, false)
									S_StartSound(s, sfx_dmpain)	
									
									P_SamFP(i.player, PAL_MIXUP, 9)
									i.player.sammissilesmax = $+5
									i.player.sammissiles = $+5
									CONS_Printf(i.player, "You've stolen \x84Missiles!\x80 Press FIRE to shoot them, but watch your ammo!")
									S_StartSound(i, sfx_spwup)
									i.player.sammissiles = $+5
									NewSamPickup(i, "MTNKD0", 55355, nil, nil)
									ItemGetPopup(i.player, 80, SKINCOLOR_CRIMSON, "Missiles", 70000)	
								end
							end
						P_AddPlayerScore(i.player, 30*8/so.player.samcmult)
						p.sam_energy = $-(30*8/p.gravityrd)*8/so.player.samcmult
						SamPlayerPrism(s,p,so,true,2)
						SamPlayerPrism(s,p,so,false,1)
						if p.powers[pw_flashing] and (p.powers[pw_flashing] > 12) p.powers[pw_flashing] = 12 end
						end
						
						return true
					else
						print(so.player.name+" bonked "+p.name+" to death as a heavy metal ball!")
						SamPlayerPrism(s,p,so,true,2)
						SamPlayerPrism(s,p,so,false,1)
						P_AddPlayerScore(i.player, 80*8/so.player.samcmult)
						P_KillMobj(s, i, so)
						return true
					end
				elseif (i.type == MT_PBSHOT)
					if SAM_Damage(p, 3)
						P_PlayRinglossSound(s)
						P_AddPlayerScore(so.player, 3)
						s.sam_emstress = $+33
						p.sam_energy = $-3*8/p.gravityrd
						if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
						P_Thrust(s, i.angle, 2*FRACUNIT)
						return true
					else
						print(so.player.name+" killed "+p.name+" with the Power Beam!")
						P_AddPlayerScore(so.player, 53)
						P_KillMobj(s, i, so)
						return true
					end
				elseif (i.type == MT_SPSHOT)
					if not (p.sam_energy-((9*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayRinglossSound(s)
					s.sam_emstress = $+80
					P_AddPlayerScore(so.player, 9*8/so.player.samcmult)
					p.sam_energy = $-(9*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					P_Thrust(s, i.angle, 222000)
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Spazer Beam!")
					P_AddPlayerScore(so.player, 59*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_WVSHOT)
					if not (p.sam_energy-((12*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayRinglossSound(s)
					P_AddPlayerScore(so.player, 12*8/so.player.samcmult)
					p.sam_energy = $-(12*8/p.gravityrd)*8/so.player.samcmult
					s.sam_systemreboot = 7
					s.sam_emstress = $+90
					s.momx = $*3/5
					s.momy = $*3/5
					s.momz = $*2/3
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
						if s.valid and s.sambsblchargelvl and p.sammorphed
							s.sambsblchargelvl = 0
							p.sams_firecd = 0
							p.sams_c1cd = 0
						end
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Wave Beam!")
					P_AddPlayerScore(so.player, 62*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_ICSHOT)
					if not (p.sam_energy-((11*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayRinglossSound(s)
					s.sam_emstress = $+130
					P_AddPlayerScore(so.player, 11*8/so.player.samcmult)
					p.sam_energy = $-(11*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					s.momx = $*20/21
					s.momy = $*20/21
					s.momz = $*20/21
					P_Thrust(s, i.angle, FRACUNIT)
						if s.valid and s.sambsblchargelvl and p.sammorphed
							s.sambsblchargelvl = 0
							p.sams_firecd = 0
							p.sams_c1cd = 0
						end
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Ice Beam!")
					P_AddPlayerScore(so.player, 61*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PLSHOT) and not i.pierced and not i.gattlingvortex
					if not (p.sam_energy-((14*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayRinglossSound(s)
					s.sam_emstress = $+90
					P_AddPlayerScore(so.player, 14*8/so.player.samcmult)
					p.sam_energy = $-(14*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					P_Thrust(s, i.angle, 2*FRACUNIT)
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Plasma Beam!")
					P_AddPlayerScore(so.player, 64*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PLSHOT) and i.gattlingvortex and not i.pierced
					if not (p.sam_energy-((15*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayRinglossSound(s)
					s.sam_emstress = $+90
					P_AddPlayerScore(so.player, 15*8/so.player.samcmult)
					p.sam_energy = $-(15*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
					P_Thrust(s, i.angle, 2*FRACUNIT)
					return true
					else
					print(p.name+" got incinerated by "+so.player.name+"'s plasma vortex!")
					P_AddPlayerScore(so.player, 65*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PLSHOT) and i.pierced
					if not (p.sam_energy-((7*8/p.gravityrd))*8/so.player.samcmult <= 0)
					P_PlayRinglossSound(s)
					s.sam_emstress = $+70
					P_AddPlayerScore(so.player, 7*8/so.player.samcmult)
					p.sam_energy = $-(7*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					P_Thrust(s, i.angle, 2*FRACUNIT)
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Plasma piercing effect!")
					P_AddPlayerScore(so.player, 57*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_MINIFIRE)
					if not (p.sam_energy-((4*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					p.samhands = 80
					s.sam_emstress = $+40
					if so and so.player
					P_AddPlayerScore(so.player, 4*8/so.player.samcmult)
					end
					p.sam_energy = $-(4*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 1 end
					return true
					else
						if so and so.player
						print(so.player.name+" buried "+p.name+" in flames!")
						P_AddPlayerScore(so.player, 54*8/so.player.samcmult)
						P_KillMobj(s, i, so)
						else
						P_KillMobj(s, i, i)
						end
					return true
					end
				elseif (i.type == MT_HBSHOT) or (i.hypered and (i.type == MT_SPAZERSHOCK))
					if not (p.sam_energy-((67*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					s.state = S_PLAY_PAIN
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					HighPain(s)
					P_AddPlayerScore(so.player, 67*8/so.player.samcmult)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 95 end
					p.sam_energy = $-(67*8/p.gravityrd)*8/so.player.samcmult
					P_SetObjectMomZ(s, 9*FRACUNIT)
					P_SamFP(p, PAL_MIXUP, 11)
					P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50*FRACUNIT)
					print(p.name+" was blown away with "+so.player.name+"'s Hyper Beam!")
					return true
					else
					print(p.name+" got eradicated with "+so.player.name+"'s Hyper Beam!")
					if so.player.buffbottomtier
					P_AddPlayerScore(so.player, 117*8/so.player.samcmult)
					else
					P_AddPlayerScore(so.player, 67*8/so.player.samcmult)
					end
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PBCHARGESHOT)
					if not (p.sam_energy-((30*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayerFlagBurst(p)
					P_PlayRinglossSound(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					P_AddPlayerScore(so.player, 30*8/so.player.samcmult)
					p.sam_energy = $-(30*8/p.gravityrd)*8/so.player.samcmult
					P_Thrust(s, i.angle, 8*FRACUNIT)
					P_SamFP(p, PAL_MIXUP, 3)
					SamPlayerPrism(s,p,so,false,1)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					return true
					else
					print(so.player.name+" blasted "+p.name+" to death with the Charge Shot!")
					P_AddPlayerScore(so.player, 80*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SPCHARGESHOT)
					if not i.spazerdist
					i.spazerdist = 0
					end
					if not (p.sam_energy-((((40-i.spazerdist)*8/p.gravityrd))*8/so.player.samcmult) <= 0)
					P_PlayerFlagBurst(p)
					P_PlayRinglossSound(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,false,2)
					P_AddPlayerScore(so.player, ((40-i.spazerdist)*8/so.player.samcmult))
					p.sam_energy = $-((40-i.spazerdist)*8/p.gravityrd)*8/so.player.samcmult
					P_Thrust(s, i.angle, 12*FRACUNIT)
					P_SamFP(p, PAL_RECYCLE, 5)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					return true
					else
					print(so.player.name+" ended "+p.name+" with the Spazer Charge Shot!")
					P_AddPlayerScore(so.player, (90-i.spazerdist)*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SPCHARGECOMBO) or ((i.type == MT_SPAZERSHOCK) and i.mojo)
					if not (p.sam_energy-((64*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayerFlagBurst(p)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					print(so.player.name+" sent "+p.name+" flying with the Force Crasher!")
					p.samhands = 80
					HighPain(s)
					P_AddPlayerScore(so.player, 64*8/so.player.samcmult)
					p.sam_energy = $-(64*8/p.gravityrd)*8/so.player.samcmult
					P_SamFP(p, PAL_RECYCLE, 5)
					SamPlayerPrism(s,p,so,true,1)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 42 end
					return true
					else
					print(so.player.name+" turned "+p.name+" into an armored pancake with the Force Crasher!")
					P_AddPlayerScore(so.player, 114*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SPAZERSHOCK)
					if not (p.sam_energy-((56*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayerFlagBurst(p)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					HighPain(s)
					SamPlayerPrism(s,p,so,false,2)
					P_AddPlayerScore(so.player, 56*8/so.player.samcmult)
					p.sam_energy = $-(56*8/p.gravityrd)*8/so.player.samcmult
					P_SamFP(p, PAL_RECYCLE, 5)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 42 end
					return true
					else
					print(so.player.name+" blasted "+p.name+" to pieces with the Spazer Shockwave!")
					P_AddPlayerScore(so.player, 106*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_WVCHARGESHOT) and not i.bufferguard
					if not (p.sam_energy-((41*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayerFlagBurst(p)
					P_PlayRinglossSound(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					s.momx = $/3
					s.momy = $/3
					s.momz = $*5/7
					SamPlayerPrism(s,p,so,false,2)
					if not s.sam_stunimmune
						InflictWaveOverLoad(s, 54, so)
						s.sam_stunimmune = 140 --Give a bit of breathing room against spam.
					end
					P_AddPlayerScore(so.player, 41*8/so.player.samcmult)
					p.sam_energy = $-(41*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
						if s.valid and s.sambsblchargelvl and p.sammorphed
							s.sambsblchargelvl = 0
							p.sams_firecd = 0
							p.sams_c1cd = 0
						end
					return true
					else
					print(so.player.name+" electrocuted "+p.name+" with the Wave Charge Shot!")
					P_AddPlayerScore(so.player, 91*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_WVCHARGESHOT) and i.bufferguard
					if not (p.sam_energy-((46*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayerFlagBurst(p)
					P_PlayRinglossSound(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					InflictWaveOverLoad(s, 50, so)
					P_AddPlayerScore(so.player, 46*8/so.player.samcmult)
					P_SamFP(p, PAL_NUKE, 1)
					p.sam_energy = $-(46*8/p.gravityrd)*8/so.player.samcmult
					P_Thrust(s, i.angle, 22*FRACUNIT)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 27 end
						if s.valid and s.sambsblchargelvl and p.sammorphed
							s.sambsblchargelvl = 0
							p.sams_firecd = 0
							p.sams_c1cd = 0
						end
					return true
					else
					print(so.player.name+" fried "+p.name+" with the WaveBlast Buffer!")
					P_AddPlayerScore(so.player, 96*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_ICCHARGESHOT) and not i.icesummon
					if not (p.sam_energy-((38*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,false,2)
					P_PlayerWeaponAmmoBurst(p)
					P_PlayRinglossSound(s)
					P_AddPlayerScore(so.player, 38*8/so.player.samcmult)
					P_SamFP(p, PAL_MIXUP, 5)
					p.sam_energy = $-(38*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					if p.powers[pw_flashing] and (p.powers[pw_flashing] > 99) p.powers[pw_flashing] = 99 end
					return true
					else
					print(so.player.name+" shattered "+p.name+" with the Ice Charge Shot!")
					P_AddPlayerScore(so.player, 88*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_ICCHARGESHOT) and i.icesummon
					if not (p.sam_energy-((49*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,false,1)
					P_PlayerWeaponAmmoBurst(p)
					print(so.player.name+" hit "+p.name+" with Blizzard Burst's debris!")
					P_PlayRinglossSound(s)
					P_AddPlayerScore(so.player, 49*8/so.player.samcmult)
					P_SamFP(p, PAL_MIXUP, 5)
					p.sam_energy = $-(49*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					if p.powers[pw_flashing] and (p.powers[pw_flashing] > 99) p.powers[pw_flashing] = 99 end
					return true
					else
					print(p.name+" got buried alive in "+so.player.name+"'s blizzard debris!")
					P_AddPlayerScore(so.player, 99*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_ICCHARGECOMBO) 
					if not (p.sam_energy-((56*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					p.samhands = 80
					i.addsaldsalf = true
					HighPain(s)
					SamPlayerPrism(s,p,so,true,2)
					print(so.player.name+" hit "+p.name+" directly with the Blizzard Burst!")
					P_PlayerWeaponAmmoBurst(p)
					P_AddPlayerScore(so.player, 56*8/so.player.samcmult)
					P_SamFP(p, PAL_MIXUP, 10)
					p.sam_energy = $-(56*8/p.gravityrd)*8/so.player.samcmult
					P_Thrust(s, i.angle, 20*FRACUNIT)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					return true
					else
					print(so.player.name+" destroyed "+p.name+" with the Blizzard Burst!")
					P_AddPlayerScore(so.player, 106*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PLCHARGESHOT) and not i.pierced
					if not (p.sam_energy-((54*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,true,1)
					SamPlayerPrism(s,p,so,false,1)
					P_PlayerWeaponAmmoBurst(p)
					P_PlayRinglossSound(s)
					P_AddPlayerScore(so.player, 54*8/so.player.samcmult)
					P_SamFP(p, PAL_NUKE, 5)
					p.sam_energy = $-(54*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					if p.powers[pw_flashing] and (p.powers[pw_flashing] > 99) p.powers[pw_flashing] = 99 end
					P_Thrust(s, i.angle, 20*FRACUNIT)
					return true
					else
					print(so.player.name+" vaporized "+p.name+" with the Plasma Charge Shot!")
					P_AddPlayerScore(so.player, 105*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end

				elseif (i.type == MT_PLCHARGESHOT) and i.pierced
					if not (p.sam_energy-((28*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,false,1)
					P_PlayerWeaponAmmoBurst(p)
					P_PlayRinglossSound(s)
					P_AddPlayerScore(so.player, 28*8/so.player.samcmult)
					P_SamFP(p, PAL_NUKE, 5)
					p.sam_energy = $-(28*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					if p.powers[pw_flashing] and (p.powers[pw_flashing] > 99) p.powers[pw_flashing] = 99 end
					P_Thrust(s, i.angle, 20*FRACUNIT)
					return true
					else
					print(so.player.name+" vaporized "+p.name+" with the Plasma Charge Shot's piercing effect!")
					P_AddPlayerScore(so.player, 78*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end

				elseif (i.type == MT_SAMMISSILE)
					if not (p.sam_energy-((20*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_PlayRinglossSound(s)
					p.samhands = 80
					s.sam_emstress = $+75
					P_AddPlayerScore(so.player, 20*8/so.player.samcmult)
					p.sam_energy = $-(20*8/p.gravityrd)*8/so.player.samcmult
					P_SamFP(p, PAL_NUKE, 2)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					P_Thrust(s, i.angle, 6*FRACUNIT)
					return true
					else
					print(so.player.name+" barraged "+p.name+" to death with missiles")
					P_AddPlayerScore(so.player, 70*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SAMSUPERMISSILE) and i.smhyper
					if not (p.sam_energy-((80*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					HighPain(s)
					P_AddPlayerScore(so.player, 80*8/so.player.samcmult)
					print(p.name+" was overwhelmed by the True Hyper Beam's radiation!")
					p.sam_energy = $-(80*8/p.gravityrd)*8/so.player.samcmult
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 55 end
					P_SamFP(p, PAL_MIXUP, 11)
					P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50*FRACUNIT)
					return true

					else
					print(p.name+" couldn't survive "+so.player.name+"'s Hyper Beam Combo!")
					P_AddPlayerScore(so.player, 80*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SAMSUPERMISSILE)
						if i.ijusthitthisguy and (i.ijusthitthisguy == s)
						return true --Don't hit twice, thanks.
						end
						if not (p.sam_energy-((46*8/p.gravityrd)*8/so.player.samcmult) <= 0)
							i.ijusthitthisguy = s
							P_DoPlayerPain(p, i, so)
							P_PlayerEmeraldBurst(p)
							P_PlayerFlagBurst(p)
							P_PlayerWeaponAmmoBurst(p)
							P_PlayRinglossSound(s)
							P_AddPlayerScore(so.player, 46*8/so.player.samcmult)
							print(p.name+" got sent flying with "+so.player.name+"'s Super Missile!")
							p.sam_energy = $-(46*8/p.gravityrd)*8/so.player.samcmult
							SamPlayerPrism(s,p,so,false,1)
						
							if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
						
							P_InstaThrust(s, s.angle+ANGLE_180, 30*FRACUNIT)
							return true
						else
							i.ijusthitthisguy = s
							print(p.name+" couldn't survive "+so.player.name+"'s Super Missile.")
							P_AddPlayerScore(so.player, 96*8/so.player.samcmult)
							P_KillMobj(s, i, so)
							return true
						end
				elseif (i.type == MT_SAMMORPHBOMB) or (i.type == MT_SAMMBOP)
					if not (p.sam_energy-((11*8/p.gravityrd)*8/so.player.samcmult) <= 0)
					s.sam_emstress = $+75
					P_PlayRinglossSound(s)
					p.samhands = 80
					P_AddPlayerScore(so.player, 11*8/so.player.samcmult)
					p.sam_energy = $-(11*8/p.gravityrd)*8/so.player.samcmult
					if (s.sam_emstress < 150)
						SamPlayerPrism(s,p,so,false,1)
					end
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
					P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -11*FRACUNIT)
					return true
					else
					print(so.player.name+" bombed "+p.name+" to death")
					P_AddPlayerScore(so.player, 61*8/so.player.samcmult)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SAMPOWERBOMB)
					if i and ((i.phase == nil) or (i.phase and (i.phase < 2)))
						if not (p.sam_energy-((160*8/p.gravityrd)*8/so.player.samcmult) <= 0)
						P_DoPlayerPain(p, i, so)
						P_PlayerEmeraldBurst(p)
						P_PlayerFlagBurst(p)
						P_PlayerWeaponAmmoBurst(p)
						HighPain(s)
						if i.srdcr
						P_AddPlayerScore(so.player, 160*8/so.player.samcmult/i.srdcr)
						else
						P_AddPlayerScore(so.player, 160*8/so.player.samcmult)
						end
						if i and i.valid			
						i.srdcr = 2
						end
						p.samhands = 80
						p.sam_energy = $-(160*8/p.gravityrd)*8/so.player.samcmult
						P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -100*FRACUNIT)
						print(p.name+" got caught in the\x82 core\x80 of "+so.player.name+"'s Power Bomb!")
						SamPlayerPrism(s,p,so,true,1)
						return true
						else
						print(p.name+" was\x82 utterly vaporized\x80 by "+so.player.name+"'s Power Bomb!")
						if i.srdcr
						P_AddPlayerScore(so.player, 210*8/so.player.samcmult/i.srdcr)
						else
						P_AddPlayerScore(so.player, 210*8/so.player.samcmult)
						end
						if i and i.valid			
						i.srdcr = 2
						end
						P_KillMobj(s, i, so)
						return true
						end
					elseif (i.phase and (i.phase == 2))
						if not (p.sam_energy-((75*8/p.gravityrd)*8/so.player.samcmult) <= 0) 
						P_DoPlayerPain(p, i, so)
						P_PlayerEmeraldBurst(p)
						P_PlayerFlagBurst(p)
						P_PlayerWeaponAmmoBurst(p)
						HighPain(s)
						if i.srdcr
						P_AddPlayerScore(so.player, 75*8/so.player.samcmult/i.srdcr)
						else
						P_AddPlayerScore(so.player, 75*8/so.player.samcmult)
						end
						if i and i.valid			
						i.srdcr = 2
						end
						p.samhands = 80
						p.sam_energy = $-(75*8/p.gravityrd)*8/so.player.samcmult
						P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50*FRACUNIT)
						print(p.name+" got caught by the\x87 inner circle\x80 of "+so.player.name+"'s Power Bomb!")
						SamPlayerPrism(s,p,so,false,1)
						return true
						else
						print(p.name+" was\x87 vaporized\80 by "+so.player.name+"'s Power Bomb!")
						if i.srdcr
						P_AddPlayerScore(so.player, 125*8/so.player.samcmult/i.srdcr)
						else
						P_AddPlayerScore(so.player, 125*8/so.player.samcmult)
						end
						if i and i.valid			
						i.srdcr = 2
						end
						P_KillMobj(s, i, so)
						return true
						end
					else
						if not (p.sam_energy-((45*8/p.gravityrd)*8/so.player.samcmult) <= 0)
						P_DoPlayerPain(p, i, so)
						P_PlayerEmeraldBurst(p)
						P_PlayerFlagBurst(p)
						P_PlayerWeaponAmmoBurst(p)
						P_PlayRinglossSound(s)
						if i.srdcr
						P_AddPlayerScore(so.player, 45*8/so.player.samcmult/i.srdcr)
						else
						P_AddPlayerScore(so.player, 45*8/so.player.samcmult)
						end
						if i and i.valid			
						i.srdcr = 2
						end
						p.samhands = 80
						p.sam_energy = $-(45*8/p.gravityrd)*8/so.player.samcmult
						P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -30*FRACUNIT)
						print(p.name+" got caught by the\x85 outter edge\x80 of "+so.player.name+"'s Power Bomb! Close call.")
						SamPlayerPrism(s,p,so,false,1)
						return true
						else
						print(p.name+" was killed by the\x85 blast wave\x80 of "+so.player.name+"'s Power Bomb.")
						if i.srdcr
						P_AddPlayerScore(so.player, 95*8/so.player.samcmult/i.srdcr)
						else
						P_AddPlayerScore(so.player, 95*8/so.player.samcmult)
						end
						if i and i.valid			
						i.srdcr = 2
						end
						P_KillMobj(s, i, so)
						return true
						end
					end
				else
						if G_GametypeHasSpectators() and so and not YouAreSamus(so)
							if not (p.samhands and (p.samhands > 70))
							s.randomweap = P_SpawnMobj(s.x, s.y, s.z+s.height/2, (P_RandomRange(MT_BOUNCEPICKUP , MT_GRENADEPICKUP)) )
							s.randomweap.flags2 = $|MF2_DONTRESPAWN
							s.randomweap.flags = $|MF_BOUNCE|MF_GRENADEBOUNCE & ~MF_NOGRAVITY & ~MF_NOCLIPHEIGHT
							s.randomweap.fuse = 320
							P_Thrust(s.randomweap, ((P_RandomRange(1, 359))*ANG1), 8*FRACUNIT)

							s.randomweap = P_SpawnMobj(s.x, s.y, s.z+s.height/2, (P_RandomRange(MT_BOUNCEPICKUP , MT_GRENADEPICKUP)) )
							s.randomweap.flags2 = $|MF2_DONTRESPAWN
							s.randomweap.flags = $|MF_BOUNCE|MF_GRENADEBOUNCE & ~MF_NOGRAVITY & ~MF_NOCLIPHEIGHT
							s.randomweap.fuse = 320
							P_Thrust(s.randomweap, ((P_RandomRange(1, 359))*ANG1), 8*FRACUNIT)
							
							s.randomweap = P_SpawnMobj(s.x, s.y, s.z+s.height/2, (P_RandomRange(MT_BOUNCEPICKUP , MT_GRENADEPICKUP)) )
							s.randomweap.flags2 = $|MF2_DONTRESPAWN
							s.randomweap.flags = $|MF_BOUNCE|MF_GRENADEBOUNCE & ~MF_NOGRAVITY & ~MF_NOCLIPHEIGHT
							s.randomweap.fuse = 320
							P_Thrust(s.randomweap, ((P_RandomRange(1, 359))*ANG1), 8*FRACUNIT)

							s.randomweap = P_SpawnMobj(s.x, s.y, s.z+s.height/2, (P_RandomRange(MT_BOUNCERING , MT_GRENADERING)) )
							s.randomweap.flags2 = $|MF2_DONTRESPAWN
							s.randomweap.flags = $|MF_BOUNCE|MF_GRENADEBOUNCE & ~MF_NOGRAVITY & ~MF_NOCLIPHEIGHT
							s.randomweap.fuse = 320
							P_Thrust(s.randomweap, ((P_RandomRange(1, 359))*ANG1), 5*FRACUNIT)
							
							s.randomweap = P_SpawnMobj(s.x, s.y, s.z+s.height/2, (P_RandomRange(MT_BOUNCERING , MT_GRENADERING)) )
							s.randomweap.flags2 = $|MF2_DONTRESPAWN
							s.randomweap.flags = $|MF_BOUNCE|MF_GRENADEBOUNCE & ~MF_NOGRAVITY & ~MF_NOCLIPHEIGHT
							s.randomweap.fuse = 320
							P_Thrust(s.randomweap, ((P_RandomRange(1, 359))*ANG1), 5*FRACUNIT)
							P_PlayerRingBurst(p, 8)
							end
							if i and (i.type == MT_THROWNAUTOMATIC)		
								if not (p.sam_energy-(14*8/p.gravityrd) <= 0)
									s.sam_emstress = $+69
									P_PlayRinglossSound(s)
									p.samhands = 80
									p.sam_energy = $-14*8/p.gravityrd
									P_AddPlayerScore(so.player, 14)
									if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
									P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -4*FRACUNIT)
									return true
								else
									if so.skin == "tailsguy"
									print(p.name+" was gunned down with "+so.player.name+"'s bullets!")
									else
									print(p.name+" was mauled to death with a barrage of "+so.player.name+"'s automatic rings!")
									end
								P_AddPlayerScore(so.player, 64)
								P_KillMobj(s, i, so)
								return true
								end
							elseif i and (i.type == MT_THROWNSCATTER)
							or ( so.skin == "tailsguy" and so.player.tgvars != nil and so.player.tgvars.weapon == 0 and i and (i.type == MT_DOOMBULLET) )
								if not (p.sam_energy-(15*8/p.gravityrd) <= 0)
								P_SetObjectMomZ(s, 6*FRACUNIT, false)
								s.state = S_PLAY_PAIN		
								s.sam_emstress = $+69
								P_PlayRinglossSound(s)
								p.samhands = 80
									if so.skin == "duke" --Duke shoots 7 pellets instead of 5, so adjust formula for him to do similar damage.
									p.sam_energy = $-11*8/p.gravityrd
									P_AddPlayerScore(so.player, 11)
									P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -10*FRACUNIT)	
									else
									p.sam_energy = $-15*8/p.gravityrd
									P_AddPlayerScore(so.player, 15)
									P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -14*FRACUNIT)
									end
									
									if i and i.valid and i.health
									P_ExplodeMissile(i)
									end
								return true
								else
									if so.skin == "tailsguy"
									P_AddPlayerScore(so.player, 60)
									print(p.name+" got shotgunned to death by "+so.player.name)
									else
									P_AddPlayerScore(so.player, 65)
									print(p.name+" got shotgunned with "+so.player.name+"'s scatter ring!")
									end
								P_KillMobj(s, i, so)
								return true
								end
							else
								if not (p.sam_energy-(43*8/p.gravityrd) <= 0)
								P_DoPlayerPain(p, i, so)
								P_PlayerFlagBurst(p)
								P_PlayRinglossSound(s)
								P_AddPlayerScore(so.player, 50)
								p.samhands = 80
								p.sam_energy = $-43*8/p.gravityrd
								return true
								else
								print(p.name+" was killed by "+so.player.name+"!")
								P_AddPlayerScore(so.player, 100)
								P_KillMobj(s, i, so)
								return true
								end
							end
						end
				end
			else

					if not (p.sam_energy-(10*8/p.gravityrd) <= 0)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					P_PlayerWeaponAmmoBurst(s.player)
					P_PlayRinglossSound(s)
					p.samhands = 80
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					p.sam_energy = $-10*8/p.gravityrd
					P_AddPlayerScore(so.player, 10)
					return true
					elseif so and so.player
					print(p.name+" was killed by "+so.player.name)
					P_AddPlayerScore(so.player, 60)
					so.player.sam_hithud = 18
					P_KillMobj(s, i, so)
					return true
					end
			end	
		elseif i and (i.type == MT_FLAMEJETFLAME)

			if not (p.sam_energy-(21*8/p.gravityrd) <= 0)
			p.samhands = 80
			P_PlayerEmeraldBurst(s.player)
			P_PlayerFlagBurst(s.player)
			P_PlayRinglossSound(s)
				if not p.lavaflash
				p.lavaflash = 17 
				end
			p.sam_energy = $-21*8/p.gravityrd
			s.momx = $/2
			s.momy = $/2
			P_SetObjectMomZ(s, 3*FRACUNIT, true)
			if not G_GametypeHasSpectators() and i and s
			P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -20*FRACUNIT)
			end
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end

		elseif p.fusionmode and ((P_PlayerTouchingSectorSpecial(s.player, 1, 3)) and not (s.player.sam_gravitysuit and (s.player.sam_gravitysuit == 2))) or P_PlayerTouchingSectorSpecial(s.player, 1, 4)

			if s.player.sam_gravitysuit and not (p.sam_energy-15 <= 0)
			P_PlayRinglossSound(s)
			P_PlayerFlagBurst(s.player)
			p.samhands = 80
				if not p.powers[pw_flashing] 
				p.powers[pw_flashing] = 13 
				end
			p.sam_energy = $-15
			s.momx = $*10/12
			s.momy = $*10/12
			return true

			elseif not (p.sam_energy-32 <= 0) 
			P_PlayRinglossSound(s)
			P_PlayerFlagBurst(s.player)
			p.samhands = 80
				if not p.powers[pw_flashing] 
				p.powers[pw_flashing] = 13 
				end
			p.sam_energy = $-32
			s.momx = $*10/12
			s.momy = $*10/12
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end

		elseif ( ((P_PlayerTouchingSectorSpecial(s.player, 1, 3)) and not (s.player.sam_gravitysuit and (s.player.sam_gravitysuit == 2))) or P_PlayerTouchingSectorSpecial(s.player, 1, 4)
		and not p.lavaflash )


			if s.player.sam_gravitysuit and not (p.sam_energy-11 <= 0)
			P_PlayRinglossSound(s)
			P_PlayerFlagBurst(s.player)
			p.samhands = 80
				if not p.lavaflash
				p.lavaflash = 13 
				end
			p.sam_energy = $-11
			s.momx = $*10/12
			s.momy = $*10/12
			return true

			elseif not (p.sam_energy-22 <= 0) 
			P_PlayRinglossSound(s)
			P_PlayerFlagBurst(s.player)
			p.samhands = 80
				if not p.lavaflash
				p.lavaflash = 13 
				end
			p.sam_energy = $-22
			s.momx = $*10/12
			s.momy = $*10/12
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end
		elseif (i and i.valid and i.brakandco or so and so.valid and so.brakandco) and (p.sam_energy-(45*8/p.gravityrd) <= 0)
			if (p.sam_energy > 9)
			P_DoPlayerPain(s.player, i, so)
			P_PlayRinglossSound(s)
			P_SamFP(s.player, PAL_NUKE, 5)
			p.sam_energy = 1
			P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -30*FRACUNIT)
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end

		elseif i and i.valid and (i.type == MT_CYBRAKDEMON) and i.superbrak or so and so.valid and (so.type == MT_CYBRAKDEMON) and so.superbrak
			if not (p.sam_energy-(78*8/p.gravityrd) <= 0)
			P_DoPlayerPain(s.player, i, so)
			HighPain(s)
			p.sam_energy = $-78*8/p.gravityrd
			P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50*FRACUNIT)
			return true
			elseif (p.sam_energy > 9) and (((P_RandomRange(0,1)) == 1) or i.hyperbeampanic) --Add a small chance to survive.
			P_DoPlayerPain(s.player, i, so)
			P_PlayRinglossSound(s)
			P_SamFP(s.player, PAL_NUKE, 6)
			p.sam_energy = 1
			P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -60*FRACUNIT)
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end

		elseif i and ((i.flags & MF_MISSILE) or (i.type == MT_METROIDDROOL)) and not (so and so.player) and not i.kamibomb
			if ( (i.type == MT_TORPEDO2) or (i.type == MT_TORPEDO) or (i.type == MT_CYBRAKDEMON_MISSILE)
			or (i.type == MT_ROCKET) or (i.type == MT_JETTBULLET) or (i.type == MT_TURRETLASER) or (i.type == MT_UNIBALL) )
				if not (p.sam_energy-(27*8/p.gravityrd) <= 0)
					P_DoPlayerPain(s.player, i, so)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					P_PlayRinglossSound(s)
					if not (p.sam_energy-(43*8/p.gravityrd) <= 0)
					p.sam_energy = $-43*8/p.gravityrd
					else
					p.sam_energy = 1
					end
					P_Thrust(s, i.angle, 14*FRACUNIT)
					return true
				else
					P_KillMobj(s, i, so)
					return true
				end
			elseif (i.type == MT_METROIDDROOL)
				if not (p.sam_energy-(11*8/p.gravityrd) <= 0)
					P_PlayRinglossSound(s)
					p.sam_energy = $-11*8/p.gravityrd
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 20 end
					P_Thrust(s, s.angle, -18*FRACUNIT)
					return true
				else
					P_KillMobj(s, i, so)
					return true
				end
			elseif (i.type == MT_CYBRAKDEMON_FLAMESHOT)
			and (i.mahflamer and i.mahflamer.valid and i.mahflamer.smontracker and i.mahflamer.smontracker.valid) //s.tryitstartup
				if not (p.sam_energy-(3*8/p.gravityrd) <= 0)
					P_PlayRinglossSound(s)
					i.mahflamer.smontracker.flamercooldown = 90
					if not (i.mahflamer.type == MT_BLUECRAWLA) and not (p.sam_energy-(36*8/p.gravityrd) <= 0)
					p.sam_energy = $-36*8/p.gravityrd
					elseif not (p.sam_energy-(27*8/p.gravityrd) <= 0)
					p.sam_energy = $-27*8/p.gravityrd
					else
					p.sam_energy = 1 --Mercy mechanic.
					end
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 90 end
					P_Thrust(s, i.angle, 8*FRACUNIT)
					return true
				else
					P_KillMobj(s, i, so)
					return true
				end				
			else
				if not (p.sam_energy-(36*8/p.gravityrd) <= 0)
					P_PlayRinglossSound(s)
					P_PlayerFlagBurst(s.player)
					p.sam_energy = $-36*8/p.gravityrd
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 end
					P_Thrust(s, i.angle, 4*FRACUNIT)
					return true
				else
					P_KillMobj(s, i, so)
					return true
				end
			end
		elseif i and i.valid and (i.kamibomb or (i.type == MT_TNTBARREL)) --kamibomb is vulture's hypermode suicide bomb
			if not (p.sam_energy-(75*8/p.gravityrd) <= 0)
				P_DoPlayerPain(s.player, i, so)
				P_PlayerEmeraldBurst(s.player)
				P_PlayerFlagBurst(s.player)
				P_PlayerWeaponAmmoBurst(s.player)
				P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -34*FRACUNIT)
				p.sam_energy = $-75*8/p.gravityrd
				P_SamFP(p, PAL_NUKE, 10)
				P_StartQuake(70*FRACUNIT, 24)
				HighPain(s)
				return true
			else
				P_KillMobj(s, i, so)
				return true
			end
		elseif i and i.valid and ( (i.type == MT_VULTURE) or (i.type == MT_FACESTABBER) or (i.type == MT_UNIDUS) or (i.type == MT_CYBRAKDEMON) or (i.type == MT_CYBRAKDEMON_ELECTRIC_BARRIER) or (i.type == MT_SPIKE))
			if not (p.sam_energy-(45*8/p.gravityrd) <= 0)
			P_DoPlayerPain(s.player, i, so)
			P_PlayerEmeraldBurst(s.player)
			P_PlayerFlagBurst(s.player)
			P_PlayRinglossSound(s)
			p.sam_energy = $-45*8/p.gravityrd
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end
		elseif i and i.valid and i.customsamusdamage -- Set custom damage for any object you like. I use this for newer content, but it'll work with custom content too.
		and ((tonumber(i.customsamusdamage)) != nil) -- For example, giving your missile or character "mo.customsamusdamage = 70" will make them hit for 70 damage to Varia Suit Samus.
			if not (p.sam_energy-(i.customsamusdamage*8/p.gravityrd) <= 0)
			P_DoPlayerPain(s.player, i, so)
			P_PlayerEmeraldBurst(s.player)
			P_PlayerFlagBurst(s.player)
			P_PlayRinglossSound(s)
			p.sam_energy = $-i.customsamusdamage*8/p.gravityrd
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end		
		else --Can't find any reference in this ridiculously long list? Do default damage!
			if not (p.sam_energy-(38*8/p.gravityrd) <= 0)
			P_DoPlayerPain(s.player, i, so)
			P_PlayerEmeraldBurst(s.player)
			P_PlayerFlagBurst(s.player)
			P_PlayRinglossSound(s)
			p.sam_energy = $-38*8/p.gravityrd
			return true
			else
			P_KillMobj(s, i, so)
			return true
			end
		end
	else
		return
	end
  end
end, MT_PLAYER)

--Make Minecarts correctly respawn you.
addHook("MobjDeath", function(s, i, so)
		if s.valid and s.target
		and s.target.player and YouAreSamus(s.target) and s.target.health
			s.target.player.powers[pw_carry] = 0
			P_KillMobj(s.target, nil, nil, DMG_INSTAKILL)
			s.target = nil
				if s.valid
					s.state = S_NULL
				end
			return
		end
end, MT_MINECART)


addHook("ShouldDamage", function(s, i, so, damage, dmgtype)
	if (YouAreSamus(s) and s.player) and not (s.player.powers[pw_carry] == CR_NIGHTSMODE)
	local p = s.player
		if s.crystalflashanim
			return false
		elseif dmgtype and (dmgtype == DMG_CRUSHED)
			if not (p.sammorphed and p.sammorphed == true)
			and s.scale != 42001
			and not (s.ceilingz-s.floorz < 16*FRACUNIT) --Too small for Morph Ball to negate.
			and not (i and (i.flags & MF_ENEMY))
				if not ((gamemap == 12) and mapheaderinfo[gamemap].lvlttl == "Castle Eggman") --Hacking the system.
					--Save Samus' soul!
					p.pflags = $ & ~PF_SPINNING & ~PF_STARTDASH
					CancelScrewAttack(s,p)
					SamMorphSwitch(p, s)
					S_StartSound(s, sfx_smorph)
					P_SetObjectMomZ(s, -5*FRACUNIT)
					s.momx = $/5
					s.momy = $/5
					return false
				end
			end
		elseif so and (so.type == MT_METROIDLARVA or so.type == MT_ROSY or so.metroidleech)
			return false
		elseif (p.sam_gravitysuit and (p.sam_gravitysuit == 2)) and ((i and ((i.flags & MF_FIRE) or (i.type == MT_LAVAFALL)) and not i.player) or (so and (so.flags & MF_FIRE) and not so.player))
			return false
		elseif i and i.valid 
			if ( ((i.type == MT_FLAMEJETFLAME or i.type == MT_LAVAFALL_LAVA or i.type == MT_LAVAFALL) and p.lavaflash) or i.spazershocked)
				return false
			elseif  (i.type == MT_METALSONIC_BATTLE) and (p.pflags & PF_JUMPED)
			and not (s.z > i.z+i.height)
			and not (i.z > s.z+s.height)
			and not (i.state == S_METALSONIC_DASH)
				return false
			elseif i.sambossreflect and (i.sambossreflect != s)
			or i.samcounter and (i.samcounter != s)
				return false
			elseif i.bolterattack and (p.sam_shinesparkfly or p.sam_screwattacking)
				return false
			elseif ((i.type == MT_WVCHARGESHOT) or (i.type == MT_WVSHOT))
			and (gametype == GT_COOP)
				return false
			end
		end
		if not i and not so and not P_CheckDeathPitCollide(s) and not (s.floorz == s.ceilingz)
			if (P_PlayerTouchingSectorSpecial(p, 1, 3)) and p.lavaflash
				return false
			elseif (P_PlayerTouchingSectorSpecial(p, 1, 3)) and (p.sam_gravitysuit and (p.sam_gravitysuit == 2))
				if (s.z < s.floorz-100*FRACUNIT) --Solid lava is fucking stupid.
				s.z = s.floorz+5*FRACUNIT
				end
				return false
			elseif p.sam_gravitysuit and P_PlayerTouchingSectorSpecial(p, 1, 2)
				return false
			elseif p.sam_spiderball and p.sammorphed and P_PlayerTouchingSectorSpecial(p, 1, 4)
				if (leveltime % 3 == 0)
				S_StartSound(s, sfx_cmol)
				local ghs
					if (s.eflags & MFE_VERTICALFLIP)
					ghs = P_SpawnMobj(s.x, s.y, s.z+s.height, MT_SAMUSZAP)
					else
					ghs = P_SpawnMobj(s.x, s.y, s.z-s.height/10, MT_SAMUSZAP)
					end
				  if ghs.valid
				   if leveltime % 2 == 0
				   ghs.scale = s.scale
				   else
				   ghs.scale = $*2
				   end
				  ghs.momx = s.momx
				  ghs.momy = s.momy
				  ghs.momz = s.momz
				  ghs.eflags = s.eflags
				  ghs.color = SKINCOLOR_GOLD
				  ghs.morning = 4
				  end
				end
				SamSpiderCharge(p, s, 200)
				return false
			end
		end
		if (p.sam_shinesparkfly or p.sam_screwattacking)
		and ( (i and ((i.flags & (MF_MISSILE|MF_ENEMY|MF_BOSS)) or (i.type == MT_UNIBALL) or (i.type == MT_METROIDPART) or (i.type == MT_METROIDBOSS) or (i.type == MT_METROIDSLASH) or (i.type == MT_METROIDDROOL)))
		or so and (so.player and not so.player.sam_shinesparkfly) )
			return false
		end
	end
	if so and YouAreSamus(so) --Don't hurt friends
		if ((gametype <= GT_RACE) or (CBW_Chaos and gametype == GT_CHAOS))
		and not (gametyperules&GTR_FRIENDLYFIRE)
			return false
		elseif G_GametypeHasTeams()
			if (so.player and s.player.ctfteam == so.player.ctfteam)
			return false
			end
		end
	end	
end, MT_PLAYER)

addHook("MobjDeath", function(s, i, so, dmgtype)
	if not s.player return end
	local p = s.player
	
	if p.gotflag --No exceptions ever, game.
		P_PlayerFlagBurst(p)
	end
	
	if s.valid and YouAreSamus(s)
	and not (p.powers[pw_carry] == CR_NIGHTSMODE)
	
	  if s.crystalflashanim --Ignore death for a while.
	 	 return true
	  end
	  
	  --Through the lives of your fallen foes, you defy even death; The Crystal Flash! Use your sacred gift to carry on the Chozo legacy!
	  
	  if (p.crystalflashchance or p.buffbottomtier) and (gametype == GT_COOP or G_GametypeHasSpectators())
	  and not (dmgtype and ((dmgtype >= DMG_INSTAKILL) and (dmgtype <= DMG_CRUSHED)) ) and not p.bot
	  local crystalrng = (P_RandomRange(0-(p.crystalflashchance/40),(600-p.crystalflashchance)))  --Roll below a 0 to get the Crystal Flash!
	  		if ((gametype == GT_COOP) and (p.crystalflashchance and ((p.crystalflashchance >= 600) or crystalrng <= 0))) --500+ means guaranteed Crystal Flash
			or p.buffbottomtier and (gametype != GT_COOP) and not P_RandomRange(0,30) and so and so.player		
				p.sam_energy = 1
				s.flags2 = $|MF2_DONTDRAW
				s.health = 1
				p.rings = 1
				p.playerstate = PST_LIVE
				P_RadiusAttack(s, s, 500*FRACUNIT)
				P_ResetPlayer(p)
				if multiplayer
				print("\x8E A miracle graces the stars,\x80 "+p.name+"\x8E has activated the Crystal Flash!")
				end
	  			p.crystalflashchance = 0 --Reset chances.
				if (gametype == GT_COOP)
				SAM_COM_BufInsertText(p, "tunes -none")
				SAM_COM_BufInsertText(p, "tunes CRYFLA")
				else
					for z in players.iterate
					SAM_COM_BufInsertText(z, "tunes -none")
					SAM_COM_BufInsertText(z, "tunes CRYFLA")
					end
				end
				s.crystalfroll = 0
				s.crystalflashanim = 140
	  			s.crystalflashtime = 2450
				SamCam(p, true)
				for d = 1,4
					S_StartSound(s, sfx_mbop)
				end
				P_PlayDeathSound(s)
				return true
			end
	  end
	  
	  --Damage+Quick Respawn in coop/race gamemodes when falling into pits/getting crushed, instead of a full on death.
	  --Since Samus has no lives, instakills would be really cheap.
	  if (G_GametypeUsesLives() or gametype == GT_RACE)
		if p.fusionmode
			if not (p.sam_energy-65 <= 0)
			and ((dmgtype >= DMG_INSTAKILL) and (dmgtype <= DMG_CRUSHED)) --Can I trust dmgtype, though??
			P_SpawnMobj(s.x, s.y, s.z+s.height/2, MT_SMOKE)
			P_PlayRinglossSound(s)
			P_SamFP(p, PAL_WHITE, 10)
			p.sam_energy = $-65
			p.powers[pw_nocontrol] = 10
			p.playerstate = PST_REBORN
			p.samusrespawnfunc = p.sam_energy
				if s.crystalflashtime
					SAM_COM_BufInsertText(p, "tunes -default")
				end
				return true	
			else
				if not p.continues
					p.continues = 1
				end
				if p.gameoverready
					if not netgame
						p.crystalflashchance = $+40
					end
					p.sam_gameover = p.sam_gameover and $+1 or 1
					p.gameoverready = false
				end
				
				p.samusrespawnfunc = nil
				
				if p.lives != INFLIVES
					p.lives = 1
				end
			end
			
		else
			if not (p.sam_energy-40 <= 0) 
			and dmgtype and ((dmgtype >= DMG_INSTAKILL) and (dmgtype <= DMG_CRUSHED))
				P_SpawnMobj(s.x, s.y, s.z+s.height/2, MT_SMOKE)
				P_PlayRinglossSound(s)
				P_SamFP(p, PAL_WHITE, 10)
				p.sam_energy = $-40
				p.powers[pw_nocontrol] = 10
				p.playerstate = PST_REBORN
				p.samusrespawnfunc = p.sam_energy
				if s.crystalflashtime
					SAM_COM_BufInsertText(p, "tunes -default")
				end			
				return true
			else
				if not p.continues
					p.continues = 1
				end
				if p.gameoverready
					if p.gameoverready
						if not netgame
							p.crystalflashchance = $+50
						end
						p.sam_gameover = p.sam_gameover and $+1 or 1
						p.gameoverready = false
					end
					p.gameoverready = false
				end
				p.samusrespawnfunc = nil
				if p.lives != INFLIVES
					p.lives = 1
				end
			end
		end
	  end
	end
	
	--Second MobjDeath hook merged into this....
	//When defeated in match/CTF, drop energy as a reward! Extra if defeated by the power beam!
	
	if G_GametypeUsesLives()
		if (so and (so.brakandco or so.superbrak))
			p.sammissiles = p.sammissilesmax
			p.sampw = p.sampwmax
			p.samsupermissiles = p.samsupermissilesmax
		end
		if not p.lives and not p.continues
			p.continues = 1
		end
		if s.rdeathmsg and ((gamemap == 28) or (gamemap == 806) or (gamemap == 807))
			if not p.superbrakdeath
				p.superbrakdeath = 1
			elseif p.superbrakdeath
				p.superbrakdeath = $+1
			end
			s.rdeathmsg	= false
		end
	elseif so and so.player and not YouAreSamus(so) and G_GametypeHasSpectators()
	and not (p and p.spectator)
	
		if so.player.powers[pw_shield]
		P_SamFP(so.player, 4, PAL_RECYCLE)
		P_GivePlayerRings(so.player, 20)
		if so and so.valid		
		S_StartSound(so, sfx_itemup)
		end
		CONS_Printf(so.player, "\x83"+"Gained 20 rings for killing a Samus player!")
		else
		so.player.powers[pw_shield] = SH_FORCE|1
		P_SpawnShieldOrb(so.player)
		P_SamFP(so.player, 4, PAL_RECYCLE)
		if so and so.valid		
		S_StartSound(so, sfx_shield)
		end
		CONS_Printf(so.player, "\x83"+"Gained a force shield for killing a Samus player!")
		end
		
	elseif s and ( ((i and i.player and (YouAreSamus(i))) or (so and so.player and (YouAreSamus(so)))) or (YouAreSamus(s)) )
	and not p.spectator
	
		if so and so.crystalflashtime 
			P_SpawnMobj(s.x, s.y-130*FRACUNIT, s.z+s.height*2, MT_PBOM)
			P_SpawnMobj(s.x, s.y+130*FRACUNIT, s.z+s.height, MT_PBOM)
			P_SpawnMobj(s.x, s.y+50*FRACUNIT, s.z+s.height, MT_SPKU)
			P_SpawnMobj(s.x-50*FRACUNIT, s.y+50*FRACUNIT, s.z+(s.height/3), MT_BMPKU)
		end
		if i
		and (i.type == MT_PBSHOT or i.type == MT_PBCHARGESHOT or i.type == MT_PBEXPLOSION or i.type == MT_SAMMBOP or i.type == MT_SAMMORPHBOMB)
			P_SpawnMobj(s.x, s.y, s.z+32*FRACUNIT, MT_NRGD)
			return
		elseif i
		and (i and (i.type == MT_HBSHOT or i.type == MT_SAMPOWERBOMB or i.type == MT_SAMMORPHPBOMB))
			P_SpawnMobj(s.x, s.y, s.z+32*FRACUNIT, MT_MPKU)
			return
		else
			P_SpawnMobj(s.x, s.y, s.z+32*FRACUNIT, MT_NRGB)
		end
	end	
end, MT_PLAYER)

addHook("MobjDeath", function(s, i, so)
	if not (i and i.valid)
		return
	end
	
	if s.player and not s.crystalflashanim
	or (s.flags & MF_ENEMY)
	or s.metroidstatue
	
		--Critical hit kill! You're using weaknesses correctly, congrats!
		if (s.flags & (MF_ENEMY|MF_BOSS))
			if (s.type == MT_METROID) or (s.type == MT_SUPERMETROID)
			or (s.type == MT_METROIDLARVA) or (s.type == MT_PZBOSS) 
			or (s.type == MT_POPUPTURRET) and (s.scale == 230712)
				return
			else
				if i.player and (i.player.sam_screwattacking or i.player.sam_shinesparkfly)
				and YouAreSamus(i)
					samcriticalfx(s, i.angle, i) --Just a graphical effect to show you did gud!
				end
			end
		end
		
		if (i.type == MT_METROID) or (i.type == MT_SUPERMETROID) or s.metroidstatue
		
			Dustintegrate(s, 1, i) --Dustintegrate 1 is being turned into a husk of dust.
			if s.metroidstatue
				s.state = S_NULL
			end
			return
			
		--Cause knockback styled deaths!
		
		elseif i.player and YouAreSamus(i) and not i.sam_deathball --You got tackled directly.
		or (i.type == MT_SAMMISSILE)
		or (i.type == MT_SAMPOWERBOMB) and i.phase
		or (i.type == MT_SAMSUPERMISSILE)
		or (i.type == MT_SAMMORPHBOMB)
		or (i.type == MT_HBSHOT)
		or (i.type == MT_SPAZERSHOCK) and i.hypered
		
			if (s.flags & MF_ENEMY) or s.player.samusragdolls
				if i.type == MT_SAMSUPERMISSILE
					Dustintegrate(s, 0, i, 15*FRACUNIT)
				elseif i.type == MT_SAMPOWERBOMB and i.phase or i.type == MT_HBSHOT or (i.type == MT_SPAZERSHOCK)
					Dustintegrate(s, 0, i, 20*FRACUNIT)
				elseif i.player
					Dustintegrate(s, 0, i, 15*FRACUNIT, true)
				else
					Dustintegrate(s, 0, i, 7*FRACUNIT) --Dustintegrate type 0's are knockback deaths!
				end
			end
			return
			
		elseif (i.type == MT_PLCHARGESHOT) or i.gattlingvortex or (i.type == MT_MINIFIRE and s.samusshot)
		or (i.type == MT_SAMPOWERBOMB) or (i.sam_deathball and s.player)
			Dustintegrate(s, 2, i)
			return
		elseif ((i.type == MT_PLSHOT) or i.sam_deathball) and (s.flags & MF_ENEMY)
			Dustintegrate(s, 2) --Dustintegrate 2 is being turned into ashes!
			return
		end
	end
end)

//Special Ice Damage hook for these weirdos.
addHook("MobjDamage", function(m, i, so)
	if m and i and (i.type == MT_ICSHOT or i.type == MT_ICCHARGESHOT)
	and so and YouAreSamus(so)
		m.frozenmobj = P_SpawnMobj(m.x, m.y, m.z, MT_FREEZETRACKER)
		m.frozenmobj.chozobox = m
		m.frozenmobj.samusshooter = so
		return false
	end
end, MT_FACESTABBER)

local function PhazonPain(line, s)
	if s and s.player and s.health
	local p = s.player
		if p.powers[pw_super] or p.hypermysticsonic or p.powers[pw_invulnerability]
		or p.sam_phazonsuit //Just incase I ever want a Phazon Suit.
		return 
		end
		
	P_StartQuake(12*FRACUNIT, 2)
	S_StartSound(s, sfx_pzpain)
	
		if YouAreSamus(s)
			if not s.pzpaintime
			s.pzpaintime = 16
			P_SamFP(s.player, PAL_NUKE, 6)
			s.momx = $*5/8
			s.momy = $*5/8
			s.momz = $*5/6
			P_Thrust(s, P_RandomRange(1,359)*ANG1, 5*FRACUNIT)
				if (p.powers[pw_flashing] or s.sam_systemreboot) and not (p.sam_energy-(7*8/p.gravityrd) <= 0)
				
					p.sam_energy = $-7*8/p.gravityrd
					return true		
				
				elseif not (p.sam_energy-(23*8/p.gravityrd) <= 0)
				
					p.sam_energy = $-23*8/p.gravityrd
					return true
				
				elseif (p.sam_energy > 3) --Make it 4+ energy so the autotank won't break the Phazon mechanic.
					p.sam_energy = 1
					P_SamFP(p, PAL_NUKE, 12)
					HighPain(s)
					P_DoPlayerPain(p)
					s.momz = 0 s.momx = 0 s.momz = 0
					s.state = S_PLAY_FALL
					s.pzpaintime = 60
					return true
				else
					s.pzpaintime = 18
					P_KillMobj(s) 
					return true
				end
			end
		elseif not s.pzpaintime
			s.pzpaintime = 44
			P_SamFP(p, PAL_NUKE, 8)
				if p.powers[pw_shield]
					P_BlackOw(p)
					s.momx = $*5/8 s.momy = $*5/8 s.momz = $*5/6
					P_Thrust(s, P_RandomRange(1,359)*ANG1, 8*FRACUNIT)
					s.state = S_PLAY_PAIN
				elseif not p.powers[pw_shield] and p.rings
					if (p.rings > 10)
					p.rings = $-10
					else
					p.rings = 0
					end
					s.momx = $*5/8 s.momy = $*5/8 s.momz = $*5/6
					P_Thrust(s, P_RandomRange(1,359)*ANG1, 8*FRACUNIT)
					s.state = S_PLAY_PAIN
				elseif not p.rings
					P_KillMobj(s)
				end		
		end
	end
end
addHook("LinedefExecute", PhazonPain, "PZPAIN")

local function BarrierPain(s, v) --Technically does the same thing as PhazonPain....
	if not (v and v.valid and s and s.valid)
	return false
	end
		if (v.z > s.z+s.height+12*FRACUNIT)
		or (s.z > v.z+v.height)
		return --it missed.
		end
		if s.borigin and s.borigin.valid and s.borigin.phazondive
		and v.player
		and ((v.player.sam_shinesparkfly and v.player.sam_shinesparkfly > 17)
		or (v.player.sam_screwattacking and v.player.sam_screwattacking > 23)
		or v.player.powers[pw_super])
			P_DamageMobj(s.borigin, v, v)
			return false		
		elseif v.player
		and ((v.player.sam_screwattacking and not v.screwattackfling) or v.player.sam_shinesparkfly) and YouAreSamus(v)
		and (s.target and (s.target != v))
		and s.borigin and s.borigin.valid and (s.borigin.type == MT_SAMSUPERMISSILE)
				SamusBeamReflect(s.borigin.target, v)
				return false
		elseif ((v.type == MT_SAMSUPERMISSILE) and not v.darkhyper and not (v.target and v.target.player))
			if s.borigin and s.borigin.valid and (s.borigin.type == MT_SAMSUPERMISSILE)
				P_DamageMobj(v, s.borigin, s.borigin)
				P_ExplodeMissile(s.borigin)
				s.state = S_NULL
				return true
			end 
		end
end
addHook("MobjCollide", BarrierPain, MT_PZBARRIER) 
addHook("MobjMoveCollide", BarrierPain, MT_PZBARRIER)
local function BarrierPain2(s, v) --Technically does the same thing as PhazonPain....
	if not (v and v.valid and s and s.valid)
	return false
	end
		if (v.z > s.z+s.height+22*FRACUNIT)
		or (s.z > v.z+v.height+22*FRACUNIT)
		return --it missed.
		end	
		if (v.flags & MF_MISSILE) or v.samusshot
			if not (v.type == MT_SAMSUPERMISSILE)
				if v.target and v.target.player
					SamusBeamReflect(s.borigin.target, s.darkpz)
				return false
				end
			end
		end	
end
addHook("MobjCollide", BarrierPain2, MT_PZBARRIER) 
addHook("MobjMoveCollide", BarrierPain2, MT_PZBARRIER)

local function PhazonSkip(line, s)
 if s and s.valid and s.player
	for m in mobjs.iterate(mobjs)
		if m and m.valid and (m.type == MT_PZBOSS) --You skipped it, you crazy speedrunner, you!
		m.health = 0
		m.pzambush = 0
		m.pzdeathanim = 140
		m.flags = MF_SHOOTABLE|MF_ENEMY|MF_BOSS|MF_NOGRAVITY
		P_DamageMobj(m, s, s)
		P_KillMobj(m, s, s)
		m.pzdeathanim = 140
			if YouAreSamus(s) and not (s.player.pflags & PF_NOCLIP) and not (s.flags & MF_NOCLIP) --No compliments for cheaters.
			SamusDialogue(s, "...that was unexpected. Bravo, Samus. ", "You never cease to impress. ", "SAMDEF", 1, 0, 70)
			end
		end
	end
 end
end
addHook("LinedefExecute", PhazonSkip, "PZSKIP")
local function PhazonWarn(line, s)
 if s and s.valid
	for m in mobjs.iterate(mobjs)
		if m and (m.type == MT_FLAME) and (m.angle == ANGLE_90*3) --Beware the blue....?
		m.state = S_BLUEPHAZFLAME
		end
	end
 end
end
addHook("LinedefExecute", PhazonWarn, "PZWARN")

local function StartIceShooter(line, s)
	for m in mobjs.iterate(mobjs)
		if m and (m.type == MT_MINECARTSWITCHPOINT) --Turn on the ice shooter to make 0% and non-Samus playthroughs possible.
		m.icstart = P_SpawnMobj(m.x, m.y, m.z, MT_FLAMEJET)
		m.icstart.iceshooter = true
		m.icstart.angle = m.angle
		m.state = S_NULL
		end
	end
end
addHook("LinedefExecute", StartIceShooter, "STARTIC")
local function PhazonReveal(line, s)
	for m in mobjs.iterate(mobjs)
		if m and (m.type == MT_MINECARTEND) --Spooky particles to make players think this may not be a death pit.
		m.pzrev = P_SpawnMobj(m.x, m.y, 1190*FRACUNIT, MT_SAMUSEPARTICLE)
		m.pzrev.angle = ANGLE_90
		m.state = S_NULL
		end
	end
end
addHook("LinedefExecute", PhazonReveal, "PZREV")
local function AngleCorrect(line, s) --Make it easier to angle this.
	if s and s.valid and s.player
		if s.player.sam_shinesparkfly and s.player.sammorphed
		s.player.cmd.forwardmove = 50
		s.angle = 0
		end
 	end
end
addHook("LinedefExecute", AngleCorrect, "ANGCOR")
local function CenterRise(line, s) --Let's not get crushed, okay?
	if s and s.valid
		P_MoveOrigin(s, 7904*FRACUNIT, -235*FRACUNIT, s.floorz)
		s.momx = 0 s.momy = 0 s.momz = 0
		s.player.powers[pw_nocontrol] = 24
		s.player.sams_morphcd = 35
		P_SamFP(s.player, PAL_RECYCLE, 6)
		s.omegarushpanic = 22
 	end
end
addHook("LinedefExecute", CenterRise, "CENTRISE")
local function DarkPZStart(line, s) 
	if s and s.valid
		local maxcount = 5
		local spawnedpz = false		
		for m in mobjs.iterate(mobjs)
			if m and m.valid and (m.type == MT_BLUESPHERE) --Spawn the boss from one of the dummy spheres.
				if spawnedpz
					m.state = S_NULL --We already spawned the boss, so just remove the rest.
				else
					if maxcount
					maxcount = $-1
						if not P_RandomRange(0,2)
						m.darkpz = P_SpawnMobj(m.x, m.y, m.z+70*FRACUNIT, MT_PZBOSS)
							if m.darkpz and m.darkpz.valid
							m.darkpz.angle = m.angle
							m.darkpz.target = s
							m.darkpz.pzambush = 120
							spawnedpz = true
							end
						end
					else --This is the last possible sphere, so just spawn it.
						m.darkpz = P_SpawnMobj(m.x, m.y, m.z+70*FRACUNIT, MT_PZBOSS)
							if m.darkpz and m.darkpz.valid
							m.darkpz.angle = m.angle
							m.darkpz.target = s
							m.darkpz.pzambush = 125
							end	
							spawnedpz = true
					end
					m.state = S_NULL --Remove the sphere.
				end
			end
		end
 	end
end
addHook("LinedefExecute", DarkPZStart, "DARKPZ") --Start the PZ boss fight
local function DarkPZMusic(line, s) 
	if s and s.valid and s.player
		for m in mobjs.iterate(mobjs)
			if m and m.valid and (m.type == MT_PZBOSS) and m.health --correct the music to the boss.
				s.player.sam_darkpz = 2
				return
			else
				s.player.sam_darkpz = 1
				return
			end
		end
 	end
end
addHook("LinedefExecute", DarkPZMusic, "PZMUSC") --Music check
local function OpenPZwall(line, s)	
		for sector in sectors.iterate
			for fof in sector.ffloors()
				if sector.tag == 20 or sector.tag == 14 or sector.tag == 19 or sector.tag == 15 or sector.tag == 16
				or sector.floorpic == "WHITEFLR"
				EV_CrumbleChain(sector, fof)
				end
			end
		end
end
addHook("LinedefExecute", OpenPZwall, "PZOPENW") --Destroy all floors.
local function MetroidMusic(line, s)	
	if s and s.valid and s.player
	local mymusic = false
		for m in mobjs.iterate(mobjs)
			if m and m.valid and (m.type == MT_METROID)
			mymusic = true
			end
		end
		if mymusic
		SAM_COM_BufInsertText(s.player, "tunes METRD")
		else
		SAM_COM_BufInsertText(s.player, "tunes -none")	
		end
	end
end
addHook("LinedefExecute", MetroidMusic, "METMUSIC")
local function MetroidMusic2(line, s)	
	if s and s.valid and s.player
	local mymusic2 = false
		for m in mobjs.iterate(mobjs)
			if m and m.valid and (m.type == MT_METROIDBOSS)
			mymusic2 = true
			end
		end
		if mymusic2
		SAM_COM_BufInsertText(s.player, "tunes OMEGA")
		else
		SAM_COM_BufInsertText(s.player, "tunes DSZ4")
		end
	end
end
addHook("LinedefExecute", MetroidMusic2, "METMUSI2")