actor MonsterHitbox
{
+MISSILE			// To initially recognise the enemy as its owner
+THRUACTORS			// To make it not absorb any projectiles by mistake
+NOGRAVITY			// To warp to its owner without falling off
+VULNERABLE			// To enable it to emulate special player painstates
+NOTARGETSWITCH		// To not warp to different owners somehow
+NODAMAGE			// To not die on taking enough hits
+NOBLOOD			// To not spew default blood particles from Doom
Health 100
Radius 32
Height 32
PainChance 256		// To make it always react with special painstate behaviour
DamageFactor "Misc", 0.0
DamageType "Misc"
RenderStyle None	// Change to "Normal" for testing purposes
states
{
Spawn:
TNT1 A 0 NoDelay A_ChangeFlag("MISSILE",false)
MMFX C 1
Warping:
MMFX C 1 A_Warp(AAPTR_TARGET,0,0,0,0,WARPF_COPYINTERPOLATION)
TNT1 A 0 A_CheckFlag("SOLID","Warping",AAPTR_TARGET)
Goto Death

Pain.Reggae:
TNT1 A 0 A_GiveToTarget("ReggaePain")
Goto Warping

Pain.SlashClaw:
TNT1 A 0 A_PlaySoundEx("weapon/slashclawhit","SoundSlot5")
Goto Warping

Pain.TenguSlash:
TNT1 A 0 A_PlaySoundEx("weapon/tenguhit","SoundSlot5")
Goto Warping

Pain.FlashStopper:
TNT1 A 0 A_GiveToTarget("FlashStopperPain")
Goto Warping

Pain.CentaurFlash:
TNT1 A 0 A_GiveToTarget("SparkShockPain")
Goto Warping

Pain.WindStorm:
TNT1 A 0 A_GiveToTarget("WindStormPain")
Goto Warping

Pain.GravityHold:
Pain.ConcreteShot:
TNT1 A 0 A_GiveToTarget("GravityHoldPain")
Goto Warping

Pain.TornadoBlow:
TNT1 A 0 A_GiveToTarget("TornadoBlowPain")
Goto Warping

Death:
TNT1 A 0
stop
}
}

Actor ReggaePain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_PlaySoundEx("item/reggae","SoundSlot7",0)
stop
}
}

Actor SparkShockPain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_SpawnItemEx("ShockFX",4,0,32)
TNT1 A 0 A_SpawnItemEx("SparkShockPainWatcher")
stop
}
}

Actor SparkShockPainStop : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_ScaleVelocity(0.0)
TNT1 A 0 A_Stop
stop
}
}

Actor SparkShockPainWatcher
{
PROJECTILE
+NOBLOCKMAP
+NOGRAVITY
+NOINTERACTION
ReactionTime 35
States
{
Spawn:
TNT1 A 1 NoDelay A_GiveToTarget("SparkShockPainStop",1)
TNT1 A 0 A_CountDown
loop

Death:
TNT1 A 0
stop
}
}

Actor FlashStopperPain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_SpawnItemEx("FlashStopperPainWatcher")
stop
}
}

Actor FlashStopperPainWatcher
{
PROJECTILE
+NOBLOCKMAP
+NOGRAVITY
+NOINTERACTION
ReactionTime 45
States
{
Spawn:
TNT1 A 1 NoDelay A_GiveToTarget("FlashStopperPainAngleChanger",1)
TNT1 A 0 A_CountDown
loop

Death:
TNT1 A 0
stop
}
}

Actor FlashStopperPainAngleChanger : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_SetAngle(Angle+45)
stop
}
}

Actor WindStormPain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_JumpIfHealthLower(22,"PickupDeath")
TNT1 A 0 ThrustThing(random(0,255),5,0,0)
TNT1 A 0 ThrustThingZ(0,30,0,0)
stop

PickupDeath:
TNT1 A 0 A_SetDamageType("BlowDeath")
TNT1 A 0 A_Explode(1,20,XF_HURTSOURCE,0,0)
stop
}
}

Actor FlameSwordPain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_PlaySoundEx("weapon/flamehit","SoundSlot5")
TNT1 AA 0 A_SpawnItemEx("FlameSwordBit",0,0,0,random(-10,10),random(-10,10),random(10,15),random(0,360))
stop
}
}

Actor TornadoBlowPain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_JumpIfHealthLower(22,"PickupDeath")
TNT1 A 0 ThrustThingZ(0,60,0,0)
stop

PickupDeath:
TNT1 A 0 A_SetDamageType("BlowDeath")
TNT1 A 0 A_Explode(1,20,XF_HURTSOURCE,0,0)
stop
}
}

Actor ChillSpikePain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_SpawnItemEx("ChillSpikePainWatcher")
stop
}
}

Actor ChillSpikePainWatcher
{
PROJECTILE
+NOBLOCKMAP
+NOGRAVITY
+NOINTERACTION
ReactionTime 45
States
{
Spawn:
TNT1 A 1 NoDelay A_GiveToTarget("SparkShockPainStop",1)
TNT1 A 0 A_CountDown
loop

Death:
TNT1 A 0
stop
}
}

Actor GravityHoldPain : CustomInventory
{
+INVENTORY.AUTOACTIVATE
States
{
Pickup:
TNT1 A 0 A_CheckFloor(2)
TNT1 A 0 ThrustThingZ(0,150,1,0)
TNT1 A 0
stop
}
}

Actor MonsterHitbox16_56 : MonsterHitbox { Radius 16 Height 56 }
Actor MonsterHitbox20_56 : MonsterHitbox { Radius 20 Height 56 }
Actor MonsterHitbox30_56 : MonsterHitbox { Radius 30 Height 56 }
Actor MonsterHitbox31_25 : MonsterHitbox { Radius 31 Height 25 }
Actor MonsterHitbox31_56 : MonsterHitbox { Radius 31 Height 56 }
Actor MonsterHitbox16_64 : MonsterHitbox { Radius 16 Height 64 }
Actor MonsterHitbox23_53 : MonsterHitbox { Radius 23 Height 53 }
Actor MonsterHitbox24_64 : MonsterHitbox { Radius 24 Height 64 }
Actor MonsterHitbox48_64 : MonsterHitbox { Radius 48 Height 64 }
Actor MonsterHitbox64_64 : MonsterHitbox { Radius 64 Height 64 }
Actor MonsterHitbox20_68 : MonsterHitbox { Radius 20 Height 68 }
Actor MonsterHitbox16_72 : MonsterHitbox { Radius 16 Height 72 }
Actor MonsterHitbox40_110 : MonsterHitbox { Radius 40 Height 110 }
Actor MonsterHitbox128_100 : MonsterHitbox { Radius 128 Height 100 }