/**************************************************************************** * [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. * * ------------------------------------------------------------------------ * * Colorize module by Altrag * ****************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <time.h> #include "mud.h" struct at_color_type at_color_table[AT_MAXCOLOR]; void load_colors( void ) { extern char strArea[MAX_INPUT_LENGTH]; extern FILE *fpArea; char buf[20]; int at; for( at = 0; at < AT_MAXCOLOR; ++at ) { sprintf( buf, "%d", at ); at_color_table[at].name = str_dup( buf ); at_color_table[at].def_color = AT_GREY; } strcpy( strArea, COLOR_FILE ); if( !( fpArea = fopen( COLOR_FILE, "r" ) ) ) { bug( "Load_colors: can't open color file -- bland city time!" ); return; } for( ;; ) { at = ( feof( fpArea ) ? -1 : fread_number( fpArea ) ); if( at < 0 ) break; if( at < AT_COLORBASE || at >= AT_TOPCOLOR ) { bug( "Load_colors: color %d invalid.", at ); fread_to_eol( fpArea ); continue; } at -= AT_COLORBASE; DISPOSE( at_color_table[at].name ); at_color_table[at].name = fread_string_nohash( fpArea ); at_color_table[at].def_color = fread_number( fpArea ); } fclose( fpArea ); fpArea = NULL; return; } void save_colors( void ) { FILE *fp; int at; fclose( fpReserve ); if( !( fp = fopen( COLOR_FILE, "w" ) ) ) { bug( "Save_colors: can't open color file." ); fpReserve = fopen( NULL_FILE, "r" ); return; } for( at = 0; at < AT_MAXCOLOR; ++at ) fprintf( fp, "%d %s~ %d\n", at + AT_COLORBASE, at_color_table[at].name, at_color_table[at].def_color ); fprintf( fp, "-1\n" ); fclose( fp ); fpReserve = fopen( NULL_FILE, "r" ); return; } void do_colorize( CHAR_DATA * ch, char *argument ) { #define MAX_COLOR 16 static const char colors[MAX_COLOR] = "xrgObpcwzRGYBPCW"; static const char *color_names[MAX_COLOR] = { "black", "blood", "dgreen", "orange", "dblue", "purple", "cyan", "grey", "dgrey", "red", "green", "yellow", "blue", "pink", "lblue", "white" }; char arg[MAX_INPUT_LENGTH], *a; int color; int at; bool blink = FALSE; CHAR_DATA *victim; bool def = FALSE; int level = get_trust( ch ); argument = one_argument( argument, arg ); if( level >= LEVEL_SUB_IMPLEM && ( !str_cmp( arg, "def" ) || !str_cmp( arg, "default" ) ) ) { def = TRUE; argument = one_argument( argument, arg ); victim = NULL; } else if( level >= LEVEL_SUB_IMPLEM && ( victim = get_char_room( ch, arg ) ) != NULL ) { if( level < get_trust( victim ) ) { send_to_char( "They might not like that.\n\r", ch ); return; } argument = one_argument( argument, arg ); } else victim = ch; if( !def && IS_NPC( victim ) ) { send_to_char( "Not on NPCs.\n\r", ch ); return; } if( !*arg ) { for( at = 0; at < AT_MAXCOLOR; ++at ) { if( def || victim->pcdata->colorize[at] == -1 ) color = at_color_table[at].def_color; else color = victim->pcdata->colorize[at]; if( color >= AT_BLINK ) { blink = TRUE; color -= AT_BLINK; } else blink = FALSE; pager_printf_color( ch, "%-8s: %s%c%-15s&D", at_color_table[at].name, ( blink ? "+}" : " &" ), colors[color], color_names[color] ); if( at % 3 == 2 ) send_to_pager( "\n\r", ch ); } if( at % 3 != 0 ) send_to_pager( "\n\r", ch ); send_to_pager( "\n\rValid colors are:\n\r", ch ); for( color = 0; color < MAX_COLOR; ++color ) { if( color ) set_pager_color( color, ch ); else set_pager_color( AT_PLAIN, ch ); pager_printf( ch, "%-9s", color_names[color] ); if( color % 8 == 7 ) send_to_pager( "\n\r", ch ); } if( color % 8 != 0 ) send_to_pager( "\n\r", ch ); set_pager_color( AT_GREY + AT_BLINK, ch ); send_to_pager( "\n\rBlinking ", ch ); set_pager_color( AT_GREY, ch ); send_to_pager( "can be specified by prefixing the color name with a +." "\n\r", ch ); set_pager_color( AT_PLAIN, ch ); return; } for( at = 0; at < AT_MAXCOLOR; ++at ) if( !str_prefix( arg, at_color_table[at].name ) ) break; if( at == AT_MAXCOLOR ) { send_to_char( "Not a settable color.\n\r", ch ); return; } argument = one_argument( argument, arg ); if( !*arg ) { send_to_char( "Set it to what color?\n\r", ch ); return; } if( !str_cmp( arg, "def" ) || !str_cmp( arg, "default" ) ) { if( def ) send_to_char( "That *IS* the default!\n\r", ch ); else { victim->pcdata->colorize[at] = -1; send_to_char( "Color set to default.\n\r", ch ); } return; } if( *arg == '+' ) { a = arg + 1; if( !*a ) { if( def ) { if( at_color_table[at].def_color >= AT_BLINK ) { at_color_table[at].def_color -= AT_BLINK; send_to_char( "Default color will no longer blink.\n\r", ch ); } else { at_color_table[at].def_color += AT_BLINK; send_to_char( "Default color will now blink.\n\r", ch ); } save_colors( ); } else { if( victim->pcdata->colorize[at] == -1 ) victim->pcdata->colorize[at] = at_color_table[at].def_color; if( victim->pcdata->colorize[at] >= AT_BLINK ) { victim->pcdata->colorize[at] -= AT_BLINK; send_to_char( "Color will no longer blink.\n\r", ch ); } else { victim->pcdata->colorize[at] += AT_BLINK; send_to_char( "Color will now blink.\n\r", ch ); } } return; } blink = TRUE; } else a = arg; for( color = 0; color < MAX_COLOR; ++color ) if( !str_prefix( a, color_names[color] ) ) break; if( color == MAX_COLOR ) { send_to_char( "Invalid color name.\n\r", ch ); return; } if( blink ) color += AT_BLINK; if( def ) { at_color_table[at].def_color = color; send_to_char( "Default color set.\n\r", ch ); save_colors( ); } else { victim->pcdata->colorize[at] = color; send_to_char( "Color set.\n\r", ch ); } return; }