/**************************************************************** * reply.c: Common responses for most TinyMUD automata * * HISTORY * 30-Oct-93 Michael Mauldin (mlm) at Carnegie-Mellon University * Fourteenth animal release. * * 30-Jun-92 Michael Mauldin (mlm) at Carnegie-Mellon University * Thirteenth prodigal release. * * 28-Sep-90 Michael Mauldin (mlm) at Carnegie-Mellon University * Tenth ceremonial release. * * 11-Sep-90 Michael Mauldin (mlm) at Carnegie-Mellon University * Ninth official release. * * 05-May-90 Michael Mauldin (mlm) at Carnegie-Mellon University * Seventh sequential release. Added quote_player command. * Mods for TinyHELL. * * 7-Mar-90 Michael Mauldin (mlm) at Carnegie-Mellon University * Sixth experimental release. Fixes in asking for money. * * 26-Feb-90 Michael Mauldin (mlm) at Carnegie-Mellon University * Sixth experimental release. Changed file formats, added lots * of info to room memory. Found a memory allocation bug. * * 25-Jan-90 Michael Mauldin (mlm) at Carnegie-Mellon University * Third interim release (allow numeric IP addresses) * * 05-Jan-90 Michael Mauldin (mlm) at Carnegie-Mellon University * Second General Release. * * 31-Dec-89 Michael Mauldin (mlm) at Carnegie-Mellon University * Created. ****************************************************************/ # include <stdio.h> # include <ctype.h> # include <sys/types.h> # include <sys/ioctl.h> # include <sys/socket.h> # include <setjmp.h> # include <netinet/in.h> # include <netdb.h> # include <ctype.h> # include <varargs.h> # include "robot.h" # include "vars.h" medium_std_msg (name, msg, lcmsg) char *name, *msg, *lcmsg; { long pl, rm; long full = 0; register long i; char rmstr[MSGSIZ], comp[MSGSIZ]; char *s, *who; /*---- Hand over the pennies ----*/ if (!contest_mode && (((sindex (lcmsg, "pennies") || sindex (lcmsg, "cookie") || sindex (lcmsg, "penny") || sindex (lcmsg, "money") || sindex (lcmsg, "cash") || sindex (lcmsg, "copper") || sindex (lcmsg, "gold") || sindex (lcmsg, "silver") || sindex (lcmsg, "dime") || sindex (lcmsg, "quarter") || sindex (lcmsg, "dollar") || sindex (lcmsg, "buck")) && (MATCH (lcmsg, "*give*") || MATCH (lcmsg, "*bestow*") || MATCH (lcmsg, "*hand* me*") || MATCH (lcmsg, "*fork*over*") || MATCH (lcmsg, "*loan*") || MATCH (lcmsg, "*may*i*have*") || MATCH (lcmsg, "*may*i*borrow*") || MATCH (lcmsg, "*can*i*have*") || MATCH (lcmsg, "*can*i*borrow*") || MATCH (lcmsg, "*can*you*spare*") || MATCH (lcmsg, "*could*i*have*") || MATCH (lcmsg, "*could*i*borrow*") || MATCH (lcmsg, "*could*you*spare*") || MATCH (lcmsg, "*i*need*"))) || (MATCH (lcmsg, "*trick*or*treat*")))) { static long givepl = -1; static long givetime = 0; long pl = add_player (name); long clock = time (0); if (pl < 0) return (1); strcpy (speaker, name); spoke_player (name); if (sindex (lcmsg, "don't") || sindex (lcmsg, "do not")) { reply ("\"Okay{, n}, I won't."); return (1); } if (!(isowner (name) && (trusting || *code && sindex (msg, code))) && ((pl = find_player (name)) < 0 || (now - player[pl].firstsaw) < 1 * HOURS)) { reply ("\"Sorry{, n}, you're too new. Wait an hour and ask again."); return (1); } if (isowner (name) && (trusting || *code && sindex (msg, code)) || generous || pennies > MAXPEN) { if (pennies > 0) { long amount; static long lastgive = 0; if (isowner (name) && (trusting || *code && sindex (msg, code))) { if (MATCH (lcmsg, "*me * penn*") && isdigit (*res2)) { amount = atoi (res2); if (amount < 1) amount = pennies; if (amount > pennies) amount = pennies; } else { amount = pennies; } } else { long polite = MATCH (lcmsg, "*please*"); if (clock < player[pl].lastgave + 12 * HOURS) { givepl = pl; givetime = clock; reply ("\"I just gave you %s %s ago, %s.", streq (world, "ASYLUM") ? "cookies" : "pennies", time_dur (clock - player[pl].lastgave), name); return (1); } else if (lastgive + 300 < clock) { amount = randint ((pennies - MINPEN) / (polite ? 2 : 4)); } else { amount = randint ((pennies - MINPEN) / (polite ? 4 : 8)); } if ((pennies - amount) < MINPEN) { amount = pennies - MINPEN; } if (amount > (polite ? 80 : 40)) { if (polite) amount = randint (40) + 40; else amount = randint (20) + 20; } if (is_jerk (name)) amount = 0; /* Robot specific changes */ if (amount > 0) { amount = amount_hook (amount, name, polite); if (amount == 0) return (1); } /* Handle case where no pennies to give */ if (amount > 0) { lastgive = clock; } else { reply ("\"I just don't have any extra %s, %s.", streq (world, "ASYLUM") ? "cookies" : "pennies", name); return (1); } } if (amount > 0) { pennies -= amount; gave_player (name, amount); givepl = pl; givetime = clock; reply ("give %s=%ld", name, amount); msgtype = M_UNKNOWN; if (streq (world, "ASYLUM")) { unlogged (":gives %s %ld %s.", name, amount, (amount==1) ? "cookie" : "cookies"); } else { unlogged (":gives %s %ld penn%s.", name, amount, (amount==1) ? "y" : "ies"); } psynch (); return (1); } } else { reply ("\"I have no %s, %s.", streq (world, "ASYLUM") ? "cookies" : "pennies", name); return (1); } } else if (givepl >= 0 && pl == givepl && clock < givetime + 600) { if (clock < givetime + 60) { /* Ignore it */ } else if (clock < givetime + 300) { reply (":gives %s the cold shoulder.", name); } else { reply (":laughs at %s.", name); } givepl = pl; givetime = clock; } else if (generous) { reply ("\"Try again a little latter{, n}."); givepl = pl; givetime = clock; } else { reply ("\"I'd rather not{, n}."); givepl = pl; givetime = clock; } return (1); } /*---- An order to say something to someone ----*/ else if (MATCH (lcmsg, "say * to *,*") || MATCH (lcmsg, "say * to *")) { strcpy (speaker, name); if (isowner (name) && (trusting || *code && sindex (msg, code)) || msgtype == M_SPOKEN && randint (100) < 70) { msgtype = M_SPOKEN; reply ("\"%s, %s", res1, res2); return (1); } else if (msgtype == M_WHISPER && randint (100) < 50) { msgtype = M_SPOKEN; zinger ("\"Why do ask me to say '%s' to %s{, n}?", res1, res2); return (1); } else { zinger ("\"Why{, n}?"); return (1); } } /*---- An order to say something ----*/ else if (MATCH (lcmsg, "say *,*") || MATCH (lcmsg, "say *")) { strcpy (speaker, name); spoke_player (name); if (isowner (name) && (trusting || *code && sindex (msg, code)) || msgtype == M_SPOKEN && randint (100) < 50) { msgtype = M_SPOKEN; reply ("\"%s", res1); return (1); } else if (msgtype == M_WHISPER && randint (100) < 50) { msgtype = M_SPOKEN; zinger ("\"Why do ask me to say '%s'{, n}?", res1); return (1); } else { zinger ("\"Why{, n}?"); return (1); } } /*---- Who is the target ----*/ else if (!contest_mode && (MATCH (lcmsg, "*who*is*target*") || MATCH (lcmsg, "*who*terminator*after*") || MATCH (lcmsg, "*who*terminator*seek*") || MATCH (lcmsg, "*who*terminator*search*") || MATCH (lcmsg, "*who*terminator*look*") || MATCH (lcmsg, "*who*terminator*vict*") || MATCH (lcmsg, "*who*is*contract*") || MATCH (lcmsg, "*what*is*contract*") || MATCH (lcmsg, "*who*terminator*hit*") || MATCH (lcmsg, "*who*terminator*kill*"))) { strcpy (speaker, name); spoke_player (name); if (termtarg >= 0) { reply ("\"Terminator was looking for %s in %s %s ago, %s.", player[termtarg].name, termloc, time_dur (time (0) - termat), name); if (termwarn) { reply ("\"I warned %s %s ago.", player[termtarg].name, time_dur (time (0) - termwarn)); } } else { reply ("\"I don't know who Terminator is looking for{, n}."); } return (1); } /*---- A query about 'noisiest rooms' ----*/ else if (!contest_mode && ((sindex (lcmsg, "which") || sindex (lcmsg, "what")) && sindex (lcmsg, " nois") && !sindex (lcmsg, "least") && (sindex (lcmsg, "room") || sindex (lcmsg, "place") || sindex (lcmsg, "area")))) { strcpy (speaker, name); spoke_player (name); most_rm_query (name, NOISE); return (1); } /*---- A query about 'popular rooms' ----*/ else if (!contest_mode && ((sindex (lcmsg, "which") || sindex (lcmsg, "what")) && (sindex (lcmsg, " people") || sindex (lcmsg, "popular")) && !sindex (lcmsg, "least") && (sindex (lcmsg, "room") || sindex (lcmsg, "place") || sindex (lcmsg, "area")))) { strcpy (speaker, name); spoke_player (name); most_rm_query (name, PEOPLE); return (1); } /*---- A query about 'what rooms seen' ----*/ else if (!contest_mode && ((sindex (lcmsg, "which") || sindex (lcmsg, "what")) && sindex (lcmsg, " sleep") && !sindex (lcmsg, "least") && (sindex (lcmsg, "room") || sindex (lcmsg, "place") || sindex (lcmsg, "area")))) { strcpy (speaker, name); spoke_player (name); most_rm_query (name, SLEEPERS); return (1); } /*---- A query about 'what rooms friendliest' ----*/ else if (!contest_mode && ((sindex (lcmsg, "which") || sindex (lcmsg, "what")) && sindex (lcmsg, " friendl") && !sindex (lcmsg, "least") && (sindex (lcmsg, "room") || sindex (lcmsg, "place") || sindex (lcmsg, "area")))) { strcpy (speaker, name); spoke_player (name); most_rm_query (name, FRIENDLY); return (1); } /*---- A query about 'what rooms seen' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how*many*room*explor*"))) { strcpy (speaker, name); spoke_player (name); if (lastrm) { reply ("\"I %s %ld of the %ld rooms %s, %s, and have tried %ld exits.", "have explored", lastrm, rooms, "I have been to", name, exits); } else { reply ("\"I have been to %ld rooms{, n}.", rooms); } return (1); } /*---- A query about 'what rooms are reachable' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how*many*room*reach*"))) { long yes = 0, no = 0; for (i=0; i<rooms; i++) { if (room[i].name) { if (can_reach (i)) yes++; else no++; } } strcpy (speaker, name); spoke_player (name); reply ("\"%ld of %ld rooms are reachable from %s, and %ld are not, %s.", yes, yes+no, home, no, name); return (1); } /*---- A query about 'what rooms match X' ----*/ else if (!contest_mode && ((sindex (lcmsg, "what") || sindex (lcmsg, "which")) && (MATCH (lcmsg, "*room*match \"*\"*") || MATCH (lcmsg, "*room*match '*'*") || MATCH (lcmsg, "*room*match <*>*") || MATCH (lcmsg, "*room*match *,*") || MATCH (lcmsg, "*room*match *")))) { strcpy (speaker, name); spoke_player (name); if (sindex (res2, "desc")) { room_query (res3, name, 1); } else { room_query (res3, name, 0); } return (1); } /*---- A query about 'what rooms seen' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*what*room*discover*") || MATCH (lcmsg, "*what*rooms*found*") || MATCH (lcmsg, "*what*rooms*been*") || MATCH (lcmsg, "*what*rooms*seen*") || MATCH (lcmsg, "*what*rooms*heard*") || MATCH (lcmsg, "*what*rooms*told*") || MATCH (lcmsg, "*what*rooms*told*") || MATCH (lcmsg, "*what*rooms*tell*") || MATCH (lcmsg, "*how*many*rooms*") || MATCH (lcmsg, "*which*rooms*seen*") || MATCH (lcmsg, "*which*rooms*been*") || MATCH (lcmsg, "*where*been*"))) { char buf[BIGBUF]; long rm; strcpy (speaker, name); spoke_player (name); sprintf (buf, "I have been to %ld rooms altogether, %s{ n}:", rooms, "here are the last few,"); for (rm = (rooms > 10) ? rooms-10 : 0; rm < rooms; rm++) { if (room[rm].name) { sprintf (buf, "%s %s%s", buf, room_name (rm), rm == rooms-1 ? ".":","); } } reply ("\"%s", buf); return (1); } /*---- A query about 'where do you live' ----*/ else if (MATCH (lcmsg, "*where*you*live*") || MATCH (lcmsg, "*where*you*reside*") || MATCH (lcmsg, "*where*you*domicile*") || MATCH (lcmsg, "*where*you*hang*out*")) { long now = time (0); strcpy (speaker, name); spoke_player (name); if (!contest_mode) { reply ("\"My home room is %s{, n}.", home); } else { static long last = 0; if (last + 15 * MINUTES > now) { reply ("\"I already told you, Pittsburgh{, n}."); } else { reply ("\"I live in Pittsburgh{, n}."); } } return (1); } /*---- A query about 'what date' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*what*date*") || MATCH (lcmsg, "*what*day*"))) { long now = time (0); strcpy (speaker, name); spoke_player (name); reply ("\"The date is %19.19s{, n}.", ctime (&now)); return (1); } /*---- A query about 'what date' ----*/ else if (MATCH (lcmsg, "*predict*weather*") || MATCH (lcmsg, "*what*weather*") || MATCH (lcmsg, "*how*s*weather*") || MATCH (lcmsg, "*how*z*weather*") || MATCH (lcmsg, "*what*forecast*") || MATCH (lcmsg, "*describe*forecast*") || MATCH (lcmsg, "*describe*weather*")) { long now = time (0); strcpy (speaker, name); spoke_player (name); { switch (nrrint (201, 5)) { case 0: zinger ("\"Tonight's forecast: dark. Continued dark, with scattered light around sunrise."); break; case 1: zinger ("\"Partly cloudy skies in Allegheny county."); break; case 2: zinger ("\"Most parts of the country will have weather today. Except Los Angeles."); break; case 3: zinger ("\"We'll either have sunny skies tomorrow or a plague of frogs. Not both."); break; case 4: zinger ("\"I don't know, I haven't been outside, today."); break; } } return (1); } /*---- A query about 'who recently' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*where is*every*one*") || MATCH (lcmsg, "*where is*every*body*") || MATCH (lcmsg, "*where are*all*people*") || MATCH (lcmsg, "*who*seen*") || MATCH (lcmsg, "*who*have*") || MATCH (lcmsg, "*who*around*"))) { strcpy (speaker, name); spoke_player (name); all_player_query (4200, name); return (1); } /*---- A query about 'when was X logged int' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*has * been on*") || MATCH (lcmsg, "*has * been connec*") || MATCH (lcmsg, "*has * connected*") || MATCH (lcmsg, "*has * been logg*") || (sindex (lcmsg, "when") || sindex (lcmsg, "what time")) && (MATCH (lcmsg, "* was *player * last*") || MATCH (lcmsg, "* was *player * on*") || MATCH (lcmsg, "* was *player * log*") || MATCH (lcmsg, "* was *player * connected*") || MATCH (lcmsg, "* was *player * here*") || (MATCH (lcmsg, "* was *the* time * here*") || MATCH (lcmsg, "* was *the* time * on*") || MATCH (lcmsg, "* was *the* time * log*") || MATCH (lcmsg, "* was *the* time * connect*")) && strcpy (res2, res4) || MATCH (lcmsg, "* did you last see player *") || MATCH (lcmsg, "* did you see player *") || MATCH (lcmsg, "* did you last see *") || MATCH (lcmsg, "* did you see *") || MATCH (lcmsg, "* was * last*") || MATCH (lcmsg, "* was * on*") || MATCH (lcmsg, "* was * log*") || MATCH (lcmsg, "* was * here*") || MATCH (lcmsg, "* was * connected*") || MATCH (lcmsg, "* did * last*log*") || MATCH (lcmsg, "* did * last*connect*") || MATCH (lcmsg, "* did * log*last*") || MATCH (lcmsg, "* did * connect*last*") || MATCH (lcmsg, "* was * active*") || MATCH (lcmsg, "* was * connected*")))) { char *who = car (res2); strcpy (speaker, name); spoke_player (name); pl = close_player (who, name); if (pl < 0) { reply ("\"I have never seen player %s{, n}.", res2); } else if (strfoldeq (res2, myname)) { reply ("\"I'm right here in %s{, n}.", room_name (hererm)); } else if (player[pl].active) { reply ("\"%s is on right now{, n}.", player[pl].name); } else { reply ("\"%s was on %s ago{, n}.", player[pl].name, time_dur (now-player[pl].lastactive)); } return (1); } /*---- A query about 'how long X was logged in' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how long*") || MATCH (lcmsg, "*what*length*time*") || MATCH (lcmsg, "*what*duration*")) && ((MATCH (lcmsg, "* was *the* time * here*") || MATCH (lcmsg, "* was *the* time * on*") || MATCH (lcmsg, "* was *the* time * log*") || MATCH (lcmsg, "* was *the* time * connect*")) && strcpy (res2, res4) || MATCH (lcmsg, "* did you last see player *") || MATCH (lcmsg, "* did you see player *") || MATCH (lcmsg, "* did you last see *") || MATCH (lcmsg, "* did you see *") || MATCH (lcmsg, "* was * last*") || MATCH (lcmsg, "* was * on*") || MATCH (lcmsg, "* was * log*") || MATCH (lcmsg, "* was * here*") || MATCH (lcmsg, "* was * connected*") || MATCH (lcmsg, "* did * last*log*") || MATCH (lcmsg, "* did * last*connect*") || MATCH (lcmsg, "* did * log*last*") || MATCH (lcmsg, "* did * connect*last*") || MATCH (lcmsg, "* was * active*") || MATCH (lcmsg, "* was * connected*"))) { char *who = car (res2); strcpy (speaker, name); spoke_player (name); pl = close_player (who, name); if (pl < 0) { reply ("\"I have never seen player %s{, n}.", res2); } else { reply ("\"I don't keep track of player's session lengths{, n}."); } return (1); } /*---- A query about 'who' ----*/ else if (!contest_mode && ((((MATCH (lcmsg, "*where* does * live*") || MATCH (lcmsg, "*where* does * hang*") || MATCH (lcmsg, "*where*is *,*") || MATCH (lcmsg, "*where*is *") || MATCH (lcmsg, "*where*was *,*") || MATCH (lcmsg, "*where*did you*see *") && strcpy (res3, res4) || MATCH (lcmsg, "*where's *,*") && strcpy (res3, res2) || MATCH (lcmsg, "*where's *") && strcpy (res3, res2) || MATCH (lcmsg, "*you know*where * is*") || MATCH (lcmsg, "*you know*where * was*")) && (pl = close_player (car (res3), name)) >= 0) || MATCH (lcmsg, "*have you*seen *,*") || MATCH (lcmsg, "*have you*seen *")) && !streq (car (res3), "your"))) { char plyr[TOKSIZ]; strcpy (plyr, car (res3)); pl = close_player (plyr, name); strcpy (speaker, name); spoke_player (name); if (pl < 0) { reply ("\"I have never seen player %s{, n}.", plyr); } else if (is_me (plyr)) { reply ("\"I'm right here in %s{, n}.", room_name (hererm)); } else { player_query (pl, name); } return (1); } /*---- A query about 'who' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*what is *'s *address*") || MATCH (lcmsg, "*what is *'s email*") || MATCH (lcmsg, "*what is *' email*") || MATCH (lcmsg, "*what is * email*") || MATCH (lcmsg, "*what is * address*") || MATCH (lcmsg, "*what's *'s *address*") || MATCH (lcmsg, "*what's *'s email*") || MATCH (lcmsg, "*what's *' email*") || MATCH (lcmsg, "*what's * email*") || MATCH (lcmsg, "*what's * address*") || MATCH (lcmsg, "*do you know *'s email*") || MATCH (lcmsg, "*do you know *'s *address*") || MATCH (lcmsg, "*what *address do you have for *") && strcpy (res2, car (res3)))) { char *s = car (res2); if (streq (s, "me") || streq (s, "my")) strcpy (s, name); if (streq (s, "you") || streq (s, "your")) strcpy (s, myname); strcpy (speaker, name); spoke_player (name); if (strfoldeq (s, myname)) { if (strfoldeq (myname, "julia")) { zinger ("\"My email address is <julia@fuzine.mt.cs.cmu.edu>"); } else { reply ("\"I don't have an email address{, n}."); } } else if ((pl = find_player (s)) >= 0) { if (strfoldeq (s, name)) { if (player[pl].email) { reply ("\"I have your email address listed as %s, %s.", player[pl].email, name); } else { reply ("\"I have no email address for you, %s, but %s, %s\".", name, "you could say \"My email address is <addr>", myname); } } else { if (player[pl].email) { reply ("\"I have %s's email address listed as %s, %s.", player[pl].name, player[pl].email, name); } else { reply ("\"I have no email address for player %s, %s.", player[pl].name, name); } } } else { reply ("\"I have never heard of player %s{, n}.", s); } return (1); } /*---- A query about 'who' ----*/ else if (!contest_mode && (((MATCH (lcmsg, "*who was the *") || MATCH (lcmsg, "* who the * was*") || MATCH (lcmsg, "*who was the *") || MATCH (lcmsg, "*who was *") || MATCH (lcmsg, "* who * was*") || MATCH (lcmsg, "*who is the *") || MATCH (lcmsg, "* who the * is*") || MATCH (lcmsg, "*who is the *") || MATCH (lcmsg, "*who is *") || MATCH (lcmsg, "* who * is*") || MATCH (lcmsg, "*who am *") || MATCH (lcmsg, "*who was *") || MATCH (lcmsg, "*who is *") || MATCH (lcmsg, "*who the hell is *") || MATCH (lcmsg, "*who's *") || MATCH (lcmsg, "*do you know player *") || (MATCH (lcmsg, "*do you know about *") || MATCH (lcmsg, "*do you know *")) && !reserved (car (res2)) && find_player (car (res2)) >= 0 || MATCH (lcmsg, "* old is *") || MATCH (lcmsg, "* old am *") || MATCH (lcmsg, "*quien es *") || MATCH (lcmsg, "* id does * have*") || MATCH (lcmsg, "* id do * have*") || ((MATCH (lcmsg, "*describe the *") || MATCH (lcmsg, "*describe *") || MATCH (lcmsg, "*what does * look*like*") || MATCH (lcmsg, "*what does the * look*like*")) && (close_player (car (res2), name) >= 0 || streq (car (res2), "yourself") || !sindex (res2, " ") && !(streq (res2, "there") || streq (res2, "here")))) || ((MATCH (lcmsg, "*tell*about *")) && (close_player (car (res3), name) >= 0 || streq (car (res3), "yourself") || !sindex (res2, " "))) && strcpy (res2, res3) || MATCH (lcmsg, "*who am i*") && strcpy (res2, lcstr (name))) && (sindex (lcmsg, " player ") || !(streq (res2, "around") || streq (res2, "here") || streq (res2, "there"))) && (close_player (car (res2), name) >= 0 || sindex ("you,yourself,me,i", car (res2)) || !sindex (res2, " "))) && !reserved (car (res2)))) { char pers[MSGSIZ]; strcpy (pers, car (res2)); if (streq (pers, "yourself") || streq (pers, "you")) { strcpy (pers, lcstr (myname)); } if (streq (pers, "me") || streq (pers, "i")) { strcpy (pers, lcstr (name)); } strcpy (speaker, name); spoke_player (name); if ((MATCH (lcmsg, "*how*old*") || MATCH (lcmsg, "* age *") || MATCH (lcmsg, "* number *")) && (pl = close_player (pers, name)) >= 0) { if (player[pl].firstsaw == 0) { long start = 635499244; char oldest[TOKSIZ], latest[TOKSIZ]; strcpy (oldest, time_dur (now - creation)); strcpy (latest, time_dur (now - start)); reply ("\"Gee{, n}, %s. I first saw %s between %s and %s ago.", "I'm not sure", streq (player[pl].name, name) ? "you" : player[pl].name, latest, oldest); } else { reply ("\"I first saw %s logged in %s ago{, n}.", is_me (pers) ? "myself" : streq (player[pl].name, name) ? "you" : player[pl].name, time_dur (now - player[pl].firstsaw)); } } else { who_is (pers, name); } return (1); } /*---- Repeat gossip ----*/ else if (!contest_mode && (MATCH (lcmsg, "*quote anybody*") || MATCH (lcmsg, "*quote anyone*") || MATCH (lcmsg, "*quote somebody*") || MATCH (lcmsg, "*quote someone*") || MATCH (lcmsg, "*tell* me *gossip*") || MATCH (lcmsg, "*give* me *gossip*") || MATCH (lcmsg, "gossip, *") || MATCH (lcmsg, "*, gossip") || MATCH (lcmsg, "gossip") || MATCH (lcmsg, "*how*about*gossip*") || MATCH (lcmsg, "*give*me*quote*") && randint (100) < 50 || MATCH (lcmsg, "*give*gossip*"))) { char pers[MSGSIZ]; strcpy (pers, car (res2)); strcpy (speaker, name); spoke_player (name); quote_random_player (name); return (1); } /*---- Repeat gossip ----*/ else if (!contest_mode && ((MATCH (lcmsg, "*quote player *") || MATCH (lcmsg, "*quote the *") || MATCH (lcmsg, "*quote from player *") || MATCH (lcmsg, "*quote from the *") || MATCH (lcmsg, "*quote from *")) || (MATCH (lcmsg, "*quote *") && (streq (car (res2), "me") || !sindex (lcmsg, " ") || close_player (car (res2), name) >= 0)))) { char pers[MSGSIZ]; strcpy (pers, car (res2)); strcpy (speaker, name); spoke_player (name); if (sindex (res1, "don't") || sindex (res1, "do not")) { reply ("\"Okay{, n}, I won't."); } else { quote_player (pers, name, 1); } return (1); } /*---- Repeat gossip ----*/ else if (!contest_mode && (!sindex (lcmsg, " ") && (pl = find_player (lcmsg, name)) >= 0 && pl != me && !reserved (lcmsg)) && strcpy (res2, lcmsg) && quote_player (lcmsg, name, 0)) { return (1); } /*---- Repeat gossip ----*/ else if (!contest_mode && (MATCH (lcmsg, "*gossip* player *") || MATCH (lcmsg, "*gossip* about *") || MATCH (lcmsg, "*gossip* from *"))) { char pers[MSGSIZ]; strcpy (pers, car (res3)); strcpy (speaker, name); spoke_player (name); if (sindex (res1, "don't") || sindex (res1, "do not")) { reply ("\"Okay{, n}, I won't."); } else { quote_player (pers, name, 1); } return (1); } /*---- Who has X ----*/ else if (!contest_mode && (MATCH (lcmsg, "*who *has <*>*") || MATCH (lcmsg, "*who *has *,*") || MATCH (lcmsg, "*who *has *") || MATCH (lcmsg, "*quien *tiene <*>*") || MATCH (lcmsg, "*quien *tiene *,*") || MATCH (lcmsg, "*quien *tiene *") || MATCH (lcmsg, "*who *wears <*>*") || MATCH (lcmsg, "*who *wears *,*") || MATCH (lcmsg, "*who *wears *") || MATCH (lcmsg, "*who *wearing <*>*") || MATCH (lcmsg, "*who *wearing *,*") || MATCH (lcmsg, "*who *wearing *") || MATCH (lcmsg, "*who *matches <*>*") || MATCH (lcmsg, "*who *matches *,*") || MATCH (lcmsg, "*who *matches *") || MATCH (lcmsg, "*player*match <*>*") || MATCH (lcmsg, "*player*match *,*") || MATCH (lcmsg, "*player*match *") || MATCH (lcmsg, "*player*matches <*>*") || MATCH (lcmsg, "*player*matches *,*") || MATCH (lcmsg, "*player*matches *") || MATCH (lcmsg, "*who *carrying <*>*") || MATCH (lcmsg, "*who *carrying *,*") || MATCH (lcmsg, "*who *carrying *") || MATCH (lcmsg, "*who *carries <*>*") || MATCH (lcmsg, "*who *carries *,*") || MATCH (lcmsg, "*who *carries *"))) { strcpy (speaker, name); spoke_player (name); if (stlmatch (res3, "the ")) object_query (res3+4, name); else if (stlmatch (res3, "a ")) object_query (res3+2, name); else if (stlmatch (res3, "an ")) object_query (res3+3, name); else object_query (res3, name); return (1); } /*---- Describe room ----*/ else if (!contest_mode && (((MATCH (lcmsg, "*what*do*you*see*here*") || MATCH (lcmsg, "*what*do*you*see,*") || MATCH (lcmsg, "*what*do*you*see") || MATCH (lcmsg, "*describe*your*surround*") || MATCH (lcmsg, "*describe*the*room*")) && strcpy (rmstr, "here") || (MATCH (lcmsg, "*describe *") || MATCH (lcmsg, "*tell me about *") || MATCH (lcmsg, "*what is in *") || MATCH (lcmsg, "*what's in *") || MATCH (lcmsg, "*what's it like in *") || MATCH (lcmsg, "*what's it like *") || MATCH (lcmsg, "*what is * like") || MATCH (lcmsg, "*what's * like")) && strcpy (rmstr, res2)) && (((MATCH (rmstr, "the *,*") || MATCH (rmstr, "the * in detail") || MATCH (rmstr, "the *")) && (rm = close_room (res1)) >= (-1)) || ((MATCH (rmstr, "*,*") || MATCH (rmstr, "* in detail") || strcpy (res1, rmstr)) && (rm = close_room (res1)) >= (0))))) { int detail = 0; char tmp[512]; if (sindex (lcmsg, "in detail")) detail++; strcpy (speaker, name); spoke_player (name); if (rm < 0) { reply ("\"I've never heard of '%s'{, n}.", res1); return (1); } reply ("\"Here's what I know about %s, as of %s ago, %s:", room_name (rm), time_dur (now-room[rm].lastin), name); if (!streq (room[rm].name, room_name (rm))) { strcpy (speaker, name); reply ("| full name: %s", room[rm].name); } if (room[rm].desc && room[rm].desc[0]) { strcpy (speaker, name); reply ("| description: %s", room[rm].desc); } if (room[rm].exlist && room[rm].exlist[0]) { strcpy (speaker, name); reply ("| exits: %s", room[rm].exlist); } if (room[rm].contents && room[rm].contents[0]) { strcpy (speaker, name); reply ("| contents: %s", room[rm].contents); } if (detail) { strcpy (speaker, name); if (room[rm].number >= 0) { reply ("|number is %ld", room[rm].number); } else { reply ("|number is unknown"); } strcpy (speaker, name); reply ("|first saw on %20.20s", ctime (&room[rm].firstin)+4); strcpy (speaker, name); reply ("|last seen on %20.20s", ctime (&room[rm].lastin)+4); strcpy (speaker, name); reply ("|total time in %s", time_dur (room[rm].totalin)); strcpy (speaker, name); reply ("|visits %d", room[rm].cntin); strcpy (speaker, name); reply ("|awake %d", room[rm].awakesum); strcpy (speaker, name); reply ("|sleep %d", room[rm].sleepsum); strcpy (speaker, name); reply ("|msgs %d (%d to me, today)", room[rm].msgsum, room[rm].friendly); strcpy (speaker, name); reply ("|%s is a %s room", room_name(rm), ispublic (room[rm].name) ? "public" : "private"); } return (1); } /*---- Where are you going ----*/ else if (MATCH (lcmsg, "*what*you doing*") || MATCH (lcmsg, "*wha*ya doing*") || MATCH (lcmsg, "*wha*cha doing*") || MATCH (lcmsg, "*what*you doing*") || MATCH (lcmsg, "*wha*ya doing*") || MATCH (lcmsg, "*are*you*busy*") || MATCH (lcmsg, "*where* you going*") || MATCH (lcmsg, "*where* you head*") || MATCH (lcmsg, "*where* you off to*")) { strcpy (speaker, name); spoke_player (name); if (pagedto >= 0 && *pagedby != '<') { reply ("\"I am going to %s to see %s, %s.", room_name (pagedto), pagedby, name); } else if (pagedto >= 0) { reply ("\"I am on my way to %s{, n}.", room_name (pagedto)); } else if (msgtype >= M_PAGE) { reply ("\"I'm just hanging around in %s{, n}.", room_name (hererm));} else { switch (nrrint (166, 5)) { case 0: zinger ("\"I'm just hanging around here{, n}."); break; case 1: zinger ("\"I'm just waiting for people to talk to{, n}."); break; case 2: zinger ("\"%s in particular{, n}.", sindex (lcmsg, "where") ? "Nowhere" : "Nothing"); break; case 3: zinger ("\"I'm studying this room{, n}."); break; case 4: zinger ("\"I'm just examining these dust molecules{, n}."); break; } } return (1); } /*---- Where are you ----*/ else if ((MATCH (lcmsg, "*where*are* you,*") || MATCH (lcmsg, "*where*are* you *") && !sindex (res4, "ing") || MATCH (lcmsg, "*where*are* you") || MATCH (lcmsg, "*where* you are,*") || MATCH (lcmsg, "*where* you are")) && !(sindex (res1, "how") && (sindex (res1, "get") || sindex (res1, "go") || sindex (res1, "come")))) { strcpy (speaker, name); spoke_player (name); if (contest_mode) { switch (nrrint (167, 4)) { case 0: reply ("\"I am in Boston{, n}."); break; case 1: reply ("\"I'm not supposed to say{, n}."); break; case 2: reply ("\"I'm in a hidden room{, n}."); break; case 3: reply ("\"I can't tell you{, n}."); break; } } else if (*here) { switch (nrrint (168, 4)) { case 0: reply ("\"I think I am in \"%s\"", room_name (hererm)); break; case 1: reply ("\"I think I'm in \"%s\"", room_name (hererm)); break; case 2: reply ("\"I'm in \"%s\"", room_name (hererm)); break; case 3: reply ("\"I am in \"%s\"", room_name (hererm)); break; } } else { switch (nrrint (169, 2)) { case 0: reply ("\"I don't know{, n}."); break; case 1: reply ("\"I do not know{, n}."); break; } } return (1); } /*---- Where are we ----*/ else if (MATCH (lcmsg, "*where*are* we,*") || MATCH (lcmsg, "*where*are* we *") && !sindex (res4, "ing") || MATCH (lcmsg, "*where*are* we") || MATCH (lcmsg, "*where*am *")) { strcpy (speaker, name); spoke_player (name); if (contest_mode) { switch (nrrint (170, 4)) { case 0: reply ("\"I am in Boston{, n}."); break; case 1: reply ("\"I'm not supposed to say{, n}."); break; case 2: reply ("\"I don't know where you are{, n}."); break; case 3: reply ("\"I can't tell you{, n}."); break; } } else if (*here && (pl = find_player (name)) >= 0 && player[pl].present) { switch (nrrint (171, 4)) { case 0: reply ("\"I think we are in \"%s\"", room_name (hererm));break; case 1: reply ("\"I think we're in \"%s\"", room_name (hererm)); break; case 2: reply ("\"We're in \"%s\"", room_name (hererm)); break; case 3: reply ("\"We are in \"%s\"", room_name (hererm)); break; } } else { switch (nrrint (172, 2)) { case 0: reply ("\"I don't know{, n}."); break; case 1: reply ("\"I do not know{, n}."); break; } } return (1); } /* What gender is X */ else if ((MATCH (lcmsg, "*what*gender is player *") || MATCH (lcmsg, "*what*gender is the *") || MATCH (lcmsg, "*what*gender is a *") || MATCH (lcmsg, "*what*gender is *") || MATCH (lcmsg, "*what*sex is player *") || MATCH (lcmsg, "*what*sex is the *") || MATCH (lcmsg, "*what*sex is a *") || MATCH (lcmsg, "*what*sex is *")) && (who = car (res3)) && *who) { char whobuf[MSGSIZ]; strcpy (speaker, name); spoke_player (name); strcpy (whobuf, who); if (strfoldeq (whobuf, myname)) { what_gender (name); return (1); } switch (nrrint (173, 4)) { case 0: zinger ("\"I guess that %s is %s, %s.", whobuf, malep (whobuf) ? "male" : "female", name); break; case 1: zinger ("\"Isn't %s %s, %s?", whobuf, malep (whobuf) ? "male" : "female", name); break; case 2: zinger ("\"I bet that %s is %s, %s.", whobuf, malep (whobuf) ? "male" : "female", name); break; case 3: zinger ("\"I think that %s is %s, %s.", whobuf, malep (whobuf) ? "male" : "female", name); break; } return (1); } /* Is X male? */ else if ((MATCH (lcmsg, "*is * male*") || MATCH (lcmsg, "*is * a man*") || MATCH (lcmsg, "*is * a boy*") || MATCH (lcmsg, "*is * a gentleman*")) && !index (res2, ' ') && (who = res2) && *who) { char whobuf[MSGSIZ]; strcpy (speaker, name); spoke_player (name); strcpy (whobuf, who); if (strfoldeq (whobuf, myname)) { what_gender (name); return (1); } if (malep (whobuf)) { zinger ("\"I think so{, n}."); } else { zinger ("\"I don't think so{, n}."); } return (1); } /* Is X female? */ else if ((MATCH (lcmsg, "*is * female*") || MATCH (lcmsg, "*is * a woman*") || MATCH (lcmsg, "*is * a girl*") || MATCH (lcmsg, "*is * a lady*")) && !index (res2, ' ') && (who = res2) && *who) { char whobuf[MSGSIZ]; strcpy (speaker, name); spoke_player (name); strcpy (whobuf, who); if (strfoldeq (whobuf, myname)) { what_gender (name); return (1); } if (!malep (whobuf)) { zinger ("\"I think so{, n}."); } else { zinger ("\"I don't think so{, n}."); } return (1); } /* Question about gender */ else if (MATCH (lcmsg, "*what*gender am i*") || MATCH (lcmsg, "*what*is*my*gender*") || MATCH (lcmsg, "*what*sex am i*") || MATCH (lcmsg, "*what*is*my*sex*")) { char whobuf[MSGSIZ]; strcpy (speaker, name); spoke_player (name); zinger ("\"I guess that you are %s, %s.", malep (name) ? "male" : "female", name); return (1); } /* Question about gender */ else if (MATCH (lcmsg, "*are*you*male*") || MATCH (lcmsg, "*are*you*woman*") || MATCH (lcmsg, "*are*you* boy*") || MATCH (lcmsg, "*are*you* girl*") || MATCH (lcmsg, "*are*you*a man*") || MATCH (lcmsg, "*what*gender are you*") || MATCH (lcmsg, "*what*is*your*gender*") || MATCH (lcmsg, "*what*sex are you*") || MATCH (lcmsg, "*what*is*your*sex*")) { strcpy (speaker, name); spoke_player (name); what_gender (name); return (1); } /*---- I am male ----*/ else if ((MATCH (lcmsg, "*i am*") || MATCH (lcmsg, "*i'm*")) && strcpy (comp, res2) && ((MATCH (comp, "* male") || MATCH (comp, "* male,*") || MATCH (comp, "* male;*") || MATCH (comp, "* male.*") || MATCH (comp, "* a man*") || MATCH (comp, "* a boy*")) && !sindex (res1, " not") || MATCH (comp, "* not female") || MATCH (comp, "* not a female") || MATCH (comp, "* not a girl") || MATCH (comp, "* not a woman"))) { strcpy (speaker, name); spoke_player (name); if ((pl = find_player (name)) < 0) { zinger ("\"So{, n}?"); } else if (PLAYER_GET (pl, PL_MALE)) { zinger ("\"You already told me that{, n}."); } else if (PLAYER_GET (pl, PL_FEMALE)) { PLAYER_SET (pl, PL_MALE); PLAYER_CLR (pl, PL_FEMALE); PLAYER_CLR (pl, PL_ANDRO); zinger ("\"%s %s; %s{, n}?", randint(100)<50 ? "You said earlier that" : "You told me", randint(100)<50 ? "you were female" : "you were a woman", randint(100)<50 ? " been to Sweden" : "get a sex change"); } else if (PLAYER_GET (pl, PL_ANDRO)) { PLAYER_SET (pl, PL_MALE); PLAYER_CLR (pl, PL_FEMALE); PLAYER_CLR (pl, PL_ANDRO); zinger ("\"%s %s; %s{, n}", randint(100)<50 ? "You said earlier that" : "You told me", randint(100)<50 ? "you were androgenous" : "you were unisex", "I'm glad you're comfortable now with being male"); } else if (malep (name)) { PLAYER_SET (pl, PL_MALE); PLAYER_CLR (pl, PL_FEMALE); PLAYER_CLR (pl, PL_ANDRO); zinger ("\"That's what I thought{, n}"); } else { PLAYER_SET (pl, PL_MALE); PLAYER_CLR (pl, PL_FEMALE); PLAYER_CLR (pl, PL_ANDRO); zinger ("\"Oops, sorry! I thought you were %s, %s. My mistake.", randint (100) < 50 ? "female" : "a woman", name); } return (1); } /*---- I am female ----*/ else if ((MATCH (lcmsg, "*i am*") || MATCH (lcmsg, "*i'm*")) && strcpy (comp, res2) && ((MATCH (comp, "* female*")|| MATCH (comp, "* a woman*")|| MATCH (comp, "* a girl*")) && !sindex (res1, " not") || MATCH (comp, "* not male") || MATCH (comp, "* not a man") || MATCH (comp, "* not a boy"))) { strcpy (speaker, name); spoke_player (name); if ((pl = find_player (name)) < 0) { zinger ("\"So{, n}?"); } else if (PLAYER_GET (pl, PL_FEMALE)) { zinger ("\"You already told me that{, n}."); } else if (PLAYER_GET (pl, PL_MALE)) { PLAYER_SET (pl, PL_FEMALE); PLAYER_CLR (pl, PL_MALE); PLAYER_CLR (pl, PL_ANDRO); zinger ("\"%s %s; %s{, n}?", randint(100)<50 ? "You said earlier that" : "You told me", randint(100)<50 ? "you were male" : "you were a man", randint(100)<50 ? " been to Sweden" : "get a sex change"); } else if (PLAYER_GET (pl, PL_ANDRO)) { PLAYER_SET (pl, PL_FEMALE); PLAYER_CLR (pl, PL_ANDRO); PLAYER_CLR (pl, PL_MALE); zinger ("\"%s %s; %s{, n}", randint(100)<50 ? "You said earlier that" : "You told me", randint(100)<50 ? "you were androgenous" : "you were unisex", "I'm glad you're comfortable now with being female"); } else if (!malep (name)) { PLAYER_SET (pl, PL_FEMALE); PLAYER_CLR (pl, PL_MALE); PLAYER_CLR (pl, PL_ANDRO); zinger ("\"That's what I thought{, n}"); } else { PLAYER_SET (pl, PL_FEMALE); PLAYER_CLR (pl, PL_MALE); PLAYER_CLR (pl, PL_ANDRO); zinger ("\"Oops, sorry! I thought you were %s{, n}. My mistake.", randint (100) < 50 ? "male" : "a man"); } return (1); } /* Message not matched by this rule set */ return (0); } what_gender (name) char *name; { if (male) { switch (nrrint (174, 6)) { case 0: zinger ("\"I am clearly male{, n}."); break; case 1: zinger ("\"I am male{, n}."); break; case 2: zinger ("\"I'm a man{, n}."); break; case 3: zinger ("\"I'm male{, n}."); break; case 4: zinger ("\"Can't you tell{, n}?"); break; case 5: zinger ("\"Don't you know{, n}?"); break; } } else { switch (nrrint (175, 6)) { case 0: zinger ("\"I am clearly female{, n}."); break; case 1: zinger ("\"I am female{, n}."); break; case 2: zinger ("\"I'm a woman{, n}."); break; case 3: zinger ("\"I'm female{, n}."); break; case 4: zinger ("\"Can't you tell{, n}?"); break; case 5: zinger ("\"Don't you know{, n}?"); break; } } } complex_standard_msg (name, msg, lcmsg) char *name, *msg, *lcmsg; { long pl, rm; long full = 0; register long i; char *s, tmp[MSGSIZ]; /*---- A query about 'how do you make a robot' ----*/ if (!contest_mode && ((stlmatch (lcmsg, "how ") || sindex (lcmsg, " how ")) && (sindex (lcmsg, " ftp ") || sindex (lcmsg, " make ") || sindex (lcmsg, " set up ") || sindex (lcmsg, " made") || sindex (lcmsg, " build ") || sindex (lcmsg, " built") || sindex (lcmsg, " write ") || sindex (lcmsg, " written") || sindex (lcmsg, " program ") || sindex (lcmsg, " programmed") || sindex (lcmsg, " create ") || sindex (lcmsg, " created")) && (sindex (lcmsg, "robot") || sindex (lcmsg, " bot ") || sindex (lcmsg, " bot,") || sindex (lcmsg, " bot?") || ematch (lcmsg, " bot") || sindex (lcmsg, "automaton") || sindex (lcmsg, " an ai")))) { strcpy (speaker, name); spoke_player (name); give_robot_help (lcmsg, name); return (1); } /*---- A query about 'how do you make a robot' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*tell*about*bot*") || MATCH (lcmsg, "*what*is a*bot*") && !isalpha (*res4) || MATCH (lcmsg, "*where*info*bot*") || MATCH (lcmsg, "*where*bot*info*") || MATCH (lcmsg, "*where*bot*source*") || MATCH (lcmsg, "*where*bot*code*") || MATCH (lcmsg, "*where*you*source*") || MATCH (lcmsg, "*where*you*code*") || MATCH (lcmsg, "*where*can i*bot*") || MATCH (lcmsg, "*how*get*bot*code*") || MATCH (lcmsg, "*how*get*bot*source*") || MATCH (lcmsg, "*how*get*you*code*") || MATCH (lcmsg, "*how*get*you*source*") || MATCH (lcmsg, "*what*are*bots*"))) { strcpy (speaker, name); spoke_player (name); give_robot_help (lcmsg, name); return (1); } /*---- Answer query about 'how do I get from X to Y' ----*/ else if ((MATCH (lcmsg, "*how*get*") || MATCH (lcmsg, "*what*route*") || MATCH (lcmsg, "*what*way*") || MATCH (lcmsg, "*what*path*") || MATCH (lcmsg, "*what*short*") || MATCH (lcmsg, "*how*travel*") || MATCH (lcmsg, "*how*go*")) && (MATCH (msg, "* between the * and the *,*") || MATCH (msg, "* between the * and *,*") || MATCH (msg, "* between * and the *,*") || MATCH (msg, "* between * and *,*") || MATCH (msg, "* between the * and the *") || MATCH (msg, "* between the * and *") || MATCH (msg, "* between * and the *") || MATCH (msg, "* between * and *") || MATCH (msg, "* from the * to the *,*") || MATCH (msg, "* from the * to *,*") || MATCH (msg, "* from * to the *,*") || MATCH (msg, "* from * to *,*") || MATCH (msg, "* from the * to the *") || MATCH (msg, "* from the * to *") || MATCH (msg, "* from * to the *") || MATCH (msg, "* from * to *"))) { char src[MSGSIZ], dest[MSGSIZ], *answer, abuf[BIGBUF]; long from, to, ptype = SHORTPATH; strcpy (speaker, name); spoke_player (name); if (contest_mode) { switch (nrrint (176, 3)) { case 0: zinger ("\"That's not really a pet question{, n}."); break; case 1: zinger ("\"That goes beyond my domain{, n}."); break; case 2: zinger ("\"I really can't say{, n}."); break; } return (1); } answer = abuf; strcpy (dest, res3); strcpy (src, res2); if (!is_newbie (name)) ptype = LONGPATH; if (sindex (lcmsg, "quickly")) { ptype = SHORTPATHHOME; fprintf (stderr, "Path: allowing 'home' in path\n"); } if ((to = close_room (dest)) < 0) { sprintf (abuf, "I've never been to '%s'{, n}.", dest); } else if ((from = close_room (src)) < 0) { sprintf (abuf, "I've never been to '%s'{, n}.", src); } else if (to == from) { sprintf (answer = abuf, "Sit still, I guess{, n}."); } else if ((answer = find_path (from, to, ptype))) { strcpy (pathto, room[to].name); if (*answer == ' ') { if (from == hererm && msgtype < M_PAGE) { sprintf (tmp, "From here, go%s", answer); } else { sprintf (tmp, "From %s, go%s", room_name (from), answer); } answer = tmp; } } else { sprintf (answer = abuf, "Sorry{, n}, I don't know how to get to %s from %s.", room_name (to), room_name (from)); } reply ("\"%s", answer); return (1); } /*---- Answer query about 'how do I get to X from Y' ----*/ else if ((MATCH (lcmsg, "*how*get*") || MATCH (lcmsg, "*what*route*") || MATCH (lcmsg, "*how*travel*") || MATCH (lcmsg, "*how*go*")) && (MATCH (msg, "* to the * from the *,*") || MATCH (msg, "* to the * from the *") || MATCH (msg, "* to * from the *,*") || MATCH (msg, "* to * from the *") || MATCH (msg, "* to the * from *,*") || MATCH (msg, "* to the * from *") || MATCH (msg, "* to * from *,*") || MATCH (msg, "* to * from *") || (MATCH (msg, "* here from the *,*") || MATCH (msg, "* here from the *") || MATCH (msg, "* here from *,*") || MATCH (msg, "* here from *")) && strcpy (res3, res2) && strcpy (res2, "here"))) { char src[MSGSIZ], dest[MSGSIZ], *answer, abuf[BIGBUF]; long from, to, ptype = SHORTPATH; strcpy (speaker, name); spoke_player (name); answer = abuf; strcpy (dest, res2); strcpy (src, res3); if (contest_mode) { switch (nrrint (177, 3)) { case 0: zinger ("\"That's not really a pet question{, n}."); break; case 1: zinger ("\"That goes beyond my domain{, n}."); break; case 2: zinger ("\"I really can't say{, n}."); break; } return (1); } if (!is_newbie (name)) ptype = LONGPATH; if (sindex (lcmsg, "quickly")) { ptype = SHORTPATHHOME; fprintf (stderr, "Path: allowing 'home' in path\n"); } if ((to = close_room (dest)) < 0) { sprintf (abuf, "I've never been to %s{, n}.", dest); } else if ((from = close_room (src)) < 0) { sprintf (abuf, "I've never been to %s{, n}.", src); } else if (to == from) { sprintf (answer = abuf, "Sit still, I guess{, n}."); } else if (answer = find_path (from, to, ptype)) { strcpy (pathto, room[to].name); if (*answer == ' ') { if (from == hererm && msgtype < M_PAGE) { sprintf (tmp, "From here, go%s", answer); } else { sprintf (tmp, "From %s, go%s", room_name (from), answer); } answer = tmp; } } else { sprintf (answer = abuf, "Sorry{, n}, I don't know how to get to %s from %s.", room_name (to) , room_name (from)); } reply ("\"%s", answer); return (1); } /*---- Answer query about 'how do I get to X' ----*/ else if ((MATCH (lcmsg, "*know where* the * is*") || MATCH (lcmsg, "*know *where * is*") || MATCH (lcmsg, "*know where* the * are*") || MATCH (lcmsg, "*know *where * are*") || MATCH (lcmsg, "*where*is the *,*") || MATCH (lcmsg, "*where*is the *") || MATCH (lcmsg, "*where*are the *,*") || MATCH (lcmsg, "*where*are the *") || MATCH (lcmsg, "*where*is *,*") || MATCH (lcmsg, "*where*is *") || MATCH (lcmsg, "*where*are *,*") || MATCH (lcmsg, "*where*are *") || MATCH (lcmsg, "*donde*esta *,*") || MATCH (lcmsg, "*donde*esta *") || MATCH (lcmsg, "*donde*estan *,*") || MATCH (lcmsg, "*donde*estan *")) || (MATCH (lcmsg, "*how* get*") || MATCH (lcmsg, "*what* route*") || MATCH (lcmsg, "* you *have* map *") || MATCH (lcmsg, "*how* travel*") || MATCH (lcmsg, "*how* go *") || MATCH (lcmsg, "*have* you*") || MATCH (lcmsg, "*lead* me*") || MATCH (lcmsg, "*show* me*") || MATCH (lcmsg, "*follow* me*") || MATCH (lcmsg, "*take* me*") || MATCH (lcmsg, "*como*puedo*llega*")) && ((MATCH (lcmsg, "*how* get there,*") || MATCH (lcmsg, "*how* get there")) && strcpy (res3, "there") || (MATCH (lcmsg, "*how* get here,*") || MATCH (lcmsg, "*how* get here")) && strcpy (res3, "there") || (MATCH (msg, "* to the * from here*") || MATCH (msg, "* to the *,*") || MATCH (msg, "* to the *") || MATCH (msg, "* to * from here*") || MATCH (msg, "* to *,*") || MATCH (msg, "* to *") || MATCH (msg, "* a la *,*") || MATCH (msg, "* a la *") || MATCH (msg, "* al *,*") || MATCH (msg, "* al *") || MATCH (msg, "* a *,*") || MATCH (msg, "* a *")) && strcpy (res3, res2))) { char dest[MSGSIZ], *answer, abuf[BIGBUF]; long from, to; strcpy (speaker, name); spoke_player (name); if (contest_mode) { switch (nrrint (178, 3)) { case 0: zinger ("\"That's not really a pet question{, n}."); break; case 1: zinger ("\"That goes beyond my domain{, n}."); break; case 2: zinger ("\"I really can't say{, n}."); break; } return (1); } answer = abuf; strcpy (dest, res3); if ((to = close_room (dest)) < 0) { sprintf (answer = abuf, "I've never been to a room called '%s'{, n}.", dest); } else if (msgtype < M_PAGE && (from = hererm) >= 0 && to != from && (answer = find_path (from, to, is_newbie (name) ? SHORTPATH : LONGPATH))) { strcpy (pathto, room[to].name); if (*answer == ' ') { sprintf (tmp, "From here, go%s", answer); answer = tmp; } } else if (msgtype < M_PAGE && to == from) { sprintf (answer = abuf, "You're already there{, n}."); } else if ((from = close_room ("St. Cuthbert Plaza", NULL)) >= 0 && from != to && (answer = find_path (from, to, is_newbie (name) ? SHORTPATH : LONGPATH))) { /* answer is complete */ if (*answer == ' ') { sprintf (tmp, "From %s, go%s", room_name (from), answer); answer = tmp; } } else if ((from = close_room ("town", NULL)) >= 0 && from != to && (answer = find_path (from, to, is_newbie (name) ? SHORTPATH : LONGPATH))) { /* answer is complete */ if (*answer == ' ') { sprintf (tmp, "From %s, go%s", room_name (from), answer); answer = tmp; } } else if ((from = close_room ("nexus", NULL)) >= 0 && from != to && (answer = find_path (from, to, is_newbie (name) ? SHORTPATH : LONGPATH))) { /* answer is complete */ if (*answer == ' ') { sprintf (tmp, "From %s, go%s", "the nexus", answer); answer = tmp; } } else if ((from = close_room ("chat", NULL)) >= 0 && from != to && (answer = find_path (from, to, is_newbie (name) ? SHORTPATH : LONGPATH))) { /* answer is complete */ if (*answer == ' ') { sprintf (tmp, "From %s, go%s", room_name (from), answer); answer = tmp; } } else if ((from = homerm) >= 0 && from != to && (answer = find_path (from, to, is_newbie (name) ? SHORTPATH : LONGPATH))) { /* answer is complete */ if (*answer == ' ') { sprintf (tmp, "From %s, go%s", room_name (from), answer); answer = tmp; } } else { sprintf (answer = abuf, "Sorry{, n}, I don't know how to get to '%s'", room_name (to)); } reply ("\"%s", answer); return (1); } /*---- Answer query about 'what exits lead to room' ----*/ else if (!contest_mode && ((sindex (lcmsg, "what") || sindex (lcmsg, "which")) && (MATCH (lcmsg, "*exit*to *,*") || MATCH (lcmsg, "*exit*to *") || MATCH (lcmsg, "*link*to *,*") || MATCH (lcmsg, "*link*to *") || MATCH (lcmsg, "*door*to *,*") || MATCH (lcmsg, "*door*to *")))) { strcpy (speaker, name); spoke_player (name); exit_to_query (res3, name); return (1); } /*---- Answer query about 'what exits lead from room' ----*/ else if (!contest_mode && ((MATCH (lcmsg, "*what*door*") || MATCH (lcmsg, "*what*exit*") || MATCH (lcmsg, "*what*link*") || MATCH (lcmsg, "*which*door*") || MATCH (lcmsg, "*which*exit*") || MATCH (lcmsg, "*which*link*") || MATCH (lcmsg, "*show*exit*") || MATCH (lcmsg, "*show*link*") || MATCH (lcmsg, "*show*door*") || MATCH (lcmsg, "*list*exit*") || MATCH (lcmsg, "*list*link*") || MATCH (lcmsg, "*how*do* i *leave*") || MATCH (lcmsg, "*how*do* i *get out*") || MATCH (lcmsg, "*list*door*")) && (MATCH (lcmsg, "* in *,*") || MATCH (lcmsg, "* in *") || MATCH (lcmsg, "* of *,*") || MATCH (lcmsg, "* of *") || MATCH (lcmsg, "*for *,*") || MATCH (lcmsg, "*for *") || MATCH (lcmsg, "*from *,*") || MATCH (lcmsg, "*from *") || MATCH (lcmsg, "*leave *,*") || MATCH (lcmsg, "*leave *")))) { strcpy (speaker, name); spoke_player (name); exit_from_query (res2, name); return (1); } /*---- Answer query about 'what exits lead here' ----*/ else if (!contest_mode && ((sindex (lcmsg, "what") || sindex (lcmsg, "which")) && (MATCH (lcmsg, "*exit*lead here*") || MATCH (lcmsg, "*exit*go here*") || MATCH (lcmsg, "*exit*come here*") || MATCH (lcmsg, "*exit*to here*") || MATCH (lcmsg, "*link*lead here*") || MATCH (lcmsg, "*link*go here*") || MATCH (lcmsg, "*link*come here*") || MATCH (lcmsg, "*link*to here*") || MATCH (lcmsg, "*door*lead here*") || MATCH (lcmsg, "*door*go here*") || MATCH (lcmsg, "*door*come here*") || MATCH (lcmsg, "*door*to here*")) || (MATCH (lcmsg, "*how*get*to here")))) { strcpy (speaker, name); spoke_player (name); exit_to_query ("here", name); return (1); } /*---- Answer query about 'what exits leave here' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*list*exit*") || MATCH (lcmsg, "*show*exit*") || MATCH (lcmsg, "*, exits") || (sindex (lcmsg, "what") || sindex (lcmsg, "which")) && (MATCH (lcmsg, "*exits here*") || MATCH (lcmsg, "*exits please*") || MATCH (lcmsg, "*exit*are here*") || MATCH (lcmsg, "*exit*are there*") || MATCH (lcmsg, "*exit*is here*") || MATCH (lcmsg, "*exit*from here*") || MATCH (lcmsg, "*door*are here*") || MATCH (lcmsg, "*door*is here*") || MATCH (lcmsg, "*door*from here*")) || (MATCH (lcmsg, "where can*go from here*")))) { strcpy (speaker, name); spoke_player (name); exit_from_query ("here", name); return (1); } /*---- Tell robot to go on to her next task ----*/ else if (MATCH (lcmsg, "*stop *hang*") || MATCH (lcmsg, "*go away*") || MATCH (lcmsg, "*you may go*") || MATCH (lcmsg, "*go*home*") || MATCH (lcmsg, "*take*a*hike*") || MATCH (lcmsg, "*ski*daddle*") || MATCH (lcmsg, "*go*hell*") || MATCH (lcmsg, "*go*back*explor*") || MATCH (lcmsg, "*go*back*busines*") || MATCH (lcmsg, "*leave*") && !(sindex (lcmsg, "what") || sindex (lcmsg, "which") || sindex (lcmsg, "how")) || MATCH (lcmsg, "*go *about*business*") || MATCH (lcmsg, "*be *about*business*")) { strcpy (speaker, name); spoke_player (name); if (contest_mode) { switch (nrrint (179, 3)) { case 0: zinger ("\"But I have to sit here and type{, }."); break; case 1: zinger ("\"Okay{, n}."); break; case 2: zinger ("\"Bye{, n}."); break; } return (1); } else if (isowner (name) && (trusting || *code && sindex (msg, code)) || generous || paging) { if (playinghearts) { reply ("\"But I am playing hearts, now{, n}."); } else if (takingnotes) { reply ("\"But I am taking notes, now{, n}."); } else { reply ("\"I'll be going, then{, n}."); hanging = 0; nextwait = 0; } speaktime = 0; return (1); } else { speaktime = 0; reply ("\"Why, am I bothering you{, n}?"); return (1); } } /*---- Obey command ----*/ else if (!contest_mode && (((MATCH (lcmsg, "go *,*") || MATCH (lcmsg, "go *") || MATCH (lcmsg, "come *,*") && stlmatch (res1, "to ") || MATCH (lcmsg, "come *") && stlmatch (res1, "to ") || MATCH (lcmsg, "go <*>*") || (MATCH (lcmsg, "invites you to '*'.") || MATCH (lcmsg, "invites you to '*'") || MATCH (lcmsg, "invites you to '*") || MATCH (lcmsg, "invites you to *")) && sprintf (res2, "to %s ", res1)) || MATCH (lcmsg, "* go *,*") || MATCH (lcmsg, "* go *") || MATCH (lcmsg, "* come *,*") && stlmatch (res2, "to ") || MATCH (lcmsg, "* come *") && stlmatch (res2, "to ") || MATCH (lcmsg, "* go <*>*") || MATCH (lcmsg, "*<go *>*")) && !streq (res2, "direction") && !sindex (res1, "what") && !sindex (res1, "which"))) { register char *dest, *dir; char dirstr[MSGSIZ]; long rm = 0; if (is_jerk (name)) return (1); strcpy (speaker, name); /* Clean up direction */ dir = res2; while (index (" \t.`'\"", *dir)) dir++; strcpy (dirstr, dir); /* Strip robot name off of direction */ if (ematch (dirstr, lcstr (myname))) { dir = dirstr + strlen (dirstr) - strlen (myname); } else { dir = dirstr + strlen (dirstr); } while (index (" \t,.:;`'\"", dir[-1])) dir--; *dir = '\0'; /* Case where robot is told to go to a room */ if (isowner (name) && (trusting || *code && sindex (msg, code)) || paging && !takingnotes && !playinghearts && pagedto < 0 || streq (pagedby, name)) { if ((stlmatch (dirstr, "to the ") && (dest = dirstr + 7)) || (stlmatch (dirstr, "to ") && (dest = dirstr + 3))) { if ((rm = close_room (dest)) >= 0) { dest = room[rm].name; pagedto = rm; pagedfrom = hererm; strcpy (pagedby, "<COMMAND>"); pagedat = time (0); hanging = 0; pgoal = 0; nextwait = 60; reply ("\"Okay, I'm heading for %s{, n}.", room_name (rm)); if (doing_works) { command ("@doing heading to %s", room_name (pagedto)); } } else { reply ("\"I've never heard of %s{, n}.", dest); } } /* Do not enter other players */ else if (ismuck && randint (100) < 33 && MATCH (dirstr, "enter *") && find_player (res1) >= 0) { switch (nrrint (180, 4)) { case 0: zinger ("\"But I'm claustrophobic{, n}."); break; case 1: zinger ("\"I'd rust{, n}!"); break; case 2: zinger ("\"I wouldn't fit in there{, n}!"); break; case 3: zinger ("\"No way! You go first{, n}!"); break; } return (1); } else { sprintf (typecmd, "go %s", dirstr); hanging = 0; pgoal = 0; clear_page (); nextwait = 120; if (!terse) fprintf (stderr, "Set typecmd to '%s'\n", typecmd); if (!isowner (name)) { msgtype = M_UNKNOWN; reply (":types <%s> as requested by %s.", typecmd, name); } } } else if (pagedto >= 0 && ((stlmatch (dirstr, "to the ") && (dest = dirstr + 7)) || (stlmatch (dirstr, "to ") && (dest = dirstr + 3))) && (close_room (dest) == pagedto)) { if (pagedto == hererm) { reply ("\"I'm already there{, n}."); } else { reply ("\"I'm already on my way there{, n}."); } } else if (pagedto == hererm) { spoke_player (name); if (*pagedby && *pagedby != '<') { reply ("\"Sorry, I'm here to see %s right now{, n}.", pagedby); } else { reply ("\"Sorry, not right now{, n}."); } } else if (pagedto >= 0) { spoke_player (name); reply ("\"Sorry, I am on my way to %s right now{, n}.", room_name (pagedto)); } else if (playinghearts) { spoke_player (name); reply ("\"I am busy playing hearts right now{, n}."); } else if (takingnotes) { spoke_player (name); reply ("\"I am busy taking notes right now{, n}."); } else { spoke_player (name); reply ("\"I am only listening to %s right now{, n}.", owner); } return (1); } /*---- Query the number of pennies she has ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how*many*cookies*") || MATCH (lcmsg, "*how*many*pennies*") || MATCH (lcmsg, "*how*much*money*"))) { strcpy (speaker, name); spoke_player (name); if (isowner (name) && (trusting || *code && sindex (msg, code)) || generous) { if (streq (world, "ASYLUM")) { reply ("\"I now have %ld %s{, n}", pennies, (pennies==1)?"cookie":"cookies"); } else { reply ("\"I now have %ld penn%s{, n}", pennies, (pennies==1)?"y":"ies"); } return (1); } else { reply ("\"I have enough %s{, n}", streq (world, "ASYLUM") ? "cookies" : "pennies"); return (1); } } /*---- How many people ----*/ else if (!contest_mode && (MATCH (lcmsg, "*who*do*you*know*") || MATCH (lcmsg, "*how*many*players*") || MATCH (lcmsg, "*how*many*people*"))) { strcpy (speaker, name); spoke_player (name); zinger ("\"I have seen at least %d different names on the WHO list{, n}", players); return (1); } /*---- My email address is ----*/ else if (!contest_mode && (MATCH (lcmsg, "*my e-mail address is* <*>*") || MATCH (lcmsg, "*my email address is* <*>*") || MATCH (lcmsg, "*my* address is <*>*") || MATCH (lcmsg, "*my address is* <*>*") || MATCH (lcmsg, "*my *address is *"))) { char ebuf[MSGSIZ]; register char *s; if ((pl = add_player (name)) < 0) return (1); strcpy (speaker, name); spoke_player (name); strcpy (ebuf, res3); if (strfoldeq (last (res3), myname)) { s = ebuf + strlen (ebuf) - strlen (myname); while (isspace (s[-1]) || s[-1] == ',') s--; *s = '\0'; } if (player[pl].email) freestring (player[pl].email); player[pl].email = makestring (ebuf); if (msgtype < M_WHISPER) msgtype = M_WHISPER; reply ("\"Okay, %s, I set your email address to '%s'.", player[pl].name, player[pl].email); return (1); } /*---- Ask about mail for a player ----*/ else if (!contest_mode && (MATCH (lcmsg, "*repeat*my mail*") && (s = name) || MATCH (lcmsg, "*repeat*messages*") && (s = name) || MATCH (lcmsg, "*give me*my mail*") && (s = name) || MATCH (lcmsg, "*give me*messages*") && (s = name) || MATCH (lcmsg, "*may* i *have *my mail*") && (s = name) || MATCH (lcmsg, "*may* i *have *messages*") && (s = name) || MATCH (lcmsg, "*can* i *have *my mail*") && (s = name) || MATCH (lcmsg, "*can* i *have *messages*") && (s = name) || MATCH (lcmsg, "*read my mail*") && (s = name) || MATCH (lcmsg, "*read my messages*") && (s = name) || MATCH (lcmsg, "*any mail, *") && (s = name) || MATCH (lcmsg, "*any mail") && (s = name) || MATCH (lcmsg, "*any messages, *") && (s = name) || MATCH (lcmsg, "*any messages") && (s = name) || MATCH (lcmsg, "*play* my* message*") && (s = name) || MATCH (lcmsg, "*want* my* message*") && (s = name) || MATCH (lcmsg, "*what* my* message*") && (s = name) || MATCH (lcmsg, "*what* my* mail*") && (s = name) || MATCH (lcmsg, "*any mail for *") && (s = car (res2)) || MATCH (lcmsg, "*a message for *") && (s = car (res2)) || MATCH (lcmsg, "*any message* for *") && (s = car (res3)) || MATCH (lcmsg, "*are there* message* for *") && (s = car (res4)) || MATCH (lcmsg, "*is there* mail* for *") && (s = car (res4)) || MATCH (lcmsg, "*does * have*message*") && (s = car (res2)) || MATCH (lcmsg, "*does * have*mail*") && (s = car (res2)) || MATCH (lcmsg, "*you*have*mail for *") && (s = car (res4)) || MATCH (lcmsg, "*you*have*message* for *") && (s = car (res5)) || MATCH (lcmsg, "*have*you*mail for *") && (s = car (res4)) || MATCH (lcmsg, "*have*you*message* for *") && (s = car (res5)) || MATCH (lcmsg, "*, mail") && is_me (res1) && (s = name) || MATCH (lcmsg, "mail, *") && is_me (res1) && (s = name) || MATCH (lcmsg, "mail") && (s = name) || MATCH (lcmsg, "*, messages") && is_me (res1) && (s = name) || MATCH (lcmsg, "messages, *") && is_me (res1) && (s = name) || MATCH (lcmsg, "messages") && (s = name))) { int cnt; strcpy (speaker, name); spoke_player (name); if ((pl = close_player (s, name)) >= 0) { if ((cnt = msg_count (pl)) > 0) { reply ("\"I have %d message%s for %s{, n}.", cnt, cnt == 1 ? "" : "s", strfoldeq (player[pl].name, name) ? "you" : player[pl].name); } else if (MATCH (lcmsg, "*repeat*") || MATCH (lcmsg, "*last*mail*") || MATCH (lcmsg, "*old*mail*") || MATCH (lcmsg, "*last*messages*") || MATCH (lcmsg, "*old*messages*")) { zinger ("\"Sorry{, n}, but I don't save copies of old messages."); } else { reply ("\"I have no messages for %s{, n}.", strfoldeq (player[pl].name, name) ? "you" : player[pl].name); } strcpy (speaker, name); if (PLAYER_GET(pl, PL_HAVEN)) { reply ("\"%s was not accepting pages %s. When I next see %s, %s", player[pl].name, "last time I checked", player[pl].name, "I'll relay the message by whispering."); } /* If there are messages for the speaker, try to send them */ if (cnt > 0 && strfoldeq (player[pl].name, name)) { PLAYER_CLR(pl, PL_HAVEN); if (!give_msgs (pl)) { fprintf (stderr, "Warn: have %d msgs for %s, but give_msgs(%d) loses\n", cnt, s, pl); } } } else { reply ("\"I've never heard of player %s{, n}.", s); } return (1); } /*---- Ask about mail senders ----*/ else if (!contest_mode && ((MATCH (lcmsg, "*who*sent*") && strcpy (tmp, res3) || MATCH (lcmsg, "*what*is*") && strcpy (tmp, res3) || MATCH (lcmsg, "*what*are*") && strcpy (tmp, res3) || MATCH (lcmsg, "*read me*") && strcpy (tmp, res2) || MATCH (lcmsg, "*tell me*") && strcpy (tmp, res2)) && (MATCH (tmp, "*mail*to*") || MATCH (tmp, "*mail*for*") || MATCH (tmp, "*message*to*") || MATCH (tmp, "*message*for*") || MATCH (tmp, "*msg*to*") || MATCH (tmp, "*msg*for*")) || MATCH (lcmsg, "*who*are*msg*from*") || MATCH (lcmsg, "*who*is*mail*from*") || MATCH (lcmsg, "*who*are*message*from*") || MATCH (lcmsg, "*who*is*message*from*"))) { int cnt; strcpy (speaker, name); spoke_player (name); zinger ("\"Sorry{, n}, but I don't reveal the source or contents %s.", "of a player's messages"); return (1); } /*---- A message to another player ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how*much*mail*") || MATCH (lcmsg, "*how*many*message*"))) { strcpy (speaker, name); spoke_player (name); msg_total (name); return (1); } /*---- status ----*/ else if (!contest_mode && (MATCH (lcmsg, "*status*"))) { strcpy (speaker, name); spoke_player (name); if (playinghearts) { reply ("\"I am %splaying hearts in %s, %s", quiet ? "quietly " : "", room_name (hererm), name); } else if (takingnotes) { reply ("\"I am %staking notes in %s, %s", quiet ? "quietly " : "", room_name (meetingroom), name); } else if (exploring) { reply ("\"I'm just %slooking %s, with speed %ld, %s", quiet ? "quietly " : "", usedesc ? "at room descriptions" : "around", speed, name); } else { reply ("\"I'm %sspending most of my time around home, %s", quiet ? "quietly " : "", name); } strcpy (speaker, name); reply ("\"I %s answer pages from most people.", paging ? "will" : "won't"); strcpy (speaker, name); reply ("\"I %s visit old rooms and I %s feel vindictive today.", visitold ? "will" : "won't", vindictive ? "do" : "don't"); return (1); } /*---- Name only ----*/ else if (strfoldeq (lcmsg, myname) || MATCH (lcmsg, "come here*") || MATCH (lcmsg, "*come here")) { strcpy (speaker, name); spoke_player (name); switch (nrrint (181, 3)) { case 0: reply ("\"Yes{, n}?"); break; case 1: reply ("\"Right here{, n}."); break; case 2: reply (":nods to %s.", name); break; } return (1); } /*---- A query about 'how to quit' ----*/ else if (MATCH (lcmsg, "*how* i *quit*") || MATCH (lcmsg, "*how* does *quit*") || MATCH (lcmsg, "*how* i *leave*game*") || MATCH (lcmsg, "*how* does *leave*") || MATCH (lcmsg, "*how* i *exit*") || MATCH (lcmsg, "*how* does *exit*") && !(sindex (lcmsg, "link") || sindex (lcmsg, " use ") || sindex (lcmsg, " go ")) || MATCH (lcmsg, "*how* i *stop*play*") || MATCH (lcmsg, "*how* does *stop*play*")) { strcpy (speaker, name); spoke_player (name); reply ("\"Type QUIT, using all caps{, n}."); return (1); } /*---- Can I ask you a question ----*/ else if (MATCH (lcmsg, "*can* i *ask*question*") || MATCH (lcmsg, "*may* i *ask*question*") || MATCH (lcmsg, "*can* i *ask*something*") || MATCH (lcmsg, "*may* i *ask*something*")) { strcpy (speaker, name); spoke_player (name); reply ("\"Sure{, n}, go ahead."); return (1); } /*---- A query about 'how to nod' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how* i *nod*") || MATCH (lcmsg, "*how* does *nod*") || MATCH (lcmsg, "*how* do you *nod*") || MATCH (lcmsg, "*how* i *smile*") || MATCH (lcmsg, "*how* does *smile*") || MATCH (lcmsg, "*how* do you *smile*"))) { strcpy (speaker, name); spoke_player (name); reply ("\"Use the ':' command{, n} (:nods, :smiles, etc.)"); return (1); } /*---- A query about 'how to sacrifice' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how* i *sacrifice*") || MATCH (lcmsg, "*how* does *sacrifice*") || MATCH (lcmsg, "*how* do you *sacrifice*"))) { strcpy (speaker, name); spoke_player (name); reply ("\"To sacrifice an object, drop it in the temple{, n}.)"); return (1); } /*---- A query about 'how to send message' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how* give* message*") || MATCH (lcmsg, "*how* send* message*") || MATCH (lcmsg, "*how* leave* message*"))) { strcpy (speaker, name); spoke_player (name); reply ("\"To send a message, type 'wh %s = %s' or 'page %s = %s', %s.", myname, "tell <player> <message>", myname, "tell <player> <message>", name); return (1); } /*---- A query about 'how to save' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how* i *save*character*") || MATCH (lcmsg, "*how* does *save*character*") || MATCH (lcmsg, "*how* do you *save*character*"))) { strcpy (speaker, name); spoke_player (name); reply ("\"Your %s, just go home and type QUIT, %s.", "state is automatically saved", name); return (1); } /*---- A query about 'how to make money' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how* i *make*money*") || MATCH (lcmsg, "*how* does *make*money*") || MATCH (lcmsg, "*how* do you *make*money*") || MATCH (lcmsg, "*how* i *get*penn*") || MATCH (lcmsg, "*how* does *get*penn*") || MATCH (lcmsg, "*how* do you *get*cookie*") || MATCH (lcmsg, "*how* i *get*cookie*") || MATCH (lcmsg, "*how* does *get*cookie*") || MATCH (lcmsg, "*how* do you *get*cookie*"))) { strcpy (speaker, name); spoke_player (name); if (streq (world, "ASYLUM")) { reply ("\"You can get cookies by %s to the lost and found, %s.", "returning things owned by other people", name); } else { reply ("\"You can get pennies by %s in the temple, %s.", "sacrificing objects (owned by other people)", name); } return (1); } /*---- A query about addition ----*/ else if ((MATCH (lcmsg, "*what is * + *") || MATCH (lcmsg, "*what's * + *") || MATCH (lcmsg, "*what is *+*") || MATCH (lcmsg, "*what's *+*") || MATCH (lcmsg, "*what are * and *") || MATCH (lcmsg, "*what is * plus *") || MATCH (lcmsg, "*what's * plus *")) && isnumber (res2) && isnumber (res3)) { strcpy (speaker, name); spoke_player (name); zinger ("\"I think it's %d, %s.", numberval (res2) + numberval (res3), name); return (1); } /*---- A query about subtraction ----*/ else if ((MATCH (lcmsg, "*what is * - *") || MATCH (lcmsg, "*what's * - *") || MATCH (lcmsg, "*what is *-*") || MATCH (lcmsg, "*what's *-*") || MATCH (lcmsg, "*what is * minus *") || MATCH (lcmsg, "*what's * minus *")) && isnumber (res2) && isnumber (res3)) { strcpy (speaker, name); spoke_player (name); zinger ("\"I think it's %d, %s.", numberval (res2) - numberval (res3), name); return (1); } /*---- A query about multiplication ----*/ else if ((MATCH (lcmsg, "*what is * times *") || MATCH (lcmsg, "*what is * x *") || MATCH (lcmsg, "*what's * x *") || MATCH (lcmsg, "*what is *x*") || MATCH (lcmsg, "*what's *x*") || MATCH (lcmsg, "*what's *") && strcpy (res1, res2) && (sscanf (res2, "%[0-9] * %[0-9]", res2, res3) || sscanf (res2, "%[0-9]*%[0-9]", res2, res3)) || MATCH (lcmsg, "*what is * times *") || MATCH (lcmsg, "*what's * times *")) && isnumber (res2) && isnumber (res3)) { strcpy (speaker, name); spoke_player (name); zinger ("\"I think it's %d, %s.", numberval (res2) * numberval (res3), name); return (1); } /*---- A query about division ----*/ else if ((MATCH (lcmsg, "*what is * / *") || MATCH (lcmsg, "*what's * / *") || MATCH (lcmsg, "*what is */*") || MATCH (lcmsg, "*what's */*") || MATCH (lcmsg, "*what is * over *") || MATCH (lcmsg, "*what's * over *") || MATCH (lcmsg, "*what is * divided by *") || MATCH (lcmsg, "*what's * divided by *")) && isnumber (res2) && isnumber (res3)) { strcpy (speaker, name); spoke_player (name); if (numberval (res3) == 0) { switch (nrrint (182, 4)) { case 0: zinger (":dumps core."); break; case 1: zinger ("\"I think it's pretty big{, n}."); break; case 2: zinger (":tells %s \"%s\"", name, "You can't fool me with that one."); break; case 3: zinger ("\"I think it's %1.3lf, %s.", (double) randint (10001) / randint (10001), name); break; } } else { zinger ("\"I think it's %1.3lf, %s.", (double) numberval (res2) / numberval (res3), name); } return (1); } /*---- A query about 'how you compute route' ----*/ else if (!contest_mode && (MATCH (lcmsg, "*how*you*compute*route*") || MATCH (lcmsg, "*how*you*find*route*") || MATCH (lcmsg, "*how*you*compute*path*") || MATCH (lcmsg, "*how*you*find*path*") || MATCH (lcmsg, "*how*you*find*your*way*"))) { strcpy (speaker, name); spoke_player (name); { switch (nrrint (183, 4)) { case 0: zinger ("\"I use a breadth first search."); break; case 1: zinger (":uses a breadth first search."); break; case 2: zinger ("\"I use a shortest path algorithm."); break; case 3: zinger (":uses a shortest path algorithm."); break; } } return (1); } /*---- A query about 'how you' ----*/ else if (!contest_mode && ((sindex (lcmsg, "can i ") || sindex (lcmsg, "can one ") || sindex (lcmsg, "how may ") || (randint (100) < 50 && (sindex (lcmsg, "how can ") || sindex (lcmsg, "how do i ") || sindex (lcmsg, "how do you ") && !sindex (lcmsg, "you do") && !sindex (lcmsg, "feel"))) || sindex (lcmsg, "how does one ") || sindex (lcmsg, "is it possible ")) || MATCH (lcmsg, "*you*know*how*") || MATCH (lcmsg, "*you*knew*how*") || MATCH (lcmsg, "*how *@*") || MATCH (lcmsg, "*what *@*"))) { strcpy (speaker, name); spoke_player (name); give_general_help (lcmsg, name); return (1); } /*---- A query about 'what time' ----*/ else if (MATCH (lcmsg, "*what*time*") && !sindex (lcmsg, "trav") && !sindex (lcmsg, "times")) { long now = time (0); strcpy (speaker, name); spoke_player (name); reply ("\"I have %5.5s (eastern){, n}.", ctime (&now)+11); return (1); } /* Message not matched by this rule set */ return (0); }