/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments 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 * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock * * * * Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little * * This mud is NOT to be copied in whole or in part, or to be run without * * the permission of Matthew Little. Nobody else has permission to * * authorise the use of this code. * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #define ALLOW_N00BS_TO_GROUP WizConfig->n00bgroup #define N00B_NO_GROUP_HOURS WizConfig->n00bhours NCLANS_DATA *nclans_table; /* * Local functions. */ void talk_channel args ((CHAR_DATA * ch, char *argument, int channel, const char *verb)); bool is_in args ((char *, char *)); bool all_in args ((char *, char *)); char *oldelang args ((CHAR_DATA * ch, char *argument)); char *badlang args ((CHAR_DATA * ch, char *argument)); char *darktongue args ((CHAR_DATA * ch, char *argument)); char *drunktalk args ((CHAR_DATA * ch, char *argument)); char *beasttalk args ((CHAR_DATA * ch, char *argument)); char *beastchat args ((CHAR_DATA * ch, char *argument)); char *socialc args ((CHAR_DATA * ch, char *argument, char *you, char *them)); char *socialv args ((CHAR_DATA * ch, char *argument, char *you, char *them)); char *socialn args ((CHAR_DATA * ch, char *argument, char *you, char *them)); bool is_contained( const char *astr, const char *bstr ) { int i, alen, blen, count; alen = strlen(astr); blen = strlen(bstr); if (alen > blen) return FALSE; for (i = 0; i <= (blen - alen); i++) { count = 0; while (count < alen && UPPER(astr[count]) == UPPER(bstr[i+count])) count++; if (count == alen) return TRUE; } return FALSE; } bool is_advertisement( char *check ) { bool pfound = FALSE; int pcount = 0; int x = 0; if (is_contained("my mud",check) || is_contained("on port",check) || is_contained("same port",check)) return TRUE; //commented out untill i can find a way for it to check for ips // if (is_contained(".", check)) return TRUE; if ( !str_infix(".net", check) || !str_infix(".org", check) || !str_infix(".cx", check) || !str_infix(".gov", check) || !str_infix(".edu", check) || !str_infix(".us", check) || !str_infix(".cc", check) || !str_infix(".co", check) || !str_infix(".uk", check) || !str_infix(".sk", check) || !str_infix(".au", check) || !str_infix(".tj", check) || !str_infix(".nz", check) || !str_infix(".da", check) || !str_infix(".tv", check) || !str_infix(".biz", check) || !str_infix(".tk", check) || !str_infix(".nu", check)) return TRUE; // Look for 4 digit numbers for ( x = 0; x < strlen(check); x++ ) { if (pcount == 4 && (!isdigit(check[x]) || check[x] == '\0')) { pfound = TRUE; x = strlen(check); } else { if (pcount > 0 && !isdigit(check[x])) pcount = 0; if (isdigit(check[x])) pcount += 1; } } if (pfound) return TRUE; return FALSE; } void adv_alert( CHAR_DATA *ch, char *chan, char *ad ) { CHAR_DATA *imm; char buf[MSL]; bool alerted = FALSE; if (ch->level > 8) return; sprintf(buf,"%s(%s) said: %s, using %s.", ch->name,ch->desc->host,ad, chan); log_string(buf, ch); wiznet(ch, WIZ_ADVER,7, buf); for (imm = char_list; imm != NULL; imm = imm->next) { if (IS_NPC(imm)) continue; if (!IS_IMMORTAL(imm)) continue; //stc(buf,imm); if (!IS_SET(imm->flag2,EXTRA_AFK)) alerted = TRUE; } if (alerted == FALSE) make_note ("Personal", "Ad Admin", "imm immortal", "UNSEEN ADVERTISEMENT", 15, buf); return; } /* * Generic channel function. */ void talk_channel (CHAR_DATA * ch, char *argument, int channel, const char *verb) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char buf3[MAX_STRING_LENGTH]; char ibuf[MSL]; char iname[MSL]; CHAR_DATA *vch; DESCRIPTOR_DATA *d; int position; int pos; bool ignored; if (IS_NPC (ch) && channel != CHANNEL_QUESTION && channel != CHANNEL_SHOUT) return; if (IS_IMMORTAL (ch) && IS_SET (ch->flag2, NOCHAN) && channel != CHANNEL_IMMTALK && channel != CHANNEL_FTALK) { stcprintf (ch, "You need to turn NOCHAN off before you can use %s.\n\r", verb); return; } /* Added CANCHAN so we can give non newbies (people who already have a char) access to all channels */ if (!IS_SET (ch->more, CANCHAN) && !IS_IMMORTAL (ch) && !IS_NPC (ch) && (get_hours (ch) < 3) && channel != CHANNEL_NEWBIE && channel != CHANNEL_FTALK) /* { sprintf (buf, "You cannot %s until you are 3 hrs old.\n\r", verb); send_to_char (buf, ch); stc ("Use newbie <message>, instead.\n\r", ch); return; } */ channel = CHANNEL_NEWBIE; if (!IS_IMMORTAL (ch) && (get_hours (ch) > 10) && !IS_SET (ch->extra2, NHELPER) && channel == CHANNEL_NEWBIE) { stc ("You are not a newbie use another channel!\n\r", ch); return; } if (!IS_SET (ch->more, CANCHAN) && (ch->chat_timer > 0) && !IS_IMMORTAL (ch) && channel == CHANNEL_NEWBIE) { sprintf (buf, "You cannot newbie for another %d ticks.\n\r", ch->chat_timer); stc (buf, ch); return; } if (IS_SET (ch->in_room->added_flags, ROOM2_SILENCE) && !IS_IMMORTAL(ch)) { send_to_char ("Something prevents you from speaking in this room.\n\r", ch); return; } if (argument[0] == '\0') { sprintf (buf, "%s what?\n\r", verb); buf[0] = UPPER (buf[0]); stc (buf, ch); return; } if (IS_HEAD (ch, LOST_TONGUE)) { sprintf (buf, "You can't %s without a tongue!\n\r", verb); send_to_char (buf, ch); return; } if (IS_EXTRA (ch, GAGGED)) { sprintf (buf, "You can't %s with a gag on!\n\r", verb); send_to_char (buf, ch); return; } if (!IS_NPC (ch) && IS_SET (ch->act, PLR_SILENCE)) { sprintf (buf, "You can't %s because you are silenced.\n\r", verb); send_to_char (buf, ch); return; } /* if (!IS_IMMORTAL(ch)) mal_smashaddy (argument); */ if IS_SET (ch->deaf, CHANNEL_ALL) REMOVE_BIT (ch->deaf, CHANNEL_ALL); if (!IS_NPC (ch) && ch->lastchat != NULL) { if (!str_cmp (argument, ch->lastchat) && !IS_IMMORTAL (ch)) { stc ("You are unable to say the same thing twice in a row!. Find a different way to say it.\n\r", ch); return; } } if (is_contained("Rowena", argument) || is_contained ("Legend of Rowena", argument) || is_contained ("Acidburn", argument) || is_contained ("Selff", argument) || is_contained ("jennyro.no-ip.info", argument) || is_contained ("pyropkfun.no-ip.info", argument)) { send_to_char("Mentioning that MUD, or That Person here is against the RULES!!!\n\r", ch); send_to_char("Code Stealing MOTHER FUCKER!!\n\r", ch); return; } if (is_contained("rapidshare", argument)) return; free_string (ch->lastchat); ch->lastchat = str_dup (argument); REMOVE_BIT (ch->deaf, channel); switch (channel) { default: sprintf (buf, "#w[%s#w] You: #e$T#n", verb); if (!IS_NPC (ch) && ch->pcdata->condition[COND_DRUNK] > 10) act (buf, ch, NULL, drunktalk (ch, ((IS_IMMORTAL(ch) && !IS_SET (ch->more, MORE_CCHANNELS)) ? argument : bash_color (argument))), TO_CHAR); else if (!IS_NPC (ch) && ch->pcdata->stats[UNI_RAGE] > 0 && IS_CLASS (ch, CLASS_VAMPIRE) && !IS_IMMORTAL(ch)) act (buf, ch, NULL, beastchat (ch, ((IS_IMMORTAL(ch) && !IS_SET (ch->more, MORE_CCHANNELS)) ? argument : bash_color (argument))), TO_CHAR); else act (buf, ch, NULL, ((IS_IMMORTAL(ch) && !IS_SET (ch->more, MORE_CCHANNELS)) ? argument : bash_color (argument)), TO_CHAR); sprintf (iname, "#w(%s)#n ", ch->name); sprintf (buf, "#w[%s#w] $n: #e$t#n", verb); if (IS_NPC (ch)) sprintf (buf2, "#w[%s#w]#w %s: #e$t#n", verb, ch->short_descr); else sprintf (buf2, "#w[%s#w] $n: #e$t#n", verb); break; /* case CHANNEL_CHAT: if (IS_SET (ch->extra2, WHINER)) { char orig_arg[MSL]; char dark_arg[MSL]; strcpy (orig_arg, argument); strcpy (dark_arg, darktongue (ch, argument)); sprintf (buf, "#wYou whine '#y%s#w'#n\n\r", dark_arg); send_to_char (buf, ch); for (vch = char_list; vch != NULL; vch = vch->next) { if (ch == vch) continue; if (IS_IMMORTAL (vch)) sprintf (buf, "#w%s #wwhines '#y%s#w'#n\n\r", ch->name, orig_arg); else sprintf (buf, "#w%s #wwhines '#y%s#w'#n\n\r", ch->name, dark_arg); send_to_char (buf, vch); } return; } else { sprintf (buf, "#wYou %s '#y$T#w'#n", verb); if (!IS_NPC (ch) && ch->pcdata->condition[COND_DRUNK] > 10) act (buf, ch, NULL, drunktalk (ch, argument), TO_CHAR); else if (!IS_NPC (ch) && ch->pcdata->stats[UNI_RAGE] > 0 && IS_CLASS (ch, CLASS_VAMPIRE) && !IS_IMMORTAL(ch)) act (buf, ch, NULL, beastchat (ch, argument), TO_CHAR); else act (buf, ch, NULL, argument, TO_CHAR); sprintf (iname, "#w(%s)#n ", ch->name); sprintf (buf, "#w$n #ww%ss '#y$t#w'#n", verb); sprintf (buf2, "#w$n #w%ss '#y$t#w'#n", verb); } break; */ case CHANNEL_FLAME: sprintf (buf, "#y[#wFLAME#y] #r$n:#y $t#n"); sprintf (buf2, "#y[#wFLAME#y] #r$n:#y $t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_NEWBIE: if (!IS_SET (ch->extra2, NHELPER)) { sprintf (buf, "#w[#cNEWBIE#w] $n:#c $t#n"); sprintf (buf2, "#w[#cNEWBIE#w] $n:#c $t#n"); } else { sprintf (buf, "#w[#cNEWBIE HELP#w] $n:#c $t#n"); sprintf (buf2, "#w[#cNEWBIE HELP#w] $n:#c $t#n"); } position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_FTALK: sprintf (buf, "#w-[#yFTALK#w: %s]- #y$t#n", ch->name); sprintf (buf2, "#w-[#yFTALK#w: %s]- #y$t#n", ch->name); position = ch->position; ch->position = POS_STANDING; act (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_BTALK: sprintf (buf, "#e>[#.%s#e]< #w'#c$t#w'#n", ch->name); sprintf (buf2, "#e>[#.%s#e]< #w'#c$t#w'#n", ch->name); position = ch->position; ch->position = POS_STANDING; act (buf, ch, argument, NULL, TO_CHAR); sprintf (buf3, "%s : %s", ch->name, argument); ltf (buf3, "bitchsession", FALSE); ch->position = position; break; case CHANNEL_SPOUSETALK: sprintf (buf, "#r-=[#w%s#r]=- #r$t#n", capitalize (ch->name)); sprintf (buf2, "#r-=[#w%s#r]=- #r$t#n", capitalize (ch->name)); position = ch->position; ch->position = POS_STANDING; act (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_IMMTALK: sprintf (buf, "#w%s [#r%d#w]: #r$t#n", capitalize (ch->name), ch->pcdata->wizinvis); sprintf (buf2, "#w%s [#r%d#w]: #r$t#n", capitalize (ch->name), ch->pcdata->wizinvis); position = ch->position; ch->position = POS_STANDING; act (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_FOUNDERTALK: sprintf (buf, "#w[#gFOUNDERTALK#w] $n: #g$t#n"); sprintf (buf2, "#w[#gFOUNDERTALK#w] $n: #g$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_PRAY: sprintf (buf, "#y[[#yPRAY#y]]#w $n: #y$t#n"); sprintf (buf2, "#y[[#yPRAY#y]]#w $n: #y$t#n"); position = ch->position; ch->position = POS_STANDING; act (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_WRAITH: sprintf (buf, "#e+-#wWAIL#e-+#w $n: #e$t#n"); sprintf (buf2, "#e+-#wWAIL#e-+#w $n: #e$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_BUILD: sprintf (buf, "#w$n= #c$t#n"); sprintf (buf2, "#w$n= #c$t#n"); position = ch->position; ch->position = POS_STANDING; act (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_MAGETALK: sprintf (buf, "#b{{#bMAGETALK#b}}#w $n: #b$t#n"); sprintf (buf2, "#b{{#bMAGETALK#b}}#w $n: #b$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_CLANTALK: sprintf (ibuf, "#w(#nClan Channel %s#w)#n ", ch->clan); sprintf (buf, "#w$n clantalks '#o$t#w'#n"); sprintf (buf2, "#w$n clantalks '#o$t#w'#n"); position = ch->position; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_HOWL: sprintf (buf, "#o((#oHOWL#o))#w You: #o$t#n"); sprintf (buf2, "#o((#oHOWL#o))#w $n: #o$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_KTALK: sprintf (ibuf, "#w(#nKingdom #r%d#w)#n ", ch->pcdata->kingdom); sprintf (buf, "#y.x[#g%s#y]x. #w'#y$t#w'#n", ch->name); sprintf (buf2, "#y.x[#g%s#y]x. #w'#y$t#w'#n", ch->name); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_PTALK: sprintf (buf, "#y.#r^^^^#w$n#r^^^^#y.#w cries #W$t#n"); sprintf (buf2, "#y.#r^^^^#w$n#r^^^^#y.#w cries #W$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_MIKTALK: sprintf (buf, "#p**#pMIKTALK#p**#w $n: #p$t#n"); sprintf (buf2, "#p**#pMIKTALK#p**#w $n: #p$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_HIGHTALK: sprintf (buf, "#C-=#cHIGH#cTALK#C=-#w $n: #c$t#n"); sprintf (buf2, "#C-=#cHIGH#cTALK#C=-#w $n: #c$t#n"); position = ch->position; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_MONK: sprintf (buf, "#w<:#gHUM#w:> $n: #g$t#n"); sprintf (buf2, "#w<:#gHUM#w:> $n: #g$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_SIGN: sprintf (buf, "#c.oO#cSIGN#cOo.#w $n: #c$t#n"); sprintf (buf2, "#c.oO#cSIGN#cOo.#w $n: #c$t#n"); position = ch->position; ch->position = POS_STANDING; act (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; case CHANNEL_VAMPTALK: sprintf (buf, "#R<<#rVAMPTALK#R>>#w $n: #r$t#n"); sprintf (buf2, "#R<<#rVAMPTALK#R>>#w $n: #r$t#n"); position = ch->position; ch->position = POS_STANDING; act4 (buf, ch, argument, NULL, TO_CHAR); ch->position = position; break; } for (d = first_descriptor; d != NULL; d = d->next) { CHAR_DATA *och; och = d->original ? d->original : d->character; vch = d->character; ignored = FALSE; if (d->connected == CON_PLAYING && vch != ch && !IS_SET (och->deaf, channel) && !IS_SET (och->deaf, CHANNEL_ALL)) { for (pos = 0; pos < MAX_FORGET; pos++) { if (och->pcdata->forget[pos] == NULL) break; if (!str_cmp (ch->name, och->pcdata->forget[pos])) ignored = TRUE; } if (ignored) continue; if (channel == CHANNEL_HOWL) send_howl (och); if ((channel == CHANNEL_CLANTALK || channel == CHANNEL_KTALK) && (get_trust (och) >= LEVEL_IMPLEMENTOR)) send_to_char (ibuf, vch); if (channel == CHANNEL_FTALK && (!IS_NPC (och) && !IS_SET (och->more, MORE_FTALK2) && !IS_CREATOR (och))) continue; if (channel == CHANNEL_BUILD && !IS_IMMORTAL (och)) continue; if (channel == CHANNEL_BTALK && (!IS_NPC (och) && !BITCH && !IS_IMMORTAL (och))) continue; if (channel == CHANNEL_FOUNDERTALK && (!IS_NPC(och) && !is_clanleader(och) && !IS_IMMORTAL (och))) continue; if (channel == CHANNEL_IMMTALK && !IS_IMMORTAL (och)) continue; if (channel == CHANNEL_MIKTALK && (!IS_NPC (och) && !IS_CLASS (och, CLASS_NINJA) && !IS_IMMORTAL(och))) continue; if (channel == CHANNEL_PTALK && (!IS_NPC (och) && !IS_CLASS (och, CLASS_PHOENIX) && !IS_IMMORTAL(och))) continue; if (channel == CHANNEL_WRAITH && (!IS_NPC (och) && !IS_CLASS (och, CLASS_WRAITH) && !IS_IMMORTAL(och))) continue; if (channel == CHANNEL_HIGHTALK && (!IS_NPC (och) && !IS_CLASS (och, CLASS_HIGHLANDER) && !IS_IMMORTAL (och))) continue; if (channel == CHANNEL_KTALK && (!IS_NPC (och) && !IS_CREATOR (och) && ch->pcdata->kingdom != och->pcdata->kingdom)) continue; if (channel == CHANNEL_MONK && (!IS_NPC (och) && !IS_CLASS (och, CLASS_MONK) && !IS_IMMORTAL (och))) continue; if (channel == CHANNEL_SIGN && (!IS_NPC (och) && !IS_CLASS (och, CLASS_DROW) && !IS_IMMORTAL(och))) continue; if (channel == CHANNEL_CLANTALK && (!IS_NPC (och) && !IS_IMMORTAL (och) && str_cmp (ch->clan, och->clan))) continue; if (channel == CHANNEL_SPOUSETALK && (!IS_NPC (och) && str_cmp (och->pcdata->marriage, ch->name))) continue; if (channel == CHANNEL_VAMPTALK && (!IS_NPC (och) && !IS_CLASS (och, CLASS_VAMPIRE) && !IS_IMMORTAL (och))) continue; if (channel == CHANNEL_MAGETALK && (!IS_NPC (och) && !IS_CLASS (och, CLASS_MAGE) && !IS_IMMORTAL (och))) continue; if (channel == CHANNEL_PRAY && (!IS_NPC (och) && !IS_CLASS (och, CLASS_DEMON) && !IS_IMMORTAL (och))) continue; if (channel == CHANNEL_HOWL && (!IS_NPC (och) && !IS_CLASS (och, CLASS_WEREWOLF) && !IS_POLYAFF (och, POLY_WOLF) && !IS_IMMORTAL (och))) { if ((och->in_room) && (ch->in_room)) { if ((och->in_room == ch->in_room)) { act ("$n throws back $s head and howls loudly.", ch, argument, och, TO_VICT); continue; } else if ((och->in_room->area == ch->in_room->area)) { act ("You hear a loud howl nearby.", ch, NULL, och, TO_VICT); continue; } else { act ("You hear a loud howl in the distance.", ch, NULL, och, TO_VICT); continue; } } } if (channel == CHANNEL_YELL && vch->in_room->area != ch->in_room->area) continue; position = vch->position; if (channel != CHANNEL_SHOUT && channel != CHANNEL_YELL) vch->position = POS_STANDING; { if (channel != CHANNEL_FOUNDERTALK && channel != CHANNEL_CLANTALK && channel != CHANNEL_FLAME && channel != CHANNEL_NEWBIE) { act4 (buf2, ch, ((IS_IMMORTAL(ch) && !IS_SET (vch->more, MORE_CCHANNELS)) ? argument : bash_color (argument)), vch, TO_VICT); vch->position = position; } else { act4 (buf2, ch, ((IS_IMMORTAL(ch) && !IS_SET (vch->more, MORE_CCHANNELS)) ? argument : bash_color (argument)), vch, TO_VICT); vch->position = position; } continue; } act4 (buf, ch, ((IS_IMMORTAL(ch) && !IS_SET (vch->more, MORE_CCHANNELS)) ? argument : bash_color (argument)), vch, TO_VICT); vch->position = position; } } if (channel == CHANNEL_QUESTION) { for ( vch = char_list; vch != NULL; vch = vch->next ) { if (IS_NPC(vch) && vch->pIndexData->vnum == 25) break; } if (!vch) return; if (!str_infix("what",argument) || !str_infix("where", argument)) { if (!str_infix("what",argument) && !str_infix(vch->short_descr,argument)) { OBJ_DATA *obj; sprintf(buf, "%s So, you want to know what I have, eh %s?", ch->name, ch->name); do_tell(vch, buf); if (vch->carrying == NULL) { sprintf(buf, "%s Unfortunately, I don't appear to have a single item.", ch->name); do_tell(vch, buf); WAIT_STATE (ch, 12); return; } sprintf(buf, "%s I currently hold the following:", ch->name); do_tell(vch, buf); for (obj = vch->carrying; obj != NULL; obj = obj->next_content) { sprintf(buf, "%s %s", ch->name, obj->short_descr); do_tell(vch, buf); } } else if (!str_infix("where",argument) && !str_infix(vch->short_descr,argument)) { sprintf(buf, "%s So %s, you want to know where I'm resting?", ch->name, ch->name); do_tell(vch, buf); if (!vch->in_room || !vch->in_room->area) { sprintf(buf, "%s Unfortunately, I have NO clue where I'm at.", ch->name); do_tell(vch, buf); return; } sprintf(buf, "%s It appears I've wandered into %s.", ch->name, vch->in_room->area->name); do_tell(vch, buf); sprintf(buf, "%s Roughly in the region of %s.", ch->name, vch->in_room->name); do_tell(vch, buf); } } } return; } void do_chathist (CHAR_DATA * ch, char *argument) { FILE *fp; char *tok; char buffer[MAX_STRING_LENGTH]; char let; int size, save, ct = 0; if (!(fp = fopen (CHAT_LOG_FILE, "a+"))) { bug ("Cannot open CHAT_LOG_FILE!", 0); send_to_char ("BUG: Inform an Immortal\r\n", ch); return; } save = ftell (fp); fseek (fp, 0L, SEEK_END); size = ftell (fp); fseek (fp, size, SEEK_SET); while (size--) { fseek (fp, size, SEEK_SET); let = fgetc (fp); if (let == '>') ct++; if (ct == 20) break; } send_to_char ("#wChat History:#n\r\n", ch); while (fgets (buffer, (sizeof (buffer) - 2), fp) > 0) { tok = strtok (buffer, ">"); send_to_char (tok, ch); } fclose (fp); return; } void do_infohist (CHAR_DATA * ch, char *argument) { FILE *fp; char *tok; char buffer[MAX_STRING_LENGTH]; char let; int size, save, ct = 0; if (!(fp = fopen (INFO_FILE, "a+"))) { bug ("Cannot open INFO_FILE!", 0); send_to_char ("BUG: Inform an Immortal\r\n", ch); return; } save = ftell (fp); fseek (fp, 0L, SEEK_END); size = ftell (fp); fseek (fp, size, SEEK_SET); while (size--) { fseek (fp, size, SEEK_SET); let = fgetc (fp); if (let == '>') ct++; if (ct == 20) break; } send_to_char ("#wInfo History:#n\r\n", ch); while (fgets (buffer, (sizeof (buffer) - 2), fp) > 0) { tok = strtok (buffer, ">"); send_to_char (tok, ch); } fclose (fp); return; } void do_fatalhist (CHAR_DATA * ch, char *argument) { FILE *fp; char *tok; char buffer[MAX_STRING_LENGTH]; char let; int size, save, ct = 0; if (!(fp = fopen (FATAL_FILE, "a+"))) { bug ("Cannot open FATAL_FILE!", 0); send_to_char ("BUG: Inform an immortal\r\n", ch); return; } save = ftell (fp); fseek (fp, 0L, SEEK_END); size = ftell (fp); fseek (fp, size, SEEK_SET); while (size--) { fseek (fp, size, SEEK_SET); let = fgetc (fp); if (let == '>') ct++; if (ct == 20) break; } send_to_char ("#wFatality History:#n\r\n", ch); while (fgets (buffer, (sizeof (buffer) - 2), fp) > 0) { tok = strtok (buffer, ">"); send_to_char (tok, ch); } fclose (fp); return; } void do_btalkhist (CHAR_DATA * ch, char *argument) { FILE *fp; char *tok; char buffer[MAX_STRING_LENGTH]; char let; int size, save, ct = 0; if (!(fp = fopen (BTALK_LOG_FILE, "a+"))) { bug ("Cannot open BTALK_LOG_FILE!", 0); send_to_char ("BUG: Inform an immortal\r\n", ch); return; } save = ftell (fp); fseek (fp, 0L, SEEK_END); size = ftell (fp); fseek (fp, size, SEEK_SET); while (size--) { fseek (fp, size, SEEK_SET); let = fgetc (fp); if (let == '>') ct++; if (ct == 20) break; } send_to_char ("#wBitching History:#n\r\n", ch); while (fgets (buffer, (sizeof (buffer) - 2), fp) > 0) { tok = strtok (buffer, ">"); send_to_char (tok, ch); } fclose (fp); return; } void do_ktalkhist (CHAR_DATA * ch, char *argument) { FILE *fp; char *tok; char buffer[MAX_STRING_LENGTH]; char let; int size, save, ct = 0; if (!(fp = fopen (KTALK_LOG_FILE, "a+"))) { bug ("Cannot open KTALK_LOG_FILE!", 0); send_to_char ("BUG: Inform an immortal\r\n", ch); return; } save = ftell (fp); fseek (fp, 0L, SEEK_END); size = ftell (fp); fseek (fp, size, SEEK_SET); while (size--) { fseek (fp, size, SEEK_SET); let = fgetc (fp); if (let == '>') ct++; if (ct == 20) break; } send_to_char ("#wKtalk History:#n\r\n", ch); while (fgets (buffer, (sizeof (buffer) - 2), fp) > 0) { tok = strtok (buffer, ">"); send_to_char (tok, ch); } fclose (fp); return; } /* Remove/Replace something in a string */ /* Replaces all instances of 'd' in 'str' with 'c' */ char *switch_char (const char *str, const char d, const char c) { static char strbuf[MAX_STRING_LENGTH]; int i; /* Safe.. input length checked elsewhere for 'str' */ strcpy (strbuf, str); for (i = 0; str[i] != '\0'; i++) { if (strbuf[i] == d) { strbuf[i] = c; } } strbuf[i] = '\0'; return strbuf; } void do_newbie (CHAR_DATA * ch, char *argument) { if (is_advertisement(argument)) adv_alert(ch, "newbie", argument); talk_channel (ch, argument, CHANNEL_NEWBIE, "newbie"); //if (ch->chat_timer == 0 && strlen (argument) > 0 // && !IS_SET (ch->extra2, NHELPER)) // ch->chat_timer = 25; return; } void do_qtalk (CHAR_DATA * ch, char *argument) { if (is_advertisement(argument)) adv_alert(ch, "Quest", argument); talk_channel (ch, argument, CHANNEL_QUESTION, "#cQUEST#n"); if ((!str_cmp (argument, "what mob?")) || (!str_cmp (argument, "who was the thief?")) || (!str_cmp (argument, "who is the thief?")) || (!str_cmp (argument, "what item?")) || (!str_cmp (argument, "where are you?")) || (!str_cmp (argument, "who stole the item?")) || (!str_cmp (argument, "where is the thief?"))) ask_quest_question (ch, argument); return; } void do_flame (CHAR_DATA * ch, char *argument) { if (is_advertisement(argument)) adv_alert(ch, "flame", argument); talk_channel (ch, argument, CHANNEL_FLAME, "flame"); return; } void do_chat (CHAR_DATA * ch, char *argument) { FILE *fp; char *nstr; char buf[MSL]; // char tmpbuf[MSL]; time_t nowtime; char *strtime; struct tm *t; /* * We use this char in 'chatlog.dat' to represent start of line * Thus we cannot use it in chat... so strip it out... */ nstr = switch_char (argument, '>', ' '); argument = nstr; nowtime = time(¤t_time); t = localtime (&nowtime); strtime = asctime(gmtime(¤t_time)); strtime[strlen(strtime)-1] = '\0'; buf[0] = '\0'; strcat(buf, datestring(strtime)); if (strlen (argument) < 1) { stc ("Chat what?\n\r", ch); return; } /* if (!IS_SET (ch->more, CANCHAN) && !IS_IMMORTAL (ch) && (get_hours (ch) < 6)) { sprintf (buf, "You cannot chat until you are 6 hrs old.\n\r"); send_to_char (buf, ch); stc ("Use newbie <message>, instead.\n\r", ch); return; } */ if (is_contained("rapidshare", argument)) return; if (is_badword("fuck", argument) || is_badword("pussy", argument) || is_badword("cock", argument) || is_badword("shit", argument) || is_badword("fuk", argument) || is_badword("fucc", argument) || is_badword("wank", argument) || is_badword("cunt", argument) || is_badword("nicca", argument) || is_badword("niggah", argument) || is_badword("dick", argument) || is_badword("cum", argument) || is_badword("cok", argument) || is_badword("clit", argument) || is_badword("penis", argument) || is_badword("blowjob", argument) || is_badword("kunt", argument) || is_badword("anal", argument) || is_badword("nigger", argument) || is_badword("fag", argument) || is_badword("prick", argument) ) { talk_channel(ch, argument, CHANNEL_FLAME, "FLAME"); return; } else { if (!(fp = fopen (CHAT_LOG_FILE, "a+"))) { bug ("Cannot open CHAT_LOG_FILE!", 0); talk_channel (ch, argument, CHANNEL_CHAT, "#yCHAT#n"); return; } if (IS_IMMORTAL (ch) && (IS_SET (ch->act, PLR_WIZINVIS) || IS_SET (ch->act, PLR_INCOG))) fprintf (fp, ">#w[#r%s#w] %15s: #y%s#n\r\n", buf, "a divine being", argument); else fprintf (fp, ">#w[#r%s#w] %15s: #y%s#n\r\n", buf, ch->name, ((IS_IMMORTAL(ch) && !IS_SET (ch->more, MORE_CCHANNELS)) ? argument : bash_color (argument))); fclose (fp); if (is_advertisement(argument)) adv_alert(ch, "chat", argument); talk_channel (ch, argument, CHANNEL_CHAT, "#yCHAT"); return; } } /* * Alander's new channels. */ void do_music (CHAR_DATA * ch, char *argument) { if (is_advertisement(argument)) adv_alert(ch, "music", argument); talk_channel (ch, argument, CHANNEL_MUSIC, "#bMUSIC#n"); return; } void do_question (CHAR_DATA * ch, char *argument) { if (is_advertisement(argument)) adv_alert(ch, "question", argument); talk_channel (ch, argument, CHANNEL_QUESTION, "#gQUESTION#n"); return; } /* void do_answer (CHAR_DATA * ch, char *argument) { talk_channel (ch, argument, CHANNEL_QUESTION, "#gANSWER#n"); return; } */ void do_shout (CHAR_DATA * ch, char *argument) { if (is_advertisement(argument)) adv_alert(ch, "shout", argument); talk_channel (ch, argument, CHANNEL_SHOUT, "#CSHOUT#n"); WAIT_STATE (ch, 12); return; } void do_yell (CHAR_DATA * ch, char *argument) { if (is_advertisement(argument)) adv_alert(ch, "yell", argument); talk_channel (ch, argument, CHANNEL_YELL, "#CYELL#n"); return; } void do_buildtalk (CHAR_DATA * ch, char *argument) { talk_channel (ch, argument, CHANNEL_BUILD, "buildtalk"); return; } void do_immthist (CHAR_DATA * ch, char *argument) { FILE *fp; char *tok; char buffer[MAX_STRING_LENGTH]; char let; int size, save, ct = 0; if (!(fp = fopen (IMMT_LOG_FILE, "a+"))) { bug ("Cannot open IMMT_LOG_FILE!", 0); send_to_char ("BUG: Inform an Immortal\r\n", ch); return; } save = ftell (fp); fseek (fp, 0L, SEEK_END); size = ftell (fp); fseek (fp, size, SEEK_SET); while (size--) { fseek (fp, size, SEEK_SET); let = fgetc (fp); if (let == '>') ct++; /* Set to number of lines we want in chathist */ if (ct == 20) break; } send_to_char ("#wImmtalk History:#n\r\n", ch); while (fgets (buffer, (sizeof (buffer) - 2), fp) > 0) { tok = strtok (buffer, ">"); send_to_char (tok, ch); } fclose (fp); return; } void do_immtalk (CHAR_DATA * ch, char *argument) { FILE *fp; char *nstr; char buf[MSL]; time_t nowtime; struct tm *t; char *strtime; /* * We use this char in 'chatlog.dat' to represent start of line * Thus we cannot use it in chat... so strip it out... */ nstr = switch_char (argument, '>', ' '); argument = nstr; nowtime = time(¤t_time); t = localtime (&nowtime); strtime = asctime(gmtime(¤t_time)); buf[0] = '\0'; strtime[strlen(strtime)-1] = '\0'; strcat(buf, datestring(strtime)); if (strlen (argument) < 1) { stc ("Immtalk what?\n\r", ch); return; } if (!(fp = fopen (IMMT_LOG_FILE, "a+"))) { bug ("Cannot open IMMT_LOG_FILE!", 0); talk_channel (ch, argument, CHANNEL_IMMTALK, "immtalk"); return; } fprintf (fp, ">#w[#r%s#w] %13s: #r%s#n\r\n", buf, ch->name, argument); fclose (fp); talk_channel (ch, argument, CHANNEL_IMMTALK, "immtalk"); return; } void do_founder (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!is_clanleader(ch) && !IS_IMMORTAL (ch))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "foundertalk", argument); talk_channel (ch, argument, CHANNEL_FOUNDERTALK, "foundertalk"); return; } void do_monktalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_MONK))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "hum", argument); talk_channel (ch, argument, CHANNEL_MONK, "monk"); return; } void do_miktalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_NINJA))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "miktalk", argument); talk_channel (ch, argument, CHANNEL_MIKTALK, "miktalk"); return; } void do_phoenixcry (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_PHOENIX))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "ptalk", argument); talk_channel (ch, argument, CHANNEL_PTALK, "ptalk"); return; } void do_wraithtalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_WRAITH))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "wail", argument); talk_channel (ch, argument, CHANNEL_WRAITH, "wail"); return; } void do_ftalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_SET (ch->more, MORE_FTALK2) && !IS_CREATOR (ch))) { do_rand_typo (ch); return; } talk_channel (ch, argument, CHANNEL_FTALK, "ftalk"); return; } // new btalk per marianne's request void do_btalk (CHAR_DATA * ch, char *argument) { FILE *fp; char *nstr; char buf[MSL]; time_t nowtime; struct tm *t; char *strtime; if (IS_NPC (ch) || (!BITCH && !IS_IMMORTAL (ch))) { stc ("There currently is no bitch session in progress\n\r", ch); return; } /* * We use this char in 'chatlog.dat' to represent start of line * Thus we cannot use it in chat... so strip it out... */ nstr = switch_char (argument, '>', ' '); argument = nstr; nowtime = time (¤t_time); t = localtime (&nowtime); buf[0] = '\0'; strtime = asctime(gmtime(¤t_time)); strtime[strlen(strtime)-1] = '\0'; strcat(buf, datestring(strtime)); if (strlen (argument) < 1) { stc ("Bitch what?\n\r", ch); return; } if (!(fp = fopen (BTALK_LOG_FILE, "a+"))) { bug ("Cannot open BTALK_LOG_FILE!", 0); talk_channel (ch, argument, CHANNEL_BTALK, "btalk"); return; } fprintf (fp, ">#w[#r%s#w] %15s: #y%s#n\r\n", buf, ch->name, ((IS_IMMORTAL(ch) && !IS_SET (ch->more, MORE_CCHANNELS)) ? argument : bash_color (argument))); fclose (fp); talk_channel (ch, argument, CHANNEL_BTALK, "btalk"); return; } //old do_btalk /*void do_btalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!BITCH && !IS_IMMORTAL (ch))) { stc ("There currently is no bitch session in progress\n\r", ch); return; } talk_channel (ch, argument, CHANNEL_BTALK, "btalk"); return; } */ void do_hightalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_HIGHLANDER))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "htalk", argument); talk_channel (ch, argument, CHANNEL_HIGHTALK, "hightalk"); return; } void do_sign (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_DROW))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "sign", argument); talk_channel (ch, argument, CHANNEL_SIGN, "sign"); return; } void do_immclantalk (CHAR_DATA * ch, char *argument) { char old_clan[MIL]; char arg[MIL]; argument = one_argument (argument, arg); if IS_NPC (ch) return; if (!IS_IMMORTAL (ch)) { do_rand_typo (ch); return; } sprintf (old_clan, "%s", ch->clan); free_string (ch->clan); ch->clan = str_dup (arg); talk_channel (ch, argument, CHANNEL_CLANTALK, "clantalk"); free_string (ch->clan); ch->clan = str_dup (old_clan); } void do_clantalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (strlen (ch->clan) < 3) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "calntalk", argument); talk_channel (ch, argument, CHANNEL_CLANTALK, "clantalk"); } void do_wedtalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (strlen (ch->pcdata->marriage) < 3) { do_rand_typo (ch); return; } talk_channel (ch, argument, CHANNEL_SPOUSETALK, "spousetalk"); } void do_vamptalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_VAMPIRE))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "vtalk", argument); talk_channel (ch, argument, CHANNEL_VAMPTALK, "vamptalk"); return; } void do_magetalk (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_MAGE))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "magetalk", argument); talk_channel (ch, argument, CHANNEL_MAGETALK, "magetalk"); return; } void do_pray (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; act ("You mutter a few prayers.", ch, NULL, NULL, TO_CHAR); act ("$n mutters a quick prayer.", ch, NULL, NULL, TO_ROOM); if (ch->in_room != NULL && ch->in_room->vnum == ROOM_VNUM_ALTAR && ch->class == CLASS_NONE && ch->position != POS_FIGHTING) { send_to_char ("You glow bright blue as you are restored.\n\r", ch); ch->hit = ch->max_hit; ch->mana = ch->max_mana; ch->move = ch->max_move; ch->loc_hp[0] = 0; ch->loc_hp[1] = 0; ch->loc_hp[2] = 0; ch->loc_hp[3] = 0; ch->loc_hp[4] = 0; ch->loc_hp[5] = 0; ch->loc_hp[6] = 0; update_pos (ch); } if (IS_NPC (ch) || (!IS_CLASS (ch, CLASS_DEMON) && !IS_IMMORTAL (ch))) return; if (argument[0] == '\0' && IS_SET (ch->special, SPC_DEMON_LORD)) { send_to_char ("What do you wish to pray?\n\r", ch); return; } else if (argument[0] == '\0') { if (strlen (ch->lord) < 3) { stc ("Nothing Happens.\n\r", ch); return; } if (ch->pcdata->stats[DEMON_CURRENT] < 1) { send_to_char ("Nothing happens.\n\r", ch); return; } if ((victim = get_char_world (ch, ch->lord)) == NULL) { send_to_char ("Nothing happens.\n\r", ch); return; } act ("You hear $n's prayers in your mind.", ch, NULL, victim, TO_VICT); send_to_char ("You feel energy pour into your body.\n\r", victim); if (ch->pcdata->stats[DEMON_CURRENT] == 1) sprintf (buf, "You receive a single point of energy.\n\r"); else sprintf (buf, "You receive %d points of energy.\n\r", ch->pcdata->stats[DEMON_CURRENT]); send_to_char (buf, victim); act ("$n is briefly surrounded by a halo of energy.", victim, NULL, NULL, TO_ROOM); victim->pcdata->stats[DEMON_CURRENT] += ch->pcdata->stats[DEMON_CURRENT]; victim->pcdata->stats[DEMON_TOTAL] += ch->pcdata->stats[DEMON_CURRENT]; ch->pcdata->stats[DEMON_CURRENT] = 0; return; } if (IS_SET (ch->deaf, CHANNEL_PRAY)) { send_to_char ("But you're not even on the channel!\n\r", ch); return; } if (is_advertisement(argument)) adv_alert(ch, "pray", argument); talk_channel (ch, argument, CHANNEL_PRAY, "pray"); return; } void do_howl (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch) || (!IS_IMMORTAL (ch) && !IS_CLASS (ch, CLASS_WEREWOLF) && !IS_POLYAFF (ch, POLY_WOLF))) { do_rand_typo (ch); return; } if (is_advertisement(argument)) adv_alert(ch, "howl", argument); talk_channel (ch, argument, CHANNEL_HOWL, "howl"); send_howl (ch); return; } void do_say (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char name[80]; char poly[MAX_STRING_LENGTH]; char speak[15]; char speaks[15]; char endbit[5]; char secbit[5]; CHAR_DATA *to; bool is_ok; if (IS_HEAD (ch, LOST_TONGUE)) { send_to_char ("You can't speak without a tongue!\n\r", ch); return; } if (IS_EXTRA (ch, GAGGED)) { send_to_char ("You can't speak with a gag on!\n\r", ch); return; } if (ch->in_room != NULL && IS_SET (ch->in_room->added_flags, ROOM2_SILENCE)) { send_to_char ("Your words make no sound!\n\r", ch); return; } if (strlen (argument) > MAX_INPUT_LENGTH) { send_to_char ("Line too long.\n\r", ch); return; } if (argument[0] == '\0') { send_to_char ("Say what?\n\r", ch); return; } /* Allow the manipulation of a const argument */ strcpy (buf, argument); argument = &buf[0]; endbit[0] = argument[strlen (argument) - 1]; endbit[1] = '\0'; if (strlen (argument) > 1) secbit[0] = argument[strlen (argument) - 2]; else secbit[0] = '\0'; secbit[1] = '\0'; if (IS_BODY (ch, CUT_THROAT)) { sprintf (speak, "rasp"); sprintf (speaks, "rasps"); } else if (!IS_NPC (ch) && (IS_SET (ch->special, SPC_WOLFMAN) || IS_POLYAFF (ch, POLY_WOLF) || (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata-> stats[UNI_RAGE] > 0))) { if (number_percent () > 50) { sprintf (speak, "growl"); sprintf (speaks, "growls"); } else { sprintf (speak, "snarl"); sprintf (speaks, "snarls"); } } else if (!IS_NPC (ch) && IS_POLYAFF (ch, POLY_BAT)) { sprintf (speak, "squeak"); sprintf (speaks, "squeaks"); } else if (!IS_NPC (ch) && IS_POLYAFF (ch, POLY_SERPENT)) { sprintf (speak, "hiss"); sprintf (speaks, "hisses"); } else if (!IS_NPC (ch) && IS_POLYAFF (ch, POLY_FROG)) { sprintf (speak, "croak"); sprintf (speaks, "croaks"); } else if (!IS_NPC (ch) && IS_POLYAFF (ch, POLY_RAVEN)) { sprintf (speak, "squark"); sprintf (speaks, "squarks"); } else if (!str_cmp (endbit, "!")) { sprintf (speak, "exclaim"); sprintf (speaks, "exclaims"); } else if (!str_cmp (endbit, "?")) { sprintf (speak, "ask"); sprintf (speaks, "asks"); } else if (secbit[0] != '\0' && str_cmp (secbit, ".") && !str_cmp (endbit, ".")) { sprintf (speak, "state"); sprintf (speaks, "states"); } else if (secbit[0] != '\0' && !str_cmp (secbit, ".") && !str_cmp (endbit, ".")) { sprintf (speak, "mutter"); sprintf (speaks, "mutters"); } else if (secbit[0] != '\0' && (!str_cmp (secbit, ":") || !str_cmp (secbit, "=") || !str_cmp (secbit, ";")) && !str_cmp (endbit, ")")) { sprintf (speak, "grin"); sprintf (speaks, "grins"); } else if (secbit[0] != '\0' && (!str_cmp (secbit, ":") || !str_cmp (secbit, "=") || !str_cmp (secbit, ";")) && (!str_cmp (endbit, "P") || !str_cmp (endbit, "p"))) { sprintf (speak, "joke"); sprintf (speaks, "jokes"); } else if (secbit[0] != '\0' && !str_cmp (secbit, ":") && !str_cmp (endbit, "(")) { sprintf (speak, "frown"); sprintf (speaks, "frowns"); } else { sprintf (speak, "say"); sprintf (speaks, "says"); } sprintf (poly, "#wYou %s '#g$T#w'#n", speak); if (!IS_NPC (ch)) { if (ch->pcdata->condition[COND_DRUNK] > 10) act (poly, ch, NULL, drunktalk (ch, argument), TO_CHAR); else if (ch->pcdata->stats[UNI_RAGE] > 0 && IS_CLASS (ch, CLASS_VAMPIRE) && !IS_IMMORTAL(ch)) act (poly, ch, NULL, beasttalk (ch, argument), TO_CHAR); else if (IS_SPEAKING (ch, DIA_OLDE)) act (poly, ch, NULL, oldelang (ch, argument), TO_CHAR); else if (IS_SPEAKING (ch, DIA_BAD)) act (poly, ch, NULL, badlang (ch, argument), TO_CHAR); else act (poly, ch, NULL, argument, TO_CHAR); } else act (poly, ch, NULL, argument, TO_CHAR); if (is_advertisement(argument)) adv_alert(ch, "say", argument); sprintf (poly, "#w$n #w%s '#g$T#w'#n", speaks); if (ch->in_room->vnum != ROOM_VNUM_IN_OBJECT) { act (poly, ch, NULL, argument, TO_ROOM); room_text (ch, strlower (argument)); return; } to = ch->in_room->people; for (; to != NULL; to = to->next_in_room) { is_ok = FALSE; if (to->desc == NULL || !IS_AWAKE (to)) continue; if (ch == to) continue; if (!IS_NPC (ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_room != NULL && !IS_NPC (to) && to->pcdata->chobj != NULL && to->pcdata->chobj->in_room != NULL && ch->in_room == to->in_room) is_ok = TRUE; else is_ok = FALSE; if (!IS_NPC (ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_obj != NULL && !IS_NPC (to) && to->pcdata->chobj != NULL && to->pcdata->chobj->in_obj != NULL && ch->pcdata->chobj->in_obj == to->pcdata->chobj->in_obj) is_ok = TRUE; else is_ok = FALSE; if (!is_ok) continue; if (IS_NPC (ch)) sprintf (name, ch->short_descr); else if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_POLYMORPH)) sprintf (name, ch->morph); else sprintf (name, ch->name); name[0] = UPPER (name[0]); sprintf (poly, "%s %s '%s'.\n\r", name, speaks, argument); send_to_char (poly, to); } room_text (ch, strlower (argument)); return; } void room_text (CHAR_DATA * ch, char *argument) { CHAR_DATA *vch; CHAR_DATA *vch_next; CHAR_DATA *mob; OBJ_DATA *obj; ROOMTEXT_DATA *rt; bool mobfound; bool hop; char arg[MAX_INPUT_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; for (rt = ch->in_room->roomtext; rt != NULL; rt = rt->next) { if (!strcmp (argument, rt->input) || is_in (argument, rt->input) || all_in (argument, rt->input)) { if (rt->name != NULL && rt->name != '\0' && str_cmp (rt->name, "all") && str_cmp (rt->name, "|all*")) if (!is_in (ch->name, rt->name)) continue; mobfound = TRUE; if (rt->mob != 0) { mobfound = FALSE; for (vch = char_list; vch != NULL; vch = vch_next) { vch_next = vch->next; if (vch->in_room == NULL) continue; if (!IS_NPC (vch)) continue; if (vch->in_room == ch->in_room && vch->pIndexData->vnum == rt->mob) { mobfound = TRUE; break; } } } if (!mobfound) continue; hop = FALSE; switch (rt->type % RT_RETURN) { case RT_SAY: break; case RT_LIGHTS: do_changelight (ch, ""); break; case RT_LIGHT: REMOVE_BIT (ch->in_room->room_flags, ROOM_DARK); break; case RT_DARK: SET_BIT (ch->in_room->room_flags, ROOM_DARK); break; case RT_OBJECT: if (get_obj_index (rt->power) == NULL) return; obj = create_object (get_obj_index (rt->power), ch->level); if (IS_SET (rt->type, RT_TIMER)) obj->timer = 1; if (CAN_WEAR (obj, ITEM_TAKE)) obj_to_char (obj, ch); else obj_to_room (obj, ch->in_room); if (!str_cmp (rt->choutput, "copy")) act (rt->output, ch, obj, NULL, TO_CHAR); else act (rt->choutput, ch, obj, NULL, TO_CHAR); if (!IS_SET (rt->type, RT_PERSONAL)) act (rt->output, ch, obj, NULL, TO_ROOM); hop = TRUE; break; case RT_MOBILE: if (get_mob_index (rt->power) == NULL) return; mob = create_mobile (get_mob_index (rt->power)); char_to_room (mob, ch->in_room); if (!str_cmp (rt->choutput, "copy")) act (rt->output, ch, NULL, mob, TO_CHAR); else act (rt->choutput, ch, NULL, mob, TO_CHAR); if (!IS_SET (rt->type, RT_PERSONAL)) act (rt->output, ch, NULL, mob, TO_ROOM); hop = TRUE; break; case RT_SPELL: (*skill_table[rt->power].spell_fun) (rt->power, number_range (20, 30), ch, ch); break; case RT_PORTAL: if (get_obj_index (OBJ_VNUM_PORTAL) == NULL) return; obj = create_object (get_obj_index (OBJ_VNUM_PORTAL), 0); obj->timer = 1; obj->value[0] = rt->power; obj->value[1] = 1; obj_to_room (obj, ch->in_room); break; case RT_TELEPORT: if (ch->position == POS_FIGHTING) { stc("Not while fighting\n\r", ch); return; } if (ch->fight_timer > 0) { stc("Not while you have a fight timer\n\r", ch); return; } if (get_room_index (rt->power) == NULL) return; if (!str_cmp (rt->choutput, "copy")) act (rt->output, ch, NULL, NULL, TO_CHAR); else act (rt->choutput, ch, NULL, NULL, TO_CHAR); if (!IS_SET (rt->type, RT_PERSONAL)) act (rt->output, ch, NULL, NULL, TO_ROOM); char_from_room (ch); char_to_room (ch, get_room_index (rt->power)); act ("$n appears in the room.", ch, NULL, NULL, TO_ROOM); do_look (ch, "auto"); hop = TRUE; break; case RT_ACTION: sprintf (arg, argument); argument = one_argument (arg, arg1); argument = one_argument (arg, arg2); if ((mob = get_char_room (ch, arg2)) == NULL) continue; interpret (mob, rt->output); break; case RT_OPEN_LIFT: open_lift (ch); break; case RT_CLOSE_LIFT: close_lift (ch); break; case RT_MOVE_LIFT: move_lift (ch, rt->power); break; default: break; } if (hop && IS_SET (rt->type, RT_RETURN)) return; else if (hop) continue; if (!str_cmp (rt->choutput, "copy") && !IS_SET (rt->type, RT_ACTION)) act (rt->output, ch, NULL, NULL, TO_CHAR); else if (!IS_SET (rt->type, RT_ACTION)) act (rt->choutput, ch, NULL, NULL, TO_CHAR); if (!IS_SET (rt->type, RT_PERSONAL) && !IS_SET (rt->type, RT_ACTION)) act (rt->output, ch, NULL, NULL, TO_ROOM); if (IS_SET (rt->type, RT_RETURN)) return; } } return; } char *strlower (char *ip) { static char buffer[MAX_INPUT_LENGTH]; int pos; for (pos = 0; pos < (MAX_INPUT_LENGTH - 1) && ip[pos] != '\0'; pos++) { buffer[pos] = tolower (ip[pos]); } buffer[pos] = '\0'; return buffer; } bool is_in (char *arg, char *ip) { char *lo_arg; char cmp[MAX_INPUT_LENGTH]; int fitted; if (ip[0] != '|') return FALSE; cmp[0] = '\0'; lo_arg = strlower (arg); do { ip += strlen (cmp) + 1; fitted = sscanf (ip, "%[^*]", cmp); if (strstr (lo_arg, cmp) != NULL) { return TRUE; } } while (fitted > 0); return FALSE; } bool all_in (char *arg, char *ip) { char *lo_arg; char cmp[MAX_INPUT_LENGTH]; int fitted; if (ip[0] != '&') return FALSE; cmp[0] = '\0'; lo_arg = strlower (arg); do { ip += strlen (cmp) + 1; fitted = sscanf (ip, "%[^*]", cmp); if (strstr (lo_arg, cmp) == NULL) { return FALSE; } } while (fitted > 0); return TRUE; } /* No Reply to stop people sending you replies */ void do_noreply (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (IS_SET (ch->newbits, NEW_NOREPLY)) { REMOVE_BIT (ch->newbits, NEW_NOREPLY); send_to_char ("You accept replies.\n\r", ch); } else { SET_BIT (ch->newbits, NEW_NOREPLY); send_to_char ("You stop accepting replies.\n\r", ch); } return; } void do_nochan (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (IS_SET (ch->flag2, NOCHAN)) { REMOVE_BIT (ch->flag2, NOCHAN); send_to_char ("You can use all channels again.\n\r", ch); } else { SET_BIT (ch->flag2, NOCHAN); send_to_char ("You can now only use immtalk/ftalk.\n\r", ch); } return; } void do_nobeep (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (IS_SET (ch->flag2, NOBEEP)) { REMOVE_BIT (ch->flag2, NOBEEP); stc ("You can be beeped again!\n\r", ch); } else { SET_BIT (ch->flag2, NOBEEP); stc ("You can nolonger be beeeped!\n\r", ch); } return; } void do_review (CHAR_DATA * ch, char *argument) { int i; if (IS_NPC (ch) || (ch->pcdata == NULL)) { send_to_char ("Not for NPCs.\n\r", ch); return; } stc ("#wTell History:#n\n\r", ch); i = ch->pcdata->tell_history_pos; do { send_to_char (ch->pcdata->tell_history[i], ch); i = (i + 1) % TELL_HISTORY_SIZE; } while (i != ch->pcdata->tell_history_pos); return; } void do_tell (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char poly[MAX_STRING_LENGTH]; CHAR_DATA *victim; int position; char buf[MSL]; time_t nowtime; struct tm *t; char *strtime; nowtime = time (¤t_time); t = localtime (&nowtime); //strftime (buf, 100, "%H:%M:%S", t); buf[0] = '\0'; strtime = asctime(gmtime(¤t_time)); strtime[strlen(strtime)-1] = '\0'; strcat(buf, timestring(strtime)); if (!IS_IMMORTAL (ch) && (ch->mkill < 20) && !IS_NPC (ch)) { stc ("Until you have killed 20 mobs, you are unable to send tells.\n\r", ch); return; } if ((IS_NPC (ch) && ch->pIndexData->vnum != 25) || IS_SET (ch->act, PLR_SILENCE)) { send_to_char ("Your message didn't get through.\n\r", ch); return; } if (IS_EXTRA (ch, GAGGED)) { send_to_char ("Your message didn't get through.\n\r", ch); return; } argument = one_argument (argument, arg); if (arg[0] == '\0' || argument[0] == '\0') { send_to_char ("Tell whom what?\n\r", ch); return; } /* * Can tell to PC's anywhere, but NPC's only in same room. * -- Furey */ if ((victim = get_char_world (ch, arg)) == NULL || ((IS_NPC (victim) && victim->in_room != ch->in_room) && !IS_NPC(ch))) { send_to_char ("They aren't here.\n\r", ch); return; } if (!IS_NPC (victim) && IS_SET (victim->act, PLR_SILENCE)) { stc ("They are currently silenced, so will be unable to reply.\n\r", ch); } if (!IS_IMMORTAL (ch) && !IS_AWAKE (victim)) { act ("$E can't hear you.", ch, 0, victim, TO_CHAR); return; } if (!IS_NPC (victim) && victim->desc == NULL) { act ("$E is currently link dead.", ch, 0, victim, TO_CHAR); return; } if (IS_SET (victim->deaf, CHANNEL_TELL)) { if ((IS_NPC (victim) || IS_NPC (ch) || strlen (victim->pcdata->marriage) < 2 || str_cmp (ch->name, victim->pcdata->marriage)) && ((ch->trust < (MAX_LEVEL - 3)) && (ch->level < (MAX_LEVEL - 3)))) { act ("$E can't hear you.", ch, 0, victim, TO_CHAR); return; } } sprintf (poly, "#wYou tell %s '#c$t#w'#n", IS_NPC (victim) ? victim->short_descr : victim->name); act (poly, ch, argument, victim, TO_CHAR); position = victim->position; victim->position = POS_STANDING; if (IS_IMMORTAL(ch) ) { sprintf (poly, "#w%s tells you '^1#c$t#n#w'#n", IS_NPC (ch) ? ch->short_descr : ch->name); sprintf (log_buf, "Log %s: %s tells you %s", victim->name, IS_NPC (ch) ? ch->short_descr : ch->name, argument); } else { sprintf (poly, "#w%s tells you '#c$t#w'#n", IS_NPC (ch) ? ch->short_descr : ch->name); sprintf (log_buf, "Log %s: %s tells you %s", victim->name, IS_NPC (ch) ? ch->short_descr : ch->name, argument); } act (poly, ch, argument, victim, TO_VICT); if (is_advertisement(argument)) adv_alert(ch, "tell", argument); if (IS_SET (victim->act, PLR_LOG)) log_player (log_buf, victim, TRUE); if (victim->pcdata) { int pos = (victim->pcdata->tell_history_pos); victim->pcdata->tell_history_pos = (victim->pcdata->tell_history_pos + 1) % TELL_HISTORY_SIZE; sprintf (poly, "#w[#r%s#w] #c(From) #w%15s: #c%s#n\r\n", buf, ch->name, argument); free_string (victim->pcdata->tell_history[pos]); victim->pcdata->tell_history[pos] = str_dup (poly); } if (ch->pcdata) { int pos = (ch->pcdata->tell_history_pos); ch->pcdata->tell_history_pos = (ch->pcdata->tell_history_pos + 1) % TELL_HISTORY_SIZE; sprintf (poly, "#w[#r%s#w] #c (To) #w%15s: #c%s#n\r\n", buf, victim->name, argument); free_string (ch->pcdata->tell_history[pos]); ch->pcdata->tell_history[pos] = str_dup (poly); } victim->position = position; victim->reply = ch; return; } void do_whisper (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; if (IS_EXTRA (ch, GAGGED)) { send_to_char ("Not with a gag on!\n\r", ch); return; } argument = one_argument (argument, arg); if (arg[0] == '\0' || argument[0] == '\0') { send_to_char ("Syntax: whisper <person> <message>\n\r", ch); return; } if ((victim = get_char_world (ch, arg)) == NULL || (victim->in_room != ch->in_room)) { send_to_char ("They aren't here.\n\r", ch); return; } if (!IS_AWAKE (victim)) { act ("$E cannot hear you.", ch, 0, victim, TO_CHAR); return; } if (!IS_NPC (victim) && victim->desc == NULL) { act ("$E is currently link dead.", ch, 0, victim, TO_CHAR); return; } act ("#wYou whisper to $N '#C$t#w'#n", ch, argument, victim, TO_CHAR); act ("#w$n whispers to you '#C$t#w'", ch, argument, victim, TO_VICT); if (is_advertisement(argument)) adv_alert(ch, "whisper", argument); return; } void do_reply (CHAR_DATA * ch, char *argument) { char poly[MAX_STRING_LENGTH]; CHAR_DATA *victim; int position; char buf[MSL]; time_t nowtime; struct tm *t; char *strtime; if (argument[0] == '\0') { send_to_char ("What do you wish to reply?\n\r", ch); return; } nowtime = time (¤t_time); t = localtime (&nowtime); buf[0] = '\0'; strtime = asctime(gmtime(¤t_time)); strtime[strlen(strtime)-1] = '\0'; strcat(buf, timestring(strtime)); if (!IS_NPC (ch) && IS_SET (ch->act, PLR_SILENCE)) { send_to_char ("Your message didn't get through.\n\r", ch); return; } if (IS_EXTRA (ch, GAGGED)) { send_to_char ("Your message didn't get through.\n\r", ch); return; } if ((victim = ch->reply) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_SET (victim->newbits, NEW_NOREPLY) && !IS_IMMORTAL (ch)) { act ("$E can't hear you.", ch, 0, victim, TO_CHAR); return; } if (!IS_IMMORTAL (ch) && !IS_AWAKE (victim)) { act ("$E can't hear you.", ch, 0, victim, TO_CHAR); return; } if (!IS_NPC (victim) && victim->desc == NULL) { act ("$E is currently link dead.", ch, 0, victim, TO_CHAR); return; } sprintf (poly, "#wYou reply to %s '#c$t#w'#n", IS_NPC (victim) ? victim->short_descr : victim->name); act (poly, ch, argument, victim, TO_CHAR); position = victim->position; victim->position = POS_STANDING; if (IS_IMMORTAL(ch) ) { sprintf (poly, "#w%s replies '^1#c$t#n#w'#n", IS_NPC (ch) ? ch->short_descr : ch->name); sprintf (log_buf, "Log %s: %s replies %s", victim->name, IS_NPC (ch) ? ch->short_descr : ch->name, argument); } else { sprintf (poly, "#w%s replies '#c$t#w'#n", IS_NPC (ch) ? ch->short_descr : ch->name); sprintf (log_buf, "Log %s: %s replies %s", victim->name, IS_NPC (ch) ? ch->short_descr : ch->name, argument); } if (is_advertisement(argument)) adv_alert(ch, "reply", argument); act (poly, ch, argument, victim, TO_VICT); if (IS_SET (victim->act, PLR_LOG)) log_player (log_buf, victim, TRUE); if (victim->pcdata) { int pos = (victim->pcdata->tell_history_pos); victim->pcdata->tell_history_pos = (victim->pcdata->tell_history_pos + 1) % TELL_HISTORY_SIZE; sprintf (poly, "#w[#r%s#w] #c(From) #w%15s: #c%s#n\r\n", buf, ch->name, argument); free_string (victim->pcdata->tell_history[pos]); victim->pcdata->tell_history[pos] = str_dup (poly); } if (ch->pcdata) { int pos = (ch->pcdata->tell_history_pos); ch->pcdata->tell_history_pos = (ch->pcdata->tell_history_pos + 1) % TELL_HISTORY_SIZE; sprintf (poly, "#w[#r%s#w] #c (To) #w%15s: #c%s#n\r\n", buf, victim->name, argument); free_string (ch->pcdata->tell_history[pos]); ch->pcdata->tell_history[pos] = str_dup (poly); } victim->position = position; victim->reply = ch; return; } void do_emote (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char *plast; char name[80]; char poly[MAX_INPUT_LENGTH]; CHAR_DATA *to; bool is_ok; if (!IS_NPC (ch) && IS_SET (ch->act, PLR_NO_EMOTE)) { send_to_char ("You can't show your emotions.\n\r", ch); return; } if (IS_HEAD (ch, LOST_TONGUE) || IS_HEAD (ch, LOST_HEAD) || IS_EXTRA (ch, GAGGED)) { send_to_char ("You can't show your emotions.\n\r", ch); return; } if (argument[0] == '\0') { send_to_char ("Pose what?\n\r", ch); return; } for (plast = argument; *plast != '\0'; plast++) ; strcpy (buf, argument); if (isalpha (plast[-1])) strcat (buf, "."); act ("$n $T", ch, NULL, buf, TO_CHAR); if (ch->in_room->vnum != ROOM_VNUM_IN_OBJECT) { act ("$n $T", ch, NULL, buf, TO_ROOM); return; } to = ch->in_room->people; for (; to != NULL; to = to->next_in_room) { is_ok = FALSE; if (to->desc == NULL || !IS_AWAKE (to)) continue; if (ch == to) continue; if (!IS_NPC (ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_room != NULL && !IS_NPC (to) && to->pcdata->chobj != NULL && to->pcdata->chobj->in_room != NULL && ch->in_room == to->in_room) is_ok = TRUE; else is_ok = FALSE; if (!IS_NPC (ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_obj != NULL && !IS_NPC (to) && to->pcdata->chobj != NULL && to->pcdata->chobj->in_obj != NULL && ch->pcdata->chobj->in_obj == to->pcdata->chobj->in_obj) is_ok = TRUE; else is_ok = FALSE; if (!is_ok) continue; if (IS_NPC (ch)) sprintf (name, ch->short_descr); else if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_POLYMORPH)) sprintf (name, ch->morph); else sprintf (name, ch->name); name[0] = UPPER (name[0]); sprintf (poly, "%s %s\n\r", name, buf); send_to_char (poly, to); } return; } void do_xemote (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char oldarg[MAX_STRING_LENGTH]; char *plast; char name[80]; char you[80]; char them[80]; char poly[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *to; CHAR_DATA *victim; bool is_ok; argument = one_argument (argument, arg); if (!IS_NPC (ch) && IS_SET (ch->act, PLR_NO_EMOTE)) { send_to_char ("You can't show your emotions.\n\r", ch); return; } if (IS_HEAD (ch, LOST_TONGUE) || IS_HEAD (ch, LOST_HEAD) || IS_EXTRA (ch, GAGGED)) { send_to_char ("You can't show your emotions.\n\r", ch); return; } if (strlen (argument) > MAX_INPUT_LENGTH) { send_to_char ("Line too long.\n\r", ch); return; } if (argument[0] == '\0' || arg[0] == '\0') { send_to_char ("Syntax: emote <person> <sentence>\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_NPC (ch)) strcpy (you, ch->short_descr); else strcpy (you, ch->name); if (IS_NPC (victim)) strcpy (you, victim->short_descr); else strcpy (you, victim->name); /* oldarg = argument; */ strcpy (oldarg, argument); strcpy (buf, argument); for (plast = argument; *plast != '\0'; plast++) ; if (isalpha (plast[-1])) strcat (buf, "."); argument = socialc (ch, buf, you, them); strcpy (buf, argument); strcpy (buf2, "You "); buf[0] = LOWER (buf[0]); strcat (buf2, buf); capitalize (buf2); act (buf2, ch, NULL, victim, TO_CHAR); if (ch->in_room->vnum != ROOM_VNUM_IN_OBJECT) { strcpy (buf, oldarg); for (plast = argument; *plast != '\0'; plast++) ; if (isalpha (plast[-1])) strcat (buf, "."); argument = socialn (ch, buf, you, them); strcpy (buf, argument); strcpy (buf2, "$n "); buf[0] = LOWER (buf[0]); strcat (buf2, buf); capitalize (buf2); act (buf2, ch, NULL, victim, TO_NOTVICT); strcpy (buf, oldarg); for (plast = argument; *plast != '\0'; plast++) ; if (isalpha (plast[-1])) strcat (buf, "."); argument = socialv (ch, buf, you, them); strcpy (buf, argument); strcpy (buf2, "$n "); buf[0] = LOWER (buf[0]); strcat (buf2, buf); capitalize (buf2); act (buf2, ch, NULL, victim, TO_VICT); return; } to = ch->in_room->people; for (; to != NULL; to = to->next_in_room) { is_ok = FALSE; if (to->desc == NULL || !IS_AWAKE (to)) continue; if (ch == to) continue; if (!IS_NPC (ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_room != NULL && !IS_NPC (to) && to->pcdata->chobj != NULL && to->pcdata->chobj->in_room != NULL && ch->in_room == to->in_room) is_ok = TRUE; else is_ok = FALSE; if (!IS_NPC (ch) && ch->pcdata->chobj != NULL && ch->pcdata->chobj->in_obj != NULL && !IS_NPC (to) && to->pcdata->chobj != NULL && to->pcdata->chobj->in_obj != NULL && ch->pcdata->chobj->in_obj == to->pcdata->chobj->in_obj) is_ok = TRUE; else is_ok = FALSE; if (!is_ok) continue; if (IS_NPC (ch)) sprintf (name, ch->short_descr); else if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_POLYMORPH)) sprintf (name, ch->morph); else sprintf (name, ch->name); name[0] = UPPER (name[0]); sprintf (poly, "%s %s\n\r", name, buf); send_to_char (poly, to); } return; } void do_bug (CHAR_DATA * ch, char *argument) { append_file (ch, BUG_FILE, argument); send_to_char ("Ok. Thanks.\n\r", ch); return; } void do_idea (CHAR_DATA * ch, char *argument) { append_file (ch, IDEA_FILE, argument); send_to_char ("Ok. Thanks.\n\r", ch); return; } void do_typo (CHAR_DATA * ch, char *argument) { append_file (ch, TYPO_FILE, argument); send_to_char ("Ok. Thanks.\n\r", ch); return; } void do_rent (CHAR_DATA * ch, char *argument) { send_to_char ("There is no rent here. Just save and quit.\n\r", ch); return; } void do_qui (CHAR_DATA * ch, char *argument) { send_to_char ("If you want to QUIT, you have to spell it out.\n\r", ch); return; } void do_quit (CHAR_DATA * ch, char *argument) { DESCRIPTOR_DATA *d; ROOM_INDEX_DATA* was_in = NULL; char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; OBJ_DATA *obj_next; CHAR_DATA *mount; int temp_num; int targetroom; if (IS_NPC (ch)) return; if (ch->position == POS_FIGHTING) { send_to_char ("No way! You are fighting.\n\r", ch); return; } if (IS_SET (ch->flag2, AFF2_CHALLENGED)) { stc ("You cannot quit. You will have to decline first.\n\r", ch); return; } if (IS_SET (ch->flag2, AFF2_CHALLENGER)) { stc ("You cannot quit, You have a challenge in progress.\n\r", ch); return; } if (IS_SET (ch->flag2, AFF2_INARENA)) { CHAR_DATA *player; for (player = char_list; player != NULL; player = player->next) if (!IS_NPC(player) && player != ch && player->in_room != NULL && is_inarena(player)) { stc ("You cannot quit while you're in the arena.\n\r", ch); return; } } if (IS_SET (ch->war, JOINING)) { stc ("You can't quit your joining a war!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("You can't quit while in a WAR!\n\r", ch); return; } if (ch->position < POS_SLEEPING) { send_to_char ("You're not DEAD yet.\n\r", ch); return; } was_in = ch->was_in_room ? ch->was_in_room : ch->in_room; if (auction_info.high_bidder == ch || auction_info.owner == ch) { send_to_char ("You still have a stake in the auction!\n\r", ch); return; } if (!IS_NPC (ch) && IS_EXTRA2 (ch, EXTRA2_NEUTRAL)) { if (ch->in_room != NULL) { REMOVE_BIT (ch->extra2, EXTRA2_NEUTRAL); act ("$n stops making the time-out sign.", ch, NULL, NULL, TO_ROOM); send_to_char ("The peaceful harmony in the air gradually fades away to nothing.\n\r", ch); act ("The peaceful harmony in the air gradually fades away to nothing.", ch, NULL, NULL, TO_ROOM); } } if (!IS_NPC (ch) && IS_SET (ch->newbits, NEW_DARKNESS)) { if (ch->in_room != NULL) { if (IS_CLASS (ch, CLASS_DROW) || WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_CLASS (ch, CLASS_WEREWOLF)) REMOVE_BIT (ch->in_room->room_flags, ROOM_DARK); REMOVE_BIT (ch->newbits, NEW_DARKNESS); send_to_char ("The darkness in the room gradually fades away to nothing.\n\r", ch); act ("The darkness in the room gradually fades away to nothing.", ch, NULL, NULL, TO_ROOM); } } /* if (!IS_IMMORTAL (ch) && ch->level > 1 && ch->pcdata->login_timer > 0 && ch->desc != NULL) { sprintf (buf, "You still have '#r%d#n' ticks left on your login timer before you can quit!\n\r", ch->pcdata->login_timer); stc (buf, ch); return; } */ if (!IS_IMMORTAL (ch) && (ch->fight_timer > 0) && ch->desc != NULL) { stcprintf (ch, "You still have '#r%d#n' ticks left on your fight timer before you can quit.\n\r", ch->fight_timer); return; } temp_num = get_totalscore (ch); if ((mount = ch->mount) != NULL) do_dismount (ch, ""); if (IS_SET (ch->pcdata->tempflag, TEMP_VT100)) { do_vt100 (ch, ""); } do_rand_quote (ch); if (ch->pcdata->obj_vnum == 0) { char *temp = 0; do_qinfo (ch, exitmsg (temp, ch)); } if (IS_SET(ch->flag2, AFF2_INARENA)) REMOVE_BIT(ch->flag2, AFF2_INARENA); if (ch->pcdata->in_progress) free_note (ch->pcdata->in_progress); /* * After extract_char the ch is no longer valid! */ d = ch->desc; for (obj = object_list; obj != NULL; obj = obj->next) { if ((IS_SET (obj->quest2, QUEST2_OWNERSHIP) && !str_cmp(obj->questowner, ch->name)) && obj->carried_by != NULL && obj->carried_by != ch) { act ("$p jumps out of $n's hands.", obj->carried_by, obj, NULL, TO_ROOM); obj_from_char (obj); obj_to_char (obj, ch); continue; } } if (WizConfig->artifacts == ARTIFACTS_DONATION || WizConfig->artifacts == ARTIFACTS_RANDOM || WizConfig->artifacts == ARTIFACTS_HUNT) { CHAR_DATA *vch = NULL; if (WizConfig->artifacts == ARTIFACTS_HUNT) { for ( vch = char_list; vch != NULL; vch = vch->next ) { if (IS_NPC(vch) && vch->pIndexData->vnum == 25) break; } } for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) { act ("$p jumps out of $n's hands.", obj->carried_by, obj, NULL, TO_ROOM); obj_from_char (obj); if (WizConfig->artifacts == ARTIFACTS_DONATION) obj_to_room (obj, get_room_index(3010)); else if (WizConfig->artifacts == ARTIFACTS_HUNT) obj_to_char (obj, vch); else obj_to_room (obj, get_empty_room()); update_artitable (ch); continue; } } } for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->item_type == ITEM_PIECE || obj->item_type == ITEM_AQUEST || ((IS_SET (obj->quest2, QUEST2_OWNERSHIP) && str_cmp(obj->questowner, ch->name)))) /*|| obj->item_type == ITEM_STOKEN */ { act ("$p jumps out of $n's hands.", ch, obj, NULL, TO_ROOM); obj_from_char (obj); targetroom = number_range (1, 15000); while (get_room_index (targetroom) == NULL) { targetroom = number_range (1, 15000); } obj_to_room (obj, get_room_index (targetroom)); continue; } if (obj->wear_loc == WEAR_NONE) continue; if (!IS_NPC (ch) && ((obj-> chobj != NULL && !IS_NPC (obj->chobj) && obj->chobj->pcdata->obj_vnum != 0) || obj->item_type == ITEM_KEY)) unequip_char (ch, obj); } save_char_obj (ch); update_artitable (ch); check_leaderboard (ch); adjust_hiscore ("pkill", ch, ch->pkill); adjust_hiscore ("pdeath", ch, ch->pdeath); adjust_hiscore ("mkill", ch, ch->mkill); adjust_hiscore ("mdeath", ch, ch->mdeath); adjust_hiscore ("awins", ch, ch->awins); adjust_hiscore ("alosses", ch, ch->alosses); adjust_hiscore ("exp", ch, ch->pcdata->score[SCORE_TOTAL_XP]); adjust_hiscore ("quest", ch, ch->pcdata->score[SCORE_QUEST]); adjust_hiscore ("tier", ch, ch->tier); adjust_hiscore ("hours", ch, get_hours (ch)); if (IS_SET (ch->extra2, EXTRA2_INFECTED)) { REMOVE_BIT (ch->extra2, EXTRA2_INFECTED); SET_BIT (ch->extra2, EXTRA2_VACCINATED); mal_info.parasite_timer = 1; act ("The Parasite has fled $n's body.", ch, NULL, NULL, TO_ROOM); stc ("The Parasite has fled your body.", ch); update_parasite (); } if (!IS_IMMORTAL (ch)) { if (ch->pcdata->obj_vnum != 0) act ("$n slowly fades out of existance.", ch, NULL, NULL, TO_ROOM); else act ("$n has left the game.", ch, NULL, NULL, TO_ROOM); } if (d != NULL) close_socket2 (d, FALSE); if (ch->in_room != NULL) char_from_room (ch); char_to_room (ch, get_room_index (30002)); sprintf (log_buf, "%s has quit.", ch->name); log_string (log_buf, ch); if (was_in != NULL) { if ( ch->desc != NULL && ch->desc->host != NULL && strlen( ch->desc->host ) > 1 ) sprintf( log_buf, "%s@%s has left (%d)", ch->name, ch->desc->host, was_in->vnum ); else sprintf( log_buf, "%s@%s has left (%d)", ch->name, ch->lasthost, was_in->vnum ); wiznet (ch, WIZ_LOGINS, 11, log_buf); } if ((obj = ch->pcdata->chobj) != NULL) { obj->chobj = NULL; ch->pcdata->chobj = NULL; extract_obj (obj); } if (IS_SET (ch->more, MORE_TAG)) { REMOVE_BIT (ch->more, MORE_TAG); sprintf (buf, "%s has quit the TAG Game, Tag Over", ch->name); do_taginfo (ch, buf); } /* if (IS_SET (ch->act, PLR_AUTOBACKUP)) { do_silentbackup (ch, ""); } */ if (ch->pcdata->chobj != NULL) extract_obj (ch->pcdata->chobj); extract_char (ch, TRUE, FALSE); return; } void do_quit2 (CHAR_DATA * ch, char *argument) { DESCRIPTOR_DATA *d; char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; OBJ_DATA *obj_next; CHAR_DATA *mount; int temp_num; int targetroom; if (IS_NPC (ch)) return; if (ch->position == POS_FIGHTING) { send_to_char ("No way! You are fighting.\n\r", ch); return; } if (IS_SET (ch->flag2, AFF2_CHALLENGED)) { stc ("You cannot quit. You will have to decline first.\n\r", ch); return; } if (IS_SET (ch->flag2, AFF2_CHALLENGER)) { stc ("You cannot quit, You have a challenge in progress.\n\r", ch); return; } if (IS_SET (ch->flag2, AFF2_INARENA)) { stc ("You cannot quit while you're in the arena.\n\r", ch); return; } if (IS_SET (ch->war, JOINING)) { stc ("You can't quit your joining a war!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("You can't quit while in a WAR!\n\r", ch); return; } if (ch->position < POS_SLEEPING) { send_to_char ("You're not DEAD yet.\n\r", ch); return; } if (auction_info.high_bidder == ch || auction_info.owner == ch) { send_to_char ("You still have a stake in the auction!\n\r", ch); return; } if (!IS_NPC (ch) && IS_EXTRA2 (ch, EXTRA2_NEUTRAL)) { if (ch->in_room != NULL) { REMOVE_BIT (ch->extra2, EXTRA2_NEUTRAL); act ("$n stops making the time-out sign.", ch, NULL, NULL, TO_ROOM); send_to_char ("The peaceful harmony in the air gradually fades away to nothing.\n\r", ch); act ("The peaceful harmony in the air gradually fades away to nothing.", ch, NULL, NULL, TO_ROOM); } } if (!IS_NPC (ch) && IS_SET (ch->newbits, NEW_DARKNESS)) { if (ch->in_room != NULL) { if (IS_CLASS (ch, CLASS_DROW) || WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_CLASS (ch, CLASS_WEREWOLF)) REMOVE_BIT (ch->in_room->room_flags, ROOM_DARK); REMOVE_BIT (ch->newbits, NEW_DARKNESS); send_to_char ("The darkness in the room gradually fades away to nothing.\n\r", ch); act ("The darkness in the room gradually fades away to nothing.", ch, NULL, NULL, TO_ROOM); } } /* if (!IS_IMMORTAL (ch) && ch->level > 1 && ch->pcdata->login_timer > 0 && ch->desc != NULL) { sprintf (buf, "You still have '#r%d#n' ticks left on your login timer before you can quit!\n\r", ch->pcdata->login_timer); stc (buf, ch); return; } */ if (!IS_IMMORTAL (ch) && (ch->fight_timer > 0) && ch->desc != NULL) { stcprintf (ch, "You still have '#r%d#n' ticks left on your fight timer before you can quit.\n\r", ch->fight_timer); return; } /* if ( ( IS_SET( ch->extra, EXTRA_OSWITCH ) ) || ( ch->pcdata->obj_vnum > 0 ) ) { stc( "You need to be in non-object form to log out.\n\r", ch ); return; } */ temp_num = get_totalscore (ch); if ((mount = ch->mount) != NULL) do_dismount (ch, ""); if (ch->desc && ch->desc->out_compress) { compressEnd (ch->desc, TELOPT_COMPRESS2, TRUE); compressEnd (ch->desc, TELOPT_COMPRESS, TRUE); } if (IS_SET (ch->pcdata->tempflag, TEMP_VT100)) { do_vt100 (ch, ""); } do_rand_quote (ch); if (ch->pcdata->obj_vnum == 0) { char *temp = 0; do_qinfo (ch, exitmsg (temp, ch)); } /* * After extract_char the ch is no longer valid! */ d = ch->desc; for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->item_type == ITEM_PIECE /*|| obj->item_type == ITEM_STOKEN */ ) { act ("$p jumps out of $n's hands.", ch, obj, NULL, TO_ROOM); obj_from_char (obj); targetroom = number_range (1, 15000); while (get_room_index (targetroom) == NULL) { targetroom = number_range (1, 15000); } obj_to_room (obj, get_room_index (targetroom)); continue; } if (obj->wear_loc == WEAR_NONE) continue; if (!IS_NPC (ch) && ((obj-> chobj != NULL && !IS_NPC (obj->chobj) && obj->chobj->pcdata->obj_vnum != 0) || obj->item_type == ITEM_KEY)) unequip_char (ch, obj); } save_char_obj (ch); update_artitable (ch); check_leaderboard (ch); if (IS_SET (ch->extra2, EXTRA2_INFECTED)) { REMOVE_BIT (ch->extra2, EXTRA2_INFECTED); SET_BIT (ch->extra2, EXTRA2_VACCINATED); mal_info.parasite_timer = 1; act ("The Parasite has fled $n's body.", ch, NULL, NULL, TO_ROOM); stc ("The Parasite has fled your body.", ch); update_parasite (); } if (ch->pcdata->obj_vnum != 0) act ("$n slowly fades out of existance.", ch, NULL, NULL, TO_ROOM); else act ("$n has left the game.", ch, NULL, NULL, TO_ROOM); if (d != NULL) close_socket2 (d, FALSE); if (ch->in_room != NULL) char_from_room (ch); char_to_room (ch, get_room_index (30002)); sprintf (log_buf, "%s has quit.", ch->name); log_string (log_buf, ch); wiznet (ch, WIZ_LOGINS, 11, log_buf); if ((obj = ch->pcdata->chobj) != NULL) { obj->chobj = NULL; ch->pcdata->chobj = NULL; extract_obj (obj); } if (IS_SET (ch->more, MORE_TAG)) { REMOVE_BIT (ch->more, MORE_TAG); sprintf (buf, "%s has quit the TAG Game, Tag Over", ch->name); do_taginfo (ch, buf); } if (IS_SET (ch->act, PLR_AUTOBACKUP)) { do_silentbackup (ch, ""); } if (ch->pcdata->chobj != NULL) extract_obj (ch->pcdata->chobj); extract_char (ch, TRUE, FALSE); return; } void do_save (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; /* if (ch->registerred == 0) { stc("You #7MUST#n register before you can save.\n\r",ch); do_help(ch, "registration"); return; } */ if (!IS_IMMORTAL (ch) && ch->mkill < 5) { send_to_char ("You must kill at least 5 mobs before you can save.\n\r", ch); return; } update_artitable (ch); check_leaderboard (ch); get_totalscore (ch); adjust_hiscore ("status", ch, ch->race); adjust_hiscore ("pkill", ch, ch->pkill); adjust_hiscore ("pdeath", ch, ch->pdeath); adjust_hiscore ("mkill", ch, ch->mkill); adjust_hiscore ("mdeath", ch, ch->mdeath); adjust_hiscore ("awins", ch, ch->awins); adjust_hiscore ("alosses", ch, ch->alosses); adjust_hiscore ("exp", ch, ch->pcdata->score[SCORE_TOTAL_XP]); adjust_hiscore ("quest", ch, ch->pcdata->score[SCORE_QUEST]); adjust_hiscore ("tier", ch, ch->tier); adjust_hiscore ("hours", ch, get_hours (ch)); save_char_obj (ch); check_leaderboard (ch); check_ill_items (ch); //rem_ninja_mask (ch); send_to_char ("Saved.\n\r", ch); return; } void do_autosave (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (ch->mkill < 5 && !IS_IMMORTAL (ch)) return; save_char_obj (ch); return; } void do_follow (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Follow whom?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_SET (victim->extra2, NHELPER)) { stc("You are unable to follow Newbie Helpers!\n\r", ch); return; } if (IS_AFFECTED (ch, AFF_CHARM) && ch->master != NULL) { act ("But you'd rather follow $N!", ch, NULL, ch->master, TO_CHAR); return; } if (victim == ch) { if (ch->master == NULL) { send_to_char ("You already follow yourself.\n\r", ch); return; } stop_follower (ch); return; } if (ch->master != NULL) stop_follower (ch); add_follower (ch, victim); return; } void add_follower (CHAR_DATA * ch, CHAR_DATA * master) { if (ch->master != NULL) { bug ("Add_follower: non-null master.", 0); return; } ch->master = master; ch->leader = NULL; if (can_see (master, ch)) act ("$n now follows you.", ch, NULL, master, TO_VICT); act ("You now follow $N.", ch, NULL, master, TO_CHAR); return; } void stop_follower (CHAR_DATA * ch) { if (ch->master == NULL) { bug ("Stop_follower: null master.", 0); return; } if (IS_AFFECTED (ch, AFF_CHARM)) { REMOVE_BIT (ch->affected_by, AFF_CHARM); affect_strip (ch, gsn_charm_person); } if (!IS_NPC (ch->master) && ch->master->pcdata->followers > 0 && IS_NPC (ch)) ch->master->pcdata->followers--; if (can_see (ch->master, ch)) act ("$n stops following you.", ch, NULL, ch->master, TO_VICT); act ("You stop following $N.", ch, NULL, ch->master, TO_CHAR); ch->master = NULL; ch->leader = NULL; return; } void die_follower (CHAR_DATA * ch) { CHAR_DATA *fch; if (ch->master != NULL) stop_follower (ch); ch->leader = NULL; for (fch = char_list; fch != NULL; fch = fch->next) { if (fch->master == ch) stop_follower (fch); if (fch->leader == ch) fch->leader = fch; } return; } void do_order (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; CHAR_DATA *och; CHAR_DATA *och_next; bool found; bool fAll; argument = one_argument (argument, arg); if (arg[0] == '\0' || argument[0] == '\0') { send_to_char ("Order whom to do what?\n\r", ch); return; } if (IS_AFFECTED (ch, AFF_CHARM)) { send_to_char ("You feel like taking, not giving, orders.\n\r", ch); return; } if (!str_cmp (arg, "all")) { if (is_in (argument, "|quit*rem*drop*gift*claim*consent*propose*accept*vampi*ma *maj*reca*/*ha *hav*train*token*arenaagree*arena*challege*decline*k*kill*trai *auction*auc *")) { send_to_char ("You cannot make that sort of order.\n\r", ch); return; } fAll = TRUE; victim = NULL; } else { fAll = FALSE; if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (victim == ch) { send_to_char ("Aye aye, right away!\n\r", ch); return; } if (is_in (argument, "|quit*rem*drop*gift*claim*consent*propose*accept*vampi*ma *maj*reca*/*ha *hav*train*token*challenge*decline*arenaagree*kill*k*trai *auction*auc *delete*")) { send_to_char ("You cannot make that sort of order.\n\r", ch); return; } if (!IS_NPC (victim) && get_hours (victim) < 10) { stc ("Not on a newbie!\n\r", ch); return; } if ((!IS_AFFECTED (victim, AFF_CHARM) || victim->master != ch) && !(IS_CLASS (ch, CLASS_VAMPIRE) && IS_CLASS (victim, CLASS_VAMPIRE))) { send_to_char ("Do it yourself!\n\r", ch); return; } if (IS_CLASS (ch, CLASS_VAMPIRE) && IS_CLASS (victim, CLASS_VAMPIRE) && ((ch->pcdata->stats[UNI_GEN] != 2) || str_cmp (ch->clan, victim->clan))) { act ("$N ignores your order.", ch, NULL, victim, TO_CHAR); act ("You ignore $n's order.", ch, NULL, victim, TO_VICT); return; } } found = FALSE; for (och = ch->in_room->people; och != NULL; och = och_next) { och_next = och->next_in_room; if (och == ch) continue; if ((IS_AFFECTED (och, AFF_CHARM) && och->master == ch && (fAll || och == victim))) { found = TRUE; act ("$n orders you to '$t'.", ch, argument, och, TO_VICT); if (!IS_NPC(och)) och->pcdata->evilchat = ch; interpret (och, argument); } else if (!IS_NPC (ch) && !IS_NPC (och) && (fAll || och == victim) && IS_CLASS (ch, CLASS_VAMPIRE) && IS_CLASS (och, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_GEN] < och->pcdata->stats[UNI_GEN] && !str_cmp (ch->clan, och->clan)) { found = TRUE; act ("$n orders you to '$t'.", ch, argument, och, TO_VICT); if (!IS_NPC(och)) och->pcdata->evilchat = ch; interpret (och, argument); } } if (found) { send_to_char ("Ok.\n\r", ch); WAIT_STATE (ch, 12); } else send_to_char ("You have no followers here.\n\r", ch); return; } void do_group (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char hit_str[MAX_INPUT_LENGTH]; char mana_str[MAX_INPUT_LENGTH]; char move_str[MAX_INPUT_LENGTH]; char mhit_str[MAX_INPUT_LENGTH]; char mmana_str[MAX_INPUT_LENGTH]; char mmove_str[MAX_INPUT_LENGTH]; char exp_str[MAX_INPUT_LENGTH]; one_argument (argument, arg); if (IS_NPC(ch)) return; if (!IS_NPC (ch) && get_trust (ch) == LEVEL_BUILDER) { send_to_char ("Perhaps you should just stick to building?\n\r", ch); return; } if (arg[0] == '\0') { CHAR_DATA *gch; CHAR_DATA *leader; leader = (ch->leader != NULL) ? ch->leader : ch; sprintf (buf, "#C-=[#w%s's Group#C]=-#n", PERS2 (leader, ch)); cent_to_char (buf, ch); for (gch = char_list; gch != NULL; gch = gch->next) { sprintf (hit_str, "%d", gch->hit); COL_SCALE (hit_str, ch, gch->hit, gch->max_hit); sprintf (mana_str, "%1d", gch->mana); COL_SCALE (mana_str, ch, gch->mana, gch->max_mana); sprintf (move_str, "%d", gch->move); COL_SCALE (move_str, ch, gch->move, gch->max_move); sprintf (exp_str, "%lli", gch->exp); COL_SCALE (exp_str, gch, gch->exp, 1000000); sprintf (mhit_str, "%d", gch->max_hit); ADD_COLOUR (ch, mhit_str, L_CYAN); sprintf (mmana_str, "%d", gch->max_mana); ADD_COLOUR (ch, mmana_str, L_CYAN); sprintf (mmove_str, "%d", gch->max_move); ADD_COLOUR (ch, mmove_str, L_CYAN); if (is_same_group (gch, ch)) { sprintf (buf, "#C[#w%s#C]", capitalize (PERS2 (gch, ch))); cent_to_char (buf, ch); sprintf (buf, "#C[#w%s/%s #whp#C] [#w%s/%s #wmana#C] [#w%s/%s #wmove#C] [#w%s #wExp#C]", hit_str, mhit_str, mana_str, mmana_str, move_str, mmove_str, exp_str); cent_to_char (buf, ch); } } return; } if (ch->master != NULL || (ch->leader != NULL && ch->leader != ch)) { send_to_char ("But you are following someone else!\n\r", ch); return; } if( !str_cmp( argument, "disband" ) ) { CHAR_DATA *gch; int count = 0; if( ch->leader || ch->master ) { send_to_char( "You cannot disband a group if you're following someone.\n\r", ch ); return; } for( gch = char_list; gch != NULL; gch = gch->next ) { if( ( gch->master == ch || is_same_group( ch, gch ) ) && ( ch != gch ) ) { gch->leader = NULL; gch->master = NULL; count++; send_to_char( "Your group is disbanded.\n\r", gch ); } } if( count == 0 ) send_to_char( "You have no group members to disband.\n\r", ch ); else send_to_char( "You disband your group.\n\r", ch ); return; } if( !str_cmp( argument, "all" ) ) { CHAR_DATA *rch; int count = 0; for( rch = ch->in_room->people; rch; rch = rch->next_in_room ) { if( ch != rch && !IS_NPC( rch ) && can_see( ch, rch ) && rch->master == ch && !ch->master && !ch->leader && !is_same_group( rch, ch ) ) { if ( ALLOW_N00BS_TO_GROUP == FALSE ) { if ( (get_hours (rch) < N00B_NO_GROUP_HOURS ) && (get_hours (ch) >= N00B_NO_GROUP_HOURS ) ) continue; if ( (get_hours (ch) < N00B_NO_GROUP_HOURS ) && (get_hours (rch) >= N00B_NO_GROUP_HOURS) ) continue; } rch->leader = ch; count++; } } if( count == 0 ) send_to_char( "You have no eligible group members.\n\r", ch ); else { act( "$n groups $s followers.", ch, NULL, NULL, TO_ROOM ); send_to_char( "You group your followers.\n\r", ch ); } return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("Nope\n\r", ch); return; } if (!IS_NPC (ch) && get_trust (ch) == LEVEL_BUILDER) { send_to_char ("Perhaps you should just let them build?\n\r", ch); return; } if (victim->master != ch && ch != victim) { act ("$N isn't following you.", ch, NULL, victim, TO_CHAR); return; } if (is_same_group (victim, ch) && ch != victim) { victim->leader = NULL; act ("$n removes $N from $s group.", ch, NULL, victim, TO_NOTVICT); act ("$n removes you from $s group.", ch, NULL, victim, TO_VICT); act ("You remove $N from your group.", ch, NULL, victim, TO_CHAR); return; } if ( ALLOW_N00BS_TO_GROUP == FALSE ) { if ( ( get_hours (victim) < N00B_NO_GROUP_HOURS ) && (get_hours (ch) >= N00B_NO_GROUP_HOURS ) ) { send_to_char( "They are a newbie. You are not. Go kill something instead.\n\r", ch ); send_to_char( "You are a newbie, they are not. They have better things to do.\n\r", victim ); return; } if ( ( get_hours (victim) >= N00B_NO_GROUP_HOURS ) && (get_hours (ch) < N00B_NO_GROUP_HOURS ) ) { send_to_char( "They are a newbie. You are not. Go kill something instead.\n\r", victim ); send_to_char( "You are a newbie, they are not. They have better things to do.\n\r", ch ); return; } } victim->leader = ch; act ("$N joins $n's group.", ch, NULL, victim, TO_NOTVICT); act ("You join $n's group.", ch, NULL, victim, TO_VICT); act ("$N joins your group.", ch, NULL, victim, TO_CHAR); return; } /* * 'Split' originally by Gnort, God of Chaos. */ void do_split (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *gch; int members; int amount; int share; int extra; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Split how much?\n\r", ch); return; } amount = atoi (arg); if (amount < 0) { send_to_char ("Your group wouldn't like that.\n\r", ch); return; } if (amount == 0) { send_to_char ("You hand out zero coins, but no one notices.\n\r", ch); return; } if (ch->gold < amount) { send_to_char ("You don't have that much gold.\n\r", ch); return; } members = 0; for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { if (is_same_group (gch, ch)) members++; } if (members < 2) { send_to_char ("Just keep it all.\n\r", ch); return; } share = amount / members; extra = amount % members; if (share == 0) { send_to_char ("Don't even bother, cheapskate.\n\r", ch); return; } ch->gold -= amount; ch->gold += share + extra; sprintf (buf, "You split %d gold coins. Your share is %d gold coins.\n\r", amount, share + extra); send_to_char (buf, ch); sprintf (buf, "$n splits %d gold coins. Your share is %d gold coins.", amount, share); for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { if (gch != ch && is_same_group (gch, ch)) { act (buf, ch, NULL, gch, TO_VICT); gch->gold += share; } } return; } void do_gtell (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *gch; if (argument[0] == '\0') { send_to_char ("Tell your group what?\n\r", ch); return; } if (IS_SET (ch->act, PLR_SILENCE)) { sprintf (buf, "You can't gtell because you are silenced.\n\r"); send_to_char (buf, ch); return; } if (IS_SET (ch->act, PLR_NO_TELL)) { send_to_char ("Your message didn't get through!\n\r", ch); return; } /* * Note use of send_to_char, so gtell works on sleepers. */ sprintf (buf, "#r%s #wtells the group '#y%s#w'.#n\n\r", ch->name, argument); for (gch = char_list; gch != NULL; gch = gch->next) { if (is_same_group (gch, ch)) send_to_char (buf, gch); } return; } /* * It is very important that this be an equivalence relation: * (1) A ~ A * (2) if A ~ B then B ~ A * (3) if A ~ B and B ~ C, then A ~ C */ bool is_same_group (CHAR_DATA * ach, CHAR_DATA * bch) { if (ach->leader != NULL) ach = ach->leader; if (bch->leader != NULL) bch = bch->leader; return ach == bch; } void do_changelight (CHAR_DATA * ch, char *argument) { if (IS_SET (ch->in_room->room_flags, ROOM_DARK)) { REMOVE_BIT (ch->in_room->room_flags, ROOM_DARK); act ("The room is suddenly filled with light!", ch, NULL, NULL, TO_CHAR); act ("The room is suddenly filled with light!", ch, NULL, NULL, TO_ROOM); return; } SET_BIT (ch->in_room->room_flags, ROOM_DARK); act ("The lights in the room suddenly go out!", ch, NULL, NULL, TO_CHAR); act ("The lights in the room suddenly go out!", ch, NULL, NULL, TO_ROOM); return; } void open_lift (CHAR_DATA * ch) { ROOM_INDEX_DATA *location; int in_room; in_room = ch->in_room->vnum; location = get_room_index (in_room); if (is_open (ch)) return; act ("The doors open.", ch, NULL, NULL, TO_CHAR); act ("The doors open.", ch, NULL, NULL, TO_ROOM); move_door (ch); if (is_open (ch)) act ("The doors close.", ch, NULL, NULL, TO_ROOM); if (!same_floor (ch, in_room)) act ("The lift judders suddenly.", ch, NULL, NULL, TO_ROOM); if (is_open (ch)) act ("The doors open.", ch, NULL, NULL, TO_ROOM); move_door (ch); open_door (ch, FALSE); char_from_room (ch); char_to_room (ch, location); open_door (ch, TRUE); move_door (ch); open_door (ch, TRUE); thru_door (ch, in_room); char_from_room (ch); char_to_room (ch, location); return; } void close_lift (CHAR_DATA * ch) { ROOM_INDEX_DATA *location; int in_room; in_room = ch->in_room->vnum; location = get_room_index (in_room); if (!is_open (ch)) return; act ("The doors close.", ch, NULL, NULL, TO_CHAR); act ("The doors close.", ch, NULL, NULL, TO_ROOM); open_door (ch, FALSE); move_door (ch); open_door (ch, FALSE); char_from_room (ch); char_to_room (ch, location); return; } void move_lift (CHAR_DATA * ch, int to_room) { ROOM_INDEX_DATA *location; int in_room; in_room = ch->in_room->vnum; location = get_room_index (in_room); if (is_open (ch)) act ("The doors close.", ch, NULL, NULL, TO_CHAR); if (is_open (ch)) act ("The doors close.", ch, NULL, NULL, TO_ROOM); if (!same_floor (ch, to_room)) act ("The lift judders suddenly.", ch, NULL, NULL, TO_CHAR); if (!same_floor (ch, to_room)) act ("The lift judders suddenly.", ch, NULL, NULL, TO_ROOM); move_door (ch); open_door (ch, FALSE); char_from_room (ch); char_to_room (ch, location); open_door (ch, FALSE); thru_door (ch, to_room); return; } bool same_floor (CHAR_DATA * ch, int cmp_room) { OBJ_DATA *obj; OBJ_DATA *obj_next; for (obj = ch->in_room->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->item_type != ITEM_PORTAL) continue; if (obj->pIndexData->vnum == 30001) continue; if (obj->value[0] == cmp_room) return TRUE; else return FALSE; } return FALSE; } bool is_open (CHAR_DATA * ch) { OBJ_DATA *obj; OBJ_DATA *obj_next; for (obj = ch->in_room->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->item_type != ITEM_PORTAL) continue; if (obj->pIndexData->vnum == 30001) continue; if (obj->value[2] == 0) return TRUE; else return FALSE; } return FALSE; } void move_door (CHAR_DATA * ch) { OBJ_DATA *obj; OBJ_DATA *obj_next; ROOM_INDEX_DATA *pRoomIndex; for (obj = ch->in_room->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->item_type != ITEM_PORTAL) continue; if (obj->pIndexData->vnum == 30001) continue; pRoomIndex = get_room_index (obj->value[0]); char_from_room (ch); char_to_room (ch, pRoomIndex); return; } return; } void thru_door (CHAR_DATA * ch, int doorexit) { OBJ_DATA *obj; OBJ_DATA *obj_next; for (obj = ch->in_room->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->item_type != ITEM_PORTAL) continue; if (obj->pIndexData->vnum == 30001) continue; obj->value[0] = doorexit; return; } return; } void open_door (CHAR_DATA * ch, bool be_open) { OBJ_DATA *obj; OBJ_DATA *obj_next; for (obj = ch->in_room->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->item_type != ITEM_PORTAL) continue; if (obj->pIndexData->vnum == 30001) continue; if (obj->value[2] == 0 && !be_open) obj->value[2] = 3; else if (obj->value[2] == 3 && be_open) obj->value[2] = 0; return; } return; } void do_speak (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; argument = one_argument (argument, arg); if (IS_NPC (ch)) return; if (arg[0] == '\0') { if (IS_SPEAKING (ch, LANG_DARK)) send_to_char ("You are speaking the Dark tongue.\n\r", ch); else if (IS_SPEAKING (ch, DIA_OLDE)) send_to_char ("You are speaking Olde Worlde.\n\r", ch); else if (IS_SPEAKING (ch, DIA_BAD)) send_to_char ("You are speaking very badly.\n\r", ch); else send_to_char ("You are speaking the common language.\n\r", ch); strcpy (buf, "You can speak the following languages:"); strcat (buf, " Common Olde Bad"); if (CAN_SPEAK (ch, LANG_DARK)) strcat (buf, " Dark"); strcat (buf, ".\n\r"); send_to_char (buf, ch); return; } if (!str_cmp (arg, "dark")) { if (!CAN_SPEAK (ch, LANG_DARK)) { send_to_char ("You cannot speak the Dark tongue.\n\r", ch); return; } if (IS_SPEAKING (ch, LANG_DARK)) { send_to_char ("But you are already speaking the Dark tongue!\n\r", ch); return; } ch->pcdata->language[0] = LANG_DARK; send_to_char ("Ok.\n\r", ch); return; } else if (!str_cmp (arg, "common")) { if (ch->pcdata->language[0] == LANG_COMMON) { send_to_char ("But you are already speaking the common tongue!\n\r", ch); return; } ch->pcdata->language[0] = LANG_COMMON; send_to_char ("Ok.\n\r", ch); return; } else if (!str_cmp (arg, "olde")) { if (ch->pcdata->language[0] == DIA_OLDE) { send_to_char ("But you are already speaking Olde Worlde!\n\r", ch); return; } ch->pcdata->language[0] = DIA_OLDE; send_to_char ("Ok.\n\r", ch); return; } else if (!str_cmp (arg, "bad")) { if (ch->pcdata->language[0] == DIA_BAD) { send_to_char ("But you are already speaking badly!\n\r", ch); return; } ch->pcdata->language[0] = DIA_BAD; send_to_char ("Ok.\n\r", ch); return; } else { strcpy (buf, "You can speak the following languages:"); strcat (buf, " Common Olde Bad"); if (CAN_SPEAK (ch, LANG_DARK)) strcat (buf, " Dark"); strcat (buf, ".\n\r"); send_to_char (buf, ch); return; } return; } char *badlang( CHAR_DATA *ch, char *argument ) { char buf [MAX_STRING_LENGTH]; char *pName; int iSyl; int length; struct spk_type { char * old; char * new; }; static const struct spk_type spk_table[] = { { " ", " " }, { "my name is", "i calls meself"}, { "are not", "aint" }, { "have", "'av" }, { "my", "me" }, { "hello", "oy" }, { "hi ", "oy " }, { "i am", "im" }, { "it is", "tis" }, { "the ", "@" }, { " the", " da" }, { "thank", "fank" }, { "that", "dat" }, { "with", "wiv" }, { "they", "day" }, { "this", "dis" }, { "then", "den" }, { "there", "ver" }, { "their", "ver" }, { "thing", "fing" }, { "think", "fink" }, { "was", "woz" }, { "would", "wud" }, { "what ", "^" }, { "what", "wot" }, { "where", "weer" }, { "when", "wen" }, { "are", "is" }, { "you", "ya" }, { "your ", "&" }, { "your", "yer" }, { "dead", "ded" }, { "kill", "stomp" }, { "food", "nosh" }, { "blood", "blud" }, { "vampire", "sucker" }, { "kindred", "suckers" }, { "fire", "hot" }, { "dwarf", "stunty" }, { "dwarves", "stunties" }, { "goblin", "gobbo" }, { "death", "def" }, { "immune", "mune" }, { "immunit", "munit" }, { "childer", "nippers" }, { "childe", "nipper" }, { "child", "nipper" }, { "tradition", "wassname" }, { "generation", "batch" }, { "founded", "made" }, { "sired", "nipped" }, { "sire", "dad" }, { "lineage", "istory" }, { "road", "path" }, { "recognize", "dats" }, { "recognize", "dats" }, { "decapitate", "headchop" }, { "decap", "chop" }, { "recites", "sez" }, { "recite", "sez" }, { "a", "a" }, { "b", "b" }, { "c", "c" }, { "d", "d" }, { "e", "e" }, { "f", "f" }, { "g", "g" }, { "h", "h" }, { "i", "i" }, { "j", "j" }, { "k", "k" }, { "l", "l" }, { "m", "m" }, { "n", "n" }, { "o", "o" }, { "p", "p" }, { "q", "q" }, { "r", "r" }, { "s", "s" }, { "t", "t" }, { "u", "u" }, { "v", "v" }, { "w", "w" }, { "x", "x" }, { "y", "y" }, { "z", "z" }, { ",", "," }, { ".", "." }, { ";", ";" }, { ":", ":" }, { "(", "(" }, { ")", ")" }, { ")", ")" }, { "-", "-" }, { "!", "!" }, { "?", "?" }, { "1", "1" }, { "2", "2" }, { "3", "3" }, { "4", "4" }, { "5", "5" }, { "6", "6" }, { "7", "7" }, { "8", "8" }, { "9", "9" }, { "0", "0" }, { "%", "%" }, { "'", "'" }, { "#", "#" }, { "", "" } }; buf[0] = '\0'; if ( argument[0] == '\0' ) return argument; for ( pName = argument; *pName != '\0'; pName += length ) { for ( iSyl = 0; (length = strlen(spk_table[iSyl].old)) != 0; iSyl++ ) { if ( !str_prefix( spk_table[iSyl].old, pName ) ) { if (!str_cmp(spk_table[iSyl].new,",") || !str_cmp(spk_table[iSyl].new,"!") || !str_cmp(spk_table[iSyl].new,"?")) { if (strlen(buf) < MAX_INPUT_LENGTH) switch (number_range(1,20)) { default: break; case 1: strcat( buf, ", ya stupid fucker" ); break; case 2: strcat( buf, ", ya idiot" ); break; case 3: strcat( buf, ", ya damn fool" ); break; case 4: strcat( buf, ", ya fick mug" ); break; case 5: strcat( buf, ", ya fuckin' jerk" ); break; case 6: strcat( buf, ", asshole" ); break; case 7: strcat( buf, ", dickwipe" ); break; } } else if (!str_cmp(spk_table[iSyl].new,"@")) { if (strlen(buf) >= MAX_INPUT_LENGTH) strcat( buf, "da " ); else switch (number_range(1,10)) { default: strcat( buf, "da " ); break; case 1: strcat( buf, "da bloody " ); break; case 2: strcat( buf, "da fuckin' " ); break; case 3: strcat( buf, "da goddamn " ); break; case 4: strcat( buf, "da flippin' " ); break; case 5: strcat( buf, "da stupid " ); break; case 6: strcat( buf, "da stinkin' " ); break; } break; } else if (!str_cmp(spk_table[iSyl].new,"^")) { if (strlen(buf) >= MAX_INPUT_LENGTH) strcat( buf, "wot " ); else switch (number_range(1,10)) { default: strcat( buf, "wot " ); break; case 1: strcat( buf, "wot da fuck " ); break; case 2: strcat( buf, "wot, i sez, " ); break; case 3: strcat( buf, "wot da hell " ); break; case 4: strcat( buf, "wot da flip " ); break; } break; } else if (!str_cmp(spk_table[iSyl].new,"&")) { if (strlen(buf) >= MAX_INPUT_LENGTH) strcat( buf, "yer " ); else switch (number_range(1,10)) { default: strcat( buf, "yer " ); break; case 1: strcat( buf, "yer bloody " ); break; case 2: strcat( buf, "yer fuckin' " ); break; case 3: strcat( buf, "yer damn " ); break; case 4: strcat( buf, "yer flippin' " ); break; case 5: strcat( buf, "yer stupid " ); break; case 6: strcat( buf, "yer stinkin' " ); break; } break; } if (pName[0] == UPPER(pName[0])) { char uTable[MSL]; uTable[0] = '\0'; strcat(uTable, spk_table[iSyl].new); uTable[0] = UPPER(uTable[0]); strcat(buf, uTable); } else strcat( buf, spk_table[iSyl].new ); break; } } if ( length == 0 ) length = 1; } argument[0] = '\0'; strcpy(argument,buf); return argument; } char *oldelang( CHAR_DATA *ch, char *argument ) { char buf [MAX_STRING_LENGTH]; char *pName; int iSyl; int length; struct spk_type { char * old; char * new; }; static const struct spk_type spk_table[] = { { " ", " " }, { "have", "hath" }, { "hello", "hail" }, { "hi ", "hail " }, { " hi", " hail" }, { "are", "art" }, { "your", "thy" }, { "you", "thou" }, { "i think", "methinks" }, { "do ", "doth " }, { " do", " doth" }, { "it was", "twas" }, { "before", "ere" }, { "a", "a" }, { "b", "b" }, { "c", "c" }, { "d", "d" }, { "e", "e" }, { "f", "f" }, { "g", "g" }, { "h", "h" }, { "i", "i" }, { "j", "j" }, { "k", "k" }, { "l", "l" }, { "m", "m" }, { "n", "n" }, { "o", "o" }, { "p", "p" }, { "q", "q" }, { "r", "r" }, { "s", "s" }, { "t", "t" }, { "u", "u" }, { "v", "v" }, { "w", "w" }, { "x", "x" }, { "y", "y" }, { "z", "z" }, { ",", "," }, { ".", "." }, { ";", ";" }, { ":", ":" }, { "(", "(" }, { ")", ")" }, { ")", ")" }, { "-", "-" }, { "!", "!" }, { "?", "?" }, { "1", "1" }, { "2", "2" }, { "3", "3" }, { "4", "4" }, { "5", "5" }, { "6", "6" }, { "7", "7" }, { "8", "8" }, { "9", "9" }, { "0", "0" }, { "%", "%" }, { "'", "'" }, { "#", "#" }, { "", "" } }; buf[0] = '\0'; if ( argument[0] == '\0' ) return argument; for ( pName = str_dup(argument); *pName != '\0'; pName += length ) { for ( iSyl = 0; (length = strlen(spk_table[iSyl].old)) != 0; iSyl++ ) { if ( !str_prefix( spk_table[iSyl].old, pName ) ) { if (pName[0] == UPPER(pName[0])) { char uTable[MSL]; uTable[0] = '\0'; strcat(uTable, spk_table[iSyl].new); uTable[0] = UPPER(uTable[0]); strcat(buf, uTable); } else strcat( buf, spk_table[iSyl].new ); break; } } if ( length == 0 ) length = 1; } argument[0] = '\0'; strcpy(argument,buf); return argument; } char *random_letter () { char *letter; int num; num = number_range (1, 26); switch (num) { case 1: letter = "a"; break; case 2: letter = "b"; break; case 3: letter = "c"; break; case 4: letter = "d"; break; case 5: letter = "e"; break; case 6: letter = "f"; break; case 7: letter = "g"; break; case 8: letter = "h"; break; case 9: letter = "i"; break; case 10: letter = "j"; break; case 11: letter = "k"; break; case 12: letter = "l"; break; case 13: letter = "m"; break; case 14: letter = "n"; break; case 15: letter = "o"; break; case 16: letter = "p"; break; case 17: letter = "q"; break; case 18: letter = "r"; break; case 19: letter = "s"; break; case 20: letter = "t"; break; case 21: letter = "u"; break; case 22: letter = "v"; break; case 23: letter = "w"; break; case 24: letter = "x"; break; case 25: letter = "y"; break; case 26: letter = "z"; break; default: letter = "?"; break; } return letter; } char *darktongue (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_STRING_LENGTH]; int length; buf[0] = '\0'; if (argument[0] == '\0') return argument; for (argument = one_argument (argument, arg);;) { for (length = strlen (arg); length != 0; length--) strcat (buf, random_letter ()); argument = one_argument (argument, arg); if (arg[0] == '\0') break; strcat (buf, " "); } argument[0] = '\0'; strcpy (argument, buf); argument[0] = UPPER (argument[0]); return argument; } char *drunktalk (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char *pName; int iSyl; int length; int loop; struct spk_type { char *old; char *new; }; static const struct spk_type spk_table[] = { { " ", " " }, { "is", "ish" }, { "a", "a" }, { "b", "b" }, { "c", "c" }, { "d", "d" }, { "e", "e" }, { "f", "f" }, { "g", "g" }, { "h", "h" }, { "i", "i" }, { "j", "j" }, { "k", "k" }, { "l", "l" }, { "m", "m" }, { "n", "n" }, { "o", "o" }, { "p", "p" }, { "q", "q" }, { "r", "r" }, { "s", "s" }, { "t", "t" }, { "u", "u" }, { "v", "v" }, { "w", "w" }, { "x", "x" }, { "y", "y" }, { "z", "z" }, { ",", "," }, { ".", "." }, { ";", ";" }, { ":", ":" }, { "(", "(" }, { ")", ")" }, { ")", ")" }, { "-", "-" }, { "!", "!" }, { "?", "?" }, { "1", "1" }, { "2", "2" }, { "3", "3" }, { "4", "4" }, { "5", "5" }, { "6", "6" }, { "7", "7" }, { "8", "8" }, { "9", "9" }, { "0", "0" }, { "%", "%" }, { "'", "'" }, { "#", "#" }, { "", "" } }; buf[0] = '\0'; if (argument[0] == '\0') return argument; for ( pName = str_dup(argument); *pName != '\0'; pName += length ) { for ( iSyl = 0; (length = strlen(spk_table[iSyl].old)) != 0; iSyl++ ) { if ( !str_prefix( spk_table[iSyl].old, pName ) ) { if (pName[0] == UPPER(pName[0])) { char uTable[MSL]; uTable[0] = '\0'; strcat(uTable, spk_table[iSyl].new); uTable[0] = UPPER(uTable[0]); strcat(buf, uTable); } else strcat( buf, spk_table[iSyl].new ); if (number_range(1,5) == 1 && str_cmp(spk_table[iSyl].new," ")) strcat( buf, spk_table[iSyl].new ); else if (!str_cmp(spk_table[iSyl].new," ")) { if (number_range(1,5) == 1 && strlen(buf) < MAX_INPUT_LENGTH) strcat( buf, "*hic* " ); } break; } } if ( length == 0 ) length = 1; } argument[0] = '\0'; strcpy (argument, buf); argument[0] = UPPER (argument[0]); for (loop = 1; loop < strlen (argument); loop++) { if (number_range (1, 2) == 1) argument[loop] = UPPER (argument[loop]); } return argument; } char *beasttalk (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char *pName; int iSyl; int length; struct spk_type { char *old; char *new; }; static const struct spk_type spk_table[] = { { " ", " " }, { "what ", "^" }, { "your ", "&" }, { "the ", "@" }, { "my ", "$" }, { "'", "'" }, { "a", "a" }, { "b", "b" }, { "c", "c" }, { "d", "d" }, { "e", "e" }, { "f", "f" }, { "g", "g" }, { "h", "h" }, { "i", "i" }, { "j", "j" }, { "k", "k" }, { "l", "l" }, { "m", "m" }, { "n", "n" }, { "o", "o" }, { "p", "p" }, { "q", "q" }, { "r", "r" }, { "s", "s" }, { "t", "t" }, { "u", "u" }, { "v", "v" }, { "w", "w" }, { "x", "x" }, { "y", "y" }, { "z", "z" }, { ",", "," }, { ".", "." }, { ";", ";" }, { ":", ":" }, { "(", "(" }, { ")", ")" }, { ")", ")" }, { "-", "-" }, { "!", "!" }, { "?", "?" }, { "1", "1" }, { "2", "2" }, { "3", "3" }, { "4", "4" }, { "5", "5" }, { "6", "6" }, { "7", "7" }, { "8", "8" }, { "9", "9" }, { "0", "0" }, { "%", "%" }, { "'", "'" }, { "#", "#" }, { "", "" } }; buf[0] = '\0'; if (argument[0] == '\0') return argument; for (pName = argument; *pName != '\0'; pName += length) { for (iSyl = 0; (length = strlen (spk_table[iSyl].old)) != 0; iSyl++) { if (!str_prefix (spk_table[iSyl].old, pName)) { if (!str_cmp (spk_table[iSyl].new, ",") || !str_cmp (spk_table[iSyl].new, "!") || !str_cmp (spk_table[iSyl].new, "?")) { if (strlen (buf) < MAX_INPUT_LENGTH) switch (number_range (1, 20)) { default: break; case 1: strcat (buf, ", you stupid fucker"); break; case 2: strcat (buf, ", you idiot"); break; case 3: strcat (buf, ", you damn fool"); break; case 4: strcat (buf, ", you little shit"); break; case 5: strcat (buf, ", you fucking jerk"); break; case 6: strcat (buf, ", asshole"); break; case 7: strcat (buf, ", cock sucker"); break; case 8: strcat (buf, ", fuckwit"); break; } } else if (!str_cmp (spk_table[iSyl].new, "@")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "the "); else switch (number_range (1, 10)) { default: strcat (buf, "the "); break; case 1: strcat (buf, "the bloody "); break; case 2: strcat (buf, "the fucking "); break; case 3: strcat (buf, "the goddamn "); break; case 4: strcat (buf, "the stupid "); break; case 5: strcat (buf, "the stinking "); break; } break; } else if (!str_cmp (spk_table[iSyl].new, "^")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "what "); else switch (number_range (1, 5)) { default: strcat (buf, "what "); break; case 1: strcat (buf, "what the fuck "); break; case 2: strcat (buf, "what the hell "); break; } break; } else if (!str_cmp (spk_table[iSyl].new, "&")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "your "); else switch (number_range (1, 10)) { default: strcat (buf, "your "); break; case 1: strcat (buf, "your bloody "); break; case 2: strcat (buf, "your fucking "); break; case 3: strcat (buf, "your damn "); break; case 4: strcat (buf, "your goddamn "); break; case 5: strcat (buf, "your stupid "); break; case 6: strcat (buf, "your stinking "); break; } break; } else if (!str_cmp (spk_table[iSyl].new, "$")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "my "); else switch (number_range (1, 10)) { default: strcat (buf, "my "); break; case 1: strcat (buf, "my bloody "); break; case 2: strcat (buf, "my fucking "); break; case 3: strcat (buf, "my damn "); break; case 4: strcat (buf, "my goddamn "); break; case 5: strcat (buf, "my stupid "); break; case 6: strcat (buf, "my stinking "); break; } break; } if (pName[0] == UPPER(pName[0])) { char uTable[MSL]; uTable[0] = '\0'; strcat(uTable, spk_table[iSyl].new); uTable[0] = UPPER(uTable[0]); strcat(buf, uTable); } else strcat( buf, spk_table[iSyl].new ); if (!str_cmp (spk_table[iSyl].new, " ") && strlen (buf) < MAX_INPUT_LENGTH) { switch (number_range (1, 20)) { default: break; case 1: strcat (buf, "*snarl* "); break; case 2: strcat (buf, "*growl* "); break; } } break; } } if (length == 0) length = 1; } argument[0] = '\0'; strcpy (argument, buf); argument[0] = UPPER (argument[0]); return argument; } char *beastchat (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char *pName; int iSyl; int length; struct spk_type { char *old; char *new; }; static const struct spk_type spk_table[] = { { " ", " " }, { "what ", "^" }, { "your ", "&" }, { "the ", "@" }, { "my ", "$" }, { "'", "'" }, { "a", "a" }, { "b", "b" }, { "c", "c" }, { "d", "d" }, { "e", "e" }, { "f", "f" }, { "g", "g" }, { "h", "h" }, { "i", "i" }, { "j", "j" }, { "k", "k" }, { "l", "l" }, { "m", "m" }, { "n", "n" }, { "o", "o" }, { "p", "p" }, { "q", "q" }, { "r", "r" }, { "s", "s" }, { "t", "t" }, { "u", "u" }, { "v", "v" }, { "w", "w" }, { "x", "x" }, { "y", "y" }, { "z", "z" }, { ",", "," }, { ".", "." }, { ";", ";" }, { ":", ":" }, { "(", "(" }, { ")", ")" }, { ")", ")" }, { "-", "-" }, { "!", "!" }, { "?", "?" }, { "1", "1" }, { "2", "2" }, { "3", "3" }, { "4", "4" }, { "5", "5" }, { "6", "6" }, { "7", "7" }, { "8", "8" }, { "9", "9" }, { "0", "0" }, { "%", "%" }, { "'", "'" }, { "#", "#" }, { "", "" } }; buf[0] = '\0'; if (argument[0] == '\0') return argument; for (pName = argument; *pName != '\0'; pName += length) { for (iSyl = 0; (length = strlen (spk_table[iSyl].old)) != 0; iSyl++) { if (!str_prefix (spk_table[iSyl].old, pName)) { if (!str_cmp (spk_table[iSyl].new, ",") || !str_cmp (spk_table[iSyl].new, "!") || !str_cmp (spk_table[iSyl].new, "?")) { if (strlen (buf) < MAX_INPUT_LENGTH) switch (number_range (1, 20)) { default: break; case 1: strcat (buf, ", you stupid fuckers"); break; case 2: strcat (buf, ", you idiots"); break; case 3: strcat (buf, ", you sad spods"); break; case 4: strcat (buf, ", you bunch of shits"); break; case 5: strcat (buf, ", you fucking jerks"); break; case 6: strcat (buf, ", assholes"); break; case 7: strcat (buf, ", cock suckers"); break; case 8: strcat (buf, ", fuckwits"); break; } } else if (!str_cmp (spk_table[iSyl].new, "@")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "the "); else switch (number_range (1, 10)) { default: strcat (buf, "the "); break; case 1: strcat (buf, "the bloody "); break; case 2: strcat (buf, "the fucking "); break; case 3: strcat (buf, "the goddamn "); break; case 4: strcat (buf, "the stupid "); break; case 5: strcat (buf, "the stinking "); break; } break; } else if (!str_cmp (spk_table[iSyl].new, "^")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "what "); else switch (number_range (1, 5)) { default: strcat (buf, "what "); break; case 1: strcat (buf, "what the fuck "); break; case 2: strcat (buf, "what the hell "); break; } break; } else if (!str_cmp (spk_table[iSyl].new, "&")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "your "); else switch (number_range (1, 10)) { default: strcat (buf, "your "); break; case 1: strcat (buf, "your bloody "); break; case 2: strcat (buf, "your fucking "); break; case 3: strcat (buf, "your damn "); break; case 4: strcat (buf, "your goddamn "); break; case 5: strcat (buf, "your stupid "); break; case 6: strcat (buf, "your stinking "); break; } break; } else if (!str_cmp (spk_table[iSyl].new, "$")) { if (strlen (buf) >= MAX_INPUT_LENGTH) strcat (buf, "my "); else switch (number_range (1, 10)) { default: strcat (buf, "my "); break; case 1: strcat (buf, "my bloody "); break; case 2: strcat (buf, "my fucking "); break; case 3: strcat (buf, "my damn "); break; case 4: strcat (buf, "my goddamn "); break; case 5: strcat (buf, "my stupid "); break; case 6: strcat (buf, "my stinking "); break; } break; } if (pName[0] == UPPER(pName[0])) { char uTable[MSL]; uTable[0] = '\0'; strcat(uTable, spk_table[iSyl].new); uTable[0] = UPPER(uTable[0]); strcat(buf, uTable); } else strcat (buf, spk_table[iSyl].new); } } if (length == 0) length = 1; } argument[0] = '\0'; strcpy (argument, buf); argument[0] = UPPER (argument[0]); return argument; } char *socialc (CHAR_DATA * ch, char *argument, char *you, char *them) { char buf[MAX_STRING_LENGTH]; char *pName; int iSyl; int length; struct spk_type { char *old; char *new; }; static const struct spk_type spk_table[] = { {" ", " "}, {"you are", "$E is"}, {"you.", "$M."}, {"you,", "$M,"}, {"you ", "$M "}, {" you", " $M"}, {"your ", "$S "}, {" your", " $S"}, {"yours.", "theirs."}, {"yours,", "theirs,"}, {"yours ", "theirs "}, {" yours", " theirs"}, {"begins", "begin"}, {"caresses", "caress"}, {"gives", "give"}, {"glares", "glare"}, {"grins", "grin"}, {"licks", "lick"}, {"looks", "look"}, {"loves", "love"}, {"plunges", "plunge"}, {"presses", "press"}, {"pulls", "pull"}, {"runs", "run"}, {"slaps", "slap"}, {"slides", "slide"}, {"smashes", "smash"}, {"squeezes", "squeeze"}, {"stares", "stare"}, {"sticks", "stick"}, {"strokes", "stroke"}, {"tugs", "tug"}, {"thinks", "think"}, {"thrusts", "thrust"}, {"whistles", "whistle"}, {"wraps", "wrap"}, {"winks", "wink"}, {"wishes", "wish"}, {" winks", " wink"}, {" his", " your"}, {"his ", "your "}, {" her", " your"}, {"her ", "your "}, {" him", " your"}, {"him ", "your "}, {"the", "the"}, {" he", " you"}, {"he ", "you "}, {" she", " you"}, {"she ", "you "}, {"a", "a"}, {"b", "b"}, {"c", "c"}, {"d", "d"}, {"e", "e"}, {"f", "f"}, {"g", "g"}, {"h", "h"}, {"i", "i"}, {"j", "j"}, {"k", "k"}, {"l", "l"}, {"m", "m"}, {"n", "n"}, {"o", "o"}, {"p", "p"}, {"q", "q"}, {"r", "r"}, {"s", "s"}, {"t", "t"}, {"u", "u"}, {"v", "v"}, {"w", "w"}, {"x", "x"}, {"y", "y"}, {"z", "z"}, {",", ","}, {".", "."}, {";", ";"}, {":", ":"}, {"(", "("}, {")", ")"}, {")", ")"}, {"-", "-"}, {"!", "!"}, {"?", "?"}, {"1", "1"}, {"2", "2"}, {"3", "3"}, {"4", "4"}, {"5", "5"}, {"6", "6"}, {"7", "7"}, {"8", "8"}, {"9", "9"}, {"0", "0"}, {"%", "%"}, {"", ""} }; buf[0] = '\0'; if (argument[0] == '\0') return argument; for (pName = argument; *pName != '\0'; pName += length) { for (iSyl = 0; (length = strlen (spk_table[iSyl].old)) != 0; iSyl++) { if (!str_prefix (spk_table[iSyl].old, pName)) { strcat (buf, spk_table[iSyl].new); break; } } if (length == 0) length = 1; } argument[0] = '\0'; strcpy (argument, buf); argument[0] = UPPER (argument[0]); return argument; } char *socialv (CHAR_DATA * ch, char *argument, char *you, char *them) { char buf[MAX_STRING_LENGTH]; char *pName; int iSyl; int length; struct spk_type { char *old; char *new; }; static const struct spk_type spk_table[] = { {" ", " "}, {" his", " $s"}, {"his ", "$s "}, {" her", " $s"}, {"her ", "$s "}, {" him", " $m"}, {"him ", "$m "}, {" he", " $e"}, {"he ", "$e "}, {" she", " $e"}, {"she ", "$e "}, {"a", "a"}, {"b", "b"}, {"c", "c"}, {"d", "d"}, {"e", "e"}, {"f", "f"}, {"g", "g"}, {"h", "h"}, {"i", "i"}, {"j", "j"}, {"k", "k"}, {"l", "l"}, {"m", "m"}, {"n", "n"}, {"o", "o"}, {"p", "p"}, {"q", "q"}, {"r", "r"}, {"s", "s"}, {"t", "t"}, {"u", "u"}, {"v", "v"}, {"w", "w"}, {"x", "x"}, {"y", "y"}, {"z", "z"}, {",", ","}, {".", "."}, {";", ";"}, {":", ":"}, {"(", "("}, {")", ")"}, {")", ")"}, {"-", "-"}, {"!", "!"}, {"?", "?"}, {"1", "1"}, {"2", "2"}, {"3", "3"}, {"4", "4"}, {"5", "5"}, {"6", "6"}, {"7", "7"}, {"8", "8"}, {"9", "9"}, {"0", "0"}, {"%", "%"}, {"", ""} }; buf[0] = '\0'; if (argument[0] == '\0') return argument; for (pName = argument; *pName != '\0'; pName += length) { for (iSyl = 0; (length = strlen (spk_table[iSyl].old)) != 0; iSyl++) { if (!str_prefix (spk_table[iSyl].old, pName)) { strcat (buf, spk_table[iSyl].new); break; } } if (length == 0) length = 1; } argument[0] = '\0'; strcpy (argument, buf); argument[0] = UPPER (argument[0]); return argument; } char *socialn (CHAR_DATA * ch, char *argument, char *you, char *them) { char buf[MAX_STRING_LENGTH]; char *pName; int iSyl; int length; struct spk_type { char *old; char *new; }; static const struct spk_type spk_table[] = { {" ", " "}, {"you are", "$N is"}, {"you.", "$N."}, {"you,", "$N,"}, {"you ", "$N "}, {" you", " $N"}, {"your.", "$N's."}, {"your,", "$N's,"}, {"your ", "$N's "}, {" your", " $N's"}, {"yourself", "$Mself"}, {" his", " $s"}, {"his ", "$s "}, {" her", " $s"}, {"her ", "$s "}, {" him", " $m"}, {"him ", "$m "}, {" he", " $e"}, {"he ", "$e "}, {" she", " $e"}, {"she ", "$e "}, {"a", "a"}, {"b", "b"}, {"c", "c"}, {"d", "d"}, {"e", "e"}, {"f", "f"}, {"g", "g"}, {"h", "h"}, {"i", "i"}, {"j", "j"}, {"k", "k"}, {"l", "l"}, {"m", "m"}, {"n", "n"}, {"o", "o"}, {"p", "p"}, {"q", "q"}, {"r", "r"}, {"s", "s"}, {"t", "t"}, {"u", "u"}, {"v", "v"}, {"w", "w"}, {"x", "x"}, {"y", "y"}, {"z", "z"}, {",", ","}, {".", "."}, {";", ";"}, {":", ":"}, {"(", "("}, {")", ")"}, {")", ")"}, {"-", "-"}, {"!", "!"}, {"?", "?"}, {"1", "1"}, {"2", "2"}, {"3", "3"}, {"4", "4"}, {"5", "5"}, {"6", "6"}, {"7", "7"}, {"8", "8"}, {"9", "9"}, {"0", "0"}, {"%", "%"}, {"", ""} }; buf[0] = '\0'; if (argument[0] == '\0') return argument; for (pName = argument; *pName != '\0'; pName += length) { for (iSyl = 0; (length = strlen (spk_table[iSyl].old)) != 0; iSyl++) { if (!str_prefix (spk_table[iSyl].old, pName)) { strcat (buf, spk_table[iSyl].new); break; } } if (length == 0) length = 1; } argument[0] = '\0'; strcpy (argument, buf); argument[0] = UPPER (argument[0]); return argument; } //Ignore and Unignore stuff void do_ignore (CHAR_DATA * ch, char *argument) { CHAR_DATA *rch; char arg[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; int pos; bool found = FALSE; if (ch->desc == NULL) rch = ch; else rch = ch->desc->original ? ch->desc->original : ch; if (IS_NPC (rch)) return; smash_tilde (argument); argument = one_argument (argument, arg); if (arg[0] == '\0') { if (rch->pcdata->forget[0] == NULL) { send_to_char ("You are not ignoring anyone.\n\r", ch); return; } send_to_char ("You are currently ignoring:\n\r", ch); for (pos = 0; pos < MAX_FORGET; pos++) { if (rch->pcdata->forget[pos] == NULL) break; sprintf (buf, " %s\n\r", rch->pcdata->forget[pos]); send_to_char (buf, ch); } return; } for (pos = 0; pos < MAX_FORGET; pos++) { if (rch->pcdata->forget[pos] == NULL) break; if (!str_cmp (arg, rch->pcdata->forget[pos])) { send_to_char ("You have already ignored that person.\n\r", ch); return; } } for (d = first_descriptor; d != NULL; d = d->next) { CHAR_DATA *wch; if (d->connected != CON_PLAYING || !can_see (ch, d->character)) continue; wch = (d->original != NULL) ? d->original : d->character; if (!can_see (ch, wch)) continue; if (!str_cmp (arg, wch->name)) { found = TRUE; if (wch == ch) { send_to_char ("You can't ignore yourself!\n\r", ch); return; } if (wch->level >= LEVEL_IMMORTAL && !IS_CREATOR (ch)) { send_to_char ("That person is very hard to ignore.\n\r", ch); return; } } } if (!found) { send_to_char ("No one by that name is playing.\n\r", ch); return; } for (pos = 0; pos < MAX_FORGET; pos++) { if (rch->pcdata->forget[pos] == NULL) break; } if (pos >= MAX_FORGET) { send_to_char ("Sorry, you have reached the ignore limit.\n\r", ch); return; } free_string (rch->pcdata->forget[pos]); rch->pcdata->forget[pos] = str_dup (arg); sprintf (buf, "You are now ignoring %s.\n\r", arg); send_to_char (buf, ch); } void do_unignore (CHAR_DATA * ch, char *argument) { CHAR_DATA *rch; char arg[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH]; int pos; bool found = FALSE; if (ch->desc == NULL) rch = ch; else rch = ch->desc->original ? ch->desc->original : ch; if (IS_NPC (rch)) return; argument = one_argument (argument, arg); if (arg[0] == '\0') { if (rch->pcdata->forget[0] == NULL) { send_to_char ("You are not ignoring anyone.\n\r", ch); return; } send_to_char ("You are currently ignoring:\n\r", ch); for (pos = 0; pos < MAX_FORGET; pos++) { if (rch->pcdata->forget[pos] == NULL) break; sprintf (buf, " %s\n\r", rch->pcdata->forget[pos]); send_to_char (buf, ch); } return; } for (pos = 0; pos < MAX_FORGET; pos++) { if (rch->pcdata->forget[pos] == NULL) break; if (found) { rch->pcdata->forget[pos - 1] = rch->pcdata->forget[pos]; rch->pcdata->forget[pos] = NULL; continue; } if (!strcmp (arg, rch->pcdata->forget[pos])) { send_to_char ("Ignore removed.\n\r", ch); free_string (rch->pcdata->forget[pos]); rch->pcdata->forget[pos] = NULL; found = TRUE; } } if (!found) send_to_char ("No one by that name is ignored.\n\r", ch); }