/***************************************************************************
*                           STAR WARS REALITY 1.0                          *
*--------------------------------------------------------------------------*
* Star Wars Reality Code Additions and changes from the Smaug Code         *
* copyright (c) 1997 by Sean Cooper                                        *
* -------------------------------------------------------------------------*
* Starwars and Starwars Names copyright(c) Lucas Film Ltd.                 *
*--------------------------------------------------------------------------*
* SMAUG 1.0 (C) 1994, 1995, 1996 by Derek Snider                           *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,                    *
* Scryn, Rennard, Swordbearer, Gorog, Grishnakh and Tricops                *
* ------------------------------------------------------------------------ *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
* Chastain, Michael Quan, and Mitchell Tse.                                *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.     *
* ------------------------------------------------------------------------ *
*		                Space Module    			   *   
****************************************************************************/
 
#include <math.h> 
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"

extern char * const cargo_names[CARGO_MAX]; 

SHIP_DATA * first_ship;
SHIP_DATA * last_ship;

MISSILE_DATA * first_missile;
MISSILE_DATA * last_missile;

SPACE_DATA * first_starsystem;
SPACE_DATA * last_starsystem;
void fread_modules	args ( ( SHIP_DATA *ship, FILE *fp ) );
void update_ship_modules	args ( ( SHIP_DATA *ship ) );
bool module_type_install	args ( ( OBJ_DATA *obj, SHIP_DATA *ship));
bool check_pilot 	        args ( (CHAR_DATA *ch, SHIP_DATA *ship));
bool evaded                     args ( (SHIP_DATA *ship, SHIP_DATA *target));
CHAR_DATA *pilot_from_ship      args ( (SHIP_DATA *ship));

int bus_pos =0;
int bus_planet =0;
int bus2_planet = 4;
int turbocar_stop =0;
int corus_shuttle =0;
 
/* For docking - Parnic */
#define IS_DOCKED(ship)         ((ship)->docked_ship)

#define MAX_STATION    10
#define MAX_BUS_STOP   14

#define STOP_PLANET     202
#define STOP_SHIPYARD   32015

#define SENATEPAD       10196
#define OUTERPAD        10195

/* Not sure about this function, says to install in ship simulators -Arcturus */
char *ship_bit_name( int vector )
{
    static char buf[512];

    buf[0] = '\0';
	if ( vector & SHIPFLAG_SIMULATOR    ) strcat( buf, " simulator" );
    return ( buf[0] != '\0' ) ? buf+1 : "none";
}

/* For setship purposes */
char *  const   ship_flags [] =
{
"cloaked", "overdrive", "afterburner", "sablaser", "sabions", 
"sabengine", "sabturret1",  "sabturret2", "sablauncher", 
"shieldrlaser",  "shieldrengine", "enginerlaser", "enginershield", 
"laserrengine", "laserrshield",  "duallaser", "trilaser", 
"quadlaser", "dualion", "triion",  "quadion", "simulator",  
"dualmissile", "dualtorpedo", "dualrocket", "sabrlauncher", 
"sabtlauncher", "r28", "r29", "r30", "r31","r32"
};

/* For setship purposes-Arcturus */
int get_shipflag( char *flag )
{
    int x;

    for ( x = 0; x < 32; x++ )
      if ( !str_cmp( flag, ship_flags[x] ) )
        return x;
    return -1;
}

/* Remove Extra Bits Like Linked Lasers on launch, endsimulator, blow up, etc. Not Sabotage, Or Simulator Though*/
void rem_extshipflags(SHIP_DATA *ship)
{
                if(IS_SET(ship->flags, SHIPFLAG_CLOAKED))
                   REMOVE_BIT(ship->flags, SHIPFLAG_CLOAKED);
                if(IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_OVERDRIVENODE);
                if(IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_AFTERBURNER);
                if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRLASER);
                if(IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRENGINE);
                if(IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
                   REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERSHIELD);
                if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERLASER);
                if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_LASERRENGINE);
                if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
                   REMOVE_BIT(ship->flags, SHIPFLAG_LASERRSHIELD);
                if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALLASER);
                if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_TRILASER);
                if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_QUADLASER);
                if(IS_SET(ship->flags, SHIPFLAG_DUALION))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALION);
                if(IS_SET(ship->flags, SHIPFLAG_TRIION))
                   REMOVE_BIT(ship->flags, SHIPFLAG_TRIION);
                if(IS_SET(ship->flags, SHIPFLAG_QUADION))
                   REMOVE_BIT(ship->flags, SHIPFLAG_QUADION);
                if(IS_SET(ship->flags, SHIPFLAG_DUALMISSILE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALMISSILE);
                if(IS_SET(ship->flags, SHIPFLAG_DUALTORPEDO))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALTORPEDO);
                if(IS_SET(ship->flags, SHIPFLAG_DUALROCKET))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALROCKET);
}


int     const   station_vnum [MAX_STATION] =
{
    215 , 216 , 217 , 218 , 219 , 220 , 221 ,222 , 223 , 224
};

char *  const   station_name [MAX_STATION] =
{
   "Menari Spaceport" , "Skydome Botanical Gardens" , "Grand Towers" , 
   "Grandis Mon Theater" , "Palace Station" , "Great Galactic Museum" , 
   "College Station" , "Holographic Zoo of Extinct Animals" , 
   "Dometown Station " , "Monument Plaza"  
};

int     const   bus_vnum [MAX_BUS_STOP] =
{
    201 ,  21100 , 2102 , 18201 , 29001 , 26500 , 28038 , 31872 , 1001 , 15600 , 
    28613 , 3060 , 23100 , 28247 /* , 32297 */
};

char *  const   bus_stop [MAX_BUS_STOP+1] =
{
  "Coruscant", "Mon Calamari", "Cloning Facilities", 
  "Ajina", "Adari", "Zumonduland", "Gamorr", "Tatooine" , "Honoghr" ,  
  "Ryloth", "Kashyyyk", "Endor", "Bespin", "Byss",  "Coruscant"  /* last should always be same as first */  
};

/* local routines */
void	fread_ship	args( ( SHIP_DATA *ship, FILE *fp ) );
bool	load_ship_file	args( ( char *shipfile ) );
void	write_ship_list	args( ( void ) );
void    fread_starsystem      args( ( SPACE_DATA *starsystem, FILE *fp ) );
bool    load_starsystem  args( ( char *starsystemfile ) );
void    write_starsystem_list args( ( void ) );
void    resetship args( ( SHIP_DATA *ship ) );
void    landship args( ( SHIP_DATA *ship, char *arg ) );
void    launchship args( ( SHIP_DATA *ship ) );
bool    land_bus args( ( SHIP_DATA *ship, int destination ) );
void    launch_bus args( ( SHIP_DATA *ship ) );
void    echo_to_room_dnr args( ( int ecolor , ROOM_INDEX_DATA *room ,  char *argument ) );
ch_ret drive_ship( CHAR_DATA *ch, SHIP_DATA *ship, EXIT_DATA  *exit , int fall );
bool    autofly(SHIP_DATA *ship);
bool is_facing( SHIP_DATA *ship , SHIP_DATA *target );
void sound_to_ship( SHIP_DATA *ship , char *argument );
void    dockship                        args    ( ( SHIP_DATA *ship ) );
float speedbonus(SHIP_DATA *ship);
/* from comm.c */
bool    write_to_descriptor     args( ( int desc, char *txt, int length ) );

ROOM_INDEX_DATA *generate_exit( ROOM_INDEX_DATA *in_room, EXIT_DATA **pexit );

void echo_to_room_dnr ( int ecolor , ROOM_INDEX_DATA *room ,  char *argument ) 
{
    CHAR_DATA *vic;
    
    if ( room == NULL )
    	return;
    	
    for ( vic = room->first_person; vic; vic = vic->next_in_room )
    {
	set_char_color( ecolor, vic );
	send_to_char( argument, vic );
    }
}


bool  land_bus( SHIP_DATA *ship, int destination )
{
    char buf[MAX_STRING_LENGTH];
    
    if ( !ship_to_room( ship , destination ) )
    {
       return FALSE;
    }     
    echo_to_ship( AT_YELLOW , ship , "You feel a slight thud as the ship sets down on the ground."); 
    ship->location = destination;
    ship->lastdoc = ship->location;
    ship->shipstate = SHIP_DOCKED;
    if (ship->starsystem)
        ship_from_starsystem( ship, ship->starsystem );  
    sprintf( buf, "%s lands on the platform.", ship->name );
    echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
    sprintf( buf , "The hatch on %s opens." , ship->name);  
    echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
    echo_to_room( AT_YELLOW , get_room_index(ship->entrance) , "The hatch opens." );	
    ship->hatchopen = TRUE;
    sound_to_room( get_room_index(ship->entrance) , "!!SOUND(door)" );
    sound_to_room( get_room_index(ship->location) , "!!SOUND(door)" );
    return TRUE;
}

void    launch_bus( SHIP_DATA *ship )
{
      char buf[MAX_STRING_LENGTH];
      
      sound_to_room( get_room_index(ship->entrance) , "!!SOUND(door)" );
       sound_to_room( get_room_index(ship->location) , "!!SOUND(door)" );
      sprintf( buf , "The hatch on %s closes and it begins to launch." , ship->name);  
      echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
      echo_to_room( AT_YELLOW , get_room_index(ship->entrance) , "The hatch slides shut." );	
      ship->hatchopen = FALSE;
      extract_ship( ship );
      echo_to_ship( AT_YELLOW , ship , "The ship begins to launch."); 
      ship->location = 0;
      ship->shipstate = SHIP_READY;
}

void update_traffic( )
{
    SHIP_DATA *shuttle, *senate;
    SHIP_DATA *turbocar;
    char       buf[MAX_STRING_LENGTH];

    shuttle = ship_from_cockpit( ROOM_CORUSCANT_SHUTTLE );
    senate = ship_from_cockpit( ROOM_SENATE_SHUTTLE );
    if ( senate != NULL && shuttle != NULL )
    {
        switch (corus_shuttle)
        {
             default:
                corus_shuttle++;
                break;
             
             case 0: 
                land_bus( shuttle , STOP_PLANET );
                land_bus( senate , SENATEPAD );
                corus_shuttle++;
                echo_to_ship( AT_CYAN , shuttle , "Welcome to Menari Spaceport." ); 
                echo_to_ship( AT_CYAN , senate , "Welcome to The Senate Halls." ); 
                break;
                
             case 4:
                launch_bus( shuttle );
                launch_bus( senate );
                corus_shuttle++;
                break;
                
             case 5:
                land_bus( shuttle , STOP_SHIPYARD );
                land_bus( senate , OUTERPAD );
                echo_to_ship( AT_CYAN , shuttle , "Welcome to Coruscant Shipyard." );
                echo_to_ship( AT_CYAN , senate , "Welcome to The Outer System Landing Area." );
                corus_shuttle++;
                break;
                
             case 9:
                launch_bus( shuttle );
                launch_bus( senate );
                corus_shuttle++;
                break;
                        
        }
        
        if ( corus_shuttle >= 10 )
              corus_shuttle = 0;
    }
    
    turbocar = ship_from_cockpit( ROOM_CORUSCANT_TURBOCAR );
    if ( turbocar != NULL )
    {
      	sprintf( buf , "The turbocar doors close and it speeds out of the station.");  
      	echo_to_room( AT_YELLOW , get_room_index(turbocar->location) , buf );
      	extract_ship( turbocar );
      	turbocar->location = 0;
       	ship_to_room( turbocar , station_vnum[turbocar_stop] );
       	echo_to_ship( AT_YELLOW , turbocar , "The turbocar makes a quick journey to the next station."); 
       	turbocar->location = station_vnum[turbocar_stop];
       	turbocar->lastdoc = turbocar->location;
       	turbocar->shipstate = SHIP_DOCKED;
       	if (turbocar->starsystem)
          ship_from_starsystem( turbocar, turbocar->starsystem );  
    	sprintf( buf, "A turbocar pulls into the platform and the doors slide open.");
    	echo_to_room( AT_YELLOW , get_room_index(turbocar->location) , buf );
    	sprintf( buf, "Welcome to %s." , station_name[turbocar_stop] );
    	echo_to_ship( AT_CYAN , turbocar , buf );
        turbocar->hatchopen = TRUE;
        
        turbocar_stop++;
        if ( turbocar_stop >= MAX_STATION )
           turbocar_stop = 0;
    }
       
}

void update_bus( )
{
    SHIP_DATA *ship;
    SHIP_DATA *ship2;
    SHIP_DATA *target;
    int        destination;
    char       buf[MAX_STRING_LENGTH];
    
    ship = ship_from_cockpit( ROOM_SHUTTLE_BUS );
    ship2 = ship_from_cockpit( ROOM_SHUTTLE_BUS_2 );
    
    if ( ship == NULL && ship2 == NULL )
    	return;
    
    switch (bus_pos)
    {  

       case 0:
            target = ship_from_hanger( bus_vnum[bus_planet] );
            if ( target != NULL && !target->starsystem )
            {
               sprintf( buf,  "An electronic voice says, 'Cannot land at %s ... it seems to have dissapeared.'", bus_stop[bus_planet] );
               echo_to_ship( AT_CYAN , ship , buf );    
               bus_pos = 5;
            }   
            
            target = ship_from_hanger( bus_vnum[bus2_planet] );
            if ( target != NULL && !target->starsystem )
            {
               sprintf( buf,  "An electronic voice says, 'Cannot land at %s ... it seems to have dissapeared.'", bus_stop[bus_planet] );
               echo_to_ship( AT_CYAN , ship2 , buf );    
               bus_pos = 5;
            }   

            bus_pos++;
            break;
       
       case 6:
            launch_bus ( ship );
            launch_bus ( ship2 );
            bus_pos++;
            break; 
       
       case 7:
            echo_to_ship( AT_YELLOW , ship , "The ship lurches slightly as it makes the jump to lightspeed.");
            echo_to_ship( AT_YELLOW , ship2 , "The ship lurches slightly as it makes the jump to lightspeed.");
            bus_pos++;
            break; 
       
       case 9:
            
            echo_to_ship( AT_YELLOW , ship , "The ship lurches slightly as it comes out of hyperspace..");
            echo_to_ship( AT_YELLOW , ship2 , "The ship lurches slightly as it comes out of hyperspace..");
            bus_pos++;
            break; 
       
       case 1:
            destination = bus_vnum[bus_planet];
            if ( !land_bus( ship, destination ) )
            {
               sprintf( buf, "An electronic voice says, 'Oh My, %s seems to have dissapeared.'" , bus_stop[bus_planet] );
               echo_to_ship( AT_CYAN , ship , buf ); 
               echo_to_ship( AT_CYAN , ship , "An electronic voice says, 'I do hope it wasn't a superlaser. Landing aborted.'"); 
            }
            else 
            {
               sprintf( buf,  "An electronic voice says, 'Welcome to %s'" , bus_stop[bus_planet] );
               echo_to_ship( AT_CYAN , ship , buf); 
               echo_to_ship( AT_CYAN , ship , "It continues, 'Please exit through the main ramp. Enjoy your stay.'");             
            }
            destination = bus_vnum[bus2_planet];
            if ( !land_bus( ship2, destination ) )
            {
               sprintf( buf, "An electronic voice says, 'Oh My, %s seems to have dissapeared.'" , bus_stop[bus_planet] );
               echo_to_ship( AT_CYAN , ship2 , buf ); 
               echo_to_ship( AT_CYAN , ship2 , "An electronic voice says, 'I do hope it wasn't a superlaser. Landing aborted.'"); 
            }
            else 
            {
               sprintf( buf,  "An electronic voice says, 'Welcome to %s'" , bus_stop[bus2_planet] );
               echo_to_ship( AT_CYAN , ship2 , buf); 
               echo_to_ship( AT_CYAN , ship2 , "It continues, 'Please exit through the main ramp. Enjoy your stay.'");             
            }
            bus_pos++;
            break;
               
       case 5:
            sprintf( buf, "It continues, 'Next stop, %s'" , bus_stop[bus_planet+1] );
            echo_to_ship( AT_CYAN , ship , "An electronic voice says, 'Preparing for launch.'");
            echo_to_ship( AT_CYAN , ship , buf);
            sprintf( buf, "It continues, 'Next stop, %s'" , bus_stop[bus2_planet+1] );
            echo_to_ship( AT_CYAN , ship2 , "An electronic voice says, 'Preparing for launch.'");
            echo_to_ship( AT_CYAN , ship2 , buf);
            bus_pos++;
            break;
                    
       default:
            bus_pos++;
            break;
    }
    
    if ( bus_pos >= 10 )
    {
       bus_pos = 0;
       bus_planet++;
       bus2_planet++;
    }
    
    if ( bus_planet >= MAX_BUS_STOP )
       bus_planet = 0;
    if ( bus2_planet >= MAX_BUS_STOP )
       bus2_planet = 0;
    
}

void move_ships( )
{
   SHIP_DATA *ship;
   MISSILE_DATA *missile;
   MISSILE_DATA *m_next;
   SHIP_DATA *target;
   float dx, dy, dz, change;
   char buf[MAX_STRING_LENGTH];
   char logbuf[MAX_STRING_LENGTH];
   CHAR_DATA *ch;
   bool ch_found = FALSE;
   
   for ( missile = first_missile; missile; missile = m_next )
   {
           m_next = missile->next;
           
              ship = missile->fired_from;
              target = missile->target;
              
              if ( target->starsystem && target->starsystem == missile->starsystem )
              {
                if ( missile->mx < target->vx ) 
                  missile->mx += UMIN( missile->speed/5 , target->vx - missile->mx );
                else if ( missile->mx > target->vx ) 
                  missile->mx -= UMIN( missile->speed/5 , missile->mx - target->vx );  
                if ( missile->my < target->vy ) 
                  missile->my += UMIN( missile->speed/5 , target->vy - missile->my );
                else if ( missile->my > target->vy ) 
                  missile->my -= UMIN( missile->speed/5 , missile->my - target->vy );  
                if ( missile->mz < target->vz ) 
                  missile->mz += UMIN( missile->speed/5 , target->vz - missile->mz );
                else if ( missile->mz > target->vz ) 
                  missile->mz -= UMIN( missile->speed/5 , missile->mz - target->vz );  
              
                if ( abs(missile->mx) - abs(target->vx) <= 20 && abs(missile->mx) - abs(target->vx) >= -20
                && abs(missile->my) - abs(target->vy) <= 20 && abs(missile->my) - abs(target->vy) >= -20
                && abs(missile->mz) - abs(target->vz) <= 20 && abs(missile->mz) - abs(target->vz) >= -20 )
                {  
                   if ( target->chaff_released <= 0)
                   { 
                    if(!evaded(ship, target))
                    {
                    echo_to_room( AT_YELLOW , get_room_index(ship->gunseat), "Your missile hits its target dead on!" );
                    echo_to_cockpit( AT_BLOOD, target, "The ship is hit by a missile.");
                    echo_to_ship( AT_RED , target , "A loud explosion shakes thee ship violently!" );
                    sprintf( buf, "You see a small explosion as %s is hit by a missile" , target->name );
                    echo_to_system( AT_ORANGE , target , buf , ship );
                    for ( ch = first_char; ch; ch = ch->next )
                      if ( !IS_NPC( ch ) && nifty_is_name( missile->fired_by, ch->name ) )
                      {   
                        ch_found = TRUE; 
                        damage_ship_ch( target , 20+missile->missiletype*20 , 
                           30+missile->missiletype*30 , ch, missile->fired_from );
                      }
                    if ( !ch_found )
                       damage_ship( target , 20+missile->missiletype*20 , 
                           30+missile->missiletype*30, missile->fired_from );   
                    extract_missile( missile );
                   }
                   else
                   {
                    echo_to_room( AT_YELLOW , get_room_index(ship->gunseat), "Your missile overshoots its target and explodes!");
                    echo_to_cockpit( AT_YELLOW, target, "You evade a missile.");
                    extract_missile( missile );
                   }
                 }
                   else
                   {
                    echo_to_room( AT_YELLOW , get_room_index(ship->gunseat), "Your missile explodes harmlessly in a cloud of chaff!" );
                    echo_to_cockpit( AT_YELLOW, target, "A missile explodes in your chaff.");
                    extract_missile( missile );
                   }
                   continue;
                }
                else
                {
                   missile->age++;
                   if (missile->age >= 50)
                   {
                      extract_missile( missile );
                      continue;
                   }
                }
              }
              else
              { 
                extract_missile( missile );
                continue;
              }

   }
   
   for ( ship = first_ship; ship; ship = ship->next )
   {
   
     if ( !ship->starsystem )
        continue;
          
     if ( ship->currspeed > 0 )
        {
          
          change = sqrt( ship->hx*ship->hx + ship->hy*ship->hy + ship->hz*ship->hz ); 
         
           if (change > 0)
           {
             dx = ship->hx/change;     
             dy = ship->hy/change;     
             dz = ship->hz/change;
             ship->vx += (dx * ship->currspeed/5);
             ship->vy += (dy * ship->currspeed/5);
             ship->vz += (dz * ship->currspeed/5);
           }
           
        } 
    /* SABOTAGE BIT BY ARCTURUS */
    if(IS_SET(ship->flags,  SHIPFLAG_SABOTAGEDENGINE))
    {
       echo_to_cockpit( AT_BLUE , ship , "There is a small explosion and then your ship stops moving. It must have been sabotage!\n\r");
       echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!");
       ship->shipstate = SHIP_DISABLED;
       ship->currspeed = 0;
       REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
       return;
    }
        if ( autofly(ship) )
           continue;
        
/*           
          if ( ship->class != SHIP_PLATFORM && !autofly(ship) )
          {
            if ( ship->starsystem->star1 && strcmp(ship->starsystem->star1,"") )
            {
              if (ship->vx >= ship->starsystem->s1x + 1 || ship->vx <= ship->starsystem->s1x - 1 )
                ship->vx -= URANGE(-3,(ship->starsystem->gravitys1)/(ship->vx - ship->starsystem->s1x)/2,3);
              if (ship->vy >= ship->starsystem->s1y + 1 || ship->vy <= ship->starsystem->s1y - 1 )
                ship->vy -= URANGE(-3,(ship->starsystem->gravitys1)/(ship->vy - ship->starsystem->s1y)/2,3);
              if (ship->vz >= ship->starsystem->s1z + 1 || ship->vz <= ship->starsystem->s1z - 1 )
                ship->vz -= URANGE(-3,(ship->starsystem->gravitys1)/(ship->vz - ship->starsystem->s1z)/2,3);
            }
          
            if ( ship->starsystem->star2 && strcmp(ship->starsystem->star2,"") )
            {
              if (ship->vx >= ship->starsystem->s2x + 1 || ship->vx <= ship->starsystem->s2x - 1 )
                ship->vx -= URANGE(-3,(ship->starsystem->gravitys2)/(ship->vx - ship->starsystem->s2x)/2,3);
              if (ship->vy >= ship->starsystem->s2y + 1 || ship->vy <= ship->starsystem->s2y - 1 )
                ship->vy -= URANGE(-3,(ship->starsystem->gravitys2)/(ship->vy - ship->starsystem->s2y)/2,3);
              if (ship->vz >= ship->starsystem->s2z + 1 || ship->vz <= ship->starsystem->s2z - 1 )
                ship->vz -= URANGE(-3,(ship->starsystem->gravitys2)/(ship->vz - ship->starsystem->s2z)/2,3);
            }
          
            if ( ship->starsystem->planet1 && strcmp(ship->starsystem->planet1,"") )
            {
              if (ship->vx >= ship->starsystem->p1x + 1 || ship->vx <= ship->starsystem->p1x - 1 )
                ship->vx -= URANGE(-3,(ship->starsystem->gravityp1)/(ship->vx - ship->starsystem->p1x)/2,3);
              if (ship->vy >= ship->starsystem->p1y + 1 || ship->vy <= ship->starsystem->p1y - 1 )
                ship->vy -= URANGE(-3,(ship->starsystem->gravityp1)/(ship->vy - ship->starsystem->p1y)/2,3);
              if (ship->vz >= ship->starsystem->p1z + 1 || ship->vz <= ship->starsystem->p1z - 1 )
                ship->vz -= URANGE(-3,(ship->starsystem->gravityp1)/(ship->vz - ship->starsystem->p1z)/2,3);
            }
          
            if ( ship->starsystem->planet2 && strcmp(ship->starsystem->planet2,"") )
            {
              if (ship->vx >= ship->starsystem->p2x + 1 || ship->vx <= ship->starsystem->p2x - 1 )
                 ship->vx -= URANGE(-3,(ship->starsystem->gravityp2)/(ship->vx - ship->starsystem->p2x)/2,3);
              if (ship->vy >= ship->starsystem->p2y + 1 || ship->vy <= ship->starsystem->p2y - 1 )
                ship->vy -= URANGE(-3,(ship->starsystem->gravityp2)/(ship->vy - ship->starsystem->p2y)/2,3);
              if (ship->vz >= ship->starsystem->p2z + 1 || ship->vz <= ship->starsystem->p2z - 1 )
                ship->vz -= URANGE(-3,(ship->starsystem->gravityp2)/(ship->vz - ship->starsystem->p2z)/2,3);
            }
          
            if ( ship->starsystem->planet3 && strcmp(ship->starsystem->planet3,"") )
            {
              if (ship->vx >= ship->starsystem->p3x + 1 || ship->vx <= ship->starsystem->p3x - 1 )
                ship->vx -= URANGE(-3,(ship->starsystem->gravityp3)/(ship->vx - ship->starsystem->p3x)/2,3);
              if (ship->vy >= ship->starsystem->p3y + 1 || ship->vy <= ship->starsystem->p3y - 1 )
                ship->vy -= URANGE(-3,(ship->starsystem->gravityp3)/(ship->vy - ship->starsystem->p3y)/2,3);
              if (ship->vz >= ship->starsystem->p3z + 1 || ship->vz <= ship->starsystem->p3z - 1 )
                ship->vz -= URANGE(-3,(ship->starsystem->gravityp3)/(ship->vz - ship->starsystem->p3z)/2,3);
            }
          }

*/          
/*
          for ( target = ship->starsystem->first_ship; target; target = target->next_in_starsystem)
          { 
                if ( target != ship &&
                    abs(ship->vx - target->vx) < 1 &&
                    abs(ship->vy - target->vy) < 1 &&
                    abs(ship->vz - target->vz) < 1 )
                {
                    ship->collision = target->maxhull;
                    target->collision = ship->maxhull;
                }                   
          }
*/
          if ( ship->starsystem->star1 && strcmp(ship->starsystem->star1,"") && 
                     abs(ship->vx - ship->starsystem->s1x) < 10 && 
                     abs(ship->vy - ship->starsystem->s1y) < 10 &&
                     abs(ship->vz - ship->starsystem->s1z) < 10 )
                {
                    echo_to_cockpit( AT_BLOOD+AT_BLINK, ship, "You fly directly into the sun.");
                    sprintf( buf , "%s flys directly into %s!", ship->name, ship->starsystem->star1); 
                    echo_to_system( AT_ORANGE , ship , buf , NULL );
                    sprintf(logbuf, "%s, the ship, was destroyed by a sun!", ship->name );
                    log_string( logbuf );
                    destroy_ship(ship, NULL);
                    continue;
                }              
          if ( ship->starsystem->star2 && strcmp(ship->starsystem->star2,"") && 
               abs(ship->vx - ship->starsystem->s2x) < 10 && 
                     abs(ship->vy - ship->starsystem->s2y) < 10 &&
                     abs(ship->vz - ship->starsystem->s2z) < 10 )
                {
                    echo_to_cockpit( AT_BLOOD+AT_BLINK, ship, "You fly directly into the sun.");
                    sprintf( buf , "%s flys directly into %s!", ship->name, ship->starsystem->star2); 
                    echo_to_system( AT_ORANGE , ship , buf , NULL );
                    sprintf(logbuf, "%s, the ship, was destroyed by a sun!", ship->name );
                    log_string( logbuf );
                    destroy_ship(ship , NULL);
                    continue;
                }            

        if ( ship->currspeed > 0 )
        {       
          if ( ship->starsystem->planet1 && strcmp(ship->starsystem->planet1,"") && 
               abs(ship->vx - ship->starsystem->p1x) < 10 && 
                     abs(ship->vy - ship->starsystem->p1y) < 10 &&
                     abs(ship->vz - ship->starsystem->p1z) < 10 )
                {
                    sprintf( buf , "You begin orbitting %s.", ship->starsystem->planet1); 
                    echo_to_cockpit( AT_YELLOW, ship, buf);
                    sprintf( buf , "%s begins orbiting %s.", ship->name, ship->starsystem->planet1); 
                    echo_to_system( AT_ORANGE , ship , buf , NULL );
                    ship->currspeed = 0;
                    continue;
                }            
          if ( ship->starsystem->planet2 && strcmp(ship->starsystem->planet2,"") && 
               abs(ship->vx - ship->starsystem->p2x) < 10 && 
                     abs(ship->vy - ship->starsystem->p2y) < 10 &&
                     abs(ship->vz - ship->starsystem->p2z) < 10 )
                {
                    sprintf( buf , "You begin orbitting %s.", ship->starsystem->planet2); 
                    echo_to_cockpit( AT_YELLOW, ship, buf);
                    sprintf( buf , "%s begins orbiting %s.", ship->name, ship->starsystem->planet2); 
                    echo_to_system( AT_ORANGE , ship , buf , NULL );
                    ship->currspeed = 0;
                    continue;
                }            
          if ( ship->starsystem->planet3 && strcmp(ship->starsystem->planet3,"") && 
               abs(ship->vx - ship->starsystem->p3x) < 10 && 
                     abs(ship->vy - ship->starsystem->p3y) < 10 &&
                     abs(ship->vz - ship->starsystem->p3z) < 10 )
                {
                    sprintf( buf , "You begin orbitting %s.", ship->starsystem->planet2); 
                    echo_to_cockpit( AT_YELLOW, ship, buf);
                    sprintf( buf , "%s begins orbiting %s.", ship->name, ship->starsystem->planet2); 
                    echo_to_system( AT_ORANGE , ship , buf , NULL );
                    ship->currspeed = 0;
                    continue;
                }            
        }
   }

   for ( ship = first_ship; ship; ship = ship->next )
       if (ship->collision) 
       {
           echo_to_cockpit( AT_WHITE+AT_BLINK , ship,  "You have collided with another ship!" );
           echo_to_ship( AT_RED , ship , "A loud explosion shakes the ship violently!" );   
           damage_ship( ship , ship->collision , ship->collision, ship );
           ship->collision = 0;
       }
}   

void do_refuel( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    if ( ch->gold <= 499 )
    {
      send_to_char( "&RInsufficient funds to refuel ship&w\n\r", ch );
	return;
    }
    if ( ( ship = ship_from_cockpit( ch->in_room->vnum)) )
    {
    if ( ship->target0 || ship->target1 || ship->target2 )
     {
    	 send_to_char("&RNot while the ship is enganged with an enemy!\n\r",ch);
    	 return;
     }
     if ( ship->energy < ship->maxenergy)
     {	
      ship->energy += (( ship->class + 1) * 75 );
 
      send_to_char( "&gYou refuel your ship a little.\n\r", ch );
      send_to_char( "&gFunny of how you got he fuel from that tank behind the storage room. :)\n\r", ch );
      ch->gold -= 500;
}
else
{
return;
}
}
}
void recharge_ships( )
{
   SHIP_DATA *ship;
   char buf[MAX_STRING_LENGTH];
   int bonuscharge; /*For redirection */
   int change; /* For Fuel Consumption, in Overcharging */
   bonuscharge = 0;
   change = 0;
   for ( ship = first_ship; ship; ship = ship->next )
   {                
      /* Old recharge code      
        if (ship->statet0 > 0)
        {
           ship->energy -= ship->statet0;
           ship->statet0 = 0;
        }
     */
        if (ship->statet1 > 0)
        {
           ship->energy -= ship->statet1;
           ship->statet1 = 0;
        }
        if (ship->statet2 > 0)
        {
           ship->energy -= ship->statet2;
           ship->statet2 = 0;
        }
     /* if (ship->ionstate > 0)
        {
           ship->energy -= ship->statet2;
           ship->ionstate = 0;
        }
     */
      /* Replacement for overcharging. */
      bonuscharge = 0;
      change = 0;
      if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
         bonuscharge += ship->lasers / 2;
      if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
         bonuscharge += ship->lasers /2;
      if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
         bonuscharge -= ship->lasers /2;
      if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
         bonuscharge -= ship->lasers /2;
     if(!(ship->statet0 == LASER_DAMAGED))
     { 
        change = ship->statet0;
        ship->statet0 -= (ship->lasers + bonuscharge);
        if(abs(ship->statet0) >= (ship->lasers+bonuscharge))
        {
           if(ship->statet0 < 0)/* Could be. */
             ship->statet0 = (ship->lasers +bonuscharge) * -1;
           else /* Shouldn't be. */
             ship->statet0 = (ship->lasers +bonuscharge);
        }
        if(ship->statet0 <= LASER_DAMAGED)/*Shouldn't happen but could with large craft. */
           ship->statet0 = LASER_DAMAGED + 1; /*Just Over the Mark */
        ship->energy = ship->energy - (abs(ship->statet0) + change);
     }
      bonuscharge = 0;
      change = 0;
      if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
         bonuscharge += ship->ions / 2;
      if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
         bonuscharge += ship->ions /2;
      if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
         bonuscharge -= ship->ions /2;
      if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
         bonuscharge -= ship->ions /2;
     if(!(ship->ionstate == LASER_DAMAGED))
     {
        change = ship->ionstate;
        ship->ionstate -= (ship->ions + bonuscharge);
        if(abs(ship->ionstate) >= (ship->ions+bonuscharge))
        {
           if(ship->ionstate < 0)/*  Probably. */
             ship->ionstate = (ship->ions +bonuscharge) * -1;
           else /* Shouldn't be. */
             ship->ionstate = (ship->ions +bonuscharge);
        }
        if(ship->ionstate <= LASER_DAMAGED) /* Shouldn't happen, but could with larger craft */
           ship->ionstate = LASER_DAMAGED + 1; /* Just over the mark */
        ship->energy = ship->energy - (abs(ship->ionstate) + change);
      }

/* Stock Reload Code 
        if (ship->missilestate == MISSILE_RELOAD_2)
        {
           ship->missilestate = MISSILE_READY;
           if ( ship->missiles > 0 )
               echo_to_room( AT_YELLOW, get_room_index(ship->gunseat), 
               "Missile launcher reloaded.");
        }
        
        if (ship->missilestate == MISSILE_RELOAD )
        {
           ship->missilestate = MISSILE_RELOAD_2;
        }
        
        if (ship->missilestate == MISSILE_FIRED )
           ship->missilestate = MISSILE_RELOAD;
 */
 /* Arcturus New Missile Reload Code */
if(ship->missilestate > MISSILE_READY)
{
   ship->missilestate = MISSILE_READY;/* For Reloading */
      if ( ship->missiles > 0 )
          echo_to_room( AT_YELLOW, get_room_index(ship->gunseat), "Missile launcher reloaded.");
}
if(ship->torpedostate > MISSILE_READY)
{
   ship->torpedostate = MISSILE_READY; /* For Reloading */
      if(ship->torpedos > 0)
          echo_to_room( AT_YELLOW, get_room_index(ship->gunseat), "Torpedo launcher reloaded.");
}
if(ship->rocketstate > MISSILE_READY)
{
   ship->rocketstate = MISSILE_READY; /* For Reloading */
      if ( ship->rockets > 0 )
          echo_to_room( AT_YELLOW, get_room_index(ship->gunseat), "Rocket launcher reloaded.");
}
       if ( autofly(ship) )
       {
          if ( ship->starsystem )
          {
             if (ship->target0 && ship->statet0 != LASER_DAMAGED )
             {
                 int chance = 50;
                 SHIP_DATA * target = ship->target0;
                 int shots;
                 
                for ( shots=0 ; shots <= ship->lasers ; shots++ ) 
                {   
                  if (ship->shipstate != SHIP_HYPERSPACE && ship->energy > 25 
                  && ship->target0->starsystem == ship->starsystem
                  && abs(target->vx - ship->vx) <= 1000 
                  && abs(target->vy - ship->vy) <= 1000
                  && abs(target->vz - ship->vz) <= 1000 
                  && ship->statet0 < ship->lasers 
                  && !IS_SET(target->flags, SHIPFLAG_CLOAKED) )
                  {
                    if ( ship->class > 1 || is_facing ( ship , target ) )
                    {
                       chance = 50;
                       chance += (ship->manuever - target->manuever) / 10;
                       chance += (ship->currspeed - target->currspeed) / 10;
                       chance -= ( abs(target->vx - ship->vx)/120 );
                       chance -= ( abs(target->vy - ship->vy)/120 );
                       chance -= ( abs(target->vz - ship->vz)/120 );
                       chance = URANGE(10, chance, 90);
             
                     if(evaded(ship, target))
                     {
                     sprintf( buf , "Lasers that fire from %s at you are evaded." , ship->name);
                     echo_to_cockpit( AT_ORANGE , target , buf );
                     sprintf( buf, "Laserfire from %s barely misses %s." , ship->name , target->name );
                     echo_to_system( AT_ORANGE , ship , buf , target );
             	     }
                     else if ( number_percent( ) > chance )
             		{	  
           		    sprintf( buf , "%s fires at you but misses." , ship->name);  
             		    echo_to_cockpit( AT_ORANGE , target , buf );
      	                    sprintf( buf, "Laserfire from %s barely misses %s." , ship->name , target->name );
                            echo_to_system( AT_ORANGE , target , buf , NULL );	
             		} 
             		else
             		{
             		    sprintf( buf, "Laserfire from %s hits %s." , ship->name, target->name );
             		    echo_to_system( AT_ORANGE , target , buf , NULL );
                            sprintf( buf , "You are hit by lasers from %s!" , ship->name);  
                            echo_to_cockpit( AT_BLOOD , target , buf );           
                            echo_to_ship( AT_RED , target , "A small explosion vibrates through the ship." );           
                            damage_ship( target , ship->laserdamage/2 , ship->laserdamage, ship );
                        } 
                        ship->statet0++;
                    }
                  }
                }
             }
          }
       }       
   }
}
                     



void update_space( )
{
   SHIP_DATA *ship;
   SHIP_DATA *target;
   char buf[MAX_STRING_LENGTH];
   int too_close, target_too_close;
   int recharge;
 
   for ( ship = first_ship; ship; ship = ship->next )
   {    
        if (ship->starsystem)
        {
          if ( ship->energy > 0 )
          {
             ship->energy += ( 5 + ship->class*5 );
             if(IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
             {
                ship->energy -= (5 + ship->class*5);
             }
             if(IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
             {
                ship->energy -= (5 + ship->class*5)*2;
             }
             if(IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
                ship->energy -= (5 + ship->class*5)*3;
          }
          else 
             destroy_ship(ship , NULL);
        }
        if(IS_DOCKED(ship))
        {
           if(!get_ship_here(ship->docked_ship->name, ship->starsystem))
              ship->shipstate2 = SHIP_READY;   
        }
        if ( ship->chaff_released > 0 )
           ship->chaff_released--;
                
        if (ship->shipstate == SHIP_HYPERSPACE)
        {
            ship->hyperdistance -= ship->hyperspeed*2;
            if (ship->hyperdistance <= 0)
            {
            	ship_to_starsystem (ship, ship->currjump);
            	
            	if (ship->starsystem == NULL)
            	{
            	    echo_to_cockpit( AT_RED, ship, "Ship lost in Hyperspace. Make new calculations.");
            	}
            	else
            	{
            	    echo_to_room( AT_YELLOW, get_room_index(ship->pilotseat), "Hyperjump complete.");
            	    echo_to_ship( AT_YELLOW, ship, "The ship lurches slightly as it comes out of hyperspace.");
            	    sprintf( buf ,"%s enters the starsystem at %.0f %.0f %.0f" , ship->name, ship->vx, ship->vy, ship->vz );
            	    echo_to_system( AT_YELLOW, ship, buf , NULL );
            	    ship->shipstate = SHIP_READY;
            	    STRFREE( ship->home );
            	    ship->home = STRALLOC( ship->starsystem->name );
            	    if ( str_cmp("Public",ship->owner) )
                        save_ship(ship);
                    
            	}
            }
            else
            {
               sprintf( buf ,"%d" , ship->hyperdistance );
               echo_to_room_dnr( AT_YELLOW , get_room_index(ship->pilotseat), "Remaining jump distance: " );
               echo_to_room( AT_WHITE , get_room_index(ship->pilotseat),  buf );
               
            }
        }
        
        /* following was originaly to fix ships that lost their pilot 
           in the middle of a manuever and are stuck in a busy state 
           but now used for timed maneuvers such as turning */
    
    	if (ship->shipstate == SHIP_BUSY_3)
           {
              echo_to_room( AT_YELLOW, get_room_index(ship->pilotseat), "Manuever complete.");  
              ship->shipstate = SHIP_READY;
           }
        if (ship->shipstate == SHIP_BUSY_2)
           ship->shipstate = SHIP_BUSY_3;
        if (ship->shipstate == SHIP_BUSY)
           ship->shipstate = SHIP_BUSY_2;

        if (ship->shipstate2 == SHIP_DOCK_2)
           dockship( ship );
        if (ship->shipstate2 == SHIP_DOCK)
           ship->shipstate2 = SHIP_DOCK_2;
        
        if (ship->shipstate == SHIP_LAND_2)
           landship( ship , ship->dest );
        if (ship->shipstate == SHIP_LAND)
           ship->shipstate = SHIP_LAND_2;
        
        if (ship->shipstate == SHIP_LAUNCH_2)
           launchship( ship );
        if (ship->shipstate == SHIP_LAUNCH)
           ship->shipstate = SHIP_LAUNCH_2;
        

        if (ship->sdestnum == 0)
        {
           ship->sdestnum++;
           echo_to_ship(AT_DANGER, ship, "The ship's self-destruct timer reads 3...");
        }
        else if (ship->sdestnum == 1)
        {
           ship->sdestnum++;
           echo_to_ship(AT_DANGER, ship, "The ship's self-destruct timer reads 2...");
        }
        else if (ship->sdestnum == 2)
        {
           ship->sdestnum++;
           echo_to_ship(AT_DANGER, ship, "The ship's self-destruct timer reads 1...");
        }
        else if (ship->sdestnum == 3)
        {
           echo_to_ship(AT_DANGER, ship, "The ship's self-destruct timer reaches 0...");
           ship->sdestnum = -1;
           destroy_ship( ship, NULL );
           continue;
        }
        
        ship->shield = UMAX( 0 , ship->shield-1-ship->class);
                
        if (ship->autorecharge && ship->maxshield > ship->shield && ship->energy > 100)
        {
           recharge  = UMIN( ship->maxshield-ship->shield, 10 + ship->class*10 );           
           recharge  = UMIN( recharge , ship->energy/2 -100 );
           recharge  = UMAX( 1, recharge );
           if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER) || IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
           {
              recharge = (int) recharge * .75;
              recharge = UMAX(1, recharge);
           }
           if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
           {
              recharge = (int) recharge * 1.25;
              recharge = UMAX(1, recharge);
           }
           if(IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
           {
              recharge = (int) recharge * 1.25;
              recharge = UMAX(1, recharge);
           }
           recharge = UMIN(recharge, ship->maxshield); 
           ship->shield += recharge;
           ship->energy -= recharge;        
        }
        
        if (ship->shield > 0)
        {
          if (ship->energy < 200)
          {
          	ship->shield = 0;
          	echo_to_cockpit( AT_RED, ship,"The ships shields fizzle and die.");
                ship->autorecharge = FALSE;
          }
        }        
        
        if ( ship->starsystem && ship->currspeed > 0 )
        {
               sprintf( buf, "%d",
                          ship->currspeed );
               echo_to_room_dnr( AT_BLUE , get_room_index(ship->pilotseat),  "Speed: " );
               echo_to_room_dnr( AT_LBLUE , get_room_index(ship->pilotseat),  buf );
               sprintf( buf, "%.0f %.0f %.0f",
                           ship->vx , ship->vy, ship->vz );
               echo_to_room_dnr( AT_BLUE , get_room_index(ship->pilotseat),  "  Coords: " );
               echo_to_room( AT_LBLUE , get_room_index(ship->pilotseat),  buf );
            if ( ship->pilotseat != ship->coseat )
            {
               sprintf( buf, "%d",
                          ship->currspeed );
               echo_to_room_dnr( AT_BLUE , get_room_index(ship->coseat),  "Speed: " );
               echo_to_room_dnr( AT_LBLUE , get_room_index(ship->coseat),  buf );
               sprintf( buf, "%.0f %.0f %.0f",
                           ship->vx , ship->vy, ship->vz );
               echo_to_room_dnr( AT_BLUE , get_room_index(ship->coseat),  "  Coords: " );
               echo_to_room( AT_LBLUE , get_room_index(ship->coseat),  buf );
            }
        } 

        if ( ship->starsystem )
        {
          too_close = ship->currspeed + 50;
          for ( target = ship->starsystem->first_ship; target; target = target->next_in_starsystem)
          { 
            target_too_close = too_close+target->currspeed;
            if ( target != ship &&
                 abs(ship->vx - target->vx) < target_too_close &&
                 abs(ship->vy - target->vy) < target_too_close &&
                 abs(ship->vz - target->vz) < target_too_close )
            {
                sprintf( buf, "Proximity alert: %s  %.0f %.0f %.0f"
                            , target->name, target->vx, target->vy, target->vz);
                echo_to_room( AT_RED , get_room_index(ship->pilotseat),  buf );    
            }                
          }    
          too_close = ship->currspeed + 100;
          if ( ship->starsystem->star1 &&  strcmp(ship->starsystem->star1,"") && 
               abs(ship->vx - ship->starsystem->s1x) < too_close && 
               abs(ship->vy - ship->starsystem->s1y) < too_close &&
               abs(ship->vz - ship->starsystem->s1z) < too_close )
          {
                sprintf( buf, "Proximity alert: %s  %d %d %d", ship->starsystem->star1,
                         ship->starsystem->s1x, ship->starsystem->s1y, ship->starsystem->s1z);
                echo_to_room( AT_RED , get_room_index(ship->pilotseat),  buf );
          }               
          if ( ship->starsystem->star2 && strcmp(ship->starsystem->star2,"") && 
               abs(ship->vx - ship->starsystem->s2x) < too_close && 
               abs(ship->vy - ship->starsystem->s2y) < too_close &&
               abs(ship->vz - ship->starsystem->s2z) < too_close )
          {
                sprintf( buf, "Proximity alert: %s  %d %d %d", ship->starsystem->star2,
                         ship->starsystem->s2x, ship->starsystem->s2y, ship->starsystem->s2z);
                echo_to_room( AT_RED , get_room_index(ship->pilotseat),  buf );
          }               
          if ( ship->starsystem->planet1 && strcmp(ship->starsystem->planet1,"") && 
               abs(ship->vx - ship->starsystem->p1x) < too_close && 
               abs(ship->vy - ship->starsystem->p1y) < too_close &&
               abs(ship->vz - ship->starsystem->p1z) < too_close )
          {
                sprintf( buf, "Proximity alert: %s  %d %d %d", ship->starsystem->planet1,
                         ship->starsystem->p1x, ship->starsystem->p1y, ship->starsystem->p1z);
                echo_to_room( AT_RED , get_room_index(ship->pilotseat),  buf );
          }               
          if ( ship->starsystem->planet2 && strcmp(ship->starsystem->planet2,"") && 
               abs(ship->vx - ship->starsystem->p2x) < too_close && 
               abs(ship->vy - ship->starsystem->p2y) < too_close &&
               abs(ship->vz - ship->starsystem->p2z) < too_close )
          {
                sprintf( buf, "Proximity alert: %s  %d %d %d", ship->starsystem->planet2,
                         ship->starsystem->p2x, ship->starsystem->p2y, ship->starsystem->p2z);
                echo_to_room( AT_RED , get_room_index(ship->pilotseat),  buf );
          }               
          if ( ship->starsystem->planet3 && strcmp(ship->starsystem->planet3,"") && 
               abs(ship->vx - ship->starsystem->p3x) < too_close && 
               abs(ship->vy - ship->starsystem->p3y) < too_close &&
               abs(ship->vz - ship->starsystem->p3z) < too_close )
          {
                sprintf( buf, "Proximity alert: %s  %d %d %d", ship->starsystem->planet3,
                         ship->starsystem->p3x, ship->starsystem->p3y, ship->starsystem->p3z);
                echo_to_room( AT_RED , get_room_index(ship->pilotseat),  buf );
          }               
        }
       

        if (ship->target0)
        {               
               sprintf( buf, "%s   %.0f %.0f %.0f", ship->target0->name,
                          ship->target0->vx , ship->target0->vy, ship->target0->vz );    
               echo_to_room_dnr( AT_BLUE , get_room_index(ship->gunseat), "Target: " );
               echo_to_room( AT_LBLUE , get_room_index(ship->gunseat),  buf );
               if (ship->starsystem != ship->target0->starsystem)
               		ship->target0 = NULL;
         }
         
        if (ship->target1)
        {
               sprintf( buf, "%s   %.0f %.0f %.0f", ship->target1->name,
                          ship->target1->vx , ship->target1->vy, ship->target1->vz );
               echo_to_room_dnr( AT_BLUE , get_room_index(ship->turret1), "Target: " );
               echo_to_room( AT_LBLUE , get_room_index(ship->turret1),  buf );
               if (ship->starsystem != ship->target1->starsystem)
               		ship->target1 = NULL;
         }
        
        if (ship->target2)
        {
               sprintf( buf, "%s   %.0f %.0f %.0f", ship->target2->name,
                          ship->target2->vx , ship->target2->vy, ship->target2->vz );
               echo_to_room_dnr( AT_BLUE , get_room_index(ship->turret2), "Target: " );
               echo_to_room( AT_LBLUE , get_room_index(ship->turret2),  buf );
               if (ship->starsystem != ship->target2->starsystem)
               		ship->target2 = NULL;
         }
         
   	if (ship->energy < 100 && ship->starsystem )
   	{
   	    echo_to_cockpit( AT_RED , ship,  "Warning: Ship fuel low." );
        }
                    
        ship->energy = URANGE( 0 , ship->energy, ship->maxenergy );
   } 

   for ( ship = first_ship; ship; ship = ship->next )
   {
       
       if (ship->autotrack && ship->target0 && ship->class <= MOBILE_SUIT )    
       {
           target = ship->target0;
           too_close = ship->currspeed + 10; 
           target_too_close = too_close+target->currspeed;
           if ( target != ship && ship->shipstate == SHIP_READY && 
                 abs(ship->vx - target->vx) < target_too_close &&
                 abs(ship->vy - target->vy) < target_too_close &&
                 abs(ship->vz - target->vz) < target_too_close )
           {
              ship->hx = 0-(ship->target0->vx - ship->vx);
              ship->hy = 0-(ship->target0->vy - ship->vy);
              ship->hz = 0-(ship->target0->vz - ship->vz);
              ship->energy -= ship->currspeed/10;
              echo_to_room( AT_RED , get_room_index(ship->pilotseat), "Autotrack: Evading to avoid collision!\n\r" );  
    	      if ( ship->class == FIGHTER_SHIP || ( ship->class == MIDSIZE_SHIP && ship->manuever > 50 ) )
        	ship->shipstate = SHIP_BUSY_3;
              else if ( ship->class == MIDSIZE_SHIP || ( ship->class > MIDSIZE_SHIP && ship->manuever > 50 ) )
        	ship->shipstate = SHIP_BUSY_2;
    	      else
        	ship->shipstate = SHIP_BUSY;     
           }
           else if  ( !is_facing(ship, ship->target0) )
           {
              ship->hx = ship->target0->vx - ship->vx;
              ship->hy = ship->target0->vy - ship->vy;
              ship->hz = ship->target0->vz - ship->vz;
              ship->energy -= ship->currspeed/10;
              echo_to_room( AT_BLUE , get_room_index(ship->pilotseat), "Autotracking target ... setting new course.\n\r" );      
    	      if ( ship->class == FIGHTER_SHIP || ( ship->class == MIDSIZE_SHIP && ship->manuever > 50 ) )
        	ship->shipstate = SHIP_BUSY_3;
              else if ( ship->class == MIDSIZE_SHIP || ( ship->class > MIDSIZE_SHIP && ship->manuever > 50 ) )
        	ship->shipstate = SHIP_BUSY_2;
    	      else
        	ship->shipstate = SHIP_BUSY;     
           }
       }

       if ( autofly(ship) )
       {
          if ( ship->starsystem )
          {
             if (ship->target0)
             {
                 int chance = 50;
             
                 /* auto assist ships */
                  
                 for ( target = ship->starsystem->first_ship; target; target = target->next_in_starsystem)
                 {
                    if ( autofly(target) )
                       if ( !str_cmp ( target->owner , ship->owner ) && target != ship )
                         if ( target->target0 == NULL && ship->target0 != target )
                         {  
                           target->target0 = ship->target0;
                           sprintf( buf , "You are being targetted by %s." , target->name);  
                           echo_to_cockpit( AT_BLOOD , target->target0 , buf );
                           break;
                        }   
                 }
                   
                 target = ship->target0;
                 ship->autotrack = TRUE;
                 if( ship->class != SHIP_PLATFORM )
                      ship->currspeed = ship->realspeed;
                 if ( ship->energy >200  )
                    ship->autorecharge=TRUE;
                    
                 
                 if (ship->shipstate != SHIP_HYPERSPACE && ship->energy > 25 
                 && (((int)(ship->missilestate/3)) < ship->mlaunchers)  && ship->target0->starsystem == ship->starsystem
                 && abs(target->vx - ship->vx) <= 1200 
                 && abs(target->vy - ship->vy) <= 1200
                 && abs(target->vz - ship->vz) <= 1200
                 && ship->missiles > 0 )
                 {
                   if ( ship->class > 1 || is_facing( ship , target ) )
                   {
                       chance += (ship->manuever - target->manuever) / 10;
                       chance += (ship->currspeed - target->currspeed) / 10;
                       chance -= ( abs(target->vx - ship->vx)/250 );
                       chance -= ( abs(target->vy - ship->vy)/250 );
                       chance -= ( abs(target->vz - ship->vz)/250 );
                       chance = URANGE( 10 , chance , 90 );

             		if ( number_percent( ) > chance )
             		{
             		} 
                        else
                        {       
                          new_missile( ship , target , NULL , CONCUSSION_MISSILE );
                          ship->missiles-- ;
             		        sprintf( buf , "Incoming missile from %s." , ship->name);  
             		        echo_to_cockpit( AT_BLOOD , target , buf );
             		        sprintf( buf, "%s fires a missile towards %s." , ship->name, target->name );
             	          echo_to_system( AT_ORANGE , target , buf , NULL );
                          ship->missilestate += 3;
                        }
                   }
                 }
                 if(ship->type == MOB_SHIP || ship->class == SHIP_PLATFORM)
                 {
                    if( ship->missilestate ==  MISSILE_DAMAGED )
                        ship->missilestate =  MISSILE_READY;
                    if( ship->statet0 ==  LASER_DAMAGED )
                        ship->statet0 =  LASER_READY;
                    if( ship->shipstate ==  SHIP_DISABLED )
                        ship->shipstate =  SHIP_READY;
                    if( ship->torpedostate == MISSILE_DAMAGED )
                        ship->torpedostate = MISSILE_READY;
                    if( ship->rocketstate == MISSILE_DAMAGED )
                        ship->rocketstate = MISSILE_READY;
                }             
             }
             else
             {
                 ship->currspeed = 0;
                 
                 if ( !str_cmp( ship->owner , "The Empire" ) )
                   for ( target = first_ship; target; target = target->next )
                     if ( ship->starsystem == target->starsystem )
                        if ( !str_cmp( target->owner , "New Republic" ) )       
                        {  
                          ship->target0 = target; 
                          sprintf( buf , "You are being targetted by %s." , ship->name);  
                          echo_to_cockpit( AT_BLOOD , target , buf );
                          break;
                        }
                if ( !str_cmp( ship->owner , "New Republic" ) )
                   for ( target = first_ship; target; target = target->next )
                     if ( ship->starsystem == target->starsystem )
                        if ( !str_cmp( target->owner , "The Empire" ) )
                        {  
                          sprintf( buf , "You are being targetted by %s." , ship->name);  
                          echo_to_cockpit( AT_BLOOD , target , buf );
                          ship->target0 = target;
                          break;
                        }
               
               if ( !str_cmp( ship->owner , "Pirates" ) )
                   for ( target = first_ship; target; target = target->next )
                     if ( ship->starsystem == target->starsystem )
                     {  
                          sprintf( buf , "You are being targetted by %s." , ship->name);  
                          echo_to_cockpit( AT_BLOOD , target , buf );
                          ship->target0 = target;
                          break;
                     }         
                        
             }
          }   
          else
          {
               if ( number_range(1, 25) == 25 )
               {
          	  ship_to_starsystem(ship, starsystem_from_name(ship->home) );  
          	  ship->vx = number_range( -5000 , 5000 );
          	  ship->vy = number_range( -5000 , 5000 );
          	  ship->vz = number_range( -5000 , 5000 );
                  ship->hx = 1;
                  ship->hy = 1;
                  ship->hz = 1;
               }
          }   
       }
       
       if ( ( ship->class >= FRIGATE_SHIP && ship->class <= SHIP_PLATFORM )  
       && ship->target0 == NULL )
       {
          if( ship->missiles < ship->maxmissiles )
             ship->missiles++;
          if( ship->torpedos < ship->maxtorpedos )
             ship->torpedos++;
          if( ship->rockets < ship->maxrockets )
             ship->rockets++;
       }
   }

}



void write_starsystem_list( )
{
    SPACE_DATA *tstarsystem;
    FILE *fpout;
    char filename[256];
    
    sprintf( filename, "%s%s", SPACE_DIR, SPACE_LIST );
    fpout = fopen( filename, "w" );
    if ( !fpout )
    {
         bug( "FATAL: cannot open starsystem.lst for writing!\n\r", 0 );
         return;
    }
    for ( tstarsystem = first_starsystem; tstarsystem; tstarsystem = tstarsystem->next )
    fprintf( fpout, "%s\n", tstarsystem->filename );
    fprintf( fpout, "$\n" );
    fclose( fpout );
}
                                                                    

/*
 * Get pointer to space structure from starsystem name.
 */
SPACE_DATA *starsystem_from_name( char *name )
{
    SPACE_DATA *starsystem;
    
    for ( starsystem = first_starsystem; starsystem; starsystem = starsystem->next )
       if ( !str_cmp( name, starsystem->name ) )
         return starsystem;
    
    for ( starsystem = first_starsystem; starsystem; starsystem = starsystem->next )
       if ( !str_prefix( name, starsystem->name ) )
         return starsystem;
    
    return NULL;
}

/*
 * Get pointer to space structure from the dock vnun.
 */
SPACE_DATA *starsystem_from_vnum( int vnum )
{
    SPACE_DATA *starsystem;
    SHIP_DATA *ship;
    
    for ( starsystem = first_starsystem; starsystem; starsystem = starsystem->next )
       if ( vnum == starsystem->doc1a || vnum == starsystem->doc2a    || vnum == starsystem->doc3a ||
            vnum == starsystem->doc1b || vnum == starsystem->doc2b    || vnum == starsystem->doc3b ||   
            vnum == starsystem->doc1c || vnum == starsystem->doc2c    || vnum == starsystem->doc3c )
         return starsystem;

    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->hanger )
            return ship->starsystem;
                                
    return NULL;
}


/*
 * Save a starsystem's data to its data file
 */
void save_starsystem( SPACE_DATA *starsystem )
{
    FILE *fp;
    char filename[256];
    char buf[MAX_STRING_LENGTH];

    if ( !starsystem )
    {
	bug( "save_starsystem: null starsystem pointer!", 0 );
	return;
    }
        
    if ( !starsystem->filename || starsystem->filename[0] == '\0' )
    {
	sprintf( buf, "save_starsystem: %s has no filename", starsystem->name );
	bug( buf, 0 );
	return;
    }
 
    sprintf( filename, "%s%s", SPACE_DIR, starsystem->filename );
    
    fclose( fpReserve );
    if ( ( fp = fopen( filename, "w" ) ) == NULL )
    {
    	bug( "save_starsystem: fopen", 0 );
    	perror( filename );
    }
    else
    {
	fprintf( fp, "#SPACE\n" );
	fprintf( fp, "Name         %s~\n",	starsystem->name	);
	fprintf( fp, "Filename     %s~\n",	starsystem->filename	);
	fprintf( fp, "Planet1      %s~\n",	starsystem->planet1	);
	fprintf( fp, "Planet2      %s~\n",	starsystem->planet2	);
	fprintf( fp, "Planet3      %s~\n",	starsystem->planet3	);
	fprintf( fp, "Star1        %s~\n",	starsystem->star1	);
	fprintf( fp, "Star2        %s~\n",	starsystem->star2	);
	fprintf( fp, "Location1a      %s~\n",	starsystem->location1a	);
	fprintf( fp, "Location1b      %s~\n",	starsystem->location1b	);
	fprintf( fp, "Location1c      %s~\n",	starsystem->location1c	);
	fprintf( fp, "Location2a       %s~\n",	starsystem->location2a	);
	fprintf( fp, "Location2b      %s~\n",	starsystem->location2b	);
	fprintf( fp, "Location2c      %s~\n",	starsystem->location2c	);
	fprintf( fp, "Location3a      %s~\n",	starsystem->location3a	);
	fprintf( fp, "Location3b      %s~\n",	starsystem->location3b	);
	fprintf( fp, "Location3c      %s~\n",	starsystem->location3c	);
	fprintf( fp, "Doc1a          %d\n",	starsystem->doc1a	);
	fprintf( fp, "Doc2a          %d\n",      starsystem->doc2a       );
	fprintf( fp, "Doc3a          %d\n",      starsystem->doc3a       );        	
	fprintf( fp, "Doc1b          %d\n", 	 starsystem->doc1b	);
	fprintf( fp, "Doc2b          %d\n",      starsystem->doc2b       );
	fprintf( fp, "Doc3b          %d\n",      starsystem->doc3b       );        	
	fprintf( fp, "Doc1c          %d\n",	 starsystem->doc1c	);
	fprintf( fp, "Doc2c          %d\n",      starsystem->doc2c       );
	fprintf( fp, "Doc3c          %d\n",      starsystem->doc3c       );        	
	fprintf( fp, "P1x          %d\n",       starsystem->p1x         );
	fprintf( fp, "P1y          %d\n",       starsystem->p1y         );
	fprintf( fp, "P1z          %d\n",       starsystem->p1z         );
	fprintf( fp, "P2x          %d\n",       starsystem->p2x         );
	fprintf( fp, "P2y          %d\n",       starsystem->p2y         );
	fprintf( fp, "P2z          %d\n",       starsystem->p2z         );
	fprintf( fp, "P3x          %d\n",       starsystem->p3x         );
	fprintf( fp, "P3y          %d\n",       starsystem->p3y         );
	fprintf( fp, "P3z          %d\n",       starsystem->p3z         );
	fprintf( fp, "S1x          %d\n",       starsystem->s1x         );
	fprintf( fp, "S1y          %d\n",       starsystem->s1y         );
	fprintf( fp, "S1z          %d\n",       starsystem->s1z         );
	fprintf( fp, "S2x          %d\n",       starsystem->s2x         );
	fprintf( fp, "S2y          %d\n",       starsystem->s2y         );
	fprintf( fp, "S2z          %d\n",       starsystem->s2z         );
	fprintf( fp, "Gravitys1     %d\n",       starsystem->gravitys1    );
	fprintf( fp, "Gravitys2     %d\n",       starsystem->gravitys2    );
	fprintf( fp, "Gravityp1     %d\n",       starsystem->gravityp1    );
	fprintf( fp, "Gravityp2     %d\n",       starsystem->gravityp2    );
	fprintf( fp, "Gravityp3     %d\n",       starsystem->gravityp3    );
	fprintf( fp, "Xpos          %d\n",       starsystem->xpos    );
	fprintf( fp, "Ypos          %d\n",       starsystem->ypos    );	
	fprintf( fp, "End\n\n"						);
	fprintf( fp, "#END\n"						);
    }
    fclose( fp );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}


/*
 * Read in actual starsystem data.
 */

#if defined(KEY)
#undef KEY
#endif

#define KEY( literal, field, value ) {					\
				if ( !str_cmp( word, literal ) )	\
				{					\
				    field  = value;			\
				    fMatch = TRUE;			\
				    break;				\
				} }

void fread_starsystem( SPACE_DATA *starsystem, FILE *fp )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    bool fMatch;

 
    for ( ; ; )
    {
	word   = feof( fp ) ? "End" : fread_word( fp );
	fMatch = FALSE;

	switch ( UPPER(word[0]) )
	{
	case '*':
	    fMatch = TRUE;
	    fread_to_eol( fp );
	    break;

        case 'D':
             KEY( "Doc1a",  starsystem->doc1a,          fread_number( fp ) );
             KEY( "Doc2a",  starsystem->doc2a,          fread_number( fp ) );
             KEY( "Doc3a",  starsystem->doc3a,          fread_number( fp ) ); 
             KEY( "Doc1b",  starsystem->doc1b,          fread_number( fp ) );
             KEY( "Doc2b",  starsystem->doc2b,          fread_number( fp ) );
             KEY( "Doc3b",  starsystem->doc3b,          fread_number( fp ) ); 
             KEY( "Doc1c",  starsystem->doc1c,          fread_number( fp ) );
             KEY( "Doc2c",  starsystem->doc2c,          fread_number( fp ) );
             KEY( "Doc3c",  starsystem->doc3c,          fread_number( fp ) ); 
             break;
                                

	case 'E':
	    if ( !str_cmp( word, "End" ) )
	    {
		if (!starsystem->name)
		  starsystem->name		= STRALLOC( "" );
		if (!starsystem->location1a)
		  starsystem->location1a            = STRALLOC( "" );  
		if (!starsystem->location2a)
		  starsystem->location2a            = STRALLOC( "" );
		if (!starsystem->location3a)
		  starsystem->location3a            = STRALLOC( "" );
		if (!starsystem->location1b)
		  starsystem->location1b            = STRALLOC( "" );  
		if (!starsystem->location2b)
		  starsystem->location2b            = STRALLOC( "" );
		if (!starsystem->location3b)
		  starsystem->location3b            = STRALLOC( "" );
		if (!starsystem->location1c)
		  starsystem->location1c            = STRALLOC( "" );  
		if (!starsystem->location2c)
		  starsystem->location2c            = STRALLOC( "" );
		if (!starsystem->location3c)
		  starsystem->location3c            = STRALLOC( "" );
		if (!starsystem->planet1)
		  starsystem->planet1            = STRALLOC( "" );  
		if (!starsystem->planet2)
		  starsystem->planet2            = STRALLOC( "" );
		if (!starsystem->planet3)
		  starsystem->planet3            = STRALLOC( "" );
		if (!starsystem->star1)
		  starsystem->star1            = STRALLOC( "" );  
		if (!starsystem->star2)
		  starsystem->star2            = STRALLOC( "" );
		return;
	    }
	    break;
	    
	case 'F':
	    KEY( "Filename",	starsystem->filename,		fread_string_nohash( fp ) );
	    break;
        
        case 'G':
            KEY( "Gravitys1",  starsystem->gravitys1,     fread_number( fp ) ); 
            KEY( "Gravitys2",  starsystem->gravitys2,     fread_number( fp ) ); 
            KEY( "Gravityp1",  starsystem->gravityp1,     fread_number( fp ) ); 
            KEY( "Gravityp2",  starsystem->gravityp2,     fread_number( fp ) ); 
            KEY( "Gravityp3",  starsystem->gravityp3,     fread_number( fp ) ); 
            break;  
        
        case 'L':
	    KEY( "Location1a",	starsystem->location1a,	fread_string( fp ) );
	    KEY( "Location2a",	starsystem->location2a,	fread_string( fp ) );
	    KEY( "Location3a",	starsystem->location3a,	fread_string( fp ) );
	    KEY( "Location1b",	starsystem->location1b,	fread_string( fp ) );
	    KEY( "Location2b",	starsystem->location2b,	fread_string( fp ) );
	    KEY( "Location3b",	starsystem->location3b,	fread_string( fp ) );
	    KEY( "Location1c",	starsystem->location1c,	fread_string( fp ) );
	    KEY( "Location2c",	starsystem->location2c,	fread_string( fp ) );
	    KEY( "Location3c",	starsystem->location3c,	fread_string( fp ) );
	    break;
  
	case 'N':
	    KEY( "Name",	starsystem->name,		fread_string( fp ) );
	    break;
        
        case 'P':
             KEY( "Planet1",	starsystem->planet1,	fread_string( fp ) );
	     KEY( "Planet2",	starsystem->planet2,	fread_string( fp ) );
	     KEY( "Planet3",	starsystem->planet3,	fread_string( fp ) );
	     KEY( "P1x",  starsystem->p1x,          fread_number( fp ) ); 
             KEY( "P1y",  starsystem->p1y,          fread_number( fp ) ); 
             KEY( "P1z",  starsystem->p1z,          fread_number( fp ) ); 
             KEY( "P2x",  starsystem->p2x,          fread_number( fp ) ); 
             KEY( "P2y",  starsystem->p2y,          fread_number( fp ) );
             KEY( "P2z",  starsystem->p2z,          fread_number( fp ) );
             KEY( "P3x",  starsystem->p3x,          fread_number( fp ) );
             KEY( "P3y",  starsystem->p3y,          fread_number( fp ) );
             KEY( "P3z",  starsystem->p3z,          fread_number( fp ) );
             break;
       	
       	case 'S':
       	     KEY( "Star1",	starsystem->star1,	fread_string( fp ) );
	     KEY( "Star2",	starsystem->star2,	fread_string( fp ) );
	     KEY( "S1x",  starsystem->s1x,          fread_number( fp ) ); 
             KEY( "S1y",  starsystem->s1y,          fread_number( fp ) ); 
             KEY( "S1z",  starsystem->s1z,          fread_number( fp ) ); 
             KEY( "S2x",  starsystem->s2x,          fread_number( fp ) ); 
             KEY( "S2y",  starsystem->s2y,          fread_number( fp ) );
             KEY( "S2z",  starsystem->s2z,          fread_number( fp ) );
            
        case 'X':
            KEY( "Xpos",  starsystem->xpos,     fread_number( fp ) ); 
        
        case 'Y':
            KEY( "Ypos",  starsystem->ypos,     fread_number( fp ) ); 
                 
       	}
	
	if ( !fMatch )
	{
	    sprintf( buf, "Fread_starsystem: no match: %s", word );
	    bug( buf, 0 );
	}
    }
}

/*
 * Load a starsystem file
 */

bool load_starsystem( char *starsystemfile )
{
    char filename[256];
    SPACE_DATA *starsystem;
    FILE *fp;
    bool found;

    CREATE( starsystem, SPACE_DATA, 1 );

    found = FALSE;
    sprintf( filename, "%s%s", SPACE_DIR, starsystemfile );

    if ( ( fp = fopen( filename, "r" ) ) != NULL )
    {

	found = TRUE;
        LINK( starsystem, first_starsystem, last_starsystem, next, prev );
	for ( ; ; )
	{
	    char letter;
	    char *word;

	    letter = fread_letter( fp );
	    if ( letter == '*' )
	    {
		fread_to_eol( fp );
		continue;
	    }

	    if ( letter != '#' )
	    {
		bug( "Load_starsystem_file: # not found.", 0 );
		break;
	    }

	    word = fread_word( fp );
	    if ( !str_cmp( word, "SPACE"	) )
	    {
	    	fread_starsystem( starsystem, fp );
	    	break;
	    }
	    else
	    if ( !str_cmp( word, "END"	) )
	        break;
	    else
	    {
		char buf[MAX_STRING_LENGTH];

		sprintf( buf, "Load_starsystem_file: bad section: %s.", word );
		bug( buf, 0 );
		break;
	    }
	}
	fclose( fp );
    }

    if ( !(found) )
      DISPOSE( starsystem );

    return found;
}

/*
 * Load in all the starsystem files.
 */
void load_space( )
{
    FILE *fpList;
    char *filename;
    char starsystemlist[256];
    char buf[MAX_STRING_LENGTH];
    
    
    first_starsystem	= NULL;
    last_starsystem	= NULL;

    log_string( "Loading space..." );

    sprintf( starsystemlist, "%s%s", SPACE_DIR, SPACE_LIST );
    fclose( fpReserve );
    if ( ( fpList = fopen( starsystemlist, "r" ) ) == NULL )
    {
	perror( starsystemlist );
	exit( 1 );
    }

    for ( ; ; )
    {
	filename = feof( fpList ) ? "$" : fread_word( fpList );
	if ( filename[0] == '$' )
	  break;
	  
       
	if ( !load_starsystem( filename ) )
	{
	  sprintf( buf, "Cannot load starsystem file: %s", filename );
	  bug( buf, 0 );
	}
    }
    fclose( fpList );
    log_string(" Done starsystems " );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}

void do_setstarsystem( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    SPACE_DATA *starsystem;

    if ( IS_NPC( ch ) )
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg2[0] == '\0' || arg1[0] == '\0' )
    {
	send_to_char( "Usage: setstarsystem <starsystem> <field> <values>\n\r", ch );
	send_to_char( "\n\rField being one of:\n\r", ch );
	send_to_char( "name filename xpos ypos,\n\r", ch );
	send_to_char( "star1 s1x s1y s1z gravitys1\n\r", ch );
	send_to_char( "star2 s2x s2y s2z gravitys2\n\r", ch );
	send_to_char( "planet1 p1x p1y p1z gravityp1\n\r", ch );
	send_to_char( "planet2 p2x p2y p2z gravityp2\n\r", ch );
	send_to_char( "planet3 p3x p3y p3z gravityp3\n\r", ch );
	send_to_char( "location1a location1b location1c doc1a doc1b doc1c\n\r", ch );
	send_to_char( "location2a location2b location2c doc2a doc2b doc2c\n\r", ch );
	send_to_char( "location3a location3b location3c doc3a doc3b doc3c\n\r", ch );
	send_to_char( "", ch );
	return;
    }

    starsystem = starsystem_from_name( arg1 );
    if ( !starsystem )
    {
	send_to_char( "No such starsystem.\n\r", ch );
	return;
    }


    if ( !str_cmp( arg2, "doc1a" ) )
    {
	starsystem->doc1a = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "doc1b" ) )
    {
	starsystem->doc1b = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "doc1c" ) )
    {
	starsystem->doc1c = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "doc2a" ) )
    {
	starsystem->doc2a = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "doc2b" ) )
    {
	starsystem->doc2b = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "doc2c" ) )
    {
	starsystem->doc2c = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "doc3a" ) )
    {
	starsystem->doc3a = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "doc3b" ) )
    {
	starsystem->doc3b = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "doc3c" ) )
    {
	starsystem->doc3c = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "s1x" ) )
    {
	starsystem->s1x = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "s1y" ) )
    {
	starsystem->s1y = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "s1z" ) )
    {
	starsystem->s1z = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "s2x" ) )
    {
	starsystem->s2x = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "s2y" ) )
    {
	starsystem->s2y = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "s2z" ) )
    {
	starsystem->s2z = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "p1x" ) )
    {
	starsystem->p1x = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "p1y" ) )
    {
	starsystem->p1y = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "p1z" ) )
    {
	starsystem->p1z = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "p2x" ) )
    {
	starsystem->p2x = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "p2y" ) )
    {
	starsystem->p2y = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "p2z" ) )
    {
	starsystem->p2z = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "p3x" ) )
    {
	starsystem->p3x = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "p3y" ) )
    {
	starsystem->p3y = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "p3z" ) )
    {
	starsystem->p3z = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "xpos" ) )
    {
	starsystem->xpos = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "ypos" ) )
    {
	starsystem->ypos = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "gravitys1" ) )
    {
	starsystem->gravitys1 = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "gravitys2" ) )
    {
	starsystem->gravitys2 = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "gravityp1" ) )
    {
	starsystem->gravityp1 = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "gravityp2" ) )
    {
	starsystem->gravityp2 = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "gravityp3" ) )
    {
	starsystem->gravityp3 = atoi( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }

    if ( !str_cmp( arg2, "name" ) )
    {
	STRFREE( starsystem->name );
	starsystem->name = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "star1" ) )
    {
	STRFREE( starsystem->star1 );
	starsystem->star1 = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "star2" ) )
    {
	STRFREE( starsystem->star2 );
	starsystem->star2 = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "planet1" ) )
    {
	STRFREE( starsystem->planet1 );
	starsystem->planet1 = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "planet2" ) )
    {
	STRFREE( starsystem->planet2 );
	starsystem->planet2 = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "planet3" ) )
    {
	STRFREE( starsystem->planet3 );
	starsystem->planet3 = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "location1a" ) )
    {
	STRFREE( starsystem->location1a );
	starsystem->location1a = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "location1b" ) )
    {
	STRFREE( starsystem->location1b );
	starsystem->location1b = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "location1c" ) )
    {
	STRFREE( starsystem->location1c );
	starsystem->location1c = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "location2a" ) )
    {
	STRFREE( starsystem->location2a  );
	starsystem->location2a = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "location2b" ) )
    {
	STRFREE( starsystem->location2a );
	starsystem->location2b = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "location2c" ) )
    {
	STRFREE( starsystem->location2c );
	starsystem->location2c = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    
    if ( !str_cmp( arg2, "location3a" ) )
    {
	STRFREE( starsystem->location3a );
	starsystem->location3a = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "location3b" ) )
    {
	STRFREE( starsystem->location3b );
	starsystem->location3b = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }
    if ( !str_cmp( arg2, "location3c" ) )
    {
	STRFREE( starsystem->location3c );
	starsystem->location3c = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_starsystem( starsystem );
	return;
    }


    do_setstarsystem( ch, "" );
    return;
}

void showstarsystem( CHAR_DATA *ch , SPACE_DATA *starsystem )
{   
    ch_printf( ch, "Starsystem:%s     Filename: %s    Xpos: %d   Ypos: %d\n\r",
    			starsystem->name,
    			starsystem->filename,
    			starsystem->xpos, starsystem->ypos);
    ch_printf( ch, "Star1: %s   Gravity: %d   Coordinates: %d %d %d\n\r",
    			starsystem->star1, starsystem->gravitys1,
    			starsystem->s1x , starsystem->s1y, starsystem->s1z);
    ch_printf( ch, "Star2: %s   Gravity: %d   Coordinates: %d %d %d\n\r",
    			starsystem->star2, starsystem->gravitys2,
    			starsystem->s2x , starsystem->s2y, starsystem->s2z);
    ch_printf( ch, "Planet1: %s   Gravity: %d   Coordinates: %d %d %d\n\r",
    			starsystem->planet1, starsystem->gravityp1, 
    			starsystem->p1x , starsystem->p1y, starsystem->p1z);
    ch_printf( ch, "     Doc1a: %5d (%s)\n\r",
    			starsystem->doc1a, starsystem->location1a);
    ch_printf( ch, "     Doc1b: %5d (%s)\n\r",
    			starsystem->doc1b, starsystem->location1b);
    ch_printf( ch, "     Doc1c: %5d (%s)\n\r",
    			starsystem->doc1c, starsystem->location1c);
    ch_printf( ch, "Planet2: %s   Gravity: %d   Coordinates: %d %d %d\n\r",
    			starsystem->planet2, starsystem->gravityp2, 
    			starsystem->p2x , starsystem->p2y, starsystem->p2z);
    ch_printf( ch, "     Doc2a: %5d (%s)\n\r",
    			starsystem->doc2a, starsystem->location2a);
    ch_printf( ch, "     Doc2b: %5d (%s)\n\r",
    			starsystem->doc2b, starsystem->location2b);
    ch_printf( ch, "     Doc2c: %5d (%s)\n\r",
    			starsystem->doc2c, starsystem->location2c);
    ch_printf( ch, "Planet3: %s   Gravity: %d   Coordinates: %d %d %d\n\r",
    			starsystem->planet3, starsystem->gravityp3, 
    			starsystem->p3x , starsystem->p3y, starsystem->p3z);
    ch_printf( ch, "     Doc3a: %5d (%s)\n\r",
    			starsystem->doc3a, starsystem->location3a);
    ch_printf( ch, "     Doc3b: %5d (%s)\n\r",
    			starsystem->doc3b, starsystem->location3b);
    ch_printf( ch, "     Doc3c: %5d (%s)\n\r",
    			starsystem->doc3c, starsystem->location3c);
    return;
}

void do_showstarsystem( CHAR_DATA *ch, char *argument )
{
   SPACE_DATA *starsystem;

   starsystem = starsystem_from_name( argument );
   
   if ( starsystem == NULL )
      send_to_char("&RNo such starsystem.\n\r",ch);
   else
      showstarsystem(ch , starsystem);
   
}

void do_makestarsystem( CHAR_DATA *ch, char *argument )
{   
    char arg[MAX_INPUT_LENGTH];
    char filename[256];
    SPACE_DATA *starsystem;

    if ( !argument || argument[0] == '\0' )
    {
	send_to_char( "Usage: makestarsystem <starsystem name>\n\r", ch );
	return;
    }


    CREATE( starsystem, SPACE_DATA, 1 );
    LINK( starsystem, first_starsystem, last_starsystem, next, prev );

    starsystem->name		= STRALLOC( argument );
    
		  starsystem->location1a            = STRALLOC( "" );  
		  starsystem->location2a            = STRALLOC( "" );
		  starsystem->location3a            = STRALLOC( "" );
		  starsystem->location1b            = STRALLOC( "" );  
		  starsystem->location2b            = STRALLOC( "" );
		  starsystem->location3b            = STRALLOC( "" );
		  starsystem->location1c            = STRALLOC( "" );  
		  starsystem->location2c            = STRALLOC( "" );
		  starsystem->location3c            = STRALLOC( "" );
		  starsystem->planet1            = STRALLOC( "" );  
		  starsystem->planet2            = STRALLOC( "" );
		  starsystem->planet3            = STRALLOC( "" );
		  starsystem->star1            = STRALLOC( "" );  
		  starsystem->star2            = STRALLOC( "" );
    
    argument = one_argument( argument, arg );
    sprintf( filename, "%s.system" , strlower(arg) );
    starsystem->filename = str_dup( filename );
    save_starsystem( starsystem );
    write_starsystem_list();
}

void do_starsystems( CHAR_DATA *ch, char *argument )
{
    SPACE_DATA *starsystem;
    int count = 0;

    for ( starsystem = first_starsystem; starsystem; starsystem = starsystem->next )
    {
        set_char_color( AT_NOTE, ch );
        ch_printf( ch, "%s\n\r", starsystem->name );
        count++;
    }

    if ( !count )
    {
        send_to_char( "There are no starsystems currently formed.\n\r", ch );
	return;
    }
}
   
void echo_to_ship( int color , SHIP_DATA *ship , char *argument )
{
     int room;
      
     for ( room = ship->firstroom ; room <= ship->lastroom ;room++ )
     {
         echo_to_room( color , get_room_index(room) , argument );
     }  
     
}

void sound_to_ship( SHIP_DATA *ship , char *argument )
{
     int roomnum;
     ROOM_INDEX_DATA *room;
     CHAR_DATA *vic;
      
     for ( roomnum = ship->firstroom ; roomnum <= ship->lastroom ;roomnum++ )
     {
        room = get_room_index( roomnum );
        if ( room == NULL ) continue;
        
        for ( vic = room->first_person; vic; vic = vic->next_in_room )
        {
	   if ( !IS_NPC(vic) && IS_SET( vic->act, PLR_SOUND ) )
	     send_to_char( argument, vic );
        }
     }  
     
}

void echo_to_cockpit( int color , SHIP_DATA *ship , char *argument )
{
     int room;
      
     for ( room = ship->firstroom ; room <= ship->lastroom ;room++ )
     {
         if ( room == ship->cockpit || room == ship->navseat
         || room == ship->pilotseat || room == ship->coseat
         || room == ship->gunseat || room == ship->engineroom
         || room == ship->turret1 || room == ship->turret2 )
               echo_to_room( color , get_room_index(room) , argument );
     }  
     
}

void echo_to_system( int color , SHIP_DATA *ship , char *argument , SHIP_DATA *ignore )
{
     SHIP_DATA *target;
     
     if (!ship->starsystem)
        return;
      
     for ( target = ship->starsystem->first_ship; target; target = target->next_in_starsystem )
     {
       if (target != ship && target != ignore )  
         echo_to_cockpit( color , target , argument );
     }  
     
}

bool is_facing( SHIP_DATA *ship , SHIP_DATA *target )
{
    	float dy, dx, dz, hx, hy, hz;
        float cosofa;
     	     	
     	hx = ship->hx;
     	hy = ship->hy;
     	hz = ship->hz;
     	     				
     	     					dx = target->vx - ship->vx;
     	     						dy = target->vy - ship->vy;
     	     							dz = target->vz - ship->vz;
     	     							
     	    cosofa = ( hx*dx + hy*dy + hz*dz ) 
     	     		/ ( sqrt(hx*hx+hy*hy+hz*hz) + sqrt(dx*dx+dy*dy+dz*dz) );
     	     								               
     	           	if ( cosofa > 0.75 )
     	                  	             return TRUE;
     	     								               	             
     	     								 return FALSE;
     	}
     	     								               	             	

long int get_ship_value( SHIP_DATA *ship )
{
     long int price;
          
     if (ship->class == FIGHTER_SHIP)
        price = 5000;
     else if (ship->class == MIDSIZE_SHIP)
     	price = 50000; 
     else if (ship->class == FRIGATE_SHIP)
      price = 100000; 
     else if (ship->class == CAPITAL_SHIP) 
        price = 500000;
     else if (ship->class == MOBILE_SUIT)
      price = 500000; 
     else if (ship->class == SUPERCAPITAL_SHIP)
      price = 1000000; 
     else 
        price = 2000;
        
     if ( ship->class <= CAPITAL_SHIP ) 
       price += ( ship->manuever*250*(1+ship->class) );
     
     price += ( ship->tractorbeam * 500 );
     price += ( ship->realspeed * 100 );
     price += ( ship->astro_array * 50 );
     price += ( 25 * ship->maxhull );
     price += ( ship->armor * 5 );
     price += ( ship->maxarmor * 70 );
     price += ( 50 * ship->maxenergy );
     price += ( 500 * ship->maxchaff );
               
     if (ship->maxenergy > 5000 )
          price += ( (ship->maxenergy-5000)*20 ) ;
     
     if (ship->maxenergy > 10000 )
          price += ( (ship->maxenergy-10000)*50 );
     
     if (ship->maxhull > 1000)
        price += ( (ship->maxhull-1000)*10 );
     
     if (ship->maxhull > 10000)
        price += ( (ship->maxhull-10000)*20 );
        
     if (ship->maxshield > 200)
          price += ( (ship->maxshield-200)*50 );
     
     if (ship->maxshield > 1000)
          price += ( (ship->maxshield-1000)*100 );
     
     if (ship->realspeed > 100 )
        price += ( (ship->realspeed-100)*500 ) ;
        
     if (ship->lasers > 5 )
        price += ( (ship->lasers-5)*1000 );

     if (ship->ions)
        price += ( ( (ship->ions) * 2500 ) + 1000 );
      
     if (ship->maxshield)
     	price += ( 1000 + 50 * ship->maxshield);
     
     if (ship->lasers)
     	price += ( 500 + 750 * ship->lasers );
    
     if (ship->maxmissiles)
     	price += ( 1000 + 100 * ship->maxmissiles );
     if (ship->maxrockets)
     	price += ( 2000 + 200 * ship->maxmissiles );
     if (ship->maxtorpedos)
     	price += ( 1500 + 150 * ship->maxmissiles );
     
     if (ship->missiles )
     	price += ( 250 * ship->missiles );
     else if (ship->torpedos )
     	price += ( 500 * ship->torpedos );
     else if (ship->rockets )
        price += ( 1000 * ship->rockets );
         
     if (ship->turret1)
        price += 10000;
        
     if (ship->turret2)
        price += 10000;
     
     if (ship->overdrive == 1)
        price += (1000 * ship->realspeed );

     if (ship->interdict == 1)
        price += ( 2500000 );

     if (ship->hyperspeed)
        price += ( 1000 + ship->hyperspeed * 25 );
     
     if (ship->hanger)
        price += ( ship->class == MIDSIZE_SHIP ? 100000 : 500000 );
 
     price *= 1.5;
     
     return price;
     
}

void write_ship_list( )
{
    SHIP_DATA *tship;
    FILE *fpout;
    char filename[256];
    
    sprintf( filename, "%s%s", SHIP_DIR, SHIP_LIST );
    fpout = fopen( filename, "w" );
    if ( !fpout )
    {
         bug( "FATAL: cannot open ship.lst for writing!\n\r", 0 );
         return;
    }
    for ( tship = first_ship; tship; tship = tship->next )
    fprintf( fpout, "%s\n", tship->filename );
    fprintf( fpout, "$\n" );
    fclose( fpout );
}
                                                                    
SHIP_DATA * ship_in_room( ROOM_INDEX_DATA *room, char *name )
{
    SHIP_DATA *ship;

    if ( !room )
     return NULL;
     
    for ( ship = room->first_ship ; ship ; ship = ship->next_in_room )
     if ( !str_cmp( name, ship->name ) )
         return ship;
    
    for ( ship = room->first_ship ; ship ; ship = ship->next_in_room )
     if ( nifty_is_name_prefix( name, ship->name ) )
         return ship;
    
    return NULL;    
}

/*
 * Get pointer to ship structure from ship name.
 */
SHIP_DATA *get_ship( char *name )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( !str_cmp( name, ship->name ) )
         return ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
	if ( nifty_is_name_prefix( name, ship->name ) )
         return ship;
    
    return NULL;
}

/*
 * Checks if ships in a starsystem and returns poiner if it is.
 */
SHIP_DATA *get_ship_here( char *name , SPACE_DATA *starsystem)
{
    SHIP_DATA *ship;
    
    if ( starsystem == NULL )
         return NULL;
    
    for ( ship = starsystem->first_ship ; ship; ship = ship->next_in_starsystem )
       if ( !str_cmp( name, ship->name ) )
         return ship;
    
    for ( ship = starsystem->first_ship; ship; ship = ship->next_in_starsystem )
       if ( nifty_is_name_prefix( name, ship->name ) )
         return ship;
    
    return NULL;
}


/*
 * Get pointer to ship structure from ship name.
 */
SHIP_DATA *ship_from_pilot( char *name )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( !str_cmp( name, ship->pilot ) )
         return ship;
       if ( !str_cmp( name, ship->copilot ) )
         return ship;
       if ( !str_cmp( name, ship->owner ) )
         return ship;  
    return NULL;
}


/*
 * Get pointer to ship structure from cockpit, turret, or entrance ramp vnum.
 */
 
SHIP_DATA *ship_from_cockpit( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->cockpit || vnum == ship->turret1 || vnum == ship->turret2
       || vnum == ship->pilotseat || vnum == ship->coseat || vnum == ship->navseat
        || vnum == ship->gunseat  || vnum == ship->engineroom )
         return ship;
    return NULL;
}

SHIP_DATA *ship_from_pilotseat( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->pilotseat )
         return ship;
    return NULL;
}

SHIP_DATA *ship_from_coseat( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->coseat )
         return ship;
    return NULL;
}

SHIP_DATA *ship_from_navseat( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->navseat )
         return ship;
    return NULL;
}

SHIP_DATA *ship_from_gunseat( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->gunseat )
         return ship;
    return NULL;
}

SHIP_DATA *ship_from_engine( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
    {   
      if (ship->engineroom)   
      {  
        if ( vnum == ship->engineroom )
          return ship;
      }
      else
      { 
        if ( vnum == ship->cockpit )
          return ship;
      }
    }
    
    return NULL;
}



SHIP_DATA *ship_from_turret( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->gunseat || vnum == ship->turret1 || vnum == ship->turret2 )
         return ship;
    return NULL;
}

SHIP_DATA *ship_from_entrance( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->entrance )
         return ship;
    return NULL;
}

SHIP_DATA *ship_from_hanger( int vnum )
{
    SHIP_DATA *ship;
    
    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->hanger )
         return ship;
    return NULL;
}

void do_quickreset( CHAR_DATA *ch )
{
SHIP_DATA *ship;


for ( ship = first_ship; ship; ship = ship->next )
{
 ship->description = "";
 ship->owner = "";
 ship->pilot = "";
 ship->copilot = "";
}

save_ship(ship);
}

void save_ship( SHIP_DATA *ship )
{
    FILE *fp;
    char filename[256];
    char buf[MAX_STRING_LENGTH];
    int module;

    if ( !ship )
    {
	bug( "save_ship: null ship pointer!", 0 );
	return;
    }
    if(ship->maxmodules < 15) /* Minimum Maxmodules raised */
       ship->maxmodules = 15; 
    if ( !ship->filename || ship->filename[0] == '\0' )
    {
	sprintf( buf, "save_ship: %s has no filename", ship->name );
	bug( buf, 0 );
	return;
    }
     
//added to convert bay to an int for saving;
    if (ship->bayopen == TRUE)
	ship->baystat = 0;
    else
	ship->baystat = 1;

    sprintf( filename, "%s%s", SHIP_DIR, ship->filename );
    
    fclose( fpReserve );
    if ( ( fp = fopen( filename, "w" ) ) == NULL )
    {
    	bug( "save_ship: fopen", 0 );
    	perror( filename );
    }
    else
    {
	fprintf( fp, "#SHIP\n" );
	fprintf( fp, "Name         %s~\n",	ship->name		);
	fprintf( fp, "Filename     %s~\n",	ship->filename		);
        fprintf( fp, "Description  %s~\n",	ship->description	);
	fprintf( fp, "Owner        %s~\n",	ship->owner		);
	fprintf( fp, "Pilot        %s~\n",      ship->pilot             );
	fprintf( fp, "Copilot      %s~\n",      ship->copilot           );
	fprintf( fp, "Class        %d\n",	ship->class		);
	fprintf( fp, "Tractorbeam  %d\n",	ship->tractorbeam	);
	fprintf( fp, "Shipyard     %d\n",	ship->shipyard		);
	fprintf( fp, "Hanger       %d\n",	ship->hanger    	);
	fprintf( fp, "Turret1      %d\n",	ship->turret1		);
	fprintf( fp, "Turret2      %d\n",	ship->turret2		);
	fprintf( fp, "Statet0      %d\n",	ship->statet0		);
	fprintf( fp, "Statet1      %d\n",	ship->statet1		);
	fprintf( fp, "Statet2      %d\n",	ship->statet2		);
	fprintf( fp, "IonState     %d\n",	ship->ionstate		);
	fprintf( fp, "Lasers       %d\n",	ship->lasers    	);
	fprintf( fp, "Ions         %d\n",	ship->ions    	);
	fprintf( fp, "Laserdamage  %d\n",	ship->laserdamage       );
        fprintf( fp, "Armor        %d\n",   ship->armor       );
        fprintf( fp, "Maxarmor     %d\n",   ship->maxarmor       );
        fprintf( fp, "Interdict    %d\n",   ship->interdict       );
        fprintf( fp, "Autocannon   %d\n",   ship->autocannon   );
        fprintf( fp, "Autodamage   %d\n",   ship->autodamage   );
        fprintf( fp, "Autoammo     %d\n",   ship->autoammomax   );
        fprintf( fp, "BayStat      %d\n",   ship->baystat   );
	fprintf( fp, "Missiles     %d\n",	ship->missiles		);
	fprintf( fp, "Maxmissiles  %d\n",	ship->maxmissiles	);
	fprintf( fp, "Rockets      %d\n",	ship->rockets		);
	fprintf( fp, "Maxrockets   %d\n",	ship->maxrockets	);
	fprintf( fp, "Torpedos     %d\n",	ship->torpedos		);
	fprintf( fp, "Maxtorpedos  %d\n",	ship->maxtorpedos	);
	fprintf( fp, "Lastdoc      %d\n",	ship->lastdoc		);
	fprintf( fp, "Firstroom    %d\n",	ship->firstroom		);
	fprintf( fp, "Lastroom     %d\n",	ship->lastroom		);
	fprintf( fp, "Shield       %d\n",	ship->shield		);
	fprintf( fp, "Maxshield    %d\n",	ship->maxshield		);
	fprintf( fp, "Hull         %d\n",	ship->hull		);
	fprintf( fp, "Maxhull      %d\n",	ship->maxhull		);
	fprintf( fp, "Maxenergy    %d\n",	ship->maxenergy		);
	fprintf( fp, "Hyperspeed   %d\n",	ship->hyperspeed	);
	fprintf( fp, "Comm         %d\n",	ship->comm		);
	fprintf( fp, "Chaff        %d\n",	ship->chaff		);
	fprintf( fp, "Maxchaff     %d\n",	ship->maxchaff		);
	fprintf( fp, "Sensor       %d\n",	ship->sensor		);
	fprintf( fp, "Astro_array  %d\n",	ship->astro_array	);
	fprintf( fp, "Realspeed    %d\n",	ship->realspeed		);
	fprintf( fp, "Type         %d\n",	ship->type		);
	fprintf( fp, "Cockpit      %d\n",	ship->cockpit		);
	fprintf( fp, "Coseat       %d\n",	ship->coseat		);
	fprintf( fp, "Pilotseat    %d\n",	ship->pilotseat		);
	fprintf( fp, "Gunseat      %d\n",	ship->gunseat		);
	fprintf( fp, "Navseat      %d\n",	ship->navseat		);
	fprintf( fp, "Engineroom   %d\n",       ship->engineroom        );
	fprintf( fp, "Entrance     %d\n",       ship->entrance          );
	fprintf( fp, "Shipstate    %d\n",	ship->shipstate		);
	fprintf( fp, "Missilestate %d\n",	ship->missilestate	);
	fprintf( fp, "Energy       %d\n",	ship->energy		);
	fprintf( fp, "Manuever     %d\n",       ship->manuever          );
	fprintf( fp, "Home         %s~\n",      ship->home              );
	fprintf( fp, "MaxModules %d\n", ship->maxmodules		);
	fprintf( fp, "MaxCargo     %d\n",       ship->maxcargo          );
        fprintf( fp, "Flags        %d\n",       ship->flags             );
        fprintf( fp, "Mlaunchers   %d\n",       ship->mlaunchers        );
        fprintf( fp, "Tlaunchers   %d\n",       ship->tlaunchers        );
        fprintf( fp, "Rlaunchers   %d\n",       ship->rlaunchers        );
        fprintf( fp, "Cloak        %d\n",       ship->cloak             );
        if (ship->cargo > 0)
	{
	   fprintf( fp, "Cargo     %d\n",       ship->cargo          );
	   fprintf( fp, "CargoType %d\n",       ship->cargotype          );
	}	
	if ( ship->modules > 0 )
	{
		for ( module = 1; module <= ship->modules; module++ )
		{
			fprintf( fp, "Module         %d\n", ship->module_vnum[module] );	
		}
/*                bug("Modules input into ship file.", 0); */
	}
	fprintf( fp, "End\n"						);
    }
    fclose( fp );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}


/*
 * Read in actual ship data.
 */

#if defined(KEY)
#undef KEY
#endif

#define KEY( literal, field, value )					\
				if ( !str_cmp( word, literal ) )	\
				{					\
				    field  = value;			\
				    fMatch = TRUE;			\
				    break;				\
				}

void fread_ship( SHIP_DATA *ship, FILE *fp )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    bool fMatch;
    int dummy_number;
    int modules = 1;
    ship->modules = 0;

    for ( ; ; )
    {
	word   = feof( fp ) ? "End" : fread_word( fp );
	fMatch = FALSE;
        
	switch ( UPPER(word[0]) )
	{
	case '*':
	    fMatch = TRUE;
	    fread_to_eol( fp );
	    break;
        
        case 'A':
             KEY( "Astro_array",      ship->astro_array,       fread_number( fp ) );
             KEY( "Autocannon",      ship->autocannon,       fread_number( fp ) );
             KEY( "Autoammo",      ship->autoammomax,       fread_number( fp ) );
             KEY( "Armor",      ship->armor,       fread_number( fp ) );
             KEY( "Autodamage",      ship->autodamage,       fread_number( fp ) );
             break;

	case 'B':
             KEY( "BayStat",     ship->baystat,          fread_number( fp ) );
		
        
        case 'C':
             KEY( "Cockpit",     ship->cockpit,          fread_number( fp ) );
             KEY( "Cargo",       ship->cargo,      fread_number( fp ) );
             KEY( "CargoType",   ship->cargotype,  fread_number( fp ) );
	     KEY( "Coseat",     ship->coseat,          fread_number( fp ) );
             KEY( "Class",       ship->class,            fread_number( fp ) );
             KEY( "Copilot",     ship->copilot,          fread_string( fp ) );
             KEY( "Comm",        ship->comm,      fread_number( fp ) );
             KEY( "Chaff",       ship->chaff,      fread_number( fp ) );
             KEY( "Cloak",       ship->cloak,      fread_number( fp ) );
             break;
                                

	case 'D':
	    KEY( "Description",	ship->description,	fread_string( fp ) );
	    break;

	case 'E':
	    KEY( "Engineroom",    ship->engineroom,      fread_number( fp ) );
	    KEY( "Entrance",	ship->entrance,	        fread_number( fp ) );
	    KEY( "Energy",      ship->energy,        fread_number( fp ) );
	    if ( !str_cmp( word, "End" ) )
	    {
		if (!ship->home)
		  ship->home		= STRALLOC( "" );
		if (!ship->name)
		  ship->name		= STRALLOC( "" );
		if (!ship->owner)
		  ship->owner		= STRALLOC( "" );
		if (!ship->description)
		  ship->description 	= STRALLOC( "" );
		if (!ship->copilot)
		  ship->copilot 	= STRALLOC( "" );
		if (!ship->pilot)
		  ship->pilot   	= STRALLOC( "" );  
                  ship->shipstate2 = SHIP_READY;
		if (ship->shipstate != SHIP_DISABLED)
		  ship->shipstate = SHIP_DOCKED;
		if (ship->statet0 != LASER_DAMAGED)
		  ship->statet0 = LASER_READY;
		if (ship->statet1 != LASER_DAMAGED)
		  ship->statet1 = LASER_READY;
		if (ship->statet2 != LASER_DAMAGED)
		  ship->statet2 = LASER_READY;
		if (ship->missilestate != MISSILE_DAMAGED)
		  ship->missilestate = MISSILE_READY;
                if (ship->torpedostate != MISSILE_DAMAGED)
                  ship->torpedostate = MISSILE_READY;
                if( ship->rocketstate != MISSILE_DAMAGED)
                  ship->rocketstate = MISSILE_READY;
                if( ship->maxrockets > 0 && !(ship->rlaunchers > 0))
                  ship->rlaunchers = 1;
                if( ship->maxmissiles > 0 && !(ship->mlaunchers > 0))
                  ship->mlaunchers = 1;
                if( ship->maxtorpedos > 0 && !(ship->tlaunchers > 0))
                  ship->tlaunchers = 1;
	        if ( !ship->ionstate )
		  ship->ionstate = LASER_READY;
		if (ship->ionstate != LASER_DAMAGED)
		  ship->ionstate = LASER_READY;
                if ( str_cmp(ship->owner, "Public") && ship->shipyard != ROOM_LIMBO_SHIPYARD)
		    ship->shipyard = ROOM_STARSHIP_GRAVEYARD;
		if (ship->lastdoc <= 0) 
		  ship->lastdoc = ship->shipyard;
		if (!ship->baystat || ship->baystat<1 )
			ship->bayopen = TRUE;
		else
			ship->bayopen = FALSE;
			
		if (!ship->autopilot)
		   ship->autopilot   = FALSE;
                /* Safety Purposes. */
	        if( ship->cloak != 1 )
                   ship->cloak = 0;
		ship->hatchopen = FALSE;
		if (ship->navseat <= 0) 
		  ship->navseat = ship->cockpit;
		if (ship->gunseat <= 0) 
		  ship->gunseat = ship->cockpit;
		if (ship->coseat <= 0) 
		  ship->coseat = ship->cockpit;
		if (ship->pilotseat <= 0) 
		  ship->pilotseat = ship->cockpit;

		ship->sdestnum = -1;
	    if (!ship->armor)
	      ship->armor = 0;
                if (ship->cargotype != CARGO_NONE && ship->cargo < 1)
                   ship->cargotype = CARGO_NONE;
	    if (!ship->maxarmor)
	      ship->maxarmor = 0;
            if (!ship->interdict)
              ship->interdict     = 0;  
            if (!ship->ions)
              ship->ions     = 0;  
		if (!ship->autocannon)
		  ship->autocannon = 0;
		if (!ship->autoammomax)
		  ship->autoammomax = 0;
		if (!ship->autodamage)
		  ship->autodamage = 0;
		
		ship->autoammo = ship->autoammomax;

		if (ship->missiletype == 1)
		{
		  ship->torpedos = ship->missiles;    /* for back compatability */
		  ship->missiles = 0;
		}
		ship->starsystem = NULL;
		ship->energy = ship->maxenergy;
		ship->hull = ship->maxhull;
		ship->in_room=NULL;
                ship->next_in_room=NULL;
                ship->prev_in_room=NULL;
		if (ship->maxmodules == 0) 
		ship->maxmodules = 15;
                if(ship->maxmodules < 15)
                ship->maxmodules = 15;/*max modules changed to 15 minimum. */
                /* Remove Temporary Ship Flags IF set, just about all, except simulators. */
                if(IS_SET(ship->flags, SHIPFLAG_CLOAKED))
                   REMOVE_BIT(ship->flags, SHIPFLAG_CLOAKED);
                if(IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_OVERDRIVENODE);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLASERS))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDLASERS);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDENGINE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET1))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET1);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET2))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET2);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDIONS))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDIONS);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS);
                if(IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_AFTERBURNER);
                if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRLASER);
                if(IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRENGINE);
                if(IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
                   REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERSHIELD);
                if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERLASER);
                if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_LASERRENGINE);
                if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
                   REMOVE_BIT(ship->flags, SHIPFLAG_LASERRSHIELD);
                if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALLASER);
                if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_TRILASER);
                if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
                   REMOVE_BIT(ship->flags, SHIPFLAG_QUADLASER);
                if(IS_SET(ship->flags, SHIPFLAG_DUALION))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALION);
                if(IS_SET(ship->flags, SHIPFLAG_TRIION))
                   REMOVE_BIT(ship->flags, SHIPFLAG_TRIION);
                if(IS_SET(ship->flags, SHIPFLAG_QUADION))
                   REMOVE_BIT(ship->flags, SHIPFLAG_QUADION);
                if(IS_SET(ship->flags, SHIPFLAG_DUALMISSILE))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALMISSILE);
                if(IS_SET(ship->flags, SHIPFLAG_DUALTORPEDO))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALTORPEDO);
                if(IS_SET(ship->flags, SHIPFLAG_DUALROCKET))
                   REMOVE_BIT(ship->flags, SHIPFLAG_DUALROCKET);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS);
                if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS))
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS);
        	return;
	    }
	    break;
	    
	case 'F':
	    KEY( "Filename",	ship->filename,		fread_string_nohash( fp ) );
            KEY( "Firstroom",   ship->firstroom,        fread_number( fp ) );
            KEY( "Flags",       ship->flags,            fread_number( fp ) );
            break;
        
        case 'G':    
            KEY( "Gunseat",     ship->gunseat,          fread_number( fp ) );
            break;
        
        case 'H':
            KEY( "Home" , ship->home, fread_string( fp ) );
            KEY( "Hyperspeed",   ship->hyperspeed,      fread_number( fp ) );
            KEY( "Hull",      ship->hull,        fread_number( fp ) );
            KEY( "Hanger",  ship->hanger,      fread_number( fp ) );
            break;

        case 'I':
            KEY( "Ions" , ship->ions, fread_number( fp ) );
            KEY( "IonState" , ship->ionstate, fread_number( fp ) );
            KEY( "Interdict" , ship->interdict, fread_number( fp ) );
            break;
        
        case 'L':
            KEY( "Laserdamage",   ship->laserdamage,   ( fread_number( fp ) ) );
            KEY( "Lasers",   ship->lasers,      fread_number( fp ) );
            KEY( "Lastdoc",    ship->lastdoc,       fread_number( fp ) );
            KEY( "Lastroom",   ship->lastroom,        fread_number( fp ) );
            break;

        case 'M':
             KEY( "MaxCargo",    ship->maxcargo,   fread_number( fp ) );
            KEY( "Manuever",   ship->manuever,      fread_number( fp ) );
            KEY( "Maxmissiles",   ship->maxmissiles,      fread_number( fp ) );
            KEY( "Maxtorpedos",   ship->maxtorpedos,      fread_number( fp ) );
            KEY( "Maxrockets",   ship->maxrockets,      fread_number( fp ) );
            KEY( "Maxarmor",   ship->maxarmor,      fread_number( fp ) );
            KEY( "Missiles",   ship->missiles,      fread_number( fp ) );
            KEY( "Missiletype",   ship->missiletype,      fread_number( fp ) );
            KEY( "Maxshield",      ship->maxshield,        fread_number( fp ) );
            KEY( "Maxenergy",      ship->maxenergy,        fread_number( fp ) );
            KEY( "Missilestate",   ship->missilestate,        fread_number( fp ) );
            KEY( "Maxhull",      ship->maxhull,        fread_number( fp ) );
            KEY( "Maxchaff",       ship->maxchaff,      fread_number( fp ) );
	    KEY( "MaxModules",		ship->maxmodules,	fread_number( fp ) );
            KEY( "Mlaunchers",     ship->mlaunchers,    fread_number( fp ) );
            if(!str_cmp(word, "Module"))
            {
               ship->module_vnum[modules] = fread_number( fp );
               ship->modules += 1;
               modules++;
               update_ship_modules(ship);
/*               bug("Ship module read, and updated.", 0); */
               fMatch = 1;
            }                       
             break;

	case 'N':
	    KEY( "Name",	ship->name,		fread_string( fp ) );
	    KEY( "Navseat",     ship->navseat,          fread_number( fp ) );
            break;
  
        case 'O':
            KEY( "Owner",            ship->owner,            fread_string( fp ) );
            KEY( "Objectnum",        dummy_number,        fread_number( fp ) );
            break;
        
        case 'P':
            KEY( "Pilot",            ship->pilot,            fread_string( fp ) ); 
            KEY( "Pilotseat",     ship->pilotseat,          fread_number( fp ) );
            break;
        
        case 'R':
            KEY( "Rlaunchers",  ship->rlaunchers,      fread_number( fp ) );
            KEY( "Realspeed",   ship->realspeed,       fread_number( fp ) );
            KEY( "Rockets",     ship->rockets,         fread_number( fp ) );
            break;
       
        case 'S':
            KEY( "Shipyard",    ship->shipyard,      fread_number( fp ) );
            KEY( "Sensor",      ship->sensor,       fread_number( fp ) );
            KEY( "Shield",      ship->shield,        fread_number( fp ) );
            KEY( "Shipstate",   ship->shipstate,        fread_number( fp ) );
            KEY( "Statet0",   ship->statet0,        fread_number( fp ) );
            KEY( "Statet1",   ship->statet1,        fread_number( fp ) );
            KEY( "Statet2",   ship->statet2,        fread_number( fp ) ); 


	case 'T':
            KEY( "Tlaunchers", ship->tlaunchers, fread_number( fp ) );
	    KEY( "Type",	ship->type,	fread_number( fp ) );
	    KEY( "Tractorbeam", ship->tractorbeam,      fread_number( fp ) );
	    KEY( "Turret1",	ship->turret1,	fread_number( fp ) );
	    KEY( "Turret2",	ship->turret2,	fread_number( fp ) );
	    KEY( "Torpedos",	ship->torpedos,	fread_number( fp ) );
	    break;
	}

	if ( !fMatch )
	{
	    sprintf( buf, "Fread_ship: no match: %s", word );
	    bug( buf, 0 );
	}
    }
}

/*
 * Load a ship file
 */

bool load_ship_file( char *shipfile )
{
    char filename[256];
    SHIP_DATA *ship;
    FILE *fp;
    bool found;
    ROOM_INDEX_DATA *pRoomIndex;
    CLAN_DATA *clan;
        
    CREATE( ship, SHIP_DATA, 1 );

    found = FALSE;
    sprintf( filename, "%s%s", SHIP_DIR, shipfile );

    if ( ( fp = fopen( filename, "r" ) ) != NULL )
    {

	found = TRUE;
	for ( ; ; )
	{
	    char letter;
	    char *word;

	    letter = fread_letter( fp );
	    if ( letter == '*' )
	    {
		fread_to_eol( fp );
		continue;
	    }

	    if ( letter != '#' )
	    {
		bug( "Load_ship_file: # not found.", 0 );
		break;
	    }

	    word = fread_word( fp );
	    if ( !str_cmp( word, "SHIP"	) )
	    {
	    	fread_ship( ship, fp );
	    	break;
	    }
	    else if ( !str_cmp( word, "MODS" ) )	
		{		
			/*log_string( "Read Modules" );*/
			fread_modules( ship, fp );
			/*log_string( "Use Modules" );*/
			update_ship_modules( ship );
		}
	    else if ( !str_cmp( word, "END"	) )
	        break;
	    else
	    {
		char buf[MAX_STRING_LENGTH];

		sprintf( buf, "Load_ship_file: bad section: %s.", word );
		bug( buf, 0 );
		break;
	    }
	}
	fclose( fp );
    }
    if ( !(found) )
      DISPOSE( ship );
    else
    {      
       LINK( ship, first_ship, last_ship, next, prev );
       if ( !str_cmp("Public",ship->owner) || ship->type == MOB_SHIP )
       {
       
         if ( ship->class != SHIP_PLATFORM && ship->type != MOB_SHIP && 
ship->class != CAPITAL_SHIP && ship->class != SUPERCAPITAL_SHIP && 
ship->class != FRIGATE_SHIP )
         {
           extract_ship( ship );
           ship_to_room( ship , ship->shipyard ); 
     
           ship->location = ship->shipyard;
           ship->lastdoc = ship->shipyard; 
           ship->shipstate = SHIP_DOCKED;
           }

     ship->currspeed=0;
     ship->energy=ship->maxenergy;
     ship->chaff=ship->maxchaff;
     ship->hull=ship->maxhull;
     ship->shield=0;
     
     ship->ionstate = LASER_READY; 
     ship->statet1 = LASER_READY; 
     ship->statet2 = LASER_READY; 
     ship->statet0 = LASER_READY; 
     ship->missilestate = LASER_READY;
       
     ship->currjump=NULL;
     ship->target0=NULL;
     ship->target1=NULL;
     ship->target2=NULL;
     
     ship->hatchopen = FALSE;
     ship->bayopen = TRUE;
     
     ship->missiles = ship->maxmissiles;
     ship->torpedos = ship->maxtorpedos;
     ship->rockets = ship->maxrockets;
     ship->autorecharge = FALSE;
     ship->autotrack = FALSE;
     ship->autospeed = FALSE;
          

       }

       else if ( ship->cockpit == ROOM_SHUTTLE_BUS || 
                 ship->cockpit == ROOM_SHUTTLE_BUS_2 || 
                 ship->cockpit == ROOM_SENATE_SHUTTLE || 
                 ship->cockpit == ROOM_CORUSCANT_TURBOCAR ||
                 ship->cockpit == ROOM_CORUSCANT_SHUTTLE   )
       {}
       else if ( ( pRoomIndex = get_room_index( ship->lastdoc ) ) != NULL 
            && ship->class != CAPITAL_SHIP && ship->class != SHIP_PLATFORM 
&& ship->class != SUPERCAPITAL_SHIP && ship->class != FRIGATE_SHIP ) 
       {
              LINK( ship, pRoomIndex->first_ship, pRoomIndex->last_ship, next_in_room, prev_in_room );
              ship->in_room = pRoomIndex;
              ship->location = ship->lastdoc;                                                                           
       }
           

       if ( ship->class == SHIP_PLATFORM || ship->type == MOB_SHIP || 
ship->class == CAPITAL_SHIP || ship->class == SUPERCAPITAL_SHIP || 
ship->class == FRIGATE_SHIP )
       {
          ship_to_starsystem(ship, starsystem_from_name(ship->home) );  
          ship->vx = number_range( -5000 , 5000 );
          ship->vy = number_range( -5000 , 5000 );
          ship->vz = number_range( -5000 , 5000 );
          ship->hx = 1;
          ship->hy = 1;
          ship->hz = 1;
          ship->shipstate = SHIP_READY;
          ship->autopilot = TRUE;
          ship->autorecharge = TRUE;
          ship->shield = ship->maxshield;
       }

         if ( ship->type != MOB_SHIP && (clan = get_clan( ship->owner )) != NULL )
         {
          if ( ship->class <= SHIP_PLATFORM )
             clan->spacecraft++;
          else
             clan->vehicles++;
         }  
         
    }
    
    return found;
}

/*
 * Load in all the ship files.
 */
void load_ships( )
{
    FILE *fpList;
    char *filename;
    char shiplist[256];
    char buf[MAX_STRING_LENGTH];
    
    
    first_ship	= NULL;
    last_ship	= NULL;
    first_missile = NULL;
    last_missile = NULL;
    
    log_string( "Loading ships..." );

    sprintf( shiplist, "%s%s", SHIP_DIR, SHIP_LIST );
    fclose( fpReserve );
    if ( ( fpList = fopen( shiplist, "r" ) ) == NULL )
    {
	perror( shiplist );
	exit( 1 );
    }

    for ( ; ; )
    {
    
	filename = feof( fpList ) ? "$" : fread_word( fpList );

	if ( filename[0] == '$' )
	  break;
	         
	if ( !load_ship_file( filename ) )
	{
	  sprintf( buf, "Cannot load ship file: %s", filename );
	  bug( buf, 0 );
	}

    }
    fclose( fpList );
    log_string(" Done ships " );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}

void resetship( SHIP_DATA *ship )
{
     ship->shipstate = SHIP_READY;
     
     if ( ship->class != SHIP_PLATFORM && ship->type != MOB_SHIP)
     {
           extract_ship( ship );
           ship_to_room( ship , ship->shipyard );      
           ship->location = ship->shipyard;
           ship->lastdoc = ship->shipyard; 
           ship->shipstate = SHIP_DOCKED;
           ship->shipstate2 = SHIP_READY;
     }
     rem_extshipflags(ship);
     if (ship->starsystem)
        ship_from_starsystem( ship, ship->starsystem );  
     ship->currspeed=0;
     ship->energy=ship->maxenergy;
     ship->chaff=ship->maxchaff;
     ship->hull=ship->maxhull;
     ship->shield=0;
     
     ship->ionstate = LASER_READY; 
     ship->statet1 = LASER_READY; 
     ship->statet2 = LASER_READY; 
     ship->statet0 = LASER_READY; 
     ship->missilestate = MISSILE_READY;
     ship->torpedostate = MISSILE_READY;
     ship->rocketstate  = MISSILE_READY;
     ship->currjump=NULL;
     ship->target0=NULL;
     ship->target1=NULL;
     ship->target2=NULL;
     
     ship->hatchopen = FALSE;
     ship->bayopen = TRUE;
     
     ship->missiles = ship->maxmissiles;
     ship->torpedos = ship->maxtorpedos;
     ship->rockets = ship->maxrockets;
     ship->autorecharge = FALSE;
     ship->autotrack = FALSE;
     ship->autospeed = FALSE;

     ship->sdestnum = -1;
     
     if ( str_cmp("Public",ship->owner) && ship->type != MOB_SHIP && !IS_SET(ship->flags, SHIPFLAG_SIMULATOR))
     {
        CLAN_DATA *clan;
        
        if ( ship->type != MOB_SHIP && (clan = get_clan( ship->owner )) != NULL )
	{
          if ( ship->class <= SHIP_PLATFORM || ship->class == MOBILE_SUIT)
             clan->spacecraft--;
          else 
             clan->vehicles--;
       	}

        STRFREE( ship->owner );
        ship->owner = STRALLOC( "" );
        STRFREE( ship->pilot );
        ship->pilot = STRALLOC( "" );
        STRFREE( ship->copilot );
        ship->copilot = STRALLOC( "" );
     }
     
     save_ship(ship);               
}

void do_resetship( CHAR_DATA *ch, char *argument )
{    
     SHIP_DATA *ship;
     
     ship = get_ship( argument );
     if (ship == NULL)
     {
        send_to_char("&RNo such ship!",ch);
        return;
     } 
     
     resetship( ship ); 
     
     if ( ship->type == MOB_SHIP )
     {
          ship_to_starsystem(ship, starsystem_from_name(ship->home) );  
          ship->vx = number_range( -5000 , 5000 );
          ship->vy = number_range( -5000 , 5000 );
          ship->vz = number_range( -5000 , 5000 );
          ship->shipstate = SHIP_READY;
          ship->autopilot = TRUE;
          ship->autorecharge = TRUE;
          ship->shield = ship->maxshield;
     }

     if ( ship->type != MOB_SHIP && ship->class >= FRIGATE_SHIP && ship->class < MOBILE_SUIT )
     {
          ship_to_starsystem(ship, starsystem_from_name(ship->home) );  
          ship->vx = number_range( -5000 , 5000 );
          ship->vy = number_range( -5000 , 5000 );
          ship->vz = number_range( -5000 , 5000 );
          ship->shipstate = SHIP_READY;
          ship->autopilot = TRUE;
          ship->autorecharge = TRUE;
          ship->shield = ship->maxshield;
     }
}         

void do_setship( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char arg3[MAX_INPUT_LENGTH];
    SHIP_DATA *ship;
    int  tempnum;
    ROOM_INDEX_DATA *roomindex;
    
    if ( IS_NPC( ch ) )
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg1[0] == '\0' )
    {
	send_to_char( "Usage: setship <ship> <field> <values>\n\r", ch );
	send_to_char( "\n\rField being one of:\n\r", ch );
	send_to_char( "filename name owner copilot pilot description home\n\r", ch );
	send_to_char( "cockpit entrance turret1 turret2 hangar\n\r", ch );
	send_to_char( "engineroom firstroom lastroom shipyard\n\r", ch );
	send_to_char( "manuever speed hyperspeed tractorbeam\n\r", ch );
	send_to_char( "lasers missiles shield hull energy chaff\n\r", ch );
	send_to_char( "comm sensor astroarray class torpedos\n\r", ch );
	send_to_char( "pilotseat coseat gunseat navseat rockets dock\n\r", ch );
        send_to_char( "maxmodules laserdamage interdict ions\n\r", ch );
        send_to_char( "autocannon, autodamage, autoammo, armor, flags\n\r", ch );
	send_to_char( "maxcargo mlaunchers tlaunchers rlaunchers\n\r",ch );
        send_to_char( "cloak\n\r", ch);
	return;
    }

    ship = get_ship( arg1 );
    if ( !ship )
    {
	send_to_char( "No such ship.\n\r", ch );
	return;
    }

    if ( ship->class == MOBILE_SUIT && get_trust( ch ) <= (MAX_LEVEL -1) )
    {
	send_to_char( "At current, Only Head Imms can modify Coralskippers.\n\r", ch );
	return;
    }
    if ( !str_cmp( arg2, "maxcargo" ) )
    {
        ship->maxcargo = URANGE(0, atoi(argument), 500);
        send_to_char( "Done.\n\r", ch );
        save_ship(ship);
        return;
    }
    
    if ( !str_cmp( arg2, "maxmodules" ) )
	{
		if (atoi(argument) < ship->modules)
		{
			send_to_char("Please remove some modules first.\n\r", ch);
			return; 
		}
                ship->maxmodules = URANGE(10, atoi(argument), MAX_MODULES);	
		return;
	}
    if ( !str_cmp( arg2, "owner" ) )
    {
         CLAN_DATA *clan;
         if ( ship->type != MOB_SHIP && (clan = get_clan( ship->owner )) != NULL )
         {
          if ( ship->class <= SHIP_PLATFORM )
             clan->spacecraft--;
          else
             clan->vehicles--;
         }
	STRFREE( ship->owner );
	ship->owner = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	if ( ship->type != MOB_SHIP && (clan = get_clan( ship->owner )) != NULL )
         {
          if ( ship->class <= SHIP_PLATFORM )
             clan->spacecraft++;
          else
             clan->vehicles++;
         }
	return;
    }
    
    if ( !str_cmp( arg2, "home" ) )
    {
	STRFREE( ship->home );
	ship->home = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
    
    if ( !str_cmp( arg2, "pilot" ) )
    {
	STRFREE( ship->pilot );
	ship->pilot = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "copilot" ) )
    {
	STRFREE( ship->copilot );
	ship->copilot = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
   
    if ( !str_cmp( arg2, "firstroom" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
	ship->firstroom = tempnum;
        ship->lastroom = tempnum;
        ship->cockpit = tempnum;
        ship->coseat = tempnum;
        ship->pilotseat = tempnum;
        ship->gunseat = tempnum;
        ship->navseat = tempnum;
        ship->entrance = tempnum;
        ship->turret1 = 0;
        ship->turret2 = 0;
        ship->hanger = 0;
	ship->dock = 0;
	send_to_char( "You will now need to set the other rooms in the ship.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "lastroom" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
    	if ( tempnum < ship->firstroom )
    	{
    	   send_to_char("The last room on a ship must be greater than or equal to the first room.\n\r",ch);
           return;
    	}
    	if ( ship->class == FIGHTER_SHIP && (tempnum - ship->firstroom) > 5 )
    	{
    	   send_to_char("Starfighters may have up to 5 rooms only.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == MIDSIZE_SHIP && (tempnum - ship->firstroom) > 25 && (tempnum - ship->firstroom) < 3 )
    	{
    	   send_to_char("Midships may have up to 25 rooms only And a minimum of 3.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == FRIGATE_SHIP && (tempnum - ship->firstroom) > 60 && (tempnum - ship->firstroom) < 15)
    	{
    	   send_to_char("Frigates must have between 15 and 60 rooms only.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == CAPITAL_SHIP && (tempnum - ship->firstroom) > 100 && (tempnum - ship->firstroom) < 50)
    	{
    	   send_to_char("Capital Ships must have between 50 and 100 rooms only.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == SUPERCAPITAL_SHIP && (tempnum - ship->firstroom) > 250 && (tempnum - ship->firstroom) < 75)
    	{
    	   send_to_char("Super-Capital Ships must have between 75 and 250 rooms only.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == SHIP_PLATFORM && (tempnum - ship->firstroom) < 15)
    	{
    	   send_to_char("Platforms must have more than 15 Rooms.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == MOBILE_SUIT && tempnum != ship->firstroom)
    	{
    	   send_to_char("Coralskippers may only have a single Room.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == CLOUD_CAR && (tempnum - ship->firstroom) > 3)
    	{
    	   send_to_char("Super-Capital Ships must have between 1 and 3 rooms only.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == LAND_SPEEDER && tempnum != ship->firstroom)
    	{
    	   send_to_char("Speeders may only have a Single Room.\n\r",ch);
    	   return;
    	}  
	if ( ship->class == WALKER && (tempnum - ship->firstroom) > 2 && (tempnum - ship->firstroom) < 15)
    	{
    	   send_to_char("Walkers must have between 2 and 15 rooms only.\n\r",ch);
    	   return;
    	}  
	ship->lastroom = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "cockpit" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
    	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	if ( tempnum == ship->turret1 || tempnum == ship->turret2 || tempnum == ship->hanger )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->cockpit = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
    
    if ( !str_cmp( arg2, "pilotseat" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
    	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	if ( tempnum == ship->turret1 || tempnum == ship->turret2 || tempnum == ship->hanger )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->pilotseat = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
    if ( !str_cmp( arg2, "coseat" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
    	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	if ( tempnum == ship->turret1 || tempnum == ship->turret2 || tempnum == ship->hanger )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->coseat = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
    if ( !str_cmp( arg2, "navseat" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
    	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	if ( tempnum == ship->turret1 || tempnum == ship->turret2 || tempnum == ship->hanger )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->navseat = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
    if ( !str_cmp( arg2, "gunseat" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
    	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	if ( tempnum == ship->turret1 || tempnum == ship->turret2 || tempnum == ship->hanger )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->gunseat = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
    
    if ( !str_cmp( arg2, "entrance" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
    	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	ship->entrance = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "turret1" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	if ( ship->class >= MOBILE_SUIT )
    	{
    	   send_to_char("This Ship can't have extra laser turrets.\n\r",ch);
    	   return;
    	}  
    	if ( ship->class == FIGHTER_SHIP )
    	{
    	   send_to_char("Starfighters can't have extra laser turrets.\n\r",ch);
    	   return;
    	}  
	if ( tempnum == ship->cockpit || tempnum == ship->entrance ||
    	     tempnum == ship->turret2 || tempnum == ship->hanger || tempnum == ship->engineroom )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->turret1 = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "turret2" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
	if ( ship->class == FIGHTER_SHIP )
    	{
    	   send_to_char("Starfighters can't have extra laser turrets.\n\r",ch);
    	   return;
    	}  
	if ( ship->class >= MOBILE_SUIT )
    	{
    	   send_to_char("This Ship can't have extra laser turrets.\n\r",ch);
    	   return;
    	}  
	if ( tempnum == ship->cockpit || tempnum == ship->entrance ||
    	     tempnum == ship->turret1 || tempnum == ship->hanger || tempnum == ship->engineroom )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->turret2 = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }
    if ( !str_cmp( arg2, "dock" ) )
    {
	tempnum = atoi(argument);
	roomindex = get_room_index(tempnum);
	if (roomindex == NULL)
	{
	  send_to_char( "That room doesn't exits.\n\r", ch );
	  return;
	}
	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
	{
	  send_to_char( "That room number is not in that ship..\n\rIt must be between Firstroom and Lastroom.\n\r", ch );
	  return;
	}
	ship->dock = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
}
    if ( !str_cmp( arg2, "hangar" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
    	if ( tempnum == ship->cockpit || tempnum == ship->turret1 || tempnum == ship->turret2 || tempnum == ship->engineroom )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	if ( ship->class <= MIDSIZE_SHIP )
	{
	   send_to_char("Starfighters are to small to have hangars for other ships!\n\r",ch);
	   return;
	}
	if ( ship->class >= MOBILE_SUIT )
    	{
    	   send_to_char("This Ship can't have hangars.\n\r",ch);
    	   return;
    	}  
	ship->hanger = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

   if ( !str_cmp( arg2, "engineroom" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.\n\r",ch);
    	   return;
    	} 
	if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
    	{
    	   send_to_char("That room number is not in that ship .. \n\rIt must be between Firstroom and Lastroom.\n\r",ch);
           return;
    	}
    	if ( tempnum == ship->cockpit || tempnum == ship->entrance ||
    	     tempnum == ship->turret1 || tempnum == ship->turret2 || tempnum == ship->hanger )
    	{
    	   send_to_char("That room is already being used by another part of the ship\n\r",ch);
           return;
    	}
	ship->engineroom = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "shipyard" ) )
    {   
        tempnum = atoi(argument); 
    	roomindex = get_room_index(tempnum);
    	if (roomindex == NULL)
    	{
    	   send_to_char("That room doesn't exist.",ch);
    	   return;
    	} 
	ship->shipyard = tempnum;
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "type" ) )
    {
	if ( !str_cmp( argument, "republic" ) )
	  ship->type = SHIP_REPUBLIC;
	else if ( !str_cmp( argument, "imperial" ) )
	  ship->type = SHIP_IMPERIAL;
/*	else if ( !str_cmp( argument, "vong" ) )
	  ship->type = SHIP_VONG; No Vong Craft */
	else if ( !str_cmp( argument, "civilian" ) )
	  ship->type = SHIP_CIVILIAN;
	else if ( !str_cmp( argument, "mob" ) )
	  ship->type = MOB_SHIP;
	else
	{
	   send_to_char( "Ship type must be either: republic, imperial, civilian or mob.\n\r", ch );
	   return;
	}
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "name" ) )
    {
	STRFREE( ship->name );
	ship->name = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "filename" ) )
    {
	DISPOSE( ship->filename );
	ship->filename = str_dup( argument );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	write_ship_list( );
	return;
    }
 
    if ( !str_cmp( arg2, "desc" ) )
    {
	STRFREE( ship->description );
	ship->description = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "manuever" ) )
    { 
       if ( ship->class == FIGHTER_SHIP )
       {  
	ship->manuever = URANGE( 0, atoi(argument) , 200 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->manuever = URANGE( 0, atoi(argument) , 150 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->manuever = URANGE( 0, atoi(argument) , 75 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
        ship->manuever = URANGE( 0, atoi(argument) , 50 );
  	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
        ship->manuever = URANGE( 0, atoi(argument) , 15 );
  	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->manuever = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->manuever = URANGE( 0, atoi(argument) , 250 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->manuever = URANGE( 0, atoi(argument) , 75 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->manuever = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->manuever = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
    }

    if ( !str_cmp( arg2, "laserdamage" ) )
    {
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->laserdamage = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 10 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 15 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 20 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
   	ship->laserdamage = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 7 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 2 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->laserdamage = URANGE( 0, atoi(argument) , 10 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }

    }


    if ( !str_cmp( arg2, "lasers" ) )
    {
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->lasers = URANGE( 0, atoi(argument) , 4 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 6 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 10 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 15 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
   	ship->lasers = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 2 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 1 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->lasers = URANGE( 0, atoi(argument) , 6 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
}

    if ( !str_cmp( arg2, "ions" ) )
    {
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->ions = URANGE( 0, atoi(argument) , 2 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->ions = URANGE( 0, atoi(argument) , 3 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->ions = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->ions = URANGE( 0, atoi(argument) , 10 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->ions = URANGE( 0, atoi(argument) , 15 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
   	ship->ions = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->ions = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->ions = URANGE( 0, atoi(argument) , 1);
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	send_to_char( "Speeders can't have Ions!\n\r", ch );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->ions = URANGE( 0, atoi(argument) , 3 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
}
    
    if ( !str_cmp( arg2, "class" ) )
    {   
	ship->class = URANGE( 0, atoi(argument) , 9 );
	if ( get_trust( ch ) != MAX_LEVEL && ship->class == MOBILE_SUIT )
	{
         send_to_char( "Sorry, Only Top Imms can set ships to Coralskippers.\n\r", ch );
         send_to_char( "Resetting to Starfighter.\n\r", ch );
	   ship->class = URANGE( 0, 0, 0);
	}	
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
    }

    if ( !str_cmp( arg2, "armor" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->maxarmor = URANGE( 0, atoi(argument) , 5 );
	ship->armor = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->maxarmor = URANGE( 0, atoi(argument) , 10 );
	ship->armor = URANGE( 0, atoi(argument) , 10 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->maxarmor = URANGE( 0, atoi(argument) , 25 );
	ship->armor = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->maxarmor = URANGE( 0, atoi(argument) , 50 );
	ship->armor = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->maxarmor = URANGE( 0, atoi(argument) , 75 );
	ship->armor = URANGE( 0, atoi(argument) , 75 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->maxarmor = URANGE( 0, atoi(argument) , 150 );
	ship->armor = URANGE( 0, atoi(argument) , 150 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 255 );
	ship->missiles = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 6 );
	ship->missiles = URANGE( 0, atoi(argument) , 6 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 1 );
	ship->missiles = URANGE( 0, atoi(argument) , 1 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	send_to_char( "Walkers Can't Carry Missiles.\n\r", ch );
	return;
       }
    }


    if ( !str_cmp( arg2, "missiles" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->maxmissiles = URANGE( 0, atoi(argument) , 12 );
	ship->missiles = URANGE( 0, atoi(argument) , 12 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 18 );
	ship->missiles = URANGE( 0, atoi(argument) , 18 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 32 );
	ship->missiles = URANGE( 0, atoi(argument) , 32 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 64 );
	ship->missiles = URANGE( 0, atoi(argument) , 64 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 128 );
	ship->missiles = URANGE( 0, atoi(argument) , 128 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 200 );
	ship->missiles = URANGE( 0, atoi(argument) , 200 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 255 );
	ship->missiles = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 6 );
	ship->missiles = URANGE( 0, atoi(argument) , 6 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->maxmissiles = URANGE( 0, atoi(argument) , 1 );
	ship->missiles = URANGE( 0, atoi(argument) , 1 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	send_to_char( "Walkers Can't Carry Missiles.\n\r", ch );
	return;
       }
    }

    if ( !str_cmp( arg2, "torpedos" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->maxtorpedos = URANGE( 0, atoi(argument) , 6 );
	ship->torpedos = URANGE( 0, atoi(argument) , 6 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->maxtorpedos = URANGE( 0, atoi(argument) , 12 );
	ship->torpedos = URANGE( 0, atoi(argument) , 12 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->maxtorpedos = URANGE( 0, atoi(argument) , 24 );
	ship->torpedos = URANGE( 0, atoi(argument) , 24 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->maxtorpedos = URANGE( 0, atoi(argument) , 48 );
	ship->torpedos = URANGE( 0, atoi(argument) , 48 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->maxtorpedos = URANGE( 0, atoi(argument) , 96 );
	ship->torpedos = URANGE( 0, atoi(argument) , 96 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->maxtorpedos = URANGE( 0, atoi(argument) , 200 );
	ship->torpedos = URANGE( 0, atoi(argument) , 200 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->maxtorpedos = URANGE( 0, atoi(argument) , 255 );
	ship->torpedos = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	send_to_char( "Cloud Cars Can't Carry Torpedos.\n\r", ch );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	send_to_char( "Speeders Can't Carry Torpedos.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	send_to_char( "Walkers Can't Carry Torpedos.\n\r", ch );
	return;
       }
    }
    
    if ( !str_cmp( arg2, "rockets" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->maxrockets = URANGE( 0, atoi(argument) , 1 );
	ship->rockets = URANGE( 0, atoi(argument) , 1 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->maxrockets = URANGE( 0, atoi(argument) , 3 );
	ship->rockets = URANGE( 0, atoi(argument) , 3 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->maxrockets = URANGE( 0, atoi(argument) , 9 );
	ship->rockets = URANGE( 0, atoi(argument) , 9 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->maxrockets = URANGE( 0, atoi(argument) , 27 );
	ship->rockets = URANGE( 0, atoi(argument) , 27 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->maxrockets = URANGE( 0, atoi(argument) , 81 );
	ship->rockets = URANGE( 0, atoi(argument) , 81 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->maxrockets = URANGE( 0, atoi(argument) , 100 );
	ship->rockets = URANGE( 0, atoi(argument) , 100 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->maxrockets = URANGE( 0, atoi(argument) , 255 );
	ship->rockets = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	send_to_char( "Cloud Cars Can't Deploy Rockets.\n\r", ch );
       }
       if ( ship->class == LAND_SPEEDER )
       {
	send_to_char( "Speeder's Cant possibly hold a rocket.\n\r", ch );
       }
       if ( ship->class == WALKER )
       {
	send_to_char( "Ain't No way a Rocket's Fitting into a Walker.\n\r", ch );
       }
    }

    if ( !str_cmp( arg2, "speed" ) )
    { 
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->realspeed = URANGE( 0, atoi(argument) , 250 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 150 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 75 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 15 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 75 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->realspeed = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
}
 
    if ( !str_cmp( arg2, "tractorbeam" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	send_to_char( "It is impossible to put a TB on a fighter.\n\r", ch );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->tractorbeam = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->tractorbeam = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->tractorbeam = URANGE( 0, atoi(argument) , 100 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->tractorbeam = URANGE( 0, atoi(argument) , 150 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
   	ship->tractorbeam = URANGE( 0, atoi(argument) , 200 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	send_to_char( "Impossible.\n\r", ch );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	send_to_char( "Impossible.\n\r", ch );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	send_to_char( "Impossible.\n\r", ch );
	return;
       }
       if ( ship->class == WALKER )
       {
	send_to_char( "Impossible.\n\r", ch );
	return;
       }
    }
 
    if ( !str_cmp( arg2, "hyperspeed" ) )
    {   
      if ( ship->class == FIGHTER_SHIP )
       {   
	ship->hyperspeed = URANGE( 0, atoi(argument) , 100 );
 	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->hyperspeed = URANGE( 0, atoi(argument) , 125 );
 	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->hyperspeed = URANGE( 0, atoi(argument) , 75 );
 	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->hyperspeed = URANGE( 0, atoi(argument) , 50 );
 	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->hyperspeed = URANGE( 0, atoi(argument) , 50 );
 	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
 	ship->hyperspeed = URANGE( 0, atoi(argument) , 5 );
 	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
 	ship->hyperspeed = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	send_to_char( "Not On Ground Vehicles.\n\r", ch );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	send_to_char( "Not On Ground Vehicles.\n\r", ch );
	return;
       }
       if ( ship->class == WALKER )
       {
	send_to_char( "Not On Ground Vehicles.\n\r", ch );
	return;
       }
}
 
    if ( !str_cmp( arg2, "shield" ) || !str_cmp( arg2, "shields" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->maxshield = URANGE( 0, atoi(argument) , 500 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 1000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 2500 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 5000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 7500 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 10000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 32000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	send_to_char( "Not on Speeders.\n\r", ch );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->maxshield = URANGE( 0, atoi(argument) , 150 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
    }
 
    if ( !str_cmp( arg2, "hull" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->hull = URANGE( 1, atoi(argument) , 1000 );
	ship->maxhull = URANGE( 1, atoi(argument) , 1000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->hull = URANGE( 1, atoi(argument) , 5000 );
	ship->maxhull = URANGE( 1, atoi(argument) , 5000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->hull = URANGE( 1, atoi(argument) , 10000 );
	ship->maxhull = URANGE( 1, atoi(argument) , 10000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->hull = URANGE( 1, atoi(argument) , 17500 );
	ship->maxhull = URANGE( 1, atoi(argument) , 17500 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->hull = URANGE( 1, atoi(argument) , 25000 );
	ship->maxhull = URANGE( 1, atoi(argument) , 25000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->hull = URANGE( 1, atoi(argument) , 30000 );
	ship->maxhull = URANGE( 1, atoi(argument) , 30000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->hull = URANGE( 1, atoi(argument) , 32000 );
	ship->maxhull = URANGE( 1, atoi(argument) , 32000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->hull = URANGE( 1, atoi(argument) , 250 );
	ship->maxhull = URANGE( 1, atoi(argument) , 250 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->hull = URANGE( 1, atoi(argument) , 400 );
	ship->maxhull = URANGE( 1, atoi(argument) , 400 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->hull = URANGE( 1, atoi(argument) , 5000 );
	ship->maxhull = URANGE( 1, atoi(argument) , 5000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
    }
 
    if ( !str_cmp( arg2, "energy" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->energy = URANGE( 1, atoi(argument) , 5000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 5000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->energy = URANGE( 1, atoi(argument) , 10000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 10000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->energy = URANGE( 1, atoi(argument) , 25000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 25000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->energy = URANGE( 1, atoi(argument) , 30000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 30000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->energy = URANGE( 1, atoi(argument) , 32000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 32000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->energy = URANGE( 1, atoi(argument) , 32000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 32000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->energy = URANGE( 1, atoi(argument) , 32000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 32000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->energy = URANGE( 1, atoi(argument) , 5000 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 5000 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->energy = URANGE( 1, atoi(argument) , 1500 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 1500 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->energy = URANGE( 1, atoi(argument) , 7500 );
	ship->maxenergy = URANGE( 1, atoi(argument) , 7500 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
    }
 
    if ( !str_cmp( arg2, "sensor" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->sensor = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 100 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 150 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 175 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 200 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == WALKER )
       {
	ship->sensor = URANGE( 0, atoi(argument) , 15 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
    }
  
    if ( !str_cmp( arg2, "astroarray" ) )
    {   
//	ship->astro_array = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "This Variable Not Used Yet.\n\r", ch );
	return;
    }
    
    if ( !str_cmp( arg2, "comm" ) )
    {   
//	ship->comm = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "This Variable Not Used Yet.\n\r", ch );
	return;
    }
    
    if ( !str_cmp( arg2, "chaff" ) )
    {   
       if ( ship->class == FIGHTER_SHIP )
       {   
	ship->chaff = URANGE( 0, atoi(argument) , 5 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 5 );
		send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MIDSIZE_SHIP )
       {
	ship->chaff = URANGE( 0, atoi(argument) , 15 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 15 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == FRIGATE_SHIP )
       {
	ship->chaff = URANGE( 0, atoi(argument) , 25 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 25 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CAPITAL_SHIP )
       {
	ship->chaff = URANGE( 0, atoi(argument) , 50 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SUPERCAPITAL_SHIP )
       {
	ship->chaff = URANGE( 0, atoi(argument) , 50 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 50 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == SHIP_PLATFORM )
       {
	ship->chaff = URANGE( 0, atoi(argument) , 75 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 75 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == MOBILE_SUIT )
       {
	ship->chaff = URANGE( 0, atoi(argument) , 255 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 255 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == CLOUD_CAR )
       {
	ship->chaff = URANGE( 0, atoi(argument) , 5 );
	ship->maxchaff = URANGE( 0, atoi(argument) , 5 );
	send_to_char( "Done.\n\r", ch );
	save_ship( ship );
	return;
       }
       if ( ship->class == LAND_SPEEDER )
       {
	send_to_char( "Not on a Speeder.\n\r", ch );
	return;
       }
       if ( ship->class == WALKER )
       {
	send_to_char( "Not on a Walker.\n\r", ch );
	return;
       }
}
/* Installed to setship flags, primarily for simulators. -Arcturus */    
 	if ( !str_cmp( arg2, "flags" ) )
	{
            if ( !argument || argument[0] == '\0' )
            {
            send_to_char( "Usage: setship <ship> flags <flag> [flag]...\n\r", ch );
            send_to_char( "cloaked overdrive afterburner sablaser sabions sabengine sabturret1 sabturret2\n\r", ch);
            send_to_char( "sablauncher shieldrlaser shieldrengine enginerlaser enginershield laserrengine\n\r", ch);
            send_to_char( "laserrshield duallaser trilaser quadlaser dualion triion quadion simulator\n\r", ch );
            send_to_char( "dualmissile dualtorpedo dualrocket sabrlauncher sabtlauncher\n\r", ch);
            return;
            }
        while ( argument[0] != '\0' )
        {
            argument = one_argument( argument, arg3 );
            tempnum = get_shipflag( arg3 );

            if ( tempnum < 0 || tempnum > 31 )
            {
                ch_printf( ch, "Unknown flag: %s\n\r", arg3 );
                return;
            }
            TOGGLE_BIT( ship->flags, 1 << tempnum );
        }
        save_ship( ship );
        return;
	}
    if( !str_cmp( arg2, "cloak" ))
    {
       if(ship->cloak == 0)
       {
         ship->cloak = 1;
         send_to_char("Cloaking unit added.\n\r", ch);
         return;
       }
       else
       {
         ship->cloak = 0;
         send_to_char("Cloaking unit removed.\n\r", ch);
         return;
       }
    }
    if(!str_cmp(arg2, "mlaunchers") )
    {
        ship->mlaunchers =  atoi(argument);
        send_to_char( "Done.\n\r", ch );
        save_ship( ship );
        return;

    }
    if(!str_cmp(arg2, "tlaunchers"))
    {
        ship->tlaunchers =  atoi(argument);
        send_to_char( "Done.\n\r", ch );
        save_ship( ship );
        return;
    }
    if(!str_cmp(arg2, "rlaunchers"))
    {
        ship->rlaunchers =  atoi(argument);
        send_to_char( "Done.\n\r", ch );
        save_ship( ship );
        return;
    }
    if ( !str_cmp( arg2, "autocannon" ) )
    {
      if ( get_trust( ch ) < (MAX_LEVEL -1))
      {
        send_to_char( "At current, Only Head Imms can modify autocannon settings.\n\r", ch );
        return;
      }
      if ( ship->autocannon == 0 )
      {
        ship->autocannon = 1;
        send_to_char( "Autocannon Added!\n\r", ch );
        save_ship( ship );
        return;
      }
      if ( ship->autocannon == 1 )
      {
        ship->autocannon = 0;
        send_to_char( "Autocannon Removed!\n\r", ch );
        save_ship( ship );
        return;
      }
    }

    if ( !str_cmp( arg2, "autodamage" ) )
    {
      if ( get_trust( ch ) < (MAX_LEVEL -1))
      {
        send_to_char( "At current, Only Head Imms can modify autocannon settings.\n\r", ch );
        return;
      }
	ship->autodamage = URANGE( 0, atoi(argument) , 255 );
      send_to_char( "Done.\n\r", ch );
      save_ship( ship );
    }

    if ( !str_cmp( arg2, "autoammo" ) )
    {
      if ( get_trust( ch ) < (MAX_LEVEL -1))
      {
        send_to_char( "At current, Only Head Imms can modify autocannon settings.\n\r", ch );
        return;
      }
	ship->autoammomax = URANGE( 0, atoi(argument) , 255 );
	ship->autoammo = URANGE( 0, atoi(argument) , 255 );
      send_to_char( "Done.\n\r", ch );
      save_ship( ship );
    }

    if ( !str_cmp( arg2, "interdict" ) )
    {
      if ( get_trust( ch ) < (MAX_LEVEL -1))
      {
        send_to_char( "At current, Only Head Imms can modify Interdictor Fields\n\r", ch );
        return;
      }
      if ( ship->interdict == 0 )
      {
        ship->interdict = 1;
        send_to_char( "Interdictor Generators Added!\n\r", ch );
        save_ship( ship );
        return;
      }
      if ( ship->interdict == 1 )
      {
        ship->interdict = 0;
        send_to_char( "Interdictor Generators Removed!\n\r", ch );
        save_ship( ship );
        return;
      }
    }


    do_setship( ch, "" );
    return;
}

void do_showship( CHAR_DATA *ch, char *argument )
{   
    SHIP_DATA *ship;

    if ( IS_NPC( ch ) )
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    if ( argument[0] == '\0' )
    {
	send_to_char( "Usage: showship <ship>\n\r", ch );
	return;
    }

    ship = get_ship( argument );


    if ( !ship )
    {
	send_to_char( "No such ship.\n\r", ch );
	return;
    }
    set_char_color( AT_YELLOW, ch );
    ch_printf( ch, "%s %s : %s\n\rFilename: %s\n\r",
			ship->type == SHIP_REPUBLIC ? "New Republic" :
		       (ship->type == SHIP_IMPERIAL ? "Imperial" : 
		       (ship->type == SHIP_VONG ? "Yuuzhan Vong" : 
		       (ship->type == SHIP_CIVILIAN ? "Civilian" : "Mob" ) ) ),
		        ship->class == FIGHTER_SHIP ? "Starfighter" :
		       (ship->class == MIDSIZE_SHIP ? "Midship" : 
		       (ship->class == CAPITAL_SHIP ? "Capital Ship" : 
		       (ship->class == SHIP_PLATFORM ? "Platform" : 
		       (ship->class == CLOUD_CAR ? "Cloudcar" : 
		       (ship->class == FRIGATE_SHIP ? "Frigate" : 
		       (ship->class == LAND_SPEEDER ? "Speeder" : 
		       (ship->class == SUPERCAPITAL_SHIP ? "SuperCapital" 
: 
		       (ship->class == MOBILE_SUIT ? "Coralskipper" : 
		       (ship->class == WALKER ? "Walker" : "Unknown" ) ) ) ) ) ) ) ) ), 
    			ship->name,
    			ship->filename);
    ch_printf( ch, "Home: %s   Description: %s\n\rOwner: %s   Pilot: %s   Copilot: %s\n\r",
    			ship->home,  ship->description,
    			ship->owner, ship->pilot,  ship->copilot );
    ch_printf( ch, "Firstroom: %d   Lastroom: %d",
    			ship->firstroom,
    			ship->lastroom);
    ch_printf( ch, "Cockpit: %d   Entrance: %d   Hangar: %d   Dock: %d  Engineroom: %d\n\r",
    			ship->cockpit,
    			ship->entrance,
    			ship->hanger,
			ship->dock,
    			ship->engineroom);
    ch_printf( ch, "Pilotseat: %d   Coseat: %d   Navseat: %d  Gunseat: %d\n\r",
    			ship->pilotseat,
    			ship->coseat,
    			ship->navseat,
    			ship->gunseat);
    ch_printf( ch, "Location: %d   Lastdoc: %d   Shipyard: %d\n\r",
    			ship->location,
    			ship->lastdoc,
    			ship->shipyard);
    ch_printf( ch, "Tractor Beam: %d   Comm: %d   Sensor: %d   Astro Array: %d\n\r",
    			ship->tractorbeam,
    			ship->comm,
    			ship->sensor,
    			ship->astro_array);
    ch_printf( ch, "Lasers: %d  Ions: %d  Power: %d  Laser Condition: %s Ion Condition: %s\n\r",
    			ship->lasers,
    			ship->ions,
    			ship->laserdamage,
                  ship->statet0 == LASER_DAMAGED ? "Damaged" : "Good",
                  ship->ionstate == LASER_DAMAGED ? "Damaged" : "Good");		
    ch_printf( ch, "Turret One: %d  Condition: %s\n\r",
    			ship->turret1,
    			ship->statet1 == LASER_DAMAGED ? "Damaged" : "Good");		
    ch_printf( ch, "Turret Two: %d  Condition: %s\n\r",
    			ship->turret2,
    			ship->statet2 == LASER_DAMAGED ? "Damaged" : "Good");		
    ch_printf( ch, "Missiles: %d/%d  Torpedos: %d/%d  Rockets: %d/%d\n\r",
       			ship->missiles,
    			ship->maxmissiles,
    			ship->torpedos,
    			ship->maxtorpedos,
    			ship->rockets,
    			ship->maxrockets);
    ch_printf(ch, "Mlaunchers: %d MCondition: %s Tlaunchers: %d TCondition: %s Rlaunchers: %d RCondition: %s\n\r",
    			ship->mlaunchers, ship->missilestate == MISSILE_DAMAGED ? "Damaged" : "Good",
                        ship->tlaunchers, ship->torpedostate == MISSILE_DAMAGED ? "Damaged" : "Good",
                        ship->rlaunchers, ship->rocketstate  == MISSILE_DAMAGED ? "Damaged" : "Good");		
    if (ship->overdrive == 1)
    {
      send_to_char( "SLAM Overdrive Node Installed!!!\n\r", ch);
    }
    if ( ship->autocannon == 1)
    {
    ch_printf( ch, "Autocannon Installed - %d/%d ammo, %d intensity\n\r",
			ship->autoammomax,
			ship->autoammo,
			ship->autodamage );
    }
    ch_printf( ch, "Hull: %d/%d  Ship Condition: %s\n\r",
                        ship->hull,
    		        ship->maxhull,	
    			ship->shipstate == SHIP_DISABLED ? "Disabled" : "Running");
    		
    ch_printf( ch, "Shields: %d/%d   Energy(fuel): %d/%d   Chaff: %d/%d\n\r",
                        ship->shield,
    		        ship->maxshield,
    		        ship->energy,
    		        ship->maxenergy,
    		        ship->chaff,
    		        ship->maxchaff);
    ch_printf( ch, "Modules: %d/%d\n\r", ship->modules, ship->maxmodules);
    ch_printf( ch, "Cargo: %d/%d, Cargo Type: %s \n\r",
                        ship->cargo,
                        ship->maxcargo,
                        cargo_names[ship->cargotype]);
    ch_printf( ch, "Current Coordinates: %.0f %.0f %.0f\n\r",
                        ship->vx, ship->vy, ship->vz );
    ch_printf( ch, "Current Heading: %.0f %.0f %.0f\n\r",
                        ship->hx, ship->hy, ship->hz );
    ch_printf( ch, "Speed: %d/%d   Hyperspeed: %d  Manueverability: %d\n\r",
                        ship->currspeed, ship->realspeed, ship->hyperspeed , ship->manuever );                    
    if ( ship->interdict == 1)
    {
      send_to_char( "Interdiction System Installed!!!\n\r", ch );
    }
    if (IS_SET(ship->flags, SHIPFLAG_SIMULATOR) )
      send_to_char("This craft is a simulator.\n\r", ch);
    if( ship->cloak == 1 )
      send_to_char("This craft has a cloaking device.\n\r", ch);
    return;
}

void do_makeship( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    char arg[MAX_INPUT_LENGTH];
    
    argument = one_argument( argument, arg );
    
    if ( !argument || argument[0] == '\0' )
    {
	send_to_char( "Usage: makeship <filename> <ship name>\n\r", ch );
	return;
    }

    CREATE( ship, SHIP_DATA, 1 );
    LINK( ship, first_ship, last_ship, next, prev );

    ship->name		= STRALLOC( argument );
    ship->description	= STRALLOC( "" );
    ship->owner 	= STRALLOC( "" );
    ship->copilot       = STRALLOC( "" );
    ship->pilot         = STRALLOC( "" );
    ship->home          = STRALLOC( "" );
    ship->type          = SHIP_CIVILIAN;
    ship->maxcargo=0;
    ship->cargo=0;
    ship->cargotype=0;
    ship->starsystem = NULL;
    ship->energy = ship->maxenergy;
    ship->hull = ship->maxhull;
    ship->in_room=NULL;
    ship->next_in_room=NULL;
    ship->prev_in_room=NULL;
    ship->currjump=NULL;
    ship->target0=NULL;
    ship->target1=NULL;
    ship->target2=NULL;
    ship->maxmodules=10;
    ship->modules=0;
    ship->sdestnum=-1;
    ship->filename = str_dup( arg );
    save_ship( ship );
    write_ship_list( );
	
}

void do_copyship( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    SHIP_DATA *old;
    char arg[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    
    argument = one_argument( argument, arg );
    argument = one_argument( argument, arg2 );
    
    if ( !argument || argument[0] == '\0' )
    {
	send_to_char( "Usage: copyship <oldshipname> <filename> <newshipname>\n\r", ch );
	return;
    }

    old = get_ship ( arg );
    
    if (!old)
    {
	send_to_char( "Thats not a ship!\n\r", ch );
	return;
    }

    CREATE( ship, SHIP_DATA, 1 );
    LINK( ship, first_ship, last_ship, next, prev );

    ship->name		= STRALLOC( argument );
    ship->description	= STRALLOC( "" );
    ship->owner 	= STRALLOC( "" );
    ship->copilot       = STRALLOC( "" );
    ship->pilot         = STRALLOC( "" );
    ship->home          = STRALLOC( "" );
    ship->type          = old->type;
    ship->class         = old->class;
    ship->lasers        = old->lasers  ;
    ship->maxmissiles   = old->maxmissiles  ;
    ship->maxrockets        = old->maxrockets  ;
    ship->maxtorpedos        = old->maxtorpedos  ;
    ship->maxshield        = old->maxshield  ;
    ship->maxhull        = old->maxhull  ;
    ship->maxenergy        = old->maxenergy  ;
    ship->hyperspeed        = old->hyperspeed  ;
    ship->maxchaff        = old->maxchaff  ;
    ship->realspeed        = old->realspeed  ;
    ship->manuever        = old->manuever  ;
    ship->in_room=NULL;
    ship->next_in_room=NULL;
    ship->prev_in_room=NULL;
    ship->currjump=NULL;
    ship->target0=NULL;
    ship->target1=NULL;
    ship->target2=NULL;

    ship->filename         = str_dup(arg2);
    save_ship( ship );
    write_ship_list();
}

void do_ships( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    int count;
    
    if ( !IS_NPC(ch) )
    {
      count = 0;
      send_to_char( "&YThe following ships are owned by you or by your organization:\n\r", ch );
      send_to_char( "\n\r&WShip                               Owner\n\r",ch);
      for ( ship = first_ship; ship; ship = ship->next )
      {   
        if ( str_cmp(ship->owner, ch->name) )
        {
           if ( !ch->pcdata || !ch->pcdata->clan || str_cmp(ship->owner,ch->pcdata->clan->name) || ship->class > CLOUD_CAR )
               continue;
        }
         
        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );
        
        if  ( ship->in_room )       
          ch_printf( ch, "%s (%s) - %s\n\r", ship->name, ship->owner, ship->in_room->name );
        else 
          ch_printf( ch, "%s (%s)\n\r", ship->name, ship->owner );
        
        count++;
      }

      if ( !count )
      {
        send_to_char( "There are no ships owned by you.\n\r", ch );
      }
    
    }

    
    count =0;
    send_to_char( "&Y\n\rThe following ships are docked here:\n\r", ch );
    
    send_to_char( "\n\r&WShip                               Owner          Cost/Rent\n\r", ch );
    for ( ship = first_ship; ship; ship = ship->next )
    {   
        if ( ship->location != ch->in_room->vnum || ship->class > 
CLOUD_CAR )
               continue;

        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );
        
        ch_printf( ch, "%-35s %-15s", ship->name, ship->owner );
        if (ship->type == MOB_SHIP || ship->class == SHIP_PLATFORM )
        {
          ch_printf( ch, "\n\r");
          continue;
        }
        if ( !str_cmp(ship->owner, "Public") )
        { 
          ch_printf( ch, "%ld to rent.\n\r", 500+250*ship->class ); 
        }
        else if ( str_cmp(ship->owner, "") )
          ch_printf( ch, "%s", "\n\r" );
        else
           ch_printf( ch, "%ld to buy.\n\r", get_ship_value(ship) ); 
        
        count++;
    }

    if ( !count )
    {
        send_to_char( "There are no ships docked here.\n\r", ch );
    }
}

void do_speeders( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    int count;

    if ( !IS_NPC(ch) )
    {
      count = 0;
      send_to_char( "&YThe following are owned by you or by your organization:\n\r", ch );
      send_to_char( "\n\r&WVehicle                            Owner\n\r",ch);
      for ( ship = first_ship; ship; ship = ship->next )
      {   
        if ( str_cmp(ship->owner, ch->name) )
        {
           if ( !ch->pcdata || !ch->pcdata->clan || str_cmp(ship->owner,ch->pcdata->clan->name) || ship->class <= SHIP_PLATFORM )
               continue;
        }
        if ( ship->location != ch->in_room->vnum || ship->class <= SHIP_PLATFORM)
               continue;
               
        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );
                
        ch_printf( ch, "%-35s %-15s\n\r", ship->name, ship->owner );
        
        count++;
      }

      if ( !count )
      {
        send_to_char( "There are no land or air vehicles owned by you.\n\r", ch );
      }
    
    }

    
    count =0;
    send_to_char( "&Y\n\rThe following vehicles are parked here:\n\r", ch );
    
    send_to_char( "\n\r&WVehicle                            Owner          Cost/Rent\n\r", ch );
    for ( ship = first_ship; ship; ship = ship->next )
    {   
        if ( ship->location != ch->in_room->vnum || ship->class <= SHIP_PLATFORM)
               continue;
               
        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );
        

        ch_printf( ch, "%-35s %-15s", ship->name, ship->owner );
        
        if ( !str_cmp(ship->owner, "Public") )
        { 
          ch_printf( ch, "%ld to rent.\n\r", 500+250*ship->class ); 
        }
        else if ( str_cmp(ship->owner, "") )
          ch_printf( ch, "%s", "\n\r" );
        else
           ch_printf( ch, "%ld to buy.\n\r", get_ship_value(ship) ); 
        
        count++;
    }

    if ( !count )
    {
        send_to_char( "There are no sea air or land vehicles here.\n\r", ch );
    }
}

void do_allspeeders( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    int count = 0;

      count = 0;
      send_to_char( "&Y\n\rThe following sea/land/air vehicles are currently formed:\n\r", ch );
    
      send_to_char( "\n\r&WVehicle                            Owner\n\r", ch );
      for ( ship = first_ship; ship; ship = ship->next )
      {   
        if ( ship->class <= CLOUD_CAR ) 
           continue; 
      
        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );
        
        
        ch_printf( ch, "%-35s %-15s ", ship->name, ship->owner );

        if ( !str_cmp(ship->owner, "Public") )
        { 
          ch_printf( ch, "%ld to rent.\n\r", 500+250*ship->class ); 
        }
        else if ( str_cmp(ship->owner, "") )
          ch_printf( ch, "%s", "\n\r" );
        else
           ch_printf( ch, "%ld to buy.\n\r", get_ship_value(ship) ); 
        
        count++;
      }
    
      if ( !count )
      {
        send_to_char( "There are none currently formed.\n\r", ch );
	return;
      }
    
}

void do_allships( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    int count = 0;

      count = 0;
      send_to_char( "&Y\n\rThe following ships are currently formed:\n\r", ch );
    
      send_to_char( "\n\r&WShip                               Owner\n\r", ch );
      
      if ( IS_IMMORTAL( ch ) )
        for ( ship = first_ship; ship; ship = ship->next )
           if (ship->type == MOB_SHIP)
              ch_printf( ch, "&w%-35s %-15s\n\r", ship->name, ship->owner );
            
      for ( ship = first_ship; ship; ship = ship->next )
      {   
        if ( ship->class > MOBILE_SUIT ) 
           continue; 
      
        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );
        
        ch_printf( ch, "%-35s %-15s ", ship->name, ship->owner );
        if (ship->type == MOB_SHIP || ship->class == SHIP_PLATFORM )
        {
          ch_printf( ch, "\n\r");
          continue;
        }
        if ( !str_cmp(ship->owner, "Public") )
        { 
          ch_printf( ch, "%ld to rent.\n\r", 500+250*ship->class ); 
        }
        else if ( str_cmp(ship->owner, "") )
          ch_printf( ch, "%s", "\n\r" );
        else
           ch_printf( ch, "%ld to buy.\n\r", get_ship_value(ship) ); 
        
        count++;
      }
    
      if ( count==0 )
      {
        send_to_char( "There are no ships currently formed.\n\r", ch );
	return;
      }
    

}

void do_freeships( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    int count = 0;

      count = 0;
      send_to_char( "&Y\n\rThe following ships are currently availiable for purchace:\n\r", ch );
    
      send_to_char( "\n\r&WShip                                                  Class          Price\n\r", ch );
      
      for ( ship = first_ship; ship; ship = ship->next )
      {   
        if ( ship->class >= MOBILE_SUIT ) 
           continue; 
	if (ship->location == 5)
	   continue;      
	if (ship->location == 45)
	   continue;      
	if (ship->location == 133)
	   continue;      

        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );
        
        if ( !str_cmp(ship->owner, "") )
           ch_printf( ch, "%-53s %-15s %ld\n\r", ship->name,
		        ship->class == FIGHTER_SHIP ? "(Starfighter)" :
		       (ship->class == MIDSIZE_SHIP ? "(Midtarget)" : 
		       (ship->class == CAPITAL_SHIP ? "(Capital Ship)" :
		       (ship->class == SHIP_PLATFORM ? "(Platform)" : 
		       (ship->class == CLOUD_CAR ? "(Cloudcar)" : 
		       (ship->class == FRIGATE_SHIP ? "(Frigate)" : 
		       (ship->class == LAND_SPEEDER ? "(Speeder)" : 
		       (ship->class == SUPERCAPITAL_SHIP ? "(SuperCapital)" : 
		       (ship->class == MOBILE_SUIT ? "(Coralskipper)" : 
		       (ship->class == WALKER ? "(Walker)" : "(Unknown)" ))))))))), 
		       get_ship_value(ship));
        count++;
      }
    
      if ( count==0 )
      {
        send_to_char( "There are no ships currently free.\n\r", ch );
	return;
      }
    
}

void do_availships( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    int count = 0;

      count = 0;
      send_to_char( "&Y\n\rThe following ships are currently for sale:\n\r", ch );
    
      send_to_char( "\n\r&WShip                               Price\n\r", ch );
      
      for ( ship = first_ship; ship; ship = ship->next )
      {   
        if ( ship->class > MOBILE_SUIT )
           continue; 
      
        if (ship->type == MOB_SHIP)
           continue;
        else if (ship->type == SHIP_REPUBLIC)
           set_char_color( AT_BLOOD, ch );
        else if (ship->type == SHIP_VONG)
           set_char_color( AT_CYAN, ch );
        else if (ship->type == SHIP_IMPERIAL)
           set_char_color( AT_DGREEN, ch );
        else
          set_char_color( AT_BLUE, ch );

        if (str_cmp(ship->owner, "") || (!str_cmp(ship->owner, "Public")))
        {
          ch_printf( ch, "%-35s", ship->name );
        }
        if (ship->type == MOB_SHIP || ship->class == SHIP_PLATFORM )
        {
          ch_printf( ch, "\n\r");
          continue;
        }
        if ( !str_cmp(ship->owner, "Public") )
        { 
          ch_printf( ch, "%ld to rent.\n\r", get_ship_value(ship)/100 ); 
        }
        else if ( str_cmp(ship->owner, "") )
          ch_printf( ch, "%s", "\n\r" );
        else
           ch_printf( ch, "%ld to buy.\n\r", get_ship_value(ship) ); 
        
        count++;
      }
    
      if ( !count )
      {
        send_to_char( "There are no ships currently for sale.\n\r", ch );
	return;
      }
    
}




void ship_to_starsystem( SHIP_DATA *ship , SPACE_DATA *starsystem )
{
     if ( starsystem == NULL )
        return;
     
     if ( ship == NULL )
        return;
     
     if ( starsystem->first_ship == NULL )
        starsystem->first_ship = ship;
     
     if ( starsystem->last_ship )
     {
         starsystem->last_ship->next_in_starsystem = ship;
         ship->prev_in_starsystem = starsystem->last_ship;
     }
     
     starsystem->last_ship = ship;
     
     ship->starsystem = starsystem;
        
}

void new_missile( SHIP_DATA *ship , SHIP_DATA *target , CHAR_DATA *ch , int missiletype )
{
     SPACE_DATA *starsystem;
     MISSILE_DATA *missile;

     if ( ship  == NULL )
        return;

     if ( target  == NULL )
        return;

     if ( ( starsystem = ship->starsystem ) == NULL )
        return;
          
     CREATE( missile, MISSILE_DATA, 1 );
     LINK( missile, first_missile, last_missile, next, prev );
     
     missile->target = target; 
     missile->fired_from = ship;
     if ( ch )
     {
        missile->fired_by = STRALLOC( ch->name );
        if ( ch->subclass == SUBCLASS_WFOCUS )
           missiletype -= 1;
     }
     else 
        missile->fired_by = STRALLOC( "" );
     missile->missiletype = missiletype;
     missile->age =0;
     if ( missile->missiletype == HEAVY_BOMB )
       missile->speed = 100;
     else if ( missile->missiletype == PROTON_TORPEDO ) 
       missile->speed = 400;
     else if ( missile->missiletype == CONCUSSION_MISSILE ) 
       missile->speed = 500;
     else 
       missile->speed = 150;
     if(ch)
     {
        if ( ch->subclass == SUBCLASS_WFOCUS )
           missile->missiletype += 1;
     }

     missile->mx = ship->vx;
     missile->my = ship->vy;
     missile->mz = ship->vz;
            
     if ( starsystem->first_missile == NULL )
        starsystem->first_missile = missile;
     
     if ( starsystem->last_missile )
     {
         starsystem->last_missile->next_in_starsystem = missile;
         missile->prev_in_starsystem = starsystem->last_missile;
     }
     
     starsystem->last_missile = missile;
     
     missile->starsystem = starsystem;
        
}

void ship_from_starsystem( SHIP_DATA *ship , SPACE_DATA *starsystem )
{

     if ( starsystem == NULL )
        return;
     
     if ( ship == NULL )
        return;
     
     if ( starsystem->last_ship == ship )
        starsystem->last_ship = ship->prev_in_starsystem;
        
     if ( starsystem->first_ship == ship )
        starsystem->first_ship = ship->next_in_starsystem;
        
     if ( ship->prev_in_starsystem )
        ship->prev_in_starsystem->next_in_starsystem = ship->next_in_starsystem;
     
     if ( ship->next_in_starsystem)
        ship->next_in_starsystem->prev_in_starsystem = ship->prev_in_starsystem;
        
     ship->starsystem = NULL;
     ship->next_in_starsystem = NULL;
     ship->prev_in_starsystem = NULL;   

}

void extract_missile( MISSILE_DATA *missile )
{
    SPACE_DATA *starsystem;

     if ( missile == NULL )
        return;

     if ( ( starsystem = missile->starsystem ) != NULL )
     {
     
      if ( starsystem->last_missile == missile )
        starsystem->last_missile = missile->prev_in_starsystem;
        
      if ( starsystem->first_missile == missile )
        starsystem->first_missile = missile->next_in_starsystem;
        
      if ( missile->prev_in_starsystem )
        missile->prev_in_starsystem->next_in_starsystem = missile->next_in_starsystem;
     
      if ( missile->next_in_starsystem)
        missile->next_in_starsystem->prev_in_starsystem = missile->prev_in_starsystem;
        
      missile->starsystem = NULL;
      missile->next_in_starsystem = NULL;
      missile->prev_in_starsystem = NULL;   

     }
     
     UNLINK( missile, first_missile, last_missile, next, prev );
     
     missile->target = NULL; 
     missile->fired_from = NULL;
     if (  missile->fired_by )
        STRFREE( missile->fired_by );
     
     DISPOSE( missile );
          
}

bool is_rental( CHAR_DATA *ch , SHIP_DATA *ship )
{
   if ( !str_cmp("Public",ship->owner) )
          return TRUE;
             
   return FALSE; 
}

bool check_pilot( CHAR_DATA *ch , SHIP_DATA *ship )
{
   if ( !str_cmp(ch->name,ship->owner) || !str_cmp(ch->name,ship->pilot) 
   || !str_cmp(ch->name,ship->copilot) || !str_cmp("Public",ship->owner) )
      return TRUE;
   
   if ( !IS_NPC(ch) && ch->pcdata && ch->pcdata->clan )
   {        
      if ( !str_cmp(ch->pcdata->clan->name,ship->owner) ) 
      {
        if ( !str_cmp(ch->pcdata->clan->leader,ch->name) )
          return TRUE;
        if ( !str_cmp(ch->pcdata->clan->number1,ch->name) )
          return TRUE;
        if ( !str_cmp(ch->pcdata->clan->number2,ch->name) )
          return TRUE;
        if ( ch->pcdata->bestowments && is_name( "pilot", ch->pcdata->bestowments) )
          return TRUE;
      }
   }
    
   return FALSE;
}

bool extract_ship( SHIP_DATA *ship )
{   
    ROOM_INDEX_DATA *room;
    
    if ( ( room = ship->in_room ) != NULL )
    {               
        UNLINK( ship, room->first_ship, room->last_ship, next_in_room, prev_in_room );
        ship->in_room = NULL;
    }
    return TRUE;
}
void iondamage_ship_ch( SHIP_DATA *ship , int min , int max , CHAR_DATA *ch, SHIP_DATA *attacker )
{   
    int damage , shield_dmg;
    long xp;
    char buf[MAX_STRING_LENGTH];
 
    damage = number_range( min , max );
    damage = (int) damage * 1.3;
    shield_dmg = 0;
     
    xp = ( exp_level( ch->skill_level[PILOTING_ABILITY]+1) - exp_level( ch->skill_level[PILOTING_ABILITY]) ) / 25 ;
    xp = UMIN( get_ship_value( ship ) /100 , xp ) ;
    gain_exp( ch , xp , PILOTING_ABILITY );
      
    if ( ship->shield > 0 )
    {   
        shield_dmg = UMIN( ship->shield , damage );
    	damage -= shield_dmg;
        sprintf(buf, "Damage Report: sustained %d damage to shields.\n\r", shield_dmg);
        echo_to_cockpit( AT_YELLOW, ship , buf);
        sprintf(buf, "Sensors report blast inflicted %d damage to shields of %s.\n\r", shield_dmg, ship->name);
        echo_to_ship(AT_YELLOW, attacker, buf);
    	ship->shield -= shield_dmg;
    	if ( ship->shield == 0 )
  	echo_to_cockpit( AT_BLOOD , ship , "Shields down..." );    	  
    }
    if(ship->shield > 0)
        return; /* No Disabling of ships with shields still up. */
    if ( damage > 0 )
    {
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->shipstate != SHIP_DISABLED )
        {
           echo_to_cockpit( AT_BLUE , ship , "Blue ion energy washes over the room!" );   
           echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!" );   
           ship->shipstate = SHIP_DISABLED;
           ship->currspeed = 0;
           sprintf(buf, "Sensors report blast disabled %s's drive!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf); 
           sprintf(buf, "Blasts from %s disable %s drive!", attacker->name, ship->name);
           echo_to_system(AT_ORANGE, ship, buf, NULL);
           echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
        }
        
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->missilestate != MISSILE_DAMAGED && ship->mlaunchers > 0 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Missile Launcher DAMAGED!" );   
        	   ship->missilestate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's missile launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);  
        }
        if( number_range(1, 50) <= attacker->laserdamage*2 && ship->torpedostate != MISSILE_DAMAGED && ship->tlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Torpedo Launcher DAMAGED!" );
                   ship->torpedostate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's torpedo launcher!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 50) <= attacker->laserdamage*2 && ship->rocketstate != MISSILE_DAMAGED && ship->rlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Rocket Launcher DAMAGED!" );
                   ship->rocketstate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's rocket launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }

        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->statet0 != LASER_DAMAGED )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Lasers DAMAGED!" );   
           ship->statet0 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's lasers!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 50) <= attacker->laserdamage*2 && ship->ionstate != LASER_DAMAGED && ship->ions > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Ion Cannons Damaged!" );
           ship->ionstate = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's ion cannons!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }    
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->statet1 != LASER_DAMAGED && ship->turret1 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret1) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret1) , "Turret DAMAGED!" );   
           ship->statet1 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 1!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf); 
        }
    
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->statet2 != LASER_DAMAGED && ship->turret2 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret2) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "Turret DAMAGED!" );   
           ship->statet2 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 2!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
	}
	else
	{
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->shipstate != SHIP_DISABLED )
        {
           echo_to_cockpit( AT_BLUE , ship , "Blue ion energy washes over the room!" );   
           echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!" );   
           ship->shipstate = SHIP_DISABLED;
           ship->currspeed = 0;
           echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
           sprintf(buf, "Sensors report blast disabled %s's drive!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
           sprintf(buf, "Blasts from %s disable %s drive!", attacker->name, ship->name);
           echo_to_system(AT_ORANGE, ship, buf, NULL);
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
        }
        
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->missilestate != MISSILE_DAMAGED && ship->mlaunchers > 0 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Missile Launcher DAMAGED!" );   
           ship->missilestate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's missile launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= attacker->laserdamage*2 && ship->torpedostate != MISSILE_DAMAGED && ship->tlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Torpedo Launcher DAMAGED!" );
                   ship->torpedostate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's torpedo launcher!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= attacker->laserdamage*2 && ship->rocketstate != MISSILE_DAMAGED && ship->rlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Rocket Launcher DAMAGED!" );
                   ship->rocketstate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's rocket launcher!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if ( number_range(1, 100) <= attacker->laserdamage*2  && ship->statet0 != LASER_DAMAGED )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Lasers DAMAGED!" );   
           ship->statet0 = LASER_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's lasers!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= attacker->laserdamage*2 && ship->ionstate != LASER_DAMAGED && ship->ions > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Ion Cannons Damaged!" );
           ship->ionstate = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's ion cannons!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
    
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->statet1 != LASER_DAMAGED && ship->turret1 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret1) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret1) , "Turret DAMAGED!" );   
           ship->statet1 = LASER_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's turret 1!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);

        }
    
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->statet2 != LASER_DAMAGED && ship->turret2 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret2) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "Turret DAMAGED!" );   
           ship->statet2 = LASER_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's turret 2!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
    }
}

void iondamage_ship( SHIP_DATA *ship , int min , int max, SHIP_DATA *attacker)
{   
    int damage , shield_dmg;
    char buf[MAX_STRING_LENGTH];
    shield_dmg = 0;
    damage = number_range( min , max );
    damage = (int) damage * 1.3;
    
    if ( ship->shield > 0 )
    {   
        shield_dmg = UMIN( ship->shield , damage );
    	damage -= shield_dmg;
    	ship->shield -= shield_dmg;
        sprintf(buf, "Damage Report: sustained %d damage to shields.\n\r", shield_dmg);
        echo_to_cockpit( AT_YELLOW, ship , buf);
        sprintf(buf, "Sensors report blast inflicted %d damage to shields to %s.\n\r", shield_dmg, ship->name);
        echo_to_ship(AT_YELLOW, attacker, buf);
    	if ( ship->shield == 0 )
    	  echo_to_cockpit( AT_BLOOD , ship , "Shields down..." );    	  
    }
    if( ship->shield > 0)
        return; /* No disable through shields -Arcturus */
    if ( damage > 0 )
    {
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->shipstate != SHIP_DISABLED )
        {
           echo_to_cockpit( AT_BLUE , ship , "Blue ion energy washes over the room!" );   
           echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!" );   
           ship->shipstate = SHIP_DISABLED;
           ship->currspeed = 0;
           echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
           sprintf(buf, "Sensors report blast disabled %s's drive!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
           sprintf(buf, "Blasts from %s disable %s drive!", attacker->name, ship->name);
           echo_to_system(AT_ORANGE, ship, buf, NULL);
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
        }
        
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->missilestate != MISSILE_DAMAGED && ship->mlaunchers > 0 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Missile Launcher DAMAGED!" );
                   ship->missilestate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's missile launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 50) <= attacker->laserdamage*2 && ship->torpedostate != MISSILE_DAMAGED && ship->tlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Torpedo Launcher DAMAGED!" );
                   ship->torpedostate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's torpedo launcher!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 50) <= attacker->laserdamage*2 && ship->rocketstate != MISSILE_DAMAGED && ship->rlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Rocket Launcher DAMAGED!" );
                   ship->rocketstate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's rocket launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }        
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->statet0 != LASER_DAMAGED )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Lasers DAMAGED!" );   
           ship->statet0 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's lasers!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 50) <= attacker->laserdamage*2 && ship->ionstate != LASER_DAMAGED && ship->ions > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Ion Cannons Damaged!" );
           ship->ionstate = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's ion cannons!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }    
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->statet1 != LASER_DAMAGED && ship->turret1 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret1) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret1) , "Turret DAMAGED!" );   
           ship->statet1 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 1!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
    
        if ( number_range(1, 50) <= attacker->laserdamage*2 && ship->statet2 != LASER_DAMAGED && ship->turret2 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret2) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "Turret DAMAGED!" );   
           ship->statet2 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 2!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
	}
	else
	{
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->shipstate != SHIP_DISABLED )
        {
           echo_to_cockpit( AT_BLUE , ship , "Blue ion energy washes over the room!" );   
           echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!" );   
           ship->shipstate = SHIP_DISABLED;
           ship->realspeed = 0; 
           echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
           sprintf(buf, "Sensors report blast disabled %s's drive!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
           sprintf(buf, "Blasts from %s disable %s drive!", attacker->name, ship->name);
           echo_to_system(AT_ORANGE, ship, buf, NULL);
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
       }
        
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->missilestate != MISSILE_DAMAGED && ship->mlaunchers > 0 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Missile Launcher DAMAGED!" );   
           ship->missilestate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's missile launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= attacker->laserdamage*2 && ship->torpedostate != MISSILE_DAMAGED && ship->tlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Torpedo Launcher DAMAGED!" );
                   ship->torpedostate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's torpedo launcher!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= attacker->laserdamage*2 && ship->rocketstate != MISSILE_DAMAGED && ship->rlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Rocket Launcher DAMAGED!" );
                   ship->rocketstate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's rocket launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->statet0 != LASER_DAMAGED )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Lasers DAMAGED!" );   
           ship->statet0 = LASER_DAMAGED;
        }
        if( number_range(1, 100) <= attacker->laserdamage*2 && ship->ionstate != LASER_DAMAGED && ship->ions > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Ion Cannons Damaged!" );
           ship->ionstate = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's ion cannons!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->statet1 != LASER_DAMAGED && ship->turret1 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret1) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret1) , "Turret DAMAGED!" );   
           ship->statet1 = LASER_DAMAGED;
        }
    
        if ( number_range(1, 100) <= attacker->laserdamage*2 && ship->statet2 != LASER_DAMAGED && ship->turret2 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->turret2) , "Blue ion energy washes over the room!" );   
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "Turret DAMAGED!" );   
           ship->statet2 = LASER_DAMAGED;
        }
    }
}

void damage_ship_ch( SHIP_DATA *ship , int min , int max , CHAR_DATA *ch, SHIP_DATA *attacker )
{   
    int damage , shield_dmg;
    long xp;
    char buf[MAX_STRING_LENGTH];
    shield_dmg = 0; 
    damage = number_range( min , max );
    
    xp = ( exp_level( ch->skill_level[PILOTING_ABILITY]+1) - exp_level( ch->skill_level[PILOTING_ABILITY]) ) / 25 ;
    xp = UMIN( get_ship_value( ship ) /100 , xp ) ;
    gain_exp( ch , xp , PILOTING_ABILITY );

        
    if ( ship->shield > 0 )
    {   
        shield_dmg = UMIN( ship->shield , damage );
    	damage -= shield_dmg;
    	ship->shield -= shield_dmg;
        sprintf(buf, "Damage Report: sustained %d damage to shields.\n\r", shield_dmg);
        echo_to_cockpit( AT_YELLOW, ship , buf);
        sprintf(buf, "Sensors report blast inflicted %d damage to shields to %s.\n\r", shield_dmg, ship->name);
        echo_to_ship(AT_YELLOW, attacker, buf);    
	if ( ship->shield == 0 )
    	  echo_to_cockpit( AT_BLOOD , ship , "Shields down..." );    	  
    }
    damage = damage - ship->armor;
    if (damage < 1 )
        damage = 0;
    if ( damage > 0 )
    {/* Arcturus' Damage bit, a bit more random, and perhaps a little more often. */
        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->shipstate != SHIP_DISABLED )
        {
           echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!" );   
           ship->shipstate = SHIP_DISABLED;
           ship->currspeed = 0;
           echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
           sprintf(buf, "Sensors report blast disabled %s's drive!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
           sprintf(buf, "Blasts from %s disable %s drive!", attacker->name, ship->name);
           echo_to_system(AT_ORANGE, ship, buf, NULL);   
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
        }
        
        if ( number_range(1, 100) <= number_range(1, damage/2+1)&& ship->missilestate != MISSILE_DAMAGED && ship->mlaunchers > 0 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Missile Launcher DAMAGED!" );
                   ship->missilestate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's missile launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }        
        if( number_range(1, 100) <= number_range(1, damage/2+1) && ship->torpedostate != MISSILE_DAMAGED && ship->tlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Torpedo Launcher DAMAGED!" );
                   ship->torpedostate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's torpedo launcher!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= number_range(1, damage/2+1) && ship->rocketstate != MISSILE_DAMAGED && ship->rlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Rocket Launcher DAMAGED!" );
                   ship->rocketstate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's rocket launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->statet0 != LASER_DAMAGED )
        {
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Lasers DAMAGED!" );   
           ship->statet0 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's lasers!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= number_range(1, damage/2+1) && ship->ionstate != LASER_DAMAGED && ship->ions > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Ion Cannons Damaged!" );
           ship->ionstate = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's ion cannons!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->statet1 != LASER_DAMAGED && ship->turret1 )
        {
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret1) , "Turret DAMAGED!" );   
           ship->statet1 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 1!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
    
        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->statet2 != LASER_DAMAGED && ship->turret2 )
        {
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "Turret DAMAGED!" );   
           ship->statet2 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 2!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }

    }

    if (damage >= 1)
    {
        sprintf(buf, "Damage Report: sustained %d damage to hull integrity.\n\r", damage);
        echo_to_cockpit( AT_YELLOW, ship , buf);
        sprintf(buf, "Sensors report blast inflicted %d damage to hull integrity of %s.\n\r", damage, ship->name);
        echo_to_ship(AT_YELLOW, attacker, buf);
    }
    ship->hull -= damage;
    
    if ( ship->hull <= 0 )
    {
       destroy_ship( ship , NULL );
       
       xp =  ( exp_level( ch->skill_level[PILOTING_ABILITY]+1) - exp_level( ch->skill_level[PILOTING_ABILITY]) );
       xp = UMIN( get_ship_value( ship ) , xp );
       gain_exp( ch , xp , PILOTING_ABILITY);
       ch_printf( ch, "&WYou gain %ld piloting experience!\n\r", xp );
       return;
    }
    
    if ( ship->hull <= ship->maxhull/20 )
       echo_to_cockpit( AT_BLOOD+ AT_BLINK , ship , "WARNING! Ship hull severely damaged!" );    	  

}

void damage_ship( SHIP_DATA *ship , int min , int max, SHIP_DATA *attacker )
{   
    int damage , shield_dmg;
    char buf[MAX_STRING_LENGTH];     
    damage = number_range( min , max );
    
    if ( ship->shield > 0 )
    {   
        shield_dmg = UMIN( ship->shield , damage );
    	damage -= shield_dmg;
    	ship->shield -= shield_dmg;
        sprintf(buf, "Damage Report: sustained %d damage to shields.\n\r", shield_dmg);
        echo_to_cockpit( AT_YELLOW, ship , buf);
        sprintf(buf, "Sensors report blast inflicted %d damage to shields to %s.\n\r", shield_dmg, ship->name);
        echo_to_ship(AT_YELLOW, attacker, buf);
    	if ( ship->shield == 0 )
    	  echo_to_cockpit( AT_BLOOD , ship , "Shields down..." );    	  
    }
    damage = damage - ship->armor;
    if (damage < 1 )
        damage = 0;    
    if ( damage > 0 )
    {

        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->shipstate != SHIP_DISABLED )
        {
           echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!" );   
           ship->shipstate = SHIP_DISABLED;
           ship->currspeed = 0;
           echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
           sprintf(buf, "Sensors report blast disabled %s's drive!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
           sprintf(buf, "Blasts from %s disable %s drive!", attacker->name, ship->name);
           echo_to_system(AT_ORANGE, ship, buf, NULL);
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
        }
        
        if ( number_range(1, 100) <= number_range(1, damage/2+1)&& ship->missilestate != MISSILE_DAMAGED && ship->mlaunchers > 0 )
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Missile Launcher DAMAGED!" );
                   ship->missilestate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's missile launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }        
        if( number_range(1, 100) <= number_range(1, damage/2+1) && ship->torpedostate != MISSILE_DAMAGED && ship->tlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Torpedo Launcher DAMAGED!" );
                   ship->torpedostate = MISSILE_DAMAGED;
            sprintf(buf, "Sensors report blast disabled %s's torpedo launcher!", ship->name);
            echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= number_range(1, damage/2+1) && ship->rocketstate != MISSILE_DAMAGED && ship->rlaunchers > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Rocket Launcher DAMAGED!" );
                   ship->rocketstate = MISSILE_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's rocket launcher!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->statet0 != LASER_DAMAGED )
        {
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Lasers DAMAGED!" );
           ship->statet0 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's lasers!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if( number_range(1, 100) <= number_range(1, damage/2+1) && ship->ionstate != LASER_DAMAGED && ship->ions > 0)
        {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "Blue ion energy washes over the room!" );
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "Ships Ion Cannons Damaged!" );
           ship->ionstate = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's ion cannons!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }

        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->statet1 != LASER_DAMAGED && ship->turret1 )
        {
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret1) , "Turret DAMAGED!" );   
           ship->statet1 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 1!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
        if ( number_range(1, 100) <= number_range(1, damage/2+1) && ship->statet2 != LASER_DAMAGED && ship->turret2 )
        {
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "Turret DAMAGED!" );   
           ship->statet2 = LASER_DAMAGED;
           sprintf(buf, "Sensors report blast disabled %s's turret 2!", ship->name);
           echo_to_ship(AT_YELLOW, attacker, buf);
        }
    
    }
    
    if(damage >= 1)
    {
        sprintf(buf, "Damage Report: sustained %d damage to hull integrity.\n\r", damage);
        echo_to_cockpit( AT_YELLOW, ship , buf);
        sprintf(buf, "Sensors report blast inflicted %d damage to hull integrity of %s\n\r", damage, ship->name);
        echo_to_ship(AT_YELLOW, attacker, buf);
    }
    ship->hull -= damage;
    
    if ( ship->hull <= 0 )
    {
       destroy_ship( ship , NULL );
       return;
    }
    
    if ( ship->hull <= ship->maxhull/2 )
       echo_to_cockpit( AT_BLOOD+ AT_BLINK , ship , "WARNING! Ship hull severely damaged!" );    	  
     
}

void destroy_ship( SHIP_DATA *ship , CHAR_DATA *ch )
{   
    char buf[MAX_STRING_LENGTH];
    char logbuf[MAX_STRING_LENGTH];
    int  roomnum;
    ROOM_INDEX_DATA *room;
    OBJ_DATA *robj;
    CHAR_DATA *rch;
    
    sprintf( buf , "%s explodes in a blinding flash of light!", ship->name );  
    echo_to_system( AT_WHITE + AT_BLINK , ship , buf , NULL );
    sprintf( logbuf, "%s blew up", ship->name );
    log_string( logbuf );    
    echo_to_ship( AT_WHITE + AT_BLINK , ship , "A blinding flash of light burns your eyes...");
    echo_to_ship( AT_WHITE , ship , "But before you have a chance to scream...\n\rYou are ripped apart as your spacecraft explodes...");
        
    for ( roomnum = ship->firstroom ; roomnum <= ship->lastroom ; roomnum++ )
    {
        room = get_room_index(roomnum);
        
        if (room != NULL)
        {
         rch = room->first_person;   
         while ( rch )
         { /* Simulator Code written by Ackbar, added by Arcturus */
           if( IS_SET( ship->flags, SHIPFLAG_SIMULATOR ) )
            {
                 resetship(ship);
	         ship->shipyard = ship->lastdoc;
                 ship->location = ship->lastdoc;
	  	 ship->shipstate = SHIP_READY;
                 ship->shipstate2 = SHIP_READY;
	         extract_ship( ship );
        	 ship_to_room( ship , ship->shipyard ); 
          	 ship->location = ship->shipyard;
          	 ship->lastdoc = ship->shipyard; 
          	 ship->shipstate = SHIP_DOCKED;    
          	 if (ship->starsystem)
        	   ship_from_starsystem( ship, ship->starsystem );  
                 save_ship(ship);               
          	 send_to_char("The lights dim and the hatch opens.\n\r", rch);	 
           	 return;
            }
            if ( IS_IMMORTAL(rch) )
            {
                 char_from_room(rch);
                 char_to_room( rch, get_room_index(wherehome(rch)) );
            }
            else
            {
                     sprintf( buf, "%s is Dead! {Ship incident}", rch->name );
                     echo_to_all( AT_RED, buf, 0);
                     raw_kill( rch , rch );
            }
            rch = room->first_person;     
         }
        
         for ( robj = room->first_content ; robj ; robj = robj->next_content )
         {
           separate_obj( robj );
           extract_obj( robj );
         }
        }

    }
    
    resetship(ship);

}

bool ship_to_room(SHIP_DATA *ship , int vnum )
{
    ROOM_INDEX_DATA *shipto;
    
    if ( (shipto=get_room_index(vnum)) == NULL )
            return FALSE;
    LINK( ship, shipto->first_ship, shipto->last_ship, next_in_room, prev_in_room );
    ship->in_room = shipto; 
    return TRUE;
}


/* New do_board with docking support below - Parnic
void do_board( CHAR_DATA *ch, char *argument )
{
   ROOM_INDEX_DATA *fromroom;
   ROOM_INDEX_DATA *toroom;
   SHIP_DATA *ship;
   
   if ( !argument || argument[0] == '\0')
   {
       send_to_char( "Board what?\n\r", ch );
       return;
   }
   
   if ( ( ship = ship_in_room( ch->in_room , argument ) ) == NULL )
   {
            act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
           return;
   }

   if ( IS_SET( ch->act, ACT_MOUNTED ) )
   {
          return;
   } 

   fromroom = ch->in_room;

        if ( ( toroom = get_room_index( ship->entrance ) ) != NULL )
   	{
   	   if ( ! ship->hatchopen )
   	   {
   	      send_to_char( "&RThe hatch is closed!\n\r", ch);
   	      return;
   	   }
   	
           if ( toroom->tunnel > 0 )
           {
	        CHAR_DATA *ctmp;
	        int count = 0;
	        
	       for ( ctmp = toroom->first_person; ctmp; ctmp = ctmp->next_in_room )
	       if ( ++count >= toroom->tunnel )
	       {
                  send_to_char( "There is no room for you in there.\n\r", ch );
		  return;
	       }
           }
            if ( ship->shipstate == SHIP_LAUNCH || ship->shipstate == SHIP_LAUNCH_2 )
            {
                 send_to_char("&rThat ship has already started launching!\n\r",ch);
                 return;
            }
            
            act( AT_PLAIN, "$n enters $T.", ch,
		NULL, ship->name , TO_ROOM );
	    act( AT_PLAIN, "You enter $T.", ch,
		NULL, ship->name , TO_CHAR );
   	    char_from_room( ch );
   	    char_to_room( ch , toroom );
   	    act( AT_PLAIN, "$n enters the ship.", ch,
		NULL, argument , TO_ROOM );
            do_look( ch , "auto" );

        }                                                                  
        else
          send_to_char("That ship has no entrance!\n\r", ch);
}
*/

/* New board...originally modified by Soulbender */
void do_board( CHAR_DATA *ch, char *argument )
{
   ROOM_INDEX_DATA *fromroom;
   ROOM_INDEX_DATA *toroom;
   SHIP_DATA *ship;
   SHIP_DATA *in_ship;
   
   if (!argument || argument[0] == '\0')
   {
       send_to_char( "Board what?\n\r", ch );
       return;
   }
   
   if (str_cmp( argument, "dock" ))
   {
     if ( ( ship = ship_in_room( ch->in_room , argument ) ) == NULL )
     {
              act( AT_PLAIN, "I see no $T here.", ch, NULL, argument,TO_CHAR );
             return;
     }
   }
   else
   {
       fromroom = ch->in_room;
       
       if ( ( in_ship = ship_from_entrance( fromroom->vnum ) ) == NULL )
       {
          send_to_char( "&RYou need to be at the entrance.\n\r", ch);
          return;
       }
      
       if (!(in_ship->shipstate2 == SHIP_DOCK_3))
       {
          if (in_ship->shipstate2 == SHIP_DOCK_2)
            send_to_char( "&RWait until docking sequence is complete.",ch);
          else
            send_to_char( "&RThis ship isn't currently docked.", ch);
          return;
       }
       if(IS_SET(in_ship->flags, SHIPFLAG_SIMULATOR))
       {
          send_to_char("Your simulator doesn't lead into there.\n\r", ch);
          return;
       }
       ship = in_ship->docked_ship;
   }
   
   if ( IS_SET( ch->act, ACT_MOUNTED ) )
   {
          act( AT_PLAIN, "You can't go in there riding THAT.", ch, NULL, argument, TO_CHAR );  
          return;
   } 

   fromroom = ch->in_room;

        if ( ( toroom = get_room_index( ship->entrance ) ) != NULL )
   	{
   	   if ( (!ship->hatchopen) && !IS_DOCKED(ship) )
   	   {
   	      send_to_char( "&RThe hatch is closed!\n\r", ch);
   	      return;
   	   }
   	
           if ( toroom->tunnel > 0 )
           {
	        CHAR_DATA *ctmp;
	        int count = 0;
	        
	       for ( ctmp = toroom->first_person; ctmp; ctmp = ctmp->next_in_room )
	       if ( ++count >= toroom->tunnel )
	       {
                  send_to_char( "There is no room for you in there.\n\r",ch );
		  return;
	       }
           }
            if ( ship->shipstate == SHIP_LAUNCH || ship->shipstate ==SHIP_LAUNCH_2 )
            {
                 send_to_char("&rThat ship has already started launching!\n\r",ch);
                 return;
            }
            
    rprog_leave_trigger( ch );
    if( char_died(ch) )
      return;
            act( AT_PLAIN, "$n enters $T.", ch,
		NULL, ship->name , TO_ROOM );
	    act( AT_PLAIN, "You enter $T.", ch,
		NULL, ship->name , TO_CHAR );
   	    char_from_room( ch );
   	    char_to_room( ch , toroom );
   	    act( AT_PLAIN, "$n enters the ship.", ch,
		NULL, argument , TO_ROOM );
            do_look( ch , "auto" );
    mprog_entry_trigger( ch );
    if ( char_died(ch) )
      return;
      
    rprog_enter_trigger( ch );
    if ( char_died(ch) )
       return;
      
    mprog_greet_trigger( ch ); 
    if ( char_died(ch) )
       return;
        
    oprog_greet_trigger( ch );
    if ( char_died(ch) )
       return;
        }                                                                  
        else
          send_to_char("That ship has no entrance!\n\r", ch);
}

bool rent_ship( CHAR_DATA *ch , SHIP_DATA *ship )
{   

    long price;

    if ( IS_NPC ( ch ) )
       return FALSE;
       price = 500 + 250*ship->class;  
       if ( ch->gold < price )
       {
         ch_printf(ch, "&RYou can't afford to rent this ship, it costs %ld credits.\n\r", price);
         return FALSE;
       }
    
       ch->gold -= price;
       ch_printf(ch, "&GYou pay %ld credits to rent the ship.\n\r" , price );   
       return TRUE;
     
}

void do_leaveship( CHAR_DATA *ch, char *argument )
{
    ROOM_INDEX_DATA *fromroom;
    ROOM_INDEX_DATA *toroom;
    SHIP_DATA *ship;
    
    fromroom = ch->in_room;
    
    if  ( (ship = ship_from_entrance(fromroom->vnum)) == NULL )
    {
        send_to_char( "I see no exit here.\n\r" , ch );
        return;
    }   
    
    if  ( ship->class == SHIP_PLATFORM )
    {
        return;
    }   
    
    if ( ship->lastdoc != ship->location )
    {
        send_to_char("&rMaybe you should wait until the ship lands.\n\r",ch);
        return;
    }
    
    if ( ship->shipstate != SHIP_DOCKED && ship->shipstate != SHIP_DISABLED )
    {
        send_to_char("&rPlease wait till the ship is properly docked.\n\r",ch);
        return;
    }
    
    if ( ! ship->hatchopen )
    {
    	send_to_char("&RYou need to open the hatch first" , ch );
    	return;
    }
    
    if ( ( toroom = get_room_index( ship->location ) ) != NULL )
    {
            act( AT_PLAIN, "$n exits the ship.", ch,
		NULL, argument , TO_ROOM );
	    act( AT_PLAIN, "You exit the ship.", ch,
		NULL, argument , TO_CHAR );
   	    char_from_room( ch );
   	    char_to_room( ch , toroom );
   	    act( AT_PLAIN, "$n steps out of a ship.", ch,
		NULL, argument , TO_ROOM );
            do_look( ch , "auto" );
     }       
}

void do_launch ( CHAR_DATA *ch, char *argument)
{

    SHIP_DATA * ship;
    SHIP_DATA * onship;
    int chance; 
    long price = 0;
    char buf[MAX_STRING_LENGTH];
 
    if(!ch) return;           
    	        if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )  
    	        {
    	            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
    	            return;
    	        }
    	        
        if ( (( onship = ship_from_hanger( ship->location ) )  != NULL ) 
           && !(IS_SET(ship->flags, SHIPFLAG_SIMULATOR) ? 1 
                                                        : onship->bayopen) )
        {
                send_to_char("&RThe hangar is closed!\n\r",ch);
                return;
        }



    	        if ( ship->class > MOBILE_SUIT )
    	        {
                send_to_char("&RGet in a ship first!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( (ship = ship_from_pilotseat(ch->in_room->vnum)) == NULL )  
    	        {
    	            send_to_char("&RYou don't seem to be in the pilot seat!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( autofly(ship) )
    	        {
    	            send_to_char("&RThe ship is set on autopilot, you'll have to turn it off first.\n\r",ch);
    	            return;
    	        }
    	        
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "You can't do that here.\n\r" , ch );
                   return;
                }   
    
    	        if ( !check_pilot( ch , ship ) )
    	        {
    	            send_to_char("&RHey, thats not your ship! Try renting a public one.\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( ship->lastdoc != ship->location )
                {
                     send_to_char("&rYou don't seem to be docked right now.\n\r",ch);
                     return;
                }
    
    	        if ( ship->shipstate != SHIP_DOCKED && ship->shipstate != SHIP_DISABLED )
    	        {
    	            send_to_char("The ship is not docked right now.\n\r",ch);
    	            return;
    	        }
                
    	        if ( ship->class == FIGHTER_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
    	        if ( ship->class == MOBILE_SUIT )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MIDSIZE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_midships]) ;
                if ( ship->class == CAPITAL_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_capitalships]);
                if ( ship->class == SUPERCAPITAL_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_supercapitalships]);
                if ( ship->class == FRIGATE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_frigates]);
                if ( ship->class == SHIP_PLATFORM )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_capitalships]);
                if ( number_percent( ) < chance )
    		{  
   		   if ( is_rental(ch,ship) )
    		     if( !rent_ship(ch,ship) )
    		        return;
    		    if ( !is_rental(ch,ship) )
                    {    
    		     if ( ship->class == FIGHTER_SHIP )
                       price=20;
                     if ( ship->class == MIDSIZE_SHIP )
                       price=50;
                     if ( ship->class == MOBILE_SUIT )
                       price=50;
                     if ( ship->class == FRIGATE_SHIP )
                       price=250;
                     if ( ship->class == SHIP_PLATFORM )
                       price=750;
                     if ( ship->class == SUPERCAPITAL_SHIP )
                       price=5000;
                     if ( ship->class == CAPITAL_SHIP )
                       price=500;
                      
                     price += ( ship->maxhull-ship->hull );
                     if (ship->missiles )
     	                 price += ( 50 * (ship->maxmissiles-ship->missiles) );
                     else if (ship->torpedos )
     	                 price += ( 75 * (ship->maxtorpedos-ship->torpedos) );
                     else if (ship->rockets )
                         price += ( 150 * (ship->maxrockets-ship->rockets) );
                     else if (ship->autocannon )
                         price += ( 500 * (ship->autoammomax-ship->autoammo) );                 
                     if (ship->shipstate == SHIP_DISABLED )
                            price += 200;
                     if ( ship->missilestate == MISSILE_DAMAGED )
                            price += 100;
                     if ( ship->torpedostate == MISSILE_DAMAGED )
                            price += 200;
                     if ( ship->rocketstate == MISSILE_DAMAGED ) 
                            price += 300;
                     if ( ship->ionstate == LASER_DAMAGED )
                            price += 100;
                     if ( ship->statet0 == LASER_DAMAGED )
                            price += 50;
                     if ( ship->statet1 == LASER_DAMAGED )
                            price += 50;
                     if ( ship->statet2 == LASER_DAMAGED )
                            price += 50;
                    }                
                
    	          if ( ch->pcdata && ch->pcdata->clan && !str_cmp(ch->pcdata->clan->name,ship->owner) ) 
                  {
                   if ( ch->pcdata->clan->funds < price )
                   {
                       ch_printf(ch, "&R%s doesn't have enough funds to prepare this ship for launch.\n\r", ch->pcdata->clan->name );
                       return;
                   }
    
                   ch->pcdata->clan->funds -= price;
                   ch_printf(ch, "&GIt costs %s %ld credits to ready this ship for launch.\n\r", ch->pcdata->clan->name, price );   
                  }
                  else if ( str_cmp( ship->owner , "Public" ) )
                  {
                   if ( ch->gold < price )
                   {
                       ch_printf(ch, "&RYou don't have enough funds to prepare this ship for launch.\n\r");
                       return;
                   }
    
                   ch->gold -= price;
                   ch_printf(ch, "&GYou pay %ld credits to ready the ship for launch.\n\r", price );   
                   rem_extshipflags(ship);                
                  }
                  ship->autoammo = ship->autoammomax;
                  ship->energy = ship->maxenergy;
                  ship->chaff = ship->maxchaff;
                  ship->missiles = ship->maxmissiles;
       		  ship->torpedos = ship->maxtorpedos;
       		  ship->rockets = ship->maxrockets;
       		  ship->shield = 0;
       		  ship->autorecharge = FALSE;
       		  ship->autotrack = FALSE;
       		  ship->autospeed = FALSE;
       		  ship->interdictactive = FALSE;
       		  ship->hull = ship->maxhull;
       
       		  ship->missilestate = MISSILE_READY;
       		  ship->statet0 = LASER_READY;
       		  ship->statet1 = LASER_READY;
       		  ship->statet2 = LASER_READY;
	          ship->ionstate = LASER_READY;
                  ship->torpedostate = MISSILE_READY;
                  ship->rocketstate = MISSILE_READY;
       		  ship->shipstate = SHIP_DOCKED;
                  ship->shipstate2 = SHIP_READY;
                if (ship->energy == 0)
			  {
				  send_to_char("&RThis ship has no fuel, try installing a fuel module.\n\r",ch);
				  return;
			  }	

                if (ship->laserdamage == 0)
			  {
				  ship->laserdamage = 1;
			  }	

    		   if (ship->hatchopen)
    		   {
    		     ship->hatchopen = FALSE;
    		     sprintf( buf , "The hatch on %s closes." , ship->name);  
       	             echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
       	             echo_to_room( AT_YELLOW , get_room_index(ship->entrance) , "The hatch slides shut." );
       	             sound_to_room( get_room_index(ship->entrance) , "!!SOUND(door)" );
      		     sound_to_room( get_room_index(ship->location) , "!!SOUND(door)" );
       	           }
    		   set_char_color( AT_GREEN, ch );
    		   send_to_char( "Launch sequence initiated.\n\r", ch);
    		   act( AT_PLAIN, "$n starts up the ship and begins the launch sequence.", ch,
		        NULL, argument , TO_ROOM );
		   echo_to_ship( AT_YELLOW , ship , "The ship hums as it lifts off the ground.");
    		   sprintf( buf, "%s begins to launch.", ship->name );
    		   echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
    		   ship->shipstate = SHIP_LAUNCH;
    		   ship->currspeed = ship->realspeed;
    		   if ( ship->class == FIGHTER_SHIP )
                      learn_from_success( ch, gsn_starfighters );
                   if ( ship->class == MIDSIZE_SHIP )
                      learn_from_success( ch, gsn_midships );
                   if ( ship->class == CAPITAL_SHIP )
                      learn_from_success( ch, gsn_capitalships );
                   if ( ship->class == SUPERCAPITAL_SHIP )
                      learn_from_success( ch, gsn_supercapitalships );
                   if ( ship->class == FRIGATE_SHIP )
                      learn_from_success( ch, gsn_frigates );
                   if ( ship->class == SHIP_PLATFORM )
                      learn_from_success( ch, gsn_capitalships );
                   if ( ship->class == MOBILE_SUIT )
                      learn_from_success( ch, gsn_starfighters );
                   sound_to_ship(ship , "!!SOUND(xwing)" );  
                   return;   	   	
                }
                set_char_color( AT_RED, ch );
	        send_to_char("You fail to work the controls properly!\n\r",ch);
	        if ( ship->class == FIGHTER_SHIP )
                    learn_from_failure( ch, gsn_starfighters );
                if ( ship->class == MIDSIZE_SHIP )
    	            learn_from_failure( ch, gsn_midships );
                if ( ship->class == CAPITAL_SHIP )
                    learn_from_failure( ch, gsn_capitalships );
    	   	return;	
}

void launchship( SHIP_DATA *ship )
{   
    char buf[MAX_STRING_LENGTH];
    SHIP_DATA *target;
    int plusminus;
    SPACE_DATA *simul;
    for ( simul = first_starsystem; simul; simul = simul->next ) 
    {
    	if(!strcmp(simul->name,"Simulator\0"))
    	    break;
    }
    if(IS_SET(ship->flags, SHIPFLAG_SIMULATOR))
    {
    	ship_to_starsystem( ship, simul);
    }
    else
    {
        ship_to_starsystem( ship, starsystem_from_vnum( ship->location ) );
    } 
    
    if ( ship->starsystem == NULL && !IS_SET(ship->flags, SHIPFLAG_SIMULATOR ))
    {
       echo_to_room( AT_YELLOW , get_room_index(ship->pilotseat) , "Launch path blocked .. Launch aborted.");
       echo_to_ship( AT_YELLOW , ship , "The ship slowly sets back back down on the landing pad.");
       sprintf( buf ,  "%s slowly sets back down." ,ship->name );
       echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf ); 
       ship->shipstate = SHIP_DOCKED;
       return;
    }    
    
    if (ship->class == MIDSIZE_SHIP)
    {
       sound_to_room( get_room_index(ship->location) , "!!SOUND(falcon)" );
       sound_to_ship(ship , "!!SOUND(falcon)" );
    }
    else if (ship->type == SHIP_IMPERIAL )
    {
       sound_to_ship(ship , "!!SOUND(tie)" );  
       sound_to_room( get_room_index(ship->location) , "!!SOUND(tie)" );
    }
    else
    {
       sound_to_ship(ship , "!!SOUND(xwing)" );  
       sound_to_room( get_room_index(ship->location) , "!!SOUND(xwing)" );
    }
    
    extract_ship(ship);    

    ship->lastdoc = ship->location;
    ship->location = 0;
    
    if (ship->shipstate != SHIP_DISABLED)
       ship->shipstate = SHIP_READY;
    
    plusminus = number_range ( -1 , 2 );
    if (plusminus > 0 )
        ship->hx = 1;
    else
        ship->hx = -1;
    
    plusminus = number_range ( -1 , 2 );
    if (plusminus > 0 )
        ship->hy = 1;
    else
        ship->hy = -1;
        
    plusminus = number_range ( -1 , 2 );
    if (plusminus > 0 )
        ship->hz = 1;
    else
        ship->hz = -1;
    if ( IS_SET( ship->flags, SHIPFLAG_SIMULATOR ) )
    {
    	ship->vx = 1000 + number_range(1, 5000);
    	ship->vx = 1000 + number_range(1, 5000);
    	ship->vz = 1000 + number_range(1, 5000);
    }
    
    if (ship->lastdoc == ship->starsystem->doc1a ||
        ship->lastdoc == ship->starsystem->doc1b ||
        ship->lastdoc == ship->starsystem->doc1c )
    {
       ship->vx = ship->starsystem->p1x;
       ship->vy = ship->starsystem->p1y;
       ship->vz = ship->starsystem->p1z;
    }
    else if (ship->lastdoc == ship->starsystem->doc2a ||
             ship->lastdoc == ship->starsystem->doc2b ||
             ship->lastdoc == ship->starsystem->doc2c )
    {
       ship->vx = ship->starsystem->p2x;
       ship->vy = ship->starsystem->p2y;
       ship->vz = ship->starsystem->p2z;
    }
    else if (ship->lastdoc == ship->starsystem->doc3a ||
             ship->lastdoc == ship->starsystem->doc3b ||
             ship->lastdoc == ship->starsystem->doc3c )
    {
       ship->vx = ship->starsystem->p3x;
       ship->vy = ship->starsystem->p3y;
       ship->vz = ship->starsystem->p3z;
    }
    else 
    {
       for ( target = ship->starsystem->first_ship; target; target = target->next_in_starsystem )
       {       
          if (ship->lastdoc == target->hanger)
          {
             ship->vx = target->vx;
             ship->vy = target->vy;
             ship->vz = target->vz;
          }   
       }
    }
    
    ship->energy -= (100+100*ship->class);
         
    ship->vx += (ship->hx*ship->currspeed*2);
    ship->vy += (ship->hy*ship->currspeed*2);
    ship->vz += (ship->hz*ship->currspeed*2);
    
    echo_to_room( AT_GREEN , get_room_index(ship->location) , "Launch complete.\n\r");	
    echo_to_ship( AT_YELLOW , ship , "The ship leaves the platform far behind as it flies into space." );
    sprintf( buf ,"%s enters the starsystem at %.0f %.0f %.0f" , ship->name, ship->vx, ship->vy, ship->vz );
    echo_to_system( AT_YELLOW, ship, buf , NULL ); 
    sprintf( buf, "%s lifts off into space.", ship->name );
    echo_to_room( AT_YELLOW , get_room_index(ship->lastdoc) , buf );
                 
}

void do_land( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int chance;
    SHIP_DATA *ship;
    SHIP_DATA *target;
    int vx, vy ,vz;
    
    strcpy( arg, argument );
    
    	        if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
    	        {
    	            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( (ship = ship_from_pilotseat(ch->in_room->vnum)) == NULL )
    	        {
    	            send_to_char("&RYou need to be in the pilot seat!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( autofly(ship) )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
    	            return;
    	        }
    	        
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RYou can't land platforms\n\r" , ch );
                   return;
                }   
    
    	        if (ship->class >= FRIGATE_SHIP && ship->class < MOBILE_SUIT)
    	        {
    	            send_to_char("&RCapital ships are to big to land. You'll have to take a shuttle.\n\r",ch);
		    return;
    	        }
    	        if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ships drive is disabled. Unable to land.\n\r",ch);
    	            return;
    	        }
                if( IS_SET(ship->flags, SHIPFLAG_CLOAKED))
                {
                    send_to_char("They won't acknowledge a cloaked craft, decloak first.\n\r", ch);
                    return;
                }
    	        if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RThe ship is already docked!\n\r",ch);
    	            return;
    	        }

                if ((ship->shipstate2 == SHIP_DOCK) || (ship->shipstate2 == SHIP_DOCK_2))
                {
                    send_to_char("&RWait until after docking procedures are complete.\n\r", ch);
                    return;
                }
                if (ship->shipstate2 == SHIP_DOCK_3)
                {
                    send_to_char("&RDetach from the docked ship first.\r\n", ch);
                    return;
                }
    	                
               if (ship->shipstate == SHIP_HYPERSPACE)
               {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
               }
               if(IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
                {
                    send_to_char("&RYou need to turn off your afterburners.\n\r", ch);
                    return;
                }
               if(IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
               {
                   send_to_char("&RNot while your overdrive node is active.\n\r", ch);
                   return;
               }
    	        if (ship->shipstate != SHIP_READY)
    	        {
    	            send_to_char("&RPlease wait until the ship has finished its current maneuver.\n\r",ch);
    	            return;
    	        }
    	        if ( ship->starsystem == NULL )
    	        {
    	            send_to_char("&RThere's nowhere to land around here!",ch);
    	            return;
    	        }
    	        
    	        if ( ship->energy < (25 + 25*ship->class) )
    	        {
    	           send_to_char("&RTheres not enough fuel!\n\r",ch);
    	           return;
    	        }
    	        
    	        if ( argument[0] == '\0' )
    	        {  
    	           set_char_color(  AT_CYAN, ch );
    	           ch_printf(ch, "%s" , "Land where?\n\r\n\rChoices: ");   	           
    	           
    	        if ( ship->starsystem->doc1a ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location1a,
    	                        ship->starsystem->planet1,
    	                        ship->starsystem->p1x,
    	                        ship->starsystem->p1y,
    	                        ship->starsystem->p1z ); 
    	        if ( ship->starsystem->doc1b ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location1b,
    	                        ship->starsystem->planet1,
    	                        ship->starsystem->p1x,
    	                        ship->starsystem->p1y,
    	                        ship->starsystem->p1z ); 
    	        if ( ship->starsystem->doc1c ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location1c,
    	                        ship->starsystem->planet1,
    	                        ship->starsystem->p1x,
    	                        ship->starsystem->p1y,
    	                        ship->starsystem->p1z ); 
    	        if ( ship->starsystem->doc2a ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location2a,
    	                        ship->starsystem->planet2,
    	                        ship->starsystem->p2x,
    	                        ship->starsystem->p2y,
    	                        ship->starsystem->p2z ); 
    	        if ( ship->starsystem->doc2b ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location2b,
    	                        ship->starsystem->planet2,
    	                        ship->starsystem->p2x,
    	                        ship->starsystem->p2y,
    	                        ship->starsystem->p2z ); 
    	        if ( ship->starsystem->doc2c ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location2c,
    	                        ship->starsystem->planet2,
    	                        ship->starsystem->p2x,
    	                        ship->starsystem->p2y,
    	                        ship->starsystem->p2z ); 
    	        if ( ship->starsystem->doc3a ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location3a,
    	                        ship->starsystem->planet3,
    	                        ship->starsystem->p3x,
    	                        ship->starsystem->p3y,
    	                        ship->starsystem->p3z ); 
    	        if ( ship->starsystem->doc3b ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location3b,
    	                        ship->starsystem->planet3,
    	                        ship->starsystem->p3x,
    	                        ship->starsystem->p3y,
    	                        ship->starsystem->p3z ); 
    	        if ( ship->starsystem->doc3c ) 
    	             ch_printf(ch, "%s (%s)  %d %d %d\n\r         " , 
    	                        ship->starsystem->location3c,
    	                        ship->starsystem->planet3,
    	                        ship->starsystem->p3x,
    	                        ship->starsystem->p3y,
    	                        ship->starsystem->p3z ); 
    	           for ( target = ship->starsystem->first_ship; target; target = target->next_in_starsystem )
                   {       
                        if ( target->hanger > 0 && target != ship) 
                           ch_printf(ch, "%s    %.0f %.0f %.0f\n\r         ", 
                           	target->name,
                           	target->vx,
                           	target->vy,
                           	target->vz);
                   }  
                   ch_printf(ch, "\n\rYour Coordinates: %.0f %.0f %.0f\n\r" , 
                             ship->vx , ship->vy, ship->vz);   
                   return;
    	        }
    	        
    	        if ( str_prefix(argument,ship->starsystem->location1a) &&
    	             str_prefix(argument,ship->starsystem->location2a) &&
    	             str_prefix(argument,ship->starsystem->location3a) &&
    	             str_prefix(argument,ship->starsystem->location1b) &&
    	             str_prefix(argument,ship->starsystem->location2b) &&
    	             str_prefix(argument,ship->starsystem->location3b) &&
    	             str_prefix(argument,ship->starsystem->location1c) &&
    	             str_prefix(argument,ship->starsystem->location2c) &&
    	             str_prefix(argument,ship->starsystem->location3c)
    	             )
    	        { 
    	            target = get_ship_here( argument , ship->starsystem );
    	            if ( target == NULL || IS_SET(target->flags, SHIPFLAG_CLOAKED) )
    	            {
    	                send_to_char("&RI don't see that here. Type land by itself for a list\n\r",ch);
    	                return;
    	            } 
    	            if ( target == ship )
    	            {
    	                send_to_char("&RYou can't land your ship inside itself!\n\r",ch);
    	                return;
    	            } 
    	            if ( ! target->hanger )
    	            {
    	                send_to_char("&RThat ship has no hangar for you to land in!\n\r",ch);
    	                return;
    	            }
    	            if ( ship->class == MIDSIZE_SHIP && target->class == MIDSIZE_SHIP )
    	            {
    	                send_to_char("&RThat ship is not big enough for your ship to land in!\n\r",ch);
    	                return;
    	            }
    	            if ( ! target->bayopen )
    	            {
    	                send_to_char("&RTheir hangar is closed. You'll have to ask them to open it for you\n\r",ch);
    	                return;
    	            }
    	            if (  (target->vx > ship->vx + 200) || (target->vx < ship->vx - 200) ||
    	                  (target->vy > ship->vy + 200) || (target->vy < ship->vy - 200) ||
    	                  (target->vz > ship->vz + 200) || (target->vz < ship->vz - 200) )
    	            {
    	                send_to_char("&R That ship is too far away! You'll have to fly a little closer.\n\r",ch);
    	                return;
    	            }       
    	        }
                else
                {
                    if ( !str_prefix(argument,ship->starsystem->location3a) || 
                         !str_prefix(argument,ship->starsystem->location3b) ||
                         !str_prefix(argument,ship->starsystem->location3c) )
                    {
                       vx = ship->starsystem->p3x;
                       vy = ship->starsystem->p3y;
                       vz = ship->starsystem->p3z;
                    }
    		    if ( !str_prefix(argument,ship->starsystem->location2a) || 
                         !str_prefix(argument,ship->starsystem->location2b) ||
                         !str_prefix(argument,ship->starsystem->location2c) )
                    {
                       vx = ship->starsystem->p2x;
                       vy = ship->starsystem->p2y;
                       vz = ship->starsystem->p2z;
                    }
    		    if ( !str_prefix(argument,ship->starsystem->location1a) || 
                         !str_prefix(argument,ship->starsystem->location1b) ||
                         !str_prefix(argument,ship->starsystem->location1c) )
                    {
                       vx = ship->starsystem->p1x;
                       vy = ship->starsystem->p1y;
                       vz = ship->starsystem->p1z;
                    }
    		    if (  (vx > ship->vx + 200) || (vx < ship->vx - 200) ||
    	                  (vy > ship->vy + 200) || (vy < ship->vy - 200) ||
    	                  (vz > ship->vz + 200) || (vz < ship->vz - 200) )
    	            {
    	                send_to_char("&R That platform is too far away! You'll have to fly a little closer.\n\r",ch);
    	                return;
    	            }                    
                }
                
                if ( ship->class == FIGHTER_SHIP ) 
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MOBILE_SUIT ) 
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MIDSIZE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_midships]) ;
                if ( number_percent( ) < chance )
    		{
    		   set_char_color( AT_GREEN, ch );
    		   send_to_char( "Landing sequence initiated.\n\r", ch);
    		   act( AT_PLAIN, "$n begins the landing sequence.", ch,
		        NULL, argument , TO_ROOM );
		   echo_to_ship( AT_YELLOW , ship , "The ship slowly begins its landing aproach.");
    		   ship->dest = STRALLOC(arg);
    		   ship->shipstate = SHIP_LAND;
                   ship->shipstate2 = SHIP_READY;
    		   ship->currspeed = 0;
	           if ( ship->class == MOBILE_SUIT )
                      learn_from_success( ch, gsn_starfighters );
	           if ( ship->class == FIGHTER_SHIP )
                      learn_from_success( ch, gsn_starfighters );
                   if ( ship->class == MIDSIZE_SHIP )
                      learn_from_success( ch, gsn_midships );
                   if ( starsystem_from_vnum(ship->lastdoc) != ship->starsystem )
                   {   
                      int xp =  (exp_level( ch->skill_level[PILOTING_ABILITY]+1) - exp_level( ch->skill_level[PILOTING_ABILITY])) ;
                      xp = UMIN( get_ship_value( ship ) , xp );
                      gain_exp( ch , xp , PILOTING_ABILITY );
                      ch_printf( ch, "&WYou gain %ld points of flight experience!\n\r", UMIN( get_ship_value( ship ) , xp ) );
//                      ch_printf( ch, "&WYou would have gained %ld points of flight experience (but Garboth kept abusing the land bug)!\n\r", UMIN( get_ship_value( ship ) , xp ) );
                   }
                   return;
	        }
	        send_to_char("You fail to work the controls properly.\n\r",ch);
	        if ( ship->class == FIGHTER_SHIP )
                    learn_from_failure( ch, gsn_starfighters );
	        if ( ship->class == MOBILE_SUIT )
                    learn_from_failure( ch, gsn_starfighters );
	        if ( ship->class == MIDSIZE_SHIP )
    	            learn_from_failure( ch, gsn_midships );
    	   	return;	
}

void landship( SHIP_DATA *ship, char *arg )
{    
    SHIP_DATA *target;
    char buf[MAX_STRING_LENGTH];
    int destination;
    
    if ( !str_prefix(arg,ship->starsystem->location3a) )
       destination = ship->starsystem->doc3a;
    if ( !str_prefix(arg,ship->starsystem->location3b) )
       destination = ship->starsystem->doc3b;
    if ( !str_prefix(arg,ship->starsystem->location3c) )
       destination = ship->starsystem->doc3c;
    if ( !str_prefix(arg,ship->starsystem->location2a) )
       destination = ship->starsystem->doc2a;
    if ( !str_prefix(arg,ship->starsystem->location2b) )
       destination = ship->starsystem->doc2b;
    if ( !str_prefix(arg,ship->starsystem->location2c) )
       destination = ship->starsystem->doc2c;
    if ( !str_prefix(arg,ship->starsystem->location1a) )
       destination = ship->starsystem->doc1a;
    if ( !str_prefix(arg,ship->starsystem->location1b) )
       destination = ship->starsystem->doc1b;
    if ( !str_prefix(arg,ship->starsystem->location1c) )
       destination = ship->starsystem->doc1c;
    
    target = get_ship_here( arg , ship->starsystem );
    if ( target != ship && target != NULL && target->bayopen 
            && ( ship->class != MIDSIZE_SHIP || target->class != MIDSIZE_SHIP ) )
    destination = target->hanger;
     
    if ( !ship_to_room( ship , destination ) )
    {
       echo_to_room( AT_YELLOW , get_room_index(ship->pilotseat), "Could not complete aproach. Landing aborted.");
       echo_to_ship( AT_YELLOW , ship , "The ship pulls back up out of its landing sequence.");
       if (ship->shipstate != SHIP_DISABLED)
           ship->shipstate = SHIP_READY;
       return;
    }      
         
    echo_to_room( AT_YELLOW , get_room_index(ship->pilotseat), "Landing sequence complete.");
    echo_to_ship( AT_YELLOW , ship , "You feel a slight thud as the ship sets down on the ground."); 
    sprintf( buf ,"%s disapears from your scanner." , ship->name  );
    echo_to_system( AT_YELLOW, ship, buf , NULL );
    
    ship->location = destination;
    ship->lastdoc = ship->location;
    if (ship->shipstate != SHIP_DISABLED)
       ship->shipstate = SHIP_DOCKED;
    ship_from_starsystem(ship, ship->starsystem);
    
    sprintf( buf, "%s lands on the platform.", ship->name );
    echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
    
    ship->energy = ship->energy - 25 - 25*ship->class;
    
    if ( !str_cmp("Public",ship->owner) )
    {
       ship->energy = ship->maxenergy;
       ship->chaff = ship->maxchaff;
       ship->missiles = ship->maxmissiles;
       ship->torpedos = ship->maxtorpedos;
       ship->rockets = ship->maxrockets;
       ship->shield = 0;
       ship->autorecharge = FALSE;
       ship->autotrack = FALSE;
       ship->autospeed = FALSE;
       ship->hull = ship->maxhull;
       
       ship->missilestate = MISSILE_READY;
       ship->statet0 = LASER_READY;
       ship->statet1 = LASER_READY;
       ship->ionstate = LASER_READY;
       ship->statet2 = LASER_READY;
       ship->shipstate = SHIP_DOCKED;
       
       echo_to_cockpit( AT_YELLOW , ship , "Repairing and refueling ship..." );
    }
    
       save_ship(ship);   
}

void do_accelerate( CHAR_DATA *ch, char *argument )
{
    int chance;
    int change;
    SHIP_DATA *ship;
    char buf[MAX_STRING_LENGTH];
    float fuelnegative = 1.0; /* for burn and overdrive, default is 1 */

    	        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
    	            return;
    	        }
                
                if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
                if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RThe controls must be at the pilots chair...\n\r",ch);
    	            return;
    	        }
                
                if ( autofly(ship) )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
    	            return;
    	        }
    	        
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RPlatforms can't move!\n\r" , ch );
                   return;
                }   

                if (ship->shipstate == SHIP_HYPERSPACE)
                {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
                }
                if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ships drive is disabled. Unable to accelerate.\n\r",ch);
    	            return;
    	        }
    	        if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
    	            return;
    	        }

                if ((ship->shipstate2 == SHIP_DOCK) || (ship->shipstate2 == SHIP_DOCK_2))
                {
                    send_to_char("&RNot while docking procedures are going on.\n\r", ch);
                    return;
                }
                
                if (ship->shipstate2 == SHIP_DOCK_3)
                {
                    send_to_char("&RDetach from the docked ship first.\n\r",ch);
                    return;
                }

                if(IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
                {
                    fuelnegative = 2;
                }
                else if(IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
                {
                    fuelnegative = 1.5;
                }

                if(IS_SET(ship->flags,  SHIPFLAG_SABOTAGEDENGINE))
                {
                   echo_to_cockpit( AT_BLUE , ship , "There is a small explosion and then your ship stops moving. It must have been sabotage!\n\r");
                   echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!");
                   ship->shipstate = SHIP_DISABLED;
                   ship->currspeed = 0;
                   send_to_char( "&GDecelerating\n\r", ch);
                   echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
                   sprintf( buf, "%s begins to slow down." , ship->name );
                   echo_to_system( AT_ORANGE , ship , buf , NULL );
                   REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
                   return;
                }    
	        if ( ship->energy < (int) abs((atoi(argument)-abs(ship->currspeed)*fuelnegative)/10) )
    	        {
    	           send_to_char("&RTheres not enough fuel!\n\r",ch);
    	           return;
    	        }
                                
    	        if ( ship->class == FIGHTER_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MOBILE_SUIT )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MIDSIZE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_midships]) ;
                if ( ship->class == FRIGATE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_frigates]) ;
                if ( ship->class == CAPITAL_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_capitalships]);
                if ( ship->class == SUPERCAPITAL_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_supercapitalships]) ;
                if ( number_percent( ) >= chance )
    		{
	           send_to_char("&RYou fail to work the controls properly.\n\r",ch);
	           if ( ship->class == FIGHTER_SHIP )
                      learn_from_failure( ch, gsn_starfighters );
	           if ( ship->class == MOBILE_SUIT )
                      learn_from_failure( ch, gsn_starfighters );
	           if ( ship->class == FRIGATE_SHIP )
                      learn_from_failure( ch, gsn_frigates );
	           if ( ship->class == SUPERCAPITAL_SHIP )
                      learn_from_failure( ch, gsn_supercapitalships );
                   if ( ship->class == MIDSIZE_SHIP )
    	              learn_from_failure( ch, gsn_midships );
                   if ( ship->class == CAPITAL_SHIP )
                      learn_from_failure( ch, gsn_capitalships );
    	   	   return;	
                }
                
    change = atoi(argument);
                      
    act( AT_PLAIN, "$n manipulates the ships controls.", ch,
    NULL, argument , TO_ROOM );
    
    if ( change > ship->currspeed )
    {
       send_to_char( "&GAccelerating\n\r", ch);
       echo_to_cockpit( AT_YELLOW , ship , "The ship begins to accelerate.");
       if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED))
       {
          sprintf( buf, "%s begins to speed up." , ship->name );
          echo_to_system( AT_ORANGE , ship , buf , NULL );
       }
    }
    
    if ( change < ship->currspeed )
    {
       send_to_char( "&GDecelerating\n\r", ch);
       echo_to_cockpit( AT_YELLOW , ship , "The ship begins to slow down.");
       if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED))
       {
          sprintf( buf, "%s begins to slow down." , ship->name );
          echo_to_system( AT_ORANGE , ship , buf , NULL );
       }
    }
    		     
    ship->energy -= (int) abs((change-abs(ship->currspeed)*fuelnegative)/10);
    
    ship->currspeed = URANGE( 0 , change , (int) ship->realspeed * speedbonus(ship));         
         
    if ( ship->class == FIGHTER_SHIP )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MOBILE_SUIT )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MIDSIZE_SHIP )
        learn_from_success( ch, gsn_midships );
    if ( ship->class == FRIGATE_SHIP )
        learn_from_success( ch, gsn_frigates );
    if ( ship->class == CAPITAL_SHIP )
        learn_from_success( ch, gsn_capitalships );
    if ( ship->class == SUPERCAPITAL_SHIP )
        learn_from_success( ch, gsn_supercapitalships );
    	
}

void do_trajectory( CHAR_DATA *ch, char *argument )
{
    char  buf[MAX_STRING_LENGTH];
    char  arg2[MAX_INPUT_LENGTH];
    char  arg3[MAX_INPUT_LENGTH];
    int chance;
    float vx,vy,vz;
    SHIP_DATA *ship;
    
  
    	        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
    	            return;
    	        }
                
                if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
                if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYour not in the pilots seat.\n\r",ch);
    	            return;
    	        }
                
                if ( autofly(ship))
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
    	            return;
    	        }
    	        
                if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ships drive is disabled. Unable to manuever.\n\r",ch);
    	            return;
    	        }
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RPlatforms can't turn!\n\r" , ch );
                   return;
                }   

    	        if (ship->shipstate == SHIP_HYPERSPACE)
                {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
                }
    	        if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
    	            return;
    	        }
    	        if (ship->shipstate != SHIP_READY)
    	        {
    	            send_to_char("&RPlease wait until the ship has finished its current maneuver.\n\r",ch);
    	            return;
    	        }

                if(IS_SET(ship->flags,  SHIPFLAG_SABOTAGEDENGINE))
                {
                    echo_to_cockpit( AT_BLUE , ship , "There is a small explosion and then your ship stops moving. It must have been sabotage!\n\r");
                    echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!");
                    ship->shipstate = SHIP_DISABLED;
                    ship->currspeed = 0;
                    REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
                }
    	        if ( ship->energy < (ship->currspeed/10) )
    	        {
    	           send_to_char("&RTheres not enough fuel!\n\r",ch);
    	           return;
    	        }
    	        
                if ( ship->class == FIGHTER_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MOBILE_SUIT )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MIDSIZE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_midships]) ;
                if ( ship->class == FRIGATE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_frigates]) ;
                if ( ship->class == CAPITAL_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_capitalships]);
                if ( ship->class == SUPERCAPITAL_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_supercapitalships]);
                if ( number_percent( ) > chance )
    		{ 
	        send_to_char("&RYou fail to work the controls properly.\n\r",ch);
	        if ( ship->class == FIGHTER_SHIP )
                    learn_from_failure( ch, gsn_starfighters );
	        if ( ship->class == MOBILE_SUIT )
                    learn_from_failure( ch, gsn_starfighters );
                if ( ship->class == MIDSIZE_SHIP )
    	            learn_from_failure( ch, gsn_midships );
                if ( ship->class == FRIGATE_SHIP )
    	            learn_from_failure( ch, gsn_frigates );
                if ( ship->class == CAPITAL_SHIP )
                    learn_from_failure( ch, gsn_capitalships );
                if ( ship->class == SUPERCAPITAL_SHIP )
                    learn_from_failure( ch, gsn_supercapitalships );
    	   	return;	
    	        }
    	
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );
            
    vx = atof( arg2 );
    vy = atof( arg3 );
    vz = atof( argument );
            
    if ( vx == ship->vx && vy == ship->vy && vz == ship->vz )
    {
       ch_printf( ch , "The ship is already at %.0f %.0f %.0f !" ,vx,vy,vz);
    }
                
    ship->hx = vx - ship->vx;
    ship->hy = vy - ship->vy;
    ship->hz = vz - ship->vz;
    
    ship->energy -= (ship->currspeed/10);
       
    ch_printf( ch ,"&GNew course set, aproaching %.0f %.0f %.0f.\n\r" , vx,vy,vz );            
    act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
                         
    echo_to_cockpit( AT_YELLOW ,ship, "The ship begins to turn.\n\r" );                        
    if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED))
    {
       sprintf( buf, "%s turns altering its present course." , ship->name );
       echo_to_system( AT_ORANGE , ship , buf , NULL );
    }                                                        
    if ( ship->class == FIGHTER_SHIP || ship->class == MOBILE_SUIT || ( ship->class == MIDSIZE_SHIP && ship->manuever > 50 ) )
        ship->shipstate = SHIP_BUSY_3;
    else if ( ship->class == MIDSIZE_SHIP || ( ship->class == CAPITAL_SHIP && ship->manuever > 50 ) )
        ship->shipstate = SHIP_BUSY_2;
    else
        ship->shipstate = SHIP_BUSY;     
   
    if ( ship->class == FIGHTER_SHIP )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MOBILE_SUIT )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MIDSIZE_SHIP )
        learn_from_success( ch, gsn_midships );
    if ( ship->class == FRIGATE_SHIP )
        learn_from_success( ch, gsn_frigates );
    if ( ship->class == CAPITAL_SHIP )
        learn_from_success( ch, gsn_capitalships );
    if ( ship->class == SUPERCAPITAL_SHIP )
        learn_from_success( ch, gsn_supercapitalships );
    	
}


void do_buyship(CHAR_DATA *ch, char *argument )
{
    long         price;
    SHIP_DATA   *ship;

   if ( IS_NPC(ch) || !ch->pcdata )
   {
   	send_to_char( "&ROnly players can do that!\n\r" ,ch );
   	return;
   }

   ship = ship_in_room( ch->in_room , argument );
   if ( !ship )
   {
      ship = ship_from_cockpit( ch->in_room->vnum );
      
      if ( !ship )
      {            
           act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
           return;
      }
   }
   
   if ( str_cmp( ship->owner , "" )  || ship->type == MOB_SHIP )
   {
   	send_to_char( "&RThat ship isn't for sale!" ,ch );
   	return;
   }


   if ( ship->type == SHIP_IMPERIAL )
   {
        if ( !ch->pcdata->clan || str_cmp( ch->pcdata->clan->name , "The Empire" ) )
        {
   	 if ( !ch->pcdata->clan || !ch->pcdata->clan->mainclan || str_cmp( ch->pcdata->clan->mainclan->name , "The Empire" ) )
   	 {
           send_to_char( "&RThat ship may only be purchaced by members of The Empire!\n\r" ,ch );
   	   return;
   	 }
   	}
   }
   else if ( ship->type == SHIP_REPUBLIC )
   {
        if ( !ch->pcdata->clan || str_cmp( ch->pcdata->clan->name , "New Republic" ) )
        {
         if ( !ch->pcdata->clan ||  !ch->pcdata->clan->mainclan || str_cmp( ch->pcdata->clan->mainclan->name , "New Republic" ) ) 
   	 {
   	  send_to_char( "&RThat ship may only be purchaced by members of the Republic!\n\r" ,ch );
   	  return;
         }
   	}
   }

   else if ( ship->type == SHIP_VONG )
   {
        if ( !ch->pcdata->clan || str_cmp( ch->pcdata->clan->name , "Yuuzhan Vong" ) )
        {
         if ( !ch->pcdata->clan ||  !ch->pcdata->clan->mainclan || str_cmp( ch->pcdata->clan->mainclan->name , "Yuuzhan Vong" ) ) 
   	 {
   	  send_to_char( "&RThat ship may only be purchaced by members of the Vong!\n\r" ,ch );
   	  return;
         }
   	}
   }

/************

Commented out in favour of allowing clanmembers to purchase all ships, not just clan ones
-Raijen, 9/14/01

   else 
   {
       if ( ch->pcdata->clan && 
       ( !str_cmp( ch->pcdata->clan->name , "Rebellion" ) || 
       ( ch->pcdata->clan->mainclan && !str_cmp(ch->pcdata->clan->mainclan->name ,"Rebellion") )
       ) )
       {
   	  send_to_char( "&RAs a member of the Rebellion you may only purchase Rebel!\n\r" ,ch );
   	  return;       
       }        
       if ( ch->pcdata->clan && 
       ( !str_cmp( ch->pcdata->clan->name , "The-Empire" ) || 
       ( ch->pcdata->clan->mainclan && !str_cmp(ch->pcdata->clan->mainclan->name ,"The-Empire") )
       ) )
       {
   	  send_to_char( "&RAs a member of The Empire you may only purchase Imperial Ships!\n\r" ,ch );
   	  return;       
       }        
   }

**************/
      
   price = get_ship_value( ship );
    
    if ( ch->gold < price )
    {
       ch_printf(ch, "&RThis ship costs %ld. You don't have enough credits!\n\r" , price );
       return;
    }
    
    ch->gold -= price;
    ch_printf(ch, "&GYou pay %ld credits to purchace the ship.\n\r" , price );   

    act( AT_PLAIN, "$n walks over to a terminal and makes a credit transaction.",ch,
       NULL, argument , TO_ROOM );
    
    	STRFREE( ship->owner );
	ship->owner = STRALLOC( ch->name );
	save_ship( ship );
                 
}

void do_clanbuyship(CHAR_DATA *ch, char *argument )
{
    long         price;
    SHIP_DATA   *ship;
    CLAN_DATA   *clan;
    CLAN_DATA   *mainclan;
       
   if ( IS_NPC(ch) || !ch->pcdata )
   {
   	send_to_char( "&ROnly players can do that!\n\r" ,ch );
   	return;
   }
   if ( !ch->pcdata->clan )
   {
   	send_to_char( "&RYou aren't a member of any organizations!\n\r" ,ch );
   	return;
   }
   
   clan = ch->pcdata->clan;
   mainclan = ch->pcdata->clan->mainclan ? ch->pcdata->clan->mainclan : clan;
   
   if ( ( ch->pcdata->bestowments
    &&    is_name("clanbuyship", ch->pcdata->bestowments))
    ||   !str_cmp( ch->name, clan->leader  ))
	;
   else
   {
   	send_to_char( "&RYour organization hasn't seen fit to bestow you with that ability.\n\r" ,ch );
   	return;
   }
	
   ship = ship_in_room( ch->in_room , argument );
   if ( !ship )
   {
      ship = ship_from_cockpit( ch->in_room->vnum );
      
      if ( !ship )
      {            
           act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
           return;
      }
   }

   if ( str_cmp( ship->owner , "" )  || ship->type == MOB_SHIP )
   {
   	send_to_char( "&RThat ship isn't for sale!\n\r" ,ch );
   	return;
   }
   
   if ( str_cmp( mainclan->name , "The Empire" )  && ship->type == SHIP_IMPERIAL ) 
   {
   	   send_to_char( "&RThat ship may only be purchaced by the Empire!\n\r" ,ch );
   	   return;
   }
   
   if ( str_cmp( mainclan->name , "Yuuzhan Vong" )  && ship->type == SHIP_VONG )
   {
   	send_to_char( "&RThat ship may only be purchaced by the Yuuzhan Vong!\n\r" ,ch );
   	return;
   }

  if ( str_cmp( mainclan->name , "New Republic" )  && ship->type == SHIP_REPUBLIC )
   {
   	send_to_char( "&RThat ship may only be purchaced by The New Republic!\n\r" ,ch );
   	return;
   }
   
/***********

   if ( !str_cmp( mainclan->name , "The-Empire" )  && ship->type != SHIP_IMPERIAL )
   {
   	send_to_char( "&RDue to contractual agreements that ship may not be purchaced by the empire!\n\r" ,ch );
   	return;
   }
   
   if ( !str_cmp( mainclan->name , "Rebellion" )  && ship->type != SHIP_REPUBLIC )
   {
   	send_to_char( "&RBecause of contractual agreements, the NR can only purchase NR ships!\n\r" ,ch );
   	return;
   }
*******************/
   
   price = get_ship_value( ship );
    
    if ( ch->pcdata->clan->funds < price )
    {
       ch_printf(ch, "&RThis ship costs %ld. You don't have enough credits!\n\r" , price );
       return;
    }
    
    clan->funds -= price;
    ch_printf(ch, "&G%s pays %ld credits to purchace the ship.\n\r", clan->name , price );   

    act( AT_PLAIN, "$n walks over to a terminal and makes a credit transaction.",ch,
       NULL, argument , TO_ROOM );
    
    	STRFREE( ship->owner );
	ship->owner = STRALLOC( clan->name );
	save_ship( ship );
               
   if ( ship->class <= SHIP_PLATFORM )
             clan->spacecraft++;
   else
             clan->vehicles++;
}

void do_sellship(CHAR_DATA *ch, char *argument )
{
    long         price;
    SHIP_DATA   *ship;

   ship = ship_in_room( ch->in_room , argument );
   if ( !ship )
   {
            act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
           return;
   }

   if ( str_cmp( ship->owner , ch->name ) )
   {
   	send_to_char( "&RThat isn't your ship!" ,ch );
   	return;
   }
   
   price = get_ship_value( ship );
    
    ch->gold += ( price - price/10 );
    ch_printf(ch, "&GYou receive %ld credits from selling your ship.\n\r" , price - price/10 );   

    act( AT_PLAIN, "$n walks over to a terminal and makes a credit transaction.",ch,
       NULL, argument , TO_ROOM );
 
	STRFREE( ship->owner );
        STRFREE( ship->pilot );
        STRFREE( ship->copilot );
	ship->owner = STRALLOC( "" );
        ship->pilot = STRALLOC( "" );
        ship->copilot = STRALLOC( "" );
	save_ship( ship );

}

/* Clansellship by Arcturus */
void do_clansellship(CHAR_DATA *ch, char *argument )
{
    long         price;
    SHIP_DATA   *ship;
    CLAN_DATA   *clan;
    CLAN_DATA   *mainclan;

   ship = ship_in_room( ch->in_room , argument );
   if ( !ship )
   {
            act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
           return;
   }

   if ( !ch->pcdata->clan )
   {
        send_to_char( "&RYou aren't a member of any organizations!\n\r" ,ch );
        return;
   }
   clan = ch->pcdata->clan;
   mainclan = ch->pcdata->clan->mainclan ? ch->pcdata->clan->mainclan : clan;

   if ( str_cmp( ship->owner , clan->name ) )
   {
        send_to_char( "&RThat isn't your ship!" ,ch );
        return;
   }

   if ( ( ch->pcdata->bestowments
    &&    is_name("clansellship", ch->pcdata->bestowments))
    ||   !str_cmp( ch->name, clan->leader  ))
        ;
   else
   {
        send_to_char( "&RYour organization hasn't seen fit to bestow you with that ability.\n\r" ,ch );
        return;
   }
   price = get_ship_value( ship );

   clan->funds += price; 
   ch_printf(ch, "&GYour clan receives %ld credits from selling your ship.\n\r" , price - price/10 );

    act( AT_PLAIN, "$n walks over to a terminal and makes a credit transaction.",ch,
       NULL, argument , TO_ROOM );

        STRFREE( ship->owner );
        STRFREE( ship->pilot );
        STRFREE( ship->copilot );
        ship->owner = STRALLOC( "" );
        ship->pilot = STRALLOC( "" );
        ship->copilot = STRALLOC( "" );
        save_ship( ship );
   if ( ship->class <= SHIP_PLATFORM )
             clan->spacecraft--;
   else
             clan->vehicles--;

}

void do_info(CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    SHIP_DATA *target;
   
    if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    {
            if ( argument[0] == '\0' )
            {
               act( AT_PLAIN, "Which ship do you want info on?.", ch, NULL, NULL, TO_CHAR );
               return;
            }
    
            ship = ship_in_room( ch->in_room , argument );
            if ( !ship )
            {
               act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
               return;
            }

            target = ship;
    }
    else if (argument[0] == '\0')
       target = ship;
    else
       target = get_ship_here( argument , ship->starsystem );
    	
    if ( target == NULL || (IS_SET(target->flags, SHIPFLAG_CLOAKED) && ship != target))
    {
         send_to_char("&RI don't see that here.\n\rTry the radar, or type info by itself for info on this ship.\n\r",ch);
         return;
    }          
    
    if ( abs(target->vx - ship->vx) > 100+ship->sensor*40 ||
         abs(target->vy - ship->vy) > 100+ship->sensor*40 ||
         abs(target->vz - ship->vz) > 100+ship->sensor*40 )  
    {
         send_to_char("&RThat ship is to far away to scan.\n\r",ch);
         return;
    }
    
    ch_printf( ch, "&Y%s %s : %s\n\r&B",
			target->type == SHIP_REPUBLIC ? "Republic" :
			(ship->type == SHIP_VONG ? "Yuuzhan Vong" : 
		       (target->type == SHIP_IMPERIAL ? "Imperial" : "Civilian" )),
		        target->class == FIGHTER_SHIP ? "Starfighter" :
		       (target->class == MIDSIZE_SHIP ? "Midtarget" : 
		       (target->class == CAPITAL_SHIP ? "Capital Ship" :
		       (target->class == SHIP_PLATFORM ? "Platform" : 
		       (target->class == CLOUD_CAR ? "Cloudcar" : 
		       (target->class == FRIGATE_SHIP ? "Frigate" : 
		       (target->class == LAND_SPEEDER ? "Speeder" : 
		       (target->class == SUPERCAPITAL_SHIP ? "SuperCapital" : 
		       (target->class == MOBILE_SUIT ? "Coralskipper" : 
		       (target->class == WALKER ? "Walker" : "Unknown" ) )  ) ) ) ) ) ) ), 
    			target->name,
    			target->filename);
    ch_printf( ch, "Description: %s\n\rOwner: %s   Pilot: %s   Copilot: %s\n\r",
    			target->description,
    			target->owner, target->pilot,  target->copilot );
    ch_printf( ch, "Laser cannons: %d ",
    			target->lasers);				
    ch_printf( ch, "Ion Cannons: %d ",
    			target->ions);				
    ch_printf( ch, "LaserPower: %d\n\r",
    			target->laserdamage);				
    ch_printf( ch, "Max Missiles: %d  Missile Launchers: %d\n\r",
       			target->maxmissiles, target->mlaunchers);		
    ch_printf( ch, "Max Torpedos: %d  Torpedo Launchers: %d\n\r",
                        target->maxtorpedos, target->tlaunchers);
    ch_printf( ch, "Max Rockets:  %d   Rocket Launchers: %d \n\r",
                        target->maxrockets,  target->rlaunchers);
   // ch_printf( ch, "Max Chaff: %d\n\r",
//       			target->maxchaff);		
    if (target->overdrive == 1)
    {
      send_to_char( "&YSLAM Overdrive System Installed!!!&B\n\r", ch);
    }
    if ( target->autocannon == 1)
    {
      ch_printf( ch, "&YAutocannon installed. %d shots at %d strength max&B\n\r",
    			target->autoammomax,
			target->autodamage );				
    }
    if ( target->interdict == 1)
    {
      send_to_char( "&YInterdiction System Installed!!!&B\n\r", ch );
    }
    if( IS_SET(target->flags, SHIPFLAG_SIMULATOR))
    {
      send_to_char("&YThis Craft is a Ship Simulator!!&B\n\r", ch);
    }
    if(ship->cloak == 1)
      send_to_char("&YThis craft has a Cloaking Device!!&B\n\r", ch);
    ch_printf( ch, "Max Hull: %d  ",
                        target->maxhull);
    ch_printf( ch, "Armor ( %d/%d )  Max Chaff: %d\n\r",
			target->armor,
			target->maxarmor, target->maxchaff);
    ch_printf( ch, "Max Shields: %d   Max Energy(fuel): %d\n\r",
                        target->maxshield,
    		        target->maxenergy);
//    ch_printf( ch, "Maximum Speed: %d   Hyperspeed: %d\n\r",                        target->realspeed, target->hyperspeed );                    
    ch_printf( ch, "Maximum Speed: %d   Hyperspeed: %d  Maximum Cargo: %d\n\r",
                        target->realspeed, target->hyperspeed,
                        target->maxcargo );
    act( AT_PLAIN, "$n checks various gages and displays on the control panel.", ch,
         NULL, argument , TO_ROOM );
	  
}

void do_autorecharge(CHAR_DATA *ch, char *argument )
{
    int chance;
    SHIP_DATA *ship;
    int recharge;
    
        
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        
        if (  (ship = ship_from_coseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the co-pilots seat!\n\r",ch);
            return;
        }

	  if ( ship->interdictactive == TRUE )
        {
            send_to_char("&RYou'll have to disengage the Interdiction field first..\n\r",ch);
    	      return;
	  }

        
        if ( autofly(ship)  )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
    	            return;
    	        }
    	        
        chance = IS_NPC(ch) ? ch->top_level
             : (int)  (ch->pcdata->learned[gsn_shipsystems]) ;
        if ( number_percent( ) > chance )
        {
           send_to_char("&RYou fail to work the controls properly.\n\r",ch);
           learn_from_failure( ch, gsn_shipsystems );
           return;	
        }
    
    act( AT_PLAIN, "$n flips a switch on the control panel.", ch,
         NULL, argument , TO_ROOM );

    if ( !str_cmp(argument,"on" ) )
    {
        ship->autorecharge=TRUE;
        send_to_char( "&GYou power up the shields.\n\r", ch);
        echo_to_cockpit( AT_YELLOW , ship , "Shields ON. Autorecharge ON.");
    }
    else if ( !str_cmp(argument,"off" ) )
    {
        ship->autorecharge=FALSE;
        send_to_char( "&GYou shutdown the shields.\n\r", ch);
        echo_to_cockpit( AT_YELLOW , ship , "Shields OFF. Shield strength set to 0. Autorecharge OFF.");
        ship->shield = 0;
    }
    else if ( !str_cmp(argument,"idle" ) )
    {
        ship->autorecharge=FALSE;
        send_to_char( "&GYou let the shields idle.\n\r", ch);
        echo_to_cockpit( AT_YELLOW , ship , "Autorecharge OFF. Shields IDLEING.");
    }
    else
    {   
        if (ship->autorecharge == TRUE)
        {
           ship->autorecharge=FALSE;
           send_to_char( "&GYou toggle the shields.\n\r", ch);
           echo_to_cockpit( AT_YELLOW , ship , "Autorecharge OFF. Shields IDLEING.");
        }
        else
        {
           ship->autorecharge=TRUE;
           send_to_char( "&GYou toggle the shields.\n\r", ch);
           echo_to_cockpit( AT_YELLOW , ship , "Shields ON. Autorecharge ON");
        }   
    }
    
    if (ship->autorecharge)
    {
       recharge  = URANGE( 1, ship->maxshield-ship->shield, 25+ship->class*25 );
       recharge  = UMIN( recharge, ship->energy*5 + 100 );
       ship->shield += recharge;
       ship->energy -= ( recharge*2 + recharge * ship->class );
    }
                                          	  
    learn_from_success( ch, gsn_shipsystems );    	
}

void do_autopilot(CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
        
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        
        if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the pilots seat!\n\r",ch);
            return;
        }
        
         if ( ! check_pilot(ch,ship) )
       	     {
       	       send_to_char("&RHey! Thats not your ship!\n\r",ch);
       	       return;
       	     }

         if ( ship->target0 || ship->target1 || ship->target2 )
       	     {
       	       send_to_char("&RNot while the ship is enganged with an enemy!\n\r",ch);
       	       return;
       	     }
      if (ship->shipstate == SHIP_DOCKED)
      {
          send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
          return;
      }

        
    act( AT_PLAIN, "$n flips a switch on the control panel.", ch,
         NULL, argument , TO_ROOM );

        if (ship->autopilot == TRUE)
        {
           ship->autopilot=FALSE;
           send_to_char( "&GYou toggle the autopilot.\n\r", ch);
           echo_to_cockpit( AT_YELLOW , ship , "Autopilot OFF.");
        }
        else
        {
           ship->autopilot=TRUE;
           ship->autorecharge = TRUE;
           send_to_char( "&GYou toggle the autopilot.\n\r", ch);
           echo_to_cockpit( AT_YELLOW , ship , "Autopilot ON.");
        }   
    
}

void do_openhatch(CHAR_DATA *ch, char *argument )
{
   SHIP_DATA *ship;
   char buf[MAX_STRING_LENGTH];
   
   if ( !argument || argument[0] == '\0' || !str_cmp(argument,"hatch") )
   {
       ship = ship_from_entrance( ch->in_room->vnum );
       if( ship == NULL)
       {
          send_to_char( "&ROpen what?\n\r", ch );
          return;
       }
       else
       {
          if ( !ship->hatchopen)
       	  {
       	     
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RTry one of the docking bays!\n\r" , ch );
                   return;
                }   
       	     if ( ship->location != ship->lastdoc ||
       	        ( ship->shipstate != SHIP_DOCKED && ship->shipstate != SHIP_DISABLED ) )
       	     {
       	       send_to_char("&RPlease wait till the ship lands!\n\r",ch);
       	       return;
       	     }
       	     ship->hatchopen = TRUE;
       	     send_to_char("&GYou open the hatch.\n\r",ch);
       	     act( AT_PLAIN, "$n opens the hatch.", ch, NULL, argument, TO_ROOM );
       	     sprintf( buf , "The hatch on %s opens." , ship->name);  
       	     echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
       	       sound_to_room( get_room_index(ship->entrance) , "!!SOUND(door)" );
      		     sound_to_room( get_room_index(ship->location) , "!!SOUND(door)" );	
		return;
       	  }
       	  else
       	  {
       	     send_to_char("&RIt's already open.\n\r",ch);
       	     return;	
       	  }
       }
   }
   
   ship = ship_in_room( ch->in_room , argument );
   if ( !ship )
   {
            act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
           return;
   }

   if ( ship->shipstate != SHIP_DOCKED && ship->shipstate != SHIP_DISABLED )
   {
        send_to_char( "&RThat ship has already started to launch",ch);
        return;
   }
   
   if ( ! check_pilot(ch,ship) )
       	     {
       	       send_to_char("&RHey! Thats not your ship!\n\r",ch);
       	       return;
       	     }
       	     
   if ( !ship->hatchopen)
   {
   	ship->hatchopen = TRUE;
   	act( AT_PLAIN, "You open the hatch on $T.", ch, NULL, ship->name, TO_CHAR );
   	act( AT_PLAIN, "$n opens the hatch on $T.", ch, NULL, ship->name, TO_ROOM );
   	echo_to_room( AT_YELLOW , get_room_index(ship->entrance) , "The hatch opens from the outside." );
   	  sound_to_room( get_room_index(ship->entrance) , "!!SOUND(door)" );
      		     sound_to_room( get_room_index(ship->location) , "!!SOUND(door)" );		
	return;
   }

   send_to_char("&GIts already open!\n\r",ch);

}


void do_closehatch(CHAR_DATA *ch, char *argument )
{
   SHIP_DATA *ship;
   char buf[MAX_STRING_LENGTH];
   
   if ( !argument || argument[0] == '\0' || !str_cmp(argument,"hatch") )
   {
       ship = ship_from_entrance( ch->in_room->vnum );
       if( ship == NULL)
       {
          send_to_char( "&RClose what?\n\r", ch );
          return;
       }
       else
       {
          
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RTry one of the docking bays!\n\r" , ch );
                   return;
                }   
          if ( ship->hatchopen)
       	  {
       	     ship->hatchopen = FALSE;
       	     send_to_char("&GYou close the hatch.\n\r",ch);
       	     act( AT_PLAIN, "$n closes the hatch.", ch, NULL, argument, TO_ROOM );  
       	     sprintf( buf , "The hatch on %s closes." , ship->name);  
       	     echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
       	      sound_to_room( get_room_index(ship->entrance) , "!!SOUND(door)" );
      		     sound_to_room( get_room_index(ship->location) , "!!SOUND(door)" );		
 	     return;
       	  }
       	  else
       	  {
       	     send_to_char("&RIt's already closed.\n\r",ch);
       	     return;	
       	  }
       }
   }
   
   ship = ship_in_room( ch->in_room , argument );
   if ( !ship )
   {
            act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
           return;
   }

   if ( ship->shipstate != SHIP_DOCKED && ship->shipstate != SHIP_DISABLED )
   {
        send_to_char( "&RThat ship has already started to launch",ch);
        return;
   }
   else
   {
      if(ship->hatchopen)
      {
   	ship->hatchopen = FALSE;
   	act( AT_PLAIN, "You close the hatch on $T.", ch, NULL, ship->name, TO_CHAR );
   	act( AT_PLAIN, "$n closes the hatch on $T.", ch, NULL, ship->name, TO_ROOM );
        echo_to_room( AT_YELLOW , get_room_index(ship->entrance) , "The hatch is closed from outside.");
     sound_to_room( get_room_index(ship->entrance) , "!!SOUND(door)" );
      		     sound_to_room( get_room_index(ship->location) , "!!SOUND(door)" );		

   	return;
      }
      else
      {
      	send_to_char("&RIts already closed.\n\r",ch);
      	return;
      }
   }


}

void do_status(CHAR_DATA *ch, char *argument )
{
    int chance;
    SHIP_DATA *ship;
    SHIP_DATA *target;
   
    if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    {
         send_to_char("&RYou must be in the cockpit, turret or engineroom of a ship to do that!\n\r",ch);
         return;
    }
    
    if (argument[0] == '\0')
       target = ship;
    else
       target = get_ship_here( argument , ship->starsystem );
    	
    if ( target == NULL || (IS_SET(target->flags, SHIPFLAG_CLOAKED) && target != ship))
    {
         send_to_char("&RI don't see that here.\n\rTry the radar, or type status by itself for your ships status.\n\r",ch);
         return;
    }          
    
    if ( abs(target->vx - ship->vx) > 100+ship->sensor*40 ||
         abs(target->vy - ship->vy) > 100+ship->sensor*40 ||
         abs(target->vz - ship->vz) > 100+ship->sensor*40 )  
    {
         send_to_char("&RThat ship is beyond your sensor range.\n\r",ch);
         return;
    }
    
    chance = IS_NPC(ch) ? ch->top_level
        : (int)  (ch->pcdata->learned[gsn_shipsystems]) ;
    if ( number_percent( ) > chance )
    {
        send_to_char("&RYou cant figure out what the readout means.\n\r",ch);
        learn_from_failure( ch, gsn_shipsystems );
        return;	
    }
        
    act( AT_PLAIN, "$n checks various gages and displays on the control panel.", ch,
         NULL, argument , TO_ROOM );
    
    ch_printf( ch, "&W%s:\n\r",target->name);
    ch_printf( ch, "&OCurrent Coordinates:&Y %.0f %.0f %.0f\n\r",
                        target->vx, target->vy, target->vz );
    ch_printf( ch, "&OCurrent Heading:&Y %.0f %.0f %.0f\n\r",
                        target->hx, target->hy, target->hz );
    ch_printf( ch, "&OCurrent Speed:&Y %d&O/%d\n\r",
                        target->currspeed , target->realspeed );                    
    ch_printf( ch, "&OHull:&Y %d&O/&Y%d&O  Armor &Y%d&O/&Y%d  &OShip Condition:&Y %s\n\r",
                        target->hull,
    		        target->maxhull, target->armor, target->maxarmor,	
    			target->shipstate == SHIP_DISABLED ? "Disabled" : "Running");    		
    ch_printf( ch, "&OShields:&Y %d&O/%d   Energy(fuel):&Y %d&O/%d\n\r",
                        target->shield,
    		        target->maxshield,
    		        target->energy,
    		        target->maxenergy);
    ch_printf( ch, "&OCargo: &Y%d/&O%d   Cargo Type: &Y%s&w\n\r",
                        ship->cargo,
                        ship->maxcargo,
                        cargo_names[ship->cargotype]);

    ch_printf( ch, "&OLasers:&Y %d  &OIons:&Y %d  Laser Power: %d\n\r",
                        target->lasers,
				target->ions,
                        target->laserdamage);
    ch_printf( ch, "&OLaser Condition:&Y %s  &OCurrent Target:&Y %s\n\r",
 		        target->statet0 == LASER_DAMAGED ? "Damaged" : "Good" , target->target0 ? target->target0->name : "none");		
    if(target->ions)
        ch_printf( ch, "&OIon Condition:&Y   %s\n\r", target->ionstate == LASER_DAMAGED ? "Damaged" : "Good");
    if (target->turret1)
        ch_printf( ch, "&OTurret One:&Y %s  &OCurrent Target:&Y %s\n\r",
    			target->statet1 == LASER_DAMAGED ? "Damaged" : "Good" , target->target1 ? target->target1->name : "none");		
    if (target->turret2)
        ch_printf( ch, "&OTurret Two:&Y %s  &OCurrent Target:&Y %s\n\r",
    			target->statet2 == LASER_DAMAGED ? "Damaged" : "Good" , target->target2 ? target->target2->name : "none");		
    if (target->autocannon == 1 )
    {
        ch_printf( ch, "&OAutocannon:&Y %d&O/&Y%d&O Rounds.  &Y%d&O Strength",
			target->autoammo,
			target->autoammomax,
			target->autodamage );
    }

    ch_printf( ch, "\n\r&OMissiles:&Y %d&O/%d   Launcher Condition:&Y %s&w",
       			target->missiles,
    			target->maxmissiles,
    			target->missilestate == MISSILE_DAMAGED ? "Damaged" : "Good");		
    ch_printf( ch, "\n\r&OTorpedos:&Y %d&O/%d   Launcher Condition:&Y %s&w",
                        target->torpedos,
                        target->maxtorpedos,
                        target->torpedostate == MISSILE_DAMAGED ? "Damaged" : "Good");
    ch_printf( ch, "\n\r&ORockets:&Y  %d&O/%d   Launcher Condition:&Y %s&w\n\r",
                        target->rockets,
                        target->maxrockets,
                        target->rocketstate == MISSILE_DAMAGED ? "Damaged" : "Good");
   
    if ( target->interdict == 1)
    {
      send_to_char( "&YInterdiction System Installed!!!&O\n\r", ch );
    }
    if ( target->overdrive == 1)
       send_to_char( "&YOverdrive Node Installed!!!&O\n\r", ch);
    learn_from_success( ch, gsn_shipsystems );
}

void do_hyperspace(CHAR_DATA *ch, char *argument )
{
    int chance;
    SHIP_DATA *ship;
    SHIP_DATA *eShip;
    char buf[MAX_STRING_LENGTH];
   
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        
        if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
        
        if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou aren't in the pilots seat.\n\r",ch);
            return;
        }
        
        if ( autofly(ship)  )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
    	            return;
    	        }
    	        
        
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RPlatforms can't move!\n\r" , ch );
                   return;
                }       
                if (ship->hyperspeed == 0)
                {
                  send_to_char("&RThis ship is not equipped with a hyperdrive!\n\r",ch);
                  return;   
                }
                if (ship->shipstate == SHIP_HYPERSPACE)
                {
                  send_to_char("&RYou are already travelling lightspeed!\n\r",ch);
                  return;   
                }
                if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ships drive is disabled. Unable to manuever.\n\r",ch);
    	            return;
    	        }
                if (IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
                {
                    send_to_char("&RYou can't hyperspace while cloaked, it takes too much energy.\n\r", ch);
                    return; 
                }
    	        if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
    	            return;
    	        }

                if ((ship->shipstate2 == SHIP_DOCK) || (ship->shipstate2 == SHIP_DOCK_2))
                {
                    send_to_char("&RNot while docking procedures are going on.\n\r", ch);
                    return;
                }
                
                if (ship->shipstate2 == SHIP_DOCK_3)
                {
                    send_to_char("&RDetach from the docked ship first.\n\r",ch);
                    return;
                }

    	        if (ship->shipstate != SHIP_READY)
    	        {
    	            send_to_char("&RPlease wait until the ship has finished its current maneuver.\n\r",ch);
    	            return;
    	        } 
                if (!ship->currjump)
    	        {
    	            send_to_char("&RYou need to calculate your jump first!\n\r",ch);
    	            return;
    	        } 

        if ( ship->energy < (200+ship->hyperdistance*(1+ship->class)/3))
        {
              send_to_char("&RTheres not enough fuel!\n\r",ch);
              return;
        }

        if ( ship->currspeed <= 0 )
        {
              send_to_char("&RYou need to speed up a little first!\n\r",ch);
              return;
        }
    	
    	for ( eShip = ship->starsystem->first_ship; eShip; eShip = eShip->next_in_starsystem )
    	{
    	   if ( eShip == ship )
    	      continue;
    	   if ( eShip->interdictactive == TRUE &&
		abs( eShip->vx - ship->vx ) < 5000 &&
		abs( eShip->vy - ship->vy ) < 5000 &&
		abs( eShip->vz - ship->vz ) < 5000 )
           {
              ch_printf(ch, "&RIt's impossible to jump to lightspeed while %s is generating a gravity well!!!\n\r", eShip->name );
              ch_printf(ch, "&RYou must force them to lower their field, or flee to a VERY FAR distance!!!\n\r", eShip->name );
              return;
           }    	   
    	   if ( abs( eShip->vx - ship->vx ) < 500 
    	   &&  abs( eShip->vy - ship->vy ) < 500 
    	   &&  abs( eShip->vz - ship->vz ) < 500 )
           {
              ch_printf(ch, "&RYou are too close to %s to make the jump to lightspeed.\n\r", eShip->name );
              return;
           }    	   
    	}
    	        
        if ( ship->class == FIGHTER_SHIP )
             chance = IS_NPC(ch) ? ch->top_level
             : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
        if ( ship->class == MOBILE_SUIT )
             chance = IS_NPC(ch) ? ch->top_level
             : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
        if ( ship->class == MIDSIZE_SHIP )
             chance = IS_NPC(ch) ? ch->top_level
                 : (int)  (ch->pcdata->learned[gsn_midships]) ;
        if ( ship->class == FRIGATE_SHIP )
             chance = IS_NPC(ch) ? ch->top_level
                 : (int)  (ch->pcdata->learned[gsn_frigates]) ;
        if ( ship->class == CAPITAL_SHIP )
              chance = IS_NPC(ch) ? ch->top_level
                 : (int) (ch->pcdata->learned[gsn_capitalships]);
        if ( ship->class == SUPERCAPITAL_SHIP )
              chance = IS_NPC(ch) ? ch->top_level
                 : (int) (ch->pcdata->learned[gsn_supercapitalships]);
        if ( number_percent( ) > chance )
        {
            send_to_char("&RYou can't figure out which lever to use.\n\r",ch);
            if ( ship->class == FIGHTER_SHIP )
               learn_from_failure( ch, gsn_starfighters );
            if ( ship->class == MOBILE_SUIT )
               learn_from_failure( ch, gsn_starfighters );
            if ( ship->class == MIDSIZE_SHIP )   
               learn_from_failure( ch, gsn_midships );
            if ( ship->class == FRIGATE_SHIP )   
               learn_from_failure( ch, gsn_frigates );
            if ( ship->class == CAPITAL_SHIP )
                learn_from_failure( ch, gsn_capitalships );
            if ( ship->class == SUPERCAPITAL_SHIP )
                learn_from_failure( ch, gsn_supercapitalships );
    	   return;	
        }
    sprintf( buf ,"%s disapears from your scanner." , ship->name );
    echo_to_system( AT_YELLOW, ship, buf , NULL );

    ship_from_starsystem( ship , ship->starsystem );
    ship->shipstate = SHIP_HYPERSPACE;
        
    send_to_char( "&GYou push forward the hyperspeed lever.\n\r", ch);
    act( AT_PLAIN, "$n pushes a lever forward on the control panel.", ch,
         NULL, argument , TO_ROOM );
    echo_to_ship( AT_YELLOW , ship , "The ship lurches slightly as it makes the jump to lightspeed." );     
    echo_to_cockpit( AT_YELLOW , ship , "The stars become streaks of light as you enter hyperspace.");	  
    
    ship->energy -= (100+ship->hyperdistance*(1+ship->class)/3);
    
    ship->vx = ship->jx;
    ship->vy = ship->jy;
    ship->vz = ship->jz;
    
    if ( ship->class == FIGHTER_SHIP )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MOBILE_SUIT )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MIDSIZE_SHIP )
        learn_from_success( ch, gsn_midships );
    if ( ship->class == FRIGATE_SHIP )
        learn_from_success( ch, gsn_frigates );
    if ( ship->class == CAPITAL_SHIP )
        learn_from_success( ch, gsn_capitalships );
    if ( ship->class == SUPERCAPITAL_SHIP )
        learn_from_success( ch, gsn_supercapitalships );
    	
}

    
void do_target(CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int chance;
    SHIP_DATA *ship;
    SHIP_DATA *target;
    char buf[MAX_STRING_LENGTH];
    
    strcpy( arg, argument );    
    
    switch( ch->substate )
    { 
    	default:
    	        if (  (ship = ship_from_turret(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYou must be in the gunners seat or turret of a ship to do that!\n\r",ch);
    	            return;
    	        }
                
                if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
                if (ship->shipstate == SHIP_HYPERSPACE)
                {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
                }              
    	        if (! ship->starsystem )
    	        {
    	            send_to_char("&RYou can't do that until you've finished launching!\n\r",ch);
    	            return;
    	        }
                
                if ( autofly(ship) )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first....\n\r",ch);
    	            return;
    	        }
    	            
                if (arg[0] == '\0')
    	        {
    	            send_to_char("&RYou need to specify a target!\n\r",ch);
    	            return;
    	        }
                                
                if ( !str_cmp( arg, "none") )
    	        {
    	            send_to_char("&GTarget set to none.\n\r",ch);
    	            if ( ch->in_room->vnum == ship->gunseat )
    	                   ship->target0 = NULL;
    	            if ( ch->in_room->vnum == ship->turret1 )
    	                   ship->target1 = NULL;
    	            if ( ch->in_room->vnum == ship->turret2 )
    	                   ship->target2 = NULL;
    	            return;
    	        }

                if(!str_cmp(arg, "self"))
                {
                   send_to_char("&RUnable to comply, your ship systems cannot lock onto yourself.\n\r", ch);
                   return;
                }

                target = get_ship_here( arg, ship->starsystem );
                if(target == NULL || IS_SET(target->flags, SHIPFLAG_CLOAKED))
                {
                    send_to_char("&RI don't see that ship here.\n\r", ch);
                    return;
                }
                if (  target == ship )
                {
                    send_to_char("&RYou can't target your own ship!\n\r",ch);
                    return;
                }
                
                if ( !str_cmp(target->owner, ship->owner) && str_cmp( target->owner , "" ) )
                {
                    send_to_char("&RWARNING!  TARGETING FRIENDLY SHIP!!!\n\r",ch);
//                    return;
                }
                
                if ( abs(ship->vx-target->vx) > 5000 ||
                     abs(ship->vy-target->vy) > 5000 ||
                     abs(ship->vz-target->vz) > 5000 )
                {
                    send_to_char("&RThat ship is too far away to target.\n\r",ch);
                    return;
                }
                
                chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_weaponsystems]) ;
                if ( number_percent( ) < chance )
    		{
    		   send_to_char( "&GTracking target.\n\r", ch);
    		   act( AT_PLAIN, "$n makes some adjustments on the targeting computer.", ch,
		        NULL, argument , TO_ROOM );
    		   add_timer ( ch , TIMER_DO_FUN , 1 , do_target , 1 );
    		   ch->dest_buf = str_dup(arg);
    		   return;
	        }
	        send_to_char("&RYou fail to work the controls properly.\n\r",ch);
	        learn_from_failure( ch, gsn_weaponsystems );
    	   	return;	
    	
    	case 1:
    		if ( !ch->dest_buf )
    		   return;
    		strcpy(arg, ch->dest_buf);
    		DISPOSE( ch->dest_buf);
    		break;
    		
    	case SUB_TIMER_DO_ABORT:
    		DISPOSE( ch->dest_buf );
    		ch->substate = SUB_NONE;
    		if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
    		      return;    		                                   
    	        send_to_char("&RYour concentration is broken. You fail to lock onto your target.\n\r", ch);
    		return;
    }
    
    ch->substate = SUB_NONE;
    
    if ( (ship = ship_from_turret(ch->in_room->vnum)) == NULL )
    {  
       return;
    }
    
    target = get_ship_here( arg, ship->starsystem );
    if (  target == NULL || target == ship || IS_SET(target->flags, SHIPFLAG_CLOAKED) )
    {
           send_to_char("&RThe ship has left the starsytem. Targeting aborted.\n\r",ch);
           return;
    }
    
    if ( ch->in_room->vnum == ship->gunseat )
       ship->target0 = target;
    
    if ( ch->in_room->vnum == ship->turret1 )
       ship->target1 = target;
             
    if ( ch->in_room->vnum == ship->turret2 )
        ship->target2 = target;      
    
    send_to_char( "&GTarget Locked.\n\r", ch);
    if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED))
    {
       sprintf( buf , "You are being targetted by %s." , ship->name);  
       echo_to_cockpit( AT_BLOOD , target , buf );
    }   	      
    sound_to_room( ch->in_room , "!!SOUND(targetlock)" );   	         
    learn_from_success( ch, gsn_weaponsystems );
    	
    if ( autofly(target) && !target->target0 && !IS_SET(ship->flags, SHIPFLAG_CLOAKED))
    {
       sprintf( buf , "You are being targetted by %s." , target->name);  
       echo_to_cockpit( AT_BLOOD , ship , buf );
       target->target0 = ship;
    }
}

void do_fire(CHAR_DATA *ch, char *argument )
{
    int autohits;
    int automiss;
    int chance;
    int bonusdamage = 0; /*Pilot subclass and overcharge code*/
    int linkshot = 0; /* Linked Laser code */
    int shots; /* Linked Laser Code */
    int exshots = 0; /* Redirection Code */
    int bonusrange = 0; /* Overcharge Code */
    SHIP_DATA *ship;
    SHIP_DATA *target;
    char buf[MAX_STRING_LENGTH];
    
        if (  (ship = ship_from_turret(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the gunners chair or turret of a ship to do that!\n\r",ch);
            return;
        }
        
        if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
        if (ship->shipstate == SHIP_HYPERSPACE)
        {
             send_to_char("&RYou can only do that in realspace!\n\r",ch);
             return;   
        }
    	if (ship->starsystem == NULL)
    	{
    	     send_to_char("&RYou can't do that until after you've finished launching!\n\r",ch);
    	     return;
    	}
    	if ( ship->energy <5 )
        {
             send_to_char("&RTheres not enough energy left to fire!\n\r",ch);
             return;
        }   
  
                if ( autofly(ship) )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
    	            return;
    	        }
        if (IS_SET(ship->flags, SHIPFLAG_CLOAKED))
        {
           send_to_char("You'll have to decloak to engage.\n\r", ch);
           return;
        }
    	if ( ch->in_room->vnum == ship->gunseat && !str_prefix( argument , "lasers") )
    	{
    	
    	     if (ship->statet0 == LASER_DAMAGED)
    	     {
    	        send_to_char("&RThe ships main laser is damaged.\n\r",ch);
    	      	return;
    	     } 
             if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
                linkshot = 2;
             if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
                linkshot = 3;
             if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
                linkshot = 4;
             if(linkshot == 0)
                linkshot = 1;
             if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
                exshots += ship->lasers / 2;
             if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
                exshots += ship->lasers / 2;
             if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
                exshots -= ship->lasers / 2;
             if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
                exshots -= ship->lasers /2; 
             if (ship->statet0 >= (ship->lasers - linkshot + 1 + exshots))
    	     {
    	     	send_to_char("&RThe lasers are still recharging.\n\r",ch);
    	     	return;
    	     }
    	     if (ship->target0 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target0;
    	     if (ship->target0->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target0 = NULL;
    	     	return;
    	     } 
             if(ship->statet0 < 0)
             { /* For overcharging. */
                bonusdamage += 1;
                bonusrange = 200;
             }

             if ( abs(target->vx - ship->vx) >(1000 + bonusrange) ||
                  abs(target->vy - ship->vy) >(1000 + bonusrange) ||
                  abs(target->vz - ship->vz) >(1000 + bonusrange))
             {
                send_to_char("&RThat ship is out of laser range.\n\r",ch);
    	     	return;
             } 
             if ( ship->class < 2 && !is_facing( ship, target ) )
             {
                send_to_char("&RThe main laser can only fire forward. You'll need to turn your ship!\n\r",ch);
    	     	return;
             }
             for(shots = 0; shots < linkshot; shots++)
             {      
             if (ship->target0->starsystem != ship->starsystem)
             {
                send_to_char("&RYour target seems to have left.\n\r",ch);
                ship->target0 = NULL;
                return;
             }
             ship->statet0++; /* Arcturus Version */
             chance = IS_NPC(ch) ? ch->top_level
                      : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
             chance += (ship->manuever - target->manuever) / 10;
             chance += (ship->currspeed - target->currspeed) / 10;
             chance -= ( abs(target->vx - ship->vx)/120 );
             chance -= ( abs(target->vy - ship->vy)/120 );
             chance -= ( abs(target->vz - ship->vz)/120 );
	     if ( ch->subclass == SUBCLASS_WFOCUS )
             {
		chance += 15;
                chance = URANGE( 15 , chance , 95 );
                bonusdamage += 3;
             }
             else
                chance = URANGE( 10, chance, 90);
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
           /*Sabotage Bit by Arcturus */
           if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLASERS))
           {
              echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "A small blast damages your lasers, it must be sabotage!\n\r");
              echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "LASER DAMAGED!\n\r" );
              ship->statet0 = LASER_DAMAGED;
              REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDLASERS);
              return;
           }

             if(evaded(ship, target))
             {
                sprintf( buf , "Lasers that fire from %s at you are evaded." , ship->name);
                echo_to_cockpit( AT_ORANGE , target , buf );
                sprintf( buf , "The ships lasers fire at %s but they evade them." , target->name);
                echo_to_cockpit( AT_ORANGE , ship , buf );
                learn_from_failure( ch, gsn_spacecombat );
                learn_from_failure( ch, gsn_spacecombat2 );
                learn_from_failure( ch, gsn_spacecombat3 );
                sprintf( buf, "Laserfire from %s barely misses %s." , ship->name , target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
             }
             else if( number_percent( ) > chance )
             {  
                sprintf( buf , "Lasers fire from %s at you but miss." , ship->name);  
                echo_to_cockpit( AT_ORANGE , target , buf );           
                sprintf( buf , "The ships lasers fire at %s but miss." , target->name);  
                echo_to_cockpit( AT_ORANGE , ship , buf );           
                learn_from_failure( ch, gsn_spacecombat ); 
    	        learn_from_failure( ch, gsn_spacecombat2 ); 
    	        learn_from_failure( ch, gsn_spacecombat3 ); 
    	        sprintf( buf, "Laserfire from %s barely misses %s." , ship->name , target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
             } 
             else
             {
                sprintf( buf, "Laserfire from %s hits %s." , ship->name, target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
                sprintf( buf , "You are hit by lasers from %s!" , ship->name);  
                echo_to_cockpit( AT_BLOOD , target , buf );           
                sprintf( buf , "Your ships lasers hit %s!." , target->name);  
                echo_to_cockpit( AT_YELLOW , ship , buf );           
                learn_from_success( ch, gsn_spacecombat );
                learn_from_success( ch, gsn_spacecombat2 );
                learn_from_success( ch, gsn_spacecombat3 );
                echo_to_ship( AT_RED , target , "A small explosion vibrates through the ship." );           
                damage_ship_ch( target , (  (ship->laserdamage+bonusdamage)/2 ) , ( (ship->laserdamage+bonusdamage) ) , ch , ship);
             }
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
        }     
             return;
    	}
        
        if ( ch->in_room->vnum == ship->gunseat && !str_prefix( argument , "missile") )
    	{
             if(IS_SET(ship->flags, SHIPFLAG_DUALMISSILE))
                 linkshot = 1;
             else
                 linkshot = 0;
    	     if (ship->missilestate == MISSILE_DAMAGED)
    	     {
    	        send_to_char("&RThe ships missile launchers are damaged.\n\r",ch);
    	      	return;
    	     } 
             if (ship->missiles <= 0+linkshot)
    	     {
    	     	send_to_char("&RYou have no missiles to fire!\n\r",ch);
    	        return;
    	     }
              /* Arcturus Missile Code */
    	     if (ship->missilestate >= ship->mlaunchers-linkshot  )
    	     {
    	     	send_to_char("&RThe missiles are still reloading.\n\r",ch);
    	     	return;
    	     }
    	     if (ship->target0 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target0;
             if (ship->target0->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target0 = NULL; 
    	     	return;
    	     } 
             if ( abs(target->vx - ship->vx) >2500 ||
                  abs(target->vy - ship->vy) >2500 ||
                  abs(target->vz - ship->vz) >2500 )
             {
                send_to_char("&RThat ship is out of missile range.\n\r",ch);
    	     	return;
             } 
             if ( ship->class < 2 && !is_facing( ship, target ) )
             {
                send_to_char("&RMissiles can only fire in a forward. You'll need to turn your ship!\n\r",ch);
    	     	return;
             }      
/* Arcturus Version */
             chance = IS_NPC(ch) ? ch->top_level
                    : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
             chance += (ship->manuever - target->manuever) / 10;
             chance += (ship->currspeed - target->currspeed) / 10;
             chance -= ( abs(target->vx - ship->vx)/250 );
             chance -= ( abs(target->vy - ship->vy)/250 );
             chance -= ( abs(target->vz - ship->vz)/250 );
             if ( ch->subclass == SUBCLASS_WFOCUS )
             {
                chance += 15;
                chance = URANGE( 20 , chance , 95 );
                bonusdamage = 1;
             }
             else
                chance = URANGE(20, chance, 80); 
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
/*Sabotage bit by Arcturus */
    if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS))
    {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "A small blast damages your missile launcher, it must be sabotage!\n\r");
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "MISSILE DAMAGED!\n\r" );
           ship->missilestate = MISSILE_DAMAGED;
           REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS);
           return;
    }

             if ( number_percent( ) > chance )
             {
                send_to_char( "&RYou fail to lock onto your target!", ch );
    	        learn_from_failure( ch, gsn_spacecombat );
                learn_from_failure( ch, gsn_spacecombat2 );
                learn_from_failure( ch, gsn_spacecombat3 );
                return;	
             } 
             ship->missilestate += 3;
             new_missile( ship , target , ch , CONCUSSION_MISSILE + bonusdamage );
             ship->missiles-- ;
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
             echo_to_cockpit( AT_YELLOW , ship , "Missile launched.");
             sprintf( buf , "Incoming missile from %s." , ship->name);  
             echo_to_cockpit( AT_BLOOD , target , buf );
             sprintf( buf, "%s fires a missile towards %s." , ship->name, target->name );
             echo_to_system( AT_ORANGE , ship , buf , target );
             if( IS_SET(ship->flags, SHIPFLAG_DUALMISSILE))
             {
                echo_to_cockpit(AT_YELLOW, ship, "Missile launched.");
                new_missile( ship, target, ch, CONCUSSION_MISSILE +bonusdamage );
                ship->missiles--;
                ship->missilestate += 3;
                sprintf( buf , "Incoming missile from %s." , ship->name);
                echo_to_cockpit( AT_BLOOD , target , buf );
                sprintf( buf, "%s fires a missile towards %s." , ship->name, target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
             }

             learn_from_success( ch, gsn_spacecombat );
             learn_from_success( ch, gsn_spacecombat2 );
             learn_from_success( ch, gsn_spacecombat3 );

             
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
             
             return;
    	}
        if ( ch->in_room->vnum == ship->gunseat && !str_prefix( argument , "torpedo") )
    	{
             if(IS_SET(ship->flags, SHIPFLAG_DUALTORPEDO))
                 linkshot = 1;
             else
                 linkshot = 0;
    	     if (ship->torpedostate == MISSILE_DAMAGED)
    	     {
    	        send_to_char("&RThe ships torpedo launchers are damaged.\n\r",ch);
    	      	return;
    	     } 
             if (ship->torpedos <= 0+linkshot)
    	     {
    	     	send_to_char("&RYou have no torpedos to fire!\n\r",ch);
    	        return;
             }
             if (ship->torpedostate >= ship->tlaunchers-linkshot  )
             {
                send_to_char("&RThe torpedos are still reloading.\n\r",ch);
                return;
             }    	     
    	     if (ship->target0 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target0;
             if (ship->target0->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target0 = NULL; 
    	     	return;
    	     } 
             if ( abs(target->vx - ship->vx) >2500 ||
                  abs(target->vy - ship->vy) >2500 ||
                  abs(target->vz - ship->vz) >2500 )
             {
                send_to_char("&RThat ship is out of torpedo range.\n\r",ch);
    	     	return;
             } 
             if ( ship->class < 2 && !is_facing( ship, target ) )
             {
                send_to_char("&RTorpedos can only fire in a forward direction. You'll need to turn your ship!\n\r",ch);
    	     	return;
             }      
/*Arcturus Version */
            chance = IS_NPC(ch) ? ch->top_level
                 : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
             chance += (ship->manuever - target->manuever) / 10;
             chance += (ship->currspeed - target->currspeed) / 10;
             chance -= ( abs(target->vx - ship->vx)/250 );
             chance -= ( abs(target->vy - ship->vy)/250 );
             chance -= ( abs(target->vz - ship->vz)/250 );
             if ( ch->subclass == SUBCLASS_WFOCUS )
             {
                chance += 15;
                chance = URANGE( 20 , chance , 95 );
                bonusdamage = 1;
             }
             else
                chance = URANGE( 20, chance, 80 );
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
/*Sabotage bit by Arcuturs */
    if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS))
    {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "A small blast damages your torpedo launcher, it must be sabotage!\n\r");
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "TORPEDO DAMAGED!\n\r" );
           ship->missilestate = MISSILE_DAMAGED;
           REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS);
           return;
    }

             if ( number_percent( ) > chance )
             {
                send_to_char( "&RYou fail to lock onto your target!", ch );
                learn_from_failure(ch, gsn_spacecombat);
                learn_from_failure(ch, gsn_spacecombat2);
                learn_from_failure(ch, gsn_spacecombat3);
    	        return;	
             } 
             new_missile( ship , target , ch , PROTON_TORPEDO +bonusdamage );
             ship->torpedos--;
             ship->torpedostate += 3;
             act( AT_PLAIN, "$n pre7sses the fire button.", ch,
                  NULL, argument , TO_ROOM );
             echo_to_cockpit( AT_YELLOW , ship , "Torpedo launched.");
             sprintf( buf , "Incoming torpedo from %s." , ship->name);  
             echo_to_cockpit( AT_BLOOD , target , buf );
             sprintf( buf, "%s fires a torpedo towards %s." , ship->name, target->name );
             echo_to_system( AT_ORANGE , ship , buf , target );
             if( IS_SET(ship->flags, SHIPFLAG_DUALTORPEDO))
             {          
                new_missile( ship , target , ch , PROTON_TORPEDO +bonusdamage );
                ship->torpedos--;
                ship->torpedostate += 3;
                echo_to_cockpit( AT_YELLOW , ship , "Torpedo launched.");
                sprintf( buf , "Incoming torpedo from %s." , ship->name);
                echo_to_cockpit( AT_BLOOD , target , buf );
                sprintf( buf, "%s fires a torpedo towards %s." , ship->name, target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
             }
             learn_from_success(ch, gsn_spacecombat);
             learn_from_success(ch, gsn_spacecombat2);
             learn_from_success(ch, gsn_spacecombat3);      
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
             
             return;
    	}
    	
        if ( ch->in_room->vnum == ship->gunseat && !str_prefix( argument , "rocket") )
    	{
    	     if (ship->rocketstate == MISSILE_DAMAGED)
    	     {
    	        send_to_char("&RThe ships rocket launchers are damaged.\n\r",ch);
    	      	return;
    	     } 
             if(IS_SET(ship->flags, SHIPFLAG_DUALROCKET))
                 linkshot = 1;
             else
                 linkshot = 0;
             if (ship->rockets <= 0+linkshot)
    	     {
    	     	send_to_char("&RYou don't have enough rockets to fire!\n\r",ch);
    	        return;
    	     }
             if (ship->rocketstate >= ship->rlaunchers-linkshot  )
             {
                send_to_char("&RThe rockets are still reloading.\n\r",ch);
                return;
             }
     	     if (ship->target0 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target0;
             if (ship->target0->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target0 = NULL; 
    	     	return;
    	     } 
             if ( abs(target->vx - ship->vx) >1500 ||
                  abs(target->vy - ship->vy) >1500 ||
                  abs(target->vz - ship->vz) >1500 )
             {
                send_to_char("&RThat ship is out of rocket range.\n\r",ch);
    	     	return;
             } 
             if ( ship->class < 2 && !is_facing( ship, target ) )
             {
                send_to_char("&RRockets can only fire forward. You'll need to turn your ship!\n\r",ch);
    	     	return;
             }      
/*Arcturus Version */
             chance = IS_NPC(ch) ? ch->top_level
                 : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
             chance += (ship->manuever - target->manuever) / 10;
             chance += (ship->currspeed - target->currspeed) / 10;
             chance -= ( abs(target->vx - ship->vx)/150 );
             chance -= ( abs(target->vy - ship->vy)/150 );
             chance -= ( abs(target->vz - ship->vz)/150 );

             if ( ch->subclass == SUBCLASS_WFOCUS )
             {
                chance += 15;
                chance = URANGE( 20 , chance , 95 );
                bonusdamage = 1;
             }
             else
                chance = URANGE( 20, chance, 80 );
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
/*Sabotage bit by Arcturus */
    if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS))
    {
           echo_to_room( AT_BLUE , get_room_index(ship->gunseat) , "A small blast damages your rocket launcher, it must be sabotage!\n\r");
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->gunseat) , "ROCKET DAMAGED!\n\r" );
           ship->rocketstate = MISSILE_DAMAGED;
           REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS);
           return;
    }

             if ( number_percent( ) > chance )
             {
                send_to_char( "&RYou fail to lock onto your target!", ch );
                learn_from_failure(ch, gsn_spacecombat);
                learn_from_failure(ch, gsn_spacecombat2);
                learn_from_failure(ch, gsn_spacecombat3);
    	        return;	
             } 
             new_missile( ship , target , ch , HEAVY_ROCKET+bonusdamage);
             ship->rockets-- ;
             ship->rocketstate += 3;
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
             echo_to_cockpit( AT_YELLOW , ship , "Rocket launched.");
             sprintf( buf , "Incoming rocket from %s." , ship->name);  
             echo_to_cockpit( AT_BLOOD , target , buf );
             sprintf( buf, "%s fires a heavy rocket towards %s." , ship->name, target->name );
             echo_to_system( AT_ORANGE , ship , buf , target );
             if( IS_SET(ship->flags, SHIPFLAG_DUALROCKET))
             {          
                new_missile( ship , target , ch , HEAVY_ROCKET +bonusdamage );
                ship->rockets--;
                ship->rocketstate += 3;
                echo_to_cockpit( AT_YELLOW , ship , "Rocket launched.");
                sprintf( buf , "Incoming rocket from %s." , ship->name);
                echo_to_cockpit( AT_BLOOD , target , buf );
                sprintf( buf, "%s fires a rocket towards %s." , ship->name, target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
             }
             learn_from_success(ch, gsn_spacecombat);
             learn_from_success(ch, gsn_spacecombat2);
             learn_from_success(ch, gsn_spacecombat3);             
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
             return;
    	}
        
        if ( ch->in_room->vnum == ship->turret1 && !str_prefix( argument , "lasers") )
    	{
    	     if (ship->statet1 == LASER_DAMAGED)
    	     {
    	        send_to_char("&RThe ships turret is damaged.\n\r",ch);
    	      	return;
    	     } 
             if (ship->statet1 > ship->class )
    	     {
    	     	send_to_char("&RThe turbolaser is recharging.\n\r",ch);
    	     	return;
    	     }
    	     if (ship->target1 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target1;
             if (ship->target1->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target1 = NULL; 
    	     	return;
    	     } 
             if ( abs(target->vx - ship->vx) >1000 ||
                  abs(target->vy - ship->vy) >1000 ||
                  abs(target->vz - ship->vz) >1000 )
             {
                send_to_char("&RThat ship is out of laser range.\n\r",ch);
    	     	return;
             } 
             ship->statet1++;
/*Arcturus Version */
             chance = IS_NPC(ch) ? ch->top_level
                    : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
             chance += (ship->manuever - target->manuever) / 10;
             chance += (ship->currspeed - target->currspeed) / 10;
             chance -= ( abs(target->vx - ship->vx)/120 );
             chance -= ( abs(target->vy - ship->vy)/120 );
             chance -= ( abs(target->vz - ship->vz)/120 );
             if ( ch->subclass == SUBCLASS_WFOCUS )
             {
                chance += 15;
                chance = URANGE( 15 , chance , 95 );
                bonusdamage = 3;
             }
             else
                chance = URANGE( 10, chance, 90 );
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
/*Sabotage bit by Arcturus */
    if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET1))
    {
           echo_to_room( AT_BLUE , get_room_index(ship->turret1) , "A small blast damages your laster turret, it must be sabotage!\n\r");
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret1) , "TURRET DAMAGED!\n\r" );
           ship->statet1 = LASER_DAMAGED;
           REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET1);
           return;
    }
            if(evaded(ship, target))
            {
                sprintf( buf , "Turbolasers that fire from %s at you are evaded." , ship->name);
                echo_to_cockpit( AT_ORANGE , target , buf );
                sprintf( buf , "The ships turret fires at %s but they evade." , target->name);
                echo_to_cockpit( AT_ORANGE , ship , buf );
                learn_from_failure( ch, gsn_spacecombat );
                learn_from_failure( ch, gsn_spacecombat2 );
                learn_from_failure( ch, gsn_spacecombat3 );
                sprintf( buf, "Laserfire from %s barely misses %s." , ship->name , target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
            }
             else if ( number_percent( ) > chance )
             {  
                sprintf( buf , "Turbolasers fire from %s at you but miss." , ship->name);  
                echo_to_cockpit( AT_ORANGE , target , buf );           
                sprintf( buf , "Turbolasers fire from the ships turret at %s but miss." , target->name);  
                echo_to_cockpit( AT_ORANGE , ship , buf );           
                sprintf( buf, "%s fires at %s but misses." , ship->name, target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
                learn_from_failure( ch, gsn_spacecombat ); 
    	        learn_from_failure( ch, gsn_spacecombat2 ); 
    	        learn_from_failure( ch, gsn_spacecombat3 ); 
    	        return;	
             } 
             sprintf( buf, "Turboasers fire from %s, hitting %s." , ship->name, target->name );
             echo_to_system( AT_ORANGE , ship , buf , target );
             sprintf( buf , "You are hit by turbolasers from %s!" , ship->name);  
             echo_to_cockpit( AT_BLOOD , target , buf );           
             sprintf( buf , "Turbolasers fire from the turret, hitting %s!." , target->name);  
             echo_to_cockpit( AT_YELLOW , ship , buf );           
             learn_from_success( ch, gsn_spacecombat );
             learn_from_success( ch, gsn_spacecombat2 );
             learn_from_success( ch, gsn_spacecombat3 );
             echo_to_ship( AT_RED , target , "A small explosion vibrates through the ship." );           
             damage_ship_ch( target , (ship->laserdamage+bonusdamage)  , (ship->laserdamage+bonusdamage)*2 , ch , ship);
             
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
             
             return;
    	}
        
        if ( ch->in_room->vnum == ship->turret2 && !str_prefix( argument , "lasers") )
    	{
    	     if (ship->statet2 == LASER_DAMAGED)
    	     {
    	        send_to_char("&RThe ships turret is damaged.\n\r",ch);
    	      	return;
    	     } 
             if (ship->statet2 > ship->class )
    	     {
    	     	send_to_char("&RThe turbolaser is still recharging.\n\r",ch);
    	     	return;
    	     }
    	     if (ship->target2 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target2;
             if (ship->target2->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target2 = NULL; 
    	     	return;
    	     } 
    	     if ( abs(target->vx - ship->vx) >1000 ||
                  abs(target->vy - ship->vy) >1000 ||
                  abs(target->vz - ship->vz) >1000 )
             {
                send_to_char("&RThat ship is out of laser range.\n\r",ch);
    	     	return;
             } 
             ship->statet2++;
/*Arcturus Version */
             chance = IS_NPC(ch) ? ch->top_level
                    : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
             chance += (ship->manuever - target->manuever) / 10;
             chance += (ship->currspeed - target->currspeed) / 10;
             chance -= ( abs(target->vx - ship->vx)/120 );
             chance -= ( abs(target->vy - ship->vy)/120 );
             chance -= ( abs(target->vz - ship->vz)/120 );
             if ( ch->subclass == SUBCLASS_WFOCUS )
             {
                chance += 15;
                chance = URANGE( 15 , chance , 95 );
                bonusdamage = 3;
             }
             else
               chance = URANGE(10, chance, 90);

             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
    /*Sabotage bit by Arcturus */
    if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET2))
    {
           echo_to_room( AT_BLUE , get_room_index(ship->turret2) , "A small blast damages your laster turret, it must be sabotage!\n\r");
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "TURRET DAMAGED!\n\r" );
           ship->statet2 = LASER_DAMAGED;
           REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET2);
           return;
    }
             if(evaded(ship, target))
             {
                sprintf( buf , "Turbolasers that fire from %s at you are evaded." , ship->name);
                echo_to_cockpit( AT_ORANGE , target , buf );
                sprintf( buf , "The ships turret fires at %s but they evade." , target->name);
                echo_to_cockpit( AT_ORANGE , ship , buf );
                learn_from_failure( ch, gsn_spacecombat );
                learn_from_failure( ch, gsn_spacecombat2 );
                learn_from_failure( ch, gsn_spacecombat3 );
                sprintf( buf, "Laserfire from %s barely misses %s." , ship->name , target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
             }
             else if ( number_percent( ) > chance )
             {  
                sprintf( buf, "Turbolasers fire from %s barely missing %s." , ship->name, target->name );
                echo_to_system( AT_ORANGE , ship , buf , target );
                sprintf( buf , "Turbolasers fire from %s at you but miss." , ship->name);  
                echo_to_cockpit( AT_ORANGE , target , buf );           
                sprintf( buf , "Turbolasers fire from the turret missing %s." , target->name);  
                echo_to_cockpit( AT_ORANGE , ship , buf );           
                learn_from_failure( ch, gsn_spacecombat ); 
    	        learn_from_failure( ch, gsn_spacecombat2 ); 
    	        learn_from_failure( ch, gsn_spacecombat3 ); 
    	        return;	
             } 
             sprintf( buf, "Turbolasers fire from %s, hitting %s." , ship->name, target->name );
             echo_to_system( AT_ORANGE , ship , buf , target );
             sprintf( buf , "You are hit by turbolasers from %s!" , ship->name);  
             echo_to_cockpit( AT_BLOOD , target , buf );           
             sprintf( buf , "turbolasers fire from the turret hitting %s!." , target->name);  
             echo_to_cockpit( AT_YELLOW , ship , buf );           
             learn_from_success( ch, gsn_spacecombat );
             learn_from_success( ch, gsn_spacecombat2 );
             learn_from_success( ch, gsn_spacecombat3 );
             echo_to_ship( AT_RED , target , "A small explosion vibrates through the ship." );           
             damage_ship_ch( target , ship->laserdamage+bonusdamage  , (ship->laserdamage+bonusdamage)*2  , ch, ship);
             
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
             
             return;
    	}
        
    	if ( ch->in_room->vnum == ship->gunseat && !str_prefix( argument , "ions") )
    	{
    	
    	     if (ship->ionstate == LASER_DAMAGED)
    	     {
    	        send_to_char("&RThe ships ion cannons are damaged.\n\r",ch);
    	      	return;
    	     } 
             if(IS_SET(ship->flags, SHIPFLAG_DUALION))
                linkshot = 2;
             if(IS_SET(ship->flags, SHIPFLAG_TRIION))
                linkshot = 3;
             if(IS_SET(ship->flags, SHIPFLAG_QUADION))
                linkshot = 4;
             if(linkshot == 0)
                linkshot = 1;
             if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
                exshots += ship->ions / 2;
             if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
                exshots += ship->ions / 2;
             if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
                exshots -= ship->ions / 2;
             if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
                exshots -= ship->ions /2;

             if (ship->ionstate >= (ship->ions + 1 - linkshot) + exshots)
    	     {
    	     	send_to_char("&RThe ion cannons are still recharging.\n\r",ch);
    	     	return;
    	     }
    	     if (ship->target0 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target0;
    	     if (ship->target0->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target0 = NULL; 
    	     	return;
    	     } 
             if(ship->ionstate < 0)
             { /* For overcharging. */
                bonusdamage += 1;
                bonusrange = 200;
             }

             if ( abs(target->vx - ship->vx) >(800+bonusrange) ||
                  abs(target->vy - ship->vy) >(800+bonusrange) ||
                  abs(target->vz - ship->vz) >(800+bonusrange) )
             {
                send_to_char("&RThat ship is out of ion range.\n\r",ch);
    	     	return;
             } 
             if ( ship->class < 2 && !is_facing( ship, target ) )
             {
                send_to_char("&RThe ion cannons can only fire forward. You'll need to turn your ship!\n\r",ch);
    	     	return;
             }      
          for(shots = 0; shots < linkshot; shots++)
          {
             ship->ionstate++;
             if (ship->target0->starsystem != ship->starsystem)
             {
                send_to_char("&RYour target seems to have left.\n\r",ch);
                ship->target0 = NULL;
                return;
             }
/*Arcturus Version */
             chance = IS_NPC(ch) ? ch->top_level
                    : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
             chance += (ship->manuever - target->manuever) / 10;
             chance += (ship->currspeed - target->currspeed) / 10;
             chance -= ( abs(target->vx - ship->vx)/120 );
             chance -= ( abs(target->vy - ship->vy)/120 );
             chance -= ( abs(target->vz - ship->vz)/120 );
             if ( ch->subclass == SUBCLASS_WFOCUS )
             {
                chance = chance * 2;
                chance = URANGE( 15 , chance , 95 );
                bonusdamage = 3;
             }
             else
                chance = URANGE( 10, chance, 90 );
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
/*Sabotage bit by Arcturus */
    if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDIONS))
    {
           echo_to_room( AT_BLUE , get_room_index(ship->turret2) , "A small blast damages your ion cannons, it must be sabotage!\n\r");
           echo_to_room( AT_BLOOD + AT_BLINK , get_room_index(ship->turret2) , "IONS DAMAGED!\n\r" );
           ship->ionstate = LASER_DAMAGED;
           REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDIONS);
           return;
    }
             if(evaded(ship, target))
             {
                sprintf( buf , "A blast of ionic energy fires from %s at you but you evade it.." , ship->name);
                echo_to_cockpit( AT_BLUE , target , buf );
                sprintf( buf , "The ships ion cannons fire at %s but they evade it." , target->name);
                echo_to_cockpit( AT_BLUE , ship , buf );
                learn_from_failure( ch, gsn_spacecombat );
                learn_from_failure( ch, gsn_spacecombat2 );
                learn_from_failure( ch, gsn_spacecombat3 );
                sprintf( buf, "A blast of ionic energy from %s barely misses %s." , ship->name , target->name );
                echo_to_system( AT_BLUE , ship , buf , target );
             }
             else if ( number_percent( ) > chance )
             {  
                sprintf( buf , "A blast of ionic energy fires from %s at you but miss." , ship->name);  
                echo_to_cockpit( AT_BLUE , target , buf );           
                sprintf( buf , "The ships ion cannons fire at %s but miss." , target->name);  
                echo_to_cockpit( AT_BLUE , ship , buf );           
                learn_from_failure( ch, gsn_spacecombat ); 
    	        learn_from_failure( ch, gsn_spacecombat2 ); 
    	        learn_from_failure( ch, gsn_spacecombat3 ); 
    	        sprintf( buf, "A blast of ionic energy from %s barely misses %s." , ship->name , target->name );
                echo_to_system( AT_BLUE , ship , buf , target );
             }
             else
             { 
                sprintf( buf, "An ion blast from %s hits %s." , ship->name, target->name );
                echo_to_system( AT_BLUE , ship , buf , target );
                sprintf( buf , "You are hit by an ion blast from %s!" , ship->name);  
                echo_to_cockpit( AT_BLUE , target , buf );           
                sprintf( buf , "Your ships ion cannons hit %s!." , target->name);  
                echo_to_cockpit( AT_BLUE , ship , buf );           
                learn_from_success( ch, gsn_spacecombat );
                learn_from_success( ch, gsn_spacecombat2 );
                learn_from_success( ch, gsn_spacecombat3 );
                echo_to_ship( AT_BLUE , target , "Wave of blue sparks fly over the ship!" );
                iondamage_ship_ch( target , (ship->laserdamage+bonusdamage)/2  , (ship->laserdamage+bonusdamage) , ch, ship );
             }
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
          }   
             return;
    	}

    	if ( ch->in_room->vnum == ship->gunseat && !str_prefix( argument , "autocannon") )
    	{
	     if (ship->autocannon != 1)
	     {
    	     	send_to_char("&RYou may have better luck using a ship WITH an autocannon.\n\r",ch);
    	     	return;
	     }	     
    	     if (ship->target0 == NULL )
    	     {
    	     	send_to_char("&RYou need to choose a target first.\n\r",ch);
    	     	return;
    	     }    	    
    	     target = ship->target0;
    	     if (ship->target0->starsystem != ship->starsystem || IS_SET(target->flags, SHIPFLAG_CLOAKED))
    	     {
    	     	send_to_char("&RYour target seems to have left.\n\r",ch);
    	        ship->target0 = NULL; 
    	     	return;
    	     } 
             if ( abs(target->vx - ship->vx) >1500 ||
                  abs(target->vy - ship->vy) >1500 ||
                  abs(target->vz - ship->vz) >1500 )
             {
                send_to_char("&RThat ship is out of autocannon range.\n\r",ch);
    	     	return;
             } 
             if ( ship->class < 2 && !is_facing( ship, target ) )
             {
                send_to_char("&RThe autocannon can only fire forward. You'll need to turn your ship!\n\r",ch);
    	     	return;
             }
	     if (ship->autoammo == 0)
	     {
    	     	send_to_char("&RThe autocannon cycles up, but has no ammo to fire!\n\r",ch);
    	     	return;
	     }	     
             act( AT_PLAIN, "$n presses the fire button.", ch,
                  NULL, argument , TO_ROOM );
		autohits = 1;
		automiss = 0;
		while ( automiss == 0 )
		{
/*Arcturus Version */
                 chance = IS_NPC(ch) ? ch->top_level
                        : (int) ( get_curr_dex(ch) + ch->pcdata->learned[gsn_spacecombat]/4
                           + ch->pcdata->learned[gsn_spacecombat2]/4 + ch->pcdata->learned[gsn_spacecombat3]/4 );
                  chance += (ship->manuever - target->manuever) / 10;
                  chance += (ship->currspeed - target->currspeed) / 10;
                  chance -= ( abs(target->vx - ship->vx)/120 );
                  chance -= ( abs(target->vy - ship->vy)/120 );
                  chance -= ( abs(target->vz - ship->vz)/120 );
                  if( ch->subclass == SUBCLASS_WFOCUS )
                  {
                      bonusdamage = 1;
                      chance += 15; 
                      chance = URANGE(15, chance, 95);
                  }
                  else
                      chance = URANGE(10, chance, 90);
                  if ( number_percent( ) < chance )  
                  	autohits++;
		else 
				automiss++;
		}
		 if ( autohits > 100 )
			autohits = 100;
             if ( ch->subclass == SUBCLASS_WFOCUS )
                bonusdamage = 3;

             sprintf( buf, "%s fires a stream of autocannon fire at %s." , ship->name, target->name );
             echo_to_system( AT_CYAN , ship , buf , target );
             sprintf( buf , "You are hit by autocannon fire from %s!" , ship->name);  
             echo_to_cockpit( AT_CYAN , target , buf );           
             sprintf( buf , "You fire a burst from the autocannon at %s, scoring %d hits!." , target->name, autohits );  
             echo_to_cockpit( AT_CYAN , ship , buf );           
             learn_from_success( ch, gsn_spacecombat );
             learn_from_success( ch, gsn_spacecombat2 );
             learn_from_success( ch, gsn_spacecombat3 );
             echo_to_ship( AT_CYAN , target , "The ship shudders as thousands of autocannon rounds slam into it!" );
             damage_ship_ch( target , ( (ship->autodamage+bonusdamage) * autohits)  , ( (ship->autodamage+bonusdamage) * autohits * 2) , ch, ship );
             ship->autoammo = ( ship->autoammo - 1 );
             if ( autofly(target) && target->target0 != ship )
             {
                target->target0 = ship; 
                sprintf( buf , "You are being targetted by %s." , target->name);  
                echo_to_cockpit( AT_BLOOD , ship , buf );
             }
             
             return;
    	}

        send_to_char( "&RYou can't fire that!\n\r" , ch);
    	
}


void do_calculate(CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char arg3[MAX_INPUT_LENGTH];  
    int chance , count;
    int distance;
    SHIP_DATA *ship;
    SPACE_DATA *starsystem;
    argument = one_argument( argument , arg1);
    argument = one_argument( argument , arg2);
    argument = one_argument( argument , arg3);
    
    
    	        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
    	            return;
    	        }
                
                if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
                if (  (ship = ship_from_navseat(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYou must be at a nav computer to calculate jumps.\n\r",ch);
    	            return;
    	        }
    	        
                if ( autofly(ship)  )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first....\n\r",ch);
    	            return;
    	        }
    	        
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RAnd what exactly are you going to calculate...?\n\r" , ch );
                   return;
                }   
    	        if (ship->hyperspeed == 0)
                {
                  send_to_char("&RThis ship is not equipped with a hyperdrive!\n\r",ch);
                  return;   
                }
                if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
    	            return;
    	        }

                if ((ship->shipstate2 == SHIP_DOCK) || (ship->shipstate2 == SHIP_DOCK_2))
                {
                    send_to_char("&RNot while docking procedures are going on.\n\r", ch);
                    return;
                }
                
                if (ship->shipstate2 == SHIP_DOCK_3)
                {
                    send_to_char("&RDetach from the docked ship first.\n\r",ch);
                    return;
                }

    	        if (ship->starsystem == NULL)
    	        {
    	            send_to_char("&RYou can only do that in realspace.\n\r",ch);
    	            return;
    	        }
    	        if (argument[0] == '\0')
    	        {
    	            send_to_char("&WFormat: Calculate <starsystem> <entry x> <entry y> <entry z>\n\r&wPossible destinations:\n\r",ch);
    	            for ( starsystem = first_starsystem; starsystem; starsystem = starsystem->next )
                    {
                       set_char_color( AT_NOTE, ch );
                       if ( IS_SET(ship->flags, SHIPFLAG_SIMULATOR) )
                       {
                          if ( !str_cmp( starsystem->name, "Simulator" ) )
                          {
                             ch_printf(ch,"%-30s %d\n\r",starsystem->name,
                                      (abs(starsystem->xpos - ship->starsystem->xpos)+
                                       abs(starsystem->ypos - ship->starsystem->ypos))/2);
                             count++;
                          }
                       }
                       else
                       {
                          if ( str_cmp( starsystem->name, "Simulator" ) )
                          {
                          ch_printf(ch,"%-30s %d\n\r",starsystem->name,
                                   (abs(starsystem->xpos - ship->starsystem->xpos)+
                                    abs(starsystem->ypos - ship->starsystem->ypos))/2);
                          count++;
                          }
                       }
                    }
                    return;
    	        }
               chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_navigation]) ;
                if ( number_percent( ) > chance )
    		{
	           send_to_char("&RYou cant seem to figure the charts out today.\n\r",ch);
	           learn_from_failure( ch, gsn_navigation );
    	   	   return;	
    	   	}

    
    ship->currjump = starsystem_from_name( arg1 );
    ship->jx = atoi(arg2);
    ship->jy = atoi(arg3);
    ship->jz = atoi(argument);
    
    if ( ship->currjump == NULL )
    {
        send_to_char( "&RYou can't seem to find that starsytem on your charts.\n\r", ch);
        return;
    }/* for Simulators by Ackbar, installed by Arcturus */

    distance = (int) sqrt(pow((atoi(arg2) - ship->vx), 2) +  pow((atoi(arg3) - ship->vy), 2)
             + pow((atoi(argument) - ship->vz),2));
    if(!str_cmp(ship->currjump->name, ship->starsystem->name) && abs(distance) < 3000)
    {
//        sprintf(buf, "Ship %s removed from calculation. Distance %d\n\r", ship->name, distance);
//        log_string(buf);
        send_to_char("You can't hyperdrive to something so close, you may overjump it.\n\r", ch);
        ship->currjump = NULL;
        return;
    }
    if (IS_SET(ship->flags, SHIPFLAG_SIMULATOR) && ship->currjump != starsystem_from_name("Simulator") )
    {
        send_to_char( "&RYou can't seem to find that starsytsem on your charts.\n\r", ch);
        return;
    }
    else if (!IS_SET(ship->flags, SHIPFLAG_SIMULATOR) && ship->currjump == starsystem_from_name("Simulator") )
    {
       send_to_char( "&RYou can't seem to find that starsytsem on your charts.\n\r", ch);
       return;
    }
    else
    { 
        SPACE_DATA * starsystem;
      
        starsystem = ship->currjump;
           
          if ( starsystem->star1 && strcmp(starsystem->star1,"") && 
                     abs(ship->jx - starsystem->s1x) < 300 && 
                     abs(ship->jy - starsystem->s1y) < 300 &&
                     abs(ship->jz - starsystem->s1z) < 300 )
                {
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Jump coordinates too close to stellar object.");
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Hyperjump NOT set.");
                    ship->currjump = NULL;
                    return;
                }              
          else if ( starsystem->star2 && strcmp(starsystem->star2,"") && 
               abs(ship->jx - starsystem->s2x) < 300 && 
                     abs(ship->jy - starsystem->s2y) < 300 &&
                     abs(ship->jz - starsystem->s2z) < 300 )
                {
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Jump coordinates too close to stellar object.");
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Hyperjump NOT set.");
                    ship->currjump = NULL;
                    return;
                }            
          else if ( starsystem->planet1 && strcmp(starsystem->planet1,"") && 
               abs(ship->jx - starsystem->p1x) < 300 && 
                     abs(ship->jy - starsystem->p1y) < 300 &&
                     abs(ship->jz - starsystem->p1z) < 300 )
                {
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Jump coordinates too close to stellar object.");
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Hyperjump NOT set.");
                    ship->currjump = NULL;
                    return;
                }            
          else if ( starsystem->planet2 && strcmp(starsystem->planet2,"") && 
               abs(ship->jx - starsystem->p2x) < 300 && 
                     abs(ship->jy - starsystem->p2y) < 300 &&
                     abs(ship->jz - starsystem->p2z) < 300 )
                {
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Jump coordinates too close to stellar object.");
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Hyperjump NOT set.");
                    ship->currjump = NULL;
                    return;
                }            
          else if ( starsystem->planet3 && strcmp(starsystem->planet3,"") && 
               abs(ship->jx - starsystem->p3x) < 300 && 
                     abs(ship->jy - starsystem->p3y) < 300 &&
                     abs(ship->jz - starsystem->p3z) < 300 )
                {
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Jump coordinates too close to stellar object.");
                    echo_to_cockpit( AT_RED, ship, "WARNING.. Hyperjump NOT set.");
                    ship->currjump = NULL;
                    return;
                } 
          else
          {           
             ship->jx += number_range ( -250 , 250 );
             ship->jy += number_range ( -250 , 250 );
             ship->jz += number_range ( -250 , 250 );
          }
    }
    
    ship->hyperdistance  = abs(ship->starsystem->xpos - ship->currjump->xpos) ;
    ship->hyperdistance += abs(ship->starsystem->ypos - ship->currjump->ypos) ;
    ship->hyperdistance /= 5;
    
    if (ship->hyperdistance<100)
      ship->hyperdistance = 100;
    
    ship->hyperdistance += number_range(0, 200);
    
    sound_to_room( ch->in_room , "!!SOUND(computer)" );
    
    send_to_char( "&GHyperspace course set. Ready for the jump to lightspeed.\n\r", ch);
    act( AT_PLAIN, "$n does some calculations using the ships computer.", ch,
		        NULL, argument , TO_ROOM );
	                
    learn_from_success( ch, gsn_navigation );
    	
    WAIT_STATE( ch , 2*PULSE_VIOLENCE );	
}

void do_recharge(CHAR_DATA *ch, char *argument )
{
    int recharge;
    int chance;
    SHIP_DATA *ship;
    
   
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        if (  (ship = ship_from_coseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RThe controls must be at the co-pilot station.\n\r",ch);
            return;
        }
        
                if ( autofly(ship)  )
    	        {
    	            send_to_char("&RUnable to Comply, Autopilot Engaged\n\r",ch);
    	            return;
    	        }
    	        
        /*        if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ships drive is disabled. Unable to manuever.\n\r",ch);
    	            return;
    	        } Whats this got to do with shields? - Arcturus */
    	        
        if ( ship->energy < 100 )
        {
              send_to_char("&RTheres not enough energy!\n\r",ch);
              return;
        }
    	        
        chance = IS_NPC(ch) ? ch->top_level
                 : (int) (ch->pcdata->learned[gsn_shipsystems]);
        if ( number_percent( ) > chance )
        {
            send_to_char("&RYou fail to work the controls properly.\n\r",ch);
            learn_from_failure( ch, gsn_shipsystems );
    	   return;	
        }
        
    send_to_char( "&GRecharging shields..\n\r", ch);
    act( AT_PLAIN, "$n pulls back a lever on the control panel.", ch,
         NULL, argument , TO_ROOM );
    
    learn_from_success( ch, gsn_shipsystems );
     
    recharge  = UMIN(  ship->maxshield-ship->shield , ship->energy*5 + 100 );
    recharge  = URANGE( 1, recharge , 25+ship->class*25 );
    ship->shield += recharge;
    if(ship->shield > ship->maxshield)
    {
       recharge = ship->maxshield-ship->shield;
       ship->shield = ship->maxshield;
    }
    ship->energy -= ( recharge*2 + recharge * ship->class );        
}


void do_repairship(CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int chance, change;
    SHIP_DATA *ship;
    
    strcpy( arg, argument );    
    if(!IS_NPC(ch))
    {
       if(IS_SET(ch->pcdata->flags, PCFLAG_BOUND))
       {
          send_to_char("Not while your bound.\n\r", ch);
          return;
       }
    }

    switch( ch->substate )
    { 
    	default:
    	        if (  (ship = ship_from_engine(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYou must be in the engine room of a ship to do that!\n\r",ch);
    	            return;
    	        }
                
              if ( str_cmp( argument , "hull" ) && str_cmp( argument , "drive" ) && 
                     str_cmp( argument , "launcher" ) && str_cmp( argument , "laser" ) && 
                     str_cmp( argument , "turret 1" ) && str_cmp( argument , "turret 2") &&
	             str_cmp( argument , "ions" )     && str_cmp( argument , "rlauncher") &&
                     str_cmp( argument , "tlauncher") )
                {
                   send_to_char("&RYou need to spceify something to repair:\n\r",ch);
                   send_to_char("&rTry: hull, drive, launcher, tlauncher, rlauncher, laser, ions, turret 1, or turret 2\n\r",ch);
                   return;
                }
                            
                chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_shipmaintenance]);
                if ( number_percent( ) < chance )
    		{
    		   send_to_char( "&GYou begin your repairs\n\r", ch);
    		   act( AT_PLAIN, "$n begins repairing the ships $T.", ch,
		        NULL, argument , TO_ROOM );
                   if(ch->subclass == SUBCLASS_QUICKWORK) 
   		     add_timer ( ch , TIMER_DO_FUN , 3 , do_repairship , 1 );
                   else
                     add_timer ( ch, TIMER_DO_FUN, 10, do_repairship, 1);
    		   ch->dest_buf = str_dup(arg);
    		   return;
	        }
	        send_to_char("&RYou fail to locate the source of the problem.\n\r",ch);
    	   	return;	
    	
    	case 1:
    		if ( !ch->dest_buf )
    		   return;
    		strcpy(arg, ch->dest_buf);
    		DISPOSE( ch->dest_buf);
    		break;
    		
    	case SUB_TIMER_DO_ABORT:
    		DISPOSE( ch->dest_buf );
    		ch->substate = SUB_NONE;
    		if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
    		      return;    		                                   
    	        send_to_char("&RYou are distracted and fail to finish your repairs.\n\r", ch);
    		return;
    }
    
    ch->substate = SUB_NONE;
    
    if ( (ship = ship_from_engine(ch->in_room->vnum)) == NULL )
    {  
       return;
    }
    
    if ( !str_cmp(arg,"hull") )
    {
        change = URANGE( 0 , 
                         number_range( (int) ( ch->pcdata->learned[gsn_shipmaintenance]) , (int) (ch->pcdata->learned[gsn_shipmaintenance] * 2) ),
                         ( ship->maxhull - ship->hull ) );
        ship->hull += change;
        ch_printf( ch, "&GRepair complete.. Hull strength inreased by %d points.\n\r", change );
    }
    
    if ( !str_cmp(arg,"drive") )
    {  
       if (ship->location == ship->lastdoc)
          ship->shipstate = SHIP_DOCKED;
       else if(ship->shipstate != SHIP_HYPERSPACE)
          ship->shipstate = SHIP_READY;
       send_to_char("&GShips drive repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDENGINE))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
       }		
    }
    
    if ( !str_cmp(arg,"launcher") )
    {  
       ship->missilestate = MISSILE_READY;
       send_to_char("&GMissile launcher repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS);
       }
    }
    if ( !str_cmp(arg, "tlauncher") )
    {
       ship->torpedostate = MISSILE_READY;
       send_to_char("&GTorpedo launcher repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS);
       }
    }
    if ( !str_cmp(arg, "rlauncher"))
    {
       ship->rocketstate = MISSILE_READY;
       send_to_char("&GRocket launcher repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS);
       }
    }

    if ( !str_cmp(arg,"laser") )
    {  
       ship->statet0 = LASER_READY;
       send_to_char("&GMain laser repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLASERS))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDLASERS);
       }
    }

    if ( !str_cmp(arg,"ions") )
    {  
       ship->ionstate = LASER_READY;
       send_to_char("&GIon cannons repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDIONS))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDIONS);
       }
    }
    
    if ( !str_cmp(arg,"turret 1") )
    {  
       ship->statet1 = LASER_READY;
       send_to_char("&GLaser Turret 1 repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET1))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET1);
       }
    }
    
    if ( !str_cmp(arg,"turret 2") )
    {  
       ship->statet2 = LASER_READY;
       send_to_char("&Laser Turret 2 repaired.\n\r", ch);
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET2))
       {
          send_to_char("Sabotage detected, removed.\n\r", ch);
          REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET2);
       }
    }
        
    act( AT_PLAIN, "$n finishes the repairs.", ch,
         NULL, argument , TO_ROOM );

    learn_from_success( ch, gsn_shipmaintenance );
    	
}


void do_addpilot(CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    
   if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
   {
           send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
           return;
   }
    
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RYou can't do that here.\n\r" , ch );
                   return;
                }   
    
   if ( str_cmp( ship->owner , ch->name ) )
   {
   
     if ( !IS_NPC(ch) && ch->pcdata && ch->pcdata->clan && !str_cmp(ch->pcdata->clan->name,ship->owner) ) 
         if ( !str_cmp(ch->pcdata->clan->leader,ch->name) )
           ;
         else if ( !str_cmp(ch->pcdata->clan->number1,ch->name) )
           ;
         else if ( !str_cmp(ch->pcdata->clan->number2,ch->name) )
           ;
         else
         {
           send_to_char( "&RThat isn't your ship!" ,ch );
   	   return;
         }
     else
     {     
   	send_to_char( "&RThat isn't your ship!" ,ch );
   	return;
     }
   
   }

   if (argument[0] == '\0')
   {
       send_to_char( "&RAdd which pilot?\n\r" ,ch );
       return;
   }
   
   if ( str_cmp( ship->pilot , "" ) )
   {
        if ( str_cmp( ship->copilot , "" ) )
        {
             send_to_char( "&RYou are ready have a pilot and copilot..\n\r" ,ch );
             send_to_char( "&RTry rempilot first.\n\r" ,ch );
             return;
        }
        
        STRFREE( ship->copilot );
	ship->copilot = STRALLOC( argument );
	send_to_char( "Copilot Added.\n\r", ch );
	save_ship( ship );
	return;
        
        return;
   }
   
   STRFREE( ship->pilot );
   ship->pilot = STRALLOC( argument );
   send_to_char( "Pilot Added.\n\r", ch );
   save_ship( ship );

}

void do_rempilot(CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    
   if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
   {
           send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
           return;
   }
   
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RYou can't do that here.\n\r" , ch );
                   return;
                }   
   
   if ( str_cmp( ship->owner , ch->name ) )
   {
   
     if ( !IS_NPC(ch) && ch->pcdata && ch->pcdata->clan && !str_cmp(ch->pcdata->clan->name,ship->owner) ) 
         if ( !str_cmp(ch->pcdata->clan->leader,ch->name) )
           ;
         else if ( !str_cmp(ch->pcdata->clan->number1,ch->name) )
           ;
         else if ( !str_cmp(ch->pcdata->clan->number2,ch->name) )
           ;
         else
         {
           send_to_char( "&RThat isn't your ship!" ,ch );
   	   return;
         }
     else
     {     
   	send_to_char( "&RThat isn't your ship!" ,ch );
   	return;
     }
   
   }

   if (argument[0] == '\0')
   {
       send_to_char( "&RRemove which pilot?\n\r" ,ch );
       return;
   }
   
   if ( !str_cmp( ship->pilot , argument ) )
   {
        STRFREE( ship->pilot );
	ship->pilot = STRALLOC( "" );
	send_to_char( "Pilot Removed.\n\r", ch );
	save_ship( ship );
	return;
   }       
   
   if ( !str_cmp( ship->copilot , argument ) )
   {      
        STRFREE( ship->copilot );
	ship->copilot = STRALLOC( "" );
	send_to_char( "Copilot Removed.\n\r", ch );
	save_ship( ship );
	return;
    }    

    send_to_char( "&RThat person isn't listed as one of the ships pilots.\n\r" ,ch );

}

void do_radar( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *target;
    int chance; 
    int distance;
    SHIP_DATA *ship;
    MISSILE_DATA *missile;    
   
        if (   (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit or turret of a ship to do that!\n\r",ch);
            return;
        }
        
        if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
        if (ship->shipstate == SHIP_DOCKED)
        {
            send_to_char("&RWait until after you launch!\n\r",ch);
            return;
        }
        
        if (ship->shipstate == SHIP_HYPERSPACE)
        {
            send_to_char("&RYou can only do that in realspace!\n\r",ch);
            return;
        }
        
    	if (ship->starsystem == NULL)
    	{
    	       send_to_char("&RYou can't do that unless the ship is flying in realspace!\n\r",ch);
    	       return;
    	}        
    	        
        chance = IS_NPC(ch) ? ch->top_level
             : (int)  (ch->pcdata->learned[gsn_navigation]) ;
        if ( number_percent( ) > chance )
        {
           send_to_char("&RYou fail to work the controls properly.\n\r",ch);
           learn_from_failure( ch, gsn_navigation );
    	   return;	
        }
        
    
    act( AT_PLAIN, "$n checks the radar.", ch,
         NULL, argument , TO_ROOM );
     
                   sound_to_ship(ship , "!!SOUND(radar) \n\r" );
    	           set_char_color(  AT_WHITE, ch );
    	           ch_printf(ch, "%s\n\r\n\r" , ship->starsystem->name );
    	           set_char_color(  AT_WHITE, ch );
    	           if ( ship->starsystem->star1 && str_cmp(ship->starsystem->star1,"") ) 
    	           {   
                       distance = (int) sqrt(pow(ship->starsystem->s1x - ship->vx, 2) 
                                + pow(ship->starsystem->s1y - ship->vy, 2)
                                + pow(ship->starsystem->s1z - ship->vz, 2) );
                       ch_printf(ch, "%s   %d %d %d   (%d)\n\r" , 
    	                        ship->starsystem->star1,
    	                        ship->starsystem->s1x,
    	                        ship->starsystem->s1y,
    	                        ship->starsystem->s1z, distance );
    	           }
                   if ( ship->starsystem->star2 && str_cmp(ship->starsystem->star2,"")  ) 
    	           {
                       distance = (int) sqrt(pow(ship->starsystem->s2x - ship->vx, 2) 
                                + pow(ship->starsystem->s2y - ship->vy, 2)
                                + pow(ship->starsystem->s2z - ship->vz, 2) );
                       ch_printf(ch, "%s   %d %d %d   (%d)\n\r" , 
    	                        ship->starsystem->star2,
    	                        ship->starsystem->s2x,
    	                        ship->starsystem->s2y,
    	                        ship->starsystem->s2z, distance );
                   } 
                   set_char_color( AT_LBLUE, ch ); 
  	           if ( ship->starsystem->planet1 && str_cmp(ship->starsystem->planet1,"") ) 
    	           {
                       distance = (int) sqrt(pow(ship->starsystem->p1x - ship->vx, 2) 
                                + pow(ship->starsystem->p1y - ship->vy, 2)
                                + pow(ship->starsystem->p1z - ship->vz, 2) );
                       ch_printf(ch, "%s   %d %d %d   (%d)\n\r" , 
    	                        ship->starsystem->planet1,
    	                        ship->starsystem->p1x,
    	                        ship->starsystem->p1y,
    	                        ship->starsystem->p1z, distance );
                   }
    	           if ( ship->starsystem->planet2 && str_cmp(ship->starsystem->planet2,"")  ) 
                   {
                       distance = (int) sqrt(pow(ship->starsystem->p2x - ship->vx, 2) 
                                + pow(ship->starsystem->p2y - ship->vy, 2)
                                + pow(ship->starsystem->p2z - ship->vz, 2) );
    	               ch_printf(ch, "%s   %d %d %d   (%d)\n\r" , 
    	                        ship->starsystem->planet2,
    	                        ship->starsystem->p2x,
    	                        ship->starsystem->p2y,
    	                        ship->starsystem->p2z, distance );
                   }
    	           if ( ship->starsystem->planet3 && str_cmp(ship->starsystem->planet3,"")  ) 
                   {
                       distance = (int) sqrt(pow(ship->starsystem->p3x - ship->vx, 2) 
                                + pow(ship->starsystem->p3y - ship->vy, 2)
                                + pow(ship->starsystem->p3z - ship->vz, 2) );
    	               ch_printf(ch, "%s   %d %d %d   (%d)\n\r" , 
    	                        ship->starsystem->planet3,
    	                        ship->starsystem->p3x,
    	                        ship->starsystem->p3y,
    	                        ship->starsystem->p3z, distance );
                   }
    	           ch_printf(ch,"\n\r");
    	           for ( target = ship->starsystem->first_ship; target; target = target->next_in_starsystem )
                   {       
                        if ( target != ship && !IS_SET(target->flags, SHIPFLAG_CLOAKED)) 
                        {
                            if(!str_cmp(target->owner, "The Empire") || target->type == SHIP_IMPERIAL )
                               set_char_color( AT_GREEN, ch );
                            else if(!str_cmp(target->owner, "New Republic") || target->type == SHIP_REPUBLIC )
                               set_char_color( AT_RED, ch );
                            else if(!str_cmp(target->owner, "Pirates" ) )
                               set_char_color( AT_PURPLE, ch);
                            else
                               set_char_color( AT_BLUE, ch );
                            distance = (int) sqrt(pow(target->vx - ship->vx, 2) 
                                     + pow(target->vy - ship->vy, 2)
                                     + pow(target->vz - ship->vz, 2) );
                            ch_printf(ch, "%s    %.0f %.0f %.0f   (%d)\n\r", 
                            target->name,
                            target->vx,
                            target->vy,
                            target->vz, distance);
                        }
                   }
                   ch_printf(ch,"\n\r");
                   set_char_color( AT_YELLOW, ch);
    	           for ( missile = ship->starsystem->first_missile; missile; missile = missile->next_in_starsystem )
                   {        
                           distance = (int) sqrt(pow(missile->mx - ship->vx, 2) 
                                    + pow(missile->my - ship->vy, 2)
                                    + pow(missile->mz - ship->vz, 2) );
                           ch_printf(ch, "%s    %d %d %d   (%d)\n\r", 
                           	missile->missiletype == CONCUSSION_MISSILE ? "A Concusion missile" : 
    			        ( missile->missiletype ==  PROTON_TORPEDO ? "A Torpedo" : 
    			        ( missile->missiletype ==  HEAVY_ROCKET ? "A Heavy Rocket" : "A Heavy Space Bomb" ) ),
                           	missile->mx,
                           	missile->my,
                                missile->mz, distance );
                   }
                     
                   ch_printf(ch, "\n\r&WYour Coordinates: %.0f %.0f %.0f\n\r" , 
                             ship->vx , ship->vy, ship->vz);   
        
    	        
        learn_from_success( ch, gsn_navigation );
  
}

void do_autotrack( CHAR_DATA *ch, char *argument )
{
   SHIP_DATA *ship;
   int chance;
 
   if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
   {
        send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
        return;
   }
   
        if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
 
        if ( ship->class == SHIP_PLATFORM )
    	        {
    	            send_to_char("&RPlatforms don't have autotracking systems!\n\r",ch);
    	            return;
    	        }
        if ( ship->class == CAPITAL_SHIP || ship->class == SUPERCAPITAL_SHIP )
    	        {
    	            send_to_char("&RThis ship is too big for autotracking!\n\r",ch);
    	            return;
    	        }
    	        
   if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
   {
        send_to_char("&RYou aren't in the pilots chair!\n\r",ch);
        return;
   }
   
                if ( autofly(ship)  )
    	        {
    	            send_to_char("&RYou'll have to turn off the ships autopilot first....\n\r",ch);
    	            return;
    	        }
    	        
   chance = IS_NPC(ch) ? ch->top_level
             : (int)  (ch->pcdata->learned[gsn_shipsystems]) ;
        if ( number_percent( ) > chance )
        {
           send_to_char("&RYour notsure which switch to flip.\n\r",ch);
           learn_from_failure( ch, gsn_shipsystems );
    	   return;	
        }
   
   act( AT_PLAIN, "$n flips a switch on the control panel.", ch,
         NULL, argument , TO_ROOM );
   if (ship->autotrack)
   {
     ship->autotrack = FALSE;
     echo_to_cockpit( AT_YELLOW , ship, "Autotracking off.");
   }
   else
   {
      ship->autotrack = TRUE;
      echo_to_cockpit( AT_YELLOW , ship, "Autotracking on.");
   }
   
   learn_from_success( ch, gsn_shipsystems );
        
}

void do_jumpvector( CHAR_DATA *ch, char *argument )
{}
void do_reload( CHAR_DATA *ch, char *argument )
{}
void do_closebay( CHAR_DATA *ch, char *argument )
{}

void do_openbay( CHAR_DATA *ch, char *argument )
{
        SHIP_DATA *ship;
        int chance;
         
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
                send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);

                return;
        }

        if ( ship->class > MOBILE_SUIT )
        {
                send_to_char("&RThis isn't a spacecraft!\n\r",ch);
                return;
        }
         
                
        if ( ship->class == SHIP_PLATFORM )
        {
                send_to_char("&RPlatforms don't have Bay Doors!\n\r",ch);
                return;
        }

        if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
        {
                send_to_char("&RYou aren't in the pilots chair!\n\r",ch);
                return;
        }
         
        /* I have removed this because I don't think it is right to use  
           but put it back in if you want
         
        if ( autofly(ship)  )
        {
        send_to_char("&RYou'll have to turn off the ships autopilot
        first....\n\r",ch);
        return;
        }
         
    */
           
         
        chance = IS_NPC(ch) ? ch->top_level
       : (int)  (ch->pcdata->learned[gsn_shipsystems]) ;
        if ( number_percent( ) > chance )
        {
                send_to_char("&RYour not sure which switch to flip.\n\r",ch);
                learn_from_failure( ch, gsn_shipsystems );
                return;
        }   
           
        act( AT_PLAIN, "$n flips a switch on the control panel.", ch,
        NULL, argument , TO_ROOM );
         
        if (ship->bayopen)
        {
                ship->bayopen = FALSE;
                echo_to_cockpit( AT_YELLOW , ship, "Closing bay doors.");
        }
        else
        {  
        ship->bayopen = TRUE;
        echo_to_cockpit( AT_YELLOW , ship, "Opening Bay Doors.");
       }

        learn_from_success( ch, gsn_shipsystems );

}

void do_tractorbeam( CHAR_DATA *ch, char *argument )
{

    char arg[MAX_INPUT_LENGTH];
    int chance;
    SHIP_DATA *ship;
    SHIP_DATA *target;
	char buf[MAX_STRING_LENGTH];
    
    strcpy( arg, argument );

	if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
	{
		send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
		return;
	}
    	    
	if ( ship->class > SHIP_PLATFORM )
	{
		send_to_char("&RThis isn't a spacecraft!\n\r",ch);
		return;
	}


	if ( !check_pilot( ch , ship ) )
	{
		send_to_char("This isn't your ship!\n\r" , ch );
		return;
	}

	if ( ship->tractorbeam == 0 )
	{
		send_to_char("You might want to install a tractorbeam!\n\r" , ch );
		return;
	}
    
	if ( ship->hanger == 0 )
	{
		send_to_char("No hangar available.\n\r",ch);
		return;
	}

	if ( !ship->bayopen )
	{
		send_to_char("Your hangar is closed.\n\r",ch);
		return;
	}

   	        
	if ( (ship = ship_from_pilotseat(ch->in_room->vnum)) == NULL )
	{
		send_to_char("&RYou need to be in the pilot seat!\n\r",ch);
		return;
	}
    	        
    	            	        
	if (ship->shipstate == SHIP_DISABLED)
	{
		send_to_char("&RThe ships drive is disabled. No power available.\n\r",ch);
		return;
	}

	if (ship->shipstate == SHIP_DOCKED || ship->shipstate2 != SHIP_READY)
	{
		send_to_char("&RYour ship is docked!\n\r",ch);    
		return;	        
	}
    	                			
	if (ship->shipstate == SHIP_HYPERSPACE)		   
	{
					
		send_to_char("&RYou can only do that in realspace!\n\r",ch);
		return;   			
	}

	if (ship->shipstate != SHIP_READY)
	{
		send_to_char("&RPlease wait until the ship has finished its current maneuver.\n\r",ch);
		return;	    
	}



    	        
	if ( argument[0] == '\0' )	        
	{  	
		send_to_char("&RCapture what?\n\r",ch);	
		return;				
	}
   	            
	target = get_ship_here( argument , ship->starsystem );

	if ( target == NULL || IS_SET(target->flags, SHIPFLAG_CLOAKED))            
	{   	                
		send_to_char("&RI don't see that here.\n\r",ch);	 
		return;             
	} 
   	           
	if ( target == ship )   	
	{   	               
		send_to_char("&RYou can't yourself!\n\r",ch);   	 
		return;              
	}   	           
   	         
	if ( target->shipstate == SHIP_LAND )
	{
		send_to_char("&RThat ship is already in a landing sequence.\n\r", ch);
		return;
	}

	if (  (target->vx > ship->vx + 200) || (target->vx < ship->vx - 200) ||
	   (target->vy > ship->vy + 200) || (target->vy < ship->vy - 200) ||
	   (target->vz > ship->vz + 200) || (target->vz < ship->vz - 200) )
	{
		send_to_char("&R That ship is too far away! You'll have to fly a litlle closer.\n\r",ch);
		return;
	}   
    
	if (ship->class <= target->class)
	{
		send_to_char("&RThat ship is too big for your hangar.\n\r",ch);
		return;
	}
    	        
	if  ( target->class == SHIP_PLATFORM )
	{
		send_to_char( "&RYou can't capture platforms.\n\r" , ch );
		return;
	}   
    
	if ( target->class > MIDSIZE_SHIP)
	{
		send_to_char("&RYou can't capture capital ships.\n\r",ch);
		return;
	}


	if ( ship->energy < (25 + 25*target->class) )
	{
		send_to_char("&RTheres not enough fuel!\n\r",ch);
		return;
	}



				           
	chance = IS_NPC(ch) ? ch->top_level
	: (int)  (ch->pcdata->learned[gsn_tractorbeams]);

	/* This is just a first guess chance modifier, feel free to change if needed */

	chance = chance * ( ship->tractorbeam / (target->currspeed+1 ) );
 
	if ( number_percent( ) < chance )
	{    		   
		set_char_color( AT_GREEN, ch );    
		send_to_char( "Capture sequence initiated.\n\r", ch);    		   
		act( AT_PLAIN, "$n begins the capture sequence.", ch,		        
			NULL, argument , TO_ROOM );
		echo_to_ship( AT_YELLOW , ship , "ALERT: Ship is being captured, all hands to docking bay." );
    	echo_to_ship( AT_YELLOW , target , "The ship shudders as a tractorbeam locks on." );
		sprintf( buf , "You are being captured by %s." , ship->name);  
		echo_to_cockpit( AT_BLOOD , target , buf );

		if ( autofly(target) && !target->target0)
			target->target0 = ship;

		target->dest = STRALLOC(ship->name);    		   
		target->shipstate = SHIP_LAND;    		   
		target->currspeed = 0;	           
	                     
		learn_from_success( ch, gsn_tractorbeams );	
		return;
	                  
	}	       
	send_to_char("You fail to work the controls properly.\n\r",ch);
   	echo_to_ship( AT_YELLOW , target , "The ship shudders and then stops as a tractorbeam attemps to lock on." );
	sprintf( buf , "The %s attempted to capture your ship!" , ship->name);  
	echo_to_cockpit( AT_BLOOD , target , buf );
	if ( autofly(target) && !target->target0)
		target->target0 = ship;

                  
	learn_from_failure( ch, gsn_tractorbeams );                
	  	
   	return;	
}

void do_pluogus( CHAR_DATA *ch, char *argument )
{
     bool ch_comlink = FALSE;          
     OBJ_DATA *obj;
     int next_planet, itt;
              
     for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
     {                               
         if (obj->pIndexData->item_type == ITEM_COMLINK || obj->pIndexData->item_type == ITEM_CARMOR)
         ch_comlink = TRUE;
     }
     
     if (!IS_IMMORTAL(ch))
     {                                          
     if ( !ch_comlink )
     {
        send_to_char( "You need a comlink to do that!\n\r", ch);
        return;
     }         
     
   }

     send_to_char( "Serin Pluogus Schedule Information:\n\r", ch );
     
     /* current port */
     
     if ( bus_pos < 7 && bus_pos > 1 )
        ch_printf( ch, "The Pluogus is Currently docked at %s.\n\r", bus_stop[bus_planet] );
     
     /* destinations */
     
     next_planet = bus_planet;
     send_to_char( "Next stops: ", ch);
     
     if ( bus_pos <= 1 )
        ch_printf( ch, "%s  ", bus_stop[next_planet] );
     
     for ( itt = 0 ; itt < 3 ; itt++ )
     {
         next_planet++;
         if ( next_planet >= MAX_BUS_STOP )
            next_planet = 0;
         ch_printf( ch, "%s  ", bus_stop[next_planet] );
     }     
     
     ch_printf( ch, "\n\r\n\r" );

     send_to_char( "Serin Tocca Schedule Information:\n\r", ch );
     
     /* current port */
     
     if ( bus_pos < 7 && bus_pos > 1 )
        ch_printf( ch, "The Tocca is Currently docked at %s.\n\r", bus_stop[bus2_planet] );
     
     /* destinations */
     
     next_planet = bus2_planet;
     send_to_char( "Next stops: ", ch);
     
     if ( bus_pos <= 1 )
        ch_printf( ch, "%s  ", bus_stop[next_planet] );
     
     for ( itt = 0 ; itt < 3 ; itt++ )
     {
         next_planet++;
         if ( next_planet >= MAX_BUS_STOP )
            next_planet = 0;
         ch_printf( ch, "%s  ", bus_stop[next_planet] );
     }     
     
     ch_printf( ch, "\n\r" );
     
}

void do_fly( CHAR_DATA *ch, char *argument )
{}

void do_drive( CHAR_DATA *ch, char *argument )
{
    int dir;
    SHIP_DATA *ship;
    
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the drivers seat of a land vehicle to do that!\n\r",ch);
            return;
        }
        
        if ( ship->class < CLOUD_CAR )
    	{
    	      send_to_char("&RThis isn't a land vehicle!\n\r",ch);
    	      return;
    	}
    	        
        
        if (ship->shipstate == SHIP_DISABLED)
    	{
    	     send_to_char("&RThe drive is disabled.\n\r",ch);
    	     return;
    	}
    	        
        if ( ship->energy <1 )
        {
              send_to_char("&RTheres not enough fuel!\n\r",ch);
              return;
        }
        
        if ( ( dir = get_door( argument ) ) == -1 )
        {
             send_to_char( "Usage: drive <direction>\n\r", ch );     
             return;
        }
        
        drive_ship( ch, ship, get_exit(get_room_index(ship->location), dir), 0 );

}

ch_ret drive_ship( CHAR_DATA *ch, SHIP_DATA *ship, EXIT_DATA  *pexit , int fall )
{
    ROOM_INDEX_DATA *in_room;
    ROOM_INDEX_DATA *to_room;
    ROOM_INDEX_DATA *from_room;
    ROOM_INDEX_DATA *original;
    char buf[MAX_STRING_LENGTH];
    char *txt;
    char *dtxt;
    ch_ret retcode;
    sh_int door, distance;
    bool drunk = FALSE;
    CHAR_DATA * rch;
    CHAR_DATA * next_rch;
    

    if ( !IS_NPC( ch ) )
      if ( IS_DRUNK( ch, 2 ) && ( ch->position != POS_SHOVE )
	&& ( ch->position != POS_DRAG ) )
	drunk = TRUE;

    if ( drunk && !fall )
    {
      door = number_door();
      pexit = get_exit( get_room_index(ship->location), door );
    }

#ifdef DEBUG
    if ( pexit )
    {
	sprintf( buf, "drive_ship: %s to door %d", ch->name, pexit->vdir );
	log_string( buf );
    }
#endif

    retcode = rNONE;
    txt = NULL;

    in_room = get_room_index(ship->location);
    from_room = in_room;
    if ( !pexit || (to_room = pexit->to_room) == NULL )
    {
	if ( drunk )
	  send_to_char( "You drive into a wall in your drunken state.\n\r", ch );
	 else
	  send_to_char( "Alas, you cannot go that way.\n\r", ch );
	return rNONE;
    }

    door = pexit->vdir;
    distance = pexit->distance;

    if ( IS_SET( pexit->exit_info, EX_WINDOW )
    &&  !IS_SET( pexit->exit_info, EX_ISDOOR ) )
    {
	send_to_char( "Alas, you cannot go that way.\n\r", ch );
	return rNONE;
    }

    if (  IS_SET(pexit->exit_info, EX_PORTAL) 
       && IS_NPC(ch) )
    {
        act( AT_PLAIN, "Mobs can't use portals.", ch, NULL, NULL, TO_CHAR );
	return rNONE;
    }

    if ( IS_SET(pexit->exit_info, EX_NOMOB)
	&& IS_NPC(ch) )
    {
	act( AT_PLAIN, "Mobs can't enter there.", ch, NULL, NULL, TO_CHAR );
	return rNONE;
    }

    if ( IS_SET(pexit->exit_info, EX_CLOSED)
    && (IS_SET(pexit->exit_info, EX_NOPASSDOOR)) )
    {
	if ( !IS_SET( pexit->exit_info, EX_SECRET )
	&&   !IS_SET( pexit->exit_info, EX_DIG ) )
	{
	  if ( drunk )
	  {
	    act( AT_PLAIN, "$n drives into the $d in $s drunken state.", ch,
		NULL, pexit->keyword, TO_ROOM );
	    act( AT_PLAIN, "You drive into the $d in your drunken state.", ch,
		NULL, pexit->keyword, TO_CHAR ); 
	  }
	 else
	  act( AT_PLAIN, "The $d is closed.", ch, NULL, pexit->keyword, TO_CHAR );
	}
       else
	{
	  if ( drunk )
	    send_to_char( "You hit a wall in your drunken state.\n\r", ch );
	   else
	    send_to_char( "Alas, you cannot go that way.\n\r", ch );
	}

	return rNONE;
    }

/*
    if ( distance > 1 )
	if ( (to_room=generate_exit(in_room, &pexit)) == NULL )
	    send_to_char( "Alas, you cannot go that way.\n\r", ch );
*/
    if ( room_is_private( ch, to_room ) )
    {
	send_to_char( "That room is private right now.\n\r", ch );
	return rNONE;
    }

    if ( !IS_IMMORTAL(ch)
    &&  !IS_NPC(ch)
    &&  ch->in_room->area != to_room->area )
    {
	if ( ch->top_level < to_room->area->low_hard_range )
	{
	    set_char_color( AT_TELL, ch );
	    switch( to_room->area->low_hard_range - ch->top_level )
	    {
		case 1:
		  send_to_char( "A voice in your mind says, 'You are nearly ready to go that way...'", ch );
		  break;
		case 2:
		  send_to_char( "A voice in your mind says, 'Soon you shall be ready to travel down this path... soon.'", ch );
		  break;
		case 3:
		  send_to_char( "A voice in your mind says, 'You are not ready to go down that path... yet.'.\n\r", ch);
		  break;
		default:
		  send_to_char( "A voice in your mind says, 'You are not ready to go down that path.'.\n\r", ch);
	    }
	    return rNONE;
	}
	else
	if ( ch->top_level > to_room->area->hi_hard_range )
	{
	    set_char_color( AT_TELL, ch );
	    send_to_char( "A voice in your mind says, 'There is nothing more for you down that path.'", ch );
	    return rNONE;
	}          
    }

    if ( !fall )
    {
        if ( IS_SET( to_room->room_flags, ROOM_INDOORS ) 
        || IS_SET( to_room->room_flags, ROOM_SPACECRAFT )  
        || to_room->sector_type == SECT_INSIDE ) 
	{
		send_to_char( "You can't drive indoors!\n\r", ch );
		return rNONE;
	}
        
        if ( IS_SET( to_room->room_flags, ROOM_NO_DRIVING ) ) 
	{
		send_to_char( "You can't take a vehicle through there!\n\r", ch );
		return rNONE;
	}

	if ( in_room->sector_type == SECT_AIR
	||   to_room->sector_type == SECT_AIR
	||   IS_SET( pexit->exit_info, EX_FLY ) )
	{
            if ( ship->class > CLOUD_CAR || ship->class == MOBILE_SUIT )
	    {
		send_to_char( "You'd need to fly to go there.\n\r", ch );
		return rNONE;
	    }
	}

	if ( in_room->sector_type == SECT_WATER_NOSWIM
	||   to_room->sector_type == SECT_WATER_NOSWIM 
	||   to_room->sector_type == SECT_WATER_SWIM 
	||   to_room->sector_type == SECT_UNDERWATER
	||   to_room->sector_type == SECT_OCEANFLOOR )
	{

	    if ( ship->class == MOBILE_SUIT )
	    {
		send_to_char( "You'd need a Coralskipper to go there.\n\r", ch );
		return rNONE;
	    }
	    	    
	}

	if ( IS_SET( pexit->exit_info, EX_CLIMB ) )
	{

	    if ( ship->class < CLOUD_CAR || ship->class == MOBILE_SUIT )
	    {
		send_to_char( "You need to fly or climb to get up there.\n\r", ch );
		return rNONE;
	    }
	}

    }

    if ( to_room->tunnel > 0 )
    {
	CHAR_DATA *ctmp;
	int count = 0;
	
	for ( ctmp = to_room->first_person; ctmp; ctmp = ctmp->next_in_room )
	  if ( ++count >= to_room->tunnel )
	  {
		  send_to_char( "There is no room for you in there.\n\r", ch );
		return rNONE;
	  }
    }

      if ( fall )
        txt = "falls";
      else
      if ( !txt )
      {
	  if ( ship->class == CLOUD_CAR )
	  {
	      txt = "flies";
	  }
	  if ( ship->class == LAND_SPEEDER )
	  {
	      txt = "drive";
	  }
	  if ( ship->class == WALKER || ship->class == MOBILE_SUIT  )
	  {
	      txt = "stomps";
	  }

      }
      sprintf( buf, "$n %ss the vehicle $T.", txt );
      act( AT_ACTION, buf, ch, NULL, dir_name[door], TO_ROOM );
      sprintf( buf, "You %s the vehicle $T.", txt );
      act( AT_ACTION, buf, ch, NULL, dir_name[door], TO_CHAR );
      sprintf( buf, "%s %ss %s.", ship->name, txt, dir_name[door] );
      echo_to_room( AT_ACTION , get_room_index(ship->location) , buf );

      extract_ship( ship );
      ship_to_room(ship, to_room->vnum );
      
      ship->location = to_room->vnum;
      ship->lastdoc = ship->location;
    
      if ( fall )
        txt = "falls";
      else
	  if ( ship->class == CLOUD_CAR )
	  {
	      txt = "flies in";
	  }
	  if ( ship->class == LAND_SPEEDER )
	  {
	      txt = "drives in";
	  }
	  if ( ship->class == WALKER || ship->class == MOBILE_SUIT  )
	  {
	      txt = "stomps in";
	  }

      switch( door )
      {
      default: dtxt = "somewhere";	break;
      case 0:  dtxt = "the south";	break;
      case 1:  dtxt = "the west";	break;
      case 2:  dtxt = "the north";	break;
      case 3:  dtxt = "the east";	break;
      case 4:  dtxt = "below";		break;
      case 5:  dtxt = "above";		break;
      case 6:  dtxt = "the south-west";	break;
      case 7:  dtxt = "the south-east";	break;
      case 8:  dtxt = "the north-west";	break;
      case 9:  dtxt = "the north-east";	break;
      }

    sprintf( buf, "%s %s from %s.", ship->name, txt, dtxt );
    echo_to_room( AT_ACTION , get_room_index(ship->location) , buf );
    
    for ( rch = ch->in_room->last_person ; rch ; rch = next_rch )
    { 
        next_rch = rch->prev_in_room;
        original = rch->in_room;
        char_from_room( rch );
        char_to_room( rch, to_room );
        do_look( rch, "auto" );
        char_from_room( rch );
        char_to_room( rch, original );
    }
    
/*
    if (  CHECK FOR FALLING HERE
    &&   fall > 0 )
    {
	if (!IS_AFFECTED( ch, AFF_FLOATING )
	|| ( ch->mount && !IS_AFFECTED( ch->mount, AFF_FLOATING ) ) )
	{
	  set_char_color( AT_HURT, ch );
	  send_to_char( "OUCH! You hit the ground!\n\r", ch );
	  WAIT_STATE( ch, 20 );
	  retcode = damage( ch, ch, 50 * fall, TYPE_UNDEFINED );
	}
	else
	{
	  set_char_color( AT_MAGIC, ch );
	  send_to_char( "You lightly float down to the ground.\n\r", ch );
	}
    }

*/    
    return retcode;

}

void do_bomb( CHAR_DATA *ch, char *argument )
{

}

void do_chaff( CHAR_DATA *ch, char *argument )
{
    int chance;
    SHIP_DATA *ship;
    
   
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        
        if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
        
        if (  (ship = ship_from_coseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RThe controls are at the copilots seat!\n\r",ch);
            return;
        }
        
                if ( autofly(ship) )
    	        {
    	            send_to_char("&RYou'll have to turn the autopilot off first...\n\r",ch);
    	            return;
    	        }
    	        
                if (ship->shipstate == SHIP_HYPERSPACE)
                {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
                }
    	        if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
    	            return;
    	        }
                if (ship->chaff <= 0 )
    	        {
    	            send_to_char("&RYou don't have any chaff to release!\n\r",ch);
    	            return;
    	        }
                chance = IS_NPC(ch) ? ch->top_level
                 : (int)  (ch->pcdata->learned[gsn_weaponsystems]) ;
        if ( number_percent( ) > chance )
        {
            send_to_char("&RYou can't figure out which switch it is.\n\r",ch);
            learn_from_failure( ch, gsn_weaponsystems );
    	   return;	
        }
    
    ship->chaff--;
    
    ship->chaff_released++;
        
    send_to_char( "You flip the chaff release switch.\n\r", ch);
    act( AT_PLAIN, "$n flips a switch on the control pannel", ch,
         NULL, argument , TO_ROOM );
    echo_to_cockpit( AT_YELLOW , ship , "A burst of chaff is released from the ship.");
	  
    learn_from_success( ch, gsn_weaponsystems );

}

bool autofly( SHIP_DATA *ship )
{
 
     if (!ship)
        return FALSE;
     
     if ( ship->type == MOB_SHIP )
        return TRUE;
     
     if ( ship->autopilot )
        return TRUE;
     
     return FALSE;   
        
}


void do_transship( CHAR_DATA *ch ,char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
        char arg2[MAX_INPUT_LENGTH];
        int arg3;
    SHIP_DATA *ship;

    if ( IS_NPC( ch ) )
    {
        send_to_char( "Huh?\n\r", ch );
        return;
    }

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    ship = get_ship( arg1 );
        if ( !ship )
    {
        send_to_char( "No such ship.\n\r", ch );
        return;
    }
     
        arg3 = atoi( arg2 );
     
         if ( arg1[0] == '\0' || arg2[0] == '\0' || arg1[0] == '\0' )
   {
        send_to_char( "Usage: transship <ship> <vnum>\n\r", ch );
        return;
    }
           
         ship->shipyard = arg3;
     ship->shipstate = SHIP_READY;
     
     if ( ship->class != SHIP_PLATFORM && ship->type != MOB_SHIP )   
     {
           extract_ship( ship );
           ship_to_room( ship , ship->shipyard );
           ship->location = ship->shipyard;
           ship->lastdoc = ship->location;
           ship->shipstate = SHIP_DOCKED;
     }
     if (ship->starsystem)
        ship_from_starsystem( ship, ship->starsystem );
           
     save_ship(ship);
         send_to_char( "Ship Transfered.\n\r", ch );
}




/* Generic Pilot Command To use as template

void do_hmm( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int chance;
    SHIP_DATA *ship;
    
    strcpy( arg, argument );    
    
    switch( ch->substate )
    { 
    	default:
    	        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    	        {
    	            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
    	            return;
    	        }
                if (ship->shipstate == SHIP_HYPERSPACE)
                {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
                }
                if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ships drive is disabled. Unable to manuever.\n\r",ch);
    	            return;
    	        }
    	        if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
    	            return;
    	        }
    	        if (ship->shipstate != SHIP_READY)
    	        {
    	            send_to_char("&RPlease wait until the ship has finished its current maneuver.\n\r",ch);
    	            return;
    	        }
        
                if ( ship->energy <1 )
    	        {
    	           send_to_char("&RTheres not enough fuel!\n\r",ch);
    	           return;
    	        }
    	        
                if ( ship->class == FIGHTER_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
                if ( ship->class == MIDSIZE_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_midships]) ;
                if ( ship->class == CAPITAL_SHIP )
                    chance = IS_NPC(ch) ? ch->top_level
	                 : (int) (ch->pcdata->learned[gsn_capitalships]);
                if ( number_percent( ) < chance )
    		{
    		   send_to_char( "&G\n\r", ch);
    		   act( AT_PLAIN, "$n does  ...", ch,
		        NULL, argument , TO_ROOM );
		   echo_to_room( AT_YELLOW , get_room_index(ship->cockpit) , "");
    		   add_timer ( ch , TIMER_DO_FUN , 1 , do_hmm , 1 );
    		   ch->dest_buf = str_dup(arg);
    		   return;
	        }
	        send_to_char("&RYou fail to work the controls properly.\n\r",ch);
	        if ( ship->class == FIGHTER_SHIP )
                    learn_from_failure( ch, gsn_starfighters );
                if ( ship->class == MIDSIZE_SHIP )
    	            learn_from_failure( ch, gsn_midships );
                if ( ship->class == CAPITAL_SHIP )
                    learn_from_failure( ch, gsn_capitalships );
    	   	return;	
    	
    	case 1:
    		if ( !ch->dest_buf )
    		   return;
    		strcpy(arg, ch->dest_buf);
    		DISPOSE( ch->dest_buf);
    		break;
    		
    	case SUB_TIMER_DO_ABORT:
    		DISPOSE( ch->dest_buf );
    		ch->substate = SUB_NONE;
    		if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
    		      return;    		                                   
    	        send_to_char("&Raborted.\n\r", ch);
    	        echo_to_room( AT_YELLOW , get_room_index(ship->cockpit) , "");
    		if (ship->shipstate != SHIP_DISABLED)
    		   ship->shipstate = SHIP_READY;
    		return;
    }
    
    ch->substate = SUB_NONE;
    
    if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
    {  
       return;
    }

    send_to_char( "&G\n\r", ch);
    act( AT_PLAIN, "$n does  ...", ch,
         NULL, argument , TO_ROOM );
    echo_to_room( AT_YELLOW , get_room_index(ship->cockpit) , "");

         
    if ( ship->class == FIGHTER_SHIP )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MIDSIZE_SHIP )
        learn_from_success( ch, gsn_midships );
    if ( ship->class == CAPITAL_SHIP )
        learn_from_success( ch, gsn_capitalships );
    	
}

void do_hmm( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int chance;
    SHIP_DATA *ship;
    
   
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        
                if (ship->shipstate == SHIP_HYPERSPACE)
                {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
                }
                if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ships drive is disabled. Unable to manuever.\n\r",ch);
    	            return;
    	        }
    	        if (ship->shipstate == SHIP_DOCKED)
    	        {
    	            send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
    	            return;
    	        }
    	        if (ship->shipstate != SHIP_READY)
    	        {
    	            send_to_char("&RPlease wait until the ship has finished its current maneuver.\n\r",ch);
    	            return;
    	        } 
        
        if ( ship->energy <1 )
        {
              send_to_char("&RTheres not enough fuel!\n\r",ch);
              return;
        }
    	        
        if ( ship->class == FIGHTER_SHIP )
             chance = IS_NPC(ch) ? ch->top_level
             : (int)  (ch->pcdata->learned[gsn_starfighters]) ;
        if ( ship->class == MIDSIZE_SHIP )
             chance = IS_NPC(ch) ? ch->top_level
                 : (int)  (ch->pcdata->learned[gsn_midships]) ;
        if ( ship->class == CAPITAL_SHIP )
              chance = IS_NPC(ch) ? ch->top_level
                 : (int) (ch->pcdata->learned[gsn_capitalships]);
        if ( number_percent( ) > chance )
        {
            send_to_char("&RYou fail to work the controls properly.\n\r",ch);
            if ( ship->class == FIGHTER_SHIP )
               learn_from_failure( ch, gsn_starfighters );
            if ( ship->class == MIDSIZE_SHIP )   
               learn_from_failure( ch, gsn_midships );
            if ( ship->class == CAPITAL_SHIP )
                learn_from_failure( ch, gsn_capitalships );
    	   return;	
        }
        
    send_to_char( "&G\n\r", ch);
    act( AT_PLAIN, "$n does  ...", ch,
         NULL, argument , TO_ROOM );
    echo_to_room( AT_YELLOW , get_room_index(ship->cockpit) , "");
	  
    
    
    if ( ship->class == FIGHTER_SHIP )
        learn_from_success( ch, gsn_starfighters );
    if ( ship->class == MIDSIZE_SHIP )
        learn_from_success( ch, gsn_midships );
    if ( ship->class == CAPITAL_SHIP )
        learn_from_success( ch, gsn_capitalships );
    	
}

*/

void fread_modules( SHIP_DATA *ship, FILE *fp )
{
	char * word;
	int	module;

	ship->modules = 0;

	for ( module=1; module<MAX_MODULES; module++ )
	{
		word   = feof( fp ) ? "End" : fread_word( fp );
		if ( !str_cmp( word, "End" ) )
			return;
		else
		{
			ship->module_vnum[module] = fread_number( fp );
			ship->modules += 1;
		}
	}
	return;

}

void update_ship_modules( SHIP_DATA *ship )
{
	AFFECT_DATA *paf;
	int	module;

	ship->hyperspeed = 0;
	ship->realspeed = 0;
	ship->maxshield = 0;
	ship->lasers = 0;
	ship->tractorbeam = 0;
	ship->maxmissiles = 0;
	ship->maxrockets = 0;
	ship->maxtorpedos = 0;
	ship->maxenergy = 0;
	ship->comm = 0;
	ship->sensor = 0;
	ship->astro_array = 0;
        ship->chaff = 0;
	ship->maxchaff = 0;
	ship->manuever = 0;
	ship->laserdamage = 0;
        ship->ions = 0;
        ship->overdrive = 0;
        ship->armor = 0;
        ship->maxcargo = 0;
        ship->mlaunchers = 0;
        ship->tlaunchers = 0;
        ship->rlaunchers = 0;
        ship->cloak = 0;

        if(IS_SET(ship->flags, SHIPFLAG_SIMULATOR))
            REMOVE_BIT(ship->flags, SHIPFLAG_SIMULATOR);
 	for ( module=1; module<=ship->modules; module++ )
	{
		for ( paf = get_obj_index(ship->module_vnum[module])->first_affect; paf; paf = paf->next )
		{
			if ( paf->location == APPLY_HYPERSPEED)
				ship->hyperspeed += paf->modifier;
			if ( paf->location == APPLY_REALSPEED)
				ship->realspeed += paf->modifier;
			if ( paf->location == APPLY_MAXSHIELD)
				ship->maxshield += paf->modifier;
			if ( paf->location == APPLY_LASERS)
				ship->lasers += paf->modifier;
			if ( paf->location == APPLY_TRACTORBEAM)
				ship->tractorbeam += paf->modifier;
			if ( paf->location == APPLY_MAXMISSILES)
				ship->maxmissiles += paf->modifier;
			if ( paf->location == APPLY_MAXROCKETS)
				ship->maxrockets += paf->modifier;
			if ( paf->location == APPLY_MAXTORPEDOS)
				ship->maxtorpedos += paf->modifier;
			if ( paf->location == APPLY_MAXENERGY)
				ship->maxenergy += paf->modifier;
			if ( paf->location == APPLY_COMM)
			{
				if ( paf->modifier > ship->comm )							
					ship->comm = paf->modifier;
			}
			if ( paf->location == APPLY_SENSOR)
			{
				if ( paf->modifier > ship->sensor )			
					ship->sensor = paf->modifier;
			}
			if ( paf->location == APPLY_ASTRO_ARRAY)
			{
				if ( paf->modifier > ship->astro_array )
					ship->astro_array = paf->modifier;
			}
			if ( paf->location == APPLY_CHAFF)
			{
				ship->chaff += paf->modifier;
				ship->maxchaff += paf->modifier;
			}
			if ( paf->location == APPLY_MANUEVER)
				ship->manuever += paf->modifier;
			if ( paf->location == APPLY_LASERDAMAGE)
				ship->laserdamage += paf->modifier;
                        if ( paf->location == APPLY_IONS)
                                ship->ions += paf->modifier;
                        if ( paf->location == APPLY_OVERDRIVE)
                                ship->overdrive = 1;
                        if ( paf->location == APPLY_ARMOR )
                                ship->armor += paf->modifier;
                        if ( paf->location == APPLY_CARGO )
                                ship->maxcargo += paf->modifier;
                        if ( paf->location == APPLY_MLAUNCHER)
                                ship->mlaunchers += paf->modifier;
                        if ( paf->location == APPLY_TLAUNCHER)
                                ship->tlaunchers += paf->modifier;
                        if ( paf->location == APPLY_RLAUNCHER)
                                ship->rlaunchers += paf->modifier;
                        if ( paf->location == APPLY_SIMULATOR )
                                SET_BIT(ship->flags, SHIPFLAG_SIMULATOR);
                        if ( paf->location == APPLY_CLOAK )
                                ship->cloak += 1;
		}
	}
	if (ship->lasers > 0 && ship->laserdamage == 0)
		ship->laserdamage = 1;
        if(ship->mlaunchers > 2)
            ship->mlaunchers = 2;
        if(ship->tlaunchers > 2)
            ship->tlaunchers = 2;
        if(ship->rlaunchers > 2)
            ship->rlaunchers = 2;
	return;
}

void do_install_module( CHAR_DATA *ch, char *argument )
{

    char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
    OBJ_DATA *obj;
    SHIP_DATA *ship;
    

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' )
    {
	send_to_char( "install what?\n\r", ch );
	return;
    }

    if ( arg2[0] == '\0' )
    {
	send_to_char( "in what?\n\r", ch );
	return;
    }

	ship = ship_in_room( ch->in_room , arg2 );    
        if ( !ship )            
	{    
		act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );        
		return;       
        }

	if ( !check_pilot( ch , ship ) || !str_cmp( ship->owner , "Public" ) )    	        
	{    
		send_to_char("&RHey, thats not your ship!\n\r",ch);    	
		return;    	
	}

	if (ship->maxmodules == ship->modules )
	{
		send_to_char( "The ship has no free slots!\n\r", ch );
		return;
	}


        if ( ms_find_obj(ch) )
           return;

	if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
	{
	    send_to_char( "You do not have that item.\n\r", ch );
	    return;
	}


	if ( !(obj->item_type==ITEM_FIGHTERCOMP || obj->item_type==ITEM_MIDCOMP
	     || obj->item_type==ITEM_CAPITALCOMP || obj->item_type == ITEM_FRIGATECOMP
             || obj->item_type==ITEM_SCAPITALCOMP) )
	{
		send_to_char("That isn't a ship module.\n\r",ch);
		return;
	}

	if ( obj->item_type==ITEM_FIGHTERCOMP && ship->class != FIGHTER_SHIP )
	{
		send_to_char( "That module is designed for a fighter class vessel.\n\r",ch);
		return;
	}

	if ( obj->item_type==ITEM_MIDCOMP && ship->class != MIDSIZE_SHIP )
	{
		send_to_char( "That module is designed for a midship class vessel.\n\r",ch);
		return;
	}
       
        if ( obj->item_type==ITEM_FRIGATECOMP && ship->class != FRIGATE_SHIP )
        {
                send_to_char("That module is designed for a frigate class vessel.\n\r", ch);
                return;
        }

	if ( obj->item_type==ITEM_CAPITALCOMP && ship->class != CAPITAL_SHIP )
	{
		send_to_char( "That module is designed for a capital class vessel.\n\r",ch);
		return;
	}
        if( obj->item_type==ITEM_SCAPITALCOMP && ship->class != SUPERCAPITAL_SHIP )
        {
                send_to_char( "That module is designed for a super class vessel.\n\r", ch);
                return;
        }

	if ( !can_drop_obj( ch, obj ) )
	{
	    send_to_char( "You can't let go of it.\n\r", ch );
	    return;
	}

	if ( module_type_install(obj, ship) )
	{
		send_to_char( "Your ship cannot carry another one of those!\n\r", ch);
		return;
	}

	separate_obj( obj );

	act( AT_ACTION, "$n installs $p.", ch, obj, NULL, TO_ROOM );
	act( AT_ACTION, "You install $p.", ch, obj, NULL, TO_CHAR );

	ship->modules += 1;
	ship->module_vnum[ship->modules] = obj->pIndexData->vnum;
	extract_obj(obj);
	save_ship( ship );
	update_ship_modules( ship );
	  
    return;

}


bool module_type_install(OBJ_DATA *obj, SHIP_DATA *ship)
{
	int	module;
	AFFECT_DATA	*pafship;
	AFFECT_DATA *pafobj;


	for ( module=1; module<=ship->modules; module++ )
	{
		for ( pafship = get_obj_index(ship->module_vnum[module])->first_affect; pafship; pafship = pafship->next )
		{
			for ( pafobj = obj->pIndexData->first_affect; pafobj; pafobj = pafobj->next )
			{
				if ( pafship->location == pafobj->location &&
					( pafobj->location == APPLY_HASSEMBLY || pafobj->location == APPLY_ENGINE
					|| pafobj->location == APPLY_GENERATOR || pafobj->location == APPLY_TRACTORBEAM
                                        || pafobj->location == APPLY_OVERDRIVE || pafobj->location == APPLY_LASERBATTERY 
                                        || pafobj->location == APPLY_SIMULATOR || pafobj->location == APPLY_CLOAK ) )
					return TRUE;
				}         
                }
	}
	return FALSE;
}


void do_remove_module( CHAR_DATA *ch, char *argument )
{

    char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
    OBJ_DATA *obj;
	OBJ_INDEX_DATA *obj_index;
    SHIP_DATA *ship;
	int	module, rmodule;


    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' )
    {
		send_to_char( "remove what?\n\r", ch );
		return;
    }

    if ( arg2[0] == '\0' )
    {
		send_to_char( "from what?\n\r", ch );
		return;
    }

	ship = ship_in_room( ch->in_room , arg2 );    
    if ( !ship )            
	{    
		act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, 
TO_CHAR );        
		return;       
    }

	if ( !check_pilot( ch , ship ) || !str_cmp( ship->owner , "Public" 
) )    	        
	{    
		send_to_char("&RHey, thats not your ship!\n\r",ch);    	
		return;    	
	}

	for ( module = 1; module <= ship->modules; module++ )
	{
		obj_index=get_obj_index( ship->module_vnum[module] );
		if (!obj_index)
		{
			bug( "Remove module: cannot find module!\n\r", 0 );
			send_to_char("No such module installed\n\r",ch);
			return;
		}
		if ( nifty_is_name( arg1, obj_index->name ) )
		{
			obj = create_object( obj_index, 100 );
                        if(obj->weight > can_carry_w(ch))
                        {
                           send_to_char("You can't possibly remove that. Its much too heavy.\n\r", ch);
                           extract_obj(obj);
                           return;
                        }
			act( AT_ACTION, "$n removes $p.", ch, obj, NULL, TO_ROOM );	
			act( AT_ACTION, "You remove $p.", ch, obj, NULL, TO_CHAR );
			obj = obj_to_char( obj, ch );
			
			for ( rmodule = module; rmodule < ship->modules; rmodule++ )			
			{				
				ship->module_vnum[rmodule] = ship->module_vnum[rmodule+1];			
			}
			ship->modules = ship->modules -1;
			update_ship_modules( ship );
			save_ship(ship);
			return;
		}
	}
	send_to_char("No such module installed\n\r",ch);
	return;
}

void do_show_modules( CHAR_DATA *ch, char *argument )
{

    char arg[MAX_INPUT_LENGTH];
	SHIP_DATA *ship;
	int	module;
	char buf[MAX_STRING_LENGTH];
	OBJ_INDEX_DATA *obj_index;

    argument = one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
		send_to_char( "check what ship?\n\r", ch );
		return;
    }

	ship = ship_in_room( ch->in_room , arg );    
    if ( !ship )            
	{    
		act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, 
TO_CHAR );        
		return;       
    }
/*
	if ( !check_pilot( ch , ship ) || !str_cmp( ship->owner , "Public" 
) )    	        
	{    
		send_to_char("&RHey, thats not your ship!\n\r",ch);    	
		return;    	
	}
*/
	
    sprintf( buf, "Modules installed on %s:\n\r\n\r", ship->name );
	send_to_char(buf,ch);
	if (ship->modules == 0)
	{
		send_to_char( "No Modules installed.\n\r",ch);
		return;
	}
	for ( module = 1; module <= ship->modules; module++ )
	{
		obj_index=get_obj_index( ship->module_vnum[module] );
		if (!obj_index)
		{
			bug( "Show module: cannot find module!\n\r", 0 );
			return;
		}
		sprintf(buf,"%s\n\r",obj_index->short_descr);
		send_to_char(buf,ch);
	}
	return;
}

/* Parnic's docking. Originally written by Soulbender */
void do_docking( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    int chance;
    SHIP_DATA *ship;
    SHIP_DATA *docktarget;
    
    strcpy( arg, argument );
    
    	        if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
    	        {
    	            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( ship->class > MOBILE_SUIT )
    	        {
    	            send_to_char("&RThis isn't a spacecraft!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( (ship = ship_from_pilotseat(ch->in_room->vnum)) == NULL )
    	        {
    	            send_to_char("&RYou need to be in the pilot seat!\n\r",ch);
    	            return;
    	        }
    	        
    	        if ( autofly(ship) )
    	        {
    	            send_to_char("&RYou'll have to turn off the ship's autopilot first.\n\r",ch);
    	            return;
    	        }
    	        
                if  ( ship->class == SHIP_PLATFORM )
                {
                   send_to_char( "&RYou can't dock platforms!\n\r" , ch );
                   return;
                }   
    
    	        if (ship->class == CAPITAL_SHIP)
    	        {
    	            send_to_char("&RCapital ships are too big to dock. You'll have to take a shuttle.\n\r",ch);
		    return;
    	        }
    	        if (ship->shipstate == SHIP_DISABLED)
    	        {
    	            send_to_char("&RThe ship's drive is disabled. Unable to dock.\n\r",ch);
    	            return;
    	        }
                if( IS_SET(ship->flags, SHIPFLAG_CLOAKED))
                {
                   send_to_char("&RThey can't see you to perform in the docking operation.\n\r", ch); 
                   return;
                }
    	        if (IS_DOCKED(ship))
    	        {
    	            send_to_char("&RThe ship is already docked!\n\r",ch);
    	            return;
    	        }
    	                
               if (ship->shipstate == SHIP_HYPERSPACE)
               {
                  send_to_char("&RYou can only do that in realspace!\n\r",ch);
                  return;   
               }

    	        if (ship->shipstate != SHIP_READY)
    	        {
    	            send_to_char("&RPlease wait until the ship has finished its current manuever.\n\r",ch);
    	            return;
    	        }
    	        if ( ship->starsystem == NULL )
    	        {
    	            send_to_char("&Dock with whom?",ch);
    	            return;
    	        }
    	        
    	        if ( ship->energy < (25 + 25*ship->class) )
    	        {
    	           send_to_char("&RThere's not enough fuel!\n\r",ch);
    	           return;
    	        }
    	        
    	        if ( argument[0] == '\0' )
    	        {  
    	           set_char_color(  AT_CYAN, ch );
    	           ch_printf(ch, "Dock with who?\n\r");   	           
    		     return;
    	        }
    	        
    	        docktarget = get_ship_here( arg, ship->starsystem );
                if (  docktarget == NULL || IS_SET(docktarget->flags, SHIPFLAG_CLOAKED))
                {
                    send_to_char("&RThat ship isn't here!\n\r",ch);
                    return;
                }

		if (IS_DOCKED(docktarget))
		{
		   send_to_char("&RThat ship is already docked!\n\r",ch);
		   return;
		}
		
    	            if ( docktarget == ship )
    	            {
    	                send_to_char("&RYou can't dock your ship inside itself!\n\r",ch);
    	                return;
    	            } 
                   if(docktarget->class > MIDSIZE_SHIP && ship->class <= MIDSIZE_SHIP)
                   {
                        send_to_char("&RThat ship is too large to dock with. Try landing.\n\r", ch);
                        return;
                   }
                   if(ship->class > MIDSIZE_SHIP && docktarget->class <= MIDSIZE_SHIP)
                   {
                        send_to_char("&RYour ship is too large to dock with that. Tractor it.\n\r", ch);
                        return;
                   }                    
                   if (  (docktarget->vx > ship->vx + 200) || (docktarget->vx < ship->vx - 200) ||
    	                  (docktarget->vy > ship->vy + 200) || (docktarget->vy < ship->vy - 200) ||
    	                  (docktarget->vz > ship->vz + 200) || (docktarget->vz < ship->vz - 200) )
    	            {
    	                send_to_char("&R That ship is too far away! You'll have to fly a little closer.\n\r",ch);
    	                return;
    	            }       
                                
                chance = IS_NPC(ch) ? ch->top_level
	                 : (int)  (ch->pcdata->learned[gsn_docking]) ;
                if ( number_percent( ) < chance )
    		{
    		   set_char_color( AT_GREEN, ch );
		   sprintf( buf, "You are being docked by %s.\n\r"
		   "Docking sequence initiated.\n\r", ship->name);
    		   echo_to_ship( AT_YELLOW, docktarget, buf );
    		   send_to_char( "Docking sequence initiated.\n\r", ch);
    		   act( AT_PLAIN, "$n begins the docking sequence.", ch,
		        NULL, argument , TO_ROOM );
		   echo_to_ship( AT_YELLOW , ship , "The ship slowly begins its docking approach.");
    		   ship->shipstate2 = SHIP_DOCK;
    		   ship->currspeed = 0;
	           docktarget->shipstate2 = SHIP_DOCK;
	           docktarget->currspeed = 0;
	           ship->docked_ship = docktarget;
	           docktarget->docked_ship = ship;
	           learn_from_success( ch, gsn_docking );
                   return;
	        }
	        send_to_char("You fail to work the controls properly.\n\r",ch);
	        learn_from_failure( ch, gsn_docking );
    	   	return;	
}

void dockship( SHIP_DATA *ship )
{    
    SHIP_DATA *docktarget;
    char buf[MAX_STRING_LENGTH];
    
    docktarget = ship->docked_ship;
   
    ship->shipstate2 = SHIP_DOCK_3;
    ship->vx = docktarget->vx;
    ship->vy = docktarget->vy;
    ship->vz = docktarget->vz;
    docktarget->shipstate2 = SHIP_DOCK_3;
    echo_to_room( AT_YELLOW , get_room_index(ship->pilotseat), "Docking sequence complete.");
    echo_to_ship( AT_YELLOW , ship , "You feel a slight thud as the ship locks in with the next."); 
    echo_to_room( AT_YELLOW , get_room_index(docktarget->pilotseat), "Docking sequence complete.");
    echo_to_ship( AT_YELLOW , docktarget , "You feel a slight thud as the ship locks in with the next.");
    sprintf( buf ,"%s and %s have docked." , ship->name, docktarget->name  );
    echo_to_system( AT_YELLOW, ship, buf , NULL );
    
    sprintf( buf, "%s docks with your ship.", ship->name );
    echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
    
    ship->energy = ship->energy - 25 - 25*ship->class;
    
    save_ship(ship);   
}

void do_detach( CHAR_DATA *ch, char *argument)
{
    SHIP_DATA *ship;
    SHIP_DATA *docked_by;
    char buf[MAX_STRING_LENGTH];
    int price = 0;
    
    if ( (ship = ship_from_pilotseat(ch->in_room->vnum)) == NULL )
    {
       send_to_char("&RYou don't seem to be in the pilot seat!\n\r",ch);
       return;
    }

    if (!IS_DOCKED(ship))
    {
       send_to_char("&RThere doesn't seem to be any ships docked to you.\r\n", ch);
       return;
    }
    docked_by = ship->docked_ship;
    
    ship->docked_ship = NULL;
    ship->shipstate2 = SHIP_READY;
    docked_by->docked_ship = NULL;
    docked_by->shipstate2 = SHIP_READY;
    
    sprintf(buf, "You hear air escaping as the airlocks open, and %s detaches.", docked_by->name);
    echo_to_ship( AT_YELLOW, ship, buf);
    sprintf(buf, "You hear air escaping as the airlocks open, and %s detaches.", ship->name);
    echo_to_ship( AT_YELLOW, docked_by, buf);

    if ( ( ship->class == FRIGATE_SHIP || ship->class == CAPITAL_SHIP || ship->class == MOBILE_SUIT) && docked_by->class > ship->class )
    {
	price += ( ship->maxhull-ship->hull );
        price += ( 50 * (ship->maxmissiles-ship->missiles) );
        price += ( 75 * (ship->maxtorpedos-ship->torpedos) );
        price += ( 150 * (ship->maxrockets-ship->rockets) );
        price += ( 500 * (ship->autoammomax-ship->autoammo) );
        if (ship->shipstate == SHIP_DISABLED )
          price += 2000;
        if ( ship->missilestate == MISSILE_DAMAGED )
          price += 1000;
        if ( ship->ionstate == LASER_DAMAGED )
          price += 1000;
        if ( ship->statet0 == LASER_DAMAGED )
          price += 500;
        if ( ship->statet1 == LASER_DAMAGED )
          price += 500;
        if ( ship->statet2 == LASER_DAMAGED )
          price += 500;
    	if ( ch->pcdata && ch->pcdata->clan && !str_cmp(ch->pcdata->clan->name,ship->owner) ) 
        {
          if ( ch->pcdata->clan->funds < price )
          {
            ch_printf(ch, "&R%s doesn't have enough funds to repair and rearm  this ship.\n\r", ch->pcdata->clan->name );
            return;
          }
    
          ch->pcdata->clan->funds -= price;
          ch_printf(ch, "&GIt costs %s %ld credits to repair this ship for launch.\n\r", ch->pcdata->clan->name, price );   
        }
        else if ( str_cmp( ship->owner , "Public" ) )
        {
          if ( ch->gold < price )
          {
            ch_printf(ch, "&RYou don't have enough funds to repair and rearm your ship.\n\r");
            return;
          }
          ch->gold -= price;
          ch_printf(ch, "&GYou pay %ld credits to ready the ship for launch.\n\r", price );   
        }
        ship->autoammo = ship->autoammomax;
        ship->energy = ship->maxenergy;
        ship->chaff = ship->maxchaff;
        ship->missiles = ship->maxmissiles;
        ship->torpedos = ship->maxtorpedos;
        ship->rockets = ship->maxrockets;
        ship->hull = ship->maxhull;
        ship->missilestate = MISSILE_READY;
       	ship->statet0 = LASER_READY;
        ship->statet1 = LASER_READY;
        ship->statet2 = LASER_READY;
        ship->ionstate = LASER_READY;
                        save_ship(ship);
    }

}

void do_remoteopenbay( CHAR_DATA *ch, char *argument )
{
            char arg[MAX_INPUT_LENGTH];
    int chance;
    SHIP_DATA *ship;
    SHIP_DATA *target;
    
 
                if (arg[0] == '\0')
    	        {
    	            send_to_char("&RYou need to specify a target!\n\r",ch);
    	            return;
    	        }
    strcpy( arg, argument );    

        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
                send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);

                return;
        }

                     target = get_ship_here( arg, ship->starsystem );
                if (  target == NULL )
                {
                    send_to_char("&RThat ship isn't here!\n\r",ch);
                    return;
                }

    	        if ( !check_pilot( ch , target ) )
    	        {
    	            send_to_char("&RHey, thats not your ship!!\n\r",ch);
    	            return;
    	        }

         
        chance = IS_NPC(ch) ? ch->top_level   : (int)  (ch->pcdata->learned[gsn_shipsystems]) ;
        if ( number_percent( ) > chance )
        {
                send_to_char("&RYour notsure which switch to flip.\n\r",ch);
                learn_from_failure( ch, gsn_shipsystems );
                return;
        }   
           
        act( AT_PLAIN, "$n flips a switch on the control panel.", ch,
        NULL, argument , TO_ROOM );
         
        if (target->bayopen)
        {
                target->bayopen = FALSE;
                echo_to_cockpit( AT_YELLOW , ship, "Closing bay doors.");
        }
        else
        {  
        target->bayopen = TRUE;
        echo_to_cockpit( AT_YELLOW , ship, "Opening Bay Doors.");
       }
        learn_from_success( ch, gsn_shipsystems );


}

void do_interdict(CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    SHIP_DATA *target;
    char buf[MAX_STRING_LENGTH];
        
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        
        if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the pilots seat!\n\r",ch);
            return;
        }

        if (  ship->interdict < 1 )
        {
            send_to_char("&RNo Interdiction Field Generators Installed.\n\r",ch);
            return;
        }
        
        if ( ! check_pilot(ch,ship) )
       	     {
       	       send_to_char("&RHey! Thats not your ship!\n\r",ch);
       	       return;
       	     }
  
        //Originally had code to target specific ship for interdiction
        //realized bad rp, removed left target pointer incase i 
        //change mid, duping the ship and target so the echotosystem doesn't fail.

        target = ship;
         
        act( AT_PLAIN, "$n flips a switch on the control panel.", ch, NULL, argument , TO_ROOM );

        if (ship->interdictactive == TRUE)
        {
           ship->interdictactive = FALSE;
           send_to_char( "&GYou toggle the interdiction field.\n\r", ch);
           sprintf( buf, "%s has deactivated an interdiction field!" , ship->name);
           echo_to_system( AT_ORANGE , ship , buf , target );
           echo_to_cockpit( AT_YELLOW , ship , "Interdiction Field Deactivated!");
        }
        else
        {
           ship->interdictactive = TRUE;
           ship->autorecharge = FALSE;
           send_to_char( "&GYou toggle the interdiction Field.\n\r", ch);
           send_to_char( "&GAutoRecharge NOT availiable while field active.\n\r", ch);
           sprintf( buf, "%s has activated an interdiction field!" , ship->name);
           echo_to_system( AT_ORANGE , ship , buf , target );
           echo_to_cockpit( AT_YELLOW , ship , "Interdiction Field Active!");
        }   
}

void do_selfdestruct(CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;

        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }

        if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the pilots seat!\n\r",ch);
            return;
        }
 
         if ( ! check_pilot(ch,ship) || is_rental(ch,ship))
             {
               send_to_char("&RHey! Thats not your ship!\n\r",ch);
               return; 
             }
      
        if (argument == '\0' || argument[0] == '\0')
        {
            send_to_char("Syntax: selfdestruct <password>\n\r", ch);
            send_to_char("\"password\" is your character's login password\n\r", ch);
            return;
        }

        if ( strcmp( crypt( argument, ch->pcdata->pwd ), ch->pcdata->pwd ) )
        {
            send_to_char("&RIncorrect Password.\n\r", ch);
            return;
        }

    act( AT_PLAIN, "$n presses a red button on the control panel.", ch,
         NULL, argument , TO_ROOM );
    
    ship->sdestnum = 0;
    echo_to_ship(AT_DANGER, ship, "Self-Destruct Mode Initiated");
}


void do_deleteship( CHAR_DATA *ch, char *argument )
{    
    SHIP_DATA *ship;
    char shiplog[MAX_STRING_LENGTH];
    char buf[MAX_STRING_LENGTH];

     
     ship = get_ship( argument );
     if (ship == NULL)
     {
        send_to_char("&RNo such ship!",ch);
        return;
     } 
     
        resetship(ship);
        sprintf(shiplog,"Ship Deleted: %s",ship->name);
        log_string(shiplog);
        extract_ship( ship );
        ship_to_room( ship , 46 ); 
   	  ship->location = 46;
	  ship->shipyard = 46;
        if (ship->starsystem)
            ship_from_starsystem( ship, ship->starsystem );
            
         sprintf( buf, "%s%s", SHIP_DIR, ship->filename );
         remove(buf);
             
        UNLINK( ship, first_ship, last_ship, next, prev );
	  DISPOSE(ship);

        write_ship_list();
          
}


void do_unload_cargo( CHAR_DATA *ch, char *argument)
{
   SHIP_DATA *ship;
   SHIP_DATA *target;
   int cost;
   PLANET_DATA  *planet;

   if ( argument[0] == '\0' )
   {
      act( AT_PLAIN, "Which ship do you want to unload?.", ch, NULL, NULL, TO_CHAR);
      return;
   }

   target = ship_in_room( ch->in_room , argument );

   if ( !target )
   {
      act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
      return;
   }
   if (!check_pilot(ch, target))
   {
      send_to_char("Hey, that's not your ship!\r\n", ch);
      return;
   }

   if ( target->cargo == 0 )
   {
      send_to_char("You don't have any cargo.\r\n",ch);
      return;
   }

   if ( !IS_SET( ch->in_room->room_flags, ROOM_IMPORTS )
        && !IS_SET( ch->in_room->room_flags, ROOM_SPACECRAFT ))
   {
      send_to_char("You can't do that here!", ch);
      return;
   }
   planet = ch->in_room->area->planet;

   if (!planet)
   {
      ship = ship_from_hanger( ch->in_room->vnum );

      if (!ship)
      {
         send_to_char("You can't do that here!", ch);
         return;
      }     
      if ((ship->maxcargo - ship->cargo) < 1)
      {
         send_to_char("There is no room for anymore cargo\r\n",ch);
         return;
      }
      if (ship->cargo == 0)
          ship->cargotype = CARGO_NONE;

      if ((ship->cargo > 0) && (ship->cargotype != target->cargo))
      {
         send_to_char("They have a differnt type of cargo.\n\r",ch);
         return;
      }
      if (ship->cargotype == CARGO_NONE)
         ship->cargotype = target->cargotype;
      if ((ship->maxcargo - ship->cargo) >= target->cargo)
      {
         ship->cargo += target->cargo;
         target->cargo = 0;
         target->cargo = CARGO_NONE;
          send_to_char("Cargo unloaded.\r\n",ch);
         return;
      }
      else
      {
         target->cargo -= ship->maxcargo - ship->cargo;
         ship->cargo = ship->maxcargo;
         ch_printf(ch, "%s Loaded, %d tons still in %s hold.\r\n",  ship->name, target->cargo, target->name); 
         return;
      }
   }
   if (planet->import[target->cargotype] < 1)
   {
      send_to_char("You can't deliver that here.\r\n",ch);
      return;
   }
   cost = target->cargo;
   cost *= planet->import[target->cargotype];

   ch->gold += cost;
   target->cargo = 0;
   ch_printf(ch,"You recieve %d credits for a load of %s.\r\n", cost, cargo_names[target->cargotype]); 
   target->cargotype = CARGO_NONE;
   return;
}

void do_load_cargo( CHAR_DATA *ch, char *argument)
{
   SHIP_DATA *ship;
   SHIP_DATA *target;
   int cost,cargo, i;
   PLANET_DATA  *planet;
   char arg1[MAX_INPUT_LENGTH];

   argument = one_argument(argument, arg1);

   if ( arg1[0] == '\0' )
   {
      act( AT_PLAIN, "Which ship do you want to load?.", ch, NULL, NULL, TO_CHAR);
      return;
   }

   target = ship_in_room( ch->in_room , arg1 );

   if ( !target )
   {
      act( AT_PLAIN, "I see no $T here.", ch, NULL, argument, TO_CHAR );
      return;
   }

   if (!check_pilot(ch, target))
   {
      send_to_char("Hey, that's not your ship!\r\n", ch);
      return;
   }

   if ( !IS_SET( ch->in_room->room_flags, ROOM_IMPORTS )
        && !IS_SET( ch->in_room->room_flags, ROOM_SPACECRAFT ))
   {
      send_to_char("You can't do that here!", ch);
      return;
   }
   planet = ch->in_room->area->planet;

   if (!planet)
   {
      ship = ship_from_hanger( ch->in_room->vnum );
      if (!ship)
      {
         send_to_char("You can't do that here!", ch);
         return;
      }
      if (ship->cargo == 0)
      {
         send_to_char("They don't have any cargo\n\r", ch);
         return;
      }
      if ((target->maxcargo - target->cargo) < 1) 
      {
         send_to_char("There is no room for anymore cargo\r\n",ch);
         return;
      }
      if ((target->cargotype =! CARGO_NONE) && (ship->cargotype != target->cargotype));
      {
         send_to_char("Maybe you should deliver your cargo first.\n\r",ch);
         return;
      }
      if (target->cargotype == CARGO_NONE)
          target->cargotype = ship->cargotype;

      if ((target->maxcargo - target->cargo) >= ship->cargo)
      {
         target->cargo += ship->cargo;
         ship->cargo = 0;
         send_to_char("Cargo loaded.\r\n",ch);
         return;
      }
      else
      {
         ship->cargo -= target->maxcargo - target->cargo;
         target->cargo = target->maxcargo;
         send_to_char("Cargo Loaded.\r\n",ch);
         return;
      }

   }
   if (argument[0] == '\0')
   {
      send_to_char("&RWhat do you wnat to load&C&w\r\n", ch);
      return;
   }
   if (target->maxcargo - target->cargo <= 0)
   {
      send_to_char("There is no room for more Cargo.\r\n", ch);
      return;
   }
   for(i = 1; i < CARGO_MAX; i++)
   {
      if(!strcmp(argument, cargo_names[i]))
         cargo = i;
   }

   if ((target->cargo > 0) && (target->cargotype != cargo))
   {
      send_to_char("Maybe you should deliver your cargo first\r\n",ch);
      return;
   }

   if (planet->export[cargo] < 1)
   {
      send_to_char("We don't export those goods here\r\n", ch);
      return;
   }

   if (planet->resource[cargo] < 1)
   {
      send_to_char("&RSorry we have none left to ship\r\n", ch);
      return;
   }

   if ((target->maxcargo - target->cargo) >= planet->resource[cargo])
      cost = planet->resource[cargo];
   else
      cost = (target->maxcargo - target->cargo);
  
   cost *= planet->export[cargo];

   if (ch->gold < cost)
   {
      send_to_char("You can't afford it!\r\n", ch);
      return;
   }
   ch->gold -= cost;

   if ((target->maxcargo - target->cargo) >= planet->resource[cargo])
   {
   
     target->cargo += planet->resource[cargo];
     planet->resource[cargo] = 0;
     target->cargotype = cargo;
   }
   else
   {
     planet->resource[cargo] -= target->maxcargo - target->cargo;
     target->cargo = target->maxcargo;
     target->cargotype = cargo;
   }
   
   ch_printf(ch,"You pay %d credits for a load of %s.\r\n", cost, cargo_names[cargo]);
   return;
}


/* OVERDRIVE BY ARCTURUS */
void do_overdrive( CHAR_DATA *ch, char *argument )
{
    int chance;
    SHIP_DATA *ship;
    char buf[MAX_STRING_LENGTH];

    if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    {
       send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
        return;
    }

    if ( ship->class > MOBILE_SUIT )
    {
       send_to_char("&RThis isn't a spacecraft!\n\r",ch);
       return;
    }
    if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
    {
       send_to_char("&RThe controls must be at the pilots chair...\n\r",ch);
       return;
    }
    if ( autofly(ship) )
    {
       send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
       return;
    }
    if  ( ship->class == SHIP_PLATFORM )
    {
       send_to_char( "&RPlatforms can't move!\n\r" , ch );
       return;
    }

    if (ship->shipstate == SHIP_HYPERSPACE)
    {
       send_to_char("&RYou can only do that in realspace!\n\r",ch);
       return;
    }
    if (ship->shipstate == SHIP_DISABLED)
    {
       send_to_char("&RThe ships drive is disabled. Unable to accelerate.\n\r",ch);
       return;
    }
    if (ship->shipstate == SHIP_DOCKED)
    {
        send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
        return;
    }

    if ((ship->shipstate2 == SHIP_DOCK) || (ship->shipstate2 == SHIP_DOCK_2))
    {
       send_to_char("&RNot while docking procedures are going on.\n\r", ch);
       return;
    }

    if (ship->shipstate2 == SHIP_DOCK_3)
    {
      send_to_char("&RDetach from the docked ship first.\n\r",ch);
      return;
    }        
    if (ship->overdrive == 0)
    {
      send_to_char("&RTry installing a SLAM overdrive node first.\n\r", ch);
      return;
    }
    if (IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
    {
      send_to_char("&RYour afterburners must be turned off before you can overpower your engine.\n\r", ch);
      return;
    }
    if(ship->energy < 200)
    {
      send_to_char("&RYou don't have enough fuel.", ch);
      return;
    }

    if(IS_SET(ship->flags,  SHIPFLAG_SABOTAGEDENGINE))
    {
       echo_to_cockpit( AT_BLUE , ship , "There is a small explosion and then your ship stops moving. It must have been sabotage!\n\r");
       echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!");
       ship->shipstate = SHIP_DISABLED;
       ship->currspeed = 0;
       REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
       return;
    }
    if(!str_cmp(argument, "off"))
    {
      if (IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
      {
        send_to_char("&WYou shut off your overdrive node, and your ship decelerates.\n\r", ch);
        REMOVE_BIT(ship->flags, SHIPFLAG_OVERDRIVENODE);
        act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
        if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
        {
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
        }
        ship->currspeed = UMAX(0, ship->realspeed + speedbonus(ship));
        return;
      }
      else
      {
         send_to_char("&WYour overdrive node isn't active.\n\r", ch);
         return;
      }
    }
      if(IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
      {
          send_to_char("&WYour overdrive is already on. Type overdrive off to turn it off.\n\r", ch);
          return;
      }                
      chance = IS_NPC(ch) ? ch->top_level : (int) (ch->pcdata->learned[gsn_overdrive]);
      if ( number_percent( ) >= chance )
      {
          send_to_char("&RYou fail to work the controls properly.\n\r",ch);
          learn_from_failure(ch, gsn_overdrive);
          return;
      }
      learn_from_success(ch, gsn_overdrive);
      SET_BIT(ship->flags, SHIPFLAG_OVERDRIVENODE);
      send_to_char("Overdrive node active, powering up engines.\n\r", ch);
      act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
      if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
      {
         sprintf( buf, "%s begins to speed up." , ship->name );
         echo_to_system( AT_ORANGE , ship , buf , NULL );
      }
      ship->currspeed = UMAX(0, (int) ship->realspeed * speedbonus(ship));   
      ship->energy -= 200; /* fuel used to activate it. */
      return;
}       

/* AFTERBURNER BY ARCTURUS */ 
void do_burn( CHAR_DATA *ch, char *argument )
{
    int chance;
    SHIP_DATA *ship;
    char buf[MAX_STRING_LENGTH];

    if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    {
       send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
        return;
    }

    if ( ship->class > MOBILE_SUIT )
    {
       send_to_char("&RThis isn't a spacecraft!\n\r",ch);
       return;
    }
    if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
    {
       send_to_char("&RThe controls must be at the pilots chair...\n\r",ch);
       return;
    }
    if ( autofly(ship) )
    {
       send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
       return;
    }
    if  ( ship->class == SHIP_PLATFORM )
    {
       send_to_char( "&RPlatforms can't move!\n\r" , ch );
       return;
    }

    if (ship->shipstate == SHIP_HYPERSPACE)
    {
       send_to_char("&RYou can only do that in realspace!\n\r",ch);
       return;
    }
    if (ship->shipstate == SHIP_DISABLED)
    {
       send_to_char("&RThe ships drive is disabled. Unable to accelerate.\n\r",ch);
       return;
    }
    if (ship->shipstate == SHIP_DOCKED)
    {
        send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
        return;
    }

    if ((ship->shipstate2 == SHIP_DOCK) || (ship->shipstate2 == SHIP_DOCK_2))
    {
       send_to_char("&RNot while docking procedures are going on.\n\r", ch);
       return;
    }

    if (ship->shipstate2 == SHIP_DOCK_3)
    {
      send_to_char("&RDetach from the docked ship first.\n\r",ch);
      return;
    }        

    if (IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
    {
      send_to_char("&RYour overdrive node must be turned off before you can use your afterburners.\n\r", ch);
      return;
    }
    if(ship->energy < 100)
    {
       send_to_char("You don't have enough fuel.\n\r", ch);
       return;
    }

    if(IS_SET(ship->flags,  SHIPFLAG_SABOTAGEDENGINE))
    {
       echo_to_cockpit( AT_BLUE , ship , "There is a small explosion and then your ship stops moving. It must have been sabotage!\n\r");
       echo_to_cockpit( AT_BLOOD + AT_BLINK , ship , "Ships Drive DAMAGED!");
       ship->shipstate = SHIP_DISABLED;
       ship->currspeed = 0;
       REMOVE_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
       return;
    }
    if(!str_cmp(argument, "off"))
    {
      if (IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
      {
        send_to_char("&WYou shut off your afterburners, and your ship decelerates.\n\r", ch);
        REMOVE_BIT(ship->flags, SHIPFLAG_AFTERBURNER);
        act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
        if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
        {
           sprintf( buf, "%s begins to slow down." , ship->name );
           echo_to_system( AT_ORANGE , ship , buf , NULL );
        }
        ship->currspeed = UMAX(0, ship->realspeed + speedbonus(ship));
        return;
      }
         else
         {
            send_to_char("&WYour afterburners aren't even active.\n\r", ch);
            return;
         }
      }
      if(IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
      {
          send_to_char("&WYour afterburners are already on. Type burn off to turn them off.\n\r", ch);
          return;
      }                
      chance = IS_NPC(ch) ? ch->top_level : (int) (ch->pcdata->learned[gsn_burn]);
      if ( number_percent( ) >= chance )
      {
          send_to_char("&RYou fail to work the controls properly.\n\r",ch);
          learn_from_failure(ch, gsn_burn);
          return;
      }
      learn_from_success(ch, gsn_burn);
      SET_BIT(ship->flags, SHIPFLAG_AFTERBURNER);
      send_to_char("Afterburners active, accelerating.\n\r", ch);
      act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
      if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
      {
         sprintf( buf, "%s begins to speed up." , ship->name );
         echo_to_system( AT_ORANGE , ship , buf , NULL );
      }
      ship->currspeed = UMAX(0, (int) ship->realspeed * speedbonus(ship));
      ship->energy -= 100;
      return;
}       

/*Sabotage by Arcturus */ 
void do_sabotage(CHAR_DATA *ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   SHIP_DATA *ship;
   int chance;
    switch( ch->substate )
    {
       default:
       if (  (ship = ship_from_engine(ch->in_room->vnum))  == NULL )
       {
          send_to_char("&RYou must be in the engine room of a ship to sabotage it\n\r", ch);
          return;
       }

   if ( str_cmp( argument , "lasers" ) && str_cmp( argument , "drive" ) &&
        str_cmp( argument , "launcher" ) && str_cmp( argument , "ions" ) &&
        str_cmp( argument , "turret1" ) && str_cmp( argument , "turret2") && 
        str_cmp( argument , "rlauncher" ) && str_cmp( argument , "tlauncher"))
   {
      send_to_char("Syntax: sabotage <lasers/ions/drive/turret1/turret2/launcher/tlauncher/rlauncher>", ch);
      return;
   }
   strcpy(arg, argument);
   if(!str_cmp("public", ship->owner))
   {
      send_to_char("Its not very polite to sabotage public craft. Not much to gain from it either.\n\r", ch);
      return;
   }
   if(!str_cmp(argument, "lasers"))
   {
      if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLASERS))
      {
         send_to_char("Lasers are already sabotaged.\n\r", ch);
         return;
      }
      if(!ship->lasers)
      {
         send_to_char("That ship doesn't have any lasers to sabotage.\n\r", ch);
         return;
      }
   }
   else if(!str_cmp(argument, "ions"))
   {
      if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDIONS))
      {
         send_to_char("Ions are already sabotaged.\n\r", ch);
         return;
      }
      if(!ship->ions)
      {
         send_to_char("That ship doesn't have any ions to sabotage.\n\r", ch);
         return;
      }
   }
   else if(!str_cmp(argument, "drive"))
   {
      if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDENGINE))
      {
         send_to_char("Drive is already sabotaged.\n\r", ch);
         return;
      }
   }
   else if(!str_cmp(argument, "turret1"))
   {
       if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET1))
       {
          send_to_char("Turret 1 is already sabotaged.\n\r", ch);
          return;
       }
       if(!ship->turret1)
       {
          send_to_char("That ship doesn't have a turret.\n\r", ch);
          return;
       }
   }
   else if(!str_cmp(argument, "turret2"))
   {
      if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTURRET2))
      {
         send_to_char("Turret 2 is already sabotaged.\n\r", ch);
         return;
      }
      if(!ship->turret2)
      {
         send_to_char("That ship doesn't have a second turret.\n\r", ch);
         return;
      }
   }
   else if(!str_cmp(argument, "launcher"))
   {
      if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS))
      {
         send_to_char("Launchers are already sabotaged.\n\r", ch);
         return;
      }
      if(!ship->mlaunchers)
      { 
         send_to_char("That ship doesn't have a missile launcher.\n\r", ch);
         return;
      }
   }
   else if(!str_cmp(argument, "tlauncher"))
   {
     if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS))
     {
        send_to_char("Torpedo Launchers are already sabotaged.\n\r", ch);
        return;
     }
     if(!ship->tlaunchers)
     {
        send_to_char("That ship dosen't have a torpedo launcher.\n\r", ch);
        return;
     }
   }
   else if(!str_cmp(argument, "rlauncher"))
   {
     if(IS_SET(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS))
     {
        send_to_char("Rocket Launchers are already sabotaged.\n\r", ch);
        return;
     }
     if(!ship->rlaunchers)
     {
        send_to_char("That ship doesn't have rocket launchers.\n\r", ch);
        return;
     }
   }
   else
   {
      send_to_char("Syntax: sabotage <lasers/ions/drive/turret1/turret2/launcher/rlauncher/tlauncher>\n\r", ch);
      return;
   }
   chance = IS_NPC(ch) ? ch->top_level
            : (int) (ch->pcdata->learned[gsn_sabotage]);
   if ( number_percent( ) < chance )
   {
      send_to_char("&GYou begin sabotaging the craft.\n\r", ch);
      if(IS_SET(ship->flags, SHIPFLAG_SIMULATOR))
      {
         send_to_char("You realize its a simulator and and begin to upload a virus, while playing pong.\n\r", ch);
      }
      act( AT_PLAIN, "$n begins fiddling around with the ships $T.", ch,
         NULL, argument , TO_ROOM );
      add_timer ( ch , TIMER_DO_FUN , 5 , do_sabotage , 1 );
      ch->dest_buf = str_dup(arg);
      return;
   }
   send_to_char("You aren't quite sure how to sabotage it.\n\r", ch);
   return;
        case 1:
                if ( !ch->dest_buf )
                   return;
                strcpy(arg, ch->dest_buf);
                DISPOSE( ch->dest_buf);
                break;
        case SUB_TIMER_DO_ABORT:
                DISPOSE( ch->dest_buf );
                ch->substate = SUB_NONE;
                if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
                      return;                                                  
                send_to_char("&RYou are distracted and fail to finish your sabotage efforts.\n\r", ch);
                return;
       }
    ch->substate = SUB_NONE;
    if ( (ship = ship_from_engine(ch->in_room->vnum)) == NULL )
    {
       return;
    }
   chance = IS_NPC(ch) ? ch->top_level
            : (int) (ch->pcdata->learned[gsn_sabotage]);
   if ( number_percent( ) > chance )
   {
      send_to_char( "&RYou fail to properly sabotage it.\n\r", ch);
      learn_from_failure( ch, gsn_sabotage );
      act( AT_PLAIN, "$n finishes fiddling with something.", ch, NULL, argument, TO_ROOM);
      return;
   }
   send_to_char("&GYou finish sabotaging it, and conceal your efforts.\n\r", ch);
   learn_from_success(ch, gsn_sabotage);
   act( AT_PLAIN, "$n finishes fiddling with something.", ch,
        NULL, argument , TO_ROOM );
   if(!str_cmp(arg, "lasers"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDLASERS);
   if(!str_cmp(arg, "ions"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDIONS);
   if(!str_cmp(arg, "drive"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDENGINE);
   if(!str_cmp(arg, "turret1"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET1);
   if(!str_cmp(arg, "turret2"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDTURRET2);
   if(!str_cmp(arg, "launcher"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDLAUNCHERS);
   if(!str_cmp(arg, "tlauncher"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDTLAUNCHERS);
   if(!str_cmp(arg, "rlauncher"))
      SET_BIT(ship->flags, SHIPFLAG_SABOTAGEDRLAUNCHERS);
   return;    
}

/*Laser and Missile linking, by Arcturus */
/* Originally only for lasers/ions. */
void do_linklaser(CHAR_DATA *ch, char *argument)
{
    int chance, llink;
    SHIP_DATA *ship;
    if ( str_cmp( argument , "duallaser" ) && str_cmp( argument , "trilaser" ) &&
         str_cmp( argument , "quadlaser" ) && str_cmp( argument , "dualion" ) &&
         str_cmp( argument , "triion" ) && str_cmp( argument , "quadion")     &&
         str_cmp( argument , "dualmissile") && str_cmp(argument, "dualtorpedo") &&
         str_cmp( argument , "dualrocket"))
    {
       send_to_char("Syntax: link <duallaser/trilaser/quadlaser/dualion/triion/quadion/dualmissile/dualtorpedo/dualrocket>", ch);
       return;
    }
        if (  (ship = ship_from_turret(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the gunners chair or turret of a ship to do that!\n\r",ch);
            return;
        }
        if ( ship->class > MOBILE_SUIT )
        {
             send_to_char("&RThis isn't a spacecraft!\n\r",ch);
             return;
        }
        if ( autofly(ship) )
        {
             send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
             return;
        }
        if (ship->shipstate == SHIP_HYPERSPACE)
        {
             send_to_char("&RYou can only do that in realspace!\n\r",ch);
             return;
        }
        if (ship->starsystem == NULL)
        {
             send_to_char("&RYou can't do that until after you've finished launching!\n\r",ch);
             return;
        }
        if ( ship->energy < 5 )
        {
             send_to_char("&RTheres not enough energy left to link them!\n\r",ch);
             return;
        }
    if(!str_cmp(argument, "duallaser"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
       {
          send_to_char("Your lasers are already dual linked.\n\r", ch);
          return;
       }
       if(ship->lasers < 2)
       {
          send_to_char("You can't duallink your lasers.\n\r", ch);
          return;
       }
       llink = 0;
    }
    if(!str_cmp(argument, "trilaser"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
       {
          send_to_char("Your lasers are already trilinked.\n\r", ch);
          return;
       }
       if(ship->lasers < 3)
       {
          send_to_char("You can't trilink your lasers.\n\r", ch);
          return;
       }
       llink = 1;
    }
    if(!str_cmp(argument, "quadlaser"))
    {
        if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
       {
          send_to_char("Your lasers are already quadlinked.\n\r", ch);
          return;
       }
       if(ship->lasers < 4)
       {
          send_to_char("You can't quadlink your lasers.\n\r", ch);
          return;
       }
       llink = 2;
    }
    if(!str_cmp(argument, "dualion"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALION))
       {
          send_to_char("Your ions are already dual linked.\n\r", ch);
          return;
       }
       if(ship->ions < 2)
       {
          send_to_char("You can't duallink your ions.\n\r", ch);
          return;
       }
       llink = 3;
    }
    if(!str_cmp(argument, "triion"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_TRIION))
       {
          send_to_char("Your lasers are already trilinked.\n\r", ch);
          return;
       }
       if(ship->ions < 3)
       {
          send_to_char("You can't trilink your ions.\n\r", ch);
          return;
       }
       llink = 4;
    }
    if(!str_cmp(argument, "quadion"))
    {
        if(IS_SET(ship->flags, SHIPFLAG_QUADION))
       {
          send_to_char("Your ions are already quadlinked.\n\r", ch);
          return;
       }
       if(ship->ions < 4)
       {
          send_to_char("You can't quadlink your ions.\n\r", ch);
          return;
       }
       llink = 5;
    }
    if(!str_cmp(argument, "dualmissile"))
    {
        if(IS_SET(ship->flags, SHIPFLAG_DUALMISSILE))
       {
          send_to_char("Your missile launchers are already dual linked.\n\r", ch);
          return;
       }
       if(ship->mlaunchers < 2)
       {
          send_to_char("You can't dual link your missile launchers.\n\r", ch);
          return;
       }
       llink = 6;
    }
    if(!str_cmp(argument, "dualtorpedo"))
    {
        if(IS_SET(ship->flags, SHIPFLAG_DUALTORPEDO))
       {
          send_to_char("Your torpedo launchers are already dual linked.\n\r", ch);
          return;
       }
       if(ship->tlaunchers < 2)
       {
          send_to_char("You can't dual link your torpedo launchers.\n\r", ch);
          return;
       }
       llink = 7;
    }
        if(!str_cmp(argument, "dualrocket"))
    {
    if(IS_SET(ship->flags, SHIPFLAG_DUALROCKET))
       {
          send_to_char("Your torpedo launchers are already dual linked.\n\r", ch);
          return;
       }
       if(ship->rlaunchers < 2)
       {
          send_to_char("You can't dual link your rocket launchers.\n\r", ch);
          return;
       }
       llink = 8;
    }
    chance = IS_NPC(ch) ? ch->top_level
                 : (int)  (ch->pcdata->learned[gsn_weaponsystems]);
    if ( number_percent( ) > chance )
    {
        send_to_char("&RYou can't quite figure out where the switch is.\n\r",ch);
        learn_from_failure( ch, gsn_weaponsystems );
        return;
    }
    switch(llink)
    {
    case 0: 
       SET_BIT(ship->flags, SHIPFLAG_DUALLASER); 
       if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_TRILASER);
       if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_QUADLASER);
       send_to_char("You link your lasers up.\n\r", ch);
       act( AT_PLAIN, "$n flips a switch. Laserfire linked.", ch,
          NULL, argument , TO_ROOM );
       break;
    case 1: SET_BIT(ship->flags, SHIPFLAG_TRILASER);
       if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_DUALLASER);
       if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_QUADLASER);
       send_to_char("You link your lasers up.\n\r", ch);
       act( AT_PLAIN, "$n flips a switch. Laserfire linked.", ch,
         NULL, argument , TO_ROOM );
       break;
    case 2: SET_BIT(ship->flags, SHIPFLAG_QUADLASER); 
       if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_DUALLASER);
       if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_TRILASER);
       send_to_char("You link your lasers up.\n\r", ch);
       act( AT_PLAIN, "$n flips a switch. Laserfire linked.", ch,
         NULL, argument , TO_ROOM );
       break;
    case 3: SET_BIT(ship->flags, SHIPFLAG_DUALION); 
       if(IS_SET(ship->flags, SHIPFLAG_TRIION))
          REMOVE_BIT(ship->flags, SHIPFLAG_TRIION);
       if(IS_SET(ship->flags, SHIPFLAG_QUADION))
          REMOVE_BIT(ship->flags, SHIPFLAG_QUADION);
       send_to_char("You link your ion cannons up.\n\r", ch);
       act( AT_PLAIN, "$n flips a switch. Ionfire linked.", ch,
         NULL, argument , TO_ROOM );
       break;
    case 4: SET_BIT(ship->flags, SHIPFLAG_TRIION); 
       if(IS_SET(ship->flags, SHIPFLAG_DUALION))
          REMOVE_BIT(ship->flags, SHIPFLAG_DUALION);
       if(IS_SET(ship->flags, SHIPFLAG_QUADION))
          REMOVE_BIT(ship->flags, SHIPFLAG_QUADION);
       send_to_char("You link your ion cannons up.\n\r", ch);
       act( AT_PLAIN, "$n flips a switch. Ionfire linked.", ch,
         NULL, argument , TO_ROOM );
        break;
    case 5: SET_BIT(ship->flags, SHIPFLAG_QUADION); 
       if(IS_SET(ship->flags, SHIPFLAG_DUALION))
         REMOVE_BIT(ship->flags, SHIPFLAG_DUALION);
       if(IS_SET(ship->flags, SHIPFLAG_TRIION))
         REMOVE_BIT(ship->flags, SHIPFLAG_TRIION);
       send_to_char("You link your ion cannons up.\n\r", ch);
       act( AT_PLAIN, "$n flips a switch. Ionfire linked.", ch,
         NULL, argument , TO_ROOM );
       break;
    case 6: SET_BIT(ship->flags, SHIPFLAG_DUALMISSILE);
         send_to_char("You link your missile launchers up.\n\r", ch);
         act( AT_PLAIN, "$n flips a switch. Missile launchers linked.", ch,
         NULL, argument , TO_ROOM );
         break;
    case 7: SET_BIT(ship->flags, SHIPFLAG_DUALTORPEDO);
         send_to_char("You link your torpedo launchers up.\n\r", ch);
         act( AT_PLAIN, "$n flips a switch. Torpedo launchers linked.", ch,
             NULL, argument , TO_ROOM );
         break;
    case 8: SET_BIT(ship->flags, SHIPFLAG_DUALROCKET);
        send_to_char("You link your rocket launchers up.\n\r", ch);
        act( AT_PLAIN, "$n flips a switch. Rocket launchers linked.", ch,
            NULL, argument , TO_ROOM );
        break;
    default: send_to_char("Error in link code, not linked, invalid link value.\n\r", ch); break;
    }
    ship->energy -= 5;
    learn_from_success(ch, gsn_weaponsystems);
    return;
}

/* For Unlinking The Weapons - Arcturus */
void do_unlinklaser(CHAR_DATA *ch, char *argument)
{
    int chance;
    bool unlink;
    SHIP_DATA *ship;
    if ( str_cmp( argument , "laser" ) && str_cmp( argument , "ion" )
      && str_cmp( argument , "missile") && str_cmp( argument, "torpedo")
      && str_cmp( argument , "rocket"))
    {
       send_to_char("Syntax: unlink <laser/ion/missile/torpedo/rocket>", ch);
       return;
    }
        if (  (ship = ship_from_gunseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the gunners chair to do that!\n\r",ch);
            return;
        }
        if ( ship->class > MOBILE_SUIT )
        {
             send_to_char("&RThis isn't a spacecraft!\n\r",ch);
             return;
        }
        if ( autofly(ship) )
        {
             send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
             return;
        }
        if (ship->shipstate == SHIP_HYPERSPACE)
        {
             send_to_char("&RYou can only do that in realspace!\n\r",ch);
             return;
        }
        if (ship->starsystem == NULL)
        {
             send_to_char("&RYou can't do that until after you've finished launching!\n\r",ch);
             return;
        }
    unlink = FALSE;
    if(!str_cmp(argument, "laser"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
          unlink = TRUE;
       if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
          unlink = TRUE;
       if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
          unlink = TRUE;
       if(!unlink)
       {
          send_to_char("Your lasers aren't linked.\n\r", ch);
          return;
       }
    }
    if(!str_cmp(argument, "ion"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALION))
          unlink = TRUE;
       if(IS_SET(ship->flags, SHIPFLAG_TRIION))
          unlink = TRUE;
       if(IS_SET(ship->flags, SHIPFLAG_QUADION))
          unlink = TRUE;
       if(!unlink)
       {
          send_to_char("Your ions aren't linked.\n\r", ch);
          return;
       }
     }
    if(!str_cmp(argument, "missile"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALMISSILE))
           unlink = TRUE;
       if(!unlink)
       {
          send_to_char("Your missile launchers aren't linked.\n\r", ch);
          return;
       }
    }
    if(!str_cmp(argument, "torpedo"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALTORPEDO))
          unlink = TRUE;
       if(!unlink)
       {
          send_to_char("Your torpedo launchers aren't linked.\n\r", ch);
          return;
       }
    }
    if(!str_cmp(argument, "rocket"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALROCKET))
          unlink = TRUE;
       if(!unlink)
       {
          send_to_char("Your rocket launchers aren't linked.\n\r", ch);
          return;
       }
    }
    chance = IS_NPC(ch) ? ch->top_level
                 : (int)  (ch->pcdata->learned[gsn_weaponsystems]) ;
    if ( number_percent( ) > chance )
    {
        send_to_char("&RYou can't quite figure out where the switch is.\n\r",ch);
        learn_from_failure( ch, gsn_weaponsystems );
        return;
    }
    if(!str_cmp(argument, "laser"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALLASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_DUALLASER);
       if(IS_SET(ship->flags, SHIPFLAG_TRILASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_TRILASER);
       if(IS_SET(ship->flags, SHIPFLAG_QUADLASER))
          REMOVE_BIT(ship->flags, SHIPFLAG_QUADLASER);
      send_to_char("You unlink your lasers.\n\r", ch);
      act( AT_PLAIN, "$n flips a switch. Unlinked lasers.\n\r", ch,
         NULL, argument , TO_ROOM );
    }
    if(!str_cmp(argument, "ion"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALION))
          REMOVE_BIT(ship->flags, SHIPFLAG_DUALION);
       if(IS_SET(ship->flags, SHIPFLAG_TRIION))
          REMOVE_BIT(ship->flags, SHIPFLAG_TRIION);
       if(IS_SET(ship->flags, SHIPFLAG_QUADION))
          REMOVE_BIT(ship->flags, SHIPFLAG_QUADION);
       send_to_char("You unlink your ion cannons.\n\r", ch);
       act( AT_PLAIN, "$n flips a switch. Unlinked ion cannons.\n\r", ch,
         NULL, argument , TO_ROOM );
     }
    if(!str_cmp(argument, "missile"))
    {
      if(IS_SET(ship->flags, SHIPFLAG_DUALMISSILE))
         REMOVE_BIT(ship->flags, SHIPFLAG_DUALMISSILE);
          send_to_char("You unlink your missile launchers.\n\r", ch);
        act( AT_PLAIN, "$n flips a switch. Unlinked missile launchers.", ch,
         NULL, argument , TO_ROOM );
    }
    if(!str_cmp(argument, "torpedo"))
    {
      if(IS_SET(ship->flags, SHIPFLAG_DUALTORPEDO))
         REMOVE_BIT(ship->flags, SHIPFLAG_DUALTORPEDO);
      send_to_char("You unlink your torpedo launchers.\n\r", ch);
    act( AT_PLAIN, "$n flips a switch. Unlinked torpedo launchers.\n\r", ch,
         NULL, argument , TO_ROOM );
    }
    if(!str_cmp(argument, "rocket"))
    {
       if(IS_SET(ship->flags, SHIPFLAG_DUALROCKET))
          REMOVE_BIT(ship->flags, SHIPFLAG_DUALROCKET);
       send_to_char("You unlink your rocket launchers.\n\r", ch);
    act( AT_PLAIN, "$n flips a switch. Unlinked rocket launchers.", ch,
         NULL, argument , TO_ROOM );
    }
    learn_from_success(ch, gsn_weaponsystems);
    return;   
}

/* Redirection by Arcturus */
void do_redirect(CHAR_DATA *ch, char *argument)
{
    char arg1[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    SHIP_DATA *ship;
    int chance;
    argument = one_argument(argument, arg1);

    if ( str_cmp( argument , "laser" ) && str_cmp( argument , "shield" ) && str_cmp(argument, "engine")
      && str_cmp( argument , "lasers" ) && str_cmp( argument, "shields" )
      && str_cmp( arg1, "laser" ) && str_cmp(arg1, "shield") && str_cmp(arg1, "engine") && str_cmp(arg1, "default") 
      && str_cmp( arg1, "lasers" ) && str_cmp(arg1, "shields") )
    {
       send_to_char("Syntax: redirect <laser/shield/engine> <laser/shield/engine/default>\n\r", ch);
       return;
    }
    if(!str_cmp(arg1, argument))
    {
       send_to_char("Syntax for disabling redirection: redirect <laser/shield/engine> default\n\r", ch);
       return;
    }  
        if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
            return;
        }
        if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
        {
            send_to_char("&RYou must be in the pilot seat of a ship to do that!\n\r",ch);
            return;
        }
        if(!str_cmp(argument, "laser") || !str_cmp(arg1, "laser"))
        {
           if(ship->lasers == 0)
           {
              send_to_char("Redirect with what lasers?\n\r", ch);
              return;
           }
        }
        if(!str_cmp(argument, "shield") || !str_cmp(arg1, "shield"))
        {
           if(ship->maxshield == 0)
           {
              send_to_char("Redirect with what shields?\n\r", ch);
              return;
           }
        }  
        if ( ship->class > MOBILE_SUIT )
        {
             send_to_char("&RThis isn't a spacecraft!\n\r",ch);
             return;
        }
        if ( autofly(ship) )
        {
             send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
             return;
        }
        if (ship->shipstate == SHIP_HYPERSPACE)
        {
             send_to_char("&RYou can only do that in realspace!\n\r",ch);
             return;
        }
        if (ship->starsystem == NULL)
        {
             send_to_char("&RYou can't do that until after you've finished launching!\n\r",ch);
             return;
        }

    chance = IS_NPC(ch) ? ch->top_level
                 : (int)  (ch->pcdata->learned[gsn_shipsystems]) ;
    if ( number_percent( ) > chance )
    {
        send_to_char("&RYou can't quite figure out the controls.\n\r",ch);
        learn_from_failure( ch, gsn_shipsystems );
        return;
    }
    act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
    if(!str_cmp(arg1, "laser") || !str_cmp(arg1, "lasers") )
    {
       if(!str_cmp(argument, "default"))
       {
          if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
          {
             REMOVE_BIT(ship->flags, SHIPFLAG_LASERRENGINE);
             if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
             {
                sprintf( buf, "%s begins to slow down." , ship->name );
                echo_to_system( AT_ORANGE , ship , buf , NULL );
             }
             ship->currspeed = UMIN(ship->currspeed, (int) ship->realspeed * speedbonus(ship));
          }
          if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
             REMOVE_BIT(ship->flags, SHIPFLAG_LASERRSHIELD);
          send_to_char("Lasers recharging at a normal rate.\n\r", ch);
       }
       if(!str_cmp(argument, "shield") || !str_cmp(argument, "shields") )
       {
          if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
          {
             REMOVE_BIT(ship->flags, SHIPFLAG_LASERRENGINE);
             if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
             {
                sprintf( buf, "%s begins to slow down." , ship->name );
                echo_to_system( AT_ORANGE , ship , buf , NULL );
             }
             ship->currspeed = UMIN(ship->currspeed, (int) ship->realspeed * speedbonus(ship));
          } 
          if(!IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
             SET_BIT(ship->flags, SHIPFLAG_LASERRSHIELD);
          send_to_char("Laser power redirected to shields, lasers recharging at a decreased rate, shields recharging at increased rate.\n\r", ch);
          if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
         {
             send_to_char("Shield power transfer to lasers, reverted.\n\r", ch);
             REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRLASER);
          }
       }
       if(!str_cmp(argument, "engine"))
       {
          if(!IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
             SET_BIT(ship->flags, SHIPFLAG_LASERRENGINE);
          if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
             REMOVE_BIT(ship->flags, SHIPFLAG_LASERRSHIELD);
          send_to_char("Laser power being redirected to engines. Lasers recharging at a decreased rate.\n\r", ch);
          if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
          {
             send_to_char("Engine power redirected back to engines.\n\r", ch);
             REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERLASER);
          }
          if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
          {
             sprintf( buf, "%s begins to speed up." , ship->name );
             echo_to_system( AT_ORANGE , ship , buf , NULL );
          }
          ship->currspeed = UMAX(0, (int) ship->realspeed * speedbonus(ship));
       }
    }  

    if(!str_cmp(arg1, "shield") || !str_cmp(arg1, "shields" ) )
    {
       if(!str_cmp(argument, "default"))
       {
          if(IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
          {
             REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRENGINE);
             if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
             {          
                sprintf( buf, "%s begins to slow down." , ship->name );
                echo_to_system( AT_ORANGE , ship , buf , NULL );
             }
             ship->currspeed = UMIN(ship->currspeed, (int) ship->realspeed * speedbonus(ship));
          }
          if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
             REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRLASER);
          send_to_char("Shields recharging at normal rate\n\r", ch);
       }
       if(!str_cmp(argument, "laser") || !str_cmp(argument, "lasers") )
       {
          if(IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
          {
             REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRENGINE);
             if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
             {
                sprintf( buf, "%s begins to slow down." , ship->name );
                echo_to_system( AT_ORANGE , ship , buf , NULL );
             } 
             ship->currspeed = UMIN(ship->currspeed, (int) ship->realspeed * speedbonus(ship));
          }
          if(!IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
             SET_BIT(ship->flags, SHIPFLAG_SHIELDRLASER);
          send_to_char("Shield power redirected to lasers, shield power recharging at a decreased rate.\n\r", ch);
          if(IS_SET(ship->flags, SHIPFLAG_LASERRSHIELD))
          {
             send_to_char("Laser transfer to shields reverted, lasers recharging at an increased rate.\n\r", ch);
             REMOVE_BIT(ship->flags, SHIPFLAG_LASERRSHIELD);
          }
       }
       if(!str_cmp(argument, "engine"))
       {
          if(!IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
             SET_BIT(ship->flags, SHIPFLAG_SHIELDRENGINE);
          if(IS_SET(ship->flags, SHIPFLAG_SHIELDRLASER))
             REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRLASER);
          send_to_char("Shield power being redirected to engines, shields recharging at a decreased rate.\n\r", ch);
          if(IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
          {
              send_to_char("Engine power redirected back to engines.\n\r", ch);
              REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERSHIELD);
          }
          if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
          {
             sprintf( buf, "%s begins to speed up." , ship->name );
             echo_to_system( AT_ORANGE , ship , buf , NULL );
          }
          ship->currspeed = UMAX(0, (int) ship->realspeed * speedbonus(ship));
       }
    }  
    if(!str_cmp(arg1, "engine"))
    {
       if(!str_cmp(argument, "default"))
       {
          if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
             REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERLASER);
          if(IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
             REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERSHIELD);
          send_to_char("The engines revert power back to normal.\n\r", ch);
          if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
          {
             sprintf( buf, "%s begins to speed up." , ship->name );
             echo_to_system( AT_ORANGE , ship , buf , NULL );
          }
          ship->currspeed = UMAX(0, (int) ship->realspeed * speedbonus(ship));
       }
       if(!str_cmp(argument, "shield") || !str_cmp(argument, "shields") )
       {
          if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
             REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERLASER);
          if(!IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
             SET_BIT(ship->flags, SHIPFLAG_ENGINERSHIELD);
          if(IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
          {
             send_to_char("Shield redirection back to shields.\n\r", ch);
             REMOVE_BIT(ship->flags, SHIPFLAG_SHIELDRENGINE);
          }
          if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
          {
             send_to_char("Redirecting engine power to shields.\n\r", ch);
             sprintf( buf, "%s begins to slow down." , ship->name );
          }
          echo_to_system( AT_ORANGE , ship , buf , NULL );
          ship->currspeed = UMIN(ship->currspeed, (int) ship->realspeed * speedbonus(ship));
       }
       if(!str_cmp(argument, "laser") || !str_cmp(argument, "lasers") )
       {
          if(!IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
             SET_BIT(ship->flags, SHIPFLAG_ENGINERLASER);
          if(IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
             REMOVE_BIT(ship->flags, SHIPFLAG_ENGINERSHIELD);
          send_to_char("Engine power being redirected to lasers.\n\r", ch);
          if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
          {
              send_to_char("Laser power being redirected back to lasers.\n\r", ch);
              REMOVE_BIT(ship->flags, SHIPFLAG_LASERRENGINE);
          }
          if(!IS_SET(ship->flags, SHIPFLAG_CLOAKED) )
          {
             sprintf( buf, "%s begins to slow down." , ship->name );
             echo_to_system( AT_ORANGE , ship , buf , NULL );
          }
          ship->currspeed = UMIN(ship->currspeed, (int) ship->realspeed * speedbonus(ship));
       }
    }  
    learn_from_success(ch, gsn_shipsystems);
    return;
}

/* For Calculating extra max speed. -Arcturus */
float speedbonus(SHIP_DATA *ship)
{
   float accelbonus;
   accelbonus = 1.0;
   if(IS_SET(ship->flags, SHIPFLAG_OVERDRIVENODE))
      accelbonus *= 2;
   if(IS_SET(ship->flags, SHIPFLAG_AFTERBURNER))
      accelbonus *= 1.1;
   if(IS_SET(ship->flags, SHIPFLAG_LASERRENGINE))
      accelbonus *= 1.1;
   if(IS_SET(ship->flags, SHIPFLAG_SHIELDRENGINE))
      accelbonus *= 1.1;
   if(IS_SET(ship->flags, SHIPFLAG_ENGINERLASER))
      accelbonus *= .9;
   if(IS_SET(ship->flags, SHIPFLAG_ENGINERSHIELD))
      accelbonus *= .9;
   return accelbonus;
}

/* End Simulator Code, Installed by Arcturus, written by Ackbar */
void do_endsimulator( CHAR_DATA *ch, char *argument )
{
  SHIP_DATA *ship;
  char buf[MAX_INPUT_LENGTH];
  if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
  {
    send_to_char("You must be in the cockpit of a simulator.\n\r", ch);
    return;
  }	
  if (!IS_SET(ship->flags, SHIPFLAG_SIMULATOR) )
  {
    send_to_char("You must be in the cockpit of a simulator.\n\r", ch);
    return;
  }
	         ship->shipyard = ship->lastdoc;
	  	 ship->shipstate = SHIP_READY;
	         extract_ship( ship );
        	 ship_to_room( ship , ship->shipyard ); 
          	 ship->location = ship->shipyard;
          	 ship->lastdoc = ship->shipyard; 
          	 ship->shipstate = SHIP_DOCKED;    
          	 if (ship->starsystem)
        	 ship_from_starsystem( ship, ship->starsystem );  
                 save_ship(ship);               
          	 send_to_char("The lights dim and the hatch opens.\n\r", ch);
          	 sprintf(buf, "%s suddenly disapears from your viewcreen and off your radar.\n\r", ship->name);
          	 echo_to_system( AT_WHITE, ship , buf , NULL );
}

/* For Evasion- Arcturus */
CHAR_DATA *pilot_from_ship(SHIP_DATA *ship)
{
    int vnum;
    CHAR_DATA *wch;
    vnum = ship->pilotseat;
    for ( wch = first_char; wch; wch = wch->next )
    {
       if(wch->in_room->vnum == vnum && !IS_NPC(wch))
          return wch;
    }
    return NULL;
}      

/* Did he evade or not? -Arcturus */
bool evaded(SHIP_DATA *ship, SHIP_DATA *target)
{
    CHAR_DATA *victim;
    if( (victim = pilot_from_ship(target))) /* Pilot Found */
    {
        int echance;
        echance = victim->pcdata->learned[gsn_evade] / 3+10;
        if(victim->subclass == SUBCLASS_WFOCUS)
           echance += 5;
        if(ship->class > MIDSIZE_SHIP)
           echance += ship->class;
        if(target->class > MIDSIZE_SHIP)
           return FALSE;
        if(number_percent() < echance)
        {
           learn_from_success(victim, gsn_evade);
           return TRUE;
        }
        learn_from_failure(victim, gsn_evade); 
        return FALSE;
     }
     /* No pilot found, can't evade it then ;P */
     return FALSE; 
}

/* Cloaking by Arcturus */
void do_cloak( CHAR_DATA *ch, char *argument )
{
    int chance;
    SHIP_DATA *ship;
    char buf[MAX_STRING_LENGTH];

    if (  (ship = ship_from_cockpit(ch->in_room->vnum))  == NULL )
    {
       send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
        return;
    }

    if ( ship->class > MOBILE_SUIT )
    {
       send_to_char("&RThis isn't a spacecraft!\n\r",ch);
       return;
    }
    if (  (ship = ship_from_pilotseat(ch->in_room->vnum))  == NULL )
    {
       send_to_char("&RThe controls must be at the pilots chair...\n\r",ch);
       return;
    }
    if ( autofly(ship) )
    {
       send_to_char("&RYou'll have to turn off the ships autopilot first.\n\r",ch);
       return;
    }
    if (ship->shipstate == SHIP_HYPERSPACE)
    {
       send_to_char("&RYou can only do that in realspace!\n\r",ch);
       return;
    }
    if (ship->shipstate == SHIP_DISABLED)
    {
       send_to_char("&RThe ships drive is disabled. Not enough power to engage cloak.\n\r",ch);
       return;
    }
    if (ship->shipstate == SHIP_DOCKED)
    {
        send_to_char("&RYou can't do that until after you've launched!\n\r",ch);
        return;
    }

    if ((ship->shipstate2 == SHIP_DOCK) || (ship->shipstate2 == SHIP_DOCK_2))
    {
       send_to_char("&RNot while docking procedures are going on.\n\r", ch);
       return;
    }
    if (ship->shipstate2 == SHIP_DOCK_3)
    {
      send_to_char("&RDetach from the docked ship first.\n\r",ch);
      return;
    }
    if (ship->cloak == 0)
    {
      send_to_char("&RTry installing a cloaking device first.\n\r", ch);
      return;
    }
    if(ship->energy < 200)
    {
      send_to_char("&RYou don't have enough fuel.", ch);
      return;
    }
    if(!str_cmp(argument, "off"))
    {
      if (IS_SET(ship->flags, SHIPFLAG_CLOAKED))
      {
        send_to_char("&WYou shut off your cloaking device, and your ship appears.\n\r", ch);
        REMOVE_BIT(ship->flags, SHIPFLAG_CLOAKED);
        act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
        sprintf( buf, "%s appears out of nowhere." , ship->name );
        echo_to_system( AT_ORANGE , ship , buf , NULL );
        return;
      }
      else
      {
         send_to_char("&WYour cloaking device isn't active.\n\r", ch);
         return;
      }
    }
      if(IS_SET(ship->flags, SHIPFLAG_CLOAKED))
      {
          send_to_char("&WYour ship is already cloaked. Type cloak off to turn it off.\n\r", ch);
          return;
      }
      chance = IS_NPC(ch) ? ch->top_level : (int) (ch->pcdata->learned[gsn_cloak]);
      if ( number_percent( ) >= chance )
      {
          send_to_char("&RYou fail to work the controls properly.\n\r",ch);
          learn_from_failure(ch, gsn_cloak);
          return;
      }
      learn_from_success(ch, gsn_cloak);
      SET_BIT(ship->flags, SHIPFLAG_CLOAKED);
      send_to_char("Cloaking generator activated.\n\r", ch);
      act( AT_PLAIN, "$n manipulates the ships controls.", ch, NULL, argument , TO_ROOM );
      sprintf( buf, "%s disappears into nowhere." , ship->name );
      echo_to_system( AT_ORANGE , ship , buf , NULL );
      ship->energy -= 200; /* fuel used to activate it. */
      return;
}