/************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefiting. We hope that you share your changes too. What goes * * around, comes around. * *************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * *************************************************************************** * 1stMud ROM Derivative (c) 2001-2004 by Markanth * * http://www.firstmud.com/ <markanth@firstmud.com> * * By using this code you have agreed to follow the term of * * the 1stMud license in ../doc/1stMud/LICENSE * ***************************************************************************/ #include "merc.h" #include "tables.h" #include "interp.h" #include "recycle.h" #include "data_table.h" #include "olc.h" bool is_ansi_printed_char(char c) { switch (c) { case ' ': case '-': case COLORCODE: return true; default: return false; } } int ansi_skip(const char *pstr) { int i = 0; const char *str = pstr; if (*str != COLORCODE) return i; str++; i++; if (isdigit(*str)) { str++; i++; if (*str == '+') { str++; i++; } else return i; } if (*str == '=') { str++; i++; } switch (*str) { case 'T': case 't': str += 3; i += 3; do { str++; i++; } while (*str && *str != '"'); break; default: break; } return i; } char *make_custom_color(int slot) { return FORMATF("%s%d%s", CSSTR, slot, CESTR); } color_value_t random_color(color_attr_t att) { switch (att) { case CT_ATTR: return (color_value_t) number_range(CL_NONE, CL_BRIGHT); case CT_FORE: return (color_value_t) number_range(FG_RED, FG_WHITE); case CT_BACK: return (color_value_t) number_range(BG_RED, BG_WHITE); default: return CL_NONE; } } void convert_random(colatt_t * col) { int i; for (i = 0; i < CT_MAX; i++) if (getcol(col, i) == CL_RANDOM) getcol(col, i) = random_color((color_attr_t) i); if (VALID_FG(getcol(col, CT_SAVE))) { if (VALID_FG(getcol(col, CT_FORE))) getcol(col, CT_BACK) = (color_value_t) (getcol(col, CT_FORE) + CL_MOD); getcol(col, CT_FORE) = (color_value_t) (getcol(col, CT_SAVE)); } if (VALID_CL(getcol(col, CT_SAVE))) getcol(col, CT_ATTR) = getcol(col, CT_SAVE); getcol(col, CT_SAVE) = CL_MOD; } char *make_color(CharData * ch, colatt_t * col) { int len = 0; char code[100]; convert_random(col); if (ch) { if (getcol(col, CT_ATTR) == CL_BLINK) { if (VT100_SET(ch, NO_BLINKING)) getcol(col, CT_ATTR) = CL_NONE; } if (getcol(col, CT_FORE) == FG_BLACK) { if (VT100_SET(ch, DARK_MOD)) getcol(col, CT_ATTR) = CL_BRIGHT; } if (getcol(col, CT_ATTR) == CL_BRIGHT) { if (VT100_SET(ch, DARK_COLORS)) getcol(col, CT_ATTR) = CL_NONE; } } if (!VT100_SET(ch, BROKEN_ANSI)) { if (VALID_CL(getcol(col, CT_ATTR))) len = sprintf(code + len, ";%d", getcol(col, CT_ATTR)); if (VALID_FG(getcol(col, CT_FORE))) len = sprintf(code + len, ";%d", getcol(col, CT_FORE)); if (VALID_BG(getcol(col, CT_BACK))) len = sprintf(code + len, ";%d", getcol(col, CT_BACK)); if (len > 0) return FORMATF(ESC "[%sm", code + 1); else { bug("make_color(): invalid color value(s)"); return ""; } } else { if (!VALID_CL(getcol(col, CT_ATTR))) getcol(col, CT_ATTR) = CL_NONE; if (!VALID_FG(getcol(col, CT_FORE))) getcol(col, CT_FORE) = FG_WHITE; if (!VALID_BG(getcol(col, CT_BACK))) getcol(col, CT_BACK) = BG_BLACK; return FORMATF(ESC "[%d;%d;%dm", getcol(col, CT_ATTR), getcol(col, CT_FORE), getcol(col, CT_BACK)); } } void set_col_attr(char c, colatt_t * col, CharData * ch) { int z; switch (c) { case '?': case '`': getcol(col, CT_ATTR) = CL_RANDOM; getcol(col, CT_FORE) = FG_RANDOM; break; case 'z': getcol(col, CT_ATTR) = CL_RANDOM; getcol(col, CT_BACK) = BG_RANDOM; break; case 'Z': for (z = 0; z < CT_MAX; z++) getcol(col, z) = CL_RANDOM; break; case 'b': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_BLUE; break; case 'c': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_CYAN; break; case 'g': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_GREEN; break; case 'm': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_MAGENTA; break; case 'd': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_BLACK; break; case 'r': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_RED; break; case 'y': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_YELLOW; break; case 'w': getcol(col, CT_ATTR) = CL_NONE; getcol(col, CT_FORE) = FG_WHITE; break; case 'B': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_BLUE; break; case 'C': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_CYAN; break; case 'G': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_GREEN; break; case 'M': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_MAGENTA; break; case 'D': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_BLACK; break; case 'R': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_RED; break; case 'W': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_WHITE; break; case 'Y': getcol(col, CT_ATTR) = CL_BRIGHT; getcol(col, CT_FORE) = FG_YELLOW; break; default: break; } } char *colorize(const char *str) { static int c; static char out[4][MSL]; char *result; size_t a, b = 0; if (NullStr(str)) return "{?"; ++c, c %= 4; result = out[c]; for (a = 0; str[a] != NUL; a++) { if (str[a] == COLORCODE) { a += ansi_skip(&str[a]); continue; } else if (str[a] == CUSTOMSTART) { do { a++; } while (str[a] != CUSTOMEND); a++; continue; } else if (str[a] == MXP_BEGc) { do { a++; } while (str[a] != MXP_ENDc); a++; continue; } result[b++] = COLORCODE; result[b++] = '?'; result[b++] = str[a]; } result[b++] = COLORCODE; result[b++] = 'x'; result[b++] = NUL; return (result); } void goto_xy(CharData * ch, int col, int row) { chprintf(ch, ESC "[%u;%uH", row, col); } void clear_window(CharData * ch) { chprint(ch, ESC "[r"); } void clear_screen(CharData * ch) { chprint(ch, ESC "[2J"); } void set_default_color(colatt_t * color, int slot, ColorTemplate * scheme) { int i = 0; ColorTemplate *v = !scheme ? default_color_scheme : scheme; if (slot == _NONE) { copy_colors(color, v->colors); } else { for (i = 0; i < MAX_CUSTOM_COLOR; i++) { if (color_table[i].slot == slot) { copy_color(color[slot], v->colors[slot]); break; } } } return; } void default_color(CharData * ch, int slot) { if (!ch || IsNPC(ch)) return; if (!ch->pcdata->color_scheme) { if (!default_color_scheme) create_default_color_scheme(); ch->pcdata->color_scheme = default_color_scheme; } if (!ch->pcdata->colors) { alloc_mem(ch->pcdata->colors, colatt_t, MAX_CUSTOM_COLOR); copy_colors(ch->pcdata->colors, ch->pcdata->color_scheme->colors); } set_default_color(ch->pcdata->colors, slot, ch->pcdata->color_scheme); } Lookup_Fun(color_lookup) { int i; if (NullStr(name)) return -1; for (i = 0; i < MAX_CUSTOM_COLOR; i++) if (!str_prefix(name, color_table[i].name)) return i; return -1; } void color_convert_prefix(char colcode, char *text) { char buf[MIL * 2]; bool moved = false; char *src = text; char *dest = text; assert(colcode != COLORCODE); for (; *src;) { if (*src == COLORCODE) { if (!moved) { strcpy(buf, src); src = buf; moved = true; } *dest++ = *src; *dest++ = *src++; continue; } if (*src == colcode) { src++; if (*src == NUL) { *dest++ = COLORCODE; *dest = NUL; return; }; if (*src == colcode) { *dest++ = *src++; continue; } *dest++ = COLORCODE; *dest++ = *src++; continue; } *dest++ = *src++; } *dest = NUL; } void create_default_color_scheme(void) { int i; if (!default_color_scheme) default_color_scheme = new_color_template(); for (i = 0; i < MAX_CUSTOM_COLOR; i++) { copy_color(default_color_scheme->colors[color_table[i].slot], color_table[i].col_attr); } default_color_scheme->name = str_dup(color_scheme_default_name); default_color_scheme->description = str_dup(color_scheme_default_descript); Link(default_color_scheme, color_template, next, prev); } ColorTemplate *find_color_template(const char *template_name) { ColorTemplate *result; // first do an exact search for (result = color_template_first; result; result = result->next) { if (!str_cmp(result->name, template_name)) { return result; } } // do a count search if (is_number(template_name)) { int count = atoi(template_name); for (result = color_template_first; result; result = result->next) { if (--count < 1) { return result; } } return NULL; } // try a prefix match next for (result = color_template_first; result; result = result->next) { if (!str_prefix(result->name, template_name)) { return result; } } return NULL; } Do_Fun(custom_color_list) { ColorTemplate *pct; int count = 0; chprintln(ch, stringf(ch, 0, Center, "-=", " COLOR SCHEMES ")); for (pct = color_template_first; pct; pct = pct->next) { chprintlnf(ch, "[%2d] %-15s: %s", ++count, pct->name, pct->description); } chprintln(ch, draw_line(ch, "-=", 0)); } Do_Fun(custom_color_use) { ColorTemplate *new_scheme; if (NullStr(argument)) { chprintln(ch, "Syntax: color use <scheme/template name> (as per color list)"); chprintln(ch, "Syntax: color use <scheme/template number> (as per color list)"); return; } new_scheme = find_color_template(argument); if (!new_scheme) { chprintlnf(ch, "Could not find scheme/template '%s'", argument); return; } ch->pcdata->color_scheme = new_scheme; copy_colors(ch->pcdata->colors, new_scheme->colors); chprintlnf(ch, "Base color scheme changed to '%s'", new_scheme->name); } Do_Fun(custom_color_savescheme) { ColorTemplate *new_scheme; if (NullStr(argument)) { chprintln(ch, "Syntax: color savescheme <name of new scheme>"); return; } new_scheme = find_color_template(argument); if (new_scheme) { chprintlnf(ch, "There already exists a scheme '%s', you need something more unique.", new_scheme->name); return; } new_scheme = new_color_template(); alloc_mem(new_scheme->colors, colatt_t, MAX_CUSTOM_COLOR); copy_colors(new_scheme->colors, ch->pcdata->colors); new_scheme->name = str_dup(argument); new_scheme->description = str_dupf("A scheme by %s", ch->name); Link(new_scheme, color_template, next, prev); chprintln(ch, "Scheme created, use 'color description' to set a description for the scheme."); rw_color_template_data(act_write); chprintln(ch, "Colour schemes/templates saved"); } Do_Fun(custom_color_replacescheme) { ColorTemplate *new_scheme; if (NullStr(argument)) { chprintln(ch, "Syntax: color replacescheme <scheme/template number> (as per color list)"); return; } new_scheme = find_color_template(argument); if (!new_scheme) { chprintlnf(ch, "Could not find scheme/template '%s' to replace", argument); return; } copy_colors(new_scheme->colors, ch->pcdata->colors); rw_color_template_data(act_write); chprintlnf(ch, "Replaced scheme '%s'.", new_scheme->name); chprintln(ch, "Colour schemes/templates resaved"); } Do_Fun(custom_color_description) { ColorTemplate *new_scheme; char arg[MIL]; argument = one_argument(argument, arg); if (NullStr(argument)) { chprintln(ch, "Syntax: color descript <scheme/template number> new description"); return; } if (!is_number(arg)) { chprintln(ch, "You must specify a scheme by its number."); return; } new_scheme = find_color_template(arg); if (!new_scheme) { chprintlnf(ch, "Could not find scheme/template '%s' to change the description of.", argument); return; } chprintlnf(ch, "Colour schemes '%s' description '%s' replaced with '%s'", new_scheme->name, new_scheme->description, capitalize(argument)); replace_str(&new_scheme->description, capitalize(argument)); rw_color_template_data(act_write); chprintln(ch, "Colour schemes/templates resaved"); } Do_Fun(custom_color_rename) { ColorTemplate *new_scheme, *dup; char arg[MIL]; argument = one_argument(argument, arg); if (NullStr(argument)) { chprintln(ch, "Syntax: color rename <scheme/template number> new name"); return; } if (!is_number(arg)) { chprintln(ch, "You must specify a scheme by its number."); return; } new_scheme = find_color_template(arg); if (!new_scheme) { chprintlnf(ch, "Could not find scheme/template '%s' to rename.", argument); return; } dup = find_color_template(argument); if (dup) { chprintlnf(ch, "There already exists a scheme '%s', you need something more unique.", dup->name); return; } chprintlnf(ch, "Colour schemes '%s' description '%s' renamed to '%s'", new_scheme->name, new_scheme->description, argument); replace_str(&new_scheme->name, argument); rw_color_template_data(act_write); chprintln(ch, "Colour schemes/templates resaved"); } Do_Fun(custom_color_prefix) { if (argument[0] == COLORCODE && argument[1] == COLORCODE) { ((char *) argument)[1] = '\0'; } if (strlen(argument) > 1 || NullStr(argument)) { chprintln(ch, "syntax: color prefix <color prefix character>"); chprintln(ch, "This command is used to specify which character you "); chprintln(ch, "want to prefix color codes with."); if (ch->color_prefix != COLORCODE) { chprintlnf(ch, "Your current color code prefix is set to %c%c", ch->color_prefix, ch->color_prefix); } else { chprintln(ch, "Your current color code prefix is unset,"); chprintlnf(ch, " therefore you should prefix colors with the default %c%c", COLORCODE, COLORCODE); } return; } chprintlnf(ch, "Colour code prefix changed from %c%c to %s", ch->color_prefix, ch->color_prefix, argument); ch->color_prefix = *argument; } Do_Fun(custom_color_on) { if (!ch || IsNPC(ch) || !ch->desc) return; SetBit(ch->desc->desc_flags, DESC_COLOR); RemBit(ch->comm, COMM_NOCOLOR); chprintln(ch, colorize("Color is now ON!")); } Do_Fun(custom_color_off) { if (!ch || IsNPC(ch) || !ch->desc) return; chprintln(ch, casemix("Color is now OFF, <sigh>")); RemBit(ch->desc->desc_flags, DESC_COLOR); SetBit(ch->comm, COMM_NOCOLOR); } Do_Fun(custom_color_options) { flag_t vf; const char *name; if (NullStr(argument)) { print_all_on_off(ch, vt100_flags, ch->pcdata->vt100); return; } if ((vf = flag_value(vt100_flags, argument)) == NO_FLAG) { chprintln(ch, "Invalid option."); return; } name = capitalize(flag_string(vt100_flags, vf)); set_on_off(ch, &ch->pcdata->vt100, vf, FORMATF("%s ON.", name), FORMATF("%s OFF.", name)); return; } Do_Fun(custom_color_colors) { int i, j = 0, k = 0; chprintln(ch, "Attributes Foregrounds Backgrounds"); chprintln(ch, draw_line(ch, NULL, 58)); for (i = 0; color_attributes[i].name != NULL; i++) { chprintf(ch, "%-15s ", Upper(color_attributes[i].name)); if (color_foregrounds[j].name != NULL) chprintf(ch, "%-15s ", Upper(color_foregrounds[j++].name)); else chprintf(ch, "%-15s ", " "); if (color_backgrounds[k].name != NULL) chprintlnf(ch, "%s", Upper(color_backgrounds[k++].name)); else chprintln(ch, NULL); } while (color_foregrounds[j].name != NULL) { chprintf(ch, "%-15s %-15s ", " ", Upper(color_foregrounds[j++].name)); if (color_backgrounds[k].name != NULL) chprintlnf(ch, "%s", Upper(color_backgrounds[k++].name)); else chprintln(ch, NULL); } while (color_backgrounds[k].name != NULL) chprintlnf(ch, "%-15s %-15s %s", " ", " ", Upper(color_backgrounds[k++].name)); chprintln(ch, draw_line(ch, NULL, 58)); } char *format_color(colatt_t col) { static char buf[3][MSL]; static int i; char *r; ++i, i %= 3; r = buf[i]; if (VALID_BG(col[CT_BACK])) { strcpy(r, flag_string(color_backgrounds, col[CT_BACK])); strcat(r, " background"); } else { strcpy(r, flag_string(color_attributes, col[CT_ATTR])); if (VALID_FG(col[CT_FORE])) { strcat(r, " "); strcat(r, flag_string(color_foregrounds, col[CT_FORE])); } } return r; } bool compare_colors(colatt_t * a, colatt_t * b) { int i; for (i = 0; i < CT_MAX; i++) if (getcol(a, i) != getcol(b, i)) return false; return true; } void show_colors_to_char(CharData * ch, CharData * v) { Column Cd; Buffer *output; int i; output = new_buf(); set_cols(&Cd, ch, 2, COLS_BUF, output); bprintln(output, stringf(ch, 0, Center, "-=", "[ CUSTOM COLORS ]")); for (i = 0; i < MAX_CUSTOM_COLOR; i++) { if (IsSet(color_table[i].flags, COLOR_IMMORTAL) && !IsImmortal(ch)) continue; print_cols(&Cd, "%2d) %s%-10s{x: %s%s", i + 1, make_custom_color(i), color_table[i].name, !compare_colors(&v->pcdata->colors[i], &v-> pcdata->color_scheme->colors [i]) ? "{G*{x" : " ", color_table[i].description); } cols_nl(&Cd); bprintln(output, draw_line(ch, NULL, 0)); if (v == ch) bprintlnf(output, "\tCurrent color scheme in use: {W%s{x.", v->pcdata->color_scheme->name); else bprintlnf(output, "\t%s's current color scheme: {W%s{x.", Pers(v, ch), v->pcdata->color_scheme->name); bprintln(output, "A {G*{x symbol means the custom color is different than the current scheme."); sendpage(ch, buf_string(output)); free_buf(output); } Do_Fun(custom_color_show) { CharData *v; if (NullStr(argument) || (v = get_char_world(ch, argument)) == NULL || IsNPC(v)) { v = ch; } show_colors_to_char(ch, v); } void show_scheme_to_char(CharData * ch, CharData * v, ColorTemplate * scheme) { Column Cd; Buffer *output; int i; colatt_t *col = scheme->colors; output = new_buf(); set_cols(&Cd, ch, 2, COLS_BUF, output); bprintln(output, stringf(ch, 0, Center, "-=", "[ %s Color Scheme ]", scheme->name)); for (i = 0; i < MAX_CUSTOM_COLOR; i++) { if (IsSet(color_table[i].flags, COLOR_IMMORTAL) && !IsImmortal(ch)) continue; print_cols(&Cd, "%2d) %s%-10s{x: %s%s", i + 1, make_color(NULL, &col[i]), color_table[i].name, !compare_colors(&col[i], &v->pcdata->colors[i]) ? "{G*{x" : " ", color_table[i].description); } cols_nl(&Cd); bprintln(output, draw_line(ch, NULL, 0)); if (scheme != v->pcdata->color_scheme) bprintlnf(output, "%s is using the %s color scheme.", v->name, scheme->name); bprintln(output, "A {G*{x symbol means the custom color is different than the current scheme."); sendpage(ch, buf_string(output)); free_buf(output); } Do_Fun(custom_scheme_show) { CharData *v; ColorTemplate *sch; char name[MIL]; argument = one_argument(argument, name); if (NullStr(name)) { cmd_syntax(ch, NULL, n_fun, "[player] and/or [scheme]", NULL); return; } if ((v = get_char_world(ch, name)) == NULL || IsNPC(v)) { if ((sch = find_color_template(name)) == NULL) { chprintln(ch, "No such player or color scheme."); return; } v = ch; } else { sch = v->pcdata->color_scheme; } show_scheme_to_char(ch, v, sch); } Do_Fun(custom_color_reset) { copy_colors(ch->pcdata->colors, ch->pcdata->color_scheme->colors); chprintlnf(ch, "Custom colors reset to %s scheme.", ch->pcdata->color_scheme->name); } bool set_custom_color(const char *n_fun, CharData * ch, colatt_t * col, const char *argument) { int i, val; FlagTable *ctable = color_attributes; const char *cname = ""; char temp[MIL]; argument = one_argument(argument, temp); if (NullStr(temp)) { chprintln(ch, "You must specify an attribute to set."); return false; } for (i = 0; i < CT_MAX; i++) { if (NullStr(temp)) { break; } switch (i) { case CT_ATTR: ctable = color_attributes; cname = "attribute"; break; case CT_FORE: ctable = color_foregrounds; cname = "foreground"; break; case CT_BACK: ctable = color_backgrounds; cname = "background"; break; default: chprintln(ch, "error"); return false; } if ((val = flag_value(ctable, temp)) == NO_FLAG) { chprintlnf(ch, "Invalid %s color.", cname); break; } getcol(col, i) = (color_value_t) val; chprintlnf(ch, "%s %s set to %s.", n_fun, cname, flag_string(ctable, getcol(col, i))); argument = one_argument(argument, temp); } while (i < CT_MAX) { getcol(col, i) = CL_NONE; i++; } getcol(col, CT_SAVE) = CL_MOD; return true; } Do_Fun(custom_color_set) { char arg[MIL]; int pos; argument = one_argument(argument, arg); if (NullStr(arg) || (pos = color_lookup(arg)) == -1) { chprintln(ch, "Invalid custom color to set."); return; } set_custom_color(color_table[pos].name, ch, &ch->pcdata->colors[color_table[pos].slot], argument); } struct custom_color_cmd_type { const char *name; Do_F *do_fun; int level; const char *syntax; }; const struct custom_color_cmd_type custom_color_cmd_table[] = { {"show", custom_color_show, 0, "Shows your current color scheme."}, {"showscheme", custom_scheme_show, 0, "Shows another persons color scheme."}, {"set", custom_color_set, 0, "Sets a particular color in your color scheme."}, {"prefix", custom_color_prefix, 0, "Sets a particular character to be used to prefix color codes."}, {"reset", custom_color_reset, 0, "Resets all color customizations."}, {"list", custom_color_list, 0, "Lists all the mud color templates."}, {"use", custom_color_use, 0, "Use a particular color scheme/template."}, {"on", custom_color_on, 0, "Turn on your color."}, {"off", custom_color_off, 0, "Turn off your color."}, {"options", custom_color_options, 0, "Sets various display options."}, {"colors", custom_color_colors, 0, "List colors (attributes, foregrounds, backgrounds)"}, {"savescheme", custom_color_savescheme, LEVEL_IMMORTAL, "Save your current color settings as a scheme."}, {"replacescheme", custom_color_replacescheme, LEVEL_IMMORTAL, "Replace a current scheme with your scheme."}, {"description", custom_color_description, LEVEL_IMMORTAL, "Replace the description of a current scheme."}, {"rename", custom_color_rename, LEVEL_IMMORTAL, "Rename a scheme."}, {NULL, NULL, 0, ""} }; Do_Fun(do_color) { char arg[MIL]; int i; if (!ch->desc) { chprintln(ch, "You must have an active connection to use this command."); return; } argument = one_argument(argument, arg); if (NullStr(arg)) { chprintlnf(ch, "%s Customing Colour System", mud_info.name); chprintln(ch, "Syntax:"); for (i = 0; !NullStr(custom_color_cmd_table[i].name); i++) { if (custom_color_cmd_table[i].level > get_trust(ch)) { continue; } chprintlnf(ch, " color %-15s - %s", custom_color_cmd_table[i].name, custom_color_cmd_table[i].syntax); } return; } // find the command for (i = 0; !NullStr(custom_color_cmd_table[i].name); i++) { if (custom_color_cmd_table[i].level > get_trust(ch)) { continue; } if (!str_prefix(arg, custom_color_cmd_table[i].name)) { // found the command break; } } if (NullStr(custom_color_cmd_table[i].name)) { chprintlnf(ch, "Unrecognised Custom Colour command '%s'", arg); do_color(n_fun, ch, ""); return; } (*custom_color_cmd_table[i].do_fun) (custom_color_cmd_table[i].name, ch, argument); }