gzdoom/src/g_strife/a_macil.cpp
Christoph Oelckers b599eda17d - Moved A_ThrowGrenade from Inventory to Actor because it can also be used by
monsters
- Added velocity multiplicators to A_SpawnDebris.
- Changed: A_JumpIfNoAmmo should have no effect for CustomInventory items.
- Fixed: DECORATE jump commands must set the call state's result to 0
  even when they have to return prematurely.
- Added obituaries for Strife's and Hexen's monsters.
- Converted Strife's Bishop to DECORATE.
- Added momx, momy and momz variables to the DECORATE expression evaluator.


SVN r404 (trunk)
2006-12-06 10:38:47 +00:00

171 lines
6 KiB
C++

#include "actor.h"
#include "m_random.h"
#include "a_action.h"
#include "p_local.h"
#include "p_enemy.h"
#include "s_sound.h"
#include "a_strifeglobal.h"
void A_ShootGun (AActor *);
void A_SentinelRefire (AActor *);
void A_SpawnSpectre4 (AActor *);
// Macil (version 1) ---------------------------------------------------------
class AMacil1 : public AStrifeHumanoid
{
DECLARE_ACTOR (AMacil1, AStrifeHumanoid)
public:
void NoBlockingSet ();
};
FState AMacil1::States[] =
{
#define S_MACIL_STAND 0
S_NORMAL (LEDR, 'C', 5, A_Look2, &States[S_MACIL_STAND]),
S_NORMAL (LEDR, 'A', 8, NULL, &States[S_MACIL_STAND]),
S_NORMAL (LEDR, 'B', 8, NULL, &States[S_MACIL_STAND]),
S_NORMAL (LEAD, 'A', 6, A_Wander, &States[S_MACIL_STAND+4]),
S_NORMAL (LEAD, 'B', 6, A_Wander, &States[S_MACIL_STAND+5]),
S_NORMAL (LEAD, 'C', 6, A_Wander, &States[S_MACIL_STAND+6]),
S_NORMAL (LEAD, 'D', 6, A_Wander, &States[S_MACIL_STAND]),
#define S_MACIL_CHASE (S_MACIL_STAND+7)
S_NORMAL (LEAD, 'A', 3, A_Chase, &States[S_MACIL_CHASE+1]),
S_NORMAL (LEAD, 'A', 3, A_Chase, &States[S_MACIL_CHASE+2]),
S_NORMAL (LEAD, 'B', 3, A_Chase, &States[S_MACIL_CHASE+3]),
S_NORMAL (LEAD, 'B', 3, A_Chase, &States[S_MACIL_CHASE+4]),
S_NORMAL (LEAD, 'C', 3, A_Chase, &States[S_MACIL_CHASE+5]),
S_NORMAL (LEAD, 'C', 3, A_Chase, &States[S_MACIL_CHASE+6]),
S_NORMAL (LEAD, 'D', 3, A_Chase, &States[S_MACIL_CHASE+7]),
S_NORMAL (LEAD, 'D', 3, A_Chase, &States[S_MACIL_CHASE]),
#define S_MACIL_ATK (S_MACIL_CHASE+8)
S_NORMAL (LEAD, 'E', 2, A_FaceTarget, &States[S_MACIL_ATK+1]),
S_BRIGHT (LEAD, 'F', 2, A_ShootGun, &States[S_MACIL_ATK+2]),
S_NORMAL (LEAD, 'E', 2, A_SentinelRefire,&States[S_MACIL_ATK]),
#define S_MACIL_PAIN (S_MACIL_ATK+3)
S_NORMAL (LEAD, 'Y', 3, NULL, &States[S_MACIL_PAIN+1]),
S_NORMAL (LEAD, 'Y', 3, A_Pain, &States[S_MACIL_CHASE]),
#define S_MACIL_ATK2 (S_MACIL_PAIN+2)
S_NORMAL (LEAD, 'E', 4, A_FaceTarget, &States[S_MACIL_ATK2+1]),
S_BRIGHT (LEAD, 'F', 4, A_ShootGun, &States[S_MACIL_ATK2+2]),
S_NORMAL (LEAD, 'E', 2, A_SentinelRefire,&States[S_MACIL_ATK2]),
#define S_MACIL_DIE (S_MACIL_ATK2+3)
S_NORMAL (LEAD, 'G', 5, NULL, &States[S_MACIL_DIE+1]),
S_NORMAL (LEAD, 'H', 5, A_Scream, &States[S_MACIL_DIE+2]),
S_NORMAL (LEAD, 'I', 4, NULL, &States[S_MACIL_DIE+3]),
S_NORMAL (LEAD, 'J', 4, NULL, &States[S_MACIL_DIE+4]),
S_NORMAL (LEAD, 'K', 3, NULL, &States[S_MACIL_DIE+5]),
S_NORMAL (LEAD, 'L', 3, A_NoBlocking, &States[S_MACIL_DIE+6]),
S_NORMAL (LEAD, 'M', 3, NULL, &States[S_MACIL_DIE+7]),
S_NORMAL (LEAD, 'N', 3, NULL, &States[S_MACIL_DIE+8]),
S_NORMAL (LEAD, 'O', 3, NULL, &States[S_MACIL_DIE+9]),
S_NORMAL (LEAD, 'P', 3, NULL, &States[S_MACIL_DIE+10]),
S_NORMAL (LEAD, 'Q', 3, NULL, &States[S_MACIL_DIE+11]),
S_NORMAL (LEAD, 'R', 3, NULL, &States[S_MACIL_DIE+12]),
S_NORMAL (LEAD, 'S', 3, NULL, &States[S_MACIL_DIE+13]),
S_NORMAL (LEAD, 'T', 3, NULL, &States[S_MACIL_DIE+14]),
S_NORMAL (LEAD, 'U', 3, NULL, &States[S_MACIL_DIE+15]),
S_NORMAL (LEAD, 'V', 3, NULL, &States[S_MACIL_DIE+16]),
S_NORMAL (LEAD, 'W', 3, A_SpawnSpectre4, &States[S_MACIL_DIE+17]),
S_NORMAL (LEAD, 'X', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AMacil1, Strife, 64, 0)
PROP_StrifeType (49)
PROP_StrifeTeaserType (48)
PROP_StrifeTeaserType2 (49)
PROP_SpawnState (S_MACIL_STAND)
PROP_SpawnHealth (95)
PROP_SeeState (S_MACIL_CHASE)
PROP_PainState (S_MACIL_PAIN)
PROP_PainChance (250)
PROP_MissileState (S_MACIL_ATK)
PROP_DeathState (S_MACIL_CHASE)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOTDMATCH)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags3 (MF3_ISMONSTER)
PROP_Flags4 (MF4_FIRERESIST|MF4_NOICEDEATH|MF4_NOSPLASHALERT)
PROP_Flags5 (MF5_NODAMAGE)
PROP_MinMissileChance (150)
PROP_RadiusFixed (20)
PROP_HeightFixed (56)
PROP_SpeedFixed (8)
PROP_SeeSound ("macil/sight")
PROP_PainSound ("macil/pain")
PROP_ActiveSound ("macil/active")
PROP_Tag ("MACIL")
PROP_Obituary ("$OB_MACIL")
END_DEFAULTS
//============================================================================
//
// AMacil1 :: NoBlockingSet
//
//============================================================================
void AMacil1::NoBlockingSet ()
{
P_DropItem (this, "BoxOfBullets", -1, 256);
}
// Macil (version 2) ---------------------------------------------------------
class AMacil2 : public AMacil1
{
DECLARE_STATELESS_ACTOR (AMacil2, AMacil1)
public:
void NoBlockingSet ();
int TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, FName damagetype);
};
IMPLEMENT_STATELESS_ACTOR (AMacil2, Strife, 200, 0)
PROP_StrifeType (50)
PROP_StrifeTeaserType (49)
PROP_StrifeTeaserType2 (50)
PROP_PainChance (200)
PROP_MissileState (S_MACIL_ATK2)
PROP_DeathState (S_MACIL_DIE)
PROP_XDeathState (S_MACIL_DIE)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOTDMATCH)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags4Clear (MF4_FIRERESIST)
PROP_Flags4Set (MF4_SPECTRAL)
PROP_Flags5Clear (MF5_NODAMAGE)
PROP_MinMissileChance (150)
PROP_Tag ("MACIL")
PROP_DeathSound ("macil/slop")
END_DEFAULTS
//============================================================================
//
// AMacil2 :: NoBlockingSet
//
// The second version of Macil spawns a specter instead of dropping something.
//
//============================================================================
void AMacil2::NoBlockingSet ()
{
}
//============================================================================
//
// AMacil2 :: TakeSpecialDamage
//
// Macil is invulnerable to the first stage Sigil.
//
//============================================================================
int AMacil2::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, FName damagetype)
{
if (inflictor != NULL && inflictor->IsKindOf (RUNTIME_CLASS(ASpectralLightningV1)))
return -1;
return Super::TakeSpecialDamage(inflictor, source, damage, damagetype);
}