freeslot(
"MT_YELLOWCRAWLA", 
"S_YLOOK", "S_YMOVE", 
"SPR_YOSS")

mobjinfo[MT_YELLOWCRAWLA] = {
	--$Category Lawn World
	--$Name Yellow Crawla
	--$Sprite YOSSA1
	doomednum = 2338,
	radius = 24*FRACUNIT,
	height = 48*FRACUNIT,
	spawnstate = S_YLOOK,
	seestate = S_YMOVE,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	mass = 20*FRACUNIT,
	speed = 3,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_YLOOK] = {
	sprite = SPR_YOSS, frame = A, tics = 1, action = A_Look, nextstate = S_YLOOK}

states[S_YMOVE] = {
	sprite = SPR_YOSS, frame = FF_ANIMATE|B, var1 = 10, var2 = 1, tics = 10, nextstate = S_YMOVE}

addHook("MobjThinker", function(mob)
	if mob.state == S_YMOVE
		A_Chase(mob,3)
	end
end
,MT_YELLOWCRAWLA)

-- -- Red Crawla -- --
-- This overrides an existing slot, do not freeslot MT_REDCRAWLA
freeslot(
"S_REDLOOK", "S_REDMOVE", 
"SPR_ROSS")

mobjinfo[MT_REDCRAWLA] = {
	--$Category Lawn World
	--$Name Red Crawla
	--$Sprite ROSSA1
	doomednum = 101,
	radius = 24*FRACUNIT,
	height = 48*FRACUNIT,
	spawnstate = S_REDLOOK,
	seestate = S_REDMOVE,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	mass = 20*FRACUNIT,
	speed = 6,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_REDLOOK] = {
	sprite = SPR_ROSS, frame = A, action = A_Look, tics = 5, nextstate = S_REDLOOK}

states[S_REDMOVE] = {
	sprite = SPR_ROSS, frame = FF_ANIMATE|B, var1 = 10, var2 = 1, tics = 10, nextstate = S_REDMOVE}

addHook("MobjThinker", function(mob)
	if mob.state == S_REDMOVE
		A_Chase(mob,3)
	end
end
,MT_REDCRAWLA)

-- -- Blue Crawla -- --
freeslot(
"MT_DEEPBLUECRAWLA", 
"S_BLUEINIT", "S_BLUELOOK", "S_BLUEMOVE",
"SPR_BOSS", 
"sfx_tread")

sfxinfo[sfx_tread] = {
	singular = true,
	priority = 64,
	flags = SF_X4AWAYSOUND|SF_X8AWAYSOUND
}

mobjinfo[MT_DEEPBLUECRAWLA] = {
	--$Category Skyward Garden
	--$Name Deep Blue Crawla
	--$Sprite BOSSA1
	doomednum = 2359,
	radius = 24*FRACUNIT,
	height = 48*FRACUNIT,
	spawnstate = S_BLUEINIT,
	seestate = S_BLUEMOVE,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	attacksound = sfx_tread1,
	mass = 20*FRACUNIT,
	speed = 6,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_BLUEINIT] = {
	sprite = SPR_BOSS, frame = A, action = A_Look, tics = 1, nextstate = S_BLUELOOK}
	
states[S_BLUELOOK] = {
	sprite = SPR_BOSS, frame = A, action = A_Look, tics = 5, nextstate = S_BLUELOOK}

states[S_BLUEMOVE] = {
	sprite = SPR_BOSS, frame = FF_ANIMATE|B, var1 = 10, var2 = 1, tics = 10, nextstate = S_BLUEMOVE}

addHook("MobjThinker", function(mob)
	if mob.state == S_BLUEINIT
		mob.distance_x = 9999
		mob.distance_y = 9999
	else
		if not(mob.state == S_BLUELOOK) and not(mob.target == nil)
			A_Chase(mob,3)
			mob.distance_x = abs(mob.target.x-mob.x)/FRACUNIT
			mob.distance_y = abs(mob.target.y-mob.y)/FRACUNIT
			
			if mob.distance_x < 512 and mob.distance_y < 512
				mob.info.speed = 18
				mob.tics = 1
				S_StartSound(nil,sfx_tread)
			else
				mob.info.speed = 5
			end
		end
	end
end
,MT_DEEPBLUECRAWLA)

-- -- Brute Crawla -- --
freeslot(
"MT_BRUTECRAWLA", 
"S_BRUTELOOK", "S_BRUTEMOVE", "S_BRUTEPAIN", 
"SPR_BRSS")

mobjinfo[MT_BRUTECRAWLA] = {
	--$Category Broadside Cliffs
	--$Name Brute Crawla
	--$Sprite BRSSA1
	doomednum = 2303,
	radius = 30*FRACUNIT,
	height = 60*FRACUNIT,
	spawnstate = S_BRUTELOOK,
	spawnhealth = 2,
	reactiontime = 20,
	seestate = S_BRUTEMOVE,
	painstate = S_BRUTEPAIN,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	mass = 20*FRACUNIT,
	speed = 5,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_BRUTELOOK] = {
	sprite = SPR_BRSS, frame = A, tics = 1, action = A_Look, var1 = 0+3750<<16, var2 = 1, nextstate = S_BRUTELOOK}

states[S_BRUTEMOVE] = {
	sprite = SPR_BRSS, frame = FF_ANIMATE|B, var1 = 10, var2 = 1, tics = 10, nextstate = S_BRUTEMOVE}

states[S_BRUTEPAIN] = {
	sprite = SPR_BRSS, frame = A, tics = 5, nextstate = S_BRUTELOOK}

addHook("MobjCollide", function(mob,cmob)
	if not(cmob.player == nil)
		if abs(cmob.z-mob.z)/FRACUNIT < 50
			if cmob.state == S_PLAY_SPINDASH or cmob.state == S_PLAY_JUMP
				cmob.momx = ((cmob.x-mob.x)/FRACUNIT)*10000
				cmob.momy = ((cmob.y-mob.y)/FRACUNIT)*10000
				cmob.momz = 10*FRACUNIT
			end
				
			if cmob.state == S_PLAY_MELEE
				cmob.momx = ((cmob.x-mob.x)/FRACUNIT)*20000
				cmob.momy = ((cmob.y-mob.y)/FRACUNIT)*20000
				cmob.momz = 4*FRACUNIT
			end
		end
	end
end
,MT_BRUTECRAWLA)

addHook("MobjThinker", function(mob)
	if mob.state == S_BRUTEMOVE
		A_Chase(mob,3)
	end
	
	if mob.state == S_BRUTEPAIN
		S_StartSound(nil,sfx_dmpain)
		A_KnockBack(mob,1)
	end
end
,MT_BRUTECRAWLA)
	
-- -- Bouncy Bot -- --
freeslot(
"MT_BOUNCYBOT",
"S_BLOOK1", "S_BBOUNCE1", "S_BFORWARD1", "S_BSPAWN1",
"SPR_BDN1")

mobjinfo[MT_BOUNCYBOT] = {
	--$Category Lawn World
	--$Name Bouncy
	--$Sprite BDN1A1
	doomednum = 2348,
	radius = 18*FRACUNIT,
	height = 48*FRACUNIT,
	spawnstate = S_BSPAWN1,
	seestate = S_BBOUNCE1,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	mass = 20*FRACUNIT,
	speed = 10,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_BSPAWN1] = {
	sprite = SPR_BDN1, frame = A, tics = 1, nextstate = S_BLOOK1}

states[S_BLOOK1] = {
	sprite = SPR_BDN1, frame = A, tics = 5, action = A_Look, nextstate = S_BLOOK1}

states[S_BBOUNCE1] = {
	sprite = SPR_BDN1, frame = A, tics = 1, nextstate = S_BFORWARD1}

states[S_BFORWARD1] = {
	sprite = SPR_BDN1, frame = A, tics = 5, nextstate = S_BBOUNCE1}

addHook("MobjThinker", function(mob)
	if mob.state == S_BBOUNCE1
		if mob.eflags == MFE_ONGROUND or mob.eflags == MFE_JUSTHITFLOOR or mob.momz == 0
			A_ChangeAngleRelative(mob,90,270)
			A_BunnyHop(mob,8,8)
		end
	end
end
,MT_BOUNCYBOT)

-- -- Another Bouncy Bot -- --
freeslot(
"MT_BOUNCYBOT2",
"S_BLOOK2", "S_BBOUNCE2", "S_BFORWARD2", "S_BSPAWN2", "S_BPAIN2",
"SPR_BDN2")

mobjinfo[MT_BOUNCYBOT2] = {
	--$Category Broadside Cliffs
	--$Name Bouncy2
	--$Sprite BDN2A1
	doomednum = 2312,
	radius = 18*FRACUNIT,
	height = 48*FRACUNIT,
	spawnstate = S_BSPAWN2,
	spawnhealth = 2,
	reactiontime = 20,
	seestate = S_BBOUNCE2,
	painstate = S_BPAIN2,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	mass = 20*FRACUNIT,
	speed = 10,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_BSPAWN2] = {
	sprite = SPR_BDN2, frame = A, tics = 1, nextstate = S_BLOOK2}

states[S_BLOOK2] = {
	sprite = SPR_BDN2, frame = A, tics = 5, action = A_Look, nextstate = S_BLOOK2}

states[S_BBOUNCE2] = {
	sprite = SPR_BDN2, frame = A, tics = 1, nextstate = S_BFORWARD2}

states[S_BFORWARD2] = {
	sprite = SPR_BDN2, frame = A, tics = 5, nextstate = S_BBOUNCE2}

states[S_BPAIN2] = {
	sprite = SPR_BDN2, frame = A, tics = 5, nextstate = S_BSPAWN2}

addHook("MobjCollide", function(mob,cmob)
	if not(cmob.player == nil)
		if abs(cmob.z-mob.z)/FRACUNIT < 50
			if cmob.state == S_PLAY_SPINDASH or cmob.state == S_PLAY_JUMP
				cmob.momx = ((cmob.x-mob.x)/FRACUNIT)*10000
				cmob.momy = ((cmob.y-mob.y)/FRACUNIT)*10000
				cmob.momz = 10*FRACUNIT
			end
				
			if cmob.state == S_PLAY_MELEE
				cmob.momx = ((cmob.x-mob.x)/FRACUNIT)*20000
				cmob.momy = ((cmob.y-mob.y)/FRACUNIT)*20000
				cmob.momz = 4*FRACUNIT
			end
		end
	end
end
,MT_BOUNCYBOT2)

addHook("MobjThinker", function(mob)
	if mob.state == S_BBOUNCE2
		if mob.eflags == MFE_ONGROUND or mob.eflags == MFE_JUSTHITFLOOR or mob.momz == 0
			A_ChangeAngleRelative(mob,90,270)
			A_BunnyHop(mob,8,8)
		end
	end
	
	if mob.state == S_BPAIN2
		S_StartSound(nil,sfx_dmpain)
		A_KnockBack(mob,1)
	end
end
,MT_BOUNCYBOT2)

-- -- Custom Buzz -- --
-- This overrides an existing slot, do not freeslot MT_GOLDBUZZ
freeslot(
"S_BUZZLOOK1", "S_BUZZLOOK2", "S_BUZZMOVE1", "S_BUZZMOVE2", "S_BUZZMOVE3", "S_BUZZMOVE4", "S_BUZZMOVE5", "S_BUZZMOVE6",
"SPR_YBUZ")

mobjinfo[MT_GOLDBUZZ] = {
	--$Category Lawn World
	--$Name Buzz(Gold)
	--$Sprite YBUZA1
	doomednum = 103,
	radius = 48*FRACUNIT,
	height = 48*FRACUNIT,
	speed = 4*FRACUNIT,
	reactiontime = 2,
	spawnstate = S_BUZZLOOK1,
	seestate = S_BUZZMOVE1,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	mass = 100,
	flags = MF_SLIDEME|MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY
}

states[S_BUZZLOOK1] = {
	sprite = SPR_YBUZ, frame = A, tics = 2, action = A_Look, nextstate = S_BUZZLOOK2}

states[S_BUZZLOOK2] = {
	sprite = SPR_YBUZ, frame = D, tics = 2, action = A_Look, nextstate = S_BUZZLOOK1}

states[S_BUZZMOVE1] = {
	sprite = SPR_YBUZ, frame = A, tics = 1, action = A_BuzzFly, var1 = sfx_buzz4, nextstate = S_BUZZMOVE2}

states[S_BUZZMOVE2] = {
	sprite = SPR_YBUZ, frame = B, tics = 1, action = A_BuzzFly, var1 = sfx_buzz4, nextstate = S_BUZZMOVE3}

states[S_BUZZMOVE3] = {
	sprite = SPR_YBUZ, frame = C, tics = 1, action = A_BuzzFly, var1 = sfx_buzz4, nextstate = S_BUZZMOVE4}

states[S_BUZZMOVE4] = {
	sprite = SPR_YBUZ, frame = D, tics = 1, action = A_BuzzFly, var1 = sfx_buzz4, nextstate = S_BUZZMOVE5}

states[S_BUZZMOVE5] = {
	sprite = SPR_YBUZ, frame = C, tics = 1, action = A_BuzzFly, var1 = sfx_buzz4, nextstate = S_BUZZMOVE6}

states[S_BUZZMOVE6] = {
	sprite = SPR_YBUZ, frame = B, tics = 2, action = A_BuzzFly, var1 = sfx_buzz4, nextstate = S_BUZZMOVE1}

-- -- Flybot -- --
freeslot(
"MT_FLYBOT",
"S_FLYINIT", "S_FLYLOOK1", "S_FLYLOOK2", "S_FLYMOVE1", "S_FLYMOVE2", "S_FLYMOVE3", "S_FLYMOVE4", "S_FLYMOVE5",
"SPR_FLYB")

mobjinfo[MT_FLYBOT] = {
	--$Category Broadside Cliffs
	--$Name Black Shooting Fly
	--$Sprite FLYBA1
	doomednum = 2300,
	radius = 24*FRACUNIT,
	height = 40*FRACUNIT,
	speed = 4*FRACUNIT,
	reactiontime = 2,
	spawnstate = S_FLYINIT,
	seestate = S_FLYMOVE1,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	raisestate = MT_JETTBULLET,
	painchance = 1000,
	attacksound = sfx_trfire,
	mass = 100,
	flags = MF_SLIDEME|MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY
}

states[S_FLYINIT] = {
	sprite = SPR_FLYB, frame = A, tics = 1, nextstate = S_FLYLOOK1}
	
states[S_FLYLOOK1] = {
	sprite = SPR_FLYB, frame = A, tics = 2, action = A_Look, var1 = 0+5000<<16, var2 = 1, nextstate = S_FLYLOOK2}

states[S_FLYLOOK2] = {
	sprite = SPR_FLYB, frame = C, tics = 2, action = A_Look, var1 = 0+5000<<16, var2 = 1, nextstate = S_FLYLOOK1}

states[S_FLYMOVE1] = {
	sprite = SPR_FLYB, frame = A, tics = 1, action = none, nextstate = S_FLYMOVE2}

states[S_FLYMOVE2] = {
	sprite = SPR_FLYB, frame = B, tics = 1, action = none, nextstate = S_FLYMOVE3}

states[S_FLYMOVE3] = {
	sprite = SPR_FLYB, frame = C, tics = 1, action = none, nextstate = S_FLYMOVE4}

states[S_FLYMOVE4] = {
	sprite = SPR_FLYB, frame = B, tics = 1, action = none, nextstate = S_FLYMOVE5}

states[S_FLYMOVE5] = {
	sprite = SPR_FLYB, frame = A, tics = 1, action = none, nextstate = S_FLYMOVE1}
	
addHook("MobjThinker", function(mob)
	if (mob.state == S_FLYINIT)
		mob.distance_x = 9999
		mob.distance_y = 9999
		mob.distance_z = 9999
		mob.positionTest = true
		mob.shootTimer = 0
	
	else
		if abs(mob.momz) > 1*FRACUNIT
			mob.momz = mob.momz/2
		end
		
		if abs(mob.momx) > 2*FRACUNIT or abs(mob.momy) > 2*FRACUNIT
			mob.positionTest = P_CheckPosition(mob,mob.x+(mob.momx*4),mob.y+(mob.momy*4),mob.z)
		end
	end
	
	if mob.shootTimer > 300
		mob.shootTimer = 0
		A_ChangeAngleRelative(mob,180,180)
	end
	
	if (not(mob.state == S_FLYLOOK1) and not(mob.state == S_FLYLOOK2)) and (not(mob.target == nil))
		mob.distance_x = abs(mob.target.x-mob.x)/FRACUNIT
		mob.distance_y = abs(mob.target.y-mob.y)/FRACUNIT
		mob.distance_z = abs(mob.target.z-mob.z)/FRACUNIT
		
		if mob.shootTimer < 70 and (mob.distance_x < 2500 or mob.shootTimer < 2500)
			if mob.shootTimer == 0 and mob.momx < 10 and mob.momy < 10
				A_FaceTarget(mob)
			end
				
			if mob.distance_x > (256+mob.distance_z) or mob.distance_y > (256+mob.distance_z)
				A_Thrust(mob,20,1)
			else
				A_ForceStop(mob,0)
				mob.shootTimer = mob.shootTimer + 1
				if mob.shootTimer == 15
					A_ShootBullet(mob)
				end
			end
		else
			mob.shootTimer = mob.shootTimer + 1
			
			if mob.distance_x < 2000 and mob.distance_y < 2000 and mob.positionTest == true
				A_Thrust(mob,20,1)
			else
				mob.state = S_FLYLOOK1
				//print('stopped')
			end
		end
	end
	
	if (mob.state == S_FLYLOOK1 or mob.state == S_FLYLOOK2) and mob.shootTimer > 0
		A_ForceStop(mob,0)
		mob.shootTimer = mob.shootTimer + 1
	end
end
,MT_FLYBOT)

freeslot(
"MT_CANNONLANTERN",
"S_LANTERNIDLE", "S_LANTERNLOOK", "S_LANTERNSHOOT",
"SPR_LANC")

mobjinfo[MT_CANNONLANTERN] = {
	--$Category Skyward Garden
	--$Name Cannon Lantern
	--$Sprite LANCA1
	doomednum = 2307,
	radius = 32*FRACUNIT,
	height = 86*FRACUNIT,
	spawnstate = S_LANTERNIDLE,
	seestate = S_LANTERNSHOOT,
	raisestate = MT_ROCKET,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	painchance = 1000,
	attacksound = sfx_laser,
	mass = 100,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_LANTERNIDLE] = {
	sprite = SPR_LANC, frame = A, tics = 50, nextstate = S_LANTERNLOOK}

states[S_LANTERNLOOK] = {
	sprite = SPR_LANC, frame = A, action = A_Look, var1 = 0+10000<<16, var2 = 1, tics = 5, nextstate = S_LANTERNLOOK}

states[S_LANTERNSHOOT] = {
	sprite = SPR_LANC, frame = A, action = A_ShootBullet, tics = 1, nextstate = S_LANTERNIDLE}