local function KillingDead(target, mobj)
	if mobj and mobj.valid and mobj.type == MT_PLAYER and mobj.skin == "tgfsonic"
		mobj.killingdead = P_RandomChance(FRACUNIT/3) -- 1 in 3 or 33.33% chance, just like srb1 1.4
		if mobj.killingdead then
			P_DamageMobj(mobj)
		end
	end
end
addHook("MobjDamage", KillingDead)
local function NoKnockback(mobj)
	if not mobj.player or not mobj.player.valid then
		return
	end
	
	local player = mobj.player
	local tgfring1 = P_SpawnMobjFromMobj(mobj, 0, 0, 64*FRACUNIT, MT_TGFRING)
	local tgfring2 = P_SpawnMobjFromMobj(mobj, 0, 0, 64*FRACUNIT, MT_TGFRING)
	local tgfring3 = P_SpawnMobjFromMobj(mobj, 0, 0, 64*FRACUNIT, MT_TGFRING)
	
	if mobj.skin == "tgfsonic"
		if player.rings == 0 and not player.powers[pw_shield] then
			P_KillMobj(tgfring1)
			P_KillMobj(tgfring2)
			P_KillMobj(tgfring3)
			return
		elseif not player.powers[pw_shield]
			player.rings = 0
			P_Thrust(tgfring1, FixedAngle(P_RandomRange(0, 360)*FRACUNIT), P_RandomRange(-12, 12)*FRACUNIT)
			P_SetObjectMomZ(tgfring1,P_RandomRange(-12, 12)*FRACUNIT, 1)
			P_Thrust(tgfring2, FixedAngle(P_RandomRange(0, 360)*FRACUNIT), P_RandomRange(-12, 12)*FRACUNIT)
			P_SetObjectMomZ(tgfring2,P_RandomRange(-12, 12)*FRACUNIT, 1)
			P_Thrust(tgfring3, FixedAngle(P_RandomRange(0, 360)*FRACUNIT), P_RandomRange(-12, 12)*FRACUNIT)
			P_SetObjectMomZ(tgfring3,P_RandomRange(-12, 12)*FRACUNIT, 1)
			P_PlayRinglossSound(mobj, player)
		elseif player.powers[pw_shield]
			player.powers[pw_shield] = 0
			P_KillMobj(tgfring1)
			P_KillMobj(tgfring2)
			P_KillMobj(tgfring3)
			P_PlayDeathSound(mobj, player)
		end
		player.powers[pw_flashing] = 2 * TICRATE
		return true
	end
end
addHook("MobjDamage", NoKnockback, MT_PLAYER)
addHook("ThinkFrame", do
	for player in players.iterate
		if player.mo.valid and player.mo.skin == "tgfsonic"
			if player.mo.state == S_PLAY_DEAD
				player.mo.state = S_PLAY_MELEE
				P_SetObjectMomZ(player.mo, 0, false)
			elseif player.mo.state == S_PLAY_MELEE
				P_SetObjectMomZ(player.mo, 0, false)
			elseif player.mo.state == S_PLAY_MELEE_FINISH
				player.mo.state = S_INVISIBLE
				P_SetObjectMomZ(player.mo, 0, false)
			elseif player.mo.state == S_INVISIBLE
				player.mo.state = S_INVISIBLE
				P_SetObjectMomZ(player.mo, 0, false)
			end
			if player.pflags & PF_JUMPED
			and player.mo.state == S_PLAY_JUMP
				player.mo.momz = $ + P_GetMobjGravity(player.mo)
			end
		end
	end
end)