#include "kernel.h" #include "sflags.h" #include "pflags.h" #include "lflags.h" #include "sendsys.h" #include "mobile.h" #include "nflags.h" #include "bprintf.h" #include "mud.h" #include "commands.h" #include "log.h" #include <stdarg.h> extern void noswear(const char *); struct _send_msg_box { int mode; int min; int max; int x1; int x2; int lang; }; /* Simple interfaces: */ void broad (char *mesg) { sendf (DEST_ALL, "%s", mesg); } void sillycom (char *txt) { send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY, txt, pname (mynum), pname (mynum)); } void sillytp (int per, char *msg) { sendf (per, "\001p%s\003 %s\n", pname (mynum), msg); } void p_sendto (int to, char *text) { Boolean newstyle; if (!is_in_game(to) || !text) return; setup_globals (to); newstyle = ststflg(mynum, SFL_NEWSTYLE); if (cur_player->in_cmd) { if (newstyle) bprintf ("%s", text); else bprintf ("\n%s", text); } else { if (!ststflg(mynum, SFL_NOSWEAR)) bprintf ("%c%s\r%s", newstyle ? '\r' : '\n', text, cur_player->cprompt); else noswear(text); } } /* * Values for destination: * negative values: room number. * 0..max_players - 1 player with specified index. * max_players..numchars - 1 mobile with specified index. * DEST_ALL all players and mobiles. */ static Boolean test_rcv (int player, /* Who to send to */ int mode, /* Flags to control sending */ int min, /* Minimum level of recipient */ int max, /* Maximum level of recipient */ int x1, /* Do not send to him */ int x2, /* Nor to him */ int lang) { /* Language */ Boolean b; if (player == x1 || player == x2) return False; b = (plev (player) >= min && plev (player) < max); switch (lang & (MODE_LANG | MODE_NLANG)) { case MODE_LANG: b = b && ntstflg (player, lang & MODE_FLAGS); break; case MODE_NLANG: b = b && !ntstflg (player, lang & MODE_FLAGS); break; } if (mode & MODE_NOBLIND) b = b && !ststflg (player, SFL_BLIND); if (mode & MODE_NODEAF) b = b && !ststflg (player, SFL_DEAF); if (mode & MODE_NODUMB) b = b && !ststflg (player, SFL_DUMB); if (mode & MODE_NOCRIP) b = b && !ststflg (player, SFL_CRIPPLED); if (mode & MODE_QUIET) b = b && !ststflg (player, SFL_QUIET); if (mode & MODE_OUTDOORS) b = b && ltstflg (ploc (player), LFL_OUTDOORS); switch (mode & (MODE_PFLAG | MODE_NPFLAG)) { case MODE_PFLAG: b = b && ptstflg (player, mode & MODE_FLAGS); break; case MODE_NPFLAG: b = b && !ptstflg (player, mode & MODE_FLAGS); break; } switch (mode & (MODE_SFLAG | MODE_NSFLAG)) { case MODE_SFLAG: b = b && ststflg (player, (mode >> MODE_S) & MODE_FLAGS); break; case MODE_NSFLAG: b = b && !ststflg (player, (mode >> MODE_S) & MODE_FLAGS); break; } return b; } void trapfunc(void) { } void send_g_msg (int destination, /* Where to send to */ char *func (int plx, int arg, char *t), /* Test function */ int arg, /* Argument to test */ char *text) /* Text to send */ { char *t; int p, me = real_mynum; if (text == NULL) trapfunc(); if (destination >= 0) { /* plr/mob */ t = (func == NULL ? text : func(destination, arg, text)); if (is_in_game(destination)) { if (destination < max_players) p_sendto(destination, t); else if (ststflg(destination, SFL_OCCUPIED)) p_sendto(aliased_mob(destination), t); } } else { /* room/all */ for (p = 0; p < max_players; ++p) if (is_in_game (p) && !aliased(p)) if (destination == DEST_ALL || destination == ploc(p)) { t = (func == NULL ? text : func (p, arg, text)); p_sendto (p, t); } } setup_globals (me); } char * check_send_msg (int plx, int a, char *t) { struct _send_msg_box *b = (struct _send_msg_box *) a; if (test_rcv (plx, b->mode, b->min, b->max, b->x1, b->x2, b->lang)) return t; return NULL; } void send_msg (int destination, /* Where to send to */ int mode, /* Flags to control sending */ int min, /* Minimum level of recipient */ int max, /* Maximum level of recipient */ int x1, /* Do not send to him */ int x2, /* Nor to him */ char *format,...) { /* Format with args -> text to send */ va_list pvar; char bf[2048]; struct _send_msg_box b; char *bb; b.mode = mode; b.min = min; b.max = max; b.x1 = x1; b.x2 = x2; b.lang = NFL_ENGLISH; bb = format; va_start (pvar, format); vsprintf (bf, bb, pvar); va_end (pvar); send_g_msg (destination, check_send_msg, (int) &b, bf); } void sendf (int destination, char *format,...) { char b[2048]; va_list pvar; va_start (pvar, format); vsprintf (b, format, pvar); va_end (pvar); send_g_msg (destination, NULL, 0, b); } void gsendf (int destination, char *func (int plx, int arg, char *text), int arg, char *format,...) { char b[2048]; va_list pvar; va_start (pvar, format); vsprintf (b, format, pvar); va_end (pvar); send_g_msg (destination, func, arg, b); } void lsend_msg (int destination, /* Where to send to */ int lang, /* The language to speak */ int mode, /* Flags to control sending */ int min, /* Minimum level of recipient */ int max, /* Maximum level of recipient */ int x1, /* Do not send to him */ int x2, /* Nor to him */ char *format,...) { /* Format with args -> text to send */ va_list pvar; char bf[2048]; struct _send_msg_box b; char *bb; b.mode = mode; b.min = min; b.max = max; b.x1 = x1; b.x2 = x2; b.lang = lang; bb = format; va_start (pvar, format); vsprintf (bf, bb, pvar); va_end (pvar); send_g_msg (destination, check_send_msg, (int) &b, bf); }