gzdoom-gles/src/g_strife/a_templar.cpp
Christoph Oelckers 063c85b157 - Fixed: The global WeaponSection string was never freed. It has been replaced
with an FString now.
- Fixed: The music strings in the default level info were never freed and
  caused memory leaks when used repeatedly.
- Fixed: The intermusic string in the level info was never freed.
- Fixed: The default fire obituary should only be printed if the damage
  came from the environment. If it comes from a monster the monster specific
  obituary should be used instead.
- Added custom damage types from the floating point test release.
- Changed Pain Elemental's massacre check. Now A_PainDie checks for the damage 
  type and doesn't spawn anything if it is NAME_Massacre. A_PainDie can also 
  be used by other actors so a more generalized approach is needed than hard
  coding it into the Pain Elemental.
- Converted a few of Doom's monsters to DECORATE because I couldn't test the
  first version of the custom state code with the corpses inheriting from them.
- Added custom states from last year's floating point test release and fixed
  some bugs I found in that code. Unfortunately it wasn't all salvageable
  and it was easier to recreate some parts from scratch.



SVN r368 (trunk)
2006-10-31 14:53:21 +00:00

142 lines
5.1 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"
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.
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)
{
int damage;
angle_t angle;
int pitch;
int pitchdiff;
if (self->target == NULL)
return;
S_Sound (self, CHAN_WEAPON, "templar/shoot", 1, ATTN_NORM);
A_FaceTarget (self);
pitch = P_AimLineAttack (self, self->angle, MISSILERANGE);
for (int i = 0; i < 10; ++i)
{
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));
}
}