mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-01-05 17:41:05 +00:00
b599eda17d
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)
171 lines
6 KiB
C++
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);
|
|
}
|