//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#include <simgear/misc/sg_path.hxx>
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
#include <Main/fg_props.hxx>
#include <Main/globals.hxx>
+#include <simgear/misc/sg_path.hxx>
#include <simgear/math/sg_random.h>
-
#include <list>
#ifdef _MSC_VER
FGAIMgr::FGAIMgr() {
ATC = globals->get_ATC_mgr();
initDone = false;
- ai_callsigns_used["CFGFS"] = 1; // so we don't inadvertently use this
+ ai_callsigns_used["GFS"] = 1; // so we don't inadvertently use this
// TODO - use the proper user callsign when it becomes user settable.
removalList.clear();
activated.clear();
}
FGAIMgr::~FGAIMgr() {
- _defaultModel->deRef();
- if(_havePiperModel) _piperModel->deRef();
}
void FGAIMgr::init() {
// Load up models at the start to avoid pausing later
// Hack alert - Hardwired paths!!
- string planepath = "Aircraft/c172r/Models/c172-dpm.ac";
+ string planepath = "Aircraft/c172p/Models/c172p.xml";
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) {
+ } catch(sg_exception&) {
_loadedDefaultOK = false;
}
planepath.c_str(),
globals->get_props(),
globals->get_sim_time_sec() );
- } catch(sg_exception& e) {
+ } catch(sg_exception&) {
_havePiperModel = false;
}
- // We need to keep one ref of the models open to stop ssg deleting them behind our back!
- _defaultModel->ref();
- if(_havePiperModel) _piperModel->ref();
-
// go through the $FG_ROOT/ATC directory and find all *.taxi files
SGPath path(globals->get_fg_root());
path.append("ATC/");
ext = file.substr(pos + 1);
if(ext == "taxi") {
f_ident = file.substr(0, pos);
- FGAirport a;
- if(dclFindAirportID(f_ident, &a)) {
- SGBucket sgb(a.getLongitude(), a.getLatitude());
+ const FGAirport *a = fgFindAirportID( f_ident);
+ if(a){
+ SGBucket sgb(a->getLongitude(), a->getLatitude());
int idx = sgb.gen_index();
if(facilities.find(idx) != facilities.end()) {
facilities[idx]->push_back(f_ident);
/*
// TESTING
FGATCAlignedProjection ortho;
- ortho.Init(dclGetAirportPos("KEMT"), 205.0); // Guess of rwy19 heading
+ ortho.Init(fgGetAirportPos("KEMT"), 205.0); // Guess of rwy19 heading
//Point3D ip = ortho.ConvertFromLocal(Point3D(6000, 1000, 1000)); // 90 deg entry
//Point3D ip = ortho.ConvertFromLocal(Point3D(-7000, 3000, 1000)); // 45 deg entry
Point3D ip = ortho.ConvertFromLocal(Point3D(1000, -7000, 1000)); // straight-in
ai_activated_map_iterator apt_itr = activated.begin();
while(apt_itr != activated.end()) {
//cout << "FIRST IS " << (*apt_itr).first << '\n';
- if(dclGetHorizontalSeparation(userPos, dclGetAirportPos((*apt_itr).first)) > (35.0 * 1600.0)) {
+ if(dclGetHorizontalSeparation(userPos, fgGetAirportPos((*apt_itr).first)) > (35.0 * 1600.0)) {
// Then get rid of it and make sure the iterator is left pointing to the next one!
string s = (*apt_itr).first;
if(traffic.find(s) != traffic.end()) {
//cout << "s = " << s << ", traffic[s].size() = " << traffic[s].size() << '\n';
- if(traffic[s].size()) {
+ if(!traffic[s].empty()) {
apt_itr++;
} else {
//cout << "Erasing " << (*apt_itr).first << " and traffic" << '\n';
- activated.erase(apt_itr++);
+ activated.erase(apt_itr);
+ apt_itr = activated.upper_bound(s);
traffic.erase(s);
}
} else {
//cout << "Erasing " << (*apt_itr).first << ' ' << (*apt_itr).second << '\n';
- activated.erase(apt_itr++);
+ activated.erase(apt_itr);
+ apt_itr = activated.upper_bound(s);
}
} else {
apt_itr++;
//cout << "s = " << s << " size = " << (*it).second.size() << '\n';
// Only generate extra traffic if within a certain distance of the user,
// TODO - maybe take users's tuned freq into account as well.
- double d = dclGetHorizontalSeparation(userPos, dclGetAirportPos(s));
+ double d = dclGetHorizontalSeparation(userPos, fgGetAirportPos(s));
if(d < (15.0 * 1600.0)) {
double cd = 0.0;
bool gen = false;
//cout << "Size of list is " << (*it).second.size() << " at " << s << '\n';
if((*it).second.size()) {
FGAIEntity* e = *((*it).second.rbegin()); // Get the last airplane currently scheduled to arrive at this airport.
- cd = dclGetHorizontalSeparation(e->GetPos(), dclGetAirportPos(s));
+ cd = dclGetHorizontalSeparation(e->GetPos(), fgGetAirportPos(s));
if(cd < (d < 5000 ? 10000 : d + 5000)) {
gen = true;
}
//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;
}
// 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"
/*
// TODO - check for military airports - this should be in the current data.
// UGGH - there's no point at the moment - everything is labelled civil in basic.dat!
- FGAirport a;
- if(dclFindAirportID(ident, &a)) {
+ FGAirport a = fgFindAirportID(ident, &a);
+ if(a) {
cout << "CODE IS " << a.code << '\n';
} else {
// UG - can't find the airport!
}
*/
- Point3D aptpos = dclGetAirportPos(ident); // TODO - check for elev of -9999
+ Point3D aptpos = fgGetAirportPos(ident); // TODO - check for elev of -9999
//cout << "ident = " << ident << ", elev = " << aptpos.elev() << '\n';
// Operate from airports at 3000ft and below only to avoid the default cloud layers and since we don't degrade AI performance with altitude.
double d = dclGetHorizontalSeparation(userpos, aptpos); // in meters
int lev = fgGetInt("/sim/ai-traffic/level");
- if(lev < 1 || lev > 3) lev = 2;
+ if(lev < 1)
+ return;
+ if (lev > 3)
+ lev = 3;
if(visibility < 6000) lev = 1;
//cout << "level = " << lev << '\n';
/*
// 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) {
}
*/
for(twd_itr = towered.begin(); twd_itr != towered.end(); twd_itr++) {
// Only activate the closest airport not already activated each time.
if(activated.find(twd_itr->ident) == activated.end()) {
- double sep = dclGetHorizontalSeparation(Point3D(lon, lat, elev), dclGetAirportPos(twd_itr->ident));
+ double sep = dclGetHorizontalSeparation(Point3D(lon, lat, elev), fgGetAirportPos(twd_itr->ident));
if(sep < closest) {
closest = sep;
s = twd_itr->ident;
}
// 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-";