From: Doppleganger Software Subject: Linewrapping function char *linewrap(char *str, int max) { char xbuf2[MAX_STRING_LENGTH]; char xbuf[MAX_STRING_LENGTH]; char *tmp; int i, lline = 0, curr = 0; bool spec_code = FALSE; xbuf[0] = xbuf2[0] = '\0'; i = max - 1; if (strlen(str) < i) return (str); for (tmp = str; *tmp; tmp++) { if (*tmp == '\x1B' && !spec_code) spec_code = TRUE; if (*tmp == ' ') { spec_code = FALSE; if (lline > i) { sprintf(xbuf, "%s\r\n%s ", xbuf, xbuf2); lline = 0; curr = 0; xbuf2[0] = '\0'; } else { sprintf(xbuf, "%s%s ", xbuf, xbuf2); lline++; curr = 0; xbuf2[0] = '\0'; } } else if (*tmp == '\r') { spec_code = FALSE; if (lline > (i + 1)) sprintf(xbuf, "%s\r\n%s", xbuf, xbuf2); else sprintf(xbuf, "%s%s\r", xbuf, xbuf2); lline = 0; curr = 0; xbuf2[0] = '\0'; } else { xbuf2[curr] = *tmp; xbuf2[curr + 1] = '\0'; curr++; if (!spec_code) lline++; } if (*tmp == 'm' && spec_code) spec_code = FALSE; } if (lline > i) sprintf(xbuf, "%s\r\n%s", xbuf, xbuf2); else sprintf(xbuf, "%s%s", xbuf, xbuf2); return (str_dup(xbuf)); } If I remember correctly, I put char *conv; conv = linewrap(messg, 80); then send conv instead of messg. It's pretty simple. into the send_to_room, send_to_char and send_to_all functions (I think that last one is right...you will know them) It's easy to make it configurable. Just use an unused in the player saved, and instead of 80, have it send that to the function. You might want to put #define GET_LINES(ch) (IS_NPC(ch) ? 80 : whatever_var_used) so that mobs get standard 80, or maybe have it try and find the char's setting anyway...have to check on that. I would like to mention that I have had a few weird instances of a word being auto-wrapped, then a new line being placed after that word, and the rest of the sentance below. If I can get some help figuring out why that is occuring, I would appreciate it. :)