- Converted Strife's Crusader, Inquisitor and spectral missiles to

DECORATE.


SVN r1114 (trunk)
This commit is contained in:
Christoph Oelckers 2008-08-05 22:51:51 +00:00
parent fe2e64aa40
commit 4f0fa50773
20 changed files with 659 additions and 753 deletions

View file

@ -1,4 +1,6 @@
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
DECORATE.
- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris.

View file

@ -244,6 +244,28 @@ ACTOR(AcolyteDie)
ACTOR(HideDecepticon)
ACTOR(Beacon)
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!
ACTOR(ItBurnsItBurns)

View file

@ -26,7 +26,7 @@ void A_AlienSpectreDeath (AActor *);
void A_AlertMonsters (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 -----------------------------------------------------------
@ -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)
{
GenericSpectreSpawn (actor, RUNTIME_CLASS(AAlienSpectre3));
@ -413,7 +408,7 @@ void A_Spectre4Attack (AActor *self)
if (self->target != NULL)
{
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)
{
missile->tracer = self->target;
@ -428,7 +423,7 @@ void A_Spectre2Attack (AActor *self)
if (self->target != NULL)
{
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)
{
missile->health = -2;
@ -442,7 +437,7 @@ void A_Spectre5Attack (AActor *self)
if (self->target != NULL)
{
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)
{
missile->health = -2;
@ -456,7 +451,7 @@ void A_Spectre3Attack (AActor *self)
if (self->target == NULL)
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->target = self;
@ -467,7 +462,7 @@ void A_Spectre3Attack (AActor *self)
for (int i = 0; i < 20; ++i)
{
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;
}
@ -497,18 +492,20 @@ void A_AlienSpectreDeath (AActor *self)
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);
log = 95;
}
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre2))
{
break;
case NAME_AlienSpectre2:
C_MidPrint(GStrings("TXT_KILLED_BISHOP"));
log = 74;
player->GiveInventoryType (QuestItemClasses[20]);
}
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre3))
break;
case NAME_AlienSpectre3:
{
C_MidPrint(GStrings("TXT_KILLED_ORACLE"));
// If there are any Oracles still alive, kill them.
@ -537,9 +534,10 @@ void A_AlienSpectreDeath (AActor *self)
log = 85;
}
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"));
player->GiveInventoryType (QuestItemClasses[23]);
if (player->FindInventory (QuestItemClasses[24]) == NULL)
@ -550,9 +548,9 @@ void A_AlienSpectreDeath (AActor *self)
{ // Back to the factory for another Sigil!
log = 106;
}
}
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre5))
{
break;
case NAME_AlienSpectre5:
C_MidPrint(GStrings("TXT_KILLED_LOREMASTER"));
ASigil *sigil;
@ -572,9 +570,9 @@ void A_AlienSpectreDeath (AActor *self)
log = 83;
}
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false);
}
else
{
break;
default:
return;
}
mysnprintf (voc, countof(voc), "svox/voc%d", log);

View file

@ -6,152 +6,6 @@
#include "s_sound.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)
{
if (P_CheckSight (self, self->target) && self->reactiontime == 0)
@ -170,18 +24,18 @@ void A_CrusaderChoose (AActor *self)
{
A_FaceTarget (self);
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
{
if (P_CheckMissileRange (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;
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;
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->reactiontime += 15;
}
@ -192,7 +46,7 @@ void A_CrusaderChoose (AActor *self)
void A_CrusaderSweepLeft (AActor *self)
{
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)
{
misl->momz += FRACUNIT;
@ -202,7 +56,7 @@ void A_CrusaderSweepLeft (AActor *self)
void A_CrusaderSweepRight (AActor *self)
{
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)
{
misl->momz += FRACUNIT;
@ -226,28 +80,3 @@ void A_CrusaderDeath (AActor *self)
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

View file

@ -7,177 +7,6 @@
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)
{
S_Sound (self, CHAN_BODY, "inquisitor/walk", 1, ATTN_NORM);
@ -201,13 +30,13 @@ void A_InquisitorDecide (AActor *self)
A_FaceTarget (self);
if (!InquisitorCheckDistance (self))
{
self->SetState (&AInquisitor::States[S_INQ_ATK2]);
self->SetState (self->FindState("Grenade"));
}
if (self->target->z != self->z)
{
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->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)
{
proj->momz += 9*FRACUNIT;
}
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)
{
proj->momz += 16*FRACUNIT;
@ -275,7 +104,7 @@ void A_InquisitorCheckLand (AActor *self)
self->SetState (self->SeeState);
self->reactiontime = 0;
self->flags &= ~MF_NOGRAVITY;
A_ShutUp (self);
S_StopSound (self, CHAN_ITEM);
return;
}
if (!S_IsActorPlayingSomething (self, CHAN_ITEM, -1))
@ -287,14 +116,10 @@ void A_InquisitorCheckLand (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->momx = FixedMul (foo->Speed, finecosine[foo->angle >> ANGLETOFINESHIFT]) >> 3;
foo->momy = FixedMul (foo->Speed, finesine[foo->angle >> ANGLETOFINESHIFT]) >> 3;
foo->momz = pr_inq() << 10;
}
void A_ShutUp (AActor *self)
{
S_StopSound (self, CHAN_ITEM);
}

View file

@ -164,7 +164,7 @@ void AMacil2::NoBlockingSet ()
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 Super::TakeSpecialDamage(inflictor, source, damage, damagetype);

View file

@ -81,7 +81,7 @@ void A_WakeOracleSpectre (AActor *self)
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 Super::TakeSpecialDamage(inflictor, source, damage, damagetype);
}

View file

@ -248,7 +248,7 @@ void A_SpotLightning (AActor *self)
if (self->target == NULL)
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)
{
spot->threshold = 25;

View file

@ -7,284 +7,44 @@
#include "m_random.h"
#include "a_strifeglobal.h"
void A_SpectralLightning (AActor *);
AActor *P_SpawnSubMissile (AActor *source, const PClass *type, AActor *target);
void A_AlertMonsters (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[] =
class ASpectralMonster : public AActor
{
S_NORMAL (ZAP1, 'B', 3, A_Explode, &States[1]),
S_NORMAL (ZAP1, 'A', 3, A_AlertMonsters, &States[2]),
S_NORMAL (ZAP1, 'B', 3, NULL, &States[3]),
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),
DECLARE_CLASS (ASpectralMonster, AActor)
public:
void Touch (AActor *toucher);
};
IMPLEMENT_ACTOR (ASpectralLightningBase, Strife, -1, 0)
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
IMPLEMENT_CLASS (ASpectralMonster)
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)
{
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->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)
{
const PClass *cls = PClass::FindClass("SpectralLightningH3");
if (cls)
{
self->angle += ANGLE_90;
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
P_SpawnSubMissile (self, cls, self->target);
self->angle += ANGLE_180;
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
P_SpawnSubMissile (self, cls, self->target);
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");
@ -302,14 +62,14 @@ void A_SpectralLightning (AActor *self)
x = self->x + pr_zap5.Random2(3) * FRACUNIT * 50;
y = self->y + pr_zap5.Random2(3) * FRACUNIT * 50;
flash = Spawn (self->threshold > 25 ? RUNTIME_CLASS(ASpectralLightningV2) :
RUNTIME_CLASS(ASpectralLightningV1), x, y, ONCEILINGZ, ALLOW_REPLACE);
flash = Spawn (self->threshold > 25 ? PClass::FindClass("SpectralLightningV2") :
PClass::FindClass("SpectralLightningV1"), x, y, ONCEILINGZ, ALLOW_REPLACE);
flash->target = self->target;
flash->momz = -18*FRACUNIT;
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->momz = -18*FRACUNIT;

View file

@ -113,94 +113,4 @@ public:
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

View file

@ -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)
{
@ -1393,7 +1393,7 @@ void A_MaulerTorpedoWave (AActor *self)
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);
@ -2212,7 +2212,7 @@ void A_FireSigil1 (AActor *actor)
P_BulletSlope (actor, &linetarget);
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)
{
spot->tracer = linetarget;
@ -2220,7 +2220,7 @@ void A_FireSigil1 (AActor *actor)
}
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)
{
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);
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)
{
actor->angle += ANGLE_180/20;
spot = P_SpawnSubMissile (actor, RUNTIME_CLASS(ASpectralLightningBall1), actor);
spot = P_SpawnSubMissile (actor, PClass::FindClass("SpectralLightningBall1"), actor);
if (spot != NULL)
{
spot->z = actor->z + 32*FRACUNIT;
@ -2305,7 +2305,7 @@ void A_FireSigil4 (AActor *actor)
P_BulletSlope (actor, &linetarget);
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)
{
spot->tracer = linetarget;
@ -2313,7 +2313,7 @@ void A_FireSigil4 (AActor *actor)
}
else
{
spot = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningBigV1));
spot = P_SpawnPlayerMissile (actor, PClass::FindClass("SpectralLightningBigV1"));
if (spot != NULL)
{
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);
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningBigBall1));
P_SpawnPlayerMissile (actor, PClass::FindClass("SpectralLightningBigBall1"));
}
//============================================================================

View file

@ -123,6 +123,14 @@ xx(StrifeGrenadeLauncher)
xx(Mauler)
xx(AcolyteBlue)
xx(SpectralLightningV1)
// Strife's spectres
xx(AlienSpectre1)
xx(AlienSpectre2)
xx(AlienSpectre3)
xx(AlienSpectre4)
xx(AlienSpectre5)
xx(Chicken)
xx(Pig)

View file

@ -105,6 +105,7 @@ enum
static flagdef ActorFlags[]=
{
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
DEFINE_FLAG(MF, SPECIAL, APlayerPawn, flags),
DEFINE_FLAG(MF, SOLID, AActor, flags),
DEFINE_FLAG(MF, SHOOTABLE, AActor, flags),
DEFINE_FLAG(MF, NOSECTOR, AActor, flags),

View file

@ -75,7 +75,7 @@
// SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 1107
#define MINSAVEVER 1114
#if SVN_REVISION_NUMBER < MINSAVEVER
// Never write a savegame with a version lower than what we need

View file

@ -181,6 +181,7 @@ class Actor extends Thinker
action native A_Feathers();
action native A_ClassBossHealth();
action native A_ShootGun();
action native A_RocketInFlight();
}
class Inventory extends Actor

View 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
}
}

View 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
}
}

View 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
}

View file

@ -79,12 +79,9 @@ ACTOR BishopMissile
States
{
Spawn:
MISS A 4 Bright
MISS A 4 Bright A_RocketInFlight
MISS B 3 Bright A_Tracer2
MISS A 0 Bright A_PlaySoundEx("misc/missileinflight", "Voice")
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
Loop
Death:
SMIS A 0 Bright A_SetTranslucent(1,1)
SMIS A 0 Bright A_StopSoundEx("Voice")

View file

@ -98,8 +98,11 @@
#include "actors/hexen/clericstaff.txt"
#include "actors/strife/strifeplayer.txt"
#include "actors/strife/spectral.txt"
#include "actors/strife/acolyte.txt"
#include "actors/strife/beggars.txt"
#include "actors/strife/crusader.txt"
#include "actors/strife/inquisitor.txt"
#include "actors/strife/merchants.txt"
#include "actors/strife/peasants.txt"
#include "actors/strife/strifebishop.txt"