


/*
	The "I'm taking you down with me" phase.
	
	He is just a bleeding head with empty eye sockets on a meatstalk
	(after BDv21 gatekeeper)
	
	Feature: bobs up and down in the air.
	
	Feature: the meat neck is resistant to all forms of damage except cutting. Can be killed quickly using Dragonslayer. 
	
	Attacks:
	3. A devastating ramming lunge attack (he's still a giant horned goat skull)
	
*/

const int IOS3_NECK_SPACING = 40;
const int IOS3_NECK_WIGGLE_AMPLITUDE = 27;

ACTOR IosStage3_3
// he's a floating skull, he only has one animation frame!
{
	Health 23000
	Speed 50
	Mass 1000
	
	
	Monster
	DeathHeight 0
	BurnHeight 0
	+BOSS
	+FLOORCLIP
    +DONTRIP
	+DONTMORPH
	+BOSSDEATH
    +NORADIUSDMG
    +NOBLOOD
	+SOLID
	+SHOOTABLE
	+NOICEDEATH	
	
	+FLOAT
	+FLOATBOB
	+NOGRAVITY
	+DONTHARMSPECIES
	+THRUSPECIES

	DeathHeight 0
	BurnHeight 0
	
	
	
	damagefactor "Normal", 1.0
	damagefactor "Desintegrate", 1.0	
	damagefactor "Avoid", 0.0
	damagefactor "GibRemoving", 0.0	damagefactor "Trample", 0.0
	damagefactor "TeleportRemover", 0.0
	DamageFactor "CauseSplash", 0.0 DamageFactor "CauseObjectsToSplashSlime", 0.0 DamageFactor "CauseObjectsToSplashNukage", 0.0
	DamageFactor "CauseObjectsToSplashBlood", 0.0 DamageFactor "CauseObjectsToSplashLava", 0.0
	Obituary "%o was destroyed by a Mastermind."
	Painchance "Stomp", 255
	Painchance "Explosive", 255
	
	damagefactor "Burn", 0.0 //immune to imp fireballs - but, more importantly, to blood lake's damage
	

	Tag "$IOSBOSS_T" // The final boss
	Obituary "$IOSBOSS_O" // %o fell in the Final Battle

	Species "FinalBoss"
	
	+BOSS
	+AMBUSH	
	+FLOORCLIP
	+NORADIUSDMG
	+DONTMORPH
	+BOSSDEATH
	+NOBLOOD
	+NOTARGET
	+FORCEXYBILLBOARD
	+NOICEDEATH
	
	+MISSILEMORE
	+MISSILEEVENMORE
	+QUICKTORETALIATE // he instakills any monster that angered him
	+NOPAIN // temporaray, cleared after setup

	SeeSound "IOS3SEE"
	PainSound "IOS3PAIN"
	DeathSound "IOS3DETH"

	Game Doom

	Radius 90
	Height 240
	
	
	// immunity to his own AOE devastation
	damagefactor "IOS_Frost", 0.0
	damagefactor "ExplosiveImpact", 0.0
	damagefactor "Stomp", 0.0
	
	PainChance 16
	DamageFactor "Head", 1.0
	PainChance "Head", 64
	DamageFactor "Decaptate", 1.0
	PainChance "Decaptate", 255 // deliberatedly cheesable using the chainsaw on the neck
	
	Scale 2.8
	
	Gravity 0.1 // for the death throes
	
	
	var int user_c;
	
	States {
	
		Spawn:
			IOS3 A 1
			Goto SpawnNeck
			
		SpawnNeck:	
			IOS3 A 2
			TNT1 A 0 A_SpawnItemEx ("IOS3MeatBase",-100,0,0,0,0,0,0,SXF_SETMASTER | SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG ,0)
			TNT1 A 0 A_SpawnItemEx ("IOS3Meat1",-110,0,0,0,0,0,0,SXF_SETMASTER | SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG ,0)
			TNT1 A 0 A_SpawnItemEx ("IOS3Meat2",-120,0,0,0,0,0,0,SXF_SETMASTER | SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG ,0)
			TNT1 A 0 A_SpawnItemEx ("IOS3Meat3",-130,0,0,0,0,0,0,SXF_SETMASTER | SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG ,0)
			TNT1 A 0 A_SpawnItemEx ("IOS3Meat4",-140,0,0,0,0,0,0,SXF_SETMASTER | SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG ,0)
		
		Stand:	
			IOS3 A 10 A_Look
			Loop
			
		See:
			TNT1 A 0
			TNT1 A 0 A_JumpIfInventory("HasSpotedThePlayerAlready", 1, "See2")
			TNT1 A 0 A_GiveInventory("HasSpotedThePlayerAlready", 1)		
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_DisplayBossHealth", 14) // "IOSBOSS3"; // Spiteful Spirit of Sin / Мстительный призрак греха
			
			TNT1 A 0 ACS_NamedExecute("BossStage3Wakes") // map script, switches music among other things
			
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
		
		Idle:
			IOS3 A 3 A_Look
			IOS3 AAAAAAAAA 3 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			"----" A 0 A_Jump(50, "Wander")
			Loop
		Wander:
			IOS3 A 2 A_Wander
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 2 A_Wander
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 2 A_Wander
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 2 A_Wander
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 2 A_Wander
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 2 A_Wander
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 2 A_Wander
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 2 A_Look
			"----" A 0 A_Jump(25, "Idle")
			Loop

		See2:
			IOS3 A 10 
		Chase:
			IOS3 A 1 A_Chase
			IOS3 A 1 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 1 A_Chase
			IOS3 A 1 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 1 A_Chase
			IOS3 A 1 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 1 A_Chase
			IOS3 A 1 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 1 A_Chase
			IOS3 A 1 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			"----" A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_JumpIfTargetInLOS("AttackLogic")
			Loop

		AttackLogic:
			"----" A 0 A_JumpIf(CallAcs("GetNoTraget"), "Idle")
			"----" A 0 A_JumpIfTargetInLOS("Lunge", 20, JLOSF_DEADNOJUMP, 600)
			Goto Chase

		Missile:
		Melee:
			IOS3 A 0 A_FaceTarget
		Lunge:
			IOS3 A 0 A_SetUserVar("user_c", 105)
			
		LungeLoop:	
			IOS3 A 0 A_Recoil(-1)//A_Wander
			IOS3 A 1 ACS_NamedExecuteWithResult("FBD_FaceTargetSlowly", ANGLE_TO_FIXED * 1.0)
			IOS3 A 0 A_JumpIf((0 - CallAcs("GetZDeltaToTarget")) > CallAcs("GetXYDistanceToTarget"), "SlamDown")
			TNT1 A 0 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			IOS3 A 0 A_SetUserVar("user_c", user_c - 1)
			IOS3 A 0 A_JumpIf(user_c <= 0, "Coast")
			IOS3 A 0 A_JumpIf(waterlevel > 0, "Sploosh")
			Loop
			
		SlamDown:
			IOS3 A 0 A_ChangeVelocity(momx, momy, -10.0, CVF_REPLACE)
			//IOS3 A 0 A_Recoil(2)
			IOS3 A 1
		SlamLoop:
			//***Che the boss kills himself via falling damage in a single hit, LOL
			//IOS3 A 0 ThrustThingZ(0, 5, 1, 1)
			IOS3 A 0 A_ChangeVelocity(momx, momy, momz - 5.0 <= -19.0 ? -19.0 : momz - 5.0, CVF_REPLACE)
			IOS3 A 1
			IOS3 A 0 A_JumpIf(waterlevel > 0, "Sploosh")
			IOS3 A 0 A_JumpIf(velz >=0, "SlamHit")
			IOS3 A 0 A_CheckFloor("SlamHit")
			Loop
		
		SlamHit:
			TNT1 A 0 A_SpawnItemEx("DurielStompAuraVFX", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			TNT1 A 0 A_CustomMissile("IosStage3Slam")
			TNT1 A 0 A_PlaySound("eday32/stage3footstep", 7)
			IOS3 A 0 A_Stop
			IOS3 AAAAAAAAAAA 3 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			Goto See2		
		
		Coast:
			IOS3 AAAAAAAAAAAAAA 3 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			Goto See2
			
		Sploosh:
			IOS3 A 0 A_CustomMissile("IosStage3Slam")
			IOS3 A 0 A_PlaySound("ios3/bigsplash")
			IOS3 A 0 A_Stop
			IOS3 AAAAAAAAAAAAAAAA 0 A_CustomMissile ("BloodMistBig", 0, 0, random (0, 360), CMF_AIMDIRECTION, random (45, 90))
			IOS3 A 0 ThrustThingZ(0, 5, 0, 1)
			IOS3 AAAAAAA 3 A_ChangeVelocity(momx, momy, z < 192.0 ? 5.0 : (z > 300.0 ? - 5.0 : momz + 0.05 * random(-10,10)), CVF_REPLACE)
			Goto See2
			
		Pain:
			"----" A 0 A_Pain
			Goto Chase

		Pain.Decaptate:
			IOS3 A 3 A_Pain
			IOS3 AAAA 3
			Goto See
		
		Death:
		XDeath:
			IOS3 A 0 ACS_NamedExecuteWithResult("BossIsDead") // map script
			IOS3 A 0 A_Scream
			IOS3 AAAAAAAAAAAAAAAAAA 3 A_CustomMissile ("BloodMistXXBig", 120, 0, random (0, 360), CMF_AIMDIRECTION, random (-60, 90))
			TNT1 A 0 A_ChangeFlag("NOGRAVITY", 0)
			TNT1 A 0 A_ChangeFlag("FLOAT", 0)
			TNT1 A 0 A_ChangeFlag("FLOATBOB", 0)
			IOS3 AAAAAAAAAAAAAAAAAA 3 A_CustomMissile ("BloodMistXXBig", 120, 0, random (0, 360), CMF_AIMDIRECTION, random (-60, 90))
			IOS3 A 0 A_NoBlocking
			TNT1 A 0 A_GiveInventory("IosIsDead", 1)
			TNT1 A 0 A_CustomMissile ("RidiculousExplosionSpawner", 30, 0, random (0, 360), 2, 90)
			IOS3 AAA 3
			TNT1 A 0 Radius_Quake (8, 100, 0, 22, 0)
			TNT1 AAAAAAA 0 A_CustomMissile ("BloodMistXXBig", Random(40, 200), 0, random (0, 360), CMF_AIMDIRECTION, random (40, 90))
			TNT1 AAAAAAAAAA 5 A_CustomMissile ("BloodMistXXBig", Random(40, 200), 0, random (0, 360), CMF_AIMDIRECTION, random (40, 90))
			
			TNT1 A 0 ACS_NamedExecuteWithResult("IOSStage3Death")
			TNT1 A 60
			Stop
	}	
}

ACTOR IosStage3_2: IosStage3_3
{
	Health 17000
	Speed 45
}

ACTOR IosStage3_1: IosStage3_3
{
	Health 14000
	Speed 40
}

ACTOR IosStage3_4: IosStage3_3
{
	Health 33000
	Speed 65
}


ACTOR IosStage3Slam
{
    Radius 0
    Height 0
	Alpha 1.0
	RenderStyle Add
	Speed 2
	+MISSILE
	PROJECTILE
	Damage 0
	Damagetype "Stomp"
	Species "FinalBoss"
	+DONTHARMSPECIES
	+THRUSPECIES
    States
    {
		Spawn:
		Death:
			TNT1 A 1
			TNT1 A 0 A_Explode (50,250, 0)
			Stop
    }
}


ACTOR IOS3MeatBase
{
	Monster
	-COUNTKILL
	+NOGRAVITY
	+FLOAT
	+FORCEXYBILLBOARD
	Health 99999
	Mass 100
	SCALE 1.0
	+SHOOTABLE
	+THRUGHOST
	+THRUSPECIES
	+FLOATBOB
	Radius 48
	Height 96
	var int user_d;
	Species "FinalBoss"

	
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood" // This makes it chainsawable!
	DamageFactor "Cut", 3.0 // deliberately cheesable using Dragonslayer!
	DamageFactor "Saw", 3.0
	
	damagefactor "Stomp", 0.0 // own slam attack
	
	PainChance 255
	-NOPAIN
	
	States
	{
		Spawn:
			KEME A 1 NODELAY A_SetUserVar("user_d", 0)
			Goto Idle
			
		Idle:
			KEME AAAAAAAAAAAAAAAA 1 A_Warp(AAPTR_Master, -60.0 - 0.5 * user_d * IOS3_NECK_SPACING, 1.0 * IOS3_NECK_WIGGLE_AMPLITUDE * Sin(1.0 * user_d * IOS3_NECK_SPACING + 8.0 * CallAcs("FBD_GetTic", 45)), -1.0 * user_d * IOS3_NECK_SPACING, 0, WARPF_NOCHECKPOSITION | WARPF_STOP)
			"----" A 0 A_JumpIfInventory("IosIsDead", 1, "Death", AAPTR_MASTER)
			"----" A 0 A_Jump(32, "Beat")
			Loop

		Beat:
			KEME BBBBCCCCBBBB 1 A_Warp(AAPTR_Master, -60.0 - 0.5 * user_d * IOS3_NECK_SPACING, 1.0 * IOS3_NECK_WIGGLE_AMPLITUDE * Sin(1.0 * user_d * IOS3_NECK_SPACING + 8.0 * CallAcs("FBD_GetTic", 45)), -1.0 * user_d * IOS3_NECK_SPACING, 0, WARPF_NOCHECKPOSITION | WARPF_STOP)
			"----" A 0 A_JumpIfInventory("IosIsDead", 1, "GotoDeath", AAPTR_MASTER)
			Goto Idle
	
		Pain:
			"----" A 0 A_JumpIfInventory("IosIsDead", 1, "GotoDeath", AAPTR_MASTER)
			"----" A 0 A_ChangeFlag("NOPAIN", 1)
			"----" A 0 A_DamageMaster(99999 - health, "Head")
			"----" A 1 A_Warp(AAPTR_Master, -60.0 - 0.5 * user_d * IOS3_NECK_SPACING, 1.0 * IOS3_NECK_WIGGLE_AMPLITUDE * Sin(1.0 * user_d * IOS3_NECK_SPACING + 8.0 * CallAcs("FBD_GetTic", 45)), -1.0 * user_d * IOS3_NECK_SPACING, 0, WARPF_NOCHECKPOSITION | WARPF_STOP)
			"----" A 0 
			"----" A 0 HealThing(-100) // restore to 100% health
			"----" A 0 A_ChangeFlag("NOPAIN", 0)
			Goto Beat
			
		Pain.Cut:
			"----" A 0 A_JumpIfInventory("IosIsDead", 1, "GotoDeath", AAPTR_MASTER)
			"----" A 0 A_ChangeFlag("NOPAIN", 1)
			"----" A 0 A_DamageMaster(99999 - health, "Decaptate")
			"----" A 1 A_Warp(AAPTR_Master, -60.0 - 0.5 * user_d * IOS3_NECK_SPACING, 1.0 * IOS3_NECK_WIGGLE_AMPLITUDE * Sin(1.0 * user_d * IOS3_NECK_SPACING + 8.0 * CallAcs("FBD_GetTic", 45)), -1.0 * user_d * IOS3_NECK_SPACING, 0, WARPF_NOCHECKPOSITION | WARPF_STOP)
			"----" A 0 
			"----" A 0 HealThing(-100) // restore to 100% health
			"----" A 0 A_ChangeFlag("NOPAIN", 0)
			Goto Beat
		
		GotoDeath:
			"----" A 1 A_Die
			Wait
			
		Death:
			TNT1 A 0 A_NoBlocking
			TNT1 AA 0 A_SpawnItem("MeatDeathSmall")
			TNT1 AAA 0 bright A_CustomMissile ("SuperGoreSpawner", 5, 0, random (0, 360), 2, random (30, 180))
			TNT1 AAAA 0 bright A_CustomMissile ("XDeath1", 5, 0, random (0, 360), CMF_AIMDIRECTION, random (30, 180))
			TNT1 AA 0 bright A_CustomMissile ("XDeath2b", 55, 0, random (0, 360), CMF_AIMDIRECTION, random (30, 180))
			TNT1 AA 0 bright A_CustomMissile ("XDeath3b", 55, 0, random (0, 360), CMF_AIMDIRECTION, random (30, 180))
			TNT1 AAAAAA 0 A_CustomMissile ("BloodMistBig", 40, 0, random (0, 360), 2, random (40, 90))
			TNT1 AA 0 A_CustomMissile ("BloodMistExtraBig", 40, 0, random (0, 360), 2, random (40, 90))
			TNT1 A 30
			Stop
			
	}
}


ACTOR IOS3Meat1: IOS3MeatBase
{
	XScale -1.0
	YScale 1.0
	States
	{
		Spawn:
			KEME A 1 NODELAY A_SetUserVar("user_d", 1)
			Goto Idle
	}
}

ACTOR IOS3Meat2: IOS3MeatBase
{
	Scale 0.8
	States
	{
		Spawn:
			KEME A 1 NODELAY A_SetUserVar("user_d", 2)
			Goto Idle
	}
}

ACTOR IOS3Meat3: IOS3MeatBase
{
	XScale -1.2
	YScale 1.2
	States
	{
		Spawn:
			KEME A 1 NODELAY A_SetUserVar("user_d", 3)
			Goto Idle
	}
}

ACTOR IOS3Meat4: IOS3MeatBase
{
	States
	{
		Spawn:
			KEME A 1 NODELAY A_SetUserVar("user_d", 4)
			Goto Idle
	}
}