-- Extra shields

addHook("MobjThinker", function(mo)
	if mo.target.eorb == 0
		mo.flags2 = $ & ~MF2_DONTDRAW
	else
		mo.flags2 = $ | MF2_DONTDRAW
	end
end, MT_PITY_ORB)

addHook("MobjThinker", function(mo)
	if not mo.target P_KillMobj(mo) return end

	if mo.target.eorb == 1
		if not (mo.flags2 & MF2_DONTDRAW)
			if mo.target.flags2 & MF2_OBJECTFLIP
				mo.color = SKINCOLOR_SUPERORANGE5
				A_Sparkling(mo,MT_GRAVITORB_PART_O)
			else
				mo.color = SKINCOLOR_CORNFLOWER
				A_Sparkling(mo,MT_GRAVITORB_PART_B)
			end
		end
	elseif mo.target.eorb == 2
		mo.color = SKINCOLOR_MAGENTA
	elseif mo.target.eorb == 3
		mo.color = SKINCOLOR_BUBBLEGUM
	elseif mo.target.eorb == 4
		mo.color = SKINCOLOR_JET
		if not mo.clocklay
			mo.clocklay = P_SpawnMobj(mo.x,mo.y,mo.z,MT_OVERLAY)
			mo.clocklay.target = mo
			mo.clocklay.state = S_CLOCK_OVERLAY
			mo.clockhr = P_SpawnMobj(mo.x,mo.y,mo.z,MT_OVERLAY)
			mo.clockhr.target = mo.clocklay
			mo.clockhr.state = S_CLOCK_OVERLAY_HR
			mo.clockmin = P_SpawnMobj(mo.x,mo.y,mo.z,MT_OVERLAY)
			mo.clockmin.target = mo.clocklay
			mo.clockmin.state = S_CLOCK_OVERLAY_MIN
		end
		if mo.target.player.pflags & PF_JUMPED and not (mo.target.player.pflags & PF_THOKKED)
			mo.clockmin.rollangle = $-ANG1
			mo.clockhr.rollangle = $-ANG1/8
		end
		if mo.target.player.pflags & PF_SHIELDABILITY
			mo.clockmin.rollangle = 0
			mo.clockhr.rollangle = 0
			mo.target.player.pflags = $ & ~PF_SHIELDABILITY
		end
		if not (mo.flags2 & MF2_DONTDRAW)
			mo.clocklay.flags2 = $ & ~MF2_DONTDRAW
			mo.clockhr.flags2 = $ & ~MF2_DONTDRAW
			mo.clockmin.flags2 = $ & ~MF2_DONTDRAW
		else
			mo.clocklay.flags2 = $ | MF2_DONTDRAW
			mo.clockhr.flags2 = $ | MF2_DONTDRAW
			mo.clockmin.flags2 = $ | MF2_DONTDRAW
		end
		if mo.target.player.pflags & PF_STARTJUMP and not mo.clockrw
			mo.clockrw = P_SpawnMobjFromMobj(mo.target,0,0,0,MT_CLOCK_REWIND)
			mo.clockrw.target = mo.target
			mo.clockrw.tracer = mo
			mo.clockrw.angle = mo.target.angle
			mo.target.rewindpoint = mo.clockrw
		end
	end
	if mo.target.eorb != 4 and mo.clocklay
		P_KillMobj(mo.clocklay)
		mo.clocklay = nil
	end
	mo.scale = FixedMul(mo.target.scale,mo.target.player.shieldscale)
	if (mo.target.player.powers[pw_invulnerability] > 0)
	or (mo.target.player.powers[pw_super] > 0)
		mo.flags2 = $ | MF2_DONTDRAW
	else
		mo.flags2 = $ & ~MF2_DONTDRAW
	end
	if not (mo.target.player.powers[pw_shield] & SH_PINK)
		mo.target.eorb = 0
		mo.target.flags2 = $ & ~MF2_OBJECTFLIP
		mo.target.clockx = nil
		P_KillMobj(mo)
		return
	end
	if (mo.target.sprite2 == SPR2_ROLL)
	or (mo.target.sprite2 == SPR2_SPIN)
	or (mo.target.sprite2 == SPR2_GLID)
		A_CapeChase(mo,(-4*FRACUNIT)+0)
	else
		A_CapeChase(mo,(1*FRACUNIT)+0)
	end
end, MT_EXTRA_ORB)

addHook("ShieldSpecial", function(player)
	if player.mo.eorb == 1
		if player.mo.flags2 & MF2_OBJECTFLIP
			player.mo.flags2 = $ & ~MF2_OBJECTFLIP
		else
			player.mo.flags2 = $ | MF2_OBJECTFLIP
		end
		S_StartSound(player.mo, sfx_peww)
		player.pflags = $ | PF_THOKKED
		return true
	elseif player.mo.eorb == 2
		S_StartSound(player.mo, sfx_kc39)
		player.pflags = $ | PF_THOKKED
		return true
	elseif player.mo.eorb == 3
		S_StartSound(player.mo, sfx_s3k8a)
		local bubb = P_SpawnMobjFromMobj(player.mo,0,0,0,MT_GUM_BUBBLE)
		bubb.target = player.mo
		player.pflags = $ & ~PF_STARTJUMP & ~PF_JUMPED & ~PF_SPINNING
		player.pflags = $ | PF_THOKKED
		return true
	elseif player.mo.eorb == 4
		if player.mo.rewindpoint
			S_StartSound(player.mo, sfx_kc31)
			P_FlashPal(player,PAL_WHITE,10)
			P_TeleportMove(player.mo,
				player.mo.rewindpoint.x,
				player.mo.rewindpoint.y,
				player.mo.rewindpoint.z)
			A_ForceStop(player.mo)
			player.mo.angle = player.mo.rewindpoint.angle
			P_ResetPlayer(player)
			player.powers[pw_nocontrol] = 10
			player.pflags = $ | PF_THOKKED | PF_SHIELDABILITY
		end
		return true
	end
end)

addHook("MobjThinker",function(mo)
	if not mo.target
		if mo.effthis
			mo.effthis.target = nil
		end
		P_RemoveMobj(mo)
		return
	end
	if not mo.effthis
		mo.effthis = P_SpawnMobjFromMobj(mo.target,0,0,0,MT_OVERLAY)
		mo.effthis.target = mo.target
		mo.effthis.state = S_GUM_BUBBLE
		mo.effthis.color = SKINCOLOR_BUBBLEGUM
	end

	if mo.target.eorb != 3
	or P_IsObjectOnGround(mo.target)
	or mo.target.eflags & MFE_SPRUNG
	or mo.target.eflags & MFE_GOOWATER
	or mo.target.player.powers[pw_carry]
		S_StartSound(mo.target,sfx_s3k77)
		mo.target = nil
		return
	end
	if mo.target.state != S_PLAY_RIDE
		mo.target.state = S_PLAY_RIDE
		mo.target.player.panim = PA_RIDE
	end
	if (not (mo.target.eflags & MFE_VERTICALFLIP) and mo.target.momz < FRACUNIT)
		P_SetObjectMomZ(mo.target,-mo.target.momz/8,true)
	end
	if (mo.target.eflags & MFE_VERTICALFLIP and mo.target.momz > -FRACUNIT)
		P_SetObjectMomZ(mo.target,mo.target.momz/8,true)
	end

	if mo.target.player.cmd.buttons & BT_JUMP
		S_StartSound(mo.target,sfx_s3k77)
		P_DoJump(mo.target.player,false)
		mo.target.player.pflags = $ & ~PF_STARTJUMP & ~PF_JUMPED
		mo.target.state = S_PLAY_SPRING
		mo.target.player.panim = PA_SPRING
		mo.target = nil
		return
	end
end, MT_GUM_BUBBLE)

addHook("MobjThinker",function(mo)
	if not mo.target
		P_RemoveMobj(mo)
		return
	end

	if P_IsObjectOnGround(mo.target)
	or mo.target.eorb != 4
		P_RemoveMobj(mo)
		return
	end
end, MT_CLOCK_REWIND)

addHook("MobjRemoved",function(mo)
-- bottomless pits suck
	if mo.tracer
		mo.tracer.clockrw = nil
	end
	if mo.target
		mo.target.rewindpoint = nil
		mo.target = nil
	end
end, MT_CLOCK_REWIND)

-- initialize eorb

addHook("PlayerSpawn", function(player)
	if not player.mo return end
	player.mo.eorb = 0
	player.jumpfactor = skins[player.mo.skin].jumpfactor
end)