//Super Mystic Sonic in the end, is merely an extension of Sonic. Though most people
//would probably prefer to choose SMS as a skin, I still believe a manual transformation would fit.

addHook("MobjThinker", function(s)
if not s.player
return end
local p = s.player
		if p.name
			if (p.ctfteam == 1)
				p.ctfnamecolor = "\x85"+p.name+"\x80"
			elseif (p.ctfteam == 2)
				p.ctfnamecolor = "\x84"+p.name+"\x80"
			else
				p.ctfnamecolor = p.name
			end
		end

		//Set your name color in CTF and team match. 
		//WHY isn't this build in standard with the HurtMsg Hook?

		if not G_GametypeHasTeams()
		and p.ctfteam
			p.ctfteam = 0
		end

		if (p.sms_transformstate and not ( (s and s.skin == "sms") or G_PlatformGametype() ))
			p.sms_transformstate = 0
		end
		if p.sms_originalcolor == nil
			if not (s and s.skin == "sms") and p.skincolor
			p.sms_originalcolor = p.skincolor
			else
			p.sms_originalcolor = SKINCOLOR_BLUE
			end
		end
		if (p.cmd.buttons & BT_CUSTOM3) and s
		and not (p.speed > FRACUNIT)
		and P_IsObjectOnGround(s)
		and not s.battlemodsms
		and ((s.health and (p.rings > 29 or (s.smsvsboss and (p.rings >= s.smsvsboss)))) or (p.sms_sontransform and p.sms_sontransform >= 69))
		and A_SMScompatibleskin(s)
		and not p.mysticsuper // and not p.powers[pw_super] 
		and not p.powers[pw_carry]
		and not G_GametypeHasSpectators() //SMS isn't a blatant advantage in these modes.
		and not (p.spinhold and (p.spinhold > 1))
		and not p.powers[pw_nocontrol]
		and not p.exiting
		and not (p.cmd.forwardmove < 0)
		and not (p.pflags & PF_JUMPED)
			s.tnospina = true
				if (p.cmd.buttons & BT_USE)
				p.powers[pw_nocontrol] = 2
				p.pflags = $ & ~PF_SPINNING & ~PF_STARTDASH
				p.sms_sontransform = 1 //Counts up elsewhere
				s.state = S_PLAY_FALL
				P_SetObjectMomZ(s, 95355)
				end
		end
		if p.sms_sontransform
		  if (p.rings < 30) and (p.sms_sontransform < 69)
		  and not (s.smsvsboss and (p.rings >= s.smsvsboss))
		    if not P_PlayerInPain(p) and not p.powers[pw_carry]
		    s.state = S_PLAY_FALL
			end
		  p.sms_sontransform = 0
		  elseif (p.sms_sontransform and not (s and (s.skin == "sms" or A_SMScompatibleskin(s) )))
		  or (leveltime and (leveltime < 2))
		  or not G_PlatformGametype() or P_PlayerInPain(p)
		  p.sms_sontransform = 0
		  else
			if ((p.sms_sontransform >= 69) or (p.speed < FRACUNIT))
			and (((p.cmd.buttons & BT_CUSTOM3) and (p.cmd.buttons & BT_USE)) or (p.sms_sontransform >= 69))
				if (p.sms_sontransform < 20)
				P_SetObjectMomZ(s, 95777)
					if not (s.state == S_PLAY_FALL)
						s.state = S_PLAY_FALL
					end
				end
				if (p.sms_sontransform >= 20 and p.sms_sontransform < 30)
				P_SetObjectMomZ(s, 67000)
					s.sprite2 = SPR2_TRNS
					s.frame = C
					s.tics = 55
				end
				if (p.sms_sontransform == 2)
					S_StartSound(s, sfx_s3k7e)
				end
				if (p.sms_sontransform == 30)
					S_StartSound(s, sfx_s3ka6)
				end
				if (p.sms_sontransform == 43)
					S_StartSound(s, sfx_s3ka0)
				end
				if (p.sms_sontransform >= 30 and p.sms_sontransform < 52)
				P_SetObjectMomZ(s, 32000)
				s.sprite2 = SPR2_TRNS
				s.frame = A
				s.tics = 4
					A_BossScream(s, 0, MT_SMSTSPARK)
				end
				if (p.sms_sontransform >= 52 and p.sms_sontransform < 69)
				P_SetObjectMomZ(s, 9001)
				s.sprite2 = SPR2_TRNS
				s.frame = B
				s.tics = 4
					A_BossScream(s, 0, MT_SMSTSPARK)
				end

				if (p.sms_sontransform == 69) //This is the point where you transform into SMS.
				and s // and (s.health and (p.rings > 29 or (s.smsvsboss and (p.rings >= s.smsvsboss))))
				P_SetObjectMomZ(s, 1)
				p.sms_originalcolor = p.skincolor //Remember the player's original color.
				P_FlashPal(p, PAL_MIXUP, 7)
				if p.powers[pw_super]
				p.powers[pw_super] = 0
				P_SpawnShieldOrb(p)
				P_RestoreMusic(p)
				end
				P_RadiusAttack(s, s, 100*FRACUNIT)
				p.presmsskin = s.skin
				s.skin = "sms"	
				R_SetPlayerSkin(p, "sms") //For the life icon.
				if not (p.powers[pw_shield] & SH_FIREFLOWER)
				and not ((mariomode) and p.powers[pw_invulnerability])
					s.color = 0
				end
				if not p.smscoatc5 or not p.shinyglosscoat
					if s.skin == "sms" -- Just making 100% sure
					p.skincolor = SKINCOLOR_YELLOW
					end
				end
				S_StartSound(s, sfx_s3k9f)
				p.sms_transformstate = 1
				P_GivePlayerRings(p, -30)
				s.state = S_HMSTRANSFORM7
				s.tics = 550
					for d = 0,15 //0,15 means it iterates form 0 to 15, executing the paraloop 16 times total
						P_SpawnParaloop(s.x, s.y, s.z+FixedMul(20*FRACUNIT, s.scale), 10*FRACUNIT, 16, MT_NIGHTSPARKLE, d*ANGLE_22h, S_SMSTSPARK1, false)
					end
				end 
				p.active_supertrans = false
				p.custom3down = true
				p.superanim = 0 
				p.powers[pw_nocontrol] = 2
			else
			p.sms_sontransform = 0
			s.state = S_PLAY_FALL
			end

			if (p.sms_sontransform >= 70 and p.sms_sontransform < 86)
			P_SetObjectMomZ(s, 0)
			s.state = S_HMSTRANSFORM7
			s.tics = 550
			end
			if (p.sms_sontransform >= 86 and p.sms_sontransform < 96)
			P_SetObjectMomZ(s, 0)
			s.state = S_HMSTRANSFORM1
			s.tics = 550
			end
			if (p.sms_sontransform >= 96)
			s.state = S_PLAY_SPRING
			p.sms_sontransform = 0
			end
		  end
		end

		if (s and (s.skin == "sms" and p.sms_transformstate))
		A_BossScream(s, 0, MT_SMSTSPARK)
			if ((p.cmd.buttons & BT_CUSTOM3) and (p.cmd.buttons & BT_USE)) //Untransform, detransform, unbecome
			and not p.powers[pw_carry]
			and not (p.speed > FRACUNIT)
			and not (p.spinhold and (p.spinhold > 1))
			and not p.powers[pw_nocontrol]
			and (p.cmd.forwardmove < 0)
			and P_IsObjectOnGround(s)
			and not (p.pflags & PF_JUMPED)
				A_SMSTOSONIC(s, true)	
			elseif (leveltime and leveltime < 2)
			or p.exiting
			or not s.health
				if p.exiting
					A_SMSTOSONIC(s, nil, true, nil)
				elseif ((p.panim == PA_ROLL) or (p.panim == PA_RUN) or (p.panim == PA_WALK) or (s.state == S_PLAY_DEAD) or (s.state == S_PLAY_PAIN))
					A_SMSTOSONIC(s, nil, nil, true)		
				else
					A_SMSTOSONIC(s, nil, true, true)
				end
			end
		end
end, MT_PLAYER)

//Spawn scatter and other drops!

local function pkufling(z, s)
		z.target = s
		z.fuse = 415
		z.flags2 = $|MF2_DONTRESPAWN
		z.flags = $|MF_BOUNCE & ~(MF_NOGRAVITY|MF_NOCLIPHEIGHT)
		
		if (z.type == MT_SMSSILVERRING)
			z.color = SKINCOLOR_BONE
			z.scale = z.target.scale*2
			z.fuse = 280
		else
			z.scale = z.target.scale
		end
		z.angle = (P_RandomRange(1, 359))*ANG1
		P_InstaThrust(z, z.angle, 235000)
		P_SetObjectMomZ(z, 4*FRACUNIT)
end
//Recoil off enemies from tricks if you hit them! This needs to go BEFORE the transformation damage hook.

addHook("MobjDamage", function(s, i, so)
  if s and s.player
local p = s.player
	if p.hypermysticsonic
	return true
	end
	if p.smspickup and p.smspickup.valid and (i == p.smspickup or so == p.smspickup) //Don't get killed by what you're holding
	return true
	end
	if p.footsweepanim and s.battlemodsms
		if i and i.player and (i.player.pflags & (PF_SPINNING|PF_JUMPED))
			p.footsweep01 = 0
			p.footsweep02 = 0
			p.footsweep03 = 0
			p.footsweepanim = false
			p.sweepanimrecovery = 0
			p.smsdivetimer = 0
			p.smsdivefloat = 0
			p.smsatomicdivefail = 0
			s.height = P_GetPlayerHeight(p)
			s.state = S_PLAY_ROLL
			p.pflags = $|PF_SPINNING
		return true
		end
	end
	if so and so.player and so.skin == "sms"
		if ((gametype == GT_COOP) or (G_GametypeHasTeams() and so.player.ctfteam == s.player.ctfteam) )
			if i and (i.type == MT_SMSFIREBLAST)	
			P_GivePlayerRings(p, 1)
				if p.boostmeter ~= nil
				p.boostmeter = $+18
				end
				if i.valid and i.health
				P_SpawnMobj(i.x, i.y, i.z, MT_SPARK)
				i.gzmd = P_SpawnGhostMobj(i)
				i.gzmd.destscale = i.gzmd.scalespeed+1
				P_HomingAttack(i.gzmd, s)
				S_StartSound(s, sfx_itemup)
				S_StartSound(s, sfx_s1c0)
				i.state = S_NULL
				end
			end
			return true
		elseif so.battlemodsms and i and (i.type == MT_SMSFIREBLAST) and not (i.mysticflame and i.fuse and (i.fuse < 297))
			if p.powers[pw_nocontrol] //You CAN hurt already stunned players
			else
			p.panim = PA_FALL
			s.state = S_PLAY_FALL
			p.pflags = $&~(PF_GLIDING|PF_JUMPED|PF_BOUNCING|PF_THOKKED|PF_SPINNING)
			if i.mysticflame
			p.powers[pw_nocontrol] = 56
			else
			p.powers[pw_nocontrol] = 45
			end
			p.powers[pw_flashing] = 2
			S_StartSound(s, sfx_kc4d)
			s.flags2 = $|MF2_DONTDRAW
			s.recoilangle = i.angle
			s.recoilthrust = 48*FRACUNIT //Regular flames only stun players for balance reasons
				if i and i.valid and i.health
				P_ExplodeMissile(i)
				end
				return true
			end
		end
	end
//If you've got a good dive going, don't let some measly enemy stop your fun.
	if (s.player.smsdivetimer and (s.player.smsdivetimer > 9))
		if i
		and (i.flags & (MF_ENEMY|MF_BOSS))
		return true
		end
	end
/*	if (p.hometrickanim or  p.sms_stompanim)
	and not p.powers[pw_invulnerability]
		if (s and s.skin == "sms")
			if i and (i.flags & (MF_ENEMY|MF_BOSS))
				if p.hometrickanim
					s.state = S_PLAY_ROLL
				end
				p.pflags = $|PF_JUMPED
				p.hometrickanim = false
				return true			
			end
		end
  	end */
 
  	if p.powers[pw_shield] //Don't drop stuff or detransform if you're shielded
	return
	end
	
//Drop weapons for players when hit!

	if G_RingSlingerGametype() and not s.battlemodsms and s.skin == "sms"
			if p.smssc
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+33*FRACUNIT, MT_SCATTERPICKUP)
				pkufling(p.smspku, s)
				p.smssc = false
			end
			if p.smsex
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+33*FRACUNIT, MT_EXPLODEPICKUP)
				p.smspku.target = s
				pkufling(p.smspku, s)
				p.smsex = false
			end
			if p.smsgre
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+33*FRACUNIT, MT_GRENADEPICKUP)
				pkufling(p.smspku, s)
				p.smsgre = false
			end
			if p.smsat
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+33*FRACUNIT, MT_AUTOPICKUP)
				pkufling(p.smspku, s)
				p.smsat = false
			end
			if p.smsra
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+33*FRACUNIT, MT_RAILPICKUP)
				pkufling(p.smspku, s)
				p.smsra = false
			end
			if p.smsin
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+33*FRACUNIT, MT_INFINITYRING)
				pkufling(p.smspku, s)
				p.smsin = false
			end
			if (p.rings > 78)
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+55*FRACUNIT, MT_SMSSILVERRING)
				pkufling(p.smspku, s)
			end
			if (p.rings > 158)
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+55*FRACUNIT, MT_SMSSILVERRING)
				pkufling(p.smspku, s)
			end
			if (p.rings > 238)
				p.smspku = P_SpawnMobj(s.x, s.y, s.z+55*FRACUNIT, MT_SMSSILVERRING)
				pkufling(p.smspku, s)
			end
	end
	
//SMS can take 2 hits when manually transformed before detransforming, not counting shields.
//The first hit he has an extra 50% defense, only losing half of his rings.
//pw_bouncering, pw_railring, pw_automaticring, pw_explosionring, pw_scatterring, and pw_grenadering 
	
	if (s.player.sms_transformstate and s and s.skin == "sms")
	   if (s.player.sms_transformstate == 1) and i and not ( (i.flags & MF_PAIN|MF_ENEMY|MF_BOSS) and ((s.player.sms_boostlevel > 64) or s.airboostimmune) )
			if (p.rings > 49)
			P_DoPlayerPain(p)
			P_PlayerRingBurst(p, -1)
			P_PlayRinglossSound(s)
			p.sms_transformstate = 2
			P_GivePlayerRings(p, p.rings/-2)
				return true
			elseif (p.rings == 1)
			S_StartSound(s, sfx_shldls)
			P_DoPlayerPain(p)
			P_PlayerRingBurst(p, 0)
			p.sms_transformstate = 2
				return true
			elseif (p.rings == 0) //Block a death blow!
			P_DoPlayerPain(p)
			P_PlayRinglossSound(s)
			S_StartSound(s, sfx_shldls)
			
				P_SpawnGhostMobj(s)
				P_FlashPal(p, PAL_MIXUP, 7)
				S_StartSound(target, sfx_s3k4e)
					if p.presmsskin
					R_SetPlayerSkin(p, p.presmsskin)
					s.skin = p.presmsskin					
					else
					R_SetPlayerSkin(p, "sonic")
					s.skin = "sonic"
					end
				if not s.battlemodsms
				P_NukeEnemies(s, s, 350*FRACUNIT)
				else --Give score bonus and send SMS flying
				s.lastbmrings = p.rings
					if s.supersmsrecoil and i
						P_SetObjectMomZ(s, 10*FRACUNIT)				
						s.supersmsrecoil2ang = R_PointToAngle2(s.x, s.y, i.x, i.y)
						P_InstaThrust(s, s.supersmsrecoil2ang, -65*FRACUNIT)
						s.supersmsrecoil2 = 17
						S_StartSound(s, sfx_smscrt)
						S_StartSound(s, sfx_nerf)
						S_StartSound(s, sfx_smscr2)
						if so and so.player
						P_FlashPal(so.player, PAL_MIXUP, 4)
						end
					end
					if so and so.player and (so.skin != "sms")
						if s.supersmsrecoil
						so.player.score = $+50 //Slight score boost for hitting SMS!
						CONS_Printf(so.player, "\x82"+"Gained 50 score bonus for taking down SMS hard!")
						else
						so.player.score = $+25 //Slight score boost for hitting SMS!
						CONS_Printf(so.player, "\x82"+"Gained 25 score bonus for taking down SMS!")
						end
					end
				end
				if not (p.powers[pw_shield] & SH_FIREFLOWER)
				and not ((mariomode) and p.powers[pw_invulnerability])
					s.color = p.sms_originalcolor
				else
					s.color = SKINCOLOR_WHITE
				end
				p.skincolor = p.sms_originalcolor
				p.sms_transformstate = 0
				return true
			else
			P_DoPlayerPain(p)
			P_PlayerRingBurst(p, p.rings/2)
			P_PlayRinglossSound(s)
			p.sms_transformstate = 2
			P_GivePlayerRings(p, p.rings/-2)
				return true
			end
		elseif (s.player.sms_transformstate == 2) or (s.player.sms_transformstate == 3)
				P_SpawnGhostMobj(s)
				P_FlashPal(p, PAL_MIXUP, 7)
				S_StartSound(s, sfx_s3k4e)
					if p.presmsskin
					R_SetPlayerSkin(p, p.presmsskin)
					s.skin = p.presmsskin					
					else
					R_SetPlayerSkin(p, "sonic")
					s.skin = "sonic"
					end
				if not s.battlemodsms
				P_NukeEnemies(s, s, 350*FRACUNIT)
				else --Give score bonus and send SMS flying
					s.lastbmrings = p.rings
					if s.supersmsrecoil and i
						P_SetObjectMomZ(s, 10*FRACUNIT)				
						s.supersmsrecoil2ang = R_PointToAngle2(s.x, s.y, i.x, i.y)
						P_InstaThrust(s, s.supersmsrecoil2ang, -65*FRACUNIT)
						s.supersmsrecoil2 = 17
						S_StartSound(s, sfx_smscrt)
						S_StartSound(s, sfx_nerf)
						S_StartSound(s, sfx_smscr2)
						if so and so.player
						P_FlashPal(so.player, PAL_MIXUP, 4)
						end
					end
					if so and so.player and (so.skin != "sms")
						if s.supersmsrecoil
						so.player.score = $+50 //Slight score boost for hitting SMS!
						CONS_Printf(so.player, "\x82"+"Gained 50 score bonus for taking down SMS hard!")
						else
						so.player.score = $+25 //Slight score boost for hitting SMS!
						CONS_Printf(so.player, "\x82"+"Gained 25 score bonus for taking down SMS!")
						end
					end
				end
				if not (p.powers[pw_shield] & SH_FIREFLOWER)
				and not ((mariomode) and p.powers[pw_invulnerability])
					s.color = p.sms_originalcolor
				else
					s.color = SKINCOLOR_WHITE
				end
				p.skincolor = p.sms_originalcolor
				p.sms_transformstate = 0
				return
		end
	end
  end 
end, MT_PLAYER)

addHook("MobjCollide", function(r, s)
	if r and r.health and s and s.player
		if not (P_CanPickupItem(s.player, r))
			return false
		end
	end
end, MT_SMSSILVERRING)

addHook("MobjMoveCollide", function(r, s)
	if r and r.health and s and s.player
		if not (P_CanPickupItem(s.player, r))
			return false
		end
	end
end, MT_SMSSILVERRING)

addHook("TouchSpecial", function(r, s)
	if r and r.health and s and s.player
		if not (r.z > s.z+s.height)
		and not (s.z > r.z+r.height)
			if P_CanPickupItem(s.player, r)
			S_StartSound(s, sfx_itemup)
			P_GivePlayerRings(s.player, 10)
			r.destscale = r.scale*4
			P_KillMobj(r, s, s)
			return true
			end
		end
	end
	return true
end, MT_SMSSILVERRING)

addHook("MobjThinker", function(s)
if not (s.target and s.target.player)
A_FindTarget(s, MT_PLAYER, 0)
end
	if s.valid
	and (s.state == S_SMSTSPARK1)
		if (s.target and s.target.player and s.target.player.elauracolors and s.target.player.elauracolors and s.target.skin == "sms")
local p = s.target.player
			if (p.elauracolors >= 0 and p.elauracolors < 100)
			s.color = SKINCOLOR_YELLOW 
			elseif (p.elauracolors >= 100 and p.elauracolors < 120)
			s.color = SKINCOLOR_PERIDOT //Greenish yellow
			elseif (p.elauracolors >= 120 and p.elauracolors < 140)
			s.color = SKINCOLOR_GREEN  
			elseif (p.elauracolors >= 140 and p.elauracolors < 160)
			s.color = SKINCOLOR_EMERALD //Neon G
			elseif (p.elauracolors >= 160 and p.elauracolors < 180)
			s.color = SKINCOLOR_PERIDOT//Greenish yellow
			elseif (p.elauracolors >= 180 and p.elauracolors < 200)
			s.color = SKINCOLOR_YELLOW 
			elseif (p.elauracolors >= 200 and p.elauracolors < 220)
			s.color = SKINCOLOR_GOLD //Gold
			elseif (p.elauracolors >= 220 and p.elauracolors < 240)
			s.color = SKINCOLOR_ORANGE //Orange
			elseif (p.elauracolors >= 240 and p.elauracolors < 260)
			s.color = SKINCOLOR_RED //Red
			elseif (p.elauracolors >= 260 and p.elauracolors < 281)
			s.color = SKINCOLOR_RUST //Pink
			end
		elseif not s.coverride
			s.color = SKINCOLOR_YELLOW
		end
	end
end, MT_SMSTSPARK)

addHook("MobjThinker", function(f)
	if f.valid
	and (f.state == S_SMSTSPARK1) and not f.coverride
		f.color = SKINCOLOR_YELLOW
	end
end, MT_NIGHTSPARKLE)


//SMS' various unique hurt messages!
//Puts a sadistic smile on your face. ...oh, just me?
--2020, y'know, a local function here would've done wonders. Oh well. Live and learn!

addHook("HurtMsg", function(p, i, so)
	if (gametype == GT_COOP)
	or not p.mo
	return 
	end
	if p and p.mo.battlemodsms or so and so.battlemodsms //Don't even bother.
	return
	end
	if not i and (so == nil)
	return
	end
	if i.player and (i.skin == "sms")
		if i.player.footsweepanim
			if not p.mo.health
			and not p.powers[pw_shield]
				print(i.player.ctfnamecolor+" roundhoused "+p.ctfnamecolor+" with a footsweep attack!")
                return true
			else
				print(i.player.ctfnamecolor+" spinkicked "+p.ctfnamecolor+".")
				return true
            end

		elseif i.player.sms_ringburstfly
			if not p.mo.health
			and not p.powers[pw_shield]
               print(i.player.ctfnamecolor+" skewered "+p.ctfnamecolor+" to death with the ringburst!")
               return true
			else
				print(i.player.ctfnamecolor+" pierced "+p.ctfnamecolor+" with the flight of ringburst!")
				return true
            end

		elseif ((i.state == S_HMSCOMETHAYMAKER2) or (i.state == S_SMSCOMETHAYMAKER2) or (i.state == S_SMSCOMETHAYMAKER1) or (i.state == S_HMSCOMETHAYMAKER1))
			if not p.mo.health
				print(i.player.ctfnamecolor+" smashed "+p.ctfnamecolor+" out of the stadium! Homerun!")
                return true
			else
				print(i.player.ctfnamecolor+" sent "+p.ctfnamecolor+" flying with a Comet Haymaker!")
				return true
            end

		else
			if not p.mo.health
			and not p.powers[pw_shield]
				print(i.player.ctfnamecolor+" killed "+p.ctfnamecolor+"!")
                return true
			else
                print(i.player.ctfnamecolor+" hit "+p.ctfnamecolor+".")
				return true
			end
		end
    end
	if i.type == MT_SMMK
		if not p.mo.health
		and not p.powers[pw_shield]
			if i.smssmmk
				print(p.ctfnamecolor+" got killed by "+i.target.player.ctfnamecolor+"'s stomp shockwave!")
                return true
			else
				print(i.target.player.ctfnamecolor+" roundhoused "+p.ctfnamecolor+" with a footsweep attack!")
                return true
			end

		else
			if i.smssmmk
			print(i.target.player.ctfnamecolor+" stomp shockwave hit "+p.ctfnamecolor+"!")
			return true
			else
			print(i.target.player.ctfnamecolor+" spinkicked "+p.ctfnamecolor+".")
			return true
			end
        end

	elseif i.type == MT_SMSSPINFIRE
		if not p.mo.health
		and not p.powers[pw_shield]
            print(p.ctfnamecolor+" died to "+i.target.player.ctfnamecolor+"'s dashing flames!")
            return true
		else

		print(i.target.player.ctfnamecolor+" left "+p.ctfnamecolor+" in the fiery dust!")
		return true
        end
	elseif i.type == MT_SMSDIVEBOMB
		if not p.mo.health
		and not p.powers[pw_shield]
               print(i.target.player.ctfnamecolor+" killed "+p.ctfnamecolor+" with an explosive divebomb!")
               return true
		else
		print(i.target.player.ctfnamecolor+"'s explosive divebomb wounded "+p.ctfnamecolor+".")
		return true
        end
	elseif i.type == MT_SMSPOWERBOMB
		if not p.mo.health
		and not p.powers[pw_shield]
             print(p.ctfnamecolor+" was vaporized by "+i.target.player.ctfnamecolor+"'s powerbomb.")
             return true
		else
		print(i.target.player.ctfnamecolor+" powerbombed "+p.ctfnamecolor+"!")
		return true
        end
	elseif i.type == MT_HMSPOWERBOMB	
		if not p.mo.health
		and not p.powers[pw_shield]
			print(i.target.player.ctfnamecolor+" completely obliterated "+p.ctfnamecolor+"!")
			return true
		else
			print(i.target.player.ctfnamecolor+" nuked "+p.ctfnamecolor+" with an enormous explosion!")
			return true
        end
	elseif i.type == MT_CMPHRADIUS
		if not p.mo.health
            print(i.target.player.ctfnamecolor+" smashed "+p.ctfnamecolor+" out of the stadium! Homerun!")
            return true
		else
			print(i.target.player.ctfnamecolor+" sent "+p.ctfnamecolor+" flying with a Comet Haymaker!")
			return true
        end
	elseif i.type == MT_HMSFIREBLAST
		if not p.mo.health
		and not p.powers[pw_shield]
			print("Ding!"+p.ctfnamecolor+" was cooked alive by "+i.target.player.ctfnamecolor+"'s flames! Enjoy while it's hot!")
			return true
		else
		print(p.ctfnamecolor+" was torched by "+i.target.player.ctfnamecolor+".")
		return true
        end
	elseif ((i.type == MT_HMSFLAMEREST) or (i.type == MT_HMS_NAPALM_FLAMES))
		if not p.mo.health
		and not p.powers[pw_shield]
             print(i.target.player.ctfnamecolor+" 's inferno consumed "+p.ctfnamecolor+"'s life!")
             return true
		else
		print(i.target.player.ctfnamecolor+" caught "+p.ctfnamecolor+" in the inferno!")
		return true
        end
	elseif i.type == MT_HMSNOVABLAST or (i.type == MT_HMSNOVABLASTHB)
		if not p.mo.health
		and not p.powers[pw_shield]
			print(i.target.player.ctfnamecolor+" annihilated "+p.ctfnamecolor+" with the Nova Blast!")
			return true

		else
		print(i.target.player.ctfnamecolor+" blew "+p.ctfnamecolor+" away with the Nova Blast!")
		return true
        end
	elseif i.type == MT_HMSLIPILLAR
		if not p.mo.health
		and not p.powers[pw_shield]
			print("RIP: "+p.ctfnamecolor+". You will be missed. But not by "+i.target.player.ctfnamecolor+", who clearly hates you.")
			return true

		else
		print(p.ctfnamecolor+" was blown away by "+i.target.player.ctfnamecolor+"'s lightshow!")
		return true
		end
	end

	if (so != nil) and so.player and (so.skin == "sms")
		if not p.mo.health
		and not p.powers[pw_shield]
			print(so.player.ctfnamecolor+" killed "+p.ctfnamecolor+"!")
            return true
		else
            print(so.player.ctfnamecolor+" hit "+p.ctfnamecolor+".")
		    return true
		end
	end
end)