idirt-1.82d/
idirt-1.82d/bin/
idirt-1.82d/data/LOGS/
idirt-1.82d/data/POLICY/
idirt-1.82d/data/WIZ_ZONES/
idirt-1.82d/doc/
idirt-1.82d/doc/info/
idirt-1.82d/doc/manual/
idirt-1.82d/src/Ident/
idirt-1.82d/src/utils/
idirt-1.82d/utils/
#include <stdlib.h>
#include <string.h>
#include "kernel.h"
#include "mobiles.h"
#include "sendsys.h"
#include "bprintf.h"
#include "mobile.h"
#include "pflags.h"
#include "sflags.h"
#include "eflags.h"
#include "nflags.h"
#include "lflags.h"
#include "parse.h"
#include "flags.h"
#include "comm.h"
#include "uaf.h"

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;
  return b;
}

void
com_handler (char *format, char *linename, int lvl, int flg)
{
  char xx[MAX_COM_LEN], txt[MAX_COM_LEN];
  int plr, aplr;

  getreinput (txt);

  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 channel to talk on it.\n", linename);
    return;
  }
  for (plr = 0; plr < max_players; plr++) {
    if (is_in_game (plr) && is_aliased (plr)) {
      aplr = players[plr].aliasto;
      if (!ststflg (aplr, flg))
	sendf (aplr, "%s\n", make_com_text (xx, format, txt, mynum, plr));
    } else if (is_in_game (plr) && plev (plr) >= lvl) {
      if (!ststflg (plr, flg))
	sendf (plr, "%s\n", make_com_text (xx, format, txt, mynum, plr));
    }
  }
}

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 &*line.\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 &*line.\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, "&+B%s%s%s &+wshouts &+W'&+w%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, "&+wA voice shouts &+W'&+w%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: %s\n", blob);
    }
  }
}

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 {
    sprintf (lang, "(in &+C%s&+w) ", Nflags[plang (mynum)]);

    lsend_msg (ploc (mynum), MODE_LANG | ML (plang (mynum)), MODE_NODEAF,
	       LVL_MIN, LVL_MAX, mynum, NOBODY, "&+G\001p%s\003 &+wsays %s"
	       "&+W'&+w%s&+W'\n", pname (mynum), is_eng (mynum) ? "" : lang,
	       foo);

    lsend_msg (ploc (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: %s\n", is_eng (mynum) ? "" : lang, foo);
  }
}

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 (ploc (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'&+w%s&+W'\n", pname (mynum), pname (plr),
	     is_eng (mynum) ? "" : lang, txt2);

  lsend_msg (ploc (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 (plr, MODE_LANG | ML (plang (mynum)), MODE_NODEAF, LVL_MIN,
	     LVL_MAX, NOBODY, NOBODY, "&+G\001p%s\003 &*says to you %s"
	 "&+W'&*%s&+W'\n", pname (mynum), is_eng (mynum) ? "" : lang, txt2);
  lsend_msg (plr, 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: %s\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 (ploc (mynum), MODE_LANG | ML (x), MODE_NODEAF,
	       LVL_MIN, LVL_MAX, mynum, NOBODY, "&+G\001p%s\003 &+wsays %s"
	       "&+W'&+w%s&+W'\n", pname (mynum), is_english ? "" : lang,
	       foo);

    lsend_msg (ploc (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\n", foo);
  }
}

void
tellcom (void)
{
  int b;

  if (EMPTY (item1)) {
    bprintf ("Tell who?\n");
    return;
  }
  if ((b = pl1) == -1) {
    bprintf ("No one with that name is playing.\n");
    return;
  }
  if (b == mynum) {
    bprintf ("You talk to yourself.\n");
    return;
  }
  if (EMPTY (txt2)) {
    bprintf ("What do you want to tell them?\n");
    return;
  }
  if (ststflg (mynum, SFL_NOORACLE) && EQ (pname (b), "Oracle") &&
      strstr (txt2, "tell")) {
    bprintf ("You are NoOracle, and cannot use Oracle Tell.\n");
    return;
  }
  if (check_forget (b, mynum)) {
    bprintf ("&+W%s &*has forgotten you and will not receive your messages.\n",
	     pname (b));
    return;
  }
  if (check_forget (mynum, b)) {
    bprintf ("You have forgotten &+W%s&*, leave them in peace.\n", pname (b));
    return;
  }
  if (check_busy (b))
    return;

  if (check_coding (b))
    bprintf ("%s is marked as &+Ccoding &*and might not respond right away.\n",
	     pname (b));
  if (check_away (b)) {
    bprintf ("%s is marked as &+Caway &*and might not respond right away.\n",
	     pname (b));
    bprintf ("Reason: %s\n", players[b].awaymsg);
  }
  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 (b), LFL_SOUNDPROOF) && ploc (mynum) != ploc (b)) {
    bprintf ("%s seems to be in a soundproof room.\n", pname (b));
    return;
  }
  if (ltstflg (ploc (mynum), LFL_SOUNDPROOF) && ploc (mynum) != ploc (b))
    bprintf ("Remember, that you are in a soundproof room and %s can't talk "
	     "back to you\n", pname (b));

  if (b == (max_players + MOB_CATACOMB_SERAPH)) {
    if (strchr (txt2, '?')) {
      switch (my_random () % 4) {
      case 0:
	sprintf (txt2, "Charity");
	break;
      case 1:
	sprintf (txt2, "Faith");
	break;
      case 2:
	sprintf (txt2, "Wisdom");
	break;
      case 3:
	sprintf (txt2, "Courage");
	break;
      }
    } else
      sprintf (txt2, "A blessing be upon your house.");
  }
  sendf (b, "&+C%s &+wtells you &+W'&+w%s&+W'\n", see_name (b, mynum), txt2);

  if (!see_player (b, mynum) && (players[b].replyplr != mynum)) {
    sendf (b, "Use reply to return a tell%s.\n", players[b].replyplr != -1 ?
	   " (Warning: Different Invisible Player)" : "");
    players[b].replyplr = mynum;
  }
  if (ststflg (mynum, SFL_HEARBACK))
    bprintf ("You tell &+W%s&*: %s\n", pname (b), txt2);
}

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);

  sillycom ("\001s%s\002%s begs and grovels to the powers that be.\n\003");

  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.p_name,
		 p.p_channel);
      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.p_name, new_channel);
  else
    bprintf ("Changing your channel to &+C%d&*.\n", new_channel);

  if (f) {
    p.p_channel = 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 (cur_player->forget[i] != -1) {
	if (!is_in_game (cur_player->forget[i]))
	  cur_player->forget[i] = -1;
	else
	  bprintf ("%s\n", pname (cur_player->forget[i]));
      }
    }
    return;
  }
  if ((b = fpbns (wordbuf)) != -1 && seeplayer (b)) {
    if (b >= max_players) {
      bprintf ("Forget a mobile? Why?\n");
      return;
    }
    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 (cur_player->forget[i] == b)
	  cur_player->forget[i] = -1;
      return;
    }
    for (i = 0; i < 10; ++i) {
      if (cur_player->forget[i] == -1) {
	bprintf ("Forgetting %s.\n", pname (b));
	cur_player->forget[i] = b;
	return;
      }
    }
    bprintf ("Sorry, you cannot forget anybody else.\n");
    return;
  }
  bprintf ("That player is not online.\n");
}

/* Languages; 1995, Illusion. Concept by Moses.
 * Change current language. If you wish to add more languages, please
 * read the 'doc/lang.doc' file before doing so.
 */
void
langcom (void)
{
  NFLAGS *n = &(nflags (mynum));
  int x;

  if (brkword () == -1) {
    bprintf ("Current Language: %s\n", Nflags[plang (mynum)]);
    bprintf ("Known Languages:\n");
    show_bits ((int *) n, sizeof (NFLAGS) / sizeof (int), Nflags);

    return;
  }
  if ((x = tlookup (wordbuf, Nflags)) < 0) {
    bprintf ("Unknown Language - %s\n", wordbuf);
    bprintf ("Known Languages:\n");
    show_bits ((int *) n, sizeof (NFLAGS) / sizeof (int), Nflags);

    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 ((int *) n, sizeof (NFLAGS) / sizeof (int), Nflags);
  }

}

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 (cur_player->replyplr == -1) {
    bprintf ("You have nobody to reply to.\n");
    return;
  }
  if (!is_in_game (cur_player->replyplr)) {
    bprintf ("Person you were replying to has left the game.\n");
    cur_player->replyplr = -1;
    return;
  }
  if (EMPTY (txt1)) {
    bprintf ("What do you wish to reply?\n");
    return;
  }
  sendf (cur_player->replyplr, "&+C%s &+wreplies &+W'&+w%s&+W'\n",
	 see_name (cur_player->replyplr, mynum), txt1);

  if (ststflg (mynum, SFL_HEARBACK))
    bprintf ("You reply: %s\n", txt1);
}