/
Debug/
area/
data/
gods/
player/
player/skill/
/****************************************************************************
*  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.													*
***************************************************************************/

/****************************************************************************
*	ROM 2.4 is copyright 1993-1998 Russ Taylor								*
*	ROM has been brought to you by the ROM consortium						*
*	    Russ Taylor (rtaylor@hypercube.org)									*
*	    Gabrielle Taylor (gtaylor@hypercube.org)							*
*	    Brian Moore (zump@rom.org)											*
*	By using this code, you have agreed to follow the terms of the			*
*	ROM license, in the file Rom24/doc/rom.license							*
***************************************************************************/
/****************************************************************************
*	Demon's Dance MUD, and source code are property of Eric Goetschalckx	*
*	By compiling this code, you agree to include the following in your		*
*	login screen:															*
*	    Derivative of Demon's Dance, by Enzo/Stan							*
***************************************************************************/

#if defined(macintosh)
#include <types.h>
#include <time.h>
#elif defined(WIN32)
#include <sys/types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "interp.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"
#include "magic.h"
#include "arena.h"
#include "olc.h"
#include "skill_tree.h"

extern  AFFECT_DATA        *affect_free;
bool	is_timed_reboot;

/*
* Local functions.
*/
ROOM_INDEX_DATA *	find_location	args( ( CHAR_DATA *ch, char *arg ) );
bool	remove_obj	args( (CHAR_DATA *ch, int iWear, bool fReplace ) );

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

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

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

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

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

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

		for (flag = 0; wiznet_table[flag].name != NULL; flag++)
			if (IS_SET(ch->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->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->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->wiznet,wiznet_table[flag].flag);
		return;
	}

}

void wiznet(char *string, CHAR_DATA *ch, OBJ_DATA *obj,
			long flag, long flag_skip, int min_level) 
{
	DESCRIPTOR_DATA *d;

	for ( d = descriptor_list; d != NULL; d = d->next )
	{
		if (d->connected == CON_PLAYING
			&&  IS_IMMORTAL(d->character) 
			&&  IS_SET(d->character->wiznet,WIZ_ON) 
			&&  (!flag || IS_SET(d->character->wiznet,flag))
			&&  (!flag_skip || !IS_SET(d->character->wiznet,flag_skip))
			&&  d->character != ch)
		{
			if (IS_SET(d->character->wiznet,WIZ_PREFIX))
				send_to_char("{M-->{x ",d->character);
			act_new(string,d->character,obj,ch,TO_CHAR,POS_DEAD);
		}
	}

	return;
}


/* equips a character */
void do_outfit ( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA *obj;
	int i,sn,vnum;

	if (ch->level > 5 || IS_NPC(ch))
	{
		send_to_char("Find it yourself!\n\r",ch);
		return;
	}

	if ( ( obj = get_eq_char( ch, WEAR_LIGHT ) ) == NULL )
	{
		obj = create_object( get_obj_index(OBJ_VNUM_SCHOOL_BANNER), 0 );
		obj->cost = 0;
		obj_to_char( obj, ch );
		equip_char( ch, obj, WEAR_LIGHT );
	}

	if ( ( obj = get_eq_char( ch, WEAR_BODY ) ) == NULL )
	{
		obj = create_object( get_obj_index(OBJ_VNUM_SCHOOL_VEST), 0 );
		obj->cost = 0;
		obj_to_char( obj, ch );
		equip_char( ch, obj, WEAR_BODY );
	}

	/* do the weapon thing */
	if ((obj = get_eq_char(ch,WEAR_WIELD)) == NULL)
	{
		sn = 0; 
		vnum = OBJ_VNUM_SCHOOL_SWORD; /* just in case! */

		for (i = 0; weapon_table[i].name != NULL; i++)
		{
			if (ch->pcdata->learned[sn] < 
				ch->pcdata->learned[*weapon_table[i].gsn])
			{
				sn = *weapon_table[i].gsn;
				vnum = weapon_table[i].vnum;
			}
		}

		obj = create_object(get_obj_index(vnum),0);
		obj_to_char(obj,ch);
		equip_char(ch,obj,WEAR_WIELD);
	}

	if (((obj = get_eq_char(ch,WEAR_WIELD)) == NULL 
		||   !IS_WEAPON_STAT(obj,WEAPON_TWO_HANDS)) 
		&&  (obj = get_eq_char( ch, WEAR_SHIELD ) ) == NULL )
	{
		obj = create_object( get_obj_index(OBJ_VNUM_SCHOOL_SHIELD), 0 );
		obj->cost = 0;
		obj_to_char( obj, ch );
		equip_char( ch, obj, WEAR_SHIELD );
	}

	send_to_char("You have been equipped by Admin.\n\r",ch);
}


/* RT nochannels command, for those spammers */
void do_nochannels( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH];
	CHAR_DATA *victim;

	one_argument( argument, arg );

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

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

	if ( IS_SET(victim->comm, COMM_NOCHANNELS) )
	{
		REMOVE_BIT(victim->comm, COMM_NOCHANNELS);
		send_to_char( "The gods have restored your channel priviliges.\n\r", 
			victim );
		send_to_char( "NOCHANNELS removed.\n\r", ch );
		sprintf(buf,"$N restores channels to %s",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}
	else
	{
		SET_BIT(victim->comm, COMM_NOCHANNELS);
		send_to_char( "The gods have revoked your channel priviliges.\n\r", 
			victim );
		send_to_char( "NOCHANNELS set.\n\r", ch );
		sprintf(buf,"$N revokes %s's channels.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}

	return;
}


void do_smote(CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *vch;
	char *letter,*name;
	char last[MAX_INPUT_LENGTH], temp[MAX_STRING_LENGTH];
	int matches = 0;

	if ( !IS_NPC(ch) && IS_SET(ch->comm, COMM_NOEMOTE) )
	{
		send_to_char( "You can't show your emotions.\n\r", ch );
		return;
	}

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

	if (strstr(argument,ch->name) == NULL)
	{
		send_to_char("You must include your name in an smote.\n\r",ch);
		return;
	}

	send_to_char(argument,ch);
	send_to_char("\n\r",ch);

	for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
	{
		if (vch->desc == NULL || vch == ch)
			continue;

		if ((letter = strstr(argument,vch->name)) == NULL)
		{
			send_to_char(argument,vch);
			send_to_char("\n\r",vch);
			continue;
		}

		strcpy(temp,argument);
		temp[strlen(argument) - strlen(letter)] = '\0';
		last[0] = '\0';
		name = vch->name;

		for (; *letter != '\0'; letter++)
		{
			if (*letter == '\'' && matches == strlen(vch->name))
			{
				strcat(temp,"r");
				continue;
			}

			if (*letter == 's' && matches == strlen(vch->name))
			{
				matches = 0;
				continue;
			}

			if (matches == strlen(vch->name))
			{
				matches = 0;
			}

			if (*letter == *name)
			{
				matches++;
				name++;
				if (matches == strlen(vch->name))
				{
					strcat(temp,"you");
					last[0] = '\0';
					name = vch->name;
					continue;
				}
				strncat(last,letter,1);
				continue;
			}

			matches = 0;
			strcat(temp,last);
			strncat(temp,letter,1);
			last[0] = '\0';
			name = vch->name;
		}

		send_to_char(temp,vch);
		send_to_char("\n\r",vch);
	}

	return;
}

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

	if ( !IS_NPC(ch) )
	{
		smash_tilde( argument );

		if (argument[0] == '\0')
		{
			sprintf(buf,"Your poofin is %s\n\r",ch->pcdata->bamfin);
			send_to_char(buf,ch);
			return;
		}


		free_string( ch->pcdata->bamfin );
		ch->pcdata->bamfin = str_dup( argument );

		sprintf(buf,"Your poofin is now %s\n\r",ch->pcdata->bamfin);
		send_to_char(buf,ch);
	}
	return;
}

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

	if ( !IS_NPC(ch) )
	{
		smash_tilde( argument );

		if (argument[0] == '\0')
		{
			sprintf(buf,"Your poofout is %s\n\r",ch->pcdata->bamfout);
			send_to_char(buf,ch);
			return;
		}


		free_string( ch->pcdata->bamfout );
		ch->pcdata->bamfout = str_dup( argument );

		sprintf(buf,"Your poofout is now %s\n\r",ch->pcdata->bamfout);
		send_to_char(buf,ch);
	}
	return;
}



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

	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 );
	sprintf(buf,"$N denies access to %s",victim->name);
	wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	send_to_char( "OK.\n\r", ch );
	save_char_obj(victim);
	stop_fighting(victim,TRUE);
	do_function(victim, &do_quit, "" );

	return;
}



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

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

	if (is_number(arg))
	{
		int desc;

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

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

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

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

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



void do_pardon( 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' || arg2[0] == '\0' )
	{
		send_to_char( "Syntax: pardon <character> <killer|thief>.\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 ( !str_cmp( arg2, "killer" ) )
	{
		if ( IS_SET(victim->act, PLR_KILLER) )
		{
			REMOVE_BIT( victim->act, PLR_KILLER );
			send_to_char( "Killer flag removed.\n\r", ch );
			send_to_char( "You are no longer a KILLER.\n\r", victim );
		}
		if ( IS_SET(victim->act, PLR_PROKILLER) )
		{
			REMOVE_BIT( victim->act, PLR_PROKILLER );
			send_to_char( "Killer flag removed.\n\r", ch );
			send_to_char( "You are no longer a PROKILLER.\n\r", victim );
		}
		return;
	}

	if ( !str_cmp( arg2, "thief" ) )
	{
		if ( IS_SET(victim->act, PLR_THIEF) )
		{
			REMOVE_BIT( victim->act, PLR_THIEF );
			send_to_char( "Thief flag removed.\n\r", ch );
			send_to_char( "You are no longer a THIEF.\n\r", victim );
		}
		return;
	}

	send_to_char( "Syntax: pardon <character> <killer|thief>.\n\r", ch );
	return;
}



void do_echo( CHAR_DATA *ch, char *argument )
{
	DESCRIPTOR_DATA *d;

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

	for ( d = descriptor_list; d; d = d->next )
	{
		if ( d->connected == CON_PLAYING )
		{

			if (ch != NULL && get_trust(d->character) >= get_trust(ch))
				send_to_char( "global> ",d->character);
			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;

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

		return;
	}

	for ( d = descriptor_list; d; d = d->next )
	{
		if ( d->connected == CON_PLAYING
			&&   d->character->in_room == ch->in_room )
		{
			if (get_trust(d->character) >= get_trust(ch))
				send_to_char( "local> ",d->character);
			send_to_char( argument, d->character );
			send_to_char( "\n\r",   d->character );
		}
	}

	return;
}

void do_zecho(CHAR_DATA *ch, char *argument)
{
	DESCRIPTOR_DATA *d;

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

	for (d = descriptor_list; d; d = d->next)
	{
		if (d->connected == CON_PLAYING
			&&  d->character->in_room != NULL && ch->in_room != NULL
			&&  d->character->in_room->area == ch->in_room->area)
		{
			if (get_trust(d->character) >= get_trust(ch))
				send_to_char("zone> ",d->character);
			send_to_char(argument,d->character);
			send_to_char("\n\r",d->character);
		}
	}
}

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

	argument = one_argument(argument, arg);

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

	if  ( (victim = get_char_world(ch, arg) ) == NULL )
	{
		send_to_char("Target not found.\n\r",ch);
		return;
	}

	if (get_trust(victim) >= get_trust(ch) && get_trust(ch) != MAX_LEVEL)
		send_to_char( "personal> ",victim);

	send_to_char(argument,victim);
	send_to_char("\n\r",victim);
	send_to_char( "personal> ",ch);
	send_to_char(argument,ch);
	send_to_char("\n\r",ch);
}


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

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

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

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

	return NULL;
}



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

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

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

	if ( !str_cmp( arg1, "all" ) )
	{
		for ( d = descriptor_list; d != NULL; d = d->next )
		{
			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, arg2 );
				do_function(ch, &do_transfer, 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 ( !is_room_owner(ch,location) && room_is_private( location ) 
			&&  get_trust(ch) < MAX_LEVEL && (ch->level < MAX_LEVEL))
		{
			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_function(victim, &do_look, "auto" );
	send_to_char( "Ok.\n\r", ch );
}



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

	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 (!is_room_owner(ch,location) && room_is_private( location ) 
		&&  get_trust(ch) < MAX_LEVEL && (ch->level < MAX_LEVEL))
	{
		send_to_char( "That room is private right now.\n\r", ch );
		return;
	}

	original = ch->in_room;
	on = ch->on;
	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 );
			ch->on = on;
			break;
		}
	}

	return;
}



void do_goto( CHAR_DATA *ch, char *argument )
{
	ROOM_INDEX_DATA *location;
	CHAR_DATA *rch;
	int count = 0;

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

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

	count = 0;
	for ( rch = location->people; rch != NULL; rch = rch->next_in_room )
		count++;

	if (!is_room_owner(ch,location) && room_is_private(location) 
		&&  (count > 1 || get_trust(ch) < MAX_LEVEL) && (ch->level < MAX_LEVEL))
	{
		send_to_char( "That room is private right now.\n\r", ch );
		return;
	}

	if ( ch->fighting != NULL )
		stop_fighting( ch, TRUE );

	for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
	{
		if (get_trust(rch) >= ch->invis_level)
		{
			if (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
				act("$t",ch,ch->pcdata->bamfout,rch,TO_VICT);
			else
				act("$n leaves in a swirling mist.",ch,NULL,rch,TO_VICT);
		}
	}

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


	for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
	{
		if (get_trust(rch) >= ch->invis_level)
		{
			if (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
				act("$t",ch,ch->pcdata->bamfin,rch,TO_VICT);
			else
				act("$n appears in a swirling mist.",ch,NULL,rch,TO_VICT);
		}
	}

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

void do_violate( CHAR_DATA *ch, char *argument )
{
	ROOM_INDEX_DATA *location;
	CHAR_DATA *rch;

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

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

	if (!room_is_private( location ))
	{
		send_to_char( "That room isn't private, use goto.\n\r", ch );
		return;
	}

	if ( ch->fighting != NULL )
		stop_fighting( ch, TRUE );

	for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
	{
		if (get_trust(rch) >= ch->invis_level)
		{
			if (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
				act("$t",ch,ch->pcdata->bamfout,rch,TO_VICT);
			else
				act("$n leaves in a swirling mist.",ch,NULL,rch,TO_VICT);
		}
	}

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


	for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
	{
		if (get_trust(rch) >= ch->invis_level)
		{
			if (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
				act("$t",ch,ch->pcdata->bamfin,rch,TO_VICT);
			else
				act("$n appears in a swirling mist.",ch,NULL,rch,TO_VICT);
		}
	}

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

/* RT to replace the 3 stat commands */

void do_stat ( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	char *string;
	OBJ_DATA *obj;
	ROOM_INDEX_DATA *location;
	CHAR_DATA *victim;

	string = one_argument(argument, arg);
	if ( arg[0] == '\0')
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  stat <name>\n\r",ch);
		send_to_char("  stat obj <name>\n\r",ch);
		send_to_char("  stat mob <name>\n\r",ch);
		send_to_char("  stat room <number>\n\r",ch);
		return;
	}

	if (!str_cmp(arg,"room"))
	{
		do_function(ch, &do_rstat, string);
		return;
	}

	if (!str_cmp(arg,"obj"))
	{
		do_function(ch, &do_ostat, string);
		return;
	}

	if(!str_cmp(arg,"char")  || !str_cmp(arg,"mob"))
	{
		do_function(ch, &do_mstat, string);
		return;
	}

	/* do it the old way */

	obj = get_obj_world(ch,argument);
	if (obj != NULL)
	{
		do_function(ch, &do_ostat, argument);
		return;
	}

	victim = get_char_world(ch,argument);
	if (victim != NULL)
	{
		do_function(ch, &do_mstat, argument);
		return;
	}

	location = find_location(ch,argument);
	if (location != NULL)
	{
		do_function(ch, &do_rstat, argument);
		return;
	}

	send_to_char("Nothing by that name found anywhere.\n\r",ch);
}

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 (!is_room_owner(ch,location) && ch->in_room != location 
		&&  room_is_private( location ) && !IS_TRUSTED(ch,IMPLEMENTOR) && (ch->level < MAX_LEVEL))
	{
		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  Healing: %d  Mana: %d\n\r",
		location->vnum,
		location->sector_type,
		location->light,
		location->heal_rate,
		location->mana_rate );
	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 )
	{
		if (can_see(ch,rch))
		{
			send_to_char( " ", ch );
			one_argument( rch->name, 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, 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->u1.to_room == NULL ? -1 : pexit->u1.to_room->vnum),
				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];
	AFFECT_DATA *paf;
	OBJ_DATA *obj;

	one_argument( argument, arg );

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

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

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

	sprintf( buf, "Vnum: %d  Format: %s  Type: %s  Resets: %d\n\r",
		obj->pIndexData->vnum, obj->pIndexData->new_format ? "new" : "old",
		item_name(obj->item_type), obj->pIndexData->reset_num );
	send_to_char( buf, ch );

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

	sprintf( buf, "Wear bits: %s\n\rExtra bits: %s\n\r",
		wear_bit_name(obj->wear_flags), extra_bit_name( obj->extra_flags ) );
	send_to_char( buf, ch );

	sprintf( buf, "Number: %d/%d  Weight: %d/%d/%d (10th pounds)\n\r",
		1,           get_obj_number( obj ),
		obj->weight, get_obj_weight( obj ),get_true_weight(obj) );
	send_to_char( buf, ch );

	sprintf( buf, "Level: %d  Cost: %d  Condition: %d  Timer: %d\n\r",
		obj->level, obj->cost, obj->condition, obj->timer );
	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,
		obj->carried_by == NULL    ? "(none)" : 
	can_see(ch,obj->carried_by) ? obj->carried_by->name
		: "someone",
		obj->wear_loc );
	send_to_char( buf, ch );

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

	/* now give out vital statistics as per identify */

	switch ( obj->item_type )
	{
	case ITEM_SCROLL: 
	case ITEM_POTION:
	case ITEM_PILL:
		sprintf( buf, "Level %d spells of:", obj->value[0] );
		send_to_char( buf, ch );

		if ( obj->value[1] >= 0 && obj->value[1] < MAX_SKILL )
		{
			send_to_char( " '", ch );
			send_to_char( skill_table[obj->value[1]].name, ch );
			send_to_char( "'", ch );
		}

		if ( obj->value[2] >= 0 && obj->value[2] < MAX_SKILL )
		{
			send_to_char( " '", ch );
			send_to_char( skill_table[obj->value[2]].name, ch );
			send_to_char( "'", ch );
		}

		if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
		{
			send_to_char( " '", ch );
			send_to_char( skill_table[obj->value[3]].name, ch );
			send_to_char( "'", ch );
		}

		if (obj->value[4] >= 0 && obj->value[4] < MAX_SKILL)
		{
			send_to_char(" '",ch);
			send_to_char(skill_table[obj->value[4]].name,ch);
			send_to_char("'",ch);
		}

		send_to_char( ".\n\r", ch );
		break;

	case ITEM_WAND: 
	case ITEM_STAFF: 
		sprintf( buf, "Has %d(%d) charges of level %d",
			obj->value[1], obj->value[2], obj->value[0] );
		send_to_char( buf, ch );

		if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
		{
			send_to_char( " '", ch );
			send_to_char( skill_table[obj->value[3]].name, ch );
			send_to_char( "'", ch );
		}

		send_to_char( ".\n\r", ch );
		break;

	case ITEM_DRINK_CON:
		sprintf(buf,"It holds %s-colored %s.\n\r",
			liq_table[obj->value[2]].liq_color,
			liq_table[obj->value[2]].liq_name);
		send_to_char(buf,ch);
		break;

	case ITEM_GOLEM_PART:
		send_to_char("Golem Part type is ",ch);
		switch (obj->value[0])
		{
		case(GOLEM_HEART): 
			send_to_char("heart\n\r",ch);
			break;
		case(GOLEM_HEAD): 
			send_to_char("head\n\r",ch);
			break;	
		case(GOLEM_LEG): 
			send_to_char("leg\n\r",ch);
			break;
		case(GOLEM_ARM):
			send_to_char("arm\n\r",ch);
			break;
		default: 
			send_to_char("unknown\n\r",ch);
			break;
		}

	case ITEM_WEAPON:
		send_to_char("Weapon type is ",ch);
		switch (obj->value[0])
		{
		case(WEAPON_EXOTIC): 
			send_to_char("exotic\n\r",ch);
			break;
		case(WEAPON_SWORD): 
			send_to_char("sword\n\r",ch);
			break;	
		case(WEAPON_DAGGER): 
			send_to_char("dagger\n\r",ch);
			break;
		case(WEAPON_SPEAR):
			send_to_char("spear/staff\n\r",ch);
			break;
		case(WEAPON_MACE): 
			send_to_char("mace/club\n\r",ch);	
			break;
		case(WEAPON_AXE): 
			send_to_char("axe\n\r",ch);	
			break;
		case(WEAPON_FLAIL): 
			send_to_char("flail\n\r",ch);
			break;
		case(WEAPON_WHIP): 
			send_to_char("whip\n\r",ch);
			break;
		case(WEAPON_POLEARM): 
			send_to_char("polearm\n\r",ch);
			break;
		case(WEAPON_BOW): 
			send_to_char("bow\n\r",ch);
		default: 
			send_to_char("unknown\n\r",ch);
			break;
		}
		if (obj->pIndexData->new_format)
			sprintf(buf,"Damage is %dd%d (average %d)\n\r",
			obj->value[1],obj->value[2],
			(1 + obj->value[2]) * obj->value[1] / 2);
		else
			sprintf( buf, "Damage is %d to %d (average %d)\n\r",
			obj->value[1], obj->value[2],
			( obj->value[1] + obj->value[2] ) / 2 );
		send_to_char( buf, ch );

		sprintf(buf,"Damage noun is %s.\n\r",
			(obj->value[3] > 0 && obj->value[3] < MAX_DAMAGE_MESSAGE) ?
			attack_table[obj->value[3]].noun : "undefined");
		send_to_char(buf,ch);

		if (obj->value[4])  /* weapon flags */
		{
			sprintf(buf,"Weapons flags: %s\n\r",
				weapon_bit_name(obj->value[4]));
			send_to_char(buf,ch);
		}
		if (obj->pIndexData->weapon_spell)
		{
			sprintf(buf,"{WSpellcast: %s\n\r{x",
				skill_table[obj->pIndexData->weapon_spell].name);
			stc(buf,ch);
		}
		break;

	case ITEM_ARMOR:
		sprintf( buf, 
			"Armor class is %d pierce, %d bash, %d slash, and %d vs. magic\n\r",
			obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
		send_to_char( buf, ch );
		break;

	case ITEM_CONTAINER:
	case ITEM_GOLEM_BAG:
		sprintf(buf,"Capacity: %d#  Maximum weight: %d#  flags: %s\n\r",
			obj->value[0], obj->value[3], cont_bit_name(obj->value[1]));
		send_to_char(buf,ch);
		if (obj->value[4] != 100)
		{
			sprintf(buf,"Weight multiplier: %d%%\n\r",
				obj->value[4]);
			send_to_char(buf,ch);
		}
		break;

	case ITEM_QUIVER:
		sprintf(buf,"{WIt holds {R%d %d{Wd{R%d {Warrows.{x\n\r",
			obj->value[0], obj->value[1], obj->value[2]);
		send_to_char(buf,ch);
		break;

	case ITEM_ARROW:
		sprintf(buf,"{WThis arrow will do {R%d{Wd{R%d {Wdamage for an average of {R%d{W.{x\n\r",
			obj->value[1], obj->value[2], ((1 + obj->value[2]) * obj->value[1] / 2) );
		send_to_char(buf,ch);
		break;
	}


	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, level %d",
			affect_loc_name( paf->location ), paf->modifier,paf->level );
		send_to_char(buf,ch);
		if ( paf->duration > -1)
			sprintf(buf,", %d hours.\n\r",paf->duration);
		else
			sprintf(buf,".\n\r");
		send_to_char( buf, ch );
		if (paf->bitvector)
		{
			switch(paf->where)
			{
			case TO_AFFECTS:
				sprintf(buf,"Adds %s affect.\n",
					affect_bit_name(paf->bitvector));
				break;
			case TO_WEAPON:
				sprintf(buf,"Adds %s weapon flags.\n",
					weapon_bit_name(paf->bitvector));
				break;
			case TO_OBJECT:
				sprintf(buf,"Adds %s object flag.\n",
					extra_bit_name(paf->bitvector));
				break;
			case TO_IMMUNE:
				sprintf(buf,"Adds immunity to %s.\n",
					imm_bit_name(paf->bitvector));
				break;
			case TO_RESIST:
				sprintf(buf,"Adds resistance to %s.\n\r",
					imm_bit_name(paf->bitvector));
				break;
			case TO_VULN:
				sprintf(buf,"Adds vulnerability to %s.\n\r",
					imm_bit_name(paf->bitvector));
				break;
			default:
				sprintf(buf,"Unknown bit %d: %d\n\r",
					paf->where,paf->bitvector);
				break;
			}
			send_to_char(buf,ch);
		}
	}

	if (!obj->enchanted)
		for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next )
		{
			sprintf( buf, "Affects %s by %d, level %d.\n\r",
				affect_loc_name( paf->location ), paf->modifier,paf->level );
			send_to_char( buf, ch );
			if (paf->bitvector)
			{
				switch(paf->where)
				{
				case TO_AFFECTS:
					sprintf(buf,"Adds %s affect.\n",
						affect_bit_name(paf->bitvector));
					break;
				case TO_OBJECT:
					sprintf(buf,"Adds %s object flag.\n",
						extra_bit_name(paf->bitvector));
					break;
				case TO_IMMUNE:
					sprintf(buf,"Adds immunity to %s.\n",
						imm_bit_name(paf->bitvector));
					break;
				case TO_RESIST:
					sprintf(buf,"Adds resistance to %s.\n\r",
						imm_bit_name(paf->bitvector));
					break;
				case TO_VULN:
					sprintf(buf,"Adds vulnerability to %s.\n\r",
						imm_bit_name(paf->bitvector));
					break;
				default:
					sprintf(buf,"Unknown bit %d: %d\n\r",
						paf->where,paf->bitvector);
					break;
				}
				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( "Stat whom?\n\r", ch );
		return;
	}

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

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

	sprintf( buf, 
		"Vnum: %d  Format: %s  Race: %s  Group: %d  Sex: %s  Room: %d\n\r",
		IS_NPC(victim) ? victim->pIndexData->vnum : 0,
		IS_NPC(victim) ? victim->pIndexData->new_format ? "new" : "old" : "pc",
		race_table[victim->race].name,
		IS_NPC(victim) ? victim->group : 0, sex_table[victim->sex].name,
		victim->in_room == NULL    ?        0 : victim->in_room->vnum
		);
	send_to_char( buf, ch );

	if (is_clan(victim))
	{
		sprintf(buf, "Clan: %-25s  Rank: %s\n\r",
			player_clan(victim), player_rank(victim));
		send_to_char(buf, ch);
	}

	if (IS_NPC(victim))
	{
		sprintf (buf, "Count: {W%d{x  Deaths: {W%d{x\n\r",
			victim->pIndexData->count, victim->pIndexData->killed);
		stc(buf, ch);
	}

	sprintf( buf, 
		"Str: %d(%d)  Int: %d(%d)  Wis: %d(%d)  Dex: %d(%d)  Con: %d(%d)\n\r",
		victim->perm_stat[STAT_STR],
		get_curr_stat(victim,STAT_STR),
		victim->perm_stat[STAT_INT],
		get_curr_stat(victim,STAT_INT),
		victim->perm_stat[STAT_WIS],
		get_curr_stat(victim,STAT_WIS),
		victim->perm_stat[STAT_DEX],
		get_curr_stat(victim,STAT_DEX),
		victim->perm_stat[STAT_CON],
		get_curr_stat(victim,STAT_CON) );
	send_to_char( buf, ch );

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

	sprintf( buf,
		"Lv: %d  Class: %s  Align: %d  Gold: %ld  Silver: %ld  Exp: %d\n\r",
		victim->level,       
		IS_NPC(victim) ? "mobile" : class_table[victim->class].name,            
		victim->alignment,
		victim->gold, victim->silver, victim->exp );
	send_to_char( buf, ch );

	sprintf(buf,"Armor: pierce: %d  bash: %d  slash: %d  magic: %d\n\r",
		GET_AC(victim,AC_PIERCE), GET_AC(victim,AC_BASH),
		GET_AC(victim,AC_SLASH),  GET_AC(victim,AC_EXOTIC));
	send_to_char(buf,ch);

	sprintf( buf, 
		"Hit: %d  Dam: %d  Saves: %d  Size: %s  Position: %s  Wimpy: %d\n\r",
		GET_HITROLL(victim), GET_DAMROLL(victim), victim->saving_throw,
		size_table[victim->size].name, position_table[victim->position].name,
		victim->wimpy );
	send_to_char( buf, ch );

	if (IS_NPC(victim) && victim->pIndexData->new_format)
	{
		sprintf(buf, "Damage: %dd%d  Message:  %s\n\r",
			victim->damage[DICE_NUMBER],victim->damage[DICE_TYPE],
			attack_table[victim->dam_type].noun);
		send_to_char(buf,ch);
	}
	sprintf( buf, "Fighting: %s\n\r",
		victim->fighting ? victim->fighting->name : "(none)" );
	send_to_char( buf, ch );

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

	sprintf( buf, "Carry number: %d  Carry weight: %ld\n\r",
		victim->carry_number, get_carry_weight(victim) / 10 );
	send_to_char( buf, ch );


	if (!IS_NPC(victim))
	{
		sprintf( buf, 
			"Age: %d  Played: %d  Last Level: %d  Timer: %d\n\r",
			get_age(victim), 
			(int) (victim->played + current_time - victim->logon) / 3600, 
			victim->pcdata->last_level, 
			victim->timer );
		send_to_char( buf, ch );
	}

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

	if (victim->comm)
	{
		sprintf(buf,"Comm: %s\n\r",comm_bit_name(victim->comm));
		send_to_char(buf,ch);
	}

	if (IS_NPC(victim) && victim->off_flags)
	{
		sprintf(buf, "Offense: %s\n\r",off_bit_name(victim->off_flags));
		send_to_char(buf,ch);
	}

	if (IS_NPC(victim) && victim->teach_flags)
	{
		sprintf(buf, "Teacher: %s\n\r",teach_bit_name(victim->teach_flags));
		send_to_char(buf,ch);
	}

	if (victim->imm_flags)
	{
		sprintf(buf, "Immune: %s\n\r",imm_bit_name(victim->imm_flags));
		send_to_char(buf,ch);
	}

	if (victim->res_flags)
	{
		sprintf(buf, "Resist: %s\n\r", imm_bit_name(victim->res_flags));
		send_to_char(buf,ch);
	}

	if (victim->vuln_flags)
	{
		sprintf(buf, "Vulnerable: %s\n\r", imm_bit_name(victim->vuln_flags));
		send_to_char(buf,ch);
	}

	sprintf(buf, "Form: %s\n\rParts: %s\n\r", 
		form_bit_name(victim->form), part_bit_name(victim->parts));
	send_to_char(buf,ch);

	if (victim->affected_by)
	{
		sprintf(buf, "Affected by %s\n\r", 
			affect_bit_name(victim->affected_by));
		send_to_char(buf,ch);
	}

	stc("{WChecking AFF2{x\n\r",ch);
	if (victim->affected2_by)
	{
		stc("{WCheck succeeded{x\n\r",ch);
		sprintf(buf, "Also affected by %s\n\r",
			affect2_bit_name(victim->affected2_by) );
		send_to_char(buf,ch);
	}

	sprintf( buf, "Master: %s  Leader: %s  Pet: %s\n\r",
		victim->master      ? victim->master->name   : "(none)",
		victim->leader      ? victim->leader->name   : "(none)",
		victim->pet 	    ? victim->pet->name	     : "(none)");
	send_to_char( buf, ch );

	if (!IS_NPC(victim))
	{
		sprintf( buf, "Security: %d.\n\r", victim->pcdata->security );	/* OLC */
		send_to_char( buf, ch );					/* OLC */
	}

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

	if ( IS_NPC(victim) && victim->spec_fun != 0 )
	{
		sprintf(buf,"Mobile has special procedure %s.\n\r",
			spec_name(victim->spec_fun));
		send_to_char(buf,ch);
	}

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

	return;
}

/* ofind and mfind replaced with vnum, vnum skill also added */

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

	string = one_argument(argument,arg);

	if (arg[0] == '\0')
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  vnum obj <name>\n\r",ch);
		send_to_char("  vnum mob <name>\n\r",ch);
		send_to_char("  vnum skill <skill or spell>\n\r",ch);
		return;
	}

	if (!str_cmp(arg,"obj"))
	{
		do_function(ch, &do_owhere, string);
		return;
	}

	if (!str_cmp(arg,"mob") || !str_cmp(arg,"char"))
	{
		do_function(ch, &do_mwhere, string);
		return;
	}

	if (!str_cmp(arg,"skill") || !str_cmp(arg,"spell"))
	{
		do_function (ch, &do_slookup, string);
		return;
	}
	stc("Please choose a valid argument\n\r",ch);
	return;
	/* do both 
	do_function(ch, &do_mfind, argument);
	do_function(ch, &do_ofind, argument);*/
}


void do_mfind( CHAR_DATA *ch, char *argument )
{
	extern int top_mob_index;
	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( "Find whom?\n\r", ch );
		return;
	}

	fAll	= FALSE; /* !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 (is_name( argument, pMobIndex->player_name ) )
			{
				found = TRUE;
				ptc(ch,"[%5d] %s\n\r",pMobIndex->vnum, pMobIndex->short_descr );
			}
		}
		else
		{
			nMatch++;
		}
	}

	if ( !found )
		send_to_char( "No mobiles by that name.\n\r", ch );

	return;
}



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( "Find what?\n\r", ch );
		return;
	}

	fAll	= FALSE; /* !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( argument, pObjIndex->name ) )
			{
				found = TRUE;
				sprintf( buf, "[%5d] %s\n\r",
					pObjIndex->vnum, pObjIndex->short_descr );
				send_to_char( buf, ch );
			}
		}
	}

	if ( !found )
		send_to_char( "No objects by that name.\n\r", ch );

	return;
}


void do_owhere(CHAR_DATA *ch, char *argument )
{
	char buf[MAX_INPUT_LENGTH];
	BUFFER *buffer;
	OBJ_DATA *obj;
	OBJ_DATA *in_obj;
	bool found;
	int number = 0, max_found;

	found = FALSE;
	number = 0;
	max_found = 200;

	buffer = new_buf();

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

	for ( obj = object_list; obj != NULL; obj = obj->next )
	{
		if ( !can_see_obj( ch, obj ) || !is_name( argument, obj->name )
			||   ch->level < obj->level)
			continue;

		found = TRUE;
		number++;

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

		if ( in_obj->carried_by != NULL && can_see(ch,in_obj->carried_by)
			&&   in_obj->carried_by->in_room != NULL)
			sprintf( buf, "%3d) %s is carried by %s [Room %d]\n\r",	number, obj->short_descr,
			PERS(in_obj->carried_by, ch),
			in_obj->carried_by->in_room->vnum );
		else if (in_obj->in_room != NULL && can_see_room(ch,in_obj->in_room))
			sprintf( buf, "%3d) %s is in %s [Room %d]\n\r",	number,obj->short_descr,
			in_obj->in_room->name,in_obj->in_room->vnum);
		else
			sprintf( buf, "%3d) %s is somewhere\n\r",number, obj->short_descr);

		buf[0] = UPPER(buf[0]);
		add_buf(buffer,buf);

		if (number >= max_found)
			break;
	}

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

	free_buf(buffer);
}


void do_mwhere( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	BUFFER *buffer;
	CHAR_DATA *victim;
	bool found;
	int count = 0;

	if ( argument[0] == '\0' )
	{
		DESCRIPTOR_DATA *d;

		/* show characters logged */

		buffer = new_buf();
		for (d = descriptor_list; d != NULL; d = d->next)
		{
			if (d->character != NULL && d->connected == CON_PLAYING
				&&  d->character->in_room != NULL && can_see(ch,d->character)
				&&  can_see_room(ch,d->character->in_room))
			{
				victim = d->character;
				count++;
				if (d->original != NULL)
					sprintf(buf,"%3d) %s (in the body of %s) is in %s [%d]\n\r",
					count, d->original->name,victim->short_descr,
					victim->in_room->name,victim->in_room->vnum);
				else
					sprintf(buf,"%3d) %s is in %s [%d]\n\r",
					count, victim->name,victim->in_room->name,
					victim->in_room->vnum);
				add_buf(buffer,buf);
			}
		}

		page_to_char(buf_string(buffer),ch);
		free_buf(buffer);
		return;
	}

	found = FALSE;
	buffer = new_buf();
	for ( victim = char_list; victim != NULL; victim = victim->next )
	{
		if ( victim->in_room != NULL
			&&   is_name( argument, victim->name ) )
		{
			found = TRUE;
			count++;
			sprintf( buf, "%3d) [%5d] %-28s [%5d] %s\n\r", count,
				IS_NPC(victim) ? victim->pIndexData->vnum : 0,
				IS_NPC(victim) ? victim->short_descr : victim->name,
				victim->in_room->vnum,
				victim->in_room->name );
			add_buf(buffer,buf);
		}
	}

	if ( !found )
		act( "You didn't find any $T.", ch, NULL, argument, TO_CHAR );
	else
		page_to_char(buf_string(buffer),ch);

	free_buf(buffer);

	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;
	DESCRIPTOR_DATA *d,*d_next;
	CHAR_DATA *vch;

	if (ch->invis_level < LEVEL_HERO)
	{
		sprintf( buf, "The {Mg{ma{Mm{me {Mc{mu{Mb{me{x comes slamming down, as Enzo strides forth ready to battle the forces of the {RC{Do{Rd{De{x", ch->name );
		do_function(ch, &do_echo, buf );
	}

	merc_down = TRUE;
	save_guilds();
	save_guilds_new();
	for ( d = descriptor_list; d != NULL; d = d_next )
	{
		d_next = d->next;
		vch = d->original ? d->original : d->character;
		if (vch != NULL)
			close_socket(d);
	}

	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;
	DESCRIPTOR_DATA *d;
	CHAR_DATA *vch;

	if (ch->invis_level < LEVEL_HERO)
		sprintf( buf, "Shutdown by %s.", ch->name );
	append_file( ch, SHUTDOWN_FILE, buf );
	strcat( buf, "\n\r" );
	if (ch->invis_level < LEVEL_HERO)
	{
		do_function(ch, &do_echo, buf );
	}
	merc_down = TRUE;
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
		vch = d->original ? d->original : d->character;
		if (vch != NULL && !IS_NPC(vch))
		{
			send_to_char("The {Mg{ma{Mm{me {Mc{mu{Mb{me{x comes slamming down, as Enzo strides forth ready to battle the forces of the {RC{Do{Rd{De{x\n\r",vch);
			save_char_obj(vch);
		}
		close_socket(d);
	}
	return;
}

void do_protect( CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim;

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

	if ((victim = get_char_world(ch,argument)) == NULL)
	{
		send_to_char("You can't find them.\n\r",ch);
		return;
	}

	if (IS_SET(victim->comm,COMM_SNOOP_PROOF))
	{
		act_new("$N is no longer snoop-proof.",ch,NULL,victim,TO_CHAR,POS_DEAD);
		send_to_char("Your snoop-proofing was just removed.\n\r",victim);
		REMOVE_BIT(victim->comm,COMM_SNOOP_PROOF);
	}
	else
	{
		act_new("$N is now snoop-proof.",ch,NULL,victim,TO_CHAR,POS_DEAD);
		send_to_char("You are now immune to snooping.\n\r",victim);
		SET_BIT(victim->comm,COMM_SNOOP_PROOF);
	}
}



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

	one_argument( argument, arg );

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

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

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

	if ( victim == ch )
	{
		send_to_char( "Cancelling all snoops.\n\r", ch );
		wiznet("$N stops being such a snoop.",
			ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));
		for ( d = descriptor_list; d != NULL; d = d->next )
		{
			if ( d->snoop_by == ch->desc )
				d->snoop_by = NULL;
		}
		return;
	}

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

	if (!is_room_owner(ch,victim->in_room) && ch->in_room != victim->in_room 
		&&  room_is_private(victim->in_room) && !IS_TRUSTED(ch,IMPLEMENTOR))
	{
		send_to_char("That character is in a private room.\n\r",ch);
		return;
	}

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

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

	victim->desc->snoop_by = ch->desc;
	sprintf(buf,"$N starts snooping on %s",
		(IS_NPC(ch) ? victim->short_descr : victim->name));
	wiznet(buf,ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));
	send_to_char( "Ok.\n\r", ch );
	return;
}



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

	one_argument( argument, arg );

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

	if ( ch->desc == NULL )
		return;

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

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

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

	if (!IS_NPC(victim))
	{
		send_to_char("You can only switch into mobiles.\n\r",ch);
		return;
	}

	if (!is_room_owner(ch,victim->in_room) && ch->in_room != victim->in_room 
		&&  room_is_private(victim->in_room) && !IS_TRUSTED(ch,IMPLEMENTOR))
	{
		send_to_char("That character is in a private room.\n\r",ch);
		return;
	}

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

	sprintf(buf,"$N switches into %s",victim->short_descr);
	wiznet(buf,ch,NULL,WIZ_SWITCHES,WIZ_SECURE,get_trust(ch));

	ch->desc->character = victim;
	ch->desc->original  = ch;
	victim->desc        = ch->desc;
	ch->desc            = NULL;

	/* change communications to match */
	if (ch->prompt != NULL)
		victim->prompt = str_dup(ch->prompt);
	victim->comm = ch->comm;
	victim->lines = ch->lines;
	send_to_char( "Ok.\n\r", victim );
	return;
}



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

	if ( ch->desc == NULL )
		return;

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

	send_to_char( 
		"You return to your original body. Type replay to see any missed tells.\n\r", 
		ch );
	if (ch->prompt != NULL)
	{
		free_string(ch->prompt);
		ch->prompt = NULL;
	}

	sprintf(buf,"$N returns from %s.",ch->short_descr);
	wiznet(buf,ch->desc->original,0,WIZ_SWITCHES,WIZ_SECURE,get_trust(ch));
	ch->desc->character       = ch->desc->original;
	ch->desc->original        = NULL;
	ch->desc->character->desc = ch->desc; 
	ch->desc                  = NULL;
	return;
}

/* trust levels for load and clone */
bool obj_check (CHAR_DATA *ch, OBJ_DATA *obj)
{
	if (IS_TRUSTED(ch,GOD)
		|| (IS_TRUSTED(ch,IMMORTAL) && obj->level <= 20 && obj->cost <= 1000)
		|| (IS_TRUSTED(ch,DEMI)	    && obj->level <= 10 && obj->cost <= 500)
		|| (IS_TRUSTED(ch,ANGEL)    && obj->level <=  5 && obj->cost <= 250)
		|| (IS_TRUSTED(ch,AVATAR)   && obj->level ==  0 && obj->cost <= 100))
		return TRUE;
	else
		return FALSE;
}

/* for clone, to insure that cloning goes many levels deep */
void recursive_clone(CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *clone)
{
	OBJ_DATA *c_obj, *t_obj;


	for (c_obj = obj->contains; c_obj != NULL; c_obj = c_obj->next_content)
	{
		if (obj_check(ch,c_obj))
		{
			t_obj = create_object(c_obj->pIndexData,0);
			clone_object(c_obj,t_obj);
			obj_to_obj(t_obj,clone);
			recursive_clone(ch,c_obj,t_obj);
		}
	}
}

/* command that is similar to load */
void do_clone(CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	char *rest;
	CHAR_DATA *mob;
	OBJ_DATA  *obj;

	rest = one_argument(argument,arg);

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

	if (!str_prefix(arg,"object"))
	{
		mob = NULL;
		obj = get_obj_here(ch, NULL,rest);
		if (obj == NULL)
		{
			send_to_char("You don't see that here.\n\r",ch);
			return;
		}
	}
	else if (!str_prefix(arg,"mobile") || !str_prefix(arg,"character"))
	{
		obj = NULL;
		mob = get_char_room(ch,NULL,rest);
		if (mob == NULL)
		{
			send_to_char("You don't see that here.\n\r",ch);
			return;
		}
	}
	else /* find both */
	{
		mob = get_char_room(ch,NULL,argument);
		obj = get_obj_here(ch, NULL,argument);
		if (mob == NULL && obj == NULL)
		{
			send_to_char("You don't see that here.\n\r",ch);
			return;
		}
	}

	/* clone an object */
	if (obj != NULL)
	{
		OBJ_DATA *clone;

		if (!obj_check(ch,obj))
		{
			send_to_char(
				"Your powers are not great enough for such a task.\n\r",ch);
			return;
		}

		clone = create_object(obj->pIndexData,0); 
		clone_object(obj,clone);
		if (obj->carried_by != NULL)
			obj_to_char(clone,ch);
		else
			obj_to_room(clone,ch->in_room);
		recursive_clone(ch,obj,clone);

		act("$n has created $p.",ch,clone,NULL,TO_ROOM);
		act("You clone $p.",ch,clone,NULL,TO_CHAR);
		wiznet("$N clones $p.",ch,clone,WIZ_LOAD,WIZ_SECURE,get_trust(ch));
		return;
	}
	else if (mob != NULL)
	{
		CHAR_DATA *clone;
		OBJ_DATA *new_obj;
		char buf[MAX_STRING_LENGTH];

		if (!IS_NPC(mob))
		{
			send_to_char("You can only clone mobiles.\n\r",ch);
			return;
		}

		if ((mob->level > 20 && !IS_TRUSTED(ch,GOD))
			||  (mob->level > 10 && !IS_TRUSTED(ch,IMMORTAL))
			||  (mob->level >  5 && !IS_TRUSTED(ch,DEMI))
			||  (mob->level >  0 && !IS_TRUSTED(ch,ANGEL))
			||  !IS_TRUSTED(ch,AVATAR))
		{
			send_to_char(
				"Your powers are not great enough for such a task.\n\r",ch);
			return;
		}

		clone = create_mobile(mob->pIndexData);
		clone_mobile(mob,clone); 

		for (obj = mob->carrying; obj != NULL; obj = obj->next_content)
		{
			if (obj_check(ch,obj))
			{
				new_obj = create_object(obj->pIndexData,0);
				clone_object(obj,new_obj);
				recursive_clone(ch,obj,new_obj);
				obj_to_char(new_obj,clone);
				new_obj->wear_loc = obj->wear_loc;
			}
		}
		char_to_room(clone,ch->in_room);
		act("$n has created $N.",ch,NULL,clone,TO_ROOM);
		act("You clone $N.",ch,NULL,clone,TO_CHAR);
		sprintf(buf,"$N clones %s.",clone->short_descr);
		wiznet(buf,ch,NULL,WIZ_LOAD,WIZ_SECURE,get_trust(ch));
		return;
	}
}

/* RT to replace the two load commands */

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

	argument = one_argument(argument,arg);

	if (arg[0] == '\0')
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  load mob <vnum>\n\r",ch);
		send_to_char("  load obj <vnum> <level>\n\r",ch);
		return;
	}

	if (!str_cmp(arg,"mob") || !str_cmp(arg,"char"))
	{
		do_function(ch, &do_mload, argument);
		return;
	}

	if (!str_cmp(arg,"obj"))
	{
		do_function(ch, &do_oload, argument);
		return;
	}
	/* echo syntax */
	do_function(ch, &do_load, "");
}


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

	one_argument( argument, arg );

	if ( arg[0] == '\0' || !is_number(arg) )
	{
		send_to_char( "Syntax: load mob <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;
	}

	victim = create_mobile( pMobIndex );
	char_to_room( victim, ch->in_room );
	act( "$n has created $N!", ch, NULL, victim, TO_ROOM );
	sprintf(buf,"$N loads %s.",victim->short_descr);
	wiznet(buf,ch,NULL,WIZ_LOAD,WIZ_SECURE,get_trust(ch));
	send_to_char( "Ok.\n\r", ch );
	return;
}



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

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

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

	level = get_trust(ch); /* default */

	if ( arg2[0] != '\0')  /* load with a level */
	{
		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( "Level must be be between 0 and your 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;
	}

	ptc(ch,"Loading object %d...", atoi(arg1));
	obj = create_object( pObjIndex, level );
	if ( CAN_WEAR(obj, ITEM_TAKE) )
		obj_to_char( obj, ch );
	else
		obj_to_room( obj, ch->in_room );
	send_to_char( "Ok.\n\r", ch );
	return;
}



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

	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) && !IS_SET(victim->act,ACT_NOPURGE) 
				&&   victim != ch /* safety precaution */ )
				extract_char( victim, TRUE );
		}

		for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
		{
			obj_next = obj->next_content;
			if (!IS_OBJ_STAT(obj,ITEM_NOPURGE))
				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) )
	{

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

		if (get_trust(ch) <= get_trust(victim))
		{
			send_to_char("Maybe that wasn't a good idea...\n\r",ch);
			sprintf(buf,"%s tried to purge you!\n\r",ch->name);
			send_to_char(buf,victim);
			return;
		}

		act("$n disintegrates $N.",ch,0,victim,TO_NOTVICT);

		if (victim->level > 1)
			save_char_obj( victim );
		d = victim->desc;
		extract_char( victim, TRUE );
		if ( d != NULL )
			close_socket( d );

		return;
	}

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



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

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

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

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

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

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

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

	/*
	* Lower level:
	*   Reset to level 1.
	*   Then raise again.
	*   Currently, an imp can lower another imp.
	*   -- Swiftest
	*/
	if ( level <= victim->level )
	{
		int temp_prac;

		send_to_char( "Lowering a player's level!\n\r", ch );
		send_to_char( "**** OOOOHHHHHHHHHH  NNNNOOOO ****\n\r", victim );
		temp_prac = victim->practice;
		victim->level    = 1;
		victim->exp      = exp_per_level(victim,victim->pcdata->points);
		victim->max_hit  = 10;
		victim->max_mana = 100;
		victim->max_move = 100;
		victim->practice = 0;
		victim->hit      = victim->max_hit;
		victim->mana     = victim->max_mana;
		victim->move     = victim->max_move;
		advance_level( victim, TRUE );
		victim->practice = temp_prac;
	}
	else
	{
		send_to_char( "Raising a player's level!\n\r", ch );
		send_to_char( "**** OOOOHHHHHHHHHH  YYYYEEEESSS ****\n\r", victim );
	}

	for ( iLevel = victim->level ; iLevel < level; iLevel++ )
	{
		victim->level += 1;
		advance_level( victim,TRUE);
	}
	sprintf(buf,"You are now level %d.\n\r",victim->level);
	send_to_char(buf,victim);
	set_new_title(victim);
	victim->exp   = exp_per_level(victim,victim->pcdata->points) 
		* UMAX( 1, victim->level );
	victim->trust = 0;
	save_char_obj(victim);
	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;

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

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

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

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

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

	victim->trust = level;
	return;
}



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

	one_argument( argument, arg );
	if (arg[0] == '\0' || !str_cmp(arg,"room"))
	{
		/* cure room */

		for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
		{
			affect_strip(vch,gsn_plague);
			affect_strip(vch,gsn_poison);
			affect_strip(vch,gsn_blindness);
			affect_strip(vch,gsn_sleep);
			affect_strip(vch,gsn_curse);
			affect_strip(vch,gsn_coat);
			affect_strip(vch,gsn_dagashi_poison);
			REMOVE_BIT(vch->affected_by,AFF_DAGASHI);

			vch->hit 	= vch->max_hit;
			vch->mana	= vch->max_mana;
			vch->move	= vch->max_move;
			update_pos( vch);
			act("$n has restored you.",ch,NULL,vch,TO_VICT);
		}

		sprintf(buf,"$N restored room %d.",ch->in_room->vnum);
		wiznet(buf,ch,NULL,WIZ_RESTORE,WIZ_SECURE,get_trust(ch));

		send_to_char("Room restored.\n\r",ch);
		return;

	}

	if ( get_trust(ch) >=  MAX_LEVEL - 1 && !str_cmp(arg,"all"))
	{
		/* cure all */

		for (d = descriptor_list; d != NULL; d = d->next)
		{
			victim = d->character;

			if (victim == NULL || IS_NPC(victim))
				continue;

			affect_strip(victim,gsn_plague);
			affect_strip(victim,gsn_poison);
			affect_strip(victim,gsn_blindness);
			affect_strip(victim,gsn_sleep);
			affect_strip(victim,gsn_curse);
			affect_strip(victim,gsn_coat);
			affect_strip(victim,gsn_dagashi_poison);
			REMOVE_BIT(victim->affected_by,AFF_DAGASHI);

			victim->hit 	= victim->max_hit;
			victim->mana	= victim->max_mana;
			victim->move	= victim->max_move;
			update_pos( victim);
			if (victim->in_room != NULL)
				act("$n has restored you.",ch,NULL,victim,TO_VICT);
		}
		send_to_char("All active players restored.\n\r",ch);
		return;
	}

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

	affect_strip(victim,gsn_plague);
	affect_strip(victim,gsn_poison);
	affect_strip(victim,gsn_blindness);
	affect_strip(victim,gsn_sleep);
	affect_strip(victim,gsn_curse);
	affect_strip(victim,gsn_coat);
	affect_strip(victim,gsn_dagashi_poison);
	REMOVE_BIT(victim->affected_by,AFF_DAGASHI);
	victim->hit  = victim->max_hit;
	victim->mana = victim->max_mana;
	victim->move = victim->max_move;
	update_pos( victim );
	act( "$n has restored you.", ch, NULL, victim, TO_VICT );
	sprintf(buf,"$N restored %s",
		IS_NPC(victim) ? victim->short_descr : victim->name);
	wiznet(buf,ch,NULL,WIZ_RESTORE,WIZ_SECURE,get_trust(ch));
	send_to_char( "Ok.\n\r", ch );
	return;
}


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

	one_argument( argument, arg );

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

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

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

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

	if ( IS_SET(victim->act, PLR_FREEZE) )
	{
		REMOVE_BIT(victim->act, PLR_FREEZE);
		send_to_char( "You can play again.\n\r", victim );
		send_to_char( "FREEZE removed.\n\r", ch );
		sprintf(buf,"$N thaws %s.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}
	else
	{
		SET_BIT(victim->act, PLR_FREEZE);
		send_to_char( "You can't do ANYthing!\n\r", victim );
		send_to_char( "FREEZE set.\n\r", ch );
		sprintf(buf,"$N puts %s in the deep freeze.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}

	save_char_obj( victim );

	return;
}



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

	one_argument( argument, arg );

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

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

	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		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],buf[MAX_STRING_LENGTH];
	CHAR_DATA *victim;

	one_argument( argument, arg );

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

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


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

	if ( IS_SET(victim->comm, COMM_NOEMOTE) )
	{
		REMOVE_BIT(victim->comm, COMM_NOEMOTE);
		send_to_char( "You can emote again.\n\r", victim );
		send_to_char( "NOEMOTE removed.\n\r", ch );
		sprintf(buf,"$N restores emotes to %s.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}
	else
	{
		SET_BIT(victim->comm, COMM_NOEMOTE);
		send_to_char( "You can't emote!\n\r", victim );
		send_to_char( "NOEMOTE set.\n\r", ch );
		sprintf(buf,"$N revokes %s's emotes.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}

	return;
}



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

	one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		send_to_char( "Noshout 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->comm, COMM_NOSHOUT) )
	{
		REMOVE_BIT(victim->comm, COMM_NOSHOUT);
		send_to_char( "You can shout again.\n\r", victim );
		send_to_char( "NOSHOUT removed.\n\r", ch );
		sprintf(buf,"$N restores shouts to %s.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}
	else
	{
		SET_BIT(victim->comm, COMM_NOSHOUT);
		send_to_char( "You can't shout!\n\r", victim );
		send_to_char( "NOSHOUT set.\n\r", ch );
		sprintf(buf,"$N revokes %s's shouts.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}

	return;
}



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

	one_argument( argument, arg );

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

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

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

	if ( IS_SET(victim->comm, COMM_NOTELL) )
	{
		REMOVE_BIT(victim->comm, COMM_NOTELL);
		send_to_char( "You can tell again.\n\r", victim );
		send_to_char( "NOTELL removed.\n\r", ch );
		sprintf(buf,"$N restores tells to %s.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}
	else
	{
		SET_BIT(victim->comm, COMM_NOTELL);
		send_to_char( "You can't tell!\n\r", victim );
		send_to_char( "NOTELL set.\n\r", ch );
		sprintf(buf,"$N revokes %s's tells.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	}

	return;
}



void do_peace( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *rch;

	for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
	{
		if ( rch->fighting != NULL )
			stop_fighting( rch, TRUE );
		if (IS_NPC(rch) && IS_SET(rch->act,ACT_AGGRESSIVE))
			REMOVE_BIT(rch->act,ACT_AGGRESSIVE);
	}

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

void do_wizlock( CHAR_DATA *ch, char *argument )
{
	extern bool wizlock;
	wizlock = !wizlock;

	if ( wizlock )
	{
		wiznet("$N has wizlocked the game.",ch,NULL,0,0,0);
		send_to_char( "Game wizlocked.\n\r", ch );
	}
	else
	{
		wiznet("$N removes wizlock.",ch,NULL,0,0,0);
		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 )
	{
		wiznet("$N locks out new characters.",ch,NULL,0,0,0);
		send_to_char( "New characters have been locked out.\n\r", ch );
	}
	else
	{
		wiznet("$N allows new characters back in.",ch,NULL,0,0,0);
		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( "Lookup which skill or spell?\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: %3d  Slot: %3d  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: %3d  Slot: %3d  Skill/spell: '%s'\n\r",
			sn, skill_table[sn].slot, skill_table[sn].name );
		send_to_char( buf, ch );
	}

	return;
}

/* RT set replaces sset, mset, oset, and rset */

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

	argument = one_argument(argument,arg);

	if (arg[0] == '\0')
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  set mob   <name> <field> <value>\n\r",ch);
		send_to_char("  set obj   <name> <field> <value>\n\r",ch);
		send_to_char("  set room  <room> <field> <value>\n\r",ch);
		send_to_char("  set skill <name> <spell or skill> <value>\n\r",ch);
		stc("  set form <name> <form> <value>\n\r",ch);
		return;
	}

	if (!str_prefix(arg,"mobile") || !str_prefix(arg,"character"))
	{
		do_function(ch, &do_mset, argument);
		return;
	}

	if (!str_prefix(arg,"skill") || !str_prefix(arg,"spell"))
	{
		do_function(ch, &do_sset, argument);
		return;
	}

	if (!str_prefix(arg,"object"))
	{
		do_function(ch, &do_oset, argument);
		return;
	}

	if (!str_prefix(arg,"room"))
	{
		do_function(ch, &do_rset, argument);
		return;
	}
	/* echo syntax */
	do_function(ch, &do_set, "");
}


void do_sset( CHAR_DATA *ch, char *argument )
{
	char arg1 [MAX_INPUT_LENGTH];
	char arg2 [MAX_INPUT_LENGTH];
	char arg3 [MAX_INPUT_LENGTH];
	CHAR_DATA *victim;
	int value;
	int sn;
	bool fAll;

	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:\n\r",ch);
		send_to_char( "  set skill <name> <spell or skill> <value>\n\r", ch);
		send_to_char( "  set skill <name> all <value>\n\r",ch);  
		send_to_char("   (use the name of the skill, not the number)\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;
	}

	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[100];
	CHAR_DATA *victim;
	int value;

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

	if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  set char <name> <field> <value>\n\r",ch); 
		send_to_char( "  Field being one of:\n\r",			ch );
		send_to_char( "    str int wis dex con sex class level\n\r",	ch );
		send_to_char( "    race group gold silver hp mana move prac\n\r",ch);
		send_to_char( "    align train thirst hunger drunk full\n\r",	ch );
		send_to_char( "    security\n\r",				ch );
		return;
	}

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

	/* clear zones for mobs */
	victim->zone = NULL;

	/*
	* Snarf the value (which need not be numeric).
	*/
	value = is_number( arg3 ) ? atoi( arg3 ) : -1;

	/*
	* Set something.
	*/
	if ( !str_cmp( arg2, "sp") )
	{
		victim->pcdata->sp = value;
		sprintf(buf,"You have set %s's SP to %ld\n\r",victim->short_descr,victim->pcdata->sp);
		stc(buf,ch);
		return;
	}
	if ( !str_cmp( arg2, "str" ) )
	{
		if ( value < 3 || value > get_max_train(victim,STAT_STR) )
		{
			sprintf(buf,
				"Strength range is 3 to %d\n\r.",
				get_max_train(victim,STAT_STR));
			send_to_char(buf,ch);
			return;
		}

		victim->perm_stat[STAT_STR] = value;
		return;
	}

	if ( !str_cmp( arg2, "security" ) )	/* OLC */
	{
		if ( IS_NPC(ch) )
		{
			send_to_char( "Yeah, right\n\r", ch );
			return;
		}

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

		if ( value > ch->pcdata->security || value < 0 )
		{
			if ( ch->pcdata->security != 0 )
			{
				sprintf( buf, "Valid security is 0-%d.\n\r",
					ch->pcdata->security );
				send_to_char( buf, ch );
			}
			else
			{
				send_to_char( "Valid security is 0 only.\n\r", ch );
			}
			return;
		}
		victim->pcdata->security = value;
		return;
	}

	if ( !str_cmp( arg2, "int" ) )
	{
		if ( value < 3 || value > get_max_train(victim,STAT_INT) )
		{
			sprintf(buf,
				"Intelligence range is 3 to %d.\n\r",
				get_max_train(victim,STAT_INT));
			send_to_char(buf,ch);
			return;
		}

		victim->perm_stat[STAT_INT] = value;
		return;
	}

	if ( !str_cmp( arg2, "wis" ) )
	{
		if ( value < 3 || value > get_max_train(victim,STAT_WIS) )
		{
			sprintf(buf,
				"Wisdom range is 3 to %d.\n\r",get_max_train(victim,STAT_WIS));
			send_to_char( buf, ch );
			return;
		}

		victim->perm_stat[STAT_WIS] = value;
		return;
	}

	if ( !str_cmp( arg2, "dex" ) )
	{
		if ( value < 3 || value > get_max_train(victim,STAT_DEX) )
		{
			sprintf(buf,
				"Dexterity range is 3 to %d.\n\r",
				get_max_train(victim,STAT_DEX));
			send_to_char( buf, ch );
			return;
		}

		victim->perm_stat[STAT_DEX] = value;
		return;
	}

	if ( !str_cmp( arg2, "con" ) )
	{
		if ( value < 3 || value > get_max_train(victim,STAT_CON) )
		{
			sprintf(buf,
				"Constitution range is 3 to %d.\n\r",
				get_max_train(victim,STAT_CON));
			send_to_char( buf, ch );
			return;
		}

		victim->perm_stat[STAT_CON] = value;
		return;
	}

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

	if ( !str_prefix( arg2, "class" ) )
	{
		int class;

		if (IS_NPC(victim))
		{
			send_to_char("Mobiles have no class.\n\r",ch);
			return;
		}

		class = class_lookup(arg3);
		if ( class == -1 )
		{
			char buf[MAX_STRING_LENGTH];

			strcpy( buf, "Possible classes are: " );
			for ( class = 0; class < MAX_CLASS; class++ )
			{
				if ( class > 0 )
					strcat( buf, " " );
				strcat( buf, class_table[class].name );
			}
			strcat( buf, ".\n\r" );

			send_to_char(buf,ch);
			return;
		}

		victim->class = class;
		return;
	}

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

		if ( value < 0 || value > MAX_LEVEL )
		{
			sprintf(buf, "Level range is 0 to %d.\n\r", MAX_LEVEL);
			send_to_char(buf, ch);
			return;
		}
		victim->level = value;
		return;
	}

	if ( !str_prefix( arg2, "gold" ) )
	{
		victim->gold = value;
		return;
	}

	if ( !str_prefix(arg2, "silver" ) )
	{
		victim->silver = value;
		return;
	}

	if ( !str_prefix( arg2, "hp" ) )
	{
		victim->max_hit = value;
		if (!IS_NPC(victim))
			victim->pcdata->perm_hit = value;
		return;
	}

	if ( !str_prefix( arg2, "mana" ) )
	{
		if ( value < 0 || value > 30000 )
		{
			send_to_char( "Mana range is 0 to 30,000 mana points.\n\r", ch );
			return;
		}
		victim->max_mana = value;
		if (!IS_NPC(victim))
			victim->pcdata->perm_mana = value;
		return;
	}

	if ( !str_prefix( arg2, "move" ) )
	{
		if ( value < 0 || value > 30000 )
		{
			send_to_char( "Move range is 0 to 30,000 move points.\n\r", ch );
			return;
		}
		victim->max_move = value;
		if (!IS_NPC(victim))
			victim->pcdata->perm_move = value;
		return;
	}

	if ( !str_prefix( arg2, "practice" ) )
	{
		if ( value < 0 || value > 250 )
		{
			send_to_char( "Practice range is 0 to 250 sessions.\n\r", ch );
			return;
		}
		victim->practice = value;
		return;
	}

	if ( !str_prefix( arg2, "train" ))
	{
		if (value < 0 || value > 1000 )
		{
			send_to_char("Training session range is 0 to 1000 sessions.\n\r",ch);
			return;
		}
		victim->train = value;
		return;
	}

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

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

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

		victim->pcdata->condition[COND_THIRST] = value;
		return;
	}

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

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

		victim->pcdata->condition[COND_DRUNK] = value;
		return;
	}

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

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

		victim->pcdata->condition[COND_FULL] = value;
		return;
	}

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

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

		victim->pcdata->condition[COND_HUNGER] = value;
		return;
	}

	if (!str_prefix( arg2, "race" ) )
	{
		int race;

		race = race_lookup(arg3);

		if ( race == 0)
		{
			send_to_char("That is not a valid race.\n\r",ch);
			return;
		}

		if (!IS_NPC(victim) && !race_table[race].pc_race)
		{
			send_to_char("That is not a valid player race.\n\r",ch);
			return;
		}

		victim->race = race;
		return;
	}

	if (!str_prefix(arg2,"group"))
	{
		if (!IS_NPC(victim))
		{
			send_to_char("Only on NPCs.\n\r",ch);
			return;
		}
		victim->group = value;
		return;
	}

	if (!str_prefix(arg2,"carry"))
	{
		if (IS_NPC(victim))
		{
			send_to_char("Not on NPCs.\n\r",ch);
			return;
		}
		victim->carry_weight = value;
		return;
	}

	if (!str_prefix(arg2,"item"))
	{
		if (IS_NPC(victim))
		{
			send_to_char("Not on NPCs.\n\r",ch);
			return;
		}
		victim->carry_number = value;
		return;
	}


	/*
	* Generate usage message.
	*/
	do_function(ch, &do_mset, "" );
	return;
}

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

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

	if ( type[0] == '\0' || arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  string char <name> <field> <string>\n\r",ch);
		send_to_char("    fields: name short long desc title spec\n\r",ch);
		send_to_char("  string obj  <name> <field> <string>\n\r",ch);
		send_to_char("    fields: name short long extended\n\r",ch);
		return;
	}

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

		/* clear zone for mobs */
		victim->zone = NULL;

		/* string something */

		if ( !str_prefix( arg2, "name" ) )
		{
			if ( !IS_NPC(victim) )
			{
				send_to_char( "Not on PC's.\n\r", ch );
				return;
			}
			free_string( victim->name );
			victim->name = str_dup( arg3 );
			return;
		}

		if ( !str_prefix( arg2, "description" ) )
		{
			free_string(victim->description);
			victim->description = str_dup(arg3);
			return;
		}

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

		if ( !str_prefix( arg2, "long" ) )
		{
			free_string( victim->long_descr );
			strcat(arg3,"\n\r");
			victim->long_descr = str_dup( arg3 );
			return;
		}

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

			set_title( victim, arg3 );
			return;
		}

		if ( !str_prefix( 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;
			}

			return;
		}
	}

	if (!str_prefix(type,"object"))
	{
		/* string an obj */

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

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

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

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

		if ( !str_prefix( arg2, "ed" ) || !str_prefix( arg2, "extended"))
		{
			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;
			}

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

			ed = new_extra_descr();

			ed->keyword		= str_dup( arg3     );
			ed->description	= str_dup( argument );
			ed->next		= obj->extra_descr;
			obj->extra_descr	= ed;
			return;
		}
	}


	/* echo bad use message */
	do_function(ch, &do_string, "");
}



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

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

	if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  set obj <object> <field> <value>\n\r",ch);
		send_to_char("  Field being one of:\n\r",				ch );
		send_to_char("    value0 value1 value2 value3 value4 (v1-v4)\n\r",	ch );
		send_to_char("    extra wear level weight cost timer\n\r",		ch );
		return;
	}

	if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL )
	{
		send_to_char( "Nothing like that in heaven or earth.\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" ) )
	{
		obj->value[0] = UMIN(50,value);
		return;
	}

	if ( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) )
	{
		obj->value[1] = value;
		return;
	}

	if ( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) )
	{
		obj->value[2] = value;
		return;
	}

	if ( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) )
	{
		obj->value[3] = value;
		return;
	}

	if ( !str_cmp( arg2, "value4" ) || !str_cmp( arg2, "v4" ) )
	{
		obj->value[4] = value;
		return;
	}

	if ( !str_prefix( arg2, "extra" ) )
	{
		obj->extra_flags = value;
		return;
	}

	if ( !str_prefix( arg2, "wear" ) )
	{
		obj->wear_flags = value;
		return;
	}

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

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

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

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

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



void do_rset( CHAR_DATA *ch, char *argument )
{
	char arg1 [MAX_INPUT_LENGTH];
	char arg2 [MAX_INPUT_LENGTH];
	char arg3 [MAX_INPUT_LENGTH];
	ROOM_INDEX_DATA *location;
	int value;

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

	if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
	{
		send_to_char( "Syntax:\n\r",ch);
		send_to_char( "  set room <location> <field> <value>\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;
	}

	if (!is_room_owner(ch,location) && ch->in_room != location 
		&&  room_is_private(location) && !IS_TRUSTED(ch,IMPLEMENTOR) && (ch->level < MAX_LEVEL))
	{
		send_to_char("That room is private right now.\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_prefix( arg2, "flags" ) )
	{
		location->room_flags	= value;
		return;
	}

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

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



void do_sockets( CHAR_DATA *ch, char *argument )
{
	char buf[2 * MAX_STRING_LENGTH];
	char buf2[MAX_STRING_LENGTH];
	char arg[MAX_INPUT_LENGTH];
	DESCRIPTOR_DATA *d;
	int count;

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

	one_argument(argument,arg);
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
		if ( d->character != NULL && can_see( ch, d->character ) 
			&& (arg[0] == '\0' || is_name(arg,d->character->name)
			|| (d->original && is_name(arg,d->original->name))))
		{
			count++;
			sprintf( buf + strlen(buf), "[%3d %2d] %s@%s\n\r",
				d->descriptor,
				d->connected,
				d->original  ? d->original->name  :
			d->character ? d->character->name : "(none)",
				d->host
				);
		}
	}
	if (count == 0)
	{
		send_to_char("No one by that name is connected.\n\r",ch);
		return;
	}

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



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

	argument = one_argument( argument, arg );

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

	one_argument(argument,arg2);

	if (!str_cmp(arg2,"delete") || !str_prefix(arg2,"mob"))
	{
		send_to_char("That will NOT be done.\n\r",ch);
		return;
	}

	sprintf( buf, "$n forces you to '%s'.", argument );

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

		if (get_trust(ch) < MAX_LEVEL - 3)
		{
			send_to_char("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( buf, ch, NULL, vch, TO_VICT );
				interpret( vch, argument );
			}
		}
	}
	else if (!str_cmp(arg,"players"))
	{
		CHAR_DATA *vch;
		CHAR_DATA *vch_next;

		if (get_trust(ch) < MAX_LEVEL - 2)
		{
			send_to_char("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 ) 
				&&	 vch->level < LEVEL_HERO)
			{
				act( buf, ch, NULL, vch, TO_VICT );
				interpret( vch, argument );
			}
		}
	}
	else if (!str_cmp(arg,"gods"))
	{
		CHAR_DATA *vch;
		CHAR_DATA *vch_next;

		if (get_trust(ch) < MAX_LEVEL - 2)
		{
			send_to_char("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 )
				&&   vch->level >= LEVEL_HERO)
			{
				act( buf, ch, NULL, 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 (!is_room_owner(ch,victim->in_room) 
			&&  ch->in_room != victim->in_room 
			&&  room_is_private(victim->in_room) && !IS_TRUSTED(ch,IMPLEMENTOR))
		{
			send_to_char("That character is in a private room.\n\r",ch);
			return;
		}

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

		if ( !IS_NPC(victim) && get_trust(ch) < MAX_LEVEL -3)
		{
			send_to_char("Not at your level!\n\r",ch);
			return;
		}

		act( buf, ch, NULL, victim, TO_VICT );
		interpret( victim, argument );
	}

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



/*
* New routines by Dionysos.
*/
void do_invis( CHAR_DATA *ch, char *argument )
{
	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)
		{
			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
		{
			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
		{
			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_incognito( 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->incog_level)
		{
			ch->incog_level = 0;
			act( "$n is no longer cloaked.", ch, NULL, NULL, TO_ROOM );
			send_to_char( "You are no longer cloaked.\n\r", ch );
		}
		else
		{
			ch->incog_level = get_trust(ch);
			act( "$n cloaks $s presence.", ch, NULL, NULL, TO_ROOM );
			send_to_char( "You cloak your presence.\n\r", ch );
		}
	else
		/* do the level thing */
	{
		level = atoi(arg);
		if (level < 2 || level > get_trust(ch))
		{
			send_to_char("Incog level must be between 2 and your level.\n\r",ch);
			return;
		}
		else
		{
			ch->reply = NULL;
			ch->incog_level = level;
			act( "$n cloaks $s presence.", ch, NULL, NULL, TO_ROOM );
			send_to_char( "You cloak your presence.\n\r", ch );
		}
	}

	return;
}



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

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

	return;
}

/* 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[0] == '\0')
		{
			send_to_char("You have no prefix to clear.\r\n",ch);
			return;
		}

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

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

	ch->prefix = str_dup(argument);
}

/* ADDED BY SOKOL */
void do_wrlist( CHAR_DATA *ch, char *argument )
{
	ROOM_INDEX_DATA *room;
	ROOM_INDEX_DATA *in_room;
	MOB_INDEX_DATA *mob;
	OBJ_INDEX_DATA *obj;
	char arg[MAX_STRING_LENGTH];
	char arg1[MAX_STRING_LENGTH];
	char arg2[MAX_STRING_LENGTH];
	int uvnum;
	int lvnum;
	int MR = 60000;
	int type = -1;

	argument = one_argument( argument, arg );
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	uvnum = ( is_number( arg2 ) ) ? atoi( arg2 ) : 0;
	lvnum = ( is_number( arg1 ) ) ? atoi( arg1 ) : 0;  

	if ( !str_cmp( arg, "o" ) )
		type = 2;
	if ( !str_cmp( arg, "m" ) )
		type = 1;
	if ( !str_cmp( arg, "r" ) )
		type = 0;
	if ( !str_cmp( arg, "p" ) )
		type = 3;

	if ( ( uvnum - lvnum ) > 1000 )
	{
		send_to_char( "{WThat range is too large.\n\r{x", ch );
		return;
	}

	if ( ( ( uvnum == 0 ) && ( lvnum == 0 ) ) || ( arg[0] == '\0' ) 
		|| ( type == -1 ) )
	{
		send_to_char( "{MSyntax: wrlist [type] [lvnum] [uvnum]\n\r{x", ch );
		return;
	}

	if ( uvnum > MR || uvnum < 1 || lvnum > MR || lvnum < 1 || lvnum > uvnum )
	{
		send_to_char( "{WInvalid level(s).\n\r{x", ch );
		return;
	}

	in_room = ch->in_room;  
	if ( type == 0 )
	{
		char_from_room( ch );
	}
	for ( MR = lvnum; MR <= uvnum; MR++ )
	{
		if ( type == 0 )
		{
			if ( ( room = get_room_index( MR ) ) )
			{
				sprintf( log_buf, "{R%-5d  {w%-20s\n\r", room->vnum, room->name );
				send_to_char( log_buf, ch );
				char_to_room( ch, room );
				char_from_room( ch );
			}
		}
		if ( type == 2 )
		{
			if ( ( obj = get_obj_index( MR ) ) )
			{
				sprintf( log_buf, "{R%-5d  {w%-20s\n\r",  obj->vnum, obj->name );
				send_to_char( log_buf, ch );
			}
		}
		if ( type == 1 )
		{
			if ( ( mob = get_mob_index( MR ) ) )
			{
				sprintf( log_buf, "{R%-5d  {w%-20s\n\r", mob->vnum, mob->player_name );
				send_to_char( log_buf, ch );
			}
		}
		if ( type == 3 )
		{
			if ( ( mob = get_mob_index( MR ) ) )
			{
			}
		}  
	}
	if ( type == 0 )
		char_to_room( ch, in_room );
	return;
}

void do_qspell(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *vch;
	char arg[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	DESCRIPTOR_DATA *d;

	argument = one_argument(argument,arg);

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


	if ( !str_cmp( arg, "world" ) && (ch->level >= 1))
	{
		for ( d = descriptor_list; d != NULL; d = d->next )
		{
			if ( d->connected == CON_PLAYING
				&&   d->character != ch
				&&   d->character->in_room != NULL
				&&   can_see( ch, d->character ) )
			{                                                      
				sprintf( buf, "%s %s", d->character->name, arg );
				do_qspell( ch, buf );
			}
		}
		return;
	}
	if (str_cmp("room",arg))
	{
		if ((vch = get_char_world(ch,arg)) == NULL)
		{ 
			send_to_char("They aren't here.\n\r",ch);
			return;
		}
	}
	else
		vch = ch; 

	if (!str_cmp("room",arg))
		for (vch = ch->in_room->people;vch;vch = vch->next_in_room)
		{
			if (vch == ch)
				continue;
			if (IS_NPC(vch))
				continue;
			spell_fireshield(skill_lookup("fireshield"),ch->level,ch,vch,TARGET_CHAR);
			spell_shield(skill_lookup("shield"),ch->level,ch,vch,TARGET_CHAR);
			spell_armor(skill_lookup("armor"),ch->level,ch,vch,TARGET_CHAR);
			spell_sanctuary(skill_lookup("sanctuary"),ch->level,ch,vch,TARGET_CHAR);
			spell_fly(skill_lookup("fly"),ch->level,ch,vch,TARGET_CHAR);
			spell_frenzy(skill_lookup("frenzy"),ch->level,ch,vch,TARGET_CHAR);
			spell_giant_strength(skill_lookup("giant strength"),ch->level,ch,vch,TARGET_CHAR);
			spell_bless(skill_lookup("bless"),ch->level,ch,vch,TARGET_CHAR);
			spell_haste(skill_lookup("haste"),ch->level,ch,vch,TARGET_CHAR);
		}
	else
	{
		spell_fireshield(skill_lookup("fireshield"),ch->level,ch,vch,TARGET_CHAR);
		spell_shield(skill_lookup("shield"),ch->level,ch,vch,TARGET_CHAR);
		spell_armor(skill_lookup("armor"),ch->level,ch,vch,TARGET_CHAR);
		spell_sanctuary(skill_lookup("sanctuary"),ch->level,ch,vch,TARGET_CHAR);
		spell_fly(skill_lookup("fly"),ch->level,ch,vch,TARGET_CHAR);
		spell_frenzy(skill_lookup("frenzy"),ch->level,ch,vch,TARGET_CHAR);
		spell_giant_strength(skill_lookup("giant strength"),ch->level,ch,vch,TARGET_CHAR);
		spell_bless(skill_lookup("bless"),ch->level,ch,vch,TARGET_CHAR);
		spell_haste(skill_lookup("haste"),ch->level,ch,vch,TARGET_CHAR);
	}
	return;
}  

int colorstrlen(char *argument)
{
	char *str;
	int strlength;

	if (argument == NULL || argument[0] == '\0')
		return 0;

	strlength = 0;
	str = argument;

	while (*str != '\0')
	{
		if ( *str != '{' ) 
		{						
			str++;
			strlength++;
			continue;
		}

		if (*(++str) == '{')
			strlength++;

		str++;
	}
	return strlength;
}

void do_immtitle(CHAR_DATA *ch, char *argument)
{
	if (argument[0] == '\0')
	{
		ch->immtitle = NULL;
		send_to_char("Immtitle cleared.\n\r", ch);
		return;
	}

	if (colorstrlen(argument) > 16) /*   On my mud it's set to 16, 
									because on my who screen, I
									want the brackets exactly 16
									spaces apart to keep it all even
									Change to fit your needs.*/

	{
		send_to_char("Immtitle must be 16 (or under) characters long.\n\r", ch);
		return;
	}

	ch->immtitle = str_dup(argument);
	send_to_char("Immtitle set.\n\r", ch);
}

void do_vorpal_flag( CHAR_DATA *ch, char *argument )
{
	stc("Command removed\n\r",ch);
	return;
}


void do_addapply(CHAR_DATA *ch, char *argument)
{
	OBJ_DATA *obj;
	AFFECT_DATA *paf,*af_new;
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char arg3[MAX_INPUT_LENGTH];
	int affect_modify = 0, bit = 0, enchant_type, pos, i;

	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 for applies: addapply <object> <apply type> <value>\n\r",ch);
		send_to_char("Apply Types: hp str dex int wis con sex mana\n\r", ch);
		send_to_char("             ac move hitroll damroll saves\n\r\n\r", ch);
		send_to_char("Syntax for affects: addapply <object> affect <affect name>\n\r",ch);
		send_to_char("Affect Names: blind invisible detect_evil detect_invis detect_magic\n\r",ch);
		send_to_char("              detect_hidden detect_good sanctuary faerie_fire infrared\n\r",ch);
		send_to_char("              curse poison protect_evil protect_good sneak hide sleep charm\n\r", ch);
		send_to_char("              flying pass_door haste calm plague weaken dark_vision berserk\n\r", ch);
		send_to_char("              swim regeneration slow\n\r", ch);
		send_to_char("Affects availible include the ones you add too!\n\r", ch);
		return;
	}

	obj = get_obj_world(ch,arg1);

	if (obj == NULL)
	{
		send_to_char("No such object exists!\n\r",ch);
		return;
	}

	if (!str_prefix(arg2,"hp"))
		enchant_type=APPLY_HIT;
	else if (!str_prefix(arg2,"str"))
		enchant_type=APPLY_STR;
	else if (!str_prefix(arg2,"dex"))
		enchant_type=APPLY_DEX;
	else if (!str_prefix(arg2,"int"))
		enchant_type=APPLY_INT;
	else if (!str_prefix(arg2,"wis"))
		enchant_type=APPLY_WIS;
	else if (!str_prefix(arg2,"con"))
		enchant_type=APPLY_CON;
	/*  else if (!str_prefix(arg2,"sex"))
	enchant_type=APPLY_SEX;
	*/
	else if (!str_prefix(arg2,"mana"))
		enchant_type=APPLY_MANA;
	else if (!str_prefix(arg2,"move"))
		enchant_type=APPLY_MOVE;
	else if (!str_prefix(arg2,"ac"))
		enchant_type=APPLY_AC;
	else if (!str_prefix(arg2,"hitroll"))
		enchant_type=APPLY_HITROLL;
	else if (!str_prefix(arg2,"damroll"))
		enchant_type=APPLY_DAMROLL;
	else if (!str_prefix(arg2,"saves"))
		enchant_type=APPLY_SAVING_SPELL;
	else if (!str_prefix(arg2,"affect"))
		enchant_type=APPLY_SPELL_AFFECT;
	else
	{
		send_to_char("That apply is not possible!\n\r",ch);
		return;
	}

	if (enchant_type==APPLY_SPELL_AFFECT)
	{
		for (pos = 0; affect_flags[pos].name != NULL; pos++)
			if (!str_cmp(affect_flags[pos].name,arg3))
				bit = affect_flags[pos].bit;
	}
	else
	{
		if ( is_number(arg3) )
			affect_modify=atoi(arg3);	
		else
		{
			send_to_char("Applies require a value.\n\r", ch);
			return;
		}
	}

	if (!obj->enchanted)
	{
		obj->enchanted = TRUE;

		for (paf = obj->pIndexData->affected; paf != NULL; paf = paf->next)
		{
			if (affect_free == NULL)
				af_new = alloc_perm(sizeof(*af_new));
			else
			{
				af_new = affect_free;
				affect_free = affect_free->next;
			}

			af_new->next = obj->affected;
			obj->affected = af_new;
			af_new->type        = UMAX(0,paf->type);
			af_new->level       = paf->level;
			af_new->duration    = paf->duration;
			af_new->location    = paf->location;
			af_new->modifier    = paf->modifier;
			af_new->bitvector   = paf->bitvector;
		}
	}

	if (affect_free == NULL)
		paf = alloc_perm(sizeof(*paf));
	else
	{
		paf = affect_free;
		affect_free = affect_free->next;
	}

	paf->type 	= -1;
	paf->level      = ch->level;
	paf->duration   = -1;
	paf->location   = enchant_type;
	paf->modifier   = affect_modify;
	paf->bitvector  = bit;

	if (enchant_type==APPLY_SPELL_AFFECT)
	{
		/* Quick hack to make table compatible with skill_lookup */

		for ( i=0 ; arg3[i] != '\0'; i++ )
		{
			if ( arg3[i] == '_' )
				arg3[i] = ' ';
		}

		paf->type 		= skill_lookup(arg3);
		paf->where		= TO_AFFECTS;
		paf->modifier	= 0;	
	}

	paf->next       = obj->affected;
	obj->affected   = paf;

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

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

	if (IS_SET(ch->act,PLR_CODING))
	{
		send_to_char("Coding Flag mode removed. Type 'replay' to see tells.\n\r",ch);
		REMOVE_BIT(ch->act,PLR_CODING);
		sprintf(buf,"{W%s stops coding",ch->name);
		do_info(ch,buf,ch);
	}
	else
	{
		send_to_char("You are now in Coding mode.\n\r",ch);
		SET_BIT(ch->act,PLR_CODING);
		sprintf(buf,"{W%s begins coding{x",ch->name);
		do_info(ch,buf,ch);
	}
}


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

	one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		send_to_char( "Remote View whose score?\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( "It's much more efficient to just type 'score'\n\r", ch );
		return;
	}

	if ( IS_NPC(victim) )
	{
		stc("You cannot remote view a mobile's score.\n\r",ch);
		return;
	}

	send_to_char("{G---------------------------------------------------------------------------------{x\n\r", ch);
	sprintf( buf,
		"{xName: {W%s{x			{xLevel: {W%d{x			{xAge: {W%d (%d hours){x.\n\r",
		victim->name,
		victim->level, get_age(victim),
		( victim->played + (int) (current_time - victim->logon) ) / 3600);
	send_to_char( buf, ch );

	if ( is_clan(victim) )
	{
		sprintf( buf, "{xClan: {W%s			{xRank: {W%s%s\n\r",
			player_clan(victim), player_rank(victim),
			IS_SET(victim->act,PLR_MORTAL_LEADER)? "{D({WLeader{D){x" : "");
		send_to_char(buf, ch);
	}

	if ( get_trust( victim ) != victim->level )
	{
		sprintf( buf, "{x%s is trusted at level {W%d{x.\n\r",
			victim->name,
			get_trust( victim ) );
		send_to_char( buf, ch );
	}

	sprintf(buf,
		"{xRace: {W%s			{xSex: {W%s			{xClass: {W%s{x\n\r",
		race_table[victim->race].name,
		victim->sex == 0 ? "sexless" : victim->sex == 1 ? "male" : "female",
		IS_NPC(victim) ? "mobile" : class_table[victim->class].name);
	send_to_char(buf,ch);


	sprintf( buf,
		"{xHit Points: {G%ld{W/{G%ld		{xMana: {G%d{W/{G%d		{xMoves: {G%d{W/{G%d{x\n\r",
		victim->hit,  victim->max_hit,
		victim->mana, victim->max_mana,
		victim->move, victim->max_move);
	send_to_char( buf, ch );

	sprintf( buf,
		"{xPracs: {W%d			{xTrains: {W%d			{xSkill Points: {W%ld{x\n\r",
		victim->practice, victim->train,victim->pcdata->sp);
	send_to_char( buf, ch );

	sprintf( buf,
		"{xItems: {W%d/%d			{xWeight: {W%ld/%d{x\n\r",
		victim->carry_number, can_carry_n(victim),
		get_carry_weight(victim) / 10, can_carry_w(victim) /10 );
	send_to_char( buf, ch );

	sprintf( buf,
		"{xStr: {W%d{D({W%d{D)	{xInt: {W%d{D({W%d{D)	{xWis: {W%d{D({W%d{D)	{xDex: {W%d{D({W%d{D)	{xCon: {W%d{D({W%d{D){x\n\r",
		victim->perm_stat[STAT_STR],
		get_curr_stat(victim,STAT_STR),
		victim->perm_stat[STAT_INT],
		get_curr_stat(victim,STAT_INT),
		victim->perm_stat[STAT_WIS],
		get_curr_stat(victim,STAT_WIS),
		victim->perm_stat[STAT_DEX],
		get_curr_stat(victim,STAT_DEX),
		victim->perm_stat[STAT_CON],
		get_curr_stat(victim,STAT_CON) );
	send_to_char( buf, ch );

	sprintf( buf,
		"{xExp: {W%d	{yGold: {W%ld		{wSilver: {W%ld	{xBank: {W%ld{x\n\r",
		victim->exp,  victim->gold, victim->silver, victim->balance );
	send_to_char( buf, ch );
	if (victim->level >= LEVEL_HERO && !IS_NPC(victim))
	{
		sprintf( buf,"{xHero's Exp: {W%ld{x\n\r",victim->pcdata->hero_exp);
		send_to_char(buf,ch);
	}

	if (!IS_NPC(victim))
	{
		if (victim->countdown > 0)
		{
			sprintf( buf, "{xQuest Points: {W%d\t\t{xQuest Time Left: {W%d{x\n\r", victim->questpoints, victim->countdown);
			send_to_char(buf,ch);
		}

		else
		{
			sprintf( buf, "{xQuest Points: {W%d\t\t{xTill Next Quest: {W%d{x\n\r", victim->questpoints, victim->nextquest);
			send_to_char(buf,ch);
		}
	}
	/* RT shows exp to level */
	if (!IS_NPC(victim) && victim->level < LEVEL_HERO)
	{
		sprintf (buf, 
			"{xExp to level:{W %d{x\n\r",
			((ch->level + 1) * exp_per_level(ch,ch->pcdata->points) - ch->exp));
		send_to_char( buf, ch );
	}

	sprintf( buf, "Wimpy set to {W%d{x hit points.\n\r", victim->wimpy );
	send_to_char( buf, ch );

	if ( !IS_NPC(victim) && victim->pcdata->condition[COND_DRUNK]   > 10 )
		send_to_char( "They are drunk.\n\r",   ch );
	if ( !IS_NPC(victim) && victim->pcdata->condition[COND_THIRST] ==  0 )
		send_to_char( "They are thirsty.\n\r", ch );
	if ( !IS_NPC(victim) && victim->pcdata->condition[COND_HUNGER]   ==  0 )
		send_to_char( "They are hungry.\n\r",  ch );

	switch ( victim->position )
	{
	case POS_DEAD:     
		send_to_char( "They are DEAD!!\n\r",		ch );
		break;
	case POS_MORTAL:
		send_to_char( "They are mortally wounded.\n\r",	ch );
		break;
	case POS_INCAP:
		send_to_char( "They are incapacitated.\n\r",	ch );
		break;
	case POS_STUNNED:
		send_to_char( "They are stunned.\n\r",		ch );
		break;
	case POS_SLEEPING:
		send_to_char( "They are sleeping.\n\r",		ch );
		break;
	case POS_RESTING:
		send_to_char( "They are resting.\n\r",		ch );
		break;
	case POS_SITTING:
		send_to_char( "They are sitting.\n\r",		ch );
		break;
	case POS_STANDING:
		send_to_char( "They are standing.\n\r",		ch );
		break;
	case POS_FIGHTING:
		send_to_char( "They are fighting.\n\r",		ch );
		break;
	}


	/* print AC values */
	if (victim->level >= 25)
	{	
		sprintf( buf,"{x(AC) {xPierce: {W%d  {xBash: {W%d  {xSlash: {W%d  {xExotic: {W%d{x\n\r",
			GET_AC(victim,AC_PIERCE),
			GET_AC(victim,AC_BASH),
			GET_AC(victim,AC_SLASH),
			GET_AC(victim,AC_EXOTIC));
		send_to_char(buf,ch);
	}




	/* RT wizinvis and holy light */
	if ( IS_IMMORTAL(victim))
	{
		send_to_char("Holy Light: ",ch);
		if (IS_SET(victim->act,PLR_HOLYLIGHT))
			send_to_char("{Won{x",ch);
		else
			send_to_char("{Woff{x",ch);

		if (victim->invis_level)
		{
			sprintf( buf, "  Invisible: level {W%d{x",victim->invis_level);
			send_to_char(buf,ch);
		}

		if (ch->incog_level)
		{
			sprintf(buf,"  Incognito: level {W%d{x",ch->incog_level);
			send_to_char(buf,ch);
		}
		send_to_char("\n\r",ch);
	}

	{
		sprintf( buf, "{xHitroll: {W%d  {xDamroll: {W%d{x.\n\r",
			GET_HITROLL(victim), GET_DAMROLL(victim) );
		send_to_char( buf, ch );
	}

	if (!IS_NPC(victim))
	{
		sprintf( buf, "{xArena Record: {W%d-%d\t\t{xHonor Circle Record {W%d-%d{x\n\r",
			victim->pcdata->arena_wins,victim->pcdata->arena_losses,
			victim->pcdata->hc_wins,victim->pcdata->hc_losses);
		send_to_char( buf, ch );
	}
	/*begin vres printing*/
	send_to_char("{G+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{x\n\r", ch);
	send_to_char("{WResistances:{x\n\r", ch);
	sprintf(buf, "	{CCold	{W%2d	{WHoly	{W%2d	{bBash	{W%2d	{CMagic	{W%2d	{cSound	{W%2d{x\n\r",
		victim->vres_cold, victim->vres_holy, victim->vres_bash, victim->vres_magic, victim->vres_sound);
	send_to_char(buf,ch);
	sprintf(buf, "	{RFire	{W%2d	{YLtning	{W%2d	{gPoison	{W%2d	{RWeapon	{W%2d{x\n\r",
		victim->vres_fire, victim->vres_lightning, victim->vres_poison, victim->vres_weapon);
	send_to_char(buf,ch);
	sprintf(buf, "	{GAcid	{W%2d	{mPierce	{W%2d	{rEnergy	{W%2d	{MMental	{W%2d{x\n\r",
		victim->vres_acid, victim->vres_pierce, victim->vres_energy, victim->vres_mental);
	send_to_char(buf,ch);
	sprintf(buf, "	{DNeg	{W%2d	{cSlash	{W%2d	{yDisease	{W%2d	{YLight	{W%2d{x\n\r",
		victim->vres_negative, victim->vres_slash, victim->vres_disease, victim->vres_light);	
	send_to_char(buf,ch);
	send_to_char("{G+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{x\n\r", ch);
	/*end vres printing*/
	{
		sprintf( buf, "Alignment: {W%d{x.  ", victim->alignment );
		send_to_char( buf, ch );
	}

	send_to_char( "They are ", ch );
	if ( victim->alignment >  900 ) send_to_char( "angelic.\n\r", ch );
	else if ( victim->alignment >  700 ) send_to_char( "saintly.\n\r", ch );
	else if ( victim->alignment >  350 ) send_to_char( "good.\n\r",    ch );
	else if ( victim->alignment >  100 ) send_to_char( "kind.\n\r",    ch );
	else if ( victim->alignment > -100 ) send_to_char( "neutral.\n\r", ch );
	else if ( victim->alignment > -350 ) send_to_char( "mean.\n\r",    ch );
	else if ( victim->alignment > -700 ) send_to_char( "evil.\n\r",    ch );
	else if ( victim->alignment > -900 ) send_to_char( "demonic.\n\r", ch );
	else                             send_to_char( "satanic.\n\r", ch );
	send_to_char("{G---------------------------------------------------------------------------------{x\n\r", ch);
}

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



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


	if (arg[0] == '\0')
	{
		send_to_char("Syntax:\n\r",ch);
		send_to_char("  adjust char   <name> <field> <value>\n\r",ch);
		send_to_char("  adjust global <name> <field> <value>\n\r",ch);
		return;
	}

	if (!str_prefix(arg,"character"))
	{
		value = is_number( arg4 ) ? atoi( arg4 ) : -1;
		if ( arg2[0] == '\0' || arg3[0] == '\0' || arg4[0] == '\0' )
		{
			send_to_char("Syntax:\n\r",ch);
			send_to_char("  adjust char <name> <field> <value>\n\r",ch); 
			send_to_char( "  Field being one of:\n\r",			ch );
			send_to_char( "    qp tnq qtl heroexp\n\r",	ch );
			return;
		}

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

		if ( !str_cmp( arg3, "qp" ) )
		{
			add_qp(victim, value);
			sprintf(buf,"{WYou have {Gadjusted {W%s's {CQP's {Wby {Y%d{x.\n\r",victim->short_descr, value);
			send_to_char(buf,ch);
			return;
		}

		if ( !str_cmp( arg3, "tnq" ) )
		{
			victim->nextquest = (victim->nextquest + value);
			sprintf(buf,"{WYou have {Gadjusted {W%s's {RTNQ {Wby {Y%d{x.\n\r",victim->short_descr, value);
			send_to_char(buf,ch);
			return;
		}

		if ( !str_cmp( arg3, "qtl" ) )
		{
			victim->countdown =(victim->countdown + value);
			sprintf(buf,"{WYou have {Gadjusted {W%s's {BQTL {Wby {Y%d{x.\n\r",victim->short_descr, value);
			send_to_char(buf,ch);
			return;
		}
		if ( !str_cmp( arg3, "heroexp" ) )
		{
			victim->pcdata->hero_exp = (victim->pcdata->hero_exp + value);
			sprintf(buf,"{WYou have {Gadjusted {W%s's {MHero Exp {Wby {Y%d{x.\n\r",victim->short_descr, value);
			send_to_char(buf,ch);
			return;
		}
		else
		{
			send_to_char("Syntax:\n\r",ch);
			send_to_char("  adjust char   <name> <field> <value>\n\r",ch);
			send_to_char("  adjust global <name> <field> <value>\n\r",ch);
			return;
		}
	}

	if (!str_prefix(arg,"global"))
	{
		value = is_number( arg3 ) ? atoi( arg3 ) : -1;
		if ( arg2[0] == '\0' || arg3[0] == '\0' )
		{
			send_to_char("Syntax:\n\r",ch);
			send_to_char("  adjust global <name> <field> <value>\n\r",ch); 
			send_to_char( "  Field being one of:\n\r",			ch );
			send_to_char( "    prize wartime\n\r",	ch );
			return;
		}
		if ( !str_cmp( arg2, "prize" ) )
		{
			warprize = (warprize + value);
			sprintf(buf,"{WYou have {Gadjusted {Wthe {Yprize {Wby {Y%d{x.\n\r", value);
			send_to_char(buf,ch);
			sprintf(buf, "{WWarprize has been adjusted by {G%s{x", ch->short_descr);
			do_wartalk(ch,buf);
			sprintf(buf, "{WWarprize is up to {B%d{x", warprize);
			do_wartalk(ch,buf);
			return;
		}
		if ( !str_cmp( arg2, "wartime" ) )
		{
			time_left = (time_left + value);
			sprintf(buf,"{WYou have {Gadjusted {Wthe {Ctime till war starts {Wby {c%d{W.{x\n\r", value);
			send_to_char(buf,ch);
			return;
		}
		else
		{
			send_to_char("Syntax:\n\r",ch);
			send_to_char("  adjust global <name> <field> <value>\n\r",ch); 
			send_to_char( "  Field being one of:\n\r",			ch );
			send_to_char( "    prize wartime\n\r",	ch );
			return;
		}
	}
}

void do_unanti(CHAR_DATA *ch, char * argument)		
{
	OBJ_DATA *obj;
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	argument = one_argument(argument,arg1);
	argument = one_argument( argument, arg2 );

	obj = get_obj_world(ch,arg1);

	if ( arg1[0] == '\0' || arg2[0] == '\0' )
	{
		send_to_char("Syntax: unanit <item> <align>",ch);
		return;
	}

	if (obj == NULL)
	{
		send_to_char("No such object exists!\n\r",ch);
		return;
	}

	if ( !str_cmp( arg2, "neutral" ) )
	{
		if ( IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL) )
		{
			REMOVE_BIT(obj->extra_flags,ITEM_ANTI_NEUTRAL);
			act("$p glows a neutral gray",ch,obj,NULL,TO_ALL);
			return;
		}
		else
		{
			send_to_char("Item is not anti-neutral",ch);
			return;
		}
	}


	if ( !str_cmp( arg2, "evil" ) )
	{
		if ( IS_OBJ_STAT(obj, ITEM_ANTI_EVIL) )
		{
			REMOVE_BIT(obj->extra_flags,ITEM_ANTI_EVIL);
			act("$p glows an evil red",ch,obj,NULL,TO_ALL);
			return;
		}
		else
		{
			send_to_char("Item is not anti-evil",ch);
			return;
		}
	}

	if ( !str_cmp( arg2, "good" ) )
	{
		if ( IS_OBJ_STAT(obj, ITEM_ANTI_GOOD) )
		{
			REMOVE_BIT(obj->extra_flags,ITEM_ANTI_GOOD);
			act("$p glows a goodly blue",ch,obj,NULL,TO_ALL);
			return;
		}
		else
		{
			send_to_char("Item is not anti-good",ch);
			return;
		}
	}

	else
	{
		send_to_char("Syntax: unanit <item> <align>",ch);
		return;
	}

}


void do_fix_vres( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char arg[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	int iWear = 0;

	one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		send_to_char( "Fix whose vres?\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->level) > (ch->level))
	{
		send_to_char( "I don't think they would like that very much",ch);
		return;
	}


	for ( iWear = 0; iWear < MAX_WEAR; iWear++ )
	{
		OBJ_DATA *obj;
		if ( ( obj = get_eq_char( victim, iWear ) ) != NULL )
		{
			remove_obj( victim, obj->wear_loc, TRUE );
		}
	}

	victim->vres_cold		= 0;
	victim->vres_fire		= 0;
	victim->vres_acid		= 0;
	victim->vres_negative	= 0;
	victim->vres_holy		= 0;
	victim->vres_lightning	= 0;
	victim->vres_pierce		= 0;
	victim->vres_slash		= 0;
	victim->vres_bash		= 0;
	victim->vres_poison		= 0;
	victim->vres_energy		= 0;
	victim->vres_disease	= 0;
	victim->vres_magic		= 0;
	victim->vres_weapon		= 0;
	victim->vres_mental		= 0;
	victim->vres_light		= 0;
	victim->vres_sound		= 0;
	sprintf(buf,"You have fixed %s's vres data\n\r",victim->name);
	send_to_char(buf,ch);
	sprintf(buf,"%s has fixed your vres data\n\r",ch->name);
	send_to_char(buf,victim);
	return;
}

void do_treboot( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	char buf[MSL];
	int	value;

	one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		send_to_char( "Set the Timed Reboot to what?\n\r", ch );
		return;
	}

	if (!is_number(arg))
	{
		send_to_char("Use a number argument please",ch);
		return;
	}

	value = is_number( arg ) ? atoi( arg ) : -1;
	if (value >= 1)
	{
		reboot_time = (value);
		sprintf(buf,"You have set the time to reboot to %d\n\r",reboot_time);
		send_to_char(buf,ch);
		is_timed_reboot = TRUE;
		save_guilds();
		save_guilds_new();
		return;
	}

	if (value <=0)
	{
		reboot_time = -1;
		sprintf(buf,"You have just stopped the timed reboot\n\r");
		send_to_char(buf,ch);
		is_timed_reboot = FALSE;
		return;
	}
	return;
}

void timed_reboot( void )
{
	extern bool merc_down;
	DESCRIPTOR_DATA *d;
	CHAR_DATA *vch;

	if (!is_timed_reboot)
		return;


	else
		merc_down = TRUE;
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
		vch = d->original ? d->original : d->character;
		if (vch != NULL && !IS_NPC(vch))
		{
			send_to_char("The {Mg{ma{Mm{me {Mc{mu{Mb{me{x comes slamming down, as Enzo strides forth ready to battle the forces of the {RC{Do{Rd{De{x\n\r",vch);
			send_to_char("{WEnzo{x taps the {BG{wu{Wa{Br{wd{Wi{Ba{Wn{x {RI{Wn{Gs{Ri{Wg{Gn{Ri{Wa{x on his chest twice, and says loudly {W'{YREBOOT{G!!{W'{x\n\r",vch);
		}
		close_socket(d);
	}
	return;
}

void reboot_update( )
{
	char buf[MAX_STRING_LENGTH];
	DESCRIPTOR_DATA *d;

	if ( reboot_time <=  -1 )
		return;

	if (reboot_time == 0)
	{
		timed_reboot();
		return;
	}

	if ( (is_timed_reboot) && (reboot_time >= 1))
	{
		for ( d = descriptor_list; d; d = d->next )
		{
			{
				sprintf(buf,"You have %d ticks till reboot is started",reboot_time);
				reboot_channel(buf);
			}
			reboot_time --;
			return;
		}
		return;
	}
	return;

}


void reboot_channel( char * msg )
{
	char buf[MAX_STRING_LENGTH];
	DESCRIPTOR_DATA *d;

	sprintf(buf, "\n\r{D[{RWARNING{D]{c {Y%s\n\r", msg ); /* Add color if you wish */

	for ( d = descriptor_list; d != NULL; d = d->next )
	{
		CHAR_DATA *victim;

		victim = d->original ? d->original : d->character;
		{
			send_to_char( buf, victim );
		}
	}

	return;
}

void do_mud_sound ( CHAR_DATA *ch, char * argument)
{
	if (IS_SET(ch->act,PLR_CODING))
	{
		send_to_char("You will no longer hear the mud sounds\n\r",ch);
		return;
	}
	else
	{
		send_to_char("You will now hear mud sounds\n\r",ch);
		return;
	}
}

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

	for( i = 0; i < MAX_CLASS; i++ )
	{
		sprintf( buf, "../data/class/%s.class\n\r", class_table[i].name );
		stc(buf,ch);
		sprintf( buf, "Name %s~\n\r", class_table[i].name );
		stc(buf,ch);
		sprintf( buf, "WhoN %s\n\r", class_table[i].who_name );
		stc(buf,ch);
		sprintf( buf, "Remort? %d\n\r", class_table[i].remort_class );
		stc(buf,ch);
	}

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

void do_quest_status( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	OBJ_INDEX_DATA *questinfoobj;
	MOB_INDEX_DATA *questinfo;
	char arg[MSL];
	char buf[MSL];
	one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		send_to_char( "Check who's quest status?\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_SET(victim->act, PLR_QUESTOR))
	{
		sprintf(buf,"%s isn't currently on a quest.\n\r",victim->name);
		stc(buf,ch);
		return;
	}

	else
	{
		if (victim->questmob == -1 && victim->questgiver->short_descr != NULL)
		{
			sprintf(buf, "%s's quest is ALMOST complete!\n\r",victim->name,victim->questgiver->short_descr);
			send_to_char(buf, ch);
			return;
		}
		else if (victim->questobj > 0)
		{
			questinfoobj = get_obj_index(ch->questobj);
			if (questinfoobj != NULL)
			{
				sprintf(buf, "%s is on a quest to recover the fabled %s!\n\r",victim->name,questinfoobj->short_descr);
				send_to_char(buf, ch);
			}
			else
			{
				sprintf(buf,"%s isn't currently on a quest.\n\r",victim->name);
				stc(buf,ch);
			}
			return;
		}
		else if (victim->questmob > 0)
		{
			questinfo = get_mob_index(victim->questmob);
			if (questinfo != NULL)
			{
				sprintf(buf, "%s are on a quest to slay the dreaded %s!\n\r",victim->name,questinfo->short_descr);
				send_to_char(buf, ch);
			}
			else
			{
				sprintf(buf,"%s isn't currently on a quest.\n\r",victim->name);
				stc(buf,ch);
			}
			return;
		}
	}
}

void do_addvrespoi( CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim;
	char arg1[MSL];
	char arg2[MSL];
	char arg3[MSL];
	char buf[MSL];
	int amount1;
	int amount2;

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

	amount1 = atoi(arg2);
	amount2 = atoi(arg3);

	if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
	{
		send_to_char( "Incorrect syntax\n\r", ch );
		return;
	}

	if ((!is_number(arg2)) || (!is_number(arg3)))
	{
		send_to_char( "Arg2 and Arg3 must be numbers\n\r", ch );
		return;
	}


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


	victim->vres_poison += amount1 + amount2;
	sprintf( buf, "%d added to %s's vres poison",amount1+amount2,victim->name);
	stc( buf,ch);
	return;
}

void do_weapon_list( CHAR_DATA *ch, char *argument)
{
	char buf[MSL];
	char arg[MSL];
	AREA_DATA *pArea;
	OBJ_INDEX_DATA *obj;
	int value;
	long x;

	argument = one_argument( argument, arg );

	if ( is_number( arg ) )
	{
		value = atoi( arg );
		if ( !( pArea = get_area_data( value ) ) )
		{
			send_to_char( "That area vnum does not exist.\n\r", ch );
			return;
		}

		for( x = pArea->min_vnum; x <= pArea->max_vnum; x++)
		{
			if ( ( obj = get_obj_index( x ) )
				&& (obj->item_type == ITEM_WEAPON)
				&& (!IS_WEAPON_STAT(obj,WEAPON_TWO_HANDS))
				&& (!IS_WEAPON_STAT(obj,WEAPON_OFF_HAND)))
			{
				sprintf( buf, "{R%-5d  {w%-20s\n\r",  obj->vnum, obj->name );
				send_to_char(buf, ch );
			}
		}
		stc("Begning DUALITY search\n\r",ch);
		for( x = pArea->min_vnum; x <= pArea->max_vnum; x++)
		{
			if ( ( obj = get_obj_index( x ) )
				&& (obj->item_type == ITEM_WEAPON)
				&& IS_WEAPON_STAT(obj,WEAPON_DOMINANT_HAND)
				&& IS_WEAPON_STAT(obj,WEAPON_OFF_HAND))
			{
				sprintf(buf,"{MDUALITY:{x%s {Wvnum {Y%d",obj->short_descr,obj->vnum);
				stc(buf,ch);
			}
		}
		return;
	}
	else
	{
		stc("Argument was not a number, or something else went wrong",ch);
		return;
	}
}

void do_copy_area( CHAR_DATA *ch, char *argument)
{
	char buf[MSL];
	char arg1[MSL];
	char areapri_upper[MSL], areapri_lower[MSL], areatar_upper[MSL], areatar_lower[MSL];
	int pri_upper;
	int pri_lower;
	int tar_upper;
	int tar_lower;

	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, areapri_lower );
	argument = one_argument( argument, areapri_upper );
	argument = one_argument( argument, areatar_lower );
	argument = one_argument( argument, areatar_upper );

	if ( arg1[0] == '\0'
		|| areapri_upper == '\0'
		|| areapri_lower == '\0'
		|| areatar_upper == '\0'
		|| areatar_lower == '\0')
	{
		stc( "Arguments must be as follows: copy-area <type> <a1l> <a1u> <a2l> <a2u>\n\r", ch );
		stc( "                              <type> is mob, obj, room, specials, resets, or shops\n\r",ch);
		stc( "								<a1u> is primary area upper vnum\n\r",ch);
		stc( "								<a1l> is primary area lower vnum\n\r",ch);
		stc( "                              <a2u> is target area upper vnum\n\r",ch);
		stc( "                              <a2l> is target area lower vnum\n\r",ch);
		return;
	}

	if (strcmp(arg1,"mob")
		&& strcmp(arg1, "obj")
		&& strcmp(arg1, "room")
		&& strcmp(arg1, "specials")
		&& strcmp(arg1, "resets")
		&& strcmp(arg1, "shops"))
	{
		stc("First argument must be mob, obj, room, specials, resets, or shops\n\r",ch);
		return;
	}
	if (!is_number(areapri_upper)
		|| !is_number(areapri_lower)
		|| !is_number(areatar_upper)
		|| !is_number(areatar_lower))
	{
		stc("<a1u> <a1l> <a2u> and <a2l> must all be numbers\n\r",ch);
		return;
	}

	pri_lower = atoi(areapri_lower);
	pri_upper = atoi(areapri_upper);
	tar_lower = atoi(areatar_lower);
	tar_upper = atoi(areatar_upper);

	if( pri_upper <= pri_lower || tar_upper <= tar_lower )
	{
		stc("Lower vnums must be smaller than upper vnums",ch);
		return;
	}
	if (!strcmp(arg1,"mob"))
	{
		copy_mob(ch,pri_lower,pri_upper,tar_lower,tar_upper,pri_lower,tar_lower);
		sprintf(buf,"Mobs from [%d-%d] copied to [%d-%d]",
			pri_lower, pri_upper,
			tar_lower, tar_upper);
		return;
	}
	if (!strcmp(arg1,"obj"))
	{
		copy_obj(ch,pri_lower,pri_upper,tar_lower,tar_upper,pri_lower,tar_lower);
		sprintf(buf,"Mobs from [%d-%d] copied to [%d-%d]",
			pri_lower, pri_upper,
			tar_lower, tar_upper);
		return;
	}
	if (!strcmp(arg1,"room"))
	{
		copy_room(ch,pri_lower,pri_upper,tar_lower,tar_upper,pri_lower,tar_lower);
		sprintf(buf,"Mobs from [%d-%d] copied to [%d-%d]",
			pri_lower, pri_upper,
			tar_lower, tar_upper);
		return;
	}
	if (!strcmp(arg1,"reset"))
	{
		copy_resets(ch,pri_lower,pri_upper,tar_lower,tar_upper,pri_lower,tar_lower);
		sprintf(buf,"Mobs from [%d-%d] copied to [%d-%d]",
			pri_lower, pri_upper,
			tar_lower, tar_upper);
		return;
	}
	if (!strcmp(arg1,"special"))
	{
		copy_special(ch,pri_lower,pri_upper,tar_lower,tar_upper,pri_lower,tar_lower);
		sprintf(buf,"Mobs from [%d-%d] copied to [%d-%d]",
			pri_lower, pri_upper,
			tar_lower, tar_upper);
		return;
	}
	if (!strcmp(arg1,"shops"))
	{
		copy_shops(ch,pri_lower,pri_upper,tar_lower,tar_upper,pri_lower,tar_lower);
		sprintf(buf,"Mobs from [%d-%d] copied to [%d-%d]",
			pri_lower, pri_upper,
			tar_lower, tar_upper);
		return;
	}
	stc( "Arguments must be as follows: copy-area <type> <a1l> <a1u> <a2l> <a2u>\n\r", ch );
	stc( "                              <type> is mob, obj, room, specials, resets, or shops\n\r",ch);
	stc( "								<a1u> is primary area upper vnum\n\r",ch);
	stc( "								<a1l> is primary area lower vnum\n\r",ch);
	stc( "                              <a2u> is target area upper vnum\n\r",ch);
	stc( "                              <a2l> is target area lower vnum\n\r",ch);
	return;
}

void copy_mob(CHAR_DATA *ch,int pri_lower,int pri_upper,int tar_lower,int tar_upper,int on1, int on2)
{
	MOB_INDEX_DATA *mob1;
	MOB_INDEX_DATA *mob2;
	char create_num[MSL];

	stc("Copying mobs...",ch);
	if(on1 >= pri_lower 
		&& on1 <= pri_upper 
		&& on2 >= tar_lower 
		&& on2 <= tar_upper)
	{
		if( ( mob1 = get_mob_index( on1 ) ) != NULL )
		{
			PROG_LIST *pMprog1;
			PROG_LIST *pMprog2;

			sprintf(create_num,"%d",on2);
			medit_create( ch, create_num );
			interpret( ch, "done" );
			mob2 = get_mob_index( on2 );

			mob2->player_name			= mob1->player_name;
			mob2->short_descr			= mob1->short_descr;
			mob2->long_descr			= str_dup( mob1->long_descr );
			mob2->description			= str_dup( mob1->description );
			mob2->race					= mob1->race;
			mob2->act					= mob1->act;
			mob2->affected_by			= mob1->affected_by;
			mob2->affected2_by			= mob1->affected2_by;
			mob2->alignment				= mob1->alignment;
			mob2->group					= mob1->group;
			mob2->level					= mob1->level;
			mob2->hitroll				= mob1->hitroll;
			mob2->hit[DICE_NUMBER]		= mob1->hit[DICE_NUMBER]; 
			mob2->hit[DICE_TYPE]		= mob1->hit[DICE_TYPE];
			mob2->hit[DICE_BONUS]		= mob1->hit[DICE_BONUS];
			mob2->mana[DICE_NUMBER]		= mob1->mana[DICE_NUMBER];
			mob2->mana[DICE_TYPE]		= mob1->mana[DICE_TYPE];
			mob2->mana[DICE_BONUS]		= mob1->mana[DICE_BONUS];
			mob2->damage[DICE_NUMBER]	= mob1->damage[DICE_NUMBER];
			mob2->damage[DICE_TYPE]		= mob1->damage[DICE_TYPE];
			mob2->damage[DICE_BONUS]	= mob1->damage[DICE_BONUS];
			mob2->dam_type				= mob1->dam_type;
			mob2->ac[AC_PIERCE]			= mob1->ac[AC_PIERCE];
			mob2->ac[AC_BASH]			= mob1->ac[AC_BASH]; 
			mob2->ac[AC_SLASH]			= mob1->ac[AC_SLASH];
			mob2->ac[AC_EXOTIC]			= mob1->ac[AC_EXOTIC];
			mob2->off_flags				= mob1->off_flags;
			mob2->teach_flags			= mob1->teach_flags;
			mob2->imm_flags				= mob1->imm_flags;
			mob2->res_flags				= mob1->res_flags;
			mob2->vuln_flags			= mob1->vuln_flags;
			mob2->start_pos				= mob1->start_pos;
			mob2->default_pos			= mob1->default_pos;
			mob2->sex					= mob1->sex;
			mob2->wealth				= mob1->wealth;
			mob2->form					= mob1->form;
			mob2->parts					= mob1->parts;
			mob2->size					= mob1->size;
			mob2->material				= mob1->material;

			if (mob1->clan)  /* Feydrex - For clan hall guards */
				mob2->clan = mob1->clan;

			for (pMprog1 = mob1->mprogs; pMprog1; pMprog1 = pMprog1->next)
			{
				pMprog2					= mob2->mprogs;
				pMprog2->trig_type		= pMprog1->trig_type;
				pMprog2->vnum			= pMprog1->vnum;
				pMprog2->trig_phrase	= pMprog1->trig_phrase;
			}

		}
		on1 ++;
		on2 ++;
		copy_mob(ch,pri_lower,pri_upper,tar_lower,tar_upper,on1,on2);
	}
	return;
}

void copy_obj(CHAR_DATA *ch,int pri_lower,int pri_upper,int tar_lower,int tar_upper,int on1, int on2)
{
	OBJ_INDEX_DATA *obj1;
	OBJ_INDEX_DATA *obj2;
	char create_num[MSL];

	stc("Copying objects...",ch);
	if(on1 >= pri_lower 
		&& on1 <= pri_upper 
		&& on2 >= tar_lower 
		&& on2 <= tar_upper)
	{
		if( ( obj1 = get_obj_index( on1 ) ) != NULL )
		{
			sprintf(create_num,"%d",on2);
			oedit_create( ch, create_num );
			obj2 = get_obj_index( on2 );
			obj2->name					= obj1->name;
			obj2->short_descr			= obj1->short_descr;
			obj2->orig_short			= obj1->orig_short;
			obj2->description			= str_dup( obj1->description );
			obj2->material				= obj1->material;
			obj2->item_type				= obj1->item_type;
			obj2->extra_flags			= obj1->extra_flags;
			obj2->wear_flags			= obj1->wear_flags;
			obj2->value[0]				= obj1->value[0];
			obj2->value[1]				= obj1->value[1];
			obj2->value[2]				= obj1->value[2];
			obj2->value[3]				= obj1->value[3];
			obj2->value[4]				= obj1->value[4];
			obj2->level					= obj1->level;
			obj2->weight				= obj1->weight;
			obj2->cost					= obj1->cost;
			obj2->condition				= obj1->condition;
			obj2->affected				= obj1->affected;
			obj2->extra_descr			= obj1->extra_descr;
			obj2->oprogs				= obj1->oprogs;
		}
		on1 ++;
		on2 ++;
		copy_obj(ch,pri_lower,pri_upper,tar_lower,tar_upper,on1,on2);
	}
	return;
}
void copy_room(CHAR_DATA *ch,int pri_lower,int pri_upper,int tar_lower,int tar_upper,int on1, int on2)
{
	ROOM_INDEX_DATA *room1;
	ROOM_INDEX_DATA *room2;
	long door;
	char create_num[MSL];

	stc("Copying rooms...",ch);
	if(on1 >= pri_lower 
		&& on1 <= pri_upper 
		&& on2 >= tar_lower 
		&& on2 <= tar_upper)
	{
		if( ( room1 = get_room_index( on1 ) ) != NULL )
		{
			sprintf(create_num,"%d",on2);
			redit_create( ch, create_num );
			room2 = get_room_index( on2 );
			room2->name					= room1->name;
			room2->description			= str_dup( room1->description );
			room2->room_flags			= room1->room_flags;
			room2->sector_type			= room1->sector_type;
			for( door = 0; door < MAX_DIR; door++ )	/* I hate this! */
			{
				room2->exit[door]			= room1->exit[door];
				room2->mana_rate			= room1->mana_rate;
				room2->heal_rate			= room1->heal_rate;
			}
			if (room1->clan > 0)
				room2->clan					=room1->clan;		     
			if (!IS_NULLSTR(room1->owner))
				room2->owner				= room1->owner;
			room2->rprogs					=room1->rprogs;
		}
		on1 ++;
		on2 ++;
		copy_room(ch,pri_lower,pri_upper,tar_lower,tar_upper,on1,on2);
	}
	return;
}
void copy_resets(CHAR_DATA *ch,int pri_lower,int pri_upper,int tar_lower,int tar_upper,int on1, int on2)
{
	stc("Copy the resets in the area file yourself\n\r",ch);
	return;
}
void copy_special(CHAR_DATA *ch,int pri_lower,int pri_upper,int tar_lower,int tar_upper,int on1, int on2)
{
	stc("Copy the specials in the area file yourself\n\r",ch);
	return;
}
void copy_shops(CHAR_DATA *ch,int pri_lower,int pri_upper,int tar_lower,int tar_upper,int on1, int on2)
{
	stc("Copy the shops in the area file yourself\n\r",ch);
	return;
}

void	do_calc_cache( CHAR_DATA *ch, char *argument)
{
	char buf[MSL];
	double qp_to_cp = 0.01;
	double gold_to_cp = 0.00001;
	char arg[MSL];
	int clan;
	CLAN_DATA *pClan;
	long subtracted_qp;
	long subtracted_gold;
	long cps_from_gold;
	long cps_from_qp;

	argument = one_argument(argument, arg);
	if(!is_number(arg))
	{
		stc("Argument must be a number",ch);
		return;
	}
	clan = atoi( arg );
	pClan = get_clan_data( clan );
	if (pClan->name[0] == '\0')
	{
		stc("That guild doesnt exist",ch);
		return;
	}
	cps_from_qp = pClan->qp * qp_to_cp;
	cps_from_gold = pClan->gold * gold_to_cp;
	pClan->clan_points += (cps_from_gold + cps_from_qp);
	subtracted_qp = (cps_from_qp / qp_to_cp);
	subtracted_gold = (cps_from_gold / gold_to_cp);
	sprintf(buf,"You just added %d cps to the %s\n\r",
		(cps_from_gold + cps_from_qp),
		pClan->who_name);
	stc(buf,ch);
	pClan->qp -= subtracted_qp;
	pClan->gold -= subtracted_gold;
	sprintf(buf,"You have just subtracted %d QP and %d gold from %s's cache\n\r",
		subtracted_qp,
		subtracted_gold,
		pClan->who_name);
	stc(buf,ch);
	return;
}

void do_check_teach( 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( "Find whom?\n\r", ch );
		return;
	}

	fAll	= FALSE; /* !str_cmp( arg, "all" ); */
	found	= FALSE;
	nMatch	= 0;

	/*
	* Yeah, so iterating over all vnum's takes 10,000 loops.
	*/
	for ( vnum = 0; nMatch < top_mob_index; vnum++ )
	{
		if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
		{
			nMatch++;
			if ( fAll || IS_SET(pMobIndex->teach_flags, TEACH_DRACONIAN_2 ))
			{
				found = TRUE;
				sprintf( buf, "[%5d] %s\n\r",
					pMobIndex->vnum, pMobIndex->short_descr );
				send_to_char( buf, ch );
			}
		}
	}

	if ( !found )
		send_to_char( "No mobiles by that name.\n\r", ch );

	return;
}
/*
* Append a string to a file.
*/
void append_new_test( char *file, char *str )
{
	FILE *fp;

	fclose( fpReserve );
	if ( ( fp = fopen( file, "a" ) ) == NULL )
	{
		perror( file );
	}
	else
	{
		fprintf( fp, "%s\n", str );
		fclose( fp );
	}

	fpReserve = fopen( NULL_FILE, "r" );
	return;
}

void do_debug( CHAR_DATA *ch, char *argument )
{
	stc("Hello Eric!\n\r",ch);
	if(IS_SET(ch->wiznet,WIZ_DEBUG))
	{
		REMOVE_BIT(ch->wiznet,WIZ_DEBUG);
		stc("Your debug outputs have been halted (debug to toggle)\n\r",ch);
		return;
	}
	if(!IS_SET(ch->wiznet,WIZ_DEBUG))
	{
		SET_BIT(ch->wiznet,WIZ_DEBUG);
		stc("You have been set for debug mode (debug to toggle).\n\r",ch);
		return;
	}
	return;
}