dawn/notes/
dawn/src/
dawn/src/docs/
/**************************************************************************/
// rp.cpp - code dealing with rp and rp support
/***************************************************************************
 * The Dawn of Time v1.69r (c)1997-2004 Michael Garratt                    *
 * >> A number of people have contributed to the Dawn codebase, with the   *
 *    majority of code written by Michael Garratt - www.dawnoftime.org     *
 * >> To use this source code, you must fully comply with the dawn license *
 *    in licenses.txt... In particular, you may not remove this copyright  *
 *    notice.                                                              *
 **************************************************************************/
#include "include.h"
#include "security.h"
#include "interp.h"
#include "olc.h"
#include "ictime.h"

// Locals
void show_rpsheet( char_data *ch, char_data *v);

/**************************************************************************/
void do_metric( char_data *ch, char * )
{
	if ( HAS_CONFIG( ch, CONFIG_METRIC )) {
		ch->println("You will now see your height and weight in Imperial.");
		REMOVE_CONFIG( ch, CONFIG_METRIC );
	} else {
		SET_CONFIG( ch, CONFIG_METRIC );
		ch->println("You will now see your height and weight in Metric.");
	}
}

/**************************************************************************/
void do_rpsupport( char_data *ch, char *argument )
{
	char arg[MIL];
	char_data *victim;
	
    if (!IS_ADMIN(ch)
        && !IS_SET(TRUE_CH(ch)->pcdata->council, COUNCIL_HEADRP))
	{
        ch->println("RP support can only be used by admin or headrp.");
        return;		
	}

    one_argument( argument, arg );
    
    if( IS_NULLSTR(arg)){
        ch->println("Set as/turn off rpsupport on whom?");
        return;
    }
    if (( victim = get_whovis_player_world( ch, arg )) == NULL ){
        ch->printlnf("Can't find any player '%s' in the game.", arg);
        return;
    }

    if ( HAS_CONFIG(victim, CONFIG_RP_SUPPORT ))
    {
        REMOVE_CONFIG(victim, CONFIG_RP_SUPPORT);
        ch->printlnf("RP support turned off for %s.",
            PERS(victim, ch));
	}else{
        SET_CONFIG(victim, CONFIG_RP_SUPPORT);
        ch->printlnf("RP support turned on for %s.",
            PERS(victim, ch));
    }

    save_char_obj( victim );
    return;
}

/**************************************************************************/
void do_rp_obj_load( char_data *ch, char *argument )
{
	OBJ_INDEX_DATA	*pObjIndex;
	OBJ_DATA		*pObj;
	int				wear;

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

	if (( pObjIndex = get_obj_index( OBJ_VNUM_RP_ITEM )) == NULL ) {
		ch->println("RP item non-existant, please report this with a note to admin.");
		return;
	}

	pObj = create_object( pObjIndex);
	ch->println("rpobjload: You've created an RP item and it's in your inventory.");

	if ( !IS_NULLSTR( argument ))
	{
		wear = flag_value( wear_flags, argument );
		if ( wear == NO_FLAG )
		{
			ch->printlnf( "'%s' is not a valid wear location. Item reverted to standard take & hold.", argument );
			pObj->wear_flags = OBJWEAR_TAKE|OBJWEAR_HOLD;
		}
		else
		{
			pObj->wear_flags = OBJWEAR_TAKE|wear;
			ch->printlnf( "RP item's wear loc are now: %s.", flag_string( wear_flags, pObj->wear_flags ));
		}
	}
	else
	{
		pObj->wear_flags = OBJWEAR_TAKE|OBJWEAR_HOLD;
	}

	obj_to_char( pObj, ch );
}

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

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

	if(c_str_len(argument)==-1)
		return;

	if ((IS_IMMORTAL(ch) || IS_RP_SUPPORT(ch)))
	{
		argument = one_argument( argument, arg1 );

		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet surname <player> <name>");
			return;
		}

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

		if ( str_len(argument) > 20)
		{
			ch->println("Surname must be 20 characters or less.");
			return;
		}


		if (!str_cmp( argument, "none" ))
		{
	        free_string( victim->pcdata->surname );
			ch->printlnf("%s's surname has been cleared.", victim->name );
			victim->println("Your surname has been cleared.");
			return;
		}

		free_string( victim->pcdata->surname );
        victim->pcdata->surname = str_dup( argument );
		ch->printlnf("%s's surname has been changed to %s.",
			victim->name, victim->pcdata->surname );
		victim->printlnf("Your surname has been changed to %s.",
			victim->pcdata->surname );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your surname once you have been letgained.");
		ch->println(" Send a note to rpsupport if you really need it changed.");
		ch->println(" Please send the note only if you have a really good reason");
		ch->println(" to have it changed, ie marriage, typo, etc...");
		return;
	}
*/
	if ( IS_NULLSTR( argument ))
	{
		ch->println("Syntax: rpsheet surname <name>");
		return;
	}

	if ( str_len(argument) > 20)
	{
		ch->println("Surname must be 20 characters or less.");
		return;
	}

	free_string( ch->pcdata->surname );
	ch->pcdata->surname = str_dup( argument );
	ch->printlnf("Your surname is now %s.\r\nBe aware that you cannot set this after being letgained.",
		ch->pcdata->surname );
	return;
}

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

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

	if(c_str_len(argument)==-1)
		return;

	if ((IS_IMMORTAL(ch) || IS_RP_SUPPORT(ch)))
	{
		argument = one_argument( argument, arg1 );

		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet crest <player> <crest>");
			return;
		}

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

		if ( str_len(argument) > 40)
		{
			ch->println("Crest must be 40 characters or less.");
			return;
		}


		if (!str_cmp( argument, "none" ))
		{
	        free_string( victim->pcdata->crest );
			ch->printlnf("%s's crest has been cleared.", victim->name );
			victim->println("Your crest has been cleared.");
			return;
		}

		free_string( victim->pcdata->crest );
        victim->pcdata->crest = str_dup( argument );
		ch->printlnf("%s's crest has been changed to %s.",
			victim->name, victim->pcdata->crest );
		victim->printlnf("Your crest has been changed to %s.",
			victim->pcdata->crest );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your crest once you have been letgained.");
		ch->println(" Send a note to rpsupport if you really need it changed.");
		ch->println(" Please send the note only if you have a really good reason");
		ch->println(" to have it changed, ie marriage, typo, etc...");
		return;
	}
*/
	if ( IS_NULLSTR( argument ))
	{
		ch->println("Syntax: rpsheet crest <symbol>");
		return;
	}

	if ( str_len(argument) > 40)
	{
		ch->println("Crest must be 40 characters or less.");
		return;
	}

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


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

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

	if(c_str_len(argument)==-1)
		return;

	if (IS_IMMORTAL(ch))
	{
		argument = one_argument( argument, arg1 );

		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet birthplace <player> <name>");
			return;
		}

		if (( victim = get_char_world( ch, arg1 )) == NULL )
		{
			ch->println("They aren't here.");
			return;
		}
		if ( IS_NPC( victim ))
		{
			ch->println("Players only.");
			return;
		}
		
		if ( str_len(argument) > 20)
		{
			ch->println("Birthplace must be 20 characters or less.");
			return;
		}

		free_string( victim->pcdata->birthplace );
        victim->pcdata->birthplace = str_dup( argument );
		ch->printlnf("%s's birthplace is now %s.",
			victim->name, argument );
		victim->printlnf("Your birthplace is now %s.",
			argument );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your birthplace once you have been letgained.");
		ch->println(" Send a note to imm if you really need it changed.  This is");
		ch->println(" something we don't change unless it's an extreme case since");
		ch->println(" where you are born can never really change.");
		return;
	}
*/
	if ( IS_NULLSTR( argument ))
	{
		ch->println("Syntax: rpsheet birthplace <place>");
		return;
	}

	if ( str_len( argument ) > 20 )
	{
		ch->println("Birthplace must be 20 characters or less.");
		return;
	}



	free_string( ch->pcdata->birthplace );
	ch->pcdata->birthplace = str_dup( argument );
	ch->printlnf("Your birthplace is now %s.\r\nBe aware that you cannot set this after being letgained.",
		argument );
	return;
}

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

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

	if(c_str_len(argument)==-1)
		return;

	if (IS_IMMORTAL(ch))
	{
		argument = one_argument( argument, arg1 );

		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet hair <player> <colour>");
			return;
		}

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

		if ( str_len(argument) > 12)
		{
			ch->println("Colour must be 12 characters or less.");
			return;
		}

		free_string( victim->pcdata->haircolour );
        victim->pcdata->haircolour = str_dup( argument );
		ch->printlnf("%s's hair colour has been changed to %s.",
			victim->name, argument );
		victim->printlnf("Your hair colour has been changed to %s.",
			argument );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your hair colour once you have been letgained.");
		ch->println(" Send a note to rp and support if you really need it changed.");
		return;
	}
*/
	if ( IS_NULLSTR( argument ))
	{
		ch->println("Syntax: rpsheet hair <colour>");
		return;
	}

	if ( str_len(argument) > 12)
	{
		ch->println("Colour must be 12 characters or less.");
		return;
	}

	free_string( ch->pcdata->haircolour );
	ch->pcdata->haircolour = str_dup( argument );
	ch->printlnf("Your hair colour is now %s.\r\nBe aware that you cannot set this after being letgained.",
		argument );
	return;
}

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

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

	if(c_str_len(argument)==-1)
		return;

	if (IS_IMMORTAL(ch))
	{
		argument = one_argument( argument, arg1 );

		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet eyes <player> <colour>");
			return;
		}

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

		if ( str_len(argument) > 12)
		{
			ch->println("Colour must be 12 characters or less.");
			return;
		}

		free_string( victim->pcdata->eyecolour );
        victim->pcdata->eyecolour = str_dup( argument );
		ch->printlnf("%s's eye colour has been changed to %s.",
			victim->name, argument );
		victim->printlnf("Your eye colour has been changed to %s.",
			argument );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your eye colour once you have been letgained.");
		ch->println(" Send a note to rp and support if you really need it changed.");
		ch->println(" This is unlikely to be changed unless there is a spectacular");
		ch->println(" and cataclysmic character rp event.");
		return;
	}
*/
	if ( IS_NULLSTR( argument ))
	{
		ch->println("Syntax: rpsheet eyes <colour>");
		return;
	}

	if ( str_len(argument) > 12)
	{
		ch->println("Colour must be 12 characters or less.");
		return;
	}

	free_string( ch->pcdata->eyecolour );
	ch->pcdata->eyecolour = str_dup( argument );
	ch->printlnf("Your eye colour is now %s.\r\nBe aware that you cannot set this after being letgained.",
		argument );
	return;
}

/**************************************************************************/
void do_height( char_data *ch, char *argument )
{
	char		arg1[MIL];
	char_data	*victim;
	int			value;

	argument = one_argument( argument, arg1 );

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

	if (IS_IMMORTAL(ch))
	{
		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet height <player> <inches>");
			ch->println("  Imms can go beyond the regular racial limitations,");
			ch->println("  but make sure it is realistic, we don't want to go,");
			ch->println("  back and change it once it's set.");
			ch->println("  `=Chelp RACIAL-WEIGHT/HEIGHT`x");
			return;
		}

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

		value = atoi(argument);

        victim->pcdata->height = value;
		ch->printlnf("%s's height been changed to %d inches.",
			victim->name, value );
		victim->printlnf("Your height has been changed to %d inches.",
			value );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your height once you have been letgained. Send");
		ch->println(" a note to rp and support if you really need it changed.");
		ch->println(" Your reason must have a strong IC basis.");
		return;
	}
*/
	if ( IS_NULLSTR( arg1 ))
	{
		ch->println("Syntax: rpsheet height <inches>");
		return;
	}

	value = atoi( arg1 );
	
	if ( value < race_table[ch->race]->min_height
	||   value > race_table[ch->race]->max_height )
	{
		ch->printlnf("Invalid height value.  Choose a number between %d and %d.",
			race_table[ch->race]->min_height,
			race_table[ch->race]->max_height);
		ch->println(" If you feel your character should be outside of these values,");
		ch->println(" send a note to support and to rp explaining your reasons.");
		return;
	}

	ch->pcdata->height = value;
	ch->printlnf("Your height is now %d inches.\r\nBe aware that you cannot set this after being letgained.",
		value );
	return;
}

/**************************************************************************/
void do_weight( char_data *ch, char *argument )
{
	char		arg1[MIL];
	char_data	*victim;
	int			value;

	argument = one_argument( argument, arg1 );

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


	if (IS_IMMORTAL(ch))
	{
		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet weight <player> <pounds>");
			ch->println("  Imms can go beyond the regular racial limitations,");
			ch->println("  but make sure it is realistic, we don't want to go,");
			ch->println("  back and change it once it's set.");
			ch->println("  `=Chelp RACIAL-WEIGHT/HEIGHT`x");
			return;
		}

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

		value = atoi(argument);

        victim->pcdata->weight = value;
		ch->printlnf("%s's weight been changed to %d pounds.",
			victim->name, value );
		victim->printlnf("Your weight has been changed to %d pounds.",
			value );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your weight once you have been letgained. Send");
		ch->println(" a note to rp and support if you really need it changed.");
		ch->println(" Your reason must have a strong IC basis.");
		return;
	}
*/
	if ( IS_NULLSTR( arg1 ))
	{
		ch->println("Syntax: rpsheet weight <pounds>");
		return;
	}

	value = atoi( arg1 );
	
	if ( value < race_table[ch->race]->min_weight
	||   value > race_table[ch->race]->max_weight )
	{
		ch->printlnf("Invalid weight value.  Choose a number between %d and %d.",
			race_table[ch->race]->min_weight,
			race_table[ch->race]->max_weight);
		ch->println(" If you feel your character should be outside of these values,");
		ch->println(" send a note to support and to rp explaining your reasons.");
		return;
	}

	ch->pcdata->weight = value;
	ch->printlnf("Your weight is now %d pounds.\r\nBe aware that you cannot set this after being letgained.",
		value );
	return;
}

/**************************************************************************/
void do_traits( char_data *ch, char *argument )
{
	char		arg1[MIL];
	char_data	*victim;
	int			value;

	if(c_str_len(argument)==-1)
		return;

	argument = one_argument( argument, arg1 );

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

	if ((IS_IMMORTAL(ch) || IS_RP_SUPPORT(ch)))
	{
		char		arg2[MIL];

		if ( IS_NULLSTR( arg1 ) || IS_NULLSTR( argument ))
		{
			ch->println("Syntax: rpsheet trait <player> <1-9> <trait>");
			return;
		}

		argument = one_argument( argument, arg2 );
		value = atoi( arg2 );

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

		if ( value < 1 || value > 9 )
		{
			ch->println("Syntax: `=Crpsheet trait <player> <1-9> <trait>`x");
			return;
		}

		if ( str_len(argument) > 60 )
		{
			ch->println("Please keep the trait under 60 characters.");
			return;
		}

		free_string( victim->pcdata->trait[value-1] );
        victim->pcdata->trait[value-1] = str_dup( argument );
		ch->printlnf("%s's trait #%d is `y%s`x.",
			victim->name, value, argument );
		victim->printlnf("Your trait #%d is now `y%s`x.",
			value, argument );
		return;
	}

/*	if ( IS_LETGAINED( ch ))
	{
		ch->println("You cannot set your traits once you have been letgained.");
		ch->println(" Send a note to imm and rpsupport if you really need it changed.");
		ch->println(" Please include some good RP reasons to reflect this change.");
		return;
	}
*/

	value = atoi( arg1 );

	if ( value < 1 || value > 9 )
	{
		ch->println("Syntax: `=Crpsheet trait <1-9> <trait>`x");
		return;
	}


	if ( str_len( argument ) > 60 )
	{
		ch->print("Please keep your trait description under 60 characters.r\n");
		return;
	}


	free_string( ch->pcdata->trait[value-1] );
	ch->pcdata->trait[value-1] = str_dup( argument );
	ch->printlnf("Your trait #%d now `y%s`x.\r\nBe aware that you cannot change this after being letgained.",
		value, argument );
	return;
}

/**************************************************************************/
void extract_char_from_char_list(char_data *ch);
/**************************************************************************/
void do_rpsheet( char_data *ch, char *argument )
{
	char arg[MIL];
	char arg1[MIL];
	char buf[MIL];
	char_data *victim;

	if(c_str_len(argument)==-1){
		ch->println("no newlines colour codes can be used with the rpsheet command.");
		return;
	}

	argument = one_argument( argument, arg1 );
	sprintf( buf, "%s", argument );
	argument = one_argument( argument, arg );

	if(!IS_NULLSTR(arg1)){
		if(!str_prefix( arg1, "view" )) 		
		{ 
			// immortal version of rpsheet - can view offline players
			if(IS_IMMORTAL(ch))
			{
				if(IS_NULLSTR(arg)){
					show_rpsheet(ch, ch);
					return;
				}

				victim=get_whovis_player_world( ch, arg );
				if(victim){ 
					// redirect them to the online player
					show_rpsheet(ch, victim);
					return;
				}

				connection_data d;
				memset(&d, 0, sizeof(d));
				d.make_connected_socket_invalid();

				// attempt to load the pfile
				bool pfile_loaded_okay= load_char_obj( &d, arg);

				if(!pfile_loaded_okay || !d.character){
					ch->printlnf("Couldn't load pfile '%s'.", arg);
					return;
				}

				// pfile loaded, clean up the pointer relationship
				victim=d.character;
				victim->desc=NULL;
				if(victim->pet){
					// remove pets from the char_list 
					extract_char_from_char_list(victim->pet); 
				}

				if(str_cmp(ch->name, victim->name)){
					ch->println("Player is offline, displaying offline rpsheet:");
				}

				// display the rpsheet
				show_rpsheet(ch, victim);

				// deallocate the loaded character data
				if(victim->pet){
					free_char( victim->pet );
				}
				free_char( victim);
				return;
			}

			// rp support can view any online players
			if(IS_RP_SUPPORT(ch) && !IS_NULLSTR(arg))
			{
				if (( victim = get_char_world( ch, arg )) == NULL )
				{
					ch->println("They aren't here.");
					return;
				}
				if ( IS_NPC( victim ))
				{
					ch->println("Players only!");
					return;
				}
			}else{
				victim=ch;
			}
   			show_rpsheet(ch, victim);
			return;
		}

		if(!str_prefix( arg1, "crest" ))
		{
			do_crest( ch, buf );
			return;
		}

		if (!str_prefix( arg1, "surname" ))
		{
			do_surname( ch, buf );
			return;
		}

		if (!str_prefix( arg1, "hair" ))
		{
			do_haircolour( ch, buf );
			return;
		}

		if (!str_prefix( arg1, "eyes" ))
		{
			do_eyecolour( ch, buf );
			return;
		}

		if (!str_prefix( arg1, "height" ))
		{
			do_height( ch, buf );
			return;
		}

		if (!str_prefix( arg1, "weight" ))
		{
			do_weight( ch, buf );
			return;
		}

		if (!str_prefix( arg1, "birthplace" ))
		{
			do_birthplace( ch, buf );
			return;
		}

		if (!str_prefix( arg1, "trait" ))
		{
			do_traits( ch, buf );
			return;
		}
	}

	if (IS_IMMORTAL(ch))
	{
		ch->println("`YRPSHEET COMMANDS\r\n");
		ch->println("  `Bview        `x<player>   (note: player can be offline)");
		ch->println("  `Beyes        `x<player> <colour>");
		ch->println("  `Bhair        `x<player> <colour>");
		ch->println("  `Bheight      `x<player> <inches>");
		ch->println("  `Bweight      `x<player> <pounds>");
		ch->println("  `Bbirthplace  `x<player> <location>");
		ch->println("  `Bsurname     `x<player> <name>");
		ch->println("  `Btrait       `x<player> <1-9> <trait>");
		ch->println("  `Bcrest       `x<player> <symbol>");
		return;
	}

	if ( IS_RP_SUPPORT( ch ))
	{
		ch->println("`YRPSHEET COMMANDS\r\n");
		ch->println("  `Bview    `x<player>");
		ch->println("  `Bsurname `x<player>");
		ch->println("  `Bcrest   `x<player> <symbol>");
		ch->println("  `Btrait   `x<player> <1-9> <trait>");
		return;
	}

	ch->println("`YRPSHEET COMMANDS\r\n");
	ch->println("  `Bview       `x- displays your rpsheet");
	ch->println("  `Beyes       `x- sets the colour of your eyes");
	ch->println("  `Bhair       `x- sets the colour of your hair");
	ch->println("  `Bheight     `x- sets your height in inches");
	ch->println("  `Bweight     `x- sets your weight in pounds");
	ch->println("  `Bbirthplace `x- sets the place of your birth");
	ch->println("  `Bsurname    `x- sets your last name");
	ch->println("  `Btrait      `x- sets your physical and personality traits");
	ch->println("  `Bcrest      `x- sets your character's family symbol");
	ch->println("  `B           `x- once crest is set, it cannot be changed! get it right");
	ch->println("  `B           `x- send a note to rpsupport and/or imm to get it changed");
}
/**************************************************************************/
void show_rpsheet( char_data *ch, char_data *v)
{
	int dsec, icyear, i;
	int feet, inches;
    double cm, kg;

	dsec	= abs((int)(v->pcdata->birthdate - current_time)); // number of IRL seconds between the 2 times
	icyear	= (dsec/ICTIME_IRLSECS_PER_YEAR)+v->pcdata->birthyear_modifier;

	if ( !v->pcdata->height )
		v->pcdata->height = race_table[v->race]->min_height;
	
	if ( !v->pcdata->weight )
		v->pcdata->weight = race_table[v->race]->min_weight;


	inches	= v->pcdata->height % 12;
	feet	= v->pcdata->height / 12;
	cm		= v->pcdata->height * 2.54;
	kg		= v->pcdata->weight * .454;

	ch->println("`b _____________________________________________________________________________");
	ch->println("`b|\\`B___________________________________________________________________________`b/|");
	ch->println("`b|`B|                                                                           `B|`b|");
	ch->printlnf("`b|`B|`x  Name: `W%-60s       `B|`b|",capitalize(v->name));

	ch->printlnf("`b|`B|`x  Surname: `W%-20s          `xBirthplace: `r%-20s  `B|`b|",
		TRUE_CH(v)->pcdata->surname ? TRUE_CH(v)->pcdata->surname : "(none)" ,
		TRUE_CH(v)->pcdata->birthplace ? TRUE_CH(v)->pcdata->birthplace : "(unset)" );
	if(v->pcdata->birthdate){
		ch->printlnf("`b|`B|`x  Born:  `y%s `x  Age:  `y%-44s  `B|`b|",
			str_width( get_shorticdate_from_time(v->pcdata->birthdate, 
						"`#%d`S/`^%d`S/`&%d", v->pcdata->birthyear_modifier),11),
			get_ictimediff(v->pcdata->birthdate, current_time, -v->pcdata->birthyear_modifier));
		
	}else{
		ch->printlnf("`b|`B|`x  Born:  `y%s `x  Age:  `y%-44s  `B|`b|",
			str_width(get_shorticdate_from_time(
				v->id - (17*ICTIME_IRLSECS_PER_YEAR), 
					"`#%d`S/`^%d`S/`&%d", 0),11),
		get_ictimediff(v->id-(17*ICTIME_IRLSECS_PER_YEAR), 
			current_time, 0));
	}	
	ch->println("`b|`B|                                                                           `B|`b|");

	if ( HAS_CONFIG( ch, CONFIG_METRIC ))
	{
		ch->printlnf("`b|`B|`x  Hair: `W%-12s`x   Eyes: `W%-12s`xHeight: `W%d cm    `xWeight: `W%-4dkg  `B|`b|",
			TRUE_CH(v)->pcdata->haircolour ? capitalize(TRUE_CH(v)->pcdata->haircolour ) : "(unset)",
			TRUE_CH(v)->pcdata->eyecolour ? capitalize(TRUE_CH(v)->pcdata->eyecolour ) : "(unset)",
			(int)cm,
			(int)kg );
	}
	else
	{
		ch->printlnf("`b|`B|`x  Hair: `W%-12s`x   Eyes: `W%-12s`xHeight: `W%d'%d\"    `xWeight: `W%-4d lbs  `B|`b|",
			TRUE_CH(v)->pcdata->haircolour ? capitalize(TRUE_CH(v)->pcdata->haircolour ) : "(unset)",
			TRUE_CH(v)->pcdata->eyecolour ? capitalize(TRUE_CH(v)->pcdata->eyecolour ) : "(unset)",
			feet,
			inches,
			v->pcdata->weight );
	}
	ch->printlnf("`b|`B|`x  Family Crest: `W%-40s                   `B|`b|",
		TRUE_CH(v)->pcdata->crest ? capitalize(TRUE_CH(v)->pcdata->crest) : "(none)" );
	ch->println("`b|`B|___________________________________________________________________________`B|`b|");
	ch->println("`b|`B|                                                                           `B|`b|");	
	ch->println("`b|`B| `CPersonality Traits                                                        `B|`b|");
	ch->println("`b|`B|                                                                           `B|`b|");	
	for ( i=0; i < 6; i++ )
	{
		ch->printlnf("`b|`B| `C%d. `W%-60s           `B|`b|",
		i+1,
		v->pcdata->trait[i] ? capitalize( v->pcdata->trait[i] ) : "" );
	}
	ch->println("`b|`B|                                                                           `B|`b|");
	ch->println("`b|`B|___________________________________________________________________________`B|`b|");
	ch->println("`b|`B|                                                                           `B|`b|");
	ch->println("`b|`B| `CPhysical Traits                                                           `B|`b|");
	ch->println("`b|`B|                                                                           `B|`b|");
	for ( i=6; i < 9; i++ )
	{
		ch->printlnf("`b|`B| `C%d. `W%-60s           `B|`b|",
		i+1,
		v->pcdata->trait[i] ? capitalize( v->pcdata->trait[i] ) : "" );
	}
	ch->println("`b|`B|___________________________________________________________________________`B|`b|");
	ch->println("`b|/___________________________________________________________________________`b\\|");
	return;


}

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

    // unswitched mobs can't send rptells
    if (IS_UNSWITCHED_MOB(ch))
    {
		return;
    }

	if (( !IS_IMMORTAL(ch) || !IS_RP_SUPPORT(ch)))
	{
		do_huh(ch,"");
		return;
	}

	// Check if they're being ordered to do this
	if ( IS_SET( ch->dyn, DYN_IS_BEING_ORDERED ))
	{
		if ( ch->master )
			ch->master->println( "Not going to happen." );
		return;
	}

    argument = one_argument( argument, arg );

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

	if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL
		||  IS_NPC(victim) ) 
	{
		ch->println( "They aren't here." );
		return;
	}
	//Put in these lines from do_tell in because it made some sense. <shrug>
	if (victim->controlling && victim->controlling->desc)
	{
		victim=victim->controlling;
	}
	
	if(ch==victim)
	{
		ch->println( "No point in sending an rptell to yourself." );
		return;
	};

	//Also from do_tell, looked good to put.
	if ( victim->desc == NULL)
	{
		act("$N seems to have misplaced $S link...try again later.", ch,NULL,victim,TO_CHAR);
		sprintf(buf,"An RP support member tells you '%s'\r\n`x", argument);
		buf[0] = UPPER(buf[0]);
		add_buf(victim->pcdata->buffer,buf);
		return;
	}

	if (IS_SET(victim->comm,COMM_AFK))
	{
		if (IS_NPC(victim))
		{
			act("$E is AFK, and not receiving tells.",ch,NULL,victim,TO_CHAR);
			return;
		}

		act("$E is AFK, but your tell will go through when $E returns.", ch,NULL,victim,TO_CHAR);
		
		sprintf(buf,"An RP support member tells you '%s'\r\n", argument );
		buf[0] = UPPER(buf[0]);
		add_buf(victim->pcdata->buffer,buf);
    
		victim->printlnf( "An RP support member just tried to tell you '%s' (you are marked as afk)`x", argument);
		return;
	}

	if(!IS_NPC(ch))
		ch->pcdata->did_ooc=true;

	//Send the tell to the player.
	victim->printlnf("`y%s tells you '%s'"
		"(you can use rpreply to talk back if you need to)`x\r\n", 
		IS_IMMORTAL(victim)?PERS(ch,victim):"An RP support member", argument );

	//Start the broadcast of the rptell to all rpsupport
	for ( nch = player_list; nch; nch = nch->next_player )
	{
		if (TRUE_CH(ch)==nch)
		{
			ch->printlnf( "`MYou tell %s '%s`M'", victim->name, argument);
			continue;
		}

		// dont see both the rp broadcast and the personal message
		if(	nch==victim)
		{
			continue;
		};

		nvictim=nch;
		// rptalk going thru switch
		if (nvictim->controlling && nvictim->controlling->desc)
			nvictim=nvictim->controlling;

		if (IS_RP_SUPPORT(nch))
		{
			if (IS_IMMORTAL(nch))
			{
				nvictim->printlnf( "`M<%s rptells %s>: '%s`M'`x", 
					TRUE_CH(ch)->name, victim->name, argument);
			}else{
				nvictim->printlnf( "`M<An RP support member tells %s>: '%s`M'`x", victim->name, argument);
			}
		}
	}
	return;
}
/**************************************************************************/
void do_rpreply( char_data *ch, char *argument )
{
	char_data *nch, *victim;

    // unswitched mobs can't send nreplies
    if (IS_UNSWITCHED_MOB(ch))
    {
		return;
    }

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

	//Start the broadcast of the rpreply to all rpsupport
    for ( nch = player_list; nch; nch = nch->next_player )
    {
		if (TRUE_CH(ch)==nch)
		{
			ch->printlnf( "`MYou rpreply '%s`M'", argument);
			continue;
		}

		victim=nch;

		// rpreply going thru switch
		if (victim->controlling && victim->controlling->desc)
			victim=victim->controlling;

		if ( IS_RP_SUPPORT(nch))
		{
			victim->printlnf( "`M<%s rpreplies> '%s`M'`x",
					TRUE_CH(ch)->name, argument);
		}
	}
	return;
}

/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/