-- ---------------------BADNIK ACTION DEFINITIONS--------------------- --
-- custom action for the yellow crawla and the red crawla --
function A_Chase2(actor,var1,var2)
	local mob_param = actor.spawnpoint.tag
	
	if mob_param == 2 then
		local mob_distance_z = abs(actor.target.z-actor.z)/FRACUNIT
		
		if mob_distance_z < 128 then
			A_Chase(actor,3)
		end
	else
		A_Chase(actor,3)
	end
end

//custom action for the blue crawla//
function A_BrutalChase(actor,var1,var2)
	A_Chase(actor,3)
	
	local blue_distances = {abs(actor.target.x-actor.x)/FRACUNIT,abs(actor.target.y-actor.y)/FRACUNIT}
	
	if blue_distances[1] < 512 and blue_distances[2] < 512 then
		actor.info.speed = 36
		S_StartSound(nil,sfx_tread)
	else
		actor.info.speed = 10
	end
end

-- custom action for the yellow bouncy bot and the grey bouncy bot --
function A_SuperHop(actor,var1,var2)
	
	if actor.eflags == MFE_ONGROUND or actor.eflags == MFE_JUSTHITFLOOR or actor.momz == 0
		A_ChangeAngleRelative(actor,90,270)
		A_BunnyHop(actor,8,8)
	end
end

-- ---------------------BEGIN OBJECT DEFINITIONS--------------------- --
freeslot(
"MT_YELLOWCRAWLA", 
"S_YELLOWLOOK", "S_YELLOWMOVE", 
"SPR_YOSS")

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

states[S_YELLOWLOOK] = {
	sprite = SPR_YOSS, frame = A, tics = 15, action = A_Look, var1 = 0+4096<<16, var2 = 1, nextstate = S_YELLOWLOOK}

states[S_YELLOWMOVE] = {
	sprite = SPR_YOSS, frame = FF_ANIMATE|B, action = A_Chase2, var1 = 10, var2 = 1, tics = 2, nextstate = S_YELLOWMOVE}

-- -- 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 = 12,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_REDLOOK] = {
	sprite = SPR_ROSS, frame = A, tics = 10, action = A_Look, var1 = 0+4096<<16, var2 = 1, nextstate = S_REDLOOK}

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

-- -- Blue Crawla -- --
freeslot(
"MT_DEEPBLUECRAWLA", 
"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_BLUELOOK,
	seestate = S_BLUEMOVE,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	attacksound = sfx_tread1,
	mass = 20*FRACUNIT,
	speed = 12,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_BLUELOOK] = {
	sprite = SPR_BOSS, frame = A, action = A_Look, tics = 5, var1 = 0+4096<<16, var2 = 1, nextstate = S_BLUELOOK}

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

-- -- 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 = 15, action = A_Look, var1 = 0+4096<<16, var2 = 1, nextstate = S_BLOOK1}

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

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

-- -- 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 = 15, var1 = 0+4096<<16, var2 = 1, action = A_Look, nextstate = S_BLOOK2}

states[S_BBOUNCE2] = {
	sprite = SPR_BDN2, frame = A, action = A_SuperHop, 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}

-- -- 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 = 1, action = A_BuzzFly, var1 = sfx_buzz4, nextstate = S_BUZZMOVE1}
	
--Skyward Garden Cannon Lantern--
freeslot(
"MT_CANNONLANTERN",
"MT_FLOATCANNONLANTERN",
"S_LANTERNIDLE", "S_LANTERNLOOK", "S_LANTERNSHOOT",
"S_FLOATLANTERNIDLE", "S_FLOATLANTERNLOOK", "S_FLOATLANTERNSHOOT",
"SPR_LANC",
"SPR_FLTR")

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, tics = 15, 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}

addHook("MobjSpawn", function(mob)
	mob.shadowscale = 0
end
,MT_CANNONLANTERN)

--Now the lantern's floating version--
mobjinfo[MT_FLOATCANNONLANTERN] = {
	--$Category Skyward Garden
	--$Name Float Cannon Lantern
	--$Sprite FLTRA1
	doomednum = 3023,
	radius = 48*FRACUNIT,
	height = 64*FRACUNIT,
	spawnstate = S_FLOATLANTERNIDLE,
	seestate = S_FLOATLANTERNSHOOT,
	raisestate = MT_ROCKET,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	painchance = 1000,
	attacksound = sfx_laser,
	mass = 100,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY
}

states[S_FLOATLANTERNIDLE] = {
	sprite = SPR_FLTR, frame = A, action = A_TurretStop, tics = 15, nextstate = S_FLOATLANTERNLOOK}

states[S_FLOATLANTERNLOOK] = {
	sprite = SPR_FLTR, frame = A, tics = 15, action = A_Look, var1 = 0+1024<<16, var2 = 1, tics = 5, nextstate = S_FLOATLANTERNLOOK}

states[S_FLOATLANTERNSHOOT] = {
	sprite = SPR_FLTR, frame = A, action = A_TurretFire, tics = 15, nextstate = S_FLOATLANTERNIDLE}

---------------------------------Wondrous Windsock's Badniks--------------------------------------
freeslot(
"MT_BLUEPROJECTILE",
"S_BLUEPROJECTILESHOT",
"SPR_PRO2")

mobjinfo[MT_BLUEPROJECTILE] = {
	doomednum = 3033,
	radius = 8*FRACUNIT,
	height = 16*FRACUNIT,
	speed = 20*FRACUNIT,
	spawnstate = S_BLUEPROJECTILESHOT,
	seesound = sfx_none,
	attacksound	= sfx_none,
	reactiontime = 8,
	spawnhealth = 1,
	painchance = 200,
	mass = 100,
	damage = 1,
	flags = MF_MISSILE|MF_SPECIAL|MF_PAIN
}

states[S_BLUEPROJECTILESHOT] = {
	sprite = SPR_PRO2, frame = A, tics = 350, nextstate = S_BLUEPROJECTILESHOT}

addHook("MobjThinker", function(mob)
	if mob.tics == 350 then
		A_ChangeAngleRelative(mob,0,360)
		local randThrust = P_RandomRange(-10,10)
		A_Thrust(mob,randThrust,0)
	end
	
	if mob.tics == 340 then
		A_SetObjectFlags(mob,MF_MISSILE,1)
	end
	
	if mob.tics == 1 then
		P_RemoveMobj(mob)
	end
end
,MT_BLUEPROJECTILE)

freeslot(
"MT_STATIONBOT", 
"S_SBOTLOOK", "S_SBOTSHOOT", 
"SPR_STBT")

mobjinfo[MT_STATIONBOT] = {
	--$Category Wondrous Windsock
	--$Name Station Bot
	--$Sprite STBTA1
	doomednum = 3032,
	radius = 39*FRACUNIT,
	height = 64*FRACUNIT,
	spawnstate = S_SBOTLOOK,
	seestate = S_SBOTSHOOT,
	raisestate = MT_BLUEPROJECTILE,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	painchance = 1000,
	attacksound = sfx_laser,
	mass = 50*FRACUNIT,
	speed = 6,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_SBOTLOOK] = {
	sprite = SPR_STBT, frame = A, tics = 15, action = A_Look, var1 = 0+10000<<16, var2 = 1, nextstate = S_SBOTLOOK}

states[S_SBOTSHOOT] = {
	sprite = SPR_STBT, frame = A, tics = 20, nextstate = S_SBOTLOOK}

addHook("MobjThinker",function(mob)
	if mob.state == S_SBOTLOOK then
		return
	end
	
	if mob.tics == 20 then
		P_SpawnMobj(mob.x,mob.y,mob.z,MT_BLUEPLATFORM)
	end
	
	if mob.tics == 10 then
		A_ShootBullet(mob)
	else
		if (mob.z-mob.target.z)/FRACUNIT < 150 then
			A_ZThrust(mob,1)
			mob.momz = mob.momz/2
		end
	end
end
,MT_STATIONBOT)

freeslot(
"MT_BLUEPLATFORM",
"S_BLUEPLATFORMSTATIC",
"SPR_GPLA")

mobjinfo[MT_BLUEPLATFORM] = {
	doomednum = 3034,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	spawnstate = S_BLUEPLATFORMSTATIC,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT
}

states[S_BLUEPLATFORMSTATIC] = {
	sprite = SPR_GPLA, frame = FF_ADD|FF_FLOORSPRITE|A, tics = 21, var1 = 1, var2 = 1, nextstate = S_BLUEPLATFORMSTATIC}

addHook("MobjThinker",function(mob)
	if mob.spritexscale == 1*FRACUNIT then
		mob.spritexscale = (3*FRACUNIT)/2
		mob.spriteyscale = (3*FRACUNIT)/2
	end
	
	A_FindTracer(mob,MT_STATIONBOT)
	
	if mob.tracer.valid == true then
		A_CapeChase(mob,1+0<<16,0+0<<16)
	end
	
	if mob.tics == 1 then
		P_RemoveMobj(mob)
	end
end
,MT_BLUEPLATFORM)

freeslot(
"MT_JUMPBOT", 
"S_JUMPBOTINIT","S_JUMPBOTLOOK", "S_JUMPBOTJUMP", 
"SPR_JPBT")

mobjinfo[MT_JUMPBOT] = {
	--$Category Wondrous Windsock
	--$Name Jump Bot
	--$Sprite JPBTA1
	doomednum = 3036,
	radius = 48*FRACUNIT,
	height = 33*FRACUNIT,
	spawnstate = S_JUMPBOTINIT,
	seestate = S_JUMPBOTJUMP,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	painchance = 1000,
	mass = 50*FRACUNIT,
	speed = 6,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}
states[S_JUMPBOTINIT] = {
	sprite = SPR_JPBT, frame = A, tics = 5, nextstate = S_JUMPBOTLOOK}
	
states[S_JUMPBOTLOOK] = {
	sprite = SPR_JPBT, frame = A, tics = 15, action = A_Look, var1 = 0+2500<<16, var2 = 1, nextstate = S_JUMPBOTLOOK}

states[S_JUMPBOTJUMP] = {
	sprite = SPR_JPBT, frame = B, tics = 60, nextstate = S_JUMPBOTLOOK}

addHook("MobjThinker",function(mob)
	if mob.state == S_JUMPBOTINIT then
		mob.storedTarget = nil
		return
	end
	
	if mob.state == S_JUMPBOTJUMP and mob.target.valid then
		if mob.tics == 60 then
			A_FaceTarget(mob)
			A_BunnyHop(mob,8,16)
			mob.frame = B
			mob.storedTarget = mob.target
		end	
	else
		if not(mob.storedTarget == nil) then
			mob.target = mob.storedTarget
			A_FaceTarget(mob)
		end
	end
	
	if mob.eflags == MFE_ONGROUND and mob.tics < 35 then
		mob.frame = A
	end
end
,MT_JUMPBOT)

freeslot(
"MT_REDFISHBOT", 
"S_REDFISHLOOK","S_REDFISHCHARGE1","S_REDFISHCHARGE2","S_REDFISHCHARGE3","S_REDFISHCHARGE4",
"S_REDFISHPAIN","S_REDFISHCHARGE5","S_REDFISHCHARGE6","S_REDFISHCHARGE7","S_REDFISHCHARGE8",
"S_REDFISHDESCEND",
"SPR_FIBT")

mobjinfo[MT_REDFISHBOT] = {
	--$Category Wondrous Windsock
	--$Name Red Fish Bot
	--$Sprite FIBTA1
	doomednum = 3043,
	radius = 112*FRACUNIT,
	height = 128*FRACUNIT,
	spawnstate = S_REDFISHLOOK,
	spawnhealth = 2,
	seestate = S_REDFISHCHARGE1,
	deathstate = S_XPLD_FLICKY,
	deathsound = sfx_pop,
	painchance = 1000,
	painstate = S_REDFISHPAIN,
	painsound = sfx_dmpain,
	reactiontime = 50,
	mass = 50*FRACUNIT,
	speed = 20,
	flags = MF_SLIDEME|MF_FLOAT|MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY
}
states[S_REDFISHLOOK] = {
	sprite = SPR_FIBT, frame = A, action = A_JetJawRoam, tics = 7, nextstate = S_REDFISHLOOK}

states[S_REDFISHCHARGE1] = {
	sprite = SPR_FIBT, frame = A, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE2}

states[S_REDFISHCHARGE2] = {
	sprite = SPR_FIBT, frame = B, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE3}

states[S_REDFISHCHARGE3] = {
	sprite = SPR_FIBT, frame = C, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE4}

states[S_REDFISHCHARGE4] = {
	sprite = SPR_FIBT, frame = D, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE5}

states[S_REDFISHCHARGE5] = {
	sprite = SPR_FIBT, frame = E, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE6}

states[S_REDFISHCHARGE6] = {
	sprite = SPR_FIBT, frame = D, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE7}

states[S_REDFISHCHARGE7] = {
	sprite = SPR_FIBT, frame = C, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE8}

states[S_REDFISHCHARGE8] = {
	sprite = SPR_FIBT, frame = B, action = A_JetJawChomp, tics = 1, nextstate = S_REDFISHCHARGE1}

states[S_REDFISHPAIN] = {
	sprite = SPR_FIBT, frame = A, action = A_Pain, tics = 35, nextstate = S_REDFISHLOOK}

states[S_REDFISHDESCEND] = {
	sprite = SPR_FIBT, frame = A, action = none, tics = 175, nextstate = S_REDFISHLOOK}
	
addHook("MobjThinker",function(mob)
	local maximum_height = mob.spawnpoint.tag --manual input, define the water surface
	if (mob.z/FRACUNIT) > maximum_height then
		mob.state = S_REDFISHDESCEND
	end
	
	--the descending state blocks all other logic from occurring--
	if mob.state == S_REDFISHDESCEND then
		mob.momz = -8*FRACUNIT
		return
	end
	
	--if not having to descend (due to breaking the water surface)--
	if mob.state == S_REDFISHLOOK or mob.state == S_REDFISHPAIN then
		return
	end
	
	--if the player is sighted and the fish is not in pain--
	if not(mob.target == nil) then
		--if the fish has a valid target to pursue--
		local target_z = mob.target.z-(32*FRACUNIT)
		
		if mob.z < target_z then
			mob.momz = 4*FRACUNIT
		else
			mob.momz = -4*FRACUNIT
		end
	end
end
,MT_REDFISHBOT)