Esempio n. 1
0
void DialogueManager::nextAnswer() {
	if (_q->_answers[0] == NULL) {
		transitionToState(DIALOGUE_OVER);
		return;
	}

	// try and check if there are any suitable answers,
	// given the current game state.
	addVisibleAnswers(_q);
	if (!_numVisAnswers) {
		// if there are no answers, then chicken out
		transitionToState(DIALOGUE_OVER);
		return;
	}

	if (_visAnswers[0]._a->textIsNull()) {
		// if the first answer is null (it's implied that it's the
		// only one because we already called addVisibleAnswers),
		// then jump to the next question
		_answerId = _visAnswers[0]._index;
		transitionToState(NEXT_QUESTION);
	} else {
		// at this point we are sure there are non-null answers to show
		displayAnswers();
		transitionToState(RUN_ANSWER);
	}
}
Esempio n. 2
0
void WatchEntity::init( Actor &self )
{
	SetSelf(&self);

	if ( _time > 0 )
		_time = level.time + _time;

	_oldTurnSpeed  = self.movementSubsystem->getTurnSpeed();

	//Check if we have an entity to watch
	if ( !_ent )
		{
		self.enemyManager->FindHighestHateEnemy();
		_ent = self.enemyManager->GetCurrentEnemy();

		if ( !_ent )
			{

			if ( _forcePlayer )
				_ent = (Entity*)GetPlayer( 0 );

			if ( !_ent )
				{
				transitionToState(WATCH_FAILED);			
				return;
				}
			}
		}

	transitionToState(WATCH_HOLD);	
}
Esempio n. 3
0
void DialogueManager::nextQuestion() {
	_q = _dialogue->findQuestion(_q->_answers[_answerId]->_followingName);
	if (_q == 0) {
		transitionToState(DIALOGUE_OVER);
	} else {
		transitionToState(displayQuestion() ? RUN_QUESTION : NEXT_ANSWER);
	}
}
Esempio n. 4
0
void WatchEntity::think()
{
	 if ( _time > 0 && level.time >= _time )
		transitionToState(WATCH_SUCCESS);

	 if ( _waitForAnim && _animDone )
		transitionToState(WATCH_SUCCESS);
}
Esempio n. 5
0
//--------------------------------------------------------------
// Name:        Begin()
// Class:       TorsoAimAndFireWeapon
//
// Description: Initializes the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     None
//--------------------------------------------------------------
void TorsoAimAndFireWeapon::Begin( Actor &self )
{       
	init( self );

	if (_preFireAnim.length() && !_aimOnly )
		transitionToState ( TORSO_AIM_AND_FIRE_PRE_FIRE );
	else
		transitionToState ( TORSO_AIM_AND_FIRE_AIM );
}
Esempio n. 6
0
//--------------------------------------------------------------
// Name:        Evaluate()
// Class:       GotoCurrentHelperNode
//
// Description: Evaluates the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     BehaviorReturnCode_t 
//--------------------------------------------------------------
BehaviorReturnCode_t GotoCurrentHelperNode::Evaluate( Actor & )
{
	BehaviorReturnCode_t stateResult;

	think();
	
	switch ( _state )
		{
		//---------------------------------------------------------------------
		case GOTO_HNODE_FIND_NODE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateFindNode();

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( GOTO_HNODE_MOVE_TO_NODE );
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( GOTO_HNODE_FAILED );
		break;

		//---------------------------------------------------------------------
		case GOTO_HNODE_MOVE_TO_NODE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateMoveToNode();

			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( GOTO_HNODE_FAILED );
			
			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( GOTO_HNODE_SUCCESS );
		break;


		//---------------------------------------------------------------------
		case GOTO_HNODE_SUCCESS:
		//---------------------------------------------------------------------
			return BEHAVIOR_SUCCESS;

		break;


		//---------------------------------------------------------------------
		case GOTO_HNODE_FAILED:
		//---------------------------------------------------------------------
			return BEHAVIOR_FAILED;

		break;


		}
	

	return BEHAVIOR_EVALUATING;   

}
Esempio n. 7
0
//--------------------------------------------------------------
// Name:        Evaluate()
// Class:       WatchEntity
//
// Description: Evaluates the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     BehaviorReturnCode_t 
//--------------------------------------------------------------
BehaviorReturnCode_t WatchEntity::Evaluate( Actor &self )
{  

	BehaviorReturnCode_t stateResult;

	think();

	switch ( _state )
		{
		//---------------------------------------------------------------------
		case WATCH_HOLD:
		//---------------------------------------------------------------------
			stateResult = evaluateStateHold(self);
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WATCH_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WATCH_ROTATE ); 
		break;
		

		//---------------------------------------------------------------------
		case WATCH_ROTATE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateRotate(self);
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WATCH_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WATCH_HOLD ); 

		break;

		//---------------------------------------------------------------------
		case WATCH_SUCCESS:
		//---------------------------------------------------------------------
			return BEHAVIOR_SUCCESS;
		break;

		//---------------------------------------------------------------------
		case WATCH_FAILED:
		//---------------------------------------------------------------------
			return BEHAVIOR_FAILED;
		break;

		}

   return BEHAVIOR_EVALUATING; 

}
Esempio n. 8
0
/**
	This method is used to advance the controller in time. It takes in a list of the contact points, since they might be
	used to determine when to transition to a new state. This method returns -1 if the controller does not advance to a new state,
	or the index of the state that it transitions to otherwise.
*/
int SimBiController::advanceInTime(double dt, DynamicArray<ContactPoint> *cfs){
	if (FSMStateIndex >= (int)states.size()){
		tprintf("Warning: no FSM state was selected in the controller!\n");
		return -1;
	}

	bodyTouchedTheGround = false;
	//see if anything else other than the feet touch the ground...
	for (uint i=0;i<cfs->size();i++){
		//if neither of the bodies involved are articulated, it means they are just props so we can ignore them
		if ((*cfs)[i].rb1->isArticulated() == false && (*cfs)[i].rb2->isArticulated() == false)
			continue;
			
		if (isFoot((*cfs)[i].rb1) || isFoot((*cfs)[i].rb2))
			continue;

		bodyTouchedTheGround = true;
	}

	//advance the phase of the controller
	this->phi += dt/states[FSMStateIndex]->getStateTime();

	//see if we have to transition to the next state in the FSM, and do it if so...
	if (states[FSMStateIndex]->needTransition(phi, fabs(getForceOnFoot(swingFoot, cfs).dotProductWith(SimGlobals::up)), fabs(getForceOnFoot(stanceFoot, cfs).dotProductWith(SimGlobals::up)))){
		int newStateIndex = states[FSMStateIndex]->getNextStateIndex();
		transitionToState(newStateIndex);
		return newStateIndex;
	}

	//if we didn't transition to a new state...
	return -1;
}
Esempio n. 9
0
void DialogueManager::runQuestion() {
	if (_mouseButtons == kMouseLeftUp) {
		_gfx->freeDialogueObjects();
		transitionToState(NEXT_ANSWER);
	}

}
Esempio n. 10
0
void DialogueManager::runAnswer() {
	_answerId = selectAnswer();
	if (_answerId != NO_ANSWER_SELECTED) {
		_cmdList = &_q->_answers[_answerId]->_commands;
		_gfx->freeDialogueObjects();
		transitionToState(NEXT_QUESTION);
	}
}
Esempio n. 11
0
//--------------------------------------------------------------
// Name:		init()
// Class:		CorridorCombatWithRangedWeapon
//
// Description:	Initializes the behavior
//
// Parameters:	Actor &self
//
// Returns:		None
//--------------------------------------------------------------
void CorridorCombatWithRangedWeapon::init( Actor &self )
{
	_self = &self;
	transitionToState(CORRIDORCOMBAT_WRW_FINDNODE);
	_finishedPostureTransition = true;		
	_holdPositionTime = 0.0f;
	_enemyUpdateTime = 0.0f;
	updateEnemy();	
}
Esempio n. 12
0
//--------------------------------------------------------------
// Name:        init()
// Class:       Work
//
// Description: Initializes memeber variables
//
// Parameters:  Actor &self -- Actor executing this behavior
//
// Returns:     None
//--------------------------------------------------------------
void Work::init( Actor &self )
{
	_self			= &self;
	_animDone		= false;
	_endTime		= 0.0f;
	_node = self.currentHelperNode.node;
	transitionToState( WORK_FIND_NODE );
		
}
Esempio n. 13
0
//--------------------------------------------------------------
//
// Name:        Evaluate()
// Class:       CloseInOnEnemyWhileFiringWeapon
//
// Description: Update for this behavior -- called every server frame
//
// Parameters:  Actor &self -- Actor executing this behavior
//
// Returns:     BehaviorReturnCode_t
//
//--------------------------------------------------------------
BehaviorReturnCode_t CloseInOnEnemyWhileFiringWeapon::Evaluate( Actor & )
{

	BehaviorReturnCode_t stateResult;

	think();

	switch ( _state )
		{
		//---------------------------------------------------------------------
		case CIWF_APPROACH_SETUP_APPROACH:
		//---------------------------------------------------------------------
			stateResult = evaluateStateSetupApproach();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( CIWF_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( CIWF_APPROACH_FIRE );
		break;

		//---------------------------------------------------------------------
		case CIWF_APPROACH_FIRE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateApproachFire();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( CIWF_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( CIWF_APPROACH_FIRE_PAUSE );
		break;		

		//---------------------------------------------------------------------
		case CIWF_APPROACH_FIRE_PAUSE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateApproachFirePause();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( CIWF_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( CIWF_APPROACH_FIRE );
		break;	

		//---------------------------------------------------------------------
		case CIWF_SUCCESS:
		//---------------------------------------------------------------------
			return BEHAVIOR_SUCCESS;
		break;

		//---------------------------------------------------------------------
		case CIWF_FAILED:
		//---------------------------------------------------------------------
			return BEHAVIOR_FAILED;
		break;
		}
	
	return BEHAVIOR_EVALUATING;
}
Esempio n. 14
0
//--------------------------------------------------------------
// Name:		updateEnemy()
// Class:		CloseInOnEnemyWhileFiringWeapon
//
// Description:	Sets our _currentEnemy
//
// Parameters:	None
//
// Returns:		None
//--------------------------------------------------------------
void CloseInOnEnemyWhileFiringWeapon::updateEnemy()
{
	Entity *currentEnemy = _self->enemyManager->GetCurrentEnemy();
	if ( !currentEnemy )
		{
		_self->enemyManager->FindHighestHateEnemy();
		currentEnemy = _self->enemyManager->GetCurrentEnemy();
		if ( !currentEnemy )
			{
			SetFailureReason( "CloseInOnEnemyWhileFiringWeapon::updateEnemy -- No Enemy" );
			transitionToState( CIWF_FAILED );
			}
			
		}

	_currentEnemy = currentEnemy;	
}
Esempio n. 15
0
void GetupModule::selectGetup() {
  int tiltSideThreshold = 5;
  if (numCrosses > 0) // be more confident after a cross
    tiltSideThreshold = 2;
  // decide which getup to do
  if (walk_request_->tilt_fallen_counter_ < -tiltSideThreshold) {
    setBackGetup();
  } else if (walk_request_->tilt_fallen_counter_ > tiltSideThreshold) {
    setFrontGetup();
  } else if ((numCrosses == 0) && (walk_request_->roll_fallen_counter_ >= 2)) {
    transitionToState(CROSS);
  } else if (getTimeInState() < 0.2) {
    // do nothing, maybe we'll end up somewhere good
  } else {
    setBackGetup(); // default to back in the end
  }
}
Esempio n. 16
0
//--------------------------------------------------------------
// Name:		updateEnemy()
// Class:		StationaryFireCombat
//
// Description:	Sets our _currentEnemy
//
// Parameters:	None
//
// Returns:		None
//--------------------------------------------------------------
void StationaryFireCombat::updateEnemy()
{
	Entity *currentEnemy = _self->enemyManager->GetCurrentEnemy();
	if ( !currentEnemy )
		{
		_self->enemyManager->FindHighestHateEnemy();
		currentEnemy = _self->enemyManager->GetCurrentEnemy();
		if ( !currentEnemy )
			{
			SetFailureReason( "STATIONARY_FIRE_FAILED::updateEnemy -- No Enemy" );
			transitionToState( STATIONARY_FIRE_FAILED );
			return;
			}
			
		}

	_currentEnemy = currentEnemy;
	//_self->turnTowardsEntity( _currentEnemy, 0.0f );	
}
Esempio n. 17
0
//--------------------------------------------------------------
// Name:        init()
// Class:       GeneralCombat
//
// Description: Initializes memeber variables
//
// Parameters:  Actor &self -- Actor executing this behavior
//
// Returns:     None
//--------------------------------------------------------------
void GeneralCombatWithRangedWeapon::init( Actor &self )
{
	_self = &self;
	_finishedPostureTransition		= true;
	_randomAdvanceLockOut			= false;
	_randomRetreatLockOut			= false;
	_nextRotateTime					= 0.0f;
	_nextStrafeAttemptTime			= 0.0f;
	_nextPostureChange				= 0.0f;
	_nextClearRetreatLockOutTime	= 0.0f;
	_nextClearAdvanceLockOutTime	= 0.0f;
	_nextFireTime					= 0.0f;
	_nextPauseTime					= 0.0f;
	_randomAdvanceFailures			= 0;
	_randomRetreatFailures			= 0;

	transitionToState(GC_WRW_STAND);	
	updateEnemy();
}
Esempio n. 18
0
//--------------------------------------------------------------
// Name:		updateEnemy()
// Class:		GeneralCombatWithRangedWeapon
//
// Description:	Sets our _currentEnemy
//
// Parameters:	None
//
// Returns:		None
//--------------------------------------------------------------
void GeneralCombatWithRangedWeapon::updateEnemy()
{
	
	Entity *currentEnemy = _self->enemyManager->GetCurrentEnemy();
	if ( !currentEnemy )
		{
		_self->enemyManager->FindHighestHateEnemy();
		currentEnemy = _self->enemyManager->GetCurrentEnemy();
		if ( !currentEnemy )
			{
			SetFailureReason( "GeneralCombatWithRangedWeapon::updateEnemy -- No Enemy" );
			transitionToState( GC_WRW_FAILED );
			}
			
		}

	_currentEnemy = currentEnemy;
	_self->SetHeadWatchTarget( _currentEnemy );
	setupRotate();
}
Esempio n. 19
0
//--------------------------------------------------------------
// Name:		updateEnemy()
// Class:		CorridorCombatWithRangedWeapon
//
// Description:	Sets our _currentEnemy
//
// Parameters:	None
//
// Returns:		None
//--------------------------------------------------------------
void CorridorCombatWithRangedWeapon::updateEnemy()
{
	if ( level.time < _enemyUpdateTime )
		return;

	Entity *currentEnemy = _self->enemyManager->GetCurrentEnemy();
	if ( !currentEnemy )
		{
		_self->enemyManager->FindHighestHateEnemy();
		currentEnemy = _self->enemyManager->GetCurrentEnemy();
		if ( !currentEnemy )
			{
			SetFailureReason( "CorridorCombatWithRangedWeapon::updateEnemy -- No Enemy" );
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );
			}
			
		}

	_currentEnemy = currentEnemy;
	_enemyUpdateTime = level.time + G_Random() + 3.0f; 
	setupRotate();
}
Esempio n. 20
0
//--------------------------------------------------------------
// Name:        Evaluate()
// Class:       GeneralCombatWithRangedWeapon
//
// Description: Evaluates the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     BehaviorReturnCode_t 
//--------------------------------------------------------------
BehaviorReturnCode_t GeneralCombatWithRangedWeapon::Evaluate( Actor &self )
{
	BehaviorReturnCode_t stateResult;
	str	currentPostureState = _self->postureController->getCurrentPostureName();	
	float distToEnemy = self.enemyManager->GetDistanceFromEnemy();

	think();
	switch ( _state )	
	{	
	//---------------------------------------------------------------------		
	case GC_WRW_CHANGE_POSTURE_TO_ADVANCE:
	//---------------------------------------------------------------------		
		stateResult = evaluateStateChangePostureToAdvance();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_ADVANCE );		
	break;

	//---------------------------------------------------------------------		
	case GC_WRW_CHANGE_POSTURE_TO_RETREAT:
	//---------------------------------------------------------------------		
		stateResult = evaluateStateChangePostureToRetreat();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_RETREAT );
	break;

	//---------------------------------------------------------------------		
	case GC_WRW_ADVANCE:
	//---------------------------------------------------------------------
		if ( !checkShouldApproach( distToEnemy ) )
			{
			transitionToState( GC_WRW_STAND );
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateStateAdvance();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_STAND );						

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_ADVANCE_FIRING );

	break;

	//---------------------------------------------------------------------
	case GC_WRW_ADVANCE_FIRING:
	//---------------------------------------------------------------------
		if ( !checkShouldApproach( distToEnemy ) )
			{
			transitionToState( GC_WRW_STAND );
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateStateAdvanceFiring();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_STAND );	

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_ADVANCE );
	break;

	//---------------------------------------------------------------------
	case GC_WRW_RETREAT:
	//---------------------------------------------------------------------
		if ( !checkShouldRetreat( distToEnemy ) )
			{
			transitionToState( GC_WRW_STAND );
			_self->movementSubsystem->setMovingBackwards( false );
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateStateRetreat();
		if ( stateResult == BEHAVIOR_FAILED )
			{
			transitionToState( GC_WRW_STAND );
			_self->movementSubsystem->setMovingBackwards( false );
			}

		if ( stateResult == BEHAVIOR_SUCCESS )
			{
			_self->movementSubsystem->setMovingBackwards( false );
			transitionToState( GC_WRW_RETREAT_FIRING );			
			}

	break;

	//---------------------------------------------------------------------
	case GC_WRW_RETREAT_FIRING:
	//---------------------------------------------------------------------
		if ( !checkShouldRetreat( distToEnemy ) )
			{
			_self->movementSubsystem->setMovingBackwards( false );
			transitionToState( GC_WRW_STAND );
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateStateRetreatFiring();
		if ( stateResult == BEHAVIOR_FAILED )
			{
			transitionToState( GC_WRW_STAND );
			_self->movementSubsystem->setMovingBackwards( false );
			}

		if ( stateResult == BEHAVIOR_SUCCESS )
			{
			_self->movementSubsystem->setMovingBackwards( false );
			transitionToState( GC_WRW_RETREAT );
			}
	break;

	//---------------------------------------------------------------------
	case GC_WRW_STRAFE:
	//---------------------------------------------------------------------
		stateResult = evaluateStateStrafe();

		//It's perfectly understandable that strafe might
		//fail, so instead of failing the behavior entirely
		//we'll just change states
		if ( stateResult != BEHAVIOR_EVALUATING )
			{
			if ( currentPostureState == "DUCK" )
				transitionToState( GC_WRW_DUCKED );

			if ( currentPostureState == "STAND" )
				transitionToState( GC_WRW_STAND );
			}		

	break;

	//---------------------------------------------------------------------
	case GC_WRW_CHANGE_POSTURE_DUCK:
	//---------------------------------------------------------------------
		stateResult = evaluateStateChangePostureDuck();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_DUCKED );
	break;

	//---------------------------------------------------------------------
	case GC_WRW_DUCKED:	
	//---------------------------------------------------------------------	

	//
	// First Check if we are within our _approachDist.  If 
	// not, then we need to close in on our enemy
	//
	if ( checkShouldApproach( distToEnemy ) )
		{
		transitionToState( GC_WRW_CHANGE_POSTURE_TO_ADVANCE );
		return BEHAVIOR_EVALUATING;
		}

	//
	// Now Check if wer are within our _retreatDist.  If 
	// we are, then we need to retreat in on our enemy
	//
	if ( checkShouldRetreat( distToEnemy ) )
		{
		transitionToState( GC_WRW_CHANGE_POSTURE_TO_RETREAT );
		return BEHAVIOR_EVALUATING;
		}

	//
	// Lets check if we need to strafe
	//
	if ( checkShouldStrafe( distToEnemy ) )
		{
		transitionToState( GC_WRW_STRAFE );
		return BEHAVIOR_EVALUATING;
		}
	

	//
	//Now let's check if we need to change posture
	//
	if ( checkShouldChangePosture( distToEnemy ) )
		{
		transitionToState( GC_WRW_CHANGE_POSTURE_STAND );
		return BEHAVIOR_EVALUATING;
		}

	//
	//Well we don't have anything else to do, so let's evaluate our state
	//
	stateResult = evaluateRotate();

	if ( stateResult == BEHAVIOR_SUCCESS )
		{
		stateResult = evaluateStateStand();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_DUCKED_FIRING );

		}

	break;

	//---------------------------------------------------------------------
	case GC_WRW_DUCKED_FIRING:
	//---------------------------------------------------------------------
		stateResult = evaluateRotate();
		stateResult = evaluateStateDuckedFiring();

		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_DUCKED );
	break;

	//---------------------------------------------------------------------
	case GC_WRW_CHANGE_POSTURE_STAND:
	//---------------------------------------------------------------------
		stateResult = evaluateStateChangePostureStand();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_STAND );
	break;

	//---------------------------------------------------------------------
	case GC_WRW_STAND:
	//---------------------------------------------------------------------	

	//
	// First Check if we are within our _approachDist.  If 
	// not, then we need to close in on our enemy
	//
	if ( checkShouldApproach( distToEnemy ) )
		{
		transitionToState( GC_WRW_CHANGE_POSTURE_TO_ADVANCE );
		return BEHAVIOR_EVALUATING;
		}

	//
	// Now Check if wer are within our _retreatDist.  If 
	// we are, then we need to retreat in on our enemy
	//
	if ( checkShouldRetreat( distToEnemy ) )
		{
		transitionToState( GC_WRW_CHANGE_POSTURE_TO_RETREAT );
		return BEHAVIOR_EVALUATING;
		}

	//
	// Lets check if we need to strafe
	//
	if ( checkShouldStrafe( distToEnemy ) )
		{
		transitionToState( GC_WRW_STRAFE );
		return BEHAVIOR_EVALUATING;
		}
	

	//
	//Now let's check if we need to change posture
	//
	if ( checkShouldChangePosture( distToEnemy ) )
		{
		transitionToState( GC_WRW_CHANGE_POSTURE_DUCK );
		return BEHAVIOR_EVALUATING;
		}

	//
	//Well we don't have anything else to do, so let's evaluate our state
	//
	stateResult = evaluateRotate();

	if ( stateResult == BEHAVIOR_SUCCESS )
		{
		stateResult = evaluateStateStand();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_STAND_FIRING );

		}

	break;

	//---------------------------------------------------------------------
	case GC_WRW_STAND_FIRING:
	//---------------------------------------------------------------------
		stateResult = evaluateRotate();
		stateResult = evaluateStateStandFiring();

		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( GC_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( GC_WRW_STAND );
	break;
	}


	return BEHAVIOR_EVALUATING;   
}
Esempio n. 21
0
/**
	This method loads all the pertinent information regarding the simbicon controller from a file.
*/
void SimBiController::loadFromFile(char* fName){
	if (fName == NULL)
		throwError("NULL file name provided.");
	FILE *f = fopen(fName, "r");
	if (f == NULL)
		throwError("Could not open file: %s", fName);

	//to be able to load multiple controllers from multiple files,
	//we will use this offset to make sure that the state numbers
	//mentioned in each input file are updated correctly
	int stateOffset = this->states.size();
	SimBiConState* tempState;
	int tempStateNr = -1;

	//have a temporary buffer used to read the file line by line...
	char buffer[200];
	//this is where it happens.

	while (!feof(f)){
		//get a line from the file...
		fgets(buffer, 200, f);
		if (feof(f))
			break;
		if (strlen(buffer)>195)
			throwError("The input file contains a line that is longer than ~200 characters - not allowed");
		char *line = lTrim(buffer);
		int lineType = getConLineType(line);
		switch (lineType) {
			case CON_PD_GAINS_START:
				readGains(f);
				break;
			case CON_STATE_START:
				tempState = new SimBiConState();
				sscanf(line, "%d", &tempStateNr);
				if (tempStateNr != stateOffset + this->states.size())
					throwError("Inccorect state offset specified: %d", tempStateNr);
				states.push_back(tempState);
				tempState->readState(f, stateOffset);
				//now we have to resolve all the joint names (i.e. figure out which joints they apply to).
				resolveJoints(tempState);
				break;
			case CON_STANCE_HIP_DAMPING:
				sscanf(line, "%lf", &stanceHipDamping);
				break;
			case CON_STANCE_HIP_MAX_VELOCITY:
				sscanf(line, "%lf", &stanceHipMaxVelocity);
				break;
			case CON_ROOT_PRED_TORQUE_SCALE:
				sscanf(line, "%lf", &rootPredictiveTorqueScale);
				break;
			case CON_CHARACTER_STATE:
				character->loadReducedStateFromFile(trim(line));
				strcpy(initialBipState, trim(line));
				break;
			case CON_START_AT_STATE:
				if (sscanf(line, "%d", &tempStateNr) != 1)
					throwError("A starting state must be specified!");
				transitionToState(tempStateNr);
				startingState = tempStateNr;
				break;
			case CON_COMMENT:
				break;
			case CON_STARTING_STANCE:
				if (strncmp(trim(line), "left", 4) == 0){
					setStance(LEFT_STANCE);
					startingStance = LEFT_STANCE;
				}
				else if (strncmp(trim(line), "right", 5) == 0){
					setStance(RIGHT_STANCE);
					startingStance = RIGHT_STANCE;
				}
				else 
					throwError("When using the \'reverseTargetOnStance\' keyword, \'left\' or \'right\' must be specified!");
				break;
			case CON_NOT_IMPORTANT:
				tprintf("Ignoring input line: \'%s\'\n", line);
				break;
			default:
				throwError("Incorrect SIMBICON input file: \'%s\' - unexpected line.", buffer);
		}
	}
}
Esempio n. 22
0
//--------------------------------------------------------------
// Name:        Evaluate()
// Class:       Work
//
// Description: Returns True Or False, and is run every frame
//              that the behavior
//
// Parameters:  Actor &self
//
// Returns:     True or False
//--------------------------------------------------------------
BehaviorReturnCode_t	Work::Evaluate ( Actor &self )
{      
	BehaviorReturnCode_t stateResult;

	think();

	switch ( _state )
		{
		//---------------------------------------------------------------------
		case WORK_FIND_NODE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateFindNode();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WORK_MOVE_TO_NODE ); 
		break;

		//---------------------------------------------------------------------
		case WORK_MOVE_TO_NODE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateMoveToNode();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WORK_AT_NODE ); 

		break;

		//---------------------------------------------------------------------
		case WORK_AT_NODE:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAtNode();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WORK_SELECT_ANIM_MODE ); 

		break;

		//---------------------------------------------------------------------
		case WORK_SELECT_ANIM_MODE:
		//---------------------------------------------------------------------
			if ( _node->isUsingAnimList() )
				{
				customAnimListEntry_t* animEntry = _node->GetCurrentAnimEntryFromList();
				if ( !animEntry )
					{
					transitionToState( WORK_FAILED );
					return BEHAVIOR_EVALUATING;
					}

				if ( animEntry->waitType == WAITTYPE_EVENT )
					transitionToState( WORK_ANIMATE_LIST_WAIT_ON_SIGNAL );
					
				if ( animEntry->waitType == WAITTYPE_ANIM )
					transitionToState( WORK_ANIMATE_LIST_WAIT_ON_ANIM );

				if ( animEntry->waitType == WAITTYPE_TIME )
					transitionToState( WORK_ANIMATE_LIST_WAIT_ON_TIME );

				return BEHAVIOR_EVALUATING;					
				}

			if ( _node->isWaitForAnim() )
				{
				transitionToState( WORK_ANIMATE_WAIT_ON_ANIM );
				return BEHAVIOR_EVALUATING;
				}

			if ( _node->GetWaitTime() > 0 )
				{
				transitionToState( WORK_ANIMATE_WAIT_ON_TIME );
				return BEHAVIOR_EVALUATING;
				}

			// We default to constant working
			transitionToState( WORK_ANIMATE_CONSTANT );
			
			
		break;

		//---------------------------------------------------------------------
		case WORK_ANIMATE_WAIT_ON_TIME:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAnimateWaitOnTime();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WORK_SUCCESSFUL ); 
		break;

		//---------------------------------------------------------------------
		case WORK_ANIMATE_WAIT_ON_ANIM:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAnimateWaitOnAnim();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WORK_SUCCESSFUL ); 
		break;

		//---------------------------------------------------------------------
		case WORK_ANIMATE_WAIT_ON_SIGNAL:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAnimateWaitOnSignal();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WORK_SUCCESSFUL ); 
		break;

		//---------------------------------------------------------------------
		case WORK_ANIMATE_CONSTANT:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAnimateConstant();

			//
			// Should Never get to either of these
			//
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				transitionToState( WORK_SUCCESSFUL ); 
		break;

		//---------------------------------------------------------------------
		case WORK_ANIMATE_LIST_WAIT_ON_TIME:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAnimateListWaitOnTime();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				if (_node->isAnimListFinished() )
					transitionToState( WORK_SUCCESSFUL ); 				
				else
					transitionToState( WORK_SELECT_ANIM_MODE );				
				}
				
		break;

		//---------------------------------------------------------------------
		case WORK_ANIMATE_LIST_WAIT_ON_ANIM:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAnimateListWaitOnAnim();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				if (_node->isAnimListFinished() )
					transitionToState( WORK_SUCCESSFUL ); 				
				else
					transitionToState( WORK_SELECT_ANIM_MODE );				
				}
		break;

		//---------------------------------------------------------------------
		case WORK_ANIMATE_LIST_WAIT_ON_SIGNAL:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAnimateListWaitOnSignal();
			if ( stateResult == BEHAVIOR_FAILED )
				transitionToState( WORK_FAILED );

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				if (_node->isAnimListFinished() )
					transitionToState( WORK_SUCCESSFUL ); 				
				else
					transitionToState( WORK_SELECT_ANIM_MODE );				
				}
		break;

		//---------------------------------------------------------------------
		case WORK_SUCCESSFUL:
		//---------------------------------------------------------------------
			_node->RunExitThread();
			self.ignoreHelperNode.node = _node;
			return BEHAVIOR_SUCCESS;
		break;

		//---------------------------------------------------------------------
		case WORK_FAILED:
		//---------------------------------------------------------------------
			return BEHAVIOR_FAILED;
		break;

		}

   return BEHAVIOR_EVALUATING; 
}
Esempio n. 23
0
//--------------------------------------------------------------
// Name:        Begin()
// Class:       GotoCurrentHelperNode
//
// Description: Initializes the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     None
//--------------------------------------------------------------
void GotoCurrentHelperNode::Begin( Actor &self )
{       
	init( self );
	transitionToState ( GOTO_HNODE_FIND_NODE );
}
Esempio n. 24
0
//--------------------------------------------------------------
// Name:        Evaluate()
// Class:       CorridorCombatWithRangedWeapon
//
// Description: Evaluates the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     BehaviorReturnCode_t 
//--------------------------------------------------------------
BehaviorReturnCode_t CorridorCombatWithRangedWeapon::Evaluate( Actor & )
{
	BehaviorReturnCode_t stateResult;


	think();

	switch ( _state )
	{
	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_FINDNODE:
	//---------------------------------------------------------------------
		stateResult = evaluateStateFindNode();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_STAND );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( CORRIDORCOMBAT_WRW_MOVETONODE );
	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_MOVETONODE:
	//---------------------------------------------------------------------
		stateResult = evaluateStateMoveToNode();
	
		if ( stateResult == BEHAVIOR_FAILED )
			{		
			_self->SetAnim( "idle" , NULL , legs );
			transitionToState( CORRIDORCOMBAT_WRW_STAND );			
			}

		if ( stateResult == BEHAVIOR_SUCCESS )
			{
			_self->SetAnim( "idle" , NULL , legs );
			stateResult = evaluateRotate();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				if ( checkShouldDuck() )
					transitionToState( CORRIDORCOMBAT_WRW_CHANGEPOSTURE_DUCK );
				else
					transitionToState( CORRIDORCOMBAT_WRW_STAND );
				}
			
			}

	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_BACKPEDAL:
	//---------------------------------------------------------------------
		stateResult = evaluateStateBackPedal();

		if ( stateResult == BEHAVIOR_FAILED )
			{
			_self->movementSubsystem->setMovingBackwards( false );
			_self->SetAnim( "idle" , NULL , legs );
			_holdPositionTime = level.time + G_Random(2.0) + 2.0f;

			transitionToState( CORRIDORCOMBAT_WRW_STAND );			
			return BEHAVIOR_EVALUATING;
			}
		
		if ( stateResult == BEHAVIOR_SUCCESS )
			{
			_self->movementSubsystem->setMovingBackwards( false );
			_self->SetAnim( "idle" , NULL , legs );
			transitionToState( CORRIDORCOMBAT_WRW_FINDBETTERNODE );			
			}
	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_FINDBETTERNODE:
	//---------------------------------------------------------------------
		stateResult = evaluateStateFindBetterNode();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_STAND );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( CORRIDORCOMBAT_WRW_MOVETOBETTERNODE );			

	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_MOVETOBETTERNODE:
	//---------------------------------------------------------------------
		stateResult = evaluateStateMoveToBetterNode();		

		if ( stateResult == BEHAVIOR_FAILED )
			{
			_self->SetAnim( "idle" , NULL , legs );
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );			
			}

		if ( stateResult == BEHAVIOR_SUCCESS )
			{
			_self->SetAnim( "idle" , NULL , legs );
			stateResult = evaluateRotate();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				if ( checkShouldDuck() )
					transitionToState( CORRIDORCOMBAT_WRW_CHANGEPOSTURE_DUCK );
				else
					transitionToState( CORRIDORCOMBAT_WRW_STAND );
				}
			
			}
	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_CHANGEPOSTURE_DUCK:
	//---------------------------------------------------------------------
		stateResult = evaluateStateChangePostureDuck();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( CORRIDORCOMBAT_WRW_DUCKED );

	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_CHANGEPOSTURE_STAND:
	//---------------------------------------------------------------------
		stateResult = evaluateStateChangePostureStand();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( CORRIDORCOMBAT_WRW_STAND );

	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_DUCKED:
	//---------------------------------------------------------------------
		if ( checkShouldStand() )	//Make sure we don't need to stand back up
			{
			transitionToState( CORRIDORCOMBAT_WRW_CHANGEPOSTURE_STAND );
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateRotate();
		stateResult = evaluateStateDucked();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( CORRIDORCOMBAT_WRW_DUCKED_FIRING );
	break;

	//----------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_DUCKED_FIRING:
	//----------------------------------------------------------------------
		if ( checkShouldStand() )	//Make sure we don't need to stand back up
			{
			transitionToState( CORRIDORCOMBAT_WRW_CHANGEPOSTURE_STAND );
			_fireWeapon.End(*_self);
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateRotate();
		if ( stateResult != BEHAVIOR_SUCCESS )
			return BEHAVIOR_EVALUATING;


		stateResult = evaluateStateFireDucked();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( CORRIDORCOMBAT_WRW_DUCKED );

	break;

	//----------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_STAND:
	//----------------------------------------------------------------------
		if ( checkShouldRetreat() )
			{
			transitionToState( CORRIDORCOMBAT_WRW_BACKPEDAL );
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateRotate();
		stateResult = evaluateStateStanding();
		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState( CORRIDORCOMBAT_WRW_STAND_FIRING );
	break;

	//----------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_STAND_FIRING:
	//----------------------------------------------------------------------
		if ( checkShouldRetreat() )
			{
			transitionToState( CORRIDORCOMBAT_WRW_BACKPEDAL );
			_fireWeapon.End(*_self);
			return BEHAVIOR_EVALUATING;
			}

		stateResult = evaluateRotate();
		if ( stateResult != BEHAVIOR_SUCCESS )
			return BEHAVIOR_EVALUATING;

		stateResult = evaluateStateFireStanding();
		if ( stateResult == BEHAVIOR_FAILED )
			{
			_fireWeapon.End(*_self);
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );
			}

		if ( stateResult == BEHAVIOR_SUCCESS )
			{
			_fireWeapon.End(*_self);
			transitionToState( CORRIDORCOMBAT_WRW_STAND );
			}

	break;

	//---------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_HOLD_POSITION:
	//---------------------------------------------------------------------
		stateResult = evaluateStateHoldPosition();

		if ( stateResult == BEHAVIOR_FAILED )
			transitionToState( CORRIDORCOMBAT_WRW_FAILED );

		if ( stateResult == BEHAVIOR_SUCCESS )
			transitionToState(CORRIDORCOMBAT_WRW_FINDBETTERNODE);
	break;

	//----------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_SUCCESS:
	//----------------------------------------------------------------------
		return BEHAVIOR_SUCCESS;

	break;


	//----------------------------------------------------------------------
	case CORRIDORCOMBAT_WRW_FAILED:
	//----------------------------------------------------------------------
		return BEHAVIOR_FAILED;

	break;
	}

	return BEHAVIOR_EVALUATING;   

}
Esempio n. 25
0
//--------------------------------------------------------------
// Name:        Evaluate()
// Class:       TorsoAimAndFireWeapon
//
// Description: Evaluates the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     BehaviorReturnCode_t 
//--------------------------------------------------------------
BehaviorReturnCode_t TorsoAimAndFireWeapon::Evaluate( Actor &self )
{
	BehaviorReturnCode_t stateResult;

	think();
	
	switch ( _state )
		{
		//---------------------------------------------------------------------
		case TORSO_AIM_AND_FIRE_PRE_FIRE:
		//---------------------------------------------------------------------
			stateResult = evaluateStatePreFire();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
					transitionToState( TORSO_AIM_AND_FIRE_AIM );	
				}

			if ( stateResult == BEHAVIOR_FAILED )
				{
				transitionToState( TORSO_AIM_AND_FIRE_FAILED );
				}
		break;

		//---------------------------------------------------------------------
		case TORSO_AIM_AND_FIRE_AIM:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAim();
						
			if ( stateResult == BEHAVIOR_SUCCESS )
				{
					if ( _aimOnly )
						transitionToState(TORSO_AIM_AND_FIRE_AIM);
					else
						transitionToState( TORSO_AIM_AND_FIRE_ATTACK );
				}
			
			if ( stateResult == BEHAVIOR_FAILED )
				return BEHAVIOR_FAILED;

		break;


		//---------------------------------------------------------------------
		case TORSO_AIM_AND_FIRE_ATTACK:
		//---------------------------------------------------------------------
			stateResult = evaluateStateAttack();

			if ( stateResult == BEHAVIOR_FAILED )
				{
				_fireWeapon.End( *_self );

				if ( _postFireAnim.length() )
					transitionToState( TORSO_AIM_AND_FIRE_POST_FIRE );
				else
					transitionToState( TORSO_AIM_AND_FIRE_FAILED );
				}

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				_fireWeapon.End( *_self );

				if ( _postFireAnim.length() )
					transitionToState( TORSO_AIM_AND_FIRE_POST_FIRE );
				else
					transitionToState( TORSO_AIM_AND_FIRE_SUCCESS );
				}
		break;

		//---------------------------------------------------------------------
		case TORSO_AIM_AND_FIRE_POST_FIRE:
		//---------------------------------------------------------------------
			stateResult = evaluateStatePostFire();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
					transitionToState( TORSO_AIM_AND_FIRE_SUCCESS );	
				}
		break;

		//---------------------------------------------------------------------
		case TORSO_AIM_AND_FIRE_SUCCESS:
		//---------------------------------------------------------------------
			_self->SetControllerAngles( ActorTorsoTag, vec_zero );

			if ( _repeat )
				{
				Begin(self);
				return BEHAVIOR_EVALUATING;
				}

			return BEHAVIOR_SUCCESS;

		break;


		//---------------------------------------------------------------------
		case TORSO_AIM_AND_FIRE_FAILED:
		//---------------------------------------------------------------------
			if ( _repeat )
				{
				Begin(self);
				return BEHAVIOR_EVALUATING;
				}

			return BEHAVIOR_FAILED;

		break;


		}
	

	return BEHAVIOR_EVALUATING;   

}
Esempio n. 26
0
//--------------------------------------------------------------
// Name:        Begin()
// Class:       StationaryFireCombat
//
// Description: Initializes the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     None
//--------------------------------------------------------------
void StationaryFireCombat::Begin( Actor &self )
{       
	init( self );
	transitionToState ( STATIONARY_FIRE_AIM );
}
Esempio n. 27
0
//--------------------------------------------------------------
// Name:        Evaluate()
// Class:       StationaryFireCombat
//
// Description: Evaluates the behavior
//
// Parameters:  Actor &self -- The actor executing this behavior
//
// Returns:     BehaviorReturnCode_t 
//--------------------------------------------------------------
BehaviorReturnCode_t StationaryFireCombat::Evaluate( Actor & )
{
	BehaviorReturnCode_t stateResult;

	think();
	
	switch ( _state )
		{
		//---------------------------------------------------------------------
		case STATIONARY_FIRE_AIM:
		//---------------------------------------------------------------------		
			stateResult = evaluateStateAim();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				updateEnemy();
				if ( _preFireAnim.length() )
					transitionToState( STATIONARY_FIRE_PRE_FIRE );
				else
					transitionToState( STATIONARY_FIRE_ATTACK );
				}
				
		break;

		//---------------------------------------------------------------------
		case STATIONARY_FIRE_PRE_FIRE:
		//---------------------------------------------------------------------
			stateResult = evaluateStatePreFire();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
					transitionToState( STATIONARY_FIRE_ATTACK );	
				}

			if ( stateResult == BEHAVIOR_FAILED )
				{
				transitionToState( STATIONARY_FIRE_FAILED );
				}
			
		break;

		//---------------------------------------------------------------------
		case STATIONARY_FIRE_ATTACK:
		//---------------------------------------------------------------------		
			stateResult = evaluateStateAttack();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
				_fireWeapon.End( *_self );

				if ( _postFireAnim.length() )
					transitionToState( STATIONARY_FIRE_POST_FIRE );
				else
					transitionToState( STATIONARY_FIRE_SUCCESS );
				}

			if ( stateResult == BEHAVIOR_FAILED )
				{
				_fireWeapon.End( *_self );

				if ( _postFireAnim.length() )
					transitionToState( STATIONARY_FIRE_POST_FIRE );
				else
					transitionToState( STATIONARY_FIRE_SUCCESS );
				}

		break;


		//---------------------------------------------------------------------
		case STATIONARY_FIRE_POST_FIRE:
		//---------------------------------------------------------------------
			stateResult = evaluateStatePostFire();

			if ( stateResult == BEHAVIOR_SUCCESS )
				{
					transitionToState( STATIONARY_FIRE_SUCCESS );	
				}
		break;

		//---------------------------------------------------------------------
		case STATIONARY_FIRE_SUCCESS:
		//---------------------------------------------------------------------
			return BEHAVIOR_SUCCESS;

		break;


		//---------------------------------------------------------------------
		case STATIONARY_FIRE_FAILED:
		//---------------------------------------------------------------------
			return BEHAVIOR_FAILED;

		break;


		}
	

	return BEHAVIOR_EVALUATING;   

}
Esempio n. 28
0
void DialogueManager::start() {
	assert(_dialogue);
	_q = _dialogue->_questions[0];
	_state = DIALOGUE_START;
	transitionToState(displayQuestion() ? RUN_QUESTION : NEXT_ANSWER);
}
Esempio n. 29
0
bool GetupModule::processFrameChild() {
  //std::cout << frame_info_->frame_id << " " << getName(state) << std::endl;
  // set getting up odometry
  if (isGettingUp()){
    // which way are we getting up?
    odometry_->getting_up_side_ = getUpSide;
  } else {
    // no getup
    odometry_->getting_up_side_ = Getup::NONE;
    // set getup side back to unknown for the next getup
    getUpSide = Getup::UNKNOWN;
  }

  bool fallenCountHigh = (abs(walk_request_->roll_fallen_counter_) >= 50) || (abs(walk_request_->tilt_fallen_counter_) >= 50);

  switch (state) {
    case INITIAL:
      if (walk_request_->getup_from_keeper_dive_) {
        transitionToState(CROSS); // goalie needs cross
      } else {
        if (fallenCountHigh)
          transitionToState(STIFFNESS_ON);
        else
          transitionToState(PREPARE_ARMS);
      }
      break;
    case PREPARE_ARMS:
      if ((getTimeInState() > PREPARE_ARMS_TIME) || fallenCountHigh) { // if fallen count is high, it's too late to prepare arms
        transitionToState(STIFFNESS_OFF);
      } else {
        if (getTimeInState() < 0.015) {
          prepareArms();
        }
        // otherwise do nothing
      }
      break;
    case STIFFNESS_OFF:
      if ((getTimeInState() > STIFFNESS_OFF_TIME) || fallenCountHigh) { // if fallen count is high, it's too late to worry about the stiffness being off
        transitionToState(STIFFNESS_ON);
      } else {
        commands_->setAllStiffness(0.0,10);
      }
      break;
    case STIFFNESS_ON:
      if (getTimeInState() > 0.001) {
        //if (armsStuckBehindBack()) {
          //std::cout << "Trying to free arms" << std::endl;
          //transitionToState(FREE_ARMS);
        //} else {
          transitionToState(EXECUTE);
        //}
      } else {
        commands_->setAllStiffness(1.0,10);
      }
      break;
    case CROSS:
      if (getTimeInState() < CROSS_TIME)
        cross();
      else {
        transitionToState(EXECUTE);
        numCrosses++;
      }
      break;
    case EXECUTE:
      if (currMotion == Getup) {
        selectGetup();
        if (currMotion == Getup) // didn't choose
          return true; // don't do anything else
        // yay! we chose a getup
        std::cout << "Starting getup: " << getName(currMotion) << std::endl;
        stateStartTime = frame_info_->seconds_since_start; // reset the time
      }
      if (isMotionDoneExecuting()) {
        if ((abs(walk_request_->tilt_fallen_counter_) > 2) || (abs(walk_request_->roll_fallen_counter_) > 2)) {
          // still fallen
          selectGetup();
          transitionToState(STIFFNESS_ON);
        } else {
          transitionToState(STAND);
        }
      } else {
        if (getTimeInState() < 0.015)
          commands_->setAllStiffness(1.0,10);
        //if (shouldAbortGetup()) {  // KG: for now, never abort.  Consider adding it back in if needed, but will need to also update method for new getup states
        //  std::cout << "FAILED GETUP" << std::endl;
        //  numRestarts++;
        //  transitionToState(PAUSE_BEFORE_RESTART);
        //}
        executeMotionSequence();
      }
      break;
    case STAND:
      // do nothing, handled in MotionCore
      if (getTimeInState() > 0.5)
        transitionToState(FINISHED);
      break;
    case FREE_ARMS:
      currMotion = backFreeArms;
      if (isMotionDoneExecuting()) {
        currMotion = Getup;
        transitionToState(EXECUTE);
      } else {
        if (getTimeInState() < 0.015)
          commands_->setAllStiffness(1.0,10);
        executeMotionSequence();
      }
      break;
    case PAUSE_BEFORE_RESTART:
      if (getTimeInState() > PAUSE_BEFORE_RESTART_TIME) {
        transitionToState(STIFFNESS_ON);
      } else {
        commands_->setAllStiffness(0.0,10);
      }
      break;
    default:
      return false;
      break;
  }
  return true;
}
Esempio n. 30
0
//--------------------------------------------------------------
// Name:		init()
// Class:		CloseInOnEnemyWhileFiringWeapon
//
// Description:	Initializes the behavior
//
// Parameters:	Actor &self
//
// Returns:		None
//--------------------------------------------------------------
void CloseInOnEnemyWhileFiringWeapon::init( Actor &self )
{
	_self = &self;
	updateEnemy();	
	transitionToState(CIWF_APPROACH_SETUP_APPROACH);
}