

//***Che the boss of map 271 "Necropolis" designed after Diablo II's Duriel

ACTOR HoradricStaff: TechLamp1 17795
{
	-SHOOTABLE
	Radius 1
	States
	{
		Spawn: 
			TLMP A 1 BRIGHT
			TLMP A -1 BRIGHT
			Loop
		
		Lightning: // switched to this state by map script
			TLMP AAAAAAAAAAAAAAAA 3 BRIGHT A_CustomMissile ("CacolordLightning", 80, 0, 0, CMF_AIMDIRECTION | CMF_SAVEPITCH, 90)
			Goto Death
	}
}		


ACTOR VisibleFrostSpreader: FrostSpreader
{
	States
	{
		Spawn:
			TNT1 A 1 A_CustomMissile ("InvertedSmallSmoke", 15, 0, random (0, 360), 2, random (-90, -45))
			Loop
	}
}

ACTOR DurielRocket: FriginantRocket
// minimum vfx because he SPAMS several hundred of them in one attack
{
	SeeSound "BREATHOF"
	DeathSound "ice/shatter"
	States
	{
		Spawn:
			FATB V 1
			Loop
		Death:
		XDeath:
		Crash:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_RadiusGive("FrostAOENoVfx", 120, RGF_PLAYERS | RGF_MONSTERS)
			TNT1 AA 0 A_CustomMissile ("TransientIceChunk", 48, 0, random (-60, 60), 2, random (-60,35))
			TNT1 AAA 1 A_CustomMissile ("InvertedSmallSmoke", 15, 0, random (0, 360), 2, random (-90, -45))
			TNT1 A 30
			Stop
	}
}

ACTOR FrostAOENoVfx: CustomInventory 
{
	+INVENTORY.AUTOACTIVATE
	+INVENTORY.ALWAYSPICKUP
	inventory.maxamount 1
    States
    {
		Pickup:
			// inventory item's states executes in the context of the actor that item is in inventory of
			TNT1 A 0
			
			// and everything died because every FrostVfx is a bazillion sprites
			//TNT1 AAA 0 A_CustomMissile ("FrostVfx", 0, 0, random(0,360), 2, random (-40,0))
			
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_RunBlockingIceChunk", 1)			
			Stop
    }
}

ACTOR DurielTwoSecondAOE: CustomInventory 
{
	+INVENTORY.AUTOACTIVATE
	+INVENTORY.ALWAYSPICKUP
	inventory.maxamount 1
    States
    {
		Pickup:
			// inventory item's states executes in the context of the actor that item is in inventory of
			TNT1 A 0
			TNT1 AAA 0 A_CustomMissile ("FrostVfx", 0, 0, random(0,360), 2, random (-40,0))
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_RunBlockingIceChunk", 1, CallAcs("FBD_GetGameSkill") >= 4 ? 70 : 70 + CallAcs("FBD_GetGameSkill") * 9)
			Stop
    }
}

ACTOR DurielArenaDeicingVfx // spawned by ACS in a 256x256 grid covering the arena
{
	+NOINTERACTION
	+NOCLIP
	+CLIENTSIDEONLY
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_PlaySound("ice/shatter")
			TNT1 AAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_SpawnItemEx("TransientIceChunk", Random(-128, 127), Random(-128, 127), 4, Random(-7, 7), Random(-7, 7), Random(5, 10), 0, SXF_NOCHECKPOSITION)
			Stop
	
	}
}


ACTOR DurielArenaFreezingVfx // spawned by ACS in a 256x256 grid covering the arena
{
	+NOINTERACTION
	+NOCLIP
	+CLIENTSIDEONLY
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_PlaySound("ice/crackle/long")
			TNT1 AAAAAA 0 A_SpawnItemEx("TransientHaze", Random(-128, 127), Random(-128, 127), 0, 0.1 * Random(-5, 5), 0.1 * Random(-5, 5), 0, 0, SXF_NOCHECKPOSITION)
			Stop
	
	}
}

ACTOR TransientHaze: Haze1
{
	//+NOFRICTION
	//Script error, "chebskies-EDAY-2.pk3:durimorte.txt" line 91:
	//"NOFRICTION" is an unknown flag
	
	//(scream of frustration)
	
	+NOINTERACTION
	+FLOORCLIP
	+NOCLIP
	
	
	Alpha 0.01
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_SetScale((CallAcs("FBD_PseudoRandom",-5,4) > 0 ? -1 : 1) * 0.01 * CallAcs("FBD_PseudoRandom",70,90), 0.01 * CallAcs("FBD_PseudoRandom",40,60))
			HAZE AAAAAA 5 A_FadeIn(0.05) // total 0.3 
		Fade:
			HAZE A 5 A_FadeOut(0.01)
			Loop
	}
}


ACTOR TransientIceChunk: XIceChunk1		
{
	States
	{
		Spawn:
			TNT1 A 0 A_JumpIf(waterlevel > 1, "Death")
			ICC1 ABCDABCD 3
		WaitForLand:
			ICC1 ABCD 3 A_CheckFloor("Death")
			Loop
		Death:	
			Death:
			ICC1 A 1 A_Stop
			ICC1 AAAAAAAAAAAAAA 4 A_FadeOut(0.08)
			Stop
	}
}

ACTOR DurielStompAuraVFX
{
	+NOINTERACTION
	+NOCLIP
	+CLIENTSIDEONLY
	var int user_a;
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_CustomMissile("DurielStompAuraVFXParticle", 0, 0, user_a * 0.01, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH, 0)
			TNT1 A 0 A_SetUserVar("user_a", user_a + 1500)
			TNT1 A 0 A_JumpIf(user_a < 36000, "Spawn")
			Stop
	}
}

ACTOR DurielStompAuraVFXStronk: DurielStompAuraVFX
{
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_CustomMissile("DurielStompAuraVFXParticleStronk", 0, 0, user_a * 0.01, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH, 0)
			TNT1 A 0 A_SetUserVar("user_a", user_a + 800)
			TNT1 A 0 A_JumpIf(user_a < 36000, "Spawn")
			Stop
	}
}

ACTOR DurielStompAuraVFXParticle
{
	Projectile
	+CLIENTSIDEONLY
	+FLOORHUGGER
	+NOBLOCKMAP
	+THRUACTORS
	Damage (Random(0,0))
	XScale 0.5
	YScale 0.2
	Speed 16 // 400 in 25 tics
	DeathSound None
	SeeSound None
	States
	{
		Spawn:
			TNT1 A 3
			SM8K BCDEFGHIJKLMNOPQRSTUVWXYZ 1 // 25 tics
			Stop
		Death:
			"----" A 0 A_Stop
			"----" AAAAAAA 1 A_FadeOut(0.2)
			Stop
	}
}

ACTOR DurielStompAuraVFXParticleStronk: DurielStompAuraVFXParticle
{
	XScale 0.6
	YScale 0.3
}



ACTOR Duriel_2: CyberDevastator 17792
{
	Speed 24
	
	Tag "$BOSS_DURIEL" // "Durimorte"
	Obituary "$BOSS_DURIEL_O" // "%o was crushed by Durimorte"
	//$category "EDAY map-dependent bosses"
	
	
	// gray bluish with blue piping
	Translation "16:31=192:198", "32:47=103:111", "80:111=[215,240,255]:[56,62,129]", "168:191=192:203", "208:223=192:196", "232:235=196:197", "224:231=192:193"
	
	var int user_aangle;
	var int user_apitch;
	var int user_bunbun;
	var int user_firsttime;

	States
	{
		Spawn:
			ANNI A 1 NODELAY ACS_NamedExecuteWithResult("FBD_RunMonster", 19, 120) // annihilator headbox, 120% headbox scale
			TNT1 A 0 A_SetUserVar("user_headshot_stun_limit", 8) // prevents permanent stunlock
			TNT1 A 0 A_GiveInventory("TargetIsACyberdemon")
			TNT1 A 0 A_GiveInventory("TargetIsABoss")
			TNT1 A 0 A_GiveInventory("TargetIsAGreatTerribleBoss")
			ANNI A 0 A_GiveInventory("ImmuneToFrostEffect", 1)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_SetUserVar("user_firsttime", 1)
			TNT1 A 0 
			Goto Stand		
		
		See:
			TNT1 A 0 
			TNT1 A 0 ACS_NamedExecute("FBD_DisplayBossHealth", 0, 6, 0, 0) //Health Bar
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_JumpIf(user_firsttime, "Missile")
			Goto ChaseTheTarget
		ChaseTheTarget:		
			TNT1 A 0 ACS_NamedExecuteWithResult("AdjustHeadboxMkII", 0, 0, 85)
			
			TNT1 A 0 A_PlaySound("KYBHOOF1", 6)
			TNT1 A 0 A_SpawnItemEx("CyberStep",12,30)

			ANNI A 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI A 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI A 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)

			TNT1 A 0 A_PlaySound("KYBWHRR", CHAN_BODY)
						
			
			ANNI B 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI B 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI B 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			
			TNT1 A 0 A_PlaySound("KYBHOOF1", 7)
			TNT1 A 0 A_SpawnItemEx("CyberStep",12,-30)
			
			ANNI C 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI C 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI C 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)

			TNT1 A 0 A_PlaySound("KYBWHRR", CHAN_BODY)

			ANNI D 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI D 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			ANNI D 2 A_Chase("", "")
			TNT1 A 0 A_JumpIfTargetInLOS("Missile", 120, JLOSF_DEADNOJUMP, 250)
			Loop

		Bunnyhop:		
			TNT1 A 0 ACS_NamedExecuteWithResult("AdjustHeadboxMkII", 0, 0, 85)
			TNT1 A 0 A_SetUserVar("user_bunbun", 4)
		Bunnystep1:	
			TNT1 A 0 A_PlaySound("KYBWHRR", CHAN_BODY)
			TNT1 A 0 A_FaceTarget
			TNT1 A 0 A_Recoil(-6)
			TNT1 A 0 ThrustThingZ(0,25,0,1)
			ANNI A 2 A_Recoil(-6)
			ANNI AAA 2
			ANNI AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 A_CheckFloor("BunnyLand1")
		BunnyLand1:	
			TNT1 A 0 A_SpawnItemEx("DurielStompAuraVFX", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			ANNI B 2 A_CustomMissile("CyberStomp",10,0,0,0)
			ANNI BBB 2
			TNT1 A 0 A_RadiusGive("DurielTwoSecondAOE", 300, RGF_PLAYERS | RGF_MONSTERS | RGF_NOSIGHT)
			TNT1 A 0 A_SetUserVar("user_bunbun", user_bunbun - 1)
			TNT1 A 0 A_JumpIf(user_bunbun <= 0, "ChaseTheTarget")
		Bunnystep2:	
			TNT1 A 0 A_PlaySound("KYBWHRR", CHAN_BODY)
			TNT1 A 0 A_FaceTarget
			TNT1 A 0 A_Recoil(-6)
			TNT1 A 0 ThrustThingZ(0,25,0,1)
			ANNI C 2 A_Recoil(-6)
			ANNI CCC 2
			ANNI CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1 A_CheckFloor("BunnyLand2")
		BunnyLand2:	
			TNT1 A 0 A_SpawnItemEx("DurielStompAuraVFX", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			ANNI D 2 A_CustomMissile("CyberStomp",10,0,0,0)
			ANNI DDD 2
			TNT1 A 0 A_RadiusGive("DurielTwoSecondAOE", 300, RGF_PLAYERS | RGF_MONSTERS | RGF_NOSIGHT)
			TNT1 A 0 A_SetUserVar("user_bunbun", user_bunbun - 1)
			TNT1 A 0 A_JumpIf(user_bunbun <= 0, "ChaseTheTarget")
			Goto Bunnystep1
		
		StompLand:
			
			TNT1 A 0 ACS_NamedExecuteWithResult("AdjustHeadboxMkII", 0, 0, 85)
			TNT1 A 0 A_SpawnItemEx("DurielStompAuraVFXStronk", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			TNT1 A 0 A_CustomMissile("CyberStompMedium",10,0,0,0)
			TNT1 A 0 A_RadiusGive("FrostAOE", 300, RGF_PLAYERS | RGF_MONSTERS | RGF_NOSIGHT)
			ANSA IIIIII 2
			
			Goto See		
		
		Stampede:
			TNT1 A 0 A_JumpIfCloser(300, "Stomp")
			Goto Bunnyhop // he *really* hates you being out of reach
		
		Missile:
			TNT1 A 0
			TNT1 A 0 A_SetUserVar("user_firsttime", 1)
			TNT1 A 0 A_JumpIf(CallACS("IsDurielOnCooldown"), "Stampede") // map script
			TNT1 A 0 A_JumpIfInventory("Enraged", 1, "SpecialAttack")
			Goto MissileContinue
			
		SpecialAttack:
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			TNT1 A 0 A_JumpIf(CallACS("IsDurielOnCooldown"), "Bunnyhop")
			Goto MissileContinue			
			
		MissileContinue:	
			
			TNT1 A 0 ACS_NamedExecuteWithResult("AdjustHeadboxMkII", 0, 0, 85)
			TNT1 A 0 A_FaceTarget
			ANNI E 8
			
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			
			//TNT1 A 0 A_PlaySound("BREATHOF")
			TNT1 A 0 A_SetUserVar("user_aangle", 0)
			TNT1 A 0 A_SetUserVar("user_apitch", -450)
		
		// a server-clearing double fan of friginant missiles
		
		MissileFrame1:	
			TNT1 A 0 A_CustomMissile("DurielRocket",60.0 * 0.0000152587890625 * user_head_scale,+20.0 * 0.0000152587890625 * user_head_scale, angle - user_aangle * 0.01, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH , user_apitch * 0.01)
			ANNI E 1 A_CustomMissile("DurielRocket",60.0 * 0.0000152587890625 * user_head_scale,+20.0 * 0.0000152587890625 * user_head_scale, angle + user_aangle * 0.01, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, user_apitch * 0.01)
			TNT1 A 0 A_SetUserVar("user_aangle", user_aangle + 360)
			TNT1 A 0 A_JumpIf(user_aangle > 5000, "MissileFrame2")
			Loop
			
			//***Che ANSA J is my new franken frame, with legs from the attack stance ANNI E but arms held wide
			// I'd like more animation frames in this attack, with him spreading his arms gradually - but, too much hard thankless work. Nah.
		MissileFrame2:	
			TNT1 A 0 A_CustomMissile("DurielRocket",60.0 * 0.0000152587890625 * user_head_scale,+20.0 * 0.0000152587890625 * user_head_scale, angle - user_aangle * 0.01, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH , user_apitch * 0.01)
			ANSA J 1 A_CustomMissile("DurielRocket",60.0 * 0.0000152587890625 * user_head_scale,+20.0 * 0.0000152587890625 * user_head_scale, angle + user_aangle * 0.01, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, user_apitch * 0.01)
			TNT1 A 0 A_SetUserVar("user_aangle", user_aangle + 360)
			TNT1 A 0 A_JumpIf(user_aangle > 11000, "MissileAftereffect")
			Loop		
		
		MissileAftereffect:	
			//***Che the entire arena is affected (that's why I placed it well away from any other rooms)
			ANSA JJJJ 2 ACS_NamedExecuteWithResult("IceTheArenaAndPutDurielOnCooldown") // map script
			
			// Since thre is a cap of 3 effects on a single actor, 
			// this only hits those who dodged his missile fan.
			// And this effect has much shorter slowdown duration!
			ANSA JJJ 8 A_RadiusGive("DurielTwoSecondAOE", 2000, RGF_PLAYERS | RGF_MONSTERS | RGF_NOSIGHT)
			// FrostAOE does no damage, it slows instead
			
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			Goto ChaseTheTarget // now when the player is slowed nicely it is time to bumrush him like a freight train!
	}
} 

// most of balancing done via cooldowns (see map scripts) and *shrinking the arena on high skills*!


ACTOR Duriel_1: Duriel_2 17791
{
	Speed 16
} 

ACTOR Duriel_3: Duriel_2 17793
{
	Health 10000
} 

ACTOR Duriel_4: Duriel_2 17794 
{
	Health 10000
}