]> git.mxchange.org Git - flightgear.git/blobdiff - src/ATC/AIMgr.cxx
allow to trigger widgets via accelerator key, which is defined via "keynum"
[flightgear.git] / src / ATC / AIMgr.cxx
index 58e9886794a733ca20b4223998f68b370584987a..22cb4716a6790b8599eb1de96340154d749f76a9 100644 (file)
@@ -53,11 +53,12 @@ FGAIMgr::FGAIMgr() {
        // TODO - use the proper user callsign when it becomes user settable.
        removalList.clear();
        activated.clear();
+       _havePiperModel = true;
 }
 
 FGAIMgr::~FGAIMgr() {
-       _defaultModel->deRef();
-       _piperModel->deRef();
+        ssgDeRefDelete(_defaultModel);
+       if(_havePiperModel) ssgDeRefDelete(_piperModel);
 }
 
 void FGAIMgr::init() {
@@ -74,21 +75,40 @@ void FGAIMgr::init() {
        
        // Load up models at the start to avoid pausing later
        // Hack alert - Hardwired paths!!
-       string planepath = "Aircraft/c172/Models/c172-dpm.ac";
-       _defaultModel = sgLoad3DModel( globals->get_fg_root(),
-                                      planepath.c_str(),
-                                      globals->get_props(),
-                                      globals->get_sim_time_sec() );
+       string planepath = "Aircraft/c172r/Models/c172-dpm.ac";
+       bool _loadedDefaultOK = true;
+       try {
+               _defaultModel = sgLoad3DModel( globals->get_fg_root(),
+                                          planepath.c_str(),
+                                                                          globals->get_props(),
+                                                                          globals->get_sim_time_sec() );
+       } catch(sg_exception& e) {
+               _loadedDefaultOK = false;
+       }
+       
+       if(!_loadedDefaultOK ) {
+               // Just load the same 3D model as the default user plane - that's *bound* to exist!
+               // TODO - implement robust determination of availability of GA AI aircraft models
+               planepath = "Aircraft/c172p/Models/c172p.ac";
+               _defaultModel = sgLoad3DModel( globals->get_fg_root(),
+                                          planepath.c_str(),
+                                                                          globals->get_props(),
+                                                                          globals->get_sim_time_sec() );
+       }
 
        planepath = "Aircraft/pa28-161/Models/pa28-161.ac";
-       _piperModel = sgLoad3DModel( globals->get_fg_root(),
-                                    planepath.c_str(),
-                                    globals->get_props(),
-                                    globals->get_sim_time_sec() );
+       try {
+               _piperModel = sgLoad3DModel( globals->get_fg_root(),
+                                        planepath.c_str(),
+                                                                        globals->get_props(),
+                                                                        globals->get_sim_time_sec() );
+       } catch(sg_exception& e) {
+               _havePiperModel = false;
+       }
 
        // We need to keep one ref of the models open to stop ssg deleting them behind our back!
        _defaultModel->ref();
-       _piperModel->ref();
+       if(_havePiperModel) _piperModel->ref();
 
        // go through the $FG_ROOT/ATC directory and find all *.taxi files
        SGPath path(globals->get_fg_root());
@@ -113,7 +133,7 @@ void FGAIMgr::init() {
                                f_ident = file.substr(0, pos);
                                FGAirport a;
                                if(dclFindAirportID(f_ident, &a)) {
-                                       SGBucket sgb(a._longitude, a._latitude);
+                                       SGBucket sgb(a.getLongitude(), a.getLatitude());
                                        int idx = sgb.gen_index();
                                        if(facilities.find(idx) != facilities.end()) {
                                                facilities[idx]->push_back(f_ident);
@@ -278,13 +298,13 @@ void FGAIMgr::update(double dt) {
        //cout << "Size of AI list is " << ai_list.size() << '\n';
 }
 
-void FGAIMgr::ScheduleRemoval(string s) {
+void FGAIMgr::ScheduleRemoval(const string& s) {
        //cout << "Scheduling removal of plane " << s << " from AIMgr\n";
        removalList.push_back(s);
 }
 
 // Activate AI traffic at an airport
-void FGAIMgr::ActivateAirport(string ident) {
+void FGAIMgr::ActivateAirport(const string& ident) {
        ATC->AIRegisterAirport(ident);
        // TODO - need to start the traffic more randomly
        FGAILocalTraffic* local_traffic = new FGAILocalTraffic;
@@ -299,7 +319,7 @@ void FGAIMgr::ActivateAirport(string ident) {
 }
 
 // Hack - Generate AI traffic at an airport with no facilities file
-void FGAIMgr::GenerateSimpleAirportTraffic(string ident, double min_dist) {
+void FGAIMgr::GenerateSimpleAirportTraffic(const string& ident, double min_dist) {
        // Ugly hack - don't let VFR Cessnas operate at a hardwired list of major airports
        // This will go eventually once airport .xml files specify the traffic profile
        if(ident == "KSFO" || ident == "KDFW" || ident == "EGLL" || ident == "KORD" || ident == "KJFK" 
@@ -333,13 +353,13 @@ void FGAIMgr::GenerateSimpleAirportTraffic(string ident, double min_dist) {
        bool cessna = true;
        
        // Get the time and only operate VFR in the (approximate) daytime.
-       //SGTime *t = globals->get_time_params();
-       string time_str = fgGetString("sim/time/gmt-string");
-       int loc_time = atoi((time_str.substr(0,3)).c_str());
-       //cout << "gmt_time = " << loc_time << '\n';
-       loc_time += (int)((aptpos.lon() / 360.0) * 24.0);
-       while(loc_time < 0) loc_time += 24;
-       while(loc_time > 24) loc_time -= 24;
+       struct tm *t = globals->get_time_params()->getGmt();
+       int loc_time = t->tm_hour + int(aptpos.lon() / (360.0 / 24.0));
+       while (loc_time < 0)
+               loc_time += 24;
+       while (loc_time >= 24)
+               loc_time -= 24;
+
        //cout << "loc_time = " << loc_time << '\n';
        if(loc_time < 7 || loc_time > 19) return;
        
@@ -448,7 +468,7 @@ void FGAIMgr::GenerateSimpleAirportTraffic(string ident, double min_dist) {
                        else cessna = true;
                        string s = GenerateShortForm(GenerateUniqueCallsign(), (cessna ? "Cessna-" : "Piper-"));
                        FGAIGAVFRTraffic* t = new FGAIGAVFRTraffic();
-                       t->SetModel(cessna ? _defaultModel : _piperModel);
+                       t->SetModel(cessna ? _defaultModel : (_havePiperModel ? _piperModel : _defaultModel));
                        //cout << "Generating VFR traffic " << s << " inbound to " << ident << " " << ad << " meters out from " << dir << " degrees\n";
                        Point3D tpos = dclUpdatePosition(aptpos, dir, 6.0, ad);
                        if(tpos.elev() > (aptpos.elev() + 3000.0)) tpos.setelev(aptpos.elev() + 3000.0);        // FEET yuk :-(
@@ -461,7 +481,7 @@ void FGAIMgr::GenerateSimpleAirportTraffic(string ident, double min_dist) {
 
 /*
 // Generate a VFR arrival at airport apt, at least distance d (meters) out.
-void FGAIMgr::GenerateVFRArrival(string apt, double d) {
+void FGAIMgr::GenerateVFRArrival(const string& apt, double d) {
 }
 */
 
@@ -588,7 +608,7 @@ string FGAIMgr::GenerateUniqueCallsign() {
 }
 
 // This will be moved somewhere else eventually!!!!
-string FGAIMgr::GenerateShortForm(string callsign, string plane_str, bool local) {
+string FGAIMgr::GenerateShortForm(const string& callsign, const string& plane_str, bool local) {
        //cout << callsign << '\n';
        string s;
        if(local) s = "Trainer-";