// Old Jetfumes

freeslot(
	// Objects
	"MT_OLDJETFUME1",
	// States
	"S_OLDJETFUME1",
	"S_OLDJETFUME2"
)

function A_OldBossJetFumes(actor, var1, var2)
	if not (actor and actor.valid) then return end
	
	local filler
	local jetx, jety, jetz
	local jetxoff, jetyoff, jetzoff
	
	if var1 == 0 // Old Egg Mobile Jet Fumes
		jetxoff = P_ReturnThrustX(actor, actor.angle, -64*FRACUNIT)
		jetyoff = P_ReturnThrustY(actor, actor.angle, -64*FRACUNIT)
		jetzoff = 38*FRACUNIT
		
		filler = P_SpawnMobjFromMobj(actor, jetxoff, jetyoff, jetzoff, MT_OLDJETFUME1)
		filler.target = actor
		filler.fuse = 56
		
		filler = P_SpawnMobjFromMobj(actor,
							jetxoff + P_ReturnThrustX(actor, actor.angle-ANGLE_90, 24*FRACUNIT),
							jetyoff + P_ReturnThrustY(actor, actor.angle-ANGLE_90, 24*FRACUNIT),
							jetzoff, MT_OLDJETFUME1)
		filler.target = actor
		filler.fuse = 57
		
		filler = P_SpawnMobjFromMobj(actor,
							jetxoff + P_ReturnThrustX(actor, actor.angle+ANGLE_90, 24*FRACUNIT),
							jetyoff + P_ReturnThrustY(actor, actor.angle+ANGLE_90, 24*FRACUNIT),
							jetzoff, MT_OLDJETFUME1)
		filler.target = actor
		filler.fuse = 58
		
		actor.tracer = filler
	elseif var1 == 1 // Old Metal Sonic Jet Fumes
		filler = P_SpawnMobjFromMobj(actor, 0, 0, 0, MT_OLDJETFUME1)
		filler.target = actor
		filler.fuse = 59
		actor.tracer = filler
		filler.scale = actor.scale/2
	end
end

// 2.0-2.1 Jet Fume

local function P_GetJetZ(mobj, jetzoff)
	if not (mobj and mobj.valid) then return end
	
	jetzoff = FixedMul(jetzoff, mobj.target.scale)
	
	if (mobj.target.eflags & MFE_VERTICALFLIP)
		return mobj.target.z + mobj.target.height - jetzoff - mobj.height
	else
		return mobj.target.z + jetzoff
	end
end

addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) then return end
	
	local jetx, jety, jetz
	
	if not (mobj.target and mobj.target.valid) // if you have no target
	or (not (mobj.target.flags & MF_BOSS) and mobj.target.health <= 0) // or your target isn't a boss and it's popped now
		// then remove yourself as well!
		P_RemoveMobj(mobj)
		return
	end
	
	// Don't interpolate the jet fumes if the Egg Slimer is using its pre-1.09.4 behavior
	local MoveFunction = P_MoveOrigin
	if mobj.target.oldBehavior and mobj.target.health > mobj.target.info.damage then MoveFunction = P_SetOrigin end
	
	jetx = mobj.target.x + P_ReturnThrustX(mobj.target, mobj.target.angle, FixedMul(-64*FRACUNIT, mobj.target.scale))
	jety = mobj.target.y + P_ReturnThrustY(mobj.target, mobj.target.angle, FixedMul(-64*FRACUNIT, mobj.target.scale))
	
	if mobj.fuse == 56 // 2.0/2.1 Egg Mobile Center Fume
		jetz = P_GetJetZ(mobj, 38*FRACUNIT)
		
		MoveFunction(mobj, jetx, jety, jetz)
	elseif mobj.fuse == 57 // 2.0/2.1 Egg Mobile "Right" Fume
		jetz = P_GetJetZ(mobj, 12*FRACUNIT)
		MoveFunction(mobj, jetx + P_ReturnThrustX(mobj.target, mobj.target.angle-ANGLE_90, FixedMul(24*FRACUNIT, mobj.target.scale)),
							jety + P_ReturnThrustY(mobj.target, mobj.target.angle-ANGLE_90, FixedMul(24*FRACUNIT, mobj.target.scale)),
							jetz)
	elseif mobj.fuse == 58 // 2.0/2.1 Egg Mobile "Left" Fume
		jetz = P_GetJetZ(mobj, 12*FRACUNIT)
		MoveFunction(mobj, jetx + P_ReturnThrustX(mobj.target, mobj.target.angle+ANGLE_90, FixedMul(24*FRACUNIT, mobj.target.scale)),
							jety + P_ReturnThrustY(mobj.target, mobj.target.angle+ANGLE_90, FixedMul(24*FRACUNIT, mobj.target.scale)),
							jetz)
	elseif mobj.fuse == 59 // Old Metal Sonic Fume
		jetx = mobj.target.x + P_ReturnThrustX(mobj.target, mobj.target.angle, -mobj.target.radius)
		jety = mobj.target.y + P_ReturnThrustY(mobj.target, mobj.target.angle, -mobj.target.radius)
		if (mobj.target.eflags & MFE_VERTICALFLIP)
			jetz = mobj.target.z + mobj.target.height/2 + mobj.height/2
		else
			jetz = mobj.target.z + mobj.target.height/2 - mobj.height/2
		end
		MoveFunction(mobj, jetx, jety, jetz)
	end
	mobj.fuse = $+1
	
	mobj.momz = 0 // Prevent the jetfume from moving vertically
end, MT_OLDJETFUME1)

mobjinfo[MT_OLDJETFUME1] = {
	doomednum = -1,
	spawnstate = S_OLDJETFUME1,
	spawnhealth = 1000,
	reactiontime = 8,
	speed = 1,
	radius = 8*FRACUNIT,
	height = 16*FRACUNIT,
	mass = 4,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT
}

states[S_OLDJETFUME1] =	{SPR_OJTF,	A|FF_FULLBRIGHT,	1,	nil,	0,	0,	S_OLDJETFUME2}
states[S_OLDJETFUME2] =	{SPR_NULL,	A,					1,	nil,	0,	0,	S_OLDJETFUME1}