freeslot("MT_RUBBLE", "S_RUBBLE", "SPR_RUBL")

mobjinfo[MT_RUBBLE] = {
	spawnstate = S_RUBBLE,
	radius = 32*FRACUNIT,
	height = 64*FRACUNIT,
	deathstate = S_NULL,
	flags = MF_SPAWNCEILING|MF_NOCLIP|MF_NOCLIPHEIGHT
}

states[S_RUBBLE] = {SPR_RUBL, A, -1, nil, 0, 0, nil}

local function loadBoss(mapnum)
	if (mapnum == 468) -- Gloom Metropolis 3
		mobjinfo[MT_EGGMOBILE2].painchance = MT_PUMA
		mobjinfo[MT_PUMA].flags = MF_PAIN|MF_FIRE|MF_BOUNCE
	elseif (mapnum == 469) -- Slime Silo
		mobjinfo[MT_EGGMOBILE].speed = 8
		mobjinfo[MT_EGGMOBILE].attacksound = sfx_trfire
		--Boss health is handled below because spawnhealth doesn't work well with MapLoad hook.
	
		states[S_EGGMOBILE_LATK2].tics = 15
		states[S_EGGMOBILE_LATK2].nextstate = S_EGGMOBILE_LATK3
		states[S_EGGMOBILE_LATK2].action = "A_PlaySound"
		states[S_EGGMOBILE_LATK2].var1 = sfx_s3k5a
		states[S_EGGMOBILE_LATK2].var2 = 1
	
		states[S_EGGMOBILE_LATK5].tics = 45
		states[S_EGGMOBILE_LATK5].nextstate = S_EGGMOBILE_LATK9
		states[S_EGGMOBILE_LATK5].action = "A_TurretFire"
		states[S_EGGMOBILE_LATK5].var1 = MT_TURRETLASER	
		
		states[S_EGGMOBILE_LATK9].tics = 10
		states[S_EGGMOBILE_LATK9].nextstate = S_EGGMOBILE_STND
		states[S_EGGMOBILE_LATK9].action = "A_TurretStop"
		
		states[S_EGGMOBILE_RATK2].tics = 15
		states[S_EGGMOBILE_RATK2].nextstate = S_EGGMOBILE_RATK3
		states[S_EGGMOBILE_RATK2].action = "A_PlaySound"
		states[S_EGGMOBILE_RATK2].var1 = sfx_alarm
		states[S_EGGMOBILE_RATK2].var2 = 0
		
		states[S_EGGMOBILE_RATK5].tics = 45
		states[S_EGGMOBILE_RATK5].nextstate = S_EGGMOBILE_RATK9
		states[S_EGGMOBILE_RATK5].action = "A_LinedefExecute"
		states[S_EGGMOBILE_RATK5].var1 = 1100
		states[S_EGGMOBILE_RATK5].var2 = 0
		
		states[S_EGGMOBILE_PANIC1].tics = 70
		states[S_EGGMOBILE_PANIC1].nextstate = S_EGGMOBILE_PANIC2
		states[S_EGGMOBILE_PANIC1].action = "A_PlaySound"
		states[S_EGGMOBILE_PANIC1].var1 = sfx_s3k86
		states[S_EGGMOBILE_PANIC1].var2 = 0

		states[S_EGGMOBILE_PANIC2].tics = 175
		states[S_EGGMOBILE_PANIC2].nextstate = S_EGGMOBILE_STND
		states[S_EGGMOBILE_PANIC2].action = "A_LinedefExecute"
		states[S_EGGMOBILE_PANIC2].var1 = 1102
		states[S_EGGMOBILE_PANIC2].var2 = 0
				
		mobjinfo[MT_SONIC3KBOSSEXPLODE].painsound = sfx_cybdth
		states[S_SONIC3KBOSSEXPLOSION2].action = "A_Pain"
		
	else -- Return to default settings
		mobjinfo[MT_EGGMOBILE2].painchance = MT_GOOP
		mobjinfo[MT_PUMA].flags = MF_PAIN|MF_FIRE
		
		mobjinfo[MT_EGGMOBILE].speed = 4
		mobjinfo[MT_EGGMOBILE].attacksound = 0
	
		states[S_EGGMOBILE_STND].tics = 1
		states[S_EGGMOBILE_STND].nextstate = S_EGGMOBILE_STND
		states[S_EGGMOBILE_STND].action = "A_Boss1Chase"
		states[S_EGGMOBILE_STND].var1 = 0
		states[S_EGGMOBILE_STND].var2 = 0
		
		states[S_EGGMOBILE_ROFL].tics = 35
		states[S_EGGMOBILE_ROFL].nextstate = S_EGGMOBILE_STND
		states[S_EGGMOBILE_ROFL].action = "A_FaceTarget"
		states[S_EGGMOBILE_ROFL].var1 = 1
		states[S_EGGMOBILE_ROFL].var2 = 2
		
		states[S_EGGMOBILE_LATK1].tics = 3
		states[S_EGGMOBILE_LATK1].nextstate = S_EGGMOBILE_LATK2
		states[S_EGGMOBILE_LATK1].action = "A_FaceTarget"
		states[S_EGGMOBILE_LATK1].var1 = 0
		states[S_EGGMOBILE_LATK1].var2 = 0
		
		states[S_EGGMOBILE_LATK2].tics = 15
		states[S_EGGMOBILE_LATK2].nextstate = S_EGGMOBILE_LATK3
		states[S_EGGMOBILE_LATK2].action = nil
		states[S_EGGMOBILE_LATK2].var1 = 0
		states[S_EGGMOBILE_LATK2].var2 = 0
		
		states[S_EGGMOBILE_LATK3].tics = 2
		states[S_EGGMOBILE_LATK3].nextstate = S_EGGMOBILE_LATK4
		states[S_EGGMOBILE_LATK3].action = nil
		states[S_EGGMOBILE_LATK3].var1 = 0
		states[S_EGGMOBILE_LATK3].var2 = 0
		
		states[S_EGGMOBILE_LATK4].tics = 2
		states[S_EGGMOBILE_LATK4].nextstate = S_EGGMOBILE_LATK5
		states[S_EGGMOBILE_LATK4].action = "A_FaceTarget"
		states[S_EGGMOBILE_LATK4].var1 = 0
		states[S_EGGMOBILE_LATK4].var2 = 0
		
		states[S_EGGMOBILE_LATK5].tics = 0
		states[S_EGGMOBILE_LATK5].nextstate = S_EGGMOBILE_LATK6
		states[S_EGGMOBILE_LATK5].action = "A_PrepareRepeat"
		states[S_EGGMOBILE_LATK5].var1 = 45
		states[S_EGGMOBILE_LATK5].var2 = 0
		
		states[S_EGGMOBILE_LATK6].tics = 1
		states[S_EGGMOBILE_LATK6].nextstate = S_EGGMOBILE_LATK8
		states[S_EGGMOBILE_LATK6].action = "A_Boss1Laser"
		states[S_EGGMOBILE_LATK6].var1 = MT_LASER
		states[S_EGGMOBILE_LATK6].var2 = 0
		
		states[S_EGGMOBILE_LATK8].tics = 0
		states[S_EGGMOBILE_LATK8].nextstate = S_EGGMOBILE_LATK9
		states[S_EGGMOBILE_LATK8].action = "A_Repeat"
		states[S_EGGMOBILE_LATK8].var1 = 45
		states[S_EGGMOBILE_LATK8].var2 = S_EGGMOBILE_LATK6
		
		states[S_EGGMOBILE_LATK9].tics = 2
		states[S_EGGMOBILE_LATK9].nextstate = S_EGGMOBILE_ROFL
		states[S_EGGMOBILE_LATK9].action = nil
		states[S_EGGMOBILE_LATK9].var1 = 0
		states[S_EGGMOBILE_LATK9].var2 = 0
		
		states[S_EGGMOBILE_RATK1].tics = 3
		states[S_EGGMOBILE_RATK1].nextstate = S_EGGMOBILE_RATK2
		states[S_EGGMOBILE_RATK1].action = "A_FaceTarget"
		states[S_EGGMOBILE_RATK1].var1 = 0
		states[S_EGGMOBILE_RATK1].var2 = 0
		
		states[S_EGGMOBILE_RATK2].tics = 15
		states[S_EGGMOBILE_RATK2].nextstate = S_EGGMOBILE_RATK3
		states[S_EGGMOBILE_RATK2].action = nil
		states[S_EGGMOBILE_RATK2].var1 = 0
		states[S_EGGMOBILE_RATK2].var2 = 0
		
		states[S_EGGMOBILE_RATK3].tics = 2
		states[S_EGGMOBILE_RATK3].nextstate = S_EGGMOBILE_RATK4
		states[S_EGGMOBILE_RATK3].action = nil
		states[S_EGGMOBILE_RATK3].var1 = 0
		states[S_EGGMOBILE_RATK3].var2 = 0
		
		states[S_EGGMOBILE_RATK4].tics = 2
		states[S_EGGMOBILE_RATK4].nextstate = S_EGGMOBILE_RATK5
		states[S_EGGMOBILE_RATK4].action = "A_FaceTarget"
		states[S_EGGMOBILE_RATK4].var1 = 0
		states[S_EGGMOBILE_RATK4].var2 = 0
		
		states[S_EGGMOBILE_RATK5].tics = 0
		states[S_EGGMOBILE_RATK5].nextstate = S_EGGMOBILE_RATK6
		states[S_EGGMOBILE_RATK5].action = "A_PrepareRepeat"
		states[S_EGGMOBILE_RATK5].var1 = 45
		states[S_EGGMOBILE_RATK5].var2 = 0
		
		states[S_EGGMOBILE_RATK6].tics = 1
		states[S_EGGMOBILE_RATK6].nextstate = S_EGGMOBILE_RATK8
		states[S_EGGMOBILE_RATK6].action = "A_Boss1Laser"
		states[S_EGGMOBILE_RATK6].var1 = MT_LASER
		states[S_EGGMOBILE_RATK6].var2 = 1
		
		states[S_EGGMOBILE_RATK8].tics = 0
		states[S_EGGMOBILE_RATK8].nextstate = S_EGGMOBILE_RATK9
		states[S_EGGMOBILE_RATK8].action = "A_Repeat"
		states[S_EGGMOBILE_RATK8].var1 = 45
		states[S_EGGMOBILE_RATK8].var2 = S_EGGMOBILE_RATK6
		
		states[S_EGGMOBILE_RATK9].tics = 2
		states[S_EGGMOBILE_RATK9].nextstate = S_EGGMOBILE_ROFL
		states[S_EGGMOBILE_RATK9].action = nil
		states[S_EGGMOBILE_RATK9].var1 = 0
		states[S_EGGMOBILE_RATK9].var2 = 0
		
		states[S_EGGMOBILE_PANIC1].tics = 0
		states[S_EGGMOBILE_PANIC1].nextstate = S_EGGMOBILE_PANIC2
		states[S_EGGMOBILE_PANIC1].action = "A_PrepareRepeat"
		states[S_EGGMOBILE_PANIC1].var1 = 45
		states[S_EGGMOBILE_PANIC1].var2 = 0
		
		states[S_EGGMOBILE_PANIC2].tics = 16
		states[S_EGGMOBILE_PANIC2].nextstate = S_EGGMOBILE_PANIC3
		states[S_EGGMOBILE_PANIC2].action = "A_FaceTarget"
		states[S_EGGMOBILE_PANIC2].var1 = 3
		states[S_EGGMOBILE_PANIC2].var2 = 4
		
		states[S_EGGMOBILE_PANIC3].tics = 1
		states[S_EGGMOBILE_PANIC3].nextstate = S_EGGMOBILE_PANIC5
		states[S_EGGMOBILE_PANIC3].action = "A_Boss1Laser"
		states[S_EGGMOBILE_PANIC3].var1 = MT_LASER
		states[S_EGGMOBILE_PANIC3].var2 = 2
		
		states[S_EGGMOBILE_PANIC5].tics = 0
		states[S_EGGMOBILE_PANIC5].nextstate = S_EGGMOBILE_PANIC6
		states[S_EGGMOBILE_PANIC5].action = "A_Repeat"
		states[S_EGGMOBILE_PANIC5].var1 = 45
		states[S_EGGMOBILE_PANIC5].var2 = S_EGGMOBILE_PANIC3
		
		states[S_EGGMOBILE_PANIC6].tics = 0
		states[S_EGGMOBILE_PANIC6].nextstate = S_EGGMOBILE_PANIC7
		states[S_EGGMOBILE_PANIC6].action = "A_PrepareRepeat"
		states[S_EGGMOBILE_PANIC6].var1 = 45
		states[S_EGGMOBILE_PANIC6].var2 = 0
		
		states[S_EGGMOBILE_PANIC7].tics = 16
		states[S_EGGMOBILE_PANIC7].nextstate = S_EGGMOBILE_PANIC8
		states[S_EGGMOBILE_PANIC7].action = "A_FaceTarget"
		states[S_EGGMOBILE_PANIC7].var1 = 3
		states[S_EGGMOBILE_PANIC7].var2 = 4
		
		states[S_EGGMOBILE_PANIC8].tics = 1
		states[S_EGGMOBILE_PANIC8].nextstate = S_EGGMOBILE_PANIC10
		states[S_EGGMOBILE_PANIC8].action = "A_Boss1Laser"
		states[S_EGGMOBILE_PANIC8].var1 = MT_LASER
		states[S_EGGMOBILE_PANIC8].var2 = 2
		
		states[S_EGGMOBILE_PANIC10].tics = 0
		states[S_EGGMOBILE_PANIC10].nextstate = S_EGGMOBILE_PANIC11
		states[S_EGGMOBILE_PANIC10].action = "A_Repeat"
		states[S_EGGMOBILE_PANIC10].var1 = 45
		states[S_EGGMOBILE_PANIC10].var2 = S_EGGMOBILE_PANIC8
		
		states[S_EGGMOBILE_PANIC11].tics = 0
		states[S_EGGMOBILE_PANIC11].nextstate = S_EGGMOBILE_PANIC12
		states[S_EGGMOBILE_PANIC11].action = "A_PrepareRepeat"
		states[S_EGGMOBILE_PANIC11].var1 = 45
		states[S_EGGMOBILE_PANIC11].var2 = 0
		
		states[S_EGGMOBILE_PANIC12].tics = 16
		states[S_EGGMOBILE_PANIC12].nextstate = S_EGGMOBILE_PANIC13
		states[S_EGGMOBILE_PANIC12].action = "A_FaceTarget"
		states[S_EGGMOBILE_PANIC12].var1 = 3
		states[S_EGGMOBILE_PANIC12].var2 = 4
		
		states[S_EGGMOBILE_PANIC13].tics = 1
		states[S_EGGMOBILE_PANIC13].nextstate = S_EGGMOBILE_PANIC15
		states[S_EGGMOBILE_PANIC13].action = "A_Boss1Laser"
		states[S_EGGMOBILE_PANIC13].var1 = MT_LASER
		states[S_EGGMOBILE_PANIC13].var2 = 2
		
		states[S_EGGMOBILE_PANIC15].tics = 0
		states[S_EGGMOBILE_PANIC15].nextstate = S_EGGMOBILE_ROFL
		states[S_EGGMOBILE_PANIC15].action = "A_Repeat"
		states[S_EGGMOBILE_PANIC15].var1 = 45
		states[S_EGGMOBILE_PANIC15].var2 = S_EGGMOBILE_PANIC13
		
		states[S_EGGMOBILE_DIE3].nextstate = S_EGGMOBILE_DIE4
		
		mobjinfo[MT_SONIC3KBOSSEXPLODE].painsound = 0
		states[S_SONIC3KBOSSEXPLOSION2].action = nil
	end
end

local function firefuse(mo)
	if gamemap == 468
		mo.fuse = 20*TICRATE
	end
end

local function fuseend(mo)
	if gamemap == 468 and mo.fuse == 0
		P_RemoveMobj(mo)
	end
end

local function finale(mo)
	if gamemap == 469 and mo.healthset == nil
		mo.health = 12 --Boss health is handled here because spawnhealth doesn't work well with MapLoad hook.
		mo.healthset = true
	elseif gamemap == 469 and mo.health == 0
		P_StartQuake(10*FRACUNIT, 1)
		S_StartSound(nil, sfx_s3k69)

		-- -1536 to 1536
		local x = 0
		local y = 0
		local z = 0
		for i=1, 8, 1
			x = P_RandomRange(-1536, 1536)*FRACUNIT
			y = P_RandomRange(-1536, 1536)*FRACUNIT
			z = P_RandomRange(R_PointInSubsector(x,y).sector.floorheight/FRACUNIT,R_PointInSubsector(x,y).sector.ceilingheight/FRACUNIT)*FRACUNIT
			P_SpawnMobj(x,y,z, MT_SONIC3KBOSSEXPLODE)
		end
		
			x = P_RandomRange(-1536, 1536)*FRACUNIT
			y = P_RandomRange(-1536, 1536)*FRACUNIT
			P_SpawnMobj(x,y,R_PointInSubsector(x,y).sector.ceilingheight, MT_RUBBLE)
		for sector in sectors.iterate
			if #sector == 2 or #sector == 3 or #sector == 4 or #sector == 29
				if sector.floorheight > 64*FRACUNIT
					sector.floorheight = $1 - 1*FRACUNIT
				end
			elseif #sector == 12
				if sector.floorheight > 64*FRACUNIT
					sector.floorheight = $1 - 2*FRACUNIT
				end
			elseif #sector == 24
				if sector.ceilingheight > 32*FRACUNIT
					sector.ceilingheight = $1 - 2*FRACUNIT
				end
			end
		end
		if mo.state == S_EGGMOBILE_FLEE1 or mo.state == S_EGGMOBILE_FLEE2
			for sector in sectors.iterate
				if #sector == 18
					sector.ceilingheight = 768*FRACUNIT
				elseif #sector == 20
					sector.ceilingheight = 2048*FRACUNIT
					sector.floorheight = 2048*FRACUNIT
				elseif #sector == 16
					sector.tag = 8
					sector.special = 8192
				end
			end
			for player in players.iterate
				player.mo.state = S_PLAY_FALL
				if #player.mo.subsector.sector != 16
					P_Thrust(player.mo, R_PointToAngle2(player.mo.x, player.mo.y, 0*FRACUNIT, -1600*FRACUNIT), 4*FRACUNIT)
					if(player.mo.z < 640*FRACUNIT)
						P_SetObjectMomZ(player.mo, 4*FRACUNIT, false)
					elseif(player.mo.z > 640*FRACUNIT)
						P_SetObjectMomZ(player.mo, -4*FRACUNIT, false)
					else
						P_SetObjectMomZ(player.mo, 0, false)
					end
				end
			end
		end
	end
end

local function rubbleThink(rubblemo)
	if rubblemo.z + 64*FRACUNIT < rubblemo.subsector.sector.floorheight
		P_RemoveMobj(rubblemo)
	end
end

addHook("MapLoad", loadBoss)
addHook("MobjSpawn", firefuse, MT_PUMA)
addHook("MobjThinker", fuseend, MT_PUMA)
addHook("MobjThinker", finale, MT_EGGMOBILE)
addHook("MobjThinker", rubbleThink, MT_RUBBLE)