// 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 }
// 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; } }
// 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 ); } }
// 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; }
// 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 ); }
// ---------------------------------------------------------------------------- // 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 } }