#include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" #ifndef WINDOWS #include <sys/time.h> #endif char * strip_ansi_codes (char *txty) { static char buf[2000]; int x = 0; char *point; const char *str; int length; if (txty == NULL) { sprintf (buf, "..."); return buf; } length = strlen (txty); if (length >= 1900) return txty; point = buf; str = txty; while (*str != '\0' && x < length) { if (*str == '\033' || *str == '\e' || *str == '\x1B') { while (((*str >= '0' && *str <= '9') || *str == '\x1B' || *str == '[' || *str == ';') && *str) { ++x; ++str; } if (*str) { ++x; ++str; } } else { *point = *str; point++; str++; x++; } } *point = '\0'; return buf; } void ansi_color (const char *txt, CHAR_DATA * ch) { if (txt != NULL && ch->desc != NULL) { if (!IS_SET (ch->pcdata->act2, PLR_ANSI) && !IS_SET (ch->pcdata->act2, PLR_VT100)) return; else if (IS_SET (ch->pcdata->act2, PLR_VT100) && !IS_SET (ch->pcdata->act2, PLR_ANSI)) { if (!str_cmp (txt, GREEN) || !str_cmp (txt, RED) || !str_cmp (txt, BLUE) || !str_cmp (txt, BLACK) || !str_cmp (txt, CYAN) || !str_cmp (txt, GREY) || !str_cmp (txt, YELLOW) || !str_cmp (txt, PURPLE)) return; } write_to_buffer (ch->desc, txt, strlen (txt)); return; } return; } void act (const char *format, CHAR_DATA * ch, const void *arg1, const void *arg2, int type) { char buf[STD_LENGTH * 2]; char fname[SML_LENGTH]; char buf2[STD_LENGTH * 2]; CHAR_DATA *to; SINGLE_OBJECT *obj1 = (SINGLE_OBJECT *) arg1; CHAR_DATA *victim = (CHAR_DATA *) arg2; SINGLE_OBJECT *obj2 = (SINGLE_OBJECT *) arg2; const char *str; const char *i; char *point; int x; if (type > 999) { type -= 1000; } /* You must act () something */ if (format == NULL || format[0] == '\0') return; /* The person must exist, and be in a room, and if the message is to the character, the character must not be linkdead. */ if(!ch || !ch->in_room || (!ch->desc && (type == TO_CHAR || type == TO_CHAR_SPAM))) return; check_room_more(ch->in_room); to = ch->in_room->more->people; if (type == TO_VICT) { if (victim == NULL || !victim->in_room) return; } for (; to != NULL; to = to->next_in_room) { if (to->desc == NULL || !IS_AWAKE (to)) continue; if (type > 3 && to->pcdata->no_spam == 1) /* Gets rid of all the _SPAM things */ continue; switch (type % 4) { case 0: /* TO_ROOM */ if (to == ch) continue; break; case 1: /* TO_NOTVICT */ if (to == ch || to == victim) continue; break; case 2: /* TO_VICT */ if (to != victim || ch == victim) continue; break; case 3: /* TO_CHAR */ if (to != ch) continue; break; } point = buf; str = format; while (*str != '\0') { if (*str != '$') { *point++ = *str++; continue; } ++str; if (arg2 == NULL && *str >= 'A' && *str <= 'Z' && *str >= '0' && *str <= '9') { bug ("Missing second character for code %d.", *str); i = " !!! "; } else { switch (*str) { default: i = " !NotGood! "; break; case '$': i = "$"; break; case '1': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = BLUE; break; case '2': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = GREEN; break; case '3': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = CYAN; break; case '4': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = RED; break; case '5': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = PURPLE; break; case '6': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = YELLOW; break; case '7': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = GREY; break; case '0': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = BLACK; break; case 'B': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = BOLD; break; case 'I': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = INVERSE; break; case 'F': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = FLASH; break; case 'R': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = NTEXT; break; case 't': i = "<blank>"; if (arg1 != NULL) i = (char *) arg1; break; case 'T': i = "<BLANK>"; if (arg2 != NULL) i = (char *) arg2; break; case 'n': { i = rNAME (ch, to); break; } case 'N': { i = rNAME (victim, to); break; } case 'e': i = HE_SHE (ch); break; case 'E': i = HE_SHE (victim); break; case 'm': i = HIM_HER (ch); break; case 'M': i = HIM_HER (victim); break; case 's': i = HIS_HER (ch); break; case 'S': i = HIS_HER (victim); break; case 'p': if (!obj1) i = ""; else i = can_see_obj (to, obj1) ? OOSTR (obj1, short_descr) : "something"; break; case 'P': if (!obj2) i = ""; else i = can_see_obj (to, obj2) ? OOSTR (obj2, short_descr) : "something"; break; case 'd': if (arg2 == NULL || ((char *) arg2)[0] == '\0') { i = "door"; } else { one_argy ((char *) arg2, fname); i = fname; } break; } } ++str; while ((*point = *i) != '\0') ++point, ++i; } if (wwrap) { *point++ = '\n'; *point++ = '\r'; } *point++ = '\0'; x = 0; strcpy (buf2, buf); if (buf2[0] == '\x1B') { int cc; cc = 0; cap: if (cc < 10) { while (buf2[x] != 'm' && buf2[x] != '\0') x++; if (buf2[x] == '\0') { x = 0; } else { x++; if (buf2[x] == '\x1B') { cc++; goto cap; } } } /*cc>10 */ else x = 0; } buf2[x] = UPPER (buf2[x]); if (to->desc != NULL) { if (wwrap) { write_to_buffer (to->desc, wordwrap(buf2,79), 0); } else write_to_buffer (to->desc, buf2, 0); } } return; } char * anseval (const char *txt, CHAR_DATA * to) { static char buf[STD_LENGTH]; const char *str; const char *i; char *point; char tmp[10]; if (txt == NULL || txt[0] == '\0') return NULL; if (to == NULL) { return NULL; } point = buf; str = txt; while (*str) { while (*str && *str != '$') *point++ = *str++; if (*str == '$') { ++str; switch (*str) { default: sprintf (tmp, "$%c", *str); i = tmp; break; case '1': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = BLUE; break; case '2': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = GREEN; break; case '3': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = CYAN; break; case '4': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = RED; break; case '5': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = PURPLE; break; case '6': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = YELLOW; break; case '7': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = GREY; break; case '0': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI)) i = BLACK; break; case 'B': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = BOLD; break; case 'I': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = INVERSE; break; case 'F': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = FLASH; break; case 'N': i = ""; if (IS_SET (to->pcdata->act2, PLR_ANSI) || IS_SET (to->pcdata->act2, PLR_VT100)) i = NTEXT; break; } *point = '\0'; point = buf + strlen (buf); sprintf (point, i); point = buf + strlen (buf); str++; } } *point = '\0'; return buf; }