2004-10-28 08:33:55 +00:00
|
|
|
// FGAICarrier - AIShip-derived class creates an AI aircraft carrier
|
|
|
|
//
|
|
|
|
// Written by David Culp, started October 2004.
|
|
|
|
//
|
|
|
|
// Copyright (C) 2004 David P. Culp - 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.
|
|
|
|
|
|
|
|
#ifndef _FG_AICARRIER_HXX
|
|
|
|
#define _FG_AICARRIER_HXX
|
|
|
|
|
2004-11-26 10:24:48 +00:00
|
|
|
#include <string>
|
|
|
|
#include <list>
|
|
|
|
#include <plib/ssg.h>
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
|
|
SG_USING_STD(string);
|
|
|
|
SG_USING_STD(list);
|
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
#include "AIShip.hxx"
|
2005-08-16 09:37:23 +00:00
|
|
|
|
|
|
|
#include "AIManager.hxx"
|
|
|
|
#include "AIBase.hxx"
|
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
class FGAIManager;
|
2004-11-26 10:24:48 +00:00
|
|
|
class FGAICarrier;
|
|
|
|
|
|
|
|
class FGAICarrierHardware : public ssgBase {
|
|
|
|
public:
|
|
|
|
|
2005-12-08 15:03:08 +00:00
|
|
|
enum Type { Catapult, Wire, Solid };
|
|
|
|
|
|
|
|
FGAICarrier *carrier;
|
|
|
|
int id;
|
|
|
|
Type type;
|
|
|
|
|
|
|
|
static FGAICarrierHardware* newCatapult(FGAICarrier *c) {
|
|
|
|
FGAICarrierHardware* ch = new FGAICarrierHardware;
|
|
|
|
ch->carrier = c;
|
|
|
|
ch->type = Catapult;
|
|
|
|
ch->id = unique_id++;
|
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
static FGAICarrierHardware* newWire(FGAICarrier *c) {
|
|
|
|
FGAICarrierHardware* ch = new FGAICarrierHardware;
|
|
|
|
ch->carrier = c;
|
|
|
|
ch->type = Wire;
|
|
|
|
ch->id = unique_id++;
|
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
static FGAICarrierHardware* newSolid(FGAICarrier *c) {
|
|
|
|
FGAICarrierHardware* ch = new FGAICarrierHardware;
|
|
|
|
ch->carrier = c;
|
|
|
|
ch->type = Solid;
|
|
|
|
ch->id = unique_id++;
|
|
|
|
return ch;
|
|
|
|
}
|
2004-11-26 10:24:48 +00:00
|
|
|
|
|
|
|
private:
|
2005-12-08 15:03:08 +00:00
|
|
|
static int unique_id;
|
2004-11-26 10:24:48 +00:00
|
|
|
};
|
2004-10-28 08:33:55 +00:00
|
|
|
|
2005-12-08 15:03:08 +00:00
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
class FGAICarrier : public FGAIShip {
|
|
|
|
public:
|
2005-12-08 15:03:08 +00:00
|
|
|
|
2006-02-11 13:16:56 +00:00
|
|
|
FGAICarrier();
|
|
|
|
virtual ~FGAICarrier();
|
|
|
|
|
|
|
|
virtual void readFromScenario(SGPropertyNode* scFileNode);
|
2005-12-08 15:03:08 +00:00
|
|
|
|
|
|
|
void setSign(const string& );
|
|
|
|
void setTACANChannelID(const string &);
|
|
|
|
|
|
|
|
void getVelocityWrtEarth(sgdVec3& v, sgdVec3& omega, sgdVec3& pivot);
|
|
|
|
virtual void bind();
|
2004-11-30 12:34:11 +00:00
|
|
|
virtual void unbind();
|
2005-10-25 13:49:55 +00:00
|
|
|
void UpdateFlols ( const sgdMat3& trans );
|
2005-08-16 09:37:23 +00:00
|
|
|
void UpdateWind ( double dt );
|
|
|
|
void setWind_from_east( double fps );
|
|
|
|
void setWind_from_north( double fps );
|
|
|
|
void setMaxLat( double deg );
|
|
|
|
void setMinLat( double deg );
|
|
|
|
void setMaxLong( double deg );
|
|
|
|
void setMinLong( double deg );
|
|
|
|
void TurnToLaunch();
|
|
|
|
void TurnToBase();
|
|
|
|
void ReturnToBox();
|
|
|
|
float Horizon(float h);
|
2005-12-08 15:03:08 +00:00
|
|
|
bool OutsideBox();
|
2005-11-29 16:38:49 +00:00
|
|
|
|
2005-12-08 15:03:08 +00:00
|
|
|
bool init();
|
2004-11-26 10:24:48 +00:00
|
|
|
|
2006-02-11 13:16:56 +00:00
|
|
|
virtual const char* getTypeString(void) const { return "carrier"; }
|
|
|
|
|
2005-12-08 15:03:08 +00:00
|
|
|
bool getParkPosition(const string& id, Point3D& geodPos,
|
|
|
|
double& hdng, sgdVec3 uvw);
|
2005-03-19 09:57:18 +00:00
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
private:
|
2006-02-11 13:16:56 +00:00
|
|
|
/// Is sufficient to be private, stores a possible position to place an
|
|
|
|
/// aircraft on start
|
|
|
|
struct ParkPosition {
|
|
|
|
ParkPosition(const ParkPosition& pp)
|
|
|
|
: name(pp.name), offset(pp.offset), heading_deg(pp.heading_deg)
|
|
|
|
{}
|
|
|
|
ParkPosition(const string& n, const Point3D& off = Point3D(), double heading = 0)
|
|
|
|
: name(n), offset(off), heading_deg(heading)
|
|
|
|
{}
|
|
|
|
string name;
|
|
|
|
Point3D offset;
|
|
|
|
double heading_deg;
|
|
|
|
};
|
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
|
2005-12-08 15:03:08 +00:00
|
|
|
void update(double dt);
|
|
|
|
void mark_nohot(ssgEntity*);
|
|
|
|
|
|
|
|
bool mark_wires(ssgEntity*, const list<string>&, bool = false);
|
|
|
|
bool mark_cat(ssgEntity*, const list<string>&, bool = false);
|
|
|
|
bool mark_solid(ssgEntity*, const list<string>&, bool = false);
|
|
|
|
double wind_from_east; // fps
|
2005-08-16 09:37:23 +00:00
|
|
|
double wind_from_north; // fps
|
|
|
|
double rel_wind_speed_kts;
|
|
|
|
double rel_wind_from_deg;
|
2005-12-08 15:03:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
list<string> solid_objects; // List of solid object names
|
|
|
|
list<string> wire_objects; // List of wire object names
|
|
|
|
list<string> catapult_objects; // List of catapult object names
|
|
|
|
list<ParkPosition> ppositions; // List of positions where an aircraft can start.
|
|
|
|
string sign; // The sign of this carrier.
|
|
|
|
|
|
|
|
// Velocity wrt earth.
|
|
|
|
sgdVec3 vel_wrt_earth;
|
|
|
|
sgdVec3 rot_wrt_earth;
|
|
|
|
sgdVec3 rot_pivot_wrt_earth;
|
|
|
|
|
|
|
|
|
|
|
|
// these describe the flols
|
|
|
|
Point3D flols_off;
|
|
|
|
|
|
|
|
double dist; // the distance of the eyepoint from the flols
|
|
|
|
double angle;
|
|
|
|
int source; // the flols light which is visible at the moment
|
2005-08-16 09:37:23 +00:00
|
|
|
bool wave_off_lights;
|
2005-12-08 15:03:08 +00:00
|
|
|
|
|
|
|
// these are for maneuvering the carrier
|
2005-08-16 09:37:23 +00:00
|
|
|
Point3D carrierpos;
|
|
|
|
Point3D initialpos;
|
2005-12-08 15:03:08 +00:00
|
|
|
|
2005-08-16 09:37:23 +00:00
|
|
|
double wind_speed_from_north_kts ;
|
|
|
|
double wind_speed_from_east_kts ;
|
|
|
|
double wind_speed_kts; //true wind speed
|
|
|
|
double wind_from_deg; //true wind direction
|
|
|
|
double rel_wind;
|
|
|
|
double max_lat, min_lat, max_long, min_long;
|
|
|
|
double base_course, base_speed;
|
2005-12-08 15:03:08 +00:00
|
|
|
|
2005-08-16 09:37:23 +00:00
|
|
|
bool turn_to_launch_hdg;
|
|
|
|
bool returning; // set if the carrier is returning to an operating box
|
2005-12-08 15:03:08 +00:00
|
|
|
bool InToWind(); // set if the carrier is in to wind
|
2005-11-29 16:38:49 +00:00
|
|
|
|
|
|
|
|
2005-08-16 09:37:23 +00:00
|
|
|
SGPropertyNode_ptr _longitude_node;
|
|
|
|
SGPropertyNode_ptr _latitude_node;
|
|
|
|
SGPropertyNode_ptr _altitude_node;
|
|
|
|
SGPropertyNode_ptr _surface_wind_from_deg_node;
|
|
|
|
SGPropertyNode_ptr _surface_wind_speed_node;
|
2005-12-08 15:03:08 +00:00
|
|
|
|
2005-11-29 16:38:49 +00:00
|
|
|
// this is for tacan
|
2005-12-08 15:03:08 +00:00
|
|
|
|
2005-08-16 09:37:23 +00:00
|
|
|
string TACAN_channel_id;
|
2005-12-08 15:03:08 +00:00
|
|
|
|
2005-11-29 16:38:49 +00:00
|
|
|
// these are for moving the elevators
|
|
|
|
void UpdateElevator( double dt, double transition_time);
|
|
|
|
double step;
|
|
|
|
double pos_norm, raw_pos_norm;
|
|
|
|
double transition_time, time_constant;
|
|
|
|
bool elevators;
|
2004-10-28 08:33:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _FG_AICARRIER_HXX
|