- Converted Strife's Acolytes, Rebels, Sentinel, Reaver and Templar to

DECORATE.


SVN r1113 (trunk)
This commit is contained in:
Christoph Oelckers 2008-08-05 17:58:38 +00:00
parent 43715c5249
commit fe2e64aa40
19 changed files with 618 additions and 887 deletions

View file

@ -1,4 +1,6 @@
August 5, 2008 (Changes by Graf Zahl)
- Converted Strife's Acolytes, Rebels, Sentinel, Reaver and Templar to
DECORATE.
- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris.
- Added a check to Zipdir that excludes files with a .orig extension. These
can be left behind by patch.exe and create problems.

View file

@ -235,6 +235,16 @@ ACTOR(ClericAttack)
ACTOR(FighterAttack)
ACTOR(MageAttack)
ACTOR(TemplarAttack)
ACTOR(SentinelAttack)
ACTOR(ReaverRanged)
ACTOR(BeShadowyFoe)
ACTOR(AcolyteBits)
ACTOR(AcolyteDie)
ACTOR(HideDecepticon)
ACTOR(Beacon)
ACTOR(ShootGun)
// Special code pointers for Strife's player - not to be used elsewhere!
ACTOR(ItBurnsItBurns)
ACTOR(CrispyPlayer)

View file

@ -6,321 +6,6 @@
#include "s_sound.h"
#include "a_strifeglobal.h"
#include "doomdata.h"
#include "r_translate.h"
void A_BeShadowyFoe (AActor *);
void A_AcolyteBits (AActor *);
void A_AcolyteDie (AActor *);
void A_HideDecepticon (AActor *);
void A_ShootGun (AActor *);
void A_TossGib (AActor *);
void A_ClearShadow (AActor *);
void A_SetShadow (AActor *);
// Base class for the acolytes ----------------------------------------------
class AAcolyte : public AStrifeHumanoid
{
DECLARE_ACTOR (AAcolyte, AStrifeHumanoid)
};
FState AAcolyte::States[] =
{
#define S_ACOLYTE_STND 0
S_NORMAL (AGRD, 'A', 5, A_Look2, &States[S_ACOLYTE_STND]),
S_NORMAL (AGRD, 'B', 8, A_ClearShadow, &States[S_ACOLYTE_STND]),
S_NORMAL (AGRD, 'D', 8, NULL, &States[S_ACOLYTE_STND]),
#define S_ACOLYTE_WANDER (S_ACOLYTE_STND+3)
S_NORMAL (AGRD, 'A', 5, A_Wander, &States[S_ACOLYTE_WANDER+1]),
S_NORMAL (AGRD, 'B', 5, A_Wander, &States[S_ACOLYTE_WANDER+2]),
S_NORMAL (AGRD, 'C', 5, A_Wander, &States[S_ACOLYTE_WANDER+3]),
S_NORMAL (AGRD, 'D', 5, A_Wander, &States[S_ACOLYTE_WANDER+4]),
S_NORMAL (AGRD, 'A', 5, A_Wander, &States[S_ACOLYTE_WANDER+5]),
S_NORMAL (AGRD, 'B', 5, A_Wander, &States[S_ACOLYTE_WANDER+6]),
S_NORMAL (AGRD, 'C', 5, A_Wander, &States[S_ACOLYTE_WANDER+7]),
S_NORMAL (AGRD, 'D', 5, A_Wander, &States[S_ACOLYTE_STND]),
#define S_ACOLYTE_ALTCHASE (S_ACOLYTE_WANDER+8)
S_NORMAL (AGRD, 'A', 6, A_BeShadowyFoe, &States[S_ACOLYTE_ALTCHASE+2]),
#define S_ACOLYTE_CHASE (S_ACOLYTE_ALTCHASE+1)
S_NORMAL (AGRD, 'A', 6, A_AcolyteBits, &States[S_ACOLYTE_CHASE+1]),
S_NORMAL (AGRD, 'B', 6, A_Chase, &States[S_ACOLYTE_CHASE+2]),
S_NORMAL (AGRD, 'C', 6, A_Chase, &States[S_ACOLYTE_CHASE+3]),
S_NORMAL (AGRD, 'D', 6, A_Chase, &States[S_ACOLYTE_CHASE]),
#define S_ACOLYTE_ATK (S_ACOLYTE_CHASE+4)
S_NORMAL (AGRD, 'E', 8, A_FaceTarget, &States[S_ACOLYTE_ATK+1]),
S_NORMAL (AGRD, 'F', 4, A_ShootGun, &States[S_ACOLYTE_ATK+2]),
S_NORMAL (AGRD, 'E', 4, A_ShootGun, &States[S_ACOLYTE_ATK+3]),
S_NORMAL (AGRD, 'F', 6, A_ShootGun, &States[S_ACOLYTE_CHASE]),
#define S_ACOLYTE_ALTPAIN (S_ACOLYTE_ATK+4)
S_NORMAL (AGRD, 'O', 0, A_SetShadow, &States[S_ACOLYTE_ALTPAIN+1]),
S_NORMAL (AGRD, 'O', 8, A_Pain, &States[S_ACOLYTE_ALTCHASE]),
#define S_ACOLYTE_PAIN (S_ACOLYTE_ALTPAIN+2)
S_NORMAL (AGRD, 'O', 8, A_Pain, &States[S_ACOLYTE_CHASE]),
#define S_ACOLYTE_DIE (S_ACOLYTE_PAIN+1)
S_NORMAL (AGRD, 'G', 4, NULL, &States[S_ACOLYTE_DIE+1]),
S_NORMAL (AGRD, 'H', 4, A_Scream, &States[S_ACOLYTE_DIE+2]),
S_NORMAL (AGRD, 'I', 4, NULL, &States[S_ACOLYTE_DIE+3]),
S_NORMAL (AGRD, 'J', 3, NULL, &States[S_ACOLYTE_DIE+4]),
S_NORMAL (AGRD, 'K', 3, A_NoBlocking, &States[S_ACOLYTE_DIE+5]),
S_NORMAL (AGRD, 'L', 3, NULL, &States[S_ACOLYTE_DIE+6]),
S_NORMAL (AGRD, 'M', 3, A_AcolyteDie, &States[S_ACOLYTE_DIE+7]),
S_NORMAL (AGRD, 'N', 1400, NULL, NULL),
#define S_ACOLYTE_XDIE (S_ACOLYTE_DIE+8)
S_NORMAL (GIBS, 'A', 5, A_NoBlocking, &States[S_ACOLYTE_XDIE+1]),
S_NORMAL (GIBS, 'B', 5, A_TossGib, &States[S_ACOLYTE_XDIE+2]),
S_NORMAL (GIBS, 'C', 5, A_TossGib, &States[S_ACOLYTE_XDIE+3]),
S_NORMAL (GIBS, 'D', 4, A_TossGib, &States[S_ACOLYTE_XDIE+4]),
S_NORMAL (GIBS, 'E', 4, A_XScream, &States[S_ACOLYTE_XDIE+5]),
S_NORMAL (GIBS, 'F', 4, A_TossGib, &States[S_ACOLYTE_XDIE+6]),
S_NORMAL (GIBS, 'G', 4, NULL, &States[S_ACOLYTE_XDIE+7]),
S_NORMAL (GIBS, 'H', 4, NULL, &States[S_ACOLYTE_XDIE+8]),
S_NORMAL (GIBS, 'I', 5, NULL, &States[S_ACOLYTE_XDIE+9]),
S_NORMAL (GIBS, 'J', 5, A_AcolyteDie, &States[S_ACOLYTE_XDIE+10]),
S_NORMAL (GIBS, 'K', 5, NULL, &States[S_ACOLYTE_XDIE+11]),
S_NORMAL (GIBS, 'L', 1400, NULL, NULL),
};
IMPLEMENT_ACTOR (AAcolyte, Strife, -1, 0)
PROP_SpawnState (S_ACOLYTE_STND)
PROP_SeeState (S_ACOLYTE_CHASE)
PROP_PainState (S_ACOLYTE_PAIN)
PROP_MissileState (S_ACOLYTE_ATK)
PROP_DeathState (S_ACOLYTE_DIE)
PROP_XDeathState (S_ACOLYTE_XDIE)
PROP_SpawnHealth (70)
PROP_PainChance (150)
PROP_SpeedFixed (7)
PROP_RadiusFixed (24)
PROP_HeightFixed (64)
PROP_Mass (400)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags4 (MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_MinMissileChance (150)
PROP_Tag ("ACOLYTE")
PROP_SeeSound ("acolyte/sight")
PROP_PainSound ("acolyte/pain")
PROP_AttackSound ("acolyte/rifle")
PROP_DeathSound ("acolyte/death")
PROP_ActiveSound ("acolyte/active")
PROP_Obituary ("$OB_ACOLYTE")
END_DEFAULTS
// Acolyte 1 ----------------------------------------------------------------
class AAcolyteTan : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteTan, AAcolyte)
public:
void NoBlockingSet ();
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteTan, Strife, 3002, 0)
PROP_StrifeType (53)
PROP_StrifeTeaserType (52)
PROP_StrifeTeaserType2 (53)
PROP_Flags4 (MF4_MISSILEMORE|MF4_MISSILEEVENMORE|MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
//============================================================================
//
// AAcolyteTan :: NoBlockingSet
//
// This and the shadow acolyte are the only ones that drop clips by default.
//
//============================================================================
void AAcolyteTan::NoBlockingSet ()
{
P_DropItem (this, "ClipOfBullets", -1, 256);
}
// Acolyte 2 ----------------------------------------------------------------
class AAcolyteRed : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteRed, AAcolyte)
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteRed, Strife, 142, 0)
PROP_Translation (TRANSLATION_Standard, 0)
PROP_StrifeType (54)
PROP_StrifeTeaserType (53)
PROP_StrifeTeaserType2 (54)
PROP_Flags4 (MF4_MISSILEMORE|MF4_MISSILEEVENMORE|MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
// Acolyte 3 ----------------------------------------------------------------
class AAcolyteRust : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteRust, AAcolyte)
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteRust, Strife, 143, 0)
PROP_Translation (TRANSLATION_Standard, 1)
PROP_StrifeType (55)
PROP_StrifeTeaserType (54)
PROP_StrifeTeaserType2 (55)
PROP_Flags4 (MF4_MISSILEMORE|MF4_MISSILEEVENMORE|MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
// Acolyte 4 ----------------------------------------------------------------
class AAcolyteGray : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteGray, AAcolyte)
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteGray, Strife, 146, 0)
PROP_Translation (TRANSLATION_Standard, 2)
PROP_StrifeType (56)
PROP_StrifeTeaserType (55)
PROP_StrifeTeaserType2 (56)
PROP_Flags4 (MF4_MISSILEMORE|MF4_MISSILEEVENMORE|MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
// Acolyte 5 ----------------------------------------------------------------
class AAcolyteDGreen : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteDGreen, AAcolyte)
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteDGreen, Strife, 147, 0)
PROP_Translation (TRANSLATION_Standard, 3)
PROP_StrifeType (57)
PROP_StrifeTeaserType (56)
PROP_StrifeTeaserType2 (57)
PROP_Flags4 (MF4_MISSILEMORE|MF4_MISSILEEVENMORE|MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
// Acolyte 6 ----------------------------------------------------------------
class AAcolyteGold : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteGold, AAcolyte)
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteGold, Strife, 148, 0)
PROP_Translation (TRANSLATION_Standard, 4)
PROP_StrifeType (58)
PROP_StrifeTeaserType (57)
PROP_StrifeTeaserType2 (58)
PROP_Flags4 (MF4_MISSILEMORE|MF4_MISSILEEVENMORE|MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
// Acolyte 7 ----------------------------------------------------------------
class AAcolyteLGreen : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteLGreen, AAcolyte)
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteLGreen, Strife, 232, 0)
PROP_Translation (TRANSLATION_Standard, 5)
PROP_SpawnHealth (60)
PROP_StrifeType (59)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
// Acolyte 8 ----------------------------------------------------------------
class AAcolyteBlue : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteBlue, AAcolyte)
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteBlue, Strife, 231, 0)
PROP_Translation (TRANSLATION_Standard, 6)
PROP_SpawnHealth (60)
PROP_StrifeType (60)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
// Shadow Acolyte -----------------------------------------------------------
class AAcolyteShadow : public AAcolyte
{
DECLARE_STATELESS_ACTOR (AAcolyteShadow, AAcolyte)
public:
void NoBlockingSet ();
};
IMPLEMENT_STATELESS_ACTOR (AAcolyteShadow, Strife, 58, 0)
PROP_SeeState (S_ACOLYTE_ALTCHASE)
PROP_PainState (S_ACOLYTE_ALTPAIN)
PROP_StrifeType (61)
PROP_StrifeTeaserType (58)
PROP_StrifeTeaserType2 (59)
PROP_Flags4 (MF4_MISSILEMORE|MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_Tag ("ACOLYTE")
END_DEFAULTS
//============================================================================
//
// AAcolyteShadow :: NoBlockingSet
//
// This and the tan acolyte are the only ones that drop clips by default.
//
//============================================================================
void AAcolyteShadow::NoBlockingSet ()
{
P_DropItem (this, "ClipOfBullets", -1, 256);
}
// Some guy turning into an acolyte -----------------------------------------
class AAcolyteToBe : public AAcolyte
{
DECLARE_ACTOR (AAcolyteToBe, AAcolyte)
};
FState AAcolyteToBe::States[] =
{
#define S_BECOMING_STND 0
S_NORMAL (ARMR, 'A', -1, NULL, NULL),
#define S_BECOMING_PAIN (S_BECOMING_STND+1)
S_NORMAL (ARMR, 'A', -1, A_HideDecepticon, NULL),
#define S_BECOMING_DIEJUMP (S_BECOMING_PAIN+1)
S_NORMAL (GIBS, 'A', 0, NULL, &AAcolyte::States[S_ACOLYTE_XDIE]),
};
IMPLEMENT_ACTOR (AAcolyteToBe, Strife, 201, 0)
PROP_SpawnState (S_BECOMING_STND)
PROP_PainState (S_BECOMING_PAIN)
PROP_DeathState (S_BECOMING_DIEJUMP)
PROP_FlagsClear (MF_COUNTKILL)
PROP_SpawnHealth (61)
PROP_PainChance (255)
PROP_RadiusFixed (20)
PROP_HeightFixed (56)
PROP_StrifeType (29)
PROP_DeathSound ("becoming/death")
END_DEFAULTS
//============================================================================
//
@ -359,7 +44,7 @@ void A_AcolyteDie (AActor *self)
self->RenderStyle = STYLE_Normal;
// Only the Blue Acolyte does extra stuff on death.
if (!self->IsKindOf (RUNTIME_CLASS(AAcolyteBlue)))
if (self->GetClass()->TypeName != NAME_AcolyteBlue)
return;
// Make sure somebody is still alive
@ -372,7 +57,7 @@ void A_AcolyteDie (AActor *self)
return;
// Make sure all the other blue acolytes are dead.
TThinkerIterator<AAcolyteBlue> iterator;
TThinkerIterator<AActor> iterator(NAME_AcolyteBlue);
AActor *other;
while ( (other = iterator.Next ()) )

View file

@ -6,126 +6,8 @@
#include "p_local.h"
#include "a_strifeglobal.h"
void A_TossGib (AActor *);
void A_XXScream (AActor *);
static FRandom pr_reaverattack ("ReaverAttack");
// Reaver -------------------------------------------------------------------
void A_ReaverMelee (AActor *self);
void A_ReaverRanged (AActor *self);
void A_21230 (AActor *) {}
class AReaver : public AActor
{
DECLARE_ACTOR (AReaver, AActor)
public:
void GetExplodeParms (int &damage, int &dist, bool &hurtSource)
{
damage = dist = 32;
}
};
FState AReaver::States[] =
{
#define S_REAVER_STND (0)
S_NORMAL (ROB1, 'A', 10, A_Look, &States[S_REAVER_STND]),
// Needless duplication of the previous state removed
#define S_REAVER_RUN (S_REAVER_STND+1)
S_NORMAL (ROB1, 'B', 3, A_Chase, &States[S_REAVER_RUN+1]),
S_NORMAL (ROB1, 'B', 3, A_Chase, &States[S_REAVER_RUN+2]),
S_NORMAL (ROB1, 'C', 3, A_Chase, &States[S_REAVER_RUN+3]),
S_NORMAL (ROB1, 'C', 3, A_Chase, &States[S_REAVER_RUN+4]),
S_NORMAL (ROB1, 'D', 3, A_Chase, &States[S_REAVER_RUN+5]),
S_NORMAL (ROB1, 'D', 3, A_Chase, &States[S_REAVER_RUN+6]),
S_NORMAL (ROB1, 'E', 3, A_Chase, &States[S_REAVER_RUN+7]),
S_NORMAL (ROB1, 'E', 3, A_Chase, &States[S_REAVER_RUN]),
#define S_REAVER_MELEE (S_REAVER_RUN+8)
S_NORMAL (ROB1, 'H', 6, A_FaceTarget, &States[S_REAVER_MELEE+1]),
S_NORMAL (ROB1, 'I', 8, A_ReaverMelee, &States[S_REAVER_MELEE+2]),
S_NORMAL (ROB1, 'H', 6, NULL, &States[S_REAVER_RUN]),
#define S_REAVER_MISSILE (S_REAVER_MELEE+3)
S_NORMAL (ROB1, 'F', 8, A_FaceTarget, &States[S_REAVER_MISSILE+1]),
S_BRIGHT (ROB1, 'G', 11, A_ReaverRanged, &States[S_REAVER_RUN]),
#define S_REAVER_PAIN (S_REAVER_MISSILE+2)
S_NORMAL (ROB1, 'A', 2, NULL, &States[S_REAVER_PAIN+1]),
S_NORMAL (ROB1, 'A', 2, A_Pain, &States[S_REAVER_RUN]),
#define S_REAVER_DEATH (S_REAVER_PAIN+2)
S_BRIGHT (ROB1, 'J', 6, NULL, &States[S_REAVER_DEATH+1]),
S_BRIGHT (ROB1, 'K', 6, A_Scream, &States[S_REAVER_DEATH+2]),
S_BRIGHT (ROB1, 'L', 5, NULL, &States[S_REAVER_DEATH+3]),
S_BRIGHT (ROB1, 'M', 5, A_NoBlocking, &States[S_REAVER_DEATH+4]),
S_BRIGHT (ROB1, 'N', 5, NULL, &States[S_REAVER_DEATH+5]),
S_BRIGHT (ROB1, 'O', 5, NULL, &States[S_REAVER_DEATH+6]),
S_BRIGHT (ROB1, 'P', 5, NULL, &States[S_REAVER_DEATH+7]),
S_BRIGHT (ROB1, 'Q', 6, A_ExplodeAndAlert, &States[S_REAVER_DEATH+8]),
S_NORMAL (ROB1, 'R', -1, NULL, NULL),
#define S_REAVER_XDEATH (S_REAVER_DEATH+9)
S_BRIGHT (ROB1, 'L', 5, A_TossGib, &States[S_REAVER_XDEATH+1]),
S_BRIGHT (ROB1, 'M', 5, A_XXScream, &States[S_REAVER_XDEATH+2]),
S_BRIGHT (ROB1, 'N', 5, A_TossGib, &States[S_REAVER_XDEATH+3]),
S_BRIGHT (ROB1, 'O', 5, A_NoBlocking, &States[S_REAVER_XDEATH+4]),
S_BRIGHT (ROB1, 'P', 5, A_TossGib, &States[S_REAVER_XDEATH+5]),
S_BRIGHT (ROB1, 'Q', 6, A_ExplodeAndAlert, &States[S_REAVER_XDEATH+6]),
S_NORMAL (ROB1, 'R', -1, NULL, NULL),
};
IMPLEMENT_ACTOR (AReaver, Strife, 3001, 0)
PROP_SpawnHealth (150)
PROP_PainChance (128)
PROP_SpeedFixed (12)
PROP_RadiusFixed (20)
PROP_HeightFixed (60)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_COUNTKILL)
PROP_Flags2 (MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_FLOORCLIP)
PROP_Flags4 (MF4_INCOMBAT)
PROP_MinMissileChance (150)
PROP_MaxDropOffHeight (32)
PROP_Mass (500)
PROP_SpawnState (S_REAVER_STND)
PROP_SeeState (S_REAVER_RUN)
PROP_PainState (S_REAVER_PAIN)
PROP_MeleeState (S_REAVER_MELEE)
PROP_MissileState (S_REAVER_MISSILE)
PROP_DeathState (S_REAVER_DEATH)
PROP_XDeathState (S_REAVER_XDEATH)
PROP_StrifeType (52)
PROP_SeeSound ("reaver/sight")
PROP_PainSound ("reaver/pain")
PROP_DeathSound ("reaver/death")
PROP_ActiveSound ("reaver/active")
PROP_HitObituary ("$OB_REAVERHIT")
PROP_Obituary ("$OB_REAVER")
END_DEFAULTS
void A_ReaverMelee (AActor *self)
{
if (self->target != NULL)
{
A_FaceTarget (self);
if (self->CheckMeleeRange ())
{
int damage;
S_Sound (self, CHAN_WEAPON, "reaver/blade", 1, ATTN_NORM);
damage = ((pr_reaverattack() & 7) + 1) * 3;
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
P_TraceBleed (damage, self->target, self);
}
}
}
void A_ReaverRanged (AActor *self)
{
if (self->target != NULL)

View file

@ -10,101 +10,6 @@
static FRandom pr_shootgun ("ShootGun");
void A_ShootGun (AActor *);
void A_TossGib (AActor *);
void A_Beacon (AActor *);
// Base class for the rebels ------------------------------------------------
class ARebel : public AStrifeHumanoid
{
DECLARE_ACTOR (ARebel, AStrifeHumanoid)
};
FState ARebel::States[] =
{
#define S_REBEL_STND 0
S_NORMAL (HMN1, 'P', 5, A_Look2, &States[S_REBEL_STND]),
S_NORMAL (HMN1, 'Q', 8, NULL, &States[S_REBEL_STND]),
S_NORMAL (HMN1, 'R', 8, NULL, &States[S_REBEL_STND]),
#define S_REBEL_WAND (S_REBEL_STND+3)
S_NORMAL (HMN1, 'A', 6, A_Wander, &States[S_REBEL_WAND+1]),
S_NORMAL (HMN1, 'B', 6, A_Wander, &States[S_REBEL_WAND+2]),
S_NORMAL (HMN1, 'C', 6, A_Wander, &States[S_REBEL_WAND+3]),
S_NORMAL (HMN1, 'D', 6, A_Wander, &States[S_REBEL_WAND+4]),
S_NORMAL (HMN1, 'A', 6, A_Wander, &States[S_REBEL_WAND+5]),
S_NORMAL (HMN1, 'B', 6, A_Wander, &States[S_REBEL_WAND+6]),
S_NORMAL (HMN1, 'C', 6, A_Wander, &States[S_REBEL_WAND+7]),
S_NORMAL (HMN1, 'D', 6, A_Wander, &States[S_REBEL_STND]),
#define S_REBEL_CHASE (S_REBEL_WAND+8)
S_NORMAL (HMN1, 'A', 3, A_Chase, &States[S_REBEL_CHASE+1]),
S_NORMAL (HMN1, 'A', 3, A_Chase, &States[S_REBEL_CHASE+2]),
S_NORMAL (HMN1, 'B', 3, A_Chase, &States[S_REBEL_CHASE+3]),
S_NORMAL (HMN1, 'B', 3, A_Chase, &States[S_REBEL_CHASE+4]),
S_NORMAL (HMN1, 'C', 3, A_Chase, &States[S_REBEL_CHASE+5]),
S_NORMAL (HMN1, 'C', 3, A_Chase, &States[S_REBEL_CHASE+6]),
S_NORMAL (HMN1, 'D', 3, A_Chase, &States[S_REBEL_CHASE+7]),
S_NORMAL (HMN1, 'D', 3, A_Chase, &States[S_REBEL_CHASE]),
#define S_REBEL_ATK (S_REBEL_CHASE+8)
S_NORMAL (HMN1, 'E', 10, A_FaceTarget, &States[S_REBEL_ATK+1]),
S_BRIGHT (HMN1, 'F', 10, A_ShootGun, &States[S_REBEL_ATK+2]),
S_NORMAL (HMN1, 'E', 10, A_ShootGun, &States[S_REBEL_CHASE]),
#define S_REBEL_PAIN (S_REBEL_ATK+3)
S_NORMAL (HMN1, 'O', 3, NULL, &States[S_REBEL_PAIN+1]),
S_NORMAL (HMN1, 'O', 3, A_Pain, &States[S_REBEL_CHASE]),
#define S_REBEL_DIE (S_REBEL_PAIN+2)
S_NORMAL (HMN1, 'G', 5, NULL, &States[S_REBEL_DIE+1]),
S_NORMAL (HMN1, 'H', 5, A_Scream, &States[S_REBEL_DIE+2]),
S_NORMAL (HMN1, 'I', 3, A_NoBlocking, &States[S_REBEL_DIE+3]),
S_NORMAL (HMN1, 'J', 4, NULL, &States[S_REBEL_DIE+4]),
S_NORMAL (HMN1, 'K', 3, NULL, &States[S_REBEL_DIE+5]),
S_NORMAL (HMN1, 'L', 3, NULL, &States[S_REBEL_DIE+6]),
S_NORMAL (HMN1, 'M', 3, NULL, &States[S_REBEL_DIE+7]),
S_NORMAL (HMN1, 'N', -1, NULL, NULL),
#define S_REBEL_XDIE (S_REBEL_DIE+8)
S_NORMAL (RGIB, 'A', 4, A_TossGib, &States[S_REBEL_XDIE+1]),
S_NORMAL (RGIB, 'B', 4, A_XScream, &States[S_REBEL_XDIE+2]),
S_NORMAL (RGIB, 'C', 3, A_NoBlocking, &States[S_REBEL_XDIE+3]),
S_NORMAL (RGIB, 'D', 3, A_TossGib, &States[S_REBEL_XDIE+4]),
S_NORMAL (RGIB, 'E', 3, A_TossGib, &States[S_REBEL_XDIE+5]),
S_NORMAL (RGIB, 'F', 3, A_TossGib, &States[S_REBEL_XDIE+6]),
S_NORMAL (RGIB, 'G', 3, NULL, &States[S_REBEL_XDIE+7]),
S_NORMAL (RGIB, 'H', 1400, NULL, NULL)
};
IMPLEMENT_ACTOR (ARebel, Strife, -1, 0)
PROP_SpawnState (S_REBEL_STND)
PROP_SeeState (S_REBEL_CHASE)
PROP_PainState (S_REBEL_PAIN)
PROP_MissileState (S_REBEL_ATK)
PROP_DeathState (S_REBEL_DIE)
PROP_XDeathState (S_REBEL_XDIE)
PROP_SpawnHealth (60)
PROP_PainChance (250)
PROP_SpeedFixed (8)
PROP_RadiusFixed (20)
PROP_HeightFixed (56)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_FRIENDLY)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags3 (MF3_ISMONSTER)
PROP_Flags4 (MF4_NOSPLASHALERT)
PROP_MinMissileChance (150)
PROP_Tag ("Rebel")
PROP_SeeSound ("rebel/sight")
PROP_PainSound ("rebel/pain")
PROP_DeathSound ("rebel/death")
PROP_ActiveSound ("rebel/active")
PROP_Obituary ("$OB_REBEL")
END_DEFAULTS
//============================================================================
//
// A_ShootGun
@ -126,130 +31,16 @@ void A_ShootGun (AActor *self)
3*(pr_shootgun() % 5 + 1), NAME_None, RUNTIME_CLASS(AStrifePuff));
}
// Rebel 1 ------------------------------------------------------------------
class ARebel1 : public ARebel
{
DECLARE_STATELESS_ACTOR (ARebel1, ARebel)
public:
void NoBlockingSet ();
};
IMPLEMENT_STATELESS_ACTOR (ARebel1, Strife, 9, 0)
PROP_StrifeType (43)
PROP_StrifeTeaserType (42)
PROP_StrifeTeaserType2 (43)
END_DEFAULTS
//============================================================================
//
// ARebel1 :: NoBlockingSet
//
// Only this type of rebel drops bullet clips by default.
//
//============================================================================
void ARebel1::NoBlockingSet ()
{
P_DropItem (this, "ClipOfBullets", -1, 256);
}
// Rebel 2 ------------------------------------------------------------------
class ARebel2 : public ARebel
{
DECLARE_STATELESS_ACTOR (ARebel2, ARebel)
};
IMPLEMENT_STATELESS_ACTOR (ARebel2, Strife, 144, 0)
PROP_StrifeType (44)
PROP_StrifeTeaserType (43)
PROP_StrifeTeaserType2 (44)
END_DEFAULTS
// Rebel 3 ------------------------------------------------------------------
class ARebel3 : public ARebel
{
DECLARE_STATELESS_ACTOR (ARebel3, ARebel)
};
IMPLEMENT_STATELESS_ACTOR (ARebel3, Strife, 145, 0)
PROP_StrifeType (45)
PROP_StrifeTeaserType (44)
PROP_StrifeTeaserType2 (45)
END_DEFAULTS
// Rebel 4 ------------------------------------------------------------------
class ARebel4 : public ARebel
{
DECLARE_STATELESS_ACTOR (ARebel4, ARebel)
};
IMPLEMENT_STATELESS_ACTOR (ARebel4, Strife, 149, 0)
PROP_StrifeType (46)
PROP_StrifeTeaserType (45)
PROP_StrifeTeaserType2 (46)
END_DEFAULTS
// Rebel 5 ------------------------------------------------------------------
class ARebel5 : public ARebel
{
DECLARE_STATELESS_ACTOR (ARebel5, ARebel)
};
IMPLEMENT_STATELESS_ACTOR (ARebel5, Strife, 150, 0)
PROP_StrifeType (47)
PROP_StrifeTeaserType (46)
PROP_StrifeTeaserType2 (47)
END_DEFAULTS
// Rebel 6 ------------------------------------------------------------------
class ARebel6 : public ARebel
{
DECLARE_STATELESS_ACTOR (ARebel6, ARebel)
};
IMPLEMENT_STATELESS_ACTOR (ARebel6, Strife, 151, 0)
PROP_StrifeType (48)
PROP_StrifeTeaserType (47)
PROP_StrifeTeaserType2 (48)
END_DEFAULTS
// Teleporter Beacon --------------------------------------------------------
class ATeleporterBeacon : public AInventory
{
DECLARE_ACTOR (ATeleporterBeacon, AInventory)
DECLARE_CLASS (ATeleporterBeacon, AInventory)
public:
bool Use (bool pickup);
};
FState ATeleporterBeacon::States[] =
{
S_NORMAL (BEAC, 'A', -1, NULL, NULL),
S_NORMAL (BEAC, 'A', 30, NULL, &States[2]),
S_NORMAL (BEAC, 'A', 160, A_Beacon, &States[1])
};
IMPLEMENT_ACTOR (ATeleporterBeacon, Strife, 10, 0)
PROP_StrifeType (166)
PROP_SpawnHealth (5)
PROP_SpawnState (0)
PROP_SeeState (1)
PROP_RadiusFixed (16)
PROP_HeightFixed (16)
PROP_Inventory_MaxAmount (3)
PROP_Flags (MF_SPECIAL|MF_DROPPED)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_Inventory_Icon ("I_BEAC")
PROP_Tag ("Teleporter_Beacon")
PROP_Inventory_PickupMessage("$TXT_BEACON")
END_DEFAULTS
IMPLEMENT_CLASS (ATeleporterBeacon)
bool ATeleporterBeacon::Use (bool pickup)
{
@ -277,10 +68,10 @@ bool ATeleporterBeacon::Use (bool pickup)
void A_Beacon (AActor *self)
{
AActor *owner = self->target;
ARebel *rebel;
AActor *rebel;
angle_t an;
rebel = Spawn<ARebel1> (self->x, self->y, ONFLOORZ, ALLOW_REPLACE);
rebel = Spawn("Rebel1", self->x, self->y, ONFLOORZ, ALLOW_REPLACE);
if (!P_TryMove (rebel, rebel->x, rebel->y, true))
{
rebel->Destroy ();

View file

@ -6,122 +6,6 @@
static FRandom pr_sentinelrefire ("SentinelRefire");
void A_TossGib (AActor *);
// Sentinel -----------------------------------------------------------------
void A_SentinelBob (AActor *);
void A_SentinelAttack (AActor *);
void A_SentinelRefire (AActor *);
class ASentinel : public AActor
{
DECLARE_ACTOR (ASentinel, AActor)
};
FState ASentinel::States[] =
{
#define S_SENTINEL_STND 0
S_NORMAL (SEWR, 'A', 10, A_Look, &States[S_SENTINEL_STND]),
#define S_SENTINEL_RUN (S_SENTINEL_STND+1)
S_NORMAL (SEWR, 'A', 6, A_SentinelBob, &States[S_SENTINEL_RUN+1]),
S_NORMAL (SEWR, 'A', 6, A_Chase, &States[S_SENTINEL_RUN]),
#define S_SENTINEL_ATK (S_SENTINEL_RUN+2)
S_NORMAL (SEWR, 'B', 4, A_FaceTarget, &States[S_SENTINEL_ATK+1]),
S_BRIGHT (SEWR, 'C', 8, A_SentinelAttack, &States[S_SENTINEL_ATK+2]),
S_BRIGHT (SEWR, 'C', 4, A_SentinelRefire, &States[S_SENTINEL_ATK+1]),
#define S_SENTINEL_PAIN (S_SENTINEL_ATK+3)
S_NORMAL (SEWR, 'D', 5, A_Pain, &States[S_SENTINEL_ATK+2]),
#define S_SENTINEL_DIE (S_SENTINEL_PAIN+1)
S_NORMAL (SEWR, 'D', 7, A_NoBlocking, &States[S_SENTINEL_DIE+1]),
S_BRIGHT (SEWR, 'E', 8, A_TossGib, &States[S_SENTINEL_DIE+2]),
S_BRIGHT (SEWR, 'F', 5, A_Scream, &States[S_SENTINEL_DIE+3]),
S_BRIGHT (SEWR, 'G', 4, A_TossGib, &States[S_SENTINEL_DIE+4]),
S_BRIGHT (SEWR, 'H', 4, A_TossGib, &States[S_SENTINEL_DIE+5]),
S_NORMAL (SEWR, 'I', 4, NULL, &States[S_SENTINEL_DIE+6]),
S_NORMAL (SEWR, 'J', 5, NULL, NULL)
};
IMPLEMENT_ACTOR (ASentinel, Strife, 3006, 0)
PROP_SpawnState (S_SENTINEL_STND)
PROP_SeeState (S_SENTINEL_RUN)
PROP_PainState (S_SENTINEL_PAIN)
PROP_MissileState (S_SENTINEL_ATK)
PROP_DeathState (S_SENTINEL_DIE)
PROP_SpawnHealth (100)
PROP_PainChance (255)
PROP_SpeedFixed (7)
PROP_RadiusFixed (23)
PROP_HeightFixed (53)
PROP_Mass (300)
PROP_StrifeType (91)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_SPAWNCEILING|MF_NOGRAVITY|MF_DROPOFF|
/*MF_FLOAT|*/MF_NOBLOOD|MF_COUNTKILL)
PROP_Flags2 (MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags3 (MF3_NOBLOCKMONST)
PROP_Flags4 (MF4_INCOMBAT|MF4_MISSILEMORE|MF4_LOOKALLAROUND)
PROP_MinMissileChance (150)
PROP_SeeSound ("sentinel/sight")
PROP_DeathSound ("sentinel/death")
PROP_ActiveSound ("sentinel/active")
PROP_Obituary ("$OB_SENTINEL")
END_DEFAULTS
// Sentinel FX 1 ------------------------------------------------------------
class ASentinelFX1 : public AActor
{
DECLARE_ACTOR (ASentinelFX1, AActor)
};
FState ASentinelFX1::States[] =
{
S_NORMAL (SHT1, 'A', 4, NULL, &States[1]),
S_NORMAL (SHT1, 'B', 4, NULL, &States[0]),
#define S_SENTINELFX2_X 2
S_NORMAL (POW1, 'F', 4, NULL, &States[S_SENTINELFX2_X+1]),
S_NORMAL (POW1, 'G', 4, NULL, &States[S_SENTINELFX2_X+2]),
S_NORMAL (POW1, 'H', 4, NULL, &States[S_SENTINELFX2_X+3]),
S_NORMAL (POW1, 'I', 4, NULL, &States[S_SENTINELFX2_X+4]),
#define S_SENTINELFX1_X (S_SENTINELFX2_X+4)
S_NORMAL (POW1, 'J', 4, NULL, NULL),
};
IMPLEMENT_ACTOR (ASentinelFX1, Strife, -1, 0)
PROP_SpawnState (0)
PROP_DeathState (S_SENTINELFX1_X)
PROP_SpeedFixed (40)
PROP_RadiusFixed (10)
PROP_HeightFixed (8)
PROP_Damage (0)
PROP_DamageType (NAME_Disintegrate)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
PROP_Flags4 (MF4_STRIFEDAMAGE)
PROP_MaxStepHeight (4)
PROP_RenderStyle (STYLE_Add)
END_DEFAULTS
// Sentinel FX 2 ------------------------------------------------------------
class ASentinelFX2 : public ASentinelFX1
{
DECLARE_STATELESS_ACTOR (ASentinelFX2, ASentinelFX1)
};
IMPLEMENT_STATELESS_ACTOR (ASentinelFX2, Strife, -1, 0)
PROP_DeathState (S_SENTINELFX2_X)
PROP_Damage (1)
PROP_SeeSound ("sentinel/plasma")
END_DEFAULTS
void A_SentinelBob (AActor *self)
{
fixed_t minz, maxz;
@ -155,13 +39,13 @@ void A_SentinelAttack (AActor *self)
{
AActor *missile, *trail;
missile = P_SpawnMissileZAimed (self, self->z + 32*FRACUNIT, self->target, RUNTIME_CLASS(ASentinelFX2));
missile = P_SpawnMissileZAimed (self, self->z + 32*FRACUNIT, self->target, PClass::FindClass("SentinelFX2"));
if (missile != NULL && (missile->momx|missile->momy) != 0)
{
for (int i = 8; i > 1; --i)
{
trail = Spawn<ASentinelFX1> (
trail = Spawn("SentinelFX1",
self->x + FixedMul (missile->radius * i, finecosine[missile->angle >> ANGLETOFINESHIFT]),
self->y + FixedMul (missile->radius * i, finesine[missile->angle >> ANGLETOFINESHIFT]),
missile->z + (missile->momz / 4 * i), ALLOW_REPLACE);

View file

@ -8,119 +8,7 @@
static FRandom pr_templar ("Templar");
void A_ReaverMelee (AActor *);
void A_TossGib (AActor *);
void A_1fce8 (AActor *);
// Templar ------------------------------------------------------------------
class ATemplar : public AActor
{
DECLARE_ACTOR (ATemplar, AActor)
public:
void NoBlockingSet ();
};
FState ATemplar::States[] =
{
#define S_TEMPLAR_STAND 0
S_NORMAL (PGRD, 'A', 5, A_Look2, &States[S_TEMPLAR_STAND]),
S_NORMAL (PGRD, 'B', 10, NULL, &States[S_TEMPLAR_STAND]),
S_NORMAL (PGRD, 'C', 10, NULL, &States[S_TEMPLAR_STAND]),
S_NORMAL (PGRD, 'B', 10, A_Wander, &States[S_TEMPLAR_STAND]),
#define S_TEMPLAR_CHASE (S_TEMPLAR_STAND+4)
S_NORMAL (PGRD, 'A', 3, A_Chase, &States[S_TEMPLAR_CHASE+1]),
S_NORMAL (PGRD, 'A', 3, A_Chase, &States[S_TEMPLAR_CHASE+2]),
S_NORMAL (PGRD, 'B', 3, A_Chase, &States[S_TEMPLAR_CHASE+3]),
S_NORMAL (PGRD, 'B', 3, A_Chase, &States[S_TEMPLAR_CHASE+4]),
S_NORMAL (PGRD, 'C', 3, A_Chase, &States[S_TEMPLAR_CHASE+5]),
S_NORMAL (PGRD, 'C', 3, A_Chase, &States[S_TEMPLAR_CHASE+6]),
S_NORMAL (PGRD, 'D', 3, A_Chase, &States[S_TEMPLAR_CHASE+7]),
S_NORMAL (PGRD, 'D', 3, A_Chase, &States[S_TEMPLAR_CHASE]),
#define S_TEMPLAR_MELEE (S_TEMPLAR_CHASE+8)
S_NORMAL (PGRD, 'E', 8, A_FaceTarget, &States[S_TEMPLAR_MELEE+1]),
S_NORMAL (PGRD, 'F', 8, A_ReaverMelee, &States[S_TEMPLAR_CHASE]),
#define S_TEMPLAR_MISSILE (S_TEMPLAR_MELEE+2)
S_BRIGHT (PGRD, 'G', 8, A_FaceTarget, &States[S_TEMPLAR_MISSILE+1]),
S_BRIGHT (PGRD, 'H', 8, A_1fce8, &States[S_TEMPLAR_CHASE]),
#define S_TEMPLAR_PAIN (S_TEMPLAR_MISSILE+2)
S_NORMAL (PGRD, 'A', 2, NULL, &States[S_TEMPLAR_PAIN+1]),
S_NORMAL (PGRD, 'A', 2, A_Pain, &States[S_TEMPLAR_CHASE]),
#define S_TEMPLAR_DIE (S_TEMPLAR_PAIN+2)
S_BRIGHT (PGRD, 'I', 4, A_TossGib, &States[S_TEMPLAR_DIE+1]),
S_BRIGHT (PGRD, 'J', 4, A_Scream, &States[S_TEMPLAR_DIE+2]),
S_BRIGHT (PGRD, 'K', 4, A_TossGib, &States[S_TEMPLAR_DIE+3]),
S_BRIGHT (PGRD, 'L', 4, A_NoBlocking, &States[S_TEMPLAR_DIE+4]),
S_BRIGHT (PGRD, 'M', 4, NULL, &States[S_TEMPLAR_DIE+5]),
S_BRIGHT (PGRD, 'N', 4, NULL, &States[S_TEMPLAR_DIE+6]),
S_NORMAL (PGRD, 'O', 4, A_TossGib, &States[S_TEMPLAR_DIE+7]),
S_NORMAL (PGRD, 'P', 4, NULL, &States[S_TEMPLAR_DIE+8]),
S_NORMAL (PGRD, 'Q', 4, NULL, &States[S_TEMPLAR_DIE+9]),
S_NORMAL (PGRD, 'R', 4, NULL, &States[S_TEMPLAR_DIE+10]),
S_NORMAL (PGRD, 'S', 4, NULL, &States[S_TEMPLAR_DIE+11]),
S_NORMAL (PGRD, 'T', 4, NULL, &States[S_TEMPLAR_DIE+12]),
S_NORMAL (PGRD, 'U', 4, NULL, &States[S_TEMPLAR_DIE+13]),
S_NORMAL (PGRD, 'V', 4, NULL, &States[S_TEMPLAR_DIE+14]),
S_NORMAL (PGRD, 'W', 4, NULL, &States[S_TEMPLAR_DIE+15]),
S_NORMAL (PGRD, 'X', 4, NULL, &States[S_TEMPLAR_DIE+16]),
S_NORMAL (PGRD, 'Y', 4, NULL, &States[S_TEMPLAR_DIE+17]),
S_NORMAL (PGRD, 'Z', 4, NULL, &States[S_TEMPLAR_DIE+18]),
S_NORMAL (PGRD, '[', 4, NULL, &States[S_TEMPLAR_DIE+19]),
S_NORMAL (PGRD, '\\',-1, NULL, NULL),
};
IMPLEMENT_ACTOR (ATemplar, Strife, 3003, 0)
PROP_StrifeType (62)
PROP_StrifeTeaserType (61)
PROP_StrifeTeaserType2 (62)
PROP_SpawnHealth (300)
PROP_SpawnState (S_TEMPLAR_STAND)
PROP_SeeState (S_TEMPLAR_CHASE)
PROP_PainState (S_TEMPLAR_PAIN)
PROP_PainChance (100)
PROP_MeleeState (S_TEMPLAR_MELEE)
PROP_MissileState (S_TEMPLAR_MISSILE)
PROP_DeathState (S_TEMPLAR_DIE)
PROP_SpeedFixed (8)
PROP_RadiusFixed (20)
PROP_HeightFixed (60)
PROP_Mass (500)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_COUNTKILL)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags4 (MF4_SEESDAGGERS|MF4_NOSPLASHALERT)
PROP_MaxDropOffHeight (32)
PROP_MinMissileChance (150)
PROP_SeeSound ("templar/sight")
PROP_PainSound ("templar/pain")
PROP_DeathSound ("templar/death")
PROP_ActiveSound ("templar/active")
PROP_Tag ("TEMPLAR") // Known as "Enforcer" in earlier versions.
PROP_HitObituary ("$OB_TEMPLARHIT")
PROP_Obituary ("$OB_TEMPLAR")
END_DEFAULTS
//============================================================================
//
// ATemplar :: NoBlockingSet
//
//============================================================================
void ATemplar::NoBlockingSet ()
{
P_DropItem (this, "EnergyPod", 20, 256);
}
class AMaulerPuff : public AActor
{
DECLARE_ACTOR (AMaulerPuff, AActor)
};
void A_1fce8 (AActor *self)
void A_TemplarAttack (AActor *self)
{
int damage;
angle_t angle;
@ -139,6 +27,6 @@ void A_1fce8 (AActor *self)
damage = (pr_templar() & 4) * 2;
angle = self->angle + (pr_templar.Random2() << 19);
pitchdiff = pr_templar.Random2() * 332063;
P_LineAttack (self, angle, MISSILERANGE+64*FRACUNIT, pitch+pitchdiff, damage, NAME_Disintegrate, RUNTIME_CLASS(AMaulerPuff));
P_LineAttack (self, angle, MISSILERANGE+64*FRACUNIT, pitch+pitchdiff, damage, NAME_Disintegrate, "MaulerPuff");
}
}

View file

@ -122,6 +122,8 @@ xx(MiniMissileLauncher)
xx(StrifeGrenadeLauncher)
xx(Mauler)
xx(AcolyteBlue)
xx(Chicken)
xx(Pig)

View file

@ -19,6 +19,7 @@ enum dirtype_t
extern fixed_t xspeed[8], yspeed[8];
void P_RecursiveSound (sector_t *sec, AActor *soundtarget, bool splash, int soundblocks);
bool P_HitFriend (AActor *self);
void P_NoiseAlert (AActor *target, AActor *emmiter, bool splash=false);
bool P_CheckMeleeRange2 (AActor *actor);

View file

@ -606,8 +606,9 @@ void A_ExplodeParms (AActor *self)
int damage;
int distance;
bool hurtSource;
bool alert;
int index=CheckIndex(3);
int index=CheckIndex(4);
if (index>=0)
{
damage = EvalExpressionI (StateParameters[index], self);
@ -615,12 +616,14 @@ void A_ExplodeParms (AActor *self)
hurtSource = EvalExpressionN (StateParameters[index+2], self);
if (damage == 0) damage = 128;
if (distance == 0) distance = damage;
alert = !!EvalExpressionI (StateParameters[index+3], self);
}
else
{
damage = self->GetClass()->Meta.GetMetaInt (ACMETA_ExplosionDamage, 128);
distance = self->GetClass()->Meta.GetMetaInt (ACMETA_ExplosionRadius, damage);
hurtSource = !self->GetClass()->Meta.GetMetaInt (ACMETA_DontHurtShooter);
alert = false;
}
P_RadiusAttack (self, self->target, damage, distance, self->DamageType, hurtSource);
@ -628,9 +631,13 @@ void A_ExplodeParms (AActor *self)
{
P_HitFloor (self);
}
if (alert && self->target != NULL && self->target->player != NULL)
{
validcount++;
P_RecursiveSound (self->Sector, self->target, false, 0);
}
}
//==========================================================================
//
// A_RadiusThrust

View file

@ -457,6 +457,7 @@ ACTOR GauntletPuff1
VSpeed 0.8
States
{
Spawn:
PUF1 ABCD 4 BRIGHT
Stop
}
@ -468,6 +469,7 @@ ACTOR GauntletPuff2 : GauntletPuff1
{
States
{
Spawn:
PUF1 EFGH 4 BRIGHT
Stop
}

View file

@ -165,7 +165,7 @@ class Actor extends Thinker
action native A_CustomComboAttack(class<Actor> missiletype, eval float spawnheight, eval int damage, optional sound meleesound, optional name damagetype, optional evalnot bool bleed);
action native A_Burst(class<Actor> chunktype);
action native A_RadiusThrust(optional eval int force, optional eval int distance, optional evalnot bool affectsource);
action native A_Explode(optional eval int damage, optional eval int distance, optional evalnot bool hurtsource);
action native A_Explode(optional eval int damage, optional eval int distance, optional evalnot bool hurtsource, optional eval bool alert);
action native A_Stop();
action native A_Respawn(optional evalnot bool fog);
action native A_BarrelDestroy();
@ -180,6 +180,7 @@ class Actor extends Thinker
action native A_Punch();
action native A_Feathers();
action native A_ClassBossHealth();
action native A_ShootGun();
}
class Inventory extends Actor

View file

@ -0,0 +1,203 @@
// Base class for the acolytes ----------------------------------------------
ACTOR Acolyte : StrifeHumanoid
{
Health 70
PainChance 150
Speed 7
Radius 24
Height 64
Mass 400
Monster
+SEESDAGGERS
+NOSPLASHALERT
MinMissileChance 150
Tag "ACOLYTE"
SeeSound "acolyte/sight"
PainSound "acolyte/pain"
AttackSound "acolyte/rifle"
DeathSound "acolyte/death"
ActiveSound "acolyte/active"
Obituary "$OB_ACOLYTE"
action native A_BeShadowyFoe ();
action native A_AcolyteBits ();
action native A_AcolyteDie ();
States
{
Spawn:
AGRD A 5 A_Look2
Wait
AGRD B 8 A_ClearShadow
Loop
AGRD D 8
Loop
AGRD ABCDABCD 5 A_Wander
Loop
See:
AGRD A 6 A_AcolyteBits
AGRD BCD 6 A_Chase
Loop
Missile:
AGRD E 8 A_FaceTarget
AGRD FE 4 A_ShootGun
AGRD F 6 A_ShootGun
Goto See
Pain:
AGRD O 8 A_Pain
Goto See
Death:
AGRD G 4
AGRD H 4 A_Scream
AGRD I 4
AGRD J 3
AGRD K 3 A_NoBlocking
AGRD L 3
AGRD M 3 A_AcolyteDie
AGRD N 1400
Stop
XDeath:
GIBS A 5 A_NoBlocking
GIBS BC 5 A_TossGib
GIBS D 4 A_TossGib
GIBS E 4 A_XScream
GIBS F 4 A_TossGib
GIBS GH 4
GIBS I 5
GIBS J 5 A_AcolyteDie
GIBS K 5
GIBS L 1400
Stop
}
}
// Acolyte 1 ----------------------------------------------------------------
ACTOR AcolyteTan : Acolyte 3002
{
Game Strife
ConversationID 53, 52, 53
+MISSILEMORE +MISSILEEVENMORE
DropItem "ClipOfBullets"
}
// Acolyte 2 ----------------------------------------------------------------
ACTOR AcolyteRed : Acolyte 142
{
Game Strife
ConversationID 54, 53, 54
+MISSILEMORE +MISSILEEVENMORE
Translation 0
}
// Acolyte 3 ----------------------------------------------------------------
ACTOR AcolyteRust : Acolyte 143
{
Game Strife
ConversationID 55, 54, 55
+MISSILEMORE +MISSILEEVENMORE
Translation 1
}
// Acolyte 4 ----------------------------------------------------------------
ACTOR AcolyteGray : Acolyte 146
{
Game Strife
ConversationID 56, 55, 56
+MISSILEMORE +MISSILEEVENMORE
Translation 2
}
// Acolyte 5 ----------------------------------------------------------------
ACTOR AcolyteDGreen : Acolyte 147
{
Game Strife
ConversationID 57, 56, 57
+MISSILEMORE +MISSILEEVENMORE
Translation 3
}
// Acolyte 6 ----------------------------------------------------------------
ACTOR AcolyteGold : Acolyte 148
{
Game Strife
ConversationID 58, 57, 58
+MISSILEMORE +MISSILEEVENMORE
Translation 4
}
// Acolyte 7 ----------------------------------------------------------------
ACTOR AcolyteLGreen : Acolyte 232
{
Game Strife
Health 60
ConversationID 59, -1, -1
Translation 5
}
// Acolyte 8 ----------------------------------------------------------------
ACTOR AcolyteBlue : Acolyte 231
{
Game Strife
Health 60
ConversationID 60, -1, -1
Translation 6
}
// Shadow Acolyte -----------------------------------------------------------
ACTOR AcolyteShadow : Acolyte 58
{
Game Strife
ConversationID 61, 58, 59
+MISSILEMORE
DropItem "ClipOfBullets"
States
{
See:
AGRD A 6 A_BeShadowyFoe
Goto Super::See+1
Pain:
AGRD O 0 A_SetShadow
AGRD O 8 A_Pain
Goto See
}
}
// Some guy turning into an acolyte -----------------------------------------
ACTOR AcolyteToBe : Acolyte 201
{
Game Strife
ConversationID 29, -1, -1
Health 61
Radius 20
Height 56
DeathSound "becoming/death"
-COUNTKILL
-ISMONSTER
action native A_HideDecepticon ();
States
{
Spawn:
ARMR A -1
Stop
Pain:
ARMR A -1 A_HideDecepticon
Stop
Death:
Goto XDeath
}
}

View file

@ -0,0 +1,66 @@
ACTOR Reaver 3001
{
Game Strife
Health 150
Painchance 128
Speed 12
Radius 20
Height 60
Monster
+NOBLOOD
+INCOMBAT
MinMissileChance 150
MaxDropoffHeight 32
Mass 500
ConversationID 52, -1, -1
SeeSound "reaver/sight"
PainSound "reaver/pain"
DeathSound "reaver/death"
ActiveSound "reaver/active"
HitObituary "$OB_REAVERHIT"
Obituary "$OB_REAVER"
action native A_ReaverRanged ();
States
{
Spawn:
ROB1 A 10 A_Look
Loop
See:
ROB1 BBCCDDEE 3 A_Chase
Loop
Melee:
ROB1 H 6 A_FaceTarget
ROB1 I 8 A_CustomMeleeAttack(random[ReaverMelee](1,8)*3, "reaver/blade")
ROB1 H 6
Goto See
Missile:
ROB1 F 8 A_FaceTarget
ROB1 G 11 BRIGHT A_ReaverRanged
Goto See
Pain:
ROB1 A 2
ROB1 A 2 A_Pain
Goto See
Death:
ROB1 J 6
ROB1 K 6 A_Scream
ROB1 L 5
ROB1 M 5 A_NoBlocking
ROB1 NOP 5
ROB1 Q 6 A_Explode(32,32,1,1)
ROB1 R -1
Stop
XDeath:
ROB1 L 5 A_TossGib
ROB1 M 5 A_Scream
ROB1 N 5 A_TossGib
ROB1 O 5 A_NoBlocking
ROB1 P 5 A_TossGib
Goto Death+7
}
}

View file

@ -0,0 +1,142 @@
// Base class for the rebels ------------------------------------------------
ACTOR Rebel : StrifeHumanoid
{
Health 60
Painchance 250
Speed 8
Radius 20
Height 56
Monster
+FRIENDLY
-COUNTKILL
+NOSPLASHALERT
MinMissileChance 150
Tag "Rebel"
SeeSound "rebel/sight"
PainSound "rebel/pain"
DeathSound "rebel/death"
ActiveSound "rebel/active"
Obituary "$OB_REBEL"
States
{
Spawn:
HMN1 P 5 A_Look2
Loop
HMN1 Q 8
Loop
HMN1 R 8
Loop
HMN1 ABCDABCD 6 A_Wander
Loop
See:
HMN1 AABBCCDD 3 A_Chase
Loop
Missile:
HMN1 E 10 A_FaceTarget
HMN1 F 10 BRIGHT A_ShootGun
HMN1 E 10 A_ShootGun
Goto See
Pain:
HMN1 O 3
HMN1 O 3 A_Pain
Goto See
Death:
HMN1 G 5
HMN1 H 5 A_Scream
HMN1 I 3 A_NoBlocking
HMN1 J 4
HMN1 KLM 3
HMN1 N -1
Stop
XDeath:
RGIB A 4 A_TossGib
RGIB B 4 A_XScream
RGIB C 3 A_NoBlocking
RGIB DEF 3 A_TossGib
RGIB G 3
RGIB H 1400
Stop
}
}
// Rebel 1 ------------------------------------------------------------------
ACTOR Rebel1 : Rebel 9
{
Game Strife
ConversationID 43, 42, 43
DropItem "ClipOfBullets"
}
// Rebel 2 ------------------------------------------------------------------
ACTOR Rebel2 : Rebel 144
{
Game Strife
ConversationID 44, 43, 44
}
// Rebel 3 ------------------------------------------------------------------
ACTOR Rebel3 : Rebel 145
{
Game Strife
ConversationID 45, 44, 45
}
// Rebel 4 ------------------------------------------------------------------
ACTOR Rebel4 : Rebel 149
{
Game Strife
ConversationID 46, 45, 56
}
// Rebel 5 ------------------------------------------------------------------
ACTOR Rebel5 : Rebel 150
{
Game Strife
ConversationID 47, 46, 47
}
// Rebel 6 ------------------------------------------------------------------
ACTOR Rebel6 : Rebel 151
{
Game Strife
ConversationID 48, 47, 48
}
// Teleporter Beacon --------------------------------------------------------
ACTOR TeleporterBeacon : Inventory 10 native
{
Game Strife
ConversationID 166,-1,-1
Health 5
Radius 16
Height 16
Inventory.MaxAmount 3
+DROPPED
+INVENTORY.INVBAR
Inventory.Icon "I_BEAC"
Tag "Teleporter_Beacon"
Inventory.PickupMessage "$TXT_BEACON"
action native A_Beacon ();
States
{
Spawn:
BEAC A -1
Stop
Drop:
BEAC A 30
BEAC A 160 A_Beacon
Wait
}
}

View file

@ -0,0 +1,95 @@
// Sentinel -----------------------------------------------------------------
ACTOR Sentinel 3006
{
Game Strife
ConversationID 91,-1,-1
Health 100
Painchance 255
Speed 7
Radius 23
Height 53
Mass 300
Monster
+SPAWNCEILING
+NOGRAVITY
+DROPOFF
+NOBLOOD
+NOBLOCKMONST
+INCOMBAT
+MISSILEMORE
+LOOKALLAROUND
MinMissileChance 150
SeeSound "sentinel/sight"
DeathSound "sentinel/death"
ActiveSound "sentinel/active"
Obituary "$OB_SENTINEL"
action native A_SentinelAttack ();
States
{
Spawn:
SEWR A 10 A_Look
Loop
See:
SEWR A 6 A_SentinelBob
SEWR A 6 A_Chase
Loop
Missile:
SEWR B 4 A_FaceTarget
SEWR C 8 Bright A_SentinelAttack
SEWR C 4 Bright A_SentinelRefire
Goto Missile+1
Pain:
SEWR D 5 A_Pain
Goto Missile+2
Death:
SEWR D 7 A_Fall
SEWR E 8 Bright A_TossGib
SEWR F 5 Bright A_Scream
SEWR GH 4 Bright A_TossGib
SEWR I 4
SEWR J 5
Stop
}
}
// Sentinel FX 1 ------------------------------------------------------------
ACTOR SentinelFX1
{
Speed 40
Radius 10
Height 8
Damage 0
DamageType Disintegrate
Projectile
+STRIFEDAMAGE
MaxStepHeight 4
RenderStyle Add
States
{
Spawn:
SHT1 AB 4
Loop
Death:
POW1 J 4
Stop
}
}
// Sentinel FX 2 ------------------------------------------------------------
ACTOR SentinelFX2 : SentinelFX1
{
SeeSound "sentinel/plasma"
States
{
Death:
POW1 FGHI 4
Goto Super::Death
}
}

View file

@ -45,8 +45,7 @@ ACTOR StrifeBishop 187
MLDR G 3 Bright
MLDR H 5 Bright A_Scream
MLDR I 4 Bright A_TossGib
MLDR J 0 Bright A_AlertMonsters
MLDR J 4 Bright A_Explode(64,64)
MLDR J 4 Bright A_Explode(64,64,1,1)
MLDR KL 3 Bright
MLDR M 4 Bright A_NoBlocking
MLDR N 4 Bright
@ -89,8 +88,7 @@ ACTOR BishopMissile
Death:
SMIS A 0 Bright A_SetTranslucent(1,1)
SMIS A 0 Bright A_StopSoundEx("Voice")
SMIS A 0 Bright A_AlertMonsters
SMIS A 5 Bright A_Explode(64,64)
SMIS A 5 Bright A_Explode(64,64,1,1)
SMIS B 5 Bright
SMIS C 4 Bright
SMIS DEFG 2 Bright

View file

@ -0,0 +1,67 @@
ACTOR Templar 3003
{
Game Strife
ConversationID 62, 61, 62
Health 300
Painchance 100
Speed 8
Radius 20
Height 60
Mass 500
Monster
+NOBLOOD
+SEESDAGGERS
+NOSPLASHALERT
MaxdropoffHeight 32
MinMissileChance 200
SeeSound "templar/sight"
PainSound "templar/pain"
DeathSound "templar/death"
ActiveSound "templar/active"
Tag "TEMPLAR"
HitObituary "$OB_TEMPLARHIT"
Obituary "$OB_TEMPLAR"
DropItem "EnergyPod"
action native A_TemplarAttack();
States
{
Spawn:
PGRD A 5 A_Look2
Loop
PGRD B 10
Loop
PGRD C 10
Loop
PGRD B 10 A_Wander
Loop
See:
PGRD AABBCCDD 3 A_Chase
Loop
Melee:
PGRD E 8 A_FaceTarget
PGRD F 8 A_CustomMeleeAttack(random[ReaverMelee](1,8)*3, "reaver/blade")
Goto See
Missile:
PGRD G 8 BRIGHT A_FaceTarget
PGRD H 8 BRIGHT A_TemplarAttack
Goto See
Pain:
PGRD A 2
PGRD A 2 A_Pain
Goto See
Death:
PGRD I 4 A_TossGib
PGRD J 4 A_Scream
PGRD K 4 A_TossGib
PGRD L 4 A_NoBlocking
PGRD MN 4
PGRD O 4 A_TossGib
PGRD "PQRSTUVWXYZ[" 4
PGRD "\" -1
Stop
}
}

View file

@ -98,15 +98,20 @@
#include "actors/hexen/clericstaff.txt"
#include "actors/strife/strifeplayer.txt"
#include "actors/strife/acolyte.txt"
#include "actors/strife/beggars.txt"
#include "actors/strife/merchants.txt"
#include "actors/strife/peasants.txt"
#include "actors/strife/strifebishop.txt"
#include "actors/strife/questitems.txt"
#include "actors/strife/ratbuddy.txt"
#include "actors/strife/rebels.txt"
#include "actors/strife/reaver.txt"
#include "actors/strife/sentinel.txt"
#include "actors/strife/strifeammo.txt"
#include "actors/strife/strifearmor.txt"
#include "actors/strife/strifeitems.txt"
#include "actors/strife/strifekeys.txt"
#include "actors/strife/strifestuff.txt"
#include "actors/strife/templar.txt"
#include "actors/strife/zombie.txt"