]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
SG_ namespace.
[flightgear.git] / src / Main / options.cxx
index 1c4c0a38781ce9e55e773894b1d5868746071936..8ec77dfad1b64cb725406625886d4b597ea277c8 100644 (file)
 #  include <config.h>
 #endif
 
+#include <simgear/compiler.h>
+
+/* normans fix */
 #if defined(FX) && defined(XMESA)
 bool global_fullscreen = true;
 #endif
 
-#include <simgear/compiler.h>
-
 #include <math.h>            // rint()
 #include <stdio.h>
 #include <stdlib.h>          // atof(), atoi()
@@ -38,31 +39,36 @@ bool global_fullscreen = true;
 
 #include STL_STRING
 
-#include <simgear/constants.h>
-#include <simgear/debug/logstream.hxx>
 #include <simgear/misc/fgstream.hxx>
-#include <simgear/misc/props.hxx>
-#include <simgear/timing/sg_time.hxx>
 
-#include <Include/general.hxx>
-#include <Cockpit/cockpit.hxx>
-#include <FDM/flight.hxx>
-#include <FDM/UIUCModel/uiuc_aircraftdir.h>
+// #include <Include/general.hxx>
+// #include <Airports/simple.hxx>
+// #include <Cockpit/cockpit.hxx>
+// #include <FDM/flight.hxx>
+// #include <FDM/UIUCModel/uiuc_aircraftdir.h>
 #ifdef FG_NETWORK_OLK
 #  include <NetworkOLK/network.h>
 #endif
 
 #include "globals.hxx"
+#include "fg_init.hxx"
+#include "fg_props.hxx"
 #include "options.hxx"
-#include "views.hxx"
 
-FG_USING_STD(string);
-FG_USING_NAMESPACE(std);
+SG_USING_STD(string);
+SG_USING_NAMESPACE(std);
+
 
-// from GLUTmain.cxx
-extern void fgReshape( int width, int height );
+#define NEW_DEFAULT_MODEL_HZ 120
 
-inline double
+enum
+{
+    FG_OPTIONS_OK = 0,
+    FG_OPTIONS_HELP = 1,
+    FG_OPTIONS_ERROR = 2
+};
+
+static double
 atof( const string& str )
 {
 
@@ -74,7 +80,7 @@ atof( const string& str )
 #endif
 }
 
-inline int
+static int
 atoi( const string& str )
 {
 #ifdef __MWERKS__ 
@@ -86,194 +92,104 @@ atoi( const string& str )
 }
 
 
-// Defined the shared options class here
-fgOPTIONS current_options;
-
-
-// Constructor
-fgOPTIONS::fgOPTIONS() :
-    // starting longitude in degrees (west = -)
-    // starting latitude in degrees (south = -)
-
-    // Default initial position is Globe, AZ (P13)
-    lon(-110.6642444),
-    lat(  33.3528917),
-
-    // North of the city of Globe
-    // lon(-110.7),
-    // lat(  33.4),
-
-    // North of the city of Globe
-    // lon(-110.742578),
-    // lat(  33.507122),
-
-    // Near where I used to live in Globe, AZ
-    // lon(-110.766000),
-    // lat(  33.377778),
-
-    // 10125 Jewell St. NE
-    // lon(-93.15),
-    // lat( 45.15),
-
-    // Near KHSP (Hot Springs, VA)
-    // lon(-79.8338964 + 0.01),
-    // lat( 37.9514564 + 0.008),
-
-    // (SEZ) SEDONA airport
-    // lon(-111.7884614 + 0.01),
-    // lat(  34.8486289 - 0.015),
-
-    // Jim Brennon's Kingmont Observatory
-    // lon(-121.1131667),
-    // lat(  38.8293917),
-
-    // Huaras, Peru (S09d 31.871'  W077d 31.498')
-    // lon(-77.5249667),
-    // lat( -9.5311833),
-    // Eclipse Watching w73.5 n10 (approx) 18:00 UT
-    // lon(-73.5),
-    // lat( 10.0),
-
-    // Timms Hill (WI)
-    // lon(-90.1953055556),
-    // lat( 45.4511388889),
-
-    // starting altitude in meters (this will be reset to ground level
-    // if it is lower than the terrain
-    altitude(-9999.0),
-
-    // Initial Orientation
-    heading(270.0),      // heading (yaw) angle in degress (Psi)
-    roll(0.0),           // roll angle in degrees (Phi)
-    pitch(0.424),        // pitch angle in degrees (Theta)
-
-    // Initialize current options velocities to 0.0
-    uBody(0.0), vBody(0.0), wBody(0.0), vkcas(0.0), mach(0.0),
-
-    // Miscellaneous
-    game_mode(0),
-    splash_screen(1),
-    intro_music(1),
-    mouse_pointer(0),
-    control_mode(FG_JOYSTICK),
-    auto_coordination(FG_AUTO_COORD_NOT_SPECIFIED),
-
-    // Features
-    hud_status(0),
-    panel_status(1),
-    sound(1),
-    anti_alias_hud(0),
-
-    // Flight Model options
-    flight_model( FGInterface::FG_LARCSIM ),
-    aircraft( "c172" ),
-    model_hz( NEW_DEFAULT_MODEL_HZ ),
-    speed_up( 1 ),
-    trim(0),
-
-    // Rendering options
-    fog(FG_FOG_NICEST),  // nicest
-    clouds(false),
-    clouds_asl(5000*FEET_TO_METER),
-    fov(55.0),
-    fullscreen(0),
-    shading(1),
-    skyblend(1),
-    textures(1),
-    wireframe(0),
-    xsize(800),
-    ysize(600),
-    bpp(16),
-    view_mode(FG_VIEW_PILOT),
-
-    // Scenery options
-    tile_diameter(5),
-
-    // HUD options
-    units(FG_UNITS_FEET),
-    tris_or_culled(0),
-       
-    // Time options
-    time_offset(0),
-
-    network_olk(false)
+/**
+ * Set a few fail-safe default property values.
+ *
+ * These should all be set in $FG_ROOT/preferences.xml, but just
+ * in case, we provide some initial sane values here. This method 
+ * should be invoked *before* reading any init files.
+ */
+void
+fgSetDefaults ()
 {
-    // set initial values/defaults
-    time_offset_type = FG_TIME_SYS_OFFSET;
-    char* envp = ::getenv( "FG_ROOT" );
-
-    if ( envp != NULL ) {
-       // fg_root could be anywhere, so default to environmental
-       // variable $FG_ROOT if it is set.
-       fg_root = envp;
-    } else {
-       // Otherwise, default to a random compiled-in location if
-       // $FG_ROOT is not set.  This can still be overridden from the
-       // command line or a config file.
-
-#if defined( WIN32 )
-       fg_root = "\\FlightGear";
-#elif defined( MACOS )
-       fg_root = "";
-#else
-       fg_root = PKGLIBDIR;
-#endif
-    }
-
     // set a possibly independent location for scenery data
-    envp = ::getenv( "FG_SCENERY" );
+    char *envp = ::getenv( "FG_SCENERY" );
 
     if ( envp != NULL ) {
        // fg_root could be anywhere, so default to environmental
        // variable $FG_ROOT if it is set.
-       fg_scenery = envp;
+        globals->set_fg_scenery(envp);
     } else {
        // Otherwise, default to Scenery being in $FG_ROOT/Scenery
-       fg_scenery = "";
+       globals->set_fg_scenery("");
     }
+                               // Position (Globe, AZ)
+    fgSetDouble("/position/longitude", -110.6642444);
+    fgSetDouble("/position/latitude", 33.3528917);
+    fgSetDouble("/position/altitude", -9999.0);
+
+                               // Orientation
+    fgSetDouble("/orientation/heading", 270);
+    fgSetDouble("/orientation/roll", 0);
+    fgSetDouble("/orientation/pitch", 0.424);
+
+                               // Velocities
+    fgSetString("/sim/startup/speed-set", "knots");
+    fgSetDouble("/velocities/uBody", 0.0);
+    fgSetDouble("/velocities/vBody", 0.0);
+    fgSetDouble("/velocities/wBody", 0.0);
+    fgSetDouble("/velocities/speed-north", 0.0);
+    fgSetDouble("/velocities/speed-east", 0.0);
+    fgSetDouble("/velocities/speed-down", 0.0);
+    fgSetDouble("/velocities/airspeed", 0.0);
+    fgSetDouble("/velocities/mach", 0.0);
+
+                               // Miscellaneous
+    fgSetBool("/sim/startup/game-mode", false);
+    fgSetBool("/sim/startup/splash-screen", true);
+    fgSetBool("/sim/startup/intro-music", true);
+    // we want mouse-pointer to have an undefined value if nothing is
+    // specified so we can do the right thing for voodoo-1/2 cards.
+    // fgSetString("/sim/startup/mouse-pointer", "disabled");
+    fgSetString("/sim/control-mode", "joystick");
+    fgSetBool("/sim/auto-coordination", false);
+
+                               // Features
+    fgSetBool("/sim/hud/visibility", false);
+    fgSetBool("/sim/panel/visibility", true);
+    fgSetBool("/sim/sound", true);
+    fgSetBool("/sim/hud/antialiased", false);
+
+                               // Flight Model options
+    fgSetString("/sim/flight-model", "larcsim");
+    fgSetString("/sim/aircraft", "c172");
+    fgSetInt("/sim/model-hz", NEW_DEFAULT_MODEL_HZ);
+    fgSetInt("/sim/speed-up", 1);
+    fgSetBool("/sim/startup/trim", false);
+    fgSetBool("/sim/startup/onground", true);
+
+                               // Rendering options
+    fgSetString("/sim/rendering/fog", "nicest");
+    fgSetBool("/environment/clouds/status", true);
+    fgSetDouble("/environment/clouds/altitude", 5000);
+    fgSetBool("/sim/startup/fullscreen", false);
+    fgSetBool("/sim/rendering/shading", true);
+    fgSetBool("/sim/rendering/skyblend", true);
+    fgSetBool("/sim/rendering/textures", true);
+    fgSetBool("/sim/rendering/wireframe", false);
+    fgSetInt("/sim/startup/xsize", 800);
+    fgSetInt("/sim/startup/ysize", 600);
+    fgSetInt("/sim/rendering/bits-per-pixel", 16);
+    fgSetString("/sim/view-mode", "pilot");
+    fgSetDouble("/sim/startup/view-offset", 0);
+    fgSetDouble("/environment/visibility", 20000);
+
+                               // HUD options
+    fgSetString("/sim/startup/units", "feet");
+    fgSetString("/sim/hud/frame-stat-type", "tris");
+       
+                               // Time options
+    fgSetInt("/sim/startup/time-offset", 0);
+    fgSetString("/sim/startup/time-offset-type", "system-offset");
 
-    airport_id = "";           // default airport id
-    net_id = "Johnney";                // default pilot's name
-
-    // initialize port config string list
-    channel_options_list.clear();
+    fgSetBool("/sim/networking/network-olk", false);
+    fgSetString("/sim/networking/call-sign", "Johnny");
 }
 
-void 
-fgOPTIONS::toggle_panel() {
-    
-    bool freeze = globals->get_freeze();
-
-    if( !freeze )
-        globals->set_freeze(true);
-    
-    if( panel_status ) {
-       panel_status = false;
-       if ( current_panel != NULL )
-         current_panel->setVisibility(false);
-    } else {
-       panel_status = true;
-       if ( current_panel != NULL )
-         current_panel->setVisibility(true);
-    }
-
-    // new rule .. "fov" shouldn't get messed with like this.
-    /* if ( panel_status ) {
-       fov *= 0.4232;
-    } else {
-       fov *= (1.0 / 0.4232);
-    } */
-
-    // fgReshape( xsize, ysize);
-    fgReshape( current_view.get_winWidth(), current_view.get_winHeight() );
 
-    if( !freeze )
-        globals->set_freeze( false );
-}
-
-double
-fgOPTIONS::parse_time(const string& time_in) {
+// parse a time string ([+/-]%f[:%f[:%f]]) into hours
+static double
+parse_time(const string& time_in) {
     char *time_str, num[256];
     double hours, minutes, seconds;
     double result = 0.0;
@@ -351,7 +267,9 @@ fgOPTIONS::parse_time(const string& time_in) {
 }
 
 
-long int fgOPTIONS::parse_date( const string& date)
+// parse a date string (yyyy:mm:dd:hh:mm:ss) into a time_t (seconds)
+static long int 
+parse_date( const string& date)
 {
     struct tm gmt;
     char * date_str, num[256];
@@ -458,21 +376,9 @@ long int fgOPTIONS::parse_date( const string& date)
 }
 
 
-// parse degree in the form of [+/-]hhh:mm:ss
-void fgOPTIONS::parse_control( const string& mode ) {
-    if ( mode == "joystick" ) {
-       control_mode = FG_JOYSTICK;
-    } else if ( mode == "mouse" ) {
-       control_mode = FG_MOUSE;
-    } else {
-       control_mode = FG_KEYBOARD;
-    }
-}
-
-
-/// parse degree in the form of [+/-]hhh:mm:ss
-double
-fgOPTIONS::parse_degree( const string& degree_str) {
+// parse angle in the form of [+/-]ddd:mm:ss into degrees
+static double
+parse_degree( const string& degree_str) {
     double result = parse_time( degree_str );
 
     // printf("Degree = %.4f\n", result);
@@ -481,9 +387,9 @@ fgOPTIONS::parse_degree( const string& degree_str) {
 }
 
 
-// parse time offset command line option
-int
-fgOPTIONS::parse_time_offset( const string& time_str) {
+// parse time offset string into seconds
+static int
+parse_time_offset( const string& time_str) {
     int result;
 
     // printf("time offset = %s\n", time_str);
@@ -500,57 +406,19 @@ fgOPTIONS::parse_time_offset( const string& time_str) {
 }
 
 
-// Parse --tile-diameter=n type option 
-
-int
-fgOPTIONS::parse_tile_radius( const string& arg ) {
-    int radius = atoi( arg );
-
-    if ( radius < FG_RADIUS_MIN ) { radius = FG_RADIUS_MIN; }
-    if ( radius > FG_RADIUS_MAX ) { radius = FG_RADIUS_MAX; }
-
-    // printf("parse_tile_radius(): radius = %d\n", radius);
-
-    return(radius);
-}
-
-
-// Parse --fdm=abcdefg type option 
-int
-fgOPTIONS::parse_fdm( const string& fm ) {
-    // cout << "fdm = " << fm << endl;
-
-    if ( fm == "balloon" ) {
-       return FGInterface::FG_BALLOONSIM;
-    } else if ( fm == "external" ) {
-       return FGInterface::FG_EXTERNAL;
-    } else if ( fm == "jsb" ) {
-       return FGInterface::FG_JSBSIM;
-    } else if ( (fm == "larcsim") || (fm == "LaRCsim") ) {
-       return FGInterface::FG_LARCSIM;
-    } else if ( fm == "magic" ) {
-       return FGInterface::FG_MAGICCARPET;
-    } else {
-       FG_LOG( FG_GENERAL, FG_ALERT, "Unknown fdm = " << fm );
-       exit(-1);
-    }
-
-    // we'll never get here, but it makes the compiler happy.
-    return -1;
-}
-
-
 // Parse --fov=x.xx type option 
-double
-fgOPTIONS::parse_fov( const string& arg ) {
+static double
+parse_fov( const string& arg ) {
     double fov = atof(arg);
 
     if ( fov < FG_FOV_MIN ) { fov = FG_FOV_MIN; }
     if ( fov > FG_FOV_MAX ) { fov = FG_FOV_MAX; }
 
+    fgSetDouble("/sim/field-of-view", fov);
+
     // printf("parse_fov(): result = %.4f\n", fov);
 
-    return(fov);
+    return fov;
 }
 
 
@@ -579,183 +447,271 @@ fgOPTIONS::parse_fov( const string& arg ) {
 // 
 //  filename = file system file name
 
-bool 
-fgOPTIONS::parse_channel( const string& type, const string& channel_str ) {
+static bool 
+parse_channel( const string& type, const string& channel_str ) {
     // cout << "Channel string = " << channel_str << endl;
 
-    channel_options_list.push_back( type + "," + channel_str );
+    globals->get_channel_options_list()->push_back( type + "," + channel_str );
+
+    return true;
+}
+
+
+// Parse --wp=ID[@alt]
+static bool 
+parse_wp( const string& arg ) {
+    string id, alt_str;
+    double alt = 0.0;
+
+    int pos = arg.find( "@" );
+    if ( pos != string::npos ) {
+       id = arg.substr( 0, pos );
+       alt_str = arg.substr( pos + 1 );
+       // cout << "id str = " << id << "  alt str = " << alt_str << endl;
+       alt = atof( alt_str.c_str() );
+       if ( fgGetString("/sim/startup/units") == "feet" ) {
+           alt *= SG_FEET_TO_METER;
+       }
+    } else {
+       id = arg;
+    }
+
+    FGAirport a;
+    if ( fgFindAirportID( id, &a ) ) {
+       SGWayPoint wp( a.longitude, a.latitude, alt, SGWayPoint::WGS84, id );
+       globals->get_route()->add_waypoint( wp );
+
+       return true;
+    } else {
+       return false;
+    }
+}
+
+
+// Parse --flight-plan=[file]
+static bool 
+parse_flightplan(const string& arg)
+{
+    fg_gzifstream infile(arg.c_str());
+    if ( !infile.is_open() ) {
+       return false;
+    }
+    while ( true ) {
+       string line;
+#ifdef GETLINE_NEEDS_TERMINATOR
+       getline( infile, line, '\n' );
+#elif defined( macintosh )
+       getline( infile, line, '\r' );
+#else
+       getline( infile, line );
+#endif
+       if ( infile.eof() ) {
+           break;
+       }
+       parse_wp(line);
+    }
 
     return true;
 }
 
 
 // Parse a single option
-int fgOPTIONS::parse_option( const string& arg ) {
+static int 
+parse_option (const string& arg) 
+{
     // General Options
     if ( (arg == "--help") || (arg == "-h") ) {
        // help/usage request
        return(FG_OPTIONS_HELP);
     } else if ( arg == "--disable-game-mode") {
-       game_mode = false;
+       fgSetBool("/sim/startup/game-mode", false);
     } else if ( arg == "--enable-game-mode" ) {
-       game_mode = true;
+       fgSetBool("/sim/startup/game-mode", true);
     } else if ( arg == "--disable-splash-screen" ) {
-       splash_screen = false;
+       fgSetBool("/sim/startup/splash-screen", false); 
     } else if ( arg == "--enable-splash-screen" ) {
-       splash_screen = true;
+        fgSetBool("/sim/startup/splash-screen", true);
     } else if ( arg == "--disable-intro-music" ) {
-       intro_music = false;
+       fgSetBool("/sim/startup/intro-music", false);
     } else if ( arg == "--enable-intro-music" ) {
-       intro_music = true;
+       fgSetBool("/sim/startup/intro-music", true);
     } else if ( arg == "--disable-mouse-pointer" ) {
-       mouse_pointer = 1;
+       fgSetString("/sim/startup/mouse-pointer", "disabled");
     } else if ( arg == "--enable-mouse-pointer" ) {
-       mouse_pointer = 2;
+       fgSetString("/sim/startup/mouse-pointer", "enabled");
     } else if ( arg == "--disable-freeze" ) {
-       globals->set_freeze( false );
+        globals->set_freeze(false);
     } else if ( arg == "--enable-freeze" ) {
-       globals->set_freeze( true );
+        globals->set_freeze(true);
     } else if ( arg == "--disable-anti-alias-hud" ) {
-       anti_alias_hud = false; 
+       fgSetBool("/sim/hud/antialiased", false);
     } else if ( arg == "--enable-anti-alias-hud" ) {
-       anti_alias_hud = true;  
-    } else if ( arg.find( "--control=") != string::npos ) {
-       parse_control( arg.substr(10) );
+        fgSetBool("/sim/hud/antialiased", true);
+    } else if ( arg.find( "--control=") == 0 ) {
+        fgSetString("/sim/control-mode", arg.substr(10));
     } else if ( arg == "--disable-auto-coordination" ) {
-       auto_coordination = FG_AUTO_COORD_DISABLED;     
+        fgSetBool("/sim/auto-coordination", false);
     } else if ( arg == "--enable-auto-coordination" ) {
-       auto_coordination = FG_AUTO_COORD_ENABLED;      
+       fgSetBool("/sim/auto-coordination", true);
     } else if ( arg == "--disable-hud" ) {
-       hud_status = false;     
+       fgSetBool("/sim/hud/visibility", false);
     } else if ( arg == "--enable-hud" ) {
-       hud_status = true;      
+       fgSetBool("/sim/hud/visibility", true);
     } else if ( arg == "--disable-panel" ) {
-       panel_status = false;
-       if ( current_panel != NULL )
-         current_panel->setVisibility(false);
+       fgSetBool("/sim/panel/visibility", false);
     } else if ( arg == "--enable-panel" ) {
-       panel_status = true;
-       if ( current_panel != NULL )
-           current_panel->setVisibility(true);
-       // fov *= 0.4232; /* NO!!! */
+       fgSetBool("/sim/panel/visibility", true);
     } else if ( arg == "--disable-sound" ) {
-       sound = false;
+       fgSetBool("/sim/sound", false);
     } else if ( arg == "--enable-sound" ) {
-       sound = true;
-    } else if ( arg.find( "--airport-id=") != string::npos ) {
-       airport_id = arg.substr( 13 );
-    } else if ( arg.find( "--lon=" ) != string::npos ) {
-       lon = parse_degree( arg.substr(6) );
-    } else if ( arg.find( "--lat=" ) != string::npos ) {
-       lat = parse_degree( arg.substr(6) );
-    } else if ( arg.find( "--altitude=" ) != string::npos ) {
-       if ( units == FG_UNITS_FEET ) {
-           altitude = atof( arg.substr(11) ) * FEET_TO_METER;
-       } else {
-           altitude = atof( arg.substr(11) );
-       }
-    } else if ( arg.find( "--uBody=" ) != string::npos ) {
-       vkcas=mach=-1;
-       if ( units == FG_UNITS_FEET ) {
-           uBody = atof( arg.substr(8) );
-       } else {
-           uBody = atof( arg.substr(8) ) * FEET_TO_METER;
-       }
-    } else if ( arg.find( "--vBody=" ) != string::npos ) {
-       vkcas=mach=-1;
-       if ( units == FG_UNITS_FEET ) {
-           vBody = atof( arg.substr(8) );
-       } else {
-           vBody = atof( arg.substr(8) ) * FEET_TO_METER;
-       }
-    } else if ( arg.find( "--wBody=" ) != string::npos ) {
-       vkcas=mach=-1;
-       if ( units == FG_UNITS_FEET ) {
-           wBody = atof( arg.substr(8) );
-       } else {
-           wBody = atof( arg.substr(8) ) * FEET_TO_METER;
-       }
-    } else if ( arg.find( "--vc=" ) != string::npos) {
-       mach=-1;
-       vkcas=atof( arg.substr(5) );
-       cout << "Got vc: " << vkcas << endl;
-    } else if ( arg.find( "--mach=" ) != string::npos) {
-       vkcas=-1;
-       mach=atof( arg.substr(7) );
-    } else if ( arg.find( "--heading=" ) != string::npos ) {
-       heading = atof( arg.substr(10) );
-    } else if ( arg.find( "--roll=" ) != string::npos ) {
-       roll = atof( arg.substr(7) );
-    } else if ( arg.find( "--pitch=" ) != string::npos ) {
-       pitch = atof( arg.substr(8) );
-    } else if ( arg.find( "--fg-root=" ) != string::npos ) {
-       fg_root = arg.substr( 10 );
-    } else if ( arg.find( "--fg-scenery=" ) != string::npos ) {
-       fg_scenery = arg.substr( 13 );
-    } else if ( arg.find( "--fdm=" ) != string::npos ) {
-       flight_model = parse_fdm( arg.substr(6) );
-    if((flight_model == FGInterface::FG_JSBSIM) && (get_trim_mode() == 0)) {
-       set_trim_mode(1);
-    } else {
-       set_trim_mode(0);
-    }        
-    } else if ( arg.find( "--aircraft=" ) != string::npos ) {
-       aircraft = arg.substr(11);
-    } else if ( arg.find( "--aircraft-dir=" ) != string::npos ) {
-       aircraft_dir =  arg.substr(15); //  (UIUC)
-    } else if ( arg.find( "--model-hz=" ) != string::npos ) {
-       model_hz = atoi( arg.substr(11) );
-    } else if ( arg.find( "--speed=" ) != string::npos ) {
-       speed_up = atoi( arg.substr(8) );
-    } else if ( arg.find( "--notrim") != string::npos) {
-       trim=-1;
+       fgSetBool("/sim/sound", true);
+    } else if ( arg.find( "--airport-id=") == 0 ) {
+                               // NB: changed property name!!!
+       fgSetString("/sim/startup/airport-id", arg.substr(13));
+    } else if ( arg.find( "--offset-distance=") == 0 ) {
+       fgSetDouble("/sim/startup/offset-distance", atof(arg.substr(18)));
+    } else if ( arg.find( "--offset-azimuth=") == 0 ) {
+       fgSetDouble("/sim/startup/offset-azimuth", atof(arg.substr(17))); 
+    } else if ( arg.find( "--lon=" ) == 0 ) {
+       fgSetDouble("/position/longitude",
+                             parse_degree(arg.substr(6)));
+       fgSetString("/sim/startup/airport-id", "");
+    } else if ( arg.find( "--lat=" ) == 0 ) {
+       fgSetDouble("/position/latitude",
+                             parse_degree(arg.substr(6)));
+       fgSetString("/sim/startup/airport-id", "");
+    } else if ( arg.find( "--altitude=" ) == 0 ) {
+       fgSetBool("/sim/startup/onground", false);
+       if ( fgGetString("/sim/startup/units") == "feet" )
+           fgSetDouble("/position/altitude", atof(arg.substr(11)));
+       else
+           fgSetDouble("/position/altitude",
+                       atof(arg.substr(11)) * SG_METER_TO_FEET);
+    } else if ( arg.find( "--uBody=" ) == 0 ) {
+        fgSetString("/sim/startup/speed-set", "UVW");
+       if ( fgGetString("/sim/startup/units") == "feet" )
+         fgSetDouble("/velocities/uBody", atof(arg.substr(8)));
+       else
+         fgSetDouble("/velocities/uBody",
+                              atof(arg.substr(8)) * SG_METER_TO_FEET);
+    } else if ( arg.find( "--vBody=" ) == 0 ) {
+        fgSetString("/sim/startup/speed-set", "UVW");
+       if ( fgGetString("/sim/startup/units") == "feet" )
+         fgSetDouble("/velocities/vBody", atof(arg.substr(8)));
+       else
+         fgSetDouble("/velocities/vBody",
+                              atof(arg.substr(8)) * SG_METER_TO_FEET);
+    } else if ( arg.find( "--wBody=" ) == 0 ) {
+        fgSetString("/sim/startup/speed-set", "UVW");
+       if ( fgGetString("/sim/startup/units") == "feet" )
+         fgSetDouble("/velocities/wBody", atof(arg.substr(8)));
+       else
+         fgSetDouble("/velocities/wBody",
+                              atof(arg.substr(8)) * SG_METER_TO_FEET);
+    } else if ( arg.find( "--vNorth=" ) == 0 ) {
+        fgSetString("/sim/startup/speed-set", "NED");
+       if ( fgGetString("/sim/startup/units") == "feet" )
+         fgSetDouble("/velocities/speed-north", atof(arg.substr(9)));
+       else
+         fgSetDouble("/velocities/speed-north",
+                              atof(arg.substr(9)) * SG_METER_TO_FEET);
+    } else if ( arg.find( "--vEast=" ) == 0 ) {
+        fgSetString("/sim/startup/speed-set", "NED");
+       if ( fgGetString("/sim/startup/units") == "feet" )
+         fgSetDouble("/velocities/speed-east", atof(arg.substr(8)));
+       else
+         fgSetDouble("/velocities/speed-east",
+                              atof(arg.substr(8)) * SG_METER_TO_FEET);
+    } else if ( arg.find( "--vDown=" ) == 0 ) {
+        fgSetString("/sim/startup/speed-set", "NED");
+       if ( fgGetString("/sim/startup/units") == "feet" )
+         fgSetDouble("/velocities/speed-down", atof(arg.substr(8)));
+       else
+         fgSetDouble("/velocities/speed-down",
+                              atof(arg.substr(8)) * SG_METER_TO_FEET);
+    } else if ( arg.find( "--vc=" ) == 0) {
+        fgSetString("/sim/startup/speed-set", "knots");
+       fgSetDouble("/velocities/airspeed", atof(arg.substr(5)));
+    } else if ( arg.find( "--mach=" ) == 0) {
+        fgSetString("/sim/startup/speed-set", "mach");
+       fgSetDouble("/velocities/mach", atof(arg.substr(7)));
+    } else if ( arg.find( "--heading=" ) == 0 ) {
+       fgSetDouble("/orientation/heading", atof(arg.substr(10)));
+    } else if ( arg.find( "--roll=" ) == 0 ) {
+       fgSetDouble("/orientation/roll", atof(arg.substr(7)));
+    } else if ( arg.find( "--pitch=" ) == 0 ) {
+       fgSetDouble("/orientation/pitch", atof(arg.substr(8)));
+    } else if ( arg.find( "--fg-root=" ) == 0 ) {
+       globals->set_fg_root(arg.substr( 10 ));
+    } else if ( arg.find( "--fg-scenery=" ) == 0 ) {
+        globals->set_fg_scenery(arg.substr( 13 ));
+    } else if ( arg.find( "--fdm=" ) == 0 ) {
+       fgSetString("/sim/flight-model", arg.substr(6));
+    } else if ( arg.find( "--aircraft=" ) == 0 ) {
+       fgSetString("/sim/aircraft", arg.substr(11));
+    } else if ( arg.find( "--aircraft-dir=" ) == 0 ) {
+        fgSetString("/sim/aircraft-dir", arg.substr(15));
+    } else if ( arg.find( "--model-hz=" ) == 0 ) {
+       fgSetInt("/sim/model-hz", atoi(arg.substr(11)));
+    } else if ( arg.find( "--speed=" ) == 0 ) {
+       fgSetInt("/sim/speed-up", atoi(arg.substr(8)));
+    } else if ( arg.find( "--trim") == 0) {
+        fgSetBool("/sim/startup/trim", true);
+    } else if ( arg.find( "--notrim") == 0) {
+        fgSetBool("/sim/startup/trim", false);
+    } else if ( arg.find( "--on-ground") == 0) {
+        fgSetBool("/sim/startup/onground", true);
+    } else if ( arg.find( "--in-air") == 0) {
+        fgSetBool("/sim/startup/onground", false);
     } else if ( arg == "--fog-disable" ) {
-       fog = FG_FOG_DISABLED;  
+       fgSetString("/sim/rendering/fog", "disabled");
     } else if ( arg == "--fog-fastest" ) {
-       fog = FG_FOG_FASTEST;   
+       fgSetString("/sim/rendering/fog", "fastest");
     } else if ( arg == "--fog-nicest" ) {
-       fog = FG_FOG_NICEST;    
+       fgSetString("/sim/fog", "nicest");
     } else if ( arg == "--disable-clouds" ) {
-       clouds = false; 
+        fgSetBool("/environment/clouds/status", false);
     } else if ( arg == "--enable-clouds" ) {
-       clouds = true;  
-    } else if ( arg.find( "--clouds-asl=" ) != string::npos ) {
-       if ( units == FG_UNITS_FEET ) {
-           clouds_asl = atof( arg.substr(13) ) * FEET_TO_METER;
-       } else {
-           clouds_asl = atof( arg.substr(13) );
-       }
-    } else if ( arg.find( "--fov=" ) != string::npos ) {
-       fov = parse_fov( arg.substr(6) );
+        fgSetBool("/environment/clouds/status", true);
+    } else if ( arg.find( "--clouds-asl=" ) == 0 ) {
+                               // FIXME: check units
+        if ( fgGetString("/sim/startup/units") == "feet" )
+         fgSetDouble("/environment/clouds/altitude",
+                               atof(arg.substr(13)) * SG_FEET_TO_METER);
+       else
+         fgSetDouble("/environment/clouds/altitude",
+                               atof(arg.substr(13)));
+    } else if ( arg.find( "--fov=" ) == 0 ) {
+       parse_fov( arg.substr(6) );
     } else if ( arg == "--disable-fullscreen" ) {
-       fullscreen = false;     
+        fgSetBool("/sim/startup/fullscreen", false);
     } else if ( arg== "--enable-fullscreen") {
-       fullscreen = true;      
+        fgSetBool("/sim/startup/fullscreen", true);
     } else if ( arg == "--shading-flat") {
-       shading = 0;    
+       fgSetBool("/sim/rendering/shading", false);
     } else if ( arg == "--shading-smooth") {
-       shading = 1;    
+       fgSetBool("/sim/rendering/shading", true);
     } else if ( arg == "--disable-skyblend") {
-       skyblend = false;       
+       fgSetBool("/sim/rendering/skyblend", false);
     } else if ( arg== "--enable-skyblend" ) {
-       skyblend = true;        
+       fgSetBool("/sim/rendering/skyblend", true);
     } else if ( arg == "--disable-textures" ) {
-       textures = false;       
+        fgSetBool("/sim/rendering/textures", false);
     } else if ( arg == "--enable-textures" ) {
-       textures = true;
+        fgSetBool("/sim/rendering/textures", true);
     } else if ( arg == "--disable-wireframe" ) {
-       wireframe = false;      
+        fgSetBool("/sim/rendering/wireframe", false);
     } else if ( arg == "--enable-wireframe" ) {
-       wireframe = true;
-    } else if ( arg.find( "--geometry=" ) != string::npos ) {
+        fgSetBool("/sim/rendering/wireframe", true);
+    } else if ( arg.find( "--geometry=" ) == 0 ) {
        bool geometry_ok = true;
+       int xsize = 0, ysize = 0;
        string geometry = arg.substr( 11 );
        string::size_type i = geometry.find('x');
 
        if (i != string::npos) {
            xsize = atoi(geometry.substr(0, i));
            ysize = atoi(geometry.substr(i+1));
-           // cout << "Geometry is " << xsize << 'x' << ysize << '\n';
        } else {
            geometry_ok = false;
        }
@@ -770,69 +726,81 @@ int fgOPTIONS::parse_option( const string& arg ) {
            FG_LOG( FG_GENERAL, FG_ALERT, "Unknown geometry: " << geometry );
            FG_LOG( FG_GENERAL, FG_ALERT,
                    "Setting geometry to " << xsize << 'x' << ysize << '\n');
-       }
-    } else if ( arg.find( "--bpp=" ) != string::npos ) {
+       } else {
+         FG_LOG( FG_GENERAL, FG_INFO,
+                 "Setting geometry to " << xsize << 'x' << ysize << '\n');
+         fgSetInt("/sim/startup/xsize", xsize);
+         fgSetInt("/sim/startup/ysize", ysize);
+       }
+    } else if ( arg.find( "--bpp=" ) == 0 ) {
        string bits_per_pix = arg.substr( 6 );
        if ( bits_per_pix == "16" ) {
-           bpp = 16;
+           fgSetInt("/sim/rendering/bits-per-pixel", 16);
        } else if ( bits_per_pix == "24" ) {
-           bpp = 24;
+           fgSetInt("/sim/rendering/bits-per-pixel", 24);
        } else if ( bits_per_pix == "32" ) {
-           bpp = 32;
+           fgSetInt("/sim/rendering/bits-per-pixel", 32);
+       } else {
+         FG_LOG(FG_GENERAL, FG_ALERT, "Unsupported bpp " << bits_per_pix);
        }
     } else if ( arg == "--units-feet" ) {
-       units = FG_UNITS_FEET;  
+       fgSetString("/sim/startup/units", "feet");
     } else if ( arg == "--units-meters" ) {
-       units = FG_UNITS_METERS;        
-    } else if ( arg.find( "--tile-radius=" ) != string::npos ) {
-       tile_radius = parse_tile_radius( arg.substr(14) );
-       tile_diameter = tile_radius * 2 + 1;
-    } else if ( arg.find( "--time-offset" ) != string::npos ) {
-       time_offset = parse_time_offset( (arg.substr(14)) );
-       //time_offset_type = FG_TIME_SYS_OFFSET;
-    } else if ( arg.find( "--time-match-real") != string::npos ) {
-      //time_offset = parse_time_offset(arg.substr(18));
-       time_offset_type = FG_TIME_SYS_OFFSET;
-    } else if ( arg.find( "--time-match-local") != string::npos ) {
-      //time_offset = parse_time_offset(arg.substr(18));
-       time_offset_type = FG_TIME_LAT_OFFSET;
-    } else if ( arg.find( "--start-date-sys=") != string::npos ) {
-        time_offset = parse_date( (arg.substr(17)) );
-       time_offset_type = FG_TIME_SYS_ABSOLUTE;
-    } else if ( arg.find( "--start-date-lat=") != string::npos ) {
-        time_offset = parse_date( (arg.substr(17)) );
-       time_offset_type = FG_TIME_LAT_ABSOLUTE;
-    } else if ( arg.find( "--start-date-gmt=") != string::npos ) {
-        time_offset = parse_date( (arg.substr(17)) );
-       time_offset_type = FG_TIME_GMT_ABSOLUTE;
-
+       fgSetString("/sim/startup/units", "meters");
+    } else if ( arg.find( "--time-offset" ) == 0 ) {
+        fgSetInt("/sim/startup/time-offset",
+                          parse_time_offset( (arg.substr(14)) ));
+    } else if ( arg.find( "--time-match-real") == 0 ) {
+        fgSetString("/sim/startup/time-offset-type",
+                             "system-offset");
+    } else if ( arg.find( "--time-match-local") == 0 ) {
+        fgSetString("/sim/startup/time-offset-type",
+                             "latitude-offset");
+    } else if ( arg.find( "--start-date-sys=") == 0 ) {
+        fgSetInt("/sim/startup/time-offset",
+                          parse_date((arg.substr(17))));
+       fgSetString("/sim/startup/time-offset-type", "system");
+    } else if ( arg.find( "--start-date-lat=") == 0 ) {
+        fgSetInt("/sim/startup/time-offset",
+                          parse_date((arg.substr(17))));
+       fgSetString("/sim/startup/time-offset-type",
+                          "latitude");
+    } else if ( arg.find( "--start-date-gmt=") == 0 ) {
+        fgSetInt("/sim/startup/time-offset",
+                          parse_date((arg.substr(17))));
+       fgSetString("/sim/startup/time-offset-type", "gmt");
     } else if ( arg == "--hud-tris" ) {
-       tris_or_culled = 0;     
+        fgSetString("/sim/hud/frame-stat-type", "tris");
     } else if ( arg == "--hud-culled" ) {
-       tris_or_culled = 1;
-    } else if ( arg.find( "--native=" ) != string::npos ) {
+        fgSetString("/sim/hud/frame-stat-type", "culled");
+    } else if ( arg.find( "--atlas=" ) == 0 ) {
+       parse_channel( "atlas", arg.substr(8) );
+    } else if ( arg.find( "--native=" ) == 0 ) {
        parse_channel( "native", arg.substr(9) );
-    } else if ( arg.find( "--garmin=" ) != string::npos ) {
+    } else if ( arg.find( "--garmin=" ) == 0 ) {
        parse_channel( "garmin", arg.substr(9) );
-    } else if ( arg.find( "--nmea=" ) != string::npos ) {
+    } else if ( arg.find( "--nmea=" ) == 0 ) {
        parse_channel( "nmea", arg.substr(7) );
-    } else if ( arg.find( "--pve=" ) != string::npos ) {
+    } else if ( arg.find( "--props=" ) == 0 ) {
+       parse_channel( "props", arg.substr(8) );
+    } else if ( arg.find( "--pve=" ) == 0 ) {
        parse_channel( "pve", arg.substr(6) );
-    } else if ( arg.find( "--ray=" ) != string::npos ) {
+    } else if ( arg.find( "--ray=" ) == 0 ) {
        parse_channel( "ray", arg.substr(6) );
-    } else if ( arg.find( "--rul=" ) != string::npos ) {
+    } else if ( arg.find( "--rul=" ) == 0 ) {
        parse_channel( "rul", arg.substr(6) );
-    } else if ( arg.find( "--joyclient=" ) != string::npos ) {
+    } else if ( arg.find( "--joyclient=" ) == 0 ) {
        parse_channel( "joyclient", arg.substr(12) );
 #ifdef FG_NETWORK_OLK
     } else if ( arg == "--disable-network-olk" ) {
-       network_olk = false;    
+        fgSetBool("/sim/networking/olk", false);
     } else if ( arg== "--enable-network-olk") {
-       network_olk = true;     
+        fgSetBool("/sim/networking/olk", true);
     } else if ( arg == "--net-hud" ) {
-       net_hud_display = 1;    
-    } else if ( arg.find( "--net-id=") != string::npos ) {
-       net_id = arg.substr( 9 );
+        fgSetBool("/sim/hud/net-display", true);
+       net_hud_display = 1;    // FIXME
+    } else if ( arg.find( "--net-id=") == 0 ) {
+        fgSetString("sim/networking/call-sign", arg.substr(9));
 #endif
     } else if ( arg.find( "--prop:" ) == 0 ) {
         string assign = arg.substr(7);
@@ -843,9 +811,66 @@ int fgOPTIONS::parse_option( const string& arg ) {
        }
        string name = assign.substr(0, pos);
        string value = assign.substr(pos + 1);
-       current_properties.setStringValue(name.c_str(), value);
-       FG_LOG(FG_GENERAL, FG_INFO, "Setting default value of property "
-              << name << " to \"" << value << '"');
+       fgSetString(name.c_str(), value);
+       // FG_LOG(FG_GENERAL, FG_INFO, "Setting default value of property "
+       //        << name << " to \"" << value << '"');
+    // $$$ begin - added VS Renganathan, 14 Oct 2K
+    // for multi-window outside window imagery
+    } else if ( arg.find( "--view-offset=" ) == 0 ) {
+       string woffset = arg.substr( 14 );
+       double default_view_offset = 0.0;
+       if ( woffset == "LEFT" ) {
+              default_view_offset = SGD_PI * 0.25;
+       } else if ( woffset == "RIGHT" ) {
+           default_view_offset = SGD_PI * 1.75;
+       } else if ( woffset == "CENTER" ) {
+           default_view_offset = 0.00;
+       } else {
+           default_view_offset = atof( woffset.c_str() ) * SGD_DEGREES_TO_RADIANS;
+       }
+       FGViewerRPH *pilot_view =
+           (FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
+       pilot_view->set_view_offset( default_view_offset );
+       pilot_view->set_goal_view_offset( default_view_offset );
+       fgSetDouble("/sim/startup/view-offset", default_view_offset);
+    // $$$ end - added VS Renganathan, 14 Oct 2K
+    } else if ( arg.find( "--visibility=" ) == 0 ) {
+       fgSetDouble("/environment/visibility", atof(arg.substr(13)));
+    } else if ( arg.find( "--visibility-miles=" ) == 0 ) {
+        double visibility = atof(arg.substr(19)) * 5280.0 * SG_FEET_TO_METER;
+       fgSetDouble("/environment/visibility", visibility);
+    } else if ( arg.find( "--wind=" ) == 0 ) {
+        string val = arg.substr(7);
+       int pos = val.find('@');
+       if (pos == string::npos) {
+         FG_LOG(FG_GENERAL, FG_ALERT, "bad wind value " << val);
+         return FG_OPTIONS_ERROR;
+       }
+       double dir = atof(val.substr(0,pos).c_str());
+       double speed = atof(val.substr(pos+1).c_str());
+       FG_LOG(FG_GENERAL, FG_INFO, "WIND: " << dir << '@' << 
+              speed << " knots" << endl);
+                               // convert to fps
+       speed *= SG_NM_TO_METER * SG_METER_TO_FEET * (1.0/3600);
+       dir += 180;
+       if (dir >= 360)
+         dir -= 360;
+       dir *= SGD_DEGREES_TO_RADIANS;
+       fgSetDouble("/environment/wind-north",
+                                            speed * cos(dir));
+       fgSetDouble("/environment/wind-east",
+                                            speed * sin(dir));
+    } else if ( arg.find( "--wp=" ) == 0 ) {
+       parse_wp( arg.substr( 5 ) );
+    } else if ( arg.find( "--flight-plan=") == 0) {
+       parse_flightplan ( arg.substr (14) );
+    } else if ( arg.find( "--config=" ) == 0 ) {
+        string file = arg.substr(9);
+        if (!readProperties(file, globals->get_props())) {
+         FG_LOG(FG_IO, FG_ALERT,
+                "--config: failed to read properties from " << file);
+         return FG_OPTIONS_ERROR;
+       }
     } else {
        FG_LOG( FG_GENERAL, FG_ALERT, "Unknown option '" << arg << "'" );
        return FG_OPTIONS_ERROR;
@@ -855,8 +880,72 @@ int fgOPTIONS::parse_option( const string& arg ) {
 }
 
 
+// Scan the command line options for an fg_root definition and set
+// just that.
+string
+fgScanForRoot (int argc, char **argv) 
+{
+    int i = 1;
+
+    FG_LOG(FG_GENERAL, FG_INFO, "Scanning for root: command line");
+
+    while ( i < argc ) {
+       FG_LOG( FG_GENERAL, FG_DEBUG, "argv[" << i << "] = " << argv[i] );
+
+       string arg = argv[i];
+       if ( arg.find( "--fg-root=" ) == 0 ) {
+           return arg.substr( 10 );
+       }
+
+       i++;
+    }
+
+    return "";
+}
+
+
+// Scan the config file for an fg_root definition and set just that.
+string
+fgScanForRoot (const string& path)
+{
+    fg_gzifstream in( path );
+    if ( !in.is_open() )
+      return "";
+
+    FG_LOG( FG_GENERAL, FG_INFO, "Scanning for root: " << path );
+
+    in >> skipcomment;
+#ifndef __MWERKS__
+    while ( ! in.eof() ) {
+#else
+    char c = '\0';
+    while ( in.get(c) && c != '\0' ) {
+       in.putback(c);
+#endif
+       string line;
+
+#ifdef GETLINE_NEEDS_TERMINATOR
+        getline( in, line, '\n' );
+#elif defined( macintosh )
+       getline( in, line, '\r' );
+#else
+        getline( in, line );
+#endif
+
+       if ( line.find( "--fg-root=" ) == 0 ) {
+           return line.substr( 10 );
+       }
+
+       in >> skipcomment;
+    }
+
+    return "";
+}
+
+
 // Parse the command line options
-int fgOPTIONS::parse_command_line( int argc, char **argv ) {
+void
+fgParseOptions (int argc, char **argv) {
     int i = 1;
     int result;
 
@@ -867,21 +956,21 @@ int fgOPTIONS::parse_command_line( int argc, char **argv ) {
 
        result = parse_option(argv[i]);
        if ( (result == FG_OPTIONS_HELP) || (result == FG_OPTIONS_ERROR) ) {
-           return(result);
+           fgUsage();
+           exit(-1);
        }
 
        i++;
     }
-    
-    return(FG_OPTIONS_OK);
 }
 
 
 // Parse config file options
-int fgOPTIONS::parse_config_file( const string& path ) {
+void
+fgParseOptions (const string& path) {
     fg_gzifstream in( path );
     if ( !in.is_open() )
-       return(FG_OPTIONS_ERROR);
+      return;
 
     FG_LOG( FG_GENERAL, FG_INFO, "Processing config file: " << path );
 
@@ -897,7 +986,7 @@ int fgOPTIONS::parse_config_file( const string& path ) {
 
 #ifdef GETLINE_NEEDS_TERMINATOR
         getline( in, line, '\n' );
-#elif defined (MACOS)
+#elif defined( macintosh )
        getline( in, line, '\r' );
 #else
         getline( in, line );
@@ -907,18 +996,19 @@ int fgOPTIONS::parse_config_file( const string& path ) {
            FG_LOG( FG_GENERAL, FG_ALERT, 
                    "Config file parse error: " << path << " '" 
                    << line << "'" );
+           fgUsage();
            exit(-1);
        }
        in >> skipcomment;
     }
-
-    return FG_OPTIONS_OK;
 }
 
 
 // Print usage message
-void fgOPTIONS::usage ( void ) {
-    cout << "Usage: fg [ options ... ]" << endl;
+void 
+fgUsage ()
+{
+    cout << "Usage: fgfs [ options ... ]" << endl;
     cout << endl;
 
     cout << "General Options:" << endl;
@@ -942,6 +1032,8 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--enable-freeze:  start out in a frozen state" << endl;
     cout << "\t--control=mode:  primary control mode " 
         << "(joystick, keyboard, mouse)" << endl;
+    cout << "\t--prop:name=value:  set property <name> to <value>" << endl;
+    cout << "\t--file=path:  load additional properties from path" << endl;
     cout << endl;
 
     cout << "Features:" << endl;
@@ -957,21 +1049,31 @@ void fgOPTIONS::usage ( void ) {
  
     cout << "Flight Model:" << endl;
     cout << "\t--fdm=abcd:  selects the core flight model code." << endl;
-    cout << "\t\tcan be one of jsb, larcsim, magic, or external" << endl;
+    cout << "\t\tcan be one of jsb, larcsim, magic, external, balloon, or ada"
+        << endl;
     cout << "\t--aircraft=abcd:  aircraft model to load" << endl;
     cout << "\t--model-hz=n:  run the FDM this rate (iterations per second)" 
         << endl;
     cout << "\t--speed=n:  run the FDM this much faster than real time" << endl;
     cout << "\t--notrim:  Do NOT attempt to trim the model when initializing JSBsim" << endl;
+    cout << "\t--on-ground:  Start up at ground level (default)" << endl;
+    cout << "\t--in-air:  Start up in air (implied by specifying an initial"
+        << " altitude above ground level." << endl;
+    cout << "\t--wind=DIR@SPEED: specify wind coming from DIR (degrees) at SPEED (knots)" << endl;
     cout << endl;
+
     //(UIUC)
-    cout <<"Aircraft model directory" << endl;
+    cout <<"Aircraft model directory:" << endl;
     cout <<"\t--aircraft-dir=<path> path is relative to the path of the executable" << endl;
     cout << endl;
 
     cout << "Initial Position and Orientation:" << endl;
     cout << "\t--airport-id=ABCD:  specify starting postion by airport id" 
         << endl;
+    cout << "\t--offset-distance:  specify distance to threshhold"
+         << " (NM)" << endl; 
+    cout << "\t--offset-azimuth:  specify heading to threshhold (deg) " 
+         << endl;    
     cout << "\t--lon=degrees:  starting longitude in degrees (west = -)" 
         << endl;
     cout << "\t--lat=degrees:  starting latitude in degrees (south = -)"
@@ -1014,6 +1116,14 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--enable-wireframe:  enable wireframe drawing mode" << endl;
     cout << "\t--geometry=WWWxHHH:  window geometry: 640x480, 800x600, etc."
         << endl;
+    cout << "\t--view-offset=xxx:  set the default forward view direction"
+        << endl;
+    cout << "\t\tas an offset from straight ahead.  Allowable values are"
+        << endl;
+    cout << "\t\tLEFT, RIGHT, CENTER, or a specific number of degrees" << endl;
+    cout << "\t--visibility=xxx:  specify initial visibility in meters" << endl;
+    cout << "\t--visibility-miles=xxx:  specify initial visibility in miles"
+        << endl;
     cout << endl;
 
     cout << "Scenery Options:" << endl;
@@ -1041,7 +1151,7 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--start-date-lat=yyyy:mm:dd:hh:mm:ss: specify a starting" << endl
         << "\t\tdate/time. Uses Local Aircraft Time" << endl;
 #ifdef FG_NETWORK_OLK
-    cout << "" << endl;
+    cout << endl;
 
     cout << "Network Options:" << endl;
     cout << "\t--enable-network-olk:  enable Multipilot mode" << endl;
@@ -1049,9 +1159,12 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--net-hud:  Hud displays network info" << endl;
     cout << "\t--net-id=name:  specify your own callsign" << endl;
 #endif
-}
-
 
-// Destructor
-fgOPTIONS::~fgOPTIONS( void ) {
+    cout << endl;
+    cout << "Route/Way Point Options:" << endl;
+    cout << "\t--wp=ID[@alt]:  specify a waypoint for the GC autopilot" << endl;
+    cout << "\t\tYou can specify multiple waypoints (a route) with multiple"
+        << endl;
+    cout << "\t\tinstances of --wp=" << endl;
+    cout << "\t--flight-plan=[file]: Read all waypoints from [file]" <<endl;
 }