2004-09-22 08:47:05 +00:00
|
|
|
// FGAIScenario.cxx - class for loading an AI scenario
|
2004-05-15 09:07:55 +00:00
|
|
|
// Written by David Culp, started May 2004
|
|
|
|
// - davidculp2@comcast.net
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
|
|
|
|
|
|
|
#include <simgear/misc/sg_path.hxx>
|
|
|
|
#include <simgear/debug/logstream.hxx>
|
|
|
|
#include <simgear/structure/exception.hxx>
|
|
|
|
#include <simgear/constants.h>
|
|
|
|
#ifdef __BORLANDC__
|
|
|
|
# define exception c_exception
|
|
|
|
#endif
|
|
|
|
#include <simgear/props/props.hxx>
|
2004-09-07 09:53:23 +00:00
|
|
|
|
2004-05-15 09:07:55 +00:00
|
|
|
#include <Main/globals.hxx>
|
|
|
|
#include <Main/fg_props.hxx>
|
|
|
|
|
2004-09-07 09:53:23 +00:00
|
|
|
#include "AIScenario.hxx"
|
2004-09-22 10:03:26 +00:00
|
|
|
#include "AIFlightPlan.hxx"
|
2004-09-07 09:53:23 +00:00
|
|
|
|
|
|
|
|
2004-05-15 09:07:55 +00:00
|
|
|
|
|
|
|
FGAIScenario::FGAIScenario(string filename)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
SGPath path( globals->get_fg_root() );
|
|
|
|
path.append( ("/Data/AI/" + filename + ".xml").c_str() );
|
|
|
|
SGPropertyNode root;
|
|
|
|
|
|
|
|
try {
|
|
|
|
readProperties(path.str(), &root);
|
|
|
|
} catch (const sg_exception &e) {
|
|
|
|
SG_LOG(SG_GENERAL, SG_ALERT,
|
|
|
|
"Incorrect path specified for AI scenario: ");
|
|
|
|
cout << path.str() << endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2004-09-22 10:03:26 +00:00
|
|
|
entries.clear();
|
2004-05-15 12:46:25 +00:00
|
|
|
SGPropertyNode * node = root.getNode("scenario");
|
2004-05-15 09:07:55 +00:00
|
|
|
for (i = 0; i < node->nChildren(); i++) {
|
|
|
|
//cout << "Reading entry " << i << endl;
|
2004-09-07 09:53:23 +00:00
|
|
|
FGAIModelEntity* en = new FGAIModelEntity;
|
2004-05-15 09:07:55 +00:00
|
|
|
entries.push_back( en );
|
|
|
|
SGPropertyNode * entry_node = node->getChild(i);
|
2004-05-15 12:46:25 +00:00
|
|
|
en->callsign = entry_node->getStringValue("callsign", "none");
|
2004-09-07 09:53:23 +00:00
|
|
|
en->m_type = entry_node->getStringValue("type", "aircraft");
|
|
|
|
en->m_class = entry_node->getStringValue("class", "jet_transport");
|
|
|
|
en->path = entry_node->getStringValue("model", "Models/Geometry/glider.ac");
|
2004-05-15 12:46:25 +00:00
|
|
|
en->flightplan = entry_node->getStringValue("flightplan", "");
|
David Culp:
First, preferences.xml will define the scenario filename.
For now, the other way of defining ai objects still works, so the sailboat
stays in preferences.xml. Later, I'll move the sailboat into the demo
scenario. If no scenario filename is given, then no scenario will be
processed.
I changed the demo scenario to create two 737's, one takes off on runway 01L,
and the other takes off on runway 01R. This will make a good demo for the ai
system. One problem, if you takeoff on 28L/R right away, you might run into
the taking-off 737's, or be scared.
2004-05-17 08:45:33 +00:00
|
|
|
en->repeat = entry_node->getDoubleValue("repeat", 0.0);
|
2004-05-29 11:39:10 +00:00
|
|
|
en->latitude = entry_node->getDoubleValue("latitude", 0.0);
|
|
|
|
en->longitude = entry_node->getDoubleValue("longitude", 0.0);
|
|
|
|
en->altitude = entry_node->getDoubleValue("altitude", 0.0);
|
|
|
|
en->speed = entry_node->getDoubleValue("speed", 0.0);
|
|
|
|
en->heading = entry_node->getDoubleValue("heading", 0.0);
|
|
|
|
en->roll = entry_node->getDoubleValue("roll", 0.0);
|
|
|
|
en->azimuth = entry_node->getDoubleValue("azimuth", 0.0);
|
|
|
|
en->elevation = entry_node->getDoubleValue("elevation", 0.0);
|
|
|
|
en->rudder = entry_node->getDoubleValue("rudder", 0.0);
|
2004-06-03 17:59:14 +00:00
|
|
|
en->strength = entry_node->getDoubleValue("strength-fps", 0.0);
|
|
|
|
en->diameter = entry_node->getDoubleValue("diameter-ft", 0.0);
|
2004-08-26 16:25:54 +00:00
|
|
|
en->eda = entry_node->getDoubleValue("eda", 0.007);
|
2004-09-01 08:32:54 +00:00
|
|
|
en->life = entry_node->getDoubleValue("life", 900.0);
|
2004-09-20 19:29:16 +00:00
|
|
|
en->buoyancy = entry_node->getDoubleValue("buoyancy", 0);
|
|
|
|
en->wind_from_east = entry_node->getDoubleValue("wind_from_east", 0);
|
|
|
|
en->wind_from_north = entry_node->getDoubleValue("wind_from_north", 0);
|
|
|
|
en->wind = entry_node->getBoolValue("wind", false);
|
2004-09-22 10:03:26 +00:00
|
|
|
en->cd = entry_node->getDoubleValue ("cd", 0.029);
|
|
|
|
en->weight = entry_node->getDoubleValue ("weight", 0.030);
|
|
|
|
|
2004-09-20 19:29:16 +00:00
|
|
|
en->fp = NULL;
|
2004-09-22 10:03:26 +00:00
|
|
|
if (en->flightplan != ""){
|
|
|
|
en->fp = new FGAIFlightPlan( en->flightplan );
|
|
|
|
}
|
2004-05-15 09:07:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
entry_iterator = entries.begin();
|
|
|
|
//cout << entries.size() << " entries read." << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FGAIScenario::~FGAIScenario()
|
|
|
|
{
|
|
|
|
entries.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-09-07 09:53:23 +00:00
|
|
|
FGAIModelEntity*
|
2004-05-15 09:07:55 +00:00
|
|
|
FGAIScenario::getNextEntry( void )
|
|
|
|
{
|
David Culp:
First, preferences.xml will define the scenario filename.
For now, the other way of defining ai objects still works, so the sailboat
stays in preferences.xml. Later, I'll move the sailboat into the demo
scenario. If no scenario filename is given, then no scenario will be
processed.
I changed the demo scenario to create two 737's, one takes off on runway 01L,
and the other takes off on runway 01R. This will make a good demo for the ai
system. One problem, if you takeoff on 28L/R right away, you might run into
the taking-off 737's, or be scared.
2004-05-17 08:45:33 +00:00
|
|
|
if (entries.size() == 0) return 0;
|
|
|
|
if (entry_iterator != entries.end()) {
|
|
|
|
return *entry_iterator++;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
2004-05-15 09:07:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int FGAIScenario::nEntries( void )
|
|
|
|
{
|
|
|
|
return entries.size();
|
|
|
|
}
|
|
|
|
|
2004-09-22 08:47:05 +00:00
|
|
|
// end scenario.cxx
|