/****************************************************** Desolation of the Dragon MUD II (C) 1997, 1998 Jesse DeFer and Heath Leach http://dotd.mudservices.com dotd@dotd.mudservices.com ******************************************************/ /* *** DaleMUD ANSI_PARSER.C *** Parser ansi colors for act(); */ #include <stdio.h> #include <string.h> #include <ctype.h> #include <time.h> #include "mud.h" #include "ansi.h" /* $CMBFG, where M is modier, B is back group color and FG is fore $C0001 would be normal, black back, red fore. $C1411 would be bold, blue back, light yellow fore */ char *ansi_parse(char *code) { static char m[MSL]; char b[512], f[512]; if (!code) return (""); /* do modifier */ switch (code[0]) { case '0': sprintf(m, "%s", MOD_NORMAL); break; case '1': sprintf(m, "%s", MOD_BOLD); break; case '2': sprintf(m, "%s", MOD_FAINT); break; /* not used in ansi that I know of */ case '3': sprintf(m, "%s", MOD_NORMAL); break; case '4': sprintf(m, "%s", MOD_UNDERLINE); break; case '5': sprintf(m, "%s", MOD_BLINK); break; case '6': sprintf(m, "%s", MOD_REVERSE); break; default: sprintf(m, "%s", MOD_NORMAL); break; } /* do back ground color */ switch (code[1]) { case '0': sprintf(b, "%s", BK_BLACK); break; case '1': sprintf(b, "%s", BK_RED); break; case '2': sprintf(b, "%s", BK_GREEN); break; case '3': sprintf(b, "%s", BK_BROWN); break; case '4': sprintf(b, "%s", BK_BLUE); break; case '5': sprintf(b, "%s", BK_MAGENTA); break; case '6': sprintf(b, "%s", BK_CYAN); break; case '7': sprintf(b, "%s", BK_LT_GRAY); break; default: sprintf(b, "%s", BK_BLACK); break; } /* do foreground color */ switch (code[2]) { case '0': switch (code[3]) { /* 00-09 */ case '0': sprintf(f, "%s", FG_BLACK); break; case '1': sprintf(f, "%s", FG_RED); break; case '2': sprintf(f, "%s", FG_GREEN); break; case '3': sprintf(f, "%s", FG_BROWN); break; case '4': sprintf(f, "%s", FG_BLUE); break; case '5': sprintf(f, "%s", FG_MAGENTA); break; case '6': sprintf(f, "%s", FG_CYAN); break; case '7': sprintf(f, "%s", FG_LT_GRAY); break; case '8': sprintf(f, "%s", FG_DK_GRAY); break; case '9': sprintf(f, "%s", FG_LT_RED); break; default: sprintf(f, "%s", FG_DK_GRAY); break; } break; case '1': switch (code[3]) { /* 10-15 */ case '0': sprintf(f, "%s", FG_LT_GREEN); break; case '1': sprintf(f, "%s", FG_YELLOW); break; case '2': sprintf(f, "%s", FG_LT_BLUE); break; case '3': sprintf(f, "%s", FG_LT_MAGENTA); break; case '4': sprintf(f, "%s", FG_LT_CYAN); break; case '5': sprintf(f, "%s", FG_WHITE); break; default: sprintf(f, "%s", FG_LT_GREEN); break; } break; default: sprintf(f, "%s", FG_LT_RED); break; } strcat(m, b); /* add back ground */ strcat(m, f); /* add foreground */ return (m); } void str2ansi(char *p2, char *p1, int start, int stop) { int i, j; if ((start > stop) || (start < 0)) p2[0] = '\0'; /* null terminate string */ else { if (start == stop) { p2[0] = p1[start]; p2[1] = '\0'; } else { j = 0; /* start or (start-1) depends on start index */ /* if starting index for arrays is 0 then use start */ /* if starting index for arrays is 1 then use start-1 */ for (i = start; i <= stop; i++) p2[j++] = p1[i]; p2[j] = '\0'; /* null terminate the string */ } } if (strlen(p2) + 1 > 5) bug("DOH!"); /* remove this after test period */ } char *ParseAnsiColors(int UsingAnsi, char *txt) { static char buf[MSL * 4] = ""; char tmp[MIL * 4]; register int i, l, f = 0; buf[0] = 0; for (i = 0, l = 0; *txt;) { if (*txt == '$' && (toupper(*(txt + 1)) == 'C' || (*(txt + 1) == '$' && toupper(*(txt + 2)) == 'C'))) { if (*(txt + 1) == '$') txt += 3; else txt += 2; str2ansi(tmp, txt, 0, 3); /* if using ANSI */ if (UsingAnsi) strcat(buf, ansi_parse(tmp)); else /* if not using ANSI */ strcat(buf, ""); txt += 4; l = strlen(buf); f++; } else { buf[l++] = *txt++; } buf[l] = 0; } /* if(f && UsingAnsi) strcat(buf,ansi_parse("0007")); */ return buf; } char *color_str(sh_int AType, CHAR_DATA * ch) { CHAR_DATA *och; if (!ch) return (atcode_color_str(AType)); if (!ch->desc) return (""); och = (ch->desc->original ? ch->desc->original : ch); if (IS_NPC(och) || !xIS_SET(och->act, PLR_ANSI)) return (""); switch (och->pcdata->colors[AType]) { case 0: return (FG_BLACK); break; case 1: return (FG_RED); break; case 2: return (FG_GREEN); break; case 3: return (FG_BROWN); break; case 4: return (FG_BLUE); break; case 5: return (FG_MAGENTA); break; case 6: return (FG_CYAN); break; case 7: return (FG_LT_GRAY); break; case 8: return (FG_DK_GRAY); break; case 9: return (FG_LT_RED); break; case 10: return (FG_LT_GREEN); break; case 11: return (FG_YELLOW); break; case 12: return (FG_LT_BLUE); break; case 13: return (FG_LT_MAGENTA); break; case 14: return (FG_LT_CYAN); break; case 15: return (FG_WHITE); break; case 16 + 0: return (FG_BLNK_BLACK); break; case 16 + 1: return (FG_BLNK_RED); break; case 16 + 2: return (FG_BLNK_GREEN); break; case 16 + 3: return (FG_BLNK_BROWN); break; case 16 + 4: return (FG_BLNK_BLUE); break; case 16 + 5: return (FG_BLNK_MAGENTA); break; case 16 + 6: return (FG_BLNK_CYAN); break; case 16 + 7: return (FG_BLNK_LT_GRAY); break; case 16 + 8: return (FG_BLNK_DK_GRAY); break; case 16 + 9: return (FG_BLNK_LT_RED); break; case 16 + 10: return (FG_BLNK_LT_GREEN); break; case 16 + 11: return (FG_BLNK_YELLOW); break; case 16 + 12: return (FG_BLNK_LT_BLUE); break; case 16 + 13: return (FG_BLNK_LT_MAGENTA); break; case 16 + 14: return (FG_BLNK_LT_CYAN); break; case 16 + 15: return (FG_BLNK_WHITE); break; default: return ("\033[m"); break; } } char *def_color_str(sh_int AType) { switch (default_set[AType]) { case 0: return (FG_BLACK); break; case 1: return (FG_RED); break; case 2: return (FG_GREEN); break; case 3: return (FG_BROWN); break; case 4: return (FG_BLUE); break; case 5: return (FG_MAGENTA); break; case 6: return (FG_CYAN); break; case 7: return (FG_LT_GRAY); break; case 8: return (FG_DK_GRAY); break; case 9: return (FG_LT_RED); break; case 10: return (FG_LT_GREEN); break; case 11: return (FG_YELLOW); break; case 12: return (FG_LT_BLUE); break; case 13: return (FG_LT_MAGENTA); break; case 14: return (FG_LT_CYAN); break; case 15: return (FG_WHITE); break; case 16 + 0: return (FG_BLNK_BLACK); break; case 16 + 1: return (FG_BLNK_RED); break; case 16 + 2: return (FG_BLNK_GREEN); break; case 16 + 3: return (FG_BLNK_BROWN); break; case 16 + 4: return (FG_BLNK_BLUE); break; case 16 + 5: return (FG_BLNK_MAGENTA); break; case 16 + 6: return (FG_BLNK_CYAN); break; case 16 + 7: return (FG_BLNK_LT_GRAY); break; case 16 + 8: return (FG_BLNK_DK_GRAY); break; case 16 + 9: return (FG_BLNK_LT_RED); break; case 16 + 10: return (FG_BLNK_LT_GREEN); break; case 16 + 11: return (FG_BLNK_YELLOW); break; case 16 + 12: return (FG_BLNK_LT_BLUE); break; case 16 + 13: return (FG_BLNK_LT_MAGENTA); break; case 16 + 14: return (FG_BLNK_LT_CYAN); break; case 16 + 15: return (FG_BLNK_WHITE); break; default: return ("\033[m"); break; } } /* Very simular to above and below functions, used to get the text output of a set color for use in a string -- Xerves 12/00 */ char *char_color_str(sh_int AType, CHAR_DATA * ch) { if (!ch) return (atcode_color_str(AType)); if (!ch->desc) return (""); if (IS_NPC(ch)) return(""); switch (ch->pcdata->colors[AType]) { case 0: return ("&w"); break; case 1: return ("&r"); break; case 2: return ("&g"); break; case 3: return ("&O"); break; case 4: return ("&b"); break; case 5: return ("&p"); break; case 6: return ("&c"); break; case 7: return ("&c&w"); break; case 8: return ("&z"); break; case 9: return ("&R"); break; case 10: return ("&G"); break; case 11: return ("&Y"); break; case 12: return ("&B"); break; case 13: return ("&P"); break; case 14: return ("&C"); break; case 15: return ("&G&W"); break; default: return ("&w"); break; } } char *atcode_color_str(sh_int AType) { switch (default_set[AType]) { case 0: return ("&w"); break; case 1: return ("&r"); break; case 2: return ("&g"); break; case 3: return ("&O"); break; case 4: return ("&b"); break; case 5: return ("&p"); break; case 6: return ("&c"); break; case 7: return ("&w"); break; case 8: return ("&z"); break; case 9: return ("&R"); break; case 10: return ("&G"); break; case 11: return ("&Y"); break; case 12: return ("&B"); break; case 13: return ("&P"); break; case 14: return ("&C"); break; case 15: return ("&W"); break; default: return ("&w"); break; } } char *uncolorify(const char *arg) { static char retbuf[MSL]; const char *c; char buf[8]; retbuf[0] = '\0'; for (c = arg; *c;) { if (*c == '&') strcat(retbuf, "&"); sprintf(buf, "%c", *c++); strcat(retbuf, buf); } return (retbuf); }