Hello! I noticed that the Pain Elemental is missing a feature - in Doom 64, the Pain Elemental's Lost Souls explode like rockets if they're too close to the player or a wall to spawn, discouraging players from getting in the Pain Elemental's face or being close to it when it pops. But this version of them acts like the vanilla Doom 2 Pain Elemental, so nothing happens in those situations.
I made a mod that adds this to the Doom 2 Pain Elemental, so I reworked it for the Doom 64 one. I've tested it in comparison to DOOM 64 EX extensively - I can't be sure if it's 1:1, but it looks pretty close to me. I don't know if it's the exact same damage as in Doom 64 either, but just the default barrel explosion damage seems about the same as Doom 64 EX (i.e. an 100 health no armor player dies instantly if hit by both Lost Soul explosions). Here's the Decorate code:
Code: Select all
ACTOR 64PainElemental : PainElemental REPLACES PainElemental
{
Radius 50
Height 90
DamageFactor "SoulBoom", 0
Mass 600 // DEFAULT IS 400
Obituary "$OB_SKULL"
States
{
Spawn:
PAIN AD 10 A_Look
Loop
See:
PAIN A 0 A_ScaleVelocity(0.50)
PAIN A 3 A_Chase
Loop
Missile:
PAIN BB 6 A_FaceTarget
PAIN C 6 BRIGHT A_FaceTarget
TNT1 A 0 A_DualPainAttack("LostSoulExplode")
Goto See
Pain:
PAIN D 6
PAIN D 6 A_Pain
Goto See
Pain.Vertigo:
PAIN D 0 ThrustThingZ(0, 55, 0, 0)
PAIN D 6
PAIN D 6 A_Pain
Goto See
Death:
PAIN E 8 BRIGHT
PAIN F 8 BRIGHT A_Scream
PAIN G 8 BRIGHT
PAIN H 8 BRIGHT A_SetTranslucent(0.90)
PAIN I 5 BRIGHT A_PainDie("LostSoulDeath")
PAIN J 5 BRIGHT A_SetTranslucent(0.75)
PAIN K 4 BRIGHT A_SetTranslucent(0.50)
PAIN L 4 BRIGHT
Stop
Raise:
PAIN LKJIHGFE 8
Goto See
Crush:
TNT1 A 0
TNT1 A 1
Stop
}
}
ACTOR 64LostSoul : LostSoul REPLACES LostSoul
{
Health 45
Radius 16
Height 56
RenderStyle SoulTrans
+MISSILEMORE
+MISSILEEVENMORE
+NOBLOOD
+NOBLOODDECALS
+NOTARGET
States
{
Spawn:
SKUL ABC 5 BRIGHT A_Look
Loop
See:
SKUL ABC 3 BRIGHT A_Chase
Loop
Missile:
SKUL D 10 BRIGHT A_FaceTarget
SKUL E 4 BRIGHT A_SkullAttack(30)
SKUL DE 4 BRIGHT A_ChangeFlag("NOTARGET", FALSE)
Goto Missile+2
Pain:
SKUL F 3 BRIGHT
SKUL F 3 BRIGHT A_Pain
Goto See
Pain.Vertigo:
SKUL F 0 BRIGHT ThrustThingZ(0, 55, 0, 0)
SKUL F 3 BRIGHT
SKUL F 3 BRIGHT A_Pain
Goto See
Death:
SKUL G 0 BRIGHT
SKUL G 6 BRIGHT
SKUL H 6 BRIGHT A_Scream
SKUL I 4 BRIGHT
SKUL J 3 BRIGHT A_NoBlocking
SKUL KLMNOP 3 BRIGHT A_FadeOut(0.20)
Stop
Crush:
TNT1 A 0
TNT1 A 1
Stop
}
}
Actor LostSoulExplode : 64LostSoul
{
states
{
Spawn:
SKUL D 5 BRIGHT
TNT1 A 0 A_SpawnItemEx("LostSoulCharge", 0, 0, 0, 0, 0, 3, 0, SXF_NOCHECKPOSITION)
stop
Death:
SKUL G 0 BRIGHT
SKUL G 6 BRIGHT
SKUL H 6 BRIGHT A_Scream
TNT1 A 0 A_Explode(128,128,XF_EXPLICITDAMAGETYPE,0,0,0,0,0,"SoulBoom")
SKUL I 4 BRIGHT
SKUL J 3 BRIGHT A_NoBlocking
SKUL KLMNOP 3 BRIGHT A_FadeOut(0.20)
Stop
}
}
Actor LostSoulDeath : 64LostSoul
{
states
{
Spawn:
TNT1 A 0
SKUL AB 5 BRIGHT
SKUL C 5 BRIGHT
stop
Pain:
SKUL F 3 BRIGHT
SKUL F 3 BRIGHT A_Pain
TNT1 A 0 A_SpawnItemEx("64LostSoul", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
stop
Death:
SKUL G 0 BRIGHT
SKUL G 6 BRIGHT
SKUL H 6 BRIGHT A_Scream
TNT1 A 0 A_Explode(128,128,XF_EXPLICITDAMAGETYPE,0,0,0,0,0,"SoulBoom")
SKUL I 4 BRIGHT
SKUL J 3 BRIGHT A_NoBlocking
SKUL KLMNOP 3 BRIGHT A_FadeOut(0.20)
Stop
}
}
Actor LostSoulCharge : 64LostSoul
{
states
{
Spawn:
SKUL D 5 BRIGHT A_FaceTarget
SKUL E 4 BRIGHT A_SkullAttack(30)
SKUL DE 4 BRIGHT A_ChangeFlag("NOTARGET", FALSE)
Goto Super::Missile+2
}
}
What this does is have the Pain Elemental fire two "Lost Soul"s as projectiles. If the "Lost Soul" hits anything (like a player) immediately upon spawning, it explodes like a barrel, but if it doesn't hit anything, it's instantly and seamlessly replaced with a real Lost Soul. The same thing happens to the Lost Souls that spawn when the PE dies, but these use a different actor so that they aren't charging when they spawn.
The only problems I've been able to see is that the Lost Soul explosion can launch the player (or their corpse) quite a bit. But that's a property of A_Explode, so I don't know what to do about it - you could use A_RadiusGive and Inventory items to simulate giving the damage to the player instead, but you'd lose the radius damage that way.
Anyway, feel free to use!
ETA: Made a bunch of changes to make it more accurate to the Doom 64 version.