/**************************************************************************** * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// * * -----------------------------------------------------------| (0...0) * * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( * * -----------------------------------------------------------| {o o} * * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ * * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~* * Tricops and Fireblade | * * ------------------------------------------------------------------------ * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * Win32 port by Nick Gammon * **************************************************************************** * Color Module -- Allow user customizable Colors. * * --Matthew * * Enhanced ANSI parser by Samson * ****************************************************************************/ /* * The following instructions assume you know at least a little bit about * coding. I firmly believe that if you can't code (at least a little bit), * you don't belong running a mud. So, with that in mind, I don't hold your * hand through these instructions. * * You may use this code provided that: * * 1) You understand that the authors _DO NOT_ support this code * Any help you need must be obtained from other sources. The * authors will ignore any and all requests for help. * 2) You will mention the authors if someone asks about the code. * You will not take credit for the code, but you can take credit * for any enhancements you make. * 3) This message remains intact. * * If you would like to find out how to send the authors large sums of money, * you may e-mail the following address: * * Matthew Bafford & Christopher Wigginton * wiggy@mudservices.com */ /* * To add new color types: * * 1. Edit color.h, and: * 1. Add a new AT_ define. * 2. Increment MAX_COLORS by however many AT_'s you added. * 2. Edit color.c and: * 1. Add the name(s) for your new color(s) to the end of the pc_displays array. * 2. Add the default color(s) to the end of the default_set array. */ #include <string.h> #include "mud.h" char * const pc_displays[MAX_COLORS] = { "black", "dred", "dgreen", "orange", "dblue", "purple", "cyan", "grey", "dgrey", "red", "green", "yellow", "blue", "pink", "lblue", "white", "blink", "plain", "action", "say", "chat", "yells", "tell", "hit", "hitme", "immortal", "hurting", "falling", "danger", "magic", "consider", "report", "poison", "social", "dying", "dead", "skills", "carnage", "damage", "fleeing", "rmname", "rmdesc", "objects", "people", "list", "bye", "gold", "gtells", "note", "hungry", "thirsty", "fire", "sober", "wearoff", "exits", "score", "reset", "log", "die_msg", "wartalk", "arena", "muse", "think", "aflags", "who", "racetalk", "ignore", "whisper", "divider", "morph", "shout", "rflags", "stype", "aname", "auction", "score2", "score3", "score4", "who2", "who3", "who4", "intermud", "helpfiles", "who5", "score5", "who6", "who7", "prac", "prac2", "prac3", "prac4", "mxpprompt", "guildtalk" }; /* All defaults are set to Alsherok default scheme, if you don't like it, change it around to suite your own needs - Samson */ const sh_int default_set [MAX_COLORS] = { AT_BLACK, AT_BLOOD, AT_DGREEN, AT_ORANGE, /* 3 */ AT_DBLUE, AT_PURPLE, AT_CYAN, AT_GREY, /* 7 */ AT_DGREY, AT_RED, AT_GREEN, AT_YELLOW, /* 11 */ AT_BLUE, AT_PINK, AT_LBLUE, AT_WHITE, /* 15 */ AT_RED+AT_BLINK, AT_GREY, AT_GREY, AT_BLUE, /* 19 */ AT_GREEN, AT_LBLUE, AT_WHITE, AT_GREY, /* 23 */ AT_GREY, AT_YELLOW, AT_GREY, AT_GREY, /* 27 */ AT_GREY, AT_BLUE, AT_GREY, AT_GREY, /* 31 */ AT_DGREEN, AT_CYAN, AT_GREY, AT_GREY, /* 35 */ AT_BLUE, AT_GREY, AT_GREY, AT_GREY, /* 39 */ AT_RED, AT_GREY, AT_BLUE, AT_PINK, /* 43 */ AT_GREY, AT_GREY, AT_YELLOW, AT_GREY, /* 47 */ AT_GREY, AT_ORANGE, AT_BLUE, AT_RED, /* 51 */ AT_GREY, AT_GREY, AT_GREEN, AT_DGREEN, /* 55 */ AT_DGREEN, AT_ORANGE, AT_GREY, AT_RED, /* 59 */ AT_GREY, AT_DGREEN, AT_RED, AT_BLUE, /* 63 */ AT_RED, AT_CYAN, AT_YELLOW, AT_PINK, /* 67 */ AT_DGREEN, AT_PINK, AT_WHITE, AT_BLUE, /* 71 */ AT_BLUE, AT_BLUE, AT_GREEN, AT_GREY, /* 75 */ AT_GREEN, AT_GREEN, AT_YELLOW, AT_DGREY, /* 79 */ AT_GREEN, AT_PINK, AT_DGREEN, AT_CYAN, /* 83 */ AT_RED, AT_WHITE, AT_BLUE, AT_DGREEN, /* 87 */ AT_CYAN, AT_BLOOD, AT_RED, AT_DGREEN, /* 91 */ AT_GREEN }; char * const valid_color[] = { "black", "dred", "dgreen", "orange", "dblue", "purple", "cyan", "grey", "dgrey", "red", "green", "yellow", "blue", "pink", "lblue", "white", "\0" }; /* Color align functions by Justice@Aaern */ int const_color_str_len( const char *argument ) { int str, count = 0; bool IS_COLOR = FALSE; for ( str = 0; argument[str] != '\0'; str++ ) { if ( argument[str] == '&' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } #ifdef OVERLANDCODE else if ( argument[str] == '{' ) #else else if ( argument[str] == '^' ) #endif { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else if ( argument[str] == '}' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else { if ( IS_COLOR == FALSE ) count++; else IS_COLOR = FALSE; } } return count; } int const_color_strnlen( const char *argument, int maxlength ) { int str, count = 0; bool IS_COLOR = FALSE; for ( str = 0; argument[str] != '\0'; str++ ) { if ( argument[str] == '&' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } #ifdef OVERLANDCODE else if ( argument[str] == '{' ) #else else if ( argument[str] == '^' ) #endif { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else if ( argument[str] == '}' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else { if ( IS_COLOR == FALSE ) count++; else IS_COLOR = FALSE; } if ( count >= maxlength ) break; } if ( count < maxlength ) return ((str - count) + maxlength); str++; return str; } int color_str_len( char *argument ) { int str, count = 0; bool IS_COLOR = FALSE; for ( str = 0; argument[str] != '\0'; str++ ) { if ( argument[str] == '&' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } #ifdef OVERLANDCODE else if ( argument[str] == '{' ) #else else if ( argument[str] == '^' ) #endif { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else if ( argument[str] == '}' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else { if ( IS_COLOR == FALSE ) count++; else IS_COLOR = FALSE; } } return count; } int color_strnlen( char *argument, int maxlength ) { int str, count = 0; bool IS_COLOR = FALSE; for ( str = 0; argument[str] != '\0'; str++ ) { if ( argument[str] == '&' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } #ifdef OVERLANDCODE else if ( argument[str] == '{' ) #else else if ( argument[str] == '^' ) #endif { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else if ( argument[str] == '}' ) { if ( IS_COLOR == TRUE ) { count++; IS_COLOR = FALSE; } else IS_COLOR = TRUE; } else { if ( IS_COLOR == FALSE ) count++; else IS_COLOR = FALSE; } if ( count >= maxlength ) break; } if ( count < maxlength ) return ((str - count) + maxlength ); str++; return str; } const char *const_color_align( const char *argument, int size, int align ) { int space = ( size - const_color_str_len( argument ) ); static char buf[MAX_STRING_LENGTH]; if ( align == ALIGN_RIGHT || const_color_str_len( argument ) >= size ) sprintf( buf, "%*.*s", const_color_strnlen( argument, size ), const_color_strnlen( argument, size ), argument ); else if ( align == ALIGN_CENTER ) sprintf( buf, "%*s%s%*s", ( space/2 ),"",argument, ((space/2)*2)==space ? (space/2) : ((space/2)+1),"" ); else sprintf( buf, "%s%*s", argument, space, "" ); return buf; } char *color_align( char *argument, int size, int align ) { int space = ( size - color_str_len( argument ) ); static char buf[MAX_STRING_LENGTH]; if ( align == ALIGN_RIGHT || color_str_len( argument ) >= size ) sprintf( buf, "%*.*s", color_strnlen( argument, size ), color_strnlen( argument, size ), argument ); else if ( align == ALIGN_CENTER ) sprintf( buf, "%*s%s%*s", ( space/2 ),"",argument, ((space/2)*2)==space ? (space/2) : ((space/2)+1),"" ); else if ( align == ALIGN_LEFT ) sprintf( buf, "%s%*s", argument, space, "" ); return buf; } void show_colors( CHAR_DATA *ch ) { sh_int count; send_to_pager_color( "&BSyntax: color [color type] [color] | default\n\r", ch ); send_to_pager_color( "&BSyntax: color _reset_ (Resets all colors to default set)\n\r", ch ); send_to_pager_color( "&BSyntax: color _all_ [color] (Sets all color types to [color])\n\r\n\r", ch ); send_to_pager_color( "&W********************************[ COLORS ]*********************************\n\r", ch ); for ( count = 0; count < 16; ++count ) { if ( (count % 8) == 0 && count != 0 ) { send_to_pager( "\n\r",ch ); } pager_printf( ch, "%s%-10s", color_str( count, ch ), pc_displays[count] ); } send_to_pager( "\n\r\n\r&W******************************[ COLOR TYPES ]******************************\n\r", ch ); for ( count = 16; count < MAX_COLORS; ++count ) { if ( (count % 8) == 0 && count != 16) { send_to_pager( "\n\r",ch ); } pager_printf( ch, "%s%-10s%s", color_str( count, ch ), pc_displays[count], ANSI_RESET ); } send_to_pager( "\n\r\n\r", ch ); send_to_pager( "&YAvailable colors are:\n\r", ch ); for ( count = 0; valid_color[count][0] != '\0'; ++count) { if ( (count%8) == 0 && count != 0 ) send_to_pager( "\n\r", ch ); pager_printf( ch, "%s%-10s", color_str( AT_PLAIN, ch ), valid_color[count] ); } send_to_pager( "\n\r", ch ); return; } void do_color( CHAR_DATA *ch, char *argument ) { bool dMatch, cMatch; sh_int count = 0, y = 0; char arg[MIL]; char arg2[MIL]; char arg3[MIL]; char buf[MSL]; dMatch = FALSE; cMatch = FALSE; if (IS_NPC(ch)) { send_to_pager( "Only PC's can change colors.\n\r", ch ); return; } if ( !argument || argument[0] == '\0' ) { show_colors( ch ); return; } argument = one_argument( argument, arg ); if( !str_cmp( arg, "ansitest" ) ) { sprintf( log_buf, "%sBlack\n\r", ANSI_BLACK ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Red\n\r", ANSI_DRED ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Green\n\r", ANSI_DGREEN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sOrange/Brown\n\r", ANSI_ORANGE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Blue\n\r", ANSI_DBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sPurple\n\r", ANSI_PURPLE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sCyan\n\r", ANSI_CYAN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sGrey\n\r", ANSI_GREY ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Grey\n\r", ANSI_DGREY ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sRed\n\r", ANSI_RED ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sGreen\n\r", ANSI_GREEN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sYellow\n\r", ANSI_YELLOW ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sBlue\n\r", ANSI_BLUE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sPink\n\r", ANSI_PINK ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sLight Blue\n\r", ANSI_LBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sWhite\n\r", ANSI_WHITE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sBlack\n\r", BLINK_BLACK ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Red\n\r", BLINK_DRED ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Green\n\r", BLINK_DGREEN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sOrange/Brown\n\r", BLINK_ORANGE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Blue\n\r", BLINK_DBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sPurple\n\r", BLINK_PURPLE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sCyan\n\r", BLINK_CYAN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sGrey\n\r", BLINK_GREY ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sDark Grey\n\r", BLINK_DGREY ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sRed\n\r", BLINK_RED ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sGreen\n\r", BLINK_GREEN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sYellow\n\r", BLINK_YELLOW ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sBlue\n\r", BLINK_BLUE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sPink\n\r", BLINK_PINK ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sLight Blue\n\r", BLINK_LBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%sWhite\n\r", BLINK_WHITE ); write_to_buffer( ch->desc, log_buf, 0 ); write_to_buffer( ch->desc, ANSI_RESET, 0 ); sprintf( log_buf, "%s%sBlack\n\r", ANSI_WHITE, BACK_BLACK ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%s%sDark Red\n\r", ANSI_BLACK, BACK_DRED ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%s%sDark Green\n\r", ANSI_BLACK, BACK_DGREEN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%s%sOrange/Brown\n\r", ANSI_BLACK, BACK_ORANGE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%s%sDark Blue\n\r", ANSI_BLACK, BACK_DBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%s%sPurple\n\r", ANSI_BLACK, BACK_PURPLE ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%s%sCyan\n\r", ANSI_BLACK, BACK_CYAN ); write_to_buffer( ch->desc, log_buf, 0 ); sprintf( log_buf, "%s%sGrey\n\r", ANSI_BLACK, BACK_GREY ); write_to_buffer( ch->desc, log_buf, 0 ); write_to_buffer( ch->desc, ANSI_RESET, 0 ); return; } if ( !str_prefix(arg, "_reset_" ) ) { reset_colors(ch); send_to_pager( "All color types reset to default colors.\n\r", ch ); return; } argument = one_argument( argument, arg2 ); if ( arg[0] == '\0' ) { send_to_char("Change which color type?\r\n", ch); return; } argument = one_argument( argument, arg3 ); if ( !str_prefix(arg, "_all_") ) { dMatch = TRUE; count = -1; /* search for a valid color setting*/ for ( y = 0; y < 16 ; y++ ) { if (!str_cmp(arg2, valid_color[y])) { cMatch = TRUE; break; } } } else if ( arg2[0] == '\0' ) { cMatch = FALSE; } else { /* search for the display type and str_cmp*/ for ( count = 0; count < MAX_COLORS ; count++ ) { if (!str_prefix (arg, pc_displays[count])) { dMatch = TRUE; break; } } if(!dMatch) { ch_printf( ch, "%s is an invalid color type.\n\r", arg ); send_to_char( "Type color with no arguments to see available options.\n\r", ch ); return; } if (!str_cmp (arg2, "default")) { ch->colors[count] = default_set[count]; sprintf(buf, "Display %s set back to default.\n\r", pc_displays[count] ); send_to_pager( buf, ch ); return; } /* search for a valid color setting*/ for ( y = 0; y < 16 ; y++ ) { if (!str_cmp(arg2, valid_color[y])) { cMatch = TRUE; break; } } } if(!cMatch) { if ( arg[0] ) { ch_printf(ch, "Invalid color for type %s.\n", arg); } else { send_to_pager( "Invalid color.\n\r", ch ); } send_to_pager( "Choices are:\n\r", ch ); for ( count = 0; count < 16; count++ ) { if ( count % 5 == 0 && count != 0 ) send_to_pager("\r\n", ch); pager_printf(ch, "%-10s", valid_color[count]); } pager_printf(ch, "%-10s\r\n", "default"); return; } else { sprintf(buf, "Color type %s set to color %s.\n\r",count==-1?"_all_":pc_displays[count], valid_color[y] ); } if (!str_cmp (arg3, "blink")) { y += AT_BLINK; } if ( count == -1 ) { int ccount; for ( ccount = 0; ccount < MAX_COLORS; ++ccount ) { ch->colors[ccount] = y; } set_pager_color(y, ch); sprintf(buf, "All color types set to color %s%s.%s\n\r", valid_color[y>AT_BLINK?y-AT_BLINK:y], y>AT_BLINK ? " [BLINKING]" : "", ANSI_RESET ); send_to_pager(buf, ch); } else { ch->colors[count] = y; set_pager_color( count , ch); if (!str_cmp (arg3, "blink")) sprintf(buf, "Display %s set to color %s [BLINKING]%s\n\r", pc_displays[count], valid_color[y-AT_BLINK], ANSI_RESET ); else sprintf(buf, "Display %s set to color %s.\n\r", pc_displays[count], valid_color[y] ); send_to_pager( buf, ch ); } set_pager_color( AT_PLAIN , ch); return; } void reset_colors( CHAR_DATA *ch ) { memcpy( &ch->colors, &default_set, sizeof(default_set) ); } char *color_str( sh_int AType, CHAR_DATA *ch ) { if( !ch ) { bug( "%s", "color_str: NULL ch!" ); return( "" ); } if( IS_NPC(ch) || !xIS_SET( ch->act, PLR_ANSI ) ) return( "" ); switch( ch->colors[AType] ) { case 0: return( ANSI_BLACK ); break; case 1: return( ANSI_DRED ); break; case 2: return( ANSI_DGREEN ); break; case 3: return( ANSI_ORANGE ); break; case 4: return( ANSI_DBLUE ); break; case 5: return( ANSI_PURPLE ); break; case 6: return( ANSI_CYAN ); break; case 7: return( ANSI_GREY ); break; case 8: return( ANSI_DGREY ); break; case 9: return( ANSI_RED ); break; case 10: return( ANSI_GREEN ); break; case 11: return( ANSI_YELLOW ); break; case 12: return( ANSI_BLUE ); break; case 13: return( ANSI_PINK ); break; case 14: return( ANSI_LBLUE ); break; case 15: return( ANSI_WHITE ); break; /* 16 thru 31 are for blinking colors */ case 16: return( BLINK_BLACK ); break; case 17: return( BLINK_DRED ); break; case 18: return( BLINK_DGREEN ); break; case 19: return( BLINK_ORANGE ); break; case 20: return( BLINK_DBLUE ); break; case 21: return( BLINK_PURPLE ); break; case 22: return( BLINK_CYAN ); break; case 23: return( BLINK_GREY ); break; case 24: return( BLINK_DGREY ); break; case 25: return( BLINK_RED ); break; case 26: return( BLINK_GREEN ); break; case 27: return( BLINK_YELLOW ); break; case 28: return( BLINK_BLUE ); break; case 29: return( BLINK_PINK ); break; case 30: return( BLINK_LBLUE ); break; case 31: return( BLINK_WHITE ); break; default: return( ANSI_RESET ); break; } } int colorcode( const char *col, char *code, CHAR_DATA *ch ) { const char *ctype = col; int ln; bool ansi; if( !ch ) ansi = TRUE; else ansi = ( !IS_NPC(ch) && xIS_SET( ch->act, PLR_ANSI ) ); col++; if( !*col ) ln = -1; #ifdef OVERLANDCODE else if ( *ctype != '&' && *ctype != '{' && *ctype != '}' ) { bug( "colorcode: command '%c' not '&', '{' or '}'", *ctype ); ln = -1; } #else else if ( *ctype != '&' && *ctype != '^' && *ctype != '}' ) { bug( "colorcode: command '%c' not '&', '^' or '}'", *ctype ); ln = -1; } #endif else if( *col == *ctype ) { code[0] = *col; code[1] = '\0'; ln = 1; } else if( !ansi ) ln = 0; else { /* Foreground text - non-blinking */ if( *ctype == '&' ) { switch( *col ) { default: code[0] = *ctype; code[1] = *col; code[2] = '\0'; return 2; case 'i': /* Italic text */ case 'I': strcpy( code, ANSI_ITALIC ); break; case 'v': /* Reverse colors */ case 'V': strcpy( code, ANSI_REVERSE ); break; case 'u': /* Underline */ case 'U': strcpy( code, ANSI_UNDERLINE ); break; case 's': /* Strikeover */ case 'S': strcpy( code, ANSI_STRIKEOUT ); break; case 'd': /* Player's client default color */ strcpy( code, ANSI_RESET ); break; case 'D': /* Reset to custom color for whatever is being displayed */ strcpy( code, ANSI_RESET ); /* Yes, this reset here is quite necessary to cancel out other things */ strcat( code, color_str( ch->desc->pagecolor, ch ) ); break; case 'x': /* Black */ strcpy( code, ANSI_BLACK ); break; case 'O': /* Orange/Brown */ strcpy( code, ANSI_ORANGE ); break; case 'c': /* Cyan */ strcpy( code, ANSI_CYAN ); break; case 'z': /* Dark Grey */ strcpy( code, ANSI_DGREY ); break; case 'g': /* Dark Green */ strcpy( code, ANSI_DGREEN ); break; case 'G': /* Light Green */ strcpy( code, ANSI_GREEN ); break; case 'P': /* Pink/Light Purple */ strcpy( code, ANSI_PINK ); break; case 'r': /* Dark Red */ strcpy( code, ANSI_DRED ); break; case 'b': /* Dark Blue */ strcpy( code, ANSI_DBLUE ); break; case 'w': /* Grey */ strcpy( code, ANSI_GREY ); break; case 'Y': /* Yellow */ strcpy( code, ANSI_YELLOW ); break; case 'C': /* Light Blue */ strcpy( code, ANSI_LBLUE ); break; case 'p': /* Purple */ strcpy( code, ANSI_PURPLE ); break; case 'R': /* Red */ strcpy( code, ANSI_RED ); break; case 'B': /* Blue */ strcpy( code, ANSI_BLUE ); break; case 'W': /* White */ strcpy( code, ANSI_WHITE ); break; } } /* Foreground text - blinking */ if( *ctype == '}' ) { switch( *col ) { default: code[0] = *ctype; code[1] = *col; code[2] = '\0'; return 2; case 'x': /* Black */ strcpy( code, BLINK_BLACK ); break; case 'O': /* Orange/Brown */ strcpy( code, BLINK_ORANGE ); break; case 'c': /* Cyan */ strcpy( code, BLINK_CYAN ); break; case 'z': /* Dark Grey */ strcpy( code, BLINK_DGREY ); break; case 'g': /* Dark Green */ strcpy( code, BLINK_DGREEN ); break; case 'G': /* Light Green */ strcpy( code, BLINK_GREEN ); break; case 'P': /* Pink/Light Purple */ strcpy( code, BLINK_PINK ); break; case 'r': /* Dark Red */ strcpy( code, BLINK_DRED ); break; case 'b': /* Dark Blue */ strcpy( code, BLINK_DBLUE ); break; case 'w': /* Grey */ strcpy( code, BLINK_GREY ); break; case 'Y': /* Yellow */ strcpy( code, BLINK_YELLOW ); break; case 'C': /* Light Blue */ strcpy( code, BLINK_LBLUE ); break; case 'p': /* Purple */ strcpy( code, BLINK_PURPLE ); break; case 'R': /* Red */ strcpy( code, BLINK_RED ); break; case 'B': /* Blue */ strcpy( code, BLINK_BLUE ); break; case 'W': /* White */ strcpy( code, BLINK_WHITE ); break; } } /* Background color */ #ifdef OVERLANDCODE if( *ctype == '{' ) #else if( *ctype == '^' ) #endif { switch( *col ) { default: code[0] = *ctype; code[1] = *col; code[2] = '\0'; return 2; case 'x': /* Black */ strcpy( code, BACK_BLACK ); break; case 'r': /* Dark Red */ strcpy( code, BACK_DRED ); break; case 'g': /* Dark Green */ strcpy( code, BACK_DGREEN ); break; case 'O': /* Orange/Brown */ strcpy( code, BACK_ORANGE ); break; case 'b': /* Dark Blue */ strcpy( code, BACK_DBLUE ); break; case 'p': /* Purple */ strcpy( code, BACK_PURPLE ); break; case 'c': /* Cyan */ strcpy( code, BACK_CYAN ); break; case 'w': /* Grey */ strcpy( code, BACK_GREY ); break; } } ln = strlen( code ); } if ( ln <= 0 ) *code = '\0'; return ln; } /* Moved from comm.c */ void set_char_color( sh_int AType, CHAR_DATA *ch ) { if ( !ch || !ch->desc ) return; write_to_buffer( ch->desc, color_str( AType, ch ), 0 ); ch->desc->pagecolor = ch->colors[AType]; } void set_pager_color( sh_int AType, CHAR_DATA *ch ) { if ( !ch || !ch->desc ) return; write_to_pager( ch->desc, color_str( AType, ch ), 0 ); ch->desc->pagecolor = ch->colors[AType]; } void write_to_pager( DESCRIPTOR_DATA *d, const char *txt, int length ) { int pageroffset; /* Pager fix by thoric */ if( length <= 0 ) length = strlen( txt ); if( length == 0 ) return; if( !d->pagebuf ) { d->pagesize = MAX_STRING_LENGTH; CREATE( d->pagebuf, char, d->pagesize ); } if( !d->pagepoint ) { d->pagepoint = d->pagebuf; d->pagetop = 0; d->pagecmd = '\0'; } if( d->pagetop == 0 && !d->fcommand ) { d->pagebuf[0] = '\n'; d->pagebuf[1] = '\r'; d->pagetop = 2; } pageroffset = d->pagepoint - d->pagebuf; /* pager fix (goofup fixed 08/21/97) */ while( d->pagetop + length >= d->pagesize ) { if( d->pagesize > MSL*16 ) { bug( "%s", "Pager overflow. Ignoring.\n\r" ); d->pagetop = 0; d->pagepoint = NULL; DISPOSE( d->pagebuf ); d->pagesize = MSL; return; } d->pagesize *= 2; RECREATE( d->pagebuf, char, d->pagesize ); } d->pagepoint = d->pagebuf + pageroffset; /* pager fix (goofup fixed 08/21/97) */ strncpy( d->pagebuf + d->pagetop, txt, length ); d->pagetop += length; d->pagebuf[d->pagetop] = '\0'; return; } /* Writes to a descriptor, usually best used when there's no character to send to ( like logins ) */ void send_to_desc_color( const char *txt, DESCRIPTOR_DATA *d ) { char *colstr; const char *prevstr = txt; char colbuf[20]; int ln; if ( !d ) { bug( "%s", "send_to_desc_color: NULL *d" ); return; } if ( !txt || !d->descriptor ) return; #ifdef OVERLANDCODE while( ( colstr = strpbrk( prevstr, "&{}" ) ) != NULL ) #else while( ( colstr = strpbrk( prevstr, "&^}" ) ) != NULL ) #endif { if( colstr > prevstr ) write_to_buffer( d, prevstr, ( colstr-prevstr ) ); ln = colorcode( colstr, colbuf, d->character ); if ( ln < 0 ) { prevstr = colstr+1; break; } else if ( ln > 0 ) write_to_buffer( d, colbuf, ln ); prevstr = colstr+2; } if ( *prevstr ) write_to_buffer( d, prevstr, 0 ); return; } /* * Write to one char. Convert color into ANSI sequences. */ void send_to_char_color( const char *txt, CHAR_DATA *ch ) { char *colstr; const char *prevstr = txt; char colbuf[20]; int ln; if( !ch ) { bug( "%s", "send_to_char_color: NULL ch!" ); return; } if( txt && ch->desc ) { #ifdef OVERLANDCODE while( ( colstr = strpbrk( prevstr, "&{}" ) ) != NULL ) #else while( ( colstr = strpbrk( prevstr, "&^}" ) ) != NULL ) #endif { if( colstr > prevstr ) write_to_buffer( ch->desc, prevstr, ( colstr-prevstr ) ); ln = colorcode( colstr, colbuf, ch ); if ( ln < 0 ) { prevstr = colstr+1; break; } else if( ln > 0 ) write_to_buffer( ch->desc, colbuf, ln ); prevstr = colstr+2; } if ( *prevstr ) write_to_buffer( ch->desc, prevstr, 0 ); } return; } void send_to_pager_color( const char *txt, CHAR_DATA *ch ) { char *colstr; const char *prevstr = txt; char colbuf[20]; int ln; if( !ch ) { bug( "%s", "send_to_pager_color: NULL ch!" ); return; } if ( txt && ch->desc ) { DESCRIPTOR_DATA *d = ch->desc; ch = d->original ? d->original : d->character; if ( IS_NPC(ch) || !IS_SET( ch->pcdata->flags, PCFLAG_PAGERON ) ) { send_to_char_color( txt, d->character ); return; } #ifdef OVERLANDCODE while( ( colstr = strpbrk( prevstr, "&{}" ) ) != NULL ) #else while( ( colstr = strpbrk( prevstr, "&^}" ) ) != NULL ) #endif { if( colstr > prevstr ) write_to_pager( ch->desc, prevstr, ( colstr-prevstr ) ); ln = colorcode( colstr, colbuf, ch ); if ( ln < 0 ) { prevstr = colstr+1; break; } else if( ln > 0 ) write_to_pager( ch->desc, colbuf, ln ); prevstr = colstr+2; } if ( *prevstr ) write_to_pager( ch->desc, prevstr, 0 ); } return; } void send_to_char( const char *txt, CHAR_DATA *ch ) { send_to_char_color( txt, ch ); return; } void send_to_pager( const char *txt, CHAR_DATA *ch ) { send_to_pager_color( txt, ch ); return; } void ch_printf( CHAR_DATA *ch, char *fmt, ... ) { char buf[MSL*2]; va_list args; va_start( args, fmt ); vsprintf( buf, fmt, args ); va_end( args ); send_to_char_color( buf, ch ); } void pager_printf( CHAR_DATA *ch, char *fmt, ... ) { char buf[MSL*2]; va_list args; va_start( args, fmt ); vsprintf( buf, fmt, args ); va_end( args ); send_to_pager_color( buf, ch ); }