dawn/notes/
dawn/src/
dawn/src/docs/
/**************************************************************************/
// act_wiz.cpp - immortal commands
/***************************************************************************
 * The Dawn of Time v1.69r (c)1997-2004 Michael Garratt                    *
 * >> A number of people have contributed to the Dawn codebase, with the   *
 *    majority of code written by Michael Garratt - www.dawnoftime.org     *
 * >> To use this source code, you must fully comply with all the licenses *
 *    in licenses.txt... In particular, you may not remove this copyright  *
 *    notice.                                                              *
 ***************************************************************************
 * >> Original Diku Mud copyright (c)1990, 1991 by Sebastian Hammer,       *
 *    Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, & Katja Nyboe.   *
 * >> Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael       *
 *    Chastain, Michael Quan, and Mitchell Tse.                            *
 * >> ROM 2.4 is copyright 1993-1995 Russ Taylor and has been brought to   *
 *    you by the ROM consortium: Russ Taylor(rtaylor@pacinfo.com),         *
 *    Gabrielle Taylor(gtaylor@pacinfo.com) & Brian Moore(rom@rom.efn.org) *
 * >> Oblivion 1.2 is copyright 1996 Wes Wagner                            *
 **************************************************************************/


#include "include.h" // dawn standard includes
#include "olc.h"
#include "nanny.h"
#include "msp.h"
#include "magic.h"

// this section is for the global debugging in do_owhere() and do_mwhere()
#include "db.h"
extern int                     nAllocString;
extern int                     sAllocString;
extern int                     nAllocPerm;
extern int                     sAllocPerm;
int rename(const char *oldfname, const char *newfname);
char *fwrite_flag( long flags, char buf[] );
void forced_interpret( char_data *ch, char *argument );

/* command procedures needed */
DECLARE_DO_FUN(do_rstat		);
DECLARE_DO_FUN(do_mstat		);
DECLARE_DO_FUN(do_ostat		);
DECLARE_DO_FUN(do_rset		);
DECLARE_DO_FUN(do_mset		);
DECLARE_DO_FUN(do_oset		);
DECLARE_DO_FUN(do_sset		);
DECLARE_DO_FUN(do_resetlu	);
DECLARE_DO_FUN(do_mfind		);
DECLARE_DO_FUN(do_ofind		);
DECLARE_DO_FUN(do_slookup	);
DECLARE_DO_FUN(do_mload		);
DECLARE_DO_FUN(do_oload		);
DECLARE_DO_FUN(do_force		);
DECLARE_DO_FUN(do_forcetick );
DECLARE_DO_FUN(do_quit      );
DECLARE_DO_FUN(do_save		);
DECLARE_DO_FUN(do_look		);
DECLARE_DO_FUN(do_stand		);
DECLARE_DO_FUN(do_count     );

char *get_weapontype(OBJ_DATA *obj); // prototype - handler.c
void laston_save	(char_data *);			// laston.c 
void dismount     args( ( char_data *) );	// act_move.c
void send_zmudmap_to_char(char_data *ch);

void laston_update_char(char_data *ch);

//char *full_affect_loc_name( AFFECT_DATA *paf);
/*
 * Local functions.
 */

/**************************************************************************/
void flush_cached_write_to_buffer(connection_data *d);
long wiznet_level_mask[MAX_LEVEL+2];
/**************************************************************************/
void wiznet(char *string, char_data *ch, OBJ_DATA *obj,
		 long flag, long flag_skip, int min_level)
{
    connection_data *d;
	static bool generate_wiznet_level_table = true;

	if(generate_wiznet_level_table){
		// wiznet_level_mask[] system used for when an imm has 
		// wiznet flags on settings above their level.
		memset(wiznet_level_mask, 0, sizeof(wiznet_level_mask));
		for(int wi= 0; !IS_NULLSTR(wiznet_table[wi].name); wi++){
			for(int wl=ABSOLUTE_MAX_LEVEL; wl>=wiznet_table[wi].level; wl--){
				SET_BIT(wiznet_level_mask[wl], wiznet_table[wi].flag);
			}
		}
		generate_wiznet_level_table=false;
	}

	// silently will allow higher level imms to hide 
	// wiz_questing messages from lower level imms
	if (IS_SET(WIZ_QUESTING,flag) && TRUE_CH(ch))
	{
		if (IS_SILENT(ch))
		{
			min_level = get_trust(ch);
		}
	}


#ifdef MEM_DEBUG
	if (log_memory){
		if (IS_SET(WIZ_MEMCHECK,flag))
		{
			logf(string);
		}
	}
#endif

    for ( d = connection_list; d; d = d->next )
    {
        if (d->connected_state == CON_PLAYING
			&&  IS_IMMORTAL(CH(d))
			&&  get_trust(CH(d)) >= min_level
			&&  d->character!=ch)
		{
			int t;
			for(t=0; t<4;t++){ // check till we find a matching flag
				if(t==0 && (ch==NULL || !IS_IMMORTAL(ch))){
					continue;
				}
				if(IS_SET(CH(d)->wiznet[t],WIZ_ON)) {
					if( ( !flag || IS_SET( (CH(d)->wiznet[t] & wiznet_level_mask[get_trust(CH(d))]),flag) )
						&& ( !flag_skip || !IS_SET(CH(d)->wiznet[t],flag_skip) )
					  )
					{
						break;
					}
				}
			}
			if(t==4){ // didn't find a match for this person
				continue;
			}else{
				int prevtop;
				flush_cached_write_to_buffer(d);
				prevtop=d->outtop;
			
				if (IS_SET(CH(d)->wiznet[t],WIZ_SHOWCHANNEL)){
					if(IS_NULLSTR(CH(d)->wiznet_colour[t])){
						d->character->printf("--%s--%s--> ",
							shorttime(NULL), 
							flag_string( wiznet_flags, flag));
					}else{
						d->character->printf("`#%s--%s--%s-->`^ ", 
							CH(d)->wiznet_colour[t], 							 
							shorttime(NULL),
							flag_string( wiznet_flags, flag));
					}
				}else{
					if(IS_NULLSTR(CH(d)->wiznet_colour[t])){
						d->character->printf("--%s--> ", 
							shorttime(NULL));
					}else{
						d->character->printf("`#%s--%s-->`^ ", 
							CH(d)->wiznet_colour[t], shorttime(NULL));
					}
				}

				act_new(string,d->character,obj,ch,TO_CHAR,POS_DEAD);
				d->character->print("`x");
			}
        }
    }

    if (IS_SET(WIZ_SECURE,flag)){
        append_datetimestring_to_file( SECURE_FILE, string);
    }   
 
    return;
}

/**************************************************************************/
void do_send( char_data *ch, char *argument )
{
    char buf[MSL], arg1[MIL], arg2[MIL];
    char_data *victim;

    if (!IS_IMMORTAL(ch) && !IS_NEWBIE_SUPPORT(ch))
    {
		do_huh(ch,"");
		return;
    }

    // keep a track of what newbie support is doing 
    if (IS_NEWBIE_SUPPORT(ch))
    {
        append_newbie_support_log(ch, argument);
    }
        
    argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );

    if(arg1[0] == '\0' || arg2[0] == '\0')
	{
        ch->println("SEND - sends the newbie document to a player.");
        ch->println("Syntax: send charname <email address>");
        return;
	}

    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
        ch->println("That character isn't online.");
        return;
    }

	if(IS_NPC(victim))
	{ 
        ch->println("*bonk self* You can't send the newbie doc to a NPC!.");
		return;
	}

    sprintf(buf,"mail %s -s \"New player document\" < documents/newbie.txt &", arg2);
	system(buf);

    ch->printlnf("Newbie document sent to (%s) %s.", victim->name, arg2);

    sprintf(buf,"%s sent \"%s\"<%s> the newbie document.", TRUE_CH(ch)->name, victim->name, arg2);
    append_datetimestring_to_file (SENDLOG_FILE, buf);

    return;
}

/**************************************************************************/
void do_short( char_data *ch, char *argument)
{
	char_data *victim;
	char arg[MIL];
	char oarg[MSL];

	sprintf( oarg,"%s", argument);
	
	argument = one_argument( argument, arg );
	
	if(IS_NULLSTR(arg)){
		ch->println("Syntax: short <playername> a short description for the player");
		ch->println("This command is used to set short descriptions.");
		return;
	}
	
	if(str_len(arg)<3){
		ch->println("You must use more than 2 characters to specify players name.");
		return;
	}

    if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL )
    {
		if ( ( victim = get_char_world( ch, arg ) ) == NULL )
		{
			ch->println("They aren't here.");
			return;
		}
	}

    // trim the spaces to the right of the short
    while ( !IS_NULLSTR(argument) && is_space(argument[str_len(argument)-1]))
    {
        argument[str_len(argument)-1]='\0';
    }

    // check we have a short left 
    if(IS_NULLSTR(argument)){
        ch->println("You must put in a short description.");
        return;
	}

    // make sure first char is lowercase, if the short description isn't the name
	if(str_cmp(argument, victim->name)){
		argument[0] = LOWER(argument[0]);
	}

    if ((get_trust(victim)>= get_trust(ch))&& (ch != victim))
        ch->println("You can't set a short of someone a higher level or equal to you.");
    else
    {
		// questing wiznet
		if (TRUE_CH(ch))
		{
			char qbuf[MSL];
			sprintf (qbuf, "`mQUEST> %s short %s`x\r\n", 
				TRUE_CH(ch)->name, oarg); 
			wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
		}

        // inform the imm and the room victim is in 
        ch->wraplnf("You have changed %s's short description from '%s' to '%s'.",
			victim->name, victim->short_descr, argument);

        act( "$n is now known as '$T'", victim, NULL, argument, TO_ROOM );

        // change the short 
        replace_string(victim->short_descr, argument);
		
        victim->wraplnf("Your short description has been changed to '%s' by %s.",
			victim->short_descr, can_see_who(victim, ch)?ch->name:"a mystery imm");

        if (str_len(argument)>55){
			ch->wrapln( "That short descriptions is LONG... it has been set anyway..."
				"but consider the length when setting a short." );
		}
    }

    save_char_obj( victim );
	return;
}

/**************************************************************************/
void do_page (char_data *ch, char *argument)
{
    char_data *victim;
	connection_data *c;

			
    if (IS_NULLSTR(argument))
    {
        ch->println( "Page which name from the who list/which connection number in sockets?" );
        return; 
    }

	if(is_number(argument)){
		int desc;
		desc = atoi(argument);
    	for ( c = connection_list; c; c = c->next )
    	{
			
			if ( c->connected_socket == desc )
			{
				
				ch->printlnf( "Paging connection %d (%s).", 
					desc, CH(c)?CH(c)->name:"???");
				c->write("\7\7\7You are being PAGED!!!\7\7\7\r\n",0);
            	return;
			}
		}
		ch->printlnf( "No one with the connection number %d was found to page.", desc);
		return;
	}

    if ((victim=get_whovis_player_world(ch, argument))==NULL){
        ch->printlnf( "You can't find any '%s' to page.", argument);
        return;
    }

	if(can_see(ch, victim)){
		ch->printlnf( "Paging %s.", PERS(victim, ch));
	}else{
		ch->printlnf( "Paging %s.", victim->name);
	}
    ACTIVE_CH(victim)->print( "\7\7\7" );
    ACTIVE_CH(victim)->printlnf( "You are being paged by %s!!!", PERS(TRUE_CH(ch), victim));
    ACTIVE_CH(victim)->println( "\a" );
}

/**************************************************************************/
void do_norp( char_data *ch, char *argument )
{
	char arg[MIL],buf[MSL];
	char_data *victim;

	one_argument( argument, arg );

	if ( arg[0] == '\0' )
    {
		ch->println( "Norp whom?" );
		return;
	}

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        ch->println( "They aren't here." );
        return;
    }

    if ( IS_NPC(victim) )
    {
        ch->println( "Not on NPC's." );
        return;
    }
    if ( get_trust( victim ) >= get_trust( ch ) )
    {
        ch->println( "You failed." );
		return;
	}

    if ( IS_SET(victim->act, PLR_NORP) )
    {
        REMOVE_BIT(victim->act, PLR_NORP);
        victim->println( "You may get RP EXP again." );
        ch->println( "NORP removed." );
        sprintf(buf,"$N allows %s RP XP again.",victim->name);
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
    }
    else
    {
        SET_BIT(victim->act, PLR_NORP);
		ch->println( "NORP set." );
        sprintf(buf,"$N gives %s the dreaded NORP.",victim->name);
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
    }

    save_char_obj( victim );
    return;
}
/**************************************************************************/
void wiznet_index( int index, char_data *ch, char *argument )
{
	int flag, col=0;
    char buf[MSL], buf2[MSL];
	
	char wiznet_name[MIL];
	switch(index){
	case 0: sprintf(wiznet_name,"immwiznet"); break;
	case 1: sprintf(wiznet_name,"wiznet"); break;
	case 2: sprintf(wiznet_name,"wiznet2"); break;
	case 3: sprintf(wiznet_name,"wiznet3"); break;
	default:
		sprintf(wiznet_name,"UNKNOWN WIZNET INDEX %d", index); break;		
	}
	
	
    if ( IS_NULLSTR(argument) ) // display status 
    {
        buf[0] = '\0';
        strcat(buf,"   ---=========== Current ");
		strcat(buf, capitalize(wiznet_name));
		strcat(buf," Settings ===========---\r\n");
		
        for (flag = 1; wiznet_table[flag].name != NULL; flag++)
        {
            if (wiznet_table[flag].level <= get_trust(ch))
            {
                sprintf(buf2,"      %-15s %s",wiznet_table[flag].name,
					(IS_SET(TRUE_CH(ch)->wiznet[index],wiznet_table[flag].flag)?"on   ":"off  "));
                strcat(buf,buf2);
                col++;
                if (col%2==0){
                    strcat(buf,"\r\n");
				}
				
            }
        }
        if (IS_SET(TRUE_CH(ch)->wiznet[index],WIZ_ON)){
            strcat(buf,"\r\n      (You currently have this wiznet active)\r\n");
        }else{
            strcat(buf,"\r\n       (You currently have this wiznet OFF)\r\n");
        }
        ch->printf("%s",buf);
		if(IS_NULLSTR(TRUE_CH(ch)->wiznet_colour[index])){
			sprintf(buf,       "        %s colour prefix is unset.\r\n", wiznet_name);
		}else{
			sprintf(buf,       "        %s colour prefix is set to '%s'\r\n", wiznet_name, 
				TRUE_CH(ch)->wiznet_colour[index]);
		}
		ch->printbw(buf);
		
        return;
	}
	
    if (!str_prefix(argument,"on"))
    {
		if(index){
			ch->printlnf("Welcome to Wiznet%d!", index);
		}else{
			ch->println("Welcome to ImmWiznet!");
		}
        SET_BIT(TRUE_CH(ch)->wiznet[index],WIZ_ON);
        return;
    }
	
    if (!str_prefix(argument,"off"))
    {
		if(index){
		    ch->printlnf("Signing off of Wiznet%d.", index);
		}else{
	        ch->println("Signing off of ImmWiznet.");
		}
        REMOVE_BIT(TRUE_CH(ch)->wiznet[index],WIZ_ON);
        return;
    }
    flag = wiznet_lookup(argument);
	
    if (flag == -1 || get_trust(ch) < wiznet_table[flag].level)
    {
		ch->println("No such option.");
		return;
    }
	
    if (IS_SET(ch->wiznet[index],wiznet_table[flag].flag))
    {
		ch->printlnf("You will no longer see %s on %s.", 
			wiznet_table[flag].name, wiznet_name);
		REMOVE_BIT(TRUE_CH(ch)->wiznet[index],wiznet_table[flag].flag);
		return;
    }
	else
	{
		ch->printlnf("You will now see %s on %s.", 
			wiznet_table[flag].name, wiznet_name);
		SET_BIT(TRUE_CH(ch)->wiznet[index],wiznet_table[flag].flag);
		return;
	}
}
/**************************************************************************/
void wiznet_colourindex( int index, char_data *ch, char *argument )
{
	if(!IS_NULLSTR(TRUE_CH(ch)->wiznet_colour[index])){
		free_string(TRUE_CH(ch)->wiznet_colour[index]);
	}
	smash_tilde( argument);
	TRUE_CH(ch)->wiznet_colour[index]=str_dup(argument);

	char wiznet_name[MIL];
	switch(index){
	case 0: sprintf(wiznet_name,"immwiznet"); break;
	case 1: sprintf(wiznet_name,"wiznet"); break;
	case 2: sprintf(wiznet_name,"wiznet2"); break;
	case 3: sprintf(wiznet_name,"wiznet3"); break;
	default:
		sprintf(wiznet_name,"UNKNOWN WIZNET INDEX %d", index); break;		
	}

	char buf[MSL];
	sprintf(buf,"%s colour prefix set to '%s'\r\n", wiznet_name, argument);
	ch->printbw(buf);
	ch->println("Note, you dont have to put only colour codes in the prefix.");	
}
/**************************************************************************/
void do_immwiznet( char_data *ch, char *argument )
{
	wiznet_index(0, ch, argument);
}
/**************************************************************************/
void do_wiznet( char_data *ch, char *argument )
{
	wiznet_index(1, ch, argument);
}
/**************************************************************************/
void do_wiznet2( char_data *ch, char *argument )
{
	wiznet_index(2, ch, argument);
}
/**************************************************************************/
void do_wiznet3( char_data *ch, char *argument )
{
	wiznet_index(3, ch, argument);
}
/**************************************************************************/
void do_immwiznetc( char_data *ch, char *argument )
{
	wiznet_colourindex(0, ch, argument);
}
/**************************************************************************/
void do_wiznetc( char_data *ch, char *argument )
{
	wiznet_colourindex(1, ch, argument);
}
/**************************************************************************/
void do_wiznet2c( char_data *ch, char *argument )
{
	wiznet_colourindex(2, ch, argument);
}
/**************************************************************************/
void do_wiznet3c( char_data *ch, char *argument )
{
	wiznet_colourindex(3, ch, argument);
}
/**************************************************************************/
void do_wiznetdefault( char_data *ch, char *argument )
{
	if(IS_NPC(ch)){
		ch->println("Players only.");
		return;
	}
	if(IS_NULLSTR(argument)){
		ch->println("Wiznetdefault - sets a default setting of wiznet flags.");
		ch->println("syntax: '`=Cwiznetdefault confirm`x'");
		return;
	}

	if ( str_cmp("confirm", argument)) {
		ch->wrapln("You must confirm your intention to overwrite your "
			"wiznet settings with the default settings.");
		do_wiznetdefault(ch,"");
		return;
	}

	ch->wiznet_colour[0]=str_dup("`R###IMM###"); // immortal
	ch->wiznet[0]= WIZ_ON | WIZ_LOGINS	| WIZ_SITES	| WIZ_LINKS | WIZ_SECURE 
				       | WIZ_SNOOPS | WIZ_AUTOON | WIZ_SHOWCHANNEL | WIZ_QUESTING;
	ch->wiznet_colour[1]=str_dup("`S`#");
	ch->wiznet[1]= WIZ_ON | WIZ_LOGINS	| WIZ_SITES	| WIZ_LINKS | WIZ_DEATHS 
		                  | WIZ_FLAGS	| WIZ_THEFTS| WIZ_LEVELS| WIZ_SECURE 
						  | WIZ_SNOOPS	| WIZ_AUTOON| WIZ_NEWBIE| WIZ_SHOWCHANNEL
						  | WIZ_BUGS	| WIZ_WHISPERS | WIZ_NOHELP | WIZ_QUESTING
						  | WIZ_PRAYERS_DREAMS;
	ch->wiznet_colour[2]=str_dup("`S`#");	
	ch->wiznet[2]= WIZ_LEVELS | WIZ_SHOWCHANNEL;
	ch->wiznet_colour[3]=str_dup("");	
	ch->wiznet[3]=0;
	ch->println("Default wiznet settings applied to immwiznet, wiznet1, wiznet2 and wiznet3.");
	ch->println("(this includes wiznet colours prefixes).");
}

/**************************************************************************/
/* RT nochannels command, for those spammers */
void do_nochannels( char_data *ch, char *argument )
{
    char arg[MIL], buf[MSL];
	char_data *victim;
 
	// can only be used by imms or those with permission
	if (  !IS_IMMORTAL(ch) 
		&& !IS_SET(ch->comm, COMM_CANNOCHANNEL) 
		&& !(ch->pcdata && ch->pcdata->immtalk_name))
	{
		do_huh(ch,"");
		return;
	}
	
	one_argument( argument, arg );
 
    if ( IS_NULLSTR(arg))
	{
        ch->println( "Nochannel whom?" );
        return;
    }
 
    if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL )
    {
        ch->println( "They aren't here." );
        return;
    }
 
    // can't nochannel high level imms than yourself
	if ( victim!= ch && 
		get_trust( victim ) >= LEVEL_IMMORTAL 
		&& get_trust( victim ) >= get_trust( ch ) )
    {
        ch->println( "You failed." );
        return;
    }
 
    if ( IS_SET(victim->comm, COMM_NOCHANNELS) )
    {
        REMOVE_BIT(victim->comm, COMM_NOCHANNELS);
		logf("nochannel removed on %s by %s", victim->name, ch->name);
        victim->println( "The gods have restored your channel priviliges." );
        ch->println( "NOCHANNELS removed." );
		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);
		logf("nochannel added on %s by %s", victim->name, ch->name);
        victim->println( "The gods have revoked your channel priviliges." );
        ch->printlnf("NOCHANNELS set on %s.", victim->name);

		if (!IS_SET(victim->act, PLR_LOG))
		{
			SET_BIT(victim->act, PLR_LOG);
			sprintf( buf, "(nochannel) Player log turned ON by %s", ch->name);
			append_playerlog( victim, buf);
			if (IS_IMMORTAL(ch) &&
				(get_trust( victim ) < LEVEL_IMMORTAL
				|| IS_ADMIN(ch)) )
			{
				ch->printlnf("PLAYERLOG turned on %s.", victim->name);
			}
		}
		sprintf(buf,"$N revokes %s's channels.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
    }
 
    return;
}


/**************************************************************************/
void do_bamfin( char_data *ch, char *argument )
{
	if ( !IS_NPC(ch) )
	{
		smash_tilde( argument );
		if (argument[0] == '\0')
		{
			ch->printlnf("Your poofin is %s",ch->pcdata->bamfin);
			return;
		}

		free_string( ch->pcdata->bamfin );
		ch->pcdata->bamfin = str_dup( argument );
        
		ch->printlnf("Your poofin is now %s",ch->pcdata->bamfin);
	}
	return;
}

/**************************************************************************/
void do_bamfout( char_data *ch, char *argument )
{
	if ( !IS_NPC(ch) )
	{
		smash_tilde( argument );
		if (argument[0] == '\0')
		{
			ch->printlnf("Your poofout is %s",ch->pcdata->bamfout);
			return;
		}

		free_string( ch->pcdata->bamfout );
		ch->pcdata->bamfout = str_dup( argument );
		ch->printlnf("Your poofout is now %s",ch->pcdata->bamfout);
	}
	return;
}

/**************************************************************************/
void do_chardescript( char_data *ch, char *argument )
{
	char_data *victim;
	char arg[MIL];

    if (!IS_IMMORTAL(ch) && !IS_NEWBIE_SUPPORT(ch))
    {
		do_huh(ch,"");
		return;	
    }

    // keep a track of what newbie support is doing 
    if (IS_NEWBIE_SUPPORT(ch))
    {
        append_newbie_support_log(ch, argument);
    }

	argument = one_argument( argument, arg );

	if(IS_NULLSTR(arg)){
        ch->println( "Syntax: chardesc <player|mobname>" );
        return;
	}

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        ch->println( "They aren't here." );
        return;
    }

    if (!IS_TRUSTED(ch,MAX_LEVEL-4) && !IS_NPC(victim) 
		&& IS_LETGAINED(victim)
		&& IS_TRUSTED(victim,20))
    {
        ch->println( "Sorry, you can't set a long description of a player who is letgained.  Get an admin immortal to do it." );
        return;
    }

    if (IS_NEWBIE_SUPPORT(ch) && IS_NPC(victim))
    {
        ch->println( "Sorry, you can't set the long description on a mob." );
        return;
    }


    if ((get_trust(victim)>= get_trust(ch))&& (ch != victim))
    {
        ch->println( "You can't set a long description of someone a higher level or equal to you." );
        return;
    }

    string_append(ch, &victim->description);
	ch->printlnf("Editing the long description of %s", PERS(victim, ch));
    return;
}


/**************************************************************************/
void do_deny( char_data *ch, char *argument )
{
	char arg[MIL],buf[MSL];
	char_data *victim;

	one_argument( argument, arg );
	
	if ( arg[0] == '\0' )
	{
		ch->println( "Deny whom?" );
		return;
	}

	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
	}

	if ( IS_NPC(victim) )
	{
		ch->println( "Not on NPC's." );
		return;
	}

	if ( get_trust( victim ) >= get_trust( ch ) )
	{
		ch->println( "You failed." );
		return;
	}

	SET_BIT(victim->act, PLR_DENY);
	victim->println( "You are denied access!" );
	sprintf(buf,"$N denies access to %s",victim->name);
	wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	ch->println( "OK." );
    save_char_obj(victim);
    stop_fighting(victim,true);
    do_quit( victim, "" );

    return;
}


/**************************************************************************/
void do_disconnect( char_data *ch, char *argument )
{
    char arg[MIL];
    connection_data *c, *c_next;
    char_data *victim;

    one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		ch->println( "Disconnect whom?" );
		return;
	}

	if (is_number(arg))
	{
		int desc;

		desc = atoi(arg);
		
		for ( c = connection_list; c; c = c->next )
		{
			if ( c->connected_socket == desc )
			{
				connection_close( c );
				ch->println( "Ok." );
				return;
			}
		}
	}

    if ( ( victim = get_char_world( ch, arg ) ) == NULL ){
		ch->println( "They aren't here." );
		return;
	}

	if ( victim->desc == NULL )
	{
		ch->printlnf( "%s doesn't have a descriptor.", victim->name );
		return;
    }

    for ( c = connection_list; c; c = c_next )
    {
		c_next = c->next;
		if ( c == victim->desc )
		{
			if (get_trust(ch) <= get_trust(victim))
			{
				ch->println( "Maybe that wasn't a good idea..." );
				victim->printlnf( "%s tried to diconnect you!", ch->name );
				return;
			}

			connection_close( c );
			ch->println( "Ok." );
			return;
		}
    }

    bug("Do_disconnect: desc not found.");
    ch->println( "Descriptor not found!" );
    return;
}


/**************************************************************************/
void do_gecho( char_data *ch, char *argument )
{
    connection_data *d;
    
    if ( argument[0] == '\0' )
    {
		ch->println( "Global echo what?" );
		return;
    }

	// questing wiznet
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s gecho '%s'`x", ch->name, argument);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}
    
    for ( d = connection_list; d; d = d->next )
    {
		if ( d->connected_state == CON_PLAYING )
		{
			if (get_trust(d->character) >= get_trust(ch))
				d->character->print( "global> " );

			d->character->printlnf( "%s`x", argument );
		}
	}

    return;
}

/**************************************************************************/
void do_goecho( char_data *ch, char *argument )
{
    connection_data *d;
    
    if ( argument[0] == '\0' )
    {
		ch->println( "Global outdoors echo what?" );
		return;
    }

	// questing wiznet
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s goecho '%s'`x", ch->name, argument);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}
    
    for ( d = connection_list; d; d = d->next )
    {
		if ( d->connected_state == CON_PLAYING )
		{
			if (IS_OUTSIDE(d->character) && IS_AWAKE(d->character))
			{
				if ( d->character->in_room->sector_type == SECT_CAVE )
					continue;
				if (get_trust(d->character) >= get_trust(ch))
					d->character->print( "globaloutdoors> " );
				
				d->character->printlnf( "%s`x", argument );
			}
		}
	}

    return;
}

/**************************************************************************/
void do_echo( char_data *ch, char *argument )
{
    connection_data *d;
    
    if ( argument[0] == '\0' )
    {
		ch->println( "Local echo what?" );
		return;
    }

	// questing wiznet
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s echo ('%s' [%d]) %s`x", ch->name, 
			ch->in_room->name, ch->in_room->vnum, argument);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}


    for ( d = connection_list; d; d = d->next )
    {
		if ( d->connected_state == CON_PLAYING
		&&   d->character->in_room == ch->in_room )
		{
			if (get_trust(d->character) >= get_trust(ch))
				d->character->print( "local> " );
			
			d->character->printlnf( "%s`x", argument );
		}
    }

    return;
}

/**************************************************************************/
void do_zecho(char_data *ch, char *argument)
{
    connection_data *d;

    if (argument[0] == '\0')
    {
		ch->println( "Zone echo what?" );
		return;
    }

	// questing wiznet
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s zecho (%s) %s`x", 
			ch->name, ch->in_room->area->name, argument);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}


    for (d = connection_list; d; d = d->next)
    {
		if (d->connected_state == 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))
				d->character->print("zone> " );
			
			d->character->printlnf( "%s`x", argument );
		}
    }
}

void do_zoecho( char_data *ch, char *argument )
{
    connection_data *d;
    
    if ( argument[0] == '\0' )
    {
		ch->println( "Zone outdoors echo what?" );
		return;
    }

	// questing wiznet
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s zoecho '%s'`x", ch->name, argument);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}
    
    for ( d = connection_list; d; d = d->next )
    {
		if ( d->connected_state == CON_PLAYING )
		{
			if ( IS_OUTSIDE(d->character)
			&&	 d->character->in_room->sector_type != SECT_CAVE
			&&   IS_AWAKE(d->character)
			&&	 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))
					d->character->print( "zoneoutdoors> " );

				d->character->printlnf( "%s`x", argument );
			}
		}
	}

    return;
}

/**************************************************************************/
void do_pecho( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;

    argument = one_argument(argument, arg);
 
    if ( argument[0] == '\0' || arg[0] == '\0' )
    {
		ch->println( "Personal echo what?" ); 
		return;
    }
   
    if  ( (victim = get_char_world(ch, arg) ) == NULL )
    {
		ch->println( "Target not found." );
		return;
    }

	// questing wiznet
	if (!IS_IMMORTAL(victim))
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s pecho (%s) %s`x", 
			ch->name, victim->name, argument);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}

    if (get_trust(victim) >= get_trust(ch) && get_trust(ch) != MAX_LEVEL)
        victim->print( "personal> " );

	victim->printlnf( "%s`x", argument );
	ch->printlnf( "personal - %s > %s`x", victim->name, argument );
}


/**************************************************************************/
ROOM_INDEX_DATA *find_location_player_prority( char_data *ch, char *arg )
{
    char_data *victim;
    OBJ_DATA *obj;

	// hack to convert 'room 1234 - jsdlkfksldf' into '1234 ', used by scalemap
	if(!str_prefix("room ", arg)){
		arg+=5;
		if(is_digit(*arg)){
			char *t=strstr(arg, " -");
			if(t){
				*t='\0';
			}
		}
	}

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

	victim=get_whovis_player_world(ch, arg);
	if(victim){
		return victim->in_room;
	}

    if ( ( victim = get_char_world( ch, arg ) ) != NULL )
	{
		if ( !IS_NPC(victim))
		{
			if ( can_see_who(ch, victim))
			{
				return victim->in_room;
			}
		}
		else
		{
			return victim->in_room;
		}
	}

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

    return NULL;
}

/**************************************************************************/
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 )
	{
		if ( !IS_NPC(victim))
		{
			if ( can_see_who(ch, victim))
			{
				return victim->in_room;
			}
		}
		else
		{
			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[MIL];
    char arg2[MIL];
    ROOM_INDEX_DATA *location;
    connection_data *d;
    char_data *victim;
    long prev_room=0;

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

    if ( IS_NULLSTR(arg1) )
    {
        ch->println( "Transfer whom (and where)?" );
        return;
    }

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

    if ( IS_NULLSTR(arg2) ){
        location = ch->in_room;
    }else{
        if ( ( location = find_location_player_prority( ch, arg2 ) ) == NULL ){
            ch->printlnf( "No such location '%s'.", arg2 );
            return;
        }

        if ( is_room_private_to_char( location, ch )){
            ch->println( "That room is private right now." );
            return;
        }
    }

	// search first in the world for players before searching for mobs
	victim=get_whovis_player_world( ch, arg1 );
	if ( !victim)
	{
	    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
		{
			ch->println( "They aren't here." );
			return;
		}
	}

    if ( victim->in_room == NULL )
    {
        ch->println( "They are in limbo." );
        return;
    }

	if (victim->in_room == location )
	{
        ch->printlnf("%s is already there.", PERS(victim,ch));
        return;
	}

    if ( victim->fighting != NULL )
        stop_fighting( victim, true );

    // remove from source room 
    if (ch==victim)
        act( "$n leaves the room.", victim, NULL, NULL, TO_ROOM );
    else
        act( "$n disappears in a mushroom cloud.", victim, NULL, NULL, TO_ROOM );

    // if transing into ooc room from ic room, backup last_ic_room 
    if (IS_SET(location->room_flags, ROOM_OOC)
        && !IS_OOC(victim) && !IS_NPC(victim))
        victim->last_ic_room = victim->in_room;        

    if (ch->mounted_on)
       dismount(ch);

    prev_room = victim->in_room->vnum;
    char_from_room( victim );

    // put in target room 
    char_to_room( victim, location );
    if (ch==victim)
        act( "$n has arrived.", victim, NULL, NULL, TO_ROOM );
    else
        act( "$n arrives from a puff of smoke.", victim, NULL, NULL, TO_ROOM );


    if ( ch != victim )
    {
		ch->printlnf("You transfer %s to room %d (from room %ld).",
			PERS( victim, ch), victim->in_room->vnum, prev_room);

		if (can_see_who(victim, TRUE_CH(ch)))
			victim->printlnf("%s has transferred you.", TRUE_CH(ch)->name);
		else
		{
			if(!IS_SILENT(ch))
			{
				victim->println("a mystery imm has transferred you.");
			}
		}
	}
    
	do_look( victim, "auto" );
	ch->println( "Ok." );
}

/**************************************************************************/
void do_stransfer( char_data *ch, char *argument )
{
    char arg1[MIL];
    char arg2[MIL];
    ROOM_INDEX_DATA *location;
    char_data *victim;
    long prev_room=0;

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

    if ( arg1[0] == '\0' )
    {
        ch->println( "Silent Transfer whom (and where)?" );
        ch->println( "(use self to get yourself or the mob you are controlling)" );
        return;
    }

    if ( IS_NULLSTR(arg2)){
		location = ch->in_room;
	}else{
		if ( ( location = find_location_player_prority( ch, arg2 ) ) == NULL )
		{
			ch->println( "No such location." );
			return;
		}

		if ( is_room_private_to_char( location, ch )){
			ch->println( "That room is private right now." );
			return;
		}
	}

	if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
	}

	if ( victim->in_room == NULL )
	{
		ch->println( "They are in limbo." );
		return;
	}

	if ( victim->fighting != NULL )
		stop_fighting( victim, true );

	// if transing into ooc room from ic room, backup last_ic_room 
	if (IS_SET(location->room_flags, ROOM_OOC)
        && !IS_OOC(victim) && !IS_NPC(victim))
        victim->last_ic_room = victim->in_room;        

    if (ch->mounted_on)
       dismount(ch);

    // remove from source room 
    prev_room = victim->in_room->vnum;
    char_from_room( victim );

    // put in target room 
    char_to_room( victim, location );

    if ( ch != victim )
    {
        ch->printlnf("You transfer %s to room %d (from room %ld).",
            PERS( victim, ch), victim->in_room->vnum, prev_room);

		if (IS_IMMORTAL(victim)){
			victim->printlnf("%s has transferred you.", TRUE_CH(ch)->name);
		}
    }

    do_look( victim, "auto" );
    ch->println( "Ok." );
}

/**************************************************************************/
void do_at( char_data *ch, char *argument )
{
    char arg[MIL];
    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' )
    {
		ch->println( "At where what?" );
		return;
    }

    if ( ( location = find_location_player_prority( ch, arg ) ) == NULL ){
		ch->println( "No such location." );
		return;
    }

    if (ch->in_room==location)
    {
        ch->printlnf( "You are already in room %d... doing command without at.", 
			location->vnum);
		interpret( ch, argument );
		return;
	}

    if (is_room_private_to_char( location, ch )){
		ch->println( "That room is private right now." );
		return;
    }

	SET_BIT(ch->dyn,DYN_USING_AT);
	if ( HAS_HOLYLIGHT(ch))
	{
		ch->printlnf("AT %d BEGINS", location->vnum );
	}

	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;
		}
    }
	REMOVE_BIT(ch->dyn,DYN_USING_AT);
	if ( HAS_HOLYLIGHT(ch))
	{
		ch->println("AT FINISHES");
	}
    return;
}


/**************************************************************************/
void do_atlevel( char_data *ch, char *argument )
{
    char arg[MIL];
	int max_level;

	if (IS_UNSWITCHED_MOB(ch))
		max_level=ch->level;
	else
		max_level=TRUE_CH(ch)->level;
	
    argument = one_argument( argument, arg );

    if ( arg[0] == '\0' || argument[0] == '\0' )
    {
        ch->println( "Atlevel level what?" );
        return;
    }

    if (is_number(arg))
    {
        int new_level, true_level, true_trust, true_xpen=0;

        new_level = atoi(arg);
        if ((new_level<=max_level) && (new_level>0))
        {
            true_trust= ch->trust;
            true_level= ch->level;
            ch->trust= 0;
            ch->level= new_level;
            if (!IS_NPC(ch))
            {
                true_xpen= ch->pcdata->xp_penalty;
                ch->pcdata->xp_penalty=10;
            }
            ch->printlnf("ATLEVEL %d BEGIN.", new_level);
			SET_BIT(ch->dyn,DYN_USING_ATLEVEL);
			forced_interpret( ch, argument );
			REMOVE_BIT(ch->dyn,DYN_USING_ATLEVEL);
            ch->trust= true_trust;
            ch->level= true_level;

            if (!IS_NPC(ch))
            {
                ch->pcdata->xp_penalty= true_xpen;
            }
            ch->printlnf("ATLEVEL %d FINISHED.", new_level);
            return;

        }
        else /* not high enough trust */
        {
            ch->println( "Level must be between 1 and your level." );
            return;
        }
    }

    ch->println( "Level must be a valid number." );
    return;
}


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

    if ( IS_SWITCHED(ch))
    {
        ch->println( "Goto is disabled while you are switched, If you really must move the" );
        ch->println( "mob you are controlling type trans self <location>" );
        return;
    }

    if ( argument[0] == '\0' )
    {
        ch->println( "Goto where?" );
        return;
    }

    if ( ( location = find_location_player_prority( ch, argument ) ) == NULL )  {
        ch->println( "No such location." );
        return;
    }

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

    if (ch->in_room==location)
    {
        ch->println( "You are already in that room." );
        return;
    }

    if (is_room_private_to_char( location, ch ) && count>1 ){
		if ( !IS_IMMORTAL( ch ))
		{
			ch->println( "That room is private right now." );
			return;
		}
		else if ( IS_SET( location->room_flags, ROOM_OOC )
			|| INVIS_LEVEL(ch)< LEVEL_IMMORTAL )
		{
			ch->println( "That room is private right now." );
			return;
		}
    }

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

    for (rch = ch->in_room->people; rch; rch = rch->next_in_room)
    {
        if (get_trust(rch) >= INVIS_LEVEL(ch))
        {
            if (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
        {
            act("$t",ch,ch->pcdata->bamfout,rch,TO_VICT);
            if (IS_IMMORTAL(rch))
            {
                act("($n poofout)",ch,NULL,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 );
    if (ch->mounted_on)
    {  
        char_from_room( ch->mounted_on );
        char_to_room( ch->mounted_on, location );
        do_look(ch->mounted_on, "auto");
    }
	else // automatically stand up those who are resting or sitting
	{
		if (ch->position==POS_SITTING || ch->position==POS_RESTING)
		{
			ch->position=POS_STANDING;
			ch->is_trying_sleep=false;
		}

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

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


/**************************************************************************/
void do_violate( char_data *ch, char *argument )
{
    ROOM_INDEX_DATA *location;
    char_data *rch;
 
    if ( argument[0] == '\0' )
    {
        ch->println( "Goto where?" );
        return;
    }
 
    if ( ( location = find_location_player_prority( ch, argument ) ) == NULL )
    {
        ch->println( "No such location." );
        return;
    }

    if(!is_room_private_to_char( location, ch )){
        ch->println( "That room isn't private, use goto." );
        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) >= INVIS_LEVEL(ch))
        {
            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) >= INVIS_LEVEL(ch))
        {
            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_look( ch, "auto" );
    return;
}


/**************************************************************************/
/* RT to replace the 3 stat commands */
void do_stat ( char_data *ch, char *argument )
{
    char arg[MIL];
    char *string;
    OBJ_DATA *obj;
    ROOM_INDEX_DATA *location;
    char_data *victim;

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

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

    if(!str_cmp(arg,"char")  || !str_cmp(arg,"mob"))
    {
        do_mstat(ch,string);
        return;
    }
   
    // search for default matches
	victim=get_whovis_player_world( ch, argument );
    if (victim)
    {
        do_mstat(ch,argument);
        return;
    }

    obj = get_obj_world(ch,argument);
    if (obj)
    {
        do_ostat(ch,argument);
        return;
    }

    victim = get_char_world(ch,argument);
    if (victim)
    {
        do_mstat(ch,argument);
        return;
    }

    location = find_location(ch,argument);
    if (location)
    {
        do_rstat(ch,argument);
        return;
    }

    ch->println( "Nothing by that name found anywhere." );
}


/**************************************************************************/
void do_rstat( char_data *ch, char *argument )
{
    char			buf[MSL];
    char			arg[MIL];
    ROOM_INDEX_DATA *location;
    OBJ_DATA		*obj;
    char_data		*rch;
    int				door;
	AFFECT_DATA		*paf, *paf_last = NULL;

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

    if (ch->in_room != location && is_room_private_to_char( location, ch ))
    {
		ch->println( "That room is private right now." );
		return;
    }

	ch->printlnf("Name: '%s'\nArea: '%s'  Filename '%s'",
				location->name,
				location->area->name,
				location->area->file_name );

	ch->printlnf("Vnum: %d  Sector: %s  Light: %d  Healing: %d  Mana: %d",
				location->vnum,
				flag_string( sector_types, location->sector_type ),
				location->light,
				location->heal_rate,
				location->mana_rate );

	ch->printlnf("Room flags: %s", room_flags_bit_name(location->room_flags));
	ch->printf("Description:\r\n%s`x", location->description );

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

		ch->print("Extra description keywords: '");
		for ( ed = location->extra_descr; ed; ed = ed->next )
		{
			ch->printf("%s", ed->keyword );
			if ( ed->next != NULL )
				ch->print(" ");
		}
		ch->println("'.`x");
	}

	ch->printf("Characters (%d):", location->number_in_room);
	for ( rch = location->people; rch; rch = rch->next_in_room )
	{
		if (can_see(ch,rch))
		{
			ch->print(" ");
			one_argument( rch->name, buf );
			ch->printf("%s", buf );
		}
	}

	ch->print(".\r\nObjects:   ");
	for ( obj = location->contents; obj; obj = obj->next_content )
	{
		ch->print(" ");
		one_argument( obj->name, buf );
		ch->printf("%s", buf );
	}
	ch->println(".`x");
	if(location->last_mined_in_room){
		ch->printf("Room last mined in at: %s", ctime(&location->last_mined_in_room));
	}

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

		if ( ( pexit = location->exit[door] ) != NULL )
		{
			ch->printf("Door: %d.  To: %d.  Key: %d.  Exit flags: %s.  Reset flags: %s.\r\nKeyword: '%s'.  Description: %s`x",
				door,
				(pexit->u1.to_room == NULL ? -1 : pexit->u1.to_room->vnum),
				pexit->key,
				flag_string( exit_flags, pexit->exit_info ),
				flag_string( exit_flags, pexit->rs_flags),
				pexit->keyword,
				pexit->description[0] != '\0'
				? pexit->description : "(none).\r\n" );

		}
	}

	if ( location->affected_by )
	{
		ch->println("`rThe room has the following affects on it.`x");
		for ( paf = location->affected; paf; paf = paf->next )
		{
			if (paf_last && paf->type == paf_last->type){
				continue;
			}else{
				ch->printf("Spell: %-15s", skill_table[paf->type].name );
//				ch->printf(": modifies %s by %d ",
//					full_affect_loc_name( paf), paf->modifier);
				if ( paf->duration == -1 )
					sprintf( buf, "until the world reforms" );
				else
					sprintf( buf, "for %d hours", paf->duration );
				ch->printf("%s", buf );
			}
			ch->println("");
			paf_last = paf;
		}
	}

	return;
}

/**************************************************************************/
void ostat_show_to_char( char_data *ch, OBJ_DATA *obj)
{
	AFFECT_DATA *paf=NULL;

	ch->printlnf( "`xName(s): %s",	obj->name );
	ch->printlnf( "Vnum: %d  uid:%-6d Type: %s  Resets: %d",
		obj->pIndexData->vnum, obj->uid, item_type_name(obj), obj->pIndexData->reset_num );
	
	if (obj->restrung){
		ch->println( "`R  RESTRUNG`x" );
	}
	ch->printlnf("Short description: %s`x", obj->short_descr);
	if (has_colour(obj->short_descr))
	{
		ch->print("B&W Shrt descript: ");
		ch->printlnbw(obj->short_descr);
	}
	ch->printlnf("Long description: %s`x", obj->description);
    if (has_colour(obj->description))
	{
		ch->print("B&W Long descript: ");
		ch->printlnbw(obj->description);
	}
    ch->printlnf("Wear bits: %s", wear_bit_name(obj->wear_flags));
	ch->printlnf("Extra bits: %s",extra_bit_name( obj->extra_flags));
	ch->printlnf("Extra2 bits: %s", extra2_bit_name( obj->extra2_flags));

    // print class restrictions
	if (obj->pIndexData->class_allowances)
	{
		// print class allowances
		ch->printlnf("Class Allowances: [%s]",
			flag_string( classnames_flags, obj->pIndexData->class_allowances) );
	}
	ch->printlnf("Number: %d/%d  Weight: %d/%d/%d (lbs)",
		1,	get_obj_number( obj ),
		obj->weight, get_obj_weight( obj ), get_true_weight(obj) );
	ch->printlnf("Level: %d  Cost: %d  Condition: %d  Timer: %d",
		obj->level, obj->cost, obj->condition, obj->timer );
	ch->printlnf("In room: %d  In object: %s  Carried by: %s  Wear_loc: %s",
		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",
		flag_string(wear_location_types, obj->wear_loc) );

	if ( obj->attune_next > current_time ){
		ch->printlnf( "Next attune attempt: %s, which is %d hours from now.",
			ctime( (time_t*)&obj->attune_next ), (int)( obj->attune_next - current_time ) / 3600);
	}
	ch->printlnf("Values: %d %d %d %d %d",
		obj->value[0], obj->value[1], obj->value[2], obj->value[3],	obj->value[4] );
    
    // now give out vital statistics as per identify 
    
    switch ( obj->item_type )
    {
	case ITEM_SCROLL: 
	case ITEM_POTION:
	case ITEM_PILL:
		ch->printf("Level %d spells of:", obj->value[0] );
		
		if ( obj->value[1] >= 0 && obj->value[1] < MAX_SKILL )
		{
			ch->printf(" '%s'", skill_table[obj->value[1]].name );
		}
		if ( obj->value[2] >= 0 && obj->value[2] < MAX_SKILL )
		{
			ch->printf(" '%s'", skill_table[obj->value[2]].name );
		}
		if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
		{
			ch->printf(" '%s'", skill_table[obj->value[3]].name );
		}
		if (obj->value[4] >= 0 && obj->value[4] < MAX_SKILL)
		{
			ch->printf(" '%s'", skill_table[obj->value[4]].name );
		}
		ch->println( "." );
		break;

	case ITEM_WAND: 
	case ITEM_STAFF: 
		ch->printf("Has %d(%d) charges of level %d",
			obj->value[1], obj->value[2], obj->value[0] );
		if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
		{
			ch->printf(" '%s'", skill_table[obj->value[3]].name );
		}
		ch->println( "." );
		break;
		
	case ITEM_DRINK_CON:
		ch->printlnf("It holds %s-colored %s.",
			liq_table[obj->value[2]].liq_color,
			liq_table[obj->value[2]].liq_name);
		break;
		
	case ITEM_WEAPON:
        ch->printlnf("Weapon type is %s",get_weapontype(obj));
		
		ch->printlnf("Damage is %dd%d (average %d)",
		obj->value[1],
		obj->value[2],
		(1 + obj->value[2]) * obj->value[1] / 2);
	
		ch->printlnf("Damage noun is %s.", attack_table[obj->value[3]].noun);
		
		if (obj->value[4])  // weapon flags 
		{
			ch->printlnf("Weapons flags: %s", weapon_bit_name(obj->value[4]));
		}
		break;
		
	case ITEM_ARMOR:
		ch->printlnf("Armor class is %d pierce, %d bash, %d slash, and %d vs. magic",
			obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
		break;
		
	case ITEM_CAULDRON:
	case ITEM_CONTAINER:
	case ITEM_FLASK:
	case ITEM_MORTAR:
		ch->printlnf( "Maximum combined weight: %0.1f, Capacity for an individual item: %0.1f lbs.",
			((double)obj->value[0])/10,
			((double)obj->value[3])/10);
		ch->printlnf( "Flags: %s.", cont_bit_name(obj->value[1]));
		if (obj->value[4] != 100){
			ch->printf( "Weight multiplier: %d%%\r\n", obj->value[4]);
		}
		break;
	}
	
	if ( obj->extra_descr != NULL)
	{
		EXTRA_DESCR_DATA *ed;
		
        ch->print( "Custom extra description keywords: '" );
		
        for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
        {
            ch->printf( "%s", ed->keyword );
            if ( ed->next != NULL )
                ch->print( " / " );
        }
        ch->println( "'" );   
    }
	
    if (obj->pIndexData->extra_descr != NULL)
    {
        EXTRA_DESCR_DATA *ed;
		
        if (obj->extra_descr != NULL)
        {
            ch->print( "Ignored extra description keywords (vnum's): '" );
        }
        else
        {
            ch->print( "Original vnums extra description keywords: '" );
        }
		
        for ( ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next )
        {
            ch->printf( "%s", ed->keyword );
            if ( ed->next != NULL )
				ch->print( " / " );
        }   
        ch->println( "'" );
    }

	if ( obj->ospec_fun != 0 )
	{
		ch->printlnf("Object has special procedure `G%-20s`x                             |",
			ospec_name(obj->ospec_fun));
	}

	for (paf=OBJECT_AFFECTS(obj); paf; paf = paf->next )
	{
		if ( paf->where != WHERE_SKILLS && paf->where != WHERE_OBJECTSPELL)
		{
			ch->printlnf("Affects %s by %d, level %d.",
				affect_loc_name( paf->location ), paf->modifier,paf->level );
		}
		if (paf->bitvector || paf->where == WHERE_OBJECTSPELL)
		{
			ch->printlnf("%s", to_affect_string( paf, obj->level ));
		}
	}
}

/**************************************************************************/
void do_ostat( char_data *ch, char *argument )
{
	char arg[MIL];
	OBJ_DATA *obj;
	
	one_argument( argument, arg );
	
	if ( arg[0] == '\0' )
	{
		ch->println( "Stat what?" );
		return;
	}
	
	if ( ( obj = get_obj_world( ch, argument ) ) == NULL )
	{
		ch->println( "Nothing like that in hell, earth, or heaven." );
		return;
	}
	
	ostat_show_to_char(ch, obj);
	return;
}

/************************************************************************/
int get_sublevels_for_level(int level);
/**************************************************************************/
// Kal - June 01
void do_charinfo( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;
    one_argument( argument, arg );

    if ( IS_NULLSTR(arg) ){
        ch->println( "Syntax: `=Ccharinfo <playername>`x" );
        return;
    }

    if (( victim = get_whovis_player_world(ch, argument ) ) == NULL ){
        ch->printlnf( "No character named '%s' was found in the game", argument );
        return;
    }

	ch->titlebarf("CHARINFO: %s", uppercase(victim->name));
	
	ch->printf(  " `xName:`B %s`x   Created: %s", victim->name, ctime( (time_t *) & (victim->id)));
	ch->printlnf(" `xKnow Index:`B %d`x  Player ID: %d  uid:%d", 
		victim->know_index, (int)victim->id, victim->uid);
	if(!IS_NULLSTR(victim->pcdata->immtalk_name)){
		ch->printlnf(" `xImmtalk Name: %s`x", victim->pcdata->immtalk_name);
	}
	if(IS_TRUSTED(ch, ADMIN))
	{
		// for email banning verification
		bool print=false;
		if(!IS_NULLSTR(victim->pcdata->email)){
			ch->printlnf(" Email: `B%s`x", victim->pcdata->email);
			print=true;
		}
		if(!IS_NULLSTR(victim->pcdata->created_from)){
			ch->printf(" Created_from: `B%s`x ", victim->pcdata->created_from);
			print=true;
		}
		if(!IS_NULLSTR(victim->pcdata->unlock_id)){
			if(str_len(victim->pcdata->unlock_id)==6){
				ch->printlnf(" Unlock_id: `B%s`x", victim->pcdata->unlock_id);
				print=true;
			}
		}
		if(print){
			ch->println("");
		}

		if(victim->desc){
			ch->printlnf(" Host: `G%s`x",
				victim->desc->remote_hostname);

			ch->printlnf(" Remote Address: `W%s`x",
				victim->desc->remote_tcp_pair);

			ch->printlnf(" Connected via: `W%s`x",
				victim->desc->local_tcp_pair);
			if(!IS_NULLSTR(victim->desc->terminal_type)){
				ch->printlnf(" TerminalType: %s", victim->desc->terminal_type);
			}
		}

		ch->printlnf(" Remote_ip_copy: %s",victim->remote_ip_copy);
	}

	if(victim->desc){
		if(!IS_NULLSTR(victim->desc->mxp_version)){
			ch->printlnf(" MXP ver text: %s`x",
				victim->desc->mxp_version);
		}

#ifdef MCCP_ENABLED
		if( victim->desc->out_compress){
			ch->printlnf(" Using MCCP version %d", victim->desc->mccp_version);
		}
#endif

		if(IS_TRUSTED(ch, ADMIN) && !IS_NULLSTR(victim->desc->ident_raw_result)){
			ch->printlnf(" Ident raw result: %s`x", victim->desc->ident_raw_result);
		}
	}

    ch->printlnf(" Room: `W%-5d`x  LastIC: `M%-5d`x  Set Recall: %d  Actual Recall: %d  Expires: `#`y%d`^",
        victim->in_room == NULL ? 0 : victim->in_room->vnum,
		victim->last_ic_room == NULL ? 0 : victim->last_ic_room->vnum,
		victim->recall_room, get_recallvnum(victim), victim->expire_recall_inn);

	ch->printlnf(" Thirst: `c%-2d  `xHunger: `c%-2d  `xFull: `c%-2d  "
		"`xDrunk: `c%-2d  `xTired: `c%-2d`x  `xAutoAfkAfter: `c%-2d`x `xQP: `c%-2d`x",
        victim->pcdata->condition[COND_THIRST],
        victim->pcdata->condition[COND_HUNGER],
        victim->pcdata->condition[COND_FULL],
        victim->pcdata->condition[COND_DRUNK],
        victim->pcdata->tired,
		victim->pcdata->autoafkafter,
		victim->pcdata->qpoints);
	ch->printlnf(" Bleeding: `c%-2d  `x", victim->bleeding);

	if(victim->colour_prefix!=COLOURCODE){
		ch->printlnfbw(" Colour code prefix: %c", victim->colour_prefix);
	}

    if (victim->clan)
	{
	    ch->printlnf(" `xClan: %-10s `xRank: %s%-15s (%d)`x                                  |",
		    victim->clan->cwho_name(),
			victim->clan->color_str(),
			victim->clan->clan_rank_title(victim->clanrank),
			victim->clanrank);              
	}

	ch->printf(" Age: %-3d  Played: %d(%0.03f%%)  LastLevel: %-4d ",
        GET_AGE(victim), 
        (int) (GET_SECONDS_PLAYED(victim)/ 3600), 
		GET_SECONDS_PLAYED(victim)* 100/ (double)(current_time-victim->id),
		victim->pcdata->last_level);

	ch->printlnf(" Timer: %-2d  Idle: %-2d  %12s", 
		victim->timer, victim->idle, " ");

    if (!IS_NULLSTR(victim->prompt)){
        ch->printlnbw(FORMATF(" Prompt: %s",victim->prompt));        
    }
    if(!IS_NULLSTR(victim->olcprompt)){        
        ch->printlnbw(FORMATF(" OLCPrompt: %s ",victim->olcprompt));
    }
  
	if(TRUE_CH_PCDATA(victim) && !IS_NULLSTR(TRUE_CH_PCDATA(victim)->battlelag)){
		ch->printlnbw(FORMATF(" BattleLag: %s ",TRUE_CH_PCDATA(victim)->battlelag));		
	}

    ch->printlnf(" Master: %-15s  Leader: %-15s  Pet: %-15s",
        victim->master      ? victim->master->name   : "(none)",
        victim->leader      ? victim->leader->name   : "(none)",
        victim->pet         ? victim->pet->name      : "(none)");
    
	// get their diplomacy info
	if(victim->pcdata->diplomacy && !IS_IMMORTAL(victim)){
		ch->printlnf(" Diplomacy:%d  Votes:%d",
			victim->pcdata->diplomacy,
			victim->pcdata->dip_points);
	}

	if(victim->pcdata->council){
		ch->printlnf(" Councils: %s", flag_string( council_flags, victim->pcdata->council ));
	}

	if (IS_ADMIN(ch)){
		if(victim->pcdata->xp_penalty>0){
			ch->printlnf(" `#`RXPEN: %-3d`&", victim->pcdata->xp_penalty);
		}
		
		ch->printlnf(" Level: %-3d  Trust: %-3d  Security: %-3d %-6s",
			victim->level, 
			(IS_TRUSTED(victim,get_trust(ch))? get_trust(ch):get_trust(victim)),
			victim->pcdata->security,
			IS_SET(victim->act, PLR_LOG)?"`#`RLOGGED`&":"");
	}
	
	if(IS_IMMORTAL(victim) && victim->pcdata){
		if(!IS_NULLSTR(victim->pcdata->bamfin)){
			ch->printlnf(" PoofIn: %s", victim->pcdata->bamfin);
		}
		if(!IS_NULLSTR(victim->pcdata->bamfout)){
			ch->printlnf(" PoofOut: %s", victim->pcdata->bamfout);
		}
		if(!IS_NULLSTR(victim->pcdata->fadein)){
			ch->printlnf(" FadeIn: %s", victim->pcdata->fadein);
		}
		if(!IS_NULLSTR(victim->pcdata->fadeout)){
			ch->printlnf(" FadeOut: %s", victim->pcdata->fadeout);
		}
	}


	ch->printlnf(" Creation points: %d  XPPerLvl: `m%d`x  XPTillNextlvl: `m%d`x  RPS: `m%ld`x",
        victim->pcdata->points,
        exp_per_level(victim, victim->pcdata->points),
        (victim->level+1)*exp_per_level(victim, victim->pcdata->points)- victim->exp,
        victim->pcdata->rp_points );

	// PK RELATED STATS
	ch->titlebar("PK RELATED STATS");
    ch->printf(  " Pkills: `R%-2d`x  PkDefeats: `r%-2d`x", 
		victim->pkkills, victim->pkdefeats);
    ch->printlnf(" MKills: `B%-2d`x  MDefeats: `B%-3d`x %s",
		victim->pcdata->mkills, victim->pcdata->mdefeats, " ");

	ch->printlnf(" Pksafe: `C%-2d`x  PkOOL: `C%-4d`x  PkNorecall: `C%-2d`x  Pknoquit: `C%-2d`x",
			 victim->pksafe, victim->pkool, victim->pknorecall, victim->pknoquit);


    ch->printlnf(" Karns: `Y%d`x  NextKarn: `y%-5d`x Sec: `c%d`x  Subdued: `c%-2d",
		victim->pcdata->karns,
		victim->pcdata->next_karn_countdown,
		victim->pcdata->security,
		victim->subdued_timer);

	if(!GAMESETTING2(GAMESET2_NO_DUEL_REQUIRED)){
		ch->titlebar("DUEL STATS");
		ch->printlnf(" Challenged: %d  Declined: %d  Accepted: %d  Ignored: %d\r\n"
			" Bypassed: %d  Subdues B4 Karn Loss: %d",
			victim->duel_challenged,
			victim->duel_decline,
			victim->duel_accept,
			victim->duel_ignore,
			victim->duel_bypass,
			victim->duel_subdues_before_karn_loss);
	}

	// ADMIN CAN SEE NOTES BEING WRITTEN - needed for hotrebooting
	if(victim->pnote && IS_ADMIN(ch) && ch->level > victim->level)
	{	
		ch->titlebar("NOTE DETAILS");
		ch->printlnf(" `#`?%s is writing the following %s:`&", 
			victim->name, get_notetype(victim->pnote->type));
        ch->printlnf(" %s: %s",
			victim->pnote->sender,
			victim->pnote->subject);
		ch->printlnf(" To: %s",
			victim->pnote->to_list);
		if (IS_SET(victim->act,PLR_AUTOREFORMAT)){
			char *tempdup= note_format_string(str_dup(victim->pnote->text));
			ch->printf( "%s", tempdup );
			free_string(tempdup);
		}else{
			ch->printf( "%s", victim->pnote->text );
		}
		ch->println( "`x" );
	}

	ch->titlebar("");

    return;
}

/**************************************************************************/
// Kal - September 01
void do_mxpinfo( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;
    one_argument( argument, arg );

    if ( IS_NULLSTR(arg) ){
        ch->println( "Syntax: `=Cmxpinfo <playername>`x" );
        return;
    }

    if (( victim = get_whovis_player_world(ch, argument ) ) == NULL ){
        ch->printlnf( "No character named '%s' was found in the game", argument );
        return;
    }

	ch->titlebarf("MXPINFO: %s", uppercase(victim->name));

	if(victim->desc && victim->pcdata){
		bool newline=false;
		if(victim->pcdata->preference_mxp==PREF_AUTOSENSE){
			ch->printf(" MXP support has %sbeen detected.",
				(IS_SET(victim->desc->flags, CONNECTFLAG_MXP_DETECTED))?"":"not ");
			newline=true;
		}
		if(victim->desc && !IS_NULLSTR(victim->desc->terminal_type)){
			ch->printf("     TerminalType: %s", victim->desc->terminal_type);
			newline=true;
		}else{
			ch->print("     TerminalType Undetected");
		}
		ch->print_blank_lines(1);

		ch->printlnf(" MXP preference is set to %s", preference_word(victim->pcdata->preference_mxp));


		ch->printlnf(" MXP version response: %s`x", !IS_NULLSTR(victim->desc->mxp_version)?victim->desc->mxp_version: "unknown");
		ch->wraplnf(" MXP support response: %s`x", !IS_NULLSTR(victim->desc->mxp_supports)?victim->desc->mxp_supports: "unknown");
		ch->wraplnf(" MXP options response: %s`x",!IS_NULLSTR(victim->desc->mxp_options)?victim->desc->mxp_options:"unknown");

#ifdef MCCP_ENABLED
		if( victim->desc->out_compress){
			ch->printlnf(" Using MCCP version %d", victim->desc->mccp_version);
		}
#endif
	}

	ch->titlebar("");

    return;
}

/**************************************************************************/
void do_mstat( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;
    char buf[MSL];
    AFFECT_DATA *paf;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        ch->println( "Stat whom?" );
		ch->println( "hint: use `=Cinroom stat mob <mobname>`x to always get a mob within the current room");
        return;
    }

    if (( victim = get_char_world( ch, argument ) ) == NULL )
    {
        ch->println( "They aren't here." );
        return;
    }

	ch->println( "_______________________________________________________________________________");
		
	if(IS_NPC(victim)){
		ch->printlnf("| `xName:`B %-70s`x|", victim->name);
	}else{
		sprintf(buf, "`xName:`B %s`x   Created: %s",
			victim->name, ctime( (time_t *) & (victim->id)));
		buf[str_len(buf)-1]='\0';
		ch->printlnf("| %-82s|", buf);
	}

    ch->printlnf("| Vnum: %-5d  uid:%-6d Format: %-3s  Room: `m%-5d`x  LastIC: `M%-5d`x             |",
        IS_NPC(victim) ? victim->pIndexData->vnum : 0,
		victim->uid,
        IS_NPC(victim) ? "npc" : "pc",
        victim->in_room == NULL ? 0 : victim->in_room->vnum,
		victim->last_ic_room == NULL ? 0 : victim->last_ic_room->vnum);

	if (IS_NPC(victim))
    {
		ch->printlnf("| Count: %-3d   Killed: %-3d   XP Mod: %-3d                                      |",
        victim->pIndexData->count,victim->pIndexData->killed, victim->pIndexData->xp_mod);
    }

	ch->printlnf("| Race: `B%-10s  `xRecall: `G%5d `xGroup: `B%-2d  `xSex: `B%-7s`x %15s     |",
		race_table[victim->race]->name,
		get_recallvnum(victim),
		IS_NPC(victim) ? victim->group : 0, sex_table[victim->sex].name, " " );
         
	ch->printf("| Lv: `G%-3d  `xClass: `G%-12s  `xTendency: `g%+d  `xAlliance: `g%+d`x"
		"                    |\r\n"
		"| `Y-$$$ `xBank: `y%-6ld  `xGold: `y%-5ld  `xSilver: `s%-5ld`x  Exp: `M%-6d`x",
		victim->level,       
        IS_NPC(victim) ? "mobile" : class_table[victim->clss].name,
		victim->tendency, victim->alliance, victim->bank,
		victim->gold, victim->silver, victim->exp );

	if ( !IS_NPC( victim )){
		ch->printlnf("  HeroXP: %-5d   |", victim->pcdata->heroxp );
		if(victim->pcdata->hero_level_count){
			ch->printlnf("    Hero Level Count: %d", victim->pcdata->hero_level_count);			
		}
	}else{
		ch->println( "                  |" );
	}

	if(!IS_NPC(victim)){
		if(GAMESETTING3(GAMESET3_KILLER_SYSTEM_ENABLED) ){
			if(IS_KILLER(victim)){
				ch->printf("  Killer until: %s", 
					ctime(&victim->pcdata->killer_until));

			}
		}
		if(GAMESETTING3(GAMESET3_THIEF_SYSTEM_ENABLED)){
			if(IS_THIEF(victim)){
				ch->printf("  Thief until: %s", 
					ctime(&victim->pcdata->thief_until));

			}
		}	
	}

	// remort status showing in stat
	if(GAMESETTING(GAMESET_REMORT_SUPPORTED) && !IS_NPC(victim)){
		ch->printlnf("| Remort: %d", victim->remort);
	}

	if(!IS_NPC(victim) && victim->level>=50){
		sprintf(buf,"Sublevel:  %2d/%2d  subprac %d  subtrain %d", 
			victim->pcdata->sublevel, get_sublevels_for_level(victim->level),
			victim->pcdata->sublevel_pracs, victim->pcdata->sublevel_trains);
		ch->printlnf("| %-76s|", buf);
	}


	ch->printlnf("| Armor: pierce: `b%-6d  `xbash: `b%-6d  `xslash: `b%-6d  `xmagic: `b%-6d`x           |",
		GET_AC(victim,AC_PIERCE), GET_AC(victim,AC_BASH),
		GET_AC(victim,AC_SLASH),  GET_AC(victim,AC_EXOTIC));

    ch->printlnf("| Hit: `c%-3d`x  DamMod: `c%-3d`x  Saves: `c%-3d`x  Size: %-7s  Pos: %-8s  Wimpy: %-3d |",
        GET_HITROLL(victim), GET_DAMROLL(victim), victim->saving_throw,
        size_table[victim->size].name, position_table[victim->position].name,
        victim->wimpy );

    if (IS_NPC(victim))
    {
		ch->printlnf("| Damage: `C%2dd%-2d  `xMessage: `c%-15s`x                                     |",
			victim->damage[DICE_NUMBER],victim->damage[DICE_TYPE],
			attack_table[victim->dam_type].noun);
    }else{
		ch->printlnf("| victim->pcdata->objrestrict = %d |",	victim->pcdata->objrestrict);
	}

	ch->println( "|_____________________________________________________________________________|");
		

	ch->printlnf("| Fighting: `C%s  `c%s`x   Timer: %d",
		victim->fighting ? victim->fighting->name : "(none)" ,
		victim->no_xp ? "NO_XP_SET":"", victim->timer);

//	ch->printlnf("| Memory: {r%-67s{x |",
//		victim->mobmemory ? victim->mobmemory->name : "(none)" );

    if (IS_NPC(victim) && victim->off_flags)
        ch->printlnf("| Offense: %-66s |",off_bit_name(victim->off_flags));

    if (victim->imm_flags)
		ch->printlnf("| Immune: %-67s |",imm_bit_name(victim->imm_flags));
 
    if (victim->res_flags)
		ch->printlnf("| Resist: %-67s |", imm_bit_name(victim->res_flags));

    if (victim->vuln_flags)
		ch->printlnf("| Vulnerable: %-63s |", imm_bit_name(victim->vuln_flags));

	if (victim->comm)
		ch->printlnf("| Comm: %-69s ",comm_bit_name(victim->comm));

	if (IS_SET(victim->dyn,DYN_NONMAGICAL_FLYING))
		ch->println("| Dyn: DYN_NONMAGICAL_FLYING");

	if (victim->config){
		ch->printlnf("| Config: %-67s ", 
			flag_string( config_flags, victim->config));
	}

	if (victim->config2){
		ch->printlnf("| Config2:%-67s ", 
			flag_string( config2_flags, victim->config2));
	}
    
	ch->printlnf("| Act: %-70s ", act_bit_name(victim->act));
	ch->printlnf("| Act2:%-70s ", act2_bit_name(victim->act2));
    
    if (victim->affected_by)
    {
        ch->printlnf("| Affected by: `c%-63s`x ", 
            affect_bit_name(victim->affected_by));
    }
    if (victim->affected_by2)
    {
        ch->printlnf("| Affected by2: `c%-63s`x ", 
            affect2_bit_name(victim->affected_by2));
    }

	ch->printlnf("| Parts: %-68s \r\n| Form: %-69s |",
        part_bit_name(victim->parts), form_bit_name(victim->form));

    ch->printlnf("| Master: %-15s  Leader: %-15s  Pet: %-15s      |",
        victim->master      ? victim->master->name   : "(none)",
        victim->leader      ? victim->leader->name   : "(none)",
        victim->pet         ? victim->pet->name      : "(none)");
    
	ch->printlnf("| Mounted on: %-15s  Ridden by: %-15s                     |",
        victim->mounted_on      ? victim->mounted_on->name   : "(none)",
        victim->ridden_by       ? victim->ridden_by->name    : "(none)");
    
    if (victim->last_force > -20)
	{
		    ch->printlnf("| Wildness: %-3d  Will: %-3d  Last_force: %-10ld (%-4ld tick%s ago)           |",
				victim->wildness, victim->will,
				victim->last_force, tick_counter -victim->last_force,
				(tick_counter -victim->last_force<=1)?" ":"s");
    }
    else
    {
			ch->printlnf("| Wildness: %-3d  Will: %-3d  Last_force: never                                 |",
				victim->wildness, victim->will);
    }

	ch->println( "|_____________________________________________________________________________|\r\n|                                                                             |" );

	// get their diplomacy info
	if(!IS_NPC(victim) && victim->pcdata->diplomacy && !IS_IMMORTAL(victim)){
		sprintf(buf,"Diplomacy:%d  Votes:%d",
			victim->pcdata->diplomacy,
			victim->pcdata->dip_points);
	}else{
		buf[0]='\0';
	}


    if(!IS_NPC(victim))         
    {
		if(victim->pcdata->council){
			ch->printlnf("| Councils: %-64s|", flag_string( council_flags, victim->pcdata->council ));
		}

		if(victim->pcdata->realms){
			ch->printlnf("| Realm Bits: %-64s|", flag_string( realm_flags, victim->pcdata->realms));
		}
		if(victim->pcdata->spheres){
	        ch->printlnf("| Sphere Bits: %-64s|", flag_string( sphere_flags, victim->pcdata->spheres));
		}
		if(victim->pcdata->elements){
		    ch->printlnf("| Element&Season Bits: %-64s|", flag_string( element_flags, victim->pcdata->elements));			
		}
		if(victim->pcdata->compositions){
		    ch->printlnf("| Composition Bits: %-64s|", flag_string( composition_flags, victim->pcdata->compositions));			
		}
    }           

	ch->println( "|_____________________________________________________________________________|\r\n|                                                                             |" );

    if IS_NPC(victim)
	{
        ch->printlnf("| Short description: %-56s |\r\n| Long  description: %s",
        victim->short_descr,
		IS_NULLSTR(victim->long_descr)? "(none)" : victim->long_descr );
	}else{
        ch->printlnf("| Short description: %-56s |",
        victim->short_descr);
		ch->printlnf(  "| hint: use '`=Ccharinfo %s`x' for more player related details", victim->name);
	}

    if ( IS_NPC(victim) && victim->spec_fun != 0 )
    {
        ch->printlnf("Mobile has special procedure `G%-20s`x                             |",
                spec_name(victim->spec_fun));
    }

	// where definitions
    for ( paf = victim->affected; paf != NULL; paf = paf->next )
    {
        switch (paf->where)
        {
        case WHERE_WEAPON:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (weaponbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                weapon_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_VULN:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (vulnbits %s), lvl %d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                imm_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_RESIST:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (resistbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                imm_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_IMMUNE:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (immunebits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                imm_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_OBJEXTRA:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (objbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                extra_bit_name(paf->bitvector),
                paf->level);
            break;
        case WHERE_OBJEXTRA2:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (objbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                extra2_bit_name(paf->bitvector),
                paf->level);
            break;
		case WHERE_OBJECTSPELL:
			{
				char buf2[50];
				sprintf(buf, "`WObjectspell:`x '%s', level %3d, duration %3d, flags %s",
					skill_table[paf->type].name,
					paf->level,
					paf->duration,
					fwrite_flag(paf->bitvector,buf2));
			}
			break;
        case WHERE_AFFECTS:
        default:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (affbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                affect_bit_name( paf->bitvector ),
                paf->level);
            break;
        case WHERE_AFFECTS2:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d tick%s (affbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                affect2_bit_name( paf->bitvector ),
                paf->level);
            break;
        }
		{
			char format_buf[MIL];

			// find the length of the colour codes
			int collen=c_str_len(buf);
			int slen=str_len(buf);
			if(collen>=0){ 
				collen=slen-collen;
			}else{
				collen=0;
			}

			sprintf(format_buf,"| %%-%ds|", 76+collen);
			ch->printlnf(format_buf, buf);
		}
    }


	//dawn2?
	// show last time skills were used
	{
		int sn;
		if (!IS_NPC(victim))
		{
			for ( sn = 0; sn < MAX_SKILL; sn++ )
			{
				if ( skill_table[sn].name != NULL && victim->pcdata->last_used[sn] > 0 )
				{
					ch->println( "|_____________________________________________________________________________|\r\n|                                                                             |" );

					ch->printlnf("| `YSpell LastUsed:`x '%-25s' at %-15s                    |",
						skill_table[sn].name, 
						(char *) ctime( &victim->pcdata->last_used[sn]) );
				}
			}
		}
	}
	ch->println( "|_____________________________________________________________________________|" );
    return;
}

/**************************************************************************/
/* ofind and mfind replaced with vnum, vnum skill also added */
void do_vnum(char_data *ch, char *argument)
{
    char arg[MIL];
    char *string;

    string = one_argument(argument,arg);
 
    if (arg[0] == '\0')
    {
		ch->println( "Syntax:" );
		ch->println( "  vnum obj <name>" );
		ch->println( "  vnum obj <level>" );
		ch->println( "  vnum mob <name>" );
		ch->println( "  vnum mob <level>" );
		ch->println( "  vnum skill <skill or spell>" );
		return;
    }

    if (!str_cmp(arg,"obj"))
    {
		do_ofind(ch,string);
 		return;
    }

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

    if (!str_cmp(arg,"skill") || !str_cmp(arg,"spell"))
    {
		do_slookup(ch,string);
		return;
    }

    // do both
	ch->println( "-=== MOBILES ===-" );
    do_mfind(ch,argument);
	ch->println( "-=== OBJECTS ===-" );
    do_ofind(ch,argument);
}


/**************************************************************************/
void do_mfind( char_data *ch, char *argument )
{
	char arg[MIL];
	MOB_INDEX_DATA *pMobIndex;
	int vnum;
	bool found;
	int level=0;
	bool level_search=false;
	name_linkedlist_type *list, *plist, *plist_next;
	list=NULL;

	one_argument( argument, arg );
	if ( IS_NULLSTR(arg) )
	{
		ch->println( "Find whom?" );
		return;
	}
	
	if(is_number(arg)){
		level_search=true;
		level=atoi(arg);
	}
	found	= false;
	for ( vnum = 0; vnum< MAX_KEY_HASH; vnum++ ){
		for ( pMobIndex  = mob_index_hash[vnum];	
			pMobIndex;
			pMobIndex=pMobIndex->next )
		{
			if (    (level_search && pMobIndex->level==level)
				 || (!level_search && is_name( argument, pMobIndex->player_name )) )
			{
				found = true;
				// add it to the linked list which is sorted alphabetically
				addlist(&list, 
					FORMATF("<%6d>[%2d] %s", pMobIndex->vnum, 
								pMobIndex->level, pMobIndex->short_descr),
					0, true, false);
			}
		}
	}

	if(found){
		// output the contents of the linked list
		for(plist=list; plist; plist=plist_next){
			plist_next=plist->next;
			ch->println(plist->name);
			free_string(plist->name);
			delete plist;
		}
		list=NULL;
	}else{
		ch->println( "No mobiles found when searching for " );
		if(level_search){
			ch->printlnf("level %d mobiles.", level);
		}else{
			ch->printlnf("'%s'.", arg);
		}
	}

    return;
}


/**************************************************************************/
void do_ofind( char_data *ch, char *argument )
{
    char arg[MIL];
    OBJ_INDEX_DATA *pObjIndex;
    int vnum;
    bool found;
	int level=0;
	bool level_search=false;
	name_linkedlist_type *list, *plist, *plist_next;
	list=NULL;

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
		ch->println( "Find what?" );
		return;
	}

	if(is_number(arg)){
		level_search=true;
		level=atoi(arg);
	}
	found	= false;
	for ( vnum = 0; vnum< MAX_KEY_HASH; vnum++ ){
		for ( pObjIndex= obj_index_hash[vnum];	
			pObjIndex;
			pObjIndex=pObjIndex->next )
		{
			if (    (level_search && pObjIndex->level==level)
				 || (!level_search && is_name( argument, pObjIndex->name )) )
			{
				found = true;
				// add it to the linked list which is sorted alphabetically
				addlist(&list, 
					FORMATF("<%6d>[%2d] %s", pObjIndex->vnum, 
										pObjIndex->level, pObjIndex->short_descr ), 
					0, true, false);
			}
		}
	}

	if(found){
		// output the contents of the linked list
		for(plist=list; plist; plist=plist_next){
			plist_next=plist->next;
			ch->println(plist->name);
			free_string(plist->name);
			delete plist;
		}
		list=NULL;
	}else{
		ch->println( "No objects found when searching for " );
		if(level_search){
			ch->printlnf("level %d items.", level);
		}else{
			ch->printlnf("'%s'.", arg);
		}
	}
	return;
}


/**************************************************************************/
void do_objdesc( char_data *ch, char *argument )
{
	char arg[MIL];
    OBJ_DATA *obj;

	argument = one_argument( argument, arg );

	if(arg[0] == '\0' )
	{
        ch->println( "Syntax: objdesc <object>" );
        return;
	}

    if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
	{
        ch->println( "You do not see that object here." );
	    return;
	}

    string_append(ch, &obj->description);
    return; 
}

/**************************************************************************/
void do_cwhere(char_data *ch, char * )
{
    char buf[MIL];
    BUFFER *buffer;
    OBJ_DATA *obj;
    OBJ_DATA *in_obj;
    bool found;
    int number = 0, max_found;

    found = false;
    number = 0;
    max_found = 200;

	ch->println( "Displaying player corpses." );
	ch->println( "(red has objects still inside)" );
    buffer = new_buf();

    for ( obj = object_list; obj; obj = obj->next )
    {
        if ( !can_see_obj( ch, obj ) || obj->item_type!=ITEM_CORPSE_PC)
            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] (%d)`x\r\n",
                number, obj->short_descr,PERS(in_obj->carried_by, ch),
		in_obj->carried_by->in_room->vnum, obj->timer );
        else if (in_obj->in_room != NULL && can_see_room(ch,in_obj->in_room))
            sprintf( buf, "%3d) %s is in %s [Room %d] (%d)`x\r\n",
					 number, obj->short_descr,in_obj->in_room->name,
	   	in_obj->in_room->vnum, obj->timer);
	else
            sprintf( buf, "%3d) %s is somewhere (%d)`x\r\n",number, 
				obj->short_descr, obj->timer);
 
        buf[0] = UPPER(buf[0]);
        if (obj->item_type==ITEM_CORPSE_PC)
        {
			if (obj->contains)
			{
				if (obj->carried_by){
					add_buf(buffer,"`B");
				}else{
					add_buf(buffer,"`R");
				}
			}else{
				add_buf(buffer,"`g");
			}
        }
        add_buf(buffer,buf);
 
        if (number >= max_found)
            break;
    }
 
    if ( !found )
        ch->println( "There are no player corpses in the game." );
    else
        ch->sendpage(buf_string(buffer));

    free_buf(buffer);
}


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

	bool VnumSearch=false;
	int VnumValue=0;
	bool debugging_object=false;

    found = false;
    number = 0;
    max_found = 200;

	if (IS_NULLSTR(argument))
	{
		ch->println( "Find what?" );
		return;
    }

	if (is_number ( argument )){
		VnumSearch=true;
		VnumValue= atoi(argument);
	}

    buffer = new_buf();
 
    for ( obj = object_list; obj; obj = obj->next )
    {
        if ( !can_see_obj( ch, obj ) 
			||   ch->level < obj->level)
            continue;

		if (VnumSearch){
			if (obj->pIndexData && 
				obj->pIndexData->vnum== VnumValue){
				// do nothing, matching vnum found
			}else{
				continue;
			}
		}else{
			if(!is_name( argument, obj->name ))
				continue;
		}
 
        found = true;
        number++;
 
        for ( in_obj = obj; in_obj->in_obj; in_obj = in_obj->in_obj ){
			// loop thru finding which obj, an object is in
		};

		if(obj->pIndexData){
			sprintf(ovnum, "[%d]",obj->pIndexData->vnum);
		}else{
			ovnum[0]='\0';
		}
 
		if(IS_TRUSTED(ch, ADMIN)){
			if( in_obj->carried_by && in_obj->carried_by->in_room != NULL)
			{
				sprintf( buf, "%3d) %s%s is carried by %s [Room %d]`x\r\n",
					number, obj->short_descr, ovnum, 
					PERS(in_obj->carried_by, ch),
					in_obj->carried_by->in_room->vnum );
			}else if(in_obj->in_room){
				sprintf( buf, "%3d) %s%s is in %s [Room %d]`x\r\n",
					number, obj->short_descr, ovnum, in_obj->in_room->name,
	   				in_obj->in_room->vnum);
			}else{
				sprintf( buf, "%3d) %s%s is somewhere (unknown location)`x\r\n",
					number, obj->short_descr, ovnum);
				DEBUG_OBJECT=obj;
				debugging_object=true;
			}
		}else{
			if( in_obj->carried_by && can_see(ch,in_obj->carried_by)
				 && in_obj->carried_by->in_room != NULL)
			{
				sprintf( buf, "%3d) %s%s is carried by %s [Room %d]`x\r\n",
					number, obj->short_descr, ovnum, 
					PERS(in_obj->carried_by, ch),
					in_obj->carried_by->in_room->vnum );
			}else if(in_obj->in_room && can_see_room(ch,in_obj->in_room)){
				sprintf( buf, "%3d) %s%s is in %s [Room %d]`x\r\n",
					number, obj->short_descr, ovnum, in_obj->in_room->name,
	   				in_obj->in_room->vnum);
			}else{
				sprintf( buf, "%3d) %s%s is somewhere`x\r\n",
					number, obj->short_descr, ovnum);
			}
		}
 
        buf[0] = UPPER(buf[0]);
        if (obj->item_type==ITEM_CORPSE_PC)
        {
			if (obj->contains){			
				add_buf(buffer,"`R");
			}else{
				add_buf(buffer,"`g");
			}
        }

		if (!add_buf(buffer,buf))
		{
			ch->println( "Too many objects... buffer overflow." );
            break;
		} 
 
        if (number >= max_found)
            break;
    }
 
    if ( !found ){
        ch->println( "Nothing like that in heaven or earth." );
    }else{
        ch->sendpage(buf_string(buffer));
	}

    free_buf(buffer);

	if(debugging_object){
		ch->println("`RDEBUG_OBJECT SET TO THE FOLLOWING OBJECT (because location unknown):`x");
		ostat_show_to_char(ch, DEBUG_OBJECT);
	}
}


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

	bool VnumSearch=false;
	int VnumValue=0;

    if ( IS_NULLSTR(argument))
    {
		// show characters logged
		buffer = new_buf();
		char_data *pch;
		for(pch=player_list; pch; pch=pch->next_player)
		{
			// if we can't see them, they don't exist :)
			if(!can_see(ch,pch)){
				continue;
			}

			// character body location
			{
				sprintf(buf,"%3d) [%s%s`x] %-12s is in %s (%s%s`x)\r\n",
					count, 
					colour_table[(pch->in_room->vnum%14)+1].code,
					mxp_create_tagf(ch, "rmvnum", "%5d", pch->in_room->vnum),
					pch->name,
					pch->in_room->name, 
					colour_table[(pch->in_room->area->vnum%14)+1].code,
					pch->in_room->area->name);
				add_buf(buffer,buf);
			}

			// if they switched into something - show that also
			if(pch->controlling && pch->controlling->in_room){
				victim=pch->controlling;
				sprintf(buf,"%3d) [%s%s`x] %-12s `Y(in the body of %s)`x is in %s (%s%s`x)\r\n",
					count, 
					colour_table[(victim->in_room->vnum%14)+1].code,
					mxp_create_tagf(ch, "rmvnum", "%5d", victim->in_room->vnum),
					pch->name,
					victim->short_descr,
					victim->in_room->name, 
					colour_table[(victim->in_room->area->vnum%14)+1].code,
					victim->in_room->area->name);
				add_buf(buffer,buf);				
			}
		}
		ch->sendpage(buf_string(buffer));
		free_buf(buffer);
		return;
    }

    found = false;
    buffer = new_buf();
    for ( victim = char_list; victim; victim = victim->next )
    {	
		if (is_number ( argument )){
			VnumSearch=true;
			VnumValue= atoi(argument);
		}

		if ( victim->in_room != NULL
			&& (VnumSearch?
					(victim->pIndexData && victim->pIndexData->vnum==VnumValue):
					is_name( argument, victim->name )
				)
			 && can_see(ch,victim) )
		{
			found = true;
			count++;
			sprintf( buf, "%3d) [%s] %s `x[%s%s`x] %s\r\n",
				count,
				mxp_create_tagf(ch, FORMATF("mbvnum %d", victim->uid), 
					"%5d", IS_NPC(victim) ? victim->pIndexData->vnum : 0),
				str_width(IS_NPC(victim) ? victim->short_descr : victim->name, 28),
				colour_table[(victim->in_room->vnum%14)+1].code,
				mxp_create_tagf(ch, "rmvnum", "%5d", 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{
    	ch->sendpage(buf_string(buffer));
	}
    free_buf(buffer);
    return;
}


/**************************************************************************/
void do_reboo( char_data *ch, char * )
{
    ch->println( "If you want to REBOOT, spell it out." );
    return;
}

/**************************************************************************/
void do_reboot( char_data *ch, char *argument)
{
    char buf[MSL];
    connection_data *d,*c_next;
    extern char shutdown_filename[MSL];
    char_data *vch, *vch_next;

	if(IS_NULLSTR(argument) || str_cmp("confirm", argument)){
        ch->println("`xType `=Creboot confirm`x to reboot the mud down.");
		ch->println("note: the mud will only automatically start back up if "
			"there is an auto startup script configured.");
		return;
	}

    // record reboot details in shutdown log file
    sprintf( buf, "at %s %s was rebooted by %s.\n===========================",
         (char *) ctime( &current_time ),
         shutdown_filename,
         ch->name );
    append_file( ch, SHUTDOWN_FILE, buf );

    // display reboot message to users
    if (INVIS_LEVEL(ch)< LEVEL_HERO)
    {
        sprintf( buf, "Reboot by %s.  Logon again in 15 seconds.\r\n", ch->name );
    	do_echo( ch, buf );
    }

    // save all the characters
    ch->println( "Saving all player files." );
	for ( vch = char_list; vch != NULL; vch = vch_next )
	{
        vch_next = vch->next;
        if (!IS_NPC(vch))
        {
            save_char_obj( vch );
            vch->println( "You have been automatically saved due to the reboot...  disconnecting." );
            WAIT_STATE(vch,1 * PULSE_VIOLENCE); /* reduced from x4 */
        }
	}

	// save olc work
	reboot_autosave(ch);

    // save all laston data
    ch->println( "Closing and saving all laston records." );
    laston_save(ch);
    ch->println( "Laston save complete." );

    runlevel=RUNLEVEL_SHUTING_DOWN;
    for ( d = connection_list; d != NULL; d = c_next )
    {
		c_next = d->next;
    	connection_close(d);
    }
    
    return;
}


/**************************************************************************/
void do_shutdow( char_data *ch, char *)
{
    ch->println( "If you want to SHUTDO->, spell it out." );
    return;
}

/**************************************************************************/
void do_shutdown( char_data *ch, char *argument)
{
    char buf[MSL];
    char_data *vch, *vch_next;

	if(IS_NULLSTR(argument) || str_cmp("confirm", argument)){
        ch->println("`xType `=Cshutdown confirm`x to shut the mud down.");
		ch->println("note: the mud may automatically start back up if there "
			"is a startup script enabled.");
		return;
	}

    connection_data *d,*c_next;

	write_shutdown_file(ch);

    // display shutdown message to users
    sprintf( buf, "Shutdown by %s.\r\n", ch->name);
    do_echo( ch, buf );


    // save all the characters
    ch->println( "Saving all player files." );
	for ( vch = char_list; vch != NULL; vch = vch_next )
	{
        vch_next = vch->next;
        if (!IS_NPC(vch))
        {
            save_char_obj( vch );
			msp_to_room(MSPT_ACTION, MSP_SOUND_SHUTDOWN, 0, vch, true, false );
			vch->println( "You have been automatically saved due to the shutdown...  disconnecting." );
            WAIT_STATE(vch,1 * PULSE_VIOLENCE); 
        }
	}

	// save olc work
    reboot_autosave(ch);

    // save all laston data
    ch->println( "Closing and saving all laston records." );
    laston_save(ch);
    ch->println( "Laston save complete." );

    runlevel=RUNLEVEL_SHUTING_DOWN;

    for ( d = connection_list; d != NULL; d = c_next)
    {
        c_next = d->next;
        connection_close(d);
    }
    return;
}

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

    if (argument[0] == '\0')
    {
        ch->println( "Protect whom from snooping?" );
        return;
    }

    if ((victim = get_char_world(ch,argument)) == NULL)
    {
        ch->println( "You can't find them." );
        return;
    }

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

/**************************************************************************/
void do_snoop( char_data *ch, char *argument )
{
	char arg[MIL];
	connection_data *c, *sc=NULL;
	char_data *victim=NULL;
	char buf[MSL];

	one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		ch->println( "Snoop whom/which socket number?" );
		return;
    }

	if (is_number(arg))
	{
		int desc= atoi(arg);		
		
		for ( c = connection_list; c && sc==NULL; c = c->next ){
			if ( c->connected_socket == desc ){
				sc=c;
			}
		}

		if(!sc){
			ch->printlnf("Couldn't find any socket number %d on right now to snoop.", desc);
			return;
		}

	}else{
		if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL ){
			ch->printlnf( "Couldn't find any '%s' in the game.", arg );
			return;
		}

		sc=victim->desc;
		if ( !sc){
			ch->println( "No connected socket to snoop." );
			return;
		}		
	}

	// cancel snoops for self
	if ( sc== ch->desc)	{
		ch->println( "Cancelling all snoops." );
		wiznet("$N stops being such a snoop.",
			ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));

		for ( c = connection_list; c; c = c->next ){
			if ( c->snoop_by == ch->desc ){
				c->snoop_by = NULL;
			}
		}
		return;
	}

	// cancel a single existing snoop
	if ( sc->snoop_by == ch->desc){
		ch->printlnf("Canceling snoop on %s.", PERS(victim, ch));
		sc->snoop_by = NULL;
		return;
	}

	// only one snoop at a time
    if ( sc->snoop_by ){
		ch->println( "Busy already.");
		return;
	}

	if(!CH(sc)){
		ch->println( "You can't snoop a connection until a character is attached to it.");
		return;
	}

	// private room checks if player in the game
	if(CH(sc)->in_room){
		if ( ch->in_room != CH(sc)->in_room 
			&& is_room_private_to_char( CH(sc)->in_room, ch ) 
			&& !IS_TRUSTED(ch,CREATOR))
		{
			ch->println( "That character is in a private room." );
			return;
		}
	}

	if ( !IS_TRUSTED(ch, COUNCIL-1) 
		&& (get_trust( victim ) > 20 || IS_LETGAINED( CH(sc) ) ))
	{
		ch->println( "You can't snoop letgained players, or morts of that level/trust." );
		return;
	}

	if ( get_trust( CH(sc) ) >= get_trust( ch )
		|| (IS_SET(CH(sc)->comm,COMM_SNOOP_PROOF) && !IS_TRUSTED(ch, MAX_LEVEL)))
	{
		ch->println( "You failed." );
		return;
	}

	if ( ch->desc )
	{
		for ( c = ch->desc->snoop_by; c; c = c->snoop_by )
		{
			if ( c->character == CH(sc)|| c->original == CH(sc)){
				ch->println( "No snoop loops." );
				return;
			}
		}
	}

    sc->snoop_by = ch->desc;
    sprintf(buf,"$N starts snooping on %s",
		(IS_NPC(ch) ? CH(sc)->short_descr : CH(sc)->name));
    wiznet(buf,ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));

	ch->printlnf("Ok, snooping %s.", PERS(CH(sc), ch));

	return;
}

/**************************************************************************/
void do_commandsnoop( char_data *ch, char *argument )
{
	char arg[MIL];
	connection_data *d;
	char_data *victim;
	char buf[MSL];

    one_argument( argument, arg );

    if ( IS_NULLSTR(arg))
    {
		ch->println( "Command snoop whom?" );
		return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
		ch->println( "They aren't here." );
		return;
	}

    if ( victim->desc == NULL )
    {
		ch->println( "No descriptor to snoop." );
		return;
    }

    if ( victim == ch )
    {
		ch->println( "Cancelling all command snoops." );
		wiznet("$N stops being such a commandsnoop.",
			ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));
		for ( d = connection_list; d != NULL; d = d->next )
		{
			if ( d->command_snoop == ch->desc )
				d->command_snoop = NULL;
		}
		return;
    }

    if ( victim->desc->command_snoop == ch->desc)
    {
		ch->printlnf("Canceling command snoop on %s.", 
			PERS(victim, ch));
		victim->desc->command_snoop  = NULL;
        return;
    }


    if ( victim->desc->command_snoop)
    {
        ch->println( "Busy already." );
        return;
    }

    if (ch->in_room != victim->in_room 
		&& is_room_private_to_char( victim->in_room, ch ) 
		&& !IS_TRUSTED(ch,CREATOR))
    {
        ch->println( "That character is in a private room." );
        return;
    }                   

    if ( !IS_ADMIN(ch) && (get_trust( victim ) > 20
    ||   IS_LETGAINED(victim)))
    {
        ch->println( "You can't command snoop letgained players, or morts of that level/trust." );
        return;
    }


    if ( get_trust( victim ) >= get_trust( ch )
    ||  (IS_SET(victim->comm,COMM_SNOOP_PROOF) && !IS_TRUSTED(ch, MAX_LEVEL)))
    {
        ch->println( "You failed." );
        return;
    }

    victim->desc->command_snoop = ch->desc;
    sprintf(buf,"$N starts command snooping on %s",
		(IS_NPC(ch) ? victim->short_descr : victim->name));
    wiznet(buf,ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));

    ch->printlnf("Ok, command snooping %s.", 
		PERS(victim, ch));

	return;
}

/**************************************************************************/
void do_switch( char_data *ch, char *argument )
{
    char arg[MIL], buf[MSL];
    char_data *victim;

    one_argument( argument, arg );

	// using ' codes are optional
	if(!str_infix("'",argument)){
		argument = one_argument( argument, arg );
	}else{
		strcpy(arg, argument);
	}
    
    if ( arg[0] == '\0' )
    {
        ch->println( "Switch into whom?" );
        return;
    }

    if ( ch->desc == NULL )
	return;
    
    if ( ch->desc->original != NULL )
    {
        ch->println( "You are already switched." );
        return;
    }

    if (ch->desc->editor )
    {
        ch->println( "You can only switch while not in an OLC editor." );
        return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        ch->println( "They aren't here." );
        return;
    }

    if ( victim == ch )
    {
        ch->println( "You are already controlling yourself." );
        return;
    }

    if (!IS_NPC(victim))
    {
        ch->println( "You can only switch into mobiles." );
        return;
    }


    if (ch->in_room != victim->in_room 
		&& is_room_private_to_char( victim->in_room, ch ) 
		&& !IS_TRUSTED(ch,CREATOR))
    {
        ch->println( "That character is in a private room." );
        return;
    }

    if ( victim->desc != NULL )
    {
        ch->println( "Character in use." );
        return;
    }

	// questing wiznet
	if (TRUE_CH(ch))
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s `Mswitches`m into '%s'\n(%s)[%d]`x", 
			TRUE_CH(ch)->name, victim->short_descr, 
			victim->name, victim->in_room->vnum);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}

    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;
    ch->controlling     = victim; // so switched imms aren't marked as idle/linkdead

    // change communications to match
    if (ch->prompt != NULL){
        victim->prompt = str_dup(ch->prompt);
	}

    victim->comm = ch->comm;
    victim->lines = ch->lines;
	victim->colour_prefix = ch->colour_prefix;
      
    victim->printlnf("`=\x8c""You are now controlling %s\r\n"
        "vnum: %d  level: %d  language: %s`x",
        victim->short_descr,  victim->pIndexData->vnum,
        victim->level, victim->language->name);
	victim->printlnf("note: you can use the `=C%s`x command to return to your original body.",
		mxp_create_send(ch, "return"));
	victim->printlnf("note: you can use the `=C%s`x command to toggle the addition prompt details.",
		mxp_create_send(ch, "switchprefix"));
    do_look(victim, "auto");

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

    return;
}


/**************************************************************************/
void do_return( char_data *ch, char *)
{
    char buf[MSL];

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

    if(ch->desc->original && !IS_IMMORTAL(ch->desc->original)){
 		do_huh(ch, "");
 		return;
    }

    if ( ch->desc->original == NULL )
    {
		if(IS_IMMORTAL(ch)){
			ch->println( "You aren't switched." );
		}else{
			do_huh(ch,"");
		}
        return;
    }

    ch->println( "You return to your original body." );

	if (ch->prompt != NULL){
        free_string(ch->prompt);
        ch->prompt = NULL;
    }

	// questing wiznet
	if (TRUE_CH(ch))
	{
		char qbuf[MSL];
		sprintf (qbuf, "`mQUEST> %s `Mreturns`m from '%s'\n(%s)[%d]`x", 
			TRUE_CH(ch)->name, ch->short_descr, ch->name, 
			ch->in_room?ch->in_room->vnum:0);
		wiznet(qbuf,ch,NULL,WIZ_QUESTING,0,LEVEL_IMMORTAL);
	}

    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;
	char_data *original=ch->desc->original;
	ch->desc->original        = NULL;
    ch->desc->character->desc = ch->desc;
    ch->desc->character->controlling = NULL; // no longer controlling this mob
    ch->desc                  = NULL;   
    ch->last_force = tick_counter;
	
	do_look(original,"brief");
    return;
}

/**************************************************************************/
/* trust levels for load and clone */
bool obj_check (char_data *ch, OBJ_DATA *obj)
{
    if (IS_TRUSTED(ch,GUARDIAN)
    || (IS_TRUSTED(ch,IMMORTAL) && obj->level <= 30 && obj->cost <= 1000)
    || (IS_TRUSTED(ch,DEMI)     && obj->level <= 20 && obj->cost <= 500)
    || (IS_TRUSTED(ch,ANGEL)    && obj->level <= 10 && 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);
	    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[MIL];
    char *rest;
    char_data *mob;
	 OBJ_DATA  *obj;

    rest = one_argument(argument,arg);

    if (arg[0] == '\0')
    {
		ch->println( "Clone what?" );
		return;
	}

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

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

		if (!obj_check(ch,obj))
		{
			ch->println( "Your powers are not great enough for such a task." );
			return;
		}

		clone = create_object(obj->pIndexData); 
		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[MSL];
		if (!IS_NPC(mob))
		{
			ch->println( "You can only clone mobiles." );
			return;
		}
		if ((mob->level > 20 && !IS_TRUSTED(ch,GUARDIAN))
			||  (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))

		{
			ch->println( "Your powers are not great enough for such a task." );
			return;
		}
		
		clone = create_mobile(mob->pIndexData, 0);
		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);
				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;
	}
}


/**************************************************************************/
void do_load(char_data *ch, char *argument )
{
	char arg[MIL];
	
    argument = one_argument(argument,arg);
	
	if (arg[0] == '\0')
    {
		ch->println( "Syntax:" );
		ch->println( "  load mob <vnum>" );
		ch->println( "  load obj <vnum> <level>" );
		return;
    }
	
    if (!str_cmp(arg,"mob") || !str_cmp(arg,"char"))
    {
		do_mload(ch,argument);
		return;
    }
	
    if (!str_cmp(arg,"obj") || !str_cmp(arg,"object"))
    {
		if(GAMESETTING5(GAMESET5_DEDICATED_OLC_BUILDING_MUD)){
			// allow object loading on dedicated OLC muds for < 95
			if(!IS_TRUSTED(ch, game_settings->min_level_to_load_objects)){
				ch->printlnf("You must have a trust of %d or higher to load objects.", 
					game_settings->min_level_to_load_objects);
			}else{
				do_oload(ch,argument);
			}
		}else{ 
			do_oload( ch, argument); 
		}
		return;
    }
    // echo syntax
    do_load(ch,"");
}

/**************************************************************************/
void do_mload( char_data *ch, char *argument )
{
    char arg[MIL];
    MOB_INDEX_DATA *pMobIndex;
    char_data *victim;
    char buf[MSL];
    
    one_argument( argument, arg );

    if ( arg[0] == '\0' || !is_number(arg) )
    {
		ch->println( "Syntax: load mob <vnum>." );
		return;
    }

    if ( ( pMobIndex = get_mob_index( atoi( arg ) ) ) == NULL )
    {
		ch->println( "No mob has that vnum." );
		return;
    }

    victim = create_mobile( pMobIndex, 0 );
    char_to_room( victim, ch->in_room );
	// make it so they dont wander away straight away
	victim->last_force = tick_counter; 
    act( "$n has created $N!", ch, NULL, victim, TO_ROOM );
	if (INVIS_LEVEL(ch))
		ch->printlnf("[Wizi %d] You have created %s!", 
		INVIS_LEVEL(ch), victim->short_descr);
	else
		ch->printlnf("You have created %s!", victim->short_descr);

	sprintf(buf,"$N loads %s.",victim->short_descr);
	wiznet(buf,ch,NULL,WIZ_LOAD,WIZ_SECURE,get_trust(ch));

	return;
}


/**************************************************************************/
void do_oload( char_data *ch, char *argument )
{
    char arg1[MIL] ,arg2[MIL];
    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))
    {
		ch->println( "Syntax: load obj <vnum> <level>." );
		return;
    }
    
	level = get_trust(ch); // default 
  
    if ( arg2[0] != '\0')  // load with a level 
    {
		if (!is_number(arg2))
        {
			ch->println( "Syntax: oload <vnum> <level>." );
			return;
		}
        level = atoi(arg2);
        if (level < 0 || level > get_trust(ch))
		{
			ch->println( "Level must be be between 0 and your level." );
			return;
		}
    }

    if ( ( pObjIndex = get_obj_index( atoi( arg1 ) ) ) == NULL )
    {
		ch->println( "No object has that vnum." );
		return;
    }

    obj = create_object( pObjIndex);

	// all tokens are 'takeable' 
	if(obj->item_type==ITEM_TOKEN){
		SET_BIT(obj->wear_flags, OBJWEAR_TAKE);
	}

	if ( CAN_WEAR(obj, OBJWEAR_TAKE) ){
		obj_to_char( obj, ch );
		if (INVIS_LEVEL(ch)){
			ch->printlnf("[Wizi %d] You have created '%s' and it is now in your inventory!", 
				INVIS_LEVEL(ch), obj->short_descr);
		}else{
			ch->printlnf("You have created '%s' and it is now in your inventory!", 
				obj->short_descr);
		}
	}else{
		obj_to_room( obj, ch->in_room );
		if (INVIS_LEVEL(ch)){
			ch->printlnf("[Wizi %d] You have created '%s' and put it on the floor!", 
				INVIS_LEVEL(ch), obj->short_descr);
		}else{
			ch->printlnf("You have created '%s' and put it on the floor!", 
				obj->short_descr);
		}
	}
    act( "$n has created $p!", ch, obj, NULL, TO_ROOM );


    wiznet("$N loads $p.",ch,obj,WIZ_LOAD,WIZ_SECURE,get_trust(ch));
    return;
}

/**************************************************************************/
void do_purge( char_data *ch, char *argument )
{
    char arg[MIL];
    char buf[100];
    char_data *victim;
    OBJ_DATA *obj;
    connection_data *d;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
		// 'purge' the whole room
		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,OBJEXTRA_NOPURGE))
			  extract_obj( obj );
		}

		act( "$n purges the room!", ch, NULL, NULL, TO_ROOM);
		ch->in_room->last_mined_in_room=0; // clear the last mined stats
		ch->println( "Ok, room purged." );
		return;
    }

	// check for objects and mobs in room to purge
	if ( ( obj = get_obj_list( ch, arg, ch->in_room->contents ) ) != NULL ){
		if (!IS_OBJ_STAT(obj,OBJEXTRA_NOPURGE)){
			ch->printlnf( "Single object (%s) purged.", format_obj_to_char( obj, ch, true));
			extract_obj(obj);
		}else{
			ch->printlnf( "Single object (%s) was purged even though it is flagged no purge.",
				format_obj_to_char( obj, ch, true));
			extract_obj(obj);			
		}
		return;
	}

	// first try a mob/player in the current room
	if ( ( victim = get_char_room( ch, arg ) ) == NULL ){
		// if that fails, try all players on visible on the wholist
		if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL ){
			ch->println( "They aren't here." );
			return;
		}
    }
	

    if ( !IS_NPC(victim) ){
		if (ch == victim || !IS_IMMORTAL(ch)){
			ch->println( "Ho ho ho." );
			return;
		}

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

		act("$n disintegrates $N.",ch,0,victim,TO_NOTVICT);
		
		ch->printlnf("Purging %s",victim->name);

		sprintf(buf, 
		"The all powerful %s has ripped you to shreds with %s bare hands,\r\n"
		"your atoms are scattered!\r\n", 
			TRUE_CH(ch)->name, TRUE_CH(ch)->sex==SEX_MALE?"his":"her");
		
    		d = victim->desc;
			if (d){// display a nice little message to them
				d->write(buf, 0);
			}
			if (victim->level > 1){
				save_char_obj( victim );
			}
    		extract_char( victim, true );
			if ( d){
				connection_close( d );
			}

		return;
    }

    act( "$n purges $N.", ch, NULL, victim, TO_NOTVICT );
    act( "You purge $N.", ch, NULL, victim, TO_CHAR );
    extract_char( victim, true );
    return;
}

/**************************************************************************/
// purges rooms for those with olc access in the area
void do_rpurge(char_data *ch,char *)
{
	if (!HAS_SECURITY(ch,2))
	{
		ch->println( "You must have an olc security 2 or higher to use this command." );
		return;
	}

	if ( !IS_BUILDER( ch, ch->in_room->area, BUILDRESTRICT_ROOMS ) )
	{
		ch->println( "Insufficient security to modify the area you are in." );
        return;
	}

	if (!IS_SET(ch->in_room->area->area_flags, AREA_OLCONLY) )
	{
		ch->println( "This command can't be used in live areas." );
		return;
	}

	do_purge( ch, "");
	ch->println( "`xRoom purged... type `=Credit reset`x to reapply resets." );
	
}

/**************************************************************************/
void do_update( char_data *ch, char *argument )
{
	char arg1[MIL];
	char arg2[MIL];
	char_data *victim;
	int amount;
	int i;

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

	if(arg1[0] == '\0' || arg2[0]=='\0' || !is_number(arg2))
	{
		ch->println( "Syntax: update <char> <times>");
		return;
	}

	if( (victim=get_char_world(ch,arg1) ) == NULL )
	{
		ch->println( "They are not here." );
		return;
	}

	if(IS_NPC(victim))
		return;
	
	amount=atoi(arg2);

	for(i=0; i<amount; i++)
		on_level_learn(victim);

	return;
}

/**************************************************************************/
void do_advance( char_data *ch, char *argument )
{
    char arg1[MIL];
    char arg2[MIL];
    char_data *victim;
    int level;
    int iLevel;
	bool not_letgained=false;

	if(IS_NPC(ch)){
		ch->println("Players online sorry.");
		return;
	}

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

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

	if ( ( victim = get_whovis_player_world( ch, arg1 ) ) == NULL )
	{
		ch->println( "That player is not here." );
		return;
	}

	if ( IS_NPC(victim) )
	{
		ch->println( "Not on NPC's." );
		return;
	}

    if ( ( level = atoi( arg2 ) ) < 1 || level > ABSOLUTE_MAX_LEVEL )
    {
        ch->printlnf("Level must be 1 to %d.", ABSOLUTE_MAX_LEVEL );
        return;
    }

    if ( level > get_trust( ch ) )
    {
        ch->println( "Limited to your trust level." );
        return;
    }

    if ( get_trust( victim ) > get_trust( ch) && (get_trust( victim )<=ABSOLUTE_MAX_LEVEL) ){
        ch->println( "Their trust/level is higher than yours... you can't do that." );
		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;

		ch->println( "Lowering a player's level!" );
		victim->println( "**** OOOOHHHHHHHHHH  NNNNOOOO ****" );
        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 );
        victim->practice = temp_prac;
    }else{
		ch->println( "Raising a player's level!" );
		victim->println( "**** OOOOHHHHHHHHHH  YYYYEEEESSS ****" );
    }

	if(!IS_LETGAINED(victim)){
		not_letgained=true;
		SET_BIT(victim->act,PLR_CAN_ADVANCE);
	}
	// can't get yourself into a situation where you lower your 
	// level and lose your ability to up it again
	if(ch==victim){
		if(level<ch->level && level>ch->trust){
			ch->trust=level;
			ch->printlnf("Your trust has been increased to %d to "
				"compenstate the drop in level.", level);
		}
	}
    for ( iLevel = victim->level ; iLevel < level; iLevel++ )
    {
        victim->print( "You raise a level!!  " );
        victim->level += 1;
        advance_level( victim );
    }
    victim->exp   = exp_per_level(victim,victim->pcdata->points)
		  * UMAX( 1, victim->level );
	if(victim!=ch){
	    victim->trust = 0;
		ch->printlnf("Trust set to 0 on %s", victim->name);
	}

    // reset RPS score 
    if (victim->pcdata->rp_points<0){
        victim->pcdata->rp_points = 0;
	}

	// move the pfile if required
	{
		PFILE_TYPE pt=get_pfiletype(victim);
		if(victim->pcdata->pfiletype!=pt){
			rename(pfilename(victim->name,victim->pcdata->pfiletype),
				pfilename(victim->name,pt)); // move the file
			victim->pcdata->pfiletype=pt;
		}
	}
	if(not_letgained){
		REMOVE_BIT(victim->act,PLR_CAN_ADVANCE);
		ch->printlnf("Note: %s isn't letgained.", victim->name);
	}

	if(IS_IMMORTAL(victim)){
		victim->wrapln("Immortal hint, you can set some default wiznet "
			"settings using 'wiznetdefault confirm'.");
	}
	laston_update_char(victim);
    save_char_obj(victim);
    return;
}

/**************************************************************************/
/* tadvance is advance without the change in trust */
void do_tadvance( char_data *ch, char *argument )
{
    char arg1[MIL];
    char arg2[MIL];
    char_data *victim;
    int level;
    int iLevel;
	bool not_letgained=false;

	if(IS_NPC(ch)){
		ch->println("Players online sorry.");
		return;
	}

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

    if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
    {
        ch->println( "Syntax: tadvance <char> <level>." );
        return;
    }

    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
        ch->println( "That player is not here." );
        return;
    }

    if ( IS_NPC(victim) )
    {
        ch->println( "Not on NPC's." );
        return;
    }

    if ( ( level = atoi( arg2 ) ) < 1 || level > ABSOLUTE_MAX_LEVEL )
    {
        ch->printlnf("Level must be 1 to %d.", ABSOLUTE_MAX_LEVEL );
        return;
    }

    if ( level > get_trust( ch ) )
    {
        ch->println( "Limited to your trust level." );
        return;
    }

    if ( get_trust( victim ) > get_trust( ch) && (get_trust( victim )<=ABSOLUTE_MAX_LEVEL) )
    {
        ch->println( "Their trust/level is higher than yours... you can't do that." );
        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;

        ch->println( "Lowering a player's level!" );
        victim->println( "**** OOOOHHHHHHHHHH  NNNNOOOO ****" );
        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 );
        victim->practice = temp_prac;
    }
    else
    {
        ch->println( "Raising a player's level!" );
        victim->println( "**** OOOOHHHHHHHHHH  YYYYEEEESSS ****" );
    }

	if(!IS_LETGAINED(victim)){
		not_letgained=true;
		SET_BIT(victim->act,PLR_CAN_ADVANCE);
	}
    for ( iLevel = victim->level ; iLevel < level; iLevel++ )
    {
        victim->print( "You raise a level!!  " );
        victim->level += 1;
        advance_level( victim );
    }
    victim->exp   = exp_per_level(victim,victim->pcdata->points)
		  * UMAX( 1, victim->level );

    /* reset RPS score */
    if (victim->pcdata->rp_points<0)
        victim->pcdata->rp_points = 0;

    ch->printlnf("Advanced to %d, trust = %d ", level, victim->trust);

	// move the pfile if required
	{
		PFILE_TYPE pt=get_pfiletype(victim);
		if(victim->pcdata->pfiletype!=pt){
			rename(pfilename(victim->name,victim->pcdata->pfiletype),
				pfilename(victim->name,pt)); // move the file
			victim->pcdata->pfiletype=pt;
		}
	}

	if(not_letgained){
		REMOVE_BIT(victim->act,PLR_CAN_ADVANCE);
		ch->printlnf("Note: %s isn't letgained.", victim->name);
	}

	laston_update_char(victim);
    save_char_obj(victim);
    return;
}

/**************************************************************************/
void do_trust( char_data *ch, char *argument )
{
    char arg1[MIL];
    char arg2[MIL];
    char_data *victim;
    int level;

	if(IS_NPC(ch)){
		ch->println("Players online sorry.");
		return;
	}

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

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

    if ( ( victim = get_whovis_player_world( ch, arg1 ) ) == NULL )
    {
        ch->println( "That player is not here." );
        return;
    }

    if ( IS_NPC(victim) )
    {
        ch->println( "Not on NPC's." );
        return;
    }

    level = atoi( arg2 );

    if ( level < 0 || level > ABSOLUTE_MAX_LEVEL)
    {
        ch->printlnf( "Level must be 0 (reset) or 1 to %d.\r\n"
			"And not higher than your current trust.", ABSOLUTE_MAX_LEVEL);
        return;
    }

    if ( level > get_trust( ch ) )
    {
        ch->println( "Limited to your trust - not set." );
        return;
    }

	if( victim->level== level ){
		ch->println("A trust of 0 is the same as a trust of their level... setting it to 0.");
		level=0;
	}

	if( victim->trust== level ){
		ch->printlnf("%s's trust is already at %d", PERS(victim, ch), level);
		return;
	}


    ch->printlnf("Trust on %s has been changed from %d to %d",
        victim->name, victim->trust, level);
    victim->trust = level;

	// move the pfile if required
	{
		PFILE_TYPE pt=get_pfiletype(victim);
		if(victim->pcdata->pfiletype!=pt){
			rename(pfilename(victim->name,victim->pcdata->pfiletype),
				pfilename(victim->name,pt)); // move the file
			victim->pcdata->pfiletype=pt;
		}
	}

	laston_update_char(victim);
    save_char_obj(victim);

    return;
}

/**************************************************************************/
void restore_victim( char_data *ch, char_data *victim)
{
	affect_parentspellfunc_strip( victim, gsn_plague		);
	affect_parentspellfunc_strip( victim, gsn_poison		);
	affect_parentspellfunc_strip( victim, gsn_blindness		);
	affect_parentspellfunc_strip( victim, gsn_sleep			);
	affect_parentspellfunc_strip( victim, gsn_curse			);
	affect_parentspellfunc_strip( victim, gsn_cause_fear	);
	affect_parentspellfunc_strip( victim, gsn_fear_magic    );
	affect_parentspellfunc_strip( victim, gsn_thorny_feet	);
	affect_parentspellfunc_strip( victim, gsn_chaotic_poison);
	affect_parentspellfunc_strip( victim, gsn_cause_headache);
    affect_strip(victim, gsn_neck_thrust);
	
	// subdue
	victim->subdued = false;
	victim->subdued_timer=0;
	
	if(!IS_NPC(victim))
	{
		// tiredness
		victim->pcdata->tired=UMIN(0, victim->pcdata->tired);

		// conditions
		victim->pcdata->condition[COND_THIRST]=
			UMAX(30, victim->pcdata->condition[COND_THIRST]);
		victim->pcdata->condition[COND_HUNGER]=
			UMAX(30,victim->pcdata->condition[COND_HUNGER]);
		victim->pcdata->condition[COND_FULL]=
			UMIN(0,victim->pcdata->condition[COND_FULL]);
	    victim->pcdata->condition[COND_DRUNK]=
			UMIN(0,victim->pcdata->condition[COND_DRUNK]);
	}
	victim->hit 	= victim->max_hit;
	victim->mana	= victim->max_mana;
	victim->move	= victim->max_move;
	
	update_pos( victim);
	
	if (ch && victim->in_room != NULL)
	{
		if (!IS_SILENT(ch) || IS_IMMORTAL(victim))
		{
			if (IS_NPC(ch))
			{
				act( "$n has restored you!", ch, NULL, victim, TO_VICT);
			}else{
				if (can_see_who(victim, TRUE_CH(ch))){
					victim->printlnf("%s has restored you.", TRUE_CH(ch)->name);
				}else{
					victim->println("a mystery imm has restored you.");
				}
				msp_to_room(MSPT_ACTION, MSP_SOUND_RESTORE, 0, victim, true, false );
			}
		}
	}
}
/**************************************************************************/
void do_restore( char_data *ch, char *argument )
{
    char arg[MIL], buf[MSL];
	char_data *victim;
	char_data *vch;
	connection_data *d;

	one_argument( argument, arg );
	if (IS_NULLSTR(arg) || !str_cmp(arg,"room"))
	{
		// restore room
		for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
		{
			restore_victim( ch, vch);
        }
        sprintf(buf,"$N restored room %d.",ch->in_room->vnum);
        wiznet(buf,ch,NULL,WIZ_QUESTING,WIZ_SECURE,get_trust(ch));      
		ch->println("Room restored." );
        return;
    }

	if ( get_trust(ch) >=  MAX_LEVEL - 3 && !str_cmp(arg,"all"))
	{
		// restore all players in the game
		for (d = connection_list; d != NULL; d = d->next)
		{
			victim = d->character;

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

			restore_victim( ch, victim);
		}
		ch->println( "All active players restored." );
		return;
	}

	// restore a specific player/mob
	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
	}

	if ( !can_see_who( ch, victim ))
	{
		ch->println( "They aren't here." );
		return;
	}

	restore_victim( ch, victim);

	sprintf(buf,"$N restored %s", IS_NPC(victim) ? victim->short_descr : victim->name);
	wiznet(buf,ch,NULL,WIZ_QUESTING,WIZ_SECURE,get_trust(ch));

	if (IS_SILENT(ch)){
		ch->printlnf("Ok - restore done sliently on %s.", victim->name );
	}else{
		ch->printlnf("Ok - restore done on %s.", victim->name );
	}
	return;
}
/**************************************************************************/
void boon_victim( char_data *ch, char_data *victim)
{
	if(IS_NPC(victim)){ // dont boon mobs at this stage :)
		return;
	}
	restore_victim( NULL, victim);

	affect_parentspellfunc_strip( victim, gsn_bless);
	affect_parentspellfunc_strip( victim, gsn_armor);
	affect_parentspellfunc_strip( victim, gsn_giant_strength);
	affect_parentspellfunc_strip( victim, gsn_illusions_grandeur);
	affect_parentspellfunc_strip( victim, gsn_shield);
	affect_parentspellfunc_strip( victim, gsn_sanctuary);	
	spell_bless(				gsn_bless,				ch->level, ch, victim, TARGET_CHAR);
	spell_armor(				gsn_armor,				ch->level, ch, victim, TARGET_CHAR);
	spell_giant_strength(		gsn_giant_strength,		ch->level, ch, victim, TARGET_CHAR);	
	spell_illusions_grandeur(	gsn_illusions_grandeur,	ch->level, ch, victim, TARGET_CHAR);
	spell_shield(				gsn_shield,				ch->level, ch, victim, TARGET_CHAR);
	spell_sanctuary(			gsn_sanctuary,			ch->level, ch, victim, TARGET_CHAR);
	
	if (victim->in_room != NULL)
	{
		if (!IS_SILENT(ch) || IS_IMMORTAL(victim))
		{
			if (IS_NPC(ch))
			{
				act( "$n has given you a boon from the gods!", ch, NULL, victim, TO_VICT);
			}else{
				if (can_see_who(victim, TRUE_CH(ch))){
					victim->printlnf("%s has given you a boon from the gods!", TRUE_CH(ch)->name);
				}else{
					victim->println("a mystery imm has given you a boon from the gods!");
				}
				msp_to_room(MSPT_ACTION, MSP_SOUND_RESTORE, 0, victim, true, false );
			}
		}
	}	
}

/**************************************************************************/
// Kal - Jan 99
void do_boon( char_data *ch, char *argument )
{
    char arg[MIL], buf[MSL];
	char_data *victim;
	char_data *vch;

	one_argument( argument, arg );
	if (IS_NULLSTR(arg) || !str_cmp(arg,"room"))
	{
		// boon room
		for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
		{
			boon_victim( ch, vch);
        }
        sprintf(buf,"$N boon'd room %d.",ch->in_room->vnum);
        wiznet(buf,ch,NULL,WIZ_QUESTING,WIZ_SECURE,get_trust(ch));      
		ch->println( "Room boon'd." );
        return;
    }

	if ( get_trust(ch) >=  MAX_LEVEL - 3 && !str_cmp(arg,"all"))
	{
		// restore all players in the game
		for(victim=player_list; victim; victim=victim->next_player)
		{
			if(IS_NPC(victim))
				continue;

			boon_victim( ch, victim);
		}
		ch->println( "All active players boon'd." );
		return;
	}

	// restore a specific player/mob
	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
	}
	boon_victim( ch, victim);

	sprintf(buf,"$N restored %s", IS_NPC(victim) ? victim->short_descr : victim->name);
	wiznet(buf,ch,NULL,WIZ_QUESTING,WIZ_SECURE,get_trust(ch));

	if (IS_SILENT(ch)){
		ch->printlnf("Ok - boon done sliently on %s.", victim->name );
	}else{
		ch->printlnf("Ok - boon done on %s.", victim->name );
	}
	return;
}

/**************************************************************************/
void do_freeze( char_data *ch, char *argument )
{
	char arg[MIL],buf[MSL];
	char_data *victim;
	
	one_argument( argument, arg );
	
	if ( arg[0] == '\0' )
	{
		ch->println( "Freeze whom?" );
		return;
    }
	
    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
		ch->println( "They aren't here." );
		return;
    }
	
    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }

	if ( victim==ch){
		ch->println( "And how would you unfreeze yourself if you did that?" );
		return;
	}
	
    if ( get_trust( victim ) >= get_trust( ch ) )
    {
		ch->println( "You failed." );
		return;
	}
	
    if ( IS_SET(victim->act, PLR_FREEZE) )
    {
		REMOVE_BIT(victim->act, PLR_FREEZE);
		victim->println( "You can play again." );
		ch->println( "FREEZE removed." );
		sprintf(buf,"$N thaws %s.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
    }
    else
    {
		SET_BIT(victim->act, PLR_FREEZE);
		victim->println( "You can't do ANYthing!" );
		ch->println( "FREEZE set." );
		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[MIL];
    char_data *victim;
    char buf[MSL];

    one_argument( argument, arg );

	if ( arg[0] == '\0' )
	{
		ch->println( "Log whom?" );
		return;
	}

	if ( !str_cmp( arg, "all" ) )
	{
		if ( fLogAll )
		{
			fLogAll = false;
			ch->println( "Log ALL off." );
		}
		else
		{
			fLogAll = true;
			ch->println( "Log ALL on." );
		}
		return;
	}

	if ( !str_cmp( arg, "memory" ) )
	{
		if ( log_memory )
		{
			log_memory= false;
			ch->println( "Log memory off." );
		}
		else
		{
			log_memory= true;
			ch->println( "Log memory on." );
		}
		return;
	}

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
    }

    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }

    // No level check, imms can log anyone.
    if ( IS_SET(victim->act, PLR_LOG) )
    {
        REMOVE_BIT(victim->act, PLR_LOG);
        sprintf( buf, "Player log turned OFF by %s", ch->name);
        append_playerlog( victim, buf);
        ch->printlnf("LOG removed on %s.", victim->name);
    }
    else
    {
        SET_BIT(victim->act, PLR_LOG);
        sprintf( buf, "Player log turned ON by %s", ch->name);
        append_playerlog( victim, buf);
        ch->printlnf("LOG set on %s.", victim->name);
    }

    save_char_obj( victim );
    return;
}

/**************************************************************************/
void do_spelldebug( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
	{
		ch->println( "Spelldebug whom?" );
		return;
    }

    
    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
    }

    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }

    /*
     * No level check, gods can spell debug anyone.
     */
    if ( IS_SET(victim->comm, COMM_SPELL_DEBUG) )
    {
        REMOVE_BIT(victim->comm, COMM_SPELL_DEBUG);
        ch->println( "Spelldebug removed." );
    }
    else
    {
        SET_BIT(victim->comm, COMM_SPELL_DEBUG);
        ch->println( "Spelldebug set." );
    }

    return;
}

/**************************************************************************/
void do_noemote( char_data *ch, char *argument )
{
    char arg[MIL],buf[MSL];
    char_data *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
		ch->println( "Noemote whom?" );
		return;
	}

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
		ch->println( "They aren't here." );
		return;
    }


    if ( get_trust( victim ) >= get_trust( ch ) )
    {
		ch->println( "You failed." );
		return;
    }

    if ( IS_SET(victim->comm, COMM_NOEMOTE) )
    {
		REMOVE_BIT(victim->comm, COMM_NOEMOTE);
		victim->println( "You can emote again." );
		ch->println( "NOEMOTE removed." );
		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);
		victim->println( "You can't emote!" );
		ch->println( "NOEMOTE set." );
		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[MIL],buf[MSL];
    char_data *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
		ch->println( "Noshout whom?" );
		return;
	}

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
		ch->println( "They aren't here." );
		return;
    }

    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
		ch->println( "You failed." );
		return;
    }

    if ( IS_SET(victim->comm, COMM_NOSHOUT) )
    {
		REMOVE_BIT(victim->comm, COMM_NOSHOUT);
		victim->println( "You can shout again." );
		ch->println( "NOSHOUT removed." );
		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);
		victim->println( "You can't shout!" );
		ch->println( "NOSHOUT set." );
		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[MIL],buf[MSL];
	char_data *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
		ch->println( "Notell whom?" );
		return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
		ch->println( "They aren't here." );
		return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
		ch->println( "You failed." );
		return;
    }

    if ( IS_SET(victim->comm, COMM_NOTELL) )
    {
		REMOVE_BIT(victim->comm, COMM_NOTELL);
		victim->println( "You can use tells again." );
		ch->println( "NOTELL removed." );
		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);
		victim->println( "You can't use tells!" );
		ch->println( "NOTELL set." );
		sprintf(buf,"$N revokes %s's tells.",victim->name);
		wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
    }

    return;
}

/**************************************************************************/
void do_xpen( char_data *ch, char *argument )
{
	char arg[MIL], arg2[MIL];
	char_data *victim;

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

	if ( IS_NULLSTR(arg))
	{
		ch->println( "Syntax: xpen <character> <ticks>" );
		ch->println( "xpen - Experience penalize players "
			"- they get 0 xp for the amount of ticks set." );
		ch->println( "Penalize whom?" );
		return;
	}

	if ( IS_NULLSTR(arg2))
	{
		ch->println( "Syntax: xpen <character> <ticks>" );
		ch->println( "xpen - Experience penalize players "
			"- they get 0 xp for the amount of ticks set." );
		ch->printlnf("Penalize '%s' how much?", arg);
		return;
	}

	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
	}

	if(IS_NPC(victim)){
		ch->println( "On players only sorry." );
		return;
	}

	if ( get_trust( victim ) >= get_trust( ch ) )
	{
		ch->println( "You failed." );
		return;
	}

	if(is_number(arg2))
	{
		int value=atoi(arg2);
		if(value){
			ch->printlnf("Xpen of %d set on %s", value, PERS(victim, ch));
			victim->pcdata->xp_penalty=value;
		}else{
			ch->println( "xpen - Experience penalize players "
				"- they get 0 xp for the amount of ticks set." );
			ch->println( "Syntax: xpen <character> <ticks>" );
		}
	}else{
		ch->println("The amount of the xp penatly must be numeric.");
	}
	return;
}


/**************************************************************************/
void do_peace( char_data *ch, char *)
{
    char_data *rch;

    for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
    {
		if ( rch->fighting){			
			ch->printlnf("---%s stops fighting %s", CPERS(rch, ch), PERS(rch->fighting, ch));
			if(rch->fighting->fighting==ch){
				ch->printlnf("---%s stops fighting %s", CPERS(rch->fighting, ch), PERS(rch, ch));
			}
			stop_fighting( rch, true );
		}
		if (IS_NPC(rch) && IS_SET(rch->act,ACT_AGGRESSIVE)){
			ch->printlnf("Aggressive flag removed on %s", PERS(rch, ch));
			REMOVE_BIT(rch->act,ACT_AGGRESSIVE);
		}
		mobRememberClear( rch );
    }

    ch->println( "You bring peace to the room." );
    return;
}

/**************************************************************************/
void do_slay( char_data *ch, char *argument )
{
    char_data *victim;
    char arg[MIL];
	
    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
		ch->println( "Slay whom?" );
		return;
    }
	
    if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {
		ch->println( "They aren't here." );
		return;
    }
	
    if ( ch == victim )
    {
		ch->println( "Suicide is a mortal sin." );
		return;
    }
	
    if ( !IS_NPC(victim)){
		if((victim->level >= get_trust(ch)) || !IS_ICIMMORTAL(ch))
		{
			ch->println( "You failed." );
			return;
		}
	}
	
    act( "You slay $M in cold blood!",  ch, NULL, victim, TO_CHAR    );
    act( "$n slays you in cold blood!", ch, NULL, victim, TO_VICT    );
    act( "$n slays $N in cold blood!",  ch, NULL, victim, TO_NOTVICT );
    raw_kill( victim, ch );
    return;
}
/**************************************************************************/
void do_allowimmtalk( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;

    argument=one_argument( argument, arg );

    if ( IS_NULLSTR(arg) ){
		ch->println( "Give immtalk ablities to which mortal?" );
		return;
    }
    
    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
    }

    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }

    if ( IS_IMMORTAL(victim) )
    {
		ch->printlnf("%s is already an immortal.", PERS(victim, ch));
		return;
    }

    if(!IS_NULLSTR(victim->pcdata->immtalk_name))
    {
		ch->printlnf("Immtalk ability removed from %s.",PERS(victim, ch));
		replace_string(victim->pcdata->immtalk_name,"");
    }else{ // Adding an immtalk name
		char immname[MIL];
		one_argument(argument, immname);
		if(IS_NULLSTR(immname)){
			ch->println("To give immtalk to a mortal, you must specify the name of the imm they play also.");
			ch->println("syntax: allowimmtalk <playername> <immname>");
			return;
		}
		if(count_char(immname, COLOURCODE)){
			ch->println("You can't have colour code characters in immtalk names.");
			return;
		}
		ch->printlnf("Immtalk ability granted to %s (%s).",
			PERS(victim, ch), capitalize(immname));
		replace_string(victim->pcdata->immtalk_name,capitalize(immname));
    }
    save_char_obj( victim );
    return;
}
/**************************************************************************/
void do_ignoremultilogins( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
	{
		ch->println( "Ignore multiloggings on who?" );
		return;
    }
    
    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
    }

    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }


    if (HAS_CONFIG(victim, CONFIG_IGNORE_MULTILOGINS))
    {
		ch->printlnf("Multilogins are now seen on %s.",PERS(victim, ch));
		REMOVE_CONFIG(victim, CONFIG_IGNORE_MULTILOGINS);
    }
    else
    {
		ch->printlnf("Multilogins are now ignored on %s.",PERS(victim, ch));
		SET_CONFIG(victim, CONFIG_IGNORE_MULTILOGINS);
    }
    save_char_obj( victim );
    return;
}
/**************************************************************************/
void do_disallowpkill( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
	{
		ch->println( "disallow pkilling on which mortal?" );
		return;
    }
    
    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
    }

    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }

    if (HAS_CONFIG(victim, CONFIG_DISALLOWED_PKILL))
    {
		ch->printlnf("Pkill ability granted to %s.",PERS(victim, ch));
		REMOVE_CONFIG(victim, CONFIG_DISALLOWED_PKILL);
    }
    else
    {
		ch->printlnf("Pkill ability removed from %s.",PERS(victim, ch));
		SET_CONFIG(victim, CONFIG_DISALLOWED_PKILL);
    }
    save_char_obj( victim );
    return;
}
/**************************************************************************/
void do_addcourt( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;

	one_argument( argument, arg );

    if ( IS_NULLSTR(arg) )
	{
		ch->println( "Add which person to get court notes?" );
		return;
    }
    
    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
	{
		ch->println( "They aren't here." );
		return;
    }

    if ( IS_NPC(victim) )
    {
		ch->println( "Not on NPC's." );
		return;
    }

    if (HAS_CONFIG(victim, CONFIG_COURTMEMBER))
    {
		ch->printlnf("Courtmembership removed from %s.",PERS(victim, ch));
		REMOVE_CONFIG(victim, CONFIG_COURTMEMBER);
    }
    else
    {
		ch->printlnf("Courtmembership granted to %s.",PERS(victim, ch));
		SET_CONFIG(victim, CONFIG_COURTMEMBER);
    }
    save_char_obj( victim );
    return;
}
/**************************************************************************/