예제 #1
0
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_M_Refire)
{
	PARAM_ACTION_PROLOGUE;
	PARAM_BOOL_OPT(ignoremissile)	{ ignoremissile = false; }

	if (self->target == NULL || self->target->health <= 0)
	{
		if (self->MissileState && pr_m_refire() < 160)
		{ // Look for a new target most of the time
			if (P_LookForPlayers (self, true, NULL) && P_CheckMissileRange (self))
			{ // Found somebody new and in range, so don't stop shooting
				return 0;
			}
		}
		self->SetState (self->state + 1);
		return 0;
	}
	if (((ignoremissile || self->MissileState == NULL) && !self->CheckMeleeRange ()) ||
		!P_CheckSight (self, self->target) ||
		pr_m_refire() < 4)	// Small chance of stopping even when target not dead
	{
		self->SetState (self->state + 1);
	}
	return 0;
}
예제 #2
0
DEFINE_ACTION_FUNCTION(AActor, A_CrusaderChoose)
{
	if (self->target == NULL)
		return;

	if (Sys_1ed64 (self))
	{
		A_FaceTarget (self);
		self->angle -= ANGLE_180/16;
		P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, PClass::FindClass("FastFlameMissile"));
	}
	else
	{
		if (P_CheckMissileRange (self))
		{
			A_FaceTarget (self);
			P_SpawnMissileZAimed (self, self->z + 56*FRACUNIT, self->target, PClass::FindClass("CrusaderMissile"));
			self->angle -= ANGLE_45/32;
			P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, PClass::FindClass("CrusaderMissile"));
			self->angle += ANGLE_45/16;
			P_SpawnMissileZAimed (self, self->z + 40*FRACUNIT, self->target, PClass::FindClass("CrusaderMissile"));
			self->angle -= ANGLE_45/16;
			self->reactiontime += 15;
		}
		self->SetState (self->SeeState);
	}
}
예제 #3
0
DEFINE_ACTION_FUNCTION(AActor, A_M_Refire)
{
	// [BC] Let the server do this.
	if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) ||
		( CLIENTDEMO_IsPlaying( )))
	{
		return;
	}

	if (self->target == NULL || self->target->health <= 0)
	{
		if (self->MissileState && pr_m_refire() < 160)
		{ // Look for a new target most of the time
			if (P_LookForPlayers (self, true) && P_CheckMissileRange (self))
			{ // Found somebody new and in range, so don't stop shooting
				return;
			}
		}

		// [BC] Update the thing's state.
		if ( NETWORK_GetState( ) == NETSTATE_SERVER )
			SERVERCOMMANDS_SetThingFrame( self, self->state + 1 );

		self->SetState (self->state + 1);
		return;
	}
	if ((self->MissileState == NULL && !self->CheckMeleeRange ()) ||
		!P_CheckSight (self, self->target) ||
		pr_m_refire() < 4)	// Small chance of stopping even when target not dead
	{
		// [BC] Update the thing's state.
		if ( NETWORK_GetState( ) == NETSTATE_SERVER )
			SERVERCOMMANDS_SetThingFrame( self, self->state + 1 );

		self->SetState (self->state + 1);
	}
}
예제 #4
0
DEFINE_ACTION_FUNCTION(AActor, A_MinotaurChase)
{
    PARAM_ACTION_PROLOGUE;

    if (!self->IsKindOf(RUNTIME_CLASS(AMinotaurFriend)))
    {
        A_Chase (stack, self);
        return 0;
    }

    AMinotaurFriend *self1 = static_cast<AMinotaurFriend *> (self);

    // In case pain caused him to skip his fade in.
    self1->RenderStyle = STYLE_Normal;

    if (self1->StartTime >= 0 && (level.maptime - self1->StartTime) >= MAULATORTICS)
    {
        P_DamageMobj (self1, NULL, NULL, TELEFRAG_DAMAGE, NAME_None);
        return 0;
    }

    if (pr_minotaurchase() < 30)
        CALL_ACTION(A_MinotaurLook, self1);		// adjust to closest target

    if (!self1->target || (self1->target->health <= 0) ||
            !(self1->target->flags&MF_SHOOTABLE))
    {   // look for a new target
        self1->SetIdle();
        return 0;
    }

    FaceMovementDirection (self1);
    self1->reactiontime = 0;

    // Melee attack
    if (self1->MeleeState && self1->CheckMeleeRange ())
    {
        if (self1->AttackSound)
        {
            S_Sound (self1, CHAN_WEAPON, self1->AttackSound, 1, ATTN_NORM);
        }
        self1->SetState (self1->MeleeState);
        return 0;
    }

    // Missile attack
    if (self1->MissileState && P_CheckMissileRange(self1))
    {
        self1->SetState (self1->MissileState);
        return 0;
    }

    // chase towards target
    if (!P_Move (self1))
    {
        P_NewChaseDir (self1);
        FaceMovementDirection (self1);
    }

    // Active sound
    if (pr_minotaurchase() < 6)
    {
        self1->PlayActiveSound ();
    }
    return 0;
}