mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 13:01:47 +00:00
- Converted Strife's Crusader, Inquisitor and spectral missiles to
DECORATE. SVN r1114 (trunk)
This commit is contained in:
parent
fe2e64aa40
commit
4f0fa50773
20 changed files with 659 additions and 753 deletions
|
@ -1,4 +1,6 @@
|
||||||
August 5, 2008 (Changes by Graf Zahl)
|
August 5, 2008 (Changes by Graf Zahl)
|
||||||
|
- Converted Strife's Crusader, Inquisitor and spectral missiles to
|
||||||
|
DECORATE.
|
||||||
- Converted Strife's Acolytes, Rebels, Sentinel, Reaver and Templar to
|
- Converted Strife's Acolytes, Rebels, Sentinel, Reaver and Templar to
|
||||||
DECORATE.
|
DECORATE.
|
||||||
- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris.
|
- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris.
|
||||||
|
|
|
@ -244,6 +244,28 @@ ACTOR(AcolyteDie)
|
||||||
ACTOR(HideDecepticon)
|
ACTOR(HideDecepticon)
|
||||||
ACTOR(Beacon)
|
ACTOR(Beacon)
|
||||||
ACTOR(ShootGun)
|
ACTOR(ShootGun)
|
||||||
|
ACTOR(RocketInFlight)
|
||||||
|
ACTOR(CrusaderChoose)
|
||||||
|
ACTOR(CrusaderSweepLeft)
|
||||||
|
ACTOR(CrusaderSweepRight)
|
||||||
|
ACTOR(CrusaderRefire)
|
||||||
|
ACTOR(CrusaderDeath)
|
||||||
|
ACTOR(InquisitorWalk)
|
||||||
|
ACTOR(InquisitorDecide)
|
||||||
|
ACTOR(InquisitorAttack)
|
||||||
|
ACTOR(InquisitorJump)
|
||||||
|
ACTOR(InquisitorCheckLand)
|
||||||
|
ACTOR(TossArm)
|
||||||
|
ACTOR(SpectralLightningTail)
|
||||||
|
ACTOR(SpectralBigBallLightning)
|
||||||
|
ACTOR(SpectralLightning)
|
||||||
|
ACTOR(SpectreChunkSmall)
|
||||||
|
ACTOR(SpectreChunkLarge)
|
||||||
|
ACTOR(Spectre2Attack)
|
||||||
|
ACTOR(Spectre3Attack)
|
||||||
|
ACTOR(Spectre4Attack)
|
||||||
|
ACTOR(Spectre5Attack)
|
||||||
|
ACTOR(SpotLightning)
|
||||||
|
|
||||||
// Special code pointers for Strife's player - not to be used elsewhere!
|
// Special code pointers for Strife's player - not to be used elsewhere!
|
||||||
ACTOR(ItBurnsItBurns)
|
ACTOR(ItBurnsItBurns)
|
||||||
|
|
|
@ -26,7 +26,7 @@ void A_AlienSpectreDeath (AActor *);
|
||||||
void A_AlertMonsters (AActor *);
|
void A_AlertMonsters (AActor *);
|
||||||
void A_Tracer2 (AActor *);
|
void A_Tracer2 (AActor *);
|
||||||
|
|
||||||
AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target);
|
AActor *P_SpawnSubMissile (AActor *source, const PClass *type, AActor *target);
|
||||||
|
|
||||||
// Alien Spectre 1 -----------------------------------------------------------
|
// Alien Spectre 1 -----------------------------------------------------------
|
||||||
|
|
||||||
|
@ -351,11 +351,6 @@ static void GenericSpectreSpawn (AActor *actor, const PClass *type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_SpawnSpectre1 (AActor *actor)
|
|
||||||
{
|
|
||||||
GenericSpectreSpawn (actor, RUNTIME_CLASS(AAlienSpectre1));
|
|
||||||
}
|
|
||||||
|
|
||||||
void A_SpawnSpectre3 (AActor *actor)
|
void A_SpawnSpectre3 (AActor *actor)
|
||||||
{
|
{
|
||||||
GenericSpectreSpawn (actor, RUNTIME_CLASS(AAlienSpectre3));
|
GenericSpectreSpawn (actor, RUNTIME_CLASS(AAlienSpectre3));
|
||||||
|
@ -413,7 +408,7 @@ void A_Spectre4Attack (AActor *self)
|
||||||
if (self->target != NULL)
|
if (self->target != NULL)
|
||||||
{
|
{
|
||||||
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
||||||
self, self->target, RUNTIME_CLASS(ASpectralLightningBigV2), false);
|
self, self->target, PClass::FindClass("SpectralLightningBigV2"), false);
|
||||||
if (missile != NULL)
|
if (missile != NULL)
|
||||||
{
|
{
|
||||||
missile->tracer = self->target;
|
missile->tracer = self->target;
|
||||||
|
@ -428,7 +423,7 @@ void A_Spectre2Attack (AActor *self)
|
||||||
if (self->target != NULL)
|
if (self->target != NULL)
|
||||||
{
|
{
|
||||||
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
||||||
self, self->target, RUNTIME_CLASS(ASpectralLightningH3), false);
|
self, self->target, PClass::FindClass("SpectralLightningH3"), false);
|
||||||
if (missile != NULL)
|
if (missile != NULL)
|
||||||
{
|
{
|
||||||
missile->health = -2;
|
missile->health = -2;
|
||||||
|
@ -442,7 +437,7 @@ void A_Spectre5Attack (AActor *self)
|
||||||
if (self->target != NULL)
|
if (self->target != NULL)
|
||||||
{
|
{
|
||||||
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
||||||
self, self->target, RUNTIME_CLASS(ASpectralLightningBigBall2), false);
|
self, self->target, PClass::FindClass("SpectralLightningBigBall2"), false);
|
||||||
if (missile != NULL)
|
if (missile != NULL)
|
||||||
{
|
{
|
||||||
missile->health = -2;
|
missile->health = -2;
|
||||||
|
@ -456,7 +451,7 @@ void A_Spectre3Attack (AActor *self)
|
||||||
if (self->target == NULL)
|
if (self->target == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
AActor *foo = Spawn<ASpectralLightningV2> (self->x, self->y, self->z + 32*FRACUNIT, ALLOW_REPLACE);
|
AActor *foo = Spawn("SpectralLightningV2", self->x, self->y, self->z + 32*FRACUNIT, ALLOW_REPLACE);
|
||||||
|
|
||||||
foo->momz = -12*FRACUNIT;
|
foo->momz = -12*FRACUNIT;
|
||||||
foo->target = self;
|
foo->target = self;
|
||||||
|
@ -467,7 +462,7 @@ void A_Spectre3Attack (AActor *self)
|
||||||
for (int i = 0; i < 20; ++i)
|
for (int i = 0; i < 20; ++i)
|
||||||
{
|
{
|
||||||
self->angle += ANGLE_180 / 20;
|
self->angle += ANGLE_180 / 20;
|
||||||
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningBall2), self);
|
P_SpawnSubMissile (self, PClass::FindClass("SpectralLightningBall2"), self);
|
||||||
}
|
}
|
||||||
self->angle -= ANGLE_180 / 20 * 10;
|
self->angle -= ANGLE_180 / 20 * 10;
|
||||||
}
|
}
|
||||||
|
@ -497,18 +492,20 @@ void A_AlienSpectreDeath (AActor *self)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre1))
|
switch (self->GetClass()->TypeName)
|
||||||
{
|
{
|
||||||
|
case NAME_AlienSpectre1:
|
||||||
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0, false);
|
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0, false);
|
||||||
log = 95;
|
log = 95;
|
||||||
}
|
break;
|
||||||
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre2))
|
|
||||||
{
|
case NAME_AlienSpectre2:
|
||||||
C_MidPrint(GStrings("TXT_KILLED_BISHOP"));
|
C_MidPrint(GStrings("TXT_KILLED_BISHOP"));
|
||||||
log = 74;
|
log = 74;
|
||||||
player->GiveInventoryType (QuestItemClasses[20]);
|
player->GiveInventoryType (QuestItemClasses[20]);
|
||||||
}
|
break;
|
||||||
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre3))
|
|
||||||
|
case NAME_AlienSpectre3:
|
||||||
{
|
{
|
||||||
C_MidPrint(GStrings("TXT_KILLED_ORACLE"));
|
C_MidPrint(GStrings("TXT_KILLED_ORACLE"));
|
||||||
// If there are any Oracles still alive, kill them.
|
// If there are any Oracles still alive, kill them.
|
||||||
|
@ -537,9 +534,10 @@ void A_AlienSpectreDeath (AActor *self)
|
||||||
log = 85;
|
log = 85;
|
||||||
}
|
}
|
||||||
EV_DoDoor (DDoor::doorOpen, NULL, NULL, 222, 8*FRACUNIT, 0, 0, 0);
|
EV_DoDoor (DDoor::doorOpen, NULL, NULL, 222, 8*FRACUNIT, 0, 0, 0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre4))
|
|
||||||
{
|
case NAME_AlienSpectre4:
|
||||||
C_MidPrint(GStrings("TXT_KILLED_MACIL"));
|
C_MidPrint(GStrings("TXT_KILLED_MACIL"));
|
||||||
player->GiveInventoryType (QuestItemClasses[23]);
|
player->GiveInventoryType (QuestItemClasses[23]);
|
||||||
if (player->FindInventory (QuestItemClasses[24]) == NULL)
|
if (player->FindInventory (QuestItemClasses[24]) == NULL)
|
||||||
|
@ -550,9 +548,9 @@ void A_AlienSpectreDeath (AActor *self)
|
||||||
{ // Back to the factory for another Sigil!
|
{ // Back to the factory for another Sigil!
|
||||||
log = 106;
|
log = 106;
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre5))
|
|
||||||
{
|
case NAME_AlienSpectre5:
|
||||||
C_MidPrint(GStrings("TXT_KILLED_LOREMASTER"));
|
C_MidPrint(GStrings("TXT_KILLED_LOREMASTER"));
|
||||||
ASigil *sigil;
|
ASigil *sigil;
|
||||||
|
|
||||||
|
@ -572,9 +570,9 @@ void A_AlienSpectreDeath (AActor *self)
|
||||||
log = 83;
|
log = 83;
|
||||||
}
|
}
|
||||||
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false);
|
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false);
|
||||||
}
|
break;
|
||||||
else
|
|
||||||
{
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mysnprintf (voc, countof(voc), "svox/voc%d", log);
|
mysnprintf (voc, countof(voc), "svox/voc%d", log);
|
||||||
|
|
|
@ -6,152 +6,6 @@
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "a_strifeglobal.h"
|
#include "a_strifeglobal.h"
|
||||||
|
|
||||||
void A_TossGib (AActor *);
|
|
||||||
|
|
||||||
// Crusader -----------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_CrusaderChoose (AActor *);
|
|
||||||
void A_CrusaderSweepLeft (AActor *);
|
|
||||||
void A_CrusaderSweepRight (AActor *);
|
|
||||||
void A_CrusaderRefire (AActor *);
|
|
||||||
void A_CrusaderDeath (AActor *);
|
|
||||||
|
|
||||||
class ACrusader : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ACrusader, AActor)
|
|
||||||
public:
|
|
||||||
void GetExplodeParms (int &damage, int &dist, bool &hurtSource)
|
|
||||||
{
|
|
||||||
damage = dist = 64;
|
|
||||||
}
|
|
||||||
void NoBlockingSet ()
|
|
||||||
{
|
|
||||||
P_DropItem (this, "EnergyPod", 20, 256);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ACrusader::States[] =
|
|
||||||
{
|
|
||||||
#define S_CRUSADER_STND 0
|
|
||||||
S_NORMAL (ROB2, 'Q', 10, A_Look, &States[S_CRUSADER_STND]),
|
|
||||||
|
|
||||||
#define S_CRUSADER_RUN (S_CRUSADER_STND+1)
|
|
||||||
S_NORMAL (ROB2, 'A', 3, A_Chase, &States[S_CRUSADER_RUN+1]),
|
|
||||||
S_NORMAL (ROB2, 'A', 3, A_Chase, &States[S_CRUSADER_RUN+2]),
|
|
||||||
S_NORMAL (ROB2, 'B', 3, A_Chase, &States[S_CRUSADER_RUN+3]),
|
|
||||||
S_NORMAL (ROB2, 'B', 3, A_Chase, &States[S_CRUSADER_RUN+4]),
|
|
||||||
S_NORMAL (ROB2, 'C', 3, A_Chase, &States[S_CRUSADER_RUN+5]),
|
|
||||||
S_NORMAL (ROB2, 'C', 3, A_Chase, &States[S_CRUSADER_RUN+6]),
|
|
||||||
S_NORMAL (ROB2, 'D', 3, A_Chase, &States[S_CRUSADER_RUN+7]),
|
|
||||||
S_NORMAL (ROB2, 'D', 3, A_Chase, &States[S_CRUSADER_RUN]),
|
|
||||||
|
|
||||||
#define S_CRUSADER_ATTACK (S_CRUSADER_RUN+8)
|
|
||||||
S_NORMAL (ROB2, 'E', 3, A_FaceTarget, &States[S_CRUSADER_ATTACK+1]),
|
|
||||||
S_BRIGHT (ROB2, 'F', 2, A_CrusaderChoose, &States[S_CRUSADER_ATTACK+2]),
|
|
||||||
S_BRIGHT (ROB2, 'E', 2, A_CrusaderSweepLeft, &States[S_CRUSADER_ATTACK+3]),
|
|
||||||
S_BRIGHT (ROB2, 'F', 3, A_CrusaderSweepLeft, &States[S_CRUSADER_ATTACK+4]),
|
|
||||||
S_BRIGHT (ROB2, 'E', 2, A_CrusaderSweepLeft, &States[S_CRUSADER_ATTACK+5]),
|
|
||||||
S_BRIGHT (ROB2, 'F', 2, A_CrusaderSweepLeft, &States[S_CRUSADER_ATTACK+6]),
|
|
||||||
S_BRIGHT (ROB2, 'E', 2, A_CrusaderSweepRight, &States[S_CRUSADER_ATTACK+7]),
|
|
||||||
S_BRIGHT (ROB2, 'F', 2, A_CrusaderSweepRight, &States[S_CRUSADER_ATTACK+8]),
|
|
||||||
S_BRIGHT (ROB2, 'E', 2, A_CrusaderSweepRight, &States[S_CRUSADER_ATTACK+9]),
|
|
||||||
S_BRIGHT (ROB2, 'F', 2, A_CrusaderRefire, &States[S_CRUSADER_ATTACK]),
|
|
||||||
|
|
||||||
#define S_CRUSADER_PAIN (S_CRUSADER_ATTACK+10)
|
|
||||||
S_NORMAL (ROB2, 'D', 1, A_Pain, &States[S_CRUSADER_RUN]),
|
|
||||||
|
|
||||||
#define S_CRUSADER_DEATH (S_CRUSADER_PAIN+1)
|
|
||||||
S_NORMAL (ROB2, 'G', 3, A_Scream, &States[S_CRUSADER_DEATH+1]),
|
|
||||||
S_NORMAL (ROB2, 'H', 5, A_TossGib, &States[S_CRUSADER_DEATH+2]),
|
|
||||||
S_BRIGHT (ROB2, 'I', 4, A_TossGib, &States[S_CRUSADER_DEATH+3]),
|
|
||||||
S_BRIGHT (ROB2, 'J', 4, A_ExplodeAndAlert, &States[S_CRUSADER_DEATH+4]),
|
|
||||||
S_BRIGHT (ROB2, 'K', 4, A_NoBlocking, &States[S_CRUSADER_DEATH+5]),
|
|
||||||
S_NORMAL (ROB2, 'L', 4, A_ExplodeAndAlert, &States[S_CRUSADER_DEATH+6]),
|
|
||||||
S_NORMAL (ROB2, 'M', 4, A_TossGib, &States[S_CRUSADER_DEATH+7]),
|
|
||||||
S_NORMAL (ROB2, 'N', 4, A_TossGib, &States[S_CRUSADER_DEATH+8]),
|
|
||||||
S_NORMAL (ROB2, 'O', 4, A_ExplodeAndAlert, &States[S_CRUSADER_DEATH+9]),
|
|
||||||
S_NORMAL (ROB2, 'P', -1, A_CrusaderDeath, NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ACrusader, Strife, 3005, 0)
|
|
||||||
PROP_SpawnState (S_CRUSADER_STND)
|
|
||||||
PROP_SeeState (S_CRUSADER_RUN)
|
|
||||||
PROP_MissileState (S_CRUSADER_ATTACK)
|
|
||||||
PROP_PainState (S_CRUSADER_PAIN)
|
|
||||||
PROP_DeathState (S_CRUSADER_DEATH)
|
|
||||||
PROP_SpeedFixed (8)
|
|
||||||
PROP_RadiusFixed (40)
|
|
||||||
PROP_HeightFixed (56)
|
|
||||||
PROP_Mass (400)
|
|
||||||
PROP_SpawnHealth (400)
|
|
||||||
PROP_PainChance (128)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_COUNTKILL)
|
|
||||||
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
|
|
||||||
PROP_Flags3 (MF3_DONTMORPH)
|
|
||||||
PROP_Flags4 (MF4_MISSILEMORE|MF4_INCOMBAT|MF4_NOICEDEATH)
|
|
||||||
PROP_MinMissileChance (120)
|
|
||||||
PROP_StrifeType (63)
|
|
||||||
PROP_MaxDropOffHeight (32)
|
|
||||||
PROP_SeeSound ("crusader/sight")
|
|
||||||
PROP_PainSound ("crusader/pain")
|
|
||||||
PROP_DeathSound ("crusader/death")
|
|
||||||
PROP_ActiveSound ("crusader/active")
|
|
||||||
PROP_Obituary ("$OB_CRUSADER")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Fast Flame Projectile (used by Crusader) ---------------------------------
|
|
||||||
|
|
||||||
class AFastFlameMissile : public AFlameMissile
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (AFastFlameMissile, AFlameMissile)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (AFastFlameMissile, Strife, -1, 0)
|
|
||||||
PROP_Mass (50)
|
|
||||||
PROP_Damage (1)
|
|
||||||
PROP_SpeedFixed (35)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Crusader Missile ---------------------------------------------------------
|
|
||||||
// This is just like the mini missile the player shoots, except it doesn't
|
|
||||||
// explode when it dies, and it does slightly less damage for a direct hit.
|
|
||||||
|
|
||||||
void A_RocketInFlight (AActor *);
|
|
||||||
void A_RocketDead (AActor *);
|
|
||||||
|
|
||||||
class ACrusaderMissile : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ACrusaderMissile, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ACrusaderMissile::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (MICR, 'A', 6, A_RocketInFlight, &States[0]),
|
|
||||||
|
|
||||||
S_BRIGHT (SMIS, 'A', 5, A_RocketDead, &States[2]),
|
|
||||||
S_BRIGHT (SMIS, 'B', 5, NULL, &States[3]),
|
|
||||||
S_BRIGHT (SMIS, 'C', 4, NULL, &States[4]),
|
|
||||||
S_BRIGHT (SMIS, 'D', 2, NULL, &States[5]),
|
|
||||||
S_BRIGHT (SMIS, 'E', 2, NULL, &States[6]),
|
|
||||||
S_BRIGHT (SMIS, 'F', 2, NULL, &States[7]),
|
|
||||||
S_BRIGHT (SMIS, 'G', 2, NULL, NULL),
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ACrusaderMissile, Strife, -1, 0)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_DeathState (1)
|
|
||||||
PROP_SpeedFixed (20)
|
|
||||||
PROP_RadiusFixed (10)
|
|
||||||
PROP_HeightFixed (14)
|
|
||||||
PROP_Damage (7)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
|
|
||||||
PROP_Flags4 (MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
PROP_SeeSound ("crusader/misl")
|
|
||||||
PROP_DeathSound ("crusader/mislx")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
bool Sys_1ed64 (AActor *self)
|
bool Sys_1ed64 (AActor *self)
|
||||||
{
|
{
|
||||||
if (P_CheckSight (self, self->target) && self->reactiontime == 0)
|
if (P_CheckSight (self, self->target) && self->reactiontime == 0)
|
||||||
|
@ -170,18 +24,18 @@ void A_CrusaderChoose (AActor *self)
|
||||||
{
|
{
|
||||||
A_FaceTarget (self);
|
A_FaceTarget (self);
|
||||||
self->angle -= ANGLE_180/16;
|
self->angle -= ANGLE_180/16;
|
||||||
P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, RUNTIME_CLASS(AFastFlameMissile));
|
P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, PClass::FindClass("FastFlameMissile"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (P_CheckMissileRange (self))
|
if (P_CheckMissileRange (self))
|
||||||
{
|
{
|
||||||
A_FaceTarget (self);
|
A_FaceTarget (self);
|
||||||
P_SpawnMissileZAimed (self, self->z + 56*FRACUNIT, self->target, RUNTIME_CLASS(ACrusaderMissile));
|
P_SpawnMissileZAimed (self, self->z + 56*FRACUNIT, self->target, PClass::FindClass("CrusaderMissile"));
|
||||||
self->angle -= ANGLE_45/32;
|
self->angle -= ANGLE_45/32;
|
||||||
P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, RUNTIME_CLASS(ACrusaderMissile));
|
P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, PClass::FindClass("CrusaderMissile"));
|
||||||
self->angle += ANGLE_45/16;
|
self->angle += ANGLE_45/16;
|
||||||
P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, RUNTIME_CLASS(ACrusaderMissile));
|
P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, PClass::FindClass("CrusaderMissile"));
|
||||||
self->angle -= ANGLE_45/16;
|
self->angle -= ANGLE_45/16;
|
||||||
self->reactiontime += 15;
|
self->reactiontime += 15;
|
||||||
}
|
}
|
||||||
|
@ -192,7 +46,7 @@ void A_CrusaderChoose (AActor *self)
|
||||||
void A_CrusaderSweepLeft (AActor *self)
|
void A_CrusaderSweepLeft (AActor *self)
|
||||||
{
|
{
|
||||||
self->angle += ANGLE_90/16;
|
self->angle += ANGLE_90/16;
|
||||||
AActor *misl = P_SpawnMissileZAimed (self, self->z + 48*FRACUNIT, self->target, RUNTIME_CLASS(AFastFlameMissile));
|
AActor *misl = P_SpawnMissileZAimed (self, self->z + 48*FRACUNIT, self->target, PClass::FindClass("FastFlameMissile"));
|
||||||
if (misl != NULL)
|
if (misl != NULL)
|
||||||
{
|
{
|
||||||
misl->momz += FRACUNIT;
|
misl->momz += FRACUNIT;
|
||||||
|
@ -202,7 +56,7 @@ void A_CrusaderSweepLeft (AActor *self)
|
||||||
void A_CrusaderSweepRight (AActor *self)
|
void A_CrusaderSweepRight (AActor *self)
|
||||||
{
|
{
|
||||||
self->angle -= ANGLE_90/16;
|
self->angle -= ANGLE_90/16;
|
||||||
AActor *misl = P_SpawnMissileZAimed (self, self->z + 48*FRACUNIT, self->target, RUNTIME_CLASS(AFastFlameMissile));
|
AActor *misl = P_SpawnMissileZAimed (self, self->z + 48*FRACUNIT, self->target, PClass::FindClass("FastFlameMissile"));
|
||||||
if (misl != NULL)
|
if (misl != NULL)
|
||||||
{
|
{
|
||||||
misl->momz += FRACUNIT;
|
misl->momz += FRACUNIT;
|
||||||
|
@ -226,28 +80,3 @@ void A_CrusaderDeath (AActor *self)
|
||||||
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 667, FRACUNIT, 0, 0, 0, false);
|
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 667, FRACUNIT, 0, 0, 0, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_RocketDead (AActor *self)
|
|
||||||
{
|
|
||||||
self->RenderStyle = STYLE_Add;
|
|
||||||
S_StopSound (self, CHAN_VOICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dead Crusader ------------------------------------------------------------
|
|
||||||
|
|
||||||
class ADeadCrusader : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ADeadCrusader, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ADeadCrusader::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (ROB2, 'N', 4, A_TossGib, &States[1]),
|
|
||||||
S_NORMAL (ROB2, 'O', 4, A_ExplodeAndAlert, &States[2]),
|
|
||||||
S_NORMAL (ROB2, 'P',-1, NULL, NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ADeadCrusader, Strife, 22, 0)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_StrifeType (230)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
|
@ -7,177 +7,6 @@
|
||||||
|
|
||||||
static FRandom pr_inq ("Inquisitor");
|
static FRandom pr_inq ("Inquisitor");
|
||||||
|
|
||||||
void A_InquisitorWalk (AActor *);
|
|
||||||
void A_InquisitorDecide (AActor *);
|
|
||||||
void A_InquisitorAttack (AActor *);
|
|
||||||
void A_InquisitorJump (AActor *);
|
|
||||||
void A_InquisitorCheckLand (AActor *);
|
|
||||||
void A_TossArm (AActor *);
|
|
||||||
void A_ShutUp (AActor *);
|
|
||||||
|
|
||||||
void A_ReaverRanged (AActor *);
|
|
||||||
void A_TossGib (AActor *);
|
|
||||||
void A_Countdown (AActor *);
|
|
||||||
|
|
||||||
// Inquisitor ---------------------------------------------------------------
|
|
||||||
|
|
||||||
class AInquisitor : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AInquisitor, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AInquisitor::States[] =
|
|
||||||
{
|
|
||||||
#define S_INQ_STND 0
|
|
||||||
S_NORMAL (ROB3, 'A', 10, A_Look, &States[S_INQ_STND+1]),
|
|
||||||
S_NORMAL (ROB3, 'B', 10, A_Look, &States[S_INQ_STND]),
|
|
||||||
|
|
||||||
#define S_INQ_CHASE (S_INQ_STND+2)
|
|
||||||
S_NORMAL (ROB3, 'B', 3, A_InquisitorWalk, &States[S_INQ_CHASE+1]),
|
|
||||||
S_NORMAL (ROB3, 'B', 3, A_Chase, &States[S_INQ_CHASE+2]),
|
|
||||||
S_NORMAL (ROB3, 'C', 4, A_Chase, &States[S_INQ_CHASE+3]),
|
|
||||||
S_NORMAL (ROB3, 'C', 4, A_Chase, &States[S_INQ_CHASE+4]),
|
|
||||||
S_NORMAL (ROB3, 'D', 4, A_Chase, &States[S_INQ_CHASE+5]),
|
|
||||||
S_NORMAL (ROB3, 'D', 4, A_Chase, &States[S_INQ_CHASE+6]),
|
|
||||||
S_NORMAL (ROB3, 'E', 3, A_InquisitorWalk, &States[S_INQ_CHASE+7]),
|
|
||||||
S_NORMAL (ROB3, 'E', 3, A_InquisitorDecide, &States[S_INQ_CHASE]),
|
|
||||||
|
|
||||||
#define S_INQ_ATK (S_INQ_CHASE+8)
|
|
||||||
S_NORMAL (ROB3, 'A', 2, A_InquisitorDecide, &States[S_INQ_ATK+1]),
|
|
||||||
S_NORMAL (ROB3, 'F', 6, A_FaceTarget, &States[S_INQ_ATK+2]),
|
|
||||||
S_BRIGHT (ROB3, 'G', 8, A_ReaverRanged, &States[S_INQ_ATK+3]),
|
|
||||||
S_NORMAL (ROB3, 'G', 8, A_ReaverRanged, &States[S_INQ_CHASE]),
|
|
||||||
|
|
||||||
#define S_INQ_ATK2 (S_INQ_ATK+4)
|
|
||||||
S_NORMAL (ROB3, 'K', 12, A_FaceTarget, &States[S_INQ_ATK2+1]),
|
|
||||||
S_BRIGHT (ROB3, 'J', 6, A_InquisitorAttack, &States[S_INQ_ATK2+2]),
|
|
||||||
S_NORMAL (ROB3, 'K', 12, NULL, &States[S_INQ_CHASE]),
|
|
||||||
|
|
||||||
#define S_INQ_BAR (S_INQ_ATK2+3)
|
|
||||||
S_BRIGHT (ROB3, 'H', 8, A_InquisitorJump, &States[S_INQ_BAR+1]),
|
|
||||||
S_BRIGHT (ROB3, 'I', 4, A_InquisitorCheckLand, &States[S_INQ_BAR+2]),
|
|
||||||
S_BRIGHT (ROB3, 'H', 4, A_InquisitorCheckLand, &States[S_INQ_BAR+1]),
|
|
||||||
|
|
||||||
#define S_INQ_DIE (S_INQ_BAR+3)
|
|
||||||
S_NORMAL (ROB3, 'L', 0, A_ShutUp, &States[S_INQ_DIE+1]),
|
|
||||||
S_NORMAL (ROB3, 'L', 4, A_TossGib, &States[S_INQ_DIE+2]),
|
|
||||||
S_NORMAL (ROB3, 'M', 4, A_Scream, &States[S_INQ_DIE+3]),
|
|
||||||
S_NORMAL (ROB3, 'N', 4, A_TossGib, &States[S_INQ_DIE+4]),
|
|
||||||
S_BRIGHT (ROB3, 'O', 4, A_ExplodeAndAlert, &States[S_INQ_DIE+5]),
|
|
||||||
S_BRIGHT (ROB3, 'P', 4, A_TossGib, &States[S_INQ_DIE+6]),
|
|
||||||
S_BRIGHT (ROB3, 'Q', 4, A_NoBlocking, &States[S_INQ_DIE+7]),
|
|
||||||
S_NORMAL (ROB3, 'R', 4, A_TossGib, &States[S_INQ_DIE+8]),
|
|
||||||
S_NORMAL (ROB3, 'S', 4, A_TossGib, &States[S_INQ_DIE+9]),
|
|
||||||
S_NORMAL (ROB3, 'T', 4, A_TossGib, &States[S_INQ_DIE+10]),
|
|
||||||
S_NORMAL (ROB3, 'U', 4, A_TossGib, &States[S_INQ_DIE+11]),
|
|
||||||
S_NORMAL (ROB3, 'V', 4, A_TossGib, &States[S_INQ_DIE+12]),
|
|
||||||
S_BRIGHT (ROB3, 'W', 4, A_ExplodeAndAlert, &States[S_INQ_DIE+13]),
|
|
||||||
S_BRIGHT (ROB3, 'X', 4, A_TossGib, &States[S_INQ_DIE+14]),
|
|
||||||
S_BRIGHT (ROB3, 'Y', 4, A_TossGib, &States[S_INQ_DIE+15]),
|
|
||||||
S_NORMAL (ROB3, 'Z', 4, A_TossGib, &States[S_INQ_DIE+16]),
|
|
||||||
S_NORMAL (ROB3, '[', 4, A_TossGib, &States[S_INQ_DIE+17]),
|
|
||||||
S_NORMAL (ROB3, '\\', 3, A_TossGib, &States[S_INQ_DIE+18]),
|
|
||||||
S_BRIGHT (ROB3, ']', 3, A_ExplodeAndAlert, &States[S_INQ_DIE+19]),
|
|
||||||
S_BRIGHT (RBB3, 'A', 3, A_TossArm, &States[S_INQ_DIE+20]),
|
|
||||||
S_BRIGHT (RBB3, 'B', 3, A_TossGib, &States[S_INQ_DIE+21]),
|
|
||||||
S_NORMAL (RBB3, 'C', 3, A_TossGib, &States[S_INQ_DIE+22]),
|
|
||||||
S_NORMAL (RBB3, 'D', 3, A_TossGib, &States[S_INQ_DIE+23]),
|
|
||||||
S_NORMAL (RBB3, 'E', -1, NULL, NULL),
|
|
||||||
// The Inquisitor called A_BossDeath in Strife, but A_BossDeath doesn't
|
|
||||||
// do anything for it, so there's no reason to call it.
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AInquisitor, Strife, 16, 0)
|
|
||||||
PROP_StrifeType (93)
|
|
||||||
PROP_SpawnHealth (1000)
|
|
||||||
PROP_SpawnState (S_INQ_STND)
|
|
||||||
PROP_SeeState (S_INQ_CHASE)
|
|
||||||
PROP_MissileState (S_INQ_ATK)
|
|
||||||
PROP_DeathState (S_INQ_DIE)
|
|
||||||
PROP_SpeedFixed (12)
|
|
||||||
PROP_RadiusFixed (40)
|
|
||||||
PROP_HeightFixed (110)
|
|
||||||
PROP_MassLong(0x7fffffff)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_NOBLOOD|MF_COUNTKILL)
|
|
||||||
PROP_Flags2 (MF2_BOSS|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
|
|
||||||
PROP_Flags3 (MF3_DONTMORPH|MF3_NORADIUSDMG)
|
|
||||||
PROP_MaxDropOffHeight (32)
|
|
||||||
PROP_MinMissileChance (150)
|
|
||||||
PROP_SeeSound ("inquisitor/sight")
|
|
||||||
PROP_DeathSound ("inquisitor/death")
|
|
||||||
PROP_ActiveSound ("inquisitor/active")
|
|
||||||
PROP_Obituary ("$OB_INQUISITOR")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Inquisitor Shot ----------------------------------------------------------
|
|
||||||
|
|
||||||
class AInquisitorShot : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AInquisitorShot, AActor)
|
|
||||||
public:
|
|
||||||
void GetExplodeParms (int &damage, int &dist, bool &hurtSource);
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AInquisitorShot::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (UBAM, 'A', 3, A_Countdown, &States[1]),
|
|
||||||
S_NORMAL (UBAM, 'B', 3, A_Countdown, &States[0]),
|
|
||||||
|
|
||||||
S_BRIGHT (BNG2, 'A', 4, A_ExplodeAndAlert, &States[3]),
|
|
||||||
S_BRIGHT (BNG2, 'B', 4, NULL, &States[4]),
|
|
||||||
S_BRIGHT (BNG2, 'C', 4, NULL, &States[5]),
|
|
||||||
S_BRIGHT (BNG2, 'D', 4, NULL, &States[6]),
|
|
||||||
S_BRIGHT (BNG2, 'E', 4, NULL, &States[7]),
|
|
||||||
S_BRIGHT (BNG2, 'F', 4, NULL, &States[8]),
|
|
||||||
S_BRIGHT (BNG2, 'G', 4, NULL, &States[9]),
|
|
||||||
S_BRIGHT (BNG2, 'H', 4, NULL, &States[10]),
|
|
||||||
S_BRIGHT (BNG2, 'I', 4, NULL, NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AInquisitorShot, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (108)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_DeathState (2)
|
|
||||||
PROP_ReactionTime (15)
|
|
||||||
PROP_SpeedFixed (25)
|
|
||||||
PROP_RadiusFixed (13)
|
|
||||||
PROP_HeightFixed (13)
|
|
||||||
PROP_Mass (15)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT)
|
|
||||||
PROP_Flags4 (MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
PROP_SeeSound ("inquisitor/attack")
|
|
||||||
PROP_DeathSound ("inquisitor/atkexplode")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void AInquisitorShot::GetExplodeParms (int &damage, int &dist, bool &hurtSource)
|
|
||||||
{
|
|
||||||
damage = dist = 192;
|
|
||||||
RenderStyle = STYLE_Add;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Dead Inquisitor's Detached Arm ---------------------------------------
|
|
||||||
|
|
||||||
class AInquisitorArm : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AInquisitorArm, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AInquisitorArm::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (RBB3, 'F', 5, NULL, &States[1]),
|
|
||||||
S_BRIGHT (RBB3, 'G', 5, NULL, &States[2]),
|
|
||||||
S_NORMAL (RBB3, 'H', -1, NULL, NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AInquisitorArm, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (94)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_SpeedFixed (25)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOCLIP|MF_NOBLOOD)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void A_InquisitorWalk (AActor *self)
|
void A_InquisitorWalk (AActor *self)
|
||||||
{
|
{
|
||||||
S_Sound (self, CHAN_BODY, "inquisitor/walk", 1, ATTN_NORM);
|
S_Sound (self, CHAN_BODY, "inquisitor/walk", 1, ATTN_NORM);
|
||||||
|
@ -201,13 +30,13 @@ void A_InquisitorDecide (AActor *self)
|
||||||
A_FaceTarget (self);
|
A_FaceTarget (self);
|
||||||
if (!InquisitorCheckDistance (self))
|
if (!InquisitorCheckDistance (self))
|
||||||
{
|
{
|
||||||
self->SetState (&AInquisitor::States[S_INQ_ATK2]);
|
self->SetState (self->FindState("Grenade"));
|
||||||
}
|
}
|
||||||
if (self->target->z != self->z)
|
if (self->target->z != self->z)
|
||||||
{
|
{
|
||||||
if (self->z + self->height + 54*FRACUNIT < self->ceilingz)
|
if (self->z + self->height + 54*FRACUNIT < self->ceilingz)
|
||||||
{
|
{
|
||||||
self->SetState (&AInquisitor::States[S_INQ_BAR]);
|
self->SetState (self->FindState("Jump"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,13 +52,13 @@ void A_InquisitorAttack (AActor *self)
|
||||||
|
|
||||||
self->z += 32*FRACBITS;
|
self->z += 32*FRACBITS;
|
||||||
self->angle -= ANGLE_45/32;
|
self->angle -= ANGLE_45/32;
|
||||||
proj = P_SpawnMissileZAimed (self, self->z, self->target, RUNTIME_CLASS(AInquisitorShot));
|
proj = P_SpawnMissileZAimed (self, self->z, self->target, PClass::FindClass("InquisitorShot"));
|
||||||
if (proj != NULL)
|
if (proj != NULL)
|
||||||
{
|
{
|
||||||
proj->momz += 9*FRACUNIT;
|
proj->momz += 9*FRACUNIT;
|
||||||
}
|
}
|
||||||
self->angle += ANGLE_45/16;
|
self->angle += ANGLE_45/16;
|
||||||
proj = P_SpawnMissileZAimed (self, self->z, self->target, RUNTIME_CLASS(AInquisitorShot));
|
proj = P_SpawnMissileZAimed (self, self->z, self->target, PClass::FindClass("InquisitorShot"));
|
||||||
if (proj != NULL)
|
if (proj != NULL)
|
||||||
{
|
{
|
||||||
proj->momz += 16*FRACUNIT;
|
proj->momz += 16*FRACUNIT;
|
||||||
|
@ -275,7 +104,7 @@ void A_InquisitorCheckLand (AActor *self)
|
||||||
self->SetState (self->SeeState);
|
self->SetState (self->SeeState);
|
||||||
self->reactiontime = 0;
|
self->reactiontime = 0;
|
||||||
self->flags &= ~MF_NOGRAVITY;
|
self->flags &= ~MF_NOGRAVITY;
|
||||||
A_ShutUp (self);
|
S_StopSound (self, CHAN_ITEM);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!S_IsActorPlayingSomething (self, CHAN_ITEM, -1))
|
if (!S_IsActorPlayingSomething (self, CHAN_ITEM, -1))
|
||||||
|
@ -287,14 +116,10 @@ void A_InquisitorCheckLand (AActor *self)
|
||||||
|
|
||||||
void A_TossArm (AActor *self)
|
void A_TossArm (AActor *self)
|
||||||
{
|
{
|
||||||
AActor *foo = Spawn<AInquisitorArm> (self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE);
|
AActor *foo = Spawn("InquisitorArm", self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE);
|
||||||
foo->angle = self->angle - ANGLE_90 + (pr_inq.Random2() << 22);
|
foo->angle = self->angle - ANGLE_90 + (pr_inq.Random2() << 22);
|
||||||
foo->momx = FixedMul (foo->Speed, finecosine[foo->angle >> ANGLETOFINESHIFT]) >> 3;
|
foo->momx = FixedMul (foo->Speed, finecosine[foo->angle >> ANGLETOFINESHIFT]) >> 3;
|
||||||
foo->momy = FixedMul (foo->Speed, finesine[foo->angle >> ANGLETOFINESHIFT]) >> 3;
|
foo->momy = FixedMul (foo->Speed, finesine[foo->angle >> ANGLETOFINESHIFT]) >> 3;
|
||||||
foo->momz = pr_inq() << 10;
|
foo->momz = pr_inq() << 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_ShutUp (AActor *self)
|
|
||||||
{
|
|
||||||
S_StopSound (self, CHAN_ITEM);
|
|
||||||
}
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ void AMacil2::NoBlockingSet ()
|
||||||
|
|
||||||
int AMacil2::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, FName damagetype)
|
int AMacil2::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, FName damagetype)
|
||||||
{
|
{
|
||||||
if (inflictor != NULL && inflictor->IsKindOf (RUNTIME_CLASS(ASpectralLightningV1)))
|
if (inflictor != NULL && inflictor->GetClass()->TypeName == NAME_SpectralLightningV1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return Super::TakeSpecialDamage(inflictor, source, damage, damagetype);
|
return Super::TakeSpecialDamage(inflictor, source, damage, damagetype);
|
||||||
|
|
|
@ -81,7 +81,7 @@ void A_WakeOracleSpectre (AActor *self)
|
||||||
|
|
||||||
int AOracle::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, FName damagetype)
|
int AOracle::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, FName damagetype)
|
||||||
{
|
{
|
||||||
if (inflictor != NULL && inflictor->IsKindOf (RUNTIME_CLASS(ASpectralLightningV1)))
|
if (inflictor != NULL && inflictor->GetClass()->TypeName == NAME_SpectralLightningV1)
|
||||||
return -1;
|
return -1;
|
||||||
return Super::TakeSpecialDamage(inflictor, source, damage, damagetype);
|
return Super::TakeSpecialDamage(inflictor, source, damage, damagetype);
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,7 +248,7 @@ void A_SpotLightning (AActor *self)
|
||||||
if (self->target == NULL)
|
if (self->target == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
spot = Spawn<ASpectralLightningSpot> (self->target->x, self->target->y, ONFLOORZ, ALLOW_REPLACE);
|
spot = Spawn("SpectralLightningSpot", self->target->x, self->target->y, ONFLOORZ, ALLOW_REPLACE);
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->threshold = 25;
|
spot->threshold = 25;
|
||||||
|
|
|
@ -7,285 +7,45 @@
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
#include "a_strifeglobal.h"
|
#include "a_strifeglobal.h"
|
||||||
|
|
||||||
void A_SpectralLightning (AActor *);
|
AActor *P_SpawnSubMissile (AActor *source, const PClass *type, AActor *target);
|
||||||
|
|
||||||
void A_AlertMonsters (AActor *);
|
class ASpectralMonster : public AActor
|
||||||
void A_Countdown (AActor *);
|
|
||||||
void A_Tracer2 (AActor *);
|
|
||||||
AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target);
|
|
||||||
|
|
||||||
// Container for all spectral lightning deaths ------------------------------
|
|
||||||
|
|
||||||
FState ASpectralLightningBase::States[] =
|
|
||||||
{
|
{
|
||||||
S_NORMAL (ZAP1, 'B', 3, A_Explode, &States[1]),
|
DECLARE_CLASS (ASpectralMonster, AActor)
|
||||||
S_NORMAL (ZAP1, 'A', 3, A_AlertMonsters, &States[2]),
|
public:
|
||||||
S_NORMAL (ZAP1, 'B', 3, NULL, &States[3]),
|
void Touch (AActor *toucher);
|
||||||
S_NORMAL (ZAP1, 'C', 3, NULL, &States[4]),
|
|
||||||
S_NORMAL (ZAP1, 'D', 3, NULL, &States[5]),
|
|
||||||
S_NORMAL (ZAP1, 'E', 3, NULL, &States[6]),
|
|
||||||
S_NORMAL (ZAP1, 'F', 3, NULL, &States[7]),
|
|
||||||
S_NORMAL (ZAP1, 'E', 3, NULL, &States[8]),
|
|
||||||
S_NORMAL (ZAP1, 'D', 2, NULL, &States[9]),
|
|
||||||
S_NORMAL (ZAP1, 'C', 2, NULL, &States[10]),
|
|
||||||
S_NORMAL (ZAP1, 'B', 2, NULL, &States[11]),
|
|
||||||
S_NORMAL (ZAP1, 'A', 1, NULL, NULL),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningBase, Strife, -1, 0)
|
IMPLEMENT_CLASS (ASpectralMonster)
|
||||||
PROP_DeathState (0)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
|
|
||||||
PROP_Flags4 (MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
PROP_SeeSound ("weapons/sigil")
|
|
||||||
PROP_DeathSound ("weapons/sigilhit")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void ASpectralLightningBase::GetExplodeParms (int &damage, int &dist, bool &hurtSource)
|
void ASpectralMonster::Touch (AActor *toucher)
|
||||||
{
|
{
|
||||||
damage = dist = 32;
|
P_DamageMobj (toucher, this, this, 5, NAME_Melee);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spectral Lightning death that does not explode ---------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningDeath1, Strife, -1, 0)
|
|
||||||
PROP_DeathState (1)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Spectral Lightning death that does not alert monsters --------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningDeath2, Strife, -1, 0)
|
|
||||||
PROP_DeathState (2)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Spectral Lightning death that is shorter than the rest -------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningDeathShort, Strife, -1, 0)
|
|
||||||
PROP_DeathState (6)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Spectral Lightning (Ball Shaped #1) --------------------------------------
|
|
||||||
|
|
||||||
FState ASpectralLightningBall1::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (ZOT3, 'A', 4, NULL, &States[1]),
|
|
||||||
S_BRIGHT (ZOT3, 'B', 4, NULL, &States[2]),
|
|
||||||
S_BRIGHT (ZOT3, 'C', 4, NULL, &States[3]),
|
|
||||||
S_BRIGHT (ZOT3, 'D', 4, NULL, &States[4]),
|
|
||||||
S_BRIGHT (ZOT3, 'E', 4, NULL, &States[0]),
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningBall1, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (80)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_SpeedFixed (30)
|
|
||||||
PROP_RadiusFixed (8)
|
|
||||||
PROP_HeightFixed (16)
|
|
||||||
PROP_Damage (70)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
|
|
||||||
PROP_Flags4 (MF4_SPECTRAL|MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Spectral Lightning (Ball Shaped #2) --------------------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningBall2, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (81)
|
|
||||||
PROP_Damage (20)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Spectral Lightning (Horizontal #1) ---------------------------------------
|
|
||||||
|
|
||||||
void A_SpectralLightningTail (AActor *);
|
|
||||||
|
|
||||||
FState ASpectralLightningH1::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (ZAP6, 'A', 4, NULL, &States[1]),
|
|
||||||
S_BRIGHT (ZAP6, 'B', 4, A_SpectralLightningTail, &States[2]),
|
|
||||||
S_BRIGHT (ZAP6, 'C', 4, A_SpectralLightningTail, &States[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningH1, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (78)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_SpeedFixed (30)
|
|
||||||
PROP_RadiusFixed (8)
|
|
||||||
PROP_HeightFixed (16)
|
|
||||||
PROP_Damage (70)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
|
|
||||||
PROP_Flags4 (MF4_SPECTRAL|MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Spectral Lightning (Horizontal #2) -------------------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningH2, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (79)
|
|
||||||
PROP_Damage (20)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Spectral Lightning (Horizontal #3) -------------------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningH3, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (82)
|
|
||||||
PROP_Damage (10)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// ASpectralLightningHTail --------------------------------------------------
|
|
||||||
|
|
||||||
FState ASpectralLightningHTail::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (ZAP6, 'A', 5, NULL, &States[1]),
|
|
||||||
S_BRIGHT (ZAP6, 'B', 5, NULL, &States[2]),
|
|
||||||
S_BRIGHT (ZAP6, 'C', 5, NULL, NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningHTail, Strife, -1, 0)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF)
|
|
||||||
PROP_Flags4Clear (MF4_SPECTRAL)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void A_SpectralLightningTail (AActor *self)
|
void A_SpectralLightningTail (AActor *self)
|
||||||
{
|
{
|
||||||
AActor *foo = Spawn<ASpectralLightningHTail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
|
AActor *foo = Spawn("SpectralLightningHTail", self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
|
||||||
|
|
||||||
foo->angle = self->angle;
|
foo->angle = self->angle;
|
||||||
foo->health = self->health;
|
foo->health = self->health;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spectral Lightning (Big Ball #1) -----------------------------------------
|
|
||||||
|
|
||||||
void A_SpectralBigBallLightning (AActor *);
|
|
||||||
|
|
||||||
FState ASpectralLightningBigBall1::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (ZAP7, 'A', 4, A_SpectralBigBallLightning, &States[1]),
|
|
||||||
S_BRIGHT (ZAP7, 'B', 4, A_SpectralBigBallLightning, &States[2]),
|
|
||||||
S_BRIGHT (ZAP7, 'C', 6, A_SpectralBigBallLightning, &States[3]),
|
|
||||||
S_BRIGHT (ZAP7, 'D', 6, A_SpectralBigBallLightning, &States[4]),
|
|
||||||
S_BRIGHT (ZAP7, 'E', 6, A_SpectralBigBallLightning, &States[0]),
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningBigBall1, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (84)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_SpeedFixed (18)
|
|
||||||
PROP_RadiusFixed (20)
|
|
||||||
PROP_HeightFixed (40)
|
|
||||||
PROP_Damage (130)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
|
|
||||||
PROP_Flags4 (MF4_SPECTRAL|MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
|
|
||||||
void A_SpectralBigBallLightning (AActor *self)
|
void A_SpectralBigBallLightning (AActor *self)
|
||||||
{
|
{
|
||||||
|
const PClass *cls = PClass::FindClass("SpectralLightningH3");
|
||||||
|
if (cls)
|
||||||
|
{
|
||||||
self->angle += ANGLE_90;
|
self->angle += ANGLE_90;
|
||||||
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
|
P_SpawnSubMissile (self, cls, self->target);
|
||||||
self->angle += ANGLE_180;
|
self->angle += ANGLE_180;
|
||||||
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
|
P_SpawnSubMissile (self, cls, self->target);
|
||||||
self->angle += ANGLE_90;
|
self->angle += ANGLE_90;
|
||||||
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
|
P_SpawnSubMissile (self, cls, self->target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Spectral Lightning (Big Ball #2 - less damaging) -------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningBigBall2, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (85)
|
|
||||||
PROP_Damage (30)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sigil Lightning (Vertical #1) --------------------------------------------
|
|
||||||
|
|
||||||
FState ASpectralLightningV1::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (ZOT1, 'A', 4, NULL, &States[1]),
|
|
||||||
S_BRIGHT (ZOT1, 'B', 4, NULL, &States[2]),
|
|
||||||
S_BRIGHT (ZOT1, 'C', 6, NULL, &States[3]),
|
|
||||||
S_BRIGHT (ZOT1, 'D', 6, NULL, &States[4]),
|
|
||||||
S_BRIGHT (ZOT1, 'E', 6, NULL, &States[0]),
|
|
||||||
// Apparent Strife bug: The last state for this sprite used frame D
|
|
||||||
// instead of E, even though E is in the wad.
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningV1, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (86)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_SpeedFixed (22)
|
|
||||||
PROP_RadiusFixed (8)
|
|
||||||
PROP_HeightFixed (24)
|
|
||||||
PROP_Damage (100)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
|
|
||||||
PROP_Flags4 (MF4_SPECTRAL|MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sigil Lightning (Vertical #2 - less damaging) ----------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningV2, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (87)
|
|
||||||
PROP_Damage (50)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sigil Lightning Spot (roams around dropping lightning from above) --------
|
|
||||||
|
|
||||||
FState ASpectralLightningSpot::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (ZAP5, 'A', 4, A_Countdown, &States[1]),
|
|
||||||
S_BRIGHT (ZAP5, 'B', 4, A_SpectralLightning, &States[2]),
|
|
||||||
S_BRIGHT (ZAP5, 'C', 4, A_Countdown, &States[3]),
|
|
||||||
S_BRIGHT (ZAP5, 'D', 4, A_Countdown, &States[0]),
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningSpot, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (88)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_SpeedFixed (18)
|
|
||||||
PROP_ReactionTime (70)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP)
|
|
||||||
PROP_Flags3 (MF3_NOBLOCKMONST)
|
|
||||||
PROP_Flags5 (MF5_NODROPOFF)
|
|
||||||
PROP_RenderStyle (STYLE_Translucent)
|
|
||||||
PROP_Alpha (HR_SHADOW)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sigil Lightning (Big Vertical #1) ----------------------------------------
|
|
||||||
|
|
||||||
FState ASpectralLightningBigV1::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (ZOT2, 'A', 4, A_Tracer2, &States[1]),
|
|
||||||
S_BRIGHT (ZOT2, 'B', 4, A_Tracer2, &States[2]),
|
|
||||||
S_BRIGHT (ZOT2, 'C', 4, A_Tracer2, &States[3]),
|
|
||||||
S_BRIGHT (ZOT2, 'D', 4, A_Tracer2, &States[4]),
|
|
||||||
S_BRIGHT (ZOT2, 'E', 4, A_Tracer2, &States[0]),
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningBigV1, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (89)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_SpeedFixed (28)
|
|
||||||
PROP_RadiusFixed (8)
|
|
||||||
PROP_HeightFixed (16)
|
|
||||||
PROP_Damage (120)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
|
|
||||||
PROP_Flags4 (MF4_SPECTRAL|MF4_STRIFEDAMAGE)
|
|
||||||
PROP_MaxStepHeight (4)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Actor 90 -----------------------------------------------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningBigV2, Strife, -1, 0)
|
|
||||||
PROP_StrifeType (90)
|
|
||||||
PROP_Damage (60)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// "Zap 5" ------------------------------------------------------------------
|
|
||||||
|
|
||||||
static FRandom pr_zap5 ("Zap5");
|
static FRandom pr_zap5 ("Zap5");
|
||||||
|
|
||||||
void A_SpectralLightning (AActor *self)
|
void A_SpectralLightning (AActor *self)
|
||||||
|
@ -302,14 +62,14 @@ void A_SpectralLightning (AActor *self)
|
||||||
x = self->x + pr_zap5.Random2(3) * FRACUNIT * 50;
|
x = self->x + pr_zap5.Random2(3) * FRACUNIT * 50;
|
||||||
y = self->y + pr_zap5.Random2(3) * FRACUNIT * 50;
|
y = self->y + pr_zap5.Random2(3) * FRACUNIT * 50;
|
||||||
|
|
||||||
flash = Spawn (self->threshold > 25 ? RUNTIME_CLASS(ASpectralLightningV2) :
|
flash = Spawn (self->threshold > 25 ? PClass::FindClass("SpectralLightningV2") :
|
||||||
RUNTIME_CLASS(ASpectralLightningV1), x, y, ONCEILINGZ, ALLOW_REPLACE);
|
PClass::FindClass("SpectralLightningV1"), x, y, ONCEILINGZ, ALLOW_REPLACE);
|
||||||
|
|
||||||
flash->target = self->target;
|
flash->target = self->target;
|
||||||
flash->momz = -18*FRACUNIT;
|
flash->momz = -18*FRACUNIT;
|
||||||
flash->health = self->health;
|
flash->health = self->health;
|
||||||
|
|
||||||
flash = Spawn<ASpectralLightningV2> (self->x, self->y, ONCEILINGZ, ALLOW_REPLACE);
|
flash = Spawn("SpectralLightningV2", self->x, self->y, ONCEILINGZ, ALLOW_REPLACE);
|
||||||
|
|
||||||
flash->target = self->target;
|
flash->target = self->target;
|
||||||
flash->momz = -18*FRACUNIT;
|
flash->momz = -18*FRACUNIT;
|
||||||
|
|
|
@ -113,94 +113,4 @@ public:
|
||||||
|
|
||||||
extern const PClass *QuestItemClasses[31];
|
extern const PClass *QuestItemClasses[31];
|
||||||
|
|
||||||
// Sigil/Spectral projectiles -----------------------------------------------
|
|
||||||
|
|
||||||
class ASpectralLightningBase : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningBase, AActor)
|
|
||||||
public:
|
|
||||||
void GetExplodeParms (int &damage, int &dist, bool &hurtSource);
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningDeath1 : public ASpectralLightningBase
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningDeath1, ASpectralLightningBase)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningDeath2 : public ASpectralLightningBase
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningDeath2, ASpectralLightningBase)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningDeathShort : public ASpectralLightningBase
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningDeathShort, ASpectralLightningBase)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningBall1 : public ASpectralLightningBase
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningBall1, ASpectralLightningBase)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningBall2 : public ASpectralLightningBall1
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningBall2, ASpectralLightningBall1)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningH1 : public ASpectralLightningBase
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningH1, ASpectralLightningBase)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningH2 : public ASpectralLightningH1
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningH2, ASpectralLightningH1)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningH3 : public ASpectralLightningH1
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningH3, ASpectralLightningH1)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningHTail : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningHTail, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningBigBall1 : public ASpectralLightningDeath2
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningBigBall1, ASpectralLightningDeath2)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningBigBall2 : public ASpectralLightningBigBall1
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningBigBall2, ASpectralLightningBigBall1)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningV1 : public ASpectralLightningDeathShort
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningV1, ASpectralLightningDeathShort)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningV2 : public ASpectralLightningV1
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningV2, ASpectralLightningV1)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningSpot : public ASpectralLightningDeath1
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningSpot, ASpectralLightningDeath1)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningBigV1 : public ASpectralLightningDeath1
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASpectralLightningBigV1, ASpectralLightningDeath1)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ASpectralLightningBigV2 : public ASpectralLightningBigV1
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ASpectralLightningBigV2, ASpectralLightningBigV1)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1371,7 +1371,7 @@ void A_FireMauler2 (AActor *self)
|
||||||
//
|
//
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target);
|
AActor *P_SpawnSubMissile (AActor *source, const PClass *type, AActor *target);
|
||||||
|
|
||||||
void A_MaulerTorpedoWave (AActor *self)
|
void A_MaulerTorpedoWave (AActor *self)
|
||||||
{
|
{
|
||||||
|
@ -1393,7 +1393,7 @@ void A_MaulerTorpedoWave (AActor *self)
|
||||||
self->z = savedz;
|
self->z = savedz;
|
||||||
}
|
}
|
||||||
|
|
||||||
AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target)
|
AActor *P_SpawnSubMissile (AActor *source, const PClass *type, AActor *target)
|
||||||
{
|
{
|
||||||
AActor *other = Spawn (type, source->x, source->y, source->z, ALLOW_REPLACE);
|
AActor *other = Spawn (type, source->x, source->y, source->z, ALLOW_REPLACE);
|
||||||
|
|
||||||
|
@ -2212,7 +2212,7 @@ void A_FireSigil1 (AActor *actor)
|
||||||
P_BulletSlope (actor, &linetarget);
|
P_BulletSlope (actor, &linetarget);
|
||||||
if (linetarget != NULL)
|
if (linetarget != NULL)
|
||||||
{
|
{
|
||||||
spot = Spawn<ASpectralLightningSpot> (linetarget->x, linetarget->y, ONFLOORZ, ALLOW_REPLACE);
|
spot = Spawn("SpectralLightningSpot", linetarget->x, linetarget->y, ONFLOORZ, ALLOW_REPLACE);
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->tracer = linetarget;
|
spot->tracer = linetarget;
|
||||||
|
@ -2220,7 +2220,7 @@ void A_FireSigil1 (AActor *actor)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
spot = Spawn<ASpectralLightningSpot> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
spot = Spawn("SpectralLightningSpot", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->momx += 28 * finecosine[actor->angle >> ANGLETOFINESHIFT];
|
spot->momx += 28 * finecosine[actor->angle >> ANGLETOFINESHIFT];
|
||||||
|
@ -2250,7 +2250,7 @@ void A_FireSigil2 (AActor *actor)
|
||||||
P_DamageMobj (actor, actor, NULL, 2*4, 0, DMG_NO_ARMOR);
|
P_DamageMobj (actor, actor, NULL, 2*4, 0, DMG_NO_ARMOR);
|
||||||
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
||||||
|
|
||||||
P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningH1));
|
P_SpawnPlayerMissile (actor, PClass::FindClass("SpectralLightningH1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
@ -2275,7 +2275,7 @@ void A_FireSigil3 (AActor *actor)
|
||||||
for (i = 0; i < 20; ++i)
|
for (i = 0; i < 20; ++i)
|
||||||
{
|
{
|
||||||
actor->angle += ANGLE_180/20;
|
actor->angle += ANGLE_180/20;
|
||||||
spot = P_SpawnSubMissile (actor, RUNTIME_CLASS(ASpectralLightningBall1), actor);
|
spot = P_SpawnSubMissile (actor, PClass::FindClass("SpectralLightningBall1"), actor);
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->z = actor->z + 32*FRACUNIT;
|
spot->z = actor->z + 32*FRACUNIT;
|
||||||
|
@ -2305,7 +2305,7 @@ void A_FireSigil4 (AActor *actor)
|
||||||
P_BulletSlope (actor, &linetarget);
|
P_BulletSlope (actor, &linetarget);
|
||||||
if (linetarget != NULL)
|
if (linetarget != NULL)
|
||||||
{
|
{
|
||||||
spot = P_SpawnPlayerMissile (actor, 0,0,0, RUNTIME_CLASS(ASpectralLightningBigV1), actor->angle, &linetarget);
|
spot = P_SpawnPlayerMissile (actor, 0,0,0, PClass::FindClass("SpectralLightningBigV1"), actor->angle, &linetarget);
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->tracer = linetarget;
|
spot->tracer = linetarget;
|
||||||
|
@ -2313,7 +2313,7 @@ void A_FireSigil4 (AActor *actor)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
spot = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningBigV1));
|
spot = P_SpawnPlayerMissile (actor, PClass::FindClass("SpectralLightningBigV1"));
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->momx += FixedMul (spot->Speed, finecosine[actor->angle >> ANGLETOFINESHIFT]);
|
spot->momx += FixedMul (spot->Speed, finecosine[actor->angle >> ANGLETOFINESHIFT]);
|
||||||
|
@ -2338,7 +2338,7 @@ void A_FireSigil5 (AActor *actor)
|
||||||
P_DamageMobj (actor, actor, NULL, 5*4, 0, DMG_NO_ARMOR);
|
P_DamageMobj (actor, actor, NULL, 5*4, 0, DMG_NO_ARMOR);
|
||||||
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
||||||
|
|
||||||
P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningBigBall1));
|
P_SpawnPlayerMissile (actor, PClass::FindClass("SpectralLightningBigBall1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
|
@ -123,6 +123,14 @@ xx(StrifeGrenadeLauncher)
|
||||||
xx(Mauler)
|
xx(Mauler)
|
||||||
|
|
||||||
xx(AcolyteBlue)
|
xx(AcolyteBlue)
|
||||||
|
xx(SpectralLightningV1)
|
||||||
|
|
||||||
|
// Strife's spectres
|
||||||
|
xx(AlienSpectre1)
|
||||||
|
xx(AlienSpectre2)
|
||||||
|
xx(AlienSpectre3)
|
||||||
|
xx(AlienSpectre4)
|
||||||
|
xx(AlienSpectre5)
|
||||||
|
|
||||||
xx(Chicken)
|
xx(Chicken)
|
||||||
xx(Pig)
|
xx(Pig)
|
||||||
|
|
|
@ -105,6 +105,7 @@ enum
|
||||||
static flagdef ActorFlags[]=
|
static flagdef ActorFlags[]=
|
||||||
{
|
{
|
||||||
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
|
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
|
||||||
|
DEFINE_FLAG(MF, SPECIAL, APlayerPawn, flags),
|
||||||
DEFINE_FLAG(MF, SOLID, AActor, flags),
|
DEFINE_FLAG(MF, SOLID, AActor, flags),
|
||||||
DEFINE_FLAG(MF, SHOOTABLE, AActor, flags),
|
DEFINE_FLAG(MF, SHOOTABLE, AActor, flags),
|
||||||
DEFINE_FLAG(MF, NOSECTOR, AActor, flags),
|
DEFINE_FLAG(MF, NOSECTOR, AActor, flags),
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
// SAVESIG should match SAVEVER.
|
// SAVESIG should match SAVEVER.
|
||||||
|
|
||||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||||
#define MINSAVEVER 1107
|
#define MINSAVEVER 1114
|
||||||
|
|
||||||
#if SVN_REVISION_NUMBER < MINSAVEVER
|
#if SVN_REVISION_NUMBER < MINSAVEVER
|
||||||
// Never write a savegame with a version lower than what we need
|
// Never write a savegame with a version lower than what we need
|
||||||
|
|
|
@ -181,6 +181,7 @@ class Actor extends Thinker
|
||||||
action native A_Feathers();
|
action native A_Feathers();
|
||||||
action native A_ClassBossHealth();
|
action native A_ClassBossHealth();
|
||||||
action native A_ShootGun();
|
action native A_ShootGun();
|
||||||
|
action native A_RocketInFlight();
|
||||||
}
|
}
|
||||||
|
|
||||||
class Inventory extends Actor
|
class Inventory extends Actor
|
||||||
|
|
128
wadsrc/static/actors/strife/crusader.txt
Normal file
128
wadsrc/static/actors/strife/crusader.txt
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
|
||||||
|
// Crusader -----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Crusader 3005
|
||||||
|
{
|
||||||
|
Game Strife
|
||||||
|
ConversationID 63,-1,-1
|
||||||
|
Speed 8
|
||||||
|
Radius 40
|
||||||
|
Height 56
|
||||||
|
Mass 400
|
||||||
|
Health 400
|
||||||
|
Painchance 128
|
||||||
|
Monster
|
||||||
|
+FLOORCLIP
|
||||||
|
+DONTMORPH
|
||||||
|
+MISSILEMORE
|
||||||
|
+INCOMBAT
|
||||||
|
+NOICEDEATH
|
||||||
|
MinMissileChance 120
|
||||||
|
MaxDropoffHeight 32
|
||||||
|
DropItem "EnergyPod", 256, 20
|
||||||
|
SeeSound "crusader/sight"
|
||||||
|
PainSound "crusader/pain"
|
||||||
|
DeathSound "crusader/death"
|
||||||
|
ActiveSound "crusader/active"
|
||||||
|
Obituary "$OB_CRUSADER"
|
||||||
|
|
||||||
|
action native A_CrusaderChoose ();
|
||||||
|
action native A_CrusaderSweepLeft ();
|
||||||
|
action native A_CrusaderSweepRight ();
|
||||||
|
action native A_CrusaderRefire ();
|
||||||
|
action native A_CrusaderDeath ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ROB2 Q 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
ROB2 AABBCCDD 3 A_Chase
|
||||||
|
Loop
|
||||||
|
Missile:
|
||||||
|
ROB2 E 3 A_FaceTarget
|
||||||
|
ROB2 F 2 Bright A_CrusaderChoose
|
||||||
|
ROB2 E 2 Bright A_CrusaderSweepLeft
|
||||||
|
ROB2 F 3 Bright A_CrusaderSweepLeft
|
||||||
|
ROB2 E 2 Bright A_CrusaderSweepLeft
|
||||||
|
ROB2 F 2 Bright A_CrusaderSweepLeft
|
||||||
|
ROB2 E 2 Bright A_CrusaderSweepRight
|
||||||
|
ROB2 F 2 Bright A_CrusaderSweepRight
|
||||||
|
ROB2 E 2 Bright A_CrusaderSweepRight
|
||||||
|
ROB2 F 2 A_CrusaderRefire
|
||||||
|
Loop
|
||||||
|
Pain:
|
||||||
|
ROB2 D 1 A_Pain
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
ROB2 G 3 A_Scream
|
||||||
|
ROB2 H 5 A_TossGib
|
||||||
|
ROB2 I 4 Bright A_TossGib
|
||||||
|
ROB2 J 4 Bright A_Explode(64,64,1,1)
|
||||||
|
ROB2 K 4 Bright A_Fall
|
||||||
|
ROB2 L 4 A_Explode(64,64,1,1)
|
||||||
|
ROB2 MN 4 A_TossGib
|
||||||
|
ROB2 O 4 A_Explode(64,64,1,1)
|
||||||
|
ROB2 P -1 A_CrusaderDeath
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Fast Flame Projectile (used by Crusader) ---------------------------------
|
||||||
|
|
||||||
|
ACTOR FastFlameMissile : FlameMissile
|
||||||
|
{
|
||||||
|
Mass 50
|
||||||
|
Damage 1
|
||||||
|
Speed 35
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crusader Missile ---------------------------------------------------------
|
||||||
|
// This is just like the mini missile the player shoots, except it doesn't
|
||||||
|
// explode when it dies, and it does slightly less damage for a direct hit.
|
||||||
|
|
||||||
|
ACTOR CrusaderMissile
|
||||||
|
{
|
||||||
|
Speed 20
|
||||||
|
Radius 10
|
||||||
|
Height 14
|
||||||
|
Damage 7
|
||||||
|
Projectile
|
||||||
|
+STRIFEDAMAGE
|
||||||
|
MaxStepHeight 4
|
||||||
|
SeeSound "crusader/misl"
|
||||||
|
DeathSound "crusader/mislx"
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
MICR A 6 Bright A_RocketInFlight
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
SMIS A 0 Bright A_SetTranslucent(1,1)
|
||||||
|
SMIS A 5 Bright A_StopSoundEx("Voice")
|
||||||
|
SMIS B 5 Bright
|
||||||
|
SMIS C 4 Bright
|
||||||
|
SMIS DEFG 2 Bright
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Dead Crusader ------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR DeadCrusader 22
|
||||||
|
{
|
||||||
|
Game Strife
|
||||||
|
ConversationID 230
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ROB2 N 4
|
||||||
|
ROB2 O 4
|
||||||
|
ROB2 P -1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
145
wadsrc/static/actors/strife/inquisitor.txt
Normal file
145
wadsrc/static/actors/strife/inquisitor.txt
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
|
||||||
|
// Inquisitor ---------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Inquisitor 16
|
||||||
|
{
|
||||||
|
Game Strife
|
||||||
|
ConversationID 93,-1,-1
|
||||||
|
Health 1000
|
||||||
|
Speed 12
|
||||||
|
Radius 40
|
||||||
|
Height 110
|
||||||
|
Mass 0x7fffffff
|
||||||
|
Monster
|
||||||
|
+DROPOFF
|
||||||
|
+NOBLOOD
|
||||||
|
+BOSS
|
||||||
|
+FLOORCLIP
|
||||||
|
+DONTMORPH
|
||||||
|
+NORADIUSDMG
|
||||||
|
MaxDropOffHeight 32
|
||||||
|
MinMissileChance 150
|
||||||
|
SeeSound "inquisitor/sight"
|
||||||
|
DeathSound "inquisitor/death"
|
||||||
|
ActiveSound "inquisitor/active"
|
||||||
|
Obituary "$OB_INQUISITOR"
|
||||||
|
|
||||||
|
action native A_InquisitorWalk ();
|
||||||
|
action native A_InquisitorDecide ();
|
||||||
|
action native A_InquisitorAttack ();
|
||||||
|
action native A_InquisitorJump ();
|
||||||
|
action native A_InquisitorCheckLand ();
|
||||||
|
action native A_TossArm ();
|
||||||
|
action native A_ReaverRanged ();
|
||||||
|
|
||||||
|
states
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ROB3 AB 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
ROB3 B 3 A_InquisitorWalk
|
||||||
|
ROB3 B 3 A_Chase
|
||||||
|
ROB3 CCDD 4 A_Chase
|
||||||
|
ROB3 E 3 A_InquisitorWalk
|
||||||
|
ROB3 E 3 A_InquisitorDecide
|
||||||
|
Loop
|
||||||
|
Missile:
|
||||||
|
ROB3 A 2 A_InquisitorDecide
|
||||||
|
ROB3 F 6 A_FaceTarget
|
||||||
|
ROB3 G 8 Bright A_ReaverRanged
|
||||||
|
ROB3 G 8 A_ReaverRanged
|
||||||
|
Goto See
|
||||||
|
Grenade:
|
||||||
|
ROB3 K 12 A_FaceTarget
|
||||||
|
ROB3 J 6 Bright A_InquisitorAttack
|
||||||
|
ROB3 K 12
|
||||||
|
Goto See
|
||||||
|
Jump:
|
||||||
|
ROB3 H 8 Bright A_InquisitorJump
|
||||||
|
ROB3 I 4 Bright A_InquisitorCheckLand
|
||||||
|
ROB3 H 4 Bright A_InquisitorCheckLand
|
||||||
|
Goto Jump+1
|
||||||
|
Death:
|
||||||
|
ROB3 L 0 A_StopSoundEx("Item")
|
||||||
|
ROB3 L 4 A_TossGib
|
||||||
|
ROB3 M 4 A_Scream
|
||||||
|
ROB3 N 4 A_TossGib
|
||||||
|
ROB3 O 4 Bright A_Explode(128,128,1,1)
|
||||||
|
ROB3 P 4 Bright A_TossGib
|
||||||
|
ROB3 Q 4 Bright A_NoBlocking
|
||||||
|
ROB3 RSTUV 4 A_TossGib
|
||||||
|
ROB3 W 4 Bright A_Explode(128,128,1,1)
|
||||||
|
ROB3 XY 4 Bright A_TossGib
|
||||||
|
ROB3 Z 4 A_TossGib
|
||||||
|
ROB3 "[" 4 A_TossGib
|
||||||
|
ROB3 "\" 3 A_TossGib
|
||||||
|
ROB3 "]" 3 Bright A_Explode(128,128,1,1)
|
||||||
|
RBB3 A 3 Bright A_TossArm
|
||||||
|
RBB3 B 3 Bright A_TossGib
|
||||||
|
RBB3 CD 3 A_TossGib
|
||||||
|
RBB3 E -1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inquisitor Shot ----------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR InquisitorShot
|
||||||
|
{
|
||||||
|
ConversationID 108,-1,-1
|
||||||
|
ReactionTime 15
|
||||||
|
Speed 25
|
||||||
|
Radius 13
|
||||||
|
Height 13
|
||||||
|
Mass 15
|
||||||
|
Projectile
|
||||||
|
-ACTIVATEIMPACT
|
||||||
|
-ACTIVATEPCROSS
|
||||||
|
-NOGRAVITY
|
||||||
|
+STRIFEDAMAGE
|
||||||
|
MaxStepHeight 4
|
||||||
|
SeeSound "inquisitor/attack"
|
||||||
|
DeathSound "inquisitor/atkexplode"
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
UBAM AB 3 A_Countdown
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
BNG2 A 0 Bright A_SetTranslucent(1,1)
|
||||||
|
BNG2 A 4 Bright A_Explode(192, 192, 1, 1)
|
||||||
|
BNG2 B 4 Bright
|
||||||
|
BNG2 C 4 Bright
|
||||||
|
BNG2 D 4 Bright
|
||||||
|
BNG2 E 4 Bright
|
||||||
|
BNG2 F 4 Bright
|
||||||
|
BNG2 G 4 Bright
|
||||||
|
BNG2 H 4 Bright
|
||||||
|
BNG2 I 4 Bright
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The Dead Inquisitor's Detached Arm ---------------------------------------
|
||||||
|
|
||||||
|
ACTOR InquisitorArm
|
||||||
|
{
|
||||||
|
ConversationID 94
|
||||||
|
Speed 25
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOCLIP
|
||||||
|
+NOBLOOD
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
RBB3 FG 5 Bright
|
||||||
|
RBB3 H -1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
277
wadsrc/static/actors/strife/spectral.txt
Normal file
277
wadsrc/static/actors/strife/spectral.txt
Normal file
|
@ -0,0 +1,277 @@
|
||||||
|
|
||||||
|
|
||||||
|
// base for all spectral monsters which hurt when being touched--------------
|
||||||
|
|
||||||
|
ACTOR SpectralMonster native
|
||||||
|
{
|
||||||
|
Monster
|
||||||
|
+SPECIAL
|
||||||
|
+SPECTRAL
|
||||||
|
+NOICEDEATH
|
||||||
|
|
||||||
|
action native A_SpectreChunkSmall ();
|
||||||
|
action native A_SpectreChunkLarge ();
|
||||||
|
action native A_Spectre2Attack ();
|
||||||
|
action native A_Spectre3Attack ();
|
||||||
|
action native A_Spectre4Attack ();
|
||||||
|
action native A_Spectre5Attack ();
|
||||||
|
action native A_SpotLightning ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Container for all spectral lightning deaths ------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningBase
|
||||||
|
{
|
||||||
|
+NOTELEPORT
|
||||||
|
+ACTIVATEIMPACT
|
||||||
|
+ACTIVATEPCROSS
|
||||||
|
+STRIFEDAMAGE
|
||||||
|
MaxStepHeight 4
|
||||||
|
RenderStyle Add
|
||||||
|
SeeSound "weapons/sigil"
|
||||||
|
DeathSound "weapons/sigilhit"
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Death:
|
||||||
|
ZAP1 B 3 A_Explode(32,32)
|
||||||
|
ZAP1 A 3 A_AlertMonsters
|
||||||
|
ZAP1 BCDEFE 3
|
||||||
|
ZAP1 DCB 2
|
||||||
|
ZAP1 A 1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning death that does not explode ---------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningDeath1 : SpectralLightningBase
|
||||||
|
{
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Death:
|
||||||
|
Goto Super::Death+1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning death that does not alert monsters --------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningDeath2 : SpectralLightningBase
|
||||||
|
{
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Death:
|
||||||
|
Goto Super::Death+2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning death that is shorter than the rest -------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningDeathShort : SpectralLightningBase
|
||||||
|
{
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Death:
|
||||||
|
Goto Super::Death+6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning (Ball Shaped #1) --------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningBall1 : SpectralLightningBase
|
||||||
|
{
|
||||||
|
ConversationID 80,-1,-1
|
||||||
|
Speed 30
|
||||||
|
Radius 8
|
||||||
|
Height 16
|
||||||
|
Damage 70
|
||||||
|
Projectile
|
||||||
|
+SPECTRAL
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ZOT3 ABCDE 4 Bright
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning (Ball Shaped #2) --------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningBall2 : SpectralLightningBall1
|
||||||
|
{
|
||||||
|
ConversationID 81,-1,-1
|
||||||
|
Damage 20
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning (Horizontal #1) ---------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningH1 : SpectralLightningBase
|
||||||
|
{
|
||||||
|
ConversationID 78,-1,-1
|
||||||
|
Speed 30
|
||||||
|
Radius 8
|
||||||
|
Height 16
|
||||||
|
Damage 70
|
||||||
|
Projectile
|
||||||
|
+SPECTRAL
|
||||||
|
|
||||||
|
action native A_SpectralLightningTail ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ZAP6 A 4 Bright
|
||||||
|
ZAP6 BC 4 Bright A_SpectralLightningTail
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Spectral Lightning (Horizontal #2) -------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningH2 : SpectralLightningH1
|
||||||
|
{
|
||||||
|
ConversationID 79,-1,-1
|
||||||
|
Damage 20
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning (Horizontal #3) -------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningH3 : SpectralLightningH1
|
||||||
|
{
|
||||||
|
ConversationID 82,-1,-1
|
||||||
|
Damage 10
|
||||||
|
}
|
||||||
|
|
||||||
|
// ASpectralLightningHTail --------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningHTail
|
||||||
|
{
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOGRAVITY
|
||||||
|
+DROPOFF
|
||||||
|
RenderStyle Add
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ZAP6 ABC 5 Bright
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spectral Lightning (Big Ball #1) -----------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningBigBall1 : SpectralLightningDeath2
|
||||||
|
{
|
||||||
|
ConversationID 84,-1,-1
|
||||||
|
Speed 18
|
||||||
|
Radius 20
|
||||||
|
Height 40
|
||||||
|
Damage 130
|
||||||
|
Projectile
|
||||||
|
+SPECTRAL
|
||||||
|
|
||||||
|
action native A_SpectralBigBallLightning ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ZAP7 AB 4 Bright A_SpectralBigBallLightning
|
||||||
|
ZAP7 CDE 6 Bright A_SpectralBigBallLightning
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Spectral Lightning (Big Ball #2 - less damaging) -------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningBigBall2 : SpectralLightningBigBall1
|
||||||
|
{
|
||||||
|
ConversationID 85,-1,-1
|
||||||
|
Damage 30
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sigil Lightning (Vertical #1) --------------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningV1 : SpectralLightningDeathShort
|
||||||
|
{
|
||||||
|
ConversationID 86,-1,-1
|
||||||
|
Speed 22
|
||||||
|
Radius 8
|
||||||
|
Height 24
|
||||||
|
Damage 100
|
||||||
|
Projectile
|
||||||
|
+SPECTRAL
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ZOT1 AB 4 Bright
|
||||||
|
ZOT1 CDE 6 Bright
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sigil Lightning (Vertical #2 - less damaging) ----------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningV2 : SpectralLightningV1
|
||||||
|
{
|
||||||
|
ConversationID 87,-1,-1
|
||||||
|
Damage 50
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sigil Lightning Spot (roams around dropping lightning from above) --------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningSpot : SpectralLightningDeath1
|
||||||
|
{
|
||||||
|
ConversationID 88,-1,-1
|
||||||
|
Speed 18
|
||||||
|
ReactionTime 70
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOBLOCKMONST
|
||||||
|
+NODROPOFF
|
||||||
|
RenderStyle Translucent
|
||||||
|
Alpha 0.6
|
||||||
|
|
||||||
|
action native A_SpectralLightning ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ZAP5 A 4 Bright A_Countdown
|
||||||
|
ZAP5 B 4 Bright A_SpectralLightning
|
||||||
|
ZAP5 CD 4 Bright A_Countdown
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sigil Lightning (Big Vertical #1) ----------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningBigV1 : SpectralLightningDeath1
|
||||||
|
{
|
||||||
|
ConversationID 89,-1,-1
|
||||||
|
Speed 28
|
||||||
|
Radius 8
|
||||||
|
Height 16
|
||||||
|
Damage 120
|
||||||
|
Projectile
|
||||||
|
+SPECTRAL
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
ZOT2 ABCDE 4 Bright A_Tracer2
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actor 90 -----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR SpectralLightningBigV2 : SpectralLightningBigV1
|
||||||
|
{
|
||||||
|
ConversationID 90, -1, -1
|
||||||
|
Damage 60
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,12 +79,9 @@ ACTOR BishopMissile
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
Spawn:
|
Spawn:
|
||||||
MISS A 4 Bright
|
MISS A 4 Bright A_RocketInFlight
|
||||||
MISS B 3 Bright A_Tracer2
|
MISS B 3 Bright A_Tracer2
|
||||||
MISS A 0 Bright A_PlaySoundEx("misc/missileinflight", "Voice")
|
Loop
|
||||||
MISS A 0 Bright A_SpawnItemEx("MiniMissilePuff", 0,0, random2[BishopMissile]()*0.015625)
|
|
||||||
MISS A 4 Bright A_SpawnItemEx("RocketTrail", -momx,-momy,0, 0,0,1)
|
|
||||||
Goto Spawn+1
|
|
||||||
Death:
|
Death:
|
||||||
SMIS A 0 Bright A_SetTranslucent(1,1)
|
SMIS A 0 Bright A_SetTranslucent(1,1)
|
||||||
SMIS A 0 Bright A_StopSoundEx("Voice")
|
SMIS A 0 Bright A_StopSoundEx("Voice")
|
||||||
|
|
|
@ -98,8 +98,11 @@
|
||||||
#include "actors/hexen/clericstaff.txt"
|
#include "actors/hexen/clericstaff.txt"
|
||||||
|
|
||||||
#include "actors/strife/strifeplayer.txt"
|
#include "actors/strife/strifeplayer.txt"
|
||||||
|
#include "actors/strife/spectral.txt"
|
||||||
#include "actors/strife/acolyte.txt"
|
#include "actors/strife/acolyte.txt"
|
||||||
#include "actors/strife/beggars.txt"
|
#include "actors/strife/beggars.txt"
|
||||||
|
#include "actors/strife/crusader.txt"
|
||||||
|
#include "actors/strife/inquisitor.txt"
|
||||||
#include "actors/strife/merchants.txt"
|
#include "actors/strife/merchants.txt"
|
||||||
#include "actors/strife/peasants.txt"
|
#include "actors/strife/peasants.txt"
|
||||||
#include "actors/strife/strifebishop.txt"
|
#include "actors/strife/strifebishop.txt"
|
||||||
|
|
Loading…
Reference in a new issue