wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** WolfPaw 3.0 ** 				    *
 *--------------------------------------------------------------------------*
 *               WolfPaw 3.0 (c) 1997 - 1999 by Dale Corse		    *
 *--------------------------------------------------------------------------*
 *            The WolfPaw Coding Team is headed by: Greywolf                *
 *  With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag      *
 *                           Scryn, Thoric, Justice, Tricops and Brogar.    *
 *--------------------------------------------------------------------------*
 *  Based on SMAUG 1.2a. Copyright 1994 - 1996 by Derek Snider		    *
 *  SMAUG Coding Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, *
 *		       Swordbearer, Gorog, Grishnakh and Tricops.           *
 *--------------------------------------------------------------------------*
 *  Merc 2.1 Diku MUD Improvments (C) 1992 - 1993 by Michael Chastain,      *
 *  Michael Quan, and Michael Tse. 					    *
 *  Original Diku MUD (C) 1990 - 1991 by Sebastian Hammer, Michael Seifert, *
 *  Hans Hendrik Strfeldt, Tom Madsen, and Katja Nyboe. 		    *
 *--------------------------------------------------------------------------*
 *			Player Color Mapping Module			    *
 *--------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "mud.h"

char *colormap_parse( CHAR_DATA *ch, int map_type, bool advanced, char *speaker, char *string );
void create_map(CHAR_DATA *ch,int map_type,int color_num,bool string,char *txt);
void free_char_colormaps( CHAR_DATA *ch );
void load_char_cmap( CHAR_DATA *ch, char *argument );
void save_char_cmaps( FILE *fp, CHAR_DATA *ch );
int get_map_type( char *name, bool immortal );
int get_color_num( char *color );
bool colorstringcheck( int map_type );
void setup_char_color_maps( CHAR_DATA *ch );
void set_cmap_bv( CHAR_DATA *ch, int map_type );
void remove_cmap_bv( CHAR_DATA *ch, int map_type );
void delete_char_color_map( CHAR_DATA *ch, int map_type );
bool colormap_check( CHAR_DATA *ch, int map_type );
bool advanced_map_name_check( char *argument );
char *advanced_map_convert( char *argument );
int get_cmap_bv_by_type( int map_type );
CMAP_DATA *find_char_map_by_type(CHAR_DATA *ch, int map_type);
char *find_real_color_string(CMAP_DATA *map);
int get_channel_cmap_num(int chan);
CHAR_DATA *get_char args( ( char *name ) );
int get_real_act_color_num(int orig);
char *get_map_name_by_num( int num );
char *get_color_word_by_num( int num );

/*
 * Main Control Function, lets the player configure everything --GW
 * Syntax:
 * Color on <-- Activate Color, same as the ANSI command did at one point
 * Color off <-- DeActivate Color, again same as the ANSI command did
 * Color map <map name> <color or string> <-- Map Something
 */
void do_color( CHAR_DATA *ch, char *argument )
{
char arg1[MIL];
char arg2[MIL];

argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );

if ( IS_NPC(ch) )
   return;

/* 
 * Activate Color 
 */
if ( !str_cmp( arg1, "on" ) )
{
   SET_BIT( ch->act, PLR_ANSI );
   send_to_char("Color Activated.\n\r",ch);
   return;
}

/*
 * Deactivate Color
 */
if ( !str_cmp( arg1, "off" ) )
{
    REMOVE_BIT( ch->act, PLR_ANSI );
    send_to_char("Color Deactivated.\n\r",ch);
    return;
}

/*
 * Map Something to another color, or set of colors
 * Includes support for basic things, ie: room descriptions
 * aswell as advanced mapping of Channel Names, and colors.
 */
if ( !str_cmp( arg1, "map" ) )
{
int map_type=0;
bool string=FALSE;
char color_string[MSL];
int color_num=0;
bool immortal=FALSE;

if ( IS_IMMORTAL(ch) )
immortal=TRUE;

/* What Color are we mapping? */
map_type=get_map_type(arg2,immortal);

/*Invalid?*/
if ( map_type==0 )
{
send_to_char("That is not a Map name!\n\r",ch);
return;
}

if ( !str_cmp( argument, "off" ) )
{
remove_cmap_bv(ch,map_type);
delete_char_color_map(ch,map_type);
send_to_char("Color Remap Deleted.\n\r",ch);
return;
}

/* Color Number, or a string? */
if ( (color_num=get_color_num(argument))==0 )
{
string=TRUE;
sprintf(color_string,"%s",argument);
}

/* Are we supposed to use a COLOR or a string here? */
if ( string && colorstringcheck(map_type)==FALSE )
{
send_to_char("You must use a valid Color!\n\r",ch);
return;
}

/* Check to see if its a FIRST time map, or a REmapping */
if ( colormap_check(ch, map_type)==TRUE )
{
  delete_char_color_map(ch,map_type);
  remove_cmap_bv(ch, map_type);
  send_to_char("Already Remapped, Old mapping Deleted.\n\r",ch);
}

/* handle simple mapping, single colors only */
if ( !string )
create_map( ch, map_type, color_num, FALSE, NULL );

/* Advanced Maps */
if ( string )
{
  if ( advanced_map_name_check(color_string)==FALSE )
  {
    send_to_char("The map string must contain an @@ sign\n\r",ch);
    send_to_char("representing the name of the character speaking.\n\r",ch);
    return;
  }
create_map( ch, map_type, 0, TRUE, color_string );
}

set_cmap_bv(ch,map_type);
send_to_char("Color Remapped.\n\r",ch);
return;
}

/* If we got this far, someone needs some assitance....*/
send_to_char("Syntax: Color <on/off/map> <map name> <off/color name/string>\n\r",ch);
send_to_char("------\n\r\n\r",ch);
send_to_char("Map Name being one of:\n\r",ch);
send_to_char("rumor tell play quest war music ask flame shout yell\n\r",ch);
send_to_char("clan council avatar tells roomdesc roomname socials exits obj mob\n\r",ch);
send_to_char("FOR DM's: immtalk imp olympus newbiechat think\n\r",ch);
send_to_char("-------\n\r\n\r",ch);
send_to_char("Color Names being one of:\n\r",ch);
send_to_char("Black Blood Green Orange DBlue Purple Cyan Grey DGrey LRed\n\r",ch);
send_to_char("LGreen Yellow Blue LBlue White\n\r",ch);
/* Not Done yet .. do it later..--GW
send_to_char("For Background Colors:\n\r",ch);
send_to_char("^Black ^Green ^Blue ^Cyan ^Red ^Orange ^Purple ^Grey\n\r",ch);
send_to_char("-------\n\r",ch);
send_to_char("NOTE: When setting background and regular colors, the BACKGROUND\n\r",ch);
send_to_char("Color MUST come AFTER the regular!\n\r",ch);
*/
send_to_char("For details see HELP COLOR, and also, for setting strings of text\n\r",ch);
send_to_char("Please use the regular color codes available in HELP PCOLORS\n\r",ch);
return;
}

/*
 * Parses the string, and sends back whats needed, this is a MAIN function
 * as everything is sent here to be looked at, if the player has mapped
 * this to a string (for channels) it will return that string, if the
 * player has only specified a color (room names, room descriptions)
 * it will return the currect color for that group of text --GW
 */
char *colormap_parse( CHAR_DATA *ch, int map_type, bool advanced, char *speaker,char *string )
{
CMAP_DATA *map;
char *color_string;
char buf[MSL];
char *pnt;
CHAR_DATA *vch;
char *speak=NULL;

map=find_char_map_by_type(ch, map_type);

/* make Sure can_see is obeyed! --GW */
if (advanced && speaker)
{
 vch=get_char(speaker);
 if ( !can_see( ch, vch ) )
   speak=STRALLOC("Someone");
  else
   speak=speaker;
}

if (!advanced)
{
  color_string=find_real_color_string(map);
  sprintf( buf, "%s%s&w", color_string,string );
}

if (advanced)
{
 if (speaker)
  sprintf(buf,map->remap_string,speak);
 else
  sprintf(buf,map->remap_string,"");
}

pnt = STRALLOC(buf);
return pnt;
}

/*
 * Create a Map in the players data Structure, and set it up --GW 
 */
void create_map(CHAR_DATA *ch,int map_type,int color_num,bool string,char *txt )
{
CMAP_DATA *map=NULL;

if ( !ch->pcdata->color_maps )
   setup_char_color_maps(ch);

CREATE( map, CMAP_DATA, 1 );

if ( string )
{
  txt=advanced_map_convert(txt);
  map->remap=1;
  map->remap_string=STRALLOC(txt);
}

map->mapped_color=color_num;
map->map_type=map_type;

LINK( map, ch->pcdata->color_maps->first_map,ch->pcdata->color_maps->last_map, next, prev );
return;
}

/*
 * Free a Chars Color Maps --GW
 */
void free_char_colormaps( CHAR_DATA *ch )
{
CMAP_DATA *map, *map_next;

for ( map=ch->pcdata->color_maps->first_map; map; map = map_next )
{
  map_next = map->next;
  
  if ( map->remap_string )
    STRFREE( map->remap_string );

  UNLINK( map, ch->pcdata->color_maps->first_map,ch->pcdata->color_maps->last_map, next, prev );
  DISPOSE(map);
}

DISPOSE(ch->pcdata->color_maps);
return;
}

/*
 * Loads a Color Map --GW
 */
void load_char_cmap( CHAR_DATA *ch, char *argument )
{
char arg1[MIL];
char arg2[MIL];
char arg3[MIL];
sh_int remap=0;
int mapped_color=0;
int map_type=0;
char *txt;
bool string=FALSE;
int cnt=0;

argument = one_argument( argument, arg1 ); /* Remap */
argument = one_argument( argument, arg2 ); /* Mapped_color */
argument = one_argument( argument, arg3 ); /* map_type */
/* Left over is Remap String */

/* Setup Vars */
remap=atoi(arg1);
mapped_color=atoi(arg2);
map_type=atoi(arg3);
for( cnt=0; argument[cnt]; cnt++ )
{
 if ( argument[cnt] && argument[cnt+1] && argument[cnt+2] )
   if ( argument[cnt] == '*' && argument[cnt+1] == '!' && argument[cnt+2] == '*' )
     argument[cnt] = '\0';
}
txt=argument;

if (mapped_color==0)
string=TRUE;

create_map(ch,map_type,mapped_color,string,txt);
return;
}

/*
 * Saves all the Characters Color Maps --GW 
 */
void save_char_cmaps( FILE *fp, CHAR_DATA *ch )
{
CMAP_DATA *map, *map_next;

if ( !ch->pcdata->color_maps )
   setup_char_color_maps(ch);

for ( map=ch->pcdata->color_maps->first_map; map; map = map_next )
{
  map_next=map->next;
  fprintf(fp,"CMAP %d %d %d %s*!*\n",map->remap, map->mapped_color,
	map->map_type, map->remap_string);
}

return;
}

/*
 * Get a Map Type from the Keyword for it --GW
 */
int get_map_type( char *name, bool immortal )
{
int map_num=0;

switch( tolower(name[0]) )
{
  /* Auction, Ask, Avatar */
  case 'a':
//     if ( !str_cmp( name,"auction" ) )
//	map_num=CMAP_AUCTION;
     if ( !str_cmp( name,"ask" ) )
	map_num=CMAP_ASK;
     if ( !str_cmp( name,"avatar" ) )
	map_num=CMAP_AVATAR;
     break;

  /* Clan, Council */
  case 'c':
     if ( !str_cmp( name,"clan" ) )
	map_num=CMAP_CLAN;
     if ( !str_cmp( name,"council") )
	map_num=CMAP_COUNCIL;
     break;

  /* Exits */
  case 'e':
      if ( !str_cmp( name, "exits" ) )
        map_num=CMAP_EXITS;
     break;

  /* Flame */
  case 'f':
      if ( !str_cmp( name, "flame" ) )
	map_num=CMAP_FLAME;
     break;

  /* Info */
//  case 'i':
//      if ( !str_cmp( name, "info" ) )
//	map_num=CMAP_INFO;
//     break;

  /* Mob, Music */
  case 'm':
     if ( !str_cmp( name,"mob" ) )
	map_num=CMAP_MOB;
     if ( !str_cmp( name,"music" ) )
	map_num=CMAP_MUSIC;
     break;

  /* Obj */
  case 'o':
      if ( !str_cmp( name, "obj" ) )
	map_num=CMAP_OBJ;
     break;

  /* Play */
  case 'p':
      if ( !str_cmp( name, "play" ) )
	map_num=CMAP_PLAY;
     break;

  /* Quest */
  case 'q':
      if ( !str_cmp( name, "quest" ) )
	map_num=CMAP_QUEST;
     break;

  /* Rumor, RoomDesc, RoomName */
  case 'r':
     if ( !str_cmp( name,"rumor" ) )
	map_num=CMAP_RUMOR;
     if ( !str_cmp( name,"roomdesc" ) )
	map_num=CMAP_ROOMDESC;
     if ( !str_cmp( name,"roomname" ) )
	map_num=CMAP_ROOMNAME;
     break;

  /* Shout, Socials */
  case 's':
     if ( !str_cmp( name,"shout" ) )
	map_num=CMAP_SHOUT;
     if ( !str_cmp( name,"socials" ) )
	map_num=CMAP_SOCIALS;
     break;

  /* Tells */
  case 't':
      if ( !str_cmp( name, "tells" ) )
	map_num=CMAP_TELLS;
     break;

  /* War */
  case 'w':
      if ( !str_cmp( name, "war" ) )
	map_num=CMAP_WAR;
     break;

  /* Yell */
  case 'y':
      if ( !str_cmp( name, "yell" ) )
	map_num=CMAP_YELL;
     break;
}

/* Gods Only */
if ( immortal && map_num == 0 )
{
  switch( tolower(name[0]) )
  {
    /* Immtalk, Imp */
    case 'i':
     if ( !str_cmp( name,"immtalk" ) )
	map_num=CMAP_IMMTALK;
     if ( !str_cmp( name,"imp" ) )
	map_num=CMAP_IMP;
     break;

    /* Olympus */
    case 'o':
      if ( !str_cmp( name, "olympus" ) )
	map_num=CMAP_OLYMPUS;
     break;

    /* NewbieChat */
    case 'n':
      if ( !str_cmp( name, "newbiechat" ) )
	map_num=CMAP_NEWBIECHAT;
     break;

    /* Think */
    case 't':
      if ( !str_cmp( name, "think" ) )
	map_num=CMAP_THINK;
     break;
  }
}

return map_num;
}

/*
 * Get the Color Number from a name --GW
 */
int get_color_num( char *color )
{
int cnum=0;

switch( tolower(color[0]) )
{
  case '^':
	if ( !str_cmp( color, "^black" ) )
	   cnum=CMCOLOR__BLACK;
	if ( !str_cmp( color, "^green" ) )
	   cnum=CMCOLOR__GREEN;
	if ( !str_cmp( color, "^blue" ) )
	   cnum=CMCOLOR__BLUE;
	if ( !str_cmp( color, "^cyan" ) )
	   cnum=CMCOLOR__CYAN;
	if ( !str_cmp( color, "^red" ) )
	   cnum=CMCOLOR__RED;
	if ( !str_cmp( color, "^orange" ) )
	   cnum=CMCOLOR__ORANGE;
	if ( !str_cmp( color, "^purple" ) )
	   cnum=CMCOLOR__PURPLE;
	if ( !str_cmp( color, "^grey" ) )
	   cnum=CMCOLOR__GREY;
	break;

  default:
	if ( !str_cmp( color, "black" ) )
	   cnum=CMCOLOR_BLACK;
	if ( !str_cmp( color, "blood" ) )
	   cnum=CMCOLOR_BLOOD;
	if ( !str_cmp( color, "green" ) )
	   cnum=CMCOLOR_GREEN;
	if ( !str_cmp( color, "orange" ) )
	   cnum=CMCOLOR_BROWN;
	if ( !str_cmp( color, "dblue" ) )
	   cnum=CMCOLOR_DBLUE;
	if ( !str_cmp( color, "purple" ) )
	   cnum=CMCOLOR_PURPLE;
	if ( !str_cmp( color, "cyan" ) )
	   cnum=CMCOLOR_CYAN;
	if ( !str_cmp( color, "grey" ) )
	   cnum=CMCOLOR_GREY;
	if ( !str_cmp( color, "dgrey" ) )
	   cnum=CMCOLOR_DGREY;
	if ( !str_cmp( color, "lred" ) )
	   cnum=CMCOLOR_LRED;
	if ( !str_cmp( color, "lgreen" ) )
	   cnum=CMCOLOR_LGREEN;
	if ( !str_cmp( color, "yellow" ) )
	   cnum=CMCOLOR_YELLOW;
	if ( !str_cmp( color, "blue" ) )
	   cnum=CMCOLOR_BLUE;
	if ( !str_cmp( color, "lblue" ) )
	   cnum=CMCOLOR_LBLUE;
	if ( !str_cmp( color, "white" ) )
	   cnum=CMCOLOR_WHITE;
        break;
}

return cnum;
}

/*
 * Check to see if this map can be a string, or only a color --GW
 * False if its only a color
 * True is its a string.
 */
bool colorstringcheck( int map_type )
{
if ( map_type > CMAP_AVATAR && map_type < CMAP_IMMTALK )
return FALSE;  

return TRUE;
}

/*
 * Initilize a Characters Color Map Settings --GW
 */
void setup_char_color_maps( CHAR_DATA *ch )
{
CREATE( ch->pcdata->color_maps, COLORMAP_DATA, 1 );
ch->pcdata->color_maps->first_map=NULL;
ch->pcdata->color_maps->last_map=NULL;
return;
}

void set_cmap_bv( CHAR_DATA *ch, int map_type )
{
int bv=0;

bv = get_cmap_bv_by_type(map_type);

if ( bv > 0 )
SET_BIT( ch->pcdata->colormap_settings, bv );

return;
}

void remove_cmap_bv( CHAR_DATA *ch, int map_type )
{
int bv=0;

bv = get_cmap_bv_by_type(map_type);

if ( bv > 0 )
REMOVE_BIT( ch->pcdata->colormap_settings, bv );

return;
}

void delete_char_color_map( CHAR_DATA *ch, int map_type )
{
CMAP_DATA *map, *map_next;

for ( map=ch->pcdata->color_maps->first_map; map; map = map_next )
{
  map_next = map->next;

  if ( map->map_type == map_type )
  {
    if ( map->remap_string )
      STRFREE( map->remap_string );

    UNLINK( map,ch->pcdata->color_maps->first_map,ch->pcdata->color_maps->last_map, next, prev );
    DISPOSE(map);
  }

}

return;
}

/*
 * Checks to see if the character has this mapped to another color setting
 * --GW
 */
bool colormap_check( CHAR_DATA *ch, int map_type )
{
int bv=0;

if ( IS_NPC(ch) )
return FALSE;

bv = get_cmap_bv_by_type(map_type);

if ( IS_SET( ch->pcdata->colormap_settings, bv ) )
return TRUE;

return FALSE;
}

/*
 * Checks the map string for the @@ characters --GW
 */
bool advanced_map_name_check( char *argument )
{
int str=0;

    for ( str = 0; argument[str] != '\0'; str++ )
    {
    if ( argument[str] == '%' )
    return FALSE;
    }
    
    for ( str = 0; argument[str] != '\0'; str++ )
    {    
    if ( argument[str] == '@' && argument[str+1] && argument[str+1] =='@' )
       return TRUE;  
    }  
  
return FALSE;
}

char *advanced_map_convert( char *argument )
{
int str=0;

    for ( str = 0; argument[str] != '\0'; str++ )
    {    
      if ( argument[str] == '@' && argument[str+1] && argument[str+1] =='@' )
      {
         argument[str] = '%';
         argument[str+1] = 's';
      }  
    }
 
return argument;
}


int get_cmap_bv_by_type( int map_type )
{
int bv=0;

switch( map_type )
{
   case CMAP_RUMOR:
    bv=BV01;
    break;
   case CMAP_TELL:
    bv=BV02;
    break;
   case CMAP_AUCTION:
    bv=BV03;
    break;
   case CMAP_PLAY:
    bv=BV04;
    break;
   case CMAP_INFO:
    bv=BV05;
    break;
   case CMAP_QUEST:
    bv=BV06;
    break;
   case CMAP_WAR:
    bv=BV07;
    break;
   case CMAP_MUSIC:
    bv=BV08;
    break;
   case CMAP_ASK:
    bv=BV09;
    break;
   case CMAP_FLAME:
    bv=BV10;
    break;
   case CMAP_SHOUT:
    bv=BV11;
    break;
   case CMAP_YELL:
    bv=BV12;
    break;
   case CMAP_CLAN:
    bv=BV13;
    break;
   case CMAP_COUNCIL:
    bv=BV14;
    break;
   case CMAP_AVATAR:
    bv=BV15;
    break;
   case CMAP_TELLS:
    bv=BV16;
    break;
   case CMAP_ROOMDESC:
    bv=BV17;
    break;
   case CMAP_ROOMNAME:
    bv=BV18;
    break;
   case CMAP_SOCIALS:
    bv=BV19;
    break;
   case CMAP_EXITS:
    bv=BV20;
    break;
   case CMAP_OBJ:
    bv=BV21;
    break;
   case CMAP_MOB:
    bv=BV22;
    break;
   case CMAP_IMMTALK:
    bv=BV23;
    break;
   case CMAP_IMP:
    bv=BV24;
    break;
   case CMAP_OLYMPUS:
    bv=BV25;
    break;
   case CMAP_NEWBIECHAT:
    bv=BV26;
    break;
   case CMAP_THINK:
    bv=BV27;
    break;
}

return bv;
}

CMAP_DATA *find_char_map_by_type(CHAR_DATA *ch, int map_type)
{
CMAP_DATA *map, *map_next;

for ( map=ch->pcdata->color_maps->first_map; map; map = map_next )
{
  map_next = map->next;

  if ( map->map_type == map_type )
  return map;

}

return NULL;
}

char *find_real_color_string(CMAP_DATA *map)
{
char color[5];
char *pnt;

switch(map->mapped_color)
{
  case CMCOLOR_BLACK:
    strcpy(color,"&x");
    break;
  case CMCOLOR_BLOOD:
    strcpy(color,"&r");
    break;
  case CMCOLOR_GREEN:
    strcpy(color,"&g");
    break;
  case CMCOLOR_BROWN:
    strcpy(color,"&O");
    break;
  case CMCOLOR_DBLUE:
    strcpy(color,"&b");
    break;
  case CMCOLOR_PURPLE:
    strcpy(color,"&p");
    break;
  case CMCOLOR_CYAN:
    strcpy(color,"&c");
    break;
  case CMCOLOR_GREY:
    strcpy(color,"&w");
    break;
  case CMCOLOR_DGREY:
    strcpy(color,"&z");
    break;
  case CMCOLOR_LRED:
    strcpy(color,"&R");
    break;
  case CMCOLOR_LGREEN:
    strcpy(color,"&G");
    break;
  case CMCOLOR_YELLOW:
    strcpy(color,"&Y");
    break;
  case CMCOLOR_BLUE:
    strcpy(color,"&B");
    break;
  case CMCOLOR_LBLUE:
    strcpy(color,"&C");
    break;
  case CMCOLOR_WHITE:
    strcpy(color,"&W");
    break;
  case CMCOLOR__BLACK:
    strcpy(color,"^x");
    break;
  case CMCOLOR__GREEN:
    strcpy(color,"^g");
    break;
  case CMCOLOR__BLUE:
    strcpy(color,"^b");
    break;
  case CMCOLOR__CYAN:
    strcpy(color,"^c");
    break;
  case CMCOLOR__RED:
    strcpy(color,"^r");
    break;
  case CMCOLOR__ORANGE:
    strcpy(color,"^O");
    break;
  case CMCOLOR__PURPLE:
    strcpy(color,"^p");
    break;
  case CMCOLOR__GREY:
    strcpy(color,"^w");
    break;
}
pnt=STRALLOC(color);

return pnt;
}

int get_real_act_color_num(int orig)
{
int color=0;

switch(orig)
{
  case CMCOLOR_BLACK:
    color=AT_BLACK;
    break;
  case CMCOLOR_BLOOD:
    color=AT_BLOOD;
    break;
  case CMCOLOR_GREEN:
    color=AT_GREEN;
    break;
  case CMCOLOR_BROWN:
    color=AT_ORANGE;
    break;
  case CMCOLOR_DBLUE:
    color=AT_DBLUE;
    break;
  case CMCOLOR_PURPLE:
    color=AT_PURPLE;
    break;
  case CMCOLOR_CYAN:
    color=AT_CYAN;
    break;
  case CMCOLOR_GREY:
    color=AT_GREY;
    break;
  case CMCOLOR_DGREY:
    color=AT_DGREY;
    break;
  case CMCOLOR_LRED:
    color=AT_RED;
    break;
  case CMCOLOR_LGREEN:
    color=AT_GREEN;
    break;
  case CMCOLOR_YELLOW:
    color=AT_YELLOW;
    break;
  case CMCOLOR_BLUE:
    color=AT_BLUE;
    break;
  case CMCOLOR_LBLUE:
    color=AT_LBLUE;
    break;
  case CMCOLOR_WHITE:
    color=AT_WHITE;
    break;
  case CMCOLOR__BLACK:
    color=AT_BLACK;
    break;
  case CMCOLOR__GREEN:
    color=AT_GREEN;
    break;
  case CMCOLOR__BLUE:
    color=AT_BLUE;
    break;
  case CMCOLOR__CYAN:
    color=AT_CYAN;
    break;
  case CMCOLOR__RED:
    color=AT_RED;
    break;
  case CMCOLOR__ORANGE:
    color=AT_ORANGE;
    break;
  case CMCOLOR__PURPLE:
    color=AT_PURPLE;
    break;
  case CMCOLOR__GREY:
    color=AT_GREY;
    break;
}

return color;
}

int get_channel_cmap_num(int chan)
{
int cmap=0;

switch( chan )
{
  case CHANNEL_CHAT:
     cmap=CMAP_RUMOR;
     break;
  case CHANNEL_TELLS:
     cmap=CMAP_TELL;
     break;
  case CHANNEL_AUCTION:
     cmap=CMAP_AUCTION;
     break;
  case CHANNEL_IC:
     cmap=CMAP_PLAY;
     break;
  case CHANNEL_INFO:
     cmap=CMAP_INFO;
     break;
  case CHANNEL_QUEST:
     cmap=CMAP_QUEST;
     break;
  case CHANNEL_WARTALK:
     cmap=CMAP_WAR;
     break;
  case CHANNEL_MUSIC:
     cmap=CMAP_MUSIC;
     break;
  case CHANNEL_ASK:
     cmap=CMAP_ASK;
     break;
  case CHANNEL_FLAME:
     cmap=CMAP_FLAME;
     break;
  case CHANNEL_SHOUT:
     cmap=CMAP_SHOUT;
     break;
  case CHANNEL_YELL:
     cmap=CMAP_YELL;
     break;
  case CHANNEL_CLAN:
     cmap=CMAP_CLAN;
     break;
  case CHANNEL_COUNCIL:
     cmap=CMAP_COUNCIL;
     break;
  case CHANNEL_AVTALK:
     cmap=CMAP_AVATAR;
     break;
  case CHANNEL_IMMTALK:
     cmap=CMAP_IMMTALK;
     break;
  case CHANNEL_HIGHGOD:  
     cmap=CMAP_IMP;
     break;
  case CHANNEL_OLYMPUS:
     cmap=CMAP_OLYMPUS;
     break;
  case CHANNEL_NEWBIE:
     cmap=CMAP_NEWBIECHAT;
     break;
  case CHANNEL_HIGH:
     cmap=CMAP_THINK;
     break;
}

return cmap;
}

void do_colors( CHAR_DATA *ch, char *argument )
{
CMAP_DATA *map, *map_next;
int cnt=0;
char buf[MSL];
char *color;

if ( IS_NPC(ch) )
return;

send_to_char("Color Settings\n\r",ch);
send_to_char("==============\n\r",ch);

ch_printf( ch, "Color is %s.\n\r", IS_SET( ch->act, PLR_ANSI ) ? "Active" : "Disabled" );
for( map = ch->pcdata->color_maps->first_map; map; map=map_next )
{
   map_next=map->next;
  if ( map->mapped_color > 0 )
  {
    cnt++;
    color = get_color_word_by_num(map->mapped_color);
    sprintf(buf, "%-11s:  %s\n\r",get_map_name_by_num(map->remap),
	color);
    send_to_char(buf,ch);
  }
  else
  {  
    cnt++;
    sprintf(buf, "%-11s:  %s\n\r",get_map_name_by_num(map->remap),
	map->remap_string);
    send_to_char(buf,ch);
  }
}

if ( cnt > 0 )
  ch_printf( ch, "%d Color Maps Found.\n\r",cnt);
else
  send_to_char("No Color Maps Found.\n\r",ch);

return;
}

char *get_color_word_by_num( int num )
{
char *color=NULL;

switch(num)
{
 case CMCOLOR_BLACK:
	color = STRALLOC("Black");
	break;
 case CMCOLOR_BLOOD:
	color = STRALLOC("Blood");
	break;
 case CMCOLOR_GREEN:
	color = STRALLOC("Green");
	break;
 case CMCOLOR_BROWN:
	color = STRALLOC("Orange");
	break;
 case CMCOLOR_DBLUE:
	color = STRALLOC("Dark Blue");
	break;
 case CMCOLOR_PURPLE:
	color = STRALLOC("Purple");
	break;
 case CMCOLOR_CYAN:
	color = STRALLOC("Cyan");
	break;
 case CMCOLOR_GREY:
	color = STRALLOC("Grey");
	break;
 case CMCOLOR_DGREY:
	color = STRALLOC("Dark Grey");
	break;
 case CMCOLOR_LRED:
	color = STRALLOC("Light Red");
	break;
 case CMCOLOR_LGREEN:
	color = STRALLOC("Light Green");
	break;
 case CMCOLOR_YELLOW:
	color = STRALLOC("Yellow");
	break;
 case CMCOLOR_BLUE:
	color = STRALLOC("Blue");
	break;
 case CMCOLOR_LBLUE:
	color = STRALLOC("Light Blue");
	break;
 case CMCOLOR_WHITE:
	color = STRALLOC("White");
	break;
}

return color;
}

char *get_map_name_by_num( int num )
{
char *name=NULL;

switch(num)
{
  case CMAP_RUMOR:
	name = STRALLOC("Rumor");
	break;
  case CMAP_TELL:
	name = STRALLOC("Tells");
	break;
  case CMAP_AUCTION:
	name = STRALLOC("Auction");
	break;
  case CMAP_PLAY:
	name = STRALLOC("Play");
	break;
  case CMAP_INFO:
	name = STRALLOC("Info");
	break;
  case CMAP_QUEST:
	name = STRALLOC("Quest");
	break;
  case CMAP_WAR:
	name = STRALLOC("War");
	break;
  case CMAP_MUSIC:
	name = STRALLOC("Music");
	break;
  case CMAP_ASK:
	name = STRALLOC("Ask");
	break;
  case CMAP_FLAME:
	name = STRALLOC("Flame");
	break;
  case CMAP_SHOUT:
	name = STRALLOC("Shout");
	break;
  case CMAP_YELL:
	name = STRALLOC("Yell");
	break;
  case CMAP_CLAN:
	name = STRALLOC("Clan");
	break;
  case CMAP_COUNCIL:
	name = STRALLOC("Council");
	break;
  case CMAP_AVATAR:
	name = STRALLOC("Avatar");
	break;
  case CMAP_TELLS:
	name = STRALLOC("Tells");
	break;
  case CMAP_ROOMDESC:
	name = STRALLOC("RoomDesc");
	break;
  case CMAP_ROOMNAME:
	name = STRALLOC("RoomName");
	break;
  case CMAP_SOCIALS:
	name = STRALLOC("Socials");
	break;
  case CMAP_EXITS:
	name = STRALLOC("Exits");
	break;
  case CMAP_OBJ:
	name = STRALLOC("Obj");
	break;
  case CMAP_MOB:
	name = STRALLOC("Mob");
	break;
  case CMAP_IMMTALK:
	name = STRALLOC("Immtalk");
	break;
  case CMAP_IMP:
	name = STRALLOC("Imp");
	break;
  case CMAP_OLYMPUS:
	name = STRALLOC("Olympus");
	break;
  case CMAP_NEWBIECHAT:
	name = STRALLOC("Newbiechat");
	break;
  case CMAP_THINK:
	name = STRALLOC("Think");
	break;
}

return name;
}