dyrt/
dyrt/bin/
dyrt/data/MAIL/
dyrt/data/WIZ_ZONES/
dyrt/include/machine/
dyrt/src/misc/cpp/
#include "mobiles.h"
#include "verbs.h"
#include "kernel.h"
#include "stdinc.h"
#include "communicate.h"
#include "colors.h"

typedef unsigned char	 uint8;
char *build_voice_text	(char *name,
			 char *verb,
			 char *text,
			 char *quote,
			 color_code_type indent_color,
			 color_code_type speech_color)
{
#define LCL_SCREEN_WIDTH	80
#define LCL_MAX_WORD_LENGTH	20

  uint8 pos;
  uint8 max_chars_per_line;
  uint8 min_chars_per_line;
  uint8 max_num_lines;
  uint8 indent_chars;
  char *start;
  char *end;
  char *buffer;

/* Hamlet say '...'  Player + Verb + Quote + Text + Quote */
  max_chars_per_line = LCL_SCREEN_WIDTH -
			strlen (verb) -
			strlen (name) -
			strlen (color_strings[speech_color]) -
			(strlen(quote) * 2);
  min_chars_per_line = max_chars_per_line - LCL_MAX_WORD_LENGTH;
  max_num_lines      = (strlen(text) / min_chars_per_line) + 1;

/* Allocate space for the text, copy in the initial text, and determine the
   indentation needed for this text. */
  buffer = (char *) malloc ((LCL_SCREEN_WIDTH * max_num_lines) +
			    strlen(color_strings[indent_color]) +
			    strlen(color_strings[speech_color]));
  if (strlen(name) == 0)
    {
      sprintf(buffer, "%s%s %s%s", color_strings[indent_color],
              verb, color_strings[speech_color], quote);
      indent_chars = 1 + strlen(name) + strlen(verb) + strlen(quote);
    }
  else if (EQ(verb, ":") || EQ(verb, "*") || EQ(verb, ">") || EQ(verb, "#"))
    {
      sprintf(buffer, "%s%s%s %s%s", color_strings[indent_color],
              name, verb, color_strings[speech_color], quote);
      indent_chars = 1 + strlen(name) + strlen(verb) + strlen(quote);
    }
  else if (strlen(verb) != 1 && strlen(name) != 0)
    {
      sprintf(buffer, "%s%s %s %s%s", color_strings[indent_color],
              name, verb, color_strings[speech_color], quote);
      indent_chars = 2 + strlen(name) + strlen(verb) + strlen(quote);
    }
  start = text;
  while (strlen(start) > max_chars_per_line)
    {
      /* Search backwards up to MAX_WORD_LENGTH characters for a space. */
      for (end = start + max_chars_per_line, pos = 0;
           *end != ' ' && pos != LCL_MAX_WORD_LENGTH;
           pos++, end--);

      /* If we didn't find a space, we need to go ahead and just cut the word 
         off at the maximum length */
      if (pos == LCL_MAX_WORD_LENGTH)
        {
          strncat (buffer, start, max_chars_per_line);
          strcat (buffer, "\n");
          start += max_chars_per_line;
        }
      /* Otherwise, cut the word off nicely at the space */
      else
        {
          strncat(buffer, start, end - start);
          strcat(buffer, "\n");
          start = end + 1;
        }
      /* Indent the next line to be under the previous text */
      for (pos = 0; pos < indent_chars; pos++)
        strcat(buffer, " ");
      /* Put in the color text, since a newline has passed */
      strcat(buffer, color_strings[speech_color]);
    }
  /* Tack on the last line of text, the end quote mark, and a newline */
  strcat (buffer, start);
  strcat (buffer, quote);
  strcat (buffer, "\n");
  return buffer; /* Return the created buffer to the caller */
}

void showemail(void)
{
  PERSONA d;
  int b;
  
  if (brkword () == -1)
    {
      bprintf("Get whose email address?\n");
      return;
    }
  if ((b = fpbns (wordbuf)) != -1 && seeplayer (b))
    {
      if (b < max_players)
        {
          player2pers (&d, NULL, b);
	}
      else
	{
	  bprintf("Mobiles do not have email addresses, Silly.\n");
	  return;
	}
    }
  else
    {
      bprintf ("Who's that?\n");
      return;
    }
  if (b >= max_players)
    {
      bprintf("Mobiles do not have email addresses, Silly.\n");
      return;
    }
  bprintf("&+R%s's email address is:&+W  %s&*\n", d.p_name, d.p_email);
}

void nodcom(void)
{
  
  if (pl1 == -1)
    {
      bprintf("You nod.\n");
      sillycom("\001s%s\003%s nods.\n\003");
    }
  else
    {
      sillytp(pl1, "nods in agreement with you.");
      bprintf("You nod in agreement with %s.\n", him_or_her(pl1));
    }
}

void rawcom()
{
  char x[MAX_COM_LEN], y[MAX_COM_LEN];
  
  if (!ptstflg(mynum, PFL_RAW))
    {
      erreval();
      return;
    }
  getreinput(x);
  sprintf(y, "&+R** SYSTEM :&* %s\a\a\n", x);
  send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_GOD, LVL_MAX, NOBODY,
           mynum,"[%s RAW'd]\n", pname(mynum));
  broad(y);
}

void namerawcom()
{
  char x[MAX_COM_LEN], y[MAX_COM_LEN];
  
  if (!ptstflg(mynum, PFL_NAMERAW))
    {
      erreval();
      return;
    }
  getreinput(x);
  sprintf(y, "&+R** SYSTEM <%s> :&* %s\a\a\n", pname(mynum), x);
  broad(y);
}

void wishcom (void)
{
  char x[MAX_COM_LEN];
  
  if (EMPTY (item1))
    {
      bprintf ("Wish for what?\n");
      return;
    }
  if (ltstflg(ploc(mynum), LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD))
    {
      bprintf ("I bet you do!  I would too.\n");
      return;
    }
  getreinput (x);
  send_msg (DEST_ALL, MODE_QUIET, LVL_APPREN, LVL_MAX, NOBODY, NOBODY,
            "[&+CWish from \001p%s\003&*]\n[&+C%s&*]\n", pname (mynum), x);
  sillycom ("\001s%s\002%s begs and grovels to the powers that be.\n\003");
  if (!ststflg(mynum, SFL_SAYBACK))
    {
      bprintf ("Ok\n");
    }
}

void conversecom(void)
{
  if (cur_player->converse.active) 
    {
      bprintf("You are already in converse mode. Type ** to exit.\n");
      bprintf("To execute a command as normal start it with * '*nod'.\n");
    }
  else 
    {
      cur_player->converse.active = True;
      strcpy(cur_player->converse.old_prompt,cur_player->prompt);
      if ((cur_player->converse.talking_to = pl1) == -1) 
        {
          bprintf("&+WYou are now in converse mode. Type ** to exit.&*\n");
          strcpy(cur_player->prompt,": ");
        }
      else 
        {
          bprintf("You are conversing with %s.  Type ** to quit.\n",pname(pl1));
          sprintf(cur_player->prompt,"[%s]: ",pname(pl1));
        }
    }
}

void tellcom (void)
{
  int b;
  char *buffer;
 
  if (EMPTY (item1))
    {
      bprintf ("Tell who?\n");
      return;
    }
#ifdef INTERMUD
  if(strchr(item1,'@')) 
    { 
      imTell(); 
      return; 
    }
#endif
  if (ltstflg(ploc(mynum), LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD)) 
    {
      bprintf ("I think you are the one that needs the telling.\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 (pl1 >= max_players)
    {
      bprintf("What's the use in talking to a mobile?\n");
      return;
    }
  if (EMPTY (txt2))
    {
      bprintf ("What do you want to tell them?\n");
      return;
    }
  if (ststflg(mynum, SFL_GHOST)) 
    {
      bprintf("As hard as you try, in your ghostly form you cannot communicate.\n");
      return; 
    }
  if (plev(mynum) < LVL_DEMI && ploc(pl1) != ploc(mynum) &&
      (ltstflg(ploc(mynum), LFL_SOUNDPROOF) ||
       ltstflg(ploc(pl1), LFL_SOUNDPROOF)))
    {
      bprintf("Your message can't get through the thick walls %s.\n",
	      ltstflg(ploc(mynum), LFL_SOUNDPROOF) ? "here" : "there");
      return;
    }
  if (plev(mynum) < plev(pl1) && check_busy(pl1))
    {
      return;
    }
  else if (plev(mynum) >= plev(pl1) && ststflg(pl1, SFL_BUSY) &&
	   (players[pl1]. aliased || players[pl1].polymorphed != -1))
    {
      bprintf("%s isn't %sself right now..\n", pname(pl1), him_or_her(pl1));
      return;
    }
#ifdef SFL_AWAY
  if (ststflg(pl1,SFL_AWAY)) 
    {
      bprintf ("%s is marked as being away, so %s may not answer immediately.\n",
               pname(pl1), psex(pl1) ? "she" : "he");
    }
  if (ststflg(mynum, SFL_AWAY)) 
    {
      if (plast_cmd(mynum) < 0)
  	{
          bprintf ("Note: You're still marked as 'idle'.\n");
        }
      else
	{
          bprintf("Note: You're still marked as 'away'.\n");
	}
    }
#endif
  if (players[pl1].inmailer)
   bprintf ("%s is in the mailer, %s may not answer immediately.\n", pname(pl1),
            he_or_she(pl1));
  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.");
    }
  if (ststflg(mynum, SFL_SAYBACK))
    {
      buffer = build_voice_text ("You tell",
                                           pname(b),
                                           txt2,
                                           "'",
                                           COLOR_NONE,
                                           COLOR_HILIGHT_CYAN);
      bprintf("%s", buffer); 
    }
  buffer = build_voice_text (see_name (b, mynum),
                                           "tells you",
                                           txt2,
                                           "'",
                                           COLOR_NONE,
                                           COLOR_HILIGHT_CYAN);
  sendf(b,"%s", buffer);
  if (!ststflg(mynum, SFL_SAYBACK))
  bprintf("Ok.\n");
}

void saycom (void)
{
  char foo[MAX_COM_LEN];
  char *buffer;
 
  getreinput (foo);
  if (EMPTY (txt1))
    {
      bprintf ("What do you want to say?\n");
      return;
    }
  if (ststflg(mynum, SFL_GHOST)) 
    {
      bprintf("As hard as you try, in your ghostly form you cannot communicate.\n");
      return; 
    }
  getreinput(foo);
  if (ststflg(mynum, SFL_SAYBACK))
    {
      buffer = build_voice_text ("",
                                           "You say",
                                           foo,
                                           "'",
                                           COLOR_NONE,
                                           COLOR_HILIGHT_CYAN);
      bprintf("%s", buffer);
    }
  else
    {
      bprintf("Ok.\n");
    }
  buffer = build_voice_text (pname (mynum),
                                           "says",
                                           foo,
                                           "'",
                                           COLOR_NONE,
                                           COLOR_HILIGHT_CYAN);
  send_msg(ploc(mynum), MODE_NODEAF, LVL_MIN, LVL_MAX, mynum, NOBODY, "%s",buffer);
}

extern char * shout_test (int player, int sender, char *text)
{
  static char buff[MAX_COM_LEN];

  if((player == sender) || (plev(player) >= LVL_APPREN && 
      ststflg(player, SFL_NOSHOUT)) || (plev(player) < LVL_APPREN && 
      ststflg(player, SFL_DEAF)) || (ltstflg(ploc(player), LFL_SOUNDPROOF) &&
      ploc(sender) != ploc(player))) return NULL;
  
  if (plev (player) >= LVL_APPREN || plev (sender) >= LVL_APPREN
      || ploc (player) == ploc (sender) || (sender >= max_players))
    {
      sprintf (buff, "%s shouts '&+C%s&*'\n", see_name (player, sender), text);
    }
  else
    {
      sprintf (buff, "A voice shouts '&+C%s&*'\n", text);
    }
  return buff;
}

void shoutcom (void)
{
  char blob[MAX_COM_LEN];

  if (ltstflg(ploc(mynum), LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD)) 
    {
      bprintf ("Your shouting is absorbed by the walls.\n");
      return;
    }
  if (plev (mynum) < LVL_APPREN && ststflg (mynum, SFL_NOSHOUT))
    {
      bprintf ("I'm sorry, you can't shout anymore.\n");
    }
  else if (ltstflg(ploc(mynum), LFL_SOUNDPROOF) && (plev(mynum) < LVL_DEMI))
    {
      bprintf("The world around you seems to absorb your cries.\n");
      return;
    }
  else if (ststflg(mynum, SFL_GHOST)) 
    {
      bprintf("As hard as you try, in your ghostly form you cannot communicate.\n");
      return; 
    }
  else
    {
      getreinput (blob);
      if (EMPTY (blob))
        {
          bprintf ("What do you want to shout?\n");
        }
      else
   	{
          send_g_msg (DEST_ALL, shout_test, mynum, blob);
	}
      if (!ststflg(mynum, SFL_SAYBACK))
 	{
          bprintf("Ok.\n");
	}
    }
  if (ststflg(mynum, SFL_SAYBACK))
    {
      bprintf ("You shout : &+C%s&*\n", blob);
    }
}

void emoteallcom (void)
{
  char input[1024];

  if (EMPTY(item1))
    {
      bprintf("What?\n");
      return;
    }
  if (ltstflg(ploc(mynum), LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD))
    {
      bprintf ("Your emotions are probably what got you in here.\n");
      return;
    }
  if (ststflg(mynum, SFL_GHOST)) 
    {
      bprintf("You find that your ghostly form cannot communicate.\n");
      return; 
    }
  if (!ptstflg (mynum, PFL_EMOTE) && (!ltstflg(ploc(mynum), LFL_PARTY)))
    {
      bprintf ("You can't do that.\n");
      return;
    }
  if (plev(mynum) < LVL_APPREN)
    {
      bprintf("You are not allowed to do this.\n");
      return;
    }
  getreinput(input);
  if (ststflg(mynum, SFL_SAYBACK))
    {
      bprintf("&+CYour emoteall looked like this --&*\n");
      if (pvis(mynum) > 0)
        bprintf("(%s) %s\n", pname(mynum), input);
      else
   	bprintf("%s %s\n", pname(mynum), input);
    }
  else
    {
      bprintf("Ok.\n");
    }
  if (pvis(mynum) > 0)
    {
      send_msg (DEST_ALL, 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
    	        "\001p(%s)\003 %s\n", pname (mynum), input);
    }
  else
    {
      send_msg(DEST_ALL, 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
               "\001p%s\003 %s\n", pname(mynum), input);
    }
}

void emotetocom (void)
{

  if (EMPTY(item1))
    {
      bprintf("What?\n");
      return;
    }
  if (ltstflg(ploc(mynum), LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD))
    {
      bprintf ("Your emotions are probably what got you in here.\n");
      return;
    }
  if (ststflg(mynum, SFL_GHOST)) 
    {
      bprintf("You find that your ghostly form cannot communicate.\n");
      return; 
    }
  if (!ptstflg (mynum, PFL_EMOTE) && (!ltstflg(ploc(mynum), LFL_PARTY)))
    {
      bprintf ("You can't do that.\n");
      return;
    }
  if (plev(mynum) < LVL_APPREN)
    {
      bprintf("You are not allowed to do this.\n");
      return;
    }
  if (pl1 < 0)
    {
      bprintf("No one with that name is playing.\n");
      return;
    }
  if (mynum == pl1)
    {
      bprintf("What's the point in that?\n");
      return;
    }
  if (ststflg(mynum, SFL_SAYBACK))
    {
      bprintf("&+CYour emoteto looked like this --&*\n");
      if (pvis(mynum) > 0)
        bprintf("(%s) %s\n", pname(mynum), txt2);
      else
   	bprintf("%s %s\n", pname(mynum), txt2);
    }
  else 
    {
      bprintf("Ok.\n");
    }
  sendf(pl1, "\001p%s\003 %s\n", pname(mynum), txt2);
}

void emotecom (void)
{
  char input[1024];

  if (EMPTY(item1))
    {
      bprintf("What?\n");
      return;
    }
  if (ltstflg(ploc(mynum), LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD))
    {
      bprintf ("Your emotions are probably what got you in here.\n");
      return;
    }
  if (ststflg(mynum, SFL_GHOST)) 
    {
      bprintf("You find that your ghostly form cannot communicate.\n");
      return; 
    }
  if (!ptstflg (mynum, PFL_EMOTE) && (!ltstflg(ploc(mynum), LFL_PARTY)))
    {
      bprintf ("You can't do that.\n");
      return;
    }
  getreinput(input);
  if (ststflg(mynum, SFL_SAYBACK))
    {
      bprintf("&+CYour emote looked like this --&*\n");
      if (pvis(mynum) > 0)
        bprintf("(%s) %s\n", pname(mynum), input);
      else
   	bprintf("%s %s\n", pname(mynum), input);
    }
  else 
    {
      bprintf("Ok.\n");
    }
  send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
           "\001p%s\003 %s\n", pname(mynum), input);
}

void echocom (void)
{
  char input[1024];

  if (!ptstflg(mynum, PFL_ECHO))
    {
      bprintf("You hear echoes.\n");
      return;
    }
  getreinput(input);
  if (ststflg(mynum, SFL_SAYBACK))
    {
      bprintf("You echo : %s\n", input);
    }
  else
    {
      bprintf("Ok.\n");
    }
  send_msg(ploc(mynum), MODE_QUIET|MODE_COLOR, LVL_GOD, LVL_MAX, NOBODY, 
           mynum, "[%s has ECHOed : %s]\n", pname(mynum), input);
  sendf(ploc(mynum), "%s\n", input);
}
    
void echotocom (void)
{
 
  if (!ptstflg(mynum, PFL_ECHO))
    {
      bprintf("You hear echoes.\n");
      return;
    }
  if (pl1 < 0)
    {
      bprintf("No one with that name is playing.\n");
      return;
    }
  if (mynum == pl1)
    {
      bprintf("What's the point in that?\n");
      return;
    }
  if (ststflg(mynum, SFL_SAYBACK))
    {
      bprintf("You echoto %s : %s\n", pname(pl1), txt2);
    }
  else
    {
      bprintf("Ok.\n");
    }
  sendf(pl1, "%s\n", txt2);
  send_msg(ploc(mynum), MODE_QUIET|MODE_COLOR, LVL_GOD, LVL_MAX, NOBODY, 
           mynum, "[%s has ECHOTOed %s : %s]\n", pname(mynum), pname(pl1), txt2);
}

void echoallcom (void)
{
  char input[1024];

  if (!ptstflg(mynum, PFL_ECHOALL))
    {
      bprintf("You hear echoes.\n");
      return;
    }
  getreinput(input);
  if (ststflg(mynum, SFL_SAYBACK))
    {
      bprintf("You echoall : %s\n", input);
    }
  else
    {
      bprintf("Ok.\n");
    }
  sendf(DEST_ALL, "%s\n", input);
  send_msg (DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_GOD, LVL_MAX, NOBODY,
            mynum, "[%s has ECHOALLed]\n", pname(mynum));
}