/* $Header: speech.c,v 2.0 90/05/05 12:45:44 lachesis Exp $ * $Log: speech.c,v $ * Revision 2.0 90/05/05 12:45:44 lachesis * Incorporated ABODE and HAVEN flags (remembering to convert FireFoot's * usage of those flags to ours). * Added Examine of objects that don't belong to you, added GOD_PRIV. * * Revision 1.2 90/05/02 20:25:29 lachesis * Converted gender substitution code to read properties, * changed page to provide a message, too. * * Revision 1.1 90/04/14 14:56:52 lachesis * Initial revision * */ #include "copyright.h" /* Commands which involve speaking */ #include "db.h" #include "interface.h" #include "match.h" #include "config.h" #include "externs.h" #include <ctype.h> int blank(const char *s); /* this function is a kludge for regenerating messages split by '=' */ const char *reconstruct_message(const char *arg1, const char *arg2) { static char buf[BUFFER_LEN]; if(arg2 && *arg2) { (void) strcpy(buf, arg1); (void) strcat(buf, "="); (void) strcat(buf, arg2); return buf; } else { return arg1; } } void do_say(dbref player, const char *arg1, const char *arg2) { dbref loc; const char *message; char buf[BUFFER_LEN]; if((loc = getloc(player)) == NOTHING) return; message = reconstruct_message(arg1, arg2); /* notify everybody */ sprintf(buf, "You say, \"%s\"", message); notify(player, buf); sprintf(buf, "%s says, \"%s\"", db[player].name, message); notify_except(db[loc].contents, player, buf); } void do_whisper(dbref player, const char *arg1, const char *arg2) { dbref who; char buf[BUFFER_LEN]; #ifndef QUIET_WHISPER dbref loc; #endif /* QUIET_WHISPER */ init_match(player, arg1, TYPE_PLAYER); match_neighbor(); match_me(); if(Wizard(player)) { match_absolute(); match_player(); } switch(who = match_result()) { case NOTHING: notify(player, "Whisper to whom?"); break; case AMBIGUOUS: notify(player, "I don't know who you mean!"); break; default: sprintf(buf, "%s whispers, \"%s\"", db[player].name, arg2); if (notify(who, buf)) { sprintf(buf, "You whisper, \"%s\" to %s.", arg2, db[who].name); notify(player, buf); #ifndef QUIET_WHISPER sprintf(buf, "%s whispers something to %s.", db[player].name, db[who].name); if((loc = getloc(player)) != NOTHING) { notify_except2(db[loc].contents, player, who, buf); } #endif /* QUIET_WHISPER */ } else { notify(player, "That player is not connected."); } break; } } void do_pose(dbref player, const char *arg1, const char *arg2) { dbref loc; const char *message; char buf[BUFFER_LEN]; if((loc = getloc(player)) == NOTHING) return; message = reconstruct_message(arg1, arg2); /* notify everybody */ sprintf(buf, "%s %s", db[player].name, message); notify_except(db[loc].contents, NOTHING, buf); } void do_wall(dbref player, const char *arg1, const char *arg2) { dbref i; const char *message; char buf[BUFFER_LEN]; message = reconstruct_message(arg1, arg2); if(Wizard(player)) { fprintf(stderr, "WALL from %s(%d): %s\n", db[player].name, player, message); sprintf(buf, "%s shouts, \"%s\"", db[player].name, message); for(i = 0; i < db_top; i++) { if(Typeof(i) == TYPE_PLAYER) { notify(i, buf); } } } else { notify(player, "But what do you want to do with the wall?"); } } void do_gripe(dbref player, const char *arg1, const char *arg2) { dbref loc; const char *message; loc = db[player].location; message = reconstruct_message(arg1, arg2); fprintf(stderr, "GRIPE from %s(%d) in %s(%d): %s\n", db[player].name, player, db[loc].name, loc, message); fflush(stderr); notify(player, "Your complaint has been duly noted."); } /* doesn't really belong here, but I couldn't figure out where else */ void do_page(dbref player, const char *arg1, const char *arg2) { char buf[BUFFER_LEN]; dbref target; int flag; if(!payfor(player, LOOKUP_COST)) { notify(player, "You don't have enough cookies."); } else if((target = lookup_player(arg1)) == NOTHING) { notify(player, "I don't recognize that name."); #ifdef HAVEN } else if (db[target].flags & HAVEN) { notify(player, "That player does not wish to be disturbed."); #endif /* HAVEN */ } else { if (!blank(arg2)) { sprintf(buf, "%s pages: %s", db[player].name, arg2); flag = notify(target, buf); } else { sprintf(buf, "You sense that %s is looking for you in %s.", db[player].name, db[db[player].location].name); flag = notify(target, buf); } if (flag) notify(player, "Your message has been sent."); else notify(player, "That player is not connected."); } } void notify_except(dbref first, dbref exception, const char *msg) { DOLIST (first, first) { if ((db[first].flags & TYPE_MASK) == TYPE_PLAYER && first != exception) { notify (first, msg); } } } void notify_except2(dbref first, dbref exc1, dbref exc2, const char *msg) { DOLIST (first, first) { if ((db[first].flags & TYPE_MASK) == TYPE_PLAYER && first != exc1 && first != exc2) { notify (first, msg); } } } int blank(const char *s) { while (*s && isspace(*s)) s++; return !(*s); }