/*
================================================================================
	Cherub	
	
	Class: Outer Sphere angel
	
	The lowest of the angels. Cherubs are fast fliers who lobb balls of holy 
water. What they lack in power, they make up for in raw numbers.

	Interestingly enough, Cherubs are the highest members of Angelic society.
All other angels exist to serve their wims and wishes of these little brats.
	
	More than any enemy, Cherubs greatly change the playstyle of vanilla enemies
and angels. They have 70 health (10 more than the imp), fly, and floatspawn
meaning that every Cherub in the vicinity will immeditally try to swarm the
player. Cherub waterballs do less damage than imp fireballs, but Cherubs tend to
attack more frequently.
	At melee range, the Cherub is reduced to bitch slapping the player, doing a
single point of damage. It usually safer to fight Cherubs at melee range than to
risk being hit by her waterball.
================================================================================
*/

Actor CherubSpawner replaces DoomImp // Spawns the Cherub, Less Annoying Cherub or the Quiet Cherub.
{
  +NOBLOCKMAP
  +NOSECTOR
  +NOGRAVITY
  +THRUACTORS
  +SPAWNFLOAT
  States
  {
  Spawn:
  	Spawn:
    TNT1 A 0
    TNT1 A 0 A_JumpIf(random(0, 1) == 0, "SummonLessAnnoyingCherub")
    TNT1 A 0
    TNT1 A 0 A_SpawnItemEX("Cherub", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG)
	Stop
	SummonLessAnnoyingCherub:
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEX("LessAnnoyingCherub",0,0,0, 0, 0,0,0, SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG )
	Stop
	}
}

ACTOR Cherub 
{
  Health 70
  Radius 20
  Height 56
  Mass 30
  Speed 14
  PainChance 150
  Monster
  Species "Cherub"
  Tag "Cherub"
  +FLOAT
  +NOGRAVITY
  +SPAWNFLOAT
  +MISSILEMORE
//   +NODROPOFF
  DamageFactor "NoRainbowRip", 1
  DamageFactor "UndeadGoHomeImpact", 0
  DamageFactor "Judgement", 0
  DamageFactor "PlayerVoid", 0.5
  DamageFactor "Holy", 0
  DamageFactor "KissMagic", 2
  SeeSound "cherub/sight"
  PainSound "cherub/pain"
  DeathSound "cherub/death"
  ActiveSound "cherub/active"
  HitObituary "%o was slapped silly by an adorable Cherub."
  Obituary "%o was baptized by an adorable Cherub."
  DropItem "AngelHealthSpawner" 64
	DropItem "AngelHealthSpawner" 32
	DropItem "AngelHealthSpawner" 8
	DropItem "Rarecandyspawner1" 1
  
	var int user_haloactive;
	
  States
  {
  Spawn:
// 	TNT1 A 0
	TNT1 A 0 NoDelay A_SpawnItemEx ("CherubHalo", 0,0,28, 0,0,0, 0, SXF_NOCHECKPOSITION | SXF_SETMASTER)
	TNT1 A 0 A_Jump(256, "SpawnLoop")
	Goto SpawnLoop
  Idle:	
  SpawnLoop:
	CHUB ABCDABCDABCD 10 A_Look
	CH2B ABCD 5 A_Look
	Loop
  See:
    CHUB AABB 3 A_Chase 
	CHUB C 4 A_Chase
	TNT1 A 0 a_playsound("bird/flap")
	CHUB DD 3 A_Chase 
	TNT1 A 0 A_Jump (96, 1)
    Loop
	CH2B AABB 3 A_Chase 
	CH2B C 4 A_Chase
	TNT1 A 0 a_playsound("bird/flap")
	CH2B DD 3 A_Chase 
	Loop
  Melee:
    CHUB EF 8 A_FaceTarget
    CHUB G 6 A_CustomMeleeAttack(1,"cherub/melee")
	Goto See
  Missile:
    CHUB EF 8 A_FaceTarget
    CHUB G 6 A_CustomMissile("WaterBall",20,10,0)
    Goto See
  Pain:
	TNT1 A 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),30,random(-5,5),random(-5,5),random(-5,5))
    CHUB H 2
	TNT1 A 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),30,random(-5,5),random(-5,5),random(-5,5))
    CHUB H 2 A_Pain
    Goto See
  Death:
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	TNT1 A 0 A_Scream 
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
    CHUB I 3
    CHUB J 3 
    CHUB K 3 
    CHUB L 3 
	CHUB N -1
	Wait
  Crash:
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
	TNT1 A 0 A_playsound("body/fall",7,0.5)
	CHUB L 6 
	TNT1 A 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
	CHUB O 6 A_NoBlocking
	TNT1 A 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
	CHUB P -1
    Stop
  XDeath:
	TNT1 A 0 A_playsound("cherub/gib")
	TNT1 A 0 A_Playsound ("egg/death",6,1)
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	TNT1 AAA 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
	TNT1 AAAA 0 A_SpawnItemEx("WhiteFeather",random(-30,30),random(-30,30),random(-30,30),random(-5,5),random(-5,5))
    CHUB Q 3
	CHUB R 3
	CHUB S -1
	Wait
  Crash.Extreme:
	TNT1 AAAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AAAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AAAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
    CHUB T 5 A_NoBlocking
    CHUB U 4
	TNT1 AAAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	CHUB V 4
	TNT1 AAAAA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	TNT1 AA 0 A_SpawnItemEx("WhiteFeather",random(-20,20),random(-20,20),20,random(-5,5),random(-5,5),random(-5,5))
	CHUB WX 4
	CHUB Y 1
    CHUB Z -1
    Stop
   Death.Ice:
	TNT1 A 0 A_Changeflag("DONTCORPSE",TRUE)
// 	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
// 	TNT1 A 0 A_JumpIf(Getcvar("AA_Fanservice") == 2, "Crash")
	TNT1 A 0 A_Jump(196,"Crash")
	CH2B E 200
	TNT1 A 0 A_SpawnItemEx ("FrozenCherub", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION | SXF_SETMASTER)
	TNT1 A 0 A_IceGuyDie
   Stop
   Death.PlayerVoid:
    TNT1 A 0
// 	TNT1 A 0 A_JumpIf(Getcvar("AA_Petrify") == 1, "Crash")
//     TNT1 A 0 A_JumpIf(Getcvar("AA_Fanservice") == 2, "Crash")
	TNT1 A 0 A_Changeflag("DONTCORPSE",TRUE)
	TNT1 A 0 A_playsound("stonemaiden/pain",6,1, FALSE)
	CA3D A 1 Bright A_NoBlocking
	TNT1 AAA 0 a_spawnitemex ("Rrock06",random(-16,16),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 A 0 a_spawnitemex("Rrock02",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 a_spawnitemex("Rrock03",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 a_spawnitemex ("Rrock04",random(-20,20),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 A 0 a_spawnitemex("Rrock05",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 a_spawnitemex("Rrock01",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 a_spawnitemex ("Rrock04",random(-16,16),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 AA 0 a_spawnitemex("Rrock05",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 a_spawnitemex("Rrock06",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAA 0 a_spawnitemex ("Rrock01",random(-20,20),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 A 0 a_spawnitemex("Rrock02",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 a_spawnitemex("Rrock03",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 A_playsound ("stonemaiden/free")
	TNT1 A 0 A_Jump (128, "Altstone")
	TNT1 A 0 A_SpawnItemEx ("StoneCherub", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION | SXF_SETMASTER)
    Stop
  AltStone:
	TNT1 A 0 A_SpawnItemEx ("StoneCherub2", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION | SXF_SETMASTER)
    Stop
  Raise:
// 	TNT1 A 0 A_SetUserVar (user_haloactive, 0) // Shouldn't be necessary, but just in case.
	TNT1 I 0 A_SpawnItemEx ("CherubHalo", 10,0,28, 0,0,0, 0, SXF_NOCHECKPOSITION | SXF_SETMASTER)
    CHUB POL 8
    CHUB KJI 6
    Goto See
  }
}

ACTOR LessAnnoyingCherub : Cherub
{
  Tag "Cherub"
  SeeSound "puckish/sight"
  PainSound "puckish/pain"
  DeathSound "puckish/death"
  ActiveSound "puckish/active"
  
}
  
ACTOR QuietCherub : Cherub
{
  Tag "Cherub"
  SeeSound "bird/song"
  PainSound "virgin/pain"
  DeathSound "body/altgore"
  ActiveSound "bird/flock"
  States
  {
    XDeath:
	TNT1 A 0 A_Playsound ("egg/death")
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
    CHUB Q 3
	CHUB R 3
	CHUB S -1
	Wait
  }
}

Actor FrozenCherub
{
  Health 100
  Radius 16
  Height 56
  ProjectilePassHeight -16
  +SOLID
  +SHOOTABLE
  +PUSHABLE
  +NOICEDEATH
  +FULLVOLACTIVE
  +NOBLOOD
  +NEVERTARGET
  -COUNTKILL
  DamageFactor "Ice", 0
  DamageFactor "Fire", 2
  States
  {
  Spawn:
	CH2B F 100
	TNT1 A 0 A_playsound("angel/frozensoild")
	CH2B GHIJK 25
	CH2B L 10000000000000
	CH2B L 0 A_FreezeDeathChunks
	Stop
   Death:
	TNT1 A 0 A_NoBlocking
	TNT1 A 1 A_IceGuyDie
    Stop
  }
}

Actor StoneCherub
{
  Health 300
  Radius 20
  Height 56
  Mass 500
  +SOLID
  +SHOOTABLE
  +PUSHABLE
  +DONTBLAST
  +DONTMORPH
  +DONTRIP
  +NOICEDEATH
  +FULLVOLACTIVE
  +NOBLOOD
  +NEVERTARGET
  -COUNTKILL
	DamageFactor "FireMagic", 0
	DamageFactor "Poison", 0
	DamageFactor "Melee", 2.0
	DamageFactor "Ice", 0
	DamageFactor "Fire", 0
	DamageFactor "Electric", 0
	DamageFactor "Magic", 0
	DamageFactor "PlayerVoid", 0
  States
  {
  Spawn:
	CH2B M 3 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 3 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 3 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 3 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 3 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 2 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 2 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 2 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 2 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 1 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 1 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 1 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B M 1 Bright A_playsound("angel/stonebeam")
	CH2B NNO 1 Bright
	CH2B P 25 Bright
	CH2B QR 50 Bright A_playsound("stonemaiden/pain")
	CH2B STU 50 A_playsound("stonemaiden/pain")
	TNT1 A 0 A_playsound("stonemaiden/pain4")
	CH2B V -1
	Stop
  Death:
	TNT1 A 0 A_playsound("stonemaiden/pain",6,1, FALSE)
	CH2B V 1  A_NoBlocking
	TNT1 AAAAAAAAAAAAA 0 a_spawnitemex ("Rrock06",random(-16,16),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 AAAA 0 a_spawnitemex("Rrock02",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAAAAA 0 a_spawnitemex("Rrock03",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAAAAA 0 a_spawnitemex ("Rrock04",random(-20,20),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 AAAAA 0 a_spawnitemex("Rrock05",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAAAAAAAAAAAAAAAAAA 0 a_spawnitemex("Rrock01",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAAAA 0 a_spawnitemex ("Rrock04",random(-16,16),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 AAAAAAAAA 0 a_spawnitemex("Rrock05",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAAAAA 0 a_spawnitemex("Rrock06",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAAAAAAAAAAAAAAAAAAAAAAA 0 a_spawnitemex ("Rrock01",random(-20,20),random(-16,16),42,random(-100,100)/20.0,random(-100,100)/20.0,random(-100,100)/20.0,0)
	TNT1 AAAA 0 a_spawnitemex("Rrock02",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAA 0 a_spawnitemex("Rrock03",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 A 0 A_playsound ("stonemaiden/free")
    Stop
  }
}

Actor StoneCherub2 : StoneCherub
{
//   +SPRITEFLIP
}

Actor WillendorfCherubSpawner
{
  States
  {
  Spawn:
  	TNT1 A 0
	TNT1 A 0 A_JumpIf(random(0, 1) == 0, "SummonLessAnnoyingWillendorfCherub")
// 	TNT1 A 0 A_JumpIf(Getcvar("AA_CherubShutUp") == 2, "SummonQuietWillendorfCherub")
// 	TNT1 A 0 A_JumpIf(Getcvar("AA_AnnoyingCherubSpawner") == 2, "SummonLessAnnoyingWillendorfCherub")
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEX("WillendorfCherub",0,0,0, 0, 0,0,0, SXF_NOCHECKPOSITION | SXF_TELEFRAG)
	Stop
	SummonQuietWillendorfCherub:
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEX("QuietWillendorfCherub",0,0,0, 0, 0,0,0, SXF_NOCHECKPOSITION | SXF_TELEFRAG)
	Stop
	SummonLessAnnoyingWillendorfCherub:
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEX("LessAnnoyingWillendorfCherub",0,0,0, 0, 0,0,0, SXF_NOCHECKPOSITION | SXF_TELEFRAG)
	Stop
	}
}

Actor WillendorfCherub
{
  Health 60
  Radius 20
  Height 56
  Mass 30
  Speed 16
  PainChance 150
  Monster
  Species "Willendorf's Cherub"
  Tag "Cherub"
  +FLOAT
  +NOGRAVITY
  +SPAWNFLOAT
  +DONTFALL
  +NOPAIN
  +NOICEDEATH
  +NOBLOOD
  +NOCLIP
  +DONTGIB
  +BRIGHT
  -COUNTKILL
  RenderStyle Translucent
  DamageFactor "NoRainbowRip", 1
  DamageFactor "UndeadGoHomeImpact", 0
  DamageFactor "Judgement", 0
  DamageFactor "Holy", 0
  SeeSound "angel/blink"
  PainSound "cherub/pain"
  DeathSound "seraph/sizzle"
  ActiveSound "cherub/active"
  HitObituary "%o was slapped silly by Willendorf's Cherub."
  Obituary "%o fell to Willendorf's children."
  Translation "192:203=112:127"
  
	var int user_haloactive;
	
  States
  {
  Spawn:
	CHUB A 0 // Blank frame with the angel's sprite, in case a map or script makes them dormant, or for mods like Corruption Cards.
	TNT1 A 0 A_JumpIf (user_haloactive == 1, "SpawnLoop") // Makes sure the halo is only spawned once.
	TNT1 A 0 A_SetUserVar (user_haloactive, 1)
    TNT1 A 0 A_SpawnItemEx ("CherubHalo", 0,0,28, 0,0,0, 0, SXF_NOCHECKPOSITION | SXF_SETMASTER)
	CH3B ABCDE 12 BRIGHT
	CH3B FGHI 8 BRIGHT
	TNT1 A 0 A_PlaySound ("angel/blink")
	CH3B JKLMNO 6 BRIGHT
	TNT1 A 0 A_Changeflag("NOPAIN",FALSE)
  SpawnLoop:
	CHUB ABCDABCDABCD 10 A_Look
	CH2B ABCD 5 A_Look
	Goto See
  See:
    CHUB AABB 3 A_Chase 
	CHUB C 4 A_Chase
	TNT1 A 0 a_playsound("bird/flap")
	CHUB DD 3 A_Chase 
	TNT1 A 0 A_Jump (96, 1)
    Loop
	CH2B AABB 3 A_Chase 
	CH2B C 4 A_Chase
	TNT1 A 0 a_playsound("bird/flap")
	CH2B DD 3 A_Chase 
	Loop
  Melee:
    CHUB EF 8 A_FaceTarget
    CHUB G 6 A_CustomMeleeAttack(1,"cherub/melee")
	Goto See
  Missile:
    CHUB EF 8 A_FaceTarget
    CHUB G 6 A_CustomMissile ("TrickyWaterBall",20,10,0)
    Goto See
  Pain:
    CHUB H 2
    CHUB H 2 A_Pain
    Goto See
  Death:
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	TNT1 A 0 A_Scream 
	TNT1 A 0 A_Changeflag("VISIBILITYPULSE",FALSE)
	CH3B GF 8 Bright
    CH3B E 25 Bright A_NoBlocking
	CH3B DCBA 8 Bright
	Stop
  }
}

ACTOR LessAnnoyingWillendorfCherub : WillendorfCherub
{
  Tag "Cherub"
  SeeSound "puckish/sight"
  PainSound "puckish/pain"
  DeathSound "puckish/death"
  ActiveSound "puckish/active"
  }
  
ACTOR QuietWillendorfCherub : WillendorfCherub
{
  Tag "Willendorf's Cherub"
  SeeSound "angel/blink"
  PainSound "bird/flap"
  DeathSound "bird/flap"
  ActiveSound "bird/flap"
  }
