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


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


DOCK_DATA   *first_dock;
DOCK_DATA   *last_dock;


#if defined(KEY)
#undef KEY
#endif

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


DOCK_DATA *get_dock( char *name )
{
    DOCK_DATA *dock;
    
    if ( name[0] == '\0' )
       return NULL;

    if ( name == NULL )
       return NULL;
    
    for ( dock = first_dock; dock; dock = dock->next )
       if ( !str_cmp( name, dock->coordname ) )
         return dock;
    
    return NULL;
}

bool get_dockcoord( short x, short y, short z, short d )
{
    DOCK_DATA *dock;
    for ( dock = first_dock; dock; dock = dock->next )
    {
        if ( !dock->coordname || dock->coordname[0] == '\0')
        continue;
        if ( dock->x == x && dock->y == y && dock->z == z && dock->d == d )
        return TRUE;
    }
  return FALSE;
}


char *get_dockname( short x, short y, short z, short d )
{
    DOCK_DATA *dock;
    for ( dock = first_dock; dock; dock = dock->next )
    {
        if ( !dock->coordname || dock->coordname[0] == '\0')
        continue;
        if ( dock->x == x && dock->y == y && dock->z == z && dock->d == d )
	return dock->coordname;
    }
  return "unknown";
}

void  save_docks( void )
{
    DOCK_DATA *dock;
    FILE *fp;

    if ( (fp=fopen( DOCK_FILE, "w" )) == NULL )
    {
	bug( "Cannot open docks.dat for writting", 0 );
	perror( DOCK_FILE );
	return;
    }
    for ( dock = first_dock; dock; dock = dock->next )
    {
        if ( !dock->name || dock->name[0] == '\0')
        continue;
 	fprintf( fp, "#DOCK\n" );
	fprintf( fp, "Name         %s~\n",	dock->name	      );
	fprintf( fp, "Coordname    %s~\n",	dock->coordname       );
	fprintf( fp, "X            %d\n",	dock->x               );
	fprintf( fp, "Y            %d\n",	dock->y               );
	fprintf( fp, "Z            %d\n",	dock->z               );
        fprintf( fp, "D            %d\n",       dock->d               );
	fprintf( fp, "Room         %d\n",	dock->room            );
	fprintf( fp, "Onlyshuttle  %d\n",	dock->onlyshuttle     );
	fprintf( fp, "Type	   %d\n", 	dock->type	      );
	fprintf( fp, "End\n\n"					      );
    }
    fprintf( fp, "#END\n" );
    fclose( fp );
}

void fread_dock( DOCK_DATA *dock, FILE * fp )
{
   const 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 'N':
            KEY( "Name", dock->name, fread_string( fp ) );
            break;
         case 'C':
            KEY( "Coordname", dock->coordname, fread_string( fp ) );
            break;
         case 'E':
            if( !str_cmp( word, "End" ) )
            {
               return;
            }
            break;
         case 'O':
            KEY( "Onlyshuttle", dock->onlyshuttle,  	fread_number( fp ) );
            break;
         case 'R':
            KEY( "Room", dock->room,		 	fread_number( fp ) );
            break;
         case 'T':
            KEY( "Type", dock->type,			fread_number( fp ) );
            break;
         case 'X':
            KEY( "X", dock->x,				fread_number( fp ) );
            break;
         case 'Y':
            KEY( "Y", dock->y,				fread_number( fp ) );
            break;
         case 'Z':
            KEY( "Z", dock->z,				fread_number( fp ) );
            break;
         case 'D':
            KEY( "D", dock->d,				fread_number( fp ) );
            break;
      }

      if( !fMatch )
         bug( "Fread_dock: no match: %s", word );
   }
}


void load_docks( void )
{
   char filename[256];
   DOCK_DATA *dock;
   FILE *fp;

   first_dock = NULL;
   last_dock = NULL;

   snprintf( filename, 256, "%s", DOCK_FILE );

   if( ( fp = fopen( filename, "r" ) ) != NULL )
   {
     for( ;; )
      {
         char letter;
         char *word;

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

         if( letter != '#' )
         {
            bug( "%s", "Load_dock: # not found." );
            break;
         }

         word = fread_word( fp );
         if( !str_cmp( word, "DOCK" ) )
         {
            CREATE( dock, DOCK_DATA, 1 );
            fread_dock( dock, fp );
            LINK( dock, first_dock, last_dock, next, prev );
            continue;
         }
         else if( !str_cmp( word, "END" ) )
            break;
         else
         {
            bug( "Load_dock: bad section: %s.", word );
            continue;
         }
      }
      fclose( fp );
      fp = NULL;
   }
   return;
}

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

   if( !first_dock )
   {
      send_to_char( "No docks defined.\n\r", ch );
      return;
   }
   if ( argument[0] == '\0' )
   {
      send_to_char( "Dockstat which dock?.\n\r", ch );
      return;
   }

   if ( (dock = get_dock( argument )) == NULL )
   {
      send_to_char( "This dock doesn't exist.\n\r", ch);
      return;
   }
   send_to_char( "\n\r&z+---------------------------------------------------+", ch);
   send_to_char( "\n\r&z|                  &RDock Stats &z                      |", ch);
   send_to_char( "\n\r&z+---------------------------------------------------+\n\r", ch);
   ch_printf( ch,"\n\r&YName:    &W%s", dock->name );
   ch_printf( ch,"\n\r&YCName:   &W%s", dock->coordname );
   ch_printf( ch,"\n\r&YRoom:    &W%d", dock->room );
   ch_printf( ch,"\n\r&YCoords:  &W%d&z.&W%d&z.&W%d&z.&W%d", dock->x, dock->y, dock->z, dock->d );
   ch_printf( ch,"\n\r&YPrivate: &W%s\n\r", dock->onlyshuttle == TRUE ? "Yes" : "No" );
   send_to_char( "\n\r&z+---------------------------------------------------+", ch);

   return;

}

void do_setdock( CHAR_DATA * ch, char *argument )
{
   DOCK_DATA *dock = NULL;
   char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];

   if( IS_NPC( ch ) )
   {
      send_to_char( "Sorry, NPCs can't edit docks.\n\r", ch );
      return;
   }
   if( !ch->desc )
   {
      send_to_char( "You have no descriptor.\n\r", ch );
      return;
   }
   argument = one_argument( argument, arg1 );
   argument = one_argument( argument, arg2 );

   if( arg1[0] == '\0' || !str_cmp( arg1, "help" ) )
   {
      send_to_char( "\n\rUsage: setdock <coordname> <field> <value>\n\r", ch );
      send_to_char( "       setdock <coordname> create\n\r", ch );
      send_to_char( "       setdock <coordname> delete\n\r", ch );
      send_to_char( "       setdock <coordname> private\n\r", ch );
      send_to_char( "       setdock save\n\r", ch );
      send_to_char( "Field being one of:\n\r", ch );
      send_to_char( "   name, x, y, z, d, coordname, room, type\n\r", ch );
      return;
   }
   if ( !str_cmp( arg1, "save" ) )
   {
      save_docks();
      send_to_char( "Docks saved.\n\r", ch );
      return;
   }
   dock = get_dock( arg1 );
   if ( !str_cmp( arg2, "create" ) )
   {
     if ( dock )
     {
        send_to_char("This dock already exists.\n\r", ch );
        return;
     }
      CREATE( dock, DOCK_DATA, 1 );
      LINK( dock, first_dock, last_dock, next, prev );
      dock->coordname = STRALLOC( arg1 );
      dock->name = STRALLOC( arg1 );
      dock->x = dock->y = dock->z = dock->d = dock->room = -1;
      dock->onlyshuttle = FALSE;
      send_to_char( "Dock added.\n\r", ch );
      return;
   }
   if ( !dock )
   {
       send_to_char("This dock doesnt exist.\n\r", ch );
       return;
   }
   if ( !str_cmp( arg2, "delete" ) )
   {
     STRFREE( dock->name );
     STRFREE( dock->coordname  );
     UNLINK( dock, first_dock, last_dock, next, prev );
     DISPOSE( dock );
     send_to_char( "Dock deleted.\n\r", ch);
   }
   if ( !str_cmp( arg2, "private" ) )
   {
     if ( dock->onlyshuttle == TRUE )
     { 
       send_to_char( "This dock is now available for all ships.\n\r", ch);
       dock->onlyshuttle = FALSE;
     }
     else
     {
       send_to_char( "This dock is now only available for shuttles only.\n\r", ch);
       dock->onlyshuttle = TRUE;
     }
     return;
   }
   if ( argument[0] == '\0' )
   {
     do_setdock( ch, "" );
     return;
   }
   if ( !str_cmp( arg2, "name" ) )
   {
     STRFREE( dock->name );
     dock->name = STRALLOC( argument );
     ch_printf( ch, "Changing Dock's name to: %s", dock->name ); 
     return;
   }
   if ( !str_cmp( arg2, "coordname" ) )
   {
     STRFREE( dock->coordname );
     dock->coordname = STRALLOC( argument );
     ch_printf( ch, "Changing Dock's coordname to: %s", dock->coordname );
     return;
   }
   if ( !is_number(argument))
   {
     send_to_char("Value must be a number.\n\r", ch);
     return;
   }
   if ( !str_cmp( arg2, "x" ) )
   {
     dock->x = atoi(argument);
     ch_printf( ch, "Setting Dock's X Coordinate to: %d\n\r", dock->x );
     return;
   }
   if ( !str_cmp( arg2, "y" ) )
   {
     dock->y = atoi(argument);
     ch_printf( ch, "Setting Dock's Y Coordinate to: %d\n\r", dock->y );
     return;
   }
   if ( !str_cmp( arg2, "z" ) )
   {
     dock->z = atoi(argument);
     ch_printf( ch, "Setting Dock's Z Coordinate to: %d\n\r", dock->z );
     return;
   }
   if ( !str_cmp( arg2, "d" ) )
   {
     dock->d = atoi(argument);
     ch_printf( ch, "Setting Dock's D Coordinate to: %d\n\r", dock->d );
     return;
   }
   if ( !str_cmp( arg2, "room" ) )
   {
     dock->room = atoi(argument);
     ch_printf( ch, "Setting Dock's Room Coordinate to: %d\n\r", dock->room );
     return;
   }
   if ( !str_cmp( arg2, "type" ) )
   {
     dock->type = atoi( argument);
     ch_printf( ch, "Setting Dock's Type to: %d\n\r", dock->type );
     ch_printf( ch, "1 - Spaceport\n\r2 - Planet\n\r3 - HQ\n\r4 - Other\n\r", ch);
     return;
   }
   do_setdock( ch, "" );
   return;

}


void do_coordinates( CHAR_DATA *ch, char *argument )
{
   sh_int x;
   bool first;
   DOCK_DATA *dock;

   if( !first_dock )
   {
      send_to_char( "No docks defined.\n\r", ch );
      return;
   }
   send_to_pager( "\n\r&z+----------------------------+------------------+----------------------+\n\r", ch );
   send_to_pager( "&z|          &RLocation&z          |&G   X   Y   Z   D&z  |&R     Coord Name&z       |\n\r", ch );
   send_to_pager( "&z+----------------------------+------------------+----------------------+\n\r", ch );

   for ( x = 0; x <= DOCK_OTHER; x++ )
   {
     first = FALSE;
     for( dock = first_dock; dock; dock = dock->next )
     {
       if ( dock->onlyshuttle == TRUE )
       continue;

       if ( x == DOCK_SPACEPORT && first == FALSE )
       ch_printf( ch, "&z|&YSpaceport Docks&O:            &z|                  |                      |\n\r",ch);
       if ( x == DOCK_PLANET && first == FALSE )
       ch_printf( ch, "&z|&YPlanet Docks&O:               &z|                  |                      |\n\r", ch);
       if ( x == DOCK_HQ && first == FALSE )
       ch_printf( ch, "&z|&YHead Quarter Docks&O:         &z|                  |                      |\n\r", ch);
       if ( x == DOCK_OTHER && first == FALSE )
       ch_printf( ch, "&z|&YOther Docks&O:                &z|                  |                      |\n\r", ch);

       first = TRUE;
       if ( x == dock->type )
       ch_printf( ch, "&z|&W %-25s  &z| &W%3d %3d %3d %3d  &z| &W%-20s &z|\n\r",   dock->name, dock->x, dock->y, dock->z, dock->d, dock->coordname );
       if ( dock == last_dock )
       break;
    }
   }
   send_to_pager( "&z+----------------------------+------------------+----------------------+\n\r", ch );
   return;
}


void do_docks( CHAR_DATA *ch, char *argument )
{
   sh_int x;
   bool first;
   DOCK_DATA *dock;

   if( !first_dock )
   {
      send_to_char( "No docks defined.\n\r", ch );
      return;
   }
   send_to_pager( "\n\r&z+----------------------------+------------------+----------------------+------------+\n\r", ch );
   send_to_pager( "&z|          &RLocation&z          |&G   X   Y   Z   D&z  |&R     Coord Name&z       |    &WRoom&z    |\n\r", ch );
   send_to_pager( "&z+----------------------------+------------------+----------------------+------------+\n\r", ch );
   for ( x = 0; x <= DOCK_OTHER; x++ )
   {
     first = FALSE;
     for( dock = first_dock; dock; dock = dock->next )
     {
       if ( x == DOCK_SPACEPORT && first == FALSE )
       ch_printf( ch, "&z|&YSpaceport Docks&O:            &z|                  |                      |            |\n\r", ch);
       if ( x == DOCK_PLANET && first == FALSE )
       ch_printf( ch, "&z|&YPlanet Docks&O:               &z|                  |                      |            |\n\r", ch);
       if ( x == DOCK_HQ && first == FALSE )
       ch_printf( ch, "&z|&YHead Quarter Docks&O:         &z|                  |                      |            |\n\r", ch);
       if ( x == DOCK_OTHER && first == FALSE )
       ch_printf( ch, "&z|&YOther Docks&O:                &z|                  |                      |            |\n\r", ch);

       first = TRUE;
       if ( x == dock->type )
       ch_printf( ch, "&z|&W %-25s  &z| &W%3d %3d %3d %3d  &z| &W%-20s &z|  &W%6d&z    |\n\r",   dock->name, dock->x, dock->y, dock->z, dock->d, dock->coordname, dock->room );
       if ( dock == last_dock )
       break;
     }
   }
   send_to_pager( "&z+----------------------------+------------------+----------------------+------------+\n\r", ch );
   return;
}