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)

-- -- 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,
	painsound = sfx_dmpain,
	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, action = A_Pain, tics = 15, nextstate = S_BSPAWN2}

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
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}

--Skyward Garden Cannon Lantern--
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}