+
+MapWidget::DrawAIObject::DrawAIObject(SGPropertyNode* m, const SGGeod& g) :
+ model(m),
+ boat(false),
+ pos(g),
+ speedKts(0)
+{
+ std::string name(model->getNameString());
+ heading = model->getDoubleValue("orientation/true-heading-deg");
+
+ if ((name == "aircraft") || (name == "multiplayer") ||
+ (name == "wingman") || (name == "tanker"))
+ {
+ speedKts = static_cast<int>(model->getDoubleValue("velocities/true-airspeed-kt"));
+ label = model->getStringValue("callsign", "<>");
+
+ // try to access the flight-plan of the aircraft. There are several layers
+ // of potential NULL-ness here, so we have to be defensive at each stage.
+ std::string originICAO, destinationICAO;
+ FGAIManager* aiManager = globals->get_subsystem<FGAIManager>();
+ FGAIBasePtr aircraft = aiManager ? aiManager->getObjectFromProperty(model) : NULL;
+ if (aircraft) {
+ FGAIAircraft* p = static_cast<FGAIAircraft*>(aircraft.get());
+ if (p->GetFlightPlan()) {
+ if (p->GetFlightPlan()->departureAirport()) {
+ originICAO = p->GetFlightPlan()->departureAirport()->ident();
+ }
+
+ if (p->GetFlightPlan()->arrivalAirport()) {
+ destinationICAO = p->GetFlightPlan()->arrivalAirport()->ident();
+ }
+ } // of flight-plan exists
+ } // of check for AIBase-derived instance
+
+ // draw callsign / altitude / speed
+ int altFt50 = static_cast<int>(pos.getElevationFt() / 50.0) * 50;
+ std::ostringstream ss;
+ ss << model->getStringValue("callsign", "<>");
+ if (speedKts > 1) {
+ ss << "\n" << altFt50 << "' " << speedKts << "kts";
+ }
+
+ if (!originICAO.empty() || ! destinationICAO.empty()) {
+ ss << "\n" << originICAO << " -> " << destinationICAO;
+ }
+
+ legend = ss.str();
+ } else if ((name == "ship") || (name == "carrier") || (name == "escort")) {
+ boat = true;
+ speedKts = static_cast<int>(model->getDoubleValue("velocities/speed-kts"));
+ label = model->getStringValue("name", "<>");
+
+ char buffer[1024];
+ ::snprintf(buffer, 1024, "%s\n%dkts",
+ model->getStringValue("name", "<>"),
+ speedKts);
+ legend = buffer;
+ }
+}
+