player/a/
player/b/
player/c/
player/d/
player/e/
player/f/
player/g/
player/i/
player/j/
player/k/
player/m/
player/n/
player/r/
player/s/
player/v/
player/w/
player/x/
player/z/
player_fst/e/
player_fst/f/
player_fst/h/
player_fst/i/
player_fst/j/
player_fst/n/
player_fst/o/
player_fst/p/
player_fst/player/a/
player_fst/player/b/
player_fst/player/c/
player_fst/player/d/
player_fst/player/e/
player_fst/player/f/
player_fst/player/g/
player_fst/player/j/
player_fst/player/k/
player_fst/player/m/
player_fst/player/n/
player_fst/player/r/
player_fst/player/s/
player_fst/player/v/
player_fst/player/w/
player_fst/player/x/
player_fst/player/z/
player_fst/u/
player_fst/v/
player_fst/w/
player_fst/x/
/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 ~  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              ~
 ~  ACK!MUD is modified Merc2.0/2.1/2.2 code (c)Stephen Zepp 1998 Ver: 4.3 ~
 ~                                                                         ~
 ~  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', and the Ack!Mud license in 'ack_license.txt'.~
 ~  In particular, you may not remove any of these copyright notices.      ~
 ~                                                                         ~
 ~           _______      _____                                            ~
 ~          /  __  /\    / ___ \       222222        PA_MUD by Amnon Kruvi ~
 ~         /______/ /   / /___\ \            2       PA_MUD is modified    ~
 ~        / _______/   / _______ \           2       Ack!Mud, v4.3         ~
 ~       /_/          /_/       \_\        2                               ~
 ~                                      2                                  ~
 ~                                     2222222                             ~
 ~                                                                         ~
 ~                                                                         ~
 ~   Years of work have been invested to create DIKU, Merc, Ack and PA.    ~
 ~   Please show your respect by following the licenses, and issuing       ~
 ~   credits where due.                                                    ~
 ~                                                                         ~
 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
/* For forks etc. */
#include <unistd.h>
#include <fcntl.h>

#include "ack.h"
#include "tables.h"

#ifndef DEC_EMAIL_H
#include "email.h"
#endif

void  purge_room   args( ( CHAR_DATA *, ROOM_INDEX_DATA * ) );

void do_wizhelp( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    int cmd, imm_level;
    int col = 0;
    bool creturn = TRUE;
     
    buf1[0] = '\0';
    
    for ( imm_level = LEVEL_HERO; imm_level <= get_trust( ch ); imm_level++ )
    {
    	if (!creturn)
	{
		strcat( buf1, "\n\r" );
	}
	sprintf( buf, "\n\r@@aLevel @@y%d @@aCommands@@d:@@N\n\r", imm_level);
	strcat( buf1, buf);
    for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
    {	
	if (cmd_table[cmd].level != imm_level)
	    continue;
	if ( cmd_table[cmd].show == C_SHOW_NEVER )
		continue;
	
	creturn = FALSE;
	sprintf( buf, "%-12s", cmd_table[cmd].name);
	strcat( buf1, buf );
	if ( ++col % 6 == 0 )
	{
		strcat( buf1, "\n\r" );
		creturn = TRUE;
		col = 0;
	}	
    } /* For command */
	col = 0;
    } /* For imm_level */

    safe_strcat( MSL, buf1, "\n\r" );
    send_to_char( buf1, ch );
    return;
}

void do_bamfin( CHAR_DATA *ch, char *argument )
{
    if ( !IS_NPC(ch) )
    {
	smash_tilde( argument );
	free_string( ch->pcdata->bamfin );
	ch->pcdata->bamfin = str_dup( argument );
	send_to_char( "Ok.\n\r", ch );
    }
    return;
}



void do_bamfout( CHAR_DATA *ch, char *argument )
{
    if ( !IS_NPC(ch) )
    {
	smash_tilde( argument );
	free_string( ch->pcdata->bamfout );
	ch->pcdata->bamfout = str_dup( argument );
	send_to_char( "Ok.\n\r", ch );
    }
    return;
}



void do_deny( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    char buf[MSL];
    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
        send_to_char( "Deny whom?\n\r", ch );
        return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
      {
        char    buf[MSL];
        sprintf( buf, "%s is not online.\n\r", capitalize( arg ) );
        send_to_char( buf, ch );
        return;
      }

    }

    if ( IS_NPC(victim) )
    {
        send_to_char( "Not on NPC's.\n\r", ch );
        return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
        send_to_char( "You failed.\n\r", ch );
        return;
    }
    if ( IS_SET( victim->act, PLR_DENY ) )
    {
      REMOVE_BIT( victim->act, PLR_DENY );
    }
    else
    {
      SET_BIT(victim->act, PLR_DENY);
      send_to_char( "You are denied access!\n\r", victim );
    }
    send_to_char( "OK.\n\r", ch );
    sprintf( buf, "%ld", current_time );
    do_quit( victim, buf );

    return;
}

void do_disconnect( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    DESCRIPTOR_DATA *d;
    CHAR_DATA *victim;

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char( "Disconnect whom?\n\r", ch );
	return;
    }

	/* Added for disconnection of descriptor numbers - Wyn */
    if (is_number(arg))
    {
	int desc;

	if (get_trust(ch) < 84)
	{
	    return;
	}

	desc = atoi(arg);
    	for ( d = first_desc; d != NULL; d = d->next )
    	{
            if ( d->descriptor == desc )
            {
            	close_socket( d );
            	send_to_char( "Ok.\n\r", ch );
            	return;
            }
	}
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL
    || (get_trust(victim) > get_trust(ch) && get_trust(victim) == MAX_LEVEL))
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( victim->desc == NULL )
    {
	act( "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
	return;
    }

    for ( d = first_desc; d != NULL; d = d->next )
    {
	if ( d == victim->desc )
	{
	    close_socket( d );
	    send_to_char( "Ok.\n\r", ch );
	    return;
	}
    }

    bug( "Do_disconnect: desc not found.", 0 );
    send_to_char( "Descriptor not found!\n\r", ch );
    return;
}

void do_echo( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d;
    
    if ( argument[0] == '\0' )
    {
	send_to_char( "Echo what?\n\r", ch );
	return;
    }

    for ( d = first_desc; d; d = d->next )
    {
	if ( d->connected == CON_PLAYING )
	{
	    send_to_char( argument, d->character );
	    send_to_char( "@@g\n\r",   d->character );
	}
    }

    return;
}

void do_recho( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d;
    
    if ( argument[0] == '\0' )
    {
	send_to_char( "Recho what?\n\r", ch );
	return;
    }

    for ( d = first_desc; d; d = d->next )
    {
	if ( d->connected == CON_PLAYING
	&&   d->character->in_room == ch->in_room && !NOT_IN_ROOM(ch,d->character) )
	{
	    send_to_char( argument, d->character );
	    send_to_char( "@@g\n\r",   d->character );
	}
    }

    return;
}



ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg )
{
    CHAR_DATA *victim;
    OBJ_DATA *obj;
    VEHICLE_DATA *vhc;	

    if ( is_number(arg) )
	return get_room_index( atoi( arg ) );

    if ( ( victim = get_char_world( ch, arg ) ) != NULL )
	return victim->in_room;

    if ( ( obj = get_obj_world( ch, arg ) ) != NULL )
	return obj->in_room;

    if ( ( vhc = get_vehicle_world( arg ) ) != NULL )
	return get_room_index(ROOM_VNUM_WMAP);
    return NULL;
}



void do_transfer( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    int x,y;
    int z = 1;
    ROOM_INDEX_DATA *location;
    DESCRIPTOR_DATA *d;
    CHAR_DATA *victim;
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' )
    {
        send_to_char( "Transfer whom (and where)?\n\r", ch );
        return;
    }

    if ( !str_cmp( arg1, "all" ) )
    {
        for ( d = first_desc; d != NULL; d = d->next )
        {
            if ( d->connected == CON_PLAYING
            && !IS_IMMORTAL( d->character )
            &&   d->character != ch
            &&   d->character->in_room != NULL
            &&   can_see( ch, d->character ) )
            {
                    char buf[MAX_STRING_LENGTH];
                    sprintf( buf, "%s %s", d->character->name, arg2 );
                    do_transfer( ch, buf );
            }
        }
        return;
    }

    /*
     * Thanks to Grodyn for the optional location parameter.
     */
    location = ch->in_room;
    if ( arg2[0] == '\0' )
    {
	x = ch->x;
	y = ch->y;
	z = ch->z;
    }
    else
    {
	x = atoi(arg2);
	y = atoi(argument);
    }

    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {

      {
        char    buf[MSL];
          sprintf( buf, "%s is not online.\n\r", capitalize( arg1 ) );
        send_to_char( buf, ch );
        return;
      }

    }
    if ( victim->in_room == NULL )
    {
        send_to_char( "They are in limbo.\n\r", ch );
        return;
    }

    act( "$n is snatched by the Gods!", victim, NULL, NULL, TO_ROOM );
    char_from_room( victim );
    char_to_room( victim, location );
    move ( victim, x, y, z );
    victim->c_sn = -1;
    act( "$n arrives from a puff of smoke.", victim, NULL, NULL, TO_ROOM );
    if ( ch != victim )
        act( "$n has transferred you.", ch, NULL, victim, TO_VICT );
    do_look( victim, "auto" );
    send_to_char( "Ok.\n\r", ch );
}

void do_at( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    CHAR_DATA *wch;
    OBJ_DATA *obj;
    int x = ch->x;
    int y = ch->y;
    int z = ch->z;
    VEHICLE_DATA *vhc;
    arg2[0] = '\0';

    argument = one_argument( argument, arg );
    if ( is_number(arg) )
    	argument = one_argument( argument, arg2 );

    if ( arg[0] == '\0' || ( is_number(arg2) && arg2[0] == '\0' ) || argument[0] == '\0' )
    {
	send_to_char( "At where what?\n\r", ch );
	return;
    }
    if ( get_trust(ch) <= 83 )
    	SET_BIT(ch->pcdata->pflags,PFLAG_HELPING);

    if ( ( wch = get_char_world( ch, arg ) ) != NULL && ( !is_number(arg2) || arg2[0] == '\0' ))
    {
	move( ch, wch->x, wch->y, wch->z );
    }
    else if ( ( obj = get_obj_world( ch, arg ) ) != NULL && ( !is_number(arg2) || arg2[0] == '\0' ) )
    {
	move( ch, obj->x, obj->y, obj->z );
    }
    else if ( ( vhc = get_vehicle_world( arg ) ) != NULL && ( !is_number(arg2) || arg2[0] == '\0' ) )
    {
	move( ch, vhc->x, vhc->y, vhc->z );
    }
    else if ( is_number(arg) && is_number(arg2) )
    {
	if ( atoi(arg) <= 0 || atoi(arg) >= MAX_MAPS || atoi(arg2) <= 0 || atoi(arg2) >= MAX_MAPS )
	{
		send_to_char( "Invalid coordinates.\n\r", ch );
		return;
	}
	move ( ch, atoi(arg), atoi(arg2), ch->z );
    }
    else
    {
	send_to_char( "No such location.\n\r", ch);
    	if ( get_trust(ch) <= 83 )
		REMOVE_BIT(ch->pcdata->pflags,PFLAG_HELPING);
	return;
    }
    interpret( ch, argument );

    /*
     * See if 'ch' still exists before continuing!
     * Handles 'at XXXX quit' case.
     */
    for ( wch = first_char; wch != NULL; wch = wch->next )
    {
	if ( wch == ch )
	{
	    move ( ch, x, y, z );
	    break;
	}
    }

    if ( get_trust(ch) <= 83 )
    	REMOVE_BIT(ch->pcdata->pflags,PFLAG_HELPING);
    return;
}



void do_goto( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *rch;
    OBJ_DATA *obj;
    VEHICLE_DATA *vhc;
    int x,y;
    bool guide = IS_GUIDE(ch);

    if ( get_trust(ch) < LEVEL_GUIDE )
    {
	send_to_char( "You are not an immortal.\n\r", ch );
	return;
    }
    argument = one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char( "Goto where?\n\r", ch );
	return;
    }

    if ( guide )
    {
	if ( ch->fighttimer > 0 )
	{
		send_to_char( "Finish combat, first.\n\r", ch );
		return;
	}
	if ( IS_SET(ch->pcdata->pflags,PFLAG_HELPING) )
	{
		do_home(ch,ch->name);
		REMOVE_BIT(ch->pcdata->pflags,PFLAG_HELPING);
		return;
	}
    	if ( ( rch = get_char_world( ch, arg ) ) != NULL )
    	{
		if ( get_rank(rch) > 5 )
		{
			send_to_char( "You may only goto players of rank 5 and below.\n\r", ch );
			return;
		}
		if (  rch->z == Z_PAINTBALL || IN_PIT(rch) )
		{
			send_to_char( "You can't go to that player's location right now.\n\r", ch );
			return;
		}
		act( "$L$n $T.", ch, NULL,
		    (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
		    ? ch->pcdata->bamfout : "leaves in a swirling mist",  TO_ROOM );
		move ( ch, rch->x, rch->y, rch->z );
		SET_BIT(ch->pcdata->pflags,PFLAG_HELPING);
    	}
    }

    if ( is_number(argument))
    {
    	if ( is_number(argument) && is_number(arg) )
	{
		x = atoi(arg);
		y = atoi(argument);
		if ( x < 0 || x >= MAX_MAPS  || y < 0 || y >= MAX_MAPS )
		{
			send_to_char( "Invalid coordinates.\n\r", ch );
			return;
		}
	    {
		act( "$L$n $T.", ch, NULL,
		    (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
		    ? ch->pcdata->bamfout : "leaves in a swirling mist",  TO_ROOM );
	    }
		move(ch,x,y,ch->z);
	    {
		act( "$L$n $T.", ch, NULL,
		    (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
		    ? ch->pcdata->bamfin : "appears in a swirling mist", TO_ROOM );
	    }

	    do_look( ch, "auto" );
	    return;
	}
	send_to_char( "No such location.\n\r", ch );
	return;
    }
    else if ( ( rch = get_char_world( ch, arg ) ) != NULL )
    {
		act( "$L$n $T.", ch, NULL,
		    (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
		    ? ch->pcdata->bamfout : "leaves in a swirling mist",  TO_ROOM );
	move ( ch, rch->x, rch->y, rch->z );
    }
    else if ( ( vhc = get_vehicle_world(arg) ) != NULL )
    {
		act( "$L$n $T.", ch, NULL,
		    (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
		    ? ch->pcdata->bamfout : "leaves in a swirling mist",  TO_ROOM );
	move ( ch, vhc->x, vhc->y, vhc->z );
    }
    else
    {
	int i;
	for ( i=0;planet_table[i].name != NULL;i++ )
	{
		if ( !str_cmp(planet_table[i].name,arg) )
		{
			act( "$L$n $T.", ch, NULL,
			    (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
			    ? ch->pcdata->bamfout : "leaves in a swirling mist",  TO_ROOM );
			move ( ch, ch->x, ch->y, planet_table[i].z );
			act( "$L$n $T.", ch, NULL,
			    (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
			    ? ch->pcdata->bamfin : "appears in a swirling mist", TO_ROOM );

		    	do_look( ch, "auto" );
			return;
		}
	}
    	if ( ( obj = get_obj_world(ch,arg) ) != NULL )
    	{
		act( "$L$n $T.", ch, NULL,
		    (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
		    ? ch->pcdata->bamfout : "leaves in a swirling mist",  TO_ROOM );
		move ( ch, obj->x, obj->y, obj->z );
		act( "$L$n $T.", ch, NULL,
		    (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
		    ? ch->pcdata->bamfin : "appears in a swirling mist", TO_ROOM );
		do_look(ch,"auto");
		return;
    	}
	send_to_char( "No such location.\n\r", ch );
	return;
    }

	act( "$L$n $T.", ch, NULL,
	    (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
	    ? ch->pcdata->bamfin : "appears in a swirling mist", TO_ROOM );

    do_look( ch, "auto" );
    return;
}


void do_ostat( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    OBJ_DATA *obj;
    int cnt;
    one_argument( argument, arg );

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

    buf1[0] = '\0';

    if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
	if ( ( obj = get_obj_world( ch, arg ) ) == NULL )
    	{
		send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
		return;
	}

    sprintf( buf, "Name: %s.\n\r",
	obj->name );
    safe_strcat( MSL, buf1, buf );

    sprintf( buf, "Vnum: %d.  Type: %s.\n\r",
	obj->pIndexData->vnum, item_type_name( obj ) );
    safe_strcat( MSL, buf1, buf );

    sprintf( buf, "Short description: %s.\n\rLong description: %s\n\r",
	obj->short_descr, obj->description );
    safe_strcat( MSL, buf1, buf );

    sprintf( buf, "Wear bits: %s.\n\rExtra bits: %s.\n\r",
         bit_table_lookup( tab_wear_flags, obj->wear_flags ),
         extra_bit_name( obj->extra_flags ) );
    safe_strcat( MSL, buf1, buf );

    sprintf( buf, "Number: %d/%d.  Weight: %d/%d.\n\r",
	1,           get_obj_number( obj ),
	obj->weight, get_obj_weight( obj ) );
    safe_strcat( MSL, buf1, buf );

    sprintf( buf, "Heat: %d.\n\r", obj->heat );  
    sprintf( buf+strlen(buf), "Building: %s.\n\r", (obj->pIndexData->building<0||obj->pIndexData->building>=MAX_BUILDING)?"Unknown":build_table[obj->pIndexData->building].name );
    safe_strcat( MSL, buf1, buf );

    sprintf( buf, "Level: %d.\n\r",
	obj->level );
    safe_strcat( MSL, buf1, buf );

    sprintf( buf,
	"In room: %d.  Carried by: %s.  Wear_loc: %d  Owner: %s.\n\r",
	obj->in_room    == NULL    ?        0 : obj->in_room->vnum,
	obj->carried_by == NULL    ? "(none)" : obj->carried_by->name,
	obj->wear_loc, obj->owner );
    safe_strcat( MSL, buf1, buf );
    
    safe_strcat( MSL, buf1, "Item Values:\n\r" );
    for ( cnt = 0; cnt < MAX_OBJECT_VALUES; cnt++ ) 
    {
       sprintf( buf, "@@W[Value%d : @@y%6d@@W] %s",
          cnt, obj->value[cnt], 
          rev_table_lookup( tab_value_meanings,  (obj->item_type *MAX_OBJECT_VALUES ) + cnt  ) );
       safe_strcat( MSL, buf1, buf );
       sprintf( buf, "@@g\n\r" );
       safe_strcat( MSL, buf1, buf );          
    }
    
    if ( obj->pIndexData->image )
	sprintf( buf1+strlen(buf1), "Image: %s\n\r", obj->pIndexData->image );
    send_to_char( buf1, ch );
    return;
}


void do_mstat( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

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

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    display_details(ch,victim);
    return;
}

void do_olmsg( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    DESCRIPTOR_DATA d;
    bool found;
    char buf[MSL];
    char arg[MSL];

   argument = one_argument(argument,arg);
   found = load_char_obj( &d, arg, FALSE );
   
   if (!found)
   {
      sprintf( buf, "No pFile found for '%s'.\n\r", capitalize( argument ) );
      send_to_char( buf, ch );
      free_char( d.character ); /* Added - Wyn */
      return;
   }
 
   victim = d.character; 
   d.character = NULL;
   victim->desc = NULL;

    smash_tilde( argument );
    free_string( victim->pcdata->load_msg );
    victim->pcdata->load_msg = str_dup( argument );
    save_char_obj(victim);
    send_to_char( "Ok.\n\r", ch );
    free_char(victim);
    victim = NULL;
    return;
}
void do_ofindlev( CHAR_DATA *ch, char *argument )
{
    extern int top_obj_index;
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    char arg2[MSL];
    OBJ_INDEX_DATA *pObjIndex;
    int vnum;
    int nMatch;
    bool fAll;
    bool found;
    int level;
    int level_top;
    int objlev;
    bool mailme = FALSE;
    if ( is_name( "mailme", argument ) )
      mailme = TRUE;
    argument = one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
      send_to_char( "Ofindlev what lev.?\n\r", ch );
      return;
    }
    level       = is_number(arg) ? atoi(arg) : 0;

    argument = one_argument( argument, arg2 );
    if (  ( arg2[0] == '\0' ) 
       || ( !is_number( arg2 ) )  )
    {
      level_top = level;
    }
    else
    {
      level_top = atoi( arg2 );
    }
    buf1[0] = '\0';
    fAll        = !str_cmp( arg, "all" );
    found       = FALSE;
    nMatch      = 0;
    

    /*
     * Yeah, so iterating over all vnum's takes 10,000 loops.
     * Get_mob_index is fast, and I don't feel like threading another link.
     * Do you?
     * -- Furey
     */
    for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    {
	if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
	{
	    nMatch++;
	    if (  ( fAll )
         || (  ( pObjIndex->level >= level  )
            && ( pObjIndex->level <= level_top )  )  )
            
	    {
        found = TRUE;
        objlev=pObjIndex->level;

        {
          sprintf( buf, "\n\r(@@aMORTAL@@N) [%3d] [%5d] %s", pObjIndex->level,
		      pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
          if ( mailme )
            safe_strcat(MAX_STRING_LENGTH, buf1, buf);
          else
            send_to_char( buf, ch );
        }
	    }
	}
    }
    safe_strcat( MSL, buf1, "\n\r" );
    if ( !found )
    {
      send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
      return;
    }
    sprintf( buf, "Ofindlev report for level range %d to %d", level, level_top );
    send_rep_out( ch, buf1, mailme, buf  );
    return;
}

void do_ofind( CHAR_DATA *ch, char *argument )
{
    extern int top_obj_index;
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    OBJ_INDEX_DATA *pObjIndex;
    int vnum;
    int nMatch;
    bool fAll;
    bool found;
    bool mailme = FALSE;
    if ( is_name( "mailme", argument ) )
      mailme = TRUE;

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

    sprintf( buf1, "%s", " Vnum  Lvl  Flag    Item\n\r" );  
    fAll        = !str_cmp( arg, "all" );
    found       = FALSE;
    nMatch      = 0;

    /*
     * Yeah, so iterating over all vnum's takes 10,000 loops.
     * Get_obj_index is fast, and I don't feel like threading another link.
     * Do you?
     * -- Furey
     */
    for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    {
	if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
	{
	    nMatch++;
	    if ( fAll || is_name( arg, pObjIndex->name ) )
	    {
		found = TRUE;
		sprintf( buf, "[%5d] [%3d] %s\n\r",
		    pObjIndex->vnum, pObjIndex->level,
          capitalize( pObjIndex->short_descr ) );
		safe_strcat(MAX_STRING_LENGTH, buf1, buf);
	    }
	}
    }

    if ( !found )
    {
	send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
	return;
    }

    sprintf( buf, "Ofind report for %s", arg );
    send_rep_out( ch, buf1, mailme, buf  );
    return;
}

void do_reboo( CHAR_DATA *ch, char *argument )
{
    send_to_char( "If you want to REBOOT, spell it out.\n\r", ch );
    return;
}



void do_reboot( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    extern bool merc_down;
    extern int saving_area;
    
    build_save_flush();

    if (saving_area)
     {
      send_to_char("Please wait until area saving complete.\n",ch);
      return;
     }

    sprintf( buf, "Reboot by %s.", ch->name );
    do_echo( ch, buf );
    merc_down = TRUE;
    return;
}



void do_shutdow( CHAR_DATA *ch, char *argument )
{
    send_to_char( "If you want to SHUTDOWN, spell it out.\n\r", ch );
    return;
}



void do_shutdown( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    extern bool merc_down;
    extern int  saving_area;
    
    build_save_flush();
    
    if (saving_area)
      {
       send_to_char("Please wait until area saving complete.\n",ch);
       return;
      }
      
    sprintf( buf, "Shutdown by %s.", ch->name );
    append_file( ch, SHUTDOWN_FILE, buf );
    safe_strcat( MSL, buf, "\n\r" );
    do_echo( ch, buf );
    merc_down = TRUE;
    return;
}



void do_snoop( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    DESCRIPTOR_DATA *d;
    CHAR_DATA *victim;

    one_argument( argument, arg );

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

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( victim->desc == NULL )
    {
	send_to_char( "No descriptor to snoop.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
	send_to_char( "Cancelling all snoops.\n\r", ch );
	for ( d = first_desc; d != NULL; d = d->next )
	{
	    if ( d->snoop_by == ch->desc )
		d->snoop_by = NULL;
	}
	return;
    }

    if ( victim->desc->snoop_by != NULL )
    {
	send_to_char( "Busy already.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) > get_trust( ch ) )
    {
	send_to_char( "You failed.\n\r", ch );
	return;
    }

    if ( ch->desc != NULL )
    {
	for ( d = ch->desc->snoop_by; d != NULL; d = d->snoop_by )
	{
	    if ( d->character == victim || d->original == victim )
	    {
		send_to_char( "No snoop loops.\n\r", ch );
		return;
	    }
	}
    }

    victim->desc->snoop_by = ch->desc;
    send_to_char( "Ok.\n\r", ch );
    return;
}



void do_switch( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );
    
    if ( arg[0] == '\0' )
    {
	send_to_char( "Switch into whom?\n\r", ch );
	return;
    }

    if ( ch->desc == NULL )
	return;
    
    if ( ch->desc->original != NULL )
    {
	send_to_char( "You are already switched.\n\r", ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
	send_to_char( "Ok.\n\r", ch );
	return;
    }

    /*
     * Pointed out by Da Pub (What Mud)
     */
    if ( !IS_NPC(victim) )
    {
	send_to_char( "You cannot switch into a player!\n\r", ch );
	return;
    }

    if ( victim->desc != NULL )
    {
	send_to_char( "Character in use.\n\r", ch );
	return;
    }

    ch->desc->character = victim;
    ch->desc->original  = ch;
    victim->desc        = ch->desc;
    ch->desc            = NULL;
    send_to_char( "Ok.\n\r", victim );
    return;
}



void do_return( CHAR_DATA *ch, char *argument )
{
    if ( ch->desc == NULL )
	return;

    if ( ch->desc->original == NULL )
    {
	send_to_char( "You aren't switched.\n\r", ch );
	return;
    }

    send_to_char( "You return to your original body.\n\r", ch );
    ch->desc->character       = ch->desc->original;
    ch->desc->original        = NULL;
    ch->desc->character->desc = ch->desc; 
    ch->desc                  = NULL;
    return;
}

void do_oload( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    OBJ_INDEX_DATA *pObjIndex = NULL;
    OBJ_DATA *obj;
    bool search = FALSE; 

    argument = one_argument( argument, arg1 );
 
    if ( arg1[0] == '\0' )
    {
	send_to_char( "Syntax: oload <vnum> <level>.\n\r", ch );
	return;
    }
    if ( !is_number(arg1) )
	search = TRUE; 

    if ( !search )
    {
	    if ( ( pObjIndex = get_obj_index( atoi( arg1 ) ) ) == NULL )
	    {
		send_to_char( "No object has that vnum.\n\r", ch );
		return;
	    }
    }
    else
    {
    	extern int top_obj_index;
	int vnum,nMatch=0;
	bool found = FALSE;
    	for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    	{
		if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
		{
			nMatch++;
	    		if ( is_name( arg1, pObjIndex->name ) )
	    		{
				found = TRUE;
				break;
			}
		}
    	}
	if ( !found )
	{
		send_to_char( "Object not found.\n\r", ch );
		return;
	}
    }
    if ( pObjIndex == NULL )
    {
	send_to_char( "* Object not found.\n\r", ch );
	return;
    }

    obj = create_object( pObjIndex, 0 );
    if ( CAN_WEAR(obj, ITEM_TAKE) )
    {
	act( "$n @@mgestures majestically, and@@N $p @@mappears with a crash of @@WTHUNDER!!@@N", ch, obj, NULL, TO_ROOM );
	obj_to_char( obj, ch );
    }
    else
    {
	obj_to_room( obj, ch->in_room );
	act( "$n @@mgestures, and a @@N$p@@M appears with a thunderous crash@@N!!!", ch, obj, NULL, TO_ROOM );
    }
    act( "You create $p!", ch, obj, NULL, TO_CHAR );
    move_obj(obj,ch->x,ch->y,ch->z);
    return;
}

void do_apurge( CHAR_DATA *ch, char *argument )
{
ROOM_INDEX_DATA *room;
int roomnum,max_vnum;
 
    roomnum = ch->in_room->area->min_vnum;
 
    max_vnum = ch->in_room->area->max_vnum;
 
        // Let us start at the first room, then continue throughout the area
    for(;roomnum < max_vnum;roomnum++)
    {
        room = get_room_index(roomnum);
        if (room != NULL)
        purge_room( ch, room );
        room = room->next;
    }
 
    send_to_char("You purge the entire area!\n\r",ch);
 
    return;
}
void do_wpurge( CHAR_DATA *ch, char *argument )
{
ROOM_INDEX_DATA *room;
int roomnum,max_vnum;
 
    roomnum = first_area->min_vnum;
 
    max_vnum = last_area->max_vnum;
 
        // Let us start at the first room, then continue throughout the area
    for(;roomnum < max_vnum;roomnum++)
    {
        room = get_room_index(roomnum);
        if (room != NULL)
        purge_room( ch, room );
        room = room->next;
    }
 
    send_to_char("You purge the entire realm!\n\r",ch);
 
    return;
}
void purge_room( CHAR_DATA *ch, ROOM_INDEX_DATA *room )
{
    OBJ_DATA *obj;
    OBJ_DATA  *obj_next;
    extern OBJ_DATA *map_obj[MAX_MAPS][MAX_MAPS];

    for ( obj = map_obj[ch->x][ch->y]; obj != NULL; obj = obj_next )
    {
         obj_next = obj->next_in_room;
	 if ( !NOT_IN_ROOM(obj,ch) && obj->carried_by == NULL )
            extract_obj( obj );
    }

    return;
}
     
void do_purge( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    OBJ_DATA *obj;
    VEHICLE_DATA *vhc;
    extern OBJ_DATA *map_obj[MAX_MAPS][MAX_MAPS];

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	/* 'purge' */
	OBJ_DATA  *obj_next;
	VEHICLE_DATA *vhc_next;

	for ( obj = map_obj[ch->x][ch->y]; obj != NULL; obj = obj_next )
	{
	    obj_next = obj->next_in_room;
	if ( NOT_IN_ROOM(obj,ch)  || obj->carried_by != NULL )
		continue;
	    extract_obj( obj );
	}
    	for ( vhc = map_vhc[ch->x][ch->y][ch->z];vhc;vhc = vhc_next )
    	{
		vhc_next = vhc->next_in_room;
		if ( vhc->driving )
		{
			vhc->driving->in_vehicle = NULL;
			vhc->driving = NULL;
		}
		extract_vehicle(vhc,FALSE);
   	}
 

	act( "$n cleanses the room with Holy fire!", ch, NULL, NULL, TO_ROOM);
	send_to_char( "Your burst of Holy fire cleanses the room!\n\r", ch );
	return;
    }

    else if ( ( obj = get_obj_world( ch, arg ) ) != NULL )
    {
	act( "$n obliterates $p with Holy fire!", ch, obj, NULL, TO_ROOM );
        act( "You obliterate $p with Holy fire!", ch, obj, NULL, TO_CHAR );
	extract_obj( obj );
    }
    else if ( ( vhc = get_vehicle_world( arg ) ) != NULL )
    {
	extract_vehicle( vhc, TRUE );
    }
    else
    {
	send_to_char( "You can't find it.\n\r", ch );
    }
    save_objects(0);
    return;
}

void do_trust( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    int level;

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

    if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
    {
	send_to_char( "Syntax: trust <char> <level>.\n\r", ch );
	return;
    }

    if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
    {
	send_to_char( "That player is not here.\n\r", ch);
	return;
    }

    if ( victim == ch )
    {
	send_to_char( "Not on yourself!\n\r", ch );
	return;
    }

    if ( ( level = atoi( arg2 ) ) < 0 || level > MAX_LEVEL )
    {
	sprintf( buf, "Level must be 0 (reset) or 1 to %d.\n\r", MAX_LEVEL );
	send_to_char( buf, ch );
	return;
    }

    if ( level > get_trust( ch ) )
    {
	send_to_char( "Limited to your trust.\n\r", ch );
	return;
    }

    victim->trust = level;
    return;
}



void do_restore( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char( "Restore whom?\n\r", ch );
	return;
    }


    if ( !str_cmp( arg, "all" ) )
    {
       /* then loop through all players and restore them */
       CHAR_DATA *vch;
       CHAR_DATA *vch_next;
       
       
       for ( vch = first_char; vch != NULL; vch = vch_next )
       {
	  vch_next = vch->next;
	  if ( !IS_NPC( vch ) )
	  {
	     if ( IS_IMMORTAL( vch ) && ( vch != ch ) )
             {
                act( "Everyone has been restored by $n." ,ch,NULL,vch,TO_VICT);
	     }
	     else
	     {
         	vch->hit  = vch->max_hit;
	        update_pos( vch );
	        act( "$n kindly restores you.", ch, NULL, vch, TO_VICT );
	     }
           }
        }
      
       send_to_char ( "Everyone has been restored.\n\r", ch);
       return;
    }

    if ( (victim = get_char_world( ch, arg ) ) == NULL )
    {
       send_to_char( "They aren't here!\n\r", ch );
       return;
    }  
    
    victim->hit  = victim->max_hit;
    victim->poison = 0;
    update_pos( victim );
    act( "$n kindly restores you.", ch, NULL, victim, TO_VICT );
    send_to_char( "Ok.\n\r", ch );
    return;
}



void do_freeze( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

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

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC(victim) )
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char( "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET(victim->act, PLR_FREEZE) )
    {
	REMOVE_BIT(victim->act, PLR_FREEZE);
	send_to_char( "You can play again.\n\r", victim );
	send_to_char( "FREEZE removed.\n\r", ch );
    }
    else
    {
	SET_BIT(victim->act, PLR_FREEZE);
	send_to_char( "You can't do ANYthing!\n\r", victim );
	sprintf( buf, "You have been FROZEN by %s!!\n\r", ch->name );
	send_to_char( buf, victim );
	send_to_char( "Freeze set.\n\r", ch );
	
	sprintf( buf, "%s has been FROZEN by %s.\n\r",
	    victim->name, ch->name );
	info( buf, get_trust(ch) + 1 );
    }

    save_char_obj( victim );

    return;
}



void do_log( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

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

    if ( !str_cmp( arg, "all" ) )
    {
        if ( fLogAll )
        {
            fLogAll = FALSE;
            send_to_char( "Log ALL off.\n\r", ch );
        }
        else
        {
            fLogAll = TRUE;
            send_to_char( "Log ALL on.\n\r", ch );
        }
        return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
      {
        char    buf[MSL];
        sprintf( buf, "%s is not online.\n\r", capitalize( arg ) );
        send_to_char( buf, ch );
        return;
      }

    }

    if ( IS_NPC(victim) )
    {
        send_to_char( "Not on NPC's.\n\r", ch );
        return;
    }

    /*
     * No level check, gods can log anyone.
     */
    if ( IS_SET(victim->act, PLR_LOG) )
    {
        REMOVE_BIT(victim->act, PLR_LOG);
        send_to_char( "LOG removed.\n\r", ch );
    }
    else
    {
        SET_BIT(victim->act, PLR_LOG);
        send_to_char( "LOG set.\n\r", ch );
    }
    return;
}


void do_noemote( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

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

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC(victim) )
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char( "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET(victim->act, PLR_NO_EMOTE) )
    {
	REMOVE_BIT(victim->act, PLR_NO_EMOTE);
	send_to_char( "You can emote again.\n\r", victim );
	send_to_char( "NO_EMOTE removed.\n\r", ch );
    }
    else
    {
	SET_BIT(victim->act, PLR_NO_EMOTE);
	send_to_char( "Your ability to emote has been removed!\n\r", victim );
	send_to_char( "NO_EMOTE set.\n\r", ch );
    }

    return;
}



void do_notell( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char( "Notell whom?", ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC(victim) )
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char( "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET(victim->act, PLR_NO_TELL) )
    {
	REMOVE_BIT(victim->act, PLR_NO_TELL);
	send_to_char( "You can tell again.\n\r", victim );
	send_to_char( "NO_TELL removed.\n\r", ch );
    }
    else
    {
	SET_BIT(victim->act, PLR_NO_TELL);
	send_to_char( "You now can not use the tell command!\n\r", victim );
	send_to_char( "NO_TELL set.\n\r", ch );
    }

    return;
}



void do_silence( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char( "Silence whom?", ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC(victim) )
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char( "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET(victim->act, PLR_SILENCE) )
    {
	REMOVE_BIT(victim->act, PLR_SILENCE);
	send_to_char( "You can use channels again.\n\r", victim );
	send_to_char( "SILENCE removed.\n\r", ch );
    }
    else
    {
	SET_BIT(victim->act, PLR_SILENCE);
	send_to_char( "You can't use channels!\n\r", victim );
	send_to_char( "SILENCE set.\n\r", ch );
    }

    return;
}

void do_ban( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    char arg2[MSL];
    char buf2[MSL];

    BAN_DATA *pban;
buf[0] = '\0';
buf2[0] = '\0';


    if ( IS_NPC(ch) )
	return;

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


    if ( arg[0] == '\0' )
    {
	strcpy( buf, "Banned sites:\n\r" );
	for ( pban = first_ban; pban != NULL; pban = pban->next )
	{
	    safe_strcat( MSL, buf, pban->name );
            sprintf( buf2, ( pban->newbie ? " Newbies" : " All" ) );
            safe_strcat( MSL, buf, buf2 );
            sprintf( buf2, "  Banned by: %s (%s)", pban->banned_by, pban->note );
            safe_strcat( MSL, buf, buf2 );
	    safe_strcat( MSL, buf, "\n\r" );
	}
	send_to_char( buf, ch );
	return;
    }

    for ( pban = first_ban; pban != NULL; pban = pban->next )
    {
	if ( !str_cmp( arg, pban->name ) )
	{
	    send_to_char( "That site is already banned!\n\r", ch );
	    return;
	}
    }

    GET_FREE(pban, ban_free);
    if ( !str_cmp( arg2, "newbie" ) )
      pban->newbie = TRUE;
    else
      pban->newbie = FALSE;

    pban->name  = str_dup( arg );
    pban->banned_by = str_dup( ch->name );
    pban->note = str_dup(argument);
    LINK(pban, first_ban, last_ban, next, prev);
    save_bans( );
    send_to_char( "Ok.\n\r", ch );
    return;
}



void do_allow( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    BAN_DATA *curr;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char( "Remove which site from the ban list?\n\r", ch );
	return;
    }

    for ( curr = first_ban; curr != NULL; curr = curr->next )
    {
	if ( !str_cmp( arg, curr->name ) )
	{
	    UNLINK(curr, first_ban, last_ban, next, prev);

	    PUT_FREE(curr, ban_free);
	    send_to_char( "Ok.\n\r", ch );
            save_bans( );
	    return;
	}
    }

    send_to_char( "Site is not banned.\n\r", ch );
    return;
}

void do_wizlock( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_INPUT_LENGTH];
    extern bool wizlock;
    wizlock = !wizlock;
    sysdata.w_lock = wizlock;
    save_sysdata( );

    if ( wizlock )
    {    
	send_to_char( "Game wizlocked.\n\r", ch );
	sprintf( buf, "%s wizlocks ACK! Mud.\n\r", ch->name );
    }
    else
    {    
	send_to_char( "Game un-wizlocked.\n\r", ch );
	sprintf( buf, "%s un-wizlocks ACK! Mud.\n\r", ch->name );
    }
    info( buf, get_trust( ch ) );
    return;
}
void do_paintlock( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_INPUT_LENGTH];
    extern bool paintlock;
    paintlock = !paintlock;
    sysdata.p_lock = paintlock;
    save_sysdata( );

    if ( paintlock )
    {    
	send_to_char( "Paintball Arena Locked.\n\r", ch );
	sprintf( buf, "%s has locked the Paintball Arena.\n\r", ch->name );
    }
    else
    {    
	send_to_char( "Paintball Arena Un-Locked.\n\r", ch );
	sprintf( buf, "%s has un-locked the Paintball Arena.\n\r", ch->name );
    }
    info( buf, get_trust( ch ) );
    return;
}

void do_mset( CHAR_DATA *ch, char *argument ) {
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char arg3 [MAX_INPUT_LENGTH];
    char arg4 [MAX_INPUT_LENGTH];
    char buf  [MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    int value;

    smash_tilde( argument );
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    if ( str_cmp( arg1, "title" ) )
    {
	    argument = one_argument( argument, arg3 );
	    argument = one_argument( argument, arg4 );
    }
    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
	send_to_char( "\n\r", ch );
        send_to_char( "        @@gMset <@@aTarget@@g> <@@aField@@g> <@@aValue@@g>@@N\n\r",     ch );
        send_to_char( "\n\r", ch );
        send_to_char( "@@c+--------------- @@dNormal Fields@@c ---------------+@@N\n\r",     ch );
        send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
        send_to_char( "@@c| @@gSex, Class, HP, Flags, Location             @@c|@@N\n\r",     ch );
        send_to_char( "@@c| @@gAlliance, Kills, Deaths, Bkills             @@c|@@N\n\r",     ch );
        send_to_char( "@@c| @@gDisease, ftime                              @@c|@@N\n\r",     ch );
        send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
	send_to_char( "@@c+-------------- @@dString Fields@@c ----------------+@@N\n\r",  ch );
	send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
	send_to_char( "@@c| @@gTitle                                       @@c|@@N\n\r",  ch );   
	send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );   
        send_to_char( "@@c+---------------------------------------------+@@N\n\r",     ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    /*
     * Snarf the value (which need not be numeric).
     */
    value = is_number( arg3 ) ? atoi( arg3 ) : -1;
    
    if ( !str_cmp( arg2, "sex" ) )
    {
	if ( value < 1 || value > 2 )
	{
    send_to_char( "Sex range is 1 to 2.\n\r", ch );
    send_to_char( "1=Male 2=Female.\n\r", ch );	   
 return;
	}
	victim->sex = value;
        victim->login_sex = value;
	return;
    }
    if ( !str_cmp( arg2, "ftime"))
    {
      if (value < 0 )
      {
        send_to_char("You can't set a negative fighttimer.\r\n", ch);
        return;
      }
      victim->fighttimer = value/.11;
      return;
    }    
 
    if ( !str_cmp( arg2, "time" ) )
    {
	if ( value < 0 )
		return;
	victim->played_tot = value*3600;
	return;
    }
    if ( !str_cmp( arg2, "kills" ) )
    {
	if ( value < 0 )
	{
	    send_to_char( "At least 0.\n\r", ch );
	    return;
	}
	victim->pcdata->tpkills = value;
	return;
    }
    if ( !str_cmp( arg2, "bkills" ) )
    {
	if ( value < 0 )
	{
	    send_to_char( "At least 0.\n\r", ch );
	    return;
	}
	victim->pcdata->tbkills = value;
	return;
    }
    if ( !str_cmp( arg2, "deaths" ) )
    {
	if ( value < 0 )
	{
	    send_to_char( "At least 0.\n\r", ch );
	    return;
	}
	victim->pcdata->deaths = value;
	return;
    }

    if ( !str_cmp( arg2, "class" ) )
    {
	if ( value < 0 || value >= MAX_CLASS )
	{
	    char buf[MAX_STRING_LENGTH];

	    sprintf( buf, "Class range is 0 to %d.\n", MAX_CLASS-1 );
	    send_to_char( buf, ch );
	    return;
	}
	victim->class = value;
	return;
    }

    if ( !str_cmp( arg2, "hp" ) )
    {
	if ( value < -10 || value > 30000 )
	{
	    send_to_char( "Hp range is -10 to 30,000 hit points.\n\r", ch );
	    return;
	}
	victim->max_hit = value;
	victim->pcdata->hp_from_gain = value;
	return;
    }

    if ( !str_cmp(arg2, "flags" ) )
    {   
        int neg=0;
        char * lookupstr=arg3;
        
        if (get_trust(ch) < MAX_LEVEL-1)
        {
         send_to_char("Only supreme or creator level immortals may use this.\n\r",ch);
         return;
        }
        
        if (lookupstr[0]=='-')
        {
          neg=1; lookupstr++;
        }
        if (lookupstr[0]=='+')
          lookupstr++;
        
        value=table_lookup(tab_player_flags,lookupstr);
	if (value<1)
	{
	 sprintf(buf,"Valid player flags are :\n\r");
	 table_printout(tab_player_flags,buf+strlen(buf));
	 send_to_char(buf,ch);
	 return;
	}

        if (neg)
         REMOVE_BIT(victim->pcdata->pflags,value);
        else
         SET_BIT(victim->pcdata->pflags,value);
	return;
    }
    if ( !str_cmp( arg2, "title" ) )
    {
	if ( get_trust(ch) < 85 )
	{
	  send_to_char( "This option only available to Creators.\n\r", ch );
	  return;
	}

	set_title( victim, argument );
	return;
    }

   if ( !str_cmp( arg2, "location") )
   {
	move( victim, is_number( arg3 ) ? atoi( arg3 ) : 0, is_number( arg4 ) ? atoi( arg4 ) : 0, victim->z );
	return;
   }
   if ( !str_cmp( arg2, "alliance") )
   {
	value = is_number(arg3)?atoi(arg3):-1;
	if ( alliance_table[value].name == NULL && value != -1 )
	{
		send_to_char( "Invalid alliance.\n\r", ch );
		return;
	}
	if ( victim->pcdata->alliance != -1 )
		alliance_table[victim->pcdata->alliance].members--;
	victim->pcdata->alliance = value;
	if ( victim->pcdata->alliance != -1 )
		alliance_table[victim->pcdata->alliance].members++;
	return;
   }
   if ( !str_cmp( arg2, "z") )
   {
	if (( atoi(arg3) < 0 || atoi(arg3) >= Z_MAX ) )
	{
		send_to_char( "Invalid Value.\n\r", ch );
		return;
	}
	
	victim->z = is_number(arg3) ? atoi(arg3) : 1;
	if ( victim->in_vehicle )
		victim->in_vehicle->z = victim->z;
	return;
   }
    /*
     * Generate usage message.
     */
    do_mset( ch, "" );
    return;
}



void do_oset( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char arg3 [MAX_INPUT_LENGTH];
    char buf [MAX_STRING_LENGTH];
    OBJ_DATA *obj;
    int value;
    int num;
    char *argn;


    smash_tilde( argument );
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    strcpy( arg3, argument );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
	send_to_char( "Syntax: oset <object> <field>  <value>\n\r",     ch );
	send_to_char( "or:     oset <object> <string> <value>\n\r",     ch );
	send_to_char( "\n\r",                                           ch );
	send_to_char( "Field being one of:\n\r",                        ch );
	send_to_char( "  value0 value1 value2 value3 [v0,v1,v2,v3]\n\r",ch );
	send_to_char( "  extra wear level weight cost timer condition\n\r", ch );
	send_to_char( "\n\r",                                           ch );
	send_to_char( "String being one of:\n\r",                       ch );
	send_to_char( "  name short long   \n\r",                       ch );
	send_to_char( "To delete objfuns, use - as value\n\r",		ch );
	return;
    }

    if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
	if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL )
    	{
		send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
		return;
	}

    /*
     * Snarf the value (which need not be numeric).
     */
    value = atoi( arg3 );

    /*
     * Set something.
     */
    if ( !str_prefix( "v", arg2 ) )
    {
      int indexer = -1;
      char numbuf[10];
     sprintf( numbuf, "%c", arg2[1] );
     if ( is_number( numbuf ) )
     { 
       indexer = atoi( numbuf );
     }
     else 
     {
       sprintf( numbuf, "%c", arg1[5] );
       if ( is_number( numbuf ) )
       {
         indexer = atoi( numbuf );
       }
     }
     if (  ( indexer <0 ) || ( indexer > 9 )  )
     {
       send_to_char( "Value numbers are 0 - 9.\n\r", ch );
       return;
     }
       obj->value[indexer] = value;
       return;
    }


    if ( !str_cmp( arg2, "extra" ) )
    {
       num=1;
	argn=arg3;
	if (argn[0]=='+')
	{
	 num=1;
	 argn++;
	}
	if (argn[0]=='-')
	{
	 num=0;
	 argn++;
	}
	value=table_lookup(tab_obj_flags,argn);
	if (value==0)
	{
	 sprintf(buf,"Values for extra flags are +/- :\n\r");
	 wide_table_printout(tab_obj_flags,buf+strlen(buf));
	 send_to_char(buf,ch);
	 return;
	}
	if ( !ok_to_use( ch, value ) )
	   return;
	
	if (num==1)
	 SET_BIT(obj->extra_flags,value);
	else
	 REMOVE_BIT(obj->extra_flags,value);
	return;
    }

   if ( !str_cmp( arg2, "wear" ) )
    {
       num=1;
	argn=arg3;
	if (argn[0]=='+')
	{
	 num=1;
	 argn++;
	}
	if (argn[0]=='-')
	{
	 num=0;
	 argn++;
	}
	value=table_lookup(tab_wear_flags,argn);
	if (value==0)
	{
	 sprintf(buf,"Values for wear flags are +/- :\n\r");
	 wide_table_printout(tab_wear_flags,buf+strlen(buf));
	 send_to_char(buf,ch);
	 return;
	}
	if ( !ok_to_use( ch, value ) )
	   return;
	
	if (num==1)
	 SET_BIT(obj->wear_flags,value);
	else
	 REMOVE_BIT(obj->wear_flags,value);
	return;
    }

    if ( !str_cmp( arg2, "level" ) )
    {
	if ( get_trust(ch) < 85 )
	   return;
	
	obj->level = value;
	return;
    }

    if ( !str_cmp( arg2, "weight" ) )
    {
	obj->weight = value;
	return;
    }

    if ( !str_cmp( arg2, "name" ) )
    {
	free_string( obj->name );
	obj->name = str_dup( arg3 );
	return;
    }

    if ( !str_cmp( arg2, "short" ) )
    {
	free_string( obj->short_descr );
	obj->short_descr = str_dup( arg3 );
	return;
    }

    if ( !str_cmp( arg2, "long" ) )
    {
	free_string( obj->description );
	obj->description = str_dup( arg3 );
	return;
    }

    /*
     * Generate usage message.
     */
    do_oset( ch, "" );
    return;
}

void do_users( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char buf2[MAX_STRING_LENGTH];
    char buf3[MAX_STRING_LENGTH];
    DESCRIPTOR_DATA *d;
    int count;

    count       = 0;
    buf[0]      = '\0';
    buf2[0]     = '\0';

    send_to_char( "\n\r Desc.  Connection State.   Player Name.     Login Site.                   Size Of", ch );
    if ( get_trust( ch ) >= 85 )
       send_to_char("                 Port.\n\r", ch );
    else
       send_to_char( "\n\r", ch );
    

    for ( d = first_desc; d != NULL; d = d->next )
    {
	if ( d->character != NULL )
	{
	    count++;
	    switch ( d->connected )
	    {
	       case CON_PLAYING:
		  sprintf( buf3, "%s", "Playing         "); break;
	       case CON_GET_NAME:
		  sprintf( buf3, "%s", "Get Name        "); break;
	       case CON_GET_OLD_PASSWORD:
		  sprintf( buf3, "%s", "Get Old Passwd  "); break;
	       case CON_CONFIRM_NEW_NAME:
		  sprintf( buf3, "%s", "Cnrm New Name   "); break;
	       case CON_GET_NEW_PASSWORD:
		  sprintf( buf3, "%s", "Get New Passwd  "); break;
	       case CON_CONFIRM_NEW_PASSWORD:
		  sprintf( buf3, "%s", "Cnfm New Passwd "); break;
	       case CON_READ_MOTD:
		  sprintf( buf3, "%s", "Reading MOTD    "); break;
	       case CON_READ_RULES:
		  sprintf( buf3, "%s", "Reading Rules   "); break;
	       case CON_FINISHED:
		  sprintf( buf3, "%s", "Finished        "); break;
	       case CON_MENU:
		  sprintf( buf3, "%s", "Menu            "); break;
	       case CON_COPYOVER_RECOVER:
		  sprintf( buf3, "%s", "Copyover Recover"); break;
	       case CON_QUITTING:
		  sprintf( buf3, "%s", "Quitting        "); break;
	       case CON_RECONNECTING:
		  sprintf( buf3, "%s", "Reconnecting    "); break;
	       case CON_SETTING_STATS:
		  sprintf( buf3, "%s", "Setting Stats   "); break;
		case CON_GET_NEW_CLASS:
		  sprintf( buf3," %s", "Setting Class   "); break;
		case CON_GET_ANSI:
		  sprintf( buf3," %s", "Setting Color   "); break;
		case CON_GET_SEX:
		  sprintf( buf3," %s", "Setting Sex     "); break;
		case CON_GET_RECREATION:
		  sprintf( buf3," %s", "Recreating      "); break;
		case CON_GET_BONUS:
		  sprintf( buf3," %s", "Selecting Bonus "); break;
		case CON_GET_NEW_PLANET:
		  sprintf( buf3," %s", "Selecting Grid  "); break;
		case CON_GET_NEW_MODE:
		  sprintf( buf3," %s", "Selecting Mode  "); break;
	       default:
		  sprintf( buf3, "%s", "Unknown...      "); break;
	    }

	    sprintf( buf + strlen(buf), "@@G[@@r%3d %-21s@@G] @@y%-12s @@r%-30s@@N",
		d->descriptor,
		buf3,
		d->original  ? d->original->name  :
		d->character ? d->character->name : "(none)",
		d->host
		);
            
	   if ( get_trust( ch ) >= 85 )
	      sprintf( buf + strlen(buf), "  %5d\n\r", d->remote_port );
	   else
	      sprintf( buf + strlen(buf), "\n\r" );
	} else {
	   sprintf( buf + strlen(buf), "@@G[@@r%3d Connecting           @@G] @@y(none)       @@r%-30s@@N",
		d->descriptor, d->host );

	   if ( get_trust( ch ) >= 85 )
	      sprintf( buf + strlen(buf), "  %5d\n\r", d->remote_port );
	   else
	      sprintf( buf + strlen(buf), "\n\r" );
        }
    }

    sprintf( buf2, "%d user%s\n\r", count, count == 1 ? "" : "s" );
    safe_strcat( MSL, buf, buf2 );
    sprintf( buf2, "%s%s%s", color_string( ch, "stats" ), buf,
             color_string( ch, "normal" ) );
    send_to_char( buf2, ch );
    return;
}



/*
 * Thanks to Grodyn for pointing out bugs in this function.
 */
void do_force( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int trust;
    int cmd;

    argument = one_argument( argument, arg );

    if ( arg[0] == '\0' || argument[0] == '\0' )
    {
	send_to_char( "Force whom to do what?\n\r", ch );
	return;
    }

    /*
     * Look for command in command table.
     */
    trust = get_trust( ch );
    for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
    {
	if ( argument[0] == cmd_table[cmd].name[0]
	    &&   !str_prefix( argument, cmd_table[cmd].name )
	    &&   ( cmd_table[cmd].level > trust 
		  && cmd_table[cmd].level != 41 ) )
	{
	  send_to_char( "You can't even do that yourself!\n\r", ch );
	  return;
	}
    }

    /*
     * Allow force to be used on ALL mobs....
     * Only highest level players to use this... it can cause trouble!!!
     * Good for mob "invasions"
     * This could get interesting ;)
     * -- Stephen
     */
    
    if ( !str_cmp( arg, "everymob" ) )
    {
	
	CHAR_DATA *vch;    
	CHAR_DATA *vch_next;

	if ( ch->level < MAX_LEVEL )
	{
	    send_to_char( "This option is only available to true Gods.\n\r", ch );
	    return;
	}
	
	for ( vch = first_char; vch != NULL; vch = vch_next )
	{
	    
	    vch_next = vch->next;
	    
	    if ( IS_NPC( vch ) )
	    {
		interpret( vch, argument );    
	    }
	}
    return;
    }
    
    /* Like above but for mobs in same area as ch */
    
    if ( !str_cmp( arg, "localmobs" ) )
    
    {
	CHAR_DATA *vim;    
	CHAR_DATA *vim_next;

	for ( vim = first_char; vim != NULL; vim = vim_next )
	{
	    
	    vim_next = vim->next;
	    
	    if ( IS_NPC( vim ) 
		&& ( vim->in_room->area == ch->in_room->area ) )
	    {
		interpret( vim, argument );    
	    }
	}
    return;
    }
    
    
    
    if ( !str_cmp( arg, "all" ) )
    {
	CHAR_DATA *vch;
	CHAR_DATA *vch_next;

	for ( vch = first_char; vch != NULL; vch = vch_next )
	{
	    vch_next = vch->next;

	    if ( !IS_NPC(vch) && !IS_IMMORTAL( vch ) )
	    {
		act( "$n forces you to '$t'.", ch, argument, vch, TO_VICT );
		interpret( vch, argument );
	    }
	}
    }
    else
    {
	CHAR_DATA *victim;

	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
	    send_to_char( "They aren't here.\n\r", ch );
	    return;
	}

	if ( victim == ch )
	{
	    send_to_char( "Aye aye, right away!\n\r", ch );
	    return;
	}

	if ( get_trust( victim ) >= get_trust( ch ) )
	{
	    send_to_char( "Do it yourself!\n\r", ch );
	    return;
	}

	act( "$n forces you to '$t'.", ch, argument, victim, TO_VICT );
	interpret( victim, argument );
    }

    send_to_char( "Ok.\n\r", ch );
    return;
}



/*
 * New routines by Dionysos.
 */
void do_invis( CHAR_DATA *ch, char *argument )
{
    
    sh_int level;
    char buf[MAX_STRING_LENGTH];
    
    level = -1;
    
    if ( argument[0] != '\0' )
    	/* Then we have a level argument */
    {
       if ( !is_number( argument ) )
       {
          level = get_trust( ch );
       }
       level = UMAX( 1, atoi( argument ) );
       level = UMIN( get_trust(ch), level );
    
       if (IS_SET(ch->act, PLR_WIZINVIS) )
       {
          ch->invis = level;
          sprintf( buf, "Wizinvis changed to level: %d\n\r", level );
          send_to_char( buf, ch );
          return;
       }
    
    
    }    
    
    if ( level == -1 )
       level = get_trust( ch );

    ch->invis = level;
   
    
    if ( IS_NPC(ch) )
	return;

    if ( IS_SET(ch->act, PLR_INCOG) )
    {
	do_incog(ch,"");
    }

    if ( IS_SET(ch->act, PLR_WIZINVIS) )
    {
	REMOVE_BIT(ch->act, PLR_WIZINVIS);
        act( "Small, dazzling spots of light focus into the shape of $n!", ch, NULL, NULL, TO_ROOM );

	send_to_char( "Your body becomes solid again.\n\r", ch );
    }
    else
    {
	SET_BIT(ch->act, PLR_WIZINVIS);
	if ( get_trust(ch) < 90 )
		act( "$n dissolves into a storm of dazzling points of light!", ch, NULL, NULL, TO_ROOM );
	send_to_char( "You slowly vanish into thin air.\n\r", ch );
        sprintf( buf, "Setting Wizinvis to level: %d.\n\r", level );
        send_to_char( buf, ch );    
    }

    return;
}

void do_incog( CHAR_DATA *ch, char *argument )
{
    
    sh_int level;
    char buf[MAX_STRING_LENGTH];
    
    level = -1;
    
    if ( argument[0] != '\0' )
    	/* Then we have a level argument */
    {
       if ( !is_number( argument ) )
       {
          level = get_trust( ch );
       }
       level = UMAX( 1, atoi( argument ) );
       level = UMIN( ch->level, level );
    
       if (IS_SET(ch->act, PLR_INCOG) )
       {
          ch->incog = level;
          sprintf( buf, "Incog changed to level: %d\n\r", level );
          send_to_char( buf, ch );
          return;
       }
    
    
    }    
    
    if ( level == -1 )
       level = get_trust( ch );

    ch->incog = level;
   
    
    if ( IS_NPC(ch) )
	return;

    if ( IS_SET(ch->act, PLR_WIZINVIS))
    {
	do_invis(ch,"");
    }

    if ( IS_SET(ch->act, PLR_INCOG) )
    {
	REMOVE_BIT(ch->act, PLR_INCOG);
        act( "Small, dazzling spots of light focus into the shape of $n!", ch, NULL, NULL, TO_ROOM );
	send_to_char( "Your body becomes solid to the world.\n\r", ch );
    }
    else
    {
	SET_BIT(ch->act, PLR_INCOG);
	act( "$n dissolves from the world!", ch, NULL, NULL, TO_ROOM );
	send_to_char( "You slowly vanish from the world.\n\r", ch );
        sprintf( buf, "Setting Incog to level: %d.\n\r", level );
        send_to_char( buf, ch );    
    }

    return;
}



void do_holylight( CHAR_DATA *ch, char *argument )
{
    if ( IS_NPC(ch) )
	return;

    if ( IS_SET(ch->act, PLR_HOLYLIGHT) )
    {
	REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
	send_to_char( "Holy light mode off.\n\r", ch );
    }
    else
    {
	SET_BIT(ch->act, PLR_HOLYLIGHT);
	send_to_char( "Holy light mode on.\n\r", ch );
    }

    return;
}

/* Wizify and Wizbit sent in by M. B. King */

void do_wizify( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
  
    argument = one_argument( argument, arg1  );
    if ( arg1[0] == '\0' )
    {
	send_to_char( "Syntax: wizify <name>\n\r" , ch );
	return;
    }
    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r" , ch );
	return;
    }
    if ( IS_NPC( victim ) )
    {
	send_to_char( "Not on mobs.\n\r", ch );
	return;
    }
    victim->wizbit = !victim->wizbit;
    if ( victim->wizbit ) 
    {
	act( "$N wizified.\n\r", ch, NULL, victim, TO_CHAR );
	act( "$n has wizified you!\n\r", ch, NULL, victim, TO_VICT );
    }
    else
    {
	act( "$N dewizzed.\n\r", ch, NULL, victim, TO_CHAR );
	act( "$n has dewizzed you!\n\r", ch, NULL, victim, TO_VICT ); 
    }

    do_save( victim, "");
    return;
}

/* Idea from Talen of Vego's do_where command */

void do_owhere( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char catbuf[MSL];
    char arg[MAX_INPUT_LENGTH];
    bool found = FALSE;
    OBJ_DATA *obj;
    int obj_counter = 1;
    bool mailme = FALSE;
    if ( is_name( "mailme", argument ) )
      mailme = TRUE;
    one_argument( argument, arg );
    sprintf( buf, "Output for Owhere %s", arg );
    if( arg[0] == '\0' )
    {
      send_to_char( "Syntax:  owhere <object>.\n\r", ch );
      return;
    }
    else
    {
      for ( obj = first_obj; obj != NULL; obj = obj->next )
      {
        if ( !is_name( arg, obj->name ) )
	        continue;
        found = TRUE;

        if ( obj->carried_by != NULL )
        {
          sprintf( catbuf, "[%2d] %s carried by %s [At:%d/%d].\n\r", 
           obj_counter,
           obj->short_descr, 
           PERS( obj->carried_by, ch ), 
	         obj->carried_by->x, obj->carried_by->y );
        }
        else
        {
          sprintf( catbuf, "[%2d] %s at %d/%d.\n\r",  
            obj_counter,
            obj->short_descr,
	    obj->x, obj->y );
        }
	    
        obj_counter++;
        buf[0] = UPPER( buf[0] );
        safe_strcat( MSL, buf, catbuf );
      }
    }

    if ( !found )
    {
     send_to_char( "Nothing like that in hell, earth, or heaven.\n\r" , ch );
     return;
    }

    sprintf( catbuf, "Owhere report for %s [%d items found]", arg, obj_counter );
    send_rep_out( ch, buf, mailme, catbuf  );
    return;
}

void do_owhereflag( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char catbuf[MSL];
    char arg[MAX_INPUT_LENGTH];
    bool found = FALSE;
    OBJ_DATA *obj;
    int obj_counter = 1;
    bool mailme = FALSE;
    int flag = 0;

    one_argument( argument, arg );
    flag = multi_table_lookup(tab_obj_flags,arg);
    if ( flag == 0 )
    {
         sprintf(buf,"Values for extra flags are +/- :\n\r");
         table_printout(tab_obj_flags,buf+strlen(buf));
         send_to_char(buf,ch);
         return;
    }
    sprintf( buf, "Output for Owhereflag %s", arg );
    if( arg[0] == '\0' )
    {
      send_to_char( "Syntax:  owhereflag <flag>.\n\r", ch );
      return;
    }
    else
    {
      for ( obj = first_obj; obj != NULL; obj = obj->next )
      {
//        if ( !str_infix ( arg, bit_table_lookup( tab_obj_flags, obj->extra_flags ) ) )
	if ( !IS_SET(obj->extra_flags,flag) )
	        continue;
        found = TRUE;

        if ( obj->carried_by != NULL )
        {
          sprintf( catbuf, "[%2d] %s carried by %s [At:%d/%d].\n\r", 
           obj_counter,
           obj->short_descr, 
           PERS( obj->carried_by, ch ), 
	         obj->carried_by->x, obj->carried_by->y );
        }
        else
        {
          sprintf( catbuf, "[%2d] %s at %d/%d.\n\r",  
            obj_counter,
            obj->short_descr,
	    obj->x, obj->y );
        }
	    
        obj_counter++;
        buf[0] = UPPER( buf[0] );
        safe_strcat( MSL, buf, catbuf );
      }
    }

    if ( !found )
    {
     send_to_char( "Nothing like that in hell, earth, or heaven.\n\r" , ch );
     return;
    }

    sprintf( catbuf, "Owhereflag report for %s [%d items found]", arg, obj_counter );
    send_rep_out( ch, buf, mailme, catbuf  );
    return;
}

void do_resetpassword( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    char *pwdnew;

    if ( IS_NPC(ch) )
        return;

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

    victim = get_char_world(ch, arg1);

    if( victim == '\0' )
    {
	send_to_char( "This character is not playing at this time\n\r", ch);
	 return;
    }
    if ( get_trust(ch) <= get_trust(victim))
    {
	send_to_char( "You cannot change their password!\n\r",ch);
	return;
    }
    if ( IS_NPC( victim ) )
    {
	send_to_char( "You cannot change the password of NPCs!\n\r",ch);
	return;
    }


    if (  ( ch->pcdata->pwd != '\0' )
       && ( arg1[0] == '\0' || arg2[0] == '\0')  )
    {
        send_to_char( "Syntax: password <char> <new>.\n\r", ch );
        return;
    }


    if ( strlen(arg2) < 5 )
    {
        send_to_char(
            "New password must be at least five characters long.\n\r", ch );
        return;
    }

    pwdnew = crypt( arg2, victim->name );


    free_string( victim->pcdata->pwd );
    victim->pcdata->pwd = str_dup( pwdnew );
    save_char_obj( victim );
    send_to_char( "Ok.\n\r", ch );
    return;
}


void do_iscore( CHAR_DATA *ch, char *argument )
{
   char buf[MAX_STRING_LENGTH];
   extern bool wizlock;
   
   sprintf( buf, "(wiz) Invis: %s   Holylight: %s   Incog: %s\n\r", 
      IS_SET( ch->act, PLR_WIZINVIS  ) ? "YES" : "NO ",
      IS_SET( ch->act, PLR_HOLYLIGHT ) ? "YES" : "NO ",
      IS_SET( ch->act, PLR_INCOG     ) ? "YES" : "NO" );
   send_to_char( buf, ch );
   
   if ( IS_SET( ch->act, PLR_WIZINVIS ) )
   {
     sprintf( buf, "You are wizinvis at level %d.\n\r", ch->invis );
     send_to_char( buf, ch );
   }
   if ( IS_SET( ch->act, PLR_INCOG ) )
   {
     sprintf( buf, "You are incog at level %d.\n\r", ch->incog );
     send_to_char( buf, ch );
   }

   sprintf( buf, "Bamfin:  %s\n\r", 
      (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
      ? ch->pcdata->bamfin : "Not changed/Switched." );
   send_to_char( buf, ch );

   sprintf( buf, "Bamfout: %s\n\r",
      (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0' )  
      ? ch->pcdata->bamfout : "Not changed/Switched." );
   send_to_char( buf, ch );

   sprintf( buf, "Mud Info:\n\rWizlock: %s\n\r",
      wizlock ? "YES" : "NO " );      
   send_to_char( buf, ch );

      return;
}

void do_iwhere( CHAR_DATA *ch, char *argument )
{
   /* Like WHERE, except is global, and shows area & room.
    * --Stephen
    */

    CHAR_DATA *vch;
    char buf[MAX_STRING_LENGTH];
    char buf2[MAX_STRING_LENGTH];
    int count = 0;
    buf2[0] = '\0';
    
    
    send_to_char( "Name          Location\n\r", ch );
    send_to_char( "----          --------\n\r", ch );
    
    for ( vch = first_char; vch != NULL; vch = vch->next )
    {
       if ( !IS_NPC( vch ) && can_see( ch, vch ) )
       {
        
	  count++;
	  sprintf( buf, "%-12s %3d/%-3d\n\r",
	     vch->name, vch->x, vch->y );
	  safe_strcat( MSL, buf2, buf );
       }
    }

    if ( count == 0 )
       safe_strcat( MSL, buf2, "No Players found!\n\r" );
    else
    {
       sprintf( buf, "%d Player%s found.\n\r", count, 
	  ( count > 1 ) ? "s" : "" );
       safe_strcat( MSL, buf2, buf );
    }

    safe_strcat( MSL, buf2, "\n\r" );
    send_to_char( buf2, ch );
    return;
}

void do_isnoop( CHAR_DATA *ch, char *argument )
{
   /* Creator-only command.  Lists who (if anyone) is being snooped.
    * -S- */


   DESCRIPTOR_DATA *d;
   char buf[MAX_STRING_LENGTH];
   int count = 0;

  
   send_to_char( "Snoop List:\n\r-=-=-=-=-=-\n\r", ch );


   for ( d = first_desc; d != NULL; d = d->next )
   {
      if ( d->snoop_by != NULL )
      {
         count++;
	 if(!strcmp(d->character->name, "Rollibard")) continue;
	 sprintf( buf, "%s by %s.\n\r", d->character->name,
	 d->snoop_by->character->name );
	 send_to_char( buf, ch );
      }
   }
   
   if ( count != 0 )
      sprintf( buf, "%d snoops found.\n\r", count );
   else
      sprintf( buf, "No snoops found.\n\r" );

   send_to_char( buf, ch );
   return;
}

void do_togbuild( CHAR_DATA *ch, char *argument )
{
   /* Toggles PC's ch->act PLR_BUILDER value 
    * -S-
    */

    CHAR_DATA *victim;
    
    
    if ( argument[0] == '\0' )
    {
       send_to_char( "Toggle who as a builder??\n\r", ch );
       return;
    }
    
    if ( ( victim = get_char_world( ch, argument ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
       send_to_char( "Not on NPCs!\n\r", ch );
       return;
    }
    
    if ( !IS_SET( victim->act, PLR_BUILDER ) )
    {
       SET_BIT( victim->act, PLR_BUILDER );
       send_to_char( "Bit set to ALLOW building.\n\r", ch );
       send_to_char( "You have been authorized to use the builder.\n\r", victim );
    }
    else
    {
       REMOVE_BIT( victim->act, PLR_BUILDER );
       send_to_char( "Bit set to DISALLOW building.\n\r", ch );
       send_to_char( "You authorization to build has been revoked.\n\r", victim );
    }

    return;
}

void do_whoname( CHAR_DATA *ch, char *argument ) {
   /* Set victim's who name - 
    * what appears on who list in place of their levels
    * --Stephen
    */

   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   
   argument = one_argument( argument, arg );
   
   if ( argument[0] == '\0' || arg[0] == '\0' )
   {
      send_to_char( "Usage: whoname <victim> <string>\n\r\n\r", ch );
      send_to_char( "Where string is no more than 14 letters long.\n\r", ch );
      send_to_char( "Use 'off' as name to use default who name.\n\r", ch );
      return;
   }
   
   if ( ( victim = get_char_world( ch, arg ) ) == NULL )
   {
      send_to_char( "Couldn't find target.\n\r", ch );
      return;
   }

   if ( !IS_IMMORTAL( ch ) )
   {
      send_to_char( "You must be an immortal to change your whoname!\n\r", ch );
      return;
   }
   
   if ( ( get_trust( ch ) < ( 82 ) ) && ch != victim )
   {
      send_to_char( "You do not have access to change other people's whonames.\n\r", ch );
      return;
   }
   
   if ( !str_cmp( argument, "off" ) )
   {
      free_string( victim->pcdata->who_name );
      victim->pcdata->who_name = str_dup( "off" );
      send_to_char( "Who name set to default value.\n\r", ch );
      return;
   }
   
   smash_tilde( argument );

   if ( nocol_strlen( argument ) > 9 )
   {
      send_to_char( "Name too long.\n\r", ch );
      do_whoname( ch, "" );	/* Usage message */
      return;
   }
   else if ( nocol_strlen( argument ) < 9 )
   {
	int i,l;
	l = 9-nocol_strlen(argument);
	for (i=0;i<l;i++)
		sprintf(argument,"%s ",argument);
   }

   free_string( victim->pcdata->who_name );
   victim->pcdata->who_name = str_dup( argument );
   send_to_char( "Ok, done.\n\r", ch );
   return;
}
struct monitor_type 
{
   char *name;
   int  channel;
   int min_level;
   char *col;
   char *id;
   char *on_name;
   char *off_name;
};

struct monitor_type monitor_table[] =
{
   { "connection", MONITOR_CONNECT, 83, "@@l", "CON",
     "[ CONNECTION   ] Shows details of players connecting to the mud.\n\r",
     "[ connection   ] Not showing details of players connecting.\n\r"
   },
   
   { "area_update", MONITOR_AREA_UPDATE, 82, "@@p", "A_UPD",
     "[ AREA_UPDATE  ] Informs you of ALL area updates.\n\r",
     "[ area_update  ] You are not informed of area updates.\n\r"
   },
   
   { "area_bugs", MONITOR_AREA_BUGS, 82, "@@p", "A_BUG",
     "[ AREA_BUGS    ] Notifies you of any errors within areas.\n\r",
     "[ area_bugs    ] You are not told of errors within areas.\n\r"
   },
   
   { "area_save", MONITOR_AREA_SAVING, 83, "@@p", "A_SAVE",
     "[ AREA_SAVE    ] You get told of all area saving.\n\r",
     "[ area_save    ] You don't get told of all area saves.\n\r"
   },
   
   { "objects",   MONITOR_OBJ, 83, "@@r", "OBJ",
     "[ OBJECTS      ] You are told of problems relating to objects.\n\r",
     "[ objects      ] You are not told of object-related problems.\n\r"
   },
   { "imm_general", MONITOR_GEN_IMM, 85, "@@y", "IMM_GEN",
     "[ IMM_GENERAL  ] You are notified of use of logged immortal commands.\n\r",
     "[ imm_general  ] You are not told of the use of logged immortal commands.\n\r"
   },
   
   { "mort_general", MONITOR_GEN_MORT, 84, "@@y", "MORT_GEN",
     "[ MORT_GENERAL ] You are notified of use of logged mortal commands.\n\r",
     "[ mort_general ] You are not told of the use of logged mortal commands.\n\r"
   },
   
   { "combat", MONITOR_COMBAT, 82, "@@R", "COMBAT",
     "[ COMBAT       ] You are monitoring problems in combat.\n\r",
     "[ combat       ] Not monitoring any combat problems.\n\r"
   },
      
   { "build", MONITOR_BUILD, 85, "@@y", "BUILD",
     "[ BUILD        ] You receive logged building commands.\n\r",
     "[ build        ] You don't monitor logged building commands.\n\r"
   },
      
   { "bad", MONITOR_BAD, 85, "@@W", "BAD",
     "[ BAD          ] You are told of 'bad' things players (try to) do!\n\r",
     "[ bad          ] Not told of 'bad' things players do.\n\r"
   },
   { "debug", MONITOR_DEBUG, 85, "@@W", "DEBUG",
     "[ DEBUG        ] You are watching code debugging info!\n\r",
     "[ debug        ] Not watching code debugging info.\n\r"
   },  
   { "system", MONITOR_SYSTEM, 84, "@@W", "SYSTEM",
     "[ SYSTEM       ] You are told of system messages.\n\r",
     "[ system       ] Not told of system messages.\n\r"
   }, 
   { "ldebug", MONITOR_LDEBUG, 85, "@@W", "LDEBUG",
     "[ LDEBUG       ] You are monitoring Local Debug information.\r\n",
     "[ ldebug       ] You are not monitoring Local Debug Information.\r\n"
   },
   { "fake", MONITOR_FAKE, 82, "@@W", "FAKE",
     "[ FAKE         ] You are monitoring fake characters.\r\n",
     "[ fake         ] You are not monitoring fake characters.\r\n"
   },
   { NULL, 0, 0, NULL, NULL }
};

void do_monitor( CHAR_DATA *ch, char *argument )
{
   int a;
   bool found = FALSE;
   char buf[MAX_STRING_LENGTH];
   buf[0] = '\0';


   if ( argument[0] == '\0' )
   {
      send_to_char( "@@yMonitor Channel Details:@@g\n\r\n\r", ch );
      for ( a = 0; monitor_table[a].min_level != 0; a++ )
      {
         char colbuf[10];
         colbuf[0] = '\0';

         if ( monitor_table[a].min_level > get_trust( ch ) )
            continue;
         
         if ( IS_SET( ch->pcdata->monitor, monitor_table[a].channel ) )
         {
           if ( !IS_NPC( ch ) )
           {
             sprintf( colbuf, "@@%c", ch->pcdata->hicol );
             safe_strcat( MSL, buf, colbuf );
           }
           safe_strcat( MAX_STRING_LENGTH, buf, monitor_table[a].on_name );
         }

	 else
         {
            if ( !IS_NPC( ch ) )
            {
              sprintf( colbuf, "@@%c", ch->pcdata->dimcol );
              safe_strcat( MSL, buf, colbuf );
            }
            safe_strcat( MAX_STRING_LENGTH, buf, monitor_table[a].off_name);
         }

       }

     
       send_to_char( buf, ch );
      
       send_to_char( "\n\r@@yMONITOR <name> toggles the monitor channels.@@g\n\r", ch );
       return;
   }
   /* Search for monitor channel to turn on/off */
   for ( a = 0; monitor_table[a].min_level != 0; a++ )
   {
      if ( !strcmp( argument, monitor_table[a].name ) )
      {
         found = TRUE;
         if ( IS_SET( ch->pcdata->monitor, monitor_table[a].channel ) )
            REMOVE_BIT( ch->pcdata->monitor, monitor_table[a].channel );
         else
           SET_BIT( ch->pcdata->monitor, monitor_table[a].channel );
         break;
      }
   }
   if ( !found )
   {
      do_monitor( ch, "" );
      return;
   }
   send_to_char( "Ok, monitor channel toggled.\n\r", ch );
   return;
}


void monitor_chan( CHAR_DATA *ch, const char *message, int channel )
{
   char buf[MAX_STRING_LENGTH];
   DESCRIPTOR_DATA *d;
   int a;
   int level = 85;

   for ( a = 0; monitor_table[a].min_level != 0; a++ )
      if ( monitor_table[a].channel == channel )
      {
         level = monitor_table[a].min_level;
         break;
      }
         
   sprintf( buf, "%s[%7s]@@N %s@@N\n\r", 
      monitor_table[a].col, monitor_table[a].id, strip_out( message, "\n\r" ) );
   
   for ( d = first_desc; d; d = d->next )
   {
      if (
    	   d->connected == CON_PLAYING
           && !IS_NPC( d->character )
           && IS_SET( d->character->pcdata->monitor, channel )
           && level <= get_trust( d->character )
	   && (ch ? can_see( d->character, ch ) : TRUE ) )
      {
         send_to_char( buf, d->character );
      }

   }
   return;
}
 void do_reward( CHAR_DATA *ch, char *argument ) {
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    int value;
    
    
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Syntax: reward <victim> <value>\n\r",      ch );
	send_to_char( "Value being pos to give points, or neg to take points.\n\r",            ch );
	return;
    }

    /*
     * Snarf the value.
     */
    if ( !is_number( arg2 ) )
    {
	send_to_char( "Value must be numeric.\n\r", ch );
	return;
    }
    value = atoi( arg2 );

    if ( !str_cmp(arg1,"all") )
    {
	
	for ( victim = first_char;victim;victim = victim->next )
	{
		if ( IS_IMMORTAL(victim) || !victim->desc || victim->desc->connected != CON_PLAYING )
			continue;
    		sprintf( buf, "@@NYou have been rewarded @@y%3d @@aQuest Points@@N by @@m %s @@N!!!\n\r", value, ch->name );
    		send_to_char( buf, victim );
    		sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aQuest Points@@N!!!\n\r", victim->name, value );
    		send_to_char( buf, ch );

		victim->quest_points += value;

	}
	return;
    }
    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }
    
    sprintf( buf, "@@NYou have been rewarded @@y%3d @@aQuest Points@@N by @@m %s @@N!!!\n\r", value, ch->name );
    send_to_char( buf, victim );
    sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aQuest Points@@N!!!\n\r", victim->name, value );
    send_to_char( buf, ch );

    victim->quest_points += value;
    return;
}

void do_rankset( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    int value;


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

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
    send_to_char( "Syntax: rankset <victim> <value>\n\r",      ch );
    send_to_char( "Value being positive to award rank, negative to drain rank.\n\r",     ch );
    return;
}


 /*
  * Snarf the value.
  */
 if ( !is_number( arg2 ) )
 {
     send_to_char( "Value must be numeric.\n\r", ch );
     return;
 }
 value = atoi( arg2 );
if ( !str_cmp(arg1,"all") )
{
  send_to_char( "Cannot set all player's rank. Please target someone.\n\r", ch );
  return;
}
   if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
   {
       send_to_char( "They aren't here.\n\r", ch );
       return;
   }
  sprintf( buf, "@@NYou have been set to rank @@y%3d @@Nby @@m %s @@N!!!\n\r", value, ch->name );
  send_to_char( buf, victim );
  sprintf( buf, "@@NYou have set @@r%s to rank @@y%3d!!\n\r", victim->name, value );
  send_to_char( buf, ch );

  victim->rank = value*100-1;
  return;
}

void do_rangen( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char arg3 [MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH], buf2[MSL];
    int max;
    int min;
    int notice = -1;
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
    send_to_char( "Syntax: rangen [min] [max] [notice]\n\r",      ch );
    return;
}
    if (arg3[0] == '\0') notice = 0;

 if ( !is_number( arg1 ) )
 {
     send_to_char( "Min value must be numeric.\n\r", ch );
     return;
 }
 min = atoi( arg1 );
 
 if ( !is_number( arg2 ) )
 {
     send_to_char( "Max value must be numberic.\n\r", ch );
     return;
 }
 max = atoi( arg2 );
 if (!is_number(arg3) && (notice != 0))
 {
     send_to_char("\r\nNotice should be a \"1\" or non-existant.\r\n", ch );
     return;
 }
 
 if ( min > max)
 {
     send_to_char( "Max cannot be less than min.\n\r", ch );
     return;
 }
 if ( min == max)
 {
     send_to_char( "Values cannot be equal.\n\r", ch );
     return;
}
if ( min > 10000)
{
     send_to_char( "@@eERROR@@N: One or more values exceeds 10000.\n\r", ch); 
     return;
}
if ( max > 10000)
{
     send_to_char( "@@eERROR@@N: One or more values exceeds 10000.\n\r", ch);
     return;
}
  sprintf( buf, "You have generated the number: %3d.\n\r", number_range(min,max));
  send_to_char( buf, ch );
  sprintf( buf2, "@@a%s@@g has generated a random number!", ch->name );
  info(buf2, 0);
  return;
}
void do_ugenter( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  if(ch->z != Z_UNDER)
  {
	  move(ch,ch->x,ch->y,Z_UNDER);
	  sprintf(buf, "You have moved to the Underground.\n\r" );
	  send_to_char(buf, ch);
  } else {
	move(ch, ch->x, ch->y, Z_GROUND);
	sprintf(buf, "You have moved out of the underground.\n\r" );
	send_to_char(buf, ch);
  }
}

void do_spenter( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  if(ch->z != Z_SPACE_EARTH)
  {
          move(ch,ch->x,ch->y,Z_SPACE_EARTH);
          sprintf(buf, "You have moved to space.\n\r" );
          send_to_char(buf, ch);
  } else {
        move(ch, ch->x, ch->y, Z_GROUND);
        sprintf(buf, "You have moved out of apce.\n\r" );
        send_to_char(buf, ch);
  }
}


void do_cashreward( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    int value;


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

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
    send_to_char( "Syntax: cashreward <victim> <value>\n\r",      ch );
    send_to_char( "Value being pos to give points, or neg to take points.\n\r",            ch );
    return;
}

    /*
     * Snarf the value.
     */
    if ( !is_number( arg2 ) )
    {
        send_to_char( "Value must be numeric.\n\r", ch );
        return;
    }
    value = atoi( arg2 );

    if ( !str_cmp(arg1,"all") )
    {
        for ( victim = first_char;victim;victim = victim->next )
        {
                if ( IS_IMMORTAL(victim) || !victim->desc || victim->desc->connected != CON_PLAYING )
                        continue;
                sprintf( buf, "@@NYou have been rewarded @@y%3d @@aCash@@N by @@m %s @@N!!!\n\r", value, ch->name );
                send_to_char( buf, victim );
                sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aCash@@N!!!\n\r", victim->name, value );
                send_to_char( buf, ch );

                gain_money(victim, value);
        }
        return;
    }
    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
        send_to_char( "They aren't here.\n\r", ch );
      return;
  }

  sprintf( buf, "@@NYou have been rewarded @@y%3d @@aCash@@N by @@m %s @@N!!!\n\r", value, ch->name );
  send_to_char( buf, victim );
  sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aCash@@N!!\n\r", victim->name, value );
  send_to_char( buf, ch );

  gain_money(victim, value);
  return;
}
void do_xpreward( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    int value;
    
    
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Syntax: xpreward <victim> <value>\n\r",      ch );
	send_to_char( "Value being pos to give points, or neg to take points.\n\r",            ch );
	return;
    }

    /*
     * Snarf the value.
     */
    if ( !is_number( arg2 ) )
    {
	send_to_char( "Value must be numeric.\n\r", ch );
	return;
    }
    value = atoi( arg2 );

    if ( !str_cmp(arg1,"all") )
    {
	
	for ( victim = first_char;victim;victim = victim->next )
	{
		if ( IS_IMMORTAL(victim) || !victim->desc || victim->desc->connected != CON_PLAYING )
			continue;
    		sprintf( buf, "@@NYou have been rewarded @@y%3d @@aExperience Points@@N by @@m %s @@N!!!\n\r", value, ch->name );
    		send_to_char( buf, victim );
    		sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aExperience Points@@N!!!\n\r", victim->name, value );
    		send_to_char( buf, ch );

		victim->pcdata->experience += value;
	}
	return;
    }
    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }
    
    sprintf( buf, "@@NYou have been rewarded @@y%3d @@aExperience Points@@N by @@m %s @@N!!!\n\r", value, ch->name );
    send_to_char( buf, victim );
    sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aExperience Points@@N!!!\n\r", victim->name, value );
    send_to_char( buf, ch );

    victim->pcdata->experience += value;
    return;
}

void do_gpreward( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    int value;
    
    
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Syntax: gpreward <victim> <value>\n\r",      ch );
	send_to_char( "Value being pos to give points, or neg to take points.\n\r",            ch );
	return;
    }

    /*
     * Snarf the value.
     */
    if ( !is_number( arg2 ) )
    {
	send_to_char( "Value must be numeric.\n\r", ch );
	return;
    }
    value = atoi( arg2 );

    if ( !str_cmp(arg1,"all") )
    {

        for ( victim = first_char;victim;victim = victim->next )
        {
                if ( IS_IMMORTAL(victim) || !victim->desc || victim->desc->connected != CON_PLAYING )
                        continue;
                sprintf( buf, "@@NYou have been rewarded @@y%3d @@aGame Points@@N by @@m %s @@N!!!\n\r", value, ch->name );
                send_to_char( buf, victim );
                sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aGame Points@@N!!!\n\r", victim->name, value );
                send_to_char( buf, ch );

                victim->game_points += value;
        }
	return;
    }

    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }
    
    sprintf( buf, "@@NYou have been rewarded @@y%3d @@aGame Points@@N by @@m %s @@N!!!\n\r", value, ch->name );
    send_to_char( buf, victim );
    sprintf( buf, "@@NYou have rewarded @@r%s  @@y%3d @@aGame Points@@N!!!\n\r", victim->name, value );
    send_to_char( buf, ch );

    victim->game_points += value;
    return;
}

/* Expand the name of a character into a string that identifies THAT
   character within a room. E.g. the second 'guard' -> 2. guard */   
const char * name_expand (CHAR_DATA *ch)
{
	int count = 1;
	CHAR_DATA *rch;
	char name[MAX_INPUT_LENGTH]; /*  HOPEFULLY no mob has a name longer than THAT */

	static char outbuf[MAX_INPUT_LENGTH];	
	
	if (!IS_NPC(ch))
		return ch->name;
		
	one_argument (ch->name, name); /* copy the first word into name */
	
	if (!name[0]) /* weird mob .. no keywords */
	{
		strcpy (outbuf, ""); /* Do not return NULL, just an empty buffer */
		return outbuf;
	}
		
	for (rch = first_char; rch && (rch != ch);rch = rch->next)
		if (is_name (name, rch->name))
			count++;
			

	sprintf (outbuf, "%d.%s", count, name);
	return outbuf;
}

/*
 * For by Erwin S. Andreasen (4u2@aabc.dk)
 */
void do_for (CHAR_DATA *ch, char *argument)
{
	char range[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	bool fGods = FALSE, fMortals = FALSE, fMobs = FALSE, fEverywhere = FALSE, found;
	ROOM_INDEX_DATA *room, *old_room;
	CHAR_DATA *p, *p_next;
	int i;

	extern bool disable_timer_abort;

	disable_timer_abort = TRUE;

	argument = one_argument (argument, range);
	
	if (!range[0] || !argument[0]) /* invalid usage? */
	{
		do_help (ch, "for");
                disable_timer_abort = FALSE;
		return;
	}

	if (!str_prefix("quit", argument))
	{
		send_to_char ("Are you trying to crash the MUD or something?\n\r",ch);
                disable_timer_abort = FALSE;
		return;
	}


	if (!str_cmp (range, "all"))
	{
		fMortals = TRUE;
		fGods = TRUE;
	}
	else if (!str_cmp (range, "gods"))
		fGods = TRUE;
	else if (!str_cmp (range, "mortals"))
		fMortals = TRUE;
	else if (!str_cmp (range, "everywhere"))
		fEverywhere = TRUE;
	else
		do_help (ch, "for"); /* show syntax */

	/* do not allow # to make it easier */		
	if (fEverywhere && strchr (argument, '#'))
	{
		send_to_char ("Cannot use FOR EVERYWHERE with the # thingie.\n\r",ch);
                disable_timer_abort = FALSE;
		return;
	}
		
	if (fMobs && strchr (argument, '#'))
        {
                send_to_char ("Cannot use FOR MOBS with the # thingie.\n\r",ch);
                disable_timer_abort = FALSE;
                return;
        }

	if (strchr (argument, '#')) /* replace # ? */
	{ 
		for (p = first_char; p ; p = p_next)
		{
			p_next = p->next; /* In case someone DOES try to
AT MOBS SLAY # */
			found = FALSE;
			
			if (!(p->in_room) || (p == ch))
				continue;
			
			if (IS_NPC(p) && fMobs)
				found = TRUE;
			else if (!IS_NPC(p) && p->level >= LEVEL_IMMORTAL && fGods)
				found = TRUE;
			else if (!IS_NPC(p) && p->level < LEVEL_IMMORTAL && fMortals)
				found = TRUE;

			/* It looks ugly to me.. but it works :) */				
			if (found) /* p is 'appropriate' */
			{
				char *pSource = argument; /* head of buffer to be parsed */
				char *pDest = buf; /* parse into this */
				
				while (*pSource)
				{
					if (*pSource == '#') /* Replace # with name of target */
					{
						const char *namebuf = name_expand (p);
						
						if (namebuf) /* in case there is no mob name ?? */
							while (*namebuf) /* copy name over */
								*(pDest++) = *(namebuf++);

						pSource++;
					}
					else
						*(pDest++) = *(pSource++);
				} /* while */
				*pDest = '\0'; /* Terminate */
				
				/* Execute */
				old_room = ch->in_room;
				char_from_room (ch);
				char_to_room (ch,p->in_room);
				interpret (ch, buf);
				char_from_room (ch);
				char_to_room (ch,old_room);
				
			} /* if found */
		} /* for every char */
	}
	else /* just for every room with the appropriate people in it */
	{
		for (i = 0; i < MAX_KEY_HASH; i++) /* run through all the buckets */
			for (room = room_index_hash[i] ; room ; room = room->next)
			{
				found = FALSE;
				
				/* Anyone in here at all? */
				if (fEverywhere) /* Everywhere executes always */
					found = TRUE;
				else if (!first_char) /* Skip it if room is empty */
					continue;
					
					
				/* Check if there is anyone here of the requried type */
				/* Stop as soon as a match is found or there are no more ppl in room */
				for (p = first_char; p && !found; p = p->next)
				{

					if (p == ch) /* do not execute on oneself */
						continue;
						
					if (IS_NPC(p) && fMobs)
						found = TRUE;
					else if (!IS_NPC(p) && (p->level >= LEVEL_IMMORTAL) && fGods)
						found = TRUE;
					else if (!IS_NPC(p) && (p->level <= LEVEL_IMMORTAL) && fMortals)
						found = TRUE;
				} /* for everyone inside the room */
						
				if (found)
				{
					/* This may be ineffective.
Consider moving character out of old_room
					   once at beginning of command then moving back at the end.
					   This however, is more safe?
					*/
				
					old_room = ch->in_room;
					char_from_room (ch);
					char_to_room (ch, room);
					interpret (ch, argument);
					char_from_room (ch);
					char_to_room (ch, old_room);
				} /* if found */
			} /* for every room in a bucket */
	} /* if strchr */
disable_timer_abort = FALSE;
} /* do_for */


void do_otype( CHAR_DATA *ch, char *argument )
{
    extern int top_obj_index;
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    OBJ_INDEX_DATA *pObjIndex;
    int vnum;
    int nMatch;
    bool fAll;
    bool found;
    bool mailme = FALSE;
    if ( is_name( "mailme", argument ) )
      mailme = TRUE;
    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    if ( arg[0] == '\0' )
    {
      sprintf(buf,"Values for object types:\n\r");
      wide_table_printout(tab_item_types,buf+strlen(buf));
      send_to_char(buf,ch);
      return;
    }

    buf1[0] = '\0';
    fAll        = !str_cmp( arg, "all" );
    found       = FALSE;
    nMatch      = 0;

    /*
    * Yeah, so iterating over all vnum's takes 10,000 loops.
    * Get_obj_index is fast, and I don't feel like threading another link.
    * Do you?
    * -- Furey
    */
    for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    {
        if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
        {
            nMatch++;
                if ( fAll || is_name( arg, tab_item_types[(pObjIndex->item_type)-1 ].text ) )
            {
                found = TRUE;
                sprintf( buf, "<%2d> [%5d] %s\n\r", pObjIndex->level,
                    pObjIndex->vnum, pObjIndex->short_descr );
                if ( mailme )
                  safe_strcat(MAX_STRING_LENGTH, buf1, buf);
                else
                  send_to_char( buf, ch );
            }
        }
    }

    if ( !found )
    {
        send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
        return;
    }

    sprintf( buf, "Otype report for %s", arg );
    send_rep_out( ch, buf1, mailme, buf  );
    return;
}

void do_owear( CHAR_DATA *ch, char *argument )
{
    extern int top_obj_index;
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    OBJ_INDEX_DATA *pObjIndex;
    int vnum;
    int nMatch;
    bool fAll;
    bool found;
    bool mailme = FALSE;
    if ( is_name( "mailme", argument ) )
      mailme = TRUE;
    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
      sprintf(buf,"Values for wear slots:\n\r");
      wide_table_printout(tab_wear_flags,buf+strlen(buf));
      send_to_char(buf,ch);
      return;
    }
    buf1[0] = '\0';
    fAll        = !str_cmp( arg, "all" );
    found       = FALSE;
    nMatch      = 0;

    /*
    * Yeah, so iterating over all vnum's takes 10,000 loops.
    * Get_obj_index is fast, and I don't feel like threading another link.
    * Do you?
    * -- Furey
    */
    for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    {
        if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
        {
            nMatch++;
                if ( fAll || !str_infix ( arg,
bit_table_lookup(tab_wear_flags, pObjIndex->wear_flags) ) )
            {
                found = TRUE;
                sprintf( buf, "<%s> [%5d] [%3d] %s\n\r",
                  bit_table_lookup(tab_wear_flags, pObjIndex->wear_flags),
                   pObjIndex->vnum,
                   pObjIndex->level,
                     pObjIndex->short_descr );
                if ( mailme )
                  safe_strcat(MAX_STRING_LENGTH, buf1, buf);
                else
                  send_to_char( buf, ch );
            }
        }
    }

    if ( !found )
    {
        send_to_char( "Nothing like that in hell, earth, or heaven.\n\r",
ch );
        return;
    }

    sprintf( buf, "Owear report for %s", arg );
    send_rep_out( ch, buf1, mailme, buf  );
    return;
}

void do_osearch( CHAR_DATA *ch, char *argument )
{
    extern int top_obj_index;
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
    OBJ_INDEX_DATA *pObjIndex;
    int vnum;
	int level;
    int nMatch;
    bool found;
    bool mailme = FALSE;
    if ( is_name( "mailme", argument ) )
      mailme = TRUE;
    argument = one_argument( argument, arg1 );
	one_argument( argument, arg2 );
    if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number(arg2) )
    {
      sprintf(buf,"Values for wear slots:\n\r");
      wide_table_printout(tab_wear_flags,buf+strlen(buf));
      send_to_char(buf,ch);
	  send_to_char("Syntax: osearch <wear> <level>\n\r",ch);
      return;
    }
    buf1[0] = '\0';
    found       = FALSE;
    nMatch      = 0;
	level       = atoi( arg2 );

    /*
    * Yeah, so iterating over all vnum's takes 10,000 loops.
    * Get_obj_index is fast, and I don't feel like threading another link.
    * Do you?
    * -- Furey
    */
    for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    {
        if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
        {
            nMatch++;
                if ( pObjIndex->level == level &&
					!str_infix( arg1, bit_table_lookup(tab_wear_flags, pObjIndex->wear_flags) ) )
            {
                found = TRUE;
                sprintf( buf, "<%s> [%5d] [%3d] %s\n\r",
                  bit_table_lookup(tab_wear_flags, pObjIndex->wear_flags),
                   pObjIndex->vnum,
                   pObjIndex->level,
                     pObjIndex->short_descr );
                safe_strcat(MAX_STRING_LENGTH, buf1, buf);
            }
        }
    }

    if ( !found )
    {
        send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
        return;
    }

    sprintf( buf, "Osearch report for %s, level %d", arg1, level );
    send_rep_out( ch, buf1, mailme, buf  );
    return;
}

void do_areasave( CHAR_DATA *ch, char *argument )
{
   AREA_DATA *pArea;

  for ( pArea = first_area; pArea != NULL; pArea = pArea->next )
    area_modified( pArea );
  send_to_char( "Done.\n\r", ch );
  build_save_flush();

  return;
}

void do_smite (CHAR_DATA * ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char arg3[MAX_INPUT_LENGTH];
	CHAR_DATA *victim;
	int number;

	argument = one_argument (argument, arg1);
	argument = one_argument (argument, arg2);
	argument = one_argument (argument, arg3);
	number = atoi(arg2);
	if (arg1[0] == '\0' || arg2[0] == '\0')
	{ 
		send_to_char ("Syntax:  smite <person> <amount of damage> <send notice? (yes or no)>\n\r", ch);
		return;
	}
	if ((victim = get_char_world (ch, arg1)) == NULL)
	{ 
		sprintf (buf, "%s is not connected.\n\r", capitalize (arg1));
		send_to_char (buf, ch);
		return;
	}
	if ( get_trust(victim) >= get_trust(ch) )
	{ 
		sprintf (buf, "%s would not appreciate that.\n\r", capitalize (arg1));
		send_to_char (buf, ch);
		return;
	}
	if (number == 0)
	{
		send_to_char("At least do 1 point of damage, shesh!", ch);
		return;
	}
	if (number < -1)
	{
		sprintf (buf, "Your doing %d points of damage would HEAL the target, moron!", number);
		send_to_char(buf, ch);
		return;
	}
	if (ch == victim)
	{
		send_to_char("Why would you wanna smite yourself?!\n\r", ch);
		return;
	}
	victim->hit -= number;
        if( strcmp(ch->name, "Mannaroth") == 0)
	{
	sprintf(buf, "@@c%s @@Worders @@RB@@ea@@Rl@@er@@Ro@@eg @@R#@@e1@@R3@@e9@@N @@Wto whip you!@@c(@@a%d@@c)@@N\n\r", ch->name, number );
	send_to_char( buf, victim );
	sprintf(buf, "@@RB@@ea@@Rl@@er@@Ro@@eg @@R#@@e1@@R3@@e9@@W, sent by @@c%s@@W, puts @@c%s@@W over his knee and whips him!@@N\n\r", ch->name, victim->name );
	act( buf, victim, NULL, NULL, TO_ROOM );
	}
	else if (strcmp(ch->name, "Demortes") == 0)
	{
		sprintf(buf, "@@eDemortes@@d conjures up your shadow, and it starts punching you!@@n (Damage: %d)\n\r", number );
		send_to_char( buf, victim);
		sprintf(buf, "@@e%s@@d is being punched by his own shadow!@@n\n\r", victim->name);
		act( buf, victim, NULL, NULL, TO_ROOM );
	}
	else if (!strcmp(ch->name, "Rollibard"))
	{
		sprintf(buf, "Rollibard throws a @@eF@@Ri@@er@@Re@@eb@@Ra@@el@@Rl@@n at you. (Damage: %d)\n\r", number );
		send_to_char( buf, victim );
		sprintf(buf, "Rollibard threw a @@eF@@Ri@@er@@Re@@eb@@Ra@@el@@Rl@@W at %s.", victim->name);
		act( buf, victim, NULL, NULL, TO_ROOM );
	}
	else
	{
	sprintf( buf, "@@WA burst of astroids sent by @@c%s @@Wcrashes down on you! @@c(@@a%d@@c)@@N\n\r", ch->name, number );
	send_to_char( buf, victim );
	sprintf( buf, "@@WA burst of astroids sent by %s crashes down on %s@@W!@@N\n\r", ch->name, victim->name );
	act( buf, victim, NULL, NULL, TO_ROOM );
	}	
	send_to_char( "@@eDirect hit!\n\r@@N", ch );
	if(victim->hit <=0)
	{
		act( "$N @@dis @@2@@aDEAD@@N@@d!!@@N", ch, NULL, victim, TO_NOTVICT );
		act( "@@dYou have been @@2@@aKILLED@@N@@d!!@@N\n\r", ch, NULL, victim, TO_VICT );
			raw_kill(victim, ch->name);
		victim->dead = TRUE;
	}
	if ( arg3[0] != '\0' )
	{
		if( strcmp(ch->name, "Mannaroth") == 0 )
		{
		sprintf( buf, "@@a%s@@g has been spanked by @@e%s@@N's @@RB@@ea@@Rl@@er@@Ro@@eg@@g!@@N", victim->name, ch->name );
		info( buf, 0);
		} else if ( !strcmp(ch->name, "Demortes")) {
		sprintf ( buf, "@@d%s's shadow punched them! Demortes @@esits there and grins@@d.", victim->name);
		info( buf, 0);
		} else if (!strcmp(ch->name, "Rollibard")) {
		sprintf ( buf, "@@eRollibard's fireball hits @@p%s@@e and burns their skin.", victim->name);
		info( buf, 0);
		} else if (!strcmp(ch->name, "Aldrsul")) {
		sprintf(buf, "@@bA@@Gl@@bd@@Gr@@bs@@Gu@@bl @@Wdraws a @@l\"@@pPlasma Rifle@@l\" @@Wand fires it into %s's head, which promptly erupts in a shower of @@eB@@Rl@@eo@@Ro@@ed@@N.", victim->name);
		info( buf, 0);
		} else {
		sprintf( buf, "@@a%s@@g has been smited by @@e%s@@g!", victim->name, ch->name );
		info( buf, 0);  
		}
	}
	return;
}

void do_fslay( CHAR_DATA *ch, char *argument )
{   
    {
    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    char arg[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];

    argument = one_argument( argument, arg );
    one_argument( argument, arg2 );
    if ( arg[0] == '\0' )
    {   
        send_to_char( "Syntax: [Char] [Type]\n\r", ch );
        send_to_char( "Types: Skin, Slit, Immolate, Demon, Shatter, Deheart, Pounce, Fslay.\n\r", ch);
        return;
    }

    if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {   
        send_to_char( "They aren't here.\n\r", ch );
        return;
    }

    if ( ch == victim )
    {   
        send_to_char( "Suicide is a mortal sin.\n\r", ch );
        return;
    }

    if ( !IS_NPC(victim) && get_trust( victim ) >= get_trust( ch ) )
    {   
        send_to_char( "You failed.\n\r", ch );
        return;
    }

    if ( !str_cmp( arg2, "skin" ) )
    {
    act( "You rip the flesh from $N and send his soul to the fiery depths of hell.", ch, NULL, victim, TO_CHAR );
    act( "Your flesh has been torn from your bones and your bodyless soul now watches your bones incenerate in the fires ofhell.", ch, NULL, victim,TO_VICT );
    act( "$n rips the flesh off of $N, releasing his soul into the fiery depths of hell.", ch, NULL, victim, TO_NOTVICT );
        }

        else if ( !str_cmp( arg2, "deheart" ) )
        {
        act( "You rip through $N's chest and pull out $M beating heart in your hand.", ch, NULL, victim, TO_CHAR );
        act( "You feel a sharp pain as $n rips into your chest and pulls our your beating heart in $M hand.", ch, NULL,victim, TO_VICT );
        act( "Specks of blood hit your face as $n rips through $N's chest pulling out $M's beating heart.", ch, NULL, victim,TO_NOTVICT );
        }

    else if ( !str_cmp( arg2, "immolate" ) )
    {
      act( "Your fireball turns $N into a blazing inferno.",  ch, NULL, victim, TO_CHAR    );
      act( "$n releases a searing fireball in your direction.", ch, NULL, victim, TO_VICT    );
      act( "$n points at $N, who bursts into a flaming inferno.",  ch, NULL, victim, TO_NOTVICT );
    }

    else if ( !str_cmp( arg2, "shatter" ) )
    {
      act( "You freeze $N with a glance and shatter the frozen corpse into tiny shards.",  ch, NULL, victim, TO_CHAR    );
      act( "$n freezes you with a glance and shatters your frozen body into tiny shards.", ch, NULL, victim, TO_VICT    );
      act( "$n freezes $N with a glance and shatters the frozen body into tiny shards.",  ch, NULL, victim, TO_NOTVICT );
    }

    else if ( !str_cmp( arg2, "demon" ) )
    {
      act( "You gesture, and a slavering demon appears.  With a horrible grin, the foul creature turns on $N, who screams inpanic before being eaten alive.",  ch, NULL, victim, TO_CHAR );
      act( "$n gestures, and a slavering demon appears.  The foul creature turns on you with a horrible grin.   You scream inpanic before being eaten alive.",  ch, NULL, victim, TO_VICT );
      act( "$n gestures, and a slavering demon appears.  With a horrible grin, the foul creature turns on $N, who screams inpanic before being eaten alive.",  ch, NULL, victim, TO_NOTVICT );
    }

    else if ( !str_cmp( arg2, "pounce" ) )
    {
      act( "Leaping upon $N with bared fangs, you tear open $S throat and toss the corpse to the ground...",  ch, NULL,victim, TO_CHAR );
      act( "In a heartbeat, $n rips $s fangs through your throat!  Your blood sprays and pours to the ground as your lifeends...", ch, NULL, victim, TO_VICT );
      act( "Leaping suddenly, $n sinks $s fangs into $N's throat.  As blood sprays and gushes to the ground, $n tosses $N'sdying body away.",  ch, NULL, victim, TO_NOTVICT );
    }
    else if ( !str_cmp( arg2, "slit" ))
    {
      act( "You calmly slit $N's throat.", ch, NULL, victim, TO_CHAR );
      act( "$n reaches out with a clawed finger and calmly slits your throat.", ch, NULL, victim, TO_VICT );
      act( "A claw extends from $n's hand as $M calmly slits $N's throat.", ch, NULL, victim, TO_NOTVICT );
    }

    else if ( !str_cmp( arg2, "fslay" ))
    {
      act( "You point at $N and fall down laughing.", ch, NULL, victim, TO_CHAR );
      act( "$n points at you and falls down laughing. How embaressing!.", ch, NULL, victim, TO_VICT );
      act( "$n points at $N and falls down laughing.", ch, NULL, victim, TO_NOTVICT );
      return;
    }

    else
    {
      act( "You slay $N in cold blood!",  ch, NULL, victim, TO_CHAR    );
      act( "$n slays you in cold blood!", ch, NULL, victim, TO_VICT    );
      act( "$n slays $N in cold blood!",  ch, NULL, victim, TO_NOTVICT );
    }


    victim->hit    = victim->max_hit - victim->max_hit + 1;
    sprintf(buf, "%s 3001", victim->name);
    update_pos( victim);
    return;
}
}

void do_oflags( CHAR_DATA *ch, char *argument )
{
    extern int top_obj_index;
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    OBJ_INDEX_DATA *pObjIndex;
    int vnum;
    int nMatch;
    bool fAll;
    bool found;
    bool mailme = FALSE;
    if ( is_name( "mailme", argument ) )
      mailme = TRUE;
    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
      sprintf(buf,"Values for obj flags:\n\r");
      wide_table_printout(tab_obj_flags,buf+strlen(buf));
      send_to_char(buf,ch);
      return;
    }
    buf1[0] = '\0';
    fAll        = !str_cmp( arg, "all" );
    found       = FALSE;
    nMatch      = 0;

    /*
    * Yeah, so iterating over all vnum's takes 10,000 loops.
    * Get_obj_index is fast, and I don't feel like threading another link.
    * Do you?
    * -- Furey
    */
    for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    {
        if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
        {
            nMatch++;
            if ( fAll || !str_infix ( arg, bit_table_lookup( tab_obj_flags, pObjIndex->extra_flags ) ) )
            {
               found = TRUE;
               sprintf( buf, "[%5d] [%3d] %s\n\r",
                  pObjIndex->vnum,
                  pObjIndex->level,
                  pObjIndex->short_descr );
               safe_strcat(MAX_STRING_LENGTH, buf1, buf);
            }
        }
    }

    if ( !found )
    {
        send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
        return;
    }

    sprintf( buf, "Oflags report for %s", arg );
    send_rep_out( ch, buf1, mailme, buf  );
    return;
}
	
void do_olist( CHAR_DATA *ch, char *argument )
{
	int vnum;
	OBJ_DATA *obj;
	char buf[MSL];

	for ( vnum = ch->in_room->area->min_vnum;vnum < ch->in_room->area->max_vnum;vnum++ )
	{
		if ( get_obj_index(vnum) == NULL )
			continue;

		if ( ( obj = create_object( get_obj_index(vnum), 1 ) ) == NULL )
			continue;
		sprintf( buf, "[%5d] [%3d] %s\n", vnum, obj->level, obj->short_descr );
		send_to_char( buf, ch );
		extract_obj( obj );
	}
	return;
}

void do_setwcode( CHAR_DATA *ch, char *argument )
{
	int value;

	if ( IS_NPC(ch) )
		return;

	if ( ch->in_room->vnum != ROOM_VNUM_WMAP )
	{
		send_to_char( "You should be in the wilderness to do that.\n\r", ch );
		return;
	}
	if ( is_number(argument) )
		value = atoi(argument);
	else
	{
		for ( value=0;value<SECT_MAX;value++ )
		{
			if ( !str_cmp(argument,wildmap_table[value].name ) )
			{
				map_table.type[ch->x][ch->y][ch->z] = value;
				return;
			}
		}
		send_to_char( "Invalid sector value.\n\r", ch );
		return;
	}
	if ( value == 9997 )
	{
		int j,m,n,k,x,y,i;
		j = number_range(MAX_MAPS / 40,MAX_MAPS / 24);    /* Generate Forests */

		for ( i = 0;i<j;i++ )
		{
			m = number_range(1,MAX_MAPS/15);
			n = number_range(3,MAX_MAPS-3);
			k = number_range(3,MAX_MAPS-3);
			for ( x = n-m;x<n;x++ )
			{
				if ( x == number_fuzzy(n) )
					continue;
				if ( x == number_fuzzy(n-m) )
					continue;
				for ( y = k-m;y < k;y++ )
				{
					if ( x < 0 || x > MAX_MAPS || y < 0 || y > MAX_MAPS )
						continue;
					if ( y == number_fuzzy(k) )
						continue;
					if ( y == number_fuzzy(k-m) )
						continue;
					if ( map_table.type[x][y][1] == SECT_FIELD || map_table.type[x][y][1] == SECT_SAND )
						map_table.type[x][y][1] = SECT_FOREST;
				}
			}
		}

	}
	else if ( value == 9996 )
	{
		int j,m,n,k,x,y,i;
		j = number_range(MAX_MAPS / 40,MAX_MAPS / 24);    /* Generate Snow */

		for ( i = 0;i<j;i++ )
		{
			m = number_range(1,MAX_MAPS/15);
			n = number_range(3,MAX_MAPS-3);
			k = number_range(3,MAX_MAPS-3);
			for ( x = n-m;x<n;x++ )
			{
				if ( x == number_fuzzy(n) )
					continue;
				if ( x == number_fuzzy(n-m) )
					continue;
				for ( y = k-m;y < k;y++ )
				{
					if ( x < 0 || x > MAX_MAPS || y < 0 || y > MAX_MAPS )
						continue;
					if ( y == number_fuzzy(k) )
						continue;
					if ( y == number_fuzzy(k-m) )
						continue;
					if ( map_table.type[x][y][1] == SECT_FIELD )
						map_table.type[x][y][1] = SECT_SNOW;
				}
			}
		}

	}
	else if ( value == 9998 )
	{
		if ( planet_table[ch->z].terrain != TERRAIN_NONE )
			create_map(ch,planet_table[ch->z].terrain);
//		save_map();
		return;
	}
	else if ( value >= SECT_MAX )
	{
		send_to_char( "Invalid sector type.\n\r", ch );
		return;
	}
	map_table.type[ch->x][ch->y][ch->z] = value;
	return;
}

void do_listbuildings( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	char buf[MSL];
	bool imm = IS_IMMORTAL(ch);
	int i = 0,x=0;

	for ( bld = first_building;bld;bld = bld->next )
	{
		i++;
		if ( ( imm && ( ( argument[0] == '\0' && str_cmp(bld->owned,"nobody") ) || !str_cmp(bld->owned,argument) || !str_cmp(bld->name,argument) )  )
		|| ( !imm && !str_cmp(bld->owned,argument) ) )
		{
			x++;
			if ( imm )
				sprintf( buf, "@@r%d@@d.@@G %-20s at (%-3d,%-3d,%-3d) [%d]  -> %s\n", i, bld->name, bld->x, bld->y, bld->z, bld->level, bld->owned );
			else
				sprintf( buf, "@@r%d@@d.@@G %-20s at (%-3d,%-3d) [%d]\n", x, bld->name, bld->x, bld->y, bld->level );

			send_to_char( buf, ch );
		}
	}
	sprintf( buf, "\n\r%d/%d buildings found.\n\r", x,i );
	send_to_char(buf, ch );
	return;
}
void do_killbuilding( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	BUILDING_DATA *bld_next;
	BUILDING_DATA *first=NULL;
	int num = 1;

	if ( argument[0] == '\0' )
	{
		send_to_char( "Kill who's buildings? Or what number?\n\r", ch );
		return;
	}
	if ( !is_number(argument) )
	{
		num = 0;
		for ( bld = first_building;bld;bld = bld_next )
		{
			bld_next = bld->next;
			if ( str_cmp(bld->owned,argument) )
				continue;
			if (first==NULL)
				first = bld;
			if ( bld->type == BUILDING_HQ ) 
				num++;
//			else if ( build_table[bld->type].act != BUILDING_UNATTACHED )
//				continue;
//			check_building_destroyed(bld);
//			SET_BUILDING(bld->value[0],INST_NOCHECK);
			extract_building(bld,TRUE);
		}
//		if ( num == 0 && first ) {
//			check_building_destroyed(first);extract_building(first,TRUE);}
		save_buildings();
		send_to_char( "Buildings destroyed.\n\r", ch );
		return;
	}
	else
	{
		num = atoi(argument);
		if ( num < 1 )
			return;
		for ( bld = first_building;bld;bld = bld_next )
		{
			bld_next = bld->next;
			if ( num < 10000 )
			{
				num--;
				if ( num == 0 )
				{
					check_building_destroyed(bld);
					extract_building(bld,TRUE);
					send_to_char( "Building destroyed.\n\r", ch );
					save_buildings();
					return;
				}
			}
			else
			{
				if ( bld->type == num-10000 )
				{
					check_building_destroyed(bld);
					extract_building(bld,TRUE);
				}
			}
		}
		save_buildings();
		if ( num > 10000 )
			return;
	}
	send_to_char( "No building found.\n\r", ch );
	return;
}
void do_bset( CHAR_DATA *ch, char *argument )
{
	char arg[MSL];
	char arg2[MSL];
	BUILDING_DATA *bld;
	BUILDING_DATA *bld_next;
	int i;
	bool active = FALSE;

	if ( argument[0] == '\0' )
	{
		send_to_char( "\n\r", ch );
        	send_to_char( "        @@gBset <@@aBuilding ID/Owner@@g> <@@aField@@g> <@@aValue@@g>@@N\n\r",     ch );
        	send_to_char( "\n\r", ch );
        	send_to_char( "@@c+--------------- @@dNormal Fields@@c ---------------+@@N\n\r",     ch );
        	send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
        	send_to_char( "@@c| @@gLevel                                       @@c|@@N\n\r",     ch );
        	send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
		send_to_char( "@@c+------------- @@dNo-Value Fields@@c ---------------+@@N\n\r",  ch );
        	send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
        	send_to_char( "@@c| @@gComplete                                    @@c|@@N\n\r",     ch );
        	send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
		send_to_char( "@@c+-------------- @@dString Fields@@c ----------------+@@N\n\r",  ch );
		send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );
		send_to_char( "@@c| @@gOwner                                       @@c|@@N\n\r",  ch );   
		send_to_char( "@@c|                                             @@c|@@N\n\r",     ch );   
        	send_to_char( "@@c+---------------------------------------------+@@N\n\r",     ch );
		return;
	}
	argument = one_argument(argument,arg);
	argument = one_argument(argument, arg2);
	if ( !str_cmp(arg2,"owner") )
		if ( get_ch(argument) )
			active = TRUE;

	if ( is_number(arg) )
	{
		i = atoi(arg);
		for ( bld = first_building;bld;bld = bld_next )
		{
			bld_next = bld->next;
			i--;
			if ( i == 0 )
			{
				if ( !str_cmp(arg2, "complete") )
				{
					send_to_char( "Building completed!\n\r", ch );
					bld->cost = 0;
					bld->hp = bld->maxhp;
					bld->shield = bld->maxshield;
				}
				else if ( !str_cmp(arg2, "owner") )
				{
					free_string(bld->owned);
					bld->owned = str_dup(argument);
					bld->owner = NULL;
					activate_building(bld,active);
				}
				else if ( !str_cmp(arg2, "level") )
				{
					int level;
					if ( ( level = atoi(argument) ) < 1 || level > MAX_BUILDING_LEVEL )
					{
						send_to_char( "Level must be from 1 to 10.\n\r", ch );
						return;
					}
					bld->level = level;
				}
				else if ( !str_cmp(arg2, "v0") )
					bld->value[0] = atoi(argument);
				else if ( !str_cmp(arg2, "v1") )
					bld->value[1] = atoi(argument);
				else if ( !str_cmp(arg2, "v2") )
					bld->value[2] = atoi(argument);
				else if ( !str_cmp(arg2, "v3") )
					bld->value[3] = atoi(argument);
				else if ( !str_cmp(arg2, "v4") )
					bld->value[4] = atoi(argument);
				else if ( !str_cmp(arg2, "v5") )
					bld->value[5] = atoi(argument);
				else if ( !str_cmp(arg2, "v6") )
					bld->value[6] = atoi(argument);
				else if ( !str_cmp(arg2, "v7") )
					bld->value[7] = atoi(argument);
				else if ( !str_cmp(arg2, "v8") )
					bld->value[8] = atoi(argument);
				else if ( !str_cmp(arg2, "v9") )
					bld->value[9] = atoi(argument);
				else if ( !str_cmp(arg2, "v10") )
					bld->value[10] = atoi(argument);
				save_buildings();
				return;
			}
		}
	}
	else
	{
		bool all = !str_cmp(arg,"all");
		bool here = !str_cmp(arg,"here");
		for ( bld = first_building;bld;bld = bld_next )
		{
			bld_next = bld->next;
			if (  !str_cmp(arg,bld->owned) || all || ( here && bld == ch->in_building ) )
			{
				if ( !str_cmp(arg2, "complete") )
				{
					send_to_char( "Building completed!\n\r", ch );
					bld->hp = bld->maxhp;
					bld->cost = 0;
					bld->shield = bld->maxshield;
				}
				else if ( !str_cmp(arg2, "mhp") )
				{
					bld->maxhp *= 1.3;
				}
				else if ( !str_cmp(arg2, "owner") )
				{
					free_string(bld->owned);
					bld->owned = str_dup(argument);
					bld->owner = NULL;
					activate_building(bld,active);
				}
				else if ( !str_cmp(arg2, "level") )
				{
					int level;
					if ( ( level = atoi(argument) ) < 1 || level > MAX_BUILDING_LEVEL )
					{
						send_to_char( "Level must be from 1 to 10.\n\r", ch );
						return;
					}
					bld->level = level;
				}
				else if ( !str_cmp(arg2, "v0") )
					bld->value[0] = atoi(argument);
				else if ( !str_cmp(arg2, "v1") )
					bld->value[1] = atoi(argument);
				else if ( !str_cmp(arg2, "v2") )
					bld->value[2] = atoi(argument);
				else if ( !str_cmp(arg2, "v3") )
					bld->value[3] = atoi(argument);
				else if ( !str_cmp(arg2, "v4") )
					bld->value[4] = atoi(argument);
				else if ( !str_cmp(arg2, "v5") )
					bld->value[5] = atoi(argument);
				else if ( !str_cmp(arg2, "v6") )
					bld->value[6] = atoi(argument);
				else if ( !str_cmp(arg2, "v7") )
					bld->value[7] = atoi(argument);
				else if ( !str_cmp(arg2, "v8") )
					bld->value[8] = atoi(argument);
				else if ( !str_cmp(arg2, "v9") )
					bld->value[9] = atoi(argument);
				else if ( !str_cmp(arg2, "v10") )
					bld->value[10] = atoi(argument);
			}
		}
		save_buildings();
		return;
	}
	send_to_char( "No building found.\n\r", ch );	
	return;
}

void do_vload( CHAR_DATA *ch, char *argument )
{
    VEHICLE_DATA *vhc;
    int i;

    if ( argument[0] == '\0' || !is_number(argument) )
    {
	char buf[MSL];
	for ( i=0;i<MAX_VEHICLE;i++ )
	{
		sprintf( buf, "%d. %s\n\r", i, vehicle_desc[i] );
		send_to_char(buf,ch);
	}
	return;
    }
    if ( (i=atoi(argument) ) < 0 || i >= MAX_VEHICLE )
    {
	send_to_char( "Invalid vehicle number.\n\r", ch );
	return;
    }
    vhc = create_vehicle(i);
    vhc->range = 5;
    move_vehicle(vhc,ch->x,ch->y,ch->z);
    vhc->fuel = 10000;
    vhc->max_fuel = 10000;
    vhc->ammo = 10000;
    vhc->max_ammo = 10000;
    vhc->ammo_type = 5;
    vhc->hit = 10000;
    vhc->max_hit = 10000;
    vhc->speed = 4;
    send_to_loc( "A Vehicle appears in the area.\n\r", ch->x, ch->y,ch->z );
    return;
}

void do_repop( CHAR_DATA *ch, char *argument )
{
	rooms_update();
	building_update();
	return;
}

void do_mmake( CHAR_DATA *ch, char *argument )
{
	if ( !is_number(argument) )
	{
		send_to_char( "Value must be numeric.\n\r", ch );
		return;
	}
	gain_money(ch,atoi(argument));
	return;
}

void do_backup ( CHAR_DATA *ch, char *argument )
{
	if ( !str_cmp(argument,"save") )
	{
		save_buildings_b( 0 );
		save_objects(3);
		save_vehicles(1);
		send_to_char( "Buildings, vehicles and items backed up.\n\r", ch );
	}
	else if ( !str_cmp(argument,"load") )
	{
		BUILDING_DATA *bld;
		BUILDING_DATA *bld_next;
		OBJ_DATA *obj;
		OBJ_DATA *obj_next;

		while ( first_vehicle )
			extract_vehicle(first_vehicle,TRUE);
		load_vehicles(1);
		for ( bld = first_building;bld;bld = bld_next )
		{
			bld_next = bld->next;
			extract_building(bld,TRUE);
		}
		load_buildings_b( 0 );
		for ( obj = first_obj;obj;obj = obj_next )
		{
			obj_next = obj->next;
			move_obj(obj,0,0,1);
			extract_obj(obj);
		}
		load_sobjects(3);
		if ( ch != NULL )
			send_to_char( "Buildings, vehicles and items loaded from backup.\n\r", ch );
		else
			info( "The buildings, vehicles and items have been reloaded from the backup file!",0);
	}
	else if ( !str_cmp(argument,"savefest") )
	{
		save_buildings_b( 1 );
		save_vehicles( 2 );
		save_objects( 4 );
		send_to_char( "Buildings, objects and items backed up.\n\r", ch );
	}
	else if ( !str_cmp(argument,"loadfest") )
	{
		BUILDING_DATA *bld;
		BUILDING_DATA *bld_next;
		for ( bld = first_building;bld;bld = bld_next )
		{
			bld_next = bld->next;
			extract_building(bld,TRUE);
		}
		load_buildings_b( 1 );
		while ( first_vehicle )
			extract_vehicle(first_vehicle,TRUE);
		load_vehicles(2);
		while ( first_obj )
			extract_obj(first_obj);
		load_sobjects(4);
		send_to_char( "Buildings, items and vehicles loaded from backup.\n\r", ch );
	}
	else
		send_to_char( "Options are: Save, Load, Savefest, Loadfest.\n\r", ch );
	return;
}

void do_objclear( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA *obj;
	OBJ_DATA *obj_next;
	BUILDING_DATA *bld;
	CHAR_DATA *wch;
	int x,y;
	bool ok[MAX_MAPS][MAX_MAPS];

	if ( str_cmp(argument,"all") )
	{
		send_to_char( "Syntax: clearobjects all\n\r", ch );
		return;
	}

	for ( x = 0;x < MAX_MAPS;x++ )
		for ( y = 0;y < MAX_MAPS; y++ )
			ok[x][y] = FALSE;

	for ( bld = first_building;bld;bld = bld->next )
	{
		if ( bld->x < 0 || bld->y < 0 )
			continue;
		if ( ( wch = get_ch(bld->owned) ) != NULL || bld->type == BUILDING_WAREHOUSE )
			ok[bld->x][bld->y] = TRUE;
	}
	for ( obj = first_obj;obj;obj = obj_next )
	{
		obj_next = obj->next;
		if ( !ok[obj->x][obj->y] )
			extract_obj(obj);
		else if ( obj->in_building == NULL && obj->carried_by == NULL )
			extract_obj(obj);
	}
	send_to_char( "Old objects cleared.\n\r", ch );
	return;
}
void do_savemap( CHAR_DATA *ch, char *argument )
{
	save_map();
	send_to_char( "Done\n\r", ch );
	return;
}

void do_deletefromscores( CHAR_DATA *ch, char *argument )
{
	int i;
	bool found = FALSE;
	for ( i = 0;i<100;i++ )
	{
		if (!str_cmp(score_table[i].name,argument))
		{
			score_table[i].kills = 0;
			score_table[i].buildings = 0;
			score_table[i].time = 0;
			found = TRUE;
		}
	}
	save_scores();
	if (found)
		send_to_char( "Player deleted from high scores.\n\r", ch );
	else
		send_to_char( "No such player found.\n\r", ch );
	return;
}

void do_oarmortype( CHAR_DATA *ch, char *argument )
{
	char buf_all[MSL];
	char buf_bullet[MSL];
	char buf_blast[MSL];
	char buf_acid[MSL];
	char buf_fire[MSL];
	char buf_laser[MSL];
	OBJ_INDEX_DATA *obj;
	int i;

	buf_all[0] = '\0';
	buf_bullet[0] = '\0';
	buf_blast[0] = '\0';
	buf_acid[0] = '\0';
	buf_fire[0] = '\0';
	buf_laser[0] = '\0';

	for ( i = MIN_LOAD_OBJ;i < MAX_LOAD_OBJ;i++ )
	{
//		if ( get_obj_index(i) == NULL )
//			break;
//		if ( ( obj = create_object(get_obj_index(i),0) ) == NULL )
		if ( ( obj = get_obj_index(i) ) == NULL )
			continue;
		if ( obj->item_type != ITEM_ARMOR )
			continue;
		if ( obj->value[0] == -2 )
			sprintf( buf_all+strlen(buf_all), "<%2d> [%d] [%s] %s\n\r", obj->level, i, bit_table_lookup(tab_wear_flags, obj->wear_flags), obj->short_descr );
		else if ( obj->value[0] == 1 )
			sprintf( buf_bullet+strlen(buf_bullet), "<%2d> [%d] [%s] %s\n\r", obj->level, i, bit_table_lookup(tab_wear_flags, obj->wear_flags), obj->short_descr );
		else if ( obj->value[0] == 2 )
			sprintf( buf_blast+strlen(buf_blast), "<%2d> [%d] [%s] %s\n\r", obj->level, i, bit_table_lookup(tab_wear_flags, obj->wear_flags), obj->short_descr );
		else if ( obj->value[0] == 3 )
			sprintf( buf_acid+strlen(buf_acid), "<%2d> [%d] [%s] %s\n\r", obj->level, i, bit_table_lookup(tab_wear_flags, obj->wear_flags), obj->short_descr );
		else if ( obj->value[0] == 4 )
			sprintf( buf_fire+strlen(buf_fire), "<%2d> [%d] [%s] %s\n\r", obj->level, i, bit_table_lookup(tab_wear_flags, obj->wear_flags), obj->short_descr );
		else if ( obj->value[0] == 5 )
			sprintf( buf_laser+strlen(buf_laser), "<%2d> [%d] [%s] %s\n\r", obj->level, i, bit_table_lookup(tab_wear_flags, obj->wear_flags), obj->short_descr );
	}
	send_to_char( "All:\n\r", ch );
	send_to_char(buf_all,ch);
	send_to_char( "Bulletproof:\n\r", ch );
	send_to_char(buf_bullet,ch);
	send_to_char( "Blastproof:\n\r", ch );
	send_to_char(buf_blast,ch);
	send_to_char( "Acidproof:\n\r", ch );
	send_to_char(buf_acid,ch);
	send_to_char( "Fireproof:\n\r", ch );
	send_to_char(buf_fire,ch);
	send_to_char( "Laserproof:\n\r", ch );
	send_to_char(buf_laser,ch);
	return;
}

void do_setalliance( CHAR_DATA *ch, char *argument )
{
	char arg1[MSL];
	char arg2[MSL];
	char arg3[MSL];
	int i;

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

	if ( arg1[0] == '\0' || arg2[0] == '\0' || argument[0] == '\0' )
	{
		send_to_char( "Syntax: setalliance new <leader> <name>\n\r        setalliance set <number> <leader/name/kills/members> <value>\n\r", ch );
		return;
	}
	if ( !str_cmp(arg1,"new") )
	{
		if ( nocol_strlen(argument) > 30 )
		{
			send_to_char( "Name too long. Try again.\n\r", ch );
			return;
		}
		for ( i = 0;i< MAX_ALLIANCE;i++ )
		{
			if ( alliance_table[i].name == NULL )
			{
				smash_tilde(argument);
				if ( alliance_table[i].leader != NULL )
					free_string(alliance_table[i].leader);
				alliance_table[i].leader = str_dup(arg2);
				alliance_table[i].name = str_dup(argument);
				alliance_table[i].members = 0;
				alliance_table[i].kills = 0;
				send_to_char( "Alliance added!\n\r", ch );
				save_alliances();
				return;
			}
		}
		send_to_char( "Error! No alliance slot found!\n\r", ch );
		return;
	}
	else if ( !str_cmp(arg1,"set") )
	{
		argument = one_argument(argument,arg3);
		if ( !is_number(arg2) )
		{
			send_to_char( "2nd argument must be numeric.\n\r", ch );
			return;
		}
		i = atoi(arg2);
		if ( i < 0 )
		{
			send_to_char( "Invalid alliance number.\n\r", ch );
			return;
		}
		if ( alliance_table[i].name == NULL )
		{
			send_to_char( "There is no such alliance.\n\r", ch );
			return;
		}
		smash_tilde(argument);
		if ( !str_cmp(arg3,"leader") )
		{
			if ( alliance_table[i].leader != NULL )
				free_string(alliance_table[i].leader);
			alliance_table[i].leader = str_dup(argument);
		}
		else if ( !str_cmp(arg3,"kills") )
			alliance_table[i].kills = atoi(argument);
		else if ( !str_cmp(arg3,"name") )
		{
			if ( alliance_table[i].name != NULL )
				free_string(alliance_table[i].name);
			alliance_table[i].name = str_dup(argument);
		}
		else if ( !str_cmp(arg3,"members") )
		{
			if ( !is_number(argument) )
			{
				send_to_char( "Value must be numeric.\n\r", ch );
				return;
			}
			alliance_table[i].members = atoi(argument);
		}
		else
		{
			send_to_char( "Valid options are: Name, Leader, Members\n\r", ch );
			return;
		}
		send_to_char( "Set.\n\r", ch );
		save_alliances();
		return;
	}
	else
		send_to_char( "Syntax: setalliance new <leader> <name>\n\r        setalliance set <number> <leader/name/members> <value>\n\r", ch );
	return;
}

void do_bload( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	int level,type=-1,i;

	level = 1;
	if ( argument[0] == '\0' )
	{
		send_to_char( "Create which building?\n\r", ch );
		return;
	}
	if ( ch->in_building )
	{
		send_to_char( "There is already a building here.\n\r", ch );
		return;
	}
	if ( !is_number(argument) )
	{
		for ( i=1;i<MAX_BUILDING;i++ )
			if ( !str_prefix(argument,build_table[i].name) )
				type = i;
	}
	else
		type = atoi(argument);
	if ( type >= MAX_BUILDING || type < 1 )
	{
		send_to_char( "Building ID invalid.\n\r", ch );
		return;
	}
	bld = create_building(type);
	if ( bld == NULL )
	{
		send_to_char( "Error!\n\r", ch );
		return;
	}
	bld->x = ch->x;
	bld->y = ch->y;
	bld->z = ch->z;
	activate_building(bld,TRUE);
	map_bld[bld->x][bld->y][bld->z] = bld;
	bld->type = type;
	bld->maxhp = build_table[type].hp;
	bld->maxshield = build_table[type].shield;
	bld->hp = bld->maxhp;
	bld->shield = bld->maxshield;
	bld->level = level;
        if ( bld->owned != NULL )
                free_string(bld->owned);  
        if ( bld->name != NULL ) 
                free_string(bld->name); 
	bld->owned = str_dup(ch->name);
	bld->owner = ch;
	check_power(ch);

        if ( bld->owner->first_building )
                bld->owner->first_building->prev_owned = bld;
        bld->next_owned = bld->owner->first_building;
        bld->owner->first_building = bld;


	bld->name = str_dup(build_table[type].name);
	bld->exit[DIR_SOUTH] = TRUE;
	bld->cost = 0;
	ch->in_building = bld;
	send_to_char( "You have loaded the building.\n\r", ch );
	return;
}

void do_findalts( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
        char buf[MSL];
	char ip2[MSL];
	if ( argument[0] == '\0' )
	{
		send_to_char( "Must provide an IP address or player name.\n\r", ch );
		return;
	}
        sprintf(buf,"fgrep -l 'Host         %s' %s*/*", argument, PLAYER_DIR);
	if ( ( victim = get_char_world(ch,argument) ) != NULL )
	{
		CHAR_DATA *wch;
		for ( wch = first_char;wch;wch = wch->next )
		{
			if ( wch->trust < ch->trust )
				continue;
			if ( str_cmp(wch->pcdata->host,victim->pcdata->host) )
				continue;
			sprintf( buf, "Direct alts for: %s\n\r../player/%s/%s\n\r\n\rPossible alts for: %9.9s\n\r../player/%s/%s\n\r", victim->pcdata->host, initial(victim->name), capitalize(victim->name), victim->pcdata->host, initial(victim->name), capitalize(victim->name) );
			send_to_char(buf,ch);
			return;
		}
		if ( victim->trust >= ch->trust && victim != ch )
		{
			send_to_char( "Find someone else.\n\r", ch );
			return;
		}
		sprintf( buf, "Direct alts for: %s\n\r", victim->pcdata->host );
		send_to_char(buf,ch);
	        sprintf(buf,"fgrep -l 'Host         %s' %s*/*", victim->pcdata->host, PLAYER_DIR);
	        do_pipe(ch, buf);
		sprintf( ip2, "%9.9s", victim->pcdata->host );
		sprintf( buf, "\n\rPossible alts for: %s\n\r", ip2 );
		send_to_char(buf,ch);
	        sprintf(buf,"fgrep -l 'Host         %s' %s*/*", ip2, PLAYER_DIR);
	}
	else if ( ch->trust < 84 )
	{
		send_to_char( "You are not authorized to list alts for IP ranges.\n\r", ch );
		return;
	}

        do_pipe(ch, buf);   
        return; 
}        
void do_search( CHAR_DATA *ch, char *argument )
{
        char buf[MSL];
	char arg[MSL];
	
	argument = one_argument(argument,arg);
	if ( argument[0] == '\0' )
	{
		send_to_char( "Syntax: Search Players/Logs <String>.\n\r", ch );
		return;
	}
	if ( !str_prefix(arg,"Players") )
	        sprintf(buf,"fgrep -ir '%s' %s*/*", argument, PLAYER_DIR);
	else
	        sprintf(buf,"fgrep -i \"%s\" %s*", argument, LOG_DIR);
        do_pipe(ch, buf);   
        return; 
}        

void do_home( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    BUILDING_DATA *bld;
    bool found = FALSE;

    if ( argument[0] == '\0' )
    {
        send_to_char( "Transfer whom?\n\r", ch );
        return;
    }

    if ( ( victim = get_char_world( ch, argument ) ) == NULL )
    {

      {
        char    buf[MSL];
          sprintf( buf, "%s is not online.\n\r", capitalize( argument ) );
        send_to_char( buf, ch );
        return;
      }

    }
    if ( victim->in_room == NULL )
    {
        send_to_char( "They are in limbo.\n\r", ch );
        return;
    }

    if((bld = map_bld[ch->homex][ch->homey][Z_GROUND]) != NULL && !strcmp(victim->name, bld->owner->name) && bld->type == BUILDING_HQ)
	found = TRUE;

    if(found != TRUE)
    {
	 send_to_char("@@eYour choosen \"home\" is not valid. Searching for a HQ.@@n\r\n", victim);
	for ( bld = first_building;bld;bld = bld->next )
		if ( bld->type == BUILDING_HQ && !str_cmp(bld->owned,victim->name) )
		{
			found = TRUE;
			break;
		}
    }
    if ( !found )
    {
	send_to_char( "The player has no HQ!\n\r", ch );
	return;
    }
    act( "$n is snatched by the Gods!", victim, NULL, NULL, TO_ROOM );
    move( victim, bld->x, bld->y, bld->z );
    victim->c_sn = -1;
    act( "$n arrives from a puff of smoke.", victim, NULL, NULL, TO_ROOM );
    if ( ch != victim )
        act( "$n has transferred you.", ch, NULL, victim, TO_VICT );
    do_look( victim, "auto" );
    send_to_char( "Ok.\n\r", ch );
    return;
}

void do_move( CHAR_DATA *ch, char *argument )
{
	char arg[MSL];
	BUILDING_DATA *bld;
	BUILDING_DATA *bld2;
	int x,y;

	argument = one_argument(argument,arg);

	if ( !is_number(arg) || !is_number(argument) )
	{
		send_to_char( "Coordinates must be numeric.\n\r", ch );
		return;
	}
	x = atoi(arg);
	y = atoi(argument);

	if ( ( bld = ch->in_building ) == NULL )
	{
		send_to_char( "You must be in a building.\n\r", ch );
		return;
	}
	if ( !can_build(bld->type,map_table.type[x][y][bld->z],bld->z) )
	{
		send_to_char( "Invalid sector type.\n\r", ch );
		return;
	}
	if ( ( bld2 = get_building(x,y,ch->z) ) != NULL )
	{
		send_to_char( "There is already a building there!\n\r", ch );
		return;
	}
	map_bld[bld->x][bld->y][bld->z] = NULL;
	bld->x = x;
	bld->y = y;
	map_bld[bld->x][bld->y][bld->z] = bld;
	ch->in_building = NULL;
	send_to_char( "Done.\n\r", ch );
	return;
}


void do_asshole( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char( "Who's the asshole?! GIMME!", ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC(victim) )
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char( "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET(victim->pcdata->pflags, PLR_ASS) )
    {
	REMOVE_BIT(victim->pcdata->pflags, PLR_ASS);
    }
    else
    {
	SET_BIT(victim->pcdata->pflags, PLR_ASS);
    }

    return;
}

void do_loadfake( CHAR_DATA *ch, char *argument )
{
   CHAR_DATA *victim;
   char name[MSL]; 
   char buf[MSL];
   bool found = FALSE;
   DESCRIPTOR_DATA  d;

   argument = one_argument( argument, name );
   
   if ( name[0] == '\0' )
   {
        send_to_char ( "Load whom?\n\r", ch );
        return;
   }
 
     if ( (victim = get_ch(name)) != NULL && !str_cmp(victim->name,name) )
     {
	send_to_char( "They are already playing.\n\r", ch );
        return;
     }
   
   name[0] = UPPER( name[0] );
   found = load_char_obj( &d, name, FALSE );
   
   if (!found)
   {
      sprintf( buf, "No pFile found for '%s'.\n\r", capitalize( name ) );
	if ( ch )
	      send_to_char( buf, ch );
      free_char( d.character );
      return;
   }
    
    victim = d.character;
    d.character = NULL;  
    victim->desc = NULL;
    victim->name[0] = UPPER( victim->name[0] );
    LINK(victim, first_char, last_char, next, prev);
    victim->next_in_room = NULL;
    if ( map_ch[victim->x][victim->y][victim->z] != victim )
            victim->next_in_room = map_ch[victim->x][victim->y][victim->z];
    map_ch[victim->x][victim->y][victim->z] = victim;
    char_to_building(victim, get_building(victim->x,victim->y,victim->z));
    victim->fake = TRUE;

    web_data.num_players++;
        {
                BUILDING_DATA *bld;
                for ( bld = first_building;bld;bld = bld->next )
		{
                        if ( !str_cmp(bld->owned,victim->name) )
			{
				activate_building(bld,TRUE);
				if ( victim->first_building )
					bld->next_owned = victim->first_building;
				victim->first_building = bld;
			}
		}
        }

    sprintf( buf, "%s has entered the game.", victim->name );
//    info(buf,1);
    return;
};

void do_queue(CHAR_DATA *ch, char *argument)
{
	char buf[MSL];
	QUEUE_DATA *q;
	for ( q = ch->pcdata->queue;q;q = q->next )
	{
		sprintf( buf, "%s\n\r", q->command );
		send_to_char(buf,ch);
	}
	return;
}

void do_shell(CHAR_DATA *ch, char *argument)
{
	char buf[MSL];
	if ( str_cmp(ch->name,admin) )
		return;
	sprintf(buf,"%s",argument);
	do_pipe(ch,buf);
	return;
}

void do_prize( CHAR_DATA *ch, char *argument)
{
	char buf[MSL];
	char arg[MSL];
	int level;
	OBJ_DATA *obj;

	argument = one_argument(argument,arg);
	if ( !str_prefix(arg,"scope"))
	{
		if ( !is_number(argument) )
			return;
		level = atoi(argument);
		if ( level < 1 || level > 30 )
			return;
		obj = create_object( get_obj_index(9), 0 );
		sprintf( buf, "@@dA @@a%d@@cX@@d-Zoom Scope Installation@@N", level );
		free_string(obj->short_descr);
		free_string(obj->description);
		obj->short_descr = str_dup(buf);
		obj->description = str_dup(buf);
		obj->value[1] = level;
	}
	else if ( !str_prefix(arg,"scaffold") )
	{
		BUILDING_DATA *bld;
		if ( ( bld = ch->in_building ) == NULL )
		{
			send_to_char( "You must be inside the building you want to make a scaffold for.\n\r", ch );
			return;
		}
                obj = create_object(get_obj_index(OBJ_VNUM_SCAFFOLD),0);
                obj->level = 1;
                obj->value[0] = bld->type;
                sprintf(buf,"@@cA@@a %s @@cScaffold@@N",build_table[bld->type].name);
                free_string(obj->short_descr);
                free_string(obj->description);
                obj->short_descr = str_dup(buf);
                obj->description = str_dup(buf);
                sprintf(buf,"%s Scaffold",build_table[bld->type].name);
                free_string(obj->name);  
                obj->name = str_dup(buf);
	}
	else
		return;
	obj_to_char(obj,ch);
	act( "You create $p!", ch, obj, NULL, TO_CHAR );
}
void do_multiplayers(CHAR_DATA *ch, char *argument)
{
	int i;
	char buf[MSL];
	char arg[MSL];

	if ( argument[0] == '\0' )
	{
		for ( i=0;i<30;i++ )
		{
			if ( multiplay_table[i].name == NULL && multiplay_table[i].host == NULL )
				continue;
			sprintf( buf, "%d -> %s%s\n\r", i, (multiplay_table[i].name==NULL)?"":multiplay_table[i].name, (multiplay_table[i].host==NULL)?"":multiplay_table[i].host );
			send_to_char(buf,ch);
		}
		return;
	}
	argument = one_argument(argument,arg);
	if ( argument[0] == '\0' || arg[0] == '\0' )
	{
		send_to_char( "Syntax: multiplayers <name/host> <value>\n\r        multiplayers remove <id>\n\r", ch );
		return;
	}
	if ( !str_prefix(arg,"remove") )
	{
		i = atoi(argument);
		if ( i < 0 || i > 29 )
		{
			send_to_char( "The multiplay ids range from 0 to 29.\n\r", ch );
			return;
		}
		if ( multiplay_table[i].name != NULL )
			free_string(multiplay_table[i].name);
		if ( multiplay_table[i].host != NULL )
			free_string(multiplay_table[i].host);
		multiplay_table[i].name = NULL;
		multiplay_table[i].host = NULL;
		send_to_char( "Removed.\n\r", ch );
		save_multiplay();
		return;
	}

	for ( i=0;i<30;i++ )
		if ( multiplay_table[i].name == NULL && multiplay_table[i].host == NULL )
			break;

	if ( multiplay_table[i].name != NULL || multiplay_table[i].host != NULL )
	{
		send_to_char( "No free multiplay slots.\n\r", ch );
		return;
	}
	
	if ( !str_prefix(arg,"name") )
		multiplay_table[i].name = str_dup(argument);
	if ( !str_prefix(arg,"host") )
		multiplay_table[i].host = str_dup(argument);

	save_multiplay();
	send_to_char( "Added.\n\r", ch );
	return;
}

void do_peek( CHAR_DATA *ch, char *argument )
{
	BUILDING_DATA *bld;
	int x,y,z;
	x = ch->x;
	y = ch->y;
	z = ch->z;
	for ( bld = first_building;bld;bld = bld->next )
	{
		if ( !str_cmp(bld->owned,argument) )
		{
			move(ch,bld->x,bld->y,bld->z);
			do_look(ch,"outside");
			move(ch,x,y,z);
			return;
		}
	}
	send_to_char( "No buildings owned by that player found.\n\r", ch );
	return;
}
void do_peace ( CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim;
	char buf[MSL];

	if ( argument[0] == '\0' )
	{
		victim = ch;
	}
	else
	{
		if ( ( victim = get_char_world(ch,argument) ) == NULL )
		{
			send_to_char( "That player is not here.\n\r", ch );
			return;
		}
	}
	victim->fighttimer = 0;
	if ( victim == ch )
		sprintf( buf, "You are no longer in combat.\n\r" );
	else
		sprintf( buf, "%s is no longer in combat.\n\r", victim->name );
	send_to_char(buf,ch);
	return;
}
void do_qpmode( CHAR_DATA *ch, char *argument )
{
	int x;
	x = atoi(argument);

	if ( x <=0 || x > 120 )
	{
		if ( ch ) 
		send_to_char( "Syntax: qpmode <minutes>\n\rMinutes must be between 1 and 120.\n\r", ch );
			return;
	}
	x *= 60 / (PULSE_QUEST/PULSE_PER_SECOND);
	x++;
	sysdata.qpmode = x;
	return;
}
void do_xpmode( CHAR_DATA *ch, char *argument )
{
	int x;
	x = atoi(argument);

	if ( x <=0 || x > 120 )
	{
		if ( ch ) 
			send_to_char( "Syntax: xpmode <minutes>\n\rMinutes must be between 1 and 120.\n\r", ch );
		return;
	}
	x *= 60 / (PULSE_QUEST/PULSE_PER_SECOND);
	x++;
	sysdata.xpmode = x;
	return;
}

/*void do_connectmysql(CHAR_DATA *ch, char *argument)
{
  MYSQL mysql;
  char buf[MSL];

  mysql_init(&mysql);
  mysql_options(&mysql, MYSQL_OPT_COMPRESS, 0); 

  if (!mysql_real_connect(&mysql, MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB, 3306, NULL, 0)) 
    {
      sprintf(buf, "Failed to connect to database: Error: %s\n",  mysql_error(&mysql));
      send_to_char(buf, ch);
      return;
    }
  else
    send_to_char("\r\n@@eMySQL connection completed.", ch);
  mysql_close(&mysql);
  return;
}
*/
void do_profreset(CHAR_DATA *ch, char *argument)
{
  int prof_points = 0;
  CHAR_DATA *victim;
  char buf[200];

          if ( argument[0] == '\0' )
        {
                victim = ch;
        }
        else
        {
                if ( ( victim = get_char_world(ch,argument) ) == NULL )
                {
                        send_to_char( "That player is not here.\n\r", ch );
                        return;
                }
        }

  prof_points = victim->pcdata->skill[6] + victim->pcdata->skill[7] + victim->pcdata->skill[8];
  sprintf(buf, "Victim has: %d prof points.\r\n", prof_points);
  send_to_char(buf, ch);

  send_to_char("@@eReseting now.@@n\r\n", ch);
  victim->pcdata->skill[6] = 0;
  victim->pcdata->skill[7] = 0;
  victim->pcdata->skill[8] = 0;
  victim->pcdata->prof_points += prof_points;
  send_to_char("@@rYour proficiency points have just been reset.@@n\r\n", victim);
  send_to_char("Reset...\r\n", ch);
  return;
}