/*****************************************************************************
* DikuMUD (C) 1990, 1991 by: *
* Sebastian Hammer, Michael Seifert, Hans Henrik Staefeldt, Tom Madsen, *
* and Katja Nyboe. *
*---------------------------------------------------------------------------*
* MERC 2.1 (C) 1992, 1993 by: *
* Michael Chastain, Michael Quan, and Mitchell Tse. *
*---------------------------------------------------------------------------*
* SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by: Derek Snider. *
* Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, Swordbearer, *
* gorog, Grishnakh, Nivek, Tricops, and Fireblade. *
*---------------------------------------------------------------------------*
* SMAUG 1.7 FUSS by: Samson and others of the SMAUG community. *
* Their contributions are greatly appreciated. *
*---------------------------------------------------------------------------*
* LoP (C) 2006, 2007, 2008 by: the LoP team. *
*---------------------------------------------------------------------------*
* Commands for personal player settings/statictics *
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include "h/mud.h"
char *show_big_nums( int millions, int amount );
char *default_prompt( CHAR_DATA *ch );
char *default_fprompt( CHAR_DATA *ch );
CMDF( do_speed )
{
int size;
if( !argument || argument[0] == '\0' )
{
send_to_char( "What would you like to set your speed to? Valid Range is 1 - 32.\r\n", ch );
return;
}
if( ( size = atoi( argument ) ) < 1 || size > 32 )
{
send_to_char( "Invalid speed. Valid Range is 1 - 32.\r\n", ch );
return;
}
ch->pcdata->speed = size;
if( ch->desc )
ch->desc->speed = ch->pcdata->speed;
ch_printf( ch, "Your speed is now set to %d which is %dBytes.\r\n", ch->pcdata->speed, ( 128 * ch->pcdata->speed ) );
}
/* This part will take the stat and see if it should get an increase or not */
void handle_stat( CHAR_DATA *ch, short stat, bool silence, short chance )
{
int difck;
short max;
if( stat < 0 || stat >= STAT_MAX )
{
bug( "%s: trying to increase stat [%d] that isn't there?", __FUNCTION__, stat );
return;
}
max = UMIN( ch->level, ( ( is_npc( ch ) || is_immortal( ch ) ) ? ( MAX_LEVEL + 25 ) : MAX_LEVEL ) );
/* Race max */
if( !is_npc( ch ) && !is_immortal( ch ) && race_table[ch->race] )
max = UMIN( max, race_table[ch->race]->max_stats[stat] );
if( ch->perm_stats[stat] >= max )
{
if( !silence )
ch_printf( ch, "You're already at your max %s for now.\r\n", stattypes[stat] );
return;
}
difck = ( max - ch->perm_stats[stat] ); /* How much are they lacking from possible max */
if( number_percent( ) >= difck ) /* If above max continue, if max is 100 and they have 15, 85% chance of getting past this part */
return;
if( number_percent( ) > chance ) /* Always a good chance of it failing to make it hard on them */
return;
ch->perm_stats[stat] = URANGE( 1, ( ch->perm_stats[stat] + 1 ), max );
/* Increase other things when stats are increased */
if( stat == STAT_CON )
{
ch->max_hit = UMAX( ch->max_hit, ( ch->max_hit + 5 ) );
ch->max_move = UMAX( ch->max_move, ( ch->max_move + 1 ) );
if( is_vampire( ch ) )
ch->max_mana = UMAX( ch->max_mana, ( ch->max_mana + 2 ) );
}
if( stat == STAT_DEX )
{
ch->max_move = UMAX( ch->max_move, ( ch->max_move + 5 ) );
if( is_vampire( ch ) )
ch->max_mana = UMAX( ch->max_mana, ( ch->max_mana + 1 ) );
}
if( stat == STAT_INT && !is_vampire( ch ) )
ch->max_mana = UMAX( ch->max_mana, ( ch->max_mana + 2 ) );
if( stat == STAT_WIS && !is_vampire( ch ) )
ch->max_mana = UMAX( ch->max_mana, ( ch->max_mana + 1 ) );
if( stat == STAT_STR )
ch->max_hit = UMAX( ch->max_hit, ( ch->max_hit + 2 ) );
if( stat == STAT_LCK )
{
if( number_percent( ) > 80 )
ch->max_hit = UMAX( ch->max_hit, ( ch->max_hit + 2 ) );
if( number_percent( ) > 60 )
ch->max_move = UMAX( ch->max_move, ( ch->max_move + 1 ) );
if( number_percent( ) > 50 )
ch->max_mana = UMAX( ch->max_mana, ( ch->max_mana + 1 ) );
}
ch_printf( ch, "You're now up to %d %s.\r\n", ch->perm_stats[stat], stattypes[stat] );
}
CMDF( do_pushup )
{
int moveloss = 10;
switch( ch->substate )
{
default:
if( is_npc( ch ) && IS_AFFECTED( ch, AFF_CHARM ) )
{
send_to_char( "You can't concentrate enough for that.\r\n", ch );
return;
}
if( ch->mount )
{
send_to_char( "You can't do that while mounted.\r\n", ch );
return;
}
if( ch->in_room->sector_type == SECT_AIR )
{
send_to_char( "What? In the air?!\r\n", ch );
return;
}
if( ch->perm_stats[STAT_STR] >= ch->level )
{
send_to_char( "You're already as strong as you can currently get.\r\n", ch );
return;
}
if( ch->move < moveloss )
{
send_to_char( "You're to exhausted to do pushups.\r\n", ch );
return;
}
add_timer( ch, TIMER_DO_FUN, number_range( 2, 4 ), do_pushup, 1 );
act( AT_ACTION, "You begin doing pushups...", ch, NULL, NULL, TO_CHAR );
act( AT_ACTION, "$n begins doing pushups...", ch, NULL, NULL, TO_ROOM );
ch->move -= moveloss;
return;
case 1:
ch->substate = SUB_NONE;
act( AT_ACTION, "You finish doing pushups.", ch, NULL, NULL, TO_CHAR );
act( AT_ACTION, "$n finishes doing pushups.", ch, NULL, NULL, TO_ROOM );
handle_stat( ch, STAT_STR, false, 3 );
return;
case SUB_TIMER_DO_ABORT:
ch->substate = SUB_NONE;
act( AT_ACTION, "You stop doing pushups...", ch, NULL, NULL, TO_CHAR );
act( AT_ACTION, "$n stops doing pushups...", ch, NULL, NULL, TO_ROOM );
return;
}
}
CMDF( do_situp )
{
int moveloss = 10;
switch( ch->substate )
{
default:
if( is_npc( ch ) && IS_AFFECTED( ch, AFF_CHARM ) )
{
send_to_char( "You can't concentrate enough for that.\r\n", ch );
return;
}
if( ch->mount )
{
send_to_char( "You can't do that while mounted.\r\n", ch );
return;
}
if( ch->in_room->sector_type == SECT_AIR )
{
send_to_char( "What? In the air?!\r\n", ch );
return;
}
if( ch->perm_stats[STAT_CON] >= ch->level )
{
send_to_char( "You're already at your max constitution for now.\r\n", ch );
return;
}
if( ch->move < moveloss )
{
send_to_char( "You're to exhausted to do situps.\r\n", ch );
return;
}
add_timer( ch, TIMER_DO_FUN, number_range( 2, 4 ), do_situp, 1 );
act( AT_ACTION, "You begin doing situps...", ch, NULL, NULL, TO_CHAR );
act( AT_ACTION, "$n begins doing situps...", ch, NULL, NULL, TO_ROOM );
ch->move -= moveloss;
return;
case 1:
ch->substate = SUB_NONE;
act( AT_ACTION, "You finish doing situps.", ch, NULL, NULL, TO_CHAR );
act( AT_ACTION, "$n finishes doing situps.", ch, NULL, NULL, TO_ROOM );
handle_stat( ch, STAT_CON, false, 3 );
return;
case SUB_TIMER_DO_ABORT:
ch->substate = SUB_NONE;
act( AT_ACTION, "You stop doing situps...", ch, NULL, NULL, TO_CHAR );
act( AT_ACTION, "$n stops doing situps...", ch, NULL, NULL, TO_ROOM );
return;
}
}
CMDF( do_gold )
{
ch_printf( ch, "&[gold]You have %s gold pieces.&D\r\n", show_big_nums( ch->mgold, ch->gold ) );
}
CMDF( do_worth )
{
AFFECT_DATA *paf;
SKILLTYPE *skill;
const char *s1, *s2, *person;
int count = 0;
if( is_npc( ch ) )
return;
s1 = color_str( AT_SCORE, ch );
s2 = color_str( AT_SCORE2, ch );
person = color_str( AT_PERSON, ch );
if( ch->sex == SEX_MALE )
person = color_str( AT_MALE, ch );
if( ch->sex == SEX_FEMALE )
person = color_str( AT_FEMALE, ch );
for( paf = ch->first_affect; paf; paf = paf->next )
{
if( ( skill = get_skilltype( paf->type ) ) )
count++;
}
pager_printf( ch, "\r\n%sWorth for %s%s%s.\r\n", s1, person, ch->name, ch->pcdata->title );
pager_printf( ch, "%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.\r\n", s1 );
pager_printf( ch, "%sLevel: %s%-5d %sFavor: %s%-10d %sAlignment: %s%-10d %sGlory: %s%-13u\r\n",
s1, s2, ch->level, s1, s2, !ch->pcdata->deity ? 0 : ch->pcdata->favor, s1, s2, ch->alignment, s1, s2, ch->pcdata->quest_curr );
pager_printf( ch, "%sItems: %s%-5d %sWeight: %s%-10d %sStyle: %s%-10s %sGold: %s%-13s\r\n",
s1, s2, ch->carry_number, s1, s2, ch->carry_weight, s1, s2, style_names[ch->style], s1, s2, show_big_nums( ch->mgold, ch->gold ) );
pager_printf( ch, "%sHitroll: %s%-5d %sDamroll: %s%-10d %sAffects: %s%-10d\r\n",
s1, s2, get_hitroll( ch ), s1, s2, get_damroll( ch ), s1, s2, count );
pager_printf( ch, "%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.\r\n", s1 );
}
/* Affects-at-a-glance, Blodkai */
CMDF( do_affected )
{
AFFECT_DATA *paf;
SKILLTYPE *skill;
int count = 0, col = 0;
bool fby = false;
set_char_color( AT_SCORE, ch );
if( !xIS_EMPTY( ch->affected_by ) || !xIS_EMPTY( ch->resistant )
|| !xIS_EMPTY( ch->immune ) || !xIS_EMPTY( ch->susceptible ) || !xIS_EMPTY( ch->absorb ) )
send_to_char("&[dgray]-=&[gray][ &[white] Summary &[white]]&[gray]=-&D\r\n", ch);
if( !xIS_EMPTY( ch->affected_by ) )
ch_printf( ch, " &[blue]Affects: &[lblue]%s&D\r\n", ext_flag_string( &ch->affected_by, a_flags ) );
if( !xIS_EMPTY( ch->resistant ) )
ch_printf( ch, " &[blue]Resistances: &[lblue]%s&D\r\n", ext_flag_string( &ch->resistant, ris_flags ) );
if( !xIS_EMPTY( ch->immune ) )
ch_printf( ch, " &[blue]Immunities: &[lblue]%s&D\r\n", ext_flag_string( &ch->immune, ris_flags ) );
if( !xIS_EMPTY( ch->absorb ) )
ch_printf( ch, " &[blue]Absorbs: &[lblue]%s&D\r\n", ext_flag_string( &ch->absorb, ris_flags ) );
if( !xIS_EMPTY( ch->susceptible ) )
ch_printf( ch, " &[blue]Suscepts: &[lblue]%s&D\r\n", ext_flag_string( &ch->susceptible, ris_flags ) );
if( !str_cmp( argument, "by" ) )
fby = true;
if( ch->first_affect )
{
send_to_char( "\r\n", ch );
for( paf = ch->first_affect; paf; paf = paf->next )
{
if( ( skill = get_skilltype( paf->type ) ) )
{
count++;
if( fby )
{
ch_printf( ch, "&[blue]%2d&[dgray]> &[blue]%-18.18s ",
count, skill->name );
if( paf->location == APPLY_STAT )
ch_printf( ch, "&[white]- &[pink]Modifies &[gray]%-14.14s &[blue]", ext_flag_string( &paf->bitvector, stattypes ) );
else
ch_printf( ch, "&[white]- &[pink]Modifies &[gray]%-14.14s &[blue]", a_types[paf->location % REVERSE_APPLY] );
if( paf->location == APPLY_RESISTANT || paf->location == APPLY_IMMUNE || paf->location == APPLY_SUSCEPTIBLE || paf->location == APPLY_ABSORB )
ch_printf( ch, " to &[yellow]%-14s", ris_flags[paf->modifier] );
else if( paf->location == APPLY_EXT_AFFECT )
{
if( paf->modifier == 0 )
ch_printf( ch, " by &[yellow]%-14s", ext_flag_string( &paf->bitvector, a_flags ) );
else if( paf->modifier > 0 && paf->modifier < AFF_MAX )
ch_printf( ch, " by &[yellow]%-14s", a_flags[paf->modifier] );
else
ch_printf( ch, " by &[yellow]%-14d", paf->modifier );
}
else
ch_printf( ch, " by &[yellow]%-14d", paf->modifier );
ch_printf( ch, " &[blue]for &[red]%5d &[blue]Seconds &D\r\n", paf->duration );
}
else
{
if( col != 0 )
send_to_char( " ", ch );
ch_printf( ch, "&[blue]%18.18s&[gray][&[white]%4d&[gray]]",
skill->name, paf->duration );
if( ++col == 3 )
{
col = 0;
send_to_char( "\r\n", ch );
}
}
}
}
}
if( col != 0 )
send_to_char( "\r\n", ch );
if( count == 0 )
send_to_char( "&[white]No cantrip or skill affects you.&D\r\n\r\n", ch );
else
ch_printf( ch, "&[white]Total of &[red]%d&[white] affects.&D\r\n", count );
if( ch->saving_spell_staff != 0 || ch->saving_para_petri != 0 || ch->saving_wand != 0
|| ch->saving_poison_death != 0 || ch->saving_breath != 0 )
send_to_char( "\r\n&[dgray]-=&[gray][ &[white]Saves vs Spells &[gray]]&[dgray]=-&D\r\n\r\n", ch );
if( ch->saving_spell_staff != 0 )
ch_printf(ch, "&[red]* &[gray]Spell Staff &[white]- &[green]%d&D\r\n", ch->saving_spell_staff );
if( ch->saving_para_petri != 0 )
ch_printf(ch, "&[red]* &[gray]Paralysis &[white]- &[green]%d&D\r\n", ch->saving_para_petri );
if( ch->saving_wand != 0 )
ch_printf(ch, "&[red]* &[gray]Wands &[white]- &[green]%d&D\r\n", ch->saving_wand );
if( ch->saving_poison_death != 0 )
ch_printf(ch, "&[red]* &[gray]Petrification &[white]- &[green]%d&D\r\n", ch->saving_poison_death );
if( ch->saving_breath != 0 )
ch_printf(ch, "&[red]* &[gray]Breath &[white]- &[green]%d&D\r\n&D", ch->saving_breath );
}
CMDF( do_inventory )
{
set_char_color( AT_RED, ch );
ch_printf( ch, "You're carrying: Items: %d/%d Weight: %d/%d\r\n",
ch->carry_number, can_carry_n( ch ), ch->carry_weight, can_carry_w( ch ) );
show_list_to_char( ch->first_carrying, ch, true, true );
}
CMDF( do_equipment )
{
OBJ_DATA *obj, *topobj;
int iWear, cond, start;
bool found = false;
set_char_color( AT_RED, ch );
send_to_char( "You're using:\r\n", ch );
set_char_color( AT_OBJECT, ch );
for( iWear = 0; iWear < WEAR_MAX; iWear++ )
{
topobj = get_eq_char( ch, iWear );
for( obj = ch->first_carrying; obj; obj = obj->next_content )
{
if( obj->wear_loc == iWear )
{
if( !is_obj_stat( obj, ITEM_LODGED ) )
{
if( ( !is_npc( ch ) ) && ( ch->race > 0 ) && ( ch->race < MAX_PC_RACE )
&& race_table[ch->race] && race_table[ch->race]->where_name[iWear] )
send_to_char( race_table[ch->race]->where_name[iWear], ch );
else
send_to_char( where_name[iWear], ch );
}
else
{
if( ( !is_npc( ch ) ) && ( ch->race > 0 ) && ( ch->race < MAX_PC_RACE )
&& race_table[ch->race] && race_table[ch->race]->lodge_name[iWear] )
send_to_char( race_table[ch->race]->lodge_name[iWear], ch );
else
send_to_char( lodge_name[iWear], ch );
}
if( can_see_obj( ch, obj ) )
{
switch( obj->item_type )
{
case ITEM_LIGHT:
case ITEM_AXE:
case ITEM_LOCKPICK:
case ITEM_SHOVEL:
case ITEM_ARMOR:
if( obj->value[0] > 0 && obj->value[1] > 0 )
cond = (int) ( ( 10 * obj->value[0] / obj->value[1] ) );
else
cond = -1;
break;
case ITEM_MISSILE_WEAPON:
case ITEM_WEAPON:
if( obj->value[0] > 0 )
cond = (int) ( ( 10 * obj->value[0] / INIT_WEAPON_CONDITION ) );
else
cond = -1;
break;
case ITEM_WAND:
case ITEM_STAFF:
if( obj->value[1] > 0 && obj->value[2] > 0 )
cond = (int) ( ( 10 * obj->value[2] / obj->value[1] ) );
else
cond = -1;
break;
case ITEM_CONTAINER:
case ITEM_KEYRING:
case ITEM_QUIVER:
if( obj->value[3] > 0 && obj->value[4] > 0 )
cond = (int) ( ( 10 * obj->value[3] / obj->value[4] ) );
else
cond = -1;
break;
default:
cond = -1;
break;
}
send_to_char( "&C<&R", ch );
if( obj == topobj )
{
if( cond >= 0 )
{
for( start = 1; start <= 10; start++ )
{
if( start <= cond )
send_to_char( "+", ch );
else
send_to_char( " ",ch );
}
}
else if( is_obj_stat( obj, ITEM_LODGED ) )
send_to_char( "--LODGED--", ch );
else
send_to_char( "----N/A---", ch );
}
else if( is_obj_stat( obj, ITEM_LODGED ) )
send_to_char( "--LODGED--", ch );
else /* Not the top object so its layered */
send_to_char( "---LAYER--", ch );
ch_printf(ch, "&C>&D%s ", "&[objects]" );
send_to_char( format_obj_to_char( obj, ch, true ), ch );
if( obj->bsplatter )
send_to_char( " &RBloody&D", ch );
if( obj->bstain )
send_to_char( " &RStained&D", ch );
send_to_char( "\r\n", ch );
}
else
send_to_char( "something.\r\n", ch );
found = true;
}
}
}
if( !found )
send_to_char( "Nothing.\r\n", ch );
}
void set_title( CHAR_DATA *ch, char *title )
{
char buf[MSL];
if( is_npc( ch ) )
return;
if( isalpha( title[0] ) || isdigit( title[0] ) )
{
buf[0] = ' ';
mudstrlcpy( buf + 1, title, sizeof( buf ) - 1 );
}
else
mudstrlcpy( buf, title, sizeof( buf ) );
STRSET( ch->pcdata->title, buf );
}
CMDF( do_title )
{
if( is_npc( ch ) )
return;
set_char_color( AT_SCORE, ch );
if( ch->level < 5 )
{
send_to_char( "Sorry... you must be at least level 5 to set your title...\r\n", ch );
return;
}
if( xIS_SET( ch->pcdata->flags, PCFLAG_NOTITLE ) )
{
set_char_color( AT_IMMORT, ch );
send_to_char( "The Gods prohibit you from changing your title.\r\n", ch );
return;
}
if( !argument || argument[0] == '\0' )
{
send_to_char( "Change your title to what?\r\n", ch );
return;
}
if( strlen( argument ) > 50 )
argument[50] = '\0';
set_title( ch, argument );
send_to_char( "Title has been set.\r\n", ch );
}
CMDF( do_homepage )
{
char buf[MSL];
if( is_npc( ch ) )
return;
if( ch->level < 5 )
{
send_to_char( "Sorry... you must be at least level 5 to do that.\r\n", ch );
return;
}
if( !argument || argument[0] == '\0' )
{
char *homepage = ch->pcdata->homepage ? ch->pcdata->homepage : ( char * )"";
ch_printf( ch, "Your homepage is: %s\r\n", show_tilde( homepage ) );
return;
}
if( !str_cmp( argument, "clear" ) )
{
STRFREE( ch->pcdata->homepage );
send_to_char( "Homepage cleared.\r\n", ch );
return;
}
if( strstr( argument, "://" ) )
mudstrlcpy( buf, argument, sizeof( buf ) );
else
snprintf( buf, sizeof( buf ), "http://%s", argument );
if( strlen( buf ) > 70 )
buf[70] = '\0';
hide_tilde( buf );
STRSET( ch->pcdata->homepage, buf );
send_to_char( "Homepage set.\r\n", ch );
}
CMDF( do_email )
{
char buf[MSL];
if( is_npc( ch ) )
return;
if( ch->level < 5 )
{
send_to_char( "Sorry... you must be at least level 5 to do that.\r\n", ch );
return;
}
if( !argument || argument[0] == '\0' )
{
char *email = ch->pcdata->email ? ch->pcdata->email : ( char * )"";
ch_printf( ch, "Your email is: %s\r\n", show_tilde( email ) );
return;
}
if( !str_cmp( argument, "clear" ) )
{
STRFREE( ch->pcdata->email );
send_to_char( "Email cleared.\r\n", ch );
return;
}
mudstrlcpy( buf, argument, sizeof( buf ) );
if( strlen( buf ) > 70 )
buf[70] = '\0';
hide_tilde( buf );
STRSET( ch->pcdata->email, buf );
send_to_char( "Email set.\r\n", ch );
}
CMDF( do_msn )
{
char buf[MSL];
if( is_npc( ch ) )
return;
if( ch->level < 5 )
{
send_to_char( "Sorry... you must be at least level 5 to do that.\r\n", ch );
return;
}
if( !argument || argument[0] == '\0' )
{
char *msn = ch->pcdata->msn ? ch->pcdata->msn : ( char * )"";
ch_printf( ch, "Your msn is: %s\r\n", show_tilde( msn ) );
return;
}
if( !str_cmp( argument, "clear" ) )
{
STRFREE( ch->pcdata->msn );
send_to_char( "Msn cleared.\r\n", ch );
return;
}
mudstrlcpy( buf, argument, sizeof( buf ) );
if( strlen( buf ) > 70 )
buf[70] = '\0';
hide_tilde( buf );
STRSET( ch->pcdata->msn, buf );
send_to_char( "Msn set.\r\n", ch );
}
CMDF( do_yahoo )
{
char buf[MSL];
if( is_npc( ch ) )
return;
if( ch->level < 5 )
{
send_to_char( "Sorry... you must be at least level 5 to do that.\r\n", ch );
return;
}
if( !argument || argument[0] == '\0' )
{
char *yahoo = ch->pcdata->yahoo ? ch->pcdata->yahoo : ( char * )"";
ch_printf( ch, "Your yahoo is: %s\r\n", show_tilde( yahoo ) );
return;
}
if( !str_cmp( argument, "clear" ) )
{
STRFREE( ch->pcdata->yahoo );
send_to_char( "Yahoo cleared.\r\n", ch );
return;
}
mudstrlcpy( buf, argument, sizeof( buf ) );
if( strlen( buf ) > 70 )
buf[70] = '\0';
hide_tilde( buf );
STRSET( ch->pcdata->yahoo, buf );
send_to_char( "Yahoo set.\r\n", ch );
}
CMDF( do_gtalk )
{
char buf[MSL];
if( is_npc( ch ) )
return;
if( ch->level < 5 )
{
send_to_char( "Sorry... you must be at least level 5 to do that.\r\n", ch );
return;
}
if( !argument || argument[0] == '\0' )
{
char *gtalk = ch->pcdata->gtalk ? ch->pcdata->gtalk : ( char * )"";
ch_printf( ch, "Your gtalk is: %s\r\n", show_tilde( gtalk ) );
return;
}
if( !str_cmp( argument, "clear" ) )
{
STRFREE( ch->pcdata->gtalk );
send_to_char( "GTalk cleared.\r\n", ch );
return;
}
mudstrlcpy( buf, argument, sizeof( buf ) );
if( strlen( buf ) > 70 )
buf[70] = '\0';
hide_tilde( buf );
STRSET( ch->pcdata->gtalk, buf );
send_to_char( "GTalk set.\r\n", ch );
}
/* Set your personal description - Thoric */
CMDF( do_description )
{
if( is_npc( ch ) )
{
send_to_char( "Monsters are too dumb to do that!\r\n", ch );
return;
}
if( !ch->desc )
{
bug( "%s: no descriptor", __FUNCTION__ );
return;
}
switch( ch->substate )
{
default:
bug( "%s: illegal substate", __FUNCTION__ );
return;
case SUB_RESTRICTED:
send_to_char( "You can't use this command from within another command.\r\n", ch );
return;
case SUB_NONE:
ch->substate = SUB_PERSONAL_DESC;
ch->dest_buf = ch;
start_editing( ch, ch->description );
return;
case SUB_PERSONAL_DESC:
STRFREE( ch->description );
ch->description = copy_buffer( ch );
stop_editing( ch );
return;
}
}
/* Ripped off do_description for whois bio's -- Scryn*/
CMDF( do_bio )
{
if( is_npc( ch ) )
{
send_to_char( "Mobs can't set a bio.\r\n", ch );
return;
}
if( ch->level < 5 )
{
set_char_color( AT_SCORE, ch );
send_to_char( "You must be at least level five to write your bio...\r\n", ch );
return;
}
if( !ch->desc )
{
bug( "%s: no descriptor", __FUNCTION__ );
return;
}
switch( ch->substate )
{
default:
bug( "%s: illegal substate", __FUNCTION__ );
return;
case SUB_RESTRICTED:
send_to_char( "You can't use this command from within another command.\r\n", ch );
return;
case SUB_NONE:
ch->substate = SUB_PERSONAL_BIO;
ch->dest_buf = ch;
start_editing( ch, ch->pcdata->bio );
return;
case SUB_PERSONAL_BIO:
STRFREE( ch->pcdata->bio );
ch->pcdata->bio = copy_buffer( ch );
stop_editing( ch );
return;
}
}
CMDF( do_score )
{
MCLASS_DATA *mclass;
const char *s1, *s2;
int stat;
if( is_npc( ch ) )
return;
s1 = color_str( AT_SCORE, ch );
s2 = color_str( AT_SCORE2, ch );
set_pager_color( AT_SCORE, ch );
pager_printf( ch, "\r\n%sScore for %s%s%s.\r\n", s1,
ch->sex == SEX_MALE ? color_str( AT_MALE, ch ) : ch->sex == SEX_FEMALE ? color_str( AT_FEMALE, ch ) : "",
ch->name, ( !is_npc( ch ) && ch->pcdata->title ) ? ch->pcdata->title : "" );
if( get_trust( ch ) >= PERM_IMM )
pager_printf( ch, "%sYou're a trusted %s%s.\r\n", s1, s2, perms_flag[get_trust( ch )] );
if( ch->pcdata->spouse )
pager_printf( ch, "%sYou're married to %s%s.\r\n", s1, s2, ch->pcdata->spouse );
set_pager_color( AT_SCORE, ch );
if( !is_npc( ch ) && ch->pcdata->condition[COND_DRUNK] > 10 )
send_to_pager( "You're drunk.\r\n", ch );
if( !is_npc( ch ) && ch->pcdata->condition[COND_THIRST] == 0 )
send_to_pager( "You're in danger of dehydrating.\r\n", ch );
if( !is_npc( ch ) && ch->pcdata->condition[COND_FULL] == 0 )
send_to_pager( "You're starving to death.\r\n", ch );
if( ch->position != POS_SLEEPING )
{
switch( ch->mental_state / 10 )
{
default:
send_to_pager( "You're completely messed up!\r\n", ch );
break;
case -10:
send_to_pager( "You're barely conscious.\r\n", ch );
break;
case -9:
send_to_pager( "You can barely keep your eyes open.\r\n", ch );
break;
case -8:
send_to_pager( "You're extremely drowsy.\r\n", ch );
break;
case -7:
send_to_pager( "You feel very unmotivated.\r\n", ch );
break;
case -6:
send_to_pager( "You feel sedated.\r\n", ch );
break;
case -5:
send_to_pager( "You feel sleepy.\r\n", ch );
break;
case -4:
send_to_pager( "You feel tired.\r\n", ch );
break;
case -3:
send_to_pager( "You could use a rest.\r\n", ch );
break;
case -2:
send_to_pager( "You feel a little under the weather.\r\n", ch );
break;
case -1:
send_to_pager( "You feel fine.\r\n", ch );
break;
case 0:
send_to_pager( "You feel great.\r\n", ch );
break;
case 1:
send_to_pager( "You feel energetic.\r\n", ch );
break;
case 2:
send_to_pager( "Your mind is racing.\r\n", ch );
break;
case 3:
send_to_pager( "You can't think straight.\r\n", ch );
break;
case 4:
send_to_pager( "Your mind is going 100 miles an hour.\r\n", ch );
break;
case 5:
send_to_pager( "You're high as a kite.\r\n", ch );
break;
case 6:
send_to_pager( "Your mind and body are slipping apart.\r\n", ch );
break;
case 7:
send_to_pager( "Reality is slipping away.\r\n", ch );
break;
case 8:
send_to_pager( "You have no idea what is real, and what is not.\r\n", ch );
break;
case 9:
send_to_pager( "You feel immortal.\r\n", ch );
break;
case 10:
send_to_pager( "You're a Supreme Entity.\r\n", ch );
break;
}
}
else if( ch->mental_state > 45 )
send_to_pager( "Your sleep is filled with strange and vivid dreams.\r\n", ch );
else if( ch->mental_state > 25 )
send_to_pager( "Your sleep is uneasy.\r\n", ch );
else if( ch->mental_state < -35 )
send_to_pager( "You're deep in a much needed sleep.\r\n", ch );
else if( ch->mental_state < -25 )
send_to_pager( "You're in deep slumber.\r\n", ch );
if( ch->pcdata->bestowments )
pager_printf( ch, "%sYou're bestowed with the command(s): %s%s.\r\n", s1, s2, ch->pcdata->bestowments );
if( ch->pcdata->birth_year )
pager_printf( ch, "%s%s\r\n", s2, show_birthday( ch ) );
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`%sCharacter Data%s`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
pager_printf( ch, "%sLevel: %s%-13d %sRace: %s%-13.13s %sPlayed: ",
s1, s2, ch->level, s1, s2, capitalize( dis_race_name( ch->race ) ), s1 );
{
int tmptime, time = ch->played;
tmptime = ( time / 3600 );
time -= ( tmptime * 3600 );
pager_printf( ch, "%s%d%s:", s2, tmptime, s1 ); /* Hours */
tmptime = ( time / 60 );
time -= ( tmptime * 60 );
pager_printf( ch, "%s%2.2d%s:", s2, tmptime, s1 ); /* Minutes */
tmptime = time;
pager_printf( ch, "%s%2.2d\r\n", s2, tmptime ); /* Seconds */
}
pager_printf( ch, "%sAge: %s%-13d %sLog In: %s%s\r\n",
s1, s2, get_age( ch ), s1, s2, distime( ch->logon ) );
for( mclass = ch->pcdata->first_mclass; mclass; mclass = mclass->next )
{
pager_printf( ch, "%sLevel: %s%-13d %sClass: %s%-13.13s", s1, s2, mclass->level, s1, s2, capitalize( dis_class_name( mclass->wclass ) ) );
if( mclass->level < MAX_LEVEL )
pager_printf( ch, " %sExp: %s%.f", s1, s2, mclass->exp );
send_to_pager( "\r\n", ch );
}
for( stat = 0; stat < STAT_MAX; stat++ )
{
pager_printf( ch, "%s%3.3s: %s%-13d", s1, capitalize( stattypes[stat] ), s2, get_curr_stat( stat, ch ) );
if( stat == 0 )
pager_printf( ch, " %sHR: %s%-13d %sSaved: %s%s\r\n",
s1, s2, get_hitroll( ch ), s1, s2, ch->save_time ? distime( ch->save_time ) : "no save this session" );
else if( stat == 1 )
pager_printf( ch, " %sDR: %s%-13d %sTime: %s%s\r\n",
s1, s2, get_damroll( ch ), s1, s2, distime( current_time ) );
else if( stat == 2 )
pager_printf( ch, " %sArmor: %s%-13d\r\n", s1, s2, get_ac( ch ) );
else if( stat == 3 )
pager_printf( ch, " %sAlign: %s%+-13d %sItems: %s%d %s(max %s%d%s)\r\n",
s1, s2, ch->alignment, s1, s2, ch->carry_number, s1, s2, can_carry_n( ch ), s1 );
else if( stat == 4 )
pager_printf( ch, " %sWimpy: %s%-13d %sWeight: %s%d %s(max %s%d%s)\r\n",
s1, s2, ch->wimpy, s1, s2, ch->carry_weight, s1, s2, can_carry_w( ch ), s1 );
else if( stat == 5 )
pager_printf( ch, " %sGlory: %s%u\r\n", s1, s2, ch->pcdata->quest_curr );
else if( stat == 6 )
pager_printf( ch, " %sPract: %s%d\r\n", s1, s2, ch->practice );
}
pager_printf( ch, "%sPos'n: %s%-13s ", s1, s2, pos_names[ch->position] );
pager_printf( ch, "%sHP: %s%d %sof %s%d\r\n", s1, s2, ch->hit, s1, s2, ch->max_hit );
pager_printf( ch, "%sStyle: %s%-13s %s", s1, s2, style_names[ch->style], s1 );
if( is_vampire( ch ) )
send_to_pager( "Blood: ", ch );
else
send_to_pager( "Mana: ", ch );
pager_printf( ch, "%s%d %sof %s%d\r\n", s2, ch->mana, s1, s2, ch->max_mana );
pager_printf( ch, "%sGold: %s%-13s %sMove: %s%d %sof %s%d\r\n",
s1, s2, show_big_nums( ch->mgold, ch->gold ), s1, s2, ch->move, s1, s2, ch->max_move );
if( xIS_SET( ch->act, PLR_QUESTOR ) || ch->pcdata->questcompleted != 0 )
{
MOB_INDEX_DATA *victim, *vindex;
OBJ_INDEX_DATA *oindex;
char *name;
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.%sQuest Data%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
pager_printf( ch, "%sYou have completed %s%d%s.\r\n", s1, s2, ch->pcdata->questcompleted, s1 );
if( xIS_SET( ch->act, PLR_QUESTOR ) )
{
if( ( vindex = get_mob_index( ch->questgiver ) ) )
{
name = vindex->short_descr;
name[0] = UPPER( name[0] );
pager_printf( ch, "%s%s %swants you to ", s2, name, s1 );
if( ch->questtype == 1 && ( oindex = get_obj_index( ch->questvnum ) ) )
pager_printf( ch, "bring %s %s%s%s.\r\n", him_her[vindex->sex], s2, oindex->short_descr, s1 );
if( ch->questtype == 2 && ( victim = get_mob_index( ch->questvnum ) ) )
{
name = victim->short_descr;
pager_printf( ch, "kill %s%s %sfor %s.\r\n", s2, name, s1, him_her[vindex->sex] );
}
}
pager_printf( ch, "%sYou have %s%d %sminute%s left to complete the quest.\r\n", s1, s2, ch->questcountdown, s1, ch->questcountdown != 1 ? "s" : "" );
}
}
if( ch->pcdata && ch->pcdata->first_pet )
{
CHAR_DATA *pet;
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.%sPet Data%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
for( pet = ch->pcdata->first_pet; pet; pet = pet->next_pet )
{
pager_printf( ch, "%s%s%s: %s%s\r\n", s2, capitalize( PERS( pet, ch ) ), s1, s2,
!pet->in_room ? "Unknown" : ( pet->in_room == ch->in_room ) ? "In the room with you" : pet->in_room->name );
}
}
if( ch->morph && ch->morph->morph )
{
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.%sMorph Data%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
if( is_immortal( ch ) )
pager_printf( ch, "%sMorphed as (%s%d%s) %s%s %swith a timer of %s%d.\r\n",
s1, s2, ch->morph->morph->vnum, s1, s2, ch->morph->morph->short_desc, s1, s2, ch->morph->timer );
else
pager_printf( ch, "%sYou're morphed into a %s%s.\r\n", s1, s2, ch->morph->morph->short_desc );
}
if( ch->pcdata->mkills || ch->pcdata->mdeaths || ch->pcdata->pkills || ch->pcdata->pdeaths )
{
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.%sKill Data%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
if( ch->pcdata->mkills )
pager_printf( ch, "%sMKills: %s%u", s1, s2, ch->pcdata->mkills );
if( ch->pcdata->mdeaths )
pager_printf( ch, "%s%sMDeaths: %s%u", s1, ch->pcdata->mkills ? " " : "", s2, ch->pcdata->mdeaths );
if( ch->pcdata->pkills )
pager_printf( ch, "%s%sPKills: %s%u", s1, ( ch->pcdata->mkills || ch->pcdata->mdeaths ) ? " " : "",
s2, ch->pcdata->pkills );
if( ch->pcdata->pdeaths )
pager_printf( ch, "%s%sPDeaths: %s%u",
s1, ( ch->pcdata->mkills || ch->pcdata->mdeaths || ch->pcdata->pkills ) ? " " : "",
s2, ch->pcdata->pdeaths );
send_to_pager( "\r\n", ch );
}
if( ch->pcdata->deity )
{
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.%sDeity Data%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
pager_printf( ch, "%s%-15.15s %sFavor: %s%d\r\n", s2, ch->pcdata->deity->name, s1, s2, ch->pcdata->favor );
}
if( ch->pcdata->clan )
{
CLAN_DATA *clan = ch->pcdata->clan;
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.%sClan Data%s.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
pager_printf( ch, "%s%-15.15s %sMembers: %s%d\r\n", s2, clan->name, s1, s2, clan->members );
}
if( ch->pcdata->nation )
{
CLAN_DATA *nation = ch->pcdata->nation;
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~%sNation Data%s~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
pager_printf( ch, "%s%-15.15s %sMembers: %s%d\r\n", s2, nation->name, s1, s2, nation->members );
}
if( is_immortal( ch ) )
{
pager_printf( ch, "%s~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~`%sImmortal Data%s`~.~`~.~`~.~`~.~`~.~`~.~`~.~`~.~\r\n", s1, s2, s1 );
pager_printf( ch, "%sWizinvis [%s%s%s] Wizlevel (%s%d%s)\r\n",
s1, s2, xIS_SET( ch->act, PLR_WIZINVIS ) ? "X" : " ", s1, s2, ch->pcdata->wizinvis, s1 );
pager_printf( ch, "%sBamfin: %s%s %s\r\n", s1, s2, ch->name,
ch->pcdata->bamfin ? ch->pcdata->bamfin : "appears in a swirling mist." );
pager_printf( ch, "%sBamfout: %s%s %s\r\n", s1, s2, ch->name,
ch->pcdata->bamfout ? ch->pcdata->bamfout : "leaves in a swirling mist." );
if( ch->pcdata->area )
{
pager_printf( ch, "%sVnums: (%s%-5.5d %s- %s%-5.5d%s)\r\n",
s1, s2, ch->pcdata->area->low_vnum, s1, s2, ch->pcdata->area->hi_vnum, s1 );
pager_printf( ch, "%sArea Loaded [%s%s%s]\r\n",
s1, s2, ( IS_SET( ch->pcdata->area->status, AREA_LOADED ) ) ? "yes" : "no", s1 );
}
}
send_to_pager( "\r\n", ch );
}
void do_stat( CHAR_DATA *ch, char *argument )
{
int stat, col = 0;
if( is_npc( ch ) )
{
send_to_char( "Huh?\r\n", ch );
return;
}
ch_printf( ch, "You report: %d/%d hp %d/%d %s %d/%d mv.\r\n",
ch->hit, ch->max_hit, ch->mana, ch->max_mana, is_vampire( ch ) ? "blood" : "mana", ch->move, ch->max_move );
send_to_char( "Stats: ", ch );
for( stat = 0; stat < STAT_MAX; stat++ )
{
ch_printf( ch, "%3.3s(%d)", capitalize( stattypes[stat] ), get_curr_stat( stat, ch ) );
if( ++col == 7 )
{
col = 0;
send_to_char( "\r\n", ch );
}
else
send_to_char( " ", ch );
}
if( col != 0 )
send_to_char( "\r\n", ch );
}
CMDF( do_statreport )
{
char buf[MSL];
int stat, col = 0;
if( is_npc( ch ) )
{
send_to_char( "Huh?\r\n", ch );
return;
}
do_stat( ch, (char *)"" );
snprintf( buf, sizeof( buf ), "$n reports: %d/%d hp %d/%d %s %d/%d mv.",
ch->hit, ch->max_hit, ch->mana, ch->max_mana, is_vampire( ch ) ? "blood" : "mana", ch->move, ch->max_move );
act( AT_REPORT, buf, ch, NULL, NULL, TO_ROOM );
snprintf( buf, sizeof( buf ), "%s", "$n's Stats: " );
for( stat = 0; stat < STAT_MAX; stat++ )
{
snprintf( buf + strlen( buf ), sizeof( buf ) - strlen( buf ), "%3.3s(%d)", capitalize( stattypes[stat] ), get_curr_stat( stat, ch ) );
if( ++col == 7 )
{
col = 0;
mudstrlcat( buf, "\r\n", sizeof( buf ) );
}
else
mudstrlcat( buf, " ", sizeof( buf ) );
}
if( col != 0 )
mudstrlcat( buf, "\r\n", sizeof( buf ) );
act( AT_REPORT, buf, ch, NULL, NULL, TO_ROOM );
}
CMDF( do_report )
{
char buf[MIL];
if( is_npc( ch ) && ch->fighting )
return;
ch_printf( ch, "You report: %d/%d hp %d/%d %s %d/%d mv.\r\n",
ch->hit, ch->max_hit, ch->mana, ch->max_mana, is_vampire( ch ) ? "blood" : "mana",
ch->move, ch->max_move );
snprintf( buf, sizeof( buf ), "$n reports: %d/%d hp %d/%d %s %d/%d mv.\r\n",
ch->hit, ch->max_hit, ch->mana, ch->max_mana, is_vampire( ch ) ? "blood" : "mana",
ch->move, ch->max_move );
act( AT_REPORT, buf, ch, NULL, NULL, TO_ROOM );
}
CMDF( do_fprompt )
{
char arg[MIL];
set_char_color( AT_GRAY, ch );
if( is_npc( ch ) )
{
send_to_char( "NPC's can't change their prompt..\r\n", ch );
return;
}
one_argument( argument, arg );
if( !*arg || !str_cmp( arg, "display" ) )
{
send_to_char( "Your current fighting prompt string:\r\n", ch );
set_char_color( AT_WHITE, ch );
ch_printf( ch, "%s\r\n", !ch->pcdata->fprompt ? default_fprompt( ch ) : ch->pcdata->fprompt );
set_char_color( AT_GRAY, ch );
send_to_char( "Type 'help prompt' for information on changing your prompt.\r\n", ch );
return;
}
send_to_char( "Replacing old prompt of:\r\n", ch );
set_char_color( AT_WHITE, ch );
ch_printf( ch, "%s\r\n", !ch->pcdata->fprompt ? default_fprompt( ch ) : ch->pcdata->fprompt );
STRFREE( ch->pcdata->fprompt );
if( strlen( argument ) > 128 )
argument[128] = '\0';
if( str_cmp( arg, "default" ) )
ch->pcdata->fprompt = STRALLOC( argument );
}
CMDF( do_prompt )
{
char arg[MIL];
set_char_color( AT_GRAY, ch );
if( is_npc( ch ) )
{
send_to_char( "NPC's can't change their prompt..\r\n", ch );
return;
}
one_argument( argument, arg );
if( !*arg || !str_cmp( arg, "display" ) )
{
send_to_char( "Your current prompt string:\r\n", ch );
set_char_color( AT_WHITE, ch );
ch_printf( ch, "%s\r\n", !ch->pcdata->prompt ? default_prompt( ch ) : ch->pcdata->prompt );
set_char_color( AT_GRAY, ch );
send_to_char( "Type 'help prompt' for information on changing your prompt.\r\n", ch );
return;
}
send_to_char( "Replacing old prompt of:\r\n", ch );
set_char_color( AT_WHITE, ch );
ch_printf( ch, "%s\r\n", !ch->pcdata->prompt ? default_prompt( ch ) : ch->pcdata->prompt );
STRFREE( ch->pcdata->prompt );
if( strlen( argument ) > 128 )
argument[128] = '\0';
if( str_cmp( arg, "default" ) )
ch->pcdata->prompt = STRALLOC( argument );
}