/*
================================================================================
	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, Censored Cherub, Quiet Cherub.
{
  +NOBLOCKMAP
  +NOSECTOR
  +NOGRAVITY
  +THRUACTORS
  +SPAWNFLOAT
  +NODROPOFF
  +FLOORCLIP
  States
  {
  Spawn:
  	TNT1 A 0
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEx("Cherub",0,0,0, 0, 0,0,0, SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG )
	Stop
	SummonQuietCherub:
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEx("QuietCherub",0,0,0, 0, 0,0,0, SXF_NOCHECKPOSITION | SXF_TRANSFERAMBUSHFLAG)
	Stop
	SummonPCCherub:
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEx("Cherub",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
  +FLOORCLIP
  DamageFactor "NoRainbowRip", 1
  DamageFactor "UndeadGoHomeImpact", 0
  DamageFactor "Judgement", 0
  DamageFactor "PlayerVoid", 0.5
  DamageFactor "Holy", 0
  DamageFactor "KissMagic", 2
  SeeSound "puckish/sight"
  PainSound "puckish/pain"
  DeathSound "puckish/death"
  ActiveSound "puckish/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
	DropItem "CherubDress" 1
  
	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)
	Goto SpawnLoop
  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
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	TNT1 A 0 A_Scream
	TNT1 A 0 A_NoBlocking
	TNT1 A 0 A_SpawnItemEx ("CherubPCDeath")
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	CH3B P -1
	Stop
  XDeath:
	TNT1 A 0
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	TNT1 A 0 A_XScream
	TNT1 A 0 A_NoBlocking
	TNT1 A 0 A_SpawnItemEx ("CherubPCDeath")
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	CH3B P -1
	Stop
  Death.Ice:
	TNT1 A 0 A_Changeflag("DONTCORPSE",TRUE)
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	CH2B E 180 
	TNT1 A 0 A_SpawnItemEx ("FrozenCherub", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION | SXF_SETMASTER)
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	Stop
  Death.PlayerVoid:
    TNT1 A 0
	TNT1 A 0 A_Changeflag("DONTCORPSE",TRUE)
	TNT1 A 0 A_playsound("stonemaiden/pain",6,1, FALSE)
	CHUB H 2
	CHUB H 1 Bright A_NoBlocking
	TNT1 AAAA 0 A_SpawnItemEx("Rrock03",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAA 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 AAA 0 A_SpawnItemEx("Rrock05",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AAA 0 A_SpawnItemEx("Rrock01",0,0,32,random(-10,10),random(-10,10),random(5,10))
	TNT1 AA 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 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.
	CH3B ABCDE 6 BRIGHT
	CH3B FGHI 3 BRIGHT
	TNT1 A 0 A_PlaySound ("angel/blink")
	CH3B JKLMNO 3 BRIGHT
    Goto Spawn
  }
}
  
ACTOR QuietCherub : Cherub
{
  Tag "Cherub"
  SeeSound "bird/song"
  PainSound "virgin/pain"
  DeathSound "body/altgore"
  ActiveSound "bird/flock"
  States
  {
  Death:
	TNT1 A 0
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	TNT1 A 0 A_Scream
	TNT1 A 0 A_NoBlocking
	TNT1 A 0 A_SpawnItemEx ("CherubPCDeath")
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	CH3B P -1
	Stop
  XDeath:
	TNT1 A 0
	TNT1 A 0 A_SetUserVar (user_haloactive, 0)
	TNT1 A 0 A_XScream
	TNT1 A 0 A_NoBlocking
	TNT1 A 0 A_SpawnItemEx ("CherubPCDeath")
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	CH3B P -1
	Stop
  }
}

Actor FrozenCherub
{
  Health 30
  Radius 16
  Height 56
  ProjectilePassHeight -16
  +SOLID
  +SHOOTABLE
  +PUSHABLE
  +NOICEDEATH
  +FULLVOLACTIVE
  +NOBLOOD
  +NEVERTARGET
  -COUNTKILL
  DamageFactor "Ice", 0
  DamageFactor "Fire", 2
  States
  {
  Spawn:
	CH2B F 130
	TNT1 A 0 A_playsound("angel/frozensoild")
	CH2B GHIJK 25
	CH2B L 10000000000000
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
	Stop
   Death:
	TNT1 A 0 A_NoBlocking
	TNT1 A 0 A_SpawnItemEx ("AviaryIceSpawner")
    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
{
}

Actor CherubPCDeath
{
  +NOGRAVITY
  +DONTFALL
  States
  {
	Spawn:
	TNT1 A 0
	CHUB E 2 
	TNT1 A 0 A_Quake(5,3,0,4)
	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))
	CH2B P 20 Bright
	CH2B PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP 1 BRIGHT A_Fadeout(0.01)
	CH2B PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP 1 A_Fadeout(0.01)
	CH2B PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP 2 A_Fadeout(0.02)
	TNT1 A 0
	Stop
	}
}

/////////////////////////////////////////////

Actor WillendorfCherubSpawner
{
  States
  {
  Spawn:
  	TNT1 A 0
	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"
}

ACTOR CherubCast : Cherub
{
	States
	{
	See:
	CHUB AB 5 A_Chase
	CHUB C 6
	CHUB D 5
	CHUB AB 5
	CHUB C 6
	CHUB D 5
	Loop
	Missile:
    CHUB EF 8
    CHUB G 6 
    Goto See
	Death:
    CHUB I 6 A_Scream 
    CHUB J 4 
    CHUB K 4 
    CHUB LMN 4 
	CHUB O 4 
	CHUB P -1
    Stop
	}
}