Пример #1
0
// search for the energy module ---------------------------------------------------
//
ExtraObject* BOT_Character::SelectEnergyObject()
{
	ExtraObject* pCurTarget = NULL;
	
	for ( ExtraObject* pSearch = FetchFirstExtra(); pSearch != NULL; ) {

		if ( pCurTarget == NULL ) { //Save what we find first, if it matches great if not, search on
			pCurTarget = pSearch;
			if(pCurTarget->ObjectType == EXTRA1TYPE) {
			   Extra1Obj *extra1po = (Extra1Obj *) pCurTarget;
			   if( extra1po->ObjectClass == ENERGY_EXTRA_CLASS)
				   return pCurTarget; //found it first try!
			}
		} else {
			//Find Repair module 
			if(pSearch->ObjectType == EXTRA1TYPE) {
			   Extra1Obj *extra1po = (Extra1Obj *) pSearch;
			   if( extra1po->ObjectClass == ENERGY_EXTRA_CLASS)
				   return pSearch; //found it first try!
			}
		}
		pSearch = (ExtraObject *) pSearch->NextObj;
	}
	return pCurTarget; //Return Original or NULL search item as we couldnt find the energy module
}
Пример #2
0
// determine in which agentmode we should be ----------------------------------
// 
void BOT_AI::_DoPlan()
{
      ShipObject*      pTargetObject;
      BOT_Goal* pGoal	= m_State.GetCurGoal();
      
	  if(m_pShip->CurDamage > (m_pShip->MaxDamage * 0.9)) { //90% damage
	      m_nAgentMode = AGENTMODE_RETREAT;
	      return;
	  }
	  if(m_pShip->CurEnergy < (m_pShip->MaxEnergy * 0.1)) { //10% energy left
	      m_nAgentMode = AGENTMODE_RETREAT;
		  return;
	  }
	  if(NumRemPlayers > 1)
          pTargetObject = m_Character.SelectAttackTarget( m_pShip ); //Check for target
      else 
	      pTargetObject = NULL;
      // no target
      if ( pTargetObject == NULL ) {
          ExtraObject* pObject = FetchFirstExtra(); //Check for powerups
	      if(pObject != NULL) {
	         m_nAgentMode = AGENTMODE_POWERUP;
           
	      } else {
	         m_nAgentMode = AGENTMODE_IDLE;
	      }
      } else {
	     m_nAgentMode = AGENTMODE_ATTACK; 
      }
}
Пример #3
0
// update instance data of face anims -----------------------------------------
//
PRIVATE
void UpdateFaceAnimInstances( GenObject *gobj )
{
	ASSERT( gobj != NULL );

	if ( gobj->FaceAnimStates == NULL )
		return;

	// determine corresponding list
	GenObject *objlist = NULL;
	switch ( gobj->ObjectType & TYPELISTMASK ) {

		case PSHIP_LIST_NO:
			objlist = FetchFirstShip();
			break;
		case LASER_LIST_NO:
			objlist = FetchFirstLaser();
			break;
		case MISSL_LIST_NO:
			objlist = FetchFirstMissile();
			break;
		case EXTRA_LIST_NO:
			objlist = FetchFirstExtra();
			break;
		case CUSTM_LIST_NO:
			objlist = FetchFirstCustom();
			break;
	}

	// scan entire list
	for ( ; objlist != NULL; objlist = objlist->NextObj ) {

		if ( objlist->ObjectClass == gobj->ObjectClass ) {

			// copy instance data
			objlist->ActiveFaceAnims = gobj->ActiveFaceAnims;
			ASSERT( objlist->FaceAnimStates != NULL );
			memcpy( objlist->FaceAnimStates, gobj->FaceAnimStates,
				sizeof( FaceAnimState ) * gobj->ActiveFaceAnims );
		}
	}

	// check for local ship update
	if ( MyShip->ObjectClass == gobj->ObjectClass ) {

		// copy instance data
		MyShip->ActiveFaceAnims = gobj->ActiveFaceAnims;
		ASSERT( MyShip->FaceAnimStates != NULL );
		memcpy( MyShip->FaceAnimStates, gobj->FaceAnimStates,
			sizeof( FaceAnimState ) * gobj->ActiveFaceAnims );
	}
}
Пример #4
0
// save a level to a console script -------------------------------------------
//
int LVL_SaveLevel( const char* levelname )
{
	ASSERT( levelname != NULL );
	
	int savecount = 0;
	
	// write console script containing summon commands for all teleporters found
	FILE *fp = fopen( levelname, "w" );
	if ( fp != NULL ) {
		
		fprintf( fp, "; parsec level script -----------------------------------\n" );
		fprintf( fp, "; automatically generated on %s;\n", SYS_SystemTime() );
		
		for( int objclassnameindex = 0; level_objclasses[ objclassnameindex ].classname != NULL; objclassnameindex++ ) {
			
			// determine, whether we want to save this object class
			if ( level_objclasses[ objclassnameindex ].flags & LEVEL_OBJCLASS_SAVE ) {

				dword objclassid = OBJ_FetchObjectClassId( level_objclasses[ objclassnameindex ].classname );
				if ( ( objclassid != CLASS_ID_INVALID ) && ( objclassid < (dword)NumObjClasses ) ) {
					savecount =  LVL_SaveObjectsFromList( fp, FetchFirstShip(),		objclassid );
					savecount += LVL_SaveObjectsFromList( fp, FetchFirstLaser(),	objclassid );
					savecount += LVL_SaveObjectsFromList( fp, FetchFirstMissile(),	objclassid );
					savecount += LVL_SaveObjectsFromList( fp, FetchFirstExtra(),	objclassid );
					savecount += LVL_SaveObjectsFromList( fp, FetchFirstCustom(),	objclassid );
				}
			}
		}
		
		fclose( fp );
		
		CON_AddLine( "levelfile sucessfully written" );
	} else {
		CON_AddLine( "could not open levelfile for writing" );
	}

	return savecount; 
}
Пример #5
0
// print object counts for all object lists (command "objectcount") -----------
//
PRIVATE
void Cmd_OBJECTCOUNT()
{
	GenObject *walklist;
	int 	  listlength;

	listlength = 0;
	for ( walklist = FetchFirstShip(); walklist; walklist = walklist->NextObj )
		listlength++;
	sprintf( paste_str, "ships   :%3d", listlength );
	CON_AddLine( paste_str );

	listlength = 0;
	for ( walklist = FetchFirstLaser(); walklist; walklist = walklist->NextObj )
		listlength++;
	sprintf( paste_str, "lasers  :%3d", listlength );
	CON_AddLine( paste_str );

	listlength = 0;
	for ( walklist = FetchFirstMissile(); walklist; walklist = walklist->NextObj )
		listlength++;
	sprintf( paste_str, "missiles:%3d", listlength );
	CON_AddLine( paste_str );

	listlength = 0;
	for ( walklist = FetchFirstExtra(); walklist; walklist = walklist->NextObj )
		listlength++;
	sprintf( paste_str, "extras  :%3d (obj, counted %d) and %d particle",
		listlength, CurrentNumExtras, CurrentNumPrtExtras );
	CON_AddLine( paste_str );

	listlength = 0;
	for ( walklist = FetchFirstCustom(); walklist; walklist = walklist->NextObj )
		listlength++;
	sprintf( paste_str, "customs :%3d", listlength );
	CON_AddLine( paste_str );
}
Пример #6
0
// ----------------------------------------------------------------------------
//
void BOT_AI::_GoalCheck_AgentMode_Powerup()
{
    BOT_Goal* pGoal	= m_State.GetCurGoal();
	Vector3* pGoalPos = pGoal->GetGoalPosition();
	
	ASSERT( pGoal != NULL );
    if(pGoal->GetTargetObject() == NULL) {
        ExtraObject* pObject = FetchFirstExtra();
        if(pObject == NULL) {
            m_nAgentMode = AGENTMODE_IDLE;
            return;
         }
         pGoal->SetTargetObject(pObject);
         FetchTVector( pObject->ObjPosition, pGoalPos );
#ifdef BOT_LOGFILES
         BOT_MsgOut("Targetting Extra");
#endif
	}
	
	pGoalPos = pGoal->GetGoalPosition();

	// get vector to target
	Vector3 vec2Target;	
	VECSUB( &vec2Target, pGoalPos, &m_AgentPos );

	float len = VctLenX( &vec2Target );
#ifdef BOT_LOGFILES
	BOT_MsgOut( "BOT: distance to goal: %f", len );
#endif    
	if ( len < 100.0f )  {
#ifdef BOT_LOGFILES
	   BOT_MsgOut("Clearing Goal");
	   pGoal->SetTargetObject(NULL);
#endif	   
	}
  
}