dbna/clans/
dbna/councils/
dbna/deity/
dbna/gods/
dbna/houses/
dbna/space/
/****************************************************************************
 * [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;
}