#include <unistd.h>
#include <sys/file.h>
#include <stdlib.h>
#include <string.h>
#include "sys/file.h"
#include "kernel.h"
#include "mobiles.h"
#include "sendsys.h"
#include "bprintf.h"
#include "mobile.h"
#include "parse.h"
#include "comm.h"
#include "uaf.h"
#include "log.h"
#include "rooms.h"
#ifdef BOB
#include <sys/file.h>
extern char response[400];
extern char my_nick[20];
#define NAME "Bob"
void bobcom (char *text, int plx, Boolean is_tell);
extern void init(void);
extern void ask(char *, char *);
#endif
char *make_com_text (char *b, char *s, char *t, int send_plr, int recv_plr) {
char *p, *q, *r;
for (p = b, q = s; *q != 0;) {
if (*q != '%')
*p++ = *q++;
else {
switch (*++q) {
case 'n': /* Player Name */
if (pvis (send_plr) > 0 && see_player (recv_plr, send_plr))
*p++ = '(';
for (r = see_name (recv_plr, send_plr); *r != 0;)
*p++ = *r++;
if (pvis (send_plr) > 0 && see_player (recv_plr, send_plr))
*p++ = ')';
break;
case 't': /* Message Text */
if (t == NULL)
return NULL;
for (r = t; *r != 0;)
*p++ = *r++;
break;
case 0:
--q;
break;
default:
*p++ = *q;
}
++q;
}
}
if (p[-1] == '\n')
--p;
*p = 0;
if (!ststflg(recv_plr, SFL_SEENUMBERS))
return b + 8;
else
return b;
}
void com_handler (char *format, char *linename, int lvl, int flg) {
char xx[MAX_COM_LEN], txt[MAX_COM_LEN];
int plr, to;
getreinput (txt);
if (ststflg(mynum, SFL_DUMB)) {
bprintf("You're a mute now, sorry.\n");
return;
}
if (EMPTY (txt)) {
bprintf ("Well, what do you want to say?\n");
return;
}
if (plev (mynum) < lvl) {
bprintf ("Such advanced conversation is beyond you.\n");
return;
}
if (ststflg (mynum, flg)) {
bprintf ("You must be listening to the %s &Nchannel to talk on it.\n",
linename);
return;
}
for (plr = 0; plr < max_players; plr++) {
if (is_in_game (plr)) {
if (aliased (plr))
to = aliasto(plr);
else
to = plr;
if (plev(to) >= lvl && !ststflg (to, flg) && !ststflg(to, SFL_DEAF))
sendf(to, "%s\n", make_com_text (xx, format, txt, mynum, to));
}
}
}
void
nolinecom (int lvl, int flg, char txt[20])
{
if (plev (mynum) < lvl) {
erreval ();
return;
}
if (!ststflg (mynum, flg)) {
ssetflg (mynum, flg);
send_msg (DEST_ALL, 0, max (lvl, pvis (mynum)), LVL_MAX, mynum, NOBODY,
"&+C[&+W%s &*has left the %s &*line&+C]\n", pname (mynum), txt);
bprintf ("You are no longer listening to the %s &Nline.\n", txt);
} else {
sclrflg (mynum, flg);
send_msg (DEST_ALL, 0, max (lvl, pvis (mynum)), LVL_MAX, mynum, NOBODY,
"&+C[&+W%s &*has joined the %s &*line&+C]\n", pname (mynum), txt);
bprintf ("You are once again listening to the %s &Nline.\n", txt);
}
}
static char *
shout_test (int player, int sender, char *text)
{
static char buff[MAX_COM_LEN];
if (player == sender ||
(plev (player) >= LVL_WIZARD && ststflg (player, SFL_NOSHOUT)) ||
(plev (player) < LVL_WIZARD && ststflg (player, SFL_DEAF)) ||
(ltstflg (ploc (player), LFL_SOUNDPROOF) &&
ploc (sender) != ploc (player)))
return NULL;
if (plev (player) >= LVL_WIZARD || plev (sender) >= LVL_WIZARD
|| ploc (player) == ploc (sender)) {
sprintf (buff, "&+r%s%s%s &+wshouts, &+W\"&+R%s&+W\"\n",
pvis (sender) > 0 && see_player (player, sender) ? "(" :"",
see_name (player, sender),
pvis (sender) > 0 && see_player (player, sender) ? ")" :"",
text);
} else {
sprintf (buff, "A voice shouts, &+W\"&+R%s&+W\"\n", text);
}
return buff;
}
void
shoutcom (void)
{
char blob[MAX_COM_LEN];
if (plev (mynum) < LVL_WIZARD && ststflg (mynum, SFL_NOSHOUT)) {
bprintf ("I'm sorry, you can't shout anymore.\n");
return;
} else {
getreinput (blob);
if (EMPTY (blob)) {
bprintf ("What do you want to shout?\n");
return;
} else {
send_g_msg (DEST_ALL, shout_test, mynum, blob);
if (ststflg (mynum, SFL_HEARBACK))
bprintf ("You shout, &+W\"&+R%s&+W\"\n", blob);
else
bprintf ("Ok.");
}
}
}
void saycom (void) {
char foo[MAX_COM_LEN];
char lang[30];
getreinput (foo);
if (EMPTY (txt1)) {
bprintf ("What do you want to say?\n");
return;
}
else if (ststflg(mynum, SFL_DUMB)) {
bprintf("You're a mute now, sorry.\n");
return;
}
else {
sprintf (lang, " in &+C%s&+w", Nflags[plang (mynum)]);
lsend_msg(sendloc(mynum), MODE_LANG | ML (plang (mynum)),
MODE_NODEAF, LVL_MIN, LVL_MAX, mynum, NOBODY,
"\001p%s\003 &+wsays%s&N, &+W\"&+Y%s&+W\"\n",
pname (mynum), is_eng (mynum) ? "" : lang, foo);
lsend_msg(sendloc(mynum), MODE_NLANG | ML (plang (mynum)),
MODE_NODEAF,
LVL_MIN, LVL_MAX, mynum, NOBODY, "&+G\001p%s\003 &*says "
"something in a foreign tongue.\n", pname (mynum));
if (ststflg (mynum, SFL_HEARBACK))
bprintf ("You say%s, &+W\"&+Y%s&+W\"\n",
is_eng (mynum) ? "" : lang, foo);
#ifdef BOB
if (ploc(mynum) == ploc(MOB_START_BOB + max_players))
bobcom(txt1, mynum, False);
#endif
}
}
void
saytocom (void)
{
char lang[30];
int plr;
if ((plr = pl1) == -1) {
bprintf ("Say what to who?\n");
return;
}
if (ploc (plr) != ploc (mynum)) {
bprintf ("They aren't here.\n");
return;
}
if (plr == mynum) {
bprintf ("You mumble to yourself.\n");
return;
}
if (EMPTY (txt2)) {
bprintf ("What do you want to say?\n");
return;
}
sprintf (lang, " in &+C%s&+w", Nflags[plang (mynum)]);
lsend_msg(sendloc(mynum), MODE_LANG | ML (plang (mynum)),
MODE_NODEAF,
LVL_MIN, LVL_MAX, mynum, plr, "&+G\001p%s\003 &+wsays to "
"&+C\001p%s\003%s, &+W\"&+Y%s&+W\"\n", pname (mynum), pname (plr),
is_eng (mynum) ? "" : lang, txt2);
lsend_msg(sendloc(mynum), MODE_NLANG | ML (plang (mynum)),
MODE_NODEAF,
LVL_MIN, LVL_MAX, mynum, plr, "&+G\001p%s\003 &*says "
"something to &+C\001p%s\003 &*in a foreign tongue.\n",
pname (mynum), pname (plr));
lsend_msg(int2idx(plr, MOB), MODE_LANG | ML (plang (mynum)), MODE_NODEAF, LVL_MIN,
LVL_MAX, NOBODY, NOBODY, "&+G\001p%s\003 &*says to you %s"
"&+W\"&+Y%s&+W\"\n", pname (mynum), is_eng (mynum) ? "" :
lang, txt2);
lsend_msg(int2idx(plr, MOB), MODE_NLANG | ML (plang (mynum)), MODE_NODEAF, LVL_MIN,
LVL_MAX, NOBODY, NOBODY, "&+G\001p%s\003 &*says something to "
"you in a foreign tongue.\n", pname (mynum));
if (ststflg (mynum, SFL_HEARBACK))
bprintf ("You say to &+G%s&+w%s, &+W\"&+Y%s&+W\"\n", pname (plr),
is_eng (mynum) ? "" : lang, txt2);
}
void lsaycom (void)
{
Boolean is_english;
char foo[MAX_COM_LEN];
char lang[30];
int x;
if (brkword () == -1) {
bprintf ("Speak in what language?\n");
return;
}
if ((x = tlookup (wordbuf, Nflags)) < 0) {
bprintf ("That language doesn't exist!\n");
return;
}
if (!ntstflg (mynum, x)) {
bprintf ("You don't know how to speak that language!\n");
return;
}
getreinput (foo);
if (EMPTY (txt2)) {
bprintf ("What do you want to say?\n");
return;
} else {
sprintf (lang, " in &+C%s&+w", Nflags[x]);
is_english = (x == NFL_ENGLISH);
lsend_msg (sendloc(mynum), MODE_LANG | ML (x), MODE_NODEAF,
LVL_MIN, LVL_MAX, mynum, NOBODY,
"&+G\001p%s\003 &+wsays%s, &+W\"&+Y%s&+W\"\n",
pname (mynum), is_english ? "" : lang, foo);
lsend_msg (sendloc(mynum), MODE_NLANG | ML (x), MODE_NODEAF,
LVL_MIN, LVL_MAX, mynum, NOBODY, "&+G\001p%s\003 &*says "
"something in a foreign tongue.\n", pname (mynum));
if (ststflg (mynum, SFL_HEARBACK))
bprintf ("You say%s, &+W\"&+Y%s&+W\"\n", lang, foo);
}
}
void tellcom (int plr) {
char *ptr, *name, text[MAX_COM_LEN];
int p;
if (plr != -1) {
if (!(ptr = strchr(strbuf, ' ')))
*text = 0;
else
strcpy(text, ptr + 1);
name = pname(plr);
p = plr;
}
else {
strcpy(text, txt2);
name = item1;
p = pl1;
}
if (EMPTY(name) && plr == -1)
bprintf ("Tell who?\n");
else if (p == -1)
bprintf ("No one with that name is playing.\n");
else if (p == mynum)
bprintf ("You talk to yourself.\n");
else if (EMPTY(text))
bprintf ("What would you like to tell %s?\n", pname(p));
else if (ststflg(mynum, SFL_NOORACLE) &&
EQ(pname(p), "Oracle") && strstr(text, "tell"))
bprintf("You are NoOracle, and cannot use Oracle Tell.\n");
else if (check_forget(p, mynum))
bprintf("&+W%s &*has forgotten you and will not receive your messages.\n",
pname(p));
else if (check_busy(p))
bprintf("They are busy.\n");
else if (ltstflg (ploc(p), LFL_SOUNDPROOF) && plev(mynum) < LVL_WIZARD
&& ploc(p) != ploc(mynum))
bprintf("%s seems to be in a soundproof room.\n", pname(p));
else { /* send tell & other msgs */
if (check_coding(p))
bprintf("%s is marked as &+Ccoding &*and might not respond right away.\n",
pname(p));
if (check_away(p)) {
if (pawaymsg(p))
bprintf("%s is marked as &+Caway&*:\n%s\n", pname(p), pawaymsg(p));
else
bprintf("%s is marked as &+Caway &*and might not respond right "
"away.\n", pname(p));
}
if (p < max_players && linkdead(p))
bprintf("%s is linkdead and may not receive your message.\n",
pname(p));
if (check_coding(mynum))
bprintf("Don't forget that you are marked as &+Ccoding&*.\n");
if (check_away(mynum))
bprintf("Don't forget that you are marked as &+Caway&*.\n");
if (ltstflg(ploc(mynum), LFL_SOUNDPROOF) &&
ploc(mynum) != ploc(p) && plev(p) < LVL_WIZARD)
bprintf("You are in a soundproof room and %s can't talk back.\n",
pname(p));
#ifdef LOCMIN_CATACOMB
if (p == (max_players + MOB_CATACOMB_SERAPH)) {
if (strchr (text, '?')) {
switch (my_random () % 4) {
case 0:
strcpy (text, "Charity");
break;
case 1:
strcpy (text, "Faith");
break;
case 2:
strcpy (text, "Wisdom");
break;
case 3:
strcpy (text, "Courage");
break;
}
}
else
sprintf(text, "A blessing be upon your house.");
}
#endif
sendf(p, "%s&+B%s&N tells you, &+W\"&+G%s&+W\"\n",
(ststflg(p, SFL_AWAYBEEPS) && check_away(p)) ? "\a" : "",
see_name(p, mynum), text);
if (ststflg(mynum, SFL_HEARBACK))
bprintf ("You tell &+B%s&N, &+W\"&+G%s&+W\"\n", pname (p), text);
#ifdef BOB
if (p == (MOB_START_BOB + max_players))
bobcom(text, mynum, True);
#endif
}
}
#ifdef BOB
void bobcom (char *text, int plx, Boolean is_tell)
{
char question[MAX_COM_LEN];
if (!dfile)
init();
if (pstr(MOB_START_BOB + max_players) < 0) {
if (is_tell)
bprintf("Bob is currently dead, please drive through...\n");
return;
}
else if (!is_tell && count_players(ploc(mynum), COUNT_PLAYERS) > 1)
return;
strcpy(my_nick, NAME);
sprintf(question, "%s: %s", NAME, text);
ask(pname(plx), question);
response[0] = toupper(response[0]);
if (is_tell)
sendf (plx, "&+B&NBob tells you, &+W\"&+G%s&+W\"\n", response);
else
send_msg(int2idx(ploc(MOB_START_BOB + max_players), MOB), 0, LVL_MIN,
LVL_MAX,
NOBODY, NOBODY, "Bob says, &+W\"&+Y%s&+W\"\n", response);
}
#endif /* BOB */
static char *anon_test (int plr, int snd, char *txt)
{
static char buff[MAX_COM_LEN];
if (ststflg (plr, SFL_NOANON))
return NULL;
if (ptstflg (plr, PFL_SEEANON))
sprintf (buff, "&+w[&+WAnon &+B(&*\001p%s\003&+B)&+w]&+W: &+C'&+w%s&+C'\n",
pname (snd), txt);
else
sprintf (buff, "&+w[&+WAnon&+w]&+W: &+C'&+w%s&+C'\n", txt);
return buff;
}
void
anoncom (void)
{
if (ststflg (mynum, SFL_NOANON)) {
bprintf ("You must be listening to the anon channel to talk on it.\n");
return;
}
if (EMPTY (txt1)) {
bprintf ("What would you like to say?\n");
return;
}
send_g_msg (DEST_ALL, anon_test, mynum, txt1);
}
void wishcom (void) {
char x[MAX_COM_LEN];
if (EMPTY (item1)) {
bprintf ("Wish for what?\n");
return;
}
getreinput (x);
if (ststflg (mynum, SFL_NOWISH)) {
bprintf ("%s\n", plev (mynum) < LVL_WIZARD ?
"You find it hard to wish.." :
"You can't wish if you don't want to listen to them!");
return;
}
send_msg (DEST_ALL, MODE_NSFLAG | MS (SFL_NOWISH), LVL_WIZARD, LVL_MAX,
NOBODY, NOBODY, "&+B[&+wWish from &+W\001p%s\003&+B]\n"
"&+B[&+w%s&+B]\n", pname (mynum), x);
send_msg (sendloc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"\001p%s\003 begs and grovels to the powers that be.\n",
pname(mynum));
if (ststflg (mynum, SFL_HEARBACK) && plev (mynum) < LVL_WIZARD)
bprintf ("You wish: %s\n", x);
else
bprintf ("Ok.\n");
}
void
chatcom (void)
{
int i;
if (EMPTY (txt1)) {
bprintf ("&+C[&+wGlobal Chat Channel : %d&+C]\n", pchannel (mynum));
bprintf ("&+COn Channel: ");
}
for (i = 0; i < max_players; ++i) {
if (is_in_game (i) && pchannel (i) == pchannel (mynum)) {
if (EMPTY (txt1))
bprintf ("&+w%-15s", see_name (mynum, i));
if (!EMPTY (txt1))
sendf (i, "&+C-> &+w%s%s%s &+C<- &+B: &+w%s\n",
pvis (mynum) > 0 && see_player (i, mynum) ? "(" : "",
see_name (i, mynum),
pvis (mynum) > 0 && see_player (i, mynum) ? ")" : "",
txt1);
}
}
if (EMPTY (txt1))
bprintf ("\n");
}
void
channelcom (void)
{
Boolean f, is_me, is_mobile;
int a, new_channel, i;
PERSONA p;
if ((brkword () == -1) && ptstflg (mynum, PFL_CHATMOD)) {
bprintf ("&+CName Channel\n");
bprintf ("&+b---------------------------\n");
for (i = 0; i < max_players; ++i) {
if (is_in_game (i))
bprintf ("&+W%-20s &+C%6d\n", see_name (mynum, i), pchannel (i));
}
bprintf ("&+b---------------------------\n");
return;
}
if ((a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if (is_mobile) {
bprintf ("You cannot change the chat channel of a mobile!\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if (is_mobile) {
bprintf ("You cannot change the chat channel of a mobile!\n");
return;
}
if (brkword () == -1) {
if (is_me) {
bprintf ("&*Your current chat channel is &+W%d\n", pchannel (mynum));
} else {
if (ptstflg (mynum, PFL_CHATMOD))
bprintf ("&+W%s &*is currently using channel &+C%d\n", p.ublock.pname,
p.player.pchannel);
else
bprintf ("You cannot view another players chat channel selection!\n");
}
return;
}
if (!is_me && !ptstflg (mynum, PFL_CHATMOD)) {
bprintf ("You cannot change another players chat channel selection!\n");
return;
}
new_channel = max (0, atoi (wordbuf));
if (is_me && (pchannel (mynum) == new_channel)) {
bprintf ("Why did you pick the channel that you are already on?\n");
return;
}
if (new_channel < 0 || new_channel > 100000) {
bprintf ("The channel must be between 0 and 100000.\n");
return;
}
if (!is_me)
bprintf ("Changing &+W%s's &*channel to &+C%d&*.\n", p.ublock.pname,
new_channel);
else
bprintf ("Changing your channel to &+C%d&*.\n", new_channel);
if (f) {
p.player.pchannel = new_channel;
putuaf (&p);
return;
}
for (i = 0; i < max_players; ++i) {
if (is_in_game (i) && see_player (i, a) && i != a) {
if (pchannel (i) == pchannel (a))
sendf (i, "&+C-> &+W%s &*has left the channel &+C<-\n", pname (a));
if (pchannel (i) == new_channel)
sendf (i, "&+C-> &+W%s &*has joined the channel &+C<-\n", pname (a));
}
}
setpchannel (a, new_channel);
}
void forgetcom (void) {
int b, i;
if (brkword () == -1) {
bprintf ("You are currently forgetting:\n");
for (i = 0; i < 10; ++i) {
if (rplrs[mynum].forget[i] != -1) {
if (!is_in_game (rplrs[mynum].forget[i]))
rplrs[mynum].forget[i] = -1;
else
bprintf ("%s\n", pname (rplrs[mynum].forget[i]));
}
}
return;
}
if ((b = pl1) != -1) {
if (ptstflg (b, PFL_NOFORGET)) {
bprintf ("You cannot forget about that person.\n");
return;
}
if (check_forget (mynum, b)) {
bprintf ("Remembering %s.\n", pname (b));
for (i = 0; i < 10; ++i)
if (rplrs[mynum].forget[i] == b)
rplrs[mynum].forget[i] = -1;
return;
}
for (i = 0; i < 10; ++i) {
if (rplrs[mynum].forget[i] == -1) {
bprintf ("Forgetting %s.\n", pname (b));
rplrs[mynum].forget[i] = b;
return;
}
}
bprintf ("Sorry, you cannot forget anybody else.\n");
return;
}
bprintf ("That player is not online.\n");
}
void langcom (void) {
int x;
if (brkword () == -1) {
bprintf ("Current Language: %s\n", Nflags[plang (mynum)]);
bprintf ("Known Languages:\n");
show_bits(mbits(mynum), mindex, Nflags, NFLAGS, False);
return;
}
if ((x = tlookup (wordbuf, Nflags)) < 0) {
bprintf ("Unknown Language - %s\n", wordbuf);
bprintf ("Known Languages:\n");
show_bits(mbits(mynum), mindex, Nflags, NFLAGS, False);
return;
}
if (ntstflg (mynum, x)) {
bprintf ("Language changed to %s.\n", Nflags[x]);
setplang (mynum, x);
} else {
bprintf ("Unknown Language - %s\n", wordbuf);
bprintf ("Known Languages:\n");
show_bits(mbits(mynum), mindex, Nflags, NFLAGS, False);
}
}
void
conversecom (void)
{
int b;
if (EMPTY (item1)) {
if (pconv (mynum) == -1)
bprintf ("Converse with who?\n");
else
bprintf ("You are conversing with &+W%s&*.\n", pname (pconv (mynum)));
return;
}
if ((b = pl1) == -1) {
bprintf ("Who?\n");
return;
}
if (b == mynum) {
bprintf ("You want to converse with yourself? You aren't Sybil.\n");
return;
}
if (b >= max_players) {
bprintf ("I'm sure that %s has alot to converse about.\n", pname (b));
return;
}
setpconv (mynum, b);
bprintf ("Entering Converse Mode !<command> = MUD Command ** = Quit\n");
bprintf ("You are conversing with: %s\n\n", pname (b));
}
void
replycom (void)
{
if (replyplr(mynum) == -1) {
bprintf ("You have nobody to reply to.\n");
return;
}
if (!is_in_game (replyplr(mynum))) {
bprintf ("Person you were replying to has left the game.\n");
replyplr(mynum) = -1;
return;
}
if (EMPTY (txt1)) {
bprintf ("What do you wish to reply?\n");
return;
}
sendf (replyplr(mynum), "&+C%s &+wreplies &+W\"&+w%s&+W\"\n",
see_name (replyplr(mynum), mynum), txt1);
if (ststflg (mynum, SFL_HEARBACK))
bprintf ("You reply, &+C\"&+G%s&+C\"\n", txt1);
}