mirror of
https://github.com/UberGames/EF2GameSource.git
synced 2024-11-30 15:10:51 +00:00
1226 lines
33 KiB
C++
1226 lines
33 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /EF2/Code/DLLs/game/coverCombatWithRangedWeapon.cpp $
|
|
// $Revision:: 12 $
|
|
// $Author:: Singlis $
|
|
// $Date:: 9/26/03 2:36p $
|
|
//
|
|
// Copyright (C) 2002 by Ritual Entertainment, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// This source may not be distributed and/or modified without
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
//
|
|
//
|
|
// DESCRIPTION:
|
|
// CoverCombatWithRangedWeapon Implementation
|
|
//
|
|
// PARAMETERS:
|
|
// str _movementAnim -- The animation to play while moving to the cover node
|
|
//
|
|
// ANIMATIONS:
|
|
// _movementAnim : PARAMETER
|
|
//--------------------------------------------------------------------------------
|
|
|
|
#include "actor.h"
|
|
#include "coverCombatWithRangedWeapon.hpp"
|
|
|
|
extern Event EV_PostureChanged_Completed;
|
|
|
|
//--------------------------------------------------------------
|
|
//
|
|
// Init Static Vars
|
|
//
|
|
//--------------------------------------------------------------
|
|
const float CoverCombatWithRangedWeapon::NODE_RADIUS = 32.0f;
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
//
|
|
// Class Declaration and Event Registration
|
|
//
|
|
//--------------------------------------------------------------
|
|
CLASS_DECLARATION( Behavior, CoverCombatWithRangedWeapon, NULL )
|
|
{
|
|
{ &EV_Behavior_Args, &CoverCombatWithRangedWeapon::SetArgs },
|
|
{ &EV_Behavior_AnimDone, &CoverCombatWithRangedWeapon::AnimDone },
|
|
{ &EV_PostureChanged_Completed, &CoverCombatWithRangedWeapon::PostureDone },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: CoverCombatWithRangedWeapon()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Constructor
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
CoverCombatWithRangedWeapon::CoverCombatWithRangedWeapon()
|
|
{
|
|
_self = NULL;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: CoverCombatWithRangedWeapon()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Destructor
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
CoverCombatWithRangedWeapon::~CoverCombatWithRangedWeapon()
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: SetArgs()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets Arguments for this behavior
|
|
//
|
|
// Parameters: Event *ev -- Event holding the arguments
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::SetArgs( Event *ev )
|
|
{
|
|
_torsoAnim = ev->GetString ( 1 );
|
|
_fireAnim = ev->GetString ( 2 );
|
|
_movementAnim = ev->GetString ( 3 );
|
|
_maxDistance = ev->GetFloat ( 4 );
|
|
_fireTimeMin = ev->GetFloat ( 5 );
|
|
_fireTimeMax = ev->GetFloat ( 6 );
|
|
_pauseTimeMin = ev->GetFloat ( 7 );
|
|
_pauseTimeMax = ev->GetFloat ( 8 );
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: AnimDone()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Handles an animation completion
|
|
//
|
|
// Parameters: Event *ev -- Event holding the completion notification
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::AnimDone( Event *ev )
|
|
{
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: PostureDone()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Handles a Posture Done Event
|
|
//
|
|
// Parameters: Event *ev
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::PostureDone( Event *ev )
|
|
{
|
|
_finishedPostureTransition = true;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: Begin()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Initializes the behavior
|
|
//
|
|
// Parameters: Actor &self -- The actor executing this behavior
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::Begin( Actor &self )
|
|
{
|
|
init( self );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: Evaluate()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates the behavior
|
|
//
|
|
// Parameters: Actor &self -- The actor executing this behavior
|
|
//
|
|
// Returns: BehaviorReturnCode_t
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::Evaluate( Actor &self )
|
|
{
|
|
BehaviorReturnCode_t stateResult;
|
|
|
|
|
|
think();
|
|
|
|
switch ( _state )
|
|
{
|
|
//---------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_FIND_COVER:
|
|
//---------------------------------------------------------------------
|
|
stateResult = evaluateStateFindCover();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_MOVE_TO_COVER );
|
|
|
|
break;
|
|
|
|
//---------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_FIND_BETTER_COVER:
|
|
//---------------------------------------------------------------------
|
|
stateResult = evaluateStateFindBetterCover();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_MOVE_TO_COVER );
|
|
break;
|
|
|
|
//---------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_MOVE_TO_COVER:
|
|
//---------------------------------------------------------------------
|
|
stateResult = evaluateStateMoveToCover();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_CHANGE_POSTURE_DUCK );
|
|
|
|
break;
|
|
|
|
//---------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_CHANGE_POSTURE_DUCK:
|
|
//---------------------------------------------------------------------
|
|
if ( _spotted )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_SPOTTED );
|
|
BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
stateResult = evaluateStateChangePostureDuck();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_DUCKED );
|
|
break;
|
|
|
|
//---------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_CHANGE_POSTURE_STAND:
|
|
//---------------------------------------------------------------------
|
|
if ( _spotted )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_SPOTTED );
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
stateResult = evaluateStateChangePostureStand();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_STANDING );
|
|
|
|
break;
|
|
|
|
//----------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_FIRE_STANDING:
|
|
//----------------------------------------------------------------------
|
|
if ( _spotted )
|
|
{
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
transitionToState( COVERCOMBAT_WRW_SPOTTED );
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
stateResult = evaluateRotate();
|
|
stateResult = evaluateStateFireStanding();
|
|
|
|
// Check if we need to stop firing
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_FIRE_PAUSE_STANDING );
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
// See if we just need to duck again
|
|
stateResult = evaluateStateStanding();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
}
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_CHANGE_POSTURE_DUCK );
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
}
|
|
|
|
break;
|
|
|
|
//----------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_FIRE_PAUSE_STANDING:
|
|
//----------------------------------------------------------------------
|
|
if ( _spotted )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_SPOTTED );
|
|
BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
stateResult = evaluateRotate();
|
|
stateResult = evaluateStateFirePauseStanding();
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
{
|
|
transitionToState(COVERCOMBAT_WRW_FIRE_STANDING);
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
// See if we just need to duck again
|
|
stateResult = evaluateStateStanding();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
}
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_CHANGE_POSTURE_DUCK );
|
|
_fireWeapon.End( *_self );
|
|
setTorsoAnim();
|
|
}
|
|
|
|
break;
|
|
|
|
//----------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_DUCKED:
|
|
//----------------------------------------------------------------------
|
|
if ( _spotted )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_SPOTTED );
|
|
BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
stateResult = evaluateStateDucked();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_CHANGE_POSTURE_STAND );
|
|
break;
|
|
|
|
//----------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_STANDING:
|
|
//----------------------------------------------------------------------
|
|
if ( _spotted )
|
|
{
|
|
transitionToState( COVERCOMBAT_WRW_SPOTTED );
|
|
BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
stateResult = evaluateRotate();
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_FIRE_STANDING );
|
|
|
|
|
|
break;
|
|
|
|
//----------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_SPOTTED:
|
|
//----------------------------------------------------------------------
|
|
stateResult = evaluateStateSpotted();
|
|
|
|
if ( stateResult == BEHAVIOR_FAILED )
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
|
|
if ( stateResult == BEHAVIOR_SUCCESS )
|
|
transitionToState( COVERCOMBAT_WRW_FIND_BETTER_COVER );
|
|
break;
|
|
|
|
//----------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_SUCCESS:
|
|
//----------------------------------------------------------------------
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
break;
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
case COVERCOMBAT_WRW_FAILED:
|
|
//----------------------------------------------------------------------
|
|
return BEHAVIOR_FAILED;
|
|
|
|
break;
|
|
}
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: End()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Cleans Up the behavior
|
|
//
|
|
// Parameters: Actor &self -- The actor executing this behavior
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::End(Actor &self)
|
|
{
|
|
if ( !_self )
|
|
return;
|
|
|
|
_self->movementSubsystem->setMovingBackwards( false );
|
|
_fireWeapon.End(*_self);
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: transitionToState()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Transitions the behaviors state
|
|
//
|
|
// Parameters: coverCombatStates_t state -- The state to transition to
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::transitionToState( coverCombatStates_t state )
|
|
{
|
|
switch ( state )
|
|
{
|
|
case COVERCOMBAT_WRW_FIND_COVER:
|
|
setupStateFindCover();
|
|
setInternalState( state , "COVERCOMBAT_WRW_FIND_COVER" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_FIND_BETTER_COVER:
|
|
setupStateFindBetterCover();
|
|
setInternalState( state , "COVERCOMBAT_WRW_FIND_BETTER_COVER" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_MOVE_TO_COVER:
|
|
setupStateMoveToCover();
|
|
setInternalState( state , "COVERCOMBAT_WRW_MOVE_TO_COVER" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_CHANGE_POSTURE_DUCK:
|
|
setupStateChangePostureDuck();
|
|
setInternalState( state , "COVERCOMBAT_WRW_CHANGE_POSTURE_DUCK" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_CHANGE_POSTURE_STAND:
|
|
setupStateChangePostureStand();
|
|
setInternalState( state , "COVERCOMBAT_WRW_CHANGE_POSTURE_DUCK" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_FIRE_STANDING:
|
|
setupStateFireStanding();
|
|
setInternalState( state , "COVERCOMBAT_WRW_FIRE_STANDING" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_FIRE_PAUSE_STANDING:
|
|
setupStateFirePauseStanding();
|
|
setInternalState( state , "COVERCOMBAT_WRW_FIRE_PAUSE_STANDING" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_DUCKED:
|
|
setupStateDucked();
|
|
setInternalState( state , "COVERCOMBAT_WRW_DUCKED" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_STANDING:
|
|
setupStateStanding();
|
|
setInternalState( state , "COVERCOMBAT_WRW_STANDING" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_SPOTTED:
|
|
setupStateSpotted();
|
|
setInternalState( state , "COVERCOMBAT_WRW_SPOTTED" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_SUCCESS:
|
|
setInternalState( state , "COVERCOMBAT_WRW_SUCCESS" );
|
|
break;
|
|
|
|
case COVERCOMBAT_WRW_FAILED:
|
|
setInternalState( state , "COVERCOMBAT_WRW_FAILED" );
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setInternalState()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets the internal state of the behavior
|
|
//
|
|
// Parameters: unsigned int state
|
|
// const str &stateName
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setInternalState( coverCombatStates_t state , const str &stateName )
|
|
{
|
|
_state = state;
|
|
SetInternalStateName( stateName );
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: init()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Initializes the behavior
|
|
//
|
|
// Parameters: Actor &self
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::init( Actor &self )
|
|
{
|
|
_self = &self;
|
|
transitionToState(COVERCOMBAT_WRW_FIND_COVER);
|
|
_finishedPostureTransition = true;
|
|
_nextStandTime = 0.0f;
|
|
_nextDuckTime = 0.0f;
|
|
_nextSpotCheck = 0.0f;
|
|
updateEnemy();
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: think()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Does any processing required before evaluating states
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::think()
|
|
{
|
|
trace_t trace;
|
|
|
|
if ( level.time < _nextSpotCheck )
|
|
return;
|
|
|
|
if ( !_currentEnemy || !_node )
|
|
return;
|
|
|
|
updateEnemy();
|
|
trace = G_Trace( _node->origin , vec_zero , vec_zero , _currentEnemy->origin , NULL , MASK_SOLID, false, "CoverCombatWithRangedWeapon::think");
|
|
|
|
if ( trace.fraction >= .95 )
|
|
_spotted = true;
|
|
else
|
|
_spotted = false;
|
|
|
|
_nextSpotCheck = level.time + G_Random(0.5);
|
|
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: updateEnemy()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets our _currentEnemy
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::updateEnemy()
|
|
{
|
|
Entity *currentEnemy = _self->enemyManager->GetCurrentEnemy();
|
|
if ( !currentEnemy )
|
|
{
|
|
_self->enemyManager->FindHighestHateEnemy();
|
|
currentEnemy = _self->enemyManager->GetCurrentEnemy();
|
|
if ( !currentEnemy )
|
|
{
|
|
SetFailureReason( "CoverCombatWithRangedWeapon::updateEnemy -- No Enemy" );
|
|
transitionToState( COVERCOMBAT_WRW_FAILED );
|
|
}
|
|
|
|
}
|
|
|
|
_currentEnemy = currentEnemy;
|
|
setupRotate();
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateFindCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up the Find Cover State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateFindCover()
|
|
{
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateFindCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates the Find Cover State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: BehaviorReturnCode_t
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateFindCover()
|
|
{
|
|
//This Behavior's not being used anymore and should be removed
|
|
//_node = HelperNode::FindClosestHelperNodeThatCannotSeeEntity( *_self , NODETYPE_COVER , _self->edict->clipmask , _maxDistance , 0.0f , _currentEnemy );
|
|
|
|
if ( !_node )
|
|
{
|
|
failureStateFindCover( "CoverCombatWithRangedWeapon::evaluateStateFindCover() -- Cannot Find Suitable Cover Node" );
|
|
return BEHAVIOR_FAILED;
|
|
}
|
|
|
|
return BEHAVIOR_SUCCESS;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateFindCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for Find Cover State
|
|
//
|
|
// Parameters: const str& failureReason
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateFindCover(const str& failureReason)
|
|
{
|
|
SetFailureReason( failureReason );
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateMoveToCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up the Move To Cover State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateMoveToCover()
|
|
{
|
|
_gotoPoint.SetAnim( _movementAnim );
|
|
_gotoPoint.SetDistance( NODE_RADIUS );
|
|
_gotoPoint.SetPoint( _node->origin );
|
|
_gotoPoint.Begin( *_self );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateMoveToCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates the Move To Cover State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateMoveToCover()
|
|
{
|
|
BehaviorReturnCode_t result = _gotoPoint.Evaluate( *_self );
|
|
str failureReason = "CoverCombatWithRangedWeapon::evaluateStateMoveToCover -- _gotoPoint component returned: " + _gotoPoint.GetFailureReason();
|
|
|
|
if ( result == BEHAVIOR_FAILED )
|
|
failureStateMoveToCover( failureReason );
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateMoveToCover
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for State Move To Cover
|
|
//
|
|
// Parameters: const str &failureReason
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateMoveToCover( const str &failureReason )
|
|
{
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateChangePostureDuck()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up the ChangePostureDuck state
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateChangePostureDuck()
|
|
{
|
|
bool canChange = _self->postureController->requestPosture( "DUCK" , this );
|
|
|
|
if ( !canChange )
|
|
{
|
|
failureStateChangePostureDuck ( "Requested Posture is unavailable" );
|
|
return;
|
|
}
|
|
|
|
_finishedPostureTransition = false;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateChangePostureDuck()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates our ChangePostureDuck state
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateChangePostureDuck()
|
|
{
|
|
//Basically waiting for our check to come true
|
|
if ( _finishedPostureTransition )
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateChangePostureDuck()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for ChangePostureDuck State
|
|
//
|
|
// Parameters: const str &failureReason -- Why we're failing
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateChangePostureDuck( const str &failureReason )
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateChangePostureStand()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up the ChangePostureStand state
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateChangePostureStand()
|
|
{
|
|
bool canChange = _self->postureController->requestPosture( "STAND" , this );
|
|
|
|
if ( !canChange )
|
|
{
|
|
failureStateChangePostureStand ( "Requested Posture is unavailable" );
|
|
return;
|
|
}
|
|
|
|
_finishedPostureTransition = false;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateChangePostureStand()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates our ChangePostureStand state
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateChangePostureStand()
|
|
{
|
|
//Basically waiting for our check to come true
|
|
if ( _finishedPostureTransition )
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateChangePostureStand()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for Change Posture Stand function
|
|
//
|
|
// Parameters: const str &failureReason
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateChangePostureStand( const str &failureReason )
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateSpotted()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up the Spotted State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateSpotted()
|
|
{
|
|
bool canChange = _self->postureController->requestPosture( "STAND" , this );
|
|
|
|
if ( !canChange )
|
|
{
|
|
failureStateChangePostureStand ( "Requested Posture is unavailable" );
|
|
return;
|
|
}
|
|
|
|
_finishedPostureTransition = false;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateSpotted()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates our Spotted State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateSpotted()
|
|
{
|
|
//Basically waiting for our check to come true
|
|
if ( _finishedPostureTransition )
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateSpotted()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for Spotted State
|
|
//
|
|
// Parameters: const str &failureReason -- Why we failed
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateSpotted( const str &failureReason )
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateDucked()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up our Ducked State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateDucked()
|
|
{
|
|
_nextStandTime = level.time + G_Random() + 3.0f;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateDucked()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates our Ducked State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateDucked()
|
|
{
|
|
if ( level.time > _nextStandTime )
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateDucked()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for Ducked State
|
|
//
|
|
// Parameters: const str &failureReason -- Why we failed
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateDucked( const str &failureReason )
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Setup for the Standing State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateStanding()
|
|
{
|
|
_nextDuckTime = level.time + G_Random() + 5.0f;
|
|
_nextFireTime = 0.0f;
|
|
_nextPauseTime = level.time + G_Random(_pauseTimeMax ) + _pauseTimeMin;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates the Standing State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateStanding()
|
|
{
|
|
if ( level.time > _nextDuckTime )
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for the Standing State
|
|
//
|
|
// Parameters: const str &failureReason
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateStanding( const str &failureReason )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateFindBetterCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up the Find Better Cover State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateFindBetterCover()
|
|
{
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateFindBetterCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates the Find Better Cover State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: BehaviorReturnCode_t
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateFindBetterCover()
|
|
{
|
|
//Behavior Needs to be removed
|
|
// _node = HelperNode::FindClosestHelperNodeThatCannotSeeEntity( *_self , NODETYPE_COVER , _self->edict->clipmask , _maxDistance , 512.0f , _currentEnemy );
|
|
|
|
if ( !_node )
|
|
{
|
|
failureStateFindCover( "CoverCombatWithRangedWeapon::evaluateStateFindBetterCover() -- Cannot Find Suitable Cover Node" );
|
|
return BEHAVIOR_FAILED;
|
|
}
|
|
|
|
return BEHAVIOR_SUCCESS;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateFindBetterCover()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for Find Cover State
|
|
//
|
|
// Parameters: const str& failureReason
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateFindBetterCover(const str& failureReason)
|
|
{
|
|
SetFailureReason( failureReason );
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupRotate
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up Rotate Component
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupRotate()
|
|
{
|
|
_rotate.SetEntity( _currentEnemy );
|
|
_rotate.Begin( *_self );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateRotate()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates our Rotate Component
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateRotate()
|
|
{
|
|
return _rotate.Evaluate( *_self );
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateFireStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up our Fire Standing State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateFireStanding()
|
|
{
|
|
_nextFireTime = level.time + G_Random( _fireTimeMax ) + _fireTimeMin;
|
|
if ( _self->combatSubsystem->CanAttackEnemy() )
|
|
{
|
|
_fireWeapon.SetAnim( _fireAnim );
|
|
_fireWeapon.Begin( *_self );
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateFireStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates our Fire Standing State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateFireStanding()
|
|
{
|
|
_fireWeapon.Evaluate( *_self );
|
|
_self->combatSubsystem->AimWeaponTag(_currentEnemy);
|
|
|
|
if ( level.time > _nextFireTime )
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateFireStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for Fire Standing State
|
|
//
|
|
// Parameters: const str &failureReason -- Why we're failing
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateFireStanding( const str &failureReason )
|
|
{
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setupStateFirePauseStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets up our Pause Fire State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setupStateFirePauseStanding()
|
|
{
|
|
_nextPauseTime = level.time + G_Random( _pauseTimeMax ) + _pauseTimeMin;
|
|
setTorsoAnim();
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: evaluateStateFirePauseStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Evaluates our Pause Fire State
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
BehaviorReturnCode_t CoverCombatWithRangedWeapon::evaluateStateFirePauseStanding()
|
|
{
|
|
if ( level.time > _nextPauseTime )
|
|
return BEHAVIOR_SUCCESS;
|
|
|
|
return BEHAVIOR_EVALUATING;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: failureStateFirePauseStanding()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Failure Handler for our Pause Standing State
|
|
//
|
|
// Parameters: const str &failureReason -- Why we're failing
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::failureStateFirePauseStanding( const str &failureReason )
|
|
{
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: setTorsoAnim()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Sets our Torso Animation
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//--------------------------------------------------------------
|
|
void CoverCombatWithRangedWeapon::setTorsoAnim()
|
|
{
|
|
_self->SetAnim( _torsoAnim , NULL , torso );
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
// Name: CanExecute()
|
|
// Class: CoverCombatWithRangedWeapon
|
|
//
|
|
// Description: Checks if the Behavior can execute
|
|
//
|
|
// Parameters: Actor &self,
|
|
// float maxDistance
|
|
//
|
|
// Returns: true or false;
|
|
//--------------------------------------------------------------
|
|
bool CoverCombatWithRangedWeapon::CanExecute( Actor &self , float maxDistance )
|
|
{
|
|
//HelperNode* node;
|
|
Entity* currentEnemy;
|
|
|
|
currentEnemy = self.enemyManager->GetCurrentEnemy();
|
|
|
|
if ( !currentEnemy )
|
|
return false;
|
|
|
|
//behavior needs to be removed
|
|
// node = HelperNode::FindClosestHelperNodeThatCannotSeeEntity( self , NODETYPE_COVER , self.edict->clipmask , maxDistance , 0.0f , currentEnemy );
|
|
|
|
//if ( node )
|
|
// return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|