ackfuss-4.4.1/
ackfuss-4.4.1/board/
ackfuss-4.4.1/help/k/
ackfuss-4.4.1/help/n/
ackfuss-4.4.1/help/s/
ackfuss-4.4.1/help/u/
ackfuss-4.4.1/help/v/
ackfuss-4.4.1/help/x/
ackfuss-4.4.1/help/y/
ackfuss-4.4.1/help/z/
ackfuss-4.4.1/src/areaconvert/
ackfuss-4.4.1/src/areaconvert/h/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *       _/          _/_/_/     _/    _/     _/    ACK! MUD is modified    *
 *      _/_/        _/          _/  _/       _/    Merc2.0/2.1/2.2 code    *
 *     _/  _/      _/           _/_/         _/    (c)Stephen Zepp 1998    *
 *    _/_/_/_/      _/          _/  _/             Version #: 4.3          *
 *   _/      _/      _/_/_/     _/    _/     _/                            *
 *                                                                         *
 *                        http://ackmud.nuc.net/                           *
 *                        zenithar@ackmud.nuc.net                          *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
/***************************************************************************
 * _/_/_/_/  _/    _/  _/_/_/_/ _/_/_/_/ AckFUSS is modified ACK!MUD 4.3.1 *
 * _/        _/    _/  _/       _/       copyright Matt Goff (Kline) 2008  *
 * _/_/      _/    _/  _/_/_/_/ _/_/_/_/                                   *
 * _/        _/    _/        _/       _/ Support for this code is provided *
 * _/        _/_/_/_/  _/_/_/_/ _/_/_/_/ at www.ackmud.net -- check it out!*
 ***************************************************************************/

#include "h/globals.h"

#ifndef DEC_COMM_H
#include "h/comm.h"
#endif

#ifndef DEC_DB_H
#include "h/db.h"
#endif

#ifndef DEC_HANDLER_H
#include "h/handler.h"
#endif

#ifndef DEC_SAVE_H
#include "h/save.h"
#endif

#ifndef DEC_SSM_H
#include "h/ssm.h"
#endif

/*
===========================================================================
This snippet was written by Erwin S. Andreasen, 4u2@aabc.dk. You may use
this code freely, as long as you retain my name in all of the files. You
also have to mail me telling that you are using it. I am giving this,
hopefully useful, piece of source code to you for free, and all I require
from you is some feedback.

Please mail me if you find any bugs or have any new ideas or just comments.

All my snippets are publically available at:

http://pip.dknet.dk/~pip1773/

If you do not have WWW access, try ftp'ing to pip.dknet.dk and examine
the /pub/pip1773 directory.
===========================================================================

  Various administrative utility commands.
  Version: 3 - Last update: January 1996.

  To use these 2 commands you will have to add a filename field to AREA_DATA.
  This value can be found easily in load_area while booting - the filename
  of the current area boot_db is reading from is in the strArea global.

  Since version 2 following was added:

  A rename command which renames a player. Search for do_rename to see
  more info on it.

  Fixes since last release: None.
*/

/* To have VLIST show more than vnum 0 - 9900, change the number below: */

#define MAX_SHOW_VNUM   326   /* show only 1 - 100*100 */

#define NUL '\0'

/* opposite directions */
const short opposite_dir[6] = { DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_DOWN, DIR_UP };


/* get the 'short' name of an area (e.g. MIDGAARD, MIRROR etc. */
/* assumes that the filename saved in the AREA_DATA struct is something like midgaard.are */
char *area_name( AREA_DATA * pArea )
{
   static char buffer[64]; /* short filename */
   char *period;

   assert( pArea != NULL );

   strncpy( buffer, pArea->filename, 64 );   /* copy the filename */
   period = strchr( buffer, '.' );  /* find the period (midgaard.are) */
   if( period )   /* if there was one */
      *period = '\0';   /* terminate the string there (midgaard) */

   return buffer;
}

/* depending on status print > or < or <> between the 2 rooms */
void room_pair( ROOM_INDEX_DATA * left, ROOM_INDEX_DATA * right, exit_status ex, char *buffer )
{
   char *sExit;

   switch ( ex )
   {
      default:
         sExit = "??";
         break;   /* invalid usage */
      case exit_from:
         sExit = "< ";
         break;
      case exit_to:
         sExit = " >";
         break;
      case exit_both:
         sExit = "<>";
         break;
   }

   snprintf( buffer, sizeof(buffer), "%5d %-26.26s %s%5d %-26.26s(%-8.8s)\r\n",
            left->vnum, left->name, sExit, right->vnum, right->name, area_name( right->area ) );
}

/* for every exit in 'room' which leads to or from pArea but NOT both, print it */
void checkexits( ROOM_INDEX_DATA * room, AREA_DATA * pArea, char *buffer )
{
   char buf[MAX_STRING_LENGTH];
   int i;
   EXIT_DATA *exit;
   ROOM_INDEX_DATA *to_room;

   strcpy( buffer, "" );
   for( i = 0; i < 6; i++ )
   {
      exit = room->exit[i];
      if( !exit )
         continue;
      else
         to_room = exit->to_room;

      if( to_room )  /* there is something on the other side */
      {
         if( ( room->area == pArea ) && ( to_room->area != pArea ) )
         {  /* an exit from our area to another area */
            /*
             * check first if it is a two-way exit
             */

            if( to_room->exit[opposite_dir[i]] && to_room->exit[opposite_dir[i]]->to_room == room )
               room_pair( room, to_room, exit_both, buf );  /* <> */
            else
               room_pair( room, to_room, exit_to, buf ); /* > */

            strncat( buffer, buf, MSL );
         }
         else if( ( room->area != pArea ) && ( exit->to_room->area == pArea ) )
         {  /* an exit from another area to our area */

            if( !( to_room->exit[opposite_dir[i]] && to_room->exit[opposite_dir[i]]->to_room == room ) )
               /*
                * two-way exits are handled in the other if
                */
            {
               room_pair( to_room, room, exit_from, buf );
               strncat( buffer, buf, MSL );
            }

         }  /* if room->area */
      }

   }  /* for */

}

/* for now, no arguments, just list the current area */
DO_FUN(do_exlist)
{
   AREA_DATA *pArea;
   ROOM_INDEX_DATA *room;
   int i;
   char buffer[MAX_STRING_LENGTH];

   pArea = ch->in_room->area; /* this is the area we want info on */
   for( i = 0; i < MAX_KEY_HASH; i++ ) /* room index hash table */
      for( room = room_index_hash[i]; room != NULL; room = room->next )
         /*
          * run through all the rooms on the MUD
          */

      {
         checkexits( room, pArea, buffer );
         send_to_char( buffer, ch );
      }
}

/* show a list of all used VNUMS */

#define COLUMNS 		5  /* number of columns */
#define MAX_ROW 		((MAX_SHOW_VNUM / COLUMNS)+1) /* rows */

DO_FUN(do_vlist)
{
   int i, j, vnum;
   ROOM_INDEX_DATA *room;
   char buffer[MAX_ROW * 100];   /* should be plenty */
   char buf2[100];

   for( i = 0; i < MAX_ROW; i++ )
   {
      strcpy( buffer, "" );   /* clear the buffer for this row */

      for( j = 0; j < COLUMNS; j++ )   /* for each column */
      {
         vnum = ( ( j * MAX_ROW ) + i );  /* find a vnum whih should be there */
         if( vnum < MAX_SHOW_VNUM )
         {
            room = get_room_index( vnum * 100 + 1 );  /* each zone has to have a XXX01 room */
            snprintf( buf2, 100, "%3d %-8.8s  ", vnum, room ? area_name( room->area ) : "-" );
            /*
             * something there or unused ?
             */
            strncat( buffer, buf2, (MAX_ROW * 100)-1 );
         }
      }  /* for columns */

      send_to_char( buffer, ch );
      send_to_char( "\r\n", ch );
   }  /* for rows */
}

/*
 * do_rename renames a player to another name.
 * PCs only. Previous file is deleted, if it exists.
 * Char is then saved to new file.
 * New name is checked against std. checks, existing offline players and
 * online players.
 * .gz files are checked for too, just in case.
 */

DO_FUN(do_rename)
{
   char old_name[MAX_INPUT_LENGTH], new_name[MAX_INPUT_LENGTH], strsave[MAX_INPUT_LENGTH];

   CHAR_DATA *victim;
   FILE *file;

   argument = one_argument( argument, old_name );  /* find new/old name */
   one_argument( argument, new_name );

   /*
    * Trivial checks
    */
   if( !old_name[0] )
   {
      send_to_char( "Rename who?\r\n", ch );
      return;
   }

   victim = get_char_world( ch, old_name );

   if( !victim )
   {
      send_to_char( "There is no such a person online.\r\n", ch );
      return;
   }

   if( IS_NPC( victim ) )
   {
      send_to_char( "You cannot use Rename on NPCs.\r\n", ch );
      return;
   }

   /*
    * allow rename self new_name,but otherwise only lower level
    */
   if( ( victim != ch ) && ( get_trust( victim ) >= get_trust( ch ) ) )
   {
      send_to_char( "You failed.\r\n", ch );
      return;
   }

   if( !victim->desc || ( victim->desc->connected != CON_PLAYING ) )
   {
      send_to_char( "This player has lost his link or is inside a pager or the like.\r\n", ch );
      return;
   }

   if( !new_name[0] )
   {
      send_to_char( "Rename to what new name?\r\n", ch );
      return;
   }

   /*
    * Insert check for clan here!!
    */
   /*
    *
    * if (victim->clan)
    * {
    * send_to_char ("This player is member of a clan, remove him from there first.\r\n",ch);
    * return;
    * }
    */

   if( !check_parse_name( new_name ) )
   {
      send_to_char( "The new name is illegal.\r\n", ch );
      return;
   }

   /*
    * First, check if there is a player named that off-line
    */
#if !defined(machintosh) && !defined(MSDOS)
   snprintf( strsave, MIL, "%s%s%s%s", PLAYER_DIR, initial( new_name ), "/", capitalize( new_name ) );
#else
   snprintf( strsave, MIL, "%s%s", PLAYER_DIR, capitalize( new_name ) );
#endif

   file = file_open( strsave, "r" ); /* attempt to to open pfile */
   if( file )
   {
      send_to_char( "A player with that name already exists!\r\n", ch );
      file_close( file );
      return;
   }
   file_close( file );

   /*
    * Check .gz file !
    */
#if !defined(machintosh) && !defined(MSDOS)
   snprintf( strsave, MIL, "%s%s%s%s.gz", PLAYER_DIR, initial( new_name ), "/", capitalize( new_name ) );
#else
   snprintf( strsave, MIL, "%s%s.gz", PLAYER_DIR, capitalize( new_name ) );
#endif

   file = file_open( strsave, "r" ); /* attempt to to open pfile */
   if( file )
   {
      send_to_char( "A player with that name already exists in a compressed file!\r\n", ch );
      file_close( file );
      return;
   }
   file_close( file );

   if( get_char_world( ch, new_name ) )   /* check for playing level-1 non-saved */
   {
      send_to_char( "A player with the name you specified already exists!\r\n", ch );
      return;
   }

   /*
    * Save the filename of the old name
    */

#if !defined(machintosh) && !defined(MSDOS)
   snprintf( strsave, MIL, "%s%s%s%s", PLAYER_DIR, initial( victim->name.c_str() ), "/", capitalize( victim->name.c_str() ) );
#else
   snprintf( strsave, MIL, "%s%s", PLAYER_DIR, capitalize( victim->name.c_str() ) );
#endif


   /*
    * Rename the character and save him to a new file
    */
   /*
    * NOTE: Players who are level 1 do NOT get saved under a new name
    */

   victim->name = capitalize( new_name );

   save_char_obj( victim );

   /*
    * unlink the old file
    */
   unlink( strsave );   /* unlink does return a value.. but we do not care */

   /*
    * That's it!
    */

   send_to_char( "Character renamed.\r\n", ch );

   victim->position = POS_STANDING; /* I am laaazy */
   act( "$n has renamed you to $N!", ch, NULL, victim, TO_VICT );

}  /* do_rename */