2006-02-24 04:48:15 +00:00
|
|
|
#include "actor.h"
|
|
|
|
#include "info.h"
|
|
|
|
#include "p_local.h"
|
|
|
|
#include "s_sound.h"
|
|
|
|
#include "p_enemy.h"
|
|
|
|
#include "a_action.h"
|
|
|
|
#include "m_random.h"
|
|
|
|
#include "a_sharedglobal.h"
|
|
|
|
|
|
|
|
static FRandom pr_stealhealth ("StealHealth");
|
|
|
|
static FRandom pr_wraithfx2 ("WraithFX2");
|
|
|
|
static FRandom pr_wraithfx3 ("WraithFX3");
|
|
|
|
static FRandom pr_wraithfx4 ("WraithFX4");
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
// Wraith Variables
|
|
|
|
//
|
|
|
|
// special1 Internal index into floatbob
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithInit
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithInit (AActor *actor)
|
|
|
|
{
|
|
|
|
actor->z += 48<<FRACBITS;
|
|
|
|
|
|
|
|
// [RH] Make sure the wraith didn't go into the ceiling
|
|
|
|
if (actor->z + actor->height > actor->ceilingz)
|
|
|
|
{
|
|
|
|
actor->z = actor->ceilingz - actor->height;
|
|
|
|
}
|
|
|
|
|
|
|
|
actor->special1 = 0; // index into floatbob
|
|
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithRaiseInit
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithRaiseInit (AActor *actor)
|
|
|
|
{
|
|
|
|
actor->renderflags &= ~RF_INVISIBLE;
|
|
|
|
actor->flags2 &= ~MF2_NONSHOOTABLE;
|
|
|
|
actor->flags3 &= ~MF3_DONTBLAST;
|
|
|
|
actor->flags |= MF_SHOOTABLE|MF_SOLID;
|
|
|
|
actor->floorclip = actor->height;
|
|
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithRaise
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithRaise (AActor *actor)
|
|
|
|
{
|
2008-08-10 11:29:19 +00:00
|
|
|
if (A_RaiseMobj (actor, 2*FRACUNIT))
|
2006-02-24 04:48:15 +00:00
|
|
|
{
|
|
|
|
// Reached it's target height
|
|
|
|
// [RH] Once a buried wraith is fully raised, it should be
|
|
|
|
// morphable, right?
|
|
|
|
actor->flags3 &= ~(MF3_DONTMORPH|MF3_SPECIALFLOORCLIP);
|
2008-08-10 11:29:19 +00:00
|
|
|
actor->SetState (actor->FindState("Chase"));
|
2006-02-24 04:48:15 +00:00
|
|
|
// [RH] Reset PainChance to a normal wraith's.
|
2008-08-10 11:29:19 +00:00
|
|
|
actor->PainChance = GetDefaultByName ("Wraith")->PainChance;
|
2006-02-24 04:48:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
P_SpawnDirt (actor, actor->radius);
|
|
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithMelee
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithMelee (AActor *actor)
|
|
|
|
{
|
|
|
|
int amount;
|
|
|
|
|
|
|
|
// Steal health from target and give to self
|
|
|
|
if (actor->CheckMeleeRange() && (pr_stealhealth()<220))
|
|
|
|
{
|
|
|
|
amount = pr_stealhealth.HitDice (2);
|
2006-10-31 14:53:21 +00:00
|
|
|
P_DamageMobj (actor->target, actor, actor, amount, NAME_Melee);
|
2006-02-24 04:48:15 +00:00
|
|
|
actor->health += amount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithFX2 - spawns sparkle tail of missile
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithFX2 (AActor *actor)
|
|
|
|
{
|
|
|
|
AActor *mo;
|
|
|
|
angle_t angle;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 2; i; --i)
|
|
|
|
{
|
2008-08-10 11:29:19 +00:00
|
|
|
mo = Spawn ("WraithFX2", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
2006-02-24 04:48:15 +00:00
|
|
|
if(mo)
|
|
|
|
{
|
|
|
|
if (pr_wraithfx2 ()<128)
|
|
|
|
{
|
|
|
|
angle = actor->angle+(pr_wraithfx2()<<22);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
angle = actor->angle-(pr_wraithfx2()<<22);
|
|
|
|
}
|
|
|
|
mo->momz = 0;
|
|
|
|
mo->momx = FixedMul((pr_wraithfx2()<<7)+FRACUNIT,
|
|
|
|
finecosine[angle>>ANGLETOFINESHIFT]);
|
|
|
|
mo->momy = FixedMul((pr_wraithfx2()<<7)+FRACUNIT,
|
|
|
|
finesine[angle>>ANGLETOFINESHIFT]);
|
|
|
|
mo->target = actor;
|
|
|
|
mo->floorclip = 10*FRACUNIT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithFX3
|
|
|
|
//
|
|
|
|
// Spawn an FX3 around the actor during attacks
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithFX3 (AActor *actor)
|
|
|
|
{
|
|
|
|
AActor *mo;
|
|
|
|
int numdropped = pr_wraithfx3()%15;
|
|
|
|
|
|
|
|
while (numdropped-- > 0)
|
|
|
|
{
|
2008-08-10 11:29:19 +00:00
|
|
|
mo = Spawn ("WraithFX3", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
2006-02-24 04:48:15 +00:00
|
|
|
if (mo)
|
|
|
|
{
|
|
|
|
mo->x += (pr_wraithfx3()-128)<<11;
|
|
|
|
mo->y += (pr_wraithfx3()-128)<<11;
|
|
|
|
mo->z += (pr_wraithfx3()<<10);
|
|
|
|
mo->target = actor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithFX4
|
|
|
|
//
|
|
|
|
// Spawn an FX4 during movement
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithFX4 (AActor *actor)
|
|
|
|
{
|
|
|
|
AActor *mo;
|
|
|
|
int chance = pr_wraithfx4();
|
|
|
|
bool spawn4, spawn5;
|
|
|
|
|
|
|
|
if (chance < 10)
|
|
|
|
{
|
|
|
|
spawn4 = true;
|
|
|
|
spawn5 = false;
|
|
|
|
}
|
|
|
|
else if (chance < 20)
|
|
|
|
{
|
|
|
|
spawn4 = false;
|
|
|
|
spawn5 = true;
|
|
|
|
}
|
|
|
|
else if (chance < 25)
|
|
|
|
{
|
|
|
|
spawn4 = true;
|
|
|
|
spawn5 = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spawn4 = false;
|
|
|
|
spawn5 = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (spawn4)
|
|
|
|
{
|
2008-08-10 11:29:19 +00:00
|
|
|
mo = Spawn ("WraithFX4", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
2006-02-24 04:48:15 +00:00
|
|
|
if (mo)
|
|
|
|
{
|
|
|
|
mo->x += (pr_wraithfx4()-128)<<12;
|
|
|
|
mo->y += (pr_wraithfx4()-128)<<12;
|
|
|
|
mo->z += (pr_wraithfx4()<<10);
|
|
|
|
mo->target = actor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (spawn5)
|
|
|
|
{
|
2008-08-10 11:29:19 +00:00
|
|
|
mo = Spawn ("WraithFX5", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
2006-02-24 04:48:15 +00:00
|
|
|
if (mo)
|
|
|
|
{
|
|
|
|
mo->x += (pr_wraithfx4()-128)<<11;
|
|
|
|
mo->y += (pr_wraithfx4()-128)<<11;
|
|
|
|
mo->z += (pr_wraithfx4()<<10);
|
|
|
|
mo->target = actor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// A_WraithChase
|
|
|
|
//
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
void A_WraithChase (AActor *actor)
|
|
|
|
{
|
|
|
|
int weaveindex = actor->special1;
|
|
|
|
actor->z += FloatBobOffsets[weaveindex];
|
|
|
|
actor->special1 = (weaveindex+2)&63;
|
|
|
|
// if (actor->floorclip > 0)
|
|
|
|
// {
|
|
|
|
// P_SetMobjState(actor, S_WRAITH_RAISE2);
|
|
|
|
// return;
|
|
|
|
// }
|
|
|
|
A_Chase (actor);
|
|
|
|
A_WraithFX4 (actor);
|
|
|
|
}
|