// 2.0 Egg Mobile - Ported from 2.0.7
// PLEASE LOAD LUA_CMMN, LUA_OJTF AND LUA_EMCM BEFORE THIS

freeslot(
	// Objects
	"MT_20EGGMOBILE",
	"MT_20ROCKET",
	// States
	"S_20EGGMOBILE_STND",
	"S_20EGGMOBILE_LATK1",
	"S_20EGGMOBILE_LATK2",
	"S_20EGGMOBILE_LATK3",
	"S_20EGGMOBILE_LATK4",
	"S_20EGGMOBILE_LATK5",
	"S_20EGGMOBILE_LATK6",
	"S_20EGGMOBILE_LATK7",
	"S_20EGGMOBILE_LATK8",
	"S_20EGGMOBILE_LATK9",
	"S_20EGGMOBILE_LATK10",
	"S_20EGGMOBILE_RATK1",
	"S_20EGGMOBILE_RATK2",
	"S_20EGGMOBILE_RATK3",
	"S_20EGGMOBILE_RATK4",
	"S_20EGGMOBILE_RATK5",
	"S_20EGGMOBILE_RATK6",
	"S_20EGGMOBILE_RATK7",
	"S_20EGGMOBILE_RATK8",
	"S_20EGGMOBILE_RATK9",
	"S_20EGGMOBILE_RATK10",
	"S_20EGGMOBILE_PANIC1",
	"S_20EGGMOBILE_PANIC2",
	"S_20EGGMOBILE_PAIN",
	"S_20EGGMOBILE_PAIN2"
)

// 2.0 Eggmobile

local function nomissile(actor)
	// possibly choose another target
	if multiplayer and P_RandomByte() < 2
		if P_LookForPlayers(actor, 0, true, false)
			return // got a new target
		end
	end
	
	//chase towards player
	actor.movecount = $-1
	if actor.movecount < 0 or not P_Move(actor, actor.info.speed)
		P_NewChaseDir(actor)
	end
end

function A_FDBoss1Chase(actor, var1, var2)
	local delta
	
	if actor.reactiontime
		actor.reactiontime = $-1
	end
	
	// Use the 2.0 variant if var1 is not 0
	if var1 ~= 0
		if actor.z < actor.floorz+33*FRACUNIT
			actor.z = actor.floorz+33*FRACUNIT
		end
	end
	
	// turn towards movement direction if not there yet
	if actor.movedir < NUMDIRS // NUMDIRS should be 8
		actor.angle = $ & (7 * (2^29))
		delta = actor.angle - (actor.movedir * (2^29))
		
		if delta > 0
			actor.angle = $-ANGLE_45
		elseif delta < 0
			actor.angle = $+ANGLE_45
		end
	end
	
	// do not attack twice in a row
	if (actor.flags2 & MF2_JUSTATTACKED)
		actor.flags2 = $ & ~MF2_JUSTATTACKED
		P_NewChaseDir(actor)
		return
	end
	
	if actor.movecount
		nomissile(actor)
		return
	end
	
	if not P_CheckMissileRange(actor)
		nomissile(actor)
		return
	end
	
	if actor.reactiontime <= 0
		if actor.health > actor.info.damage
			if (P_RandomByte() & 1)
				actor.state = actor.info.missilestate
			else
				actor.state = actor.info.meleestate
			end
		else
			actor.state = actor.info.raisestate
		end
		
		actor.flags2 = $|MF2_JUSTATTACKED
		actor.reactiontime = 2*TICRATE
		return
	end
end

// Make the 2.0 Egg Mobile spawn 33 FRACUNITS off the ground if its z-position hasn't been set
addHook("MapThingSpawn", function(mobj, mapthing)
	local offset
	
	if mapthing.z ~= 0
		offset = mapthing.z
	else
		offset = 33*FRACUNIT
	end
	
	if (mapthing.options & MTF_OBJECTFLIP)
		if offset ~= 0
			mobj.z = mobj.z - offset
		else
			mobj.z = mobj.ceilingz
		end
	else
		if offset ~= 0
			mobj.z = mobj.z + offset
		else
			mobj.z = mobj.floorz
		end
	end
	
	// Spawn a spike ball shield if the ambush flag is set
	if (mapthing.options & MTF_AMBUSH)
		local spikemobj
		for i = 0, 3, 1 do
			spikemobj = P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_SPIKEBALL)
			spikemobj.target = mobj
			if i == 0
				spikemobj.angle = 0
			elseif i == 1
				spikemobj.angle = ANGLE_90
			elseif i == 2
				spikemobj.angle = ANGLE_180
			elseif i == 3
				spikemobj.angle = ANGLE_270
			end
		end
	end
end, MT_20EGGMOBILE)

// Prevents the 2.0 Egg Mobile from stopping when it approaches the player in its panic state
addHook("MobjMoveCollide", function(tmthing, thing)
	return false
end, MT_20EGGMOBILE)

// Prevents the 2.0 Egg Mobile from bouncing off of the walls in "SKULLFLY" mode
addHook("MobjMoveBlocked", function(mobj)
	mobj.flags2 = $ & ~MF2_SKULLFLY
	mobj.momx = 0
	mobj.momy = 0
	mobj.momz = 0
	return true
end, MT_20EGGMOBILE)

// Prevents the 2.0 Egg Mobile from being hit-spammed
addHook("MobjDamage", function(target, inflictor, source)
	if (target.flags2 & MF2_SKULLFLY)
		target.flags2 = $ & ~MF2_SKULLFLY
	end
end, MT_20EGGMOBILE)

addHook("MobjThinker", function(mobj)
	if mobj.target and mobj.target.type == MT_20EGGMOBILE
		local radius = 12*mobj.info.speed
		
		mobj.angle = $ + FixedAngle(mobj.info.speed)
		P_TeleportMove(mobj,
					   mobj.target.x + FixedMul(cos(mobj.angle), radius),
					   mobj.target.y + FixedMul(sin(mobj.angle), radius),
					   mobj.target.z + mobj.target.height/2)
	end
end, MT_SPIKEBALL)

addHook("BossDeath", function(mobj)
	A_21BossDeath(mobj, 0, 0)
	return true
end, MT_20EGGMOBILE)

// Ported BossThinker behavior for 2.0 Eggmobile from 2.0.7
addHook("BossThinker", function(mobj)
	if mobj.health < mobj.info.damage+1 and (leveltime & 1) and mobj.health > 0
		P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_SMOKE) // Replace MT_SMOKE with MT_21SMOKE if necessary
	end
	if mobj.flags2 & MF2_SKULLFLY
		P_SpawnGhostMobj(mobj)
		
		/*
		local spawnmobj
		spawnmobj = P_SpawnMobj(mobj.x, mobj.y, mobj.z, mobj.info.painchance)
		spawnmobj.target = mobj
		spawnmobj.color = SKINCOLOR_GREY
		*/
	end
	
	if states[mobj.state].nextstate == mobj.info.spawnstate and mobj.tics == 1
		mobj.flags2 = $ & ~MF2_FRET
		if not (mobj.flags2 & MF2_SKULLFLY)
			mobj.momx = 0
			mobj.momy = 0
			mobj.momz = 0
		end
	end
	
	if not mobj.tracer
		A_OldBossJetFumes(mobj, 0, 0)
	end
	
	if not mobj.target or not (mobj.target.flags & MF_SHOOTABLE)
		if mobj.health <= 0
			if P_LookForPlayers(mobj, 0, true) and mobj.info.mass // Bid farewell!
				S_StartSound(mobj, mobj.info.mass)
			end
			return true
		end
		
		// look for a new target
		if P_LookForPlayers(mobj, 0, true) and mobj.info.seesound
			S_StartSound(mobj, mobj.info.seesound)
		end
		
		return true
	end
	
	if mobj.state == mobj.info.spawnstate
		A_FDBoss1Chase(mobj, 1, 0)
	end
	
	if mobj.state == mobj.info.meleestate
	  or (mobj.state == mobj.info.missilestate
	  and mobj.health > mobj.info.damage)
		mobj.angle = R_PointToAngle2(mobj.x, mobj.y, mobj.target.x, mobj.target.y)
	end
	
	return true
end, MT_20EGGMOBILE)

mobjinfo[MT_20EGGMOBILE] = {
	//$Name 2.0 Eggmobile
	//$Sprite 21EMA1
	//$Category Bosses
	//$Flags4Text End level on death
	//$Flags8Text Spawn w/ Spikeball Shield
	doomednum = 4050,
	spawnstate = S_20EGGMOBILE_STND,
	spawnhealth = 8,
	seestate = S_20EGGMOBILE_STND,
	reactiontime = 8,
	painstate = S_20EGGMOBILE_PAIN,
	painchance = MT_THOK,
	painsound = sfx_odmpai,
	meleestate = S_20EGGMOBILE_LATK1,
	missilestate = S_20EGGMOBILE_RATK1,
	deathstate = S_21EGGMOBILE_DIE1,
	xdeathstate = S_21EGGMOBILE_FLEE1,
	deathsound = sfx_cybdth,
	speed = 4,
	radius = 24*FRACUNIT,
	height = 52*FRACUNIT,
	damage = 2,
	activesound = sfx_telept,
	flags = MF_SPECIAL|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_BOSS,
	raisestate = S_20EGGMOBILE_PANIC1
}

states[S_20EGGMOBILE_STND] = {
	sprite = SPR_21EM,
	frame = A,
	tics = 1,
	nextstate = S_20EGGMOBILE_STND
}

states[S_20EGGMOBILE_LATK1] = {
	sprite = SPR_21EM,
	frame = B,
	tics = 3,
	nextstate = S_20EGGMOBILE_LATK2
}

states[S_20EGGMOBILE_LATK2] = {
	sprite = SPR_21EM,
	frame = C,
	tics = 30,
	nextstate = S_20EGGMOBILE_LATK3
}

states[S_20EGGMOBILE_LATK3] = {
	sprite = SPR_21EM,
	frame = D,
	tics = 2,
	nextstate = S_20EGGMOBILE_LATK4
}

states[S_20EGGMOBILE_LATK4] = {
	sprite = SPR_21EM,
	frame = E,
	tics = 1,
	nextstate = S_20EGGMOBILE_LATK5
}

states[S_20EGGMOBILE_LATK5] = {
	sprite = SPR_21EM,
	frame = F,
	tics = 1,
	nextstate = S_20EGGMOBILE_LATK6
}

states[S_20EGGMOBILE_LATK6] = {
	sprite = SPR_21EM,
	frame = G,
	tics = 1,
	nextstate = S_20EGGMOBILE_LATK7
}

states[S_20EGGMOBILE_LATK7] = {
	sprite = SPR_21EM,
	frame = H,
	tics = 1,
	nextstate = S_20EGGMOBILE_LATK8
}

states[S_20EGGMOBILE_LATK8] = {
	sprite = SPR_21EM,
	frame = I,
	tics = 15,
	action = A_BossFireShot, // Replace this with A_21BossFireShot if it changes in the future
	var1 = MT_20ROCKET,
	var2 = 0,
	nextstate = S_20EGGMOBILE_LATK9
}

states[S_20EGGMOBILE_LATK9] = {
	sprite = SPR_21EM,
	frame = J,
	tics = 10,
	nextstate = S_20EGGMOBILE_LATK10
}

states[S_20EGGMOBILE_LATK10] = {
	sprite = SPR_21EM,
	frame = K,
	tics = 2,
	nextstate = S_20EGGMOBILE_STND
}

states[S_20EGGMOBILE_RATK1] = {
	sprite = SPR_21EM,
	frame = L,
	tics = 3,
	nextstate = S_20EGGMOBILE_RATK2	
}

states[S_20EGGMOBILE_RATK2] = {
	sprite = SPR_21EM,
	frame = M,
	tics = 30,
	nextstate = S_20EGGMOBILE_RATK3
}

states[S_20EGGMOBILE_RATK3] = {
	sprite = SPR_21EM,
	frame = N,
	tics = 2,
	nextstate = S_20EGGMOBILE_RATK4
}

states[S_20EGGMOBILE_RATK4] = {
	sprite = SPR_21EM,
	frame = O,
	tics = 1,
	nextstate = S_20EGGMOBILE_RATK5
}

states[S_20EGGMOBILE_RATK5] = {
	sprite = SPR_21EM,
	frame = P,
	tics = 1,
	nextstate = S_20EGGMOBILE_RATK6
}

states[S_20EGGMOBILE_RATK6] = {
	sprite = SPR_21EM,
	frame = Q,
	tics = 1,
	nextstate = S_20EGGMOBILE_RATK7
}

states[S_20EGGMOBILE_RATK7] = {
	sprite = SPR_21EM,
	frame = R,
	tics = 1,
	nextstate = S_20EGGMOBILE_RATK8
}

states[S_20EGGMOBILE_RATK8] = {
	sprite = SPR_21EM,
	frame = S,
	tics = 15,
	action = A_BossFireShot, // Replace this with A_21BossFireShot if it changes in the future
	var1 = MT_20ROCKET,
	var2 = 1,
	nextstate = S_20EGGMOBILE_RATK9
}

states[S_20EGGMOBILE_RATK9] = {
	sprite = SPR_21EM,
	frame = T,
	tics = 10,
	nextstate = S_20EGGMOBILE_RATK10
}

states[S_20EGGMOBILE_RATK10] = {
	sprite = SPR_21EM,
	frame = U,
	tics = 2,
	nextstate = S_20EGGMOBILE_STND
}

states[S_20EGGMOBILE_PANIC1] = {
	sprite = SPR_21EM,
	frame = D,
	tics = 35,
	nextstate = S_20EGGMOBILE_PANIC2
}

states[S_20EGGMOBILE_PANIC2] = {
	sprite = SPR_21EM,
	frame = A,
	tics = 35,
	action = A_SkullAttack,
	var1 = 0,
	var2 = 0,
	nextstate = S_20EGGMOBILE_STND
}

states[S_20EGGMOBILE_PAIN] = {
	sprite = SPR_21EM,
	frame = V,
	tics = 24,
	action = A_Pain,
	nextstate = S_20EGGMOBILE_PAIN2
}

states[S_20EGGMOBILE_PAIN2] = {
	sprite = SPR_21EM,
	frame = V,
	tics = 24,
	action = A_SkullAttack,
	var1 = 1,
	var2 = 0,
	nextstate = S_20EGGMOBILE_STND
}

// 2.0 "Rocket" Laser

mobjinfo[MT_20ROCKET] = {
	doomednum = -1,
	spawnstate = S_ROCKET, // Replace this with S_20ROCKET if it changes in the future
	spawnhealth = 1000,
	seesound = sfx_orlaun,
	reactiontime = 8,
	speed = 20*FRACUNIT,
	radius = 11*FRACUNIT,
	height = 8*FRACUNIT,
	damage = 20,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}























