Actor NewRadamentt: Radamentt Replaces Radamentt
{
  //$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
Dropitem "Skillbook" 0
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
}
}

actor newSAPGEM : SAPGEM replaces SAPGEM
{
  //$Category RUNES
  +FLOATBOB
  +COUNTITEM
  Inventory.Pickupmessage "SAPPHIRE GEM Socketed: GAIN BONUS"
  Inventory.PickupSound "Rune/GEMpickup"
  Scale 1
  States
  {
  Spawn:
	AGEM B -1 Bright
    Loop
	Pickup:
	TNT1 A 0 A_GiveInventory("PowerICEBORNDamage",1)
	TNT1 A 0 A_GiveInventory("INTELLECT",1)
	stop
  }
}

actor newTOPGEM : TOPGEM replaces TOPGEM
{
  //$Category RUNES
  +FLOATBOB
  +COUNTITEM
  Inventory.Pickupmessage "TOPAZ GEM Socketed: GAIN BONUS"
  Inventory.PickupSound "Rune/GEMpickup"
  Scale 1
  States
  {
  Spawn:
	AGEM E -1 Bright
    Loop
	Pickup:
	TNT1 A 0 A_GiveInventory("PowerLightningamage",1)
	TNT1 A 0 A_GiveInventory("INTELLECT",1)	
	stop
  }
}

actor newRUBGEM : RUBGEM replaces RUBGEM
{
  //$Category RUNES
  +FLOATBOB
  +COUNTITEM
  Inventory.Pickupmessage "RUBY GEM Socketed: GAIN BONUS"
  Inventory.PickupSound "Rune/GEMpickup"
  Scale 1
  States
  {
  Spawn:
	AGEM G -1 Bright
    Loop
	Pickup:
	TNT1 A 0 A_GiveInventory("PowerPYRODamage",1)
	TNT1 A 0 A_GiveInventory("INTELLECT",1)	
	stop
  }
}
