#include "define.h" #include "struct.h" bool sprintf_prompt( char*, char_data*, const char*, const char* ); /* * PROMPT LIST */ const char* prompt_default = "?p'-- MORE -- '<%f?f|%hhp %ee ?m'[%mmv]'!m'%vmv' ?b'%c'!b'%d'> "; const char* prompt_immortal = "?p'-MORE- '?f'%f '%T %d> "; const char* prompt_warrior = "?p'-- MORE -- '<%f?f|%hhp ?m'[%mmv]'!m'%vmv'> "; const char* prompt_cleric = "?p'-- MORE -- '<%f?f|%hhp %ee ?m'[%mmv]'!m'%vmv'?l' %C'> "; const char* prompt_simple = "?p'-- MORE -- '<%f?f|%hhp %ee ?m'[%mmv]'!m'%vmv'> "; const char* prompt_complex = "?p' -- MORE -- '<%f?f|%hhp %ee ?m'[%mmv]'!m'%vmv' %gwm %xxp?l' %C'\ %d?b' %c'> "; const char* prompt_color = "?p' -- MORE -- '<%f?f|@R%hhp@n @G%ee@n @B?m'[%mmv]'!m'%vmv'@n %gwm\ %xxp?l' %C' %d?b' %c'> "; /* * DO_PROMPT COMMAND */ void do_prompt( char_data* ch, char* argument ) { const char* prompt_list [] = { "default", empty_string, "immortal", prompt_immortal, "simple", prompt_simple, "warrior", prompt_warrior, "cleric", prompt_cleric, "complex", prompt_complex, "color", prompt_color, "" }; int i; int j; if( not_player( ch ) ) return; if( *argument == '\0' ) { send( ch, "Prompt:\r\n%s\r\n\r\n", ch->pcdata->prompt == empty_string ? prompt_default : ch->pcdata->prompt ); send( ch, "Set your prompt to what?\r\n" ); return; } if( strlen( argument ) > 120 ) { send( ch, "You can't set a prompt longer than 120 characters.\r\n" ); return; } for( i = 0, j = 0; argument[i] != '\0'; i++ ) if( argument[i] == '%' ) { j++; i++; } if( j > 20 ) { send( ch, "A prompt may contain at most 20 substitutions.\r\n" ); return; } free_string( ch->pcdata->prompt, MEM_PLAYER ); for( i = 0; *prompt_list[2*i] != '\0'; i++ ) if( !strcasecmp( argument, prompt_list[2*i] ) ) { ch->pcdata->prompt = alloc_string( prompt_list[2*i+1], MEM_PLAYER ); return; } ch->pcdata->prompt = alloc_string( argument, MEM_PLAYER ); return; } /* * SUPPORT FUNCTIONS */ void prompt_flags( char* flags, char_data* ch ) { bool request = ( !is_empty( request_app ) && has_permission( ch, PERM_APPROVE ) && ch->shdata->level < LEVEL_APPRENTICE ) || ( !is_empty( request_imm ) && is_builder( ch ) ); sprintf( flags, "%s%s%s%s%s%s%s%s%s%s%s%s", request ? "R" : "", in_sanctuary( ch, FALSE ) ? "S" : "", can_pkill( ch, NULL, FALSE ) ? "P" : "", is_set( ch->pcdata->pfile->flags, PLR_WIZINVIS ) ? "w" : "", is_set( ch->affected_by, AFF_INVISIBLE ) ? "i" : "", is_set( ch->pcdata->pfile->flags, PLR_SNEAK ) ? "s" : "", is_set( &ch->status, STAT_HIDING ) ? "h" : "", is_set( &ch->status, STAT_CAMOUFLAGED ) ? "c" : "", is_set( &ch->status, STAT_BERSERK ) ? "b" : "", is_set( ch->pcdata->pfile->flags, PLR_TRACK ) ? "t" : "", is_set( ch->pcdata->pfile->flags, PLR_SEARCHING ) ? "x" : "", is_set( ch->pcdata->pfile->flags, PLR_PARRY ) ? "p" : "" ); } /* * STATUS BAR PROMPT ROUTINE */ void prompt_ansi( link_data* link ) { char tmp [ FIVE_LINES ]; char flags [ 10 ]; char exits [ TWO_LINES ]; char time [ 10 ]; char_data* ch = link->character; int i; move_cursor( ch, ch->pcdata->lines-1, 1 ); prompt_flags( flags, ch ); i = exits_prompt( exits, ch ); add_spaces( exits, 6-i ); if( ch->shdata->level >= LEVEL_APPRENTICE ) { sprintf_time( time, current_time, 0 ); sprintf( tmp, "-- Time: %s Room: %-5d Hp: %-4d En: %-4d Mv: %-4d Ex: %s %8s --", time, ch->in_room->vnum, ch->hit, ch->mana, ch->move, exits, flags ); } else sprintf( tmp, "-- Hp: %s%4d/%-4d%s En: %s%4d/%-4d%s Mv: %s%4d/%-4d%s\ Xp: %-8d Ex: %s %8s --", bold_red_v( ch ), ch->hit, ch->max_hit, normal( ch ), blue( ch ), ch->mana, ch->max_mana, normal( ch ), green( ch ), ch->move, ch->max_move, normal( ch ), ch->species != NULL ? 0 : ( exp_for_level( ch )-ch->exp ), exits, flags ); send( ch, tmp ); return; } /* * NORMAL PROMPT ROUTINE */ void prompt_nml( link_data* link ) { char tmp [ EIGHT_LINES ]; char flags [ 10 ]; char_data* ch = link->character; prompt_flags( flags, ch ); send( link, "\r\n%s", normal( ch ) ); sprintf_prompt( tmp, ch, ch->pcdata->prompt == empty_string ? prompt_default : ch->pcdata->prompt, flags ); send( link, tmp ); } /* * SETTABLE PROMPT ROUTINE */ bool sprintf_prompt( char* output, char_data* ch, const char* input, const char* flags ) { char tmp [ TWO_LINES ]; int i,j,k; bool opt; int length = strlen( input ); player_data* player = ch->link->player; for( i = 0, j = 0; i < length; i++ ) { if( input[i] == '@' ) { for( i++, k = 0; ; k++ ) { if( color_key[k] == '\0' ) { output[j++] = input[i]; break; } if( color_key[k] == input[i] ) { if( ch->pcdata->terminal != TERM_DUMB ) { strcpy( &output[j], term_table[ ch->pcdata->terminal ].codes( ch->pcdata->color[ k == 0 ? COLOR_DEFAULT : COLOR_MILD+k-1 ] ) ); j += strlen( &output[j] ); } break; } } continue; } if( input[i] == '%' ) { switch( input[++i] ) { case 'h' : sprintf( &output[j], "%d", ch->hit ); break; case 'H' : sprintf( &output[j], "%d", ch->max_hit ); break; case 'e' : sprintf( &output[j], "%d", ch->mana ); break; case 'E' : sprintf( &output[j], "%d", ch->max_mana ); break; case 'v' : sprintf( &output[j], "%d", ch->move ); break; case 'V' : sprintf( &output[j], "%d", ch->max_move ); break; case 'g' : sprintf( &output[j], "%d", min_group_move( ch ) ); break; case 'G' : sprintf( &output[j], "%d", player->gossip_pts ); break; case 'f' : strcpy( &output[j], flags ); break; case '\\' : strcpy( &output[j], "\r\n" ); break; case 'd' : exits_prompt( &output[j], ch ); break; case 'c' : strcpy( &output[j], condition_short( ch, ch->fighting ) ); break; case 'C' : strcpy( &output[j], condition_short( ch, ch->leader ) ); break; case 's' : strcpy( &output[j], condition_short( ch ) ); break; case 't' : sprintf( &output[j], "%d:%02d", weather.hour, weather.minute ); break; case 'T' : sprintf_time( &output[j], current_time, player->timezone ); break; case 'x' : sprintf( &output[j], "%d", ch->species != NULL ? 0 : exp_for_level( ch )-ch->exp ); break; case 'm' : if( ch->mount != NULL ) sprintf( &output[j], "%d", ch->mount->move ); else sprintf( &output[j], "-" ); break; case 'M' : if( ch->mount != NULL ) sprintf( &output[j], "%d", ch->mount->max_move ); else sprintf( &output[j], "-" ); break; default: output[j] = input[i]; output[j+1] = '\0'; } j += strlen( &output[j] ); continue; } if( input[i] == '?' || input[i] == '!' ) { opt = ( ( input[++i] == 'p' && ch->link->paged != NULL ) || ( input[i] == 'f' && *flags != '\0' ) || ( input[i] == 'm' && ch->mount != NULL ) || ( input[i] == 'b' && ch->fighting != NULL ) || ( input[i] == 'l' && ch->leader != NULL ) ); if( input[i-1] == '!' ) opt = !opt; if( input[++i] != '\'' ) { if( opt ) output[j++] = input[i]; continue; } for( k = 0, i++; input[i] != '\0' && input[i] != '\''; i++ ) tmp[k++] = input[i]; tmp[k] = '\0'; if( opt ) { sprintf_prompt( &output[j], ch, tmp, flags ); j += strlen( &output[j] ); } continue; } output[j++] = input[i]; } output[j] = '\0'; return TRUE; }