ef2gamesource/dlls/game/useAlarm.cpp
2012-12-31 16:19:55 +01:00

628 lines
16 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /EF2/Code/DLLs/game/useAlarm.cpp $
// $Revision:: 10 $
// $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:
// CorridorCombatWithRangedWeapon Implementation
//
// PARAMETERS:
// str _movementAnim -- The animation to play while moving to the cover node
//
// ANIMATIONS:
// _movementAnim : PARAMETER
//--------------------------------------------------------------------------------
#include "actor.h"
#include "useAlarm.hpp"
//--------------------------------------------------------------
//
// Class Declaration and Event Registration
//
//--------------------------------------------------------------
CLASS_DECLARATION( Behavior, UseAlarm, NULL )
{
{ &EV_Behavior_Args, &UseAlarm::SetArgs },
{ &EV_Behavior_AnimDone, &UseAlarm::AnimDone },
{ &EV_HelperNodeCommand, &UseAlarm::HandleNodeCommand },
{ NULL, NULL }
};
//--------------------------------------------------------------
// Name: UseAlarm()
// Class: UseAlarm()
//
// Description: Constructor
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
UseAlarm::UseAlarm()
{
_movementAnimName = "walk";
_maxDistance = 1024.0f;
}
//--------------------------------------------------------------
// Name: ~UseAlarm()
// Class: UseAlarm
//
// Description: Destructor
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
UseAlarm::~UseAlarm()
{
}
//--------------------------------------------------------------
// Name: SetArgs()
// Class: UseAlarm
//
// Description: Sets the arguments of the behavior
//
// Parameters: Event *ev
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::SetArgs ( Event *ev)
{
if (ev->NumArgs() == 1)
{
_movementAnimName = ev->GetString( 1 );
}
}
//--------------------------------------------------------------
// Name: AnimDone()
// Class: UseAlarm
//
// Description: Handles an animation completion
//
// Parameters: Event *ev -- Event holding the completion notification
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::AnimDone( Event * )
{
switch( _state )
{
case USE_ALARM_WAIT_ON_ANIM:
_animDone = true;
break;
}
}
//--------------------------------------------------------------
// Name: HandleNodeCommand()
// Class: UseAlarm
//
// Description: Handles a command event from a helper node
//
// Parameters: Event *ev
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::HandleNodeCommand( Event * )
{
}
//--------------------------------------------------------------
// Name: Begin()
// Class: UseAlarm
//
// Description: Begins the Behavior
//
// Parameters: Actor &self
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::Begin( Actor &self )
{
init( self );
}
//--------------------------------------------------------------
// Name: Evaluate()
// Class: UseAlarm
//
// Description: Returns True Or False, and is run every frame
// that the behavior
//
// Parameters: Actor &self
//
// Returns: True or False
//--------------------------------------------------------------
BehaviorReturnCode_t UseAlarm::Evaluate ( Actor & )
{
BehaviorReturnCode_t stateResult;
think();
switch ( _state )
{
//---------------------------------------------------------------------
case USE_ALARM_FIND_NODE:
//---------------------------------------------------------------------
stateResult = evaluateStateFindNode();
if ( stateResult == BEHAVIOR_FAILED )
transitionToState( USE_ALARM_FAILED );
if ( stateResult == BEHAVIOR_SUCCESS )
transitionToState( USE_ALARM_MOVE_TO_NODE );
break;
//---------------------------------------------------------------------
case USE_ALARM_MOVE_TO_NODE:
//---------------------------------------------------------------------
stateResult = evaluateStateMoveToNode();
if ( stateResult == BEHAVIOR_FAILED )
transitionToState( USE_ALARM_FAILED );
if ( stateResult == BEHAVIOR_SUCCESS )
transitionToState( USE_ALARM_AT_NODE );
break;
//---------------------------------------------------------------------
case USE_ALARM_AT_NODE:
//---------------------------------------------------------------------
stateResult = evaluateStateAtNode();
if ( stateResult == BEHAVIOR_FAILED )
transitionToState( USE_ALARM_FAILED );
if ( stateResult == BEHAVIOR_SUCCESS )
transitionToState( USE_ALARM_WAIT_ON_ANIM );
break;
//---------------------------------------------------------------------
case USE_ALARM_WAIT_ON_ANIM:
//---------------------------------------------------------------------
stateResult = evaluateStateWaitOnAnim();
if ( stateResult == BEHAVIOR_FAILED )
transitionToState( USE_ALARM_FAILED );
if ( stateResult == BEHAVIOR_SUCCESS )
transitionToState( USE_ALARM_ROTATE_TO_ENEMY );
break;
//---------------------------------------------------------------------
case USE_ALARM_ROTATE_TO_ENEMY:
//---------------------------------------------------------------------
stateResult = evaluateStateRotateToEnemy();
if ( stateResult == BEHAVIOR_FAILED )
transitionToState( USE_ALARM_FAILED );
if ( stateResult == BEHAVIOR_SUCCESS )
transitionToState( USE_ALARM_SUCCESSFUL );
break;
//---------------------------------------------------------------------
case USE_ALARM_SUCCESSFUL:
//---------------------------------------------------------------------
_node->RunExitThread();
return BEHAVIOR_SUCCESS;
break;
//---------------------------------------------------------------------
case USE_ALARM_FAILED:
//---------------------------------------------------------------------
return BEHAVIOR_FAILED;
break;
}
return BEHAVIOR_EVALUATING;
}
//--------------------------------------------------------------
// Name: End()
// Class: UseAlarm
//
// Description: Ends the Behavior
//
// Parameters: Actor &self
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::End ( Actor & )
{
if ( _node )
{
_node->SetUser( NULL );
}
}
//--------------------------------------------------------------
// Name: transitionToState()
// Class: UseAlarm
//
// Description: Transitions Internal State
//
// Parameters: workStates_t state
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::transitionToState ( useAlarmStates_t state )
{
switch ( state )
{
case USE_ALARM_FIND_NODE:
setupStateFindNode();
setInternalState( state , "USE_ALARM_FIND_NODE" );
break;
case USE_ALARM_MOVE_TO_NODE:
setupStateMoveToNode();
setInternalState( state , "USE_ALARM_MOVE_TO_NODE" );
break;
case USE_ALARM_AT_NODE:
setupStateAtNode();
setInternalState( state , "USE_ALARM_AT_NODE" );
break;
case USE_ALARM_WAIT_ON_ANIM:
setupStateWaitOnAnim();
setInternalState( state , "WORK_ANIMATE_WAIT_ON_ANIM" );
break;
case USE_ALARM_ROTATE_TO_ENEMY:
setupStateRotateToEnemy();
setInternalState( state, "USE_ALARM_ROTATE_TO_ENEMY" );
break;
case USE_ALARM_SUCCESSFUL:
setInternalState( state , "WORK_SUCCESSFUL" );
break;
case USE_ALARM_FAILED:
setInternalState( state , "WORK_FAILED" );
break;
}
}
//--------------------------------------------------------------
// Name: setInternalState()
// Class: UseAlarm
//
// Description: Sets internal state of the behavior
//
// Parameters: workStates_t state
// const str &stateName
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::setInternalState ( useAlarmStates_t state , const str &stateName )
{
_state = state;
SetInternalStateName( stateName );
}
//--------------------------------------------------------------
// Name: init()
// Class: UseAlarm
//
// Description: Initializes memeber variables
//
// Parameters: Actor &self -- Actor executing this behavior
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::init( Actor &self )
{
_self = &self;
_animDone = false;
transitionToState( USE_ALARM_FIND_NODE );
}
//--------------------------------------------------------------
// Name: think()
// Class: UseAlarm
//
// Description: Think function called every frame by evaluate
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::think()
{
}
//--------------------------------------------------------------
// Name: setupStateFindNode()
// Class: UseAlarm
//
// Description: Sets up State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::setupStateFindNode()
{
str currentNodeCustomType;
if ( _self->currentHelperNode.node )
currentNodeCustomType = _self->currentHelperNode.node->GetCustomType();
if ( currentNodeCustomType == "alarm" )
_node = &(*_self->currentHelperNode.node);
else
_node = HelperNode::FindClosestHelperNode( *_self , "alarm" , _maxDistance );
}
//--------------------------------------------------------------
// Name: evaluateStateFindNode()
// Class: UseAlarm
//
// Description: Evaluates State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
BehaviorReturnCode_t UseAlarm::evaluateStateFindNode()
{
if ( !_node )
return BEHAVIOR_FAILED;
return BEHAVIOR_SUCCESS;
}
//--------------------------------------------------------------
// Name: failureStateFindNode()
// Class: UseAlarm
//
// Description: Failure Handler for State
//
// Parameters: const str& failureReason -- Why we failed
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::failureStateFindNode( const str& failureReason )
{
Q_UNUSED(failureReason);
}
//--------------------------------------------------------------
// Name: setupStateMoveToNode()
// Class: UseAlarm
//
// Description: Sets up State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::setupStateMoveToNode()
{
_gotoHelperNode.SetNode( _node );
_gotoHelperNode.SetMovementAnim ( _movementAnimName );
_gotoHelperNode.Begin( *_self );
}
//--------------------------------------------------------------
// Name: evaluateStateMoveToNode()
// Class: UseAlarm
//
// Description: Evaluates State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
BehaviorReturnCode_t UseAlarm::evaluateStateMoveToNode()
{
return _gotoHelperNode.Evaluate( *_self );
}
//--------------------------------------------------------------
// Name: failureStateMoveToNode()
// Class: UseAlarm
//
// Description: Failure Handler for State
//
// Parameters: const str& failureReason -- Why we failed
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::failureStateMoveToNode( const str& failureReason )
{
Q_UNUSED(failureReason);
}
//--------------------------------------------------------------
// Name: setupStateAtNode()
// Class: UseAlarm
//
// Description: Sets up State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::setupStateAtNode()
{
_self->SetAnim( "idle" );
_self->RunThread( _node->GetEntryThread() );
}
//--------------------------------------------------------------
// Name: evaluateStateAtNode()
// Class: UseAlarm
//
// Description: Evaluates State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
BehaviorReturnCode_t UseAlarm::evaluateStateAtNode()
{
Vector nodeAngles = _node->angles;
_self->movementSubsystem->setAnimDir( nodeAngles );
_self->setAngles( nodeAngles );
_node->SetUser( this );
return BEHAVIOR_SUCCESS;
}
//--------------------------------------------------------------
// Name: failureStateAtNode()
// Class: UseAlarm
//
// Description: Failure Handler for State
//
// Parameters: const str& failureReason -- Why we failed
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::failureStateAtNode( const str& failureReason )
{
Q_UNUSED(failureReason);
}
//--------------------------------------------------------------
// Name: setupStateWaitOnAnim()
// Class: UseAlarm
//
// Description: Sets up State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::setupStateWaitOnAnim()
{
if( ! _self->SetAnim( _node->GetAnim() , EV_Actor_NotifyBehavior , legs ) )
{
// setanim returns false if the node-specified anim doesn't exist, so
// set _animDone=true to avoid them just standing there.
_animDone = true;
}
else
{
// anim was set successfully, so let the behavior know it should wait for the
// anim to finish before continuing.
_animDone = false;
}
}
//--------------------------------------------------------------
// Name: evaluateStateWaitOnAnim()
// Class: UseAlarm
//
// Description: Evaluates State
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
BehaviorReturnCode_t UseAlarm::evaluateStateWaitOnAnim()
{
if ( _animDone )
return BEHAVIOR_SUCCESS;
return BEHAVIOR_EVALUATING;
}
//--------------------------------------------------------------
// Name: failureStateWaitOnAnim()
// Class: UseAlarm
//
// Description: Failure Handler for State
//
// Parameters: const str& failureReason -- Why we failed
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::failureStateWaitOnAnim( const str& failureReason )
{
Q_UNUSED(failureReason);
}
//--------------------------------------------------------------
// Name: setupStateRotateToEnemy()
// Class: UseAlarm
//
// Description: Sets up state
//
// Parameters: None
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::setupStateRotateToEnemy()
{
Entity *enemy = _self->enemyManager->GetCurrentEnemy();
if ( !enemy )
return;
_rotateToEntity.SetAnim( "idle" );
_rotateToEntity.SetEntity( enemy );
_rotateToEntity.SetTurnSpeed( 25.0f );
_rotateToEntity.Begin( *_self );
}
//--------------------------------------------------------------
// Name: evaluateStateRotateToEnemy()
// Class: UseAlarm
//
// Description: Evaluates State
//
// Parameters: None
//
// Returns: BehaviorReturnCode_t
//--------------------------------------------------------------
BehaviorReturnCode_t UseAlarm::evaluateStateRotateToEnemy()
{
return _rotateToEntity.Evaluate( *_self );
}
//--------------------------------------------------------------
// Name: failureStateRotateToEnemy()
// Class: UseAlarm
//
// Description: Failure Handler for State
//
// Parameters: const str &failureReason
//
// Returns: None
//--------------------------------------------------------------
void UseAlarm::failureStateRotateToEnemy( const str &failureReason )
{
Q_UNUSED(failureReason);
}