#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_INFINITE &&
(!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: &%c%s%-15s&w^x",
at_color_table[at].name,
colors[color], (blink ? "+^z" : " "),
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 ((level >= LEVEL_INFINITE || !str_cmp(ch->name, "altrag")) && !str_cmp(arg, "name"))
{
argument = one_argument(argument, arg);
if (!*arg)
{
send_to_char("Name it what?\n\r", ch);
return;
}
DISPOSE(at_color_table[at].name);
at_color_table[at].name = str_dup(arg);
send_to_char("Color name set.\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;
}