/
/*
  SillyMUD Distribution V1.1b             (c) 1993 SillyMUD Developement
 
  See license.doc for distribution terms.   SillyMUD is based on DIKUMUD
*/

#include <stdio.h>
#include <string.h>

#include "protos.h"

#define BIRD_NOISE_NUM 4	/* how many noises we have, in constants.c */
#define RAT_NOISE_NUM  3
/* extern variables */

extern struct room_data *world;
extern struct descriptor_data *descriptor_list;
extern const char *rat_noises[];
extern const char *half_orc_words[];
extern const char *half_orc_noises[];
extern const char *ogre_speak[];

void do_say(struct char_data *ch, char *argument, int cmd)
{
  char buf[MAX_INPUT_LENGTH+40], buf2[MAX_INPUT_LENGTH+40];
  
  if (apply_soundproof(ch))
    return;
  
  /*  for (i = 0; *(argument + i) == ' '; i++); */
  for (; *argument == ' '; argument++);
  
  if (!*(argument))
    send_to_char("Yes, but WHAT do you want to say?\n\r", ch);
  else {
    if (IS_NPC(ch)||(IS_SET(ch->specials.act, PLR_ECHO))) {
      sprintf(buf,"You say '%s'\n\r", argument);
      send_to_char(buf, ch);
    }

    if(GET_RACE(ch) == RACE_OGRE) {
      ogre_garble(argument, buf2, ch);
      sprintf(buf, "$n says '%s'", buf2);
    } else if( GET_RACE(ch) == RACE_DRAAGDIM ) {
      rat_garble(argument, buf2, ch);
      sprintf(buf, "$n says '%s'", buf2);
    } else if(GET_RACE(ch) == RACE_HALFORC) {
      half_orc_garble(argument, buf2, ch);
      sprintf(buf, "$n says '%s'", buf2);
    } else {
      sprintf(buf,"$n says '%s'", argument);
    }
    act(buf,FALSE,ch,0,0,TO_ROOM);
  }
}




void do_shout(struct char_data *ch, char *argument, int cmd)
{
  char buf1[MAX_INPUT_LENGTH+40], buf2[MAX_INPUT_LENGTH+40];
  struct descriptor_data *i;
  extern int Silence;
  
  if (!IS_NPC(ch) && IS_SET(ch->specials.act, PLR_NOSHOUT)) {
    send_to_char("You can't shout!!\n\r", ch);
    return;
  }

  if (IS_NPC(ch) && 
      (Silence == 1) &&
      (IS_SET(ch->specials.act, ACT_POLYSELF))) {
    send_to_char("Polymorphed shouting has been banned.\n\r", ch);
    send_to_char("It may return after a bit.\n\r", ch);
    return;
  }

  if (apply_soundproof(ch))
    return;
  
  for (; *argument == ' '; argument++);
  
  if (ch->master && IS_AFFECTED(ch, AFF_CHARM)) {
    if (!IS_IMMORTAL(ch->master)) {
      send_to_char("I don't think so :-)", ch->master);
      return;
    }
  }
  
  if (!(*argument))
    send_to_char("Shout? Yes! Fine! Shout we must, but WHAT??\n\r", ch);
  else	{
    if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
      sprintf(buf1,"You shout '%s'\n\r", argument);
      send_to_char(buf1, ch);
    }

    if(GET_RACE(ch) == RACE_DRAAGDIM) {
      rat_garble(argument, buf2, ch);
      sprintf(buf1, "$n shouts '%s'", buf2);
    } else if(GET_RACE(ch) == RACE_HALFORC) {
      half_orc_garble(argument, buf2, ch);
      sprintf(buf1, "$n shouts '%s'", buf2);
    } else if(GET_RACE(ch) == RACE_OGRE) {
      ogre_garble(argument, buf2, ch);
      sprintf(buf1, "$n shouts '%s'", buf2);
    } else {
      sprintf(buf1, "$n shouts '%s'", argument);
    }

    act("$n lifts up $s head and shouts loudly", TRUE, ch, 0, 0, TO_ROOM);
    
    GET_MOVE(ch) -= 2;
    
    for (i = descriptor_list; i; i = i->next)
      if (i->character != ch && !i->connected &&
	  (IS_NPC(i->character) ||
	   (!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
	    !IS_SET(i->character->specials.act, PLR_DEAF))) &&
	  !check_soundproof(i->character)) {
	  act(buf1, 0, ch, 0, i->character, TO_VICT);
      }
  }
}

void do_commune(struct char_data *ch, char *argument, int cmd)
{
  static char buf1[MAX_INPUT_LENGTH];
  struct descriptor_data *i;
  
  
  for (; *argument == ' '; argument++);
  
  if (!(*argument))
    send_to_char("Communing among the gods is fine, but WHAT?\n\r",ch);
  else {
    if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
      sprintf(buf1,"You think '%s'\n\r", argument);
      send_to_char(buf1, ch);
    }
    sprintf(buf1, "$n thinks '%s'", argument);
    
    for (i = descriptor_list; i; i = i->next)
      if (i->character != ch && !i->connected && !IS_NPC(i->character) &&
	  !IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
	  (GetMaxLevel(i->character) >= LOW_IMMORTAL))
	act(buf1, 0, ch, 0, i->character, TO_VICT);
  }
}


void do_tell(struct char_data *ch, char *argument, int cmd)
{
  struct char_data *vict;
  char name[100], message[MAX_INPUT_LENGTH+20],
  buf[MAX_INPUT_LENGTH+60], buf2[MAX_INPUT_LENGTH+60];

  if (apply_soundproof(ch))
    return;
  
  half_chop(argument,name,message);

  if(!*name || !*message) {
    send_to_char("Who do you wish to tell what??\n\r", ch);
    return;
  } else if (!(vict = get_char_vis(ch, name))) {
    send_to_char("No-one by that name here..\n\r", ch);
    return;
  } else if (ch == vict) {
    send_to_char("You try to tell yourself something.\n\r", ch);
    return;
  } else if (GET_POS(vict) == POSITION_SLEEPING)	{
    act("$E is asleep, shhh.",FALSE,ch,0,vict,TO_CHAR);
    return;
  } else if (IS_NPC(vict) && !(vict->desc)) {
    send_to_char("No player here by that name...\n\r", ch);
    return;
  } else if (!vict->desc) {
    send_to_char("They can't hear you, they are link dead.\n\r", ch);
    return;
  }
  
  if (check_soundproof(vict))
    return;
  
  if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) { 
    sprintf(buf,"You tell %s '%s'\n\r",
	 (IS_NPC(vict) ? vict->player.short_descr : GET_NAME(vict)), message);
    send_to_char(buf, ch);
  }

  if(GET_RACE(ch) == RACE_DRAAGDIM) {
    rat_garble(message, buf2, ch);
    sprintf(buf,"$n tells you '%s'", buf2);
  } else if(GET_RACE(ch) == RACE_HALFORC) {
    half_orc_garble(message, buf2, ch);
    sprintf(buf,"$n tells you '%s'", buf2);
  } else if(GET_RACE(ch) == RACE_OGRE) {
    ogre_garble(message, buf2, ch);
    sprintf(buf,"$n tells you '%s'", buf2);
  } else {
    sprintf(buf,"$n tells you '%s'", message);
  }
  act(buf, TRUE, ch, 0, vict, TO_VICT);
  /* send_to_char(buf, vict); */
}



void do_whisper(struct char_data *ch, char *argument, int cmd)
{
  struct char_data *vict;
  char name[100], message[MAX_INPUT_LENGTH],
  buf[MAX_INPUT_LENGTH];

	if (apply_soundproof(ch))
	  return;
  
  half_chop(argument,name,message);
  
  if(!*name || !*message)
    send_to_char("Who do you want to whisper to.. and what??\n\r", ch);
  else if (!(vict = get_char_room_vis(ch, name)))
    send_to_char("No-one by that name here..\n\r", ch);
  else if (vict == ch) {
    act("$n whispers quietly to $mself.",FALSE,ch,0,0,TO_ROOM);
    send_to_char
      ("You can't seem to get your mouth close enough to your ear...\n\r",ch);
  }  else    {
    if (check_soundproof(vict))
      return;
    
    sprintf(buf,"$n whispers to you, '%s'",message);
    act(buf, FALSE, ch, 0, vict, TO_VICT);
    if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
      sprintf(buf,"You whisper to %s, '%s'\n\r",
	      (IS_NPC(vict) ? vict->player.name : GET_NAME(vict)), message);
      send_to_char(buf, ch);
    }
    act("$n whispers something to $N.", FALSE, ch, 0, vict, TO_NOTVICT);
  }
}


void do_ask(struct char_data *ch, char *argument, int cmd)
{
  struct char_data *vict;
  char name[100], message[MAX_INPUT_LENGTH],
  buf[MAX_INPUT_LENGTH];

	if (apply_soundproof(ch))
	  return;
  
  half_chop(argument,name,message);
  
  if(!*name || !*message)
    send_to_char("Who do you want to ask something.. and what??\n\r", ch);
  else if (!(vict = get_char_room_vis(ch, name)))
    send_to_char("No-one by that name here..\n\r", ch);
  else if (vict == ch)	{
    act("$n quietly asks $mself a question.",FALSE,ch,0,0,TO_ROOM);
    send_to_char("You think about it for a while...\n\r", ch);
  }  else	{
	if (check_soundproof(vict))
	  return;

    sprintf(buf,"$n asks you '%s'",message);
    act(buf, FALSE, ch, 0, vict, TO_VICT);
    
    if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
      sprintf(buf,"You ask %s, '%s'\n\r",
	    (IS_NPC(vict) ? vict->player.name : GET_NAME(vict)), message);
      send_to_char(buf, ch);
    }
    act("$n asks $N a question.",FALSE,ch,0,vict,TO_NOTVICT);
  }
}



#define MAX_NOTE_LENGTH 1000      /* arbitrary */

void do_write(struct char_data *ch, char *argument, int cmd)
{
  struct obj_data *paper = 0, *pen = 0;
  char papername[MAX_INPUT_LENGTH], penname[MAX_INPUT_LENGTH],
       buf[MAX_STRING_LENGTH];
  
  argument_interpreter(argument, papername, penname);
  
  if (!ch->desc)
    return;
  
  if (!*papername)  /* nothing was delivered */    {   
      send_to_char("write (on) papername (with) penname.\n\r", ch);
      return;
    }

  if (!*penname) {
      send_to_char("write (on) papername (with) penname.\n\r", ch);
      return;
  }
  if (!(paper = get_obj_in_list_vis(ch, papername, ch->carrying)))	{
	  sprintf(buf, "You have no %s.\n\r", papername);
	  send_to_char(buf, ch);
	  return;
   }
   if (!(pen = get_obj_in_list_vis(ch, penname, ch->carrying)))	{
	  sprintf(buf, "You have no %s.\n\r", papername);
	  send_to_char(buf, ch);
	  return;
    }

  /* ok.. now let's see what kind of stuff we've found */
  if (pen->obj_flags.type_flag != ITEM_PEN) {
      act("$p is no good for writing with.",FALSE,ch,pen,0,TO_CHAR);
  } else if (paper->obj_flags.type_flag != ITEM_NOTE)    {
      act("You can't write on $p.", FALSE, ch, paper, 0, TO_CHAR);
  } else if (paper->action_description) {
    send_to_char("There's something written on it already.\n\r", ch);
    return;
  } else {
      /* we can write - hooray! */
      send_to_char
	("Ok.. go ahead and write.. end the note with a @.\n\r", ch);
      act("$n begins to jot down a note.", TRUE, ch, 0,0,TO_ROOM);
      ch->desc->str = &paper->action_description;
      ch->desc->max_str = MAX_NOTE_LENGTH;
    }
}

char *RandomWord()
{
  static char *string[55] = {
    "argle",
    "bargle",
    "glop",
    "glyph",
    "hussamah",			/* 5 */
    "rodina",
    "mustafah",
    "angina",
    "the",
    "fribble",			/* 10 */
    "fnort",
    "frobozz",
    "zarp",
    "ripple",
    "yrk",			/* 15 */
    "yid",
    "yerf",
    "oork",
    "grapple",
    "red",			/* 20 */
    "blue",
    "you",
    "me",
    "ftagn",
    "hastur",			/* 25 */
    "brob",
    "gnort",
    "lram",
    "truck",
    "kill",			/* 30 */
    "cthulhu",
    "huzzah",
    "acetacytacylic",
    "hydrooxypropyl",
    "summah",			/* 35 */
    "hummah",
    "cookies",
    "stan",
    "will",
    "wadapatang",		/* 40 */
    "pterodactyl",
    "frob",
    "yuma",
    "gumma",
    "lo-pan",			/* 45 */
    "sushi",
    "yaya",
    "yoyodine",
    "ren",
    "stimpy",			/* 50 */
    "blogark",
    "vacetophenetidin",
    "barbellate",
    "achoo",
    "hydrocephalus"		/* 55 */
      
  };

  return(string[number(0,54)]);

}

void do_sign(struct char_data *ch, char *argument, int cmd)
{
  int i;
  char buf[MAX_INPUT_LENGTH+40];
  char buf2[MAX_INPUT_LENGTH];
  char *p;
  int diff;
  struct char_data *t;
  struct room_data *rp;
    
  for (i = 0; *(argument + i) == ' '; i++);
  
  if (!*(argument + i))
    send_to_char("Yes, but WHAT do you want to sign?\n\r", ch);
  else	{

    rp = real_roomp(ch->in_room);
    if (!rp) return;

    if (!HasHands(ch)) {
      send_to_char("Yeah right... WHAT HANDS!!!!!!!!\n\r", ch);
      return;
    }

    strcpy(buf, argument+i);
    buf2[0] = '\0';
    /*
      work through the argument, word by word.  if you fail your
      skill roll, the word comes out garbled.
      */
    p = strtok(buf, " ");  /* first word */

    diff = strlen(buf);

    while (p) {
      if (ch->skills && number(1,75+strlen(p))<ch->skills[SKILL_SIGN].learned){
	strcat(buf2, p);
      } else {
	strcat(buf2, RandomWord());
      }
      strcat(buf2, " ");
      diff -= 1;
      p = strtok(0, " ");  /* next word */
    }
    /*
      if a recipient fails a roll, a word comes out garbled.
      */

    /*
      buf2 is now the "corrected" string.
      */

    sprintf(buf,"$n signs '%s'", buf2);

    for (t = rp->people;t;t=t->next_in_room) {
      if (t != ch) {
	if (t->skills && number(1,diff) < t->skills[SKILL_SIGN].learned) {
	  act(buf, FALSE, ch, 0, t, TO_VICT);
	} else {
	  act("$n makes funny motions with $s hands", 
	      FALSE, ch, 0, t, TO_VICT);	  
	}
      }
    }

    if (IS_NPC(ch)||(IS_SET(ch->specials.act, PLR_ECHO))) {
      sprintf(buf,"You sign '%s'\n\r", argument + i);
      send_to_char(buf, ch);
    }
  }
}

void bird_garble(char *buf, char *buf2, struct char_data *ch)
{
#if 0
  char *p;

  buf2[0] = '\0';
  
  p = strtok(buf, " ");
  
  while(p) {
    if(number(1,18) > GET_INT(ch)) {
      strcat(buf2, bird_noises[number(0,BIRD_NOISE_NUM)]);
      strcat(buf2, " ");
    }
    strcat(buf2, p);
    p = strtok(0, " ");
    if(p)
      strcat(buf2, " ");
  }
#endif
}

void rat_garble(char *buf, char *buf2, struct char_data *ch)
{
  char *p;

  buf2[0] = '\0';

  p = strtok(buf, " ");

  while(p) {
    if(number(1,18) > GET_INT(ch)) {
      strcat(buf2, rat_noises[number(0,RAT_NOISE_NUM)]);
      strcat(buf2, " ");
    }
    strcat(buf2, p);
    p = strtok(0, " ");
    if(p)
      strcat(buf2, " ");
  }
}

void ogre_garble(char *buf, char *buf2, struct char_data *ch)
{
  char *p;

  /* This always happens to ogres.  Always.  Roleplaying for the */
  /* imaginative impaired.  Cross our fingers, should be fun :)  */
  buf2[0] = '\0';

  p = strtok(buf, " ");

  switch(number(0,9)) {
  case 0:
    strcat(buf2, "Oy, ");
    break;
  case 1:
    strcat(buf2, "Oy slim, ");
    break;
  case 2:
    strcat(buf2, "Flippen' eck! ");
    break;
  case 3:
    strcat(buf2, "OY! ");
    break;
  default:
    break;
  }
  
  while(p) {
    if(IsArticle(p)) {
      if(number(1,20) > GET_INT(ch)) {
	strcat(buf2, p);
	strcat(buf2, " ");
	strcat(buf2,ogre_speak[number(0,36)]); /* see constants.c */
      } else {
	strcat(buf2, p);
      }
    } else {
      strcat(buf2, p);
    }
    p = strtok(0, " ");
    if(p)
      strcat(buf2, " ");
  }
}

void half_orc_garble(char *buf, char *buf2, struct char_data *ch)
{
  char *p;

  buf2[0] = '\0';

  p = strtok(buf, " ");		

  if(GET_INT(ch) < number(1,18)) {
    strcat(buf2, half_orc_words[number(0,14)]);
    strcat(buf2, ", ");
  }
  
  while(p) {
    if (number(1,18) > GET_INT(ch) && !number(0,1)) {
      strcat(buf2, half_orc_noises[number(0,5)]);
      strcat(buf2, " ");
    }
    strcat(buf2, p);
    p = strtok(0, " ");
    if(p)
      strcat(buf2, " ");
  }
  /*   if(!blah) {
    if(GET_INT(ch) < number(1,18)) {
      strcat(buf2, " ");
      strcat(buf2, half_orc_words[number(0,14)]);
      strcat(buf2, ".");
    }
  }
 */
}