Actor NewRadamentt: Radamentt Replaces Radamentt 11460
{
  //$Category "Boss"
Monster
+BOSS
+FLOORCLIP
+JUMPDOWN
+DROPOFF
+BLOODSPLATTER
+DONTMORPH
+MISSILEMORE
+MISSILEEVENMORE
//+ALWAYSFAST //If used "Fast" keyword
Species "Undead"
Health 1400
Radius 35
Height 60
Mass 1000
Speed 10
Scale 1.0
PainChance 64
MaxStepHeight 500
MaxDropOffHeight 500
DamageFactor Ice, 0.4
DamageFactor Poison, 0.4
DamageFactor Holy, 2.0 //For WoC-based
SeeSound "Radament/See"
ActiveSound "Radament/Idle"
PainSound "Radament/GetHit"
DeathSound "Radament/Die"
Meleerange 96
Tag "Radament: Undead Horadrim"
MaxTargetRange 2048

var int user_CLOFangle; //CheckLOF angle counter

States
{
Spawn:
RDIL A 1 A_Look
RDIL A 10 ACS_NamedExecuteAlways("WOC Monster Init",0,70,WOC_STATUSIMMUNE)//increase health on higher difficulties
Idle:
RDIL A 1 A_Look
Loop

See:
SeeTrue:
TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT,AAPTR_DEFAULT,AAPTR_NULL) //Обнуляем для себя чужого ТРАСЕР-трупа, будем искать нового
TNT1 A 0 A_JumpIfTargetOutsideMeleeRange("CorpseSeek")
TNT1 A 0 A_JumpIfTargetInsideMeleeRange("SeeAttack")
Loop

SeeAttack:
TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT,AAPTR_DEFAULT,AAPTR_NULL) //Drops pointers unmatched to flag  
RDWL ABCDEFGHIJKLMNOPQR 1 A_Chase("Melee","")
Goto SeeTrue

Melee:
TNT1 A 0 A_Jump(128,"CorpseSeek")
TNT1 A 0 A_Jump(48,"PoisonBreath")
TNT1 A 0 A_Jump(256,"MeleeHit")

MeleeHit:
RDAT ABCDEFGHIJ 1 A_FaceTarget
RDAT K 0 A_PlaySound("Radament/Attack")
RDAT K 1 A_CustomMeleeAttack(random(3,10)*4,0,0,"None",True)
RDAT L 0 A_Jump(192,4) //25% chance to cast PoisonHit when hit target
RDAT L 0 A_JumpIfTargetOutsideMeleeRange(3) //PoisonHit wouldn't activates if target out of melee range
RDAT L 0 A_VileTarget("PoisonHit")
RDAT L 0 A_PlaySound("Poison/Hit",0,1.0,False,ATTN_NORM)
RDAT LMNOP 1
Goto SeeTrue

PoisonBreath:
RDPB ABCDEFG 1 A_FaceTarget
RDPB G 0 A_ChangeFlag("NOPAIN",1)
RDPB HI 1 A_FaceTarget
RDPB J 0 A_PlaySound("Poison/Breath")
RDPB J 1 Bright A_SpawnItemEx("PoisonBreathCloud",Radius+1,0,32,1,0,0,0)
RDPB KLMNOPQR 1 Bright
RDPB R 0 A_ChangeFlag("NOPAIN",0)
RDPB ST 1 Bright
Goto SeeTrue

CorpseSeek: //Ищем ПРЕТЕНДЕНТА на труп
TNT1 A 0 A_SetUserVar("user_CLOFangle",0) //setting of uservar initial value 
CLOFCircle:
TNT1 A 0 
TNT1 A 0 A_SetUserVar("user_CLOFangle",user_CLOFangle+1) //1 degree uservar increasement
TNT1 A 0 A_JumpIf(user_CLOFangle==360,"CorpseCheck") //360 degrees uservar check, then jumping out of loop
Goto CLOFCircle

CorpseCheck: //Проверяем достоин ли ПРЕТЕНДЕНТ носить гордое звание трупа :D 
TNT1 A 0 A_CheckFlag("CORPSE","SpeciesCheck",AAPTR_TRACER)
Goto SeeAttack //If no more corpses around or check was failed

CorpseMarking: //Да, это ОН!
RDWL A 1 A_JumpIfInventory("CorpseMark",1,"SeeTrue",AAPTR_TRACER) //Проверяем - не чужое ли? ^_^
RDWL A 1 A_GiveInventory("CorpseMark",1,AAPTR_TRACER) //... и помечаем как свой! 

Revive:
RDSC A 0 A_JumpIfTracerCloser(Radius+35,"ReviveCheckClear") //Check for bad placed corpses
RDSC AB 1 A_FaceTracer
RDSC B 0 A_ChangeFlag("NOPAIN",1)
RDSC CDEFGH 1 Bright A_FaceTracer
RDSC I 0 A_PlaySound("Radament/Cast")
RDSC I 1 A_GiveInventory("Raiser",1,AAPTR_TRACER)
RDSC JKLMN 1 Bright
RDSC O 1
RDSC P 1 A_TakeInventory("CorpseMark",1,0,AAPTR_TRACER)
RDSC P 0 A_ChangeFlag("NOPAIN",0)
Goto SeeTrue

ReviveCheckClear:
RDWL A 0 A_TakeInventory("CorpseMark",1,0,AAPTR_TRACER) //Снимаем пометку во избежание утери трупа
RDWL ABCDEFGHIJKLMNOPQR 1 A_Wander
Goto SeeTrue

Pain:
RDGH A 0 A_JumpIfInventory("CorpseMark",1,"PainSafe",AAPTR_TRACER) //Проверяем есть ли пометка
RDGH A 0 A_Pain
RDGH ABCDEF 1
Goto SeeTrue

PainSafe:
RDGH A 0 A_TakeInventory("CorpseMark",1,0,AAPTR_TRACER) //Снимаем пометку во избежание утери трупа
RDGH A 0 A_Pain
RDGH ABCDEF 1
Goto SeeTrue

/*Raise: //If you really want it...
RDDD A 1
RDDT TSRQPONMLKJIHGFEDCBA 3
Goto See*/

Death:
RDDT A 0 A_ChangeFlag("CORPSE",0) //He can't be revived
RDDT A 0 A_Scream
RDDT ABCDEFGHI 3 
RDDT J 0 A_NoBlocking
RDDT JKLMNOPQRST 3
RDDD A -1 
Stop

Death.Ice:
Goto Radamentt::Death
}
}

Actor PoisonBreathCloud
{
//+ADDITIVEPOISONDAMAGE //It's absolutely deadly in conjunction with +RIPPER - will multiply damage!
//+ADDITIVEPOISONDURATION //It's absolutely deadly in conjunction with +RIPPER - will multiply total duration!
//+BRIGHT
+FORCEPAIN
+BLOODLESSIMPACT
+RIPPER
+MTHRUSPECIES
Projectile
Height 60
Radius 80
XScale 1.8
YScale 1.2
Damage 0
DamageType Poison
PoisonDamage 3,40,7 //120 total damage in 8 sec - 3 damage per 7 tics 
RenderStyle "Add"
Alpha 1.0
//Alpha 5.0
//Alpha 0.6

States
{
Spawn:
PBSS ABCDEFGHIJKLMNOPQRSTUVWX 1 Light("POISONPULSE")
Death:
TNT1 A 0
Stop
}
}

//Counters and resurrection items//
Actor Raiser : CustomInventory
{
    Inventory.MaxAmount 0
	+ALWAYSPICKUP
	States
	{
	Pickup:
		TNT1 A 0 Thing_Raise(0)
		Stop
   }
}

Actor CorpseMark : Inventory{}


//=====For test=====//
Actor Ur : Revenant
{
Species "Undead"
}

Actor Cd : Cyberdemon
{
Species "Undead"
}

//=====================Universal detox=====================//
//===Прерывает действие любого кастом* PoisonDamage яда,===//
//===========включая кумулятивные +ADDITIVEPOISON==========//
//=========================================================//
//* - по каким-то причинам дефолтный PoisonDamage [value] не прерывается.

Actor Dtx : CustomInventory
{
//+Inventory.AutoActivate
+Inventory.AlwaysPickup
//Inventory.Amount 
Inventory.MaxAmount 0

States
{
Spawn:
TNT1 A 1
Loop

Pickup:
TNT1 A 0 A_SpawnItemEx("Detox",0,0,0,0,0,0,0)
Stop

/*Use:
TNT1 A 0
Stop*/
}
}

Actor Detox
{
Projectile
Damage (0) //Damage SHOULD be assigned ONLY as expression "()"
PoisonDamage 1,0,1 //It's a MINIMAL value! Absolutely harmless :D
States
{
Spawn:
TNT1 A 1 //A_ClearTarget //In newer GZDoom you can use https://zdoom.org/wiki/Actor_flags#HITOWNER flag instead
Loop
Death:
TNT1 A 0
Stop
}
}

