--=============================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.
--====================================================================================
local SAM = MetroidVanguard
local HOST = SAM.HOST

local function P_MobjFlip(s) --Preventing MobjFlip crash by overriding the function entirely.
	if s and s.valid and ((s.eflags & MFE_VERTICALFLIP) or (s.flags2 & MF2_OBJECTFLIP))
		return -1 --
	end return 1 --
end

local function SAM_HurtSFX(s)
	if s.SAM_PSFX or (s.player and s.player.sammorphed) or s.crystalflashtime
		if s.SAM_PSFXalt != false
			S_StartSound(s, sfx_samht5)
			s.SAM_PSFXalt = false
		else
			s.SAM_PSFXalt = true
			S_StartSound(s, sfx_samht6)
		end
	else
		P_PlayRinglossSound(s)
		s.SAM_PSFX = 25
	end
end

rawset(_G, "HighPain", function(s, rng) --Special pain sound when taking heavy damage. Can choose specific one if you like.
	s.SAM_PSFX = 34 
	SAM_HurtSFX(s)
	if (s.player and s.player.sammorphed) or s.crystalflashtime
		return --
	end
	if rng == nil --No sound given? Choose randomly. then!
		rng = P_RandomRange(0,2)
	end
	S_StartSound(s, (rng==0) and sfx_h1pain or (rng==1) and sfx_h2pain or sfx_h3pain)
end)
local function SamPlayerPrism(s,p,so, big,amount) --Lazy shortcut
	local SOSCORE = so and so.player and so.player.score or 0
	local SCORE = p and p.score or 0
	if (SOSCORE+300 < 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, DMG, noflinch, inflictor, source) 
	if not tonumber(DMG) or not p
		return false --
	end local s = p.mo
	if not (s and s.valid and YouAreSamus(s) and s.health)
		return false --
	end
	p.beampain = 4
	p.visorclosein = 9
	s.sams_shineframe = 0
	
	if p.sam_screwattacking
		p.aiming = 0
		CancelScrewAttack(s,p)
	end
	local CURRENTENERGY = (p.sam_energy) or 0
	if not ( CURRENTENERGY - (DMG*8/p.gravityrd) <= 0)
		p.sam_energy = CURRENTENERGY-(DMG*8/p.gravityrd)
		if not noflinch
			P_DoPlayerPain(p, i, so)
			P_PlayerEmeraldBurst(p)
			P_PlayerFlagBurst(p)
		elseif not p.powers[pw_flashing] 
			p.powers[pw_flashing] = 70
		end	
		if (DMG > 55)
			HighPain(s)
		else
			SAM_HurtSFX(s)
		end
		P_PlayerWeaponAmmoBurst(p)
	else
		if source and source.player
			p.SAM_RevengeBounty = source.player
			p.SAM_RevengeBountyTime = 4000
		end
		P_KillMobj(s, inflictor, source)
	end
	return true --
end)

--Overwrite this function for convenience.
local function P_AddPlayerScore(p, ADD) if not p.valid or not ADD return end --
	if p.mo and p.mo.SAM_scoreboost
		ADD = $*5/4 --25% score boost.
		p.mo.SAM_scoreboost = nil
	end
	p.score = min(999999990, $+ADD)
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.valid return end
	local p = s.player
	if not p or (p.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 --
	end

	local SAMUS = (YouAreSamus(s))
  	if p.samtoken and not (SAMUS) 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
	
	--Non-Samus characters getting damaged by samus.
	if not (SAMUS) and so and so.player and YouAreSamus(so)
		local tp = so.player
		tp.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"
			if tp.duke and tp.duke.health and (tp.duke.health > 30)
				tp.rings = max($,1) --Give Duke a ring so he won't get instakilled.
			end
		elseif s.skin == "tailsguy"
			if tp.tgvars and tp.tgvars.health and (tp.tgvars.health > 30)
				tp.rings = max($,1) --Give TailsGuy a ring so he doesn't get instakilled.
			end
		end
		if i
			if (i.type == MT_PBSHOT)
				if not (p.rings <= 0) or p.powers[pw_shield]
				P_AddPlayerScore(tp, 3*8/tp.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<<16)
					return true --
				else
					print(tp.name+" killed "+p.name+" with the Power Beam!")
					P_AddPlayerScore(tp, 53*8/tp.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 tp and tp.score != nil
					if (tp.score >= 20)
					tp.score = $-20
					end
				end			
			elseif (i.type == MT_SPSHOT)
				if not (p.rings <= 0) or p.powers[pw_shield]
					P_AddPlayerScore(tp, 9*8/tp.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<<16)
					return true --
				else
					print(tp.name+" killed "+p.name+" with the Spazer Beam!")
					P_AddPlayerScore(tp, 59*8/tp.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(tp, 12*8/tp.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,s.momy,s.momz = $*3/5,$*3/5,$*2/3
					return true
				else
					print(tp.name+" killed "+p.name+" with the Wave Beam!")
					P_AddPlayerScore(tp, 62*8/tp.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(tp, 11*8/tp.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,s.momy,s.momz = $*20/21,$*20/21,$*20/21
					P_Thrust(s, i.angle, FRACUNIT)
					return true --
				else
					print(tp.name+" killed "+p.name+" with the Ice Beam!")
					P_AddPlayerScore(tp, 61*8/tp.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(tp, 14*8/tp.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<<16)
					return true
				else
					print(tp.name+" killed "+p.name+" with the Plasma Beam!")
					P_AddPlayerScore(tp, 64*8/tp.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(tp, 20*8/tp.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<<16)
				return true
				else
				print(tp.name+" barraged "+p.name+" to death with missiles")
				P_AddPlayerScore(tp, 70*8/tp.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(tp, 11*8/tp.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<<16)
					return true
				else
					print(tp.name+" bombed "+p.name+" to death")
					P_AddPlayerScore(tp, 61*8/tp.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(tp, 30*8/tp.samcmult)
				P_SetObjectMomZ(s, 9<<16)
				p.samshieldhp = 3
				P_SamFP(p, PAL_MIXUP, 11)
				P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50<<16)
			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(tp, 100*8/tp.samcmult)
				P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -35<<16)
			end
		end
	   
	elseif not (SAMUS)	--Omega Smash!!
		if 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<<16
			P_InstaThrust(s, R_PointToAngle2(s.x, s.y, so.x, so.y), -75<<16)
			so.rammedher = true
			return true --
		end
		return --
		
	else --if (SAMUS) --From now on, it's aaaall Samus!
	
		if dmgtype == DMG_FIRE and (p.sam_gravitysuit and p.sam_gravitysuit != 1)
			if ((i and i.flags & MF_SCENERY)
			or not (so or i)) 
				return true --Environmental fire protection.
			end
		end
		p.beampain = 4
		p.visorclosein = 9
		s.sams_shineframe = 0
		s.SAM_CanPlayAlarm = 200
  		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 upgrade 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
		local DEF = (p.gravityrd) or 8 --DEFENSE/DEFENCE
		
		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<<16, 12, 50<<16)
					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<<16)
					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
					SAM_HurtSFX(s)
					p.sam_energy = max($-15*8/DEF, 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<<16
				s.angle = R_PointToAngle2(s.x, s.y, so.x, so.y)
				P_InstaThrust(s, s.angle, -75<<16)
				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)
				SAM_HurtSFX(s)
				p.sam_energy = max($-65*8/DEF, 1)
				return true
			elseif (p.sam_energy > 30)
				P_DoPlayerPain(s.player, i, so)
				SAM_HurtSFX(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.valid 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<<16, 9, 50<<16)
				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<<16)
				s.sam_systemreboot = 70
				s.sam_wavestunned = 70
				SAM_HurtSFX(s)
				p.sam_energy = max($-31*8/DEF, 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<<16)
						m.ghs = P_SpawnGhostMobj(m)
						m.ghs.tics = 22 m.ghs.fuse = 22 m.ghs.destscale = 99<<16
					//	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/DEF)) <= 0)
					p.sam_energy = $-(12*8/DEF)
						SAM_HurtSFX(s)
						P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -6<<16)
						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
						SAM_HurtSFX(s)	
						P_SamFP(p, PAL_NUKE, 2)
						P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -14<<16)
						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/DEF)) <= 0)
						p.sam_energy = $-(77*8/DEF)
					else
						p.sam_energy = 1 --Mercy shot
					end
					P_SetObjectMomZ(s, 13<<16)
					P_SamFP(p, PAL_MIXUP, 11)
					P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50<<16)
					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)
					SAM_HurtSFX(s)
					P_SamFP(p, PAL_NUKE, 6)
					p.sam_energy = max(1, $-(50*8/DEF))	 --Mercy mechanic.
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 5 end
					P_InstaThrust(s, s.angle+ANGLE_180, 30<<16)
					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)
				local DMG = (i.type == MT_MINUS) and 35 or 26
				if SAM_Damage(p, DMG)
					P_DoPlayerPain(s.player, i, so)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					P_PlayerWeaponAmmoBurst(s.player)
					SAM_HurtSFX(s)
					p.sam_energy = $-DMG*8/DEF
					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)
				local DMG = (i.type == MT_UNIDUS) and 64 or (i.type == MT_FACESTABBER) and 55 or 49
				if SAM_Damage(p, DMG)
					P_DoPlayerPain(s.player, i, so)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					P_PlayerWeaponAmmoBurst(s.player)
					SAM_HurtSFX(s)
					p.sam_energy = $-DMG*8/DEF
					return true --
				else
					P_KillMobj(s, i, so)
					return true --
				end
			elseif (i.type == MT_VULTURE) or (i.type == MT_CYBRAKDEMON) --Note this is when Brak rams you, not his projectiles.
				local DMG = (i.type == MT_VULTURE) and 51 or 45
				if SAM_Damage(p, DMG)
					P_DoPlayerPain(s.player, i, so)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					SAM_HurtSFX(s)
					p.sam_energy = $-DMG*8/DEF
					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)
					SAM_HurtSFX(s)
					p.sam_energy = $-38*8/DEF
					return true
				else
					P_KillMobj(s, i, so)
					return true
				end
			end
			
		elseif i and so and so.player --When it's a player, then...!
			if YouAreSamus(so)
				so.player.sam_hithud = 18
			end		
			if p.samchallenger or (p == so.player.SAM_RevengeBounty)
				so.SAM_scoreboost = 2 
			else
				local TOPPLAYER,TOPSCORE = SAM.TopPlayer(p)
				if (p == TOPPLAYER) and (so.player.score < p.score-500)
					so.SAM_scoreboost = 2 
				end
			end
			if not so.player.samcmult
				so.player.samcmult = 8
			end
			local CMULT = so.player.samcmult
			
			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/DEF)*8/CMULT) <= 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<<16, 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<<16, cos(s.angle+(ANGLE_45*d))), s.y+FixedMul(-180<<16, 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<<16) --Oh, geez, don't clip up there.
									ghs.state = S_NULL
								end
							end
							local ghs = P_SpawnMobj(s.x+FixedMul(-180<<16, cos(s.angle+(ANGLE_45*d))), s.y+FixedMul(-180<<16, 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<<16)
									ghs.state = S_NULL
								end
							end
							local ghs = P_SpawnMobj(s.x+FixedMul(-180<<16, cos(s.angle+(ANGLE_45*d))), s.y+FixedMul(-180<<16, 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|FF_TRANS10
							ghs.scale = 160000
							ghs.destscale = $*99					
						end
					
						P_AddPlayerScore(so.player, 200*8/CMULT)
						SAM.DeathBallImpact(s, i)
						P_SamFP(p, PAL_NUKE, 7)
						p.sam_energy = $-(200*8/DEF)*8/CMULT
						P_InstaThrust(s, i.angle, 64<<16)
						i.player.sam_shinesparkfly = 0
						i.momx,i.momy = 0,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
						SAM.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/CMULT)
						local ghs = P_SpawnMobj(s.x, s.y, s.z+s.height, MT_SAMUSTHOK)
						ghs.height = 40<<16
						ghs.eflags = s.eflags
						ghs.target = s
						ghs.sprite = SPR_MPR9
						ghs.frame = 26|FF_FULLBRIGHT|FF_TRANS10
						ghs.scale = 160000
						ghs.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/DEF)*8/CMULT) <= 0)
					P_StartQuake(11<<16, 11)
					P_PlayerFlagBurst(p)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					P_AddPlayerScore(so.player, 120*8/CMULT)
					P_SamFP(p, PAL_NUKE, 5)

					InflictWaveOverLoad(s, 60, so)
					SAM.DeathBallImpact(s, i)
					
					S_StartSound(s, sfx_bkpoof)
					local ghs = P_SpawnMobj(s.x, s.y, s.z+s.height, MT_SAMUSTHOK)
					ghs.height = 40<<16
					ghs.eflags = s.eflags
					ghs.target = s
					ghs.sprite = SPR_MPR9
					ghs.frame = 26|FF_FULLBRIGHT|FF_TRANS10
					ghs.scale = 160000
					ghs.deathbolt = true
					p.sam_energy = $-120*8/DEF
					HighPain(s)
					P_Thrust(s, i.angle, 30<<16)
					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!")
						SAM.DeathBallImpact(s, i)
						local ghs = P_SpawnMobj(s.x, s.y, s.z+s.height, MT_SAMUSTHOK)
						ghs.height = 40<<16
						ghs.eflags = s.eflags
						ghs.target = s
						ghs.sprite = SPR_MPR9
						ghs.frame = 26|FF_FULLBRIGHT|FF_TRANS10
						ghs.scale = 160000
						ghs.deathbolt = true
						SamPlayerPrism(s,p,so,true,2)
						P_AddPlayerScore(so.player, 120*8/CMULT)
						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/DEF)*8/CMULT) <= 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/CMULT)
					p.sam_energy = $-(98*8/DEF)*8/CMULT
					P_InstaThrust(s, i.angle, 44<<16)
					i.player.sam_shinesparkfly = 0
					i.momx = 0
					i.momy = 0
					HighPain(s)
					i.state = S_PLAY_SPRING
					P_SetObjectMomZ(i, 4<<16*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/CMULT)
					i.player.sam_shinesparkfly = 0
					i.momx = 0
					i.momy = 0
					i.state = S_PLAY_SPRING
					P_SetObjectMomZ(i, 4<<16*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/DEF)*8/CMULT) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					P_AddPlayerScore(i.player, 75*8/CMULT)
					P_InstaThrust(s, i.angle, 16<<16)
					P_InstaThrust(i, i.angle, -5<<16)
					SamPlayerPrism(s,p,so,true,1)
					HighPain(s)
					p.sam_energy = $-(75*8/DEF)*8/CMULT
					return true
					else
					print(so.player.name+" shred "+p.name+" to pieces with the Screw Attack!")
					P_AddPlayerScore(i.player, 125*8/CMULT)
					SamPlayerPrism(s,p,so,true,1)
					P_KillMobj(s, i, so)
					P_InstaThrust(i, i.angle, -5<<16)
					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/DEF)*8/CMULT) <= 0)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					SAM_HurtSFX(s)
					P_AddPlayerScore(i.player, 46*8/CMULT)
					p.sam_energy = $-(46*8/DEF)*8/CMULT
					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/CMULT)
					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/DEF)*8/CMULT) <= 0) or not G_GametypeHasSpectators()
						P_DoPlayerPain(p, i, so)
						P_PlayerEmeraldBurst(p)
						P_PlayerFlagBurst(p)
						P_PlayerWeaponAmmoBurst(p)
						SAM_HurtSFX(s)
						p.samhands = 80
						if not p.powers[pw_flashing] p.powers[pw_flashing] = 12 end
						P_Thrust(s, i.angle, 11<<16)
						P_SetObjectMomZ(s, -2<<16, 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/CMULT)
							p.sam_energy = $-(30*8/DEF)*8/CMULT
							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/CMULT)
						P_KillMobj(s, i, so)
						return true
					end
				elseif (i.type == MT_PBSHOT)
					local DMG = i.ShortBeam and 2 or 3
					if SAM_Damage(p, DMG)
						if i.ShortBeam
							s.SAM_PSFX = 3
						else
							P_Thrust(s, i.angle, 2<<16)
						end
						SAM_HurtSFX(s)
						P_AddPlayerScore(so.player, DMG)
						s.sam_emstress = $+33
						p.sam_energy = $-DMG*8/DEF
						if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
						return true
					else
						print(so.player.name+" killed "+p.name+" with the Power Beam!")
						P_AddPlayerScore(so.player, 50+DMG)
						P_KillMobj(s, i, so)
						return true
					end
				elseif (i.type == MT_SPSHOT)
					if SAM_Damage(p, 9)
						SAM_HurtSFX(s)
						s.sam_emstress = $+80
						P_AddPlayerScore(so.player, 9*8/CMULT)
						p.sam_energy = $-(9*8/DEF)*8/CMULT
						if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
						P_Thrust(s, i.angle, 222000)
						
						for d = 1,3 
							local PairedShot = d==1 and i.lilbro1 or d==2 and i.lilbro2 or d==3 and i.lilbro3
							if PairedShot and PairedShot.valid
								PairedShot.flags = $|MF_NOCLIPHEIGHT & ~(MF_MISSILE|MF_SOLID|MF_PAIN|MF_FIRE)
								PairedShot.momx,PairedShot.momy,PairedShot.momz,PairedShot.fuse = 0,0,0,18
								P_ExplodeMissile(PairedShot)
							end
						end						
						return true --
					else
						print(so.player.name+" killed "+p.name+" with the Spazer Beam!")
						P_AddPlayerScore(so.player, 59*8/CMULT)
						P_KillMobj(s, i, so)
						return true
					end
				elseif (i.type == MT_WVSHOT)
					if SAM_Damage(p, 12)
						SAM_HurtSFX(s)
						P_AddPlayerScore(so.player, 12*8/CMULT)
						p.sam_energy = $-(12*8/DEF)*8/CMULT
						s.sam_systemreboot = 7
						s.sam_emstress = $+90
						s.momx,s.momy,s.momz = $*3/5,$*3/5,$*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
						for d = 1,2
							local PairedShot = d==1 and i.lilbro1 or d==2 and i.lilbro2
							if PairedShot and PairedShot.valid
								PairedShot.flags = $|MF_NOCLIPHEIGHT & ~(MF_MISSILE|MF_SOLID|MF_PAIN|MF_FIRE)
								PairedShot.momx,PairedShot.momy,PairedShot.momz,PairedShot.fuse = 0,0,0,18
								P_ExplodeMissile(PairedShot)
							end
						end							
						return true --
					else
						print(so.player.name+" killed "+p.name+" with the Wave Beam!")
						P_AddPlayerScore(so.player, 62*8/CMULT)
						P_KillMobj(s, i, so)
						return true --
					end
				elseif (i.type == MT_ICSHOT)
					if not (p.sam_energy-((11*8/DEF)*8/CMULT) <= 0)
						SAM_HurtSFX(s)
						s.sam_emstress = $+130
						P_AddPlayerScore(so.player, 11*8/CMULT)
						p.sam_energy = $-(11*8/DEF)*8/CMULT
						if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
						s.momx,s.momy,s.momz = $*20/21,$*20/21,$*20/21
						P_Thrust(s, i.angle, FRACUNIT)
						if s.valid and s.sambsblchargelvl and p.sammorphed
							s.sambsblchargelvl,p.sams_firecd,p.sams_c1cd = 0,0,0
						end
						return true --
					else
						print(so.player.name+" killed "+p.name+" with the Ice Beam!")
						P_AddPlayerScore(so.player, 61*8/CMULT)
						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/DEF)*8/CMULT) <= 0)
					SAM_HurtSFX(s)
					s.sam_emstress = $+90
					P_AddPlayerScore(so.player, 14*8/CMULT)
					p.sam_energy = $-(14*8/DEF)*8/CMULT
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					P_Thrust(s, i.angle, 2<<16)
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Plasma Beam!")
					P_AddPlayerScore(so.player, 64*8/CMULT)
					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/DEF)*8/CMULT) <= 0)
					SAM_HurtSFX(s)
					s.sam_emstress = $+90
					P_AddPlayerScore(so.player, 15*8/CMULT)
					p.sam_energy = $-(15*8/DEF)*8/CMULT
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 2 end
					P_Thrust(s, i.angle, 2<<16)
					return true
					else
					print(p.name+" got incinerated by "+so.player.name+"'s plasma vortex!")
					P_AddPlayerScore(so.player, 65*8/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PLSHOT) and i.pierced
					if not (p.sam_energy-((7*8/DEF))*8/CMULT <= 0)
					SAM_HurtSFX(s)
					s.sam_emstress = $+70
					P_AddPlayerScore(so.player, 7*8/CMULT)
					p.sam_energy = $-(7*8/DEF)*8/CMULT
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					P_Thrust(s, i.angle, 2<<16)
					return true
					else
					print(so.player.name+" killed "+p.name+" with the Plasma piercing effect!")
					P_AddPlayerScore(so.player, 57*8/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_MINIFIRE)
					if not (p.sam_energy-((4*8/DEF)*8/CMULT) <= 0)
					p.samhands = 80
					s.sam_emstress = $+40
					if so and so.player
					P_AddPlayerScore(so.player, 4*8/CMULT)
					end
					p.sam_energy = $-(4*8/DEF)*8/CMULT
					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/CMULT)
						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/DEF)*8/CMULT) <= 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/CMULT)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 95 end
					p.sam_energy = $-(67*8/DEF)*8/CMULT
					P_SetObjectMomZ(s, 9<<16)
					P_SamFP(p, PAL_MIXUP, 11)
					P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50<<16)
					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/CMULT)
					else
					P_AddPlayerScore(so.player, 67*8/CMULT)
					end
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PBCHARGESHOT)
					if not (p.sam_energy-((30*8/DEF)*8/CMULT) <= 0)
					P_PlayerFlagBurst(p)
					SAM_HurtSFX(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					P_AddPlayerScore(so.player, 30*8/CMULT)
					p.sam_energy = $-(30*8/DEF)*8/CMULT
					P_Thrust(s, i.angle, 8<<16)
					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/CMULT)
					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/DEF))*8/CMULT) <= 0)
					P_PlayerFlagBurst(p)
					SAM_HurtSFX(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,false,2)
					P_AddPlayerScore(so.player, ((40-i.spazerdist)*8/CMULT))
					p.sam_energy = $-((40-i.spazerdist)*8/DEF)*8/CMULT
					P_Thrust(s, i.angle, 12<<16)
					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/CMULT)
					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/DEF)*8/CMULT) <= 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/CMULT)
					p.sam_energy = $-(64*8/DEF)*8/CMULT
					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/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SPAZERSHOCK)
					if not (p.sam_energy-((56*8/DEF)*8/CMULT) <= 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/CMULT)
					p.sam_energy = $-(56*8/DEF)*8/CMULT
					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/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_WVCHARGESHOT) and not i.bufferguard
					if not (p.sam_energy-((41*8/DEF)*8/CMULT) <= 0)
					P_PlayerFlagBurst(p)
					SAM_HurtSFX(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					s.momx,s.momy,s.momz = $/3,$/3,$*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/CMULT)
					p.sam_energy = $-(41*8/DEF)*8/CMULT
					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/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_WVCHARGESHOT) and i.bufferguard
					if not (p.sam_energy-((46*8/DEF)*8/CMULT) <= 0)
					P_PlayerFlagBurst(p)
					SAM_HurtSFX(s)
					P_PlayerEmeraldBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					p.samhands = 80
					InflictWaveOverLoad(s, 50, so)
					P_AddPlayerScore(so.player, 46*8/CMULT)
					P_SamFP(p, PAL_NUKE, 1)
					p.sam_energy = $-(46*8/DEF)*8/CMULT
					P_Thrust(s, i.angle, 22<<16)
					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/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_ICCHARGESHOT) and not i.icesummon
					if not (p.sam_energy-((38*8/DEF)*8/CMULT) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,false,2)
					P_PlayerWeaponAmmoBurst(p)
					SAM_HurtSFX(s)
					P_AddPlayerScore(so.player, 38*8/CMULT)
					P_SamFP(p, PAL_MIXUP, 5)
					p.sam_energy = $-(38*8/DEF)*8/CMULT
					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/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_ICCHARGESHOT) and i.icesummon
					if not (p.sam_energy-((49*8/DEF)*8/CMULT) <= 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!")
					SAM_HurtSFX(s)
					P_AddPlayerScore(so.player, 49*8/CMULT)
					P_SamFP(p, PAL_MIXUP, 5)
					p.sam_energy = $-(49*8/DEF)*8/CMULT
					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/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_ICCHARGECOMBO) 
					if not (p.sam_energy-((56*8/DEF)*8/CMULT) <= 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/CMULT)
					P_SamFP(p, PAL_MIXUP, 10)
					p.sam_energy = $-(56*8/DEF)*8/CMULT
					P_Thrust(s, i.angle, 20<<16)
					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/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_PLCHARGESHOT) and not i.pierced
					if not (p.sam_energy-((54*8/DEF)*8/CMULT) <= 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)
					SAM_HurtSFX(s)
					P_AddPlayerScore(so.player, 54*8/CMULT)
					P_SamFP(p, PAL_NUKE, 5)
					p.sam_energy = $-(54*8/DEF)*8/CMULT
					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<<16)
					return true
					else
					print(so.player.name+" vaporized "+p.name+" with the Plasma Charge Shot!")
					P_AddPlayerScore(so.player, 105*8/CMULT)
					P_KillMobj(s, i, so)
					return true
					end

				elseif (i.type == MT_PLCHARGESHOT) and i.pierced
					if not (p.sam_energy-((28*8/DEF)*8/CMULT) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					p.samhands = 80
					SamPlayerPrism(s,p,so,false,1)
					P_PlayerWeaponAmmoBurst(p)
					SAM_HurtSFX(s)
					P_AddPlayerScore(so.player, 28*8/CMULT)
					P_SamFP(p, PAL_NUKE, 5)
					p.sam_energy = $-(28*8/DEF)*8/CMULT
					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<<16)
					return true
					else
					print(so.player.name+" vaporized "+p.name+" with the Plasma Charge Shot's piercing effect!")
					P_AddPlayerScore(so.player, 78*8/CMULT)
					P_KillMobj(s, i, so)
					return true
					end

				elseif (i.type == MT_SAMMISSILE)
					if not (p.sam_energy-((20*8/DEF)*8/CMULT) <= 0)
					SAM_HurtSFX(s)
					p.samhands = 80
					s.sam_emstress = $+75
					P_AddPlayerScore(so.player, 20*8/CMULT)
					p.sam_energy = $-(20*8/DEF)*8/CMULT
					P_SamFP(p, PAL_NUKE, 2)
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					P_Thrust(s, i.angle, 6<<16)
					return true
					else
					print(so.player.name+" barraged "+p.name+" to death with missiles")
					P_AddPlayerScore(so.player, 70*8/CMULT)
					P_KillMobj(s, i, so)
					return true
					end
				elseif (i.type == MT_SAMSUPERMISSILE) and i.smhyper
					if not (p.sam_energy-((80*8/DEF)*8/CMULT) <= 0)
					P_DoPlayerPain(p, i, so)
					P_PlayerEmeraldBurst(p)
					P_PlayerFlagBurst(p)
					P_PlayerWeaponAmmoBurst(p)
					HighPain(s)
					P_AddPlayerScore(so.player, 80*8/CMULT)
					print(p.name+" was overwhelmed by the True Hyper Beam's radiation!")
					p.sam_energy = $-(80*8/DEF)*8/CMULT
					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<<16)
					return true

					else
					print(p.name+" couldn't survive "+so.player.name+"'s Hyper Beam Combo!")
					P_AddPlayerScore(so.player, 80*8/CMULT)
					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/DEF)*8/CMULT) <= 0)
						i.ijusthitthisguy = s
						P_DoPlayerPain(p, i, so)
						P_PlayerEmeraldBurst(p)
						P_PlayerFlagBurst(p)
						P_PlayerWeaponAmmoBurst(p)
						SAM_HurtSFX(s)
						P_AddPlayerScore(so.player, 46*8/CMULT)
						print(p.name+" got sent flying with "+so.player.name+"'s Super Missile!")
						p.sam_energy = $-(46*8/DEF)*8/CMULT
						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<<16)
						return true
					else
						i.ijusthitthisguy = s
						print(p.name+" couldn't survive "+so.player.name+"'s Super Missile.")
						P_AddPlayerScore(so.player, 96*8/CMULT)
						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/DEF)*8/CMULT) <= 0)
						s.sam_emstress = $+75
						SAM_HurtSFX(s)
						p.samhands = 80
						P_AddPlayerScore(so.player, 11*8/CMULT)
						p.sam_energy = $-(11*8/DEF)*8/CMULT
						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<<16)
						return true
					else
						print(so.player.name+" bombed "+p.name+" to death")
						P_AddPlayerScore(so.player, 61*8/CMULT)
						P_KillMobj(s, i, so)
						return true
					end
					
				elseif (i.type == MT_SAMPOWERBOMB)
				
					if i and (i.phase == nil or (i.phase < 2))
						if not (p.sam_energy-((160*8/DEF)*8/CMULT) <= 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/CMULT/i.srdcr)
							else
								P_AddPlayerScore(so.player, 160*8/CMULT)
							end
							if i and i.valid			
								i.srdcr = 2
							end
							p.samhands = 80
							p.sam_energy = $-(160*8/DEF)*8/CMULT
							P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -100<<16)
							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/CMULT/i.srdcr)
							else
								P_AddPlayerScore(so.player, 210*8/CMULT)
							end
							if i and i.valid			
								i.srdcr = 2
							end
							P_KillMobj(s, i, so)
							return true
						end
					elseif i.phase == 2
						if not (p.sam_energy-((75*8/DEF)*8/CMULT) <= 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/CMULT/i.srdcr)
							else
								P_AddPlayerScore(so.player, 75*8/CMULT)
							end
							if i and i.valid			
								i.srdcr = 2
							end
							p.samhands = 80
							p.sam_energy = $-(75*8/DEF)*8/CMULT
							P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50<<16)
							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/CMULT/i.srdcr)
							else
							P_AddPlayerScore(so.player, 125*8/CMULT)
							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/DEF)*8/CMULT) <= 0)
							P_DoPlayerPain(p, i, so)
							P_PlayerEmeraldBurst(p)
							P_PlayerFlagBurst(p)
							P_PlayerWeaponAmmoBurst(p)
							SAM_HurtSFX(s)
							if i.srdcr
								P_AddPlayerScore(so.player, 45*8/CMULT/i.srdcr)
							else
								P_AddPlayerScore(so.player, 45*8/CMULT)
							end
							if i and i.valid			
								i.srdcr = 2
							end
							p.samhands = 80
							p.sam_energy = $-(45*8/DEF)*8/CMULT
							P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -30<<16)
							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/CMULT/i.srdcr)
							else
								P_AddPlayerScore(so.player, 95*8/CMULT)
							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)
						local SAMHANDS = p.samhands or 0
						if not (SAMHANDS > 70)
							for i = 1,5
								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<<16)
							end
							P_PlayerRingBurst(p, 8)
						end
						if i and (i.type == MT_THROWNAUTOMATIC)		
							if not (p.sam_energy-(14*8/DEF) <= 0)
								s.sam_emstress = $+69
								SAM_HurtSFX(s)
								p.samhands = 80
								p.sam_energy = $-14*8/DEF
								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<<16)
								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/DEF) <= 0)
								P_SetObjectMomZ(s, 6<<16, false)
								s.state = S_PLAY_PAIN		
								s.sam_emstress = $+69
								SAM_HurtSFX(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/DEF
									P_AddPlayerScore(so.player, 11)
									P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -10<<16)	
								else
									p.sam_energy = $-15*8/DEF
									P_AddPlayerScore(so.player, 15)
									P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -14<<16)
								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/DEF) <= 0)
								P_DoPlayerPain(p, i, so)
								P_PlayerFlagBurst(p)
								SAM_HurtSFX(s)
								P_AddPlayerScore(so.player, 50)
								p.samhands = 80
								p.sam_energy = $-43*8/DEF
								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/DEF) <= 0)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					P_PlayerWeaponAmmoBurst(s.player)
					SAM_HurtSFX(s)
					p.samhands = 80
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 3 end
					p.sam_energy = $-10*8/DEF
					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)
		
			p.samhands = 80
			P_PlayerEmeraldBurst(s.player)
			P_PlayerFlagBurst(s.player)
			s.momx,s.momy = $/2,$/2
			
			if not (p.sam_energy-(21*8/DEF) <= 0)
				SAM_HurtSFX(s)
				if not p.lavaflash
					p.lavaflash = 17 
				end
				p.sam_energy = $-21*8/DEF
				P_SetObjectMomZ(s, 3<<16, true)
				if not G_GametypeHasSpectators() and i and s
					P_Thrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -20<<16)
				end
				return true --
			else
				P_KillMobj(s, i, so) return true --
			end

		elseif ((s.eflags & MFE_TOUCHLAVA) or (dmgtype == DMG_ELECTRIC)) and not i and not so
		and not ((p.sam_gravitysuit == 2) or p.lavaflash)
		
			s.momx,s.momy = $*5/6,$*5/6
			p.samhands = 80
			P_PlayerFlagBurst(p)
			local EDMG = (SAMUSDIFFICULTY==2) and 32 or 22 --No suit upgrade damage is pretty strong....
			if p.sam_gravitysuit
				EDMG = (EDMG==32) and 14 or 10 --Varia Suit's heavily reduced damage.
			end
			
			if not (p.sam_energy-EDMG <= 0)
				SAM_HurtSFX(s)
				p.powers[pw_flashing] = (not (p.powers[pw_flashing])) and 13 or $ 
				p.sam_energy = $-EDMG 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/DEF) <= 0)
			if (p.sam_energy > 9)
				P_DoPlayerPain(s.player, i, so)
				SAM_HurtSFX(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<<16)
				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/DEF) <= 0)
				P_DoPlayerPain(s.player, i, so)
				HighPain(s)
				p.sam_energy = $-78*8/DEF
				P_InstaThrust(s, R_PointToAngle2(s.x, s.y, i.x, i.y), -50<<16)
				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)
				SAM_HurtSFX(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<<16)
				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/DEF) <= 0)
					P_DoPlayerPain(s.player, i, so)
					P_PlayerEmeraldBurst(s.player)
					P_PlayerFlagBurst(s.player)
					SAM_HurtSFX(s)
					if not (p.sam_energy-(43*8/DEF) <= 0)
					p.sam_energy = $-43*8/DEF
					else
					p.sam_energy = 1
					end
					P_Thrust(s, i.angle, 14<<16)
					return true --
				else
					P_KillMobj(s, i, so)
					return true --
				end
			elseif (i.type == MT_METROIDDROOL)
				if not (p.sam_energy-(11*8/DEF) <= 0)
					SAM_HurtSFX(s)
					p.sam_energy = $-11*8/DEF
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 20 end
					P_Thrust(s, s.angle, -18<<16)
					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/DEF) <= 0)
					SAM_HurtSFX(s)
					i.mahflamer.smontracker.flamercooldown = 90
					if not (i.mahflamer.type == MT_BLUECRAWLA) and not (p.sam_energy-(36*8/DEF) <= 0)
					p.sam_energy = $-36*8/DEF
					elseif not (p.sam_energy-(27*8/DEF) <= 0)
					p.sam_energy = $-27*8/DEF
					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<<16)
					return true --
				else
					P_KillMobj(s, i, so)
					return true --
				end				
			else
				if not (p.sam_energy-(36*8/DEF) <= 0)
					SAM_HurtSFX(s)
					P_PlayerFlagBurst(s.player)
					p.sam_energy = $-36*8/DEF
					if not p.powers[pw_flashing] p.powers[pw_flashing] = 50 end
					P_Thrust(s, i.angle, 4<<16)
					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/DEF) <= 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<<16)
				p.sam_energy = $-75*8/DEF
				P_SamFP(p, PAL_NUKE, 10)
				P_StartQuake(70<<16, 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_SPIKE)
		or (i.type == MT_UNIDUS) or (i.type == MT_CYBRAKDEMON) or (i.type == MT_CYBRAKDEMON_ELECTRIC_BARRIER)
		)
			if not (p.sam_energy-(45*8/DEF) <= 0)
				P_DoPlayerPain(s.player, i, so)
				P_PlayerEmeraldBurst(s.player)
				P_PlayerFlagBurst(s.player)
				SAM_HurtSFX(s)
				p.sam_energy = $-45*8/DEF
				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/DEF) <= 0)
				P_DoPlayerPain(s.player, i, so)
				P_PlayerEmeraldBurst(s.player)
				P_PlayerFlagBurst(s.player)
				SAM_HurtSFX(s)
				p.sam_energy = $-i.customsamusdamage*8/DEF
				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/DEF) <= 0)
				P_DoPlayerPain(s.player, i, so)
				P_PlayerEmeraldBurst(s.player)
				P_PlayerFlagBurst(s.player)
				SAM_HurtSFX(s)
				p.sam_energy = $-38*8/DEF
				return true --
			else
				P_KillMobj(s, i, so)
				return true --
			end
		end
	end
end, MT_PLAYER)

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


addHook("ShouldDamage", function(s, i, so, damage, dmgtype)
	if i
		if (i.type == MT_SAMMONBREAKER)
			return false --
		elseif (i.type == MT_MINIFIRE)
			if i.target local t = i.target
				if t == s
					return false --
				elseif t.player and G_GametypeHasTeams() and s.player
				and s.player.ctfteam and s.player.ctfteam == t.player.ctfteam
					return false --
				end
			end
			if i.samusshot and not ( (gametyperules & GTR_RINGSLINGER) or G_GametypeHasSpectators() )
				return false --
			end
		end
	end
	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<<16) --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<<16)
					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 
			if not (dmgtype and (dmgtype & DMG_DEATHMASK)) 	
				if (s.eflags & MFE_TOUCHLAVA) or (P_PlayerTouchingSectorSpecial(p, 1, 3))
					if p.lavaflash or p.sam_gravitysuit == 2
						if (s.z < s.floorz-100<<16)
							s.z = s.floorz+5<<16 --Solid lava is fucking stupid.
						end	
						return false --The Gravity Suit negates lava damage. And you're also temporarily immune.
					end
				elseif (dmgtype == DMG_WATER or P_PlayerTouchingSectorSpecial(p, 1, 2)) and p.sam_gravitysuit
					return false --The Varia Suit negates poison water damage like in Zero Mission.	
				elseif p.sam_spiderball and p.sammorphed
					if (P_PlayerTouchingSectorSpecial(p, 1, 4) or dmgtype == DMG_ELECTRIC)
						if (leveltime % 3 == 0) --Effects.
							S_StartSound(s, sfx_cmol)
							local ZHEIGHT = (s.eflags & MFE_VERTICALFLIP) and s.height or -s.height/10
							local ghs = P_SpawnMobj(s.x, s.y, s.z+ZHEIGHT , MT_SAMUSZAP)
							ghs.scale = (leveltime%2) and s.scale or $/2
							ghs.blendmode = AST_ADD
							ghs.renderflags = RF_FULLBRIGHT|RF_NOCOLORMAPS
							ghs.dispoffset = 88
							ghs.momx,ghs.momy,ghs.momz = s.momx,s.momy,s.momz
							ghs.eflags = s.eflags
							ghs.color = SKINCOLOR_GOLD
							ghs.morning = 4
						end
						SamSpiderCharge(p, s, 200) return false --
					end
				end
			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 not (gametyperules & GTR_FRIENDLYFIRE)
		and ((gametype <= GT_RACE) or (CBW_Chaos and gametype == GT_CHAOS))
			return false --
		elseif G_GametypeHasTeams() and so.player
			if (p.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_DEATHMASK)) 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<<16)
				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
				if SAM_FirstPerson(p, true)
					SAM_CMD(p, "lol", "true", "true", "lol")
				end
				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 SAMUSDIFFICULTY == 2
			if not (p.sam_energy-65 <= 0) and dmgtype and (dmgtype & DMG_DEATHMASK) --Can I trust dmgtype, though??
				P_SpawnMobj(s.x, s.y, s.z+s.height/2, MT_SMOKE)
				SAM_HurtSFX(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
				p.continues = max($,1)
				if p.gameoverready
					if not netgame
						p.crystalflashchance = $+30
					end
					p.sam_gameover = p.sam_gameover and $+1 or 1
					p.gameoverready = nil
				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_DEATHMASK) --Instant death stuff gives a quick respawn with some energy loss.
				P_SpawnMobj(s.x, s.y, s.z+s.height/2, MT_SMOKE)
				SAM_HurtSFX(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
				p.continues = max($,1)
				if p.gameoverready
					if not netgame
						p.crystalflashchance = $+40
					end
					p.sam_gameover = p.sam_gameover and $+1 or 1 --Gameover count for tracking!
					p.gameoverready = nil
				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<<16, s.z+s.height*2, MT_PBOM)
			P_SpawnMobj(s.x, s.y+130<<16, s.z+s.height, MT_PBOM)
			P_SpawnMobj(s.x, s.y+50<<16, s.z+s.height, MT_SPKU)
			P_SpawnMobj(s.x-50<<16, s.y+50<<16, 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<<16, 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<<16, MT_MPKU)
			return
		else
			P_SpawnMobj(s.x, s.y, s.z+32<<16, 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<<16)
				elseif i.type == MT_SAMPOWERBOMB and i.phase or i.type == MT_HBSHOT or (i.type == MT_SPAZERSHOCK)
					Dustintegrate(s, 0, i, 20<<16)
				elseif i.player
					Dustintegrate(s, 0, i, 15<<16, true)
				else
					Dustintegrate(s, 0, i, 7<<16) --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
	
		if YouAreSamus(s)
			P_StartQuake(12<<16, 2)
			S_StartSound(s, sfx_pzpain)		
			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<<16)
				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
			
			if not s.PhazonImmunity --For custom support.
			
				P_StartQuake(12<<16, 2)
				S_StartSound(s, sfx_pzpain)
				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<<16)
					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<<16)
					s.state = S_PLAY_PAIN
				elseif not p.rings
					P_KillMobj(s)
				end	
			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<<16)
		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<<16)
		or (s.z > v.z+v.height+22<<16)
		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 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<<16, 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<<16, -235<<16, 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<<16, 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<<16, 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")