DBZu/area/
DBZu/area/imc/
DBZu/boards/
DBZu/clans/
DBZu/color/
DBZu/councils/
DBZu/deity/
DBZu/doc/mudprogs/
DBZu/gods/
DBZu/log/
DBZu/notes/
DBZu/player/a/
DBZu/player/backup/c/
DBZu/player/backup/k/
DBZu/player/c/
DBZu/player/d/
DBZu/player/j/
DBZu/player/k/
DBZu/player/o/
DBZu/player/r/
DBZu/player/s/
DBZu/player/t/
DBZu/player/v/
DBZu/player/w/
DBZu/player/z/
/****************************************************************************
 * |Dragon Ball Z Universe, Version FINAL                     |             *
 * -----------------------------------------------------------|             *
 * |DBZUCodebase V. FINAL, 2005, 2006, 2007, Jessie Reidl     |             *
 * -----------------------------------------------------------|             *
 *                  -------------------------                               *
 *                  |      Space Module     |                               *
 ****************************************************************************/


#include <math.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"

SHIP_DATA * first_ship;
SHIP_DATA * last_ship;

/* local routines */
void    write_ship_list args( ( void ) );
bool    load_ship_file  args( ( char *shipfile ) );
void    fread_ship      args( ( SHIP_DATA *ship, FILE *fp ) );


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_pager_color( "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->owner2         = STRALLOC( "" );
    ship->home          = STRALLOC( "" );
    ship->first_stop    = NULL;
    ship->second_stop   = NULL;
    ship->launch1       = 0;
    ship->launch2       = 0;
    ship->speed         = 40;
    ship->in_room=NULL;
    ship->next_in_room=NULL;
    ship->prev_in_room=NULL;
    ship->time = 100;

    ship->filename = str_dup( arg );
    save_ship( ship );
    write_ship_list( );
    send_to_pager_color( "Done.\n\r", ch );

}

/* void do_test(CHAR_DATA *ch, char *argument )
{
       transform_oozaru( );
} */

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

    if ( !ship )
    {
        bug( "save_ship: null ship pointer!", 0 );
        return;
    }

    if ( !ship->filename || ship->filename[0] == '\0' )
    {
        sprintf( buf, "save_ship: %s has no filename", ship->name );
        bug( buf, 0 );
        return;
    }

    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, "Owner2       %s~\n",      ship->owner2            );
        fprintf( fp, "Shipyard     %d\n",       ship->shipyard          );
        fprintf( fp, "Entrance     %d\n",       ship->entrance          );
        fprintf( fp, "Firstroom    %d\n",       ship->firstroom         );
        fprintf( fp, "Lastroom     %d\n",       ship->lastroom          );
        fprintf( fp, "Lastdoc      %d\n",       ship->lastdoc           );
        fprintf( fp, "Home         %s~\n",      ship->home              );
        fprintf( fp, "Target       %d\n",       ship->target            );
        fprintf( fp, "Temptarget   %d\n",       ship->target            );
        fprintf( fp, "Time         %d\n",       ship->time              );
        fprintf( fp, "Timeleft     %d\n",       ship->timeleft          );
        fprintf( fp, "Type         %d\n",       ship->type              );
        fprintf( fp, "Keyvnum      %d\n",       ship->keyvnum           );
        fprintf( fp, "Lock         %d\n",       ship->lock              );
        fprintf( fp, "Speed        %d\n",       ship->speed             );
        fprintf( fp, "Launch1      %d\n",       ship->launch1           );
        fprintf( fp, "Launch2      %d\n",       ship->launch2           );
        fprintf( fp, "Firststop    %s~\n",      ship->first_stop        );
        fprintf( fp, "Secondstop   %s~\n",      ship->second_stop       );
        fprintf( fp, "Current_loc  %d\n",       ship->current_loc       );
        fprintf( fp, "Location     %d\n",       ship->location          );
        for (i=0; i < MAX_SHIP_ROOMS; i++)
        {
                if (ship->vnum[i] > 0)
                        fprintf( fp, "Vnum    %d\n", ship->vnum[i]);
        }

        fprintf( fp, "End\n\n"                                          );
        fprintf( fp, "#END\n"                                           );
    }
    fclose( fp );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}

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 );
}

/*
 * 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;

    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;
}

/*
 * 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;


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

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

        case 'C':
            KEY( "Current_loc", ship->current_loc,      fread_number( fp ) );
            break;

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

        case 'E':
            KEY( "Entrance",    ship->entrance,         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->owner2)
                  ship->owner2           = STRALLOC( "" );
                if (!ship->description)
                  ship->description     = STRALLOC( "" );
                if (ship->shipyard <= 0)
                  ship->shipyard = ROOM_LIMBO_SHIPYARD;
                if (ship->lastdoc <= 0)
                  ship->lastdoc = ship->shipyard;
                ship->in_room=NULL;
                ship->next_in_room=NULL;
                ship->prev_in_room=NULL;
                return;
            }
            break;

        case 'F':
            KEY( "Filename",    ship->filename,         fread_string_nohash( fp ) );
            KEY( "Firstroom",   ship->firstroom,        fread_number( fp ) );
            KEY( "Firststop",   ship->first_stop,       fread_string( fp ) );
            break;

        case 'H':
            KEY( "Home" , ship->home, fread_string( fp ) );
            break;

        case 'K':
            KEY( "Keyvnum" , ship->keyvnum, fread_number( fp ) );
            break;

        case 'L':
            KEY( "Lastdoc",    ship->lastdoc,       fread_number( fp ) );
            KEY( "Lastroom",   ship->lastroom,        fread_number( fp ) );
            KEY( "Launch1",   ship->launch1,        fread_number( fp ) );
            KEY( "Launch2",   ship->launch2,        fread_number( fp ) );
            KEY( "Location",   ship->location,      fread_number( fp ) );
            KEY( "Lock",   ship->lock,        fread_number( fp ) );
            break;

        case 'N':
            KEY( "Name",        ship->name,             fread_string( fp ) );
            break;

        case 'O':
            KEY( "Owner2",            ship->owner2,            fread_string( fp ) );
            KEY( "Owner",            ship->owner,            fread_string( fp ) );
/*            KEY( "Owner2",            ship->owner2,            fread_string( fp ) ); */
            break;

        case 'S':
            KEY( "Secondstop", ship->second_stop,   fread_string( fp ) );
            KEY( "Shipyard",    ship->shipyard,      fread_number( fp ) );
            KEY( "Shipstate",   ship->shipstate,        fread_number( fp ) );
            KEY( "Speed",   ship->speed,        fread_number( fp ) );
            break;

        case 'T':
            KEY( "Target",    ship->target,      fread_number( fp ) );
            KEY( "Temptarget", ship->temptarget, fread_number( fp ) );
            KEY( "Time",      ship->time,        fread_number( fp ) );
            KEY( "Timeleft",  ship->timeleft,    fread_number( fp ) );
            KEY( "Type",            ship->type,            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;
    DOCK_DATA *dock, *coordname;
    FILE *fp;
    bool found;
    ROOM_INDEX_DATA *pRoomIndex;
    int x, y, z, d, room;

    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, "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 );
           ship->shipyard = ship->shipyard;
           extract_ship( ship );
           ship_to_room( ship , ship->shipyard );
           ship->location = ship->shipyard;
           ship->current_loc = ship->shipyard;
           ship->shipstate = SHIP_DOCKED;
           ship->location = ship->location;
           get_curr_home ( ship );

           }

    return found;
}

void do_status(CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    int x;
    int y;
    int xx;
    int yy;

    if (  (ship = ship_from_entrance(ch->in_room->vnum))  == NULL )
    {
         send_to_pager_color("&RYou must be in the control room of an spaceship to do that!\n\r",ch);
         return;
    }

    x = ship->target - 3;
    y = ship->target + 4;
    xx = ship->location - 3;
    yy = ship->location + 4;

    pager_printf_color( ch, "&G-=[ %s BOARDCOMPUTER ]=-\n\r", capitalize(ship->name) );
    if ( ship->shipstate == SHIP_FLYING )
    pager_printf_color( ch, "&c- Current position:&C %s\n\r", ship->shipstate == SHIP_FLYING ? "In the air" : "Unknown" );
    else
    pager_printf_color( ch, "&c- Current position:&C %d . -%d . -%d\n\r", ship->location, xx, yy );
    pager_printf_color( ch, "&c- Target position :&C -%d . %d . -%d\n\r", ship->target, x, y );
    pager_printf_color( ch, "&c- Maximum speed   :&C 30 parasecs/minute\n\r" );
    pager_printf_color( ch, "&c- Flight time     :&C %d seconds estimated.\n\r", ship->timeleft );
    pager_printf_color( ch, "&c- Status          :&C %s\n\r",
                        ship->shipstate == SHIP_DOCKED ? "Docked" :
                        (ship->shipstate == SHIP_FLYING ? "Flying" : "Unknown" ) );
    pager_printf_color( ch, "&G-=[ End of Report ]=-\n\r" );

}


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_pager_color( "I see no exit here.\n\r" , ch );
        return;
    }

    if( ch->position < POS_STANDING && ch->position != POS_FIGHTING )
    {
      act( AT_PLAIN, "You can't do that in your current state.", ch, NULL, argument, TO_CHAR );
      return;
    }

    if( ship->shipstate == SHIP_FLYING )
    {
      act( AT_PLAIN, "Are you serious? You're in space idiot.", ch, NULL, argument, TO_CHAR );
      return;
    }

   if ( xIS_SET( ch->act, PLR_SPLIT_FORM ) )
   {
          act( AT_PLAIN, "You can't leave spaceships when you're split!", ch, NULL, argument, TO_CHAR );
          return;
   }

    if ( ( toroom = get_room_index( ship->location ) ) != NULL )
    {
            act( AT_WHITE, "$n leaves the spaceship.", ch,
                NULL, argument , TO_ROOM );
            act( AT_WHITE, "You leave the spaceship.", ch,
                NULL, argument , TO_CHAR );
            char_from_room( ch );
            char_to_room( ch , toroom );
            act( AT_WHITE, "$n walks out of the spaceship and closes the hatch behind him.", ch,
                NULL, argument , TO_ROOM );
            do_look( ch , "auto" );
     }
     else
        send_to_pager_color ( "The exit doesn't seem to be working properly.\n\r", ch );
}

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

     ship = get_ship( argument );
     if (ship == NULL)
     {
        send_to_pager_color("&RNo such ship!",ch);
        return;
     }

     resetship( ship );

} */

void do_unlockship( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    OBJ_DATA *obj;
    bool found;
    char arg[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH];

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

      found = FALSE;
      if (  (ship = ship_from_entrance(ch->in_room->vnum))  != NULL )
      {
        found = TRUE;
      }
      else if (  (ship = ship_from_location(ch->in_room->vnum))  != NULL )
      {
        found = TRUE;
      } 

      if ( !found )
      {
        send_to_char( "You can't find it.\n\r", ch );
        return;
      } */

      if ( ship->type != SHIP_SPACESHIP )
      {
           send_to_char("Shuttles cannot be unlocked\n\r",ch);
           return;
      }
      if (  (obj = has_key( ch, ship->keyvnum) ) == NULL )
      {
           send_to_char("You need the key for that ship to do that!\n\r",ch);
           return;
      }

      if ( ship->lock == SHIP_UNLOCKED )
      {
           send_to_char("Its already unlocked.\n\r",ch);
           return;
      }

      ship->lock = SHIP_UNLOCKED;
      ch_printf(ch, "You unlock your spaceship.\n\r");
      act(AT_WHITE, "$n unlocks $s spaceship.", ch, NULL, NULL, TO_CANSEE);
      return;
}


void do_lockship( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    OBJ_DATA *key;
    bool found;
    char arg[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH];

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

/*     ship = get_ship( arg ); */

/*    found = FALSE;
      if (  (ship = ship_from_entrance(ch->in_room->vnum))  != NULL )
      {
        found = TRUE;
      }

      if (  (ship = ship_from_location(ch->in_room->vnum))  != NULL )
      {
        found = TRUE;

      }

      if ( !found )
      {
        send_to_char( "You can't find it.\n\r", ch );
        return;
      } */

      if ( ship->type != SHIP_SPACESHIP )
      {
           send_to_char("Shuttles cannot be locked\n\r",ch);
           return;
      }

      if (  (key = has_key( ch, ship->keyvnum) ) == NULL )
      {
           send_to_char("You need the key for that ship to do that!\n\r",ch);
           return;
      }

      if ( ship->lock == SHIP_LOCKED )
      {
           send_to_char("Its already locked.\n\r",ch);
           return;
      }

      ship->lock = SHIP_LOCKED;
      ch_printf(ch, "You lock your spaceship.\n\r");
      act(AT_WHITE, "$n locks $s spaceship.", ch, NULL, NULL, TO_CANSEE);
      return;

}


void do_board( CHAR_DATA *ch, char *argument )
{
   ROOM_INDEX_DATA *fromroom;
   ROOM_INDEX_DATA *toroom;
   CHAR_DATA *inroom;
   CHAR_DATA *nextinroom;
   ROOM_INDEX_DATA *dock;
   SHIP_DATA *ship;
   sh_int chance;

   chance = number_range( 0, 3 );

   if ( !argument || argument[0] == '\0')
   {
       send_to_pager_color( "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 ( carrying_dball(ch) )
   {
          act( AT_PLAIN, "You can't go in there while carrying dragonballs!", ch, NULL, argument, TO_CHAR );
          return;
   }

   if ( xIS_SET( ch->act, ACT_MOUNTED ) )
   {
          act( AT_PLAIN, "You can't go in there riding THAT.", ch, NULL, argument, TO_CHAR );
          return;
   }

   if ( xIS_SET( ch->act, PLR_SPLIT_FORM ) )
   {
          act( AT_PLAIN, "You can't enter spaceships when you're split!", ch, NULL, argument, TO_CHAR );
          return;
   }

   if ( str_cmp( ship->owner, ch->name ) && ship->type == SHIP_SPACEPOD )
   {
          act( AT_PLAIN, "That's not your spacepod!", ch, NULL, argument, TO_CHAR );
          return;
   }

   if( ch->position < POS_STANDING )
   {
     act( AT_PLAIN, "Standing up first might be a smart idea.", ch, NULL, argument, TO_CHAR );
     return;
   }

   if ( ch->exp < 5000000 )
   {
          act( AT_PLAIN, "You aren't strong enough to enter spaceships yet.", ch, NULL, argument, TO_CHAR );
          return;
   }

   if ( ch->in_room->vnum == 200 && get_timer(ch, TIMER_RECENTFIGHT) > 22 )
   {
          act( AT_PLAIN, "Mabye you should finish your fight first?", ch, NULL, argument, TO_CHAR );
          return;
   }

         fromroom = ch->in_room;

        if ( ( toroom = get_room_index( ship->entrance ) ) != NULL )
        {
          if ( (chance == 0 || chance == 1 || chance == 2) && get_timer(ch, TIMER_RECENTFIGHT) > 0)
          {
            send_to_char( "&RIn your haste, you are unable to type in the correct code.\n\r", ch);
            WAIT_STATE(ch, 6);
            return;
        }

          if ( ship->lock == SHIP_LOCKED )
          {
            send_to_char( "You can't enter that ship it's locked!\n\r", ch);
            return;
        }
                
            act( AT_WHITE, "$n walks over to the $T and enters it.", ch,
                NULL, ship->name , TO_ROOM );
            act( AT_WHITE, "You walk over to the $T and enter it.", ch,
                NULL, ship->name , TO_CHAR );
            char_from_room( ch );
            char_to_room( ch , toroom );
            act( AT_WHITE, "$n enters the spaceship.", ch,
                NULL, argument , TO_ROOM );
            do_look( ch , "auto" );

          for ( inroom = fromroom->first_person; inroom; inroom = nextinroom )
          {
               nextinroom = inroom->next_in_room;
               if (inroom->position == POS_STANDING && inroom->leader == ch  && !inroom->fighting && inroom->exp > 5000000 && ship->type != SHIP_SPACEPOD )
               {
            act( AT_WHITE, "$n walks over to the $T and enters it.", inroom,
                NULL, ship->name , TO_ROOM );
            act( AT_WHITE, "You walk over to the $T and enter it.", inroom,
                NULL, ship->name , TO_CHAR );
            char_from_room( inroom );
            char_to_room( inroom , toroom );
            act( AT_WHITE, "$n enters the spaceship.", inroom,
                NULL, argument , TO_ROOM );
            do_look( inroom , "auto" );
               }
          }

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

SHIP_DATA *ship_from_location( int vnum )
{
    SHIP_DATA *ship;

    for ( ship = first_ship; ship; ship = ship->next )
       if ( vnum == ship->location )
         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;
}

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;
}

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;
}

SHIP_DATA *ship_from_cockpit( int vnum )
{
    SHIP_DATA *ship;

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

void do_land( SHIP_DATA *ship )
{
 ROOM_INDEX_DATA *room;
 int  parsec,  dist1, dist2, dist3, dist4, speed, remain;
 ROOM_INDEX_DATA *location;
 int vnum, level;
 char buf[MAX_INPUT_LENGTH];


  if (ship->shipstate == 0)
  return;

            location = get_room_index(ship->entrance);
            speed = ship->speed;


            dist1 = ship->x1 - ship->x2;
            dist2 = ship->y1 - ship->y2;
            dist3 = ship->z1 - ship->z2;
            dist4 = ship->d1 - ship->d2;
            parsec = convert_pos(dist1) + convert_pos(dist2)+ convert_pos(dist3) + convert_pos(dist4) + 20;

            parsec -= ship->speed;

            if (parsec <= 10 && parsec >= 1)
               echo_to_room(AT_YELLOW, location, "The spaceship rocks slightly as it speeds through space...");
            else if (parsec > 10)
               echo_to_room(AT_YELLOW, location, "The ship dodges past asteroids as it speeds to it's destination...");

            if ( parsec <= 0 )
            {
             room = get_room_index( ship->destination );
             location = get_room_index( ship->entrance );
             ship->shipstate = 0;
             ship->current_loc = ship->destination;
             if ( ( room = get_room_index( ship->destination ) ) == NULL )
             {
                sprintf( buf, "Something went wrong with %s\n\r", ship->name);
                bug( buf );
                return;
             }

             sprintf(buf, "&wYou hear a high pitched sound as a spaceship enters the atmosphere...\n\r\n\rWith a lot of noise %s approaches the platform to land on...\n\r\n\rThings calm down again as the spaceship turn off its engines...", ship->name);
             echo_to_room(AT_WHITE, room, buf );
             echo_to_room(AT_YELLOW, location, "&YThe spaceship reduces speed as it prepares for orbit...\n\rYou have reached your destination!\n\r\n\r&wYou enter the atmosphere and prepare for final descent...\n\r\n\rYou feel the spaceship trembling as it touches the landing platform...\n\r\n\rThe spaceship engines shut down as you stand still at your destination.");
             ship->x1 = ship->x2;
             ship->y1 = ship->y2;
             ship->z1 = ship->z2;
             ship->d1 = ship->d2;
          extract_ship( ship );
          ship->shipstate = SHIP_DOCKED;
          ship_to_room( ship, ship->current_loc );
          ship->location = ship->current_loc;

           }
           else
           {
            speed /= 3;
            /* x */
            if (ship->x1 != ship->x2 && (speed > 0 ))
            {
              if (ship->x1 > ship->x2 )
              {
                  remain = ship->x1 - ship->x2;
                  ship->x1 -= speed;
                  if ( ship->x1 < ship->x2 )
                  ship->x1 = ship->x2;
              }
              else
              {
                  remain = ship->x2 - ship->x1;
                  ship->x1 += speed;
                  if ( ship->x1 > ship->x2 )
                  ship->x1 = ship->x2;
              }
            }
            /* y */
            if (ship->y1 != ship->y2 && (speed > 0))
            {
              if (ship->y1 > ship->y2 )
              {
                  remain = ship->y1 - ship->y2;
                  ship->y1 -= speed;
                  if ( ship->y1 < ship->y2 )
                  ship->y1 = ship->y2;
              }
              else
              {
                  remain = ship->y2 - ship->y1;
                  ship->y1 += speed;
                  if ( ship->y1 > ship->y2 )
                  ship->y1 = ship->y2;
              }
            }
            /* z */
            if (ship->z1 != ship->z2 && (speed > 0))
            {
              if (ship->z1 > ship->z2 )
              {
                  remain = ship->z1 - ship->z2;
                  ship->z1 -= speed;
                  if ( ship->z1 < ship->z2 )
                  ship->z1 = ship->z2;
              }
              else
              {
                  remain = ship->z2 - ship->z1;
                  ship->z1 += speed;
                  if ( ship->z1 > ship->z2 )
                  ship->z1 = ship->z2;
              }
            }
            /* d */
            if (ship->d1 != ship->d2 && (speed > 0))
            {
              if (ship->d1 > ship->d2 )
              {
                  remain = ship->d1 - ship->d2;
                  ship->d1 -= speed;
                  if ( ship->d1 < ship->d2 )
                  ship->d1 = ship->d2;
              }
              else
              {
                  remain = ship->d2 - ship->d1;
                  ship->d1 += speed;
                  if ( ship->d1 > ship->d2 )
                  ship->d1 = ship->d2;
              }
            }

     }
  return;
}

/* void land_ships( )
{
   SHIP_DATA *ship;
   char buf[MAX_STRING_LENGTH];
   CHAR_DATA *ch;
    ROOM_INDEX_DATA *room;

 for ( ship = first_ship; ship; ship = ship->next )
  {

     if ( ship->shipstate == SHIP_FLYING && ship->type == SHIP_SPACESHIP )
      {
          extract_ship( ship );
          ship->location = ship->target;
          ship_to_room( ship , ship->target );
          sprintf( buf , "&wYou hear a high pitched sound as a spaceship enters the atmosphere..\n\r\n\rWith a lot of noise %s approaches the platform to land on...\n\r\n\rThings calm down again as the spaceship turn off its engines...&D", ship->name );
          echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
          echo_to_ship( AT_YELLOW , ship , "&YThe spaceship reduces speed as it prepares for orbit...\n\rYou have reached your destination!\n\r\n\r&wYou enter the atmosphere and prepare for final descent...\n\r\n\rYou feel the spaceship trembling as it touches the landing platform...\n\r\n\rThe spaceship engines shut down as you stand still at your destination.&D");
          ship->shipstate = SHIP_DOCKED;
          ship->timeleft = ship->time;
          ship->target = 0;
          return;
      }

     if ( ship->shipstate == SHIP_FLYING && ship->location == ship->target )
      {
          extract_ship( ship );
          ship->location = ship->shipyard;
          ship_to_room( ship , ship->shipyard );
          sprintf( buf , "&wYou hear a high pitched sound as a spaceship enters the atmosphere..\n\r\n\rWith a lot of noise %s approaches the platform to land on...\n\r\n\rThings calm down again as the spaceship turn off its engines...\n\r&D", ship->name );
          echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
          echo_to_ship( AT_YELLOW , ship , "&YThe spaceship reduces speed as it prepares for orbit...\n\rYou have reached your destination!\n\r\n\r&wYou enter the atmosphere and prepare for final descent...\n\r\n\rYou feel the spaceship trembling as it touches the landing platform...\n\r\n\rThe spaceship engines shut down as you stand still at your destination.&D");
          ship->shipstate = SHIP_DOCKED;
          ship->timeleft = ship->time;
          return;
      }

     if ( ship->shipstate == SHIP_FLYING )
      {
          extract_ship( ship );
          ship->location = ship->target;
          ship_to_room( ship , ship->target );
          sprintf( buf , "&wYou hear a high pitched sound as a spaceship enters the atmosphere..\n\r\n\rWith a lot of noise %s approaches the platform to land on...\n\r\n\rThings calm down again as the spaceship turn off its engines...&D", ship->name );
          echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
          echo_to_ship( AT_YELLOW , ship , "&YThe spaceship reduces speed as it prepares for orbit...\n\rYou have reached your destination!\n\r\n\r&wYou enter the atmosphere and prepare for final descent...\n\r\n\rYou feel the spaceship trembling as it touches the landing platform...\n\r\n\rThe spaceship engines shut down as you stand still at your destination.&D");
          ship->shipstate = SHIP_DOCKED;
          ship->timeleft = ship->time;
          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 );
     }

}

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;
}

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;
}

void do_monitor( CHAR_DATA *ch, char *argument )
{
    DOCK_DATA *dock;

    if ( !first_dock )
    {
        send_to_char( "There are no ships.\n\r", ch );
        return;
    }

    set_char_color( AT_NOTE, ch );
   send_to_pager( "\n\r&W+----------------------------+------------------+----------------------+\n\r", ch );
   send_to_pager( "&W|          &CLocation&W          |&G   X   Y   Z   ZZ&W |&C     Coord Name&W       |\n\r", ch );
   send_to_pager( "&W+----------------------------+------------------+----------------------+\n\r", ch );
    for ( dock = first_dock; dock; dock = dock->next )
    {
      if ( dock->onlyshuttle == TRUE )
        continue;

       ch_printf( ch, "&W|&c %-25s  &W| &c%3d %3d %3d %3d  &W| &c%-20s &W|\n\r",   dock->name, dock->x, dock->y,dock->z, dock->d, dock->coordname );

    }
   send_to_pager( "&W+----------------------------+------------------+----------------------+\n\r", ch );
    return;
}

void do_calculate( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    OBJ_DATA *obj;
    DOCK_DATA *dock;
    char arg[MAX_INPUT_LENGTH];
    argument = one_argument( argument, arg);
    int coord;
    coord = 0;
//    char coordname[MAX_INPUT_LENGTH]; 
    char const* coordname;

     coordname = "UNKNOWN";

      if ( arg[0] == '\0')
      {
       send_to_char("\n\rSyntax: Calculate <Name>\n\r", ch);
       return;
      }

    if (  (ship = ship_from_entrance(ch->in_room->vnum))  == NULL )
    {
         send_to_pager_color("&RYou must be in the control room of an spaceship to do that!\n\r",ch);
         return;
    }

      if ( ship->type != SHIP_SPACESHIP && ship->type != SHIP_SPACEPOD )
      {
       send_to_char("You can't change the coordinates of a shuttle!\n\r", ch);
       return;
      }

      if (  (obj = has_key( ch, ship->keyvnum)) == NULL && ship->type == SHIP_SPACESHIP)
      {
           send_to_char("&wYou need the controlkey for that ship to do that!\n\r",ch);
           return;
      }

/*         if ( !str_cmp( arg, "planet_vegeta" ) )
         {
            coord = 10201;
           coordname = "PLANET_VEGETA";
         }
         if ( !str_cmp( arg, "nexus" ) )
         {
            coord = 9001;
           coordname = "NEXUS";
         }
         if ( !str_cmp( arg, "hbtc" ) )
         {
            coord = 1100;
           coordname = "HBTC";
         }
         if ( !str_cmp( arg, "underworld" ) )
         {
            coord = 10601;
            coordname = "UNDERWORLD";
         }
         if ( !str_cmp( arg, "asteroid" ) )
         {
            coord = 200;
            coordname = "ASTEROID";
         }
         if ( !str_cmp( arg, "planet_namek" ) )
         {
            coord = 600;
            coordname = "PLANET_NAMEK";
         }
         if ( !str_cmp( arg, "planet_mutant" ) )
         {
            coord = 400;
            coordname = "PLANET_MUTANT";
         }
         if ( !str_cmp( arg, "planet_freezar" ) )
         {
            coord = 630;
            coordname = "PLANET_FREEZAR";
         }

         if ( !str_cmp( arg, "planet_earth" ) )
         {
            coord = 1700;
            coordname = "PLANET_EARTH";
         }
         if ( !str_cmp( arg, "planet_android" ) )
         {
            coord = 756;
            coordname = "PLANET_ANDROID";
         }
         if ( !str_cmp( arg, "md_hq" ) )

         {
            coord = 3201;
            coordname = "MD_HQ";
         }
         if ( !str_cmp( arg, "planet_ghetti" ) )

         {
            coord = 1212;
            coordname = "PLANET_GHETTI";
         }
         if ( !str_cmp( arg, "good_chikara" ) )

         {
            coord = 1600;
            coordname = "GOOD_CHIKARA";
         }
         if ( !str_cmp( arg, "evil_chikara" ) )

         {
            coord = 8800;
            coordname = "EVIL_CHIKARA";
         }
         if ( !str_cmp( arg, "planet_gerok" ) )

         {
            coord = 500;
            coordname = "PLANET_GEROK";
         }
         if ( !str_cmp( arg, "turks_hq" ) )

         {
            coord = 10100;
            coordname = "TURKS_HQ";
         }

         if ( !str_cmp( arg, "personal_dock" ) )

         {
            coord = 383;
            coordname = "PERSONAL_DOCK";
         }

             ch_printf(ch, "\n\r&z[&YBoard Computer&z] &WCoordinates set to -%d (%s)\n\r", coord, coordname );
             ship->target = coord;
             act(AT_GREY, "&w$n enters new target coordinates.", ch, NULL, NULL, TO_CANSEE);
             return; */

      for ( dock = first_dock; dock; dock = dock->next )
      {
         if ( !dock->coordname || dock->coordname[0] == '\0')
         continue;
         if ( dock->room <= 0 )
         {
            send_to_char( "You can't reach this coordinate.\n\r", ch);
            return;
         }
         if ( !str_cmp( dock->coordname, arg ) && dock->onlyshuttle == FALSE )
         {
             ch_printf(ch, "\n\r&z[&YBoard Computer&z] &WCoordinates set to %s\n\r", dock->name );
             ship->x2 = dock->x;
             ship->y2 = dock->y;
             ship->z2 = dock->z;
             ship->d2 = dock->d;
             ship->destination = dock->room;
             act(AT_GREY, "&w$n enters new target coordinates.", ch, NULL, NULL, TO_CANSEE);
             return;
         }
         continue;
     }
      send_to_char("\n\rInvalid Coordinate name.\n\r", ch);
      return;

}



void do_start( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    OBJ_DATA *obj, *key;


    if (  (ship = ship_from_entrance(ch->in_room->vnum))  == NULL )
    {
         send_to_pager_color("&RYou must be in the control room of an spaceship to do that!\n\r",ch);
         return;
    }

      if (  (obj = has_key( ch, ship->keyvnum )) == NULL && ship->type == SHIP_SPACESHIP )
      {
           send_to_char("&wYou need the controlkey for that ship to do that!\n\r",ch);
           return;
      }

      if (  ship->type != SHIP_SPACESHIP && ship->type != SHIP_SPACEPOD )
      {
           send_to_char("You can't start shuttles!\n\r",ch);
           return;
      }

      if ( ship->shipstate == SHIP_STARTED || ship->shipstate == SHIP_FLYING )
      {
           send_to_char("Its already powered up!\n\r",ch);
           return;
      }
      ship->shipstate = SHIP_STARTED;
      ch_printf(ch, "\n\rYou use your controlcard to active the ship's powersupply...\n\r\n\r");
      ch_printf(ch, "The monitors and controls switch glow up...the system is online.\n\r");
      act(AT_GREY, "$n use $s controlcard to active the ship's powersupply...\n\r", ch, NULL, NULL, TO_CANSEE);
      act(AT_GREY, "The monitors and controls switch glow up...the system is online.", ch, NULL, NULL, TO_CANSEE);
}

void do_launch( CHAR_DATA *ch, char *argument )
{
    SHIP_DATA *ship;
    DOCK_DATA *dock;
    char buf[MAX_INPUT_LENGTH];
    int location;

    if (  (ship = ship_from_entrance(ch->in_room->vnum))  == NULL )
    {
         send_to_pager_color("&RYou must be in the control room of an spaceship to do that!\n\r",ch);
         return;
    }

      if (ship->shipstate == SHIP_DOCKED )
      {
           send_to_char("&RThe system is offline.\n\r",ch);
           return;
      }

      if ( ship->x1 == ship->x2 && ship->y1 == ship->y2 && ship->z1 == ship->z2 && ship->d1 == ship->d2)
      {
           send_to_char("&RInput some coordinates!\n\r",ch);
           return;
      }

      if (ship->type != SHIP_SPACESHIP && ship->type != SHIP_SPACEPOD )
      {
           send_to_char("You can't launch shuttles!\n\r",ch);
           return;
      }

      location = ship->location;
      ship->location = ship->location;
      ch_printf(ch, "\n\rYou press the launch button to start your journey...\n\r\n\r");
      ch_printf(ch, "You feel the spaceship trembling and shaking as the engines power up...\n\r\n\r");
      ch_printf(ch, "You get firmly pressed into your chair as the spaceship blasts off into orbit!\n\r");
      act(AT_WHITE, "&w$n presses the launch button to start your journey...\n\r", ch, NULL, NULL, TO_CANSEE);
      act(AT_WHITE, "&wYou feel the spaceship trembling and shaking as the engines power up...\n\r", ch, NULL, NULL,TO_CANSEE);
      act(AT_WHITE, "&wYou get firmly pressed into your chair as the spaceship blasts off into orbit!", ch, NULL,NULL, TO_CANSEE);

      sprintf( buf , "&wYou hear space-engines hauling as they are being throttled up...\n\r\n\rSmoke and bright light surrounds %s as it rises\n\roff the ground slowly, turning around, preparing for lift-off...\n\r\n\rWith a loud explosion of power the spaceship blasts off into orbit!&D", ship->name );
      echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );

      extract_ship( ship );
      ship->shipstate = SHIP_FLYING;
      ship_to_room( ship , 8 );

}

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

    SHIP_DATA *ship;
   ROOM_INDEX_DATA *room;
  ROOM_INDEX_DATA *location;
  OBJ_DATA *key;
   char arg[MAX_INPUT_LENGTH];
   sh_int i = 0;
   ROOM_INDEX_DATA *addloc = NULL;
   AREA_DATA *pArea = NULL;
   EXIT_DATA *pexit, *rexit = NULL;
   char buf[MAX_STRING_LENGTH];


   location = ch->in_room;
   room = ch->in_room;

    if ( IS_NPC(ch))
        return;

        if (!argument || argument[0] == '\0')
        {
                send_to_char_color( "&C&CSyntax:\n\r", ch);
                send_to_char_color( "&C&G ship <argument>\n\r", ch);
                send_to_char_color( "&C&CArgument can be one of:\n\r", ch);
                send_to_char_color( "&C&G getkey &YFree\n\r&Gdesc&Y Free", ch);
                send_to_char_color( "&C&G\n\r", ch);
                return;
        }

   argument=one_argument( argument, arg);

   if ( !str_cmp( arg, "getkey"))
   {
           
         if (  (ship = ship_from_entrance(ch->in_room->vnum))  == NULL )
          {
         send_to_pager_color("&RYou must be in the control room of an spaceship to do that!\n\r",ch);
         return;
          }

       if ( str_cmp( ship->owner, ch->name ) && str_cmp( ship->owner2, ch->name ) )
          {
          act( AT_PLAIN, "You cannot get a key from this ship!", ch, NULL, argument, TO_CHAR );
          return;
          }

          key = create_object( get_obj_index( ship->keyvnum ), 0 );
          obj_to_char( key, ch );
          send_to_char( "You press a button on the console, a keycard is released, you grab it.\n\r", ch );
          return;
    
     }

   if ( !str_cmp( arg, "desc"))
    do_shipdesc( ch, "" );

/*   if ( !str_cmp( arg, "addroom"))
   {

        if ( argument[0] == '\0' )
           {
                   send_to_char_color( "&C&wship addroom <direction>\n\r", ch);
                   return;
           }

         if (  (ship = ship_from_entrance(ch->in_room->vnum))  == NULL )
          {
         send_to_pager_color("&RYou must be in the control room of an spaceship to do that!\n\r",ch);
         return;
          }


       if ( str_cmp( ship->owner, ch->name ) && str_cmp( ship->owner2, ch->name ) )
          {
          act( AT_PLAIN, "This is not your ship!", ch, NULL, argument, TO_CHAR );
          return;
          }

            if ( ch->gold < 5000000)
           {
                   send_to_char_color( "&C&wYou don't have enough to buy an additional room.\n\r", ch);
                   return;
           }

           for ( i=0; i < MAX_SHIP_ROOMS; i++)
           {
                   if ( ship->vnum[i] == 0)
                           break;
           }

           if (i == MAX_SHIP_ROOMS)
           {
                   send_to_char_color( "&C&wYou already have the maximum amount of rooms for a ship.\n\r", ch);
                   return;
           }

           if ( (get_exit( location, get_dir(argument))) != NULL)
           {
                   send_to_char_color( "&C&wThere's already a room in that direction.\n\r", ch);
                   return;
           }

     pArea = location->area;

    if (!pArea)
                return;


        for ( i = pArea->low_r_vnum; i < pArea->hi_r_vnum; i++)
        {
                if ( (get_room_index( i )) == NULL )
                {
                        if ( (addloc = make_room(i)) == NULL)
                                return;

                        break;
                }
        }

        if ( !addloc)
                return;

        if ( ( pexit = make_exit( location, addloc, get_dir(argument))) == NULL
                || (rexit = make_exit( addloc, location, rev_dir[get_dir(argument)] )) == NULL)
                return;

        pexit->keyword                = STRALLOC( "" );
    pexit->description            = STRALLOC( "" );
    pexit->key                    = -1;
    pexit->exit_info              = 0;
    rexit->keyword                = STRALLOC( "" );
    rexit->description            = STRALLOC( "" );
    rexit->key                    = -1;
    rexit->exit_info              = 0;
    pexit->rexit                  = rexit;
    rexit->rexit                  = pexit;

        for ( i=0; i < MAX_SHIP_ROOMS; i++)
        {
                if ( ship->vnum[i] == 0)
                {
                        ship->vnum[i] = addloc->vnum;
                        break;
                }
        }

    save_ship( ship );
        sprintf( buf, "%s\'s Additional Ship Room %d", capitalize(ship->name), i);
    STRFREE( addloc->name );
    addloc->name = STRALLOC( buf );
    STRFREE( addloc->description );
    addloc->description = STRALLOC( "This is your desc. You can edit this with SHIP DESC.\n\r");
    addloc->sector_type = 0;
     xSET_BIT( addloc->room_flags, ROOM_NO_SUMMON );
     xSET_BIT( addloc->room_flags, ROOM_INDOORS );
     xSET_BIT( addloc->room_flags, ROOM_SAFE );
        xREMOVE_BIT( addloc->room_flags, ROOM_PROTOTYPE);

        addloc->area = pArea;
      fold_area( addloc->area, addloc->area->filename, FALSE );
      ch->gold -= 5000000;
        return;
}   */



}


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

    SHIP_DATA *ship;
   ROOM_INDEX_DATA *room;
   ROOM_INDEX_DATA *location;

   location = ch->in_room;
   room = ch->in_room;


    switch( ch->substate )
    {
        default:
          break;
        case SUB_ROOM_DESC:
          location = ch->dest_buf;
          if ( !location )
          {
                bug( "redit: sub_room_desc: NULL ch->dest_buf", 0 );
                location = ch->in_room;
          }
          STRFREE( location->description );
          location->description = copy_buffer( ch );
          stop_editing( ch );
          ch->substate = ch->tempnum;
          fold_area( room->area, room->area->filename, FALSE );
          return;
   }


    if ( IS_NPC(ch))
        return;

         if (  (ship = ship_from_entrance(ch->in_room->vnum))  == NULL )
          {
         send_to_pager_color("&RYou must be in the control room of an spaceship to do that!\n\r",ch);
         return;
          }

       if ( str_cmp( ship->owner, ch->name ) && str_cmp( ship->owner2, ch->name ) )
          { 
          act( AT_PLAIN, "That's not your ship!", ch, NULL, argument, TO_CHAR );
          return;
          } 

/*           location = ch->in_room->vnum;

        ch->tempnum = SUB_NONE;
        ch->substate = SUB_ROOM_DESC;
        ch->dest_buf = location;
        start_editing( ch, location->description );
        return; */

        if ( ch->substate == SUB_REPEATCMD )
            ch->tempnum = SUB_REPEATCMD;
        else
            ch->tempnum = SUB_NONE;
        ch->substate = SUB_ROOM_DESC;
        ch->dest_buf = location;

        start_editing( ch, location->description );
        smash_tilde( location->description );
        fold_area( room->area, room->area->filename, FALSE );

        return;


}


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;
    DOCK_DATA *dock;
    int  tempnum;
    ROOM_INDEX_DATA *roomindex;

    if ( IS_NPC( ch ) )
    {
        send_to_pager_color( "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_pager_color( "Usage: setship <ship> <field> <values>\n\r", ch );
        send_to_pager_color( "\n\rField being one of:\n\r", ch );
        send_to_pager_color( "filename name owner owner2 desc\n\r", ch );
        send_to_pager_color( "firstroom lastroom shipyard type\n\r", ch );
        send_to_pager_color( "launch1 launch2 speed first_stop second_stop\n\r", ch );
        send_to_pager_color( "speed\n\r", ch );
        return;
    }

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

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

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

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

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

    if ( !str_cmp( arg2, "first_stop" ) )
    {
       if ( ( dock = get_dock( argument ) ) == NULL )
       {
          send_to_char("That dock doesn't exist.\n\r", ch );
          return;
       }
        ship->first_stop = STRALLOC( argument );
       ch_printf(ch,"\n\rSetting the Ship's First Stop to: %s", dock->coordname);
       send_to_char( "\n\rDone.\n\r", ch );
        save_ship( ship );
       return;
    }

    if ( !str_cmp( arg2, "second_stop" ) )
    {
       if ( ( dock = get_dock( argument ) ) == NULL )
       {
          send_to_char("That dock doesn't exist.\n\r", ch );
          return;
       }
        ship->second_stop = STRALLOC( argument );
       ch_printf(ch,"\n\rSetting the Ship's Second Stop to: %s", dock->coordname);
       send_to_char( "\n\rDone.\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_pager_color("That room doesn't exist.\n\r",ch);
           return;
        }
        ship->firstroom = tempnum;
        ship->lastroom = tempnum;
        ship->entrance = tempnum;
        send_to_pager_color( "You will now need to set the other rooms in the ship.\n\r", ch );
        save_ship( ship );
        return;
    }

    if ( !str_cmp( arg2, "speed" ) )
    {
        tempnum = atoi(argument);
 
        if ( tempnum < 0 || tempnum > 80 )
        {
            send_to_char( "Exceeding Speed Limits!\n\r", ch );
            return;
        }
        ship->speed = tempnum;
        ch_printf(ch, "Setting the Ship's Speed to: %d", tempnum);
        send_to_char( "\n\rDone.\n\r", ch );
        save_ship( ship );
        return;
    }

    if ( !str_cmp( arg2, "launch1" ) )
    {
        tempnum = atoi(argument);

        if ( tempnum < 0 || tempnum > 24 )
        {
            send_to_char( "Invalid number (1-24)!\n\r", ch );
            return;
        }
        ship->launch1 = tempnum;
        ch_printf(ch, "Setting the ships launch time to: %d", tempnum);
        send_to_char( "\n\rDone.\n\r", ch );
        save_ship( ship );
        return;
    }
    if ( !str_cmp( arg2, "launch2" ) )
    {
        tempnum = atoi(argument);

        if ( tempnum < 0 || tempnum > 24 )
        {
            send_to_char( "Invalid number (1-24)!\n\r", ch );
            return;
        }
        ship->launch2 = tempnum;
        ch_printf(ch, "Setting the ships launch2 time to: %d", tempnum);
        send_to_char( "\n\rDone.\n\r", ch );
        save_ship( ship );
        return;
    }


    if ( !str_cmp( arg2, "keyvnum" ) )
    {

        tempnum = atoi(argument);

        if ( tempnum < 0 || tempnum > 1000000000 )
        {
            send_to_char( "Invalid vnum number!\n\r", ch );
            return;
        }
        ship->keyvnum = tempnum;
        ch_printf(ch, "Setting the Ship's Key Vnum to: %d", tempnum);
        send_to_char( "\n\rDone.\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_pager_color("That room doesn't exist.\n\r",ch);
           return;
        }
        if ( tempnum < ship->firstroom || tempnum > ship->lastroom )
        {
           send_to_pager_color("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_pager_color( "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_pager_color("That room doesn't exist.",ch);
           return;
        }
        ship->shipyard = tempnum;
        send_to_pager_color( "Done.\n\r", ch );
        save_ship( ship );
        return;
    }
    if ( !str_cmp( arg2, "name" ) )
    {
        STRFREE( ship->name );
        ship->name = STRALLOC( argument );
        send_to_pager_color( "Done.\n\r", ch );
        save_ship( ship );
        return;
    }

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

    if ( !str_cmp( arg2, "type" ) )
    {

        if ( !str_cmp( argument, "spaceship" ) )
          ship->type = SHIP_SPACESHIP;
        else if ( !str_cmp( argument, "spacepod" ) )
          {
          ship->type = SHIP_SPACESHIP;
          ship->type = SHIP_SPACEPOD;
          }
        else
        {
           send_to_pager_color( "Ship type must be either: spaceship.\n\r", ch );
          ship->type = SHIP_SHUTTLE;
          save_ship( ship );
           return;
        }
        send_to_pager_color( "Done.\n\r", ch );
        save_ship( ship );
        return;
    }

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

    do_setship( ch, "" );
    return;
}

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

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

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

    ship = get_ship( argument );
    if ( !ship )
    {
        send_to_pager_color( "No such ship.\n\r", ch );
        return;
    }
    set_char_color( AT_YELLOW, ch );
      ch_printf( ch, "\n\r&RSpaceship Data&W:\n\r");
    pager_printf_color( ch, "&YDescription:&z %s\n\r",
                        ship->description );
    pager_printf_color( ch, "Firstroom: %d   Lastroom: %d\n\rEntrance: %d\n\r",
                        ship->firstroom,
                        ship->lastroom, ship->entrance );

    ch_printf( ch, "&YShipName: &W%s        &YFilename: &R%s\n\r", ship->name, ship->filename);
    ch_printf( ch, "&YKeyvnum:  &W%d\n\r", ship->keyvnum);
    ch_printf( ch, "&YSpeed:    &W%d\n\r", ship->speed);
    ch_printf( ch, "&YCurr_Loc: &W%d\n\r", ship->current_loc);
    ch_printf( ch, "&YLocation: &W%d\n\r", ship->location);
    ch_printf( ch, "&YShipyard: &G%d\n\r", ship->shipyard);
    ch_printf( ch, "&YDestination: &C%d\n\r", ship->destination);
    pager_printf_color( ch, "&YState:&O %s\n\r",
                        ship->shipstate == SHIP_DOCKED ? "SHUTDOWN" :
                        (ship->shipstate == SHIP_FLYING ? "IN ORBIT" : "STANDBY" ) );
    pager_printf_color( ch, "&YShip Type:&z %s\n\r",
                        ship->type == SHIP_SPACESHIP ? "SPACESHIP" : "SHUTTLE" );

      ch_printf( ch, "\n\r&RPersonal Ship Data&W:");
    pager_printf_color( ch, "\n\r&YOwner:&W %s\n\r&YCoOwner:&W %s\n\r",
                        ship->owner,
                        ship->owner2 );
    pager_printf_color( ch, "&YKeyVnum:&G %d\n\r",
                         ship->keyvnum );


      ch_printf( ch, "\n\r&RShuttle Data&W:");
      ch_printf( ch, "\n\r&YFirst_Stop :  &W%s\n\r", ship->first_stop );
      ch_printf( ch, "&YSecond_Stop:  &W%s\n\r", ship->second_stop );
      ch_printf( ch, "&YLaunch Times: &W%d&z/&W%d\n\r", ship->launch1, ship->launch2);


    return;
}

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

    if ( !first_ship )
    {
        send_to_char( "There are no ships.\n\r", ch );
        return;
    }

    set_char_color( AT_NOTE, ch );
    for ( ship = first_ship; ship; ship = ship->next )
    {
        ch_printf( ch, "Name:  %8s      Speed: %2d Entrance: %5d\n\r",
                ship->name,
                ship->speed,
                ship->entrance );
    }
    return;
}

/* void do_ships( CHAR_DATA *ch, char *argument )
{
    DOCK_DATA *dock;

    if ( !first_dock )
    {
        send_to_char( "There are no ships.\n\r", ch );
        return;
    }

    set_char_color( AT_NOTE, ch );
    for ( dock = first_dock; dock; dock = dock->next )
    {
      if ( dock->onlyshuttle == TRUE )
        continue;

        ch_printf( ch, "Name:  %8s\n\r",
                dock->name );
    }
    return;
} */