void FGAIAircraft::bind() {
FGAIBase::bind();
-/*
props->tie("controls/gear/gear-down",
- SGRawValueFunctions<bool>(FGAIAircraft::_getGearDown));
+ SGRawValueMethods<FGAIAircraft,bool>(*this,
+ &FGAIAircraft::_getGearDown));
props->getNode("controls/lighting/landing-lights", true)
->alias("controls/gear/gear-down");
-*/
}
void FGAIAircraft::unbind() {
FGAIBase::unbind();
-// props->untie("controls/gear/gear-down");
-// props->getNode("controls/lighting/landing-lights")->unalias();
+ props->untie("controls/gear/gear-down");
+ props->getNode("controls/lighting/landing-lights")->unalias();
}
}
-
+bool FGAIAircraft::_getGearDown() const {
+ return ((props->getFloatValue("position/altitude-agl-ft") < 900.0)
+ && (props->getFloatValue("velocities/airspeed-kt")
+ < performance->land_speed*1.25));
+}
dt_count = 9;
scenario_filename = "";
ai_list.clear();
- ids.clear();
}
FGAIManager::~FGAIManager() {
++ai_list_itr;
}
ai_list.clear();
- ids.clear();
}
ai_list_itr = ai_list.begin();
while(ai_list_itr != ai_list.end()) {
if ((*ai_list_itr)->getDie()) {
- freeID((*ai_list_itr)->getID());
delete (*ai_list_itr);
--numObjects[(*ai_list_itr)->getType()];
--numObjects[0];
}
-// This function returns the next available ID
-int FGAIManager::assignID() {
- int maxint = 30000;
- int x;
- bool used;
- for (x=1; x<maxint; x++) {
- used = false;
- id_itr = ids.begin();
- while( id_itr != ids.end() ) {
- if ((*id_itr) == x) used = true;
- ++id_itr;
- }
- if (!used) {
- ids.push_back(x);
- return x;
- }
- }
- return -1; // no available ID's
-}
-
-
-// This function removes an ID from the ID array, making it
-// available for assignment to another AI object
-void FGAIManager::freeID( int ID ) {
- id_itr = ids.begin();
- while( id_itr != ids.end() ) {
- if (*id_itr == ID) {
- ids.erase( id_itr );
- return;
- }
- ++id_itr;
- }
-}
-
-int FGAIManager::createAircraft( FGAIModelEntity *entity ) {
+void*
+FGAIManager::createAircraft( FGAIModelEntity *entity ) {
FGAIAircraft* ai_plane = new FGAIAircraft(this);
ai_list.push_back(ai_plane);
- ai_plane->setID( assignID() );
++numObjects[0];
++numObjects[FGAIBase::otAircraft];
if (entity->m_class == "light") {
ai_plane->init();
ai_plane->bind();
- return ai_plane->getID();
+ return ai_plane;
}
-int FGAIManager::createShip( FGAIModelEntity *entity ) {
+void*
+FGAIManager::createShip( FGAIModelEntity *entity ) {
FGAIShip* ai_ship = new FGAIShip(this);
ai_list.push_back(ai_ship);
- ai_ship->setID( assignID() );
++numObjects[0];
++numObjects[FGAIBase::otShip];
ai_ship->setHeading(entity->heading);
ai_ship->init();
ai_ship->bind();
- return ai_ship->getID();
+ return ai_ship;
}
-int FGAIManager::createBallistic( FGAIModelEntity *entity ) {
+void*
+FGAIManager::createBallistic( FGAIModelEntity *entity ) {
FGAIBallistic* ai_ballistic = new FGAIBallistic(this);
ai_list.push_back(ai_ballistic);
- ai_ballistic->setID( assignID() );
++numObjects[0];
++numObjects[FGAIBase::otBallistic];
ai_ballistic->setAzimuth(entity->azimuth);
ai_ballistic->setWind(entity->wind);
ai_ballistic->init();
ai_ballistic->bind();
- return ai_ballistic->getID();
+ return ai_ballistic;
}
-int FGAIManager::createStorm( FGAIModelEntity *entity ) {
+void*
+FGAIManager::createStorm( FGAIModelEntity *entity ) {
FGAIStorm* ai_storm = new FGAIStorm(this);
ai_list.push_back(ai_storm);
- ai_storm->setID( assignID() );
++numObjects[0];
++numObjects[FGAIBase::otStorm];
ai_storm->setHeading(entity->heading);
ai_storm->setLatitude(entity->latitude);
ai_storm->init();
ai_storm->bind();
- return ai_storm->getID();
+ return ai_storm;
}
-int FGAIManager::createThermal( FGAIModelEntity *entity ) {
+void*
+FGAIManager::createThermal( FGAIModelEntity *entity ) {
FGAIThermal* ai_thermal = new FGAIThermal(this);
ai_list.push_back(ai_thermal);
- ai_thermal->setID( assignID() );
++numObjects[0];
++numObjects[FGAIBase::otThermal];
ai_thermal->setLongitude(entity->longitude);
ai_thermal->setDiameter(entity->diameter / 6076.11549);
ai_thermal->init();
ai_thermal->bind();
- return ai_thermal->getID();
+ return ai_thermal;
}
-void FGAIManager::destroyObject( int ID ) {
+void FGAIManager::destroyObject( void* ID ) {
ai_list_itr = ai_list.begin();
while(ai_list_itr != ai_list.end()) {
if ((*ai_list_itr)->getID() == ID) {
- freeID( ID );
--numObjects[0];
--numObjects[(*ai_list_itr)->getType()];
delete (*ai_list_itr);
ai_list.erase(ai_list_itr);
- --ai_list_itr;
- return;
+
+ break;
}
++ai_list_itr;
}
delete s;
}
-int FGAIManager::getNum( FGAIBase::object_type ot ) {
- return numObjects[ot];
-}
-
ai_list_type ai_list;
ai_list_iterator ai_list_itr;
- // array of already-assigned ID's
- typedef vector <int> id_vector_type;
- id_vector_type ids;
- id_vector_type::iterator id_itr;
-
public:
FGAIManager();
void unbind();
void update(double dt);
- int assignID();
- void freeID(int ID);
-
- int createBallistic( FGAIModelEntity *entity );
- int createAircraft( FGAIModelEntity *entity );
- int createThermal( FGAIModelEntity *entity );
- int createStorm( FGAIModelEntity *entity );
- int createShip( FGAIModelEntity *entity );
+ void* createBallistic( FGAIModelEntity *entity );
+ void* createAircraft( FGAIModelEntity *entity );
+ void* createThermal( FGAIModelEntity *entity );
+ void* createStorm( FGAIModelEntity *entity );
+ void* createShip( FGAIModelEntity *entity );
- void destroyObject( int ID );
+ void destroyObject( void* ID );
inline double get_user_latitude() { return user_latitude; }
inline double get_user_longitude() { return user_longitude; }
inline double get_user_yaw() { return user_yaw; }
inline double get_user_speed() {return user_speed; }
+ inline int getNum( FGAIBase::object_type ot ) { return numObjects[ot]; }
+
void processScenario( string filename );
- int getNum( FGAIBase::object_type ot);
private: