area/
build/testing/
log/
player/
player/backup/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
#include <glib.h>

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <interp.h>
#include <crypt.h>
#include <player.h>
#include <tables.h>
#include <fight.h>
#include <lookup.h>
#include <recycle.h>
#include <unistd.h>

/*
 * For character and object displays
 */
typedef struct charData charDisplay;
struct charData
{
	GString *data;
	int count;
};


char *	const	where_name	[] =
{
	"[{C         Light{x] ",
	"[{C     On Finger{x] ",
	"[{C     On Finger{x] ",
	"[{C   Around Neck{x] ",
	"[{C   Around Neck{x] ",
	"[{C       On Body{x] ",
	"[{C       On Head{x] ",
	"[{C       On Legs{x] ",
	"[{C       On Feet{x] ",
	"[{C      On Hands{x] ",
	"[{C       On Arms{x] ",
	"[{C              {x] ",
	"[{C   Around Body{x] ",
	"[{C  Around Waist{x] ",
	"[{C  Around Wrist{x] ",
	"[{C  Around Wrist{x] ",
	"[{C    Right Hand{x] ",
	"[{C     Left Hand{x] ",
	"[{C       On Face{x] ",
	"[{C Left Scabbard{x] ",
	"[{CRight Scabbard{x] ",
	"[{WWF Stuff	  {x] ",
	"[{C Hags Wrinkles{x] ",
};

/*
 * Wolf.c Functions I need for Avatar Display of Renown Rank - Spiral
 */

extern char *get_renown_rankname args(( int rank ));

/*
 * Local functions.
 */
char *	format_obj_to_char	args( ( OBJ_DATA *obj, CHAR_DATA *ch,
	bool fShort ) );
GString *show_char_to_char_0	args( ( CHAR_DATA *victim, CHAR_DATA *ch ) );
void	show_char_to_char_1	args( ( CHAR_DATA *victim, CHAR_DATA *ch ) );
void	show_char_to_char	args( ( CHAR_DATA *list, CHAR_DATA *ch ) );
bool	check_blind		args( ( CHAR_DATA *ch ) );
char 	*get_char_name		args( ( CHAR_DATA *ch ) );

void	evil_eye		args( ( CHAR_DATA *victim, CHAR_DATA *ch ) );
void	update_damcap		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void 	check_left_arm		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void 	check_right_arm		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void 	check_left_leg		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void 	check_right_leg		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
char 	*flag_string		args( ( const struct flag_type *flag_table, int bits ) );
char    *rp_stname              args( (CHAR_DATA *ch ) );
void	obj_score		args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );

int get_hours( CHAR_DATA *ch )
{
	return	((get_age(ch) - 17) * 2 );
}

bool see_attack_flag( CHAR_DATA *ch, CHAR_DATA *victim)
{
	if (victim->pk_sect > 0 && IS_IMMORTAL(ch))
		return TRUE;
	if (IS_SET(victim->pk_sect,ATTACK_SABBAT) && IS_SABBAT(ch))
		return TRUE;
	if (IS_SET(victim->pk_sect,ATTACK_FOLLOWERS) && IS_FOLLOWERS(ch))
		return TRUE;
	if (IS_SET(victim->pk_sect,ATTACK_CAMARILLA) && IS_CAMARILLA(ch))
		return TRUE;
	if (IS_SET(victim->pk_sect,ATTACK_PACK) && IS_PACK(ch))
		return TRUE;
	if (IS_SET(victim->pk_sect,ATTACK_WYRM) && IS_WYRM(ch))
		return TRUE;
	if (IS_SET(victim->pk_sect,ATTACK_VAMP) && IS_CLASS(ch,CLASS_VAMPIRE))
		return TRUE; 
	if (IS_SET(victim->pk_sect,ATTACK_MAGE) && IS_CLASS(ch,CLASS_MAGE))
		return TRUE; 
	if (IS_SET(victim->pk_sect,ATTACK_WWF) && IS_CLASS(ch,CLASS_WEREWOLF))
		return TRUE; 
	
	return FALSE;
}

void do_nature (CHAR_DATA *ch, char *argument)
{
	char buf[MAX_INPUT_LENGTH];
	if (IS_NPC(ch))
		return;
	if (strlen(argument) > 70 )
	{
		send_to_char("Your Nature must be 70 chars or less.\n\r",ch);
		return;
	}	
	ch->pcdata->nature = g_string_assign(ch->pcdata->nature,argument);
	send_to_char("OK, set\n\r",ch);
	sprintf(buf,"Nature: %s \n\r",ch->pcdata->nature->str);
	send_to_char(buf,ch);
}

void do_demeanor (CHAR_DATA *ch, char *argument)
{
	char buf[MAX_INPUT_LENGTH];
	
	if (IS_NPC(ch))
		return;
	
	if (strlen(argument) > 70 )
	{
		send_to_char("Your Demeanor must be 70 chars or less.\n\r",ch);
		return;
	}	
	ch->pcdata->demeanor = g_string_assign(ch->pcdata->demeanor,argument);
	send_to_char("OK, set\n\r",ch);
	sprintf(buf,"Demeanor: %s \n\r",ch->pcdata->demeanor->str);
	send_to_char(buf,ch);
}

sh_int check_range_pk(CHAR_DATA *ch, CHAR_DATA *victim)
{
	int chclass,victimclass;
	
	if (IS_IMMORTAL(ch)){
		return 2;
	}	
	
	if (ch->race <= 0 ) chclass = 0;
	else if (ch->race <= 4 ) chclass = 1;
	else if (ch->race <= 9 ) chclass = 2;
	else if (ch->race <= 14) chclass = 3;
	else if (ch->race <= 19) chclass = 4;
	else if (ch->race <= 24) chclass = 5;
	else chclass = 6;
	
	if (victim->race <= 0 ) victimclass = 0;
	else if (victim->race <= 4 ) victimclass = 1;
	else if (victim->race <= 9 ) victimclass = 2;
	else if (victim->race <= 14) victimclass = 3;
	else if (victim->race <= 19) victimclass = 4;
	else if (victim->race <= 24) victimclass = 5;
	else victimclass = 6;
	
	if ( chclass < victimclass)
		return 3; /* Too high */
	if ( chclass == victimclass)
		return 2; /* Pkill Range */
	if ( chclass > victimclass)
		return 1; /* Too low */
	return 0;
}

/** Function: do_greet
  * Descr   : Introduces one player to another. Setting the introducee's
  *         : "known" data accordingly.
  * Returns : void
  * Syntax  : greet someone|name
  * Written : v1.0 12/98
  * Author  : Gary McNickle <gary@dharvest.com>
  */
void do_greet(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim = NULL;
	char arg1[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	
	if ( argument[0] == '\0' )
	{
		send_to_char("Greet whom?\n\r", ch);
		return;
	}
	
	argument = one_argument(argument, arg1);
	
	if ( (victim = get_char_room(ch, arg1)) == NULL )
	{
		send_to_char("Greet whom?\n\r", ch);
		return;
	}
	
	if (IS_NPC(victim) || IS_NPC(ch))
	{
		send_to_char("go greet players jerky.\n\r",ch);
		return;
	}
	
	if ( victim->position < POS_RESTING )
	{
		send_to_char("They are not paying any attention to you.\n\r", ch);
		return;
	}
	
	if ( victim->level < 2 )
	{
		send_to_char("They are not yet worthy to pay any attention to you.\n\r", ch);
		return;
	}
	
	act("You greet $N.", ch, NULL, victim, TO_CHAR);
	
	if ( knows_char(victim, ch) )
	{
		sprintf(buf, "%s smiles knowingly.\n\r", PERS(victim, ch));
		send_to_char(buf, ch);
	}
	else
		add_known(victim, ch);
	
	sprintf(buf, "%s %s\n\r", 
		ch->name->str,
		(argument[0] == '\0') ? "nods in greeting to you." : argument);
	send_to_char(buf, victim);                
	
}

void do_meet(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *vic1;
	CHAR_DATA *vic2;
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
	
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	
	if ( arg1[0] == '\0' || arg2[0] == '\0' )
	{
		send_to_char("Meet whom?\n\r", ch);
		return;
	}
	
	
	if ( (vic1 = get_char_room(ch, arg1)) == NULL )
	{
		send_to_char("Meet whom?\n\r", ch);
		return;
	}
	
	if ( (vic2 = get_char_room(ch, arg2)) == NULL )
	{
		send_to_char("Who wants to meet whom?\n\r", ch);
		return;
	}
	
	if (IS_NPC(ch))
		return;

	if ( IS_NPC(vic2) || IS_NPC(vic1) )
	{
		send_to_char("With a mob are you sick?",ch);
		return;
	}

	if ( vic2 == ch || vic1 == ch )
	{
		send_to_char("You can't do that.. you already know your self!.\n\r",ch);
		return;
	}

	if ( vic2 == vic1 )
	{
		send_to_char("You can't do that.\n\r",ch);
		return;
	}
	
	if ( vic2->position < POS_RESTING )
	{
		send_to_char("They are not paying any attention to you.\n\r", ch);
		return;
	}
	
	if (IS_NPC(vic1) || IS_NPC(vic2))
	{
		send_to_char("go meet players jerky.\n\r",ch);
		return;
	}
	
	if (!knows_char(vic1, ch) )
	{
		send_to_char("You don't know them.",ch);
		return;
	}
	
	if (!knows_char(vic2, ch) )
	{
		send_to_char("You don't know them.",ch);
		return;
	}
	act("You meet $n.", vic1, NULL, vic2, TO_VICT);
	act("You meet $n.", vic2, NULL, vic1, TO_VICT);
	act("$N meet's $n.", vic1, NULL, vic2, TO_NOTVICT);
	
	add_known(vic1, vic2);
	add_known(vic2, vic1);
	
	sprintf(buf, "%s %s\n\r",
		vic1->name->str,
		(argument[0] == '\0') ? "nods in greeting to you." : argument);
	send_to_char(buf, vic2);
	sprintf(buf, "%s %s\n\r",
		vic2->name->str,
		(argument[0] == '\0') ? "nods in greeting to you." : argument);
	send_to_char(buf, vic1);
	
}

bool check_attack_info( CHAR_DATA *ch, CHAR_DATA *victim ){

		bool pksect = FALSE;
		int min_race = 0;
		
		if (ch->race < 5 )
			min_race = 0;	
		else
			min_race = ch->race - 5;


        if (IS_SET(victim->act,PLR_ATTACK) && victim->race < min_race )  	
		{
			/* Check for Sect, this is done by bit */
			if (IS_SET(victim->pk_sect,ATTACK_SABBAT) && !IS_SABBAT(ch))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_FOLLOWERS) && !IS_FOLLOWERS(ch))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_CAMARILLA) && !IS_CAMARILLA(ch))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_WYRM) && !IS_WYRM(ch))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_PACK) && !IS_PACK(ch))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_VAMP) && !IS_CLASS(ch,CLASS_VAMPIRE))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_WWF) && !IS_CLASS(ch,CLASS_WEREWOLF))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_MAGE) && !IS_CLASS(ch,CLASS_MAGE))
				pksect = TRUE;	
			if (IS_SET(victim->pk_sect,ATTACK_ANYONE))
				pksect = TRUE;
		}
		return pksect;
}

/** Function: knows_char
  * Descr   : Determines if victim is a player known by ch.
  * Returns : TRUE/FALSE if ch knows victim 
  * Syntax  : knows_char ( ch, victim )
  * Written : v1.0 12/98
  * Author  : Gary McNickle <gary@dharvest.com>
  */
bool knows_char(CHAR_DATA *ch, CHAR_DATA *victim)
{
	KNOWN_DATA *names;
	
	if ( ch == victim || IS_NPC(ch) || IS_NPC(victim) || 
		IS_IMMORTAL(ch) || IS_IMMORTAL(victim))
		return TRUE;
	
	for (names = ch->pcdata->known; names; names = names->next)
		if ( names->value == victim->id ) 
			return TRUE;
	if (check_attack_info(ch,victim))
		return TRUE;
		
	return FALSE;
}

/** Function: unknown_name
  * Descr   : Returns a descriptive string based on the players race
  * Returns : char *
  ** Syntax  : unknown_name ( whos )
  * Written : v1.0 12/98
  * Author  : Gary McNickle <gary@dharvest.com>
  */
char *unknown_name(CHAR_DATA *ch, CHAR_DATA *viewer)
{
	char *prefix;
	static char buf[MAX_STRING_LENGTH];
	
	if ( IS_NPC(ch) )
		return ch->short_descr->str;
	
	if ( viewer->level < 3 )
	{
		switch ( ch->creature )
		{
			case CLASS_SWWF:
				switch ( ch->pcdata->wwf_shape )
				{
					case SHAPE_HOMID:
						if (ch->sex == 1)
							prefix = "a male person";
						else
							prefix = "a female person";
						break;
					case SHAPE_GLABRO:
						prefix = "a strange human";
						break;
					case SHAPE_HISPO:
						prefix = "a very large wolf";
						break;
					case SHAPE_CRINOS:
						prefix = "a strange beast";
						break;
					case SHAPE_LUPUS:
						prefix = "a wolf";
						break;
					default:
						prefix = "a wolf";
						break;
				}
				if (!strcmp(prefix,""))
					prefix = "a wolf";
				break;
			case CLASS_WEREWOLF:
				if (IS_AFFECTED(ch,AFF_POLYMORPH))
					prefix = "a strange beast";
				else
					if (ch->sex == 1)
						prefix = "a male person";
					else
						prefix = "a female person";
					break;
			case CLASS_VAMPIRE:
				if (ch->sex == 1)
					prefix = "a strange male person";
				else
					prefix = "a strange female person";
				break;
			default:
				if (ch->sex == 1)
					prefix = "a male person";
				else
					prefix = "a female person";
				break;
		}
	}
	else
	{
		switch (ch->creature) 
		{
			case CLASS_SWWF:
				switch ( ch->pcdata->wwf_shape )
				{
					case SHAPE_HOMID:
						if (ch->sex == 1)
							prefix = "a male person";
						else
							prefix = "a female person";
						break;
					case SHAPE_GLABRO:
						prefix = "a strange human";
						break;
					case SHAPE_HISPO:
						prefix = "a very large wolf";
						break;
					case SHAPE_CRINOS:
						prefix = "a strange beast";
						break;
					case SHAPE_LUPUS:
						prefix = "a wolf";
						break;
					default:
						prefix = "a wolf";
						break;
				}
				if (!strcmp(prefix,""))
					prefix = "a wolf";
				break;
			case CLASS_WEREWOLF:
				if (IS_AFFECTED(ch,AFF_POLYMORPH))
					prefix = " a werewolf";
				else
					if (ch->sex == 1)
						prefix = "a male person";
					else
						prefix = "a female person";
					break;
			case CLASS_VAMPIRE:
				prefix = "a vampire";
				break;
			default:
				if (ch->level > 2)
					prefix = "a powerful human";
				else
					if (ch->sex == 1)
						prefix = "a male person";
					else
						prefix = "a female person";
					break;
		}
	}
	
	if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_CLASS(ch,CLASS_WEREWOLF))
		prefix = ch->morph->str;
    if (ch->pcdata->anon_desc->str[0] != '\0') {
        prefix = ch->pcdata->anon_desc->str;
    }
	sprintf(buf, "%s", prefix );
	return buf;
	
}

/** Function: PERS
  * Descr   : Replacment function for old PERS macro.  This uses
  *         : "knows_char" to determine which value to send to
  *         : viewer when displaying ch. 'Someone' or their name or race?
  * Returns : char * to show to viewer
  * Syntax  : PERS(ch being looked at, who's looking)
  * Written : v1.0 12/98
  * Author  : Gary McNickle <gary@dharvest.com>
  */
char *PERS(CHAR_DATA *ch, CHAR_DATA *viewer)
{
	if (!IS_IMMORTAL(ch) && !can_see(viewer, ch) )
		return "Someone";
	
	if (!IS_NPC(ch) && IS_IMMORTAL(ch) && !can_see(viewer, ch) )
		return "An Immortal";
	
	if (IS_NPC(ch))
		return ch->short_descr->str;  
	
	if ( IS_NPC(viewer) ||
		IS_IMMORTAL(ch) ||
		IS_IMMORTAL(viewer) ||
		knows_char(viewer, ch) )
		return ch->name->str;
	
	return unknown_name(ch,viewer);
}

/** Function: add_known
  * Descr   : Adds 'victim' to ch's known list
  * Returns : void
  * Syntax  : add_known( to this ch's list, who to add )
  * Written : v1.0 10/98
  * Author  : Gary McNickle <gary@dharvest.com>
  */
void add_known(CHAR_DATA *ch, CHAR_DATA *victim)
{
	KNOWN_DATA *charname;
	
	if ( knows_char(ch, victim) )
		return;
	
	charname = new_known();
	charname->value = victim->id;
	charname->next = ch->pcdata->known;
	ch->pcdata->known = charname;
	
	
}
char *format_obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort )
{
	static char buf[MAX_STRING_LENGTH];
	GString *mxpout = g_string_new("");
	char *object_string;
	
	buf[0] = '\0';
	if (ch->plane != obj->plane){
		switch (obj->plane){
			case PLANE_SHADOW:
				if (IS_IMMORTAL(ch) 
					|| IS_SET(ch->sight,SIGHT_SHADOW))
					strcat( buf, "{W(SdP){x"  );
				break;
			case PLANE_SPIRIT:
				if (IS_IMMORTAL(ch) 
					|| IS_SET(ch->sight,SIGHT_SPIRIT))
					strcat( buf, "{W(SpP){x"  );
				break;
			case PLANE_UMBRA:
				if (IS_IMMORTAL(ch) 
					|| IS_SET(ch->sight,SIGHT_UMBRA))
					strcat( buf, "{W(UmP){x"  );
				break;
			case PLANE_NORMAL:
				if (ch->plane != PLANE_NORMAL)
					strcat( buf, "{W(NoP){x"  );
					break;
			case PLANE_IMMORTAL:
				if (IS_IMMORTAL(ch))
					strcat( buf, "{W(ImP){x"  );
					break;
			case PLANE_PUNISHMENT:
				if (IS_IMMORTAL(ch))
					strcat( buf, "{W(PnP){x"  );
					break;

		}
	}
	if ( IS_SET(obj->quest, QUEST_ARTIFACT)) strcat(buf,     "{Y (Artifact){x" );
	else if ( IS_SET(obj->quest, QUEST_RELIC)) strcat(buf,   "{Y    (Relic){x" );
	else if ( IS_SET(obj->quest, QUEST_MASTERY)) strcat(buf, "{R  (Mastery){x" );
	else if (( obj->points >= 2000 ) && ( obj->points < 4000 ))
		strcat(buf, "{Y(Legendary){x" );
	else if (( obj->points >= 4000 ) && ( obj->points < 8000 )) 
		strcat(buf, "{C (Mythical){x" );
	else if ( obj->points >= 8000 ) 
		strcat(buf, "{M (Immortal){x" );
        if (( obj->pIndexData->vnum == 30541 ) ||
            ( obj->pIndexData->vnum == 30542 ) ||
            ( obj->pIndexData->vnum == 30543 ) ||
            ( obj->pIndexData->vnum == 30544 ) ||
            ( obj->pIndexData->vnum == 30545 ) ||
            ( obj->pIndexData->vnum == 30546 ))     strcat( buf, "{R(Satanic){x"  );

	if ( IS_OBJ_STAT(obj, ITEM_INVIS)     )   strcat( buf, "{W(inv){x"     );
	if ( IS_SET(ch->sight, SIGHT_ALIGNMENT)
		&& !IS_OBJ_STAT(obj, ITEM_ANTI_GOOD)
		&& IS_OBJ_STAT(obj, ITEM_ANTI_EVIL)   )   strcat( buf, "{B(good){x"  );
	else if (IS_SET(ch->sight, SIGHT_ALIGNMENT) 
		&& IS_OBJ_STAT(obj, ITEM_ANTI_GOOD)
		&& !IS_OBJ_STAT(obj, ITEM_ANTI_EVIL)   )   strcat( buf, "{R(evil){x"  );
	else if ( IS_SET(ch->sight, SIGHT_ALIGNMENT)
		&& IS_OBJ_STAT(obj, ITEM_ANTI_GOOD)
		&& !IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL)
		&& IS_OBJ_STAT(obj, ITEM_ANTI_EVIL)   )   strcat( buf, "{Y(neut){x"  );
	if ( IS_SET(ch->sight, SIGHT_MAGIC)
		&& IS_OBJ_STAT(obj, ITEM_MAGIC))  strcat( buf, "{c(mag){x"   );
	if ( IS_OBJ_STAT(obj, ITEM_GLOW)      )   strcat( buf, "{W(glw){x"   );
	if ( IS_OBJ_STAT(obj, ITEM_HUM)       )   strcat( buf, "{W(hum){x"   );
	if ( obj->level >= 0 ) strcat(buf, " " );
	
	if ( fShort )
	{
		if ( obj->short_descr != NULL )
			strcat( buf, obj->short_descr->str );
		if ( obj->condition < 100) 
			strcat(buf, "{R ({Md{Ra{Mm{Ra{Mg{Re{Md{R){x");
	}
	else
	{
		if ( obj->description != NULL )
			strcat( buf, obj->description->str );
	}
	
	mxpconv(mxpout,buf,ch);
	object_string = g_strdup(mxpout->str);
	g_string_free(mxpout,TRUE);
	return object_string;
}






/*
 * Show a list to a character.
 * Can coalesce duplicated items.
 * 
 */

void show_list_to_char( OBJ_DATA *list, CHAR_DATA *ch, bool fShort, bool fShowNothing )
{
	char buf[MAX_STRING_LENGTH];
	GPtrArray *pObjList;
	charDisplay *objDisplay;
	char *formtobj;
	OBJ_DATA *obj;
	int nShow;
	int iShow;
	int count;
	//int test;
	bool fCombine;

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

	/*
	 * Alloc space for output lines.
	 */
	count = 0;
	for ( obj = list; obj != NULL; obj = obj->next_content )
		count++;

	pObjList = g_ptr_array_new();

	nShow	= 0;

	/*
	 * Format the list of objects.
	 */
	for ( obj = list; obj != NULL; obj = obj->next_content )
	{ 
		if (!IS_NPC(ch) && ch->pcdata->chobj != NULL && obj->chobj != NULL && obj->chobj == ch)
			continue;
		if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) )
		{
			objDisplay = g_new(charDisplay,1);
			objDisplay->data = g_string_new("");
			objDisplay->count = 1;

			formtobj = format_obj_to_char( obj, ch, fShort );
			objDisplay->data = g_string_assign(objDisplay->data,formtobj);
			g_free(formtobj);
			fCombine = FALSE;

			if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
			{
				/*
				 * Look for duplicates, case sensitive.
				 * Matches tend to be near end so run loop backwords.
				 */
				for ( iShow = nShow - 1; iShow >= 0; iShow-- )
				{
					charDisplay *tmpobj = (charDisplay*)g_ptr_array_index(pObjList,iShow);
					if ( !g_strcasecmp( tmpobj->data->str, objDisplay->data->str ) )
					{
						tmpobj->count++;
						fCombine = TRUE;
						break;
					}
				}
			}

			/*
			 * Place the Object in to the prgpstr Pointer
			 * Couldn't combine, or didn't want to.
			 * increment by one
			 */
			if ( !fCombine )
			{
				g_ptr_array_add(pObjList,objDisplay);
				nShow++;
			}
			else
			{
				g_string_free(objDisplay->data,TRUE);
				g_free(objDisplay);
			}
		}
	}

	/*
	 * Output the formatted list.
	 */
	for ( iShow = 0; iShow < nShow; iShow++ )
	{
		charDisplay *tmpObj = (charDisplay*)g_ptr_array_index(pObjList,iShow);
		if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
		{

			if ( tmpObj->count != 1 )
			{
				sprintf( buf, "(%2d) ",  tmpObj->count);
				send_to_char( buf, ch );
			}
			else
			{
				send_to_char( "     ", ch );
			}
		}
		send_to_char( tmpObj->data->str, ch );
		send_to_char( "\n\r", ch );
		g_string_free( tmpObj->data,TRUE);
		g_free(tmpObj);
	}

	if ( fShowNothing && nShow == 0 )
	{
		if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
			send_to_char( "     ", ch );
		send_to_char( "Nothing.\n\r", ch );
	}

	/*
	 * Clean up.
	 *
	 */
	g_ptr_array_free(pObjList,TRUE);
	return;
}

char *get_status_name(CHAR_DATA *vch)
{
	char static buf2[MAX_STRING_LENGTH];
	
	if (!IS_NPC(vch) && vch->level == 1 )      str_cpy(buf2,"    SubMortal");
	else if (!IS_NPC(vch) && vch->level == 2 ) str_cpy(buf2,"       Mortal");
	else if (!IS_NPC(vch) && vch->level == 7 ) str_cpy(buf2,"        Admin");
	else if (!IS_NPC(vch) && vch->level == 8 ) str_cpy(buf2,"  Quest Maker");
	else if (!IS_NPC(vch) && vch->level == 9 ) str_cpy(buf2,"     Enforcer");
	else if (!IS_NPC(vch) && vch->level == 10) str_cpy(buf2,"        Judge");
	else if (!IS_NPC(vch) && vch->level == 11) str_cpy(buf2,"   High Judge");
	else if (!IS_NPC(vch) && vch->level == 12) str_cpy(buf2,"  Implementor");
	else if (!IS_NPC(vch) && vch->race  <= 0 ) str_cpy(buf2,"       Avatar");
	else if (!IS_NPC(vch) && vch->race  <= 4 ) str_cpy(buf2,"   Lesser God");
	else if (!IS_NPC(vch) && vch->race  <= 9 ) str_cpy(buf2,"      Demigod");
	else if (!IS_NPC(vch) && vch->race  <= 14) str_cpy(buf2,"  Greater God");
	else if (!IS_NPC(vch) && vch->race  <= 19) str_cpy(buf2,"GrandImmortal");
	else if (!IS_NPC(vch) && vch->race  <= 24) str_cpy(buf2,"ElderImmortal");
	else if (!IS_NPC(vch) && vch->race  >= 25) str_cpy(buf2,"Immort Legend");
	return buf2;
}

void show_affects(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	if ( IS_HEAD(victim, LOST_HEAD) && IS_AFFECTED(victim, AFF_POLYMORPH))
		g_string_append( output, "     " );
	else {

		if (!IS_NPC(victim) && victim->desc==NULL && victim->pk_timer < 1 ) 
			g_string_append( output,"{y(LD){x");

		if (!IS_NPC(victim) && victim->desc==NULL && victim->pk_timer > 0 ) 
			g_string_append( output,"{Y(pkLD){x");

		if ( IS_AFFECTED(victim, AFF_INVISIBLE)) 
			g_string_append( output, "{c(In){x"   );

		if ( IS_AFFECTED(victim, AFF_HIDE)     ) 
			g_string_append( output, "{c(Hi){x"  );

		if ( IS_AFFECTED(victim, AFF_CHARM)    ) 
			g_string_append( output, "{w(Ch){x" );

		if ( IS_SET(victim->added, ADDED_DIABLERIE) && IS_CLASS(ch,CLASS_VAMPIRE)) 
			g_string_append( output, "{R(DI){x" );

		if ( IS_AFFECTED(victim, AFF_PASS_DOOR))
			g_string_append( output, "{M(Tr){x");

		if ( IS_AFFECTED(victim, AFF_FAERIE_FIRE)) 
			g_string_append( output, "{m(Fa){x");

		if ( IS_EVIL(victim) && IS_SET(ch->sight, SIGHT_ALIGNMENT)) 
			g_string_append( output, "{r(Ev){x"   );

		if ( IS_AFFECTED(victim, AFF_SANCTUARY) ) 
			g_string_append( output, "{W(Sa){x" );
	}
	return;
}

void show_plane(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	if (ch->plane != victim->plane){
		switch (victim->plane){
			case PLANE_SHADOW:
				if (IS_IMMORTAL(ch) 
						|| IS_SET(ch->sight,SIGHT_SHADOW))
					g_string_append( output, "{W(SdP){x"  );
				break;
			case PLANE_SPIRIT:
				if (IS_IMMORTAL(ch) 
						|| IS_SET(ch->sight,SIGHT_SPIRIT))
					g_string_append( output, "{W(SpP){x"  );
				break;
			case PLANE_UMBRA:
				if (IS_IMMORTAL(ch) 
						|| IS_SET(ch->sight,SIGHT_UMBRA))
					g_string_append( output, "{W(UmP){x"  );
				break;
			case PLANE_NORMAL:
				if (ch->plane != PLANE_NORMAL)
					g_string_append( output, "{W(NoP){x"  );
				break;
			case PLANE_IMMORTAL:
				if (IS_IMMORTAL(ch))
					g_string_append( output, "{W(ImP){x"  );
				break;
			case PLANE_PUNISHMENT:
				if (IS_IMMORTAL(ch))
					g_string_append( output, "{W(PnP){x"  );
				break;

		}
	}

	return;
}

void show_vampire(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	switch (check_range_pk(ch,victim))
	{
		case 1:
			g_string_append( output, "{R[ Kindred]" );
			break;
		case 2:
			g_string_append( output, "{R[*Kindred]" );
			break;
		case 3:
			g_string_append( output, "{R[+Kindred]" );
			break;
		default:
			g_string_append( output, "{R[ Kindred]" );
			break;
	}

}

void show_mage(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	switch (check_range_pk(ch,victim))
	{
		case 1:
			g_string_append( output,"{C[ Mage]" );
			break;
		case 2:
			g_string_append( output,"{C[*Mage]" );
			break;
		case 3:
			g_string_append( output,"{C[+Mage]" );
			break;
		default:
			g_string_append( output,"{C[ Mage]" );
			break;
	}

}

void show_werewolf(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	switch (check_range_pk(ch,victim))
	{
		case 1:
			g_string_append( output, "{G[ Garou]" );
			break;
		case 2:
			g_string_append( output, "{G[*Garou]" );
			break;
		case 3:
			g_string_append( output, "{G[+Garou]" );
			break;
		default:
			g_string_append( output, "{G[ Garou]" );
			break;
	}

}

void show_hunter(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	switch (check_range_pk(ch,victim))
	{
		case 1:
			g_string_append( output,"{Y[ Hunter]" );
			break;
		case 2:
			g_string_append( output,"{Y[*Hunter]" );
			break;
		case 3:
			g_string_append( output,"{Y[+Hunter]" );
			break;
		default:
			g_string_append( output,"{Y[ Hunter]" );
			break;
	}
}

void show_avatar(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	switch (check_range_pk(ch,victim))
	{
		case 1:
			g_string_append( output,"{Y[ Avatar]" );
			break;
		case 2:
			g_string_append( output,"{Y[*Avatar]" );
			break;
		case 3:
			g_string_append( output,"{Y[+Avatar]" );
			break;
		default:
			g_string_append( output,"{Y[ Avatar]" );
			break;
	}
}

void show_wraith(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	switch (check_range_pk(ch,victim))
	{
		case 1:
			g_string_append( output,"{D[ Wraith]" );
			break;
		case 2:
			g_string_append( output,"{D[*Wraith]" );
			break;
		case 3:
			g_string_append( output,"{D[+Wraith]" );
			break;
		default:
			g_string_append( output,"{D[ Wraith]" );
			break;
	}
}

void show_class(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	if (ch->level >= LEVEL_AVATAR && (!IS_NPC(victim) && IS_AVATAR(victim)))
	{
		switch (victim->creature)
		{
			case CLASS_VAMPIRE:
				show_vampire(ch,victim,output);
				break;
			case CLASS_WEREWOLF:
				show_werewolf(ch,victim,output);
				break;
			case CLASS_SWWF:
				show_werewolf(ch,victim,output);
				break;
			case CLASS_WRAITH:
				show_wraith(ch,victim,output);
				break;
			case CLASS_HUNTER:
				show_hunter(ch,victim,output);
				break;
			case CLASS_MAGE:
				show_mage(ch,victim,output);
				break;
			default:
				show_avatar(ch,victim,output);
				break;
		}
	}
	return;
}

void show_effects(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	GString *tmp = NULL;
	tmp = g_string_new("");
	if ( IS_AFFECTED(victim, AFF_FLAMING) ) 
	{
		if (IS_NPC(victim))
			g_string_sprintf( tmp, "{R    ...%s is engulfed in blazing flames!{x\n\r", victim->short_descr->str );
		else if (!IS_NPC(victim) && IS_AFFECTED(victim,AFF_POLYMORPH))
			g_string_sprintf( tmp, "{R    ...%s is engulfed in blazing flames!{x\n\r", victim->morph->str );
		else
			g_string_sprintf( tmp, "{R    ...%s is engulfed in blazing flames!{x\n\r", victim->name->str );
		g_string_append(output,tmp->str);
		g_string_free(tmp,TRUE);
	}

	if ( !IS_NPC(victim) && IS_HEAD(victim, LOST_HEAD) && IS_AFFECTED(victim, AFF_POLYMORPH)) 
	{
		if (IS_EXTRA(victim,GAGGED) && IS_EXTRA(victim,BLINDFOLDED))
			g_string_sprintf( tmp, "{W    ...%s is gagged and blindfolded!{x\n\r", victim->morph->str );
		else if (IS_EXTRA(victim,GAGGED))
			g_string_sprintf( tmp, "{W    ...%s is gagged!{x\n\r", victim->morph->str );
		else if (IS_EXTRA(victim,BLINDFOLDED))
			g_string_sprintf( tmp, "{W    ...%s is blindfolded!{x\n\r", victim->morph->str );
		g_string_append(output,tmp->str);
		g_string_free(tmp,TRUE);
	}

	if ( IS_EXTRA(victim, TIED_UP) ) 
	{
		if (IS_NPC(victim))
			g_string_sprintf( tmp, "{W    ...%s is tied up", victim->short_descr->str );
		else if (!IS_NPC(victim) && IS_AFFECTED(victim,AFF_POLYMORPH))
			g_string_sprintf( tmp, "{W    ...%s is tied up", victim->morph->str );
		else
			g_string_sprintf( tmp, "{W    ...%s is tied up", victim->name->str );
		g_string_append(output,tmp->str);
		g_string_free(tmp,TRUE);
		if (IS_EXTRA(victim,GAGGED) && IS_EXTRA(victim,BLINDFOLDED))
			g_string_append( output, ", gagged and blindfolded!{x" );
		else if (IS_EXTRA(victim,GAGGED))
			g_string_append( output, " and gagged!{x" );
		else if (IS_EXTRA(victim,BLINDFOLDED))
			g_string_append( output, " and blindfolded!{x" );
		else
			g_string_append( output, "!" );
		g_string_append(output,"\n\r");
	}

	if (!IS_NPC(victim) && victim->blood_count > 0 )
	{
		g_string_sprintf( tmp,"{R    ...%s is covered in blood and gore.{x\n\r", PERS(victim,ch));
		g_string_append(output,tmp->str);
		g_string_free(tmp,TRUE);
	}

	if (IS_SWWF(victim))
	{
		if (IS_SET(victim->added, ADDED_BRISTLES))
		{
			g_string_sprintf( tmp,"   ...%s's body is covered in thick fur and quill-like spines.\n\r",PERS(victim,ch));
			g_string_append(output,tmp->str);
			g_string_free(tmp,TRUE);
		}
	}


	if ( IS_AFFECTED(victim, AFF_WEBBED) ) 
	{
		if (IS_NPC(victim))
			g_string_sprintf( tmp, "{W    ...%s is coated in a sticky web.{x\n\r", victim->short_descr->str );
		else if (!IS_NPC(victim) && IS_AFFECTED(victim,AFF_POLYMORPH))
			g_string_sprintf( tmp, "{W    ...%s is coated in a sticky web.{x\n\r", victim->morph->str );
		else
			g_string_sprintf( tmp,"{W    ...%s is coated in a sticky web.{x\n\r", victim->name->str );
		g_string_append(output,tmp->str);
		g_string_free(tmp,TRUE);
	}
	return;

}
void show_shields(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	GString *tmp = NULL;
	bool has_shield = FALSE;

	tmp = g_string_new("");
	g_string_sprintf(tmp,"    ...%s is surrounded by ",PERS(victim,ch));

	if ( IS_ITEMAFF(victim, ITEMA_SHOCKSHIELD) ) 
	{
		g_string_append( tmp,"{y(lightning){x");
		has_shield = TRUE;
	}

	if ( IS_ITEMAFF(victim, ITEMA_FIRESHIELD) ) 
	{
		g_string_append( tmp,"{r(fire){x");
		has_shield = TRUE;
	}

	if ( IS_ITEMAFF(victim, ITEMA_ICESHIELD) ) 
	{
		g_string_append( tmp,"{c(ice){x");
		has_shield = TRUE;
	}

	if ( IS_ITEMAFF(victim, ITEMA_ACIDSHIELD) ) 
	{
		g_string_append( tmp,"{g(acid){x" );
		has_shield = TRUE;
	}

	if ( IS_ITEMAFF(victim, ITEMA_CHAOSSHIELD) ) 
	{
		g_string_append( tmp,"{m(chaos){x" );
		has_shield = TRUE;
	}

	if ( IS_ITEMAFF(victim, ITEMA_REFLECT) ) 
	{
		g_string_append( tmp,"{b(darkness){x");
		has_shield = TRUE;
	}

	if (has_shield == TRUE)
	{
		g_string_append(output,tmp->str);
		g_string_append(output,"\n\r");
	}

	g_string_free(tmp,TRUE);
	return;
}

void show_positions(CHAR_DATA *ch, CHAR_DATA *victim, GString *output)
{
	CHAR_DATA *mount;
	GString *tmp = NULL;

	tmp = g_string_new("");
	/*
	 * If thier mounted
	 */
	if ((mount = victim->mount) != NULL && victim->mounted == IS_RIDING)
	{
		if (IS_NPC(mount))
		{
			g_string_sprintf( tmp, " is here riding %s", mount->short_descr->str );
			g_string_append(output,tmp->str);
			g_string_free(tmp,TRUE);
		}
		else
		{
			g_string_sprintf( tmp, " is here riding %s", mount->name->str );
			g_string_append(output,tmp->str);
			g_string_free(tmp,TRUE);
		}
		
		if (victim->position == POS_FIGHTING)
		{
			g_string_append( output, ", fighting " );
			if ( victim->fighting == NULL )
				g_string_append( output, "thin air??" );
			else if ( victim->fighting == ch )
				g_string_append( output, "YOU!" );
			else if ( victim->in_room == victim->fighting->in_room )
			{
				g_string_append( output, PERS( victim->fighting, ch ) );
				g_string_append( output, "." );
			}
			else
				g_string_append( output, "somone who left??" );
		}
		else g_string_append( output, "." );
	}
	else if ( victim->position == POS_STANDING && IS_AFFECTED(victim, AFF_FLYING) )
	{
		if (!IS_NPC(victim) && strcmp(victim->pcdata->roompose->str,""))
			g_string_append( output, victim->pcdata->roompose->str );	
		else
			g_string_append( output, " is hovering here" );
	}
	else if ( victim->position == POS_STANDING && (!IS_NPC(victim) && (IS_VAMPAFF(victim, VAM_FLYING))) )
	{
		if (!IS_NPC(victim) && strcmp(victim->pcdata->roompose->str,""))
			g_string_append( output, victim->pcdata->roompose->str );	
		else
			g_string_append( output, " is hovering here" );
	}
	else
	{
		switch ( victim->position )
		{
			case POS_DEAD:       g_string_append( output, " is DEAD!!" );              
					     break;
			case POS_MORTAL:     g_string_append( output, " is mortally wounded." );   
					     break;
			case POS_INCAP:      g_string_append( output, " is incapacitated." );      
					     break;
			case POS_STUNNED:    g_string_append( output, " is lying here stunned." ); 
					     break;
			case POS_SLEEPING: 
					     if (victim->on != NULL)
					     {
						     if (IS_SET(victim->on->value[2],SLEEP_AT))
						     {
							     g_string_sprintf(tmp," is sleeping at %s.",
									     victim->on->short_descr->str);
							     g_string_append( output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else if (IS_SET(victim->on->value[2],SLEEP_ON))
						     {
							     g_string_sprintf(tmp," is sleeping on %s.",
									     victim->on->short_descr->str); 
							     g_string_append( output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else
						     {
							     g_string_sprintf(tmp, " is sleeping in %s.",
									     victim->on->short_descr->str);
							     g_string_append( output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
					     }
					     else 
						     g_string_append( output," is sleeping here.");
					     break;
			case POS_RESTING:  
					     if (victim->on != NULL)
					     {
						     if (IS_SET(victim->on->value[2],REST_AT))
						     {
							     g_string_sprintf(tmp," is resting at %s.",
									     victim->on->short_descr->str);
							     g_string_append( output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else if (IS_SET(victim->on->value[2],REST_ON))
						     {
							     g_string_sprintf(tmp," is resting on %s.",
									     victim->on->short_descr->str);
							     g_string_append( output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else 
						     {
							     g_string_sprintf(tmp, " is resting in %s.",
									     victim->on->short_descr->str);
							     g_string_append( output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
					     }
					     else
						     g_string_append( output, " is resting here." );       
					     break;
			case POS_SITTING:  
					     if (victim->on != NULL)
					     {
						     if (IS_SET(victim->on->value[2],SIT_AT))
						     {
							     g_string_sprintf(tmp," is sitting at %s.",
									     victim->on->short_descr->str);
							     g_string_append(output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else if (IS_SET(victim->on->value[2],SIT_ON))
						     {
							     g_string_sprintf(tmp," is sitting on %s.",
									     victim->on->short_descr->str);
							     g_string_append(output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else
						     {
							     g_string_sprintf(tmp, " is sitting in %s.",
									     victim->on->short_descr->str);
							     g_string_append(output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
					     }
					     else
					     {
						     if (!IS_NPC(victim) && strcmp(victim->pcdata->roompose->str,""))
							     g_string_append( output, victim->pcdata->roompose->str );	
						     else
							     g_string_append( output, " is sitting here.");
					     }	
					     break;
			case POS_STANDING: 
					     if (victim->on != NULL)
					     {
						     if (IS_SET(victim->on->value[2],STAND_AT))
						     {
							     g_string_sprintf(tmp," is standing at %s.",
									     victim->on->short_descr->str);
							     g_string_append(output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else if (IS_SET(victim->on->value[2],STAND_ON))
						     {
							     g_string_sprintf(tmp," is standing on %s.",
									     victim->on->short_descr->str);
							     g_string_append(output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
						     else
						     {
							     g_string_sprintf(tmp," is standing in %s.",
									     victim->on->short_descr->str);
							     g_string_append(output,tmp->str);
							     g_string_free(tmp,TRUE);
						     }
					     }
					     else
					     {
						     if      (victim->stance[0] == STANCE_NORMAL)
							     g_string_append( output, " is here, crouched in a fighting stance." );
						     else if (victim->stance[0] == STANCE_VIPER)
							     g_string_append( output, " is here, crouched in a viper fighting stance." );
						     else if (victim->stance[0] == STANCE_CRANE)
							     g_string_append( output, " is here, crouched in a crane fighting stance." );
						     else if (victim->stance[0] == STANCE_CRAB)
							     g_string_append( output, " is here, crouched in a crab fighting stance." );
						     else if (victim->stance[0] == STANCE_MONGOOSE)
							     g_string_append( output, " is here, crouched in a mongoose fighting stance." );
						     else if (victim->stance[0] == STANCE_BULL)
							     g_string_append( output, " is here, crouched in a bull fighting stance." );
						     else if (victim->stance[0] == STANCE_MANTIS)
							     g_string_append( output, " is here, crouched in a mantis fighting stance." );
						     else if (victim->stance[0] == STANCE_DRAGON)
							     g_string_append( output, " is here, crouched in a dragon fighting stance." );
						     else if (victim->stance[0] == STANCE_TIGER)
							     g_string_append( output, " is here, crouched in a tiger fighting stance." );
						     else if (victim->stance[0] == STANCE_MONKEY)
							     g_string_append( output, " is here, crouched in a monkey fighting stance." );
						     else if (victim->stance[0] == STANCE_SWALLOW)
							     g_string_append( output, " is here, crouched in a swallow fighting stance." );
						     else
							     if (!IS_NPC(victim) && strcmp(victim->pcdata->roompose->str,""))
								     g_string_append( output, victim->pcdata->roompose->str );	
							     else
								     g_string_append( output, " is here." );
						     break;
					     }
					     break;
			case POS_MEDITATING: g_string_append( output, " is meditating here." );    break;
			case POS_FIGHTING:
					     g_string_append( output, " is here, fighting " );
					     if ( victim->fighting == NULL )
						     g_string_append( output, "thin air??" );
					     else if ( victim->fighting == ch )
						     g_string_append( output, "YOU!" );
					     else if ( victim->in_room == victim->fighting->in_room )
					     {
						     g_string_append( output, PERS( victim->fighting, ch ) );
						     g_string_append( output, "." );
					     }
					     else
						     g_string_append( output, "somone who left??" );
					     break;
		}
	}
	return;
}

GString * show_char_to_char_0(CHAR_DATA *victim, CHAR_DATA *ch )
{
	GString *output;
	GString *tmp = NULL;
	GString *mxp;

	output = g_string_new("");

	/*
	 * First Show the Affects on the Victim
	 */
	show_affects(ch,victim,output);

	/*
	 * Show what plane they are on if diffrent
	 */
	show_plane(ch,victim,output);

	/* Vampires and werewolves can recognise each other - KaVir */
	// blank, under PK range, * in PK range, + above range - rc
	show_class(ch,victim,output);

	/*
	 * IF the victim is a vampire, show who they truly are
	 * to those that know.
	 */
	if ( !IS_NPC(ch) && get_disc(ch,DISC_AUSPEX) > 0 && 
			!IS_NPC(victim) && IS_CLASS(victim, CLASS_VAMPIRE) &&
			IS_VAMPAFF(victim, VAM_DISGUISED) )
	{
		g_string_append( output, "(");
		g_string_append( output, victim->name->str);
		g_string_append( output, ")");
	}

	if (victim->level > 0)    
		g_string_append( output," " );

	/*
	 * Check for a poly..
	 */
	if ( !IS_NPC(victim) && IS_AFFECTED(victim, AFF_POLYMORPH) )
	{
		if (IS_CLASS(victim,CLASS_WEREWOLF))
		{
			g_string_sprintf( tmp,"<send \"look %s | kill %s | kiss %s \" hint=\"right click to see menu | look %s | kill %s | kiss %s \">",victim->name->str,victim->name->str,victim->name->str,victim->name->str,victim->name->str,victim->name->str);
			g_string_append(output,tmp->str);
			g_string_free(tmp,TRUE);
			g_string_append( output, "{w" );
			g_string_append( output, PERS( victim, ch ) );
			g_string_append( output,"</send>{x");
		}
		else
		{
			tmp = g_string_new("");
			g_string_sprintf( tmp,"<send \"look %s | kill %s | kiss %s \" hint=\"right click to see menu | look %s | kill %s | kiss %s \">",victim->name->str,victim->name->str,victim->name->str,victim->name->str,victim->name->str,victim->name->str);
			g_string_append(output,tmp->str);
			g_string_free(tmp,TRUE);
			if (IS_IMMORTAL(ch))
			{
				g_string_append( output,"(");
				g_string_append( output,PERS( victim, ch ));
				g_string_append( output,")");
			}
			g_string_append( output, "{w" );
			g_string_append( output, victim->morph->str );
			g_string_append( output,"</send>{x");
		}	
	}
	else 
	{
		/*
		 * Normal Display
		 */
		tmp = g_string_new("");
		g_string_sprintf( tmp,"<send \"look %s | kill %s | kiss %s \" hint=\"right click to see menu | look %s | kill %s | kiss %s \">",victim->name->str,victim->name->str,victim->name->str,victim->name->str,victim->name->str,victim->name->str);
			g_string_append(output,tmp->str);
			g_string_free(tmp,TRUE);

		/*
		 * Colors for levels and types..
		 */
		if (IS_IMMORTAL(victim))
			g_string_append(output,"{W");
		if (IS_MORTAL(victim))
			g_string_append(output,"{c");

		if (IS_NPC(victim))	
		{
			g_string_append(output,"{w");
			if (victim->position == POS_STANDING)
				g_string_append( output, victim->long_descr->str );
			else
				g_string_append( output, victim->short_descr->str );
			g_string_append( output,"</send>");	
			g_string_append( output, "{x");
		}
		else
		{
			g_string_append( output, PERS( victim, ch ) );
			g_string_append( output,"</send>");	
			g_string_append( output, "{x");
		}
	}


	if (!IS_NPC(victim) || victim->position != POS_STANDING)
	show_positions(ch,victim,output);
	g_string_append(output,"\n\r");
	/*
	 * If they have brief on.. cut the crap
	 */
	if ( !IS_NPC(ch) && !IS_SET(ch->act, PLR_BRIEF) )
	{ 
		/*
		 * Show Misc After Affects
		 */
		show_effects(ch,victim,output);

		/*
		 * Show the various shields a player might have
		 */
		show_shields(ch,victim,output);
	}	
	
	mxp = g_string_new("");
	mxpconv(mxp,output->str,ch);
	g_string_assign(output,mxp->str);
	g_string_free(mxp,TRUE);

	return output;
}



void evil_eye( CHAR_DATA *victim, CHAR_DATA *ch )
{
	char buf [MAX_STRING_LENGTH];
	int tabletype;
	
	return;
	
	if (IS_NPC(victim)) return;
	if (victim == ch) return;
	if (ch->level != 3 || victim->level != 3) return;
	if (get_disc(victim,DISC_DOMINATE) < 1) return;
	if (victim->powertype != NULL && victim->powertype->len > 1)
	{
		sprintf(buf,"\n\r%s\n\r",victim->powertype->str);
		send_to_char(buf,ch);
	}
	if (IS_SET(victim->spectype,EYE_SELFACTION) && victim->poweraction != NULL)
		interpret(victim,victim->poweraction->str);
	if (IS_SET(victim->spectype,EYE_ACTION) && victim->poweraction != NULL)
		interpret(ch,victim->poweraction->str);
	if (IS_SET(victim->spectype,EYE_SPELL) && victim->specpower > 0)
	{
		tabletype = skill_table[victim->specpower].target;
		(*skill_table[victim->specpower].spell_fun) (victim->specpower,victim->spl[tabletype],victim,ch);
	}
	return;
}


void show_char_to_char_1( CHAR_DATA *victim, CHAR_DATA *ch )
{
	char buf[MAX_STRING_LENGTH];
	OBJ_DATA *obj;
	char *formtobj;
	int iWear;
	int percent;
	bool found;
	
	if ( can_see( victim, ch ) && !IS_IMMORTAL(ch) )
	{
		act( "$n looks at you.", ch, NULL, victim, TO_VICT    );
		act( "$n looks at $N.",  ch, NULL, victim, TO_NOTVICT );
	}
	
	if (!IS_NPC(ch) && IS_HEAD(victim,LOST_HEAD))
	{
		act( "$N is lying here.", ch, NULL, victim, TO_CHAR );
		return;
	}
	if ( victim->description->str[0] != '\0' )
	{
		send_to_char( victim->description->str, ch );
	}
	else
	{
		act( "You see nothing special about $M.", ch, NULL, victim, TO_CHAR );
	}
	
	if ( victim->max_hit > 0 )
		percent = ( 100 * victim->hit ) / victim->max_hit;
	else
		percent = -1;
	
	str_cpy( buf, PERS(victim, ch) );
	
	if ( percent >= 100 ) strcat( buf, " is in {Wperfect health{x.\n\r"  );
	else if ( percent >=  90 ) strcat( buf, " is slightly {rscratched{x.\n\r" );
	else if ( percent >=  80 ) strcat( buf, " has a {bfew {Dbr{buis{Des{x.\n\r"     );
	else if ( percent >=  70 ) strcat( buf, " has some {rcuts{x.\n\r"         );
	else if ( percent >=  60 ) strcat( buf, " has {rseveral {Rwounds{x.\n\r"    );
	else if ( percent >=  50 ) strcat( buf, " has {Rmany nasty wounds{x.\n\r" );
	else if ( percent >=  40 ) strcat( buf, " is {mbleeding freely{x.\n\r"    );
	else if ( percent >=  30 ) strcat( buf, " is {Mcovered in {Rblood{x.\n\r"   );
	else if ( percent >=  20 ) strcat( buf, " is {Gleaking guts{x.\n\r"       );
	else if ( percent >=  10 ) strcat( buf, " is {calmost dead{x.\n\r"        );
	else                       strcat( buf, " is {CDYING{x.\n\r"              );
	
	buf[0] = UPPER(buf[0]);
	send_to_char( buf, ch );
	
	if (!IS_NPC( victim ))
	{
		if (IS_ADDED(victim, ADDED_HAND_FLAME))
    		act("$N's hands are engulfed in blazing flames.",ch,NULL,victim,TO_CHAR);
    	if (IS_SET(victim->sight, SIGHT_INFRARED) || IS_VAMPAFF(victim, VAM_NIGHTSIGHT)) act("$N's eyes are glowing {Rbright red{x.",ch,NULL,victim,TO_CHAR);
		if (IS_AFFECTED(victim, AFF_FLYING)) act("$N is hovering a few inches off of the ground.",ch,NULL,victim,TO_CHAR);
		if (IS_VAMPAFF(victim, VAM_FANGS)) act("$N has a pair of long, pointed {rfangs{x.",ch,NULL,victim,TO_CHAR);
		if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_VAMPIRE) && IS_VAMPAFF(victim, VAM_CLAWS))
			act("$N has razor sharp {rclaws{x protruding from under $S finger nails.",ch,NULL,victim,TO_CHAR);
		else if (!IS_NPC(victim) && IS_VAMPAFF(victim, VAM_CLAWS))
			act("$N has razor sharp {rtalons{x extending from $S fingers.",ch,NULL,victim,TO_CHAR);
                if (victim->blood_count > 0)
                        act("{R$N is covered in blood and gore.{x",ch,NULL,victim,TO_CHAR);
	if (!IS_NPC(victim))
    {
		if (IS_MOD(victim, MOD_TUSKS)) act("$N has a pair of tusks extending from $S mouth.",ch,NULL,victim,TO_CHAR);
		if (IS_MOD(victim, MOD_HORNS)) 
	   	 act("$N has a pair of pointed horns extending from $S head.",ch,NULL,victim,TO_CHAR);
	
		if (IS_MOD(victim, MOD_FINS)) act("$N has a pair of fins extending from the sides of $S body.",ch,NULL,victim,TO_CHAR);
		if (IS_MOD(victim, MOD_TAIL)) act("$N has a long tail hanging from $S backside.",ch,NULL,victim,TO_CHAR);
		if (IS_MOD(victim, MOD_EXOSKELETON)) act("$N is covered with an armoured exoskeleton.",ch,NULL,victim,TO_CHAR);
    }

    }
	found = FALSE;
	for ( iWear = 0; iWear < MAX_WEAR; iWear++ )
	{
		if (iWear == WEAR_HIDDEN)
			continue;

		if (!IS_SET(victim->extra,EXTRA_HAGS) && iWear == WEAR_HAGS)
			continue;

	// This skips the gay off hand to patch wear location # -dc
		if (iWear == 11) iWear++;
		if ( ( obj = get_eq_char( victim, iWear ) ) != NULL
			&&   can_see_obj( ch, obj ) )
		{
			if ( !found )
			{
				send_to_char( "\n\r", ch );
				act( "$N is using:", ch, NULL, victim, TO_CHAR );
				found = TRUE;
			}
			send_to_char( where_name[iWear], ch );
			if (IS_NPC(ch) || ch->pcdata->chobj == NULL || ch->pcdata->chobj != obj)
			{
				formtobj = format_obj_to_char( obj, ch, TRUE );
				send_to_char( formtobj, ch );
				g_free(formtobj);
				send_to_char( "\n\r", ch );
			}
			else
				send_to_char( "you\n\r", ch);
		}
	}
	
	if ( victim != ch
		&&   !IS_NPC(ch)
		&&   !IS_HEAD(victim, LOST_HEAD)
		&&   number_percent( ) < ch->pcdata->learned[gsn_peek] )
	{
		send_to_char( "\n\rYou peek at the inventory:\n\r", ch );
		show_list_to_char( victim->carrying, ch, TRUE, TRUE );
	}
	
	return;
}

void show_char_to_char( CHAR_DATA *list, CHAR_DATA *ch )
{
	CHAR_DATA *rch;
	char buf[MAX_STRING_LENGTH];
	GPtrArray *charShow;
	charDisplay *charDis;
	int nShow;
	int iShow;
	int count;
	bool fCombine;

	if ( ch->desc == NULL )
		return;
	
    /*
     * Alloc space for output lines.
     */
	count = 0;
	for ( rch = list; rch != NULL; rch = rch->next_in_room )
		count++;
	
	charShow = g_ptr_array_new();
	nShow	= 0;

	for ( rch = list; rch != NULL; rch = rch->next_in_room )
	{
		if ( rch == ch )
			continue;
		
		if ( !IS_NPC(rch) && IS_HEAD(rch,LOST_HEAD))
			continue;
		
		if ( !IS_NPC(rch) && IS_EXTRA(rch,EXTRA_OSWITCH))
			continue;

		if ( !IS_NPC(rch) && IS_EXTRA(rch,EXTRA_SWITCH))
			continue;


		if (!IS_NPC(rch) && rch->pcdata->chobj != NULL )
			continue;
/*

		if ((mount = rch->mount) != NULL && IS_SET(rch->mounted, IS_MOUNT))
			continue;
*/

		if ( can_see( ch, rch ) )
		{
			charDis = g_new(charDisplay,1);

			charDis->data = show_char_to_char_0( rch, ch );
			charDis->count = 1;

			fCombine = FALSE;
	
			if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
			{
				for ( iShow = nShow - 1; iShow >= 0; iShow-- )
				{
					charDisplay *tmpChar = (charDisplay*)g_ptr_array_index(charShow,iShow); 
					if ( !strcmp( tmpChar->data->str, charDis->data->str ) )
					{
						/*
						 * Found the string already, increment
						 * the counter..
						 */
						tmpChar->count++;
						fCombine = TRUE;
						break;
					}
				}
			}

			/*
			 * We can't find the string in the main list..
			 * so add a new line.
			 */	
			if ( !fCombine )
			{
				g_ptr_array_add(charShow,charDis);
				nShow++;
			}
			else
			{
				g_string_free(charDis->data,TRUE);
				g_free(charDis);
			}
		}
		else if ( room_is_dark( ch->in_room ) 
				&& (IS_SET(rch->sight, SIGHT_INFRARED)
				|| (!IS_NPC(rch)
				&& IS_VAMPAFF(rch, VAM_NIGHTSIGHT))))
			send_to_char( "You see {rglowing {Rred {reyes{x watching YOU!\n\r", ch );
	}
	
    	/*
     	* Output the formatted list.
     	*/
	for ( iShow = 0; iShow < nShow; iShow++ )
	{
		charDisplay *tmp_Char = (charDisplay*)g_ptr_array_index(charShow,iShow);
		if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
		{
			if (  tmp_Char->count != 1 )
			{
				sprintf( buf, "(%2d) ", tmp_Char->count );
				send_to_char( buf, ch );
			}
			else
			{
				send_to_char( "     ", ch );
			}
		}
		send_to_char( tmp_Char->data->str, ch );
		//send_to_char( "\n\r", ch );
		g_string_free(tmp_Char->data,TRUE);
		g_free(tmp_Char);
	}
	
	if ( nShow == 0 )
	{
		if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
			send_to_char( "     ", ch );
	}

    	/*
     	* Clean up.
     	*/
	g_ptr_array_free(charShow,TRUE);
	
	return;
} 



bool check_blind( CHAR_DATA *ch )
{
	if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_HOLYLIGHT) )
		return TRUE;
	
	if ( IS_ITEMAFF(ch, ITEMA_VISION) )
		return TRUE;
	
	if ( IS_HEAD(ch, LOST_EYE_L) && IS_HEAD(ch, LOST_EYE_R) )
	{
		send_to_char( "You have no eyes to see with!\n\r", ch );
		return FALSE;
	}
	
	if ( IS_EXTRA(ch, BLINDFOLDED) )
	{
		send_to_char( "You can't see a thing through the blindfold!\n\r", ch );
		return FALSE;
	}
	
	if ( IS_AFFECTED(ch, AFF_BLIND))
	{
		send_to_char( "You can't see a thing!\n\r", ch );
		return FALSE;
	}
	
	return TRUE;
}

void do_mspoff( CHAR_DATA *ch, char *argument )
{
	static char buf[MAX_STRING_LENGTH];
	
    	/* Send MSP String if triggered */
	if ( IS_SET(ch->deaf, CHANNEL_MSP ))
	{
		sprintf(buf,"\n\r!!MUSIC(OFF)\n\r!!SOUND(OFF)\n\r");
		send_to_char(buf,ch);
	}
}

void do_look( CHAR_DATA *ch, char *argument )
{
	char buf  [MAX_STRING_LENGTH];
	char arg1 [MAX_INPUT_LENGTH];
	char arg2 [MAX_INPUT_LENGTH];
	GString *mxpout;
	EXIT_DATA *pexit;
	CHAR_DATA *victim;
	CHAR_DATA *vch;
	CHAR_DATA *vch_next;
	CHAR_DATA *wizard;
	OBJ_DATA *obj;
	OBJ_DATA *portal;
	OBJ_DATA *portal_next;
	ROOM_INDEX_DATA *pRoomIndex;
	ROOM_INDEX_DATA *location;
	char *pdesc;
	int door;
	bool found;

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

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

	if ( ch->position < POS_SLEEPING )
	{
		send_to_char( "You can't see anything but stars!\n\r", ch );
		return;
	}

	if ( ch->position == POS_SLEEPING )
	{
		send_to_char( "You can't see anything, you're sleeping!\n\r", ch );
		return;
	}

	if ( !check_blind( ch ) )
		return;

	if (IS_RAFFECTED(ch->in_room,ROOM_AFF_DARK) && !IS_IMMORTAL(ch))
	{
		if (!IS_SWWF(ch))
		{
			send_to_char( "It is pitch black ... \n\r", ch );
			return;
		}
		if (IS_SWWF(ch) && get_tribe(ch,TRIBE_UKTENA) < 1)
		{
			send_to_char( "It is pitch black ... \n\r", ch );
			return;
		}
	}

	if ( !IS_NPC(ch)
			&&   !IS_SET(ch->act, PLR_HOLYLIGHT)
			&&   !IS_ITEMAFF(ch, ITEMA_VISION)
			&&   !IS_VAMPAFF(ch, VAM_NIGHTSIGHT)
			&&   !(ch->in_room != NULL && ch->in_room->vnum == ROOM_VNUM_IN_OBJECT
				&&   !IS_NPC(ch) && ch->pcdata->chobj != NULL
				&&   ch->pcdata->chobj->in_obj != NULL)
			&&   room_is_dark( ch->in_room ) )
	{
		send_to_char( "It is pitch black... \n\r", ch );
		show_char_to_char( ch->in_room->people, ch );
		return;
	}

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

	if ( arg1[0] == '\0' || !str_cmp( arg1, "auto" ) )
	{
		/* 'look' or 'look auto' */
		if (ch->in_room != NULL && ch->in_room->vnum == ROOM_VNUM_IN_OBJECT
				&& !IS_NPC(ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_obj != NULL)
			act( "$p",ch,ch->pcdata->chobj->in_obj,NULL,TO_CHAR);
		else
		{
			switch(ch->plane){
				case PLANE_EARTH:
					send_to_char( "{W",ch);
					send_to_char( "Underground",ch);	
					break;
				case PLANE_UMBRA:
					send_to_char( "{W",ch);
					send_to_char( "Umbra",ch);	
					break;
				case PLANE_SHADOW:
					send_to_char( "{W",ch);
					sprintf(buf,"Shadow %s",ch->in_room->name);
					send_to_char( buf,ch);	
					break;
				case PLANE_PUNISHMENT:
					send_to_char( "{W",ch);
					send_to_char( "Punishment",ch);	
					break;
				default:
				case PLANE_NORMAL:
					send_to_char( "{W",ch);
					send_to_char( ch->in_room->name, ch );
					break;
			}
			if (IS_SET(ch->act,PLR_HOLYLIGHT) && IS_IMMORTAL(ch))
			{
				sprintf(buf,"{B [Room %d]{x",ch->in_room->vnum);
				send_to_char(buf,ch);
			}

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

		if (ch->in_room != NULL && ch->in_room->vnum == ROOM_VNUM_IN_OBJECT
				&& !IS_NPC(ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_obj != NULL)
		{
			act( "You are inside $p.",ch,ch->pcdata->chobj->in_obj,NULL,TO_CHAR);
			show_list_to_char( ch->pcdata->chobj->in_obj->contains, ch, FALSE, FALSE );
		}
		else if ( ( !IS_NPC(ch) && !IS_SET(ch->act, PLR_BRIEF) ) &&
				( arg1[0] == '\0' || !str_cmp( arg1, "auto" ) ) )
		{
			switch(ch->plane){
				case PLANE_EARTH:
					send_to_char( "{W",ch);
					send_to_char( "You are underground.",ch);	
					break;
				case PLANE_UMBRA:
					send_to_char( "{W",ch);
					send_to_char( "You are some what lost, this is after all the Umbra",ch);	
					break;
				case PLANE_PUNISHMENT:
					send_to_char( "{W",ch);
					send_to_char( "You messed up and you are in the Punishment Plane.",ch);	
					break;
				default:
				case PLANE_SHADOW:
				case PLANE_NORMAL:
					send_to_char( "{w", ch );
					mxpout = g_string_new("");
					mxpconv(mxpout,ch->in_room->description,ch);
					send_to_char( mxpout->str, ch );
					g_string_free(mxpout,TRUE);
					break;
			}



			if (ch->in_room->blood == 1000)
				sprintf(buf,"{rYou notice that the room is completely drenched in blood.{x\n\r");
			else if (ch->in_room->blood > 750)
				sprintf(buf,"{rYou notice that there is a very large amount of blood around the room.{x\n\r");
			else if (ch->in_room->blood > 500)
				sprintf(buf,"{rYou notice that there is a large quantity of blood around the room.{x\n\r");
			else if (ch->in_room->blood > 250)
				sprintf(buf,"{rYou notice a fair amount of blood on the floor.{x\n\r");
			else if (ch->in_room->blood > 100)
				sprintf(buf,"{rYou notice several blood stains on the floor.{x\n\r");
			else if (ch->in_room->blood > 50)
				sprintf(buf,"{rYou notice a few blood stains on the floor.{x\n\r");
			else if (ch->in_room->blood > 25)
				sprintf(buf,"{rYou notice a couple of blood stains on the floor.{x\n\r");
			else if (ch->in_room->blood > 0)
				sprintf(buf,"{rYou notice a few drops of blood on the floor.{x\n\r");
			else sprintf(buf,"{rYou notice nothing special in the room.{x\n\r");
			if (ch->in_room->blood > 0) send_to_char(buf,ch);
		}

		if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOEXIT) )
			do_exits( ch, "auto" );

		show_list_to_char( ch->in_room->contents, ch, FALSE, FALSE );
		show_char_to_char( ch->in_room->people,   ch );
		return;
	}

	if ( !str_cmp( arg1, "i" ) || !str_cmp( arg1, "in" ) )
	{
		/* 'look in' */
		if ( arg2[0] == '\0' )
		{
			send_to_char( "Look in what?\n\r", ch );
			return;
		}

		if ( ( obj = get_obj_here( ch, arg2 ) ) == NULL )
		{
			send_to_char( "You do not see that here.\n\r", ch );
			return;
		}

		switch ( obj->item_type )
		{
			default:
				send_to_char( "That is not a container.\n\r", ch );
				return;

			case ITEM_PORTAL:
				pRoomIndex = get_room_index(obj->value[0]);
				location = ch->in_room;
				if ( pRoomIndex == NULL )
				{
					send_to_char( "It doesn't seem to lead anywhere.\n\r", ch );
					return;
				}
				if (obj->value[2] == 1 || obj->value[2] == 3)
				{
					send_to_char( "It seems to be closed.\n\r", ch );
					return;
				}
				char_from_room(ch);
				char_to_room(ch,pRoomIndex);

				found = FALSE;
				for ( portal = ch->in_room->contents; portal != NULL; portal = portal_next )
				{
					portal_next = portal->next_content;
					if ( ( obj->value[0] == portal->value[3]  )
							&& (obj->value[3] == portal->value[0]) )
					{
						found = TRUE;
						do_look(ch,"auto");
						break;
					}
				}
				char_from_room(ch);
				char_to_room(ch,location);
				break;

			case ITEM_DRINK_CON:
				if ( obj->value[1] <= 0 )
				{
					send_to_char( "It is empty.\n\r", ch );
					break;
				}

				if (obj->value[1] < obj->value[0] / 5)
					sprintf( buf, "There is a little %s liquid left in it.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0] / 4)
					sprintf( buf, "It contains a small amount of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0] / 3)
					sprintf( buf, "It's about a third full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0] / 2)
					sprintf( buf, "It's about half full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0])
					sprintf( buf, "It is almost full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] == obj->value[0])
					sprintf( buf, "It's completely full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else
					sprintf( buf, "Somehow it is MORE than full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				send_to_char( buf, ch );
				break;

			case ITEM_CONTAINER:
				if ( IS_SET(obj->value[1], CONT_CLOSED) )
				{
					send_to_char( "It is closed.\n\r", ch );
					break;
				}
				break;
			case ITEM_CORPSE_NPC:
			case ITEM_CORPSE_PC:
				{
					sh_int timerfrac = obj->timer;
					if ( obj->item_type == ITEM_CORPSE_PC )
						timerfrac = (int)obj->timer / 8 + 1; 

					switch (timerfrac)
					{
						default:
							// send_to_char( "{RThis corpse has recently been slain.{x\n\r\n\r", ch );
							break;
						case 4:
							send_to_char( "{RThis corpse was slain a little while ago.{x\n\r\n\r", ch );
							break;
						case 3:
							send_to_char( "{RA foul smell rises from the corpse, and it is covered in flies.{x\n\r\n\r", ch );
							break;
						case 2:
							send_to_char( "{RA writhing mass of maggots and decay, you can barely go near this corpse.{x\n\r\n\r", ch );
							break;
						case 1:
							send_to_char( "{RLittle more than bones, there isn't much left of this corpse.{x\n\r\n\r", ch );
							break;
						case 0:
							break;
					}
				}

		}
		act( "$p contains:", ch, obj, NULL, TO_CHAR );
		show_list_to_char( obj->contains, ch, TRUE, TRUE );
		return;
	}

	if ( ( victim = get_char_room( ch, arg1 ) ) != NULL )
	{
		show_char_to_char_1( victim, ch );
		if (!IS_NPC(ch) && ch->murmur_name->str != NULL && !strcmp(ch->murmur_name->str, victim->name->str))
			interpret(ch,ch->murmur_command->str);
		evil_eye(victim,ch);
		return;
	}

	for ( vch = char_list; vch != NULL; vch = vch_next )
	{
		vch_next	= vch->next;
		if ( vch->in_room == NULL )
			continue;
		if ( vch->in_room == ch->in_room )
		{
			if (!IS_NPC(vch) && !str_cmp(arg1,vch->morph->str))
			{
				show_char_to_char_1( vch, ch );
				evil_eye(vch,ch);
				return;
			}
			continue;
		}
	}

	if (!IS_NPC(ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_obj != NULL)
	{
		obj = get_obj_in_obj(ch,arg1);
		if (obj != NULL)
		{
			mxpout = g_string_new("");
			mxpconv(mxpout,obj->description->str,ch);
			send_to_char( mxpout->str, ch );
			send_to_char( "\n\r", ch );
			g_string_free(mxpout,TRUE);
			return;
		}
	}

	for ( obj = ch->carrying; obj != NULL; obj = obj->next_content )
	{
		if (!IS_NPC(ch) && ch->pcdata->chobj != NULL && obj->chobj != NULL && obj->chobj == ch)
			continue;
		if ( can_see_obj( ch, obj ) )
		{
			pdesc = get_extra_descr( arg1, obj->extra_descr );
			if ( pdesc != NULL )
			{
				send_to_char( pdesc, ch );
				return;
			}

			pdesc = get_extra_descr( arg1, obj->pIndexData->extra_descr );
			if ( pdesc != NULL )
			{
				send_to_char( pdesc, ch );
				return;
			}
		}

		if ( is_name( arg1, obj->name->str ) )
		{
			if (HAS_PROG(obj->pIndexData,TRIG_LOOK))
			{
				oprog_percent_trigger(obj,ch,NULL,NULL,TRIG_LOOK);
				return;
			}

			mxpout = g_string_new("");
			mxpconv(mxpout,obj->description->str,ch);

			send_to_char( mxpout->str, ch );
			send_to_char( "\n\r", ch );
			g_string_free(mxpout,TRUE);
			return;
		}
	}

	for ( obj = ch->in_room->contents; obj != NULL; obj = obj->next_content )
	{
		if (!IS_NPC(ch) && ch->pcdata->chobj != NULL && obj->chobj != NULL && obj->chobj == ch)
			continue;
		if ( can_see_obj( ch, obj ) )
		{
			pdesc = get_extra_descr( arg1, obj->extra_descr );
			if ( pdesc != NULL )
			{
				send_to_char( pdesc, ch );
				return;
			}

			pdesc = get_extra_descr( arg1, obj->pIndexData->extra_descr );
			if ( pdesc != NULL )
			{
				send_to_char( pdesc, ch );
				return;
			}
		}

		if ( is_name( arg1, obj->name->str ) )
		{
			if (HAS_PROG(obj->pIndexData,TRIG_LOOK))
			{
				oprog_percent_trigger(obj,ch,NULL,NULL,TRIG_LOOK);
				return;
			}

			mxpout = g_string_new("");
			mxpconv(mxpout,obj->description->str,ch);
			send_to_char( mxpout->str, ch );
			send_to_char( "\n\r", ch );
			g_string_free(mxpout,TRUE);
			return;
		}
	}

	pdesc = get_extra_descr( arg1, ch->in_room->extra_descr );
	if ( pdesc != NULL )
	{
		send_to_char( pdesc, ch );
		return;
	}

	if      ( !str_cmp( arg1, "n" ) || !str_cmp( arg1, "north" ) ) door = 0;
	else if ( !str_cmp( arg1, "e" ) || !str_cmp( arg1, "east"  ) ) door = 1;
	else if ( !str_cmp( arg1, "s" ) || !str_cmp( arg1, "south" ) ) door = 2;
	else if ( !str_cmp( arg1, "w" ) || !str_cmp( arg1, "west"  ) ) door = 3;
	else if ( !str_cmp( arg1, "u" ) || !str_cmp( arg1, "up"    ) ) door = 4;
	else if ( !str_cmp( arg1, "d" ) || !str_cmp( arg1, "down"  ) ) door = 5;
	else
	{
		send_to_char( "You do not see that here.\n\r", ch );
		return;
	}

	/* 'look direction' */
	if ( ( pexit = ch->in_room->exit[door] ) == NULL )
	{
		send_to_char( "Nothing special there.\n\r", ch );
		return;
	}
	/*
	   if ( pexit->description != NULL && pexit->description[0] != '\0' )
	   send_to_char( pexit->description, ch );
	   else
	   send_to_char( "Nothing special there.\n\r", ch );
	   */

	if ( pexit->keyword    != NULL
			&&   pexit->keyword[0] != '\0'
			&&   pexit->keyword[0] != ' ' )
	{
		if ( IS_SET(pexit->exit_info, EX_CLOSED) )
		{
			act( "The $d is closed.", ch, NULL, pexit->keyword, TO_CHAR );
		}
		else if ( IS_SET(pexit->exit_info, EX_ISDOOR) )
		{
			act( "The $d is open.",   ch, NULL, pexit->keyword, TO_CHAR );
			if ((pexit = ch->in_room->exit[door]) == NULL) return;
			if ((pRoomIndex = pexit->to_room) == NULL) return;
			location = ch->in_room;
			char_from_room(ch);
			char_to_room(ch,pRoomIndex);
			do_look(ch,"auto");
			char_from_room(ch);
			char_to_room(ch,location);
		}
		else
		{
			if ((pexit = ch->in_room->exit[door]) == NULL) return;
			if ((pRoomIndex = pexit->to_room) == NULL) return;
			location = ch->in_room;
			char_from_room(ch);
			char_to_room(ch,pRoomIndex);
			do_look(ch,"auto");
			char_from_room(ch);
			char_to_room(ch,location);
		}
	}
	else
	{
		if ((pexit = ch->in_room->exit[door]) == NULL) return;
		if ((pRoomIndex = pexit->to_room) == NULL) return;
		location = ch->in_room;
		char_from_room(ch);
		char_to_room(ch,pRoomIndex);
		do_look(ch,"auto");
		char_from_room(ch);
		char_to_room(ch,location);
	}
	mudsetting->last_proc_logged = 5;
	return;
}



void do_examine( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_INPUT_LENGTH];
	OBJ_DATA *obj;
	
	one_argument( argument, arg );
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Examine what?\n\r", ch );
		return;
	}
	
	do_look( ch, arg );
	
	if ( ( obj = get_obj_here( ch, arg ) ) != NULL )
	{
		if (obj->condition >= 100) 
			sprintf( buf, "You notice that %s is in perfect condition.\n\r",obj->short_descr->str );
		else if (obj->condition >= 75 )
			sprintf( buf, "You notice that %s is in good condition.\n\r",obj->short_descr->str );
		else if (obj->condition >= 50 )
			sprintf( buf, "You notice that %s is in average condition.\n\r",obj->short_descr->str );
		else if (obj->condition >= 25 )
			sprintf( buf, "You notice that %s is in poor condition.\n\r",obj->short_descr->str );
		else
			sprintf( buf, "You notice that %s is in awful condition.\n\r",obj->short_descr->str );
		send_to_char(buf,ch);
		switch ( obj->item_type )
		{
			default:
				break;
				
			case ITEM_DRINK_CON:
			case ITEM_CONTAINER:
			case ITEM_CORPSE_NPC:
			case ITEM_CORPSE_PC:
				send_to_char( "When you look inside, you see:\n\r", ch );
				sprintf( buf, "in %s", arg );
				do_look( ch, buf );
		}
	}
	
	return;
}



/*
 * Thanks to Zrin for auto-exit part.
 */
void do_exits( CHAR_DATA *ch, char *argument )
{
	extern char * const dir_name[];
	char buf[MAX_STRING_LENGTH];
	GString *mxpout;
	EXIT_DATA *pexit;
	bool found;
	bool fAuto;
	int door;
	
	buf[0] = '\0';
	fAuto  = !str_cmp( argument, "auto" );
	
	if ( !check_blind( ch ) )
		return;
	
	str_cpy( buf, fAuto ? (char *)"[Exits:" : (char *)"Obvious exits:\n\r" );
	
	found = FALSE;
	for ( door = 0; door <= 5; door++ )
	{
		if ( ( pexit = ch->in_room->exit[door] ) != NULL
			&&   pexit->to_room != NULL
			&&   !IS_SET(pexit->exit_info, EX_CLOSED) )
		{
			found = TRUE;
			if ( fAuto )
			{
				strcat( buf, " " );
				strcat( buf, dir_name[door] );
			}
			else
			{
				sprintf( buf + strlen(buf), "%-5s - %s\n\r",
					capitalize( dir_name[door] ),
					room_is_dark( pexit->to_room )
					?  "Too dark to tell"
					: pexit->to_room->name
					);
			}
		}
	}
	
	if ( !found )
		strcat( buf, fAuto ? " none" : "None.\n\r" );
	
	if ( fAuto )
		strcat( buf, "]{x\n\r" );
	
	send_to_char("{B\n\r",ch );
	mxpout = g_string_new("");
	mxpconv(mxpout,buf,ch);
	send_to_char( mxpout->str, ch );
	g_string_free(mxpout,TRUE);
	return;
}

char *wp_stname(CHAR_DATA *ch)
{
	static char buf[MAX_INPUT_LENGTH];
	
	if (ch->pcdata->willpower == -10) str_cpy(buf,"WP Atrocity");
	else if ( ch->pcdata->willpower <= -5 ) str_cpy(buf,"WP Inept");
	else if ( ch->pcdata->willpower <= -1 ) str_cpy(buf,"WP Offender");
	else if ( ch->pcdata->willpower == 0  ) str_cpy(buf,"WP Unranked");
	else if ( ch->pcdata->willpower <= 4  ) str_cpy(buf,"WP Initiate");
	else if ( ch->pcdata->willpower <= 9  ) str_cpy(buf,"WP Novice");
	else if ( ch->pcdata->willpower <= 14 ) str_cpy(buf,"WP Adept");
	else if ( ch->pcdata->willpower <= 19 ) str_cpy(buf,"WP Expert");
	else if ( ch->pcdata->willpower <= 24 ) str_cpy(buf,"WP Master");
	else if ( ch->pcdata->willpower >= 25 ) str_cpy(buf,"WP Advisor");
	
	return buf;
}


void do_score( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *vch;
	CHAR_DATA *victim;
	char buf[MAX_STRING_LENGTH];
	char buf2[MAX_STRING_LENGTH];
	char place_holder[MAX_STRING_LENGTH];
	char arg[MAX_STRING_LENGTH];
	char ss1[MAX_STRING_LENGTH];
	char ss2[MAX_STRING_LENGTH];
	char ss3[MAX_STRING_LENGTH];
	char ss4[MAX_STRING_LENGTH];
	int a_c;
	
	argument = one_argument(argument,arg);
	
	if ( arg[0] == '\0' || !IS_JUDGE(ch) )
		vch = ch;
	else if ( (vch = get_char_world(ch,arg)) == NULL )
	{
		send_to_char("Get a score on who?\n\r", ch);
		return;
	}
	
	if ( IS_NPC(ch))
	{
		send_to_char("No scoring Npc's yet.\n\r",ch);
		return;
	}
	
	if ( IS_NPC(vch) )
	{
		send_to_char("Go score PCs, jerky!",ch);
		return;
	}
	
	a_c = char_ac(vch);
	
	if (ch->fighting != NULL)
		victim = ch->fighting;
	else
		victim = ch;
	
	update_damcap(ch,ch);
	
	if (!IS_NPC(vch) && (IS_EXTRA(vch,EXTRA_OSWITCH) || IS_HEAD(vch,LOST_HEAD)))
	{obj_score(vch,vch->pcdata->chobj);return;}
	
	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	sprintf( buf,
		" %s%s.\n\r",
		vch->name->str,
		IS_NPC(vch) ? "" : vch->pcdata->title->str);
	send_to_char( buf, ch );
	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	sprintf( buf,
		"      Hp [ {R%6d{x/{R%-6d{x ] HitDam [ {R%4d{x/{R%-4d{x ] Str [ {M%2d{x ]    Exp [ {C%9d{x ]\n\r",
		vch->hit,  vch->max_hit,  
		char_hitroll(vch),  
		char_damroll(vch),  
		get_curr_str(vch),
		vch->exp );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"    Mana [ {R%6d{x/{R%-6d{x ] DamCap [ {R%9d{x ] Int [ {M%2d{x ] Qp [ {C%5d{x ]\n\r",
		vch->mana,  vch->max_mana,  
		vch->damcap[DAM_CAP],
		get_curr_int(vch),
		vch->pcdata->quest);
	send_to_char( buf, ch );
	
	sprintf( buf,
		"    Move [ {R%6d{x/{R%-6d{x ]     Ac [ {R%9d{x ] Wis [ {M%2d{x ] Primal [ {C%9d{x ]\n\r",
		vch->move,  vch->max_move,  
		a_c,
		get_curr_wis(vch),
		vch->practice );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"   Items [ {R%6d{x/{R%-6d{x ]  Wimpy [ {R%9d{x ] Dex [ {M%2d{x ]  Hours [ {C%9d{x ]\n\r",
		vch->carry_number, can_carry_n(vch),
		vch->wimpy,
		get_curr_dex(vch),
		(get_age(vch) - 17) * 2 );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"  Weight [ {R%6d{x/{R%-7d{x]  Align [ {R%9d{x ] Con [ {M%2d{x ]   Gold [ {y%9d{x ]\n\r",
		vch->carry_weight, can_carry_w(vch),
		vch->alignment,
		get_curr_con(vch),
		vch->gold );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	if ( !IS_NPC(vch) && IS_EXTRA(vch, EXTRA_DONE) )
		strcat(buf,"  You are no longer a virgin.  \n\r");
	send_to_char( buf, ch );

	if (IS_SET(ch->pcdata->comm, COMM_RP))
		send_to_char("  You are notifying a RP imm. \n\r",ch);
/*
    send_to_char( "You are ", ch );
         if ( a_c >=  101 ) send_to_char( "naked!\n\r", ch );
    else if ( a_c >=   80 ) send_to_char( "barely clothed.\n\r",   ch );
    else if ( a_c >=   60 ) send_to_char( "wearing clothes.\n\r",  ch );
    else if ( a_c >=   40 ) send_to_char( "slightly armored.\n\r", ch );
    else if ( a_c >=   20 ) send_to_char( "somewhat armored.\n\r", ch );
    else if ( a_c >=    0 ) send_to_char( "armored.\n\r",          ch );
    else if ( a_c >=  -50 ) send_to_char( "well armored.\n\r",     ch );
    else if ( a_c >= -150 ) send_to_char( "strongly armored.\n\r", ch );
    else if ( a_c >= -300 ) send_to_char( "heavily armored.\n\r",  ch );
    else if ( a_c >= -600 ) send_to_char( "superbly armored.\n\r", ch );
    else if ( a_c >= -849 ) send_to_char( "divinely armored.\n\r", ch );
    else                    send_to_char( "ultimately armored!\n\r",ch );
*/
	
	if ( !IS_NPC(vch) && IS_CLASS(vch,CLASS_VAMPIRE) )
	{
		sprintf( buf, " {RBlood: {R%3d{x\n\r ", vch->pcdata->condition[COND_THIRST] );
		send_to_char( buf, ch );
/*
	sprintf( buf, " Beast: {Y%3d{x.\n\r", vch->beast );
	send_to_char( buf, ch );
        if      (vch->beast <  0 ) send_to_char("You are a cheat!\n\r",ch);
	else if (vch->beast == 0 ) send_to_char("You have attained Golconda!\n\r",ch);
	else if (vch->beast <= 5 ) send_to_char("You have almost reached Golconda!\n\r",ch);
	else if (vch->beast <= 10) send_to_char("You are nearing Golconda!\n\r",ch);
	else if (vch->beast <= 15) send_to_char("You have great control over your beast.\n\r",ch);
	else if (vch->beast <= 20) send_to_char("Your beast has little influence over your actions.\n\r",ch);
	else if (vch->beast <= 30) send_to_char("You are in control of your beast.\n\r",ch);
	else if (vch->beast <= 40) send_to_char("You are able to hold back the beast.\n\r",ch);
	else if (vch->beast <= 60) send_to_char("You are constantly struggling for control of your beast.\n\r",ch);
	else if (vch->beast <= 75) send_to_char("Your beast has great control over your actions.\n\r",ch);
	else if (vch->beast <= 90) send_to_char("The power of the beast overwhelms you.\n\r",ch);
	else if (vch->beast <= 99) send_to_char("You have almost lost your battle with the beast!\n\r",ch);
	else                      send_to_char("The beast has taken over!\n\r",ch);
*/
	}
	else if (vch->level >= 0)
		send_to_char( "\n\r", ch );
	if (!IS_NPC(vch) && ch == vch ) birth_date(vch, TRUE);
	if (!IS_NPC(vch) && ch == vch && IS_EXTRA(vch, EXTRA_PREGNANT)) birth_date(vch, FALSE);
	
	if ( get_trust( vch ) != vch->level )
	{
		sprintf( buf, "You are trusted at level %d.\n\r",
			get_trust( vch ) );
		send_to_char( buf, ch );
	}
	
	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	if ( !IS_NPC(vch) && vch->level >= 0 )
	{
		sprintf( buf, "PK Status: [ {Y%2d{x ][ %13s ] ", vch->race, get_status_name(vch) );
	}
	
	if ( !IS_NPC(vch) )
	{
		if      (vch->pkill  == 0) sprintf(ss1,"none");
		else if (vch->pkill  == 1) sprintf(ss1,"%4d",vch->pkill);
		else                       sprintf(ss1,"%4d",vch->pkill);
		if      (vch->pdeath == 0) sprintf(ss2,"none");
		else if (vch->pdeath == 1) sprintf(ss2,"%4d",vch->pdeath);
		else                       sprintf(ss2,"%4d",vch->pdeath);
		sprintf( buf2, "PKills [ {R%7s{x ] PDeaths [ {R%4s{x ]  Timers\n\r", ss1, ss2 );
		strcat(buf,buf2);
		send_to_char( buf, ch );
	}
	
	str_cpy(place_holder,"             ");
	
	if ( !IS_NPC(vch) )
	{
		if      (vch->mkill  == 0) sprintf(ss1,"none");
		else if (vch->mkill  == 1) sprintf(ss1,"%4d",vch->mkill);
		else                       sprintf(ss1,"%4d",vch->mkill);
		if      (vch->mdeath == 0) sprintf(ss2,"none");
		else if (vch->mdeath == 1) sprintf(ss2,"%4d",vch->mdeath);
		else                       sprintf(ss2,"%4d",vch->mdeath);
		if      (vch->pk_timer == 0) sprintf(ss3,"-");
		else if (vch->pk_timer == 1) sprintf(ss3,"%d",vch->pk_timer);
		else                       sprintf(ss3,"%d",vch->pk_timer);
		if      (vch->delay_timer == 0) sprintf(ss4,"-");
		else if (vch->delay_timer == 1) sprintf(ss4,"%d",vch->delay_timer);
		else                       sprintf(ss4,"%d",vch->delay_timer);
		sprintf( buf, "                               MKills [ {R%7s{x ] MDeaths [ {R%4s{x ] [ c{Y%s{x/{M%s{xw ]\n\r",ss1, ss2, ss3, ss4 );
		send_to_char( buf, ch );
	}
	
	if (IS_SET(vch->act,PLR_ATTACK))
	{
		sprintf(buf,"Open to attack: {Y%s{x\n\r", attack_bit_name(vch->pk_sect));
		send_to_char(buf,ch);
	}
	
   
		if (IS_CLASS(vch,CLASS_VAMPIRE))
			sprintf( buf, "Willpower: [ {Y%2d{x ][ %13s ] CPonts [ {R%7d{x ] Diabs  [ {R%4d{x ]\n\r",vch->pcdata->willpower,wp_stname(vch),vch->pcdata->charpoints,vch->pcdata->diab[DIAB_EVER]);
		else if (IS_CLASS(vch,CLASS_MAGE))
			sprintf( buf, "Willpower: [ {Y%2d{x ][ %13s ] CPonts [ {R%7d{x ] Paradox [ {R%4d{x ]\n\r",vch->pcdata->willpower,wp_stname(vch),vch->pcdata->charpoints,vch->paradox[0]);
		else
			sprintf( buf, "Willpower: [ {Y%2d{x ][ %13s ] CPonts [ {R%7d{x ]\n\r",vch->pcdata->willpower,wp_stname(vch),vch->pcdata->charpoints);
		
		send_to_char( buf, ch );
	
	if (IS_IMMORTAL(ch))
	{
		sprintf( buf, "Spent: [ {Y%d QP{x ][ {Y%d CP{x ][ {Y%d P{x ]\n\r",
			vch->pcdata->spent[SPENT_QP],
			vch->pcdata->spent[SPENT_CP],
			vch->pcdata->spent[SPENT_P]);
		send_to_char(buf,ch);
		sprintf( buf, "Spent: [ {Y%d RP{x ][ {Y%d QPToken{x]\n\r",
			vch->pcdata->spent[SPENT_RP],
			vch->pcdata->spent[SPENT_T]);
		send_to_char(buf,ch);
	}

	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	if (IS_AFFECTED(vch,AFF_HIDE)) send_to_char( "You are keeping yourself hidden from those around you.\n\r", ch );
	
	if ( !IS_NPC(vch) )
	{
		if ( IS_CLASS(vch,CLASS_WEREWOLF))
// took out --> && vch->pcdata->powers[WPOWER_SILVER] > 0
		{
			sprintf(buf,"You have attained %d points of silver tolerance.\n\r",vch->pcdata->powers[WPOWER_SILVER]);
			send_to_char( buf, ch );
		}
		if ( IS_CLASS(vch,CLASS_VAMPIRE) && vch->pcdata->stats[UNI_RAGE] > 0)
		{
			sprintf(buf,"The beast is in control of your actions:  Affects Hitroll and Damroll by +%d.\n\r",vch->pcdata->stats[UNI_RAGE]);
			send_to_char( buf, ch );
		}
		else if ( IS_SET(vch->special,SPC_WOLFMAN) && vch->pcdata->stats[UNI_RAGE] > 0)
		{
			sprintf(buf,"You are raging:  Affects Hitroll and Damroll by +%d.\n\r",vch->pcdata->stats[UNI_RAGE]);
			send_to_char( buf, ch );
		}
	}
	
	if ( !IS_NPC(vch) && vch->pcdata->condition[COND_DRUNK]   > 10 )
		send_to_char( "You are drunk.\n\r",   ch );
	if ( !IS_NPC(vch) && vch->pcdata->condition[COND_THIRST] ==  0 )
		send_to_char( "You are thirsty.\n\r", ch );
	if ( !IS_NPC(vch) && vch->pcdata->condition[COND_FULL]   ==  0 )
		send_to_char( "You are hungry.\n\r",  ch );
	if ( !IS_NPC(vch) && vch->pcdata->stage[0] >= 100 )
		send_to_char( "You are feeling extremely horny.\n\r",  ch );
	else if ( !IS_NPC(vch) && vch->pcdata->stage[0] >= 50 )
		send_to_char( "You are feeling pretty randy.\n\r",  ch );
	else if ( !IS_NPC(vch) && vch->pcdata->stage[0] >= 1 )
		send_to_char( "You are feeling rather kinky.\n\r",  ch );
	
    if (vch->primal_hold > 0)
    {
        sprintf(buf,"You have %ld primal to spend.\n\r",vch->primal_hold );
        send_to_char(buf,ch);
    }

	if ( !IS_NPC(vch) && vch->pcdata->stage[1] > 0 && vch->position == POS_STANDING )
	{
		send_to_char( "You are having sexual intercourse.\n\r",  ch );
		if (!IS_NPC(vch) && (vch->pcdata->stage[2] + 25) >= vch->pcdata->stage[1])
			send_to_char( "You are on the verge of having an orgasm.\n\r",  ch );
	}
	else switch ( vch->position )
	{
		case POS_DEAD:     
			send_to_char( "You are DEAD!!\n\r",		ch );
			break;
		case POS_MORTAL:
			send_to_char( "You are mortally wounded.\n\r",	ch );
			break;
		case POS_INCAP:
			send_to_char( "You are incapacitated.\n\r",	ch );
			break;
		case POS_STUNNED:
			send_to_char( "You are stunned.\n\r",		ch );
			break;
		case POS_SLEEPING:
			send_to_char( "You are sleeping.\n\r",		ch );
			break;
		case POS_RESTING:
			send_to_char( "You are resting.\n\r",		ch );
			break;
		case POS_MEDITATING:
			send_to_char( "You are meditating.\n\r",	ch );
			break;
		case POS_SITTING:
			send_to_char( "You are sitting.\n\r",		ch );
			break;
		case POS_STANDING:
			send_to_char( "You are standing.\n\r",		ch );
			break;
		case POS_FIGHTING:
			send_to_char( "You are fighting.\n\r",		ch );
			break;
	}
	return;
}


void do_affects( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	AFFECT_DATA *paf, *paf_last = NULL;
	
	send_to_char( "\n\r{CYou are affected by the following shields:{x\n\r\n\r", ch );
	if ( IS_ITEMAFF(ch, ITEMA_SHOCKSHIELD) ) 
		send_to_char("{YShockShield{x ",ch);
	if ( IS_ITEMAFF(ch, ITEMA_FIRESHIELD) ) 
		send_to_char("{RFireShield{x ",ch);
	if ( IS_ITEMAFF(ch, ITEMA_ICESHIELD) ) 
		send_to_char("{CIceShield{x ",ch);
	if ( IS_ITEMAFF(ch, ITEMA_ACIDSHIELD) ) 
		send_to_char("{GAcidShield{x ",ch);
	if ( IS_ITEMAFF(ch, ITEMA_CHAOSSHIELD) ) 
		send_to_char("{MChaosShield{x ",ch);
	if ( IS_ITEMAFF(ch, ITEMA_REFLECT) ) 
		send_to_char("{BDarkShield{x ",ch);
	
	if ( ch->affected != NULL )
	{
		send_to_char( "\n\r{CYou are affected by the following spells:{x\n\r\n\r", ch );
		for ( paf = ch->affected; paf != NULL; paf = paf->next )
		{
			if (paf_last != NULL && paf->type == paf_last->type)
				if (ch->level >= 0)
					sprintf( buf, "                     ");
				else
					continue;
			else
				sprintf( buf, "{M%21s{x", skill_table[paf->type].name );
			
			send_to_char( buf, ch );
			
			if ( ch->level >= 0 )
			{
				sprintf( buf,
					" : mods {R%-13s{x by {W%4d{x ",
					affect_loc_name( paf->location ),
					paf->modifier);
				send_to_char( buf, ch );
				if ( paf->duration == -1 )
					sprintf( buf, " {Wpermanently{x" );
				else
					sprintf( buf, "for {W%4d{x hrs", paf->duration );
				send_to_char( buf, ch );
			}
			
			send_to_char( "\n\r", ch );
			paf_last = paf;
		}
	}
	else 
		send_to_char("\n\r{CYou are not affected by any spells.{x\n\r",ch);
    //endif -dc
	
	send_to_char("\n\r{COther permanent spell affects:{x\n\r\n\r",ch );
	sprintf( buf, "{M%s{x\n\r", affect_bit_name( ch->affected_by ) );  
	send_to_char( buf, ch );
	
	return;
}

/*
	send_to_char( "{CYou are affected by:{x\n\r", ch );
	for ( paf = ch->affected; paf != NULL; paf = paf->next )
	{
	    sprintf( buf, "Spell: '%s'", skill_table[paf->type].name );
	    send_to_char( buf, ch );

	    if ( ch->level >= 0 )
	    {
		sprintf( buf,
		    " modifies %s by %d for %d hours with bits %s.\n\r",
		    affect_loc_name( paf->location ),
		    paf->modifier,
		    paf->duration,
		    affect_bit_name( paf->bitvector ) );
		send_to_char( buf, ch );
	    }
	}
    }
    else
    {
 	send_to_char( "{CYou are not affected by any spells.{x\n\r", ch );
    }

}
*/

char *	const	day_name	[] =
{
	"the Moon", "the Bull", "Deception", "Thunder", "Freedom",
	"the Great Gods", "the Sun"
};

char *	const	month_name	[] =
{
	"Winter", "the Winter Wolf", "the Frost Giant", "the Old Forces",
	"the Grand Struggle", "the Spring", "Nature", "Dominion", "the Dragon",
	"the Sun", "the Heat", "the Battle", "the Dark Shades", "the Shadows",
	"the Long Shadows", "the Ancient Darkness", "the Great Evil"
};

void do_time( CHAR_DATA *ch, char *argument )
{
	extern char str_boot_time[];
	extern time_t boot_time;
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_STRING_LENGTH];
	char *suf;
	int day;
	int min_up,hour_up;

	day     = time_info.day + 1;

	argument = one_argument(argument,arg);

	if ( arg[0] != '\0' &&  ch->level > LEVEL_HIGHJUDGE)
	{
		if (!strcmp(arg,"midnight"))
		{
			time_info.hour = 23;
			do_info(ch,"Midnight has fallen!\n\r");
			send_to_char("You use your godly power to change time it self.\n\r",ch);
		}
		else if ( !strcmp(arg,"noon"))
		{
			time_info.hour = 12;
			do_info(ch,"The clock has rung noon.");
			send_to_char("You use your godly power to change time it self.\n\r",ch);
		}
		else
		{
			send_to_char("Syntax: Time (noon) or Time (midnight)\n\r",ch);
			return;
		}
	}

	if ( day > 4 && day <  20 ) suf = "th";
	else if ( day % 10 ==  1       ) suf = "st";
	else if ( day % 10 ==  2       ) suf = "nd";
	else if ( day % 10 ==  3       ) suf = "rd";
	else                             suf = "th";
	
	if ( time_info.half_hour == 30 )
	{
		sprintf( buf,
		"{yIt is %d:30 %s, Day of %s, %d%s the Month of %s.\n\r",
		(time_info.hour % 12 == 0) ? 12 : time_info.hour % 12,
		time_info.hour >= 12 ? "pm" : "am",	day_name[day % 7],
		day, suf, month_name[time_info.month]);
		send_to_char( buf, ch );
	}
	else
	{	
		sprintf( buf,
		"{yIt is %d o'clock %s, Day of %s, %d%s the Month of %s.\n\r",
		(time_info.hour % 12 == 0) ? 12 : time_info.hour % 12,
		time_info.hour >= 12 ? "pm" : "am", day_name[day % 7], day, suf,
		month_name[time_info.month]);	
		send_to_char( buf, ch );

	}
	
	if (time_info.hour < 6 || time_info.hour > 18)
	{
		switch (weather_info[ch->in_room->sector_type].moon)
		{
	   		case MOON_FULL:
				send_to_char("The full moon is up in the sky.\n\r\n\r",ch);
			break;
	   		case MOON_NEW:
		 		send_to_char("The new moon is up in the sky.\n\r\n\r",ch);
			break;
			case MOON_1_QUART:
				send_to_char("The cresent moon is up in the sky.\n\r\n\r",ch);
			break;
			case MOON_LAST_QUART:
				send_to_char("The gibbus moon is up in the sky.\n\r\n\r",ch);
			break;
			case MOON_HALF:
				send_to_char("The half moon is up in the sky.\n\r\n\r",ch);
			break;
			
		}
	}
	else
		send_to_char("\n\r",ch);
		
	sprintf( buf,
		"{Y  Lurking Fear II started up at %s\r             The system time is %s{x\r",
		str_boot_time,(char *) ctime( &current_time ));
   	send_to_char( buf, ch );

	
	hour_up = (( (int)current_time - (int)boot_time ) / ( 60 * 60 )); 
	min_up =  ((int)current_time - (int)boot_time ) / 60; 
	
	if (min_up > 60)
		min_up %= 60;
		 
	sprintf(buf,"\n\r{Y  Lurking Fear II has been up : %d Hours, %d mins{x\n\r",hour_up, min_up);
	send_to_char(buf,ch);
	sprintf(buf,"{Y  Lurking Fear Build Number: {W({C%d{W){x\n\r",mudsetting->build);
	send_to_char(buf,ch);
	return;
}



void do_weather( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	
	static char * const sky_look[4] =
	{
		"cloudless and sunny",
		"cloudy",
		"rainy",
		"lit by flashes of lightning"
	};
	
	if (ch->in_room->sector_type == SECT_INSIDE )
	{
		send_to_char( "You can't see the weather indoors.\n\r", ch );
		return;
	}

	sprintf( buf, "You are standing in a %s\n\r", flag_string( sector_flags, ch->in_room->sector_type ) );
	send_to_char( buf, ch );
	
	sprintf( buf, "The sky is %s and %s.\n\r",
		sky_look[weather_info[ch->in_room->sector_type].sky],
		weather_info[ch->in_room->sector_type].change >= 0
		? "a warm southerly breeze blows"
		: "a cold northern gust blows"
		);
	send_to_char( buf, ch );
	return;
}



void do_help( CHAR_DATA *ch, char *argument )
{
	char argall[MAX_INPUT_LENGTH];
	char argone[MAX_INPUT_LENGTH];
	char nohelp[MAX_STRING_LENGTH];
	HELP_DATA *pHelp;
	
	
	str_cpy(nohelp, argument);
	if ( argument[0] == '\0' )
		argument = "summary";
	
    /*
     * Tricky argument handling so 'help a b' doesn't match a.
     */
	argall[0] = '\0';
	while ( argument[0] != '\0' )
	{
		argument = one_argument( argument, argone );
		if ( argall[0] != '\0' )
			strcat( argall, " " );
		strcat( argall, argone );
	}
	
	for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next )
	{
		if ( pHelp->level > get_trust( ch ) )
			continue;
		
		if ( is_name( argall, pHelp->keyword ) )
		{
			if ( pHelp->level >= 0 && str_cmp( argall, "imotd" ) )
			{
				send_to_char( pHelp->keyword, ch );
				send_to_char( "\n\r", ch );
			}
			
	    /*
	     * Strip leading '.' to allow initial blanks.
	     */
			if ( pHelp->text[0] == '.' )
				send_to_char( pHelp->text+1, ch );
			else
				send_to_char( pHelp->text  , ch );
			return;
		}
	}
	
	send_to_char( "{CNo help on that word.{x\n\r", ch );
	append_file( ch, HELP_FILE, nohelp ); 
	return;
}

typedef struct who_list WHO_LIST;
struct who_list{ 
	CHAR_DATA *ch;
	int nMatch;
	int iLevelLower;
	int iLevelUpper;
	bool fClassRestrict;
	bool fImmortalOnly;
	
}; 

void process_do_who_dlist(DESCRIPTOR_DATA *d, WHO_LIST *who_list)
{
	CHAR_DATA *wch;
	char name[MAX_STRING_LENGTH];
	GString *buf;
	int iLevelLower;
	int iLevelUpper;
	bool fClassRestrict;
	bool fImmortalOnly;
	
	fClassRestrict = who_list->fClassRestrict;
	fImmortalOnly = who_list->fImmortalOnly;
	iLevelLower = who_list->iLevelLower;
	iLevelUpper = who_list->iLevelUpper;
	
		
	/*
	 * Check for match against restrictions.
	 * Don't use trust as that exposes trusted mortals.
	 */
		if ( d->connected != CON_PLAYING  )
			return;
		
		who_list->nMatch++;
		
		if ( IS_NPC(d->character) )
			return;

		if ( IS_EXTRA(d->character,EXTRA_OSWITCH))
			return;

		if ( IS_EXTRA(d->character,EXTRA_SWITCH))
			return;

		if ( !IS_IMMORTAL(who_list->ch) && IS_IMMORTAL(d->character) && IS_AFFECTED(d->character, AFF_POLYMORPH))
			return;
		
		if (!can_see( who_list->ch, d->character ) && (!IS_SET(who_list->ch->act, PLR_WATCHER)))
			return;
		
		wch   = ( d->original != NULL ) ? d->original : d->character;
		
		
		if ( wch->level < iLevelLower
			||   wch->level > iLevelUpper
			|| ( fImmortalOnly  && wch->level <  LEVEL_IMMORTAL )
			|| ( fClassRestrict && wch->level != LEVEL_HERO ) )
			return;
		
		
		if (!can_see(who_list->ch,wch))
			return;
		
		if (!knows_char(who_list->ch, wch) )
			return;
		
		
		if (IS_IMMORTAL(wch))
			sprintf(name,"{W%s{x",wch->name->str);
		else
			sprintf(name,"{r%s{x",wch->name->str);
		
		buf = g_string_new("");
		
		if (IS_SET(wch->act, PLR_TAG))
		{
			g_string_sprintf( buf, "  {b*{YIT{b* {r%s{x%s{x\n\r",
				PERS(wch,who_list->ch),
				wch->pcdata->title->str);
		}
		else if (IS_SET(wch->act,PLR_ATTACK))
		{
			g_string_sprintf( buf, "  {b*{WATTACK{b* {r%s{x%s{x\n\r",
				PERS(wch,who_list->ch),
				wch->pcdata->title->str);
		}
		else
		{
			g_string_sprintf( buf, "  %s%s{x\n\r",
				name,
				wch->pcdata->title->str);
		}
		send_to_char(buf->str,who_list->ch);
		g_string_free(buf,TRUE);
		return;
}

/*
 * New 'who' command originally by Alander of Rivers of Mud.
 */
void do_who( CHAR_DATA *ch, char *argument )
{
	char buf2[MAX_STRING_LENGTH];
	int iLevelLower;
	int iLevelUpper;
	int nNumber;
	int nMatch;
	bool fClassRestrict;
	bool fImmortalOnly;
	WHO_LIST *who_list;
	
	if (IS_NPC(ch)) 
		return;
	
    /*
     * Set default arguments.
     */
	iLevelLower    = 0;
	iLevelUpper    = MAX_LEVEL;
	fClassRestrict = FALSE;
	fImmortalOnly  = FALSE;
	
    /*
     * Parse arguments.
     */
	nNumber = 0;
	for ( ;; )
	{
		char arg[MAX_STRING_LENGTH];
		
		argument = one_argument( argument, arg );
		if ( arg[0] == '\0' )
			break;
		
		if ( is_number( arg ) )
		{
			send_to_char("Enter 'Avatar' for level 3's, or 'God' for level 4's and 5's.\n\r",ch);
			return;
		}
		else
		{
	    /*
	     * Look for classes to turn on.
	     */
			arg[3]    = '\0';
			if (   !str_cmp( arg, "imm" ) || !str_cmp( arg, "immortal" )
				|| !str_cmp( arg, "ava" ) || !str_cmp( arg, "avatar"   ) )
			{
				fClassRestrict = TRUE;
			}
			else if ( !str_cmp( arg, "god" ) || !str_cmp( arg, "imp" ) )
			{
				fImmortalOnly = TRUE;
			}
			else
			{
				send_to_char("Enter 'Avatar' for level 3's, or 'God' for level 4's and 5's.\n\r",ch);
				return;
			}
		}
	}
	
    /*
     * Now show matching chars.
     */
	nMatch = 0;
	
	who_list = g_new0(WHO_LIST,1);
	who_list->ch = ch;
	who_list->nMatch = nMatch;
	who_list->fImmortalOnly = fImmortalOnly;
	who_list->fClassRestrict = fClassRestrict;
	who_list->iLevelLower = iLevelLower;
	who_list->iLevelUpper = iLevelUpper;

	send_to_char( "{W--------------------------------------------------------------------------------{x\n\r", ch );
	send_to_char( " Last seen...                                (see 'help greet')\n\r\n\r", ch );

	g_slist_foreach(descriptor_list,(GFunc)process_do_who_dlist,who_list);

	nMatch = who_list->nMatch;
	
	if (nMatch == 1)
		sprintf( buf2, "{w   You are the only {Wvisible {wplayer connected on {YLurking Fear II{w!{x\n\r");
	else
		sprintf( buf2, "{w    There are a total of [ {Y%2d {w] {wplayers connected on {YLurking Fear II{w.{x\n\r", nMatch);
	

	send_to_char( "{W--------------------------------------------------------------------------------{x\n\r", ch );
	send_to_char( buf2, ch );
	
	if (nMatch > mudsetting->total_player_count)
		mudsetting->total_player_count = nMatch;
	
	sprintf( buf2, "{w    The max amount of players lurf seen this boot was: [ {Y%2d {w]{x\n\r", mudsetting->total_player_count);
	send_to_char( buf2, ch );
	
	if ( ch->level >= 3 )
		send_to_char( "{w    Type AVATAR to show info about the avatars connected to {YLurking Fear II{x.\n\r", ch);
	send_to_char( "{W--------------------------------------------------------------------------------{x\n\r", ch );
	
	g_free(who_list);

	
	return;
}



void do_inventory( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_INPUT_LENGTH];
	OBJ_DATA *obj;
	OBJ_DATA *portal;
	OBJ_DATA *portal_next;
	ROOM_INDEX_DATA *pRoomIndex;
	ROOM_INDEX_DATA *location;
	bool found;
	
	if (!IS_NPC(ch) && IS_HEAD(ch,LOST_HEAD))
	{send_to_char( "You are not a container.\n\r", ch ); return;}
	else if (!IS_NPC(ch) && IS_EXTRA(ch,EXTRA_OSWITCH))
	{
		if ( !IS_NPC(ch) && (obj = ch->pcdata->chobj) == NULL)
		{send_to_char( "You are not a container.\n\r", ch ); return;}
		switch ( obj->item_type )
		{
			default:
				send_to_char( "You are not a container.\n\r", ch );
				break;
				
			case ITEM_PORTAL:
				pRoomIndex = get_room_index(obj->value[0]);
				location = ch->in_room;
				if ( pRoomIndex == NULL )
				{
					send_to_char( "You don't seem to lead anywhere.\n\r", ch );
					return;
				}
				char_from_room(ch);
				char_to_room(ch,pRoomIndex);
				
				found = FALSE;
				for ( portal = ch->in_room->contents; portal != NULL; portal = portal_next )
				{
					portal_next = portal->next_content;
					if ( ( obj->value[0] == portal->value[3]  )
						&& (obj->value[3] == portal->value[0]) )
					{
						found = TRUE;
						do_look(ch,"auto");
						break;
					}
				}
				char_from_room(ch);
				char_to_room(ch,location);
				break;
				
			case ITEM_DRINK_CON:
				if ( obj->value[1] <= 0 )
				{
					send_to_char( "You are empty.\n\r", ch );
					break;
				}
				if (obj->value[1] < obj->value[0] / 5)
					sprintf( buf, "There is a little %s liquid left in you.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0] / 4)
					sprintf( buf, "You contain a small amount of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0] / 3)
					sprintf( buf, "You're about a third full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0] / 2)
					sprintf( buf, "You're about half full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] < obj->value[0])
					sprintf( buf, "You are almost full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else if (obj->value[1] == obj->value[0])
					sprintf( buf, "You're completely full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				else
					sprintf( buf, "Somehow you are MORE than full of %s liquid.\n\r",liq_table[obj->value[2]].liq_color);
				send_to_char( buf, ch );
				break;
				
			case ITEM_CONTAINER:
			case ITEM_CORPSE_NPC:
			case ITEM_CORPSE_PC:
				act( "$p contain:", ch, obj, NULL, TO_CHAR );
				show_list_to_char( obj->contains, ch, TRUE, TRUE );
				break;
		}
		return;
	}
	send_to_char( "You are carrying:\n\r", ch );
	show_list_to_char( ch->carrying, ch, TRUE, TRUE );
	return;
}



void do_equipment( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA *obj;
	int iWear;
	char *formtobj;
	bool found;
	
	send_to_char( "You are using:\n\r", ch );
	found = FALSE;
	for ( iWear = 0; iWear < MAX_WEAR; iWear++ )
	{
	// This skips the gay off hand to patch wear location # -dc
		if (iWear == 11) iWear++;
		
		if (iWear == WEAR_HIDDEN)
			continue;

		if (!IS_SET(ch->extra,EXTRA_HAGS) && iWear == WEAR_HAGS)
			continue;

		if ( ( obj = get_eq_char( ch, iWear ) ) == NULL )
		{
			send_to_char( where_name[iWear], ch );
			send_to_char( "{W  nothing.  {x\n\r", ch );
			continue;
		}
		
		send_to_char( where_name[iWear], ch );
		if ( can_see_obj( ch, obj ) )
		{
			formtobj = format_obj_to_char( obj, ch, TRUE ); 
			send_to_char( formtobj, ch );
			send_to_char( "\n\r", ch );
			g_free(formtobj);
		}
		else
		{
			send_to_char( "{c  something.  {x\n\r", ch );
		}
		found = TRUE;
	}
	
	return;
}



void do_compare( CHAR_DATA *ch, char *argument )
{
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	OBJ_DATA *obj1;
	OBJ_DATA *obj2;
	int value1;
	int value2;
	char *msg;
	
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	if ( arg1[0] == '\0' )
	{
		send_to_char( "Compare what to what?\n\r", ch );
		return;
	}
	
	if ( ( obj1 = get_obj_carry( ch, arg1 ) ) == NULL )
	{
		send_to_char( "You do not have that item.\n\r", ch );
		return;
	}
	
	if ( arg2[0] == '\0' )
	{
		for ( obj2 = ch->carrying; obj2 != NULL; obj2 = obj2->next_content )
		{
			if ( obj2->wear_loc != WEAR_NONE
				&&   can_see_obj( ch, obj2 )
				&&   obj1->item_type == obj2->item_type
				&& ( obj1->wear_flags & obj2->wear_flags & ~ITEM_TAKE) != 0 )
				break;
		}
		
		if ( obj2 == NULL )
		{
			send_to_char( "You aren't wearing anything comparable.\n\r", ch );
			return;
		}
	}
	else
	{
		if ( ( obj2 = get_obj_carry( ch, arg2 ) ) == NULL )
		{
			send_to_char( "You do not have that item.\n\r", ch );
			return;
		}
	}
	
	msg		= NULL;
	value1	= 0;
	value2	= 0;
	
	if ( obj1 == obj2 )
	{
		msg = "You compare $p to itself.  It looks about the same.";
	}
	else if ( obj1->item_type != obj2->item_type )
	{
		msg = "You can't compare $p and $P.";
	}
	else
	{
		switch ( obj1->item_type )
		{
			default:
				msg = "You can't compare $p and $P.";
				break;
				
			case ITEM_ARMOR:
				value1 = obj1->value[0];
				value2 = obj2->value[0];
				break;
				
			case ITEM_WEAPON:
				value1 = obj1->value[1] + obj1->value[2];
				value2 = obj2->value[1] + obj2->value[2];
				break;
		}
	}
	
	if ( msg == NULL )
	{
		if      ( value1 == value2 ) msg = "$p and $P look about the same.";
		else if ( value1  > value2 ) msg = "$p looks better than $P.";
		else                         msg = "$p looks worse than $P.";
	}
	
	act( msg, ch, obj1, obj2, TO_CHAR );
	return;
}



void do_credits( CHAR_DATA *ch, char *argument )
{
	do_help( ch, "diku" );
	return;
}

void do_wizlist( CHAR_DATA *ch, char *argument )
{
	do_help( ch, "wizlist" );
	return;
}



void do_where( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *victim;
	DESCRIPTOR_DATA *d;
	bool found;
	GSList *desc_list = descriptor_list;
	
	one_argument( argument, arg );
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Players near you:\n\r", ch );
		found = FALSE;
		while ( desc_list != NULL )
		{
			d = (DESCRIPTOR_DATA*)desc_list->data;
			if ( d->connected == CON_PLAYING
				&& ( victim = d->character ) != NULL
				&&   !IS_NPC(victim)
				&&   victim->in_room != NULL
				&&   victim->in_room->area == ch->in_room->area
				&&   (!IS_CLASS(victim, CLASS_MAGE)
					|| (IS_CLASS(victim, CLASS_MAGE) && has_sphere(victim,SPHERE_CORRESPONDENCE) < 3))
				&&   (!IS_CLASS(victim, CLASS_VAMPIRE)
					|| (IS_CLASS(victim, CLASS_VAMPIRE) && get_disc(victim,DISC_OBFUSCATE) < 4))
				&&   (!IS_CLASS(victim, CLASS_WEREWOLF)
					|| ( IS_CLASS(victim, CLASS_WEREWOLF) && victim->pcdata->powers[WPOWER_OWL] < 2)) 
				&&   victim->pcdata->chobj == NULL
				&&   can_see( ch, victim ) )
			{
				found = TRUE;
				sprintf( buf, "%-28s %s\n\r",
					victim->name->str, victim->in_room->name );
				send_to_char( buf, ch );
			}
			desc_list = g_slist_next(desc_list);
		}
		g_slist_free(desc_list);
		if ( !found )
			send_to_char( "None\n\r", ch );
	}
	else
	{
		found = FALSE;
		for ( victim = char_list; victim != NULL; victim = victim->next )
		{
			if ( victim->in_room != NULL
				&&   victim->in_room->area == ch->in_room->area
				&&   !IS_AFFECTED(victim, AFF_HIDE)
				&&   !IS_AFFECTED(victim, AFF_SNEAK)
				&&   can_see( ch, victim )
				&&   is_name( arg, victim->name->str ) )
			{
				found = TRUE;
				sprintf( buf, "%-28s %s\n\r",
					PERS(victim, ch), victim->in_room->name );
				send_to_char( buf, ch );
				break;
			}
		}
		if ( !found )
			act( "You didn't find any $T.", ch, NULL, arg, TO_CHAR );
	}
	
	return;
}




void do_consider( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *victim;
	char *msg;
	int diff;
	int overall;
	int con_hit;
	int con_dam;
	int con_ac;
	int con_hp;
	
	one_argument( argument, arg );
	overall = 0;
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "Consider killing whom?\n\r", ch );
		return;
	}
	
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char( "They're not here.\n\r", ch );
		return;
	}
	
	act( "You examine $N closely, looking for $S weaknesses.", ch, NULL, victim, TO_CHAR );
	act( "$n examine $N closely, looking for $S weaknesses.", ch, NULL, victim, TO_NOTVICT );
	act( "$n examines you closely, looking for your weaknesses.", ch, NULL, victim, TO_VICT );
	
//    if (!IS_NPC(victim)) do_skillz(ch,victim->name);
	
	if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_VAMPIRE) && 
		IS_EXTRA(victim, EXTRA_FAKE_CON))
	{
		con_hit = victim->pcdata->fake_hit;
		con_dam = victim->pcdata->fake_dam;
		con_ac = victim->pcdata->fake_ac;
		con_hp = victim->pcdata->fake_hp;
	}
	else
	{
		con_hit = char_hitroll(victim);
		con_dam = char_damroll(victim);
		con_ac = char_ac(victim);
		con_hp = victim->hit;
	}
	if (con_hp < 1) con_hp = 1;
	
	diff = victim->level - ch->level + con_hit - char_hitroll(ch);
	if ( diff <= -70 ) {msg = "You are FAR more skilled than $M."; overall = overall + 3;}
	else if ( diff <= -30 ) {msg = "$E is not as skilled as you are."; overall = overall + 2;}
	else if ( diff <= -10 ) {msg = "$E doesn't seem quite as skilled as you."; overall = overall + 1;}
	else if ( diff <=  20 ) {msg = "You are about as skilled as $M.";}
	else if ( diff <=  30 ) {msg = "$E is slightly more skilled than you are."; overall = overall - 1;}
	else if ( diff <=  70 ) {msg = "$E seems more skilled than you are."; overall = overall -2;}
	else                    {msg = "$E is FAR more skilled than you."; overall = overall - 3;}
	act( msg, ch, NULL, victim, TO_CHAR );
	
	diff = victim->level - ch->level + con_dam - char_damroll(ch);
	if ( diff <= -70 ) {msg = "You are FAR more powerful than $M."; overall = overall + 3;}
	else if ( diff <= -30 ) {msg = "$E is not as powerful as you are."; overall = overall + 2;}
	else if ( diff <= -10 ) {msg = "$E doesn't seem quite as powerful as you."; overall = overall + 1;}
	else if ( diff <=  10 ) {msg = "You are about as powerful as $M.";}
	else if ( diff <=  30 ) {msg = "$E is slightly more powerful than you are."; overall = overall - 1;}
	else if ( diff <=  70 ) {msg = "$E seems more powerful than you are."; overall = overall -2;}
	else                    {msg = "$E is FAR more powerful than you."; overall = overall - 3;}
	act( msg, ch, NULL, victim, TO_CHAR );
	
	diff = ch->hit * 100 / con_hp;
	if ( diff <=  20 ) {msg = "$E is currently FAR healthier than you are."; overall = overall - 3;}
	else if ( diff <= 100 ) {msg = "$E is currently much healthier than you are."; overall = overall - 2;}
	else if ( diff <= 150 ) {msg = "$E is currently slightly healthier than you are."; overall = overall - 1;}
	else if ( diff <= 250 ) {msg = "$E is currently about as healthy as you are.";}
	else if ( diff <= 400 ) {msg = "You are currently slightly healthier than $M."; overall = overall + 1;}
	else if ( diff <= 1000) {msg = "You are currently much healthier than $M."; overall = overall + 2;}
	else                    {msg = "You are currently FAR healthier than $M."; overall = overall + 3;}
	act( msg, ch, NULL, victim, TO_CHAR );
	
	diff = con_ac - char_ac(ch);
	if ( diff <= -200) {msg = "$E is FAR better armoured than you."; overall = overall - 3;}
	else if ( diff <= -100) {msg = "$E looks much better armoured than you."; overall = overall - 2;}
	else if ( diff <= -50 ) {msg = "$E looks better armoured than you."; overall = overall - 1;}
	else if ( diff <=  50 ) {msg = "$E seems about as well armoured as you.";}
	else if ( diff <=  100) {msg = "You are better armoured than $M."; overall = overall + 1;}
	else if ( diff <=  200) {msg = "You are much better armoured than $M."; overall = overall + 2;}
	else                    {msg = "You are FAR better armoured than $M."; overall = overall + 3;}
	act( msg, ch, NULL, victim, TO_CHAR );
	
	diff = overall;
	if ( diff <= -22 ) msg = "Conclusion: $E would kill you in seconds.";
	else if ( diff <=  -14) msg = "Conclusion: You would need a lot of luck to beat $M.";
	else if ( diff <=  -6 ) msg = "Conclusion: You would need some luck to beat $N.";
	else if ( diff <=   4 ) msg = "Conclusion: It would be a very close fight.";
	else if ( diff <=   12) msg = "Conclusion: You shouldn't have a lot of trouble defeating $M.";
	else if ( diff <=  20 ) msg = "Conclusion: $N is no match for you.  You can easily beat $M.";
	else                    msg = "Conclusion: $E wouldn't last more than a few seconds against you.";
	act( msg, ch, NULL, victim, TO_CHAR );
	
	return;
}



void set_title( CHAR_DATA *ch, char *title )
{
	char buf[MAX_STRING_LENGTH];
	
	if ( IS_NPC(ch) )
	{
		bug( "Set_title: NPC.", 0 );
		return;
	}
	
	if ( isalpha(title[0]) || isdigit(title[0]) )
	{
		buf[0] = ' ';
		str_cpy( buf+1, title );
	}
	else
	{
		str_cpy( buf, title );
	}
	
	ch->pcdata->title = g_string_assign(ch->pcdata->title,buf);
	return;
}


void do_title( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) )
		return;
	
	if ( argument[0] == '\0' )
	{
		send_to_char( "Change your title to what?\n\r", ch );
		return;
	}
	
	if ( strlen(argument) > 50 )
		argument[50] = '\0';
	
	smash_tilde( argument );
	set_title( ch, argument );
	send_to_char( "Ok.\n\r", ch );
}


void do_email( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) )
		return;
	
	if ( argument[0] == '\0' )
	{
		send_to_char( "What do you wish to set your email address to?\n\r", ch );
		send_to_char( "Syntax: email addy@email.com  (optional) ICQ: 123456 \n\r", ch );
		return;
	}
	
	if ( strlen(argument) > 50 )
		argument[50] = '\0';
	
	smash_tilde( argument );
	ch->pcdata->email = g_string_assign(ch->pcdata->email,argument);
	send_to_char( "Ok.\n\r", ch );
}



void do_description( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	
	if ( argument[0] != '\0' )
	{
		buf[0] = '\0';
		smash_tilde( argument );
		if ( argument[0] == '+' )
		{
			if ( ch->description != NULL )
				strcat( buf, ch->description->str );
			argument++;
			while ( isspace(*argument) )
				argument++;
		}
		
		if ( strlen(buf) + strlen(argument) >= MAX_STRING_LENGTH - 2 )
		{
			send_to_char( "Description too long.\n\r", ch );
			return;
		}
		
		strcat( buf, argument );
		strcat( buf, "\n\r" );
		ch->description = g_string_assign(ch->description,buf);
	}
	
	send_to_char( "Your description is:\n\r", ch );
	send_to_char( ch->description ? ch->description->str : "(None).\n\r", ch );
	return;
}



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

	GString *buf = g_string_new("");
	GString *hit_str = g_string_new("");
	GString *mana_str = g_string_new("");
	GString *move_str = g_string_new("");
	GString *mhit_str = g_string_new("");
	GString *mmana_str = g_string_new("");
	GString *mmove_str = g_string_new("");
	GString *exp_str = g_string_new("");

	g_string_sprintf(hit_str, "%d", ch->hit);
	COL_SCALE(hit_str, ch, ch->hit, ch->max_hit);
	g_string_sprintf(mana_str, "%d", ch->mana);
	COL_SCALE(mana_str, ch, ch->mana, ch->max_mana);
	g_string_sprintf(move_str, "%d", ch->move);
	COL_SCALE(move_str, ch, ch->move, ch->max_move);
	g_string_sprintf(exp_str, "%d", ch->exp);
	COL_SCALE(exp_str, ch, ch->exp, 1000);
	g_string_sprintf(mhit_str, "%d", ch->max_hit);
	ADD_COLOUR(ch, mhit_str, L_CYAN);
	g_string_sprintf(mmana_str, "%d", ch->max_mana);
	ADD_COLOUR(ch, mmana_str, L_CYAN);
	g_string_sprintf(mmove_str, "%d", ch->max_move);
	ADD_COLOUR(ch, mmove_str, L_CYAN);
	g_string_sprintf( buf,
		"You report: %s/%s hp %s/%s mana %s/%s mv %s xp.\n\r",
		hit_str->str,  mhit_str->str,
		mana_str->str, mmana_str->str,
		move_str->str, mmove_str->str,
		exp_str->str   );
	
	send_to_char( buf->str, ch );
	
	for ( vch = char_list; vch != NULL; vch = vch_next )
	{
		vch_next	= vch->next;
		if ( vch == NULL ) continue;
		if ( vch == ch ) continue;
		if ( vch->in_room == NULL ) continue;
		if ( vch->in_room != ch->in_room ) continue;
		g_string_sprintf(hit_str, "%d", ch->hit);
		COL_SCALE(hit_str, vch, ch->hit, ch->max_hit);
		g_string_sprintf(mana_str, "%d", ch->mana);
		COL_SCALE(mana_str, vch, ch->mana, ch->max_mana);
		g_string_sprintf(move_str, "%d", ch->move);
		COL_SCALE(move_str, vch, ch->move, ch->max_move);
		g_string_sprintf(exp_str, "%d", ch->exp);
		COL_SCALE(exp_str, vch, ch->exp, 1000);
		g_string_sprintf(mhit_str, "%d", ch->max_hit);
		ADD_COLOUR(vch, mhit_str, L_CYAN);
		g_string_sprintf(mmana_str, "%d", ch->max_mana);
		ADD_COLOUR(vch, mmana_str, L_CYAN);
		g_string_sprintf(mmove_str, "%d", ch->max_move);
		ADD_COLOUR(vch, mmove_str, L_CYAN);
		if (!IS_NPC(ch) && IS_AFFECTED(ch,AFF_POLYMORPH))
			g_string_sprintf( buf, "%s reports: %s/%s hp %s/%s mana %s/%s mv %s xp.\n\r",
				ch->morph->str,
				hit_str->str,  mhit_str->str,
				mana_str->str, mmana_str->str,
				move_str->str, mmove_str->str,
				exp_str->str   );
		else
			g_string_sprintf( buf, "%s reports: %s/%s hp %s/%s mana %s/%s mv %s xp.\n\r",
				IS_NPC(ch) ? capitalize(ch->short_descr->str) : ch->name->str,
				hit_str->str,  mhit_str->str,
				mana_str->str, mmana_str->str,
				move_str->str, mmove_str->str,
				exp_str->str   );
		buf->str[0] = UPPER(buf->str[0]);
		send_to_char( buf->str, vch );
	}
	g_string_free(buf,TRUE);	
	g_string_free(hit_str,TRUE);	
	g_string_free(mana_str,TRUE);	
	g_string_free(move_str,TRUE);	
	g_string_free(mhit_str,TRUE);	
	g_string_free(mmana_str,TRUE);	
	g_string_free(mmove_str,TRUE);	
	g_string_free(exp_str,TRUE);	

	return;
}



void do_practice( CHAR_DATA *ch, char *argument )
{
	GString *buf;
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	int sn;
	
	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	
	if ( IS_NPC(ch) )
		return;
	
	buf = g_string_new("");

	if ( arg1[0] == '\0' )
	{
		int col;
		
		col    = 0;
		for ( sn = 0; sn < MAX_SKILL; sn++ )
		{
			if ( skill_table[sn].name == NULL )
				break;
			if ( ch->level < skill_table[sn].skill_level )
				continue;
			g_string_sprintf( buf, "%18s {W%3d%%{x  ",
				skill_table[sn].name, ch->pcdata->learned[sn] );
			if ( skill_table[sn].spell_fun != spell_null )
				ADD_COLOUR(ch,buf,spell_colour_table[skill_table[sn].target].colour);
			send_to_char( buf->str, ch );
			if ( ++col % 3 == 0 )
				send_to_char( "\n\r", ch );
		}
		
		if ( col % 3 != 0 )
			send_to_char( "\n\r", ch );
		
		g_string_sprintf( buf, "\n\rYou have {y%d{x exp left.\n\r", ch->exp );
		send_to_char( buf->str, ch );
	}
	else
	{
		
		if ( !IS_AWAKE(ch) )
		{
			send_to_char( "In your dreams, or what?\n\r", ch );
			return;
		}
		
		if ( ch->exp <= 0 )
		{
			send_to_char( "You have {yno{x exp left.\n\r", ch );
			return;
		}
		
		if ( ( sn = skill_lookup( arg1 ) ) < 0
			|| ( !IS_NPC(ch)
				&&   ch->level < skill_table[sn].skill_level ) )
		{
			send_to_char( "You can't practice that.\n\r", ch );
			return;
		}
		
		sn = skill_lookup( arg1 );
		
		if ( ch->pcdata->learned[sn] >= SKILL_ADEPT )
		{
			g_string_sprintf( buf, "You are already an adept of {W%s{x.\n\r",
				skill_table[sn].name );
			send_to_char( buf->str, ch );
			return;
		}
		else if ( ch->pcdata->learned[sn] > 0 &&
			(ch->pcdata->learned[sn]/2) > ch->exp )
		{
			g_string_sprintf( buf, "You need {y%d{x exp to increase {W%s{x any more.\n\r",
				(ch->pcdata->learned[sn]/2),skill_table[sn].name );
			send_to_char( buf->str, ch );
			return;
		}
		else if ( ch->pcdata->learned[sn] == 0 && ch->exp < 500 )
		{
			g_string_sprintf( buf, "You need {y500{x exp to increase {W%s{x.\n\r",
				skill_table[sn].name );
			send_to_char( buf->str, ch );
			return;
		}
		else
		{
			if (ch->pcdata->learned[sn] == 0)
			{
				ch->exp -= 500;
				ch->pcdata->learned[sn] += get_curr_int(ch);
			}
			else
			{
				ch->exp -= (ch->pcdata->learned[sn]/2);
				ch->pcdata->learned[sn] += int_app[get_curr_int(ch)].learn;
			}
			if ( ch->pcdata->learned[sn] < SKILL_ADEPT )
			{
				if( strcmp( arg2, "all" ) )
					act( "You practice {W$T{x.  Type 'prac '$T' all' for 100%.",
						ch, NULL, skill_table[sn].name, TO_CHAR );
			}
			else
			{
				ch->pcdata->learned[sn] = SKILL_ADEPT;
				if( strcmp( arg2, "all" ) )
					act( "You are now an adept of {W$T{x.",
						ch, NULL, skill_table[sn].name, TO_CHAR );
			}
		}
	}
	if( !strcmp( arg2, "all" ) )
	{
		for ( ; ; )
		{
			if ( arg1[0] == '\0')
				return;
			sn = skill_lookup( arg1 );
			if ( ch->pcdata->learned[sn] >= SKILL_ADEPT ) 
			{
				act( "You are an adept of {W$T{x.",
					ch, NULL, skill_table[sn].name, TO_CHAR );
				arg2[0] = '\0';
				return;
			}
			else
			{
				g_string_sprintf(buf,"'%s' %s",arg1,arg2);
				do_practice(ch,buf->str);
			}
			return;
		}
	}
	g_string_free(buf,TRUE);
	return;
}



/*
 * 'Wimpy' originally by Dionysos.
 */
void do_wimpy( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_INPUT_LENGTH];
	int wimpy;
	
	one_argument( argument, arg );
	
	if ( arg[0] == '\0' )
		wimpy = ch->max_hit / 5;
	else
		wimpy = atoi( arg );
	
	if ( wimpy < 0 )
	{
		send_to_char( "Your courage exceeds your wisdom.\n\r", ch );
		return;
	}
	
	if ( wimpy > ch->max_hit )
	{
		send_to_char( "Such cowardice ill becomes you.\n\r", ch );
		return;
	}
	
	ch->wimpy	= wimpy;
	sprintf( buf, "Wimpy set to {R%d{x hit points.\n\r", wimpy );
	send_to_char( buf, ch );
	return;
}



void do_password( CHAR_DATA *ch, char *argument )
{
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char *pArg;
	char *pwdnew;
	char *p;
	char cEnd;
	
	if ( IS_NPC(ch) )
		return;
	
    /*
     * Can't use one_argument here because it smashes case.
     * So we just steal all its code.  Bleagh.
     */
	pArg = arg1;
	while ( isspace(*argument) )
		argument++;
	
	cEnd = ' ';
	if ( *argument == '\'' || *argument == '"' )
		cEnd = *argument++;
	
	while ( *argument != '\0' )
	{
		if ( *argument == cEnd )
		{
			argument++;
			break;
		}
		*pArg++ = *argument++;
	}
	*pArg = '\0';
	
	pArg = arg2;
	while ( isspace(*argument) )
		argument++;
	
	cEnd = ' ';
	if ( *argument == '\'' || *argument == '"' )
		cEnd = *argument++;
	
	while ( *argument != '\0' )
	{
		if ( *argument == cEnd )
		{
			argument++;
			break;
		}
		*pArg++ = *argument++;
	}
	*pArg = '\0';
	
	if ( arg1[0] == '\0' || arg2[0] == '\0' )
	{
		send_to_char( "Syntax: password <old> <new>.\n\r", ch );
		return;
	}
#if defined(unix)
	if ( strcmp( arg1, ch->pcdata->pwd->str ) &&
		( ch->pcdata->pwd->len > 0 && 
		(strcmp( crypt( arg1, ch->pcdata->pwd->str ), ch->pcdata->pwd->str ))) )
	{
		WAIT_STATE( ch, 40 );
		send_to_char( "Wrong password.  Wait 10 seconds.\n\r", ch );
		return;
	} 
#endif
	if ( strlen(arg2) < 5 )
	{
		send_to_char(
			"New password must be at least five characters long.\n\r", ch );
		return;
	}
	
    /*
     * No tilde allowed because of player file format.
     */
#if defined(unix)
	pwdnew = crypt( arg2, ch->name->str );
#else
	pwdnew = arg2;
#endif
	for ( p = pwdnew; *p != '\0'; p++ )
	{
		if ( *p == '~' )
		{
			send_to_char(
				"New password not acceptable, try again.\n\r", ch );
			return;
		}
	}
	
	ch->pcdata->pwd = g_string_assign(ch->pcdata->pwd,pwdnew);
	if (!IS_EXTRA(ch,EXTRA_NEWPASS)) SET_BIT(ch->extra,EXTRA_NEWPASS);
	save_char_obj( ch );
	if (ch->desc != NULL && ch->desc->connected == CON_PLAYING )
		send_to_char( "Ok.\n\r", ch );
	return;
}



void do_socials( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	int iSocial;
	int col;
	
	col = 0;
	
	for ( iSocial = 0; social_table[iSocial].name[0] != '\0'; iSocial++ )
	{
		sprintf( buf, "%-12s", social_table[iSocial].name );
		send_to_char( buf, ch );
		if ( ++col % 6 == 0 )
			send_to_char( "\n\r", ch );
	}
	
	if ( col % 6 != 0 )
		send_to_char( "\n\r", ch );
	
	return;
}



void do_xsocials( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	int iSocial;
	int col;
	
	col = 0;
	
	for ( iSocial = 0; xsocial_table[iSocial].name != NULL; iSocial++ )
	{
		sprintf( buf, "%-12s", xsocial_table[iSocial].name );
		send_to_char( buf, ch );
		if ( ++col % 6 == 0 )
			send_to_char( "\n\r", ch );
	}
	
	if ( col % 6 != 0 )
		send_to_char( "\n\r", ch );
	
	return;
}



void do_spells( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	int sn;
	int col;
	
	col = 0;
	for ( sn = 0; sn < MAX_SKILL && skill_table[sn].name != NULL; sn++ )
	{
		sprintf( buf, "%-12s", skill_table[sn].name );
		send_to_char( buf, ch );
		if ( ++col % 6 == 0 )
			send_to_char( "\n\r", ch );
	}
	
	if ( col % 6 != 0 )
		send_to_char( "\n\r", ch );
	return;
}



/*
 * Contributed by Alander.
 */
void do_commands( CHAR_DATA *ch, char *argument )
{
	char buf[MAX_STRING_LENGTH];
	int cmd;
	int col;
	
	col = 0;
	for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
	{
		if ( cmd_table[cmd].level == 0
			&&   cmd_table[cmd].level <= get_trust( ch ) )
		{
			sprintf( buf, "%-12s", cmd_table[cmd].name );
			send_to_char( buf, ch );
			if ( ++col % 6 == 0 )
				send_to_char( "\n\r", ch );
		}
	}
	
	if ( col % 6 != 0 )
		send_to_char( "\n\r", ch );
	return;
}



void do_channels( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	
	one_argument( argument, arg );
	
	if (IS_NPC(ch)) return;
	if ( arg[0] == '\0' )
	{
		if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_SILENCE) )
		{
			send_to_char( "You are silenced.\n\r", ch );
			return;
		}
		
		send_to_char( "Channels:\n\r", ch );
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_CGOSSIP)
			? " +CGOSSIP\n\r"
			: " -cgossip\n\r",
			ch );
		
		if (ch->level >= LEVEL_HIGHJUDGE)
		{
			send_to_char( IS_SET(ch->pcdata->comm, COMM_LOG_TELLS)
				? " +LogTells\n\r"
				: " -LogTells\n\r",
				ch );
		}

		send_to_char( !IS_SET(ch->deaf, CHANNEL_OOC)
			? " +OOC\n\r"
			: " -OOC\n\r",
			ch );
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_CHAT)
			? " +CHAT\n\r"
			: " -chat\n\r",
			ch );
#if 0
		send_to_char( !IS_SET(ch->deaf, CHANNEL_HACKER)
			? " +HACKER\n\r"
			: " -hacker\n\r",
			ch );
#endif
		
		if ( IS_IMMORTAL(ch) )
		{
			send_to_char( !IS_SET(ch->deaf, CHANNEL_IMMTALK)
				? " +IMMTALK\n\r"
				: " -immtalk\n\r",
				ch );
		}
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_MUSIC)
			? " +MUSIC\n\r"
			: " -music\n\r",
			ch );
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_QUESTION)
			? " +QUESTION\n\r"
			: " -question\n\r",
			ch );
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_SHOUT)
			? " +SHOUT\n\r"
			: " -shout\n\r",
			ch );
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_HOWL)
			? " +HOWL\n\r"
			: " -howl\n\r",
			ch );
		
		if (IS_IMMORTAL(ch))
		{
			send_to_char( !IS_SET(ch->deaf, CHANNEL_LOG)
				? " +LOG\n\r"
				: " -log\n\r",
				ch );
		}
		
		if (IS_CLASS( ch, CLASS_MAGE) || IS_IMMORTAL(ch))
		{
			send_to_char( !IS_SET(ch->deaf, CHANNEL_MAGETALK)
				? " +MAGE\n\r"
				: " -mage\n\r",
				ch );
		}
		
		if (IS_CLASS(ch, CLASS_DEMON) || IS_IMMORTAL(ch))
		{
			send_to_char( !IS_SET(ch->deaf, CHANNEL_PRAY)
				? " +PRAY\n\r"
				: " -pray\n\r",
				ch );
		}
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_INFO)
			? " +INFO\n\r"
			: " -info\n\r",
			ch );
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_MSP)
			? " -msp\n\r"
			: " +MSP\n\r",
			ch );
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_MXP)
			? " -mxp\n\r"
			: " +MXP\n\r",
			ch );
		
		if (IS_CLASS(ch, CLASS_VAMPIRE) || IS_IMMORTAL(ch))
		{
			send_to_char( !IS_SET(ch->deaf, CHANNEL_VAMPTALK)
				? " +VAMP\n\r"
				: " -vamp\n\r",
				ch );
		}
		
		if (IS_CLASS(ch, CLASS_WEREWOLF) || IS_IMMORTAL(ch))
		{
			send_to_char( !IS_SET(ch->deaf, CHANNEL_TRIBETALK)
				? " +TRIBETALK\n\r"
				: " -tribetalk\n\r",
				ch );
		}
		
		if (IS_CLASS(ch, CLASS_VAMPIRE) || IS_IMMORTAL(ch))
		{
			send_to_char( !IS_SET(ch->deaf, CHANNEL_SECTTALK)
				? " +SECTTALK\n\r"
				: " -secttalk\n\r",
				ch );
		}
		
		send_to_char( !IS_SET(ch->deaf, CHANNEL_TELL)
			? " +TELL\n\r"
			: " -tell\n\r",
			ch );
		
		send_to_char( ".\n\r", ch );
	}
	else
	{
		bool fClear;
		int bit;
		
		if ( arg[0] == '+' ) fClear = TRUE;
		else if ( arg[0] == '-' ) fClear = FALSE;
		else
		{
			send_to_char( "Channels -channel or +channel?\n\r", ch );
			return;
		}
		
		if ( !str_cmp( arg+1, "cgossip" ) ) bit = CHANNEL_CGOSSIP;
		else if ( !str_cmp( arg+1, "chat"     ) ) bit = CHANNEL_CHAT;
#if 0
		else if ( !str_cmp( arg+1, "hacker"   ) ) bit = CHANNEL_HACKER;
#endif
		else if ( !str_cmp( arg+1, "immtalk"  ) ) bit = CHANNEL_IMMTALK;
		else if ( !str_cmp( arg+1, "music"    ) ) bit = CHANNEL_MUSIC;
		else if ( !str_cmp( arg+1, "question" ) ) bit = CHANNEL_QUESTION;
		else if ( !str_cmp( arg+1, "shout"    ) ) bit = CHANNEL_SHOUT;
		else if ( !str_cmp( arg+1, "ooc"      ) ) bit = CHANNEL_OOC;
		else if ( !str_cmp( arg+1, "yell"     ) ) bit = CHANNEL_YELL;
		else if ( !str_cmp( arg+1, "howl"     ) ) bit = CHANNEL_HOWL;
		else if ( !str_cmp( arg+1, "msp"      ) ) 
		{
           /*flip the Bits.. I'm using MSP diffrently -Spiral */
			bit = CHANNEL_MSP;
			if (fClear) 
				fClear=FALSE;
			else
				fClear=TRUE;
		}
		else if ( !str_cmp( arg+1, "mxp"      ) ) 
		{
           /*flip the Bits.. I'm using MXP diffrently -Spiral */
			bit = CHANNEL_MXP;
			if (fClear) 
			{
			 	send_to_char("You turn on MXP YES!\n\r",ch);
				fClear=FALSE;
			}
			else
			{
				send_to_char("You turn off MXP ahh...\n\r",ch);
				fClear=TRUE;
			}
		}
		else if ( !str_cmp( arg+1, "LogTells"      ) ) 
		{
           /*flip the Bits.. I'm using MXP diffrently -Spiral */
			if (fClear) 
			{
			 	send_to_char("You turn on Tell Logging.\n\r",ch);
				fClear=FALSE;
				SET_BIT(ch->pcdata->comm, COMM_LOG_TELLS);
			}
			else
			{
				send_to_char("You turn off tell logging.\n\r",ch);
				REMOVE_BIT(ch->pcdata->comm, COMM_LOG_TELLS);
				fClear=TRUE;
			}
			return;
			
		}
		else if (IS_IMMORTAL(ch) && !str_cmp( arg+1, "log") ) bit = CHANNEL_LOG;
		else if ( !str_cmp( arg+1, "mage"     ) ) bit = CHANNEL_MAGETALK;
		else if ((IS_SET(ch->special, SPC_CHAMPION) || (IS_IMMORTAL(ch))) && !str_cmp( arg+1, "pray") ) 
			bit = CHANNEL_PRAY;
		else if ( !str_cmp( arg+1, "info"     ) ) bit = CHANNEL_INFO;
		else if ( !str_cmp( arg+1, "vamp"     ) ) bit = CHANNEL_VAMPTALK;
		else if ( !str_cmp( arg+1, "secttalk" ) ) bit = CHANNEL_SECTTALK;
		else if ( !str_cmp( arg+1, "tribetalk") ) bit = CHANNEL_TRIBETALK;
		else if ( !str_cmp( arg+1, "tell"     ) ) bit = CHANNEL_TELL;
		else
		{
			send_to_char( "Set or clear which channel?\n\r", ch );
			return;
		}
		
		if ( fClear )
			REMOVE_BIT (ch->deaf, bit);
		else
			SET_BIT    (ch->deaf, bit);
		
		send_to_char( "Ok.\n\r", ch );
	}
	
	return;
}



/*
 * Contributed by Grodyn.
 */
void do_config( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	
	if ( IS_NPC(ch) )
		return;
	
	one_argument( argument, arg );
	
	if ( arg[0] == '\0' )
	{
		send_to_char( "[  Keyword  ] Option\n\r", ch );
		
		send_to_char(  IS_SET(ch->act, PLR_ANSI)
			? "[+ANSI      ] You have {Ra{Yn{Gs{Ci {Mc{Bo{Rl{Yo{Gu{Cr{x on.\n\r"
			: "[-ansi      ] You have ansi colour off.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->pcdata->comm, COMM_AUTOPROTECT)
			? "[+AUTOPROTEC] You are protected from decapatating and Tieing lower players.\n\r"
			: "[-autoprotec] You are not protected from decapatating and Tieing lower players.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_AUTODAMAGE)
			? "[+AUTODAMAGE] You automatically see numeric damage.\n\r"
			: "[-autodamage] You don't automatically see numeric damage.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_AUTOEXIT)
			? "[+AUTOEXIT  ] You automatically see exits.\n\r"
			: "[-autoexit  ] You don't automatically see exits.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_AUTOLOOT)
			? "[+AUTOLOOT  ] You automatically loot corpses.\n\r"
			: "[-autoloot  ] You don't automatically loot corpses.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_AUTOSAC)
			? "[+AUTOSAC   ] You automatically sacrifice corpses.\n\r"
			: "[-autosac   ] You don't automatically sacrifice corpses.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_BLANK)
			? "[+BLANK     ] You have a blank line before your prompt.\n\r"
			: "[-blank     ] You have no blank line before your prompt.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_BRIEF)
			? "[+BRIEF     ] You see brief descriptions.\n\r"
			: "[-brief     ] You see long descriptions.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_COMBINE)
			? "[+COMBINE   ] You see object lists in combined format.\n\r"
			: "[-combine   ] You see object lists in single format.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_PROMPT)
			? "[+PROMPT    ] You have a prompt.\n\r"
			: "[-prompt    ] You don't have a prompt.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_TELNET_GA)
			? "[+TELNETGA  ] You receive a telnet GA sequence.\n\r"
			: "[-telnetga  ] You don't receive a telnet GA sequence.\n\r"
			, ch );
		
		send_to_char(  IS_SET(ch->act, PLR_SILENCE)
			? "[+SILENCE   ] You are silenced.\n\r"
			: ""
			, ch );
		
		send_to_char( !IS_SET(ch->act, PLR_NO_EMOTE)
			? ""
			: "[-emote     ] You can't emote.\n\r"
			, ch );
		
		send_to_char( !IS_SET(ch->act, PLR_NO_TELL)
			? ""
			: "[-tell      ] You can't use 'tell'.\n\r"
			, ch );
	}
	else
	{
		bool fSet;
		int bit;
		
		if ( arg[0] == '+' ) fSet = TRUE;
		else if ( arg[0] == '-' ) fSet = FALSE;
		else
		{
			send_to_char( "Config -option or +option?\n\r", ch );
			return;
		}
		
		if ( !str_cmp( arg+1, "autoprotect"   ) )
		{
			if ( fSet )
				SET_BIT(ch->pcdata->comm, COMM_AUTOPROTECT);
			else
				REMOVE_BIT(ch->pcdata->comm,COMM_AUTOPROTECT);
			
			send_to_char( "Ok.\n\r", ch );
			return;
		}
		 
		
		if ( !str_cmp( arg+1, "ansi"       ) ) bit = PLR_ANSI;
		else if ( !str_cmp( arg+1, "autodamage" ) ) bit = PLR_AUTODAMAGE;
		else if ( !str_cmp( arg+1, "autoexit"   ) ) bit = PLR_AUTOEXIT;
		else if ( !str_cmp( arg+1, "autoloot"   ) ) bit = PLR_AUTOLOOT;
		else if ( !str_cmp( arg+1, "autosac"    ) ) bit = PLR_AUTOSAC;
		else if ( !str_cmp( arg+1, "blank"      ) ) bit = PLR_BLANK;
		else if ( !str_cmp( arg+1, "brief"      ) ) bit = PLR_BRIEF;
		else if ( !str_cmp( arg+1, "combine"    ) ) bit = PLR_COMBINE;
		else if ( !str_cmp( arg+1, "prompt"     ) ) bit = PLR_PROMPT;
		else if ( !str_cmp( arg+1, "telnetga"   ) ) bit = PLR_TELNET_GA;
		else
		{
			send_to_char( "Config which option?\n\r", ch );
			return;
		}
		
		if ( fSet )
			SET_BIT    (ch->act, bit);
		else
			REMOVE_BIT (ch->act, bit);
		
		send_to_char( "Ok.\n\r", ch );
	}
	
	return;
}

void do_ansi( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->act, PLR_ANSI)) do_config(ch,"-ansi");
	else do_config(ch,"+ansi");
	return;
}

void do_autodamage( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->act, PLR_AUTODAMAGE)) do_config(ch,"-autodamage");
	else do_config(ch,"+autodamage");
	return;
}

void do_autoexit( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->act, PLR_AUTOEXIT)) do_config(ch,"-autoexit");
	else do_config(ch,"+autoexit");
	return;
}

void do_autoprotect( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->pcdata->comm, COMM_AUTOPROTECT)) do_config(ch,"-autoprotect");
	else do_config(ch,"+autoprotect");
	return;
}

void do_autoloot( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->act, PLR_AUTOLOOT)) do_config(ch,"-autoloot");
	else do_config(ch,"+autoloot");
	return;
}

void do_autosac( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->act, PLR_AUTOSAC)) do_config(ch,"-autosac");
	else do_config(ch,"+autosac");
	return;
}

void do_blank( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->act, PLR_BLANK)) do_config(ch,"-blank");
	else do_config(ch,"+blank");
	return;
}

void do_brief( CHAR_DATA *ch, char *argument )
{
	if ( IS_NPC(ch) ) return;
	if (IS_SET(ch->act, PLR_BRIEF)) do_config(ch,"-brief");
	else do_config(ch,"+brief");
	return;
}

void do_diagnose( CHAR_DATA *ch, char *argument )
{
	char buf  [MAX_STRING_LENGTH];
	char arg  [MAX_INPUT_LENGTH];
	int teeth = 0;
	int ribs = 0;
	CHAR_DATA *victim;
	
	argument = one_argument( argument, arg );
	
	if (arg == '\0')
	{
		victim = ch;
/*	send_to_char("Who do you wish to diagnose?\n\r",ch);
	return;
*/
	}
	
	if ( ( victim = get_char_room( ch, arg ) ) == NULL )
	{
		send_to_char("Nobody here by that name.\n\r",ch);
		return;
	}
	act("$n examines $N carefully, diagnosing $S injuries.",ch,NULL,victim,TO_NOTVICT);
	act("$n examines you carefully, diagnosing your injuries.",ch,NULL,victim,TO_VICT);
	act("Your diagnoses of $N reveals the following...",ch,NULL,victim,TO_CHAR);
	send_to_char("--------------------------------------------------------------------------------\n\r",ch);
	if ( ( victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + 
		victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5] +
		victim->loc_hp[6] ) == 0 )
	{
		act("$N has no apparent injuries.",ch,NULL,victim,TO_CHAR);
		send_to_char("--------------------------------------------------------------------------------\n\r",ch);
		return;
	}
    /* Check head */
	if (IS_HEAD(victim,LOST_EYE_L) && IS_HEAD(victim,LOST_EYE_R))
		act("$N has lost both of $S eyes.",ch,NULL,victim,TO_CHAR);
	else if (IS_HEAD(victim,LOST_EYE_L))
		act("$N has lost $S left eye.",ch,NULL,victim,TO_CHAR);
	else if (IS_HEAD(victim,LOST_EYE_R))
		act("$N has lost $S right eye.",ch,NULL,victim,TO_CHAR);
	if (IS_HEAD(victim,LOST_EAR_L) && IS_HEAD(victim,LOST_EAR_R))
		act("$N has lost both of $S ears.",ch,NULL,victim,TO_CHAR);
	else if (IS_HEAD(victim,LOST_EAR_L))
		act("$N has lost $S left ear.",ch,NULL,victim,TO_CHAR);
	else if (IS_HEAD(victim,LOST_EAR_R))
		act("$N has lost $S right ear.",ch,NULL,victim,TO_CHAR);
	if (IS_HEAD(victim,LOST_NOSE))
		act("$N has lost $S nose.",ch,NULL,victim,TO_CHAR);
	else if (IS_HEAD(victim,BROKEN_NOSE))
		act("$N has got a broken nose.",ch,NULL,victim,TO_CHAR);
	if (IS_HEAD(victim,BROKEN_JAW))
		act("$N has got a broken jaw.",ch,NULL,victim,TO_CHAR);
	if (IS_HEAD(victim,LOST_HEAD))
	{
		act("$N has had $S head cut off.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_HEAD))
			act("...Blood is spurting from the stump of $S neck.",ch,NULL,victim,TO_CHAR);
	}
	else
	{
		if (IS_BODY(victim,BROKEN_NECK))
			act("$N has got a broken neck.",ch,NULL,victim,TO_CHAR);
		if (IS_BODY(victim,CUT_THROAT))
		{
			act("$N has had $S throat cut open.",ch,NULL,victim,TO_CHAR);
			if (IS_BLEEDING(victim,BLEEDING_THROAT))
				act("...Blood is pouring from the wound.",ch,NULL,victim,TO_CHAR);
		}
	}
	if (IS_HEAD(victim,BROKEN_SKULL))
		act("$N has got a broken skull.",ch,NULL,victim,TO_CHAR);
	if (IS_HEAD(victim,LOST_TOOTH_1 )) teeth += 1;
	if (IS_HEAD(victim,LOST_TOOTH_2 )) teeth += 2;
	if (IS_HEAD(victim,LOST_TOOTH_4 )) teeth += 4;
	if (IS_HEAD(victim,LOST_TOOTH_8 )) teeth += 8;
	if (IS_HEAD(victim,LOST_TOOTH_16)) teeth += 16;
	if (teeth > 0)
	{
		sprintf(buf,"$N has had %d teeth knocked out.",teeth);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	if (IS_HEAD(victim,LOST_TONGUE))
		act("$N has had $S tongue ripped out.",ch,NULL,victim,TO_CHAR);
	if (IS_HEAD(victim,LOST_HEAD))
	{
		send_to_char("--------------------------------------------------------------------------------\n\r",ch);
		return;
	}
    /* Check body */
	if (IS_BODY(victim,BROKEN_RIBS_1 )) ribs += 1;
	if (IS_BODY(victim,BROKEN_RIBS_2 )) ribs += 2;
	if (IS_BODY(victim,BROKEN_RIBS_4 )) ribs += 4;
	if (IS_BODY(victim,BROKEN_RIBS_8 )) ribs += 8;
	if (IS_BODY(victim,BROKEN_RIBS_16)) ribs += 16;
	if (ribs > 0)
	{
		sprintf(buf,"$N has got %d broken ribs.",ribs);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	if (IS_BODY(victim,BROKEN_SPINE))
		act("$N has got a broken spine.",ch,NULL,victim,TO_CHAR);
    /* Check arms */
	check_left_arm(ch,victim);
	check_right_arm(ch,victim);
	check_left_leg(ch,victim);
	check_right_leg(ch,victim);
	send_to_char("--------------------------------------------------------------------------------\n\r",ch);
	return;
}

void check_left_arm( CHAR_DATA *ch, CHAR_DATA *victim )
{
	char buf    [MAX_STRING_LENGTH];
	char finger [10];
	int fingers = 0;
	
	if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
	{
		act("$N has lost both of $S arms.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_ARM_L) && IS_BLEEDING(victim,BLEEDING_ARM_R))
			act("...Blood is spurting from both stumps.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_ARM_L))
			act("...Blood is spurting from the left stump.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_ARM_R))
			act("...Blood is spurting from the right stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_ARM_L(victim,LOST_ARM))
	{
		act("$N has lost $S left arm.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_ARM_L))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_ARM_L(victim,BROKEN_ARM) && IS_ARM_R(victim,BROKEN_ARM))
		act("$N arms are both broken.",ch,NULL,victim,TO_CHAR);
	else if (IS_ARM_L(victim,BROKEN_ARM))
		act("$N's left arm is broken.",ch,NULL,victim,TO_CHAR);
	if (IS_ARM_L(victim,LOST_HAND) && IS_ARM_R(victim,LOST_HAND) &&
		!IS_ARM_R(victim,LOST_ARM))
	{
		act("$N has lost both of $S hands.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_HAND_L) && IS_BLEEDING(victim,BLEEDING_HAND_R))
			act("...Blood is spurting from both stumps.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_HAND_L))
			act("...Blood is spurting from the left stump.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_HAND_R))
			act("...Blood is spurting from the right stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_ARM_L(victim,LOST_HAND))
	{
		act("$N has lost $S left hand.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_HAND_L))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_ARM_L(victim,LOST_FINGER_I)) fingers += 1;
	if (IS_ARM_L(victim,LOST_FINGER_M)) fingers += 1;
	if (IS_ARM_L(victim,LOST_FINGER_R)) fingers += 1;
	if (IS_ARM_L(victim,LOST_FINGER_L)) fingers += 1;
	if (fingers == 1) sprintf(finger,"finger");
	else sprintf(finger,"fingers");
	if (fingers > 0 && IS_ARM_L(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has lost %d %s and $S thumb from $S left hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (fingers > 0)
	{
		sprintf(buf,"$N has lost %d %s from $S left hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_ARM_L(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has lost the thumb from $S left hand.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	fingers = 0;
	if (IS_ARM_L(victim,BROKEN_FINGER_I) && !IS_ARM_L(victim,LOST_FINGER_I)) fingers += 1;
	if (IS_ARM_L(victim,BROKEN_FINGER_M) && !IS_ARM_L(victim,LOST_FINGER_M)) fingers += 1;
	if (IS_ARM_L(victim,BROKEN_FINGER_R) && !IS_ARM_L(victim,LOST_FINGER_R)) fingers += 1;
	if (IS_ARM_L(victim,BROKEN_FINGER_L) && !IS_ARM_L(victim,LOST_FINGER_L)) fingers += 1;
	if (fingers == 1) sprintf(finger,"finger");
	else sprintf(finger,"fingers");
	if (fingers > 0 && IS_ARM_L(victim,BROKEN_THUMB) && !IS_ARM_L(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has broken %d %s and $S thumb on $S left hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (fingers > 0)
	{
		sprintf(buf,"$N has broken %d %s on $S left hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_ARM_L(victim,BROKEN_THUMB) && !IS_ARM_L(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has broken the thumb on $S left hand.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	return;
}

void check_right_arm( CHAR_DATA *ch, CHAR_DATA *victim )
{
	char buf    [MAX_STRING_LENGTH];
	char finger [10];
	int fingers = 0;
	
	if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
		return;
	if (IS_ARM_R(victim,LOST_ARM))
	{
		act("$N has lost $S right arm.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_ARM_R))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (!IS_ARM_L(victim,BROKEN_ARM) && IS_ARM_R(victim,BROKEN_ARM))
		act("$N's right arm is broken.",ch,NULL,victim,TO_CHAR);
	else if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,BROKEN_ARM))
		act("$N's right arm is broken.",ch,NULL,victim,TO_CHAR);
	if (IS_ARM_L(victim,LOST_HAND) && IS_ARM_R(victim,LOST_HAND))
		return;
	if (IS_ARM_R(victim,LOST_HAND))
	{
		act("$N has lost $S right hand.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_HAND_R))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_ARM_R(victim,LOST_FINGER_I)) fingers += 1;
	if (IS_ARM_R(victim,LOST_FINGER_M)) fingers += 1;
	if (IS_ARM_R(victim,LOST_FINGER_R)) fingers += 1;
	if (IS_ARM_R(victim,LOST_FINGER_L)) fingers += 1;
	if (fingers == 1) sprintf(finger,"finger");
	else sprintf(finger,"fingers");
	if (fingers > 0 && IS_ARM_R(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has lost %d %s and $S thumb from $S right hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (fingers > 0)
	{
		sprintf(buf,"$N has lost %d %s from $S right hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_ARM_R(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has lost the thumb from $S right hand.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	fingers = 0;
	if (IS_ARM_R(victim,BROKEN_FINGER_I) && !IS_ARM_R(victim,LOST_FINGER_I)) fingers += 1;
	if (IS_ARM_R(victim,BROKEN_FINGER_M) && !IS_ARM_R(victim,LOST_FINGER_M)) fingers += 1;
	if (IS_ARM_R(victim,BROKEN_FINGER_R) && !IS_ARM_R(victim,LOST_FINGER_R)) fingers += 1;
	if (IS_ARM_R(victim,BROKEN_FINGER_L) && !IS_ARM_R(victim,LOST_FINGER_L)) fingers += 1;
	if (fingers == 1) sprintf(finger,"finger");
	else sprintf(finger,"fingers");
	if (fingers > 0 && IS_ARM_R(victim,BROKEN_THUMB) && !IS_ARM_R(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has broken %d %s and $S thumb on $S right hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (fingers > 0)
	{
		sprintf(buf,"$N has broken %d %s on $S right hand.",fingers,finger);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_ARM_R(victim,BROKEN_THUMB) && !IS_ARM_R(victim,LOST_THUMB))
	{
		sprintf(buf,"$N has broken the thumb on $S right hand.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	return;
}

void check_left_leg( CHAR_DATA *ch, CHAR_DATA *victim )
{
	char buf    [MAX_STRING_LENGTH];
	char toe [10];
	int toes = 0;
	
	if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
	{
		act("$N has lost both of $S legs.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_LEG_L) && IS_BLEEDING(victim,BLEEDING_LEG_R))
			act("...Blood is spurting from both stumps.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_LEG_L))
			act("...Blood is spurting from the left stump.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_LEG_R))
			act("...Blood is spurting from the right stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_LEG_L(victim,LOST_LEG))
	{
		act("$N has lost $S left leg.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_LEG_L))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_LEG_L(victim,BROKEN_LEG) && IS_LEG_R(victim,BROKEN_LEG))
		act("$N legs are both broken.",ch,NULL,victim,TO_CHAR);
	else if (IS_LEG_L(victim,BROKEN_LEG))
		act("$N's left leg is broken.",ch,NULL,victim,TO_CHAR);
	if (IS_LEG_L(victim,LOST_FOOT) && IS_LEG_R(victim,LOST_FOOT))
	{
		act("$N has lost both of $S feet.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_FOOT_L) && IS_BLEEDING(victim,BLEEDING_FOOT_R))
			act("...Blood is spurting from both stumps.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_FOOT_L))
			act("...Blood is spurting from the left stump.",ch,NULL,victim,TO_CHAR);
		else if (IS_BLEEDING(victim,BLEEDING_FOOT_R))
			act("...Blood is spurting from the right stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_LEG_L(victim,LOST_FOOT))
	{
		act("$N has lost $S left foot.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_FOOT_L))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_LEG_L(victim,LOST_TOE_A)) toes += 1;
	if (IS_LEG_L(victim,LOST_TOE_B)) toes += 1;
	if (IS_LEG_L(victim,LOST_TOE_C)) toes += 1;
	if (IS_LEG_L(victim,LOST_TOE_D)) toes += 1;
	if (toes == 1) sprintf(toe,"toe");
	else sprintf(toe,"toes");
	if (toes > 0 && IS_LEG_L(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has lost %d %s and $S big toe from $S left foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (toes > 0)
	{
		sprintf(buf,"$N has lost %d %s from $S left foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_LEG_L(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has lost the big toe from $S left foot.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	toes = 0;
	if (IS_LEG_L(victim,BROKEN_TOE_A) && !IS_LEG_L(victim,LOST_TOE_A)) toes += 1;
	if (IS_LEG_L(victim,BROKEN_TOE_B) && !IS_LEG_L(victim,LOST_TOE_B)) toes += 1;
	if (IS_LEG_L(victim,BROKEN_TOE_C) && !IS_LEG_L(victim,LOST_TOE_C)) toes += 1;
	if (IS_LEG_L(victim,BROKEN_TOE_D) && !IS_LEG_L(victim,LOST_TOE_D)) toes += 1;
	if (toes == 1) sprintf(toe,"toe");
	else sprintf(toe,"toes");
	if (toes > 0 && IS_LEG_L(victim,BROKEN_TOE_BIG) && !IS_LEG_L(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has broken %d %s and $S big toe from $S left foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (toes > 0)
	{
		sprintf(buf,"$N has broken %d %s on $S left foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_LEG_L(victim,BROKEN_TOE_BIG) && !IS_LEG_L(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has broken the big toe on $S left foot.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	return;
}

void check_right_leg( CHAR_DATA *ch, CHAR_DATA *victim )
{
	char buf    [MAX_STRING_LENGTH];
	char toe [10];
	int toes = 0;
	
	if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
		return;
	if (IS_LEG_R(victim,LOST_LEG))
	{
		act("$N has lost $S right leg.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_LEG_R))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (!IS_LEG_L(victim,BROKEN_LEG) && IS_LEG_R(victim,BROKEN_LEG))
		act("$N's right leg is broken.",ch,NULL,victim,TO_CHAR);
	if (IS_LEG_L(victim,LOST_FOOT) && IS_LEG_R(victim,LOST_FOOT))
		return;
	if (IS_LEG_R(victim,LOST_FOOT))
	{
		act("$N has lost $S right foot.",ch,NULL,victim,TO_CHAR);
		if (IS_BLEEDING(victim,BLEEDING_FOOT_R))
			act("...Blood is spurting from the stump.",ch,NULL,victim,TO_CHAR);
		return;
	}
	if (IS_LEG_R(victim,LOST_TOE_A)) toes += 1;
	if (IS_LEG_R(victim,LOST_TOE_B)) toes += 1;
	if (IS_LEG_R(victim,LOST_TOE_C)) toes += 1;
	if (IS_LEG_R(victim,LOST_TOE_D)) toes += 1;
	if (toes == 1) sprintf(toe,"toe");
	else sprintf(toe,"toes");
	if (toes > 0 && IS_LEG_R(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has lost %d %s and $S big toe from $S right foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (toes > 0)
	{
		sprintf(buf,"$N has lost %d %s from $S right foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_LEG_R(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has lost the big toe from $S right foot.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	toes = 0;
	if (IS_LEG_R(victim,BROKEN_TOE_A) && !IS_LEG_R(victim,LOST_TOE_A)) toes += 1;
	if (IS_LEG_R(victim,BROKEN_TOE_B) && !IS_LEG_R(victim,LOST_TOE_B)) toes += 1;
	if (IS_LEG_R(victim,BROKEN_TOE_C) && !IS_LEG_R(victim,LOST_TOE_C)) toes += 1;
	if (IS_LEG_R(victim,BROKEN_TOE_D) && !IS_LEG_R(victim,LOST_TOE_D)) toes += 1;
	if (toes == 1) sprintf(toe,"toe");
	else sprintf(toe,"toes");
	if (toes > 0 && IS_LEG_R(victim,BROKEN_TOE_BIG) && !IS_LEG_R(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has broken %d %s and $S big toe on $S right foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (toes > 0)
	{
		sprintf(buf,"$N has broken %d %s on $S right foot.",toes,toe);
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	else if (IS_LEG_R(victim,BROKEN_TOE_BIG) && !IS_LEG_R(victim,LOST_TOE_BIG))
	{
		sprintf(buf,"$N has broken the big toe on $S right foot.");
		act(buf,ch,NULL,victim,TO_CHAR);
	}
	return;
}

void obj_score( CHAR_DATA *ch, OBJ_DATA *obj )
{
	char buf[MAX_STRING_LENGTH];
	AFFECT_DATA *paf;
	int itemtype;
	
	sprintf( buf,"You are %s.\n\r",obj->short_descr->str);
	send_to_char( buf, ch );
	
	sprintf( buf,"Type %s, Extra flags %s.\n\r",item_type_name(obj),
		extra_bit_name(obj->extra_flags));
	send_to_char( buf, ch );
	
	sprintf( buf,"You weigh %d pounds and are worth %d gold coins.\n\r",obj->weight,obj->cost);
	send_to_char( buf, ch );
	
	if (obj->questmaker != NULL && obj->questmaker->len > 1 &&
		obj->questowner != NULL && obj->questowner->len > 1)
	{
		sprintf( buf, "You were created by %s, and are owned by %s.\n\r", obj->questmaker->str,obj->questowner->str );
		send_to_char( buf, ch );
	}
	else if (obj->questmaker != NULL && obj->questmaker->len > 1)
	{
		sprintf( buf, "You were created by %s.\n\r", obj->questmaker->str );
		send_to_char( buf, ch );
	}
	else if (obj->questowner != NULL && obj->questowner->len > 1)
	{
		sprintf( buf, "You are owned by %s.\n\r", obj->questowner->str );
		send_to_char( buf, ch );
	}
	
	switch ( obj->item_type )
	{
		case ITEM_SCROLL: 
		case ITEM_POTION:
			sprintf( buf, "You contain level %d spells of:", obj->value[0] );
			send_to_char( buf, ch );
			
			if ( obj->value[1] >= 0 && obj->value[1] < MAX_SKILL )
			{
				send_to_char( " '", ch );
				send_to_char( skill_table[obj->value[1]].name, ch );
				send_to_char( "'", ch );
			}
			
			if ( obj->value[2] >= 0 && obj->value[2] < MAX_SKILL )
			{
				send_to_char( " '", ch );
				send_to_char( skill_table[obj->value[2]].name, ch );
				send_to_char( "'", ch );
			}
			
			if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
			{
				send_to_char( " '", ch );
				send_to_char( skill_table[obj->value[3]].name, ch );
				send_to_char( "'", ch );
			}
			
			send_to_char( ".\n\r", ch );
			break;
			
		case ITEM_QUEST:
			sprintf( buf, "Your quest point value is %d.\n\r", obj->value[0] );
			send_to_char( buf, ch );
			break;
			
		case ITEM_WAND: 
		case ITEM_STAFF: 
			sprintf( buf, "You have %d(%d) charges of level %d",
				obj->value[1], obj->value[2], obj->value[0] );
			send_to_char( buf, ch );
			
			if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
			{
				send_to_char( " '", ch );
				send_to_char( skill_table[obj->value[3]].name, ch );
				send_to_char( "'", ch );
			}
			
			send_to_char( ".\n\r", ch );
			break;
			
		case ITEM_WEAPON:
			sprintf( buf, "You inflict %d to %d damage in combat (average %d).\n\r",
				obj->value[1], obj->value[2],
				( obj->value[1] + obj->value[2] ) / 2 );
			send_to_char( buf, ch );
			
			if (obj->value[0] >= 1000)
				itemtype = obj->value[0] - ((obj->value[0] / 1000) * 1000);
			else
				itemtype = obj->value[0];
			
			if (itemtype > 0)
			{
				if (obj->level < 10)
					sprintf(buf,"You are a minor spell weapon.\n\r");
				else if (obj->level < 20)
					sprintf(buf,"You are a lesser spell weapon.\n\r");
				else if (obj->level < 30)
					sprintf(buf,"You are an average spell weapon.\n\r");
				else if (obj->level < 40)
					sprintf(buf,"You are a greater spell weapon.\n\r");
				else if (obj->level < 50)
					sprintf(buf,"You are a major spell weapon.\n\r");
				else
					sprintf(buf,"You are a supreme spell weapon.\n\r");
				send_to_char(buf,ch);
			}
			
			if (itemtype == 1)
				sprintf (buf, "You are dripping with corrosive acid.\n\r");
			else if (itemtype == 4)
				sprintf (buf, "You radiate an aura of darkness.\n\r");
			else if (itemtype == 30)
				sprintf (buf, "You are the bane of all evil.\n\r");
			else if (itemtype == 34)
				sprintf (buf, "You drink the souls of your victims.\n\r");
			else if (itemtype == 37)
				sprintf (buf, "You have been tempered in hellfire.\n\r");
			else if (itemtype == 48)
				sprintf (buf, "You crackle with sparks of lightning.\n\r");
			else if (itemtype == 53)
				sprintf (buf, "You are dripping with a dark poison.\n\r");
			else if (itemtype > 0)
				sprintf (buf, "You have been imbued with the power of %s.\n\r",skill_table[itemtype].name);
			if (itemtype > 0)
				send_to_char( buf, ch );
			
			if (obj->value[0] >= 1000)
				itemtype = obj->value[0] / 1000;
			else
				break;
			
			if (itemtype == 4 || itemtype == 1)
				sprintf (buf, "You radiate an aura of darkness.\n\r");
			else if (itemtype == 27 || itemtype == 2)
				sprintf (buf, "You allow your wielder to see invisible things.\n\r");
			else if (itemtype == 39 || itemtype == 3)
				sprintf (buf, "You grant your wielder the power of flight.\n\r");
			else if (itemtype == 45 || itemtype == 4)
				sprintf (buf, "You allow your wielder to see in the dark.\n\r");
			else if (itemtype == 46 || itemtype == 5)
				sprintf (buf, "You render your wielder invisible to the human eye.\n\r");
			else if (itemtype == 52 || itemtype == 6)
				sprintf (buf, "You allow your wielder to walk through solid doors.\n\r");
			else if (itemtype == 54 || itemtype == 7)
				sprintf (buf, "You protect your wielder from evil.\n\r");
			else if (itemtype == 57 || itemtype == 8)
				sprintf (buf, "You protect your wielder in combat.\n\r");
			else if (itemtype == 9)
				sprintf (buf, "You allow your wielder to walk in complete silence.\n\r");
			else if (itemtype == 10)
				sprintf (buf, "You surround your wielder with a shield of lightning.\n\r");
			else if (itemtype == 11)
				sprintf (buf, "You surround your wielder with a shield of fire.\n\r");
			else if (itemtype == 12)
				sprintf (buf, "You surround your wielder with a shield of ice.\n\r");
			else if (itemtype == 13)
				sprintf (buf, "You surround your wielder with a shield of acid.\n\r");
			else if (itemtype == 14)
				sprintf (buf, "You protect your wielder from attacks from DarkBlade clan guardians.\n\r");
			else if (itemtype == 15)
				sprintf (buf, "You surround your wielder with a shield of chaos.\n\r");
			else if (itemtype == 16)
				sprintf (buf, "You regenerate the wounds of your wielder.\n\r");
			else if (itemtype == 17)
				sprintf (buf, "You enable your wielder to move at supernatural speed.\n\r");
			else if (itemtype == 18)
				sprintf (buf, "You can slice through armour without difficulty.\n\r");
			else if (itemtype == 19)
				sprintf (buf, "You protect your wielder from player attacks.\n\r");
			else if (itemtype == 20)
				sprintf (buf, "You surround your wielder with a shield of darkness.\n\r");
			else if (itemtype == 21)
				sprintf (buf, "You grant your wielder superior protection.\n\r");
			else if (itemtype == 22)
				sprintf (buf, "You grant your wielder supernatural vision.\n\r");
			else if (itemtype == 23)
				sprintf (buf, "You make your wielder fleet-footed.\n\r");
			else if (itemtype == 24)
				sprintf (buf, "You conceal your wielder from sight.\n\r");
			else if (itemtype == 25)
				sprintf (buf, "You invoke the power of your wielders beast.\n\r");
			else
				sprintf (buf, "You are bugged...please report it.\n\r");
			if (itemtype > 0)
				send_to_char( buf, ch );
			break;
			
		case ITEM_ARMOR:
			sprintf( buf, "Your armor class is %d.\n\r", obj->value[0] );
			send_to_char( buf, ch );
			if (obj->value[3] < 1)
				break;
			if (obj->value[3] == 4 || obj->value[3] == 1)
				sprintf (buf, "You radiate an aura of darkness.\n\r");
			else if (obj->value[3] == 27 || obj->value[3] == 2)
				sprintf (buf, "You allow your wearer to see invisible things.\n\r");
			else if (obj->value[3] == 39 || obj->value[3] == 3)
				sprintf (buf, "You grant your wearer the power of flight.\n\r");
			else if (obj->value[3] == 45 || obj->value[3] == 4)
				sprintf (buf, "You allow your wearer to see in the dark.\n\r");
			else if (obj->value[3] == 46 || obj->value[3] == 5)
				sprintf (buf, "You render your wearer invisible to the human eye.\n\r");
			else if (obj->value[3] == 52 || obj->value[3] == 6)
				sprintf (buf, "You allow your wearer to walk through solid doors.\n\r");
			else if (obj->value[3] == 54 || obj->value[3] == 7)
				sprintf (buf, "You protect your wearer from evil.\n\r");
			else if (obj->value[3] == 57 || obj->value[3] == 8)
				sprintf (buf, "You protect your wearer in combat.\n\r");
			else if (obj->value[3] == 9)
				sprintf (buf, "You allow your wearer to walk in complete silence.\n\r");
			else if (obj->value[3] == 10)
				sprintf (buf, "You surround your wearer with a shield of lightning.\n\r");
			else if (obj->value[3] == 11)
				sprintf (buf, "You surround your wearer with a shield of fire.\n\r");
			else if (obj->value[3] == 12)
				sprintf (buf, "You surround your wearer with a shield of ice.\n\r");
			else if (obj->value[3] == 13)
				sprintf (buf, "You surround your wearer with a shield of acid.\n\r");
			else if (obj->value[3] == 14)
				sprintf (buf, "You protect your wearer from attacks from DarkBlade clan guardians.\n\r");
			else if (obj->value[3] == 15)
				sprintf (buf, "You surround your wielder with a shield of chaos.\n\r");
			else if (obj->value[3] == 16)
				sprintf (buf, "You regenerate the wounds of your wielder.\n\r");
			else if (obj->value[3] == 17)
				sprintf (buf, "You enable your wearer to move at supernatural speed.\n\r");
			else if (obj->value[3] == 18)
				sprintf (buf, "You can slice through armour without difficulty.\n\r");
			else if (obj->value[3] == 19)
				sprintf (buf, "You protect your wearer from player attacks.\n\r");
			else if (obj->value[3] == 20)
				sprintf (buf, "You surround your wearer with a shield of darkness.\n\r");
			else if (obj->value[3] == 21)
				sprintf (buf, "You grant your wearer superior protection.\n\r");
			else if (obj->value[3] == 22)
				sprintf (buf, "You grant your wearer supernatural vision.\n\r");
			else if (obj->value[3] == 23)
				sprintf (buf, "You make your wearer fleet-footed.\n\r");
			else if (obj->value[3] == 24)
				sprintf (buf, "You conceal your wearer from sight.\n\r");
			else if (obj->value[3] == 25)
				sprintf (buf, "You invoke the power of your wearers beast.\n\r");
			else
				sprintf (buf, "You are bugged...please report it.\n\r");
			if (obj->value[3] > 0)
				send_to_char( buf, ch );
			break;
	}
	
	for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next )
	{
		if ( paf->location != APPLY_NONE && paf->modifier != 0 )
		{
			sprintf( buf, "You affect %s by %d.\n\r",
				affect_loc_name( paf->location ), paf->modifier );
			send_to_char( buf, ch );
		}
	}
	
	for ( paf = obj->affected; paf != NULL; paf = paf->next )
	{
		if ( paf->location != APPLY_NONE && paf->modifier != 0 )
		{
			sprintf( buf, "You affect %s by %d.\n\r",
				affect_loc_name( paf->location ), paf->modifier );
			send_to_char( buf, ch );
		}
	}
	return;
}

/* Do_prompt from Morgenes from Aldara Mud */
void do_prompt( CHAR_DATA *ch, char *argument )
{
	char buf [ MAX_STRING_LENGTH ];
	
	buf[0] = '\0';
	if ( IS_NPC(ch) ) return;
	
	if ( argument[0] == '\0' )
	{
		do_help( ch, "prompt" );
		return;
	}
	
	if( !strcmp( argument, "on" ) )
	{
		if (IS_EXTRA(ch, EXTRA_PROMPT))
			send_to_char("But you already have customized prompt on!\n\r",ch);
		else
		{
			send_to_char("Ok.\n\r",ch);
			SET_BIT(ch->extra, EXTRA_PROMPT);
		}
		return;
	}
	else if( !strcmp( argument, "off" ) )
	{
		if (!IS_EXTRA(ch, EXTRA_PROMPT))
			send_to_char("But you already have customized prompt off!\n\r",ch);
		else
		{
			send_to_char("Ok.\n\r",ch);
			REMOVE_BIT(ch->extra, EXTRA_PROMPT);
		}
		return;
	}
	else if( !strcmp( argument, "clear" ) )
	{
		ch->prompt = g_string_assign(ch->prompt,"");
		return;
	}
	else
	{
		if ( strlen( argument ) > 50 )
			argument[50] = '\0';
		smash_tilde( argument );
		strcat( buf, argument );
	}
	
	ch->prompt = g_string_assign(ch->prompt,buf);
	send_to_char( "Ok.\n\r", ch );
	return;
} 

/* Do_prompt from Morgenes from Aldara Mud */
void do_cprompt( CHAR_DATA *ch, char *argument )
{
	char buf [ MAX_STRING_LENGTH ];
	
	buf[0] = '\0';
	if ( IS_NPC(ch) ) return;
	
	if ( argument[0] == '\0' )
	{
		do_help( ch, "cprompt" );
		return;
	}
	
	if( !strcmp( argument, "clear" ) )
	{
		ch->cprompt = g_string_assign(ch->cprompt,"");
		return;
	}
	else
	{
		if ( strlen( argument ) > 50 )
			argument[50] = '\0';
		smash_tilde( argument );
		strcat( buf, argument );
	}
	
	ch->cprompt = g_string_assign(ch->cprompt,buf);
	send_to_char( "Ok.\n\r", ch );
	return;
} 

void do_finger( CHAR_DATA *ch, char *argument )
{
	char strsave[MAX_INPUT_LENGTH];
	sh_int buf;
	GString *buf5;
	char buf2[MAX_INPUT_LENGTH];
	FILE *fp;
	int  myclass;
	int  num;
	int  num2;
	int  extra;
	

	if ( IS_NPC(ch) ) return;
	
	if (!check_parse_name( argument ))
	{
		send_to_char( "Thats an illegal name.\n\r", ch );
		return;
	}
	
	if ( !char_exists(TRUE,argument) )
	{
		send_to_char( "That player doesn't exist.\n\r", ch );
		return;
	}
	
	fclose( fpReserve );
	sprintf( strsave, "%sbackup/%s", PLAYER_DIR, capitalize(argument) );
	if ( ( fp = fopen( strsave, "r" ) ) != NULL )
	{
		buf5 = g_string_new("");
		send_to_char("{W--------------------------------------------------------------------------------{c\n\r",ch);
		buf5 = nonfread_string(buf5, fp );
		send_to_char(buf5->str,ch);
		send_to_char(" ",ch);
		buf5=nonfread_string(buf5, fp );
		send_to_char(buf5->str,ch);
		send_to_char(".\n\r",ch);
		myclass=fread_number( fp );
		buf=fread_number( fp );
		switch ( myclass )
		{
			case CLASS_VAMPIRE:
				send_to_char("{RVampire{x",ch);
				send_to_char(": {R",ch);
				if (buf == CLAN_NONE)
					send_to_char("Caitiff", ch);
				else
					send_to_char(iclan_table[buf].pretty_name,ch);
				break;
			case CLASS_WEREWOLF:
				send_to_char("{GWerewolf{x ",ch);
				send_to_char(": {G",ch);
				if (buf == CLAN_NONE)
					send_to_char("Ronin", ch);
				else
					send_to_char(iclan_table[buf].pretty_name,ch);
				break;
			case CLASS_MAGE:
				send_to_char("{CMage{x ",ch);
				send_to_char(": {C",ch);
				if (buf == CLAN_NONE)
					send_to_char("Hollow Ones", ch);
				else
					send_to_char(iclan_table[buf].pretty_name,ch);
				break;
			case CLASS_SWWF:
				send_to_char("{GGarou{x ",ch);
				send_to_char(": {C",ch);
				if (buf == CLAN_NONE)
					send_to_char("Ronin", ch);
				else
					send_to_char(iclan_table[buf].pretty_name,ch);
				break;
			case CLASS_WRAITH:
				send_to_char("{DWraith{x ",ch);
				send_to_char(": {D",ch);
				if (buf == CLAN_NONE)
					send_to_char("Oblivion", ch);
				else
					send_to_char(iclan_table[buf].pretty_name,ch);
				break;
			default:
				break;
		}
		send_to_char("\n\r{W--------------------------------------------------------------------------------{c\n\r",ch);
		
		if ( ch->trust  > 8 )         
		{
			send_to_char("Last connected from ",ch);
			buf5=nonfread_string(buf5, fp );
			send_to_char(buf5->str,ch);
			send_to_char(" at ",ch);
			buf5=nonfread_string(buf5, fp );
			send_to_char(buf5->str,ch);
			send_to_char(".\n\r",ch);
		}
		else
		{
			buf5=nonfread_string(buf5, fp ); //this reads the IP and is ignored.
			buf5=nonfread_string(buf5, fp ); //this reads last login time and is used.
			
			send_to_char("Last connected at ",ch);
			send_to_char("??????",ch);
			send_to_char(".\n\r",ch);
		}
		send_to_char("{W--------------------------------------------------------------------------------{c\n\r",ch);
		extra=fread_number( fp );
		num=fread_number( fp );
		send_to_char("Sex: ",ch);
		buf5=nonfread_string(buf5, fp );
		if (num == SEX_MALE) send_to_char("Male. ",ch);
		else if (num == SEX_FEMALE) 
		{
			send_to_char("Female. ",ch);
			if (IS_SET(extra, EXTRA_PREGNANT)) other_age(ch,extra,TRUE,buf5->str);
		}
		else send_to_char("None. ",ch);
		buf5=nonfread_string(buf5, fp );
		other_age(ch,extra,FALSE,buf5->str);
		num=fread_number( fp );
		num2=fread_number( fp );
        if (IS_IMMORTAL(ch)) 
        {
            switch ( num )
            {
                default:
                    send_to_char("They are mortal, ",ch);
                    break;
                case LEVEL_AVATAR:
                case LEVEL_APPRENTICE:
                case LEVEL_MAGE:
                case LEVEL_ARCHMAGE:
                    {
                        if ( myclass == CLASS_VAMPIRE )
                        {
                            if (num2 < 1)
                                send_to_char("They are an{R Avatar Vamp{c, ",ch);
                            else if (num2 < 5)
                                send_to_char("They are a {RLesser Vamp{c, ",ch);
                            else if (num2 < 10)
                                send_to_char("They are a {RVampire{c, ",ch);
                            else if (num2 < 15)
                                send_to_char("They are a {RGreater Vamp{c, ",ch);
                            else if (num2 < 20)
                                send_to_char("They are a {RGrand Vampire{c, ",ch);
                            else if (num2 < 25)
                                send_to_char("They are a {RElder Vampire{c, ",ch);
                            else if (num2 < 30)
                                send_to_char("They are a {RMaster Vampire{c, ",ch);
                            else
                                send_to_char("They are a {RVampireLegend{c, ",ch);
                            break;
                        }
                        else if ( myclass == CLASS_WEREWOLF )
                        {
                            if (num2 < 1)
                                send_to_char("They are an{G Avatar Garou{c, ",ch);
                            else if (num2 < 5)
                                send_to_char("They are a {GLesser Garou{c, ",ch);
                            else if (num2 < 10)
                                send_to_char("They are a {GGarou{c, ",ch);
                            else if (num2 < 15)
                                send_to_char("They are a {GGreater Garou{c, ",ch);
                            else if (num2 < 20)
                                send_to_char("They are a {GGrand Garou{c, ",ch);
                            else if (num2 < 25)
                                send_to_char("They are a {GElder Garou{c, ",ch);
                            else if (num2 < 30)
                                send_to_char("They are a {GMaster Garou{c, ",ch);
                            else
                                send_to_char("They are a {GGarou Legend{c, ",ch);
                            break;
                        }
                        else if ( myclass == CLASS_SWWF )
                        {
                            if (num2 < 1)
                                send_to_char("They are an{G Avatar Garou{c, ",ch);
                            else if (num2 < 5)
                                send_to_char("They are a {GLesser Garou{c, ",ch);
                            else if (num2 < 10)
                                send_to_char("They are a {GGarou{c, ",ch);
                            else if (num2 < 15)
                                send_to_char("They are a {GGreater Garou{c, ",ch);
                            else if (num2 < 20)
                                send_to_char("They are a {GGrand Garou{c, ",ch);
                            else if (num2 < 25)
                                send_to_char("They are a {GElder Garou{c, ",ch);
                            else if (num2 < 30)
                                send_to_char("They are a {GMaster Garou{c, ",ch);
                            else
                                send_to_char("They are a {GGarou Legend{c, ",ch);
                            break;
                        }
                        else if ( myclass == CLASS_MAGE )
                        {
                            if (num2 < 1)
                                send_to_char("They are an {CAvatar Mage{c, ",ch);
                            else if (num2 < 5)
                                send_to_char("They are a {CLesser Mage{c, "
                                    ,ch);
                            else if (num2 < 10)
                                send_to_char("They are a {CMage{c, ",ch);
                            else if (num2 < 15)
                                send_to_char("They are a {CGreater Mage{c, ",ch);
                            else if (num2 < 20)
                                send_to_char("They are a {CGrand Mage{c, ",ch);
                            else if (num2 < 25)
                                send_to_char("They are a {CElder Mage{c, ",ch);
                            else if (num2 < 30)
                                send_to_char("They are a {CMaster Mage{c, ",ch);
                            else
                                send_to_char("They are a {CMage Legend{c, ",ch);
                            break;
                        }
                        else if ( myclass == CLASS_WRAITH )
                        {
                            if (num2 < 1)
                                send_to_char("They are an {DAvatar Wraith{c,",ch);
                            else if (num2 < 5)
                                send_to_char("They are a {DLesser Wraith{c, "
                                    ,ch);
                            else if (num2 < 10)
                                send_to_char("They are a {DWraith{c, ",ch);
                            else if (num2 < 15)
                                send_to_char("They are a {DGreater Wraith{c,",ch);
                            else if (num2 < 20)
                                send_to_char("They are a {DGrand Wraith{c, ",
                                    ch);
                            else if (num2 < 25)
                                send_to_char("They are a {DElder Wraith{c, ",
                                    ch);
                            else if (num2 < 30)
                                send_to_char("They are a {DMaster Wraith{c, ",
                                    ch);
                            else
                                send_to_char("They are a {DWraith Legend{c, "
                                    ,ch);
                            break;
                        }
                        else
                        {
                            if (num2 < 1)
                                send_to_char("They are an {YAvatar{c, ",ch);
                            else if (num2 < 5)
                                send_to_char("They are a {YLesser God{c, ",ch);
                            else if (num2 < 10)
                                send_to_char("They are a {YDemigod{c, ",ch);
                            else if (num2 < 15)
                                send_to_char("They are a {YGreater God{c, ",ch);
                            else if (num2 < 20)
                                send_to_char("They are a {YGrandImmortal{c, ",ch);
                            else if (num2 < 25)
                                send_to_char("They are an {YElderImmortal{c, ",ch);
                            else if (num2 < 30)
                                send_to_char("They are an {YMasterImmortal{c, ",ch);
                            else
                                send_to_char("They are an {YImmort Legend{c, ",ch);
                            break;
                        }
                    }
                case LEVEL_BUILDER:
                    send_to_char("They are a Admin/Builder, ",ch);
                    break;
                case LEVEL_QUESTMAKER:
                    send_to_char("They are a Quest Maker, ",ch);
                    break;
                case LEVEL_ENFORCER:
                    send_to_char("They are an Enforcer, ",ch);
                    break;
                case LEVEL_JUDGE:
                    send_to_char("They are a Judge, ",ch);
                    break;
                case LEVEL_HIGHJUDGE:
                    send_to_char("They are a High Judge, ",ch);
                    break;
                case LEVEL_IMPLEMENTOR:
                    send_to_char("They are an Implementor, ",ch);
                    break;
            }
        }
		num=fread_number( fp );
		if (num > 0) num2 = (2*(num / 7200)); else num2 = 0;
		sprintf(buf2,"and have been playing for %d hours.\n\r",num2);
		send_to_char(buf2,ch);
		buf5=nonfread_string(buf5, fp );
		if (buf5->len > 2)
		{
			if (IS_SET(extra, EXTRA_MARRIED))
				sprintf(buf2,"They are married to %s.\n\r",buf5->str);
			else
				sprintf(buf2,"They are engaged to %s.\n\r",buf5->str);
			send_to_char(buf2,ch);
		}
		num=fread_number( fp );
		num2=fread_number( fp );
		sprintf(buf2,"Player kills: %d, Player Deaths: %d.\n\r",num,num2);
		send_to_char(buf2,ch);
		
		num=fread_number( fp );
		num2=fread_number( fp );
		
		if (IS_IMMORTAL(ch))
		{
			sprintf(buf2,"Mob kills: %d, Mob Deaths: %d.\n\r",num,num2);
			send_to_char(buf2,ch);
		}
		send_to_char("{W--------------------------------------------------------------------------------{c\n\r",ch);
		buf5=nonfread_string(buf5, fp );
		if (buf5->len > 2)
		{
			sprintf(buf2,"Email: %s\n\r",buf5->str);
			send_to_char(buf2,ch);
			send_to_char("{W--------------------------------------------------------------------------------{x\n\r",ch);
		}
		g_string_free(buf5,TRUE);
	}
	else
	{
		bug( "Do_finger: fopen", 0 );
	}
	fclose( fp );
	fpReserve = fopen( NULL_FILE, "r" );
	return;
}

typedef struct omni_list OMNI_LIST;
struct omni_list{ 
	CHAR_DATA *ch;
	int hptemp;
	int immmatch;
	int mortmatch;
}; 


void process_omni_immortal_dlist(DESCRIPTOR_DATA *d, OMNI_LIST *omnilist)
{
		CHAR_DATA *wch,*ch;
		char buf[MAX_STRING_LENGTH];
		int wizi = 0;
		char const *incog;
		
		ch = omnilist->ch;
		
		if ( d->connected != CON_PLAYING || !can_see( ch, d->character ) )
			return;
		wch   = ( d->original != NULL ) ? d->original : d->character;
		
		if ( wch->level <= 3) return;
		
		omnilist->immmatch++;
		
                incog = "\0";

		if (IS_SET(wch->act,PLR_WIZINVIS)) 
			wizi   = wch->invis_level;
		
		if (IS_SET(wch->act,PLR_INCOG)) 
			incog  = "Y";
        else 
        	incog = "N";

		sprintf( buf, "{m%-14s{x %2d      %2d      %s     [%5d]\n\r",
			wch->name->str,
			wch->level,
			wizi,      
			incog,     
			wch->in_room->vnum);
		send_to_char( buf, ch );
		return;
}

void process_omni_mortal_dlist(DESCRIPTOR_DATA *d, OMNI_LIST *omnilist)
{
	char rpcolor[MAX_STRING_LENGTH];
	char buf[MAX_STRING_LENGTH];
	CHAR_DATA *wch,*ch;
	char const *myclass;
	char const *position;
	
	ch = omnilist->ch;
				
		if ( d->connected != CON_PLAYING || !can_see( ch, d->character ) )
			return;
		
		wch   = ( d->original != NULL ) ? d->original : d->character;
		
		if ( wch->level > 3) return;
                /* why is this 2 times?
		mortmatch++;
                */
		if ((wch->max_hit != wch->hit) && (wch->hit > 0))
			omnilist->hptemp = (wch->hit*100)/wch->max_hit;
		else if (wch->max_hit == wch->hit)
			if ( d->connected != CON_PLAYING || !can_see( ch, d->character ) )
				return;
			
		wch   = ( d->original != NULL ) ? d->original : d->character;
		
		if ( wch->level > 3) return;
		omnilist->mortmatch++;
		if ((wch->max_hit != wch->hit) && (wch->hit > 0))
			omnilist->hptemp = (wch->hit*100)/wch->max_hit;
		else if (wch->max_hit == wch->hit)
			omnilist->hptemp = 100;
		else if (wch->hit < 0)
			omnilist->hptemp = 0;
		
		myclass = "\0";
		position = "\0";
		
		if      ( IS_CLASS ( wch, CLASS_VAMPIRE ) )  myclass = " {Rvam{x";
		else if ( IS_CLASS ( wch, CLASS_WEREWOLF ) ) myclass = " {Ggar{x";
		else if ( IS_CLASS ( wch, CLASS_MAGE ) )     myclass = " {Cmag{x";
		else if ( IS_CLASS ( wch, CLASS_SWWF ) )     myclass = " {GWWF{x";
        else if ( IS_CLASS ( wch, CLASS_HUNTER ) )   myclass = " {MHtr{x";
        else if ( IS_CLASS ( wch, CLASS_WRAITH ) )   myclass = " {Dwra{x";
		else if ( wch->level < 2 )                   myclass = " {Wsub{x";
		else                                         myclass = " {wmor{x";
		
		switch ( wch->position )
		{
			case POS_DEAD:       position = "dead";    break;
			case POS_MORTAL:     position = "mort";    break;
			case POS_INCAP:      position = "incap";   break;
			case POS_STUNNED:    position = "stun";    break;
			case POS_SLEEPING:   position = "sleep";   break;
			case POS_RESTING:    position = "rest";    break;
			case POS_MEDITATING: position = "medit";   break;
			case POS_SITTING:    position = "sit";     break;
			case POS_STANDING:   position = "stand";   break;
			case POS_FIGHTING:   position = "fight";   break;
			default:             position = "unknw";   break;
		}
		
                str_cpy(rpcolor,( strlen(wch->pcdata->nature->str) < 2 && strlen(wch->pcdata->demeanor->str) < 2 ) ? (char *)D_RED : (char *)YELLOW);
		sprintf( buf, "{r%-12s{x %3d %s%2d{x  %-6s %3d%% {R%4d{x/{R%-4d{x [{C%5d{x] %9d  %d %d %-d\n\r",
			wch->name->str,
			wch->level,
			myclass,
			wch->race,
            position,
			omnilist->hptemp,
                        wch->hitroll,
                        wch->damroll,  
			wch->in_room->vnum,
			wch->exp,
			wch->pk_timer,
			wch->delay_timer,
                        wch->played /3600);
		
		send_to_char( buf, ch );
		return;
}

void do_omni ( CHAR_DATA *ch, char *argument )
{
	
	char buf[MAX_STRING_LENGTH];
	char buf2[MAX_STRING_LENGTH];
	int immmatch;
	int mortmatch;
	int hptemp;
	OMNI_LIST *omnilist;
	
	if (IS_NPC(ch)) return;
	
    /*
     * Set default arguments.
     */
	
	immmatch = 0;
	mortmatch = 0;
	hptemp = 0;
	
	
    /*
     * Parse arguments.
     */
	
	omnilist = g_new0(OMNI_LIST,1);
	omnilist->immmatch = immmatch;
	omnilist->mortmatch = mortmatch;
	omnilist->hptemp = hptemp;
	omnilist->ch = ch;
	
	sprintf( buf, "{W ---- Immortals: ----{x\n\r");
	send_to_char(buf,ch);
	sprintf( buf, "Name          Level    Wiz   Incog   [ Vnum]\n\r");
	send_to_char(buf,ch);
	
	g_slist_foreach(descriptor_list, (GFunc)process_omni_immortal_dlist,omnilist);	
/*
 * Count and output the Morts.
 */
	send_to_char("\n\r",ch);
	sprintf( buf, " \n\r{W ----  Mortals:  ----{x\n\r");
	send_to_char(buf,ch);
	sprintf( buf, "Name          Lev Cla PK  Pos   %%hps  hit/dam  [ Vnum]   .  Exp  CtWt Hours\n\r");
	send_to_char(buf,ch);
	
	g_slist_foreach(descriptor_list,(GFunc)process_omni_mortal_dlist,omnilist);
	
/*
 * Tally the counts and send the whole list out.
 */
	sprintf( buf2, "\n\r{W IMMs found: {w%d\n\r", omnilist->immmatch );
	send_to_char( buf2, ch );
	sprintf( buf2, "{WMorts found: {w%d{x\n\r", omnilist->mortmatch );
	send_to_char( buf2, ch );
	g_free(omnilist);
	return;
}

typedef struct avatar_data AVATAR_DATA;
struct avatar_data{ 
	CHAR_DATA *ch;
	int nMatch;
}; 

void process_do_avatar_dlist(DESCRIPTOR_DATA *d, AVATAR_DATA *avatardata)
{
	GString *buf;
	char char_name[MAX_STRING_LENGTH];
	char kav[MAX_STRING_LENGTH];
	char sect[MAX_STRING_LENGTH];
	char openb[5];
	char closeb[5];
	CHAR_DATA *wch,*ch;
	char const *myclass;
	
	ch = avatardata->ch;
	
	if ( d->connected != CON_PLAYING )
		return;


	if (!can_see( ch, d->character ) && (!IS_SET(ch->act, PLR_WATCHER)))
		return;

	wch   = ( d->original != NULL ) ? d->original : d->character;
	if ( wch->level != 3 ) /* Avatars only, please */
		return;
	
	
	if (!can_see(ch,wch))
		return;

		if ( !knows_char(ch, wch) )
			return;
		avatardata->nMatch++;

		/*
		 * Figure out what to print for class.
		 */ 
		myclass = " ";

	buf = g_string_new("");
		if ((IS_HEAD(wch,LOST_HEAD) || IS_EXTRA(wch,EXTRA_OSWITCH)) && wch->pcdata->chobj != NULL)
		{
			if (wch->pcdata->chobj->pIndexData->vnum == 12)
				myclass = "{m       a head{x";
			else if (wch->pcdata->chobj->pIndexData->vnum == 30005)
				myclass = "{m      a brain{x";
			else
				myclass = "{m    an object{x";
		}
		else
		{
			if (!IS_IMMORTAL(ch)) 
			{
				if ( IS_CLASS(wch, CLASS_VAMPIRE))
					myclass = "{R      Vampire{x";
				else if ( IS_CLASS(wch, CLASS_WEREWOLF))
					myclass = "{G        Garou{x";
				/* this is for spiral wwf.. I'll probly make it status/renown for rank */
				else if ( IS_CLASS(wch, CLASS_SWWF))
					myclass = "{G        Garou{x";
				else if ( IS_CLASS(wch, CLASS_MAGE))
					myclass = "{C         Mage{x";
				else if ( IS_CLASS(wch, CLASS_WRAITH))
					myclass = "{D       Wraith{x";
				else
					myclass = "{Y       Avatar{x";
			}
			else
			{
				if ( IS_CLASS(wch, CLASS_VAMPIRE))
				{
					if (wch->race <= 0 ) myclass = "{R  Avatar Vamp{x";
					else if (wch->race <= 4 ) myclass = "{R  Lesser Vamp{x";
					else if (wch->race <= 9 ) myclass = "{R      Vampire{x";
					else if (wch->race <= 14) myclass = "{R Greater Vamp{x";
					else if (wch->race <= 19) myclass = "{RGrand Vampire{x";
					else if (wch->race <= 24) myclass = "{RElder Vampire{x";
					else if (wch->race <= 29) myclass = "{RMaster Vampire{x";
					else myclass = "{RVampireLegend{x";
				}
				else if ( IS_CLASS(wch, CLASS_WEREWOLF))
				{
					if (wch->race <= 0 ) myclass = "{G Avatar Garou{x";
					else if (wch->race <= 4 ) myclass = "{G Lesser Garou{x";
					else if (wch->race <= 9 ) myclass = "{G        Garou{x";
					else if (wch->race <= 14) myclass = "{GGreater Garou{x";
					else if (wch->race <= 19) myclass = "{G  Grand Garou{x";
					else if (wch->race <= 24) myclass = "{G  Elder Garou{x";
					else if (wch->race <= 29) myclass = "{G Master Garou{x";
					else myclass = "{GGarou Legend {x";
				}
				/* this is for spiral wwf.. I'll probly make it status/renown for rank */
				else if ( IS_CLASS(wch, CLASS_SWWF))
				{
					if (wch->race <= 0 ) myclass = "{G Avatar Garou{x";
					else if (wch->race <= 4 ) myclass = "{G Lesser Garou{x";
					else if (wch->race <= 9 ) myclass = "{G        Garou{x";
					else if (wch->race <= 14) myclass = "{GGreater Garou{x";
					else if (wch->race <= 19) myclass = "{G  Grand Garou{x";
					else if (wch->race <= 24) myclass = "{G  Elder Garou{x";
					else if (wch->race <= 29) myclass = "{G Master Garou{x";
					else myclass = "{GGarou Legend {x";
				}
				else if ( IS_CLASS(wch, CLASS_MAGE))
				{
					if (wch->race <= 0 ) myclass = "{C  Avatar Mage{x";
					else if (wch->race <= 4 ) myclass = "{C  Lesser Mage{x";
					else if (wch->race <= 9 ) myclass = "{C         Mage{x";
					else if (wch->race <= 14) myclass = "{C Greater Mage{x";
					else if (wch->race <= 19) myclass = "{C   Grand Mage{x";
					else if (wch->race <= 24) myclass = "{C   Elder Mage{x";
					else if (wch->race <= 29) myclass = "{C  Master Mage{x";
					else myclass = "{G Mage Legend {x";
				}
				else if ( IS_CLASS(wch, CLASS_WRAITH))
				{
					if (wch->race <= 0 ) myclass = "{DAvatar Wraith{x";
					else if (wch->race <= 4 ) myclass = "{DLesser Wraith{x";
					else if (wch->race <= 9 ) myclass = "{D       Wraith{x";
					else if (wch->race <= 14) myclass = "{DGreaterWraith{x";
					else if (wch->race <= 19) myclass = "{D Grand Wraith{x";
					else if (wch->race <= 24) myclass = "{D Elder Wraith{x";
					else if (wch->race <= 29) myclass = "{DMaster Wraith{x";
					else myclass = "{DWraith Legend{x";
				}
				else
				{
					if (wch->race <= 0 ) myclass = "{Y       Avatar{x";
					else if (wch->race <= 4 ) myclass = "{Y   Lesser God{x";
					else if (wch->race <= 9 ) myclass = "{Y      Demigod{x";
					else if (wch->race <= 14) myclass = "{Y  Greater God{x";
					else if (wch->race <= 19) myclass = "{YGrandImmortal{x";
					else if (wch->race <= 24) myclass = "{YElderImmortal{x";
					else if (wch->race <= 24) myclass = "{YMstr Immortal{x";
					else myclass = "{YImmort Legend{x";
				}

			}
		}

		/*
		 * Format it up.
		 */
		if ( IS_CLASS(wch, CLASS_VAMPIRE))
		{ str_cpy( openb, "<{R" ); str_cpy( closeb, "{x>" ); }
		else if ( IS_CLASS(wch, CLASS_WEREWOLF))
		{ str_cpy( openb, "({G" ); str_cpy( closeb, "{x)" ); }
		else if ( IS_SWWF(wch))
		{ str_cpy( openb, "({G" ); str_cpy( closeb, "{x)" ); }
		else if ( IS_CLASS(wch,CLASS_MAGE))
		{ str_cpy( openb, "-{C" ); str_cpy( closeb, "{x-" ); }
		else
		{ str_cpy( openb, "[{Y" ); str_cpy( closeb, "{x]" ); }
		if ( ch->creature > 0 || IS_IMMORTAL( ch ))
		{
			if ( IS_CLASS(wch, CLASS_VAMPIRE) && wch->pcdata->stats[UNI_GEN] == 1 )
				sprintf( kav, " %s Master Vampire %s", openb, closeb );
			else if (IS_CLASS(wch, CLASS_WEREWOLF) && wch->pcdata->stats[UNI_GEN] == 1 )
				sprintf( kav, " %s Master Werewolf %s", openb, closeb );
			else if ( IS_CLASS(wch, CLASS_VAMPIRE) )
			{
				bool get_age = FALSE;
				char clanname[20];

				if (IS_SET(wch->special, SPC_INCONNU))
					get_age = TRUE;
				else if (IS_SET(wch->special, SPC_ANARCH))
					get_age = TRUE;
				else if (wch->pcdata->stats[UNI_GEN] == 2)
					sprintf( kav, " %sFounder of %s%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else if (IS_SET(wch->special, SPC_PRINCE))
				{        
					if (IS_SABBAT(wch))      
						sprintf( kav, " %s%s Regent%s", openb, iclan_table[wch->clan].pretty_name, closeb );
					else if (IS_CAMARILLA(wch)) 
						sprintf( kav, " %s%s Prince%s", openb, iclan_table[wch->clan].pretty_name, closeb );
					else
						sprintf( kav, " %s%s Prince%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				}
				else if (IS_SET(wch->special, SPC_PRIMOGEN))
				{
					if (IS_SABBAT(wch))
						sprintf( kav, " %s%s Priscus%s", openb, iclan_table[wch->clan].pretty_name, closeb );
					else if (IS_CAMARILLA(wch))
						sprintf( kav, " %s%s Primogen%s", openb, iclan_table[wch->clan].pretty_name, closeb );
					else 
						sprintf( kav, " %s%s Primogen%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				}
				else if (IS_SET(wch->special, SPC_CARDINAL))
				{
					if (IS_SABBAT(wch))
						sprintf( kav, " %s%s Cardinal%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				}
				else if (IS_SET(wch->special, SPC_JUSTICAR))
				{
					if (IS_SABBAT(wch))
						sprintf( kav, " %s%s Seraph%s", openb, iclan_table[wch->clan].pretty_name, closeb );
					else if (IS_CAMARILLA(wch))
						sprintf( kav, " %s%s Justicar%s", openb, iclan_table[wch->clan].pretty_name, closeb );
					else
						sprintf( kav, " %s%s Justicar%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				}
				else get_age = TRUE;
				if (get_age)
				{
					if (IS_SET(wch->special, SPC_INCONNU))
						str_cpy( clanname, "Inconnu" );
					/* else if (IS_SET(wch->special, SPC_ANARCH))
					   str_cpy( clanname, "Anarch" );  */
					str_cpy(clanname, iclan_table[wch->clan].pretty_name);
					if (wch->pcdata->stats[UNI_GEN] == 2)
						sprintf( kav, " %s%s Antediluvian%s", openb, clanname, closeb );
					else switch ( wch->pcdata->rank )
					{
						default:
							sprintf( kav, " %s%s Childe%s", openb, clanname, closeb );
							break;
						case AGE_NEONATE:
							sprintf( kav, " %s%s Neonate%s", openb, clanname, closeb );
							break;
						case AGE_ANCILLA:
							sprintf( kav, " %s%s Ancilla%s", openb, clanname, closeb );
							break;
						case AGE_ELDER:
							sprintf( kav, " %s%s Elder%s", openb, clanname, closeb );
							break;
						case AGE_METHUSELAH:
							sprintf( kav, " %s%s Methuselah%s", openb, clanname, closeb );
							break;
					}
				}
				if (IS_CAMARILLA(wch))
				{
					if (IS_CAMARILLA(ch) &&  IS_SET(wch->special, SPC_BLOODHUNT) )
						sprintf( sect, "{R%s*BLOODHUNT*{x", BLINK);
					else
						sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);
				}
				else if (IS_SABBAT(wch))
				{
					if (IS_SABBAT(ch)
							&&    IS_SET(wch->special, SPC_BLOODHUNT) )
						sprintf( sect, "{R%s*BLOODHUNT*{x", BLINK);
					else
						sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);
				}
				else if (IS_FOLLOWERS(wch))
				{
					if ( IS_FOLLOWERS(ch)
							&&    IS_SET(wch->special, SPC_BLOODHUNT) )
						sprintf( sect, "{R%s*BLOODHUNT*{x", BLINK);
					else
						sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);
				}
				else
					sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);
			}
			else if ( IS_CLASS(wch, CLASS_SWWF))
			{
				if (IS_SET(wch->special, SPC_PRINCE))
					sprintf( kav, " %s%s Alpha%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else if (IS_SET(wch->special, SPC_BETA))
					sprintf( kav, " %s%s Beta%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else if (IS_SET(wch->special, SPC_ELDER))
					sprintf( kav, " %s%s Elder%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else
					sprintf( kav, " %s%s %s%s", openb, iclan_table[wch->clan].pretty_name, get_renown_rankname(get_renown(wch)), closeb );

				sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);
			}
			else if ( IS_CLASS(wch, CLASS_WEREWOLF) )
			{
				if (IS_SET(wch->special, SPC_PRINCE))
					sprintf( kav, " %s%s Alpha%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else if (IS_SET(wch->special, SPC_BETA))
					sprintf( kav, " %s%s Beta%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else
					sprintf( kav, " %s%s%s", openb, iclan_table[wch->clan].pretty_name, closeb );

				sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);

			}
			else if ( IS_CLASS(wch, CLASS_MAGE))
			{
				if (IS_SET(wch->special, SPC_PRINCE))
					sprintf( kav, " %s%s Archmage%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else if (IS_SET(wch->special, SPC_BETA))
					sprintf( kav, " %s%s Mage%s", openb, iclan_table[wch->clan].pretty_name, closeb );
				else
					sprintf( kav, " %s%s Apprentice%s", openb, iclan_table[wch->clan].pretty_name, closeb );

				sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);

			} 
			else
			{
				str_cpy( kav, "{R{X" );
				sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);
			}
		}
		else
		{
			str_cpy( kav, "{R{X" );
			sprintf(sect,"%s%11s{x",sect_table[wch->sect].color,sect_table[wch->sect].pretty_name);
		}
		str_cpy(char_name,wch->name->str);

		if (see_attack_flag(ch,wch))
			strcat(char_name, "*");

		g_string_sprintf( buf, "{W[ %s {W] {r%12s{x {W| %s {W|{x %-29s {W[{Y%2d{W]{x\n\r", 
				myclass, char_name, sect, kav, wch->race );
		
		send_to_char(buf->str,ch);
		g_string_free(buf,TRUE);
		return;
}

void do_avatar( CHAR_DATA *ch, char *argument )
{
	char buf2[MAX_STRING_LENGTH];
	int nMatch;
	AVATAR_DATA *avatardata;
	
	if (IS_NPC(ch)) 
		return;

	/*
	 * Now show matching chars.
	 */
	nMatch = 0;
	
	avatardata = g_new0(AVATAR_DATA,1);
	avatardata->ch = ch;
	
	send_to_char( "{W--------------------------------------------------------------------------------{x\n\r", ch );
	send_to_char( "{C   Class Status       Name           Sect         Clan and Rank           PK    {x\n\r", ch );
	send_to_char( "{W--------------------------------------------------------------------------------{x\n\r", ch );
	
	g_slist_foreach(descriptor_list,(GFunc)process_do_avatar_dlist,avatardata);
	
	nMatch = avatardata->nMatch;
	
	if (nMatch == 1)
		sprintf( buf2, "{w   You are the only {Wvisible {wavatar connected on {YLurking Fear II{w!{x\n\r");
	else
		sprintf( buf2, "{w    There are a total of [ {Y%2d {w] {Wvisible {wavatars connected on {YLurking Fear II{w.{x\n\r", nMatch);
	
	send_to_char( "{W--------------------------------------------------------------------------------{x\n\r", ch );
	send_to_char( buf2, ch );
	send_to_char( "{W--------------------------------------------------------------------------------{x\n\r", ch );
	g_free(avatardata);
	return;
}

void do_roompose( CHAR_DATA *ch, char *argument)
{
	char buf[MAX_INPUT_LENGTH];
	
	if (IS_NPC(ch))
		return;
	if (strlen(argument) > 40 )
	{
		send_to_char("Your roompose must be less then 40 chars.\n\r",ch);
		return;
	}	
	sprintf(buf," %s",argument);	
	ch->pcdata->roompose = g_string_assign(ch->pcdata->roompose,buf);
	send_to_char("OK, set\n\r",ch);
	sprintf(buf,"Roompose: %s \n\r",ch->pcdata->roompose->str);
	send_to_char(buf,ch);
}


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

	if (IS_NPC(ch))
	{
		do_say(ch,"What do you want me to do? Crash the mud???");
		return;
	}
	if (!IS_SET(ch->pcdata->comm, COMM_RP))
	{
		send_to_char("You now have your RP flag set.",ch);
		SET_BIT(ch->pcdata->comm,COMM_RP);
		sprintf(buf,"%s has turned {ron{x their rpflag.",ch->name->str);
		logchan(buf, NULL, NULL,WIZ_GENERAL,0, LEVEL_IMMORTAL);
	}
	else
	{
		send_to_char("You remove your RP flag.\n\r",ch);
		REMOVE_BIT(ch->pcdata->comm,COMM_RP);
		sprintf(buf,"%s has turned {roff{x their rpflag.\n\r",ch->name->str);
		logchan(buf, NULL, NULL,WIZ_GENERAL,0, LEVEL_IMMORTAL);
	}
	return;
}

void do_petscore( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *vch;
	CHAR_DATA *victim;
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_STRING_LENGTH];
	int a_c;
	
	argument = one_argument(argument,arg);
	
	if ( (vch = get_char_world(ch,arg)) == NULL )
	{
		send_to_char("Get a petscore on who?\n\r", ch);
		return;
	}
	
	if (vch->pet_master != ch)
		return;
	
	if ( !IS_NPC(vch) )
	{
		send_to_char("Go score pets, jerky!",ch);
		return;
	}
	
	if ( !IS_PET(vch) )
	{
		send_to_char("Go score pets, jerky!",ch);
		return;
	}

	a_c = char_ac(vch);
	
	if (ch->fighting != NULL)
		victim = ch->fighting;
	else
		victim = ch;
	
	update_damcap(ch,ch);
	
	if (!IS_NPC(vch) && (IS_EXTRA(vch,EXTRA_OSWITCH) || IS_HEAD(vch,LOST_HEAD)))
	{obj_score(vch,vch->pcdata->chobj);return;}
	
	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	sprintf( buf,
		"%s.\n\r",
		vch->short_descr->str );
	send_to_char( buf, ch );
	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	sprintf( buf,
		"      Hp [ {R%6d{x/{R%-6d{x ] HitDam [ {R%4d{x/{R%-4d{x ] Exp [ {C%9d{x ]\n\r",
		vch->hit,  vch->max_hit,
		char_hitroll(vch),
		char_damroll(vch),
		vch->exp );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"    Mana [ {R%6d{x/{R%-6d{x ] DamCap [ {R%9d{x ] \n\r",
		vch->mana,  vch->max_mana,
		vch->damcap[DAM_CAP]);
	send_to_char( buf, ch );
	
	sprintf( buf,
		"    Move [ {R%6d{x/{R%-6d{x ]     Ac [ {R%9d{x ] Primal [ {C%9d{x ]\n\r",
		vch->move,  vch->max_move,
		a_c,
		vch->practice );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"   Items [ {R%6d{x/{R%-6d{x ]  Wimpy [ {R%9d{x ] Hours [ {C%9d{x ]\n\r",
		vch->carry_number, can_carry_n(vch),
		vch->wimpy,
		(get_age(vch) - 17) * 2 );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"  Weight [ {R%6d{x/{R%-7d{x]  Align [ {R%9d{x ] Gold [ {y%9d{x ]\n\r",
		vch->carry_weight, can_carry_w(vch),
		vch->alignment,
		vch->gold );
	send_to_char( buf, ch );
	
	sprintf( buf,
		"{w--------------------------------------------------------------------------------{x\n\r"),
	send_to_char( buf, ch );
	
	switch ( vch->position )
	{
		case POS_DEAD:
			send_to_char( "They are DEAD!!\n\r",		ch );
			break;
		case POS_MORTAL:
			send_to_char( "They are mortally wounded.\n\r",	ch );
			break;
		case POS_INCAP:
			send_to_char( "They are incapacitated.\n\r",	ch );
			break;
		case POS_STUNNED:
			send_to_char( "They are stunned.\n\r",		ch );
			break;
		case POS_SLEEPING:
			send_to_char( "They are sleeping.\n\r",		ch );
			break;
		case POS_RESTING:
			send_to_char( "They are resting.\n\r",		ch );
			break;
		case POS_MEDITATING:
			send_to_char( "They are meditating.\n\r",	ch );
			break;
		case POS_SITTING:
			send_to_char( "They are sitting.\n\r",		ch );
			break;
		case POS_STANDING:
			send_to_char( "They are standing.\n\r",		ch );
			break;
		case POS_FIGHTING:
			send_to_char( "They are fighting.\n\r",		ch );
			break;
	}
	return;
}