/* $Header: /belch_a/users/rearl/tinymuck/src/RCS/speech.c,v 1.12 90/09/16 04:43:00 rearl Exp $ */
/*
* $Log: speech.c,v $
* Revision 1.12 90/09/16 04:43:00 rearl
*
* Preparation code added for disk-based MUCK.
*
* Revision 1.11 90/09/15 22:28:08 rearl
* Fixed bug in @wall.
*
* Revision 1.10 90/09/10 02:21:23 rearl
* Put quotes around the page format.
*
* Revision 1.9 90/08/27 03:34:21 rearl
* Changed page format (yet again)
*
* Revision 1.8 90/08/11 04:10:47 rearl
* *** empty log message ***
*
* Revision 1.7 90/08/09 21:07:44 rearl
* Removed notify_except2().
*
* Revision 1.6 90/08/05 03:21:36 rearl
* Redid matching routines.
*
* Revision 1.5 90/08/02 18:54:29 rearl
* Fixed some calls to logging functions.
*
* Revision 1.4 90/07/29 17:44:45 rearl
* Took out reconstruct_message() braindamage.
*
* Revision 1.3 90/07/21 16:30:04 casie
* removed fflush(stderr); call
*
* Revision 1.2 90/07/21 13:04:18 casie
* modified for logging handling
*
* Revision 1.1 90/07/19 23:04:11 casie
* Initial revision
*
*/
#include "copyright.h"
#include "config.h"
#include "db.h"
#include "interface.h"
#include "match.h"
#include "params.h"
#include "externs.h"
#include <ctype.h>
/* Commands which involve speaking */
int blank(const char *s);
void do_say(dbref player, const char *message)
{
dbref loc;
char buf[BUFFER_LEN];
if((loc = getloc(player)) == NOTHING) return;
/* notify everybody */
sprintf(buf, "You say, \"%s\"", message);
notify(player, buf);
sprintf(buf, "%s says, \"%s\"", NAME(player), message);
notify_except(DBFETCH(loc)->contents, player, buf);
}
void do_whisper(dbref player, const char *arg1, const char *arg2)
{
dbref who;
char buf[BUFFER_LEN];
struct match_data md;
init_match(player, arg1, TYPE_PLAYER, &md);
match_neighbor(&md);
match_me(&md);
if(Arch(player)) {
match_absolute(&md);
match_player(&md);
}
switch(who = match_result(&md)) {
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\"", NAME(player), arg2);
if (!notify(who, buf)) {
sprintf(buf, "%s is not connected.", NAME(who));
notify(player, buf);
break;
}
sprintf(buf, "You whisper, \"%s\" to %s.", arg2, NAME(who));
notify(player, buf);
break;
}
}
void do_pose(dbref player, const char *message)
{
dbref loc;
char buf[BUFFER_LEN];
if((loc = getloc(player)) == NOTHING) return;
/* notify everybody */
sprintf(buf, "%s %s", NAME(player), message);
notify_except(DBFETCH(loc)->contents, NOTHING, buf);
}
void do_wall(dbref player, const char *message)
{
dbref i;
char buf[BUFFER_LEN];
if(Wizard(player)) {
log_status("WALL from %s(%d): %s\n", NAME(player), player, message);
sprintf(buf, "%s shouts, \"%s\"", NAME(player), 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 *message)
{
dbref loc;
loc = DBFETCH(player)->location;
log_gripe("GRIPE from %s(%d) in %s(%d): %s\n",
NAME(player), player, NAME(loc), loc, message);
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;
if(!payfor(player, LOOKUP_COST)) {
notify(player, "You don't have enough pennies.");
return;
}
if((target = lookup_player(arg1)) == NOTHING) {
notify(player, "I don't recognize that name.");
return;
}
if (blank(arg2))
sprintf(buf, "You sense that %s is looking for you in %s.",
NAME(player), NAME(DBFETCH(player)->location));
else
sprintf(buf, "%s pages from %s: \"%s\"", NAME(player),
NAME(DBFETCH(player)->location), arg2);
if (notify(target, buf))
notify(player, "Your message has been sent.");
else {
sprintf(buf, "%s is not connected.", NAME(target));
notify(player, buf);
}
}
int notify(dbref who, const char *msg)
{
register int res;
static char buff[BUFFER_LEN+80];
static char buf2[BUFFER_LEN+80];
if(!msg)
return notify_internal(who, msg);
strcpy(buf2, msg);
msg = buf2;
if(Paranoid(who) && (who != global_trigger)) { /* paranoid! */
sprintf(buff, "[%s(#%d)] %s", NAME(global_trigger), (int) global_trigger,
msg);
res = notify_internal(who, buff);
} else
res = notify_internal(who, msg);
if(FLAGS(who)&PUPPET && Typeof(who)!=TYPE_PLAYER) {
sprintf(buff, "%s> %s", NAME(who), msg);
res += notify_internal(DBFETCH(who)->owner, buff);
}
if(Typeof(who) == TYPE_THING) /* only objects can do listen/ahear */
if(get_attr(who, "Listen")) /* do the listen junk */ {
res++;
strcpy(buff, msg);
if(wild_match(get_attr(who, "Listen"), buff)) {
/* okie, it's a match */
trigobj(who,get_attr(who, "Aahear"), global_trigger);
if(global_trigger==who)
trigobj(who,get_attr(who, "Amhear"), global_trigger);
else
trigobj(who, get_attr(who, "Ahear"), global_trigger);
}
}
return res;
}
void notify_except(dbref first, dbref exception, const char *msg)
{
if(first == NOTHING)
return;
if(DBFETCH(first)->location != NOTHING
&& DBFETCH(first)->location != exception) {
notify(DBFETCH(first)->location, msg);
}
DOLIST (first, first) {
if (first != exception) {
notify(first, msg);
}
}
}
int
blank(const char *s)
{
while (*s && isspace(*s))
s++;
return !(*s);
}
void lose_ears(dbref x)
{
notify_except(DBFETCH(DBFETCH(x)->location)->contents,
NOTHING,
pronoun_substitute(x, "%n loses %p ears and becomes deaf.",
GOD));
}
void grow_ears(dbref x)
{
notify_except(DBFETCH(DBFETCH(x)->location)->contents,
NOTHING,
pronoun_substitute(x, "%n grows ears and can now hear!",
GOD));
}