lurf/area/
lurf/build/testing/
lurf/log/
lurf/player/
lurf/player/backup/
/***************************************************************************
*  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.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefitting.  We hope that you share your changes too.  What goes      *
*  around, comes around.                                                  *
***************************************************************************/
#include <glib.h>

#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 <merc.h>
#include <tables.h>
#include <recycle.h>
#include <interp.h>
#include <olc.h>

#include <string>
#include <fstream>
#include <iomanip>
#include <iostream>

extern bool merc_down;
extern int top_rt;
extern void destroy_memory_chunck args( () );
/*
 * Local functions.
 */
ROOM_INDEX_DATA *	find_location	args( ( CHAR_DATA *ch, char *arg ) );
void	call_all	args( ( CHAR_DATA *ch ) );

void remove_snooper	args( ( CHAR_DATA *ch, CHAR_DATA *target ) );

void do_wizhelp( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	int cmd;
	int col;
	int level;

	for ( level = get_trust( ch ) ; level >= LEVEL_IMMORTAL ; level-- )
	{
		sprintf( buf, "{r----------------------------------- {WLevel %2d {r-----------------------------------{x\n\r", level );
		send_to_char( buf, ch );

		col = 0;
		for ( cmd = 0; cmd_table[ cmd ].name[ 0 ] != '\0'; cmd++ )
		{
			if ( cmd_table[ cmd ].level == level )
			{
				sprintf( buf, "%-12s", cmd_table[ cmd ].name );
				send_to_char( buf, ch );
				if ( ++col % 6 == 0 )
					send_to_char( "\n\r", ch );
			}
		}

		if ( col % 6 != 0 )
			send_to_char( "\n\r", ch );
	}
	return ;
}


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



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

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

	one_argument( argument, arg );

	if ( IS_NPC( ch ) )
		return ;

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "Do you wish to switch summon ON or OFF?\n\r", ch );
		return ;
	}

	if ( IS_IMMUNE( ch, IMM_SUMMON ) && !str_cmp( arg, "off" ) )
	{
		REMOVE_BIT( ch->immune, IMM_SUMMON );
		send_to_char( "You can no longer be the target of summon and portal.\n\r", ch );
	}
	else if ( !IS_IMMUNE( ch, IMM_SUMMON ) && !str_cmp( arg, "off" ) )
	{
		send_to_char( "But it is already off!\n\r", ch );
		return ;
	}
	else if ( !IS_IMMUNE( ch, IMM_SUMMON ) && !str_cmp( arg, "on" ) )
	{
		SET_BIT( ch->immune, IMM_SUMMON );
		send_to_char( "You can now be the target of summon and portal.\n\r", ch );
	}
	else if ( IS_IMMUNE( ch, IMM_SUMMON ) && !str_cmp( arg, "on" ) )
	{
		send_to_char( "But it is already on!\n\r", ch );
		return ;
	}
	else
		send_to_char( "Do you wish to switch it ON or OFF?\n\r", ch );
	return ;
}

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

	one_argument( argument, arg );

	if ( IS_NPC( ch ) )
		return ;

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "Do you wish to switch transport ON or OFF?\n\r", ch );
		return ;
	}

	if ( IS_IMMUNE( ch, IMM_TRANSPORT ) && !str_cmp( arg, "off" ) )
	{
		REMOVE_BIT( ch->immune, IMM_TRANSPORT );
		send_to_char( "You can no longer be the target of transport spells.\n\r", ch );
	}
	else if ( !IS_IMMUNE( ch, IMM_TRANSPORT ) && !str_cmp( arg, "off" ) )
	{
		send_to_char( "But it is already off!\n\r", ch );
		return ;
	}
	else if ( !IS_IMMUNE( ch, IMM_TRANSPORT ) && !str_cmp( arg, "on" ) )
	{
		SET_BIT( ch->immune, IMM_TRANSPORT );
		send_to_char( "You can now be the target of transport spells.\n\r", ch );
	}
	else if ( IS_IMMUNE( ch, IMM_TRANSPORT ) && !str_cmp( arg, "on" ) )
	{
		send_to_char( "But it is already on!\n\r", ch );
		return ;
	}
	else
		send_to_char( "Do you wish to switch it ON or OFF?\n\r", ch );
	return ;
}

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

	one_argument( argument, arg );

	if ( IS_NPC( ch ) || !IS_SET( ch->act, PLR_WATCHER )
	        || ( ch->level > 6 )
	        || ( ch->level < 2 )
	        || ( ch->trust > 0 ) )
	{
		send_to_char( "Huh?\n\r", ch );
		return ;
	}

	if ( arg[ 0 ] == '\0' )
	{
		do_users( ch, "" );
		return ;
	}

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

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

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

	if ( victim->desc->snoop_by != NULL )
	{
		send_to_char( "You better not, they are being snooped.\n\r", ch );
		return ;
	}

	SET_BIT( victim->act, PLR_WATCHER );
	act( "$n has made you a watcher.", ch, NULL, victim, TO_VICT );
	act( "You make $N a watcher.", ch, NULL, victim, TO_CHAR );
	return ;
}



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

	sprintf( buf, "%s: Deny %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

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

	SET_BIT( victim->act, PLR_DENY );
	send_to_char( "You are denied access!\n\r", victim );
	send_to_char( "OK.\n\r", ch );
	do_quit( victim, "" );

	return ;
}



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

	sprintf( buf, "%s: Disconnect %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

	one_argument( argument, arg );
	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "Disconnect whom?\n\r", ch );
		return ;
	}
	/* Disco by Number - Rom Style - Spiral */
	if ( is_number( arg ) )
	{
		int desc;

		desc = atoi( arg );
		for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
		{
			d = ( DESCRIPTOR_DATA* ) desc_list->data;
			if ( d->descriptor == desc )
			{
				close_socket( d );
				send_to_char( "Ok.\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 )
	{
		act( "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
		return ;
	}

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		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_info( CHAR_DATA *ch, char *argument )
{
	DESCRIPTOR_DATA * d;
	char buf[ MAX_STRING_LENGTH ];
	GSList *desc_list;

	if ( argument[ 0 ] == '\0' )
	{
		send_to_char( "What do you want the town crier to shout?\n\r", ch );
		return ;
	}

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING &&
		        !IS_SET( d->character->deaf, CHANNEL_INFO ) )
		{
			sprintf( buf, "\n\r{Ra town crier shouts 'I just saw that %s'{x\n\r", argument );
			send_to_char( buf, d->character );
		}
	}

	return ;
}

void play_wave( int wavnum )
{
	DESCRIPTOR_DATA * d;
	char buf[ MAX_STRING_LENGTH ];
	GSList *desc_list;

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING &&
		        IS_SET( d->character->deaf, CHANNEL_MSP ) )
		{
			sprintf( buf, "\n\r!!SOUND(%s T=sound L=1 V=100 U=http://%s%s )\n\r", msp_general_table[ wavnum ].msp_string, msp_general_table[ wavnum ].msp_server, msp_general_table[ wavnum ].msp_dirinfo );
			send_to_char( buf, d->character );
		}
	}

	return ;
}

void do_gen_info( char *argument )
{
	DESCRIPTOR_DATA * d;
	char buf[ MSL ];
	GSList *desc_list;

	if ( argument[ 0 ] == '\0' )
	{
		return ;
	}
	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING &&
		        !IS_SET( d->character->deaf, CHANNEL_INFO ) )
		{
			sprintf( buf, "\n\r{Ra town crier shouts 'I just saw that %s %s!'\n\r", d->character->name->str, argument );
			send_to_char( buf, d->character );
		}
	}

	return ;
}

void do_watching( CHAR_DATA *ch, char *argument )
{
	DESCRIPTOR_DATA * d;
	GSList	*desc_list;

	if ( argument[ 0 ] == '\0' )
	{
		return ;
	}


	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING &&
		        IS_SET( d->character->act, PLR_WATCHER ) &&
		        !IS_SET( d->character->deaf, CHANNEL_INFO ) )
		{
			send_to_char( "Monitor -> ", d->character );
			send_to_char( argument, d->character );
			send_to_char( "\n\r", d->character );
		}
	}

	return ;
}

void do_wiznet( CHAR_DATA *ch, char *argument )
{
	int flag;
	char buf[ MAX_STRING_LENGTH ];

	if ( argument[ 0 ] == '\0' )
	{
		if ( IS_SET( ch->pcdata->wiznet, WIZ_ON ) )
		{
			send_to_char( "{WSigning off of Wiznet.{x\n\r", ch );
			REMOVE_BIT( ch->pcdata->wiznet, WIZ_ON );
		}
		else
		{
			send_to_char( "{WWelcome to Wiznet!{x\n\r", ch );
			SET_BIT( ch->pcdata->wiznet, WIZ_ON );
		}
		return ;
	}

	if ( !str_prefix( argument, "on" ) )
	{
		send_to_char( "{WWelcome to Wiznet!{x\n\r", ch );
		SET_BIT( ch->pcdata->wiznet, WIZ_ON );
		return ;
	}

	if ( !str_prefix( argument, "off" ) )
	{
		send_to_char( "{WSigning off of Wiznet.{x\n\r", ch );
		REMOVE_BIT( ch->pcdata->wiznet, WIZ_ON );
		return ;
	}

	/* show wiznet status */
	if ( !str_prefix( argument, "status" ) )
	{
		buf[ 0 ] = '\0';

		if ( !IS_SET( ch->pcdata->wiznet, WIZ_ON ) )
			strcat( buf, "off " );

		for ( flag = 0; wiznet_table[ flag ].name != NULL; flag++ )
			if ( IS_SET( ch->pcdata->wiznet, wiznet_table[ flag ].flag ) )
			{
				strcat( buf, wiznet_table[ flag ].name );
				strcat( buf, " " );
			}

		strcat( buf, "\n\r" );

		send_to_char( "Wiznet status:\n\r", ch );
		send_to_char( buf, ch );
		return ;
	}

	if ( !str_prefix( argument, "show" ) )
		/* list of all wiznet options */
	{
		buf[ 0 ] = '\0';

		for ( flag = 0; wiznet_table[ flag ].name != NULL; flag++ )
		{
			if ( wiznet_table[ flag ].level <= get_trust( ch ) )
			{
				strcat( buf, wiznet_table[ flag ].name );
				strcat( buf, " " );
			}
		}

		strcat( buf, "\n\r" );

		send_to_char( "Wiznet options available to you are:\n\r", ch );
		send_to_char( buf, ch );
		return ;
	}

	flag = wiznet_lookup( argument );

	if ( flag == -1 || get_trust( ch ) < wiznet_table[ flag ].level )
	{
		send_to_char( "No such option.\n\r", ch );
		return ;
	}

	if ( IS_SET( ch->pcdata->wiznet, wiznet_table[ flag ].flag ) )
	{
		sprintf( buf, "You will no longer see %s on wiznet.\n\r",
		         wiznet_table[ flag ].name );
		send_to_char( buf, ch );
		REMOVE_BIT( ch->pcdata->wiznet, wiznet_table[ flag ].flag );
		return ;
	}
	else
	{
		sprintf( buf, "You will now see %s on wiznet.\n\r",
		         wiznet_table[ flag ].name );
		send_to_char( buf, ch );
		SET_BIT( ch->pcdata->wiznet, wiznet_table[ flag ].flag );
		return ;
	}

}

void do_echo( CHAR_DATA *ch, char *argument )
{
	DESCRIPTOR_DATA * d;
	char buf[ MAX_STRING_LENGTH ];
	GSList	*desc_list;

	if ( ch != NULL )
	{
		sprintf( buf, "%s: Echo %s", ch->name->str, argument );
		if ( ch->level < NO_WATCH )
			do_watching( ch, buf );
	}

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

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING )
		{
			send_to_char( argument, d->character );
			send_to_char( "\n\r", d->character );
		}
	}

	return ;
}



void do_recho( CHAR_DATA *ch, char *argument )
{
	DESCRIPTOR_DATA * d;
	char buf[ MAX_STRING_LENGTH ];
	GSList	*desc_list;

	sprintf( buf, "%s: Recho %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

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

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING
		        && d->character->in_room == ch->in_room )
		{
			send_to_char( argument, d->character );
			send_to_char( "\n\r", d->character );
		}
	}

	return ;
}



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

	if ( is_number( arg ) && atoi( arg ) != 30008 )
		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 && obj->in_room != NULL )
		return obj->in_room;

	if ( obj != NULL && obj->carried_by != NULL && obj->carried_by->in_room != NULL )
		return obj->carried_by->in_room;

	if ( obj != NULL && obj->in_obj != NULL && obj->in_obj->in_room != NULL )
		return obj->in_obj->in_room;

	if ( obj != NULL && obj->in_obj != NULL && obj->in_obj->carried_by && obj->in_obj->carried_by->in_room != NULL )
		return obj->in_obj->carried_by->in_room;

	return NULL;
}



void do_transfer( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	char arg2[ MAX_INPUT_LENGTH ];
	char buf[ MAX_STRING_LENGTH ];
	ROOM_INDEX_DATA *location;
	DESCRIPTOR_DATA *d;
	CHAR_DATA *victim;
	CHAR_DATA *mount;
	GSList	*desc_list;

	sprintf( buf, "%s: Transfer %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

	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 ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
		{
			d = ( DESCRIPTOR_DATA* ) desc_list->data;
			if ( d->connected == CON_PLAYING
			        && 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->str, arg2 );
				do_transfer( ch, buf );
			}
		}
		return ;
	}

	/*
	 * Thanks to Grodyn for the optional location parameter.
	 */
	if ( arg2[ 0 ] == '\0' )
	{
		location = ch->in_room;
	}
	else
	{
		if ( ( location = find_location( ch, arg2 ) ) == NULL )
		{
			send_to_char( "No such location.\n\r", ch );
			return ;
		}

		if ( room_is_private( location ) )
		{
			send_to_char( "That room is private right now.\n\r", ch );
			return ;
		}
	}

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

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


	if ( victim->fighting != NULL )
		stop_fighting( victim, TRUE );
	act( "$n disappears in a mushroom cloud.", victim, NULL, NULL, TO_ROOM );
	char_from_room( victim );
	char_to_room( victim, location );
	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 );
	if ( ( mount = victim->mount ) == NULL )
		return ;
	char_from_room( mount );
	char_to_room( mount, get_room_index( victim->in_room->vnum ) );
	if ( ch != mount )
		act( "$n has transferred you.", ch, NULL, mount, TO_VICT );
	do_look( mount, "auto" );
}



void do_at( CHAR_DATA *ch, char *argument )
{
	char arg[ MAX_INPUT_LENGTH ];
	char buf[ MAX_STRING_LENGTH ];
	ROOM_INDEX_DATA *location;
	ROOM_INDEX_DATA *original;
	CHAR_DATA *wch;

	sprintf( buf, "%s: At %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

	argument = one_argument( argument, arg );

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

	if ( ( location = find_location( ch, arg ) ) == NULL )
	{
		send_to_char( "No such location.\n\r", ch );
		return ;
	}

	if ( room_is_private( location ) )
	{
		send_to_char( "That room is private right now.\n\r", ch );
		return ;
	}

	original = ch->in_room;
	char_from_room( ch );
	char_to_room( ch, location );
	interpret( ch, argument );

	/*
	 * See if 'ch' still exists before continuing!
	 * Handles 'at XXXX quit' case.
	 */
	for ( wch = char_list; wch != NULL; wch = wch->next )
	{
		if ( wch == ch )
		{
			char_from_room( ch );
			char_to_room( ch, original );
			break;
		}
	}

	mudsetting->last_proc_logged = 10;
	return ;
}



void do_goto( CHAR_DATA *ch, char *argument )
{
	char arg[ MAX_INPUT_LENGTH ];
	ROOM_INDEX_DATA *location;
	CHAR_DATA *mount;

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

	if ( ( location = find_location( ch, arg ) ) == NULL )
	{
		send_to_char( "No such location.\n\r", ch );
		return ;
	}

	if ( room_is_private( location ) )
	{
		send_to_char( "That room is private right now.\n\r", ch );
		return ;
	}

	if ( ch->fighting != NULL )
		stop_fighting( ch, TRUE );
	if ( !IS_SET( ch->act, PLR_WIZINVIS ) )
	{
		act( "$n $T.", ch, NULL,
		     ( ch->pcdata != NULL && ch->pcdata->bamfout->str[ 0 ] != '\0' )
		     ? ch->pcdata->bamfout->str : "leaves in a swirling mist", TO_ROOM );
	}

	char_from_room( ch );
	char_to_room( ch, location );

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

	do_look( ch, "auto" );
	if ( ( mount = ch->mount ) == NULL )
		return ;
	char_from_room( mount );
	char_to_room( mount, ch->in_room );
	do_look( mount, "auto" );
	return ;
}



void do_rstat( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	char arg[ MAX_INPUT_LENGTH ];
	ROOM_INDEX_DATA *location;
	OBJ_DATA *obj;
	CHAR_DATA *rch;
	int door;

	one_argument( argument, arg );
	location = ( arg[ 0 ] == '\0' ) ? ch->in_room : find_location( ch, arg );
	if ( location == NULL )
	{
		send_to_char( "No such location.\n\r", ch );
		return ;
	}

	if ( ch->in_room != location && room_is_private( location ) )
	{
		send_to_char( "That room is private right now.\n\r", ch );
		return ;
	}

	sprintf( buf, "Name: '%s.'\n\rArea: '%s'.\n\r",
	         location->name,
	         location->area->name );
	send_to_char( buf, ch );

	sprintf( buf,
	         "Vnum: %d.  Sector: %d.  Light: %d.\n\r",
	         location->vnum,
	         location->sector_type,
	         location->light );
	send_to_char( buf, ch );

	sprintf( buf,
	         "Room flags: %d.\n\rDescription:\n\r%s",
	         location->room_flags,
	         location->description );
	send_to_char( buf, ch );

	if ( location->extra_descr != NULL )
	{
		EXTRA_DESCR_DATA * ed;

		send_to_char( "Extra description keywords: '", ch );
		for ( ed = location->extra_descr; ed; ed = ed->next )
		{
			send_to_char( ed->keyword, ch );
			if ( ed->next != NULL )
				send_to_char( " ", ch );
		}
		send_to_char( "'.\n\r", ch );
	}

	send_to_char( "Characters:", ch );
	for ( rch = location->people; rch; rch = rch->next_in_room )
	{
		send_to_char( " ", ch );
		one_argument( rch->name->str, buf );
		send_to_char( buf, ch );
	}

	send_to_char( ".\n\rObjects:   ", ch );
	for ( obj = location->contents; obj; obj = obj->next_content )
	{
		send_to_char( " ", ch );
		one_argument( obj->name->str, buf );
		send_to_char( buf, ch );
	}
	send_to_char( ".\n\r", ch );

	for ( door = 0; door <= 5; door++ )
	{
		EXIT_DATA *pexit;

		if ( ( pexit = location->exit[ door ] ) != NULL )
		{
			sprintf( buf,
			         "Door: %d.  To: %d.  Key: %d.  Exit flags: %d.\n\rKeyword: '%s'.  Description: %s",

			         door,
			         pexit->to_room != NULL ? pexit->to_room->vnum : 0,
			         pexit->key,
			         pexit->exit_info,
			         pexit->keyword,
			         pexit->description[ 0 ] != '\0'
			         ? pexit->description : "(none).\n\r" );
			send_to_char( buf, ch );
		}
	}

	return ;
}



void do_ostat( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	char arg[ MAX_INPUT_LENGTH ];
	char nm1[ 40 ];
	char nm2[ 40 ];
	AFFECT_DATA *paf;
	OBJ_DATA *obj;

	one_argument( argument, arg );

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

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

	if ( obj->questmaker != NULL && obj->questmaker->len > 1 )
		sprintf( nm1, obj->questmaker->str );
	else
		sprintf( nm1, "None" );
	if ( obj->questowner != NULL && obj->questowner->len > 1 )
		sprintf( nm2, obj->questowner->str );
	else
		sprintf( nm2, "None" );

	sprintf( buf, "Name: %s.\n\r",
	         obj->name->str );
	send_to_char( buf, ch );

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

	sprintf( buf, "Short description: %s.\n\rLong description: %s\n\r",
	         obj->short_descr->str, obj->description->str );
	send_to_char( buf, ch );

	sprintf( buf, "Object creator: %s.  OOwner: %s Object owner: %s.  Quest points: %d.\n\r", nm1, obj->OOwner->str[ 0 ] == '\0' ? "(none)" : obj->OOwner->str, nm2, obj->points );
	send_to_char( buf, ch );
	if ( obj->quest != 0 )
	{
		send_to_char( "Quest selections:", ch );
		if ( IS_SET( obj->quest, QUEST_STR ) )
			send_to_char( " Str", ch );
		if ( IS_SET( obj->quest, QUEST_DEX ) )
			send_to_char( " Dex", ch );
		if ( IS_SET( obj->quest, QUEST_INT ) )
			send_to_char( " Int", ch );
		if ( IS_SET( obj->quest, QUEST_WIS ) )
			send_to_char( " Wis", ch );
		if ( IS_SET( obj->quest, QUEST_CON ) )
			send_to_char( " Con", ch );
		if ( IS_SET( obj->quest, QUEST_HIT ) )
			send_to_char( " Hp", ch );
		if ( IS_SET( obj->quest, QUEST_MANA ) )
			send_to_char( " Mana", ch );
		if ( IS_SET( obj->quest, QUEST_MOVE ) )
			send_to_char( " Move", ch );
		if ( IS_SET( obj->quest, QUEST_HITROLL ) )
			send_to_char( " Hit", ch );
		if ( IS_SET( obj->quest, QUEST_DAMROLL ) )
			send_to_char( " Dam", ch );
		if ( IS_SET( obj->quest, QUEST_AC ) )
			send_to_char( " Ac", ch );
		if ( IS_SET( obj->quest, QUEST_ARTIFACT ) )
			send_to_char( " Arti", ch );
		send_to_char( ".\n\r", ch );
	}
	sprintf( buf, "Wear bits: %d.  Extra bits: %s.\n\r",
	         obj->wear_flags, extra_bit_name( obj->extra_flags ) );
	send_to_char( buf, ch );

	sprintf( buf, "Weight: %d/%d.\n\r",
	         obj->weight, get_obj_weight( obj ) );
	send_to_char( buf, ch );

	sprintf( buf, "Cost: %d.  Timer: %d.  Level: %d.\n\r",
	         obj->cost, obj->timer, obj->level );
	send_to_char( buf, ch );

	sprintf( buf,
	         "In room: %d.  In object: %s.  Carried by: %s.  Wear_loc: %d.\n\r",
	         obj->in_room == NULL ? 0 : obj->in_room->vnum,
	         obj->in_obj == NULL ? "(none)" : obj->in_obj->short_descr->str,
	         obj->carried_by == NULL ? "(none)" : obj->carried_by->name->str,
	         obj->wear_loc );
	send_to_char( buf, ch );

	sprintf( buf, "Values: %d %d %d %d.\n\r",
	         obj->value[ 0 ], obj->value[ 1 ], obj->value[ 2 ], obj->value[ 3 ] );
	send_to_char( buf, ch );

	if ( obj->extra_descr != NULL || obj->pIndexData->extra_descr != NULL )
	{
		EXTRA_DESCR_DATA * ed;

		send_to_char( "Extra description keywords: '", ch );

		for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
		{
			send_to_char( ed->keyword, ch );
			if ( ed->next != NULL )
				send_to_char( " ", ch );
		}

		for ( ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next )
		{
			send_to_char( ed->keyword, ch );
			if ( ed->next != NULL )
				send_to_char( " ", ch );
		}

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

	for ( paf = obj->affected; paf != NULL; paf = paf->next )
	{
		sprintf( buf, "Affects %s by %d.\n\r",
		         affect_loc_name( paf->location ), paf->modifier );
		send_to_char( buf, ch );

	}

	for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next )
	{
		sprintf( buf, "Affects %s by %d.\n\r",
		         affect_loc_name( paf->location ), paf->modifier );
		send_to_char( buf, ch );
	}

	return ;
}



void do_mstat( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	char arg[ MAX_INPUT_LENGTH ];
	AFFECT_DATA *paf;
	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 ;
	}


	sprintf( buf, "Name: %s.\n\r",
	         victim->name->str );
	send_to_char( buf, ch );

	sprintf( buf, "Vnum: %d.  Sex: %s.  Room: %d.\n\r",
	         IS_NPC( victim ) ? victim->pIndexData->vnum : 0,
	         victim->sex == SEX_MALE ? "male" :
	         victim->sex == SEX_FEMALE ? "female" : "neutral",
	         victim->in_room == NULL ? 0 : victim->in_room->vnum
	       );
	send_to_char( buf, ch );

	sprintf( buf, "Str: %d.  Int: %d.  Wis: %d.  Dex: %d.  Con: %d.\n\r",
	         get_curr_str( victim ),
	         get_curr_int( victim ),
	         get_curr_wis( victim ),
	         get_curr_dex( victim ),
	         get_curr_con( victim ) );
	send_to_char( buf, ch );

	sprintf( buf, "Hp: %d/%d.  Mana: %d/%d.  Move: %d/%d.  Primal: %d.\n\r",
	         victim->hit, victim->max_hit,
	         victim->mana, victim->max_mana,
	         victim->move, victim->max_move,
	         victim->practice );
	send_to_char( buf, ch );

	sprintf( buf,
	         "Lv: %d.  Align: %d.  AC: %d.  Gold: %d.  Exp: %d.\n\r",
	         victim->level, victim->alignment,
	         char_ac( victim ), victim->gold, victim->exp );
	send_to_char( buf, ch );

	sprintf( buf, "Hitroll: %d.  Damroll: %d.  Position: %d.  Wimpy: %d.\n\r",
	         char_hitroll( victim ), char_damroll( victim ),
	         victim->position, victim->wimpy );
	send_to_char( buf, ch );

	sprintf( buf, "Fighting: %s.\n\r",
	         victim->fighting ? victim->fighting->name->str : "(none)" );
	send_to_char( buf, ch );

	if (IS_NPC(victim))
	{
		sprintf(buf,"Killed: %d\n\r",victim->pIndexData->killed);
		send_to_char(buf,ch);
	}

	if ( !IS_NPC( victim ) )
	{
		sprintf( buf,
		         "Thirst: %d.  Full: %d.  Drunk: %d.  Saving throw: %d.\n\r",
		         victim->pcdata->condition[ COND_THIRST ],
		         victim->pcdata->condition[ COND_FULL ],
		         victim->pcdata->condition[ COND_DRUNK ],
		         victim->saving_throw );
		send_to_char( buf, ch );

		if ( IS_CLASS( victim, CLASS_VAMPIRE ) || IS_CLASS( victim, CLASS_WEREWOLF ) )
		{
			if ( victim->clan > CLAN_NONE )
				sprintf( buf, "Clan: %s. ", iclan_table[ victim->clan ].pretty_name );
			else
				sprintf( buf, "Clan: None. " );
			send_to_char( buf, ch );
			sprintf( buf, "Rage: %d. ", victim->pcdata->stats[ UNI_RAGE ] );
			send_to_char( buf, ch );
			if ( IS_CLASS( victim, CLASS_VAMPIRE ) )
			{
				sprintf( buf, "Beast: %d. ", victim->beast );
				send_to_char( buf, ch );
				sprintf( buf, "Blood: %d.", victim->pcdata->condition[ COND_THIRST ] );
				send_to_char( buf, ch );
			}
			send_to_char( "\n\r", ch );
		}

	}

	sprintf( buf, "Carry number: %d.  Carry weight: %d.\n\r",
	         victim->carry_number, victim->carry_weight );
	send_to_char( buf, ch );

	sprintf( buf, "Age: %d.  Played: %d.  Timer: %d.\n\r",
	         get_age( victim ), ( int ) victim->played, victim->timer );
	send_to_char( buf, ch );

	sprintf( buf, "{bAct: {C%s{x\n\r", act_bit_name( victim->act ) );
	send_to_char( buf, ch );

	sprintf( buf, "{bStance: {C%s{x\n\r", fight_bit_name( victim->mob_fight ) );
	send_to_char( buf, ch );

	sprintf( buf, "{bAdded: {C%s{x\n\r", added_bit_name( victim->added ) );
	send_to_char( buf, ch );

	if ( IS_SET( victim->act, PLR_ATTACK ) )
	{
		sprintf( buf, "Attack: {Y%s{x\n\r", attack_bit_name( victim->pk_sect ) );
		send_to_char( buf, ch );
	}

	sprintf( buf, "{bSpaffect: {C%s{x\n\r", spaffect_bit_name( victim->sphere_spaffect ) );
	send_to_char( buf, ch );

	if ( !IS_NPC( victim ) )
	{
		sprintf( buf, "{bComm: {C%s{x\n\r", comm_bit_name( victim->pcdata->comm ) );
		send_to_char( buf, ch );
	}

	sprintf( buf, "Master: %s.  Leader: %s.  Affected by: %s.\n\r",
	         victim->master ? victim->master->name->str : "(none)",
	         victim->leader ? victim->leader->name->str : "(none)",
	         affect_bit_name( victim->affected_by ) );
	send_to_char( buf, ch );

	sprintf( buf, "Short description: %s.\n\rLong  description: %s",
	         victim->short_descr->str,
	         victim->long_descr->str[ 0 ] != '\0' ? victim->long_descr->str : "(none).\n\r" );
	send_to_char( buf, ch );

	if ( IS_NPC( victim ) && victim->spec_fun != 0 )
		send_to_char( "Mobile has spec fun.\n\r", ch );

	for ( paf = victim->affected; paf != NULL; paf = paf->next )
	{
		sprintf( buf,
		         "Spell: '%s' modifies %s by %d for %d hours with bits %s.\n\r",
		         skill_table[ ( int ) paf->type ].name,
		         affect_loc_name( paf->location ),
		         paf->modifier,
		         paf->duration,
		         affect_bit_name( paf->bitvector )
		       );
		send_to_char( buf, ch );
	}

	return ;
}

int get_mvnum_count( int vnum )
{
	CHAR_DATA * wch;
	int count = 0;

	for ( wch = char_list;wch != NULL; wch = wch->next )
	{
		if ( IS_NPC( wch ) && wch->pIndexData->vnum == vnum )
			count++;
	}
	return count;
}

void do_mfind( CHAR_DATA *ch, char *argument )
{
	extern int top_mob_index;
	char buf[ MAX_STRING_LENGTH ];
	char arg[ MAX_INPUT_LENGTH ];
	MOB_INDEX_DATA *pMobIndex;
	int vnum;
	int nMatch;
	bool fAll;
	bool found;

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

	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_mob_index; vnum++ )
	{
		if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
		{
			nMatch++;
			if ( fAll || is_name( arg, pMobIndex->player_name ) )
			{
				found = TRUE;
				sprintf( buf, "{W[{M%5d{W] ({R%3d{W) {B%-40s{x Loaded: %-3d\n\r",
				         pMobIndex->vnum,
				         pMobIndex->level,
				         capitalize( pMobIndex->short_descr ),
				         get_mvnum_count( pMobIndex->vnum ) );
				send_to_char( buf, ch );
			}
		}
	}

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

	return ;
}


int get_ovnum_count( int vnum )
{
	int count = 0;
	OBJ_DATA *obj;
	GSList *tmp = object_list;

	while ( tmp != NULL )
	{
		obj = ( OBJ_DATA* ) tmp->data;
		if ( obj->pIndexData->vnum == vnum )
			count++;

		tmp = g_slist_next( tmp );
	}
	g_slist_free( tmp );
	return count;

}


void do_ofind( CHAR_DATA *ch, char *argument )
{
	extern int top_obj_index;
	char buf[ MAX_STRING_LENGTH ];
	char arg[ MAX_INPUT_LENGTH ];
	OBJ_INDEX_DATA *pObjIndex;
	int vnum;
	int nMatch;
	bool fAll;
	bool found;

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

	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, "{W[{M%5d{W] {B%-40s{x Loaded: %-3d\n\r",
				         pObjIndex->vnum,
				         capitalize( pObjIndex->short_descr ),
				         get_ovnum_count( pObjIndex->vnum ) );
				send_to_char( buf, ch );
			}
		}
	}

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

	return ;
}



void do_mwhere( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	char arg[ MAX_INPUT_LENGTH ];
	CHAR_DATA *victim;
	bool found;

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

	/* Had problems when lots of gremlins existed - KaVir
	if ( !str_cmp( arg, "gremlin" ) )
		{
	send_to_char( "Sorry, but in the interest of mud stability you cannot do that.\n\r", ch );
	return;
		}
	*/

	found = FALSE;
	for ( victim = char_list; victim != NULL; victim = victim->next )
	{
		if ( IS_NPC( victim )
		        && victim->in_room != NULL
		        && is_name( arg, victim->name->str ) )
		{
			found = TRUE;
			sprintf( buf, "[%5d] %-28s [%5d] %s\n\r",
			         victim->pIndexData->vnum,
			         victim->short_descr->str,
			         victim->in_room->vnum,
			         victim->in_room->name );
			send_to_char( buf, ch );
		}
	}

	if ( !found )
		act( "You didn't find any $T.", ch, NULL, arg, TO_CHAR );

	mudsetting->last_proc_logged = 11;
	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;
	sprintf( buf, "Reboot by %s.", ch->name->str );
	do_echo( ch, buf );
	do_forceauto( ch, "save" );
	do_autosave( ch, "" );
	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;
	sprintf( buf, "Shutdown by %s.", ch->name->str );
	append_file( ch, SHUTDOWN_FILE, buf );
	strcat( buf, "\n\r" );
	do_echo( ch, buf );
	do_forceauto( ch, "save" );
	do_forceauto( ch, "quit" );
	do_autosave( ch, "" );
	//Free up lists back to the system.
	destroy_memory_chunck();
	merc_down = TRUE;
	exit( 0 );
}

int count_snoopers( DESCRIPTOR_DATA *ch )
{
	GSList * desc_list = NULL;
	GSList *snoop_list = NULL;
	int count = 0;
	DESCRIPTOR_DATA *target;
	DESCRIPTOR_DATA *targetSnooper;

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		target = ( DESCRIPTOR_DATA* ) desc_list->data;
		for ( snoop_list = target->snoop_by; snoop_list != NULL; snoop_list = g_slist_next( snoop_list ) )
		{
			targetSnooper = ( DESCRIPTOR_DATA* ) snoop_list->data;
			if ( targetSnooper == ch )
				count++;
		}
	}
	g_slist_free( desc_list );
	g_slist_free( snoop_list );
	return count;
}

void add_snooper( DESCRIPTOR_DATA *ch_desc, DESCRIPTOR_DATA *vic_desc )
{
	GSList * snoop_list = NULL;
	DESCRIPTOR_DATA *snooper;

	if ( vic_desc == NULL )
	{
		send_to_char( "No descriptor to snoop.\n\r", ch_desc->character );
		return ;
	}

	if ( vic_desc->snoop_by != NULL )
	{
		for ( snoop_list = vic_desc->snoop_by; snoop_list != NULL; snoop_list = g_slist_next( snoop_list ) )
		{
			snooper = ( DESCRIPTOR_DATA* ) snoop_list->data;
			if ( snooper == ch_desc )
			{
				remove_snooper( ch_desc->character, vic_desc->character );
				return ;
			}
		}
	}

	g_slist_free( snoop_list );

	vic_desc->snoop_by = g_slist_append( vic_desc->snoop_by, ch_desc );

	if ( IS_IMMORTAL( ch_desc->character ) )
		send_to_char( "Snoop ok\n\r", ch_desc->character );
	else
		send_to_char( "You attempt to Unveil their Shrouded Mind.\n\r", ch_desc->character );

	return ;
}

/*
  * Removes all of the people that is snooping victim
  */
void removeAllSnoopers( DESCRIPTOR_DATA *ch_desc )
{
	GSList * snoop_list = NULL;
	DESCRIPTOR_DATA *snooper;

	if ( ch_desc == NULL )
		return ;

	for ( snoop_list = ch_desc->snoop_by; snoop_list != NULL; snoop_list = g_slist_next( snoop_list ) )
	{
		snooper = ( DESCRIPTOR_DATA* ) snoop_list->data;

		remove_snooper( snooper->character, ch_desc->character );
	}
	g_slist_free( snoop_list );
	return ;
}

void remove_snooper( CHAR_DATA *ch, CHAR_DATA *target )
{
	GSList * desc_list = NULL;
	DESCRIPTOR_DATA *PersonDesc;
	DESCRIPTOR_DATA *Snooper;
	GSList *snoop_list = NULL;

	if ( target == NULL || ch == NULL )
		return ;

	if ( target == ch )
	{

		if ( IS_IMMORTAL( ch ) )
			send_to_char( "Cancelling all snoops.\n\r", ch );
		else
			send_to_char( "You cease trying to Unveil any minds.\n\r", ch );

		for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
		{
			PersonDesc = ( DESCRIPTOR_DATA* ) desc_list->data;

			/*
			 * Scroll throgh the peron's snoop_by looking for snooper
			 */
			for ( snoop_list = PersonDesc->snoop_by; snoop_list != NULL; snoop_list = g_slist_next( snoop_list ) )
			{
				Snooper = ( DESCRIPTOR_DATA* ) snoop_list->data;
				if ( Snooper == ch->desc )
				{
					PersonDesc->snoop_by = g_slist_remove( PersonDesc->snoop_by, Snooper );
					continue;
				}

			}
		}

		g_slist_free( snoop_list );
		g_slist_free( desc_list );
	}
	else
	{
		for ( snoop_list = target->desc->snoop_by; snoop_list != NULL; snoop_list = g_slist_next( snoop_list ) )
		{
			Snooper = ( DESCRIPTOR_DATA* ) snoop_list->data;
			if ( Snooper == ch->desc )
			{
				if ( IS_IMMORTAL( ch ) )
					send_to_char( "Removing snoop.\n\r", ch );
				else
					send_to_char( "You cease trying to Unveil that mind.\n\r", ch );
				target->desc->snoop_by = g_slist_remove( target->desc->snoop_by, Snooper );
			}
		}
		g_slist_free( snoop_list );
	}
	return ;
}

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

	sprintf( buf, "%s: Snoop %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

	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 == ch )
	{
		remove_snooper( ch, ch );
		return ;
	}

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

	add_snooper( ch->desc, victim->desc );

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



void do_oswitch( CHAR_DATA *ch, char *argument )
{
	char arg[ MAX_INPUT_LENGTH ];
	char buf[ MAX_STRING_LENGTH ];
	OBJ_DATA *obj;
	CHAR_DATA *mount;

	sprintf( buf, "%s: Oswitch %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

	one_argument( argument, arg );

	if ( IS_NPC( ch ) )
		return ;

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

	if ( IS_EXTRA( ch, EXTRA_OSWITCH ) || IS_HEAD( ch, LOST_HEAD ) )
	{
		send_to_char( "You are already oswitched.\n\r", ch );
		return ;
	}

	if ( IS_AFFECTED( ch, AFF_POLYMORPH ) )
	{
		send_to_char( "Not while polymorphed.\n\r", ch );
		return ;
	}

	if ( IS_NPC( ch ) || IS_EXTRA( ch, EXTRA_SWITCH ) )
	{
		send_to_char( "Not while switched.\n\r", ch );
		return ;
	}

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

	if ( obj->chobj != NULL )
	{
		send_to_char( "Object in use.\n\r", ch );
		return ;
	}

	if ( ( mount = ch->mount ) != NULL )
		do_dismount( ch, "" );
	obj->chobj = ch;
	ch->pcdata->chobj = obj;
	SET_BIT( ch->affected_by, AFF_POLYMORPH );
	SET_BIT( ch->extra, EXTRA_OSWITCH );
	ch->morph = g_string_assign( ch->morph, obj->short_descr->str );
	send_to_char( "Ok.\n\r", ch );
	return ;
}



void do_oreturn( CHAR_DATA *ch, char *argument )
               {
	               char arg[ MAX_INPUT_LENGTH ];
	               char buf[ MAX_STRING_LENGTH ];
	               OBJ_DATA *obj;

	               sprintf( buf, "%s: Oreturn", ch->name->str );
	               if ( ch->level < NO_WATCH )
		               do_watching( ch, buf );

	               one_argument( argument, arg );

	               if ( IS_NPC( ch ) )
		               return ;

	               if ( !IS_EXTRA( ch, EXTRA_OSWITCH ) && !IS_HEAD( ch, LOST_HEAD ) )
	               {
		               send_to_char( "You are not oswitched.\n\r", ch );
		               return ;
	               }
	               if ( ( obj = ch->pcdata->chobj ) != NULL )
		               obj->chobj = NULL;
	               ch->pcdata->chobj = NULL;
	               REMOVE_BIT( ch->affected_by, AFF_POLYMORPH );
	               REMOVE_BIT( ch->extra, EXTRA_OSWITCH );
	               if ( IS_HEAD( ch, LOST_HEAD ) )
		               REMOVE_BIT( ch->loc_hp[ 0 ], LOST_HEAD );
	               ch->morph = g_string_assign( ch->morph, "" );
	               char_from_room( ch );
	               char_to_room( ch, get_room_index( ROOM_VNUM_ALTAR ) );
	               send_to_char( "Ok.\n\r", ch );
	               return ;
               }



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

	               sprintf( buf, "%s: Switch %s", ch->name->str, argument );
	               if ( ch->level < NO_WATCH )
		               do_watching( ch, buf );

	               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 ;
	               }
	               if ( victim->level >= 200 && ch->trust < LEVEL_ENFORCER )
	               {
		               send_to_char( "Try to find a lower level mobile to switch in to.", ch );
		               return ;
	               }

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

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

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






               void do_mload( CHAR_DATA *ch, char *argument )
               {
	               char arg[ MAX_INPUT_LENGTH ];
	               char arg2[ MAX_INPUT_LENGTH ];
	               char buf[ MAX_STRING_LENGTH ];
	               MOB_INDEX_DATA *pMobIndex;
	               CHAR_DATA *victim = NULL;
	               int loop_count = 0;

	               sprintf( buf, "%s: Mload %s", ch->name->str, argument );
	               if ( ch->level < NO_WATCH && ch->trust > 3 )
		               do_watching( ch, buf );

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

	               if ( arg[ 0 ] == '\0' || !is_number( arg ) )
	               {
		               send_to_char( "Syntax: mload <vnum>.\n\r", ch );
		               return ;
	               }

	               if ( ( pMobIndex = get_mob_index( atoi( arg ) ) ) == NULL )
	               {
		               send_to_char( "No mob has that vnum.\n\r", ch );
		               return ;
	               }

	               if ( arg2[ 0 ] != '\0' )
	               {
		               for ( loop_count = 0; loop_count != atoi( arg2 );loop_count++ )
		               {
			               victim = create_mobile( pMobIndex );
			               char_to_room( victim, ch->in_room );

		               }
		               act( "You have created $N!", ch, NULL, victim, TO_CHAR );

	               }
	               else
	               {
		               victim = create_mobile( pMobIndex );
		               char_to_room( victim, ch->in_room );
		               act( "You have created $N!", ch, NULL, victim, TO_CHAR );
	               }
	               //	act( "$n has created $N!", ch, NULL, victim, TO_ROOM );
	               return ;
               }



               void do_pload( CHAR_DATA *ch, char *argument )
               {
	               char buf[ MAX_STRING_LENGTH ];
	               DESCRIPTOR_DATA *d;
	               ROOM_INDEX_DATA *in_room;
	               bool fOld;

	               if ( IS_NPC( ch ) || ch->desc == NULL || ch->in_room == NULL )
		               return ;

	               if ( argument[ 0 ] == '\0' )
	               {
		               send_to_char( "Syntax: pload <name>.\n\r", ch );
		               return ;
	               }

	               if ( !check_parse_name( argument ) )
	               {
		               send_to_char( "Thats an illegal name.\n\r", ch );
		               return ;
	               }

	               if ( !char_exists( TRUE, argument ) )
	               {
		               send_to_char( "That player doesn't exist.\n\r", ch );
		               return ;
	               }

	               sprintf( buf, "%s: Pload %s", ch->name->str, argument );
	               if ( ch->level < NO_WATCH && ch->trust > 3 )
		               do_watching( ch, buf );

	               argument[ 0 ] = UPPER( argument[ 0 ] );

	               sprintf( buf, "You transform into %s.\n\r", argument );
	               send_to_char( buf, ch );
	               sprintf( buf, "$n transforms into %s.", argument );
	               act( buf, ch, NULL, NULL, TO_ROOM );

	               d = ch->desc;
	               do_autosave( ch, "" );
	               in_room = ch->in_room;
	               extract_char( ch, TRUE );
	               d->character = NULL;
	               fOld = load_char_obj( d, argument );
	               ch = d->character;
	               ch->next = char_list;
	               char_list = ch;
	               char_to_room( ch, in_room );
	               mudsetting->last_proc_logged = 111;
	               return ;
               }



               void do_preturn( CHAR_DATA *ch, char *argument )
                              {
	                              char arg[ MAX_INPUT_LENGTH ];
	                              char buf[ MAX_STRING_LENGTH ];
	                              DESCRIPTOR_DATA *d;
	                              bool fOld;

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

	                              if ( ch->pload == NULL )
	                              {send_to_char( "Huh?\n\r", ch ); return ;}
	                              sprintf( arg, ch->pload->str );
	                              if ( strlen( arg ) < 3 || strlen( arg ) > 8 )
	                              {send_to_char( "Huh?\n\r", ch ); return ;}

	                              if ( !str_cmp( ch->name->str, arg ) )
	                              {send_to_char( "Huh?\n\r", ch ); return ;}

	                              d = ch->desc;

	                              sprintf( buf, "You transform back into %s.\n\r", capitalize( ch->pload->str ) );
	                              send_to_char( buf, ch );
	                              sprintf( buf, "$n transforms back into %s.", capitalize( ch->pload->str ) );
	                              act( buf, ch, NULL, NULL, TO_ROOM );
	                              do_autosave( ch, "" );
	                              if ( ch != NULL && ch->desc != NULL )
		                              extract_char( ch, TRUE );
	                              else if ( ch != NULL )
		                              extract_char( ch, TRUE );
	                              if ( ch->desc )
		                              ch->desc->character = NULL;
	                              /*
	                                  ch->next = char_list;
	                                  char_list = ch;
	                              */
	                              fOld = load_char_obj( d, capitalize( arg ) );
	                              if ( ch->in_room != NULL )
		                              char_to_room( ch, ch->in_room );
	                              else
		                              char_to_room( ch, get_room_index( 3001 ) );
	                              ch->pload = g_string_assign( ch->pload, "" );
	                              return ;
                              }


                              void do_oload( CHAR_DATA *ch, char *argument )
                              {
	                              char arg1[ MAX_INPUT_LENGTH ];
	                              char arg2[ MAX_INPUT_LENGTH ];
	                              char buf[ MAX_STRING_LENGTH ];
	                              OBJ_INDEX_DATA *pObjIndex;
	                              OBJ_DATA *obj;
	                              int level;

	                              if ( IS_NPC( ch ) )
	                              {send_to_char( "Not while switched.\n\r", ch ); return ;}

	                              sprintf( buf, "%s: Oload %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH && ch->trust > 3 )
		                              do_watching( ch, buf );

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

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

	                              if ( arg2[ 0 ] == '\0' )
	                              {
		                              level = get_trust( ch );
	                              }
	                              else
	                              {
		                              if ( !is_number( arg2 ) )
		                              {
			                              send_to_char( "Syntax: oload <vnum> <level>.\n\r", ch );
			                              return ;
		                              }
		                              level = atoi( arg2 );
		                              if ( level < 0 || level > get_trust( ch ) )
		                              {
			                              send_to_char( "Limited to your trust level.\n\r", ch );
			                              return ;
		                              }
	                              }

	                              if ( ( pObjIndex = get_obj_index( atoi( arg1 ) ) ) == NULL )
	                              {
		                              send_to_char( "No object has that vnum.\n\r", ch );
		                              return ;
	                              }

	                              obj = create_object( pObjIndex, level );
	                              if ( CAN_WEAR( obj, ITEM_TAKE ) )
	                              {
		                              obj_to_char( obj, ch );
		                              act( "$p appears in $n's hands!", ch, obj, NULL, TO_ROOM );
	                              }
	                              else
	                              {
		                              obj_to_room( obj, ch->in_room );
		                              act( "$n has created $p!", ch, obj, NULL, TO_ROOM );
	                              }
	                              act( "You create $p.", ch, obj, NULL, TO_CHAR );
	                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
	                              return ;
                              }



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

	                              one_argument( argument, arg );

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

		                              for ( victim = ch->in_room->people; victim != NULL; victim = vnext )
		                              {
			                              vnext = victim->next_in_room;

			                              if ( !IS_NPC( victim ) )
				                              continue;
			                              if ( victim->mount != NULL )
				                              continue;
			                              if ( victim->desc != NULL )
				                              continue;

			                              extract_char( victim, TRUE );
		                              }

		                              for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
		                              {
			                              obj_next = obj->next_content;
			                              extract_obj( obj );
		                              }

		                              act( "$n purges the room!", ch, NULL, NULL, TO_ROOM );
		                              send_to_char( "Ok.\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 PC's.\n\r", ch );
		                              return ;
	                              }
	                              if ( victim->desc != NULL )
	                              {
		                              send_to_char( "Not on switched players.\n\r", ch );
		                              return ;
	                              }

	                              act( "$n purges $N.", ch, NULL, victim, TO_NOTVICT );
	                              extract_char( victim, TRUE );
	                              return ;
                              }



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

	                              sprintf( buf, "%s: Trust %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

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

	                              if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' )
	                              {
		                              send_to_char( "Syntax: trust <char> <trust>.\n\r", ch );
		                              send_to_char( "Trust being one of: None, Builder, Questmaker, Enforcer, Judge, or Highjudge.\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 ( !str_cmp( arg2, "none" ) )
		                              level = 0;
	                              else if ( !str_cmp( arg2, "builder" ) )
		                              level = 7;
	                              else if ( !str_cmp( arg2, "questmaker" ) )
		                              level = 8;
	                              else if ( !str_cmp( arg2, "enforcer" ) )
		                              level = 9;
	                              else if ( !str_cmp( arg2, "judge" ) )
		                              level = 10;
	                              else if ( !str_cmp( arg2, "highjudge" ) )
		                              level = 11;
	                              else
	                              {
		                              send_to_char( "Please enter: None, Builder, Questmaker, Enforcer, Judge, or Highjudge.\n\r", ch );
		                              return ;
	                              }

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



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

	                              sprintf( buf, "%s: Restore %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

	                              one_argument( argument, arg );
	                              if ( arg[ 0 ] == '\0' )
	                              {
		                              send_to_char( "Restore whom?\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->mana = victim->max_mana;
	                              victim->move = victim->max_move;
	                              victim->loc_hp[ 0 ] = 0;
	                              victim->loc_hp[ 1 ] = 0;
	                              victim->loc_hp[ 2 ] = 0;
	                              victim->loc_hp[ 3 ] = 0;
	                              victim->loc_hp[ 4 ] = 0;
	                              victim->loc_hp[ 5 ] = 0;
	                              victim->loc_hp[ 6 ] = 0;
	                              update_pos( victim );
	                              act( "$n has restored 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_STRING_LENGTH ];
	                              CHAR_DATA *victim;

	                              sprintf( buf, "%s: Freeze %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

	                              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.  You have been thawed out by an Admin.\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!  You have been FROZEN by an Admin.\n\r", victim );
		                              send_to_char( "FREEZE set.\n\r", ch );
	                              }

	                              save_char_obj( victim );

	                              return ;
                              }



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

	                              sprintf( buf, "%s: Log %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

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

	                              /*
	                               * 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 buf[ MAX_STRING_LENGTH ];
	                              CHAR_DATA *victim;

	                              sprintf( buf, "%s: Noemote %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

	                              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( "You can't emote!\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 buf[ MAX_STRING_LENGTH ];
	                              CHAR_DATA *victim;

	                              sprintf( buf, "%s: Notell %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

	                              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 can't tell!\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 buf[ MAX_STRING_LENGTH ];
	                              CHAR_DATA *victim;

	                              sprintf( buf, "%s: Silence %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

	                              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_peace( CHAR_DATA *ch, char *argument )
                              {
	                              CHAR_DATA * rch;
	                              char buf[ MAX_STRING_LENGTH ];

	                              sprintf( buf, "%s: Peace %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

	                              for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
	                              {
		                              if ( rch->fighting != NULL )
			                              stop_fighting( rch, TRUE );
	                              }

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

                              void do_wizlock( CHAR_DATA *ch, char *argument )
                              {
	                              extern bool wizlock;
	                              char buf[ MAX_STRING_LENGTH ];

	                              sprintf( buf, "%s: Wizlock %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );
	                              wizlock = !wizlock;

	                              if ( wizlock )
		                              send_to_char( "Game wizlocked.\n\r", ch );
	                              else
		                              send_to_char( "Game un-wizlocked.\n\r", ch );

	                              return ;
                              }

                              /* RT anti-newbie code */

                              void do_newlock( CHAR_DATA *ch, char *argument )
                              {
	                              extern bool newlock;
	                              newlock = !newlock;

	                              if ( newlock )
	                              {
		                              send_to_char( "New characters have been locked out.\n\r", ch );
	                              }
	                              else
	                              {
		                              send_to_char( "Newlock removed.\n\r", ch );
	                              }

	                              return ;
                              }


                              void do_slookup( CHAR_DATA *ch, char *argument )
                              {
	                              char buf[ MAX_STRING_LENGTH ];
	                              char arg[ MAX_INPUT_LENGTH ];
	                              int sn;

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

	                              if ( !str_cmp( arg, "all" ) )
	                              {
		                              for ( sn = 0; sn < MAX_SKILL; sn++ )
		                              {
			                              if ( skill_table[ sn ].name == NULL )
				                              break;
			                              sprintf( buf, "Sn: %4d Slot: %4d Skill/spell: '%s'\n\r",
			                                       sn, skill_table[ sn ].slot, skill_table[ sn ].name );
			                              send_to_char( buf, ch );
		                              }
	                              }
	                              else
	                              {
		                              if ( ( sn = skill_lookup( arg ) ) < 0 )
		                              {
			                              send_to_char( "No such skill or spell.\n\r", ch );
			                              return ;
		                              }

		                              sprintf( buf, "Sn: %4d Slot: %4d Skill/spell: '%s'\n\r",
		                                       sn, skill_table[ sn ].slot, skill_table[ sn ].name );
		                              send_to_char( buf, ch );
	                              }

	                              return ;
                              }



                              void do_sset( 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 ];
	                              CHAR_DATA *victim;
	                              int value;
	                              int sn;
	                              bool fAll;

	                              sprintf( buf, "%s: Sset %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

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

	                              if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' || arg3[ 0 ] == '\0' )
	                              {
		                              send_to_char( "Syntax: sset <victim> <skill> <value>\n\r", ch );
		                              send_to_char( "or:     sset <victim> all     <value>\n\r", ch );
		                              send_to_char( "Skill being any skill or spell.\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 NPC's.\n\r", ch );
		                              return ;
	                              }


	                              fAll = !str_cmp( arg2, "all" );
	                              sn = 0;
	                              if ( !fAll && ( sn = skill_lookup( arg2 ) ) < 0 )
	                              {
		                              send_to_char( "No such skill or spell.\n\r", ch );
		                              return ;
	                              }

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

	                              value = atoi( arg3 );
	                              if ( value < 0 || value > 100 )
	                              {
		                              send_to_char( "Value range is 0 to 100.\n\r", ch );
		                              return ;
	                              }

	                              if ( fAll )
	                              {
		                              for ( sn = 0; sn < MAX_SKILL; sn++ )
		                              {
			                              if ( skill_table[ sn ].name != NULL )
				                              victim->pcdata->learned[ sn ] = value;
		                              }
	                              }
	                              else
	                              {
		                              victim->pcdata->learned[ sn ] = value;
	                              }

	                              send_to_char( "Ok.\n\r", 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 buf[ MAX_STRING_LENGTH ];
	                              CHAR_DATA *victim;
	                              int value, loop_count;  // , age_ch;
	                              bool SECT_FOUND = FALSE;

	                              sprintf( buf, "%s: Mset %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

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

	                              if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' || arg3[ 0 ] == '\0' )
	                              {
		                              send_to_char( "Syntax: mset <victim> <field>  <value>\n\r", ch );
		                              send_to_char( "or:     mset <victim> <string> <value>\n\r", ch );
		                              send_to_char( "\n\r", ch );
		                              send_to_char( "Field being one of:\n\r", ch );
		                              send_to_char( "  str int wis dex con sex level exp sec\n\r", ch );
		                              send_to_char( "  gold hp mana move primal align\n\r", ch );
		                              send_to_char( "  thirst drunk full hit dam ac hours\n\r", ch );
		                              send_to_char( "  rpstatus clan cp honor glory wisdom\n\r", ch );
		                              send_to_char( "  pkstatus lag\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 description title sect spec\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;

	                              /*
	                               * Set something.
	                               */
	                              if ( !str_cmp( arg2, "str" ) )
	                              {
		                              if ( IS_NPC( victim ) )
		                              {
			                              send_to_char( "Not on NPC's.\n\r", ch );
			                              return ;
		                              }

		                              if ( value < 3 || value > 18 )
		                              {
			                              send_to_char( "Strength range is 3 to 18.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->perm_str = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value < 0 || value > 20 )
		                              {
			                              send_to_char( "lag range is 0 to 20.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->lag_time = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

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

		                              if ( !IS_SWWF( victim ) )
		                              {
			                              send_to_char( "Only on The Spiral Children Garou..\n\r", ch );
			                              return ;
		                              }

		                              if ( value < 1 || value > 5 )
		                              {
			                              send_to_char( "glory range is 1 to 5.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->renown[ RENOWN_GLORY ] = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

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

		                              if ( !IS_SWWF( victim ) )
		                              {
			                              send_to_char( "Only on The Spiral Children Garou..\n\r", ch );
			                              return ;
		                              }

		                              if ( value < 1 || value > 5 )
		                              {
			                              send_to_char( "honor range is 1 to 5.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->renown[ RENOWN_GLORY ] = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

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

		                              if ( !IS_SWWF( victim ) )
		                              {
			                              send_to_char( "Only on The Spiral Children Garou..\n\r", ch );
			                              return ;
		                              }

		                              if ( value < 1 || value > 5 )
		                              {
			                              send_to_char( "wisdom range is 1 to 5.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->renown[ RENOWN_WISDOM ] = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }


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

		                              if ( value < 0 || value > 25 )
		                              {
			                              send_to_char( "pk_status range is 0 to 25.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->race = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }


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

		                              if ( value < 0 || value > 20 )
		                              {
			                              send_to_char( "cp range is 0 to 20.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->charpoints = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }


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

		                              if ( value < 3 || value > 18 )
		                              {
			                              send_to_char( "Intelligence range is 3 to 18.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->perm_int = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value > 3000 )
		                              {
			                              send_to_char( "Hour range is 0 to 3000.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              //	age_ch = (value / 2 ) - 17;
			                              //      ch->played = (((value * 7200) - 17) - (int) (current_time - ch->logon));
			                              value *= 3600;
			                              victim->played = value;

			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;

	                              }


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

		                              if ( value > 9 )
		                              {
			                              send_to_char( "Security range is 0 to 9.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->security = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;

	                              }

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

		                              if ( value < 3 || value > 18 )
		                              {
			                              send_to_char( "Wisdom range is 3 to 18.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->perm_wis = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value < 3 || value > 18 )
		                              {
			                              send_to_char( "Dexterity range is 3 to 18.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->perm_dex = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value < 3 || value > 18 )
		                              {
			                              send_to_char( "Constitution range is 3 to 18.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) )
		                              {
			                              victim->pcdata->perm_con = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "sex" ) )
	                              {
		                              if ( value < 0 || value > 2 )
		                              {
			                              send_to_char( "Sex range is 0 to 2.\n\r", ch );
			                              return ;
		                              }
		                              victim->sex = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "level" ) )
	                              {
		                              if ( IS_NPC( victim ) && ( value < 1 || value > 250 ) )
		                              {
			                              send_to_char( "Level range is 1 to 250 for mobs.\n\r", ch );
			                              return ;
		                              }
		                              else if ( !IS_JUDGE( ch ) )
		                              {
			                              send_to_char( "Sorry, no can do...\n\r", ch );
			                              return ;
		                              }
		                              if ( !str_cmp( arg3, "mortal" ) )
			                              value = 2;
		                              else if ( !str_cmp( arg3, "avatar" ) )
			                              value = 3;
		                              else if ( !str_cmp( arg3, "apprentice" ) )
			                              value = 4;
		                              else if ( !str_cmp( arg3, "mage" ) )
			                              value = 5;
		                              else if ( !str_cmp( arg3, "archmage" ) )
			                              value = 6;
		                              else if ( !str_cmp( arg3, "builder" ) )
			                              value = 7;
		                              else if ( !str_cmp( arg3, "questmaker" ) )
			                              value = 8;
		                              else if ( !str_cmp( arg3, "enforcer" ) )
			                              value = 9;
		                              else if ( !str_cmp( arg3, "judge" ) )
			                              value = 10;
		                              else if ( !str_cmp( arg3, "highjudge" ) )
			                              value = 11;
		                              else if ( !IS_NPC( victim ) )
		                              {
			                              send_to_char( "Level should be one of the following:\n\rMortal, Avatar, Apprentice, Mage, Archmage, Builder, Questmaker, Enforcer,\n\rJudge, or Highjudge.\n\r", ch );
			                              return ;
		                              }

		                              if ( value >= ch->level && !IS_NPC( victim ) )
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              else
		                              {
			                              victim->level = value;
			                              victim->trust = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "hitroll" ) || !str_cmp( arg2, "hit" ) )
	                              {
		                              if ( !IS_NPC( victim ) && ( value < 0 || value > 50 ) )
		                              {
			                              send_to_char( "Hitroll range is 0 to 50.\n\r", ch );
			                              return ;
		                              }
		                              else if ( IS_NPC( victim ) && ( value < 0 || value > 250 ) )
		                              {
			                              send_to_char( "Hitroll range is 0 to 250.\n\r", ch );
			                              return ;
		                              }
		                              if ( !IS_NPC( victim ) && !IS_JUDGE( ch ) && ch != victim )
		                              {
			                              send_to_char( "Sorry, no can do...\n\r", ch );
			                              return ;
		                              }
		                              victim->hitroll = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "damroll" ) || !str_cmp( arg2, "dam" ) )
	                              {
		                              if ( !IS_NPC( victim ) && ( value < 0 || value > 50 ) )
		                              {
			                              send_to_char( "Damroll range is 0 to 50.\n\r", ch );
			                              return ;
		                              }
		                              else if ( IS_NPC( victim ) && ( value < 0 || value > 250 ) )
		                              {
			                              send_to_char( "Damroll range is 0 to 250.\n\r", ch );
			                              return ;
		                              }
		                              if ( !IS_NPC( victim ) && !IS_JUDGE( ch ) && ch != victim )
		                              {
			                              send_to_char( "Sorry, no can do...\n\r", ch );
			                              return ;
		                              }
		                              victim->damroll = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "armor" ) || !str_cmp( arg2, "ac" ) )
	                              {
		                              if ( !IS_NPC( victim ) && ( value < -200 || value > 200 ) )
		                              {
			                              send_to_char( "Armor class range is -200 to 200.\n\r", ch );
			                              return ;
		                              }
		                              if ( !IS_NPC( victim ) && !IS_JUDGE( ch ) && ch != victim )
		                              {
			                              send_to_char( "Sorry, no can do...\n\r", ch );
			                              return ;
		                              }
		                              victim->armor = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value < 0 )
		                              {
			                              send_to_char( "Exp must be at least 0.\n\r", ch );
			                              return ;
		                              }

		                              if ( value > 100000000 )
		                              {
			                              send_to_char( "No more than 100,000,000 possible.\n\r", ch );
			                              return ;
		                              }

		                              if ( IS_JUDGE( ch ) || ( ch == victim ) )
		                              {
			                              victim->exp = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "gold" ) )
	                              {
		                              if ( value > 100000 && !IS_JUDGE( ch ) )
			                              send_to_char( "Don't be so damn greedy!\n\r", ch );
		                              else
		                              {victim->gold = value; send_to_char( "Ok.\n\r", ch );}
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "hp" ) )
	                              {
		                              if ( value < 1 || value > 120000 )
		                              {
			                              send_to_char( "Hp range is 1 to 120,000 hit points.\n\r", ch );
			                              return ;
		                              }
		                              if ( IS_JUDGE( ch ) || ( ch == victim ) || ( IS_NPC( victim ) ) )
		                              {
			                              victim->max_hit = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "mana" ) )
	                              {
		                              if ( value < 0 || value > 120000 )
		                              {
			                              send_to_char( "Mana range is 0 to 120,000 mana points.\n\r", ch );
			                              return ;
		                              }
		                              if ( IS_JUDGE( ch ) || ( ch == victim ) || ( IS_NPC( victim ) ) )
		                              {
			                              victim->max_mana = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "move" ) )
	                              {
		                              if ( value < 0 || value > 120000 )
		                              {
			                              send_to_char( "Move range is 0 to 120,000 move points.\n\r", ch );
			                              return ;
		                              }
		                              if ( IS_JUDGE( ch ) || ( ch == victim ) || ( IS_NPC( victim ) ) )
		                              {
			                              victim->max_move = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "primal" ) )
	                              {
		                              if ( value < 0 || value > 10000 )
		                              {
			                              send_to_char( "Primal range is 0 to 10000.\n\r", ch );
			                              return ;
		                              }
		                              if ( IS_JUDGE( ch ) || ( ch == victim ) )
		                              {
			                              victim->practice = value;
			                              send_to_char( "Ok.\n\r", ch );
		                              }
		                              else
			                              send_to_char( "Sorry, no can do...\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "align" ) )
	                              {
		                              if ( value < -1000 || value > 1000 )
		                              {
			                              send_to_char( "Alignment range is -1000 to 1000.\n\r", ch );
			                              return ;
		                              }
		                              victim->alignment = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value < 0 || value > 100 )
		                              {
			                              send_to_char( "Thirst range is 0 to 100.\n\r", ch );
			                              return ;
		                              }

		                              victim->pcdata->condition[ COND_THIRST ] = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value < 0 || value > 100 )
		                              {
			                              send_to_char( "Drunk range is 0 to 100.\n\r", ch );
			                              return ;
		                              }

		                              victim->pcdata->condition[ COND_DRUNK ] = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

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

		                              if ( value < 0 || value > 100 )
		                              {
			                              send_to_char( "Full range is 0 to 100.\n\r", ch );
			                              return ;
		                              }

		                              victim->pcdata->condition[ COND_FULL ] = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "name" ) )
	                              {
		                              if ( !IS_NPC( victim ) )
		                              {
			                              send_to_char( "Not on PC's.\n\r", ch );
			                              return ;
		                              }

		                              victim->name = g_string_assign( victim->name, arg3 );
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "short" ) )
	                              {
		                              victim->short_descr = g_string_assign( victim->short_descr, arg3 );
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "long" ) )
	                              {
		                              strcat( arg3, "\n\r" );
		                              victim->long_descr = g_string_assign( victim->long_descr, arg3 );
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

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

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

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

		                              if ( arg3 != NULL )
		                              {
			                              if ( !str_cmp( arg3, "none" ) )
			                              {
				                              victim->sect = SECT_INDEPENDENT;
				                              send_to_char( "Sect cleared.\n\r", ch );
				                              return ;
			                              }
			                              else
			                              {

				                              for ( loop_count = 0;loop_count != MAX_SECTS;loop_count++ )
				                              {
					                              if ( !str_prefix( arg3, sect_table[ loop_count ].pretty_name ) )
					                              {
						                              SECT_FOUND = TRUE;
						                              break;
					                              }
				                              }

				                              if ( SECT_FOUND == TRUE )
				                              {
					                              victim->sect = loop_count;
					                              send_to_char( "Sect set to '", ch );
					                              send_to_char( sect_table[ victim->sect ].pretty_name, ch );
					                              send_to_char( "'.\n\r", ch );
				                              }
				                              else
					                              send_to_char( "Sect not found!\n\r", ch );

				                              return ;
			                              }

		                              }
		                              else
		                              {
			                              send_to_char( "You must enter a sect, or 'none' to clear.\n\r", ch );
			                              return ;
		                              }
	                              }

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

		                              if ( arg3 != NULL )
		                              {
			                              for ( loop_count = 0;loop_count != MAX_ICLAN;loop_count++ )
			                              {
				                              if ( !str_prefix( arg3, iclan_table[ loop_count ].pretty_name ) )
				                              {
					                              SECT_FOUND = TRUE;
					                              break;
				                              }
			                              }

			                              if ( SECT_FOUND == TRUE )
			                              {
				                              victim->clan = loop_count;
				                              send_to_char( "Clan set to '", ch );
				                              send_to_char( iclan_table[ victim->clan ].pretty_name, ch );
				                              send_to_char( "'.\n\r", ch );
				                              return ;
			                              }
			                              else
			                              {
				                              send_to_char( "Clan not found!\n\r", ch );
				                              return ;
			                              }

		                              }
		                              else
		                              {
			                              send_to_char( "You must enter a clan.\n\r", ch );
			                              return ;
		                              }
	                              }

	                              if ( !str_cmp( arg2, "spec" ) )
	                              {
		                              if ( !IS_NPC( victim ) )
		                              {
			                              send_to_char( "Not on PC's.\n\r", ch );
			                              return ;
		                              }

		                              if ( ( victim->spec_fun = spec_lookup( arg3 ) ) == 0 )
		                              {
			                              send_to_char( "No such spec fun.\n\r", ch );
			                              return ;
		                              }

		                              send_to_char( "Ok.\n\r", ch );
		                              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 ];
	                              CHAR_DATA *victim;
	                              OBJ_DATA *obj;
	                              OBJ_DATA *morph;
	                              OBJ_INDEX_DATA *pObjIndex;
	                              int value;

	                              if ( IS_NPC( ch ) )
	                              {send_to_char( "Not while switched.\n\r", ch ); return ;}

	                              sprintf( buf, "%s: Oset %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

	                              smash_tilde( argument );
	                              argument = one_argument( argument, arg1 );
	                              argument = one_argument( argument, arg2 );
	                              str_cpy( 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( "or:     oset <object> <affect> <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\n\r", ch );
		                              send_to_char( "  level weight cost timer morph\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 ed type extra wear owner\n\r", ch );
		                              send_to_char( "\n\r", ch );
		                              send_to_char( "Affect being one of:\n\r", ch );
		                              send_to_char( "  str dex int wis con\n\r", ch );
		                              send_to_char( "  hit dam ac hp mana move\n\r", ch );
		                              return ;
	                              }

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


	                              if ( !IS_JUDGE( ch ) && ( obj->questmaker == NULL || str_cmp( ch->name->str, obj->questmaker->str ) ) )
	                              {
		                              send_to_char( "You don't have permission to change that item.\n\r", ch );
		                              return ;
	                              }

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

	                              /*
	                               * Set something.
	                               */
	                              if ( !str_cmp( arg2, "value0" ) || !str_cmp( arg2, "v0" ) )
	                              {
		                              if ( obj->item_type == ITEM_WEAPON && !IS_JUDGE( ch ) )
		                              {
			                              send_to_char( "You are not authorised to create spell weapons.\n\r", ch );
			                              return ;
		                              }
		                              else if ( obj->item_type == ITEM_QUEST )
		                              {
			                              send_to_char( "You cannot change a quest tokens value with oset.\n\r", ch );
			                              return ;
		                              }
		                              else if ( obj->item_type == ITEM_ARMOR && value > 15 )
			                              obj->value[ 0 ] = 15;
		                              else
			                              obj->value[ 0 ] = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) )
	                              {
		                              if ( obj->item_type == ITEM_WEAPON && value > 10 )
			                              obj->value[ 1 ] = 10;
		                              else
			                              obj->value[ 1 ] = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) )
	                              {
		                              if ( obj->item_type == ITEM_WEAPON && value > 20 )
			                              obj->value[ 2 ] = 20;
		                              else
			                              obj->value[ 2 ] = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) )
	                              {
		                              if ( obj->item_type == ITEM_ARMOR && !IS_JUDGE( ch ) )
			                              send_to_char( "You are not authorised to create spell armour.\n\r", ch );
		                              else
		                              {obj->value[ 3 ] = value; send_to_char( "Ok.\n\r", ch );}
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "morph" ) )
	                              {
		                              int mnum;
		                              if ( IS_SET( obj->spectype, SITEM_MORPH ) )
		                              {
			                              send_to_char( "This item can already morph.\n\r", ch );
			                              return ;
		                              }
		                              if ( ( pObjIndex = get_obj_index( value ) ) == NULL )
		                              {
			                              send_to_char( "No object has that vnum.\n\r", ch );
			                              return ;
		                              }
		                              morph = create_object( pObjIndex, obj->level );
		                              if ( !CAN_WEAR( morph, ITEM_TAKE ) )
			                              SET_BIT( morph->wear_flags, ITEM_TAKE );
		                              if ( !IS_SET( obj->spectype, SITEM_MORPH ) )
			                              SET_BIT( obj->spectype, SITEM_MORPH );
		                              if ( !IS_SET( morph->spectype, SITEM_MORPH ) )
			                              SET_BIT( morph->spectype, SITEM_MORPH );
		                              obj_to_char( morph, ch );
		                              act( "$p morphs into $P in $n's hands!", ch, obj, morph, TO_ROOM );
		                              act( "$p morphs into $P in your hands!", ch, obj, morph, TO_CHAR );
		                              mnum = obj->wear_loc;
		                              obj_from_char( obj );
		                              obj_to_obj( obj, morph );
		                              if ( morph->wear_flags == obj->wear_flags && mnum != WEAR_NONE )
			                              equip_char( ch, morph, mnum );
		                              morph->questmaker = g_string_assign( morph->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "extra" ) )
	                              {
		                              if ( !str_cmp( arg3, "glow" ) )
			                              value = ITEM_GLOW;
		                              else if ( !str_cmp( arg3, "hum" ) )
			                              value = ITEM_HUM;
		                              else if ( !str_cmp( arg3, "thrown" ) )
			                              value = ITEM_THROWN;
		                              else if ( !str_cmp( arg3, "vanish" ) )
			                              value = ITEM_VANISH;
		                              else if ( !str_cmp( arg3, "invis" ) )
			                              value = ITEM_INVIS;
		                              else if ( !str_cmp( arg3, "magic" ) )
			                              value = ITEM_MAGIC;
		                              else if ( !str_cmp( arg3, "nodrop" ) )
			                              value = ITEM_NODROP;
		                              else if ( !str_cmp( arg3, "bless" ) )
			                              value = ITEM_BLESS;
		                              else if ( !str_cmp( arg3, "anti-good" ) )
			                              value = ITEM_ANTI_GOOD;
		                              else if ( !str_cmp( arg3, "anti-evil" ) )
			                              value = ITEM_ANTI_EVIL;
		                              else if ( !str_cmp( arg3, "anti-neutral" ) )
			                              value = ITEM_ANTI_NEUTRAL;
		                              else if ( !str_cmp( arg3, "noremove" ) )
			                              value = ITEM_NOREMOVE;
		                              else if ( !str_cmp( arg3, "inventory" ) )
			                              value = ITEM_INVENTORY;
		                              else if ( !str_cmp( arg3, "loyal" ) )
			                              value = ITEM_LOYAL;
		                              else
		                              {
			                              send_to_char( "Extra flag can be from the following: Glow, Hum, Thrown, Vanish, Invis, Magic, Nodrop, Bless, Anti-Good, Anti-Evil, Anti-Neutral, Noremove, Inventory, Loyal.\n\r", ch );
			                              return ;
		                              }

		                              /* Removing magic flag allows multiple enchants */
		                              if ( IS_SET( obj->extra_flags, value ) && value == ITEM_MAGIC && !IS_JUDGE( ch ) )
		                              {send_to_char( "Sorry, no can do...\n\r", ch ); return ;}

		                              if ( IS_SET( obj->extra_flags, value ) )
			                              REMOVE_BIT( obj->extra_flags, value );
		                              else
			                              SET_BIT( obj->extra_flags, value );
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "wear" ) )
	                              {
		                              if ( !str_cmp( arg3, "none" ) || !str_cmp( arg3, "clear" ) )
		                              {
			                              obj->wear_flags = 0;
			                              send_to_char( "Ok.\n\r", ch );
			                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
			                              return ;
		                              }
		                              else if ( !str_cmp( arg3, "take" ) )
		                              {
			                              if ( IS_SET( obj->wear_flags, ITEM_TAKE ) )
				                              REMOVE_BIT( obj->wear_flags, ITEM_TAKE );
			                              else
				                              SET_BIT( obj->wear_flags, ITEM_TAKE );
			                              send_to_char( "Ok.\n\r", ch );
			                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
			                              return ;
		                              }
		                              else if ( !str_cmp( arg3, "finger" ) )
			                              value = ITEM_WEAR_FINGER;
		                              else if ( !str_cmp( arg3, "neck" ) )
			                              value = ITEM_WEAR_NECK;
		                              else if ( !str_cmp( arg3, "body" ) )
			                              value = ITEM_WEAR_BODY;
		                              else if ( !str_cmp( arg3, "head" ) )
			                              value = ITEM_WEAR_HEAD;
		                              else if ( !str_cmp( arg3, "legs" ) )
			                              value = ITEM_WEAR_LEGS;
		                              else if ( !str_cmp( arg3, "feet" ) )
			                              value = ITEM_WEAR_FEET;
		                              else if ( !str_cmp( arg3, "hands" ) )
			                              value = ITEM_WEAR_HANDS;
		                              else if ( !str_cmp( arg3, "arms" ) )
			                              value = ITEM_WEAR_ARMS;
		                              else if ( !str_cmp( arg3, "about" ) )
			                              value = ITEM_WEAR_ABOUT;
		                              else if ( !str_cmp( arg3, "waist" ) )
			                              value = ITEM_WEAR_WAIST;
		                              else if ( !str_cmp( arg3, "wrist" ) )
			                              value = ITEM_WEAR_WRIST;
		                              else if ( !str_cmp( arg3, "hold" ) )
			                              value = ITEM_WIELD;
		                              else if ( !str_cmp( arg3, "face" ) )
			                              value = ITEM_WEAR_FACE;
		                              else
		                              {
			                              send_to_char( "Wear location can be from: None, Take, Finger, Neck, Body, Head, Legs, Hands, Arms, About, Waist, Hold, Face.\n\r", ch );
			                              return ;
		                              }
		                              if ( IS_SET( obj->wear_flags, ITEM_TAKE ) )
			                              value += 1;
		                              obj->wear_flags = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "level" ) )
	                              {
		                              if ( value < 1 )
			                              value = 1;
		                              else if ( value > 50 )
			                              value = 50;
		                              if ( !IS_JUDGE( ch ) )
			                              send_to_char( "You are not authorised to change an items level.\n\r", ch );
		                              else
		                              {
			                              obj->level = value;
			                              send_to_char( "Ok.\n\r", ch );
			                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
			                              return ;
		                              }
	                              }

	                              if ( !str_cmp( arg2, "weight" ) )
	                              {
		                              obj->weight = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "cost" ) )
	                              {
		                              if ( value > 100000 && !IS_JUDGE( ch ) )
			                              send_to_char( "Don't be so damn greedy!\n\r", ch );
		                              else
		                              {
			                              obj->cost = value;
			                              send_to_char( "Ok.\n\r", ch );
			                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              }
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "timer" ) )
	                              {
		                              obj->timer = value;
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "hitroll" ) || !str_cmp( arg2, "hit" ) )
	                              {oset_affect( ch, obj, value, APPLY_HITROLL, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "damroll" ) || !str_cmp( arg2, "dam" ) )
	                              {oset_affect( ch, obj, value, APPLY_DAMROLL, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "armor" ) || !str_cmp( arg2, "ac" ) )
	                              {oset_affect( ch, obj, value, APPLY_AC, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "hitpoints" ) || !str_cmp( arg2, "hp" ) )
	                              {oset_affect( ch, obj, value, APPLY_HIT, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "mana" ) )
	                              {oset_affect( ch, obj, value, APPLY_MANA, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "move" ) || !str_cmp( arg2, "movement" ) )
	                              {oset_affect( ch, obj, value, APPLY_MOVE, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "str" ) || !str_cmp( arg2, "strength" ) )
	                              {oset_affect( ch, obj, value, APPLY_STR, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "dex" ) || !str_cmp( arg2, "dexterity" ) )
	                              {oset_affect( ch, obj, value, APPLY_DEX, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "int" ) || !str_cmp( arg2, "intelligence" ) )
	                              {oset_affect( ch, obj, value, APPLY_INT, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "wis" ) || !str_cmp( arg2, "wisdom" ) )
	                              {oset_affect( ch, obj, value, APPLY_WIS, FALSE ); return ;}
	                              else if ( !str_cmp( arg2, "con" ) || !str_cmp( arg2, "constitution" ) )
	                              {oset_affect( ch, obj, value, APPLY_CON, FALSE ); return ;}

	                              if ( !str_cmp( arg2, "type" ) )
	                              {
		                              if ( !IS_JUDGE( ch ) )
		                              {
			                              send_to_char( "You are not authorised to change an item type.\n\r", ch );
			                              return ;
		                              }
		                              if ( !str_cmp( arg3, "light" ) )
			                              obj->item_type = 1;
		                              else if ( !str_cmp( arg3, "scroll" ) )
			                              obj->item_type = 2;
		                              else if ( !str_cmp( arg3, "wand" ) )
			                              obj->item_type = 3;
		                              else if ( !str_cmp( arg3, "staff" ) )
			                              obj->item_type = 4;
		                              else if ( !str_cmp( arg3, "weapon" ) )
			                              obj->item_type = 5;
		                              else if ( !str_cmp( arg3, "treasure" ) )
			                              obj->item_type = 8;
		                              else if ( !str_cmp( arg3, "armor" ) )
			                              obj->item_type = 9;
		                              else if ( !str_cmp( arg3, "armour" ) )
			                              obj->item_type = 9;
		                              else if ( !str_cmp( arg3, "potion" ) )
			                              obj->item_type = 10;
		                              else if ( !str_cmp( arg3, "furniture" ) )
			                              obj->item_type = 12;
		                              else if ( !str_cmp( arg3, "trash" ) )
			                              obj->item_type = 13;
		                              else if ( !str_cmp( arg3, "container" ) )
			                              obj->item_type = 15;
		                              else if ( !str_cmp( arg3, "drink" ) )
			                              obj->item_type = 17;
		                              else if ( !str_cmp( arg3, "key" ) )
			                              obj->item_type = 18;
		                              else if ( !str_cmp( arg3, "food" ) )
			                              obj->item_type = 19;
		                              else if ( !str_cmp( arg3, "money" ) )
			                              obj->item_type = 20;
		                              else if ( !str_cmp( arg3, "boat" ) )
			                              obj->item_type = 22;
		                              else if ( !str_cmp( arg3, "corpse" ) )
			                              obj->item_type = 23;
		                              else if ( !str_cmp( arg3, "fountain" ) )
			                              obj->item_type = 25;
		                              else if ( !str_cmp( arg3, "pill" ) )
			                              obj->item_type = 26;
		                              else if ( !str_cmp( arg3, "portal" ) )
			                              obj->item_type = 27;
		                              else if ( !str_cmp( arg3, "stake" ) )
			                              obj->item_type = 30;
		                              else if ( !str_cmp( arg3, "stake" ) )
			                              obj->item_type = 30;
		                              else
		                              {
			                              send_to_char( "Type can be one of: Light, Scroll, Wand, Staff, Weapon, Treasure, Armor, Potion, Furniture, Trash, Container, Drink, Key, Food, Money, Boat, Corpse, Fountain, Pill, Portal, Stake.\n\r", ch );
			                              return ;
		                              }
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "owner" ) )
	                              {
		                              if ( IS_NPC( ch ) )
		                              {send_to_char( "Not while switched.\n\r", ch ); return ;}
		                              if ( !IS_JUDGE( ch ) && ( obj->questmaker == NULL || str_cmp( ch->name->str, obj->questmaker->str ) ) )
		                              {send_to_char( "Someone else has already changed this item.\n\r", ch ); return ;}
		                              if ( ( victim = get_char_world( ch, arg3 ) ) == NULL )
		                              {send_to_char( "You cannot find any player by that name.\n\r", ch ); return ;}
		                              if ( IS_NPC( victim ) )
		                              {send_to_char( "Not on NPC's.\n\r", ch ); return ;}
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              obj->questmaker = g_string_assign( obj->questmaker, victim->name->str );
		                              send_to_char( "Ok.\n\r", ch );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "name" ) )
	                              {
		                              obj->name = g_string_assign( obj->name, arg3 );
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "short" ) )
	                              {
		                              obj->name = g_string_assign( obj->name, arg3 );
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "long" ) )
	                              {
		                              obj->description = g_string_assign( obj->description, arg3 );
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "ed" ) )
	                              {
		                              EXTRA_DESCR_DATA * ed;

		                              argument = one_argument( argument, arg3 );
		                              if ( argument == NULL )
		                              {
			                              send_to_char( "Syntax: oset <object> ed <keyword> <string>\n\r",
			                                            ch );
			                              return ;
		                              }

		                              /*
		                              if ( extra_descr_free == NULL )
		                               {
		                              	ed			= alloc_perm( sizeof(*ed) );
		                               }
		                              else
		                               {
		                              	ed			= extra_descr_free;
		                              	extra_descr_free	= ed;
		                               }
		                              */
		                              ed = new_extra_descr();
		                              ed->keyword	= g_strdup( arg3 );
		                              ed->description	= g_strdup( argument );
		                              ed->next	= obj->extra_descr;
		                              obj->extra_descr	= ed;
		                              send_to_char( "Ok.\n\r", ch );
		                              obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
		                              return ;
	                              }

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



                              void do_rset( 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 ];
	                              ROOM_INDEX_DATA *location;
	                              int value;

	                              sprintf( buf, "%s: Rset %s", ch->name->str, argument );
	                              if ( ch->level < NO_WATCH )
		                              do_watching( ch, buf );

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

	                              if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' || arg3[ 0 ] == '\0' )
	                              {
		                              send_to_char( "Syntax: rset <location> <field> value\n\r", ch );
		                              send_to_char( "\n\r", ch );
		                              send_to_char( "Field being one of:\n\r", ch );
		                              send_to_char( "  flags sector\n\r", ch );
		                              return ;
	                              }

	                              if ( ( location = find_location( ch, arg1 ) ) == NULL )
	                              {
		                              send_to_char( "No such location.\n\r", ch );
		                              return ;
	                              }

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

	                              /*
	                               * Set something.
	                               */
	                              if ( !str_cmp( arg2, "flags" ) )
	                              {
		                              location->room_flags	= value;
		                              return ;
	                              }

	                              if ( !str_cmp( arg2, "sector" ) )
	                              {
		                              location->sector_type	= value;
		                              return ;
	                              }

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

                              struct desc_index
                              {
	                              DESCRIPTOR_DATA *d;
                              };

typedef struct desc_index DESCRIPTOR_INDEX;

int sort_d_list( const void *v1, const void *v2 )
{
	DESCRIPTOR_INDEX d1 = *( DESCRIPTOR_INDEX * ) v1;
	DESCRIPTOR_INDEX d2 = *( DESCRIPTOR_INDEX * ) v2;
	int i;

	for ( i = 0; d1.d->host->str[ i ] != '\0'; i++ )
	{
		if ( d1.d->host->str[ i ] == d2.d->host->str[ i ] )
			continue;
		if ( d2.d->host->str[ i ] == '\0' )
			return 1;
		if ( d1.d->host->str[ i ] > d2.d->host->str[ i ] )
			return 1;
		if ( d1.d->host->str[ i ] < d2.d->host->str[ i ] )
			return -1;

	}
	return 0;
}

void sort_user_host( CHAR_DATA *ch )
{
	char buf[ MAX_STRING_LENGTH ];
	char buf2[ MAX_STRING_LENGTH ];
	DESCRIPTOR_DATA *d;
	DESCRIPTOR_INDEX d_sort[ 100 ];
	int count, i;
	char * st;
	char s[ 100 ];
	char idle[ 10 ];
	CHAR_DATA *vch;
	GSList	*desc_list;

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

	send_to_char( "Sorted!\n\r", ch );
	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->character != NULL && can_see( ch, d->character ) )
		{
			d_sort[ count ].d = d;
			count++;
		}
	}

	/*    index array, count, size of singe cell, sort command */
	qsort( d_sort, count, sizeof( DESCRIPTOR_INDEX ), sort_d_list );

	for ( i = 0; i < count; i++ )
	{
		d = d_sort[ i ].d;

		if ( d == NULL )
			continue;

		/* NB: You may need to edit the CON_ values */
		switch ( d->connected )
		{
				case CON_PLAYING:
				st = "    PLAYING    ";
				break;
				case CON_GET_NAME:
				st = "   Get Name    ";
				break;
				case CON_GET_OLD_PASSWORD:
				st = "Get Old Passwd ";
				break;
				case CON_CONFIRM_NEW_NAME:
				st = " Confirm Name  ";
				break;
				case CON_GET_NEW_PASSWORD:
				st = "Get New Passwd ";
				break;
				case CON_CONFIRM_NEW_PASSWORD:
				st = "Confirm Passwd ";
				break;
				case CON_READ_MOTD:
				st = "  Reading MOTD ";
				break;
				case CON_NOT_PLAYING:
				st = " Not  Playing  ";
				break;
				case CON_NOTE_TO:
				st = "   Note To     ";
				break;
				case CON_NOTE_SUBJECT:
				st = " Note Subject  ";
				break;
				case CON_NOTE_TEXT:
				st = "   Note Text   ";
				break;
				case CON_NOTE_FINISH:
				st = " Note Finish   ";
				break;
				case CON_COPYOVER_RECOVER:
				st = "CopyoverRecover";
				break;
				case CON_READLOG:
				st = "   Readlog     ";
				break;
				default:
				st = "   !UNKNOWN!   ";
				break;

		}

		/* Format "login" value... */
		vch = d->original ? d->original : d->character;
		strftime( s, 100, "%I:%M%p", localtime( &vch->logon ) );

		if ( vch->level <= LEVEL_HERO && vch->timer > 0 )
			sprintf( idle, "%-2d", vch->timer );
		else
			sprintf( idle, "  " );

		sprintf( buf, "[%3d {r%s{x %7s %2s] {b%-12s{x {Y%-32.32s{x\n\r",
		         d->descriptor,
		         st,
		         s,
		         idle,
		         ( d->original ) ? d->original->name->str
		         : ( d->character ) ? d->character->name->str
		         : "(None!)",
		         d->host->str );

		strcat( buf2, buf );

	}

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

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

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

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->character != NULL && can_see( ch, d->character ) )
		{
			count++;

			if ( strlen( d->character->lasthost->str ) < 2 )
			{
				sprintf( buf + strlen( buf ), "[%3d %2d] %s@%s\n\r",
				         d->descriptor,
				         d->connected,
				         d->original ? d->original->name->str :
				         d->character ? d->character->name->str : "(none)",
				         d->host->str
				       );
			}
			else
			{
				sprintf( buf + strlen( buf ), "[%3d %2d] %s@%s\n\r",
				         d->descriptor,
				         d->connected,
				         d->original ? d->original->name->str :
				         d->character ? d->character->name->str : "(none)",
				         d->character->lasthost->str
				       );
			}

		}
	}

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


void do_newusers( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * vch;
	DESCRIPTOR_DATA *d;
	char buf [ MAX_STRING_LENGTH ];
	char buf2 [ MAX_STRING_LENGTH ];
	int count;
	char arg [ MAX_STRING_LENGTH ];
	char * st;
	char s[ 100 ];
	char idle[ 10 ];
	GSList	*desc_list;

	argument = one_argument( argument, arg );

	if ( arg[ 0 ] != '\0' )
	{
		if ( !strcmp( arg, "host" ) )
			sort_user_host( ch );
		return ;
	}


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

	strcat( buf2, "\n\r[Num Connected_State Login@ Idl] Player Name  Host\n\r" );
	strcat( buf2,
	        "--------------------------------------------------------------------------------\n\r"
	      );
	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->character && can_see( ch, d->character ) )
		{
			/* NB: You may need to edit the CON_ values */
			switch ( d->connected )
			{
					case CON_PLAYING:
					st = "    PLAYING    ";
					break;
					case CON_GET_NAME:
					st = "   Get Name    ";
					break;
					case CON_GET_OLD_PASSWORD:
					st = "Get Old Passwd ";
					break;
					case CON_CONFIRM_NEW_NAME:
					st = " Confirm Name  ";
					break;
					case CON_GET_NEW_PASSWORD:
					st = "Get New Passwd ";
					break;
					case CON_CONFIRM_NEW_PASSWORD:
					st = "Confirm Passwd ";
					break;
					case CON_READ_MOTD:
					st = "  Reading MOTD ";
					break;
					case CON_NOT_PLAYING:
					st = " Not  Playing  ";
					break;
					case CON_NOTE_TO:
					st = "   Note To     ";
					break;
					case CON_NOTE_SUBJECT:
					st = " Note Subject  ";
					break;
					case CON_NOTE_TEXT:
					st = "   Note Text   ";
					break;
					case CON_NOTE_FINISH:
					st = " Note Finish   ";
					break;
					case CON_COPYOVER_RECOVER:
					st = "CopyoverRecover";
					break;
					case CON_READLOG:
					st = "   Readlog     ";
					break;
					default:
					st = "   !UNKNOWN!   ";
					break;

			}
			count++;

			/* Format "login" value... */
			vch = d->original ? d->original : d->character;
			strftime( s, 100, "%I:%M%p", localtime( &vch->logon ) );

			if ( vch->level <= LEVEL_HERO && vch->timer > 0 )
				sprintf( idle, "%-2d", vch->timer );
			else
				sprintf( idle, "  " );

			sprintf( buf, "[%3d {r%s{x %7s %2s] {b%-12s{x {Y%-32.32s{x\n\r",
			         d->descriptor,
			         st,
			         s,
			         idle,
			         ( d->original ) ? d->original->name->str
			         : ( d->character ) ? d->character->name->str
			         : "(None!)",
			         d->host->str );

			strcat( buf2, buf );

		}
	}

	sprintf( buf, "\n\r%d user%s\n\r", count, count == 1 ? "" : "s" );
	strcat( buf2, buf );
	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 ];
	char buf[ MAX_STRING_LENGTH ];

	sprintf( buf, "%s: Force %s", ch->name->str, argument );
	if ( ch->level < NO_WATCH )
		do_watching( ch, buf );

	argument = one_argument( argument, arg );

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

	if ( !str_cmp( arg, "all" ) )
	{
		CHAR_DATA * vch;
		CHAR_DATA *vch_next;

		if ( get_trust( ch ) < LEVEL_JUDGE )
		{
			send_to_char( "Nope.. not at your level.\n\r", ch );
			return ;
		}

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

			if ( !IS_NPC( vch ) && get_trust( vch ) < get_trust( ch ) )
			{
				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( ch ) < LEVEL_JUDGE && !IS_NPC( victim ) )
		{
			send_to_char( "You can only force mobs.\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 );
	mudsetting->last_proc_logged = 12;
	return ;
}

void do_forceauto( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * vch;
	CHAR_DATA *vch_next;

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

		if ( !IS_NPC( vch ) && vch != ch )
		{
			act( "Autocommand: $t.", ch, argument, vch, TO_VICT );
			interpret( vch, argument );
		}
	}
	mudsetting->last_proc_logged = 13;
	return ;
}

/*
 * New routines by Dionysos.
 */
void do_invis( CHAR_DATA *ch, char *argument )
{
	int level;
	char arg[ MAX_STRING_LENGTH ];

	/* RT code for taking a level argument */
	one_argument( argument, arg );

	if ( arg[ 0 ] == '\0' )
		/* take the default path */

		if ( ch->invis_level )
		{
			if ( IS_SET( ch->act, PLR_WIZINVIS ) )
			{
				REMOVE_BIT( ch->act, PLR_WIZINVIS );
			}
			ch->invis_level = 0;
			act( "$n slowly fades into existence.", ch, NULL, NULL, TO_ROOM );
			send_to_char( "You slowly fade back into existence.\n\r", ch );
		}
		else
		{
			if ( !IS_SET( ch->act, PLR_WIZINVIS ) )
			{
				SET_BIT( ch->act, PLR_WIZINVIS );
			}
			ch->invis_level = get_trust( ch );
			act( "$n slowly fades into thin air.", ch, NULL, NULL, TO_ROOM );
			send_to_char( "You slowly vanish into thin air.\n\r", ch );
		}
	else
		/* do the level thing */
	{
		level = atoi( arg );
		if ( level < 2 || level > get_trust( ch ) )
		{
			send_to_char( "Invis level must be between 2 and your level.\n\r", ch );
			return ;
		}
		else
		{
			if ( !IS_SET( ch->act, PLR_WIZINVIS ) )
			{
				SET_BIT( ch->act, PLR_WIZINVIS );
			}
			ch->reply = NULL;
			ch->invis_level = level;
			act( "$n slowly fades into thin air.", ch, NULL, NULL, TO_ROOM );
			send_to_char( "You slowly vanish into thin air.\n\r", ch );
		}
	}

	return ;
}


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

	if ( IS_SET( ch->act, PLR_INCOG ) )
	{
		REMOVE_BIT( ch->act, PLR_INCOG );
		act( "$n slowly fades into existence.", ch, NULL, NULL, TO_ROOM );
		send_to_char( "You slowly fade back into existence.\n\r", ch );
	}
	else
	{
		act( "$n slowly fades into thin air.", ch, NULL, NULL, TO_ROOM );
		send_to_char( "You slowly vanish into thin air.\n\r", ch );
		SET_BIT( ch->act, PLR_INCOG );
	}

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

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

	one_argument( argument, arg );

	if ( ch->in_room != NULL && is_tempsafe( ch ) && weather_info[ ch->in_room->sector_type ].sunlight != SUN_DARK )
		send_to_char( "You cannot be attacked by other players here.\n\r", ch );
	else
		send_to_char( "You are not safe from player attacks in this room.\n\r", ch );

	if ( !IS_CLASS( ch, CLASS_VAMPIRE ) )
		return ;

	if ( ch->in_room->sector_type == SECT_INSIDE )
	{
		send_to_char( "You are inside, which means you are safe from sunlight.\n\r", ch );
		return ;
	}

	if ( weather_info[ ch->in_room->sector_type ].sunlight == SUN_DARK )
	{
		send_to_char( "It is not yet light out, so you are safe from the sunlight...for now.\n\r", ch );
		return ;
	}

	if ( room_is_dark( ch->in_room ) )
	{
		send_to_char( "This room is dark, and will protect you from the sunlight.\n\r", ch );
		return ;
	}

	send_to_char( "This room will provide you no protection from the sunlight.\n\r", ch );
	return ;
}

void do_qstat( CHAR_DATA *ch, char *argument )
{
	char arg[ MAX_INPUT_LENGTH ];
	char buf[ MAX_STRING_LENGTH ];
	OBJ_DATA *obj;

	one_argument( argument, arg );

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "Which item?\n\r", ch );
		return ;
	}
	if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
	{
		send_to_char( "You are not carrying that item.\n\r", ch );
		return ;
	}
	sprintf( buf, "Object %s.\n\r", obj->short_descr->str );
	send_to_char( buf, ch );
	sprintf( buf, "Owner when worn: %s\n\r", obj->chpoweron->str );
	send_to_char( buf, ch );
	sprintf( buf, "Other when worn: %s\n\r", obj->victpoweron->str );
	send_to_char( buf, ch );
	sprintf( buf, "Owner when removed: %s\n\r", obj->chpoweroff->str );
	send_to_char( buf, ch );
	sprintf( buf, "Other when removed: %s\n\r", obj->victpoweroff->str );
	send_to_char( buf, ch );
	sprintf( buf, "Owner when used: %s\n\r", obj->chpoweruse->str );
	send_to_char( buf, ch );
	sprintf( buf, "Other when used: %s\n\r", obj->victpoweruse->str );
	send_to_char( buf, ch );
	send_to_char( "Type:", ch );
	if ( IS_SET( obj->spectype, SITEM_ACTIVATE ) )
		send_to_char( " Activate", ch );
	if ( IS_SET( obj->spectype, SITEM_TWIST ) )
		send_to_char( " Twist", ch );
	if ( IS_SET( obj->spectype, SITEM_PRESS ) )
		send_to_char( " Press", ch );
	if ( IS_SET( obj->spectype, SITEM_PULL ) )
		send_to_char( " Pull", ch );
	if ( IS_SET( obj->spectype, SITEM_TARGET ) )
		send_to_char( " Target", ch );
	if ( IS_SET( obj->spectype, SITEM_SPELL ) )
		send_to_char( " Spell", ch );
	if ( IS_SET( obj->spectype, SITEM_TRANSPORTER ) )
		send_to_char( " Transporter", ch );
	if ( IS_SET( obj->spectype, SITEM_TELEPORTER ) )
		send_to_char( " Teleporter", ch );
	if ( IS_SET( obj->spectype, SITEM_OBJECT ) )
		send_to_char( " Object", ch );
	if ( IS_SET( obj->spectype, SITEM_MOBILE ) )
		send_to_char( " Mobile", ch );
	if ( IS_SET( obj->spectype, SITEM_ACTION ) )
		send_to_char( " Action", ch );
	if ( IS_SET( obj->spectype, SITEM_DELAY1 ) )
		send_to_char( " Delay1", ch );
	if ( IS_SET( obj->spectype, SITEM_DELAY2 ) )
		send_to_char( " Delay2", ch );
	if ( !IS_SET( obj->spectype, SITEM_ACTIVATE )
	        && !IS_SET( obj->spectype, SITEM_TWIST )
	        && !IS_SET( obj->spectype, SITEM_PRESS )
	        && !IS_SET( obj->spectype, SITEM_PULL )
	        && !IS_SET( obj->spectype, SITEM_TARGET )
	        && !IS_SET( obj->spectype, SITEM_SPELL )
	        && !IS_SET( obj->spectype, SITEM_TELEPORTER )
	        && !IS_SET( obj->spectype, SITEM_DELAY1 )
	        && !IS_SET( obj->spectype, SITEM_DELAY2 )
	        && !IS_SET( obj->spectype, SITEM_OBJECT )
	        && !IS_SET( obj->spectype, SITEM_MOBILE )
	        && !IS_SET( obj->spectype, SITEM_ACTION )
	        && !IS_SET( obj->spectype, SITEM_TRANSPORTER ) )
		send_to_char( " No flags set", ch );
	send_to_char( ".\n\r", ch );
	sprintf( buf, "Power: %d.\n\r", obj->specpower );
	send_to_char( buf, ch );
	return ;
}

void do_qset( 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;

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

	if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' || arg3[ 0 ] == '0' )
	{
		send_to_char( "You can change the following fields...\n\r", ch );
		send_to_char( "chwear   = Message to owner when item is worn.\n\r", ch );
		send_to_char( "chrem    = Message to owner when item is removed.\n\r", ch );
		send_to_char( "chuse    = Message to owner when item is used.\n\r", ch );
		send_to_char( "victwear = Message to others in room when item is worn.\n\r", ch );
		send_to_char( "victrem  = Message to others in room when item is removed.\n\r", ch );
		send_to_char( "victuse  = Message to others in room when item is used.\n\r", ch );
		send_to_char( "type       activate     = Item can be activated.\n\r", ch );
		send_to_char( "           twist        = Item can be twisted.\n\r", ch );
		send_to_char( "           press        = Item can be pressed.\n\r", ch );
		send_to_char( "           pull         = Item can be pulled.\n\r", ch );
		send_to_char( "           target       = Item can target people (for spell, etc).\n\r", ch );
		send_to_char( "           spell        = Item can cast spells.\n\r", ch );
		send_to_char( "           transporter  = Owner can transport freely between two locations.\n\r", ch );
		send_to_char( "           teleporter   = Owner can transport to target location at will.\n\r", ch );
		send_to_char( "           object       = Owner can create the specified object.\n\r", ch );
		send_to_char( "           mobile       = Owner can create the specified mobile.\n\r", ch );
		send_to_char( "           action       = Target must perform an action.\n\r", ch );
		send_to_char( "           delay1       = Sets a delay of half a round on spell items.\n\r", ch );
		send_to_char( "           delay2       = Sets a delay of one round on spell items.\n\r", ch );
		send_to_char( "power      <value>      = Spell number/transporter room number.\n\r", ch );
		return ;
	}
	if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
	{
		send_to_char( "You are not carrying that item.\n\r", ch );
		return ;
	}
	value = is_number( arg3 ) ? atoi( arg3 ) : -1;
	if ( !str_cmp( arg2, "chwear" ) )
	{
		if ( obj->chpoweron != NULL )
			str_cpy( buf, obj->chpoweron->str );
		if ( !str_cmp( arg3, "clear" ) )
		{
			obj->chpoweron = g_string_assign( obj->chpoweron, "(null)" );
		}
		else if ( obj->chpoweron != NULL && buf[ 0 ] != '\0' && str_cmp( buf, "(null)" ) )
		{
			if ( strlen( buf ) + strlen( arg3 ) >= MAX_STRING_LENGTH - 4 )
			{
				send_to_char( "Line too long.\n\r", ch );
				return ;
			}
			else
			{
				strcat( buf, "\n\r" );
				strcat( buf, arg3 );
				obj->chpoweron = g_string_assign( obj->chpoweron, buf );
			}
		}
		else
		{
			obj->chpoweron = g_string_assign( obj->chpoweron, arg3 );
		}
	}
	else if ( !str_cmp( arg2, "chrem" ) )
	{
		if ( obj->chpoweroff != NULL )
			str_cpy( buf, obj->chpoweroff->str );
		if ( !str_cmp( arg3, "clear" ) )
		{
			obj->chpoweroff = g_string_assign( obj->chpoweroff, "(null)" );
		}
		else if ( obj->chpoweroff != NULL && buf[ 0 ] != '\0' && str_cmp( buf, "(null)" ) )
		{
			if ( strlen( buf ) + strlen( arg3 ) >= MAX_STRING_LENGTH - 4 )
			{
				send_to_char( "Line too long.\n\r", ch );
				return ;
			}
			else
			{
				strcat( buf, "\n\r" );
				strcat( buf, arg3 );
				obj->chpoweroff = g_string_assign( obj->chpoweroff, buf );
			}
		}
		else
		{
			obj->chpoweroff = g_string_assign( obj->chpoweroff, arg3 );
		}
	}
	else if ( !str_cmp( arg2, "chuse" ) )
	{
		if ( obj->chpoweruse != NULL )
			str_cpy( buf, obj->chpoweruse->str );
		if ( !str_cmp( arg3, "clear" ) )
		{
			obj->chpoweruse = g_string_assign( obj->chpoweruse, "(null)" );
		}
		else if ( obj->chpoweruse != NULL && buf[ 0 ] != '\0' && str_cmp( buf, "(null)" ) )
		{
			if ( strlen( buf ) + strlen( arg3 ) >= MAX_STRING_LENGTH - 4 )
			{
				send_to_char( "Line too long.\n\r", ch );
				return ;
			}
			else
			{
				strcat( buf, "\n\r" );
				strcat( buf, arg3 );
				obj->chpoweruse = g_string_assign( obj->chpoweruse, buf );
			}
		}
		else
		{
			obj->chpoweruse = g_string_assign( obj->chpoweruse, arg3 );
		}
	}
	else if ( !str_cmp( arg2, "victwear" ) )
	{
		if ( obj->victpoweron != NULL )
			str_cpy( buf, obj->victpoweron->str );
		if ( !str_cmp( arg3, "clear" ) )
		{
			obj->victpoweron = g_string_assign( obj->victpoweron, "(null)" );
		}
		else if ( obj->victpoweron != NULL && buf[ 0 ] != '\0' && str_cmp( buf, "(null)" ) )
		{
			if ( strlen( buf ) + strlen( arg3 ) >= MAX_STRING_LENGTH - 4 )
			{
				send_to_char( "Line too long.\n\r", ch );
				return ;
			}
			else
			{
				strcat( buf, "\n\r" );
				strcat( buf, arg3 );
				obj->victpoweron = g_string_assign( obj->victpoweron, buf );
			}
		}
		else
		{
			obj->victpoweron = g_string_assign( obj->victpoweron, arg3 );
		}
	}
	else if ( !str_cmp( arg2, "victrem" ) )
	{
		if ( obj->victpoweroff != NULL )
			str_cpy( buf, obj->victpoweroff->str );
		if ( !str_cmp( arg3, "clear" ) )
		{
			obj->victpoweroff = g_string_assign( obj->victpoweroff, "(null)" );
		}
		else if ( obj->victpoweroff != NULL && buf[ 0 ] != '\0' && str_cmp( buf, "(null)" ) )
		{
			if ( strlen( buf ) + strlen( arg3 ) >= MAX_STRING_LENGTH - 4 )
			{
				send_to_char( "Line too long.\n\r", ch );
				return ;
			}
			else
			{
				strcat( buf, "\n\r" );
				strcat( buf, arg3 );
				obj->victpoweroff = g_string_assign( obj->victpoweroff, buf );
			}
		}
		else
		{
			obj->victpoweroff = g_string_assign( obj->victpoweroff, arg3 );
		}
	}
	else if ( !str_cmp( arg2, "victuse" ) )
	{
		if ( obj->victpoweruse != NULL )
			str_cpy( buf, obj->victpoweruse->str );
		if ( !str_cmp( arg3, "clear" ) )
		{
			obj->victpoweruse = g_string_assign( obj->victpoweruse, "(null)" );
		}
		else if ( obj->victpoweruse != NULL && buf[ 0 ] != '\0' && str_cmp( buf, "(null)" ) )
		{
			if ( strlen( buf ) + strlen( arg3 ) >= MAX_STRING_LENGTH - 4 )
			{
				send_to_char( "Line too long.\n\r", ch );
				return ;
			}
			else
			{
				strcat( buf, "\n\r" );
				strcat( buf, arg3 );
				obj->victpoweruse = g_string_assign( obj->victpoweruse, buf );
			}
		}
		else
		{
			obj->victpoweruse = g_string_assign( obj->victpoweruse, arg3 );
		}
	}
	else if ( !str_cmp( arg2, "type" ) )
	{
		if ( !str_cmp( arg3, "activate" ) && IS_SET( obj->spectype, SITEM_ACTIVATE ) )
			REMOVE_BIT( obj->spectype, SITEM_ACTIVATE );
		else if ( !str_cmp( arg3, "activate" ) && !IS_SET( obj->spectype, SITEM_ACTIVATE ) )
			SET_BIT( obj->spectype, SITEM_ACTIVATE );
		else if ( !str_cmp( arg3, "twist" ) && IS_SET( obj->spectype, SITEM_TWIST ) )
			REMOVE_BIT( obj->spectype, SITEM_TWIST );
		else if ( !str_cmp( arg3, "twist" ) && !IS_SET( obj->spectype, SITEM_TWIST ) )
			SET_BIT( obj->spectype, SITEM_TWIST );
		else if ( !str_cmp( arg3, "press" ) && IS_SET( obj->spectype, SITEM_PRESS ) )
			REMOVE_BIT( obj->spectype, SITEM_PRESS );
		else if ( !str_cmp( arg3, "press" ) && !IS_SET( obj->spectype, SITEM_PRESS ) )
			SET_BIT( obj->spectype, SITEM_PRESS );
		else if ( !str_cmp( arg3, "pull" ) && IS_SET( obj->spectype, SITEM_PULL ) )
			REMOVE_BIT( obj->spectype, SITEM_PULL );
		else if ( !str_cmp( arg3, "pull" ) && !IS_SET( obj->spectype, SITEM_PULL ) )
			SET_BIT( obj->spectype, SITEM_PULL );
		else if ( !str_cmp( arg3, "target" ) && IS_SET( obj->spectype, SITEM_TARGET ) )
			REMOVE_BIT( obj->spectype, SITEM_TARGET );
		else if ( !str_cmp( arg3, "target" ) && !IS_SET( obj->spectype, SITEM_TARGET ) )
			SET_BIT( obj->spectype, SITEM_TARGET );
		else if ( !str_cmp( arg3, "spell" ) && IS_SET( obj->spectype, SITEM_SPELL ) )
			REMOVE_BIT( obj->spectype, SITEM_SPELL );
		else if ( !str_cmp( arg3, "spell" ) && !IS_SET( obj->spectype, SITEM_SPELL ) )
			SET_BIT( obj->spectype, SITEM_SPELL );
		else if ( !str_cmp( arg3, "transporter" ) && IS_SET( obj->spectype, SITEM_TRANSPORTER ) )
			REMOVE_BIT( obj->spectype, SITEM_TRANSPORTER );
		else if ( !str_cmp( arg3, "transporter" ) && !IS_SET( obj->spectype, SITEM_TRANSPORTER ) )
			SET_BIT( obj->spectype, SITEM_TRANSPORTER );
		else if ( !str_cmp( arg3, "teleporter" ) && IS_SET( obj->spectype, SITEM_TELEPORTER ) )
			REMOVE_BIT( obj->spectype, SITEM_TELEPORTER );
		else if ( !str_cmp( arg3, "teleporter" ) && !IS_SET( obj->spectype, SITEM_TELEPORTER ) )
			SET_BIT( obj->spectype, SITEM_TELEPORTER );
		else if ( !str_cmp( arg3, "object" ) && IS_SET( obj->spectype, SITEM_OBJECT ) )
			REMOVE_BIT( obj->spectype, SITEM_OBJECT );
		else if ( !str_cmp( arg3, "object" ) && !IS_SET( obj->spectype, SITEM_OBJECT ) )
			SET_BIT( obj->spectype, SITEM_OBJECT );
		else if ( !str_cmp( arg3, "mobile" ) && IS_SET( obj->spectype, SITEM_MOBILE ) )
			REMOVE_BIT( obj->spectype, SITEM_MOBILE );
		else if ( !str_cmp( arg3, "mobile" ) && !IS_SET( obj->spectype, SITEM_MOBILE ) )
			SET_BIT( obj->spectype, SITEM_MOBILE );
		else if ( !str_cmp( arg3, "action" ) && IS_SET( obj->spectype, SITEM_ACTION ) )
			REMOVE_BIT( obj->spectype, SITEM_ACTION );
		else if ( !str_cmp( arg3, "action" ) && !IS_SET( obj->spectype, SITEM_ACTION ) )
			SET_BIT( obj->spectype, SITEM_ACTION );
		else if ( !str_cmp( arg3, "delay1" ) && IS_SET( obj->spectype, SITEM_DELAY1 ) )
			REMOVE_BIT( obj->spectype, SITEM_DELAY1 );
		else if ( !str_cmp( arg3, "delay1" ) && !IS_SET( obj->spectype, SITEM_DELAY1 ) )
			SET_BIT( obj->spectype, SITEM_DELAY1 );
		else if ( !str_cmp( arg3, "delay2" ) && IS_SET( obj->spectype, SITEM_DELAY2 ) )
			REMOVE_BIT( obj->spectype, SITEM_DELAY2 );
		else if ( !str_cmp( arg3, "delay2" ) && !IS_SET( obj->spectype, SITEM_DELAY2 ) )
			SET_BIT( obj->spectype, SITEM_DELAY2 );
		else
		{
			send_to_char( "No such flag to set.\n\r", ch );
			return ;
		}
		sprintf( buf, "%s flag toggled.\n\r", capitalize( arg3 ) );
		send_to_char( buf, ch );
		return ;
	}
	else if ( !str_cmp( arg2, "power" ) )
		obj->specpower = value;
	else
	{
		send_to_char( "No such flag.\n\r", ch );
		return ;
	}
	send_to_char( "Ok.\n\r", ch );
	return ;
}


void do_oclone( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	OBJ_INDEX_DATA *pObjIndex;
	OBJ_DATA *obj;
	OBJ_DATA *obj2;
	AFFECT_DATA *paf;
	AFFECT_DATA *paf2;

	argument = one_argument( argument, arg1 );

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "Make a clone of what object?\n\r", ch );
		return ;
	}

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

	if ( !IS_JUDGE( ch ) && ( obj->questmaker == NULL || str_cmp( ch->name->str, obj->questmaker->str ) || obj->questmaker->len < 2 ) )
	{
		send_to_char( "You can only clone your own creations.\n\r", ch );
		return ;
	}

	pObjIndex = get_obj_index( obj->pIndexData->vnum );
	obj2 = create_object( pObjIndex, obj->level );
	/* Copy any changed parts of the object. */
	obj2->name = g_string_assign( obj2->name, obj->name->str );
	obj2->short_descr = g_string_assign( obj2->short_descr, obj->short_descr->str );
	obj2->description = g_string_assign( obj2->description, obj->description->str );

	if ( obj->questmaker != NULL && obj->questmaker->len > 1 )
	{
		obj2->questmaker = g_string_assign( obj2->questmaker, obj->questmaker->str );
	}

	if ( obj->chpoweron != NULL )
	{
		obj2->chpoweron = g_string_assign( obj2->chpoweron, obj->chpoweron->str );
	}
	if ( obj->chpoweroff != NULL )
	{
		obj2->chpoweroff = g_string_assign( obj2->chpoweroff, obj->chpoweroff->str );
	}
	if ( obj->chpoweruse != NULL )
	{
		obj2->chpoweruse = g_string_assign( obj2->chpoweruse, obj->chpoweruse->str );
	}
	if ( obj->victpoweron != NULL )
	{
		obj2->victpoweron = g_string_assign( obj2->victpoweron, obj->victpoweron->str );
	}
	if ( obj->victpoweroff != NULL )
	{
		obj2->victpoweroff = g_string_assign( obj2->victpoweroff, obj->victpoweroff->str );
	}
	if ( obj->victpoweruse != NULL )
	{
		obj2->victpoweruse = g_string_assign( obj2->victpoweruse, obj->victpoweruse->str );
	}
	obj2->item_type = obj->item_type;
	obj2->extra_flags = obj->extra_flags;
	obj2->wear_flags = obj->wear_flags;
	obj2->weight = obj->weight;
	obj2->spectype = obj->spectype;
	obj2->specpower = obj->specpower;
	obj2->condition = obj->condition;
	obj2->toughness = obj->toughness;
	obj2->resistance = obj->resistance;
	obj2->quest = obj->quest;
	obj2->points = obj->points;
	obj2->cost = obj->cost;
	obj2->value[ 0 ] = obj->value[ 0 ];
	obj2->value[ 1 ] = obj->value[ 1 ];
	obj2->value[ 2 ] = obj->value[ 2 ];
	obj2->value[ 3 ] = obj->value[ 3 ];
	/*****************************************/
	obj_to_char( obj2, ch );

	if ( obj->affected != NULL )
	{
		for ( paf = obj->affected; paf != NULL; paf = paf->next )
		{
			paf2 = new_affect();
			paf2->type = 0;
			paf2->duration	= paf->duration;
			paf2->location	= paf->location;
			paf2->modifier	= paf->modifier;
			paf2->bitvector	= 0;
			paf2->next = obj2->affected;
			obj2->affected	= paf2;
		}
	}

	act( "You create a clone of $p.", ch, obj, NULL, TO_CHAR );
	return ;
}

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

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

	if ( IS_NPC( ch ) || get_disc( ch, DISC_DOMINATE ) < 1 )
	{
		send_to_char( "Huh?\n\r", ch );
		return ;
	}
	if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' )
	{
		send_to_char( "Format is: evileye <option> <value>\n\r", ch );
		send_to_char( "Option ACTION is a text string action performed by you or the viewer.\n\r", ch );
		send_to_char( "Option MESSAGE is a text string shown to the person looking at you.\n\r", ch );
		send_to_char( "Option TOGGLE has values: spell, self, other.\n\r\n\r", ch );
		if ( ch->poweraction != NULL )
		{
			sprintf( buf, "Current action: %s.\n\r", ch->poweraction->str );
			send_to_char( buf, ch );
		}
		if ( ch->powertype != NULL )
		{
			sprintf( buf, "Current message: %s.\n\r", ch->powertype->str );
			send_to_char( buf, ch );
		}
		send_to_char( "Current flags:", ch );
		if ( IS_SET( ch->spectype, EYE_SPELL ) )
			send_to_char( " Spell", ch );
		if ( IS_SET( ch->spectype, EYE_SELFACTION ) )
			send_to_char( " Self", ch );
		if ( IS_SET( ch->spectype, EYE_ACTION ) )
			send_to_char( " Other", ch );
		if ( !IS_SET( ch->spectype, EYE_SPELL ) &&
		        !IS_SET( ch->spectype, EYE_SELFACTION ) &&
		        !IS_SET( ch->spectype, EYE_ACTION ) )
			send_to_char( " None", ch );
		send_to_char( ".\n\r", ch );
		return ;
	}
	value = is_number( arg2 ) ? atoi( arg2 ) : -1;
	if ( !str_cmp( arg1, "action" ) )
	{
		ch->poweraction = g_string_assign( ch->poweraction, arg2 );
		return ;
	}
	else if ( !str_cmp( arg1, "message" ) )
	{
		ch->powertype = g_string_assign( ch->powertype, arg2 );
		return ;
	}
	else if ( !str_cmp( arg1, "toggle" ) )
	{
		if ( !str_cmp( arg2, "spell" ) && IS_SET( ch->spectype, EYE_SPELL ) )
			REMOVE_BIT( ch->spectype, EYE_SPELL );
		else if ( !str_cmp( arg2, "spell" ) && !IS_SET( ch->spectype, EYE_SPELL ) )
			SET_BIT( ch->spectype, EYE_SPELL );
		else if ( !str_cmp( arg2, "self" ) && IS_SET( ch->spectype, EYE_SELFACTION ) )
			REMOVE_BIT( ch->spectype, EYE_SELFACTION );
		else if ( !str_cmp( arg2, "self" ) && !IS_SET( ch->spectype, EYE_SELFACTION ) )
			SET_BIT( ch->spectype, EYE_SELFACTION );
		else if ( !str_cmp( arg2, "other" ) && IS_SET( ch->spectype, EYE_ACTION ) )
			REMOVE_BIT( ch->spectype, EYE_ACTION );
		else if ( !str_cmp( arg2, "other" ) && !IS_SET( ch->spectype, EYE_ACTION ) )
			SET_BIT( ch->spectype, EYE_ACTION );
		else
		{
			send_to_char( "TOGGLE flag should be one of: spell, self, other.\n\r", ch );
			return ;
		}
		sprintf( buf, "%s flag toggled.\n\r", capitalize( arg2 ) );
		send_to_char( buf, ch );
		return ;
	}
	else
	{
		send_to_char( "Format is: evileye <option> <value>\n\r", ch );
		send_to_char( "Option ACTION is a text string action performed by you or the viewer.\n\r", ch );
		send_to_char( "Option MESSAGE is a text string shown to the person looking at you.\n\r", ch );
		send_to_char( "Option TOGGLE has values: spell, self, other.\n\r\n\r", ch );
		if ( ch->poweraction != NULL )
		{
			sprintf( buf, "Current action: %s.\n\r", ch->poweraction->str );
			send_to_char( buf, ch );
		}
		if ( ch->powertype != NULL )
		{
			sprintf( buf, "Current message: %s.\n\r", ch->powertype->str );
			send_to_char( buf, ch );
		}
		send_to_char( "Current flags:", ch );
		if ( IS_SET( ch->spectype, EYE_SPELL ) )
			send_to_char( " Spell", ch );
		if ( IS_SET( ch->spectype, EYE_SELFACTION ) )
			send_to_char( " Self", ch );
		if ( IS_SET( ch->spectype, EYE_ACTION ) )
			send_to_char( " Other", ch );
		if ( !IS_SET( ch->spectype, EYE_SPELL ) &&
		        !IS_SET( ch->spectype, EYE_SELFACTION ) &&
		        !IS_SET( ch->spectype, EYE_ACTION ) )
			send_to_char( " None", ch );
		send_to_char( ".\n\r", ch );
	}
	return ;
}

void do_artifact( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	OBJ_DATA *obj;
	OBJ_DATA *in_obj;
	bool found;
	GSList *tmp = object_list;

	if ( IS_NPC( ch ) )
	{send_to_char( "Not while switched.\n\r", ch ); return ;}

	found = FALSE;
	while ( tmp != NULL )
	{
		obj = ( OBJ_DATA* ) tmp->data;
		if ( !IS_SET( obj->quest, QUEST_ARTIFACT ) )
		{
			tmp = g_slist_next( tmp );
			continue;
		}

		found = TRUE;

		for ( in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj )
			;

		if ( in_obj->carried_by != NULL )
		{
			sprintf( buf, "%s created by %s and carried by %s.\n\r",
			         obj->short_descr->str, obj->questmaker->str,
			         PERS( in_obj->carried_by, ch ) );
		}
		else
		{
			sprintf( buf, "%s created by %s and in %s.\n\r",
			         obj->short_descr->str, obj->questmaker->str,
			         in_obj->in_room == NULL ? "somewhere" : in_obj->in_room->name );
		}

		buf[ 0 ] = UPPER( buf[ 0 ] );
		send_to_char( buf, ch );
		tmp = g_slist_next( tmp );
	}
	g_slist_free( tmp );

	if ( !found )
		send_to_char( "There are no artifacts in the game.\n\r", ch );

	return ;
}

void do_locate( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	OBJ_DATA *obj;
	OBJ_DATA *in_obj;
	bool found;
	GSList *tmp = object_list;

	if ( IS_NPC( ch ) )
	{send_to_char( "Not while switched.\n\r", ch ); return ;}

	found = FALSE;
	while ( tmp != NULL )
	{
		obj = ( OBJ_DATA* ) tmp->data;
		if ( !can_see_obj( ch, obj ) || obj->questowner == NULL ||
		        obj->questowner->len < 2 || str_cmp( ch->name->str, obj->questowner->str ) )
		{
			tmp = g_slist_next( tmp );
			continue;
		}

		found = TRUE;

		for ( in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj )
			;

		if ( in_obj->carried_by != NULL )
		{
			sprintf( buf, "%s carried by %s.\n\r",
			         obj->short_descr->str, PERS( in_obj->carried_by, ch ) );
		}
		else
		{
			sprintf( buf, "%s in %s.\n\r",
			         obj->short_descr->str, in_obj->in_room == NULL
			         ? "somewhere" : in_obj->in_room->name );
		}

		buf[ 0 ] = UPPER( buf[ 0 ] );
		send_to_char( buf, ch );
		tmp = g_slist_next( tmp );
	}
	g_slist_free( tmp );

	if ( !found )
		send_to_char( "You cannot locate any items belonging to you.\n\r", ch );

	return ;
}

void do_claim( CHAR_DATA *ch, char *argument )
{
	char arg[ MAX_INPUT_LENGTH ];
	OBJ_DATA *obj;

	one_argument( argument, arg );

	if ( IS_NPC( ch ) )
	{send_to_char( "Not while switched.\n\r", ch ); return ;}

	if ( ch->exp < 500 )
	{send_to_char( "It costs 500 exp to claim ownership of an item.\n\r", ch ); return ;}

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "What object do you wish to claim ownership of?\n\r", ch );
		return ;
	}

	if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
	{send_to_char( "You are not carrying that item.\n\r", ch ); return ;}

	if ( obj->item_type == ITEM_QUEST || obj->item_type == ITEM_AMMO ||
	        obj->item_type == ITEM_EGG || obj->item_type == ITEM_VOODOO ||
	        obj->item_type == ITEM_MONEY || obj->item_type == ITEM_TREASURE ||
	        IS_SET( obj->quest, QUEST_ARTIFACT ) )
	{
		send_to_char( "You cannot claim that item.\n\r", ch );
		return ;
	}
	else if ( obj->chobj != NULL && !IS_NPC( obj->chobj ) &&
	          obj->chobj->pcdata->obj_vnum != 0 )
	{
		send_to_char( "You cannot claim that item.\n\r", ch );
		return ;
	}

	if ( obj->questowner != NULL && obj->questowner->len > 1 )
	{
		if ( !str_cmp( ch->name->str, obj->questowner->str ) )
			send_to_char( "But you already own it!\n\r", ch );
		else
			send_to_char( "Someone else has already claimed ownership to it.\n\r", ch );
		return ;
	}

	ch->exp -= 500;
	obj->questowner = g_string_assign( obj->questowner, ch->name->str );
	act( "You are now the owner of $p.", ch, obj, NULL, TO_CHAR );
	act( "$n is now the owner of $p.", ch, obj, NULL, TO_ROOM );
	return ;
}

void do_gift( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	char arg2[ MAX_INPUT_LENGTH ];
	OBJ_DATA *obj;
	CHAR_DATA *victim;

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

	if ( IS_NPC( ch ) )
	{send_to_char( "Not while switched.\n\r", ch ); return ;}

	if ( ch->exp < 500 )
	{send_to_char( "It costs 500 exp to make a gift of an item.\n\r", ch ); return ;}

	if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' )
	{
		send_to_char( "Make a gift of which object to whom?\n\r", ch );
		return ;
	}

	if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
	{send_to_char( "You are not carrying that item.\n\r", ch ); return ;}
	if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
	{send_to_char( "Nobody here by that name.\n\r", ch ); return ;}

	if ( obj->item_type == ITEM_FOCI )
	{
		send_to_char( "You cannot gift the item that is most dearest to your heart.", ch );
		return ;
	}

	if ( obj->points > 3999 )
	{
		send_to_char( "You can't gift mythical equipment.\n\r", ch );
		return ;
	}

	if ( IS_NPC( victim ) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return ;
	}
	if ( obj->questowner == NULL || obj->questowner->len < 2 )
	{
		send_to_char( "That item has not yet been claimed.\n\r", ch );
		return ;
	}
	if ( str_cmp( ch->name->str, obj->questowner->str ) )
	{
		send_to_char( "But you don't own it!\n\r", ch );
		return ;
	}
	ch->exp -= 500;
	obj->questowner = g_string_assign( obj->questowner, victim->name->str );
	act( "You grant ownership of $p to $N.", ch, obj, victim, TO_CHAR );
	act( "$n grants ownership of $p to $N.", ch, obj, victim, TO_NOTVICT );
	act( "$n grants ownership of $p to you.", ch, obj, victim, TO_VICT );
	return ;
}

void do_create( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	char arg2[ MAX_INPUT_LENGTH ];
	OBJ_INDEX_DATA *pObjIndex;
	OBJ_DATA *obj;
	int itemtype = 13;
	int level;

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

	if ( arg1[ 0 ] == '\0' )
		itemtype = ITEM_TRASH;
	else if ( !str_cmp( arg1, "light" ) )
		itemtype = ITEM_LIGHT;
	else if ( !str_cmp( arg1, "scroll" ) )
		itemtype = ITEM_SCROLL;
	else if ( !str_cmp( arg1, "wand" ) )
		itemtype = ITEM_WAND;
	else if ( !str_cmp( arg1, "staff" ) )
		itemtype = ITEM_STAFF;
	else if ( !str_cmp( arg1, "weapon" ) )
		itemtype = ITEM_WEAPON;
	else if ( !str_cmp( arg1, "treasure" ) )
		itemtype = ITEM_TREASURE;
	else if ( !str_cmp( arg1, "armor" ) )
		itemtype = ITEM_ARMOR;
	else if ( !str_cmp( arg1, "armour" ) )
		itemtype = ITEM_ARMOR;
	else if ( !str_cmp( arg1, "potion" ) )
		itemtype = ITEM_POTION;
	else if ( !str_cmp( arg1, "furniture" ) )
		itemtype = ITEM_FURNITURE;
	else if ( !str_cmp( arg1, "trash" ) )
		itemtype = ITEM_TRASH;
	else if ( !str_cmp( arg1, "container" ) )
		itemtype = ITEM_CONTAINER;
	else if ( !str_cmp( arg1, "drink" ) )
		itemtype = ITEM_DRINK_CON;
	else if ( !str_cmp( arg1, "key" ) )
		itemtype = ITEM_KEY;
	else if ( !str_cmp( arg1, "food" ) )
		itemtype = ITEM_FOOD;
	else if ( !str_cmp( arg1, "money" ) )
		itemtype = ITEM_MONEY;
	else if ( !str_cmp( arg1, "boat" ) )
		itemtype = ITEM_BOAT;
	else if ( !str_cmp( arg1, "corpse" ) )
		itemtype = ITEM_CORPSE_NPC;
	else if ( !str_cmp( arg1, "fountain" ) )
		itemtype = ITEM_FOUNTAIN;
	else if ( !str_cmp( arg1, "pill" ) )
		itemtype = ITEM_PILL;
	else if ( !str_cmp( arg1, "portal" ) )
		itemtype = ITEM_PORTAL;
	else if ( !str_cmp( arg1, "egg" ) )
		itemtype = ITEM_EGG;
	else if ( !str_cmp( arg1, "stake" ) )
		itemtype = ITEM_STAKE;
	else if ( !str_cmp( arg1, "missile" ) )
		itemtype = ITEM_MISSILE;
	else if ( !str_cmp( arg1, "page" ) )
		itemtype = ITEM_PAGE;
	else if ( !str_cmp( arg1, "book" ) )
		itemtype = ITEM_BOOK;
	else
		itemtype = ITEM_TRASH;

	if ( arg2[ 0 ] == '\0' || !is_number( arg2 ) )
	{
		level = 0;
	}
	else
	{
		level = atoi( arg2 );
		if ( level < 1 || level > 50 )
		{
			send_to_char( "Level should be within range 1 to 50.\n\r", ch );
			return ;
		}
	}

	if ( ( pObjIndex = get_obj_index( OBJ_VNUM_PROTOPLASM ) ) == NULL )
	{
		send_to_char( "Error...missing object, please inform Spiral\n\r", ch );
		return ;
	}

	obj = create_object( pObjIndex, level );
	obj->level = level;
	obj->item_type = itemtype;
	obj_to_char( obj, ch );
	obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );

	act( "You reach up into the air and draw out a ball of protoplasm.", ch, obj, NULL, TO_CHAR );
	act( "$n reaches up into the air and draws out a ball of protoplasm.", ch, obj, NULL, TO_ROOM );
	return ;
}

void do_token( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	char arg2[ MAX_INPUT_LENGTH ];
	char buf[ MAX_STRING_LENGTH ];
	OBJ_INDEX_DATA *pObjIndex;
	OBJ_DATA *obj;
	CHAR_DATA *victim;
	int value;

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

	if ( IS_NPC( ch ) || ( ch->pcdata->quest < 1 && !IS_JUDGE( ch ) ) )
	{
		send_to_char( "You are unable to make a quest token.\n\r", ch );
		return ;
	}
	else if ( arg1[ 0 ] == '\0' || !is_number( arg1 ) )
	{
		send_to_char( "Please specify a value for the quest token.\n\r", ch );
		return ;
	}
	else
	{
		value = atoi( arg1 );
		if ( value < 1 || value > 500 )
		{
			send_to_char( "Quest token should have a value between 1 and 500.\n\r", ch );
			return ;
		}
		else if ( value > ch->pcdata->quest && !IS_JUDGE( ch ) )
		{
			sprintf( buf, "You only have %d quest points left to put into tokens.\n\r", ch->pcdata->quest );
			send_to_char( buf, ch );
			return ;
		}
	}

	victim = get_char_room( ch, arg2 );

	if ( ( pObjIndex = get_obj_index( OBJ_VNUM_PROTOPLASM ) ) == NULL )
	{
		send_to_char( "Error...missing object, please inform Spiral\n\r", ch );
		return ;
	}

	ch->pcdata->quest -= value;
	ch->pcdata->spent[ SPENT_T ] += value;
	if ( ch->pcdata->quest < 0 )
		ch->pcdata->quest = 0;
	obj = create_object( pObjIndex, value );
	obj->value[ 0 ] = value;
	obj->level = 1;
	obj->cost = value * 1000;
	obj->item_type = ITEM_QUEST;
	obj_to_char( obj, ch );
	obj->questmaker = g_string_assign( obj->questmaker, ch->name->str );
	obj->name = g_string_assign( obj->name, "quest token" );
	sprintf( buf, "a %d point quest token", value );
	obj->short_descr = g_string_assign( obj->short_descr, buf );
	sprintf( buf, "A %d point quest token lies on the floor.", value );
	obj->description = g_string_assign( obj->description, buf );
	if ( victim != NULL && victim != ch )
	{
		act( "You reach behind $N's ear and produce $p.", ch, obj, victim, TO_CHAR );
		act( "$n reaches behind $N's ear and produces $p.", ch, obj, victim, TO_NOTVICT );
		act( "$n reaches behind your ear and produces $p.", ch, obj, victim, TO_VICT );
	}
	else
	{
		act( "You snap your fingers and reveal $p.", ch, obj, NULL, TO_CHAR );
		act( "$n snaps $s fingers and reveals $p.", ch, obj, NULL, TO_ROOM );
	}
	return ;
}


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

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

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: qtrust <char> <on/off>.\n\r", ch );
		return ;
	}

	if ( arg2[ 0 ] == '\0' )
	{
		send_to_char( "Do you wish to set qtrust ON or OFF?\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 ( str_cmp( arg2, "on" ) && str_cmp( arg2, "off" ) )
	{
		send_to_char( "Do you want to set their qtrust ON or OFF?\n\r", ch );
		return ;
	}
	if ( !str_cmp( arg2, "off" ) )
	{
		if ( !IS_EXTRA( victim, EXTRA_TRUSTED ) )
		{
			send_to_char( "Their qtrust is already off.\n\r", ch );
			return ;
		}
		REMOVE_BIT( victim->extra, EXTRA_TRUSTED );
		send_to_char( "Quest trust OFF.\n\r", ch );
		send_to_char( "You are no longer quest trusted.\n\r", victim );
		return ;
	}
	else if ( !str_cmp( arg2, "on" ) )
	{
		if ( IS_EXTRA( victim, EXTRA_TRUSTED ) )
		{
			send_to_char( "Their qtrust is already on.\n\r", ch );
			return ;
		}
		SET_BIT( victim->extra, EXTRA_TRUSTED );
		send_to_char( "Quest trust ON.\n\r", ch );
		send_to_char( "You are now quest trusted.\n\r", victim );
		return ;
	}
	return ;
}

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

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

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: ntrust <char> <on/off>.\n\r", ch );
		return ;
	}

	if ( arg2[ 0 ] == '\0' )
	{
		send_to_char( "Do you wish to set ntrust ON or OFF?\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 ( str_cmp( arg2, "on" ) && str_cmp( arg2, "off" ) )
	{
		send_to_char( "Do you want to set their ntrust ON or OFF?\n\r", ch );
		return ;
	}
	if ( !str_cmp( arg2, "off" ) )
	{
		if ( !IS_EXTRA( victim, EXTRA_NOTE_TRUST ) )
		{
			send_to_char( "Their ntrust is already off.\n\r", ch );
			return ;
		}
		REMOVE_BIT( victim->extra, EXTRA_NOTE_TRUST );
		send_to_char( "Note trust OFF.\n\r", ch );
		send_to_char( "You are no longer note trusted.\n\r", victim );
		return ;
	}
	else if ( !str_cmp( arg2, "on" ) )
	{
		if ( IS_EXTRA( victim, EXTRA_NOTE_TRUST ) )
		{
			send_to_char( "Their ntrust is already on.\n\r", ch );
			return ;
		}
		SET_BIT( victim->extra, EXTRA_NOTE_TRUST );
		send_to_char( "Note trust ON.\n\r", ch );
		send_to_char( "You are now note trusted.\n\r", victim );
		return ;
	}
	return ;
}

void do_otransfer( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	char arg2[ MAX_INPUT_LENGTH ];
	OBJ_DATA *obj;
	CHAR_DATA *victim;
	ROOM_INDEX_DATA *chroom;
	ROOM_INDEX_DATA *objroom;

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

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

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

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

	if ( !IS_JUDGE( ch ) && ( obj->questmaker == NULL ||
	                          str_cmp( ch->name->str, obj->questmaker->str ) || obj->questmaker->len < 2 ) )
	{
		send_to_char( "You don't have permission to otransfer that item.\n\r", ch );
		return ;
	}

	if ( obj->carried_by != NULL )
	{
		if ( !IS_NPC( obj->carried_by ) )
		{
			send_to_char( "You failed.\n\r", ch );
			act( "$p flickers briefly with energy.", obj->carried_by, obj, NULL, TO_CHAR );
			return ;
		}
		act( "$p vanishes from your hands in an explosion of energy.", obj->carried_by, obj, NULL, TO_CHAR );
		act( "$p vanishes from $n's hands in an explosion of energy.", obj->carried_by, obj, NULL, TO_ROOM );
		obj_from_char( obj );
	}
	else if ( obj->in_obj != NULL )
		obj_from_obj( obj );
	else if ( obj->in_room != NULL )
	{
		chroom = ch->in_room;
		objroom = obj->in_room;
		char_from_room( ch );
		char_to_room( ch, objroom );
		act( "$p vanishes from the ground in an explosion of energy.", ch, obj, NULL, TO_ROOM );
		if ( chroom == objroom )
			act( "$p vanishes from the ground in an explosion of energy.", ch, obj, NULL, TO_CHAR );
		char_from_room( ch );
		char_to_room( ch, chroom );
		obj_from_room( obj );
	}
	else
	{
		send_to_char( "You were unable to get it.\n\r", ch );
		return ;
	}
	obj_to_char( obj, victim );
	act( "$p appears in your hands in an explosion of energy.", victim, obj, NULL, TO_CHAR );
	act( "$p appears in $n's hands in an explosion of energy.", victim, obj, NULL, TO_ROOM );
	return ;
}

void bind_char( CHAR_DATA *ch )
{
	OBJ_DATA * obj;
	OBJ_INDEX_DATA *pObjIndex;
	ROOM_INDEX_DATA *location;

	if ( IS_NPC( ch ) || ch->pcdata->obj_vnum < 1 )
		return ;

	if ( ( pObjIndex = get_obj_index( ch->pcdata->obj_vnum ) ) == NULL )
		return ;

	if ( ch->in_room == NULL || ch->in_room->vnum == ROOM_VNUM_IN_OBJECT )
	{
		location = get_room_index( ROOM_VNUM_ALTAR );
		char_from_room( ch );
		char_to_room( ch, location );
	}
	else
		location = ch->in_room;

	obj = create_object( pObjIndex, 50 );
	obj_to_room( obj, location );
	obj->chobj = ch;
	ch->pcdata->chobj = obj;
	SET_BIT( ch->affected_by, AFF_POLYMORPH );
	SET_BIT( ch->extra, EXTRA_OSWITCH );
	ch->morph = g_string_assign( ch->morph, obj->short_descr->str );
	send_to_char( "You reform yourself.\n\r", ch );
	act( "$p fades into existance on the floor.", ch, obj, NULL, TO_ROOM );
	do_look( ch, "auto" );
	return ;
}

void do_bind( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	char arg2[ MAX_INPUT_LENGTH ];
	OBJ_DATA *obj;
	CHAR_DATA *victim;

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

	if ( arg1[ 0 ] == '\0' || arg2[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: bind <player> <object>\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 ( ch == victim )
	{
		send_to_char( "You can't do this to yourself.\n\r", ch );
		return ;
	}
	if ( IS_NPC( victim ) )
	{
		send_to_char( "Not on NPC's.\n\r", ch );
		return ;
	}
	else if ( IS_AFFECTED( victim, AFF_POLYMORPH ) )
	{
		send_to_char( "You cannot do this while they are polymorphed.\n\r", ch );
		return ;
	}
	else if ( IS_IMMORTAL( victim ) )
	{
		send_to_char( "Only on mortals or avatars.\n\r", ch );
		return ;
	}

	if ( ( obj = get_obj_carry( ch, arg2 ) ) == NULL )
	{
		send_to_char( "You are not carrying that item.\n\r", ch );
		return ;
	}
	if ( obj->questmaker != NULL && obj->questmaker->len > 1 )
	{
		send_to_char( "You cannot bind someone into a modified item.\n\r", ch );
		return ;
	}
	if ( obj->chobj != NULL )
	{
		send_to_char( "That item already has someone bound in it.\n\r", ch );
		return ;
	}
	send_to_char( "Ok.\n\r", ch );
	act( "$n transforms into a white vapour and pours into $p.", victim, obj, NULL, TO_ROOM );
	act( "You transform into a white vapour and pour into $p.", victim, obj, NULL, TO_CHAR );
	victim->pcdata->obj_vnum = obj->pIndexData->vnum;
	obj->chobj = victim;
	victim->pcdata->chobj = obj;
	SET_BIT( victim->affected_by, AFF_POLYMORPH );
	SET_BIT( victim->extra, EXTRA_OSWITCH );
	victim->morph = g_string_assign( victim->morph, obj->short_descr->str );
	return ;
}

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

	argument = one_argument( argument, arg );

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: release <object>\n\r", ch );
		return ;
	}

	if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
	{
		send_to_char( "You are not carrying that item.\n\r", ch );
		return ;
	}
	if ( ( victim = obj->chobj ) == NULL )
	{
		send_to_char( "There is nobody bound in that item.\n\r", ch );
		return ;
	}
	send_to_char( "Ok.\n\r", ch );
	victim->pcdata->obj_vnum = 0;
	obj->chobj = NULL;
	victim->pcdata->chobj = NULL;
	REMOVE_BIT( victim->affected_by, AFF_POLYMORPH );
	REMOVE_BIT( victim->extra, EXTRA_OSWITCH );
	victim->morph = g_string_assign( victim->morph, "" );
	act( "A white vapour pours out of $p and forms into $n.", victim, obj, NULL, TO_ROOM );
	act( "Your spirit floats out of $p and reforms its body.", victim, obj, NULL, TO_CHAR );
	return ;
}


void do_morph( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	char arg2[ MAX_INPUT_LENGTH ];
	OBJ_DATA *obj;
	OBJ_DATA *morph;
	int mnum;

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

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: morph <object> <form>\n\r", ch );
		return ;
	}

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

	if ( !IS_SET( obj->spectype, SITEM_MORPH ) )
	{
		send_to_char( "That item cannot morph.\n\r", ch );
		return ;
	}

	if ( arg2[ 0 ] == '\0' )
	{
		act( "$p can morph into the following forms:", ch, obj, NULL, TO_CHAR );
		show_list_to_char( obj->contains, ch, TRUE, TRUE );
		return ;
	}

	if ( ( morph = get_obj_list( ch, arg2, obj->contains ) ) == NULL )
	{
		send_to_char( "It cannot assume that form.\n\r", ch );
		return ;
	}
	obj_from_obj( morph );
	obj_to_char( morph, ch );
	act( "$p morphs into $P in $n's hands!", ch, obj, morph, TO_ROOM );
	act( "$p morphs into $P in your hands!", ch, obj, morph, TO_CHAR );
	mnum = obj->wear_loc;
	obj_from_char( obj );
	obj_to_obj( obj, morph );
	if ( morph->wear_flags == obj->wear_flags && mnum != WEAR_NONE )
		equip_char( ch, morph, mnum );
	return ;
}

/* prefix command: it will put the string typed on each line typed */

void do_prefi ( CHAR_DATA *ch, char *argument )
{
	send_to_char( "You cannot abbreviate the prefix command.\r\n", ch );
	return ;
}

void do_prefix ( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_INPUT_LENGTH ];

	if ( argument[ 0 ] == '\0' )
	{
		if ( ch->prefix->str[ 0 ] == '\0' )
		{
			send_to_char( "You have no prefix to clear.\r\n", ch );
			return ;
		}

		send_to_char( "Prefix removed.\r\n", ch );
		ch->prefix = g_string_assign( ch->prefix, "" );
		return ;
	}

	if ( ch->prefix->str[ 0 ] != '\0' )
	{
		sprintf( buf, "Prefix changed to %s.\r\n", argument );
	}
	else
	{
		sprintf( buf, "Prefix set to %s.\r\n", argument );
	}
	ch->prefix = g_string_assign( ch->prefix, argument );

	return ;
}

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

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

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: spc <victim>\n\r", ch );
		send_to_char( "or:     spc <victim> <flag_name>\n\r", ch );
		send_to_char( "\n\r", ch );
		send_to_char( "Flag_name being one of:\n\r", ch );
		send_to_char( "  champion demon_lord prince sire\n\r", ch );
		send_to_char( "  anarch inconnu antitribu sabbat\n\r", ch );
		send_to_char( "  camarilla independent inducted\n\r", ch );
		send_to_char( "  primogen justicar bloodhunt wyrm\n\r", ch );
		send_to_char( "  pack beta followers technocracy elder\n\r", ch );
		send_to_char( "\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_SET(victim->act, PLR_GODLESS) && get_trust(ch) < NO_GODLESS
	//		&& !IS_SET(ch->extra , EXTRA_ANTI_GODLESS))
	//	{
	//		send_to_char( "You failed.\n\r", ch );
	//		return;
	//	}

	if ( arg2[ 0 ] == '\0' )
	{
		str_cpy( buf, "" );
		for ( count = 0 ; spc_flags[ count ].name != NULL ; count++ )
		{
			if ( IS_SET( victim->special, spc_flags[ count ].bit ) )
			{
				sprintf( buf + strlen( buf ), "%s\n\r", spc_flags[ count ].name );
			}
		}
		act( "$N has the following SPC bits set:", ch, NULL, victim, TO_CHAR );
		if ( strlen( buf ) < 2 )
			str_cpy( buf, "none\n\r" );
		send_to_char( buf, ch );
		return ;
	}

	/*
	 * Set something.
	 */

	for ( count = 0 ; spc_flags[ count ].name != NULL ; count++ )
	{
		if ( !str_cmp( spc_flags[ count ].name, arg2 ) )
		{
			if ( spc_flags[ count ].settable )
			{
				if ( IS_SET( victim->special, spc_flags[ count ].bit ) )
					REMOVE_BIT( victim->special, spc_flags[ count ].bit );
				else
					SET_BIT( victim->special, spc_flags[ count ].bit );

				sprintf( buf, "You've toggled the %s bit.\n\r", spc_flags[ count ].name );
				send_to_char( buf, ch );
				return ;
			}
			else
			{
				send_to_char( "That bit cannot be changed.\n\r", ch );
				return ;
			}
		}
	}
	/*
	 * Generate usage message.
	 */
	do_spc( ch, "" );
	return ;
}
void do_auto_shutdown()
{
	GSList	* desc_list;
	DESCRIPTOR_DATA *d;

	/*
	 * This allows for a shutdown without somebody in-game actually calling it.
	 *	-Ferric
	 */

	merc_down = TRUE;

	/* This is to write to the file.
	fclose(fpReserve);
	if((fp = fopen(LAST_COMMAND,"a")) == NULL)
	bug("Error in do_auto_save opening last_command.txt",0);

	   fprintf(fp,"Last Command: %s\n",
	        last_command);


	fclose( fp );
	fpReserve = fopen( NULL_FILE, "r" );
	*/

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->character )
			do_save ( d->character, "" );
		close_socket( d );
	}
	return ;
}

void do_showspecial( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	int count, gt, cmd;
	char arg1[ MAX_INPUT_LENGTH ];
	bool fFound = FALSE;
	char buf2[ MAX_STRING_LENGTH ];
	CHAR_DATA *victim;

	argument = one_argument( argument, arg1 );

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

	sprintf ( buf, "%s's Current powers:\n\r", victim->name->str );

	if ( IS_CLASS( victim, CLASS_VAMPIRE ) )
	{
		str_cpy( buf, "" );
		for ( count = 0 ; count < MAX_DISC ; count++ )
		{
			if ( get_disc( victim, count ) > 0 && !IS_VAMPPASS( victim, count ) )
			{
				sprintf( buf2, " %s %d", discipline_table[ count ].name, get_disc( victim, count ) );
				strcat( buf, buf2 );
				fFound = TRUE;
			}
			else if ( IS_VAMPPASS( victim, count ) )
			{
				sprintf( buf2, " %s %d", discipline_table[ count ].name_caps, get_disc( victim, count ) );
				strcat( buf, buf2 );
				fFound = TRUE;
			}
		}
	}
	if ( IS_CLASS( victim, CLASS_WEREWOLF ) )
	{
		sprintf( buf2, "Totems: Bear (%d), Lynx (%d), Boar (%d), Owl (%d), Spider (%d), Wolf (%d),\n\r        Hawk (%d), Mantis (%d), Shark(%d), Sphinx (%d), Rat (%d), Chameleon (%d).\n\r",
		         victim->pcdata->powers[ WPOWER_BEAR ], victim->pcdata->powers[ WPOWER_LYNX ],
		         victim->pcdata->powers[ WPOWER_BOAR ], victim->pcdata->powers[ WPOWER_OWL ],
		         victim->pcdata->powers[ WPOWER_SPIDER ], victim->pcdata->powers[ WPOWER_WOLF ],
		         victim->pcdata->powers[ WPOWER_HAWK ], victim->pcdata->powers[ WPOWER_MANTIS ],
		         victim->pcdata->powers[ WPOWER_SHARK ], victim->pcdata->powers[ WPOWER_SPHINX ],
		         victim->pcdata->powers[ WPOWER_RAT ], victim->pcdata->powers[ WPOWER_CHAMELEON ] );
		fFound = TRUE;
		strcat( buf, buf2 );
	}
	if ( IS_CLASS( victim, CLASS_MAGE ) )
	{
		sprintf( buf2, "Correspondence: %d Entropy: %d Forces: %d\n\r", has_sphere( victim, SPHERE_CORRESPONDENCE ),
		         has_sphere( victim, SPHERE_ENTROPY ), has_sphere( victim, SPHERE_FORCES ) );
		strcat( buf, buf2 );
		sprintf( buf2, "Mind: %d Matter: %d Prime: %d\n\r", has_sphere( victim, SPHERE_MIND ),
		         has_sphere( victim, SPHERE_MATTER ), has_sphere( victim, SPHERE_PRIME ) );
		strcat( buf, buf2 );
		sprintf( buf2, "Spirit: %d Life: %d Time: %d\n\r", has_sphere( victim, SPHERE_SPIRIT ),
		         has_sphere( victim, SPHERE_LIFE ), has_sphere( victim, SPHERE_TIME ) );
		strcat( buf, buf2 );
		fFound = TRUE;
	}
	if ( IS_SWWF( victim ) )
	{
		sprintf( buf, "Breed: \n\r" );
		for ( cmd = 0; cmd <= BREED_MAX;cmd++ )
		{
			if ( ( victim->pcdata->breed[ cmd ] == -1 ) || ( victim->pcdata->breed[ cmd ] > 0 ) )
			{
				if ( victim->pcdata->breed[ cmd ] == -1 )
					gt = 0;
				else
					gt = victim->pcdata->breed[ cmd ];

				sprintf( buf2, " {R%s{W: {W({B%d{W){x", breed_table[ cmd ].haunt, gt );
				if ( strlen( buf ) >= 70 )
				{
					strcat( buf, "\n\r" );
					send_to_char( buf, ch );
					strcpy( buf, buf2 );
				}
				else
					strcat( buf, buf2 );
			}
		}
		if ( buf[ 0 ] != '\0' )
		{
			strcat( buf, "\n\r" );
			send_to_char( buf, ch );
		}

		sprintf( buf, "Auspice: \n\r" );

		for ( cmd = 0; cmd <= AUSPICE_MAX;cmd++ )
		{
			if ( ( victim->pcdata->auspice[ cmd ] == -1 ) || ( victim->pcdata->auspice[ cmd ] > 0 ) )
			{
				if ( victim->pcdata->auspice[ cmd ] == -1 )
					gt = 0;
				else
					gt = victim->pcdata->auspice[ cmd ];

				sprintf( buf2, " {R%s{W: {W({B%d{W){x", auspice_table[ cmd ].haunt, gt );
				if ( strlen( buf ) >= 70 )
				{
					strcat( buf, "\n\r" );
					send_to_char( buf, ch );
					strcpy( buf, buf2 );
				}
				else
					strcat( buf, buf2 );
			}
		}

		if ( buf[ 0 ] != '\0' )
		{
			strcat( buf, "\n\r" );
			send_to_char( buf, ch );
		}

		sprintf( buf, "Tribe: \n\r" );

		for ( cmd = 0; cmd <= TRIBE_MAX;cmd++ )
		{
			if ( ( victim->pcdata->tribes[ cmd ] == -1 ) || ( victim->pcdata->tribes[ cmd ] > 0 ) )
			{
				if ( victim->pcdata->tribes[ cmd ] == -1 )
					gt = 0;
				else
					gt = victim->pcdata->tribes[ cmd ];

				sprintf( buf2, " {R%s{W: {W({B%d{W){x", tribe_table[ cmd ].haunt, gt );
				if ( strlen( buf ) >= 70 )
				{
					strcat( buf, "\n\r" );
					send_to_char( buf, ch );
					strcpy( buf, buf2 );
				}
				else
					strcat( buf, buf2 );
			}
		}

		if ( buf[ 0 ] != '\0' )
		{
			strcat( buf, "\n\r" );
			send_to_char( buf, ch );
		}

	}
	if ( fFound )
		send_to_char( buf, ch );
	else
		send_to_char( " None", ch );
	send_to_char( ".\n\r", ch );

}

void do_outfit( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_INPUT_LENGTH ];
	OBJ_DATA *obj;
	OBJ_DATA *obj2;
	CHAR_DATA *victim;

	argument = one_argument( argument, arg1 );


	if ( arg1[ 0 ] == '\0' )
		victim = ch;
	else if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return ;
	}
	/*create eq*/

	obj = create_object( get_obj_index( OBJ_VNUM_FEARBAG ), ch->level );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARBRAC ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARBRAC ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARAMUL ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARAMUL ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARRING ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARRING ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARCHES ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARHELM ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARLEGP ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARBOOT ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARGAUN ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARARMP ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARSHIL ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARCLOA ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARGIRT ), ch->level );
	obj_to_obj( obj2, obj );

	obj2 = create_object( get_obj_index( OBJ_VNUM_FEARMASK ), ch->level );
	obj_to_obj( obj2, obj );


	obj_to_char( obj, victim );
	act( "$p appears in your hands in an explosion of energy.", victim, obj, NULL, TO_CHAR );
	act( "type 'get all bag' then 'wear all', and you may want to claim it...", victim, obj, NULL, TO_CHAR );
	act( "$p appears in $n's hands in an explosion of energy.", victim, obj, NULL, TO_ROOM );
	return ;

}

void do_check( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	char arg[ MAX_INPUT_LENGTH ];
	GString *buffer;
	CHAR_DATA *victim;
	int count = 1;

	one_argument( argument, arg );

	buffer = g_string_new( "" );
	if ( arg[ 0 ] == '\0' || !str_prefix( arg, "stats" ) )
	{
		if ( ch->level < LEVEL_JUDGE )
		{
			send_to_char( "You can't use this check option.\n\r", ch );
			return ;
		}

		for ( victim = char_list; victim != NULL; victim = victim->next )
		{
			if ( IS_NPC( victim ) || !can_see( ch, victim ) )
				continue;

			if ( victim->desc == NULL )
			{
				sprintf( buf, "%3d) {r%12s{x is linkdead.\n\r", count, victim->name->str );
				buffer = g_string_append( buffer, buf );
				count++;
				continue;
			}

			if ( victim->desc->connected == CON_GET_NEW_CLASS )
			{
				sprintf( buf, "%3d) {r%12s{x is being created.\n\r",
				         count, victim->name->str );
				buffer = g_string_append( buffer, buf );
				count++;
				continue;
			}

			if ( ( victim->desc->connected == CON_GET_OLD_PASSWORD
			        || victim->desc->connected >= CON_READ_MOTD )
			        && get_trust( victim ) <= get_trust( ch ) )
			{
				sprintf( buf, "%3d) {r%12s{x is connecting.\n\r",
				         count, victim->name->str );
				buffer = g_string_append( buffer, buf );
				count++;
				continue;
			}

			if ( victim->desc->connected == CON_PLAYING )
			{
				if ( get_trust( victim ) > get_trust( ch ) )
					sprintf( buf, "%3d) {r%12s{x.\n\r", count, victim->name->str );
				else
				{
					sprintf( buf, "%3d) {r%12s{x, Level %2d connected since {c%2d{x hours ({C%4d{x total hours)\n\r",
					         count, victim->name->str, victim->level,
					         ( ( int ) ( current_time - victim->logon ) ) / 3600,
					         ( victim->played + ( int ) ( current_time - victim->logon ) ) / 3600 );
					buffer = g_string_append( buffer, buf );
					if ( arg[ 0 ] != '\0' && !str_prefix( arg, "stats" ) )
					{
						sprintf( buf, "  {R%6d{x HP {R%5d{x Mana (Str:{M%2d{x Int:{M%2d{x Wis:{M%2d{x Dex:{M%2d{x Con:{M%2d{x) {C%3d{x Pr {C%5d{x Qpts.\n\r",
						         victim->max_hit, victim->max_mana, victim->pcdata->perm_str,
						         victim->pcdata->perm_int, victim->pcdata->perm_wis,
						         victim->pcdata->perm_dex, victim->pcdata->perm_con,
						         victim->practice, victim->pcdata->quest );
						buffer = g_string_append( buffer, buf );
					}
					count++;
				}
				continue;
			}

			sprintf( buf, "%3d) bug (oops)...please report to Spiral %s %d\n\r",
			         count, victim->name->str, victim->desc->connected );
			buffer = g_string_append( buffer, buf );
			count++;
		}
		page_to_char( buffer->str, ch );
		return ;
	}

	buffer = g_string_assign( buffer, "" );
	if ( !str_prefix( arg, "eq" ) )
	{

		if ( ch->level < LEVEL_JUDGE )
		{
			send_to_char( "You can't use this check option.\n\r", ch );
			return ;
		}

		for ( victim = char_list; victim != NULL; victim = victim->next )
		{
			if ( IS_NPC( victim )
			        || victim->desc == NULL
			        || victim->desc->connected != CON_PLAYING
			        || !can_see( ch, victim )
			        || get_trust( victim ) > get_trust( ch ) )
				continue;

			sprintf( buf, "%3d) {r%12s{x, {R%3d{x items (weight {R%3d{x) Hit:{R%4d{x Dam:{R%4d{x Save:{r%3d{x AC:{r%5d{x.\n\r",
			         count, victim->name->str, victim->carry_number, victim->carry_weight,
			         victim->hitroll, victim->damroll, victim->saving_throw,
			         victim->armor );
			buffer = g_string_append( buffer, buf );
			count++;
		}
		page_to_char( buffer->str, ch );
		return ;
	}

	buffer = g_string_assign( buffer, "" );
	if ( !str_prefix( arg, "snoop" ) )   /* this part by jerome */
	{
		char bufsnoop [ 100 ];

		if ( ch->level < MAX_LEVEL )
		{
			send_to_char( "You can't use this check option.\n\r", ch );
			return ;
		}

		for ( victim = char_list; victim != NULL; victim = victim->next )
		{
			if ( IS_NPC( victim )
			        || victim->desc == NULL
			        || victim->desc->connected != CON_PLAYING
			        || !can_see( ch, victim )
			        || get_trust( victim ) > get_trust( ch ) )
				continue;

			if ( victim->desc->snoop_by != NULL && g_slist_length( victim->desc->snoop_by ) > 0 )
			{
				GSList * snoop_list;
				DESCRIPTOR_DATA *snooper;

				for ( snoop_list = victim->desc->snoop_by; snoop_list != NULL; snoop_list = g_slist_next( snoop_list ) )
				{
					snooper = ( DESCRIPTOR_DATA* ) snoop_list->data;
					sprintf( bufsnoop, " %15s .", snooper->character->name->str );
				}
				g_slist_free( snoop_list );
			}
			else
				sprintf( bufsnoop, "     (none)      ." );

			sprintf( buf, "%3d {r%15s{x : {m%s{x \n\r", count, victim->name->str, bufsnoop );
			buffer = g_string_append( buffer, buf );
			count++;
		}
		page_to_char( buffer->str, ch );
		return ;
	}


	send_to_char( "Syntax: 'check'       display info about players\n\r", ch );
	send_to_char( "        'check stats' display info and resume stats\n\r", ch );
	send_to_char( "        'check eq'    resume eq of all players\n\r", ch );
	send_to_char( "Use the stat command in case of doubt about someone...\n\r", ch );
	g_string_free( buffer, TRUE );
	return ;
}

/* show a list of all used AreaVNUMS */
/* By The Mage */
void do_fvlist ( CHAR_DATA *ch, char *argument )
{
	int i, j;
	char buf[ MAX_STRING_LENGTH ];
	GString *buffer;
	char arg[ MAX_INPUT_LENGTH ];
	char *string;
	int COLUMS = 8;

	string = one_argument( argument, arg );

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "Syntax:\n\r", ch );
		send_to_char( "  fvlist obj\n\r", ch );
		send_to_char( "  fvlist mob\n\r", ch );
		send_to_char( "  fvlist room\n\r", ch );
		return ;
	}
	j = 1;
	if ( !str_cmp( arg, "obj" ) )
	{
		sprintf( buf, "{WFree {C%s{W vnum listing for area {C%s{x\n\r", arg,
		         ch->in_room->area->name );
		send_to_char( buf, ch );
		sprintf( buf, "{Y=============================================================================={C\n\r" );

		send_to_char( buf, ch );
		buffer = g_string_new( "" );
		for ( i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++ )
		{
			if ( get_obj_index( i ) == NULL )
			{
				sprintf( buf, "%8d, ", i );
				if ( j == COLUMS )
				{
					page_to_char( buffer->str, ch );
					send_to_char( "\n\r", ch );
					j = 0;
					buffer = g_string_assign( buffer, "" );
				}
				else
				{
					buffer = g_string_append( buffer, buf );
					j++;
				}
			}
		}
		send_to_char( "{x\n\r", ch );
		g_string_free( buffer, TRUE );
		return ;
	}

	if ( !str_cmp( arg, "mob" ) )
	{
		sprintf( buf, "{WFree {C%s {Wvnum listing for area {C%s{x\n\r", arg,
		         ch->in_room->area->name );
		send_to_char( buf, ch );
		sprintf( buf, "{Y=============================================================================={C\n\r" );
		send_to_char( buf, ch );
		buffer = g_string_new( "" );
		for ( i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++ )
		{
			if ( get_mob_index( i ) == NULL )
			{
				sprintf( buf, "%8d, ", i );
				if ( j == COLUMS )
				{
					page_to_char( buffer->str, ch );
					send_to_char( "\n\r", ch );
					j = 0;
					buffer = g_string_assign( buffer, "" );
				}
				else
				{
					buffer = g_string_append( buffer, buf );
					j++;
				}
			}
		}
		send_to_char( "{x\n\r", ch );
		g_string_free( buffer, TRUE );
		return ;
	}
	if ( !str_cmp( arg, "room" ) )
	{
		sprintf( buf, "{WFree {C%s {Wvnum listing for area {C%s{x\n\r", arg,
		         ch->in_room->area->name );
		send_to_char( buf, ch );
		sprintf( buf, "{Y=============================================================================={C\n\r" );
		send_to_char( buf, ch );
		buffer = g_string_new( "" );
		for ( i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++ )
		{
			if ( get_room_index( i ) == NULL )
			{
				sprintf( buf, "%8d, ", i );
				if ( j == COLUMS )
				{
					page_to_char( buffer->str, ch );
					send_to_char( "\n\r", ch );
					j = 0;
					buffer = g_string_assign( buffer, "" );
				}
				else
				{
					buffer = g_string_append( buffer, buf );
					j++;
				}

			}
			send_to_char( "{x\n\r", ch );
			g_string_free( buffer, TRUE );
			return ;
		}
		send_to_char( "WHAT??? \n\r", ch );
		send_to_char( "Syntax:\n\r", ch );
		send_to_char( "  fvlist obj\n\r", ch );
		send_to_char( "  fvlist mob\n\r", ch );
		send_to_char( "  fvlist room\n\r", ch );
	}
}

/*
 * Spiral's Nice Debugging Utils... These will give you the count of
 * objects and mobiles at all times.. just make a call to them.
 * for instance: check_mobiles("Proc_Name")
 * that will check all the mobiles at the time of the call
 * and if they changed will report to the bug log with the proc name
 * nice huh?
 * 
 * Spiral
 */

void check_both ( char *argument )
{
	if ( !IS_SET( mudsetting->mud_setting, MS_DEBUG ) )
		return ;

	check_object( argument );
	check_mobile( argument );
}

void check_object( char *argument )
{
	OBJ_DATA * wch;
	char buf[ MAX_STRING_LENGTH ];
	int sh_count = 0;
	GSList *tmp = object_list;

	if ( !IS_SET( mudsetting->mud_setting, MS_DEBUG ) )
		return ;

	while ( tmp != NULL )
	{
		wch = ( OBJ_DATA* ) tmp->data;
		sh_count++;
		tmp = g_slist_next( tmp );
	}

	g_slist_free( tmp );

	if ( mudsetting->Obj_Count > sh_count )
	{
		sprintf( buf, "Change in object count in proc %s, from %d to %d", argument, mudsetting->Obj_Count, sh_count );
		g_message( "%s", buf );
		bug( buf, 0 );
	}

	mudsetting->Obj_Count = sh_count;
}

void check_mobile( char *argument )
{
	CHAR_DATA * wch;
	CHAR_DATA *wch_next = NULL;
	char buf[ MAX_STRING_LENGTH ];
	int sh_count = 0;

	if ( !IS_SET( mudsetting->mud_setting, MS_DEBUG ) )
		return ;

	for ( wch = char_list; wch != NULL; wch = wch_next )
	{
		wch_next = wch->next;
		sh_count++;
	}

	if ( mudsetting->Char_Count > sh_count )
	{
		sprintf( buf, "Change in Mobile count in proc %s, from %d to %d", argument, mudsetting->Char_Count, sh_count );
		g_message( "%s", buf );
		bug( buf, 0 );
	}

	mudsetting->Char_Count = sh_count;
}


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

	argument = one_argument( argument, arg1 );

	if ( IS_IMMORTAL( ch ) && arg1[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: style (char).\n\r", ch );
		return ;
	}

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

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

	sprintf( buf, "  Nature: {W%s{x\n\r", victim->pcdata->nature->str );
	send_to_char( buf, ch );
	sprintf( buf, "Demeanor: {W%s{x\n\r", victim->pcdata->demeanor->str );
	send_to_char( buf, ch );
	sprintf( buf, "AnonDesc: {W%s{x\n\r", victim->pcdata->anon_desc->str );
	send_to_char( buf, ch );
	if ( IS_SWWF( victim ) )
	{
		sprintf( buf, "Auspice: {W%s{x\n\r", auspice_table[ victim->pcdata->sgift[ 2 ] ].haunt );
		send_to_char( buf, ch );
	}
	return ;
}

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

	one_argument ( ch->name->str, name ); /* copy the first word into name */

	if ( !name[ 0 ] )   /* weird mob .. no keywords */
	{
		str_cpy ( outbuf, "" ); /* Do not return NULL, just an empty buffer */
		return outbuf;
	}

	for ( rch = ch->in_room->people; rch && ( rch != ch );rch = rch->next_in_room )
		if ( is_name ( name, rch->name->str ) )
			count++;


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

void do_for ( CHAR_DATA *ch, char *argument )
{
	char range[ MAX_INPUT_LENGTH ];
	char buf[ MAX_STRING_LENGTH ];
	bool fRoom = FALSE, fGods = FALSE, fMortals = FALSE, fMobs = FALSE, fEverywhere = FALSE, found;
	ROOM_INDEX_DATA *room, *old_room;
	CHAR_DATA *p, *p_next;
	int i;

	argument = one_argument ( argument, range );

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

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


	if ( !str_cmp ( range, "all" ) )
	{
		fMortals = TRUE;
		fGods = TRUE;
	}
	else if ( !str_cmp ( range, "room" ) )
		fRoom = TRUE;
	else if ( !str_cmp ( range, "gods" ) )
		fGods = TRUE;
	else if ( !str_cmp ( range, "mortals" ) )
		fMortals = TRUE;
	else if ( !str_cmp ( range, "mobs" ) )
		fMobs = 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 );
		return ;
	}

	if ( strchr ( argument, '#' ) )   /* replace # ? */
	{
		for ( p = char_list; p ; p = p_next )
		{
			p_next = p->next; /* In case someone DOES try to AT MOBS SLAY # */
			found = FALSE;

			if ( !( p->in_room ) || room_is_private( 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;
			else if ( ch->in_room == p->in_room && fRoom )
				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 );
				send_to_char( "--------------------------------------------------------\n\r", ch );
				// send_to_char("\n\r",ch);
				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 ( !room->people )   /* 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 = room->people; p && !found; p = p->next_in_room )
				{

					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 && !room_is_private( room ) )   /* Any of the required type here AND room not private? */
				{
					/* 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 );
					send_to_char( "--------------------------------------------------------\n\r", ch );
					send_to_char( "\n\r", ch );
					char_from_room ( ch );
					char_to_room ( ch, old_room );
				} /* if found */
			} /* for every room in a bucket */
	} /* if strchr */
	mudsetting->last_proc_logged = 100;
	return ;
} /* do_for */

void do_autocopy( CHAR_DATA *ch, char *argument )
{
	if ( copyover_set == TRUE )
	{
		copyover_set = FALSE;
		copyover_time = 0;
		do_echo( ch, "{R Copyover stopped.{x" );
		return ;
	}
	if ( !strcmp( argument, "" ) )
		copyover_time = 1;
	else
		copyover_time = atoi( argument );
	copyover_set = TRUE;
	send_to_char( "OKies.\n\r", ch );
}


int get_object_count( char *argument )
{
	OBJ_DATA * obj;
	int sh_count = 0;
	GSList *tmp = object_list;

	while ( tmp != NULL )
	{
		obj = ( OBJ_DATA* ) tmp->data;
		sh_count++;
		tmp = g_slist_next( tmp );
	}
	g_slist_free( tmp );
	return sh_count;
}


int get_mobile_count( char *argument )
{
	CHAR_DATA * wch;
	CHAR_DATA *wch_next = NULL;
	int sh_count = 0;

	for ( wch = char_list; wch != NULL; wch = wch_next )
	{
		wch_next = wch->next;
		sh_count++;
	}
	return sh_count;
}


int get_player_count( char *argument )
{
	CHAR_DATA * wch;
	CHAR_DATA *wch_next = NULL;
	int sh_count = 0;

	for ( wch = char_list; wch != NULL; wch = wch_next )
	{
		wch_next = wch->next;

		if ( !IS_NPC( wch ) )
			sh_count++;

	}
	return sh_count;
}

void do_spiralbow( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * victim;
	DESCRIPTOR_DATA *d;
	char buf[ MAX_STRING_LENGTH ];
	char arg1[ MAX_STRING_LENGTH ];
	int loop_count = 0;
	int rand_player = 0;
	GSList	*desc_list;

	argument = one_argument( argument, arg1 );

	if ( arg1[ 0 ] == '\0' )
	{
		//Find a victim randomly
		rand_player = dice( 1, get_mobile_count( arg1 ) );
		for ( victim = char_list;victim != NULL;victim = victim->next )
		{
			loop_count++;
			if ( loop_count == rand_player )
				break;
		}
	}
	else if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
	{
		send_to_char( "They aren't here.\n\r", ch );
		return ;
	}

	//To check if I missed the victim
	if ( victim == NULL )
	{
		send_to_char( "Null Victim!\n\r", ch );
		return ;
	}

	send_to_char( "Puff quickly grabs you!\n\r", victim );
	act( "Puff quickly appears in front of $n, grabs $m and throws $m about 30 feet in the sky!", victim, NULL, NULL, TO_ROOM );
	send_to_char( "You promptly get thrown in the air!\n\r", victim );

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING && d->character != victim && d->character != ch )
		{
			act( "You see $n falling from the sky!", victim, NULL, d->character, TO_VICT );
			act( "$n pulls back {WSpiral's{x bow and aims...then shoots!\n\r", ch, NULL, d->character, TO_VICT );
			act( "THUD! $n gets impaled by the arrow!.\n\r", victim, NULL, d->character, TO_VICT );
			act( "{BPuff OOCs: Nice shot $n!{X\n\r", ch, NULL, d->character, TO_VICT );
		}
	}
	sprintf( buf, "You see %s falling from the sky!\n\r", victim->name->str );
	send_to_char( buf, ch );
	send_to_char( "You think quickly and pull out your trusty {WSpiral{x bow.\n\r", ch );
	sprintf( buf, "THUD! You nail %s dead on!.\n\r", victim->name->str );
	send_to_char( buf, ch );
	send_to_char( "{BPuff OOCs: Nice shot!{x\n\r", ch );
	act( "You see $n pull back a arrow from thier bow.\n\r", ch, NULL, victim, TO_VICT );
	send_to_char( "You have just gotten hit with a arrow!\n\r", victim );
	send_to_char( "{BPuff OOCs: Nice shot!{x\n\r", victim );
	send_to_char( "You fall and hit the ground!\n\r", victim );
	return ;

}
/* show a list of all used VNUMS */

#define COLUMNS 		5   /* number of columns */
#define MAX_ROW 		((MAX_SHOW_VNUM / COLUMNS)+1) /* rows */
#define MAX_SHOW_VNUM   305 /* show only 1 - 100*100 */

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

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

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

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

void do_list_skills( CHAR_DATA *ch, char *argument )
{
	int sn;
	char buf[ MAX_STRING_LENGTH ];

	for ( sn = 0; sn < ( MAX_SKILL + 2 ); sn++ )
	{
		if ( skill_table[ sn ].name == NULL )
			break;
		sprintf( buf, "%13s	%3d	", skill_table[ sn ].name, sn );
		send_to_char( buf, ch );
		if ( sn++ != ( MAX_SKILL + 3 ) )
		{
			sprintf( buf, "%13s	%3d\n\r", skill_table[ sn ].name, sn );
			send_to_char( buf, ch );
		}
		else
		{
			str_cpy( buf, "\n\r" );
			send_to_char( buf, ch );
		}
	}
}


void do_showfight( CHAR_DATA *ch, char *argument )
{
	if ( !IS_IMMORTAL( ch ) )
	{
		send_to_char( "huh?", ch );
		return ;
	}

	if ( IS_SET( ch->pcdata->comm, COMM_SHOW_FIGHT ) )
	{
		REMOVE_BIT( ch->pcdata->comm, COMM_SHOW_FIGHT );
		send_to_char( "You will not be shown fight varibles.\n\r", ch );
		return ;
	}
	else
	{
		SET_BIT( ch->pcdata->comm, COMM_SHOW_FIGHT );
		send_to_char( "You will now see the fight varibles.\n\r", ch );
		return ;
	}
	return ;
}
void clear_bits( CHAR_DATA *victim )
{
	if ( IS_SET( victim->added, ADDED_ENLARGE ) )
		REMOVE_BIT( victim->added, ADDED_ENLARGE );
	if ( IS_SET( victim->added, ADDED_SHRINK ) )
		REMOVE_BIT( victim->added, ADDED_SHRINK );
	if ( IS_SET( victim->added, ADDED_FLAMES_PURE ) )
		REMOVE_BIT( victim->added, ADDED_FLAMES_PURE );
	if ( IS_SET( victim->added, ADDED_POLY_MIST ) )
		REMOVE_BIT( victim->added, ADDED_POLY_MIST );
	if ( IS_SET( victim->added, ADDED_POLY_GENERAL ) )
		REMOVE_BIT( victim->added, ADDED_POLY_GENERAL );
	if ( IS_SET( victim->added, ADDED_COURAGE ) )
		REMOVE_BIT( victim->added, ADDED_COURAGE );
	if ( IS_SET( victim->added, ADDED_BRISTLES ) )
		REMOVE_BIT( victim->added, ADDED_BRISTLES );
	if ( IS_SET( victim->added, ADDED_ANIMAL_MASTER ) )
		REMOVE_BIT( victim->added, ADDED_ANIMAL_MASTER );
	if ( IS_SET( victim->added, ADDED_ILLUSION ) )
		REMOVE_BIT( victim->added, ADDED_ILLUSION );
	if ( IS_SET( victim->added, ADDED_LOYAL ) )
		REMOVE_BIT( victim->added, ADDED_LOYAL );
	if ( IS_SET( victim->added, ADDED_HAND_FLAME ) )
		REMOVE_BIT( victim->added, ADDED_HAND_FLAME );
	if ( IS_SET( victim->added, ADDED_ANGER ) )
		REMOVE_BIT( victim->added, ADDED_ANGER );
	if ( IS_SET( victim->added, ADDED_CALM ) )
		REMOVE_BIT( victim->added, ADDED_CALM );
	if ( IS_SET( victim->added, ADDED_HAUNT ) )
		REMOVE_BIT( victim->added, ADDED_HAUNT );
	if ( IS_SET( victim->added, ADDED_INSANE ) )
		REMOVE_BIT( victim->added, ADDED_INSANE );
	if ( IS_SET( victim->added, ADDED_CONFUSE ) )
		REMOVE_BIT( victim->added, ADDED_CONFUSE );
	if ( IS_SET( victim->added, ADDED_NIGHTFALL ) )
		REMOVE_BIT( victim->added, ADDED_NIGHTFALL );
	if ( IS_SET( victim->added, ADDED_CLOAK ) )
		REMOVE_BIT( victim->added, ADDED_CLOAK );
	if ( IS_SET( victim->added, ADDED_FRENZY ) )
		REMOVE_BIT( victim->added, ADDED_FRENZY );
	if ( IS_SET( victim->added, ADDED_DIABLERIE ) )
		REMOVE_BIT( victim->added, ADDED_DIABLERIE );
	if ( IS_SET( victim->added, ADDED_BRAGE ) )
		REMOVE_BIT( victim->added, ADDED_BRAGE );
	if ( IS_SET( victim->added, ADDED_GIFTSPRIG ) )
		REMOVE_BIT( victim->added, ADDED_GIFTSPRIG );
	if ( IS_SET( victim->added, ADDED_DISCERN ) )
		REMOVE_BIT( victim->added, ADDED_DISCERN );
	if ( IS_SET( victim->added, ADDED_CHAMELEON ) )
		REMOVE_BIT( victim->added, ADDED_CHAMELEON );
	if ( IS_SET( victim->added, ADDED_VOICESOFCASTLE ) )
		REMOVE_BIT( victim->added, ADDED_VOICESOFCASTLE );
	if ( IS_SET( victim->act, PLR_HOLYLIGHT ) )
		REMOVE_BIT( victim->act, PLR_HOLYLIGHT );
	if ( IS_SET( victim->act, PLR_MARBLEFLESH ) )
		REMOVE_BIT( victim->act, PLR_MARBLEFLESH );
	return ;
}
/*consolidate all our clear commands in to one*/
void do_clear( CHAR_DATA *ch, char *argument )
{
	char	arg[ MAX_STRING_LENGTH ];
	char arg1[ MAX_INPUT_LENGTH ];
	OBJ_DATA *obj;
	AFFECT_DATA *paf;
	AFFECT_DATA *paf_last = NULL;
	SPHERE_DATA *spaf;
	SPHERE_DATA *spaf_last = NULL;
	OBJ_DATA *obj_next;
	CHAR_DATA *victim;
	sh_int count;

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

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "Clear Commands: timer,tell, card, stat, marriage, or vamp\n\r", ch );
		return ;
	}
	if ( !strcmp( arg, "tell" ) )
	{
		for ( victim = char_list; victim != NULL; victim = victim->next )
		{
			if ( victim->reply == ch )
				victim->reply = NULL;
		}
		send_to_char( "Tells and replys cleared.\n\r", ch );
		return ;
	}
	else if ( !strcmp( arg, "card" ) )
	{

		if ( arg1[ 0 ] == '\0' )
		{
			send_to_char( "Syntax: clearcard <quest card>\n\r", ch );
			return ;
		}
		if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
		{
			send_to_char( "You are not carrying that object.\n\r", ch );
			return ;
		}
		if ( obj->item_type != ITEM_QUESTCARD )
		{
			send_to_char( "That is not a quest card.\n\r", ch );
			return ;
		}
		obj->value[ 0 ] = -1;
		obj->value[ 1 ] = -1;
		obj->value[ 2 ] = -1;
		obj->value[ 3 ] = -1;
		quest_object( ch, obj );
		send_to_char( "This card has been reset.\n\r", ch );
		do_autosave( ch, "" );
		return ;
	}
	else if ( !strcmp( arg, "timer" ) )
	{
		if ( get_trust( ch ) < LEVEL_HIGHJUDGE )
		{
			send_to_char( "You don't have the security to use this argument!.\n\r", ch );
			return ;
		}

		for ( victim = char_list; victim != NULL; victim = victim->next )
		{
			if ( !IS_NPC( victim ) )
			{
				if ( victim->delay_timer > 1 )
					victim->delay_timer = 0;
				if ( victim->pk_timer > 1 )
					victim->pk_timer = 0;
				send_to_char( "Your timer has been cleared.\n\r", victim );
			}
		}
		send_to_char( "timers cleared.\n\r", ch );
		return ;
	}
	else if ( !strcmp( arg, "marriage" ) )
	{
		if ( arg1[ 0 ] == '\0' )
		{
			send_to_char( "Syntax: marriage (char).\n\r", ch );
			return ;
		}

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

		victim->pcdata->marriage = g_string_assign( victim->pcdata->marriage, "" );

		send_to_char( "Marriage Cleared\n\r", ch );
	}
	else if ( !strcmp( arg, "stat" ) )
	{

		if ( arg1[ 0 ] == '\0' )
		{
			send_to_char( "Syntax: mclear <char>.\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 ( IS_NPC( victim ) )
			return ;

		if ( IS_SWWF( victim ) && ch->pcdata->wwf_shape != SHAPE_HOMID )
			shape_shift( victim, SHAPE_HOMID );

		for ( obj = victim->carrying; obj != NULL; obj = obj_next )
		{
			obj_next = obj->next_content;
			if ( obj->wear_loc != WEAR_NONE )
			{

				obj_from_char( obj );
				obj_to_char( obj, victim );
			}
		}

		for ( paf = victim->affected; paf != NULL; paf = paf->next )
		{
			if ( paf_last != NULL && paf->type == paf_last->type )
				continue;
			else
			{
				if ( paf->type <= MAX_SKILL )
					affect_remove( victim, paf );
			}
			paf_last = paf;
		}

		for ( spaf = victim->sphere_affected; spaf != NULL; spaf = spaf->next )
		{
			if ( spaf_last != NULL && spaf->type == spaf_last->type )
				continue;
			else
			{
				if ( spaf->type <= MAX_SKILL )
					sphere_remove( victim, spaf );
			}
			spaf_last = spaf;
		}

		if ( IS_SET( victim->act, PLR_WIZINVIS ) )
			REMOVE_BIT( victim->act, PLR_WIZINVIS );

		if ( IS_AFFECTED( victim, AFF_POLYMORPH ) )
		{
			victim->affected_by	= AFF_POLYMORPH;
		}
		else if ( IS_AFFECTED( victim, AFF_POLYMORPH ) )
			victim->affected_by	= AFF_POLYMORPH;
		else
			victim->affected_by	= 0;

		clear_bits( victim );

		victim->armor	= 100;
		victim->hit	= UMAX( 1, victim->hit );
		victim->mana	= UMAX( 1, victim->mana );
		victim->move	= UMAX( 1, victim->move );
		victim->hitroll	= 0;
		victim->damroll	= 0;
		victim->saving_throw	= 0;
		victim->pcdata->mod_str	= 0;
		victim->pcdata->mod_int	= 0;
		victim->pcdata->mod_wis	= 0;
		victim->pcdata->mod_dex	= 0;
		victim->pcdata->mod_con	= 0;
		save_char_obj( victim );
		send_to_char( "Player Cleared.\n\r", ch );
		send_to_char( "{YYour stats have been cleared.  Please rewear your equipment.{x\n\r", victim );
		return ;
	}
	else if ( !strcmp( arg, "vamp" ) )
	{

		if ( arg1[ 0 ] == '\0' || is_number( arg1 ) )
		{
			send_to_char( "Clear who's clan?\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 NPC's.\n\r", ch );
			return ;
		}


		if ( IS_CLASS( victim, CLASS_VAMPIRE ) )
			do_mortalvamp( victim, "" );
		victim->lord = g_string_assign( victim->lord, "" );
		victim->clan = 0;
		victim->pcdata->stats[ UNI_GEN ] = 0;
		victim->pcdata->stats[ UNI_AFF ] = 0;
		victim->pcdata->stats[ UNI_CURRENT ] = -1;
		for ( count = 0 ; count < MAX_DISC ; count++ )
		{
			victim->pcdata->discipline[ count ] = 0;
			victim->pcdata->inherited[ count ] = 0;
		}


		REMOVE_BIT( victim->special, SPC_SIRE );
		REMOVE_BIT( victim->special, SPC_PRINCE );
		REMOVE_BIT( victim->special, SPC_ANARCH );
		victim->pcdata->stats[ UNI_RAGE ] = 0;
		victim->pcdata->rank = AGE_CHILDE;

		send_to_char( "Ok.\n\r", ch );
		return ;
	}
	else
	{
		send_to_char( "Clear Commands: timer,tell, card, stat, marriage, or vamp\n\r", ch );
		return ;

	}
	return ;
}
void do_mud_config( CHAR_DATA *ch, char *argument )
{
	char arg[ MAX_INPUT_LENGTH ];

	if ( IS_NPC( ch ) )
		return ;

	one_argument( argument, arg );

	if ( arg[ 0 ] == '\0' )
	{
		send_to_char( "[  Keyword  ] Option\n\r", ch );

		send_to_char( IS_SET( mudsetting->mud_setting, MS_CHAOS_NIGHT )
		              ? "{W[{R+CHAOSNIGHT{W]{x Chaos Night is On.\n\r"
		              : "{W[{B-CHAOSNIGHT{W]{x Chaos Night is Off.\n\r"
		              , ch );

		send_to_char( IS_SET( mudsetting->mud_setting, MS_LIVING_DEAD )
		              ? "{W[{R+LIVINGDEAD{W]{x Night of the Living Dead is On!.\n\r"
		              : "{W[{B-LIVINGDEAD{W]{x Night of the Living Dead is Off.\n\r"
		              , ch );

		send_to_char( IS_SET( mudsetting->mud_setting, MS_DEBUG )
		              ? "{W[{R+DEBUG     {W]{x Debugger is On.\n\r"
		              : "{W[{B-DEBUG     {W]{x Debugger is Off.\n\r"
		              , ch );

		send_to_char( IS_SET( mudsetting->mud_setting, MS_DOUBLE_HP )
		              ? "{W[{R+DOUBLE HP {W]{x Double Hp is On.\n\r"
		              : "{W[{B-DOUBLE HP {W]{x Double Hp is Off.\n\r"
		              , ch );

		send_to_char( IS_SET( mudsetting->mud_setting, MS_DOUBLE_MANA )
		              ? "{W[{R+DOUBLEMANA{W]{x Double Mana is On.\n\r"
		              : "{W[{B-DOUBLEMANA{W]{x Double Mana is Off.\n\r"
		              , ch );

		send_to_char( IS_SET( mudsetting->mud_setting, MS_CASINO )
		              ? "{W[{R+CASINO{W    ]{x The Casino is Open.\n\r"
		              : "{W[{B-CASINO{W    ]{x The Casino Is Closed.\n\r"
		              , ch );
	}
	else
	{
		bool fSet;
		int bit;

		if ( arg[ 0 ] == '+' )
			fSet = TRUE;
		else if ( arg[ 0 ] == '-' )
			fSet = FALSE;
		else
		{
			send_to_char( "mudconfig -option or +option?\n\r", ch );
			return ;
		}

		if ( !str_cmp( arg + 1, "chaosnight" ) )
			bit = MS_CHAOS_NIGHT;
		else if ( !str_cmp( arg + 1, "debug" ) )
			bit = MS_DEBUG;
		else if ( !str_cmp( arg + 1, "hp" ) )
			bit = MS_DOUBLE_HP;
		else if ( !str_cmp( arg + 1, "mana" ) )
			bit = MS_DOUBLE_MANA;
		else if ( !str_cmp( arg + 1, "livingdead" ) )
			bit = MS_LIVING_DEAD;
		else if ( !str_cmp( arg + 1, "casino" ) )
			bit = MS_CASINO;
		else
		{
			send_to_char( "mudconfig which option?\n\r", ch );
			return ;
		}

		if ( fSet )
			SET_BIT ( mudsetting->mud_setting, bit );
		else
			REMOVE_BIT ( mudsetting->mud_setting, bit );

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

	return ;
}

void do_bad_name ( CHAR_DATA *ch, char *argument )
{
	char arg1[ MAX_STRING_LENGTH ];
	CHAR_DATA *victim;
	FILE *fp;

	argument = one_argument( argument, arg1 );

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: baname (player name)\n\r", ch );
		return ;
	}

	if ( ( victim = get_char_world( ch, arg1 ) ) != NULL )
		send_to_char( "Your name is unacceptable! Please change it!\n\r", victim );

	fclose( fpReserve );
	if ( ( fp = fopen( BAD_NAME_FILE, "a" ) ) != NULL )
	{
		fprintf( fp, "%s\n", arg1 ) ;
		fclose( fp );
	}
	fpReserve = fopen( NULL_FILE, "r" );

	send_to_char( "Player name banned.\n\r", ch );
	return ;

}

void do_list_oowners( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	char arg1[ MAX_STRING_LENGTH ];

	OBJ_DATA *obj;
	OBJ_DATA *in_obj;
	bool found;
	int count = 0;
	GSList *tmp = object_list;

	argument = one_argument( argument, arg1 );

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "You must supply a name with that!.\n\r", ch );
		return ;
	}
	found = FALSE;
	while ( tmp != NULL )
	{
		obj = ( OBJ_DATA* ) tmp->data;
		if ( !is_name( arg1, obj->OOwner->str ) )
		{
			tmp = g_slist_next( tmp );
			continue;
		}

		found = TRUE;

		for ( in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj )
			;

		if ( in_obj->carried_by != NULL )
		{
			sprintf( buf, "%s carried by %s.\n\r",
			         obj->short_descr->str, PERS( in_obj->carried_by, ch ) );
		}
		else
		{
			sprintf( buf, "%s in %s.\n\r",
			         obj->short_descr->str, in_obj->in_room == NULL
			         ? "somewhere" : in_obj->in_room->name );
		}

		buf[ 0 ] = UPPER( buf[ 0 ] );
		send_to_char( buf, ch );

		if ( count > 50 )
			break;
		else
			count++;

		tmp = g_slist_next( tmp );

	}

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

	return ;
}

void do_mxpecho( CHAR_DATA *ch, char *argument )
{
	DESCRIPTOR_DATA * d;
	char buf[ MAX_STRING_LENGTH ];
	GString *mxpout;
	GSList	*desc_list;

	if ( ch != NULL )
	{
		sprintf( buf, "%s: MXPEcho %s", ch->name->str, argument );
		if ( ch->level < NO_WATCH )
			do_watching( ch, buf );
	}

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

	for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next( desc_list ) )
	{
		d = ( DESCRIPTOR_DATA* ) desc_list->data;
		if ( d->connected == CON_PLAYING && IS_SET( d->character->deaf, CHANNEL_MXP ) )
		{
			mxpout = g_string_new( "" );
			mxpconv( mxpout, argument, d->character );
			send_to_char( mxpout->str, d->character );
			send_to_char( "\n\r", d->character );
			g_string_free( mxpout, TRUE );
		}
	}

	return ;
}

void do_safe_room ( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * safeimm;

	if ( IS_NPC( ch ) )
		safeimm = ch->desc->original;
	else
		safeimm = ch;

	if ( !IS_IMMORTAL( safeimm ) )
	{
		send_to_char( "huh?", ch );
		return ;
	}

	if ( IS_SET( safeimm->pcdata->comm, COMM_IMM_SAFE ) )
	{
		REMOVE_BIT( safeimm->pcdata->comm, COMM_IMM_SAFE );
		send_to_char( "You no longer have a safty net around you.\n\r", safeimm );
		return ;
	}
	else
	{
		SET_BIT( safeimm->pcdata->comm, COMM_IMM_SAFE );
		send_to_char( "You shield those around you from combat.\n\r", safeimm );
		return ;
	}
	return ;
}

void do_checkld( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * victim;
	char buf[ MSL ];

	send_to_char( "The Link Dead:\n\r", ch );
	for ( victim = char_list; victim != NULL; victim = victim->next )
	{
		if ( !IS_NPC( victim ) && victim->desc == NULL )
		{
			sprintf( buf, "%s\n\r", victim->name->str );
			send_to_char( buf, ch );
		}
	}
}

void do_makepet( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * pet;
	char arg[ MSL ];
	char buf[ MSL ];

	one_argument( argument, arg );
	if ( arg[ 0 ] == '0' )
	{
		send_to_char( "Syntax: makepet (victim) <----works on NPC's Only\n\r", ch );
		return ;
	}

	if ( ( pet = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They are not here.\n\r", ch );
		return ;
	}

	if ( !IS_NPC( pet ) )
	{
		send_to_char( "Umm NPC's only...\n\r", ch );
		return ;
	}

	ch->pet = pet;
	pet->pet_master = ch;

	if ( pet->master )
		stop_follower( pet );

	add_follower( pet, ch );
	SET_BIT( pet->mob_con, MOBCON_PET );

	sprintf( buf, "You have made %s your pet.\n\r", pet->name->str );
	do_say( pet, "Please take care of me please" );
	return ;
}

void do_dissolve( CHAR_DATA *ch, char *argument )
{
	char arg[ MSL ];
	CHAR_DATA *victim;

	one_argument( argument, arg );

	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They are not there.", ch );
		return ;
	}

	if ( !IS_NPC( victim ) || ( IS_NPC( victim ) && !IS_PET( victim ) ) )
	{
		send_to_char( "They are not your PET!\n\r", ch );
		return ;
	}

	if ( victim != ch->pet || victim->pet_master != ch )
	{
		send_to_char( "They are not your PET!\n\r", ch );
		return ;
	}

	if ( ch->pet == NULL )
	{
		send_to_char( "You don't have a pet!\n\r", ch );
		return ;
	}

	send_to_char( "Your pet dissolved in to nothing!\n\r", ch );
	extract_char( victim, FALSE );
	ch->pet = NULL;
	return ;
}

void do_imm_stake( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * victim;
	int aPrimal = 0, iCount = 0, aDiscNum = 0, aCount = 0;

	if ( ( victim = get_char_room( ch, argument ) ) == NULL )
	{
		send_to_char( "They are not here my friend.\n\r", ch );
		return ;
	}

	if ( !IS_AVATAR( victim ) )
	{
		send_to_char( "They are not an avatar.\n\r", ch );
		return ;
	}

	switch ( victim->creature )
	{
			case CLASS_MAGE:
			for ( iCount = 0 ; iCount <= 8 ; iCount++ )
			{
				if ( ( aDiscNum = victim->pcdata->discipline[ iCount ] ) > 0 )
				{
					for ( aCount = 0; aCount <= aDiscNum; aCount++ )
					{
						aPrimal += ( ( aCount * 50 ) + 50 );
					}
					victim->pcdata->discipline[ iCount ] = 0;
				}
			}
			for ( iCount = 0; iCount <= victim->arete; iCount++ )
			{
				aPrimal += ( iCount * 50 ) + 50;
			}
			break;
			case CLASS_SWWF:
			//don't forget gnosis
			break;
			case CLASS_VAMPIRE:
			for ( iCount = 0 ; iCount <= MAX_DISC ; iCount++ )
			{
				if ( ( aDiscNum = victim->pcdata->disc[ iCount ] ) > 0 )
				{
					for ( aCount = 0; aCount <= aDiscNum; aCount++ )
					{
						if ( IS_VAMPPASS( victim, iCount ) )
							aPrimal += ( COST_DIS * aCount ) ;
						else
							aPrimal += ( COST_DIS * aCount ) + COST_DIS;
					}
					victim->pcdata->disc[ iCount ] = 0;
				}
			}

			break;
			case CLASS_WEREWOLF:

			aDiscNum = victim->pcdata->powers[ WPOWER_BEAR ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}

			aDiscNum = victim->pcdata->powers[ WPOWER_LYNX ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}

			aDiscNum = victim->pcdata->powers[ WPOWER_BOAR ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_OWL ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_SPIDER ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_WOLF ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_HAWK ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_MANTIS ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += aCount * COST_TOTEM;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_SHARK ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += ( aCount * COST_TOTEM ) + 50;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_SPHINX ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += ( aCount * COST_TOTEM ) + 50;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_RAT ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += ( aCount * COST_TOTEM ) + 50;
			}


			aDiscNum = victim->pcdata->powers[ WPOWER_CHAMELEON ];

			for ( aCount = 0; aCount <= aDiscNum; aCount++ )
			{
				aPrimal += ( aCount * COST_TOTEM ) + 50;
			}

			victim->pcdata->powers[ WPOWER_BEAR ] = 0;
			victim->pcdata->powers[ WPOWER_LYNX ] = 0;
			victim->pcdata->powers[ WPOWER_BOAR ] = 0;
			victim->pcdata->powers[ WPOWER_OWL ] = 0;
			victim->pcdata->powers[ WPOWER_SPIDER ] = 0;
			victim->pcdata->powers[ WPOWER_WOLF ] = 0;
			victim->pcdata->powers[ WPOWER_HAWK ] = 0;
			victim->pcdata->powers[ WPOWER_MANTIS ] = 0;
			victim->pcdata->powers[ WPOWER_SHARK ] = 0;
			victim->pcdata->powers[ WPOWER_SPHINX ] = 0;
			victim->pcdata->powers[ WPOWER_RAT ] = 0;
			victim->pcdata->powers[ WPOWER_CHAMELEON ] = 0;
			for ( iCount = 0; iCount <= victim->pcdata->powers[ WPOWER_SILVER ]; iCount++ )
				victim->exp += iCount * 2500;
			break;

			default:
			send_to_char( "Umm they are not classed...\n\r", ch );
			return ;
			break;
	}

	victim->primal_hold += aPrimal;
	victim->creature = 0;
	act( "$n creates a stake from nothing and pluges it deep with in you!", ch, NULL, victim, TO_VICT );
	act( "You create a stake from nothing and plunge it deep with in $N!", ch, NULL, victim, TO_CHAR );
	act( "$n creates a stake from nothing and plunges it deep with in $N!", ch, NULL, victim, TO_ROOM );
	return ;
}
/*
    This is for aslan as I loved as on abyss
    and he wishes I bring it to lurf.. 
    so here it is... Spiral's Version of AXE
*/

void aslan_axe( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA * victim;
	char arg[ MSL ], arg2[ MSL ];

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

	if ( arg[ 0 ] == '\0' || arg2[ 0 ] == '\0' )
	{
		send_to_char( "Syntax:\n\raaxe (victim) (rpstatus amount)\n\r", ch );
		return ;
	}
	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		send_to_char( "Sorry there not logged in.\n\r", ch );
		return ;
	}

	if ( IS_NPC( victim ) )
	{
		send_to_char( "Sorry this only works on players.\n\r", ch );
		return ;
	}
	if ( !is_number( arg2 ) )
	{
		send_to_char( "Amount needs to be in number format.\n\r", ch );
		return ;
	}
	// OK now comes the fun part.. ASLAN AXES
	act( "Magical axes start falling above your head from the sky!", ch, NULL, victim, TO_VICT );
	act( "Magical axes start falling from the sky and fall on $N's head!", victim, NULL, victim, TO_ROOM );
	act( "Magical axes start falling from the sky and fall on $N's head!", ch, NULL, victim, TO_CHAR );

}

void do_cset( CHAR_DATA *ch, char* argument )
{
	char string[ MSL ];
	char value[ MSL ];
	char victim_arg[ MSL ];
	CHAR_DATA *victim;
	int x, int_value;

	argument = one_argument( argument, victim_arg );
	argument = one_argument( argument, string );
	argument = one_argument( argument, value );

	if ( value[ 0 ] == '\0' )
	{
		send_to_char( "No value set.\n\r", ch );
		send_to_char( "Syntax: cset (victim) (string) (value)\n\r", ch );
		return ;
	}

	if ( string[ 0 ] == '\0' )
	{
		// TODO need to set up the list of syntax here for what we can do with cset...
		send_to_char( "No string set.\n\r", ch );
		send_to_char( "Syntax: cset (victim) (string) (value)\n\r", ch );
		send_to_char( "Strings: (Disc/Sphere/Gift)\r\n", ch );
		return ;
	}

	if ( ( victim = get_char_world( ch, victim_arg ) ) == NULL )
	{
		send_to_char( "No one is logged on with that name.\n\r", ch );
		return ;
	}

	if ( IS_NPC( victim ) )
	{
		send_to_char( "Not possible\n\r", ch );
		return ;
	}

	for ( x = 0; cset_powers_list[ x ].power_name != NULL; x++ )
	{
		if ( !strcmp( cset_powers_list[ x ].power_name, string ) )
		{
			int_value = atoi( value );
			if ( int_value < 0 || int_value > 9 )
			{
				send_to_char( "invalid value.\n\r", ch );
				return ;
			}
			if ( IS_VAMPIRE( victim ) && cset_powers_list[ x ].power_class == CLS_VAMP )
			{
				victim->pcdata->disc[ cset_powers_list[ x ].power_value ] = int_value;
				return ;
			}
			if ( IS_SWWF( victim ) && cset_powers_list[ x ].power_class == CLS_TRIBE )
			{
				victim->pcdata->tribes[ cset_powers_list[ x ].power_value ] = int_value;
				return ;
			}
			if ( IS_SWWF( victim ) && cset_powers_list[ x ].power_class == CLS_AUSPICE )
			{
				victim->pcdata->auspice[ cset_powers_list[ x ].power_value ] = int_value;
				return ;
			}
			if ( IS_SWWF( victim ) && cset_powers_list[ x ].power_class == CLS_BREED )
			{
				victim->pcdata->breed[ cset_powers_list[ x ].power_value ] = int_value;
				return ;
			}
			if ( IS_MAGE( victim ) && cset_powers_list[ x ].power_class == CLS_MAGE )
			{
				victim->pcdata->discipline[ cset_powers_list[ x ].power_value ] = int_value;
				return ;
			}
		}
		return ;
	}
	send_to_char( "Invalid String\n\r", ch );
	return ;
}

void do_planewalk( CHAR_DATA *ch, char *argument )
{
	char arg1[ MSL ];
	char arg2[ MSL ];
	char timer[ MSL ];
	char buf[ MSL ];
	CHAR_DATA *victim;
	int plane;
	int plane_to = 0;

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

	if ( arg1[ 0 ] == '\0' )
	{
		send_to_char( "Syntax: planewalk (plane) (victim) (timer)\n\r", ch );
		send_to_char( "Victim and Timer options are optional.\n\r", ch );
		return ;
	}

	for ( plane = 0; plane_table[ plane ].name[ 0 ] != '\0'; plane++ )
	{
		if ( arg1[ 0 ] == plane_table[ plane ].name[ 0 ]
		        && !str_prefix( arg1, plane_table[ plane ].name ) )
		{
			plane_to = plane;
			break;
		}
	}

	if ( plane_to == 0 )
	{
		send_to_char( "That plane don't exsist.\n\r", ch );
		return ;
	}

	if ( arg2[ 0 ] == '\0' )
	{
		ch->plane = plane_to;
		shift_obj_plane( ch );
		sprintf( buf, "You suddenly shift in to the %s\n\r", plane_table[ plane ].name );
		shift_obj_plane( ch );
		return ;
	}

	if ( ( victim = get_char_world( ch, arg2 ) ) == NULL )
	{
		send_to_char( "Send who?\n\r", ch );
		return ;
	}
	victim->plane = plane_to;
	shift_obj_plane( victim );

	if ( !IS_NPC( victim ) && atoi( timer ) > 0 )
		victim->pcdata->obeah += atoi( timer );

	sprintf( buf, "You suddenly shift in to the %s\n\r", plane_table[ plane ].name );
	send_to_char( buf, victim );
	sprintf( buf, "$N's form suddenly shimmers as they are forced in the %s\n\r", plane_table[ plane ].name );
	act( buf, ch, NULL, victim, TO_CHAR );
	return ;
}

/*
 * Left in to demo the use of strings in GLIB...
 *
void do_gstring_test( CHAR_DATA *ch, char *argument)
	{
	GString *testing;
 
	testing = g_string_new("testing");
	ch->pcdata->anon_desc2 = testing;
	
	send_to_char(ch->pcdata->anon_desc2->str,ch);
	g_string_free(testing,TRUE);
	return;
	}
*/
void do_areas( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];
	AREA_DATA *pArea1;
	AREA_DATA *pArea2;
	int iArea;
	int iAreaHalf;

	iAreaHalf = ( top_area + 1 ) / 2;
	pArea1 = area_first;
	pArea2 = area_first;
	for ( iArea = 0; iArea < iAreaHalf; iArea++ )
		pArea2 = pArea2->next;

	for ( iArea = 0; iArea < iAreaHalf; iArea++ )
	{
		sprintf( buf, "%-39s%-39s\n\r",
		         pArea1->name, ( pArea2 != NULL ) ? pArea2->name : "" );
		send_to_char( buf, ch );
		pArea1 = pArea1->next;
		if ( pArea2 != NULL )
			pArea2 = pArea2->next;
	}

	return ;
}



void do_memory( CHAR_DATA *ch, char *argument )
{
	char buf[ MAX_STRING_LENGTH ];

	sprintf( buf, "Affects %5d\n\r", top_affect );
	send_to_char( buf, ch );
	sprintf( buf, "Areas   %5d\n\r", top_area );
	send_to_char( buf, ch );
	sprintf( buf, "RmTxt   %5d\n\r", top_rt );
	send_to_char( buf, ch );
	sprintf( buf, "ExDes   %5d\n\r", top_ed );
	send_to_char( buf, ch );
	sprintf( buf, "Exits   %5d\n\r", top_exit );
	send_to_char( buf, ch );
	sprintf( buf, "Helps   %5d\n\r", top_help );
	send_to_char( buf, ch );
	sprintf( buf, "Mobs    %5d Mobs Created: %5ld Tot_Mobs: %5ld ActMob: %5d\n\r", top_mob_index, mudsetting->mobiles_created, mudsetting->total_mobiles_created, get_mobile_count( argument ) );
	send_to_char( buf, ch );
	sprintf( buf, "Objs    %5d Objs Created: %5ld Objs Recycled: %5ld Tot_Objs: %5ld ActObj: %5d\n\r", top_obj_index, mudsetting->objects_created, mudsetting->objects_recycled, mudsetting->total_objects_created, get_object_count( argument ) );
	send_to_char( buf, ch );
	sprintf( buf, "Descr   %5ld Desc Recycled: %5ld Tot_Desc: %5ld\n\r", mudsetting->current_players_connected, mudsetting->players_recycled, mudsetting->total_players_connected );
	send_to_char( buf, ch );
	sprintf( buf, "Resets  %5d\n\r", top_reset );
	send_to_char( buf, ch );
	sprintf( buf, "Rooms   %5d\n\r", top_room );
	send_to_char( buf, ch );
	sprintf( buf, "Shops   %5d\n\r", top_shop );
	send_to_char( buf, ch );

	g_mem_chunk_info();
	g_mem_profile();
	return ;
}

void do_area_report( CHAR_DATA *ch, char *argument )
{
	MOB_INDEX_DATA *pMobIndex;
	std::ofstream outfile( "report.txt" );
	int maxhit = 0;
	int tempvalue = 0;
	int armor = 0;
	int vnum;

	for ( vnum = 0; vnum < mudsetting->high_mobile_vnum; vnum++ )
	{
		if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
		{
			armor	= ( pMobIndex->ac == 0 ) ?
			             interpolate( pMobIndex->level, 100, -100 ) :
			             pMobIndex->ac;

			tempvalue	= pMobIndex->level * 8 + number_range(
			                pMobIndex->level * pMobIndex->level / 4,
			                pMobIndex->level * pMobIndex->level );


			if ( pMobIndex->hitnodice == 0
			        && pMobIndex->hitsizedice == 0
			        && pMobIndex->hitplus == 0 )
			{
				maxhit = tempvalue;
			}
			else
			{
				maxhit = dice( pMobIndex->hitnodice, pMobIndex->hitsizedice )
				               + pMobIndex->hitplus;
			}

			outfile << pMobIndex->vnum << "," << pMobIndex->level << "," << pMobIndex->hitroll << ",";
			outfile << armor << "," << maxhit << std::endl;
		}
	}
	send_to_char("Done!",ch);

}