/* Do not remove the headers from this file! see /USAGE for more info. */

//:PLAYERCOMMAND
//
// Syntax: <say MESSAGE>
//         <say /last>
//
// This command is used to talk with others in the same room as you.
// It is done in a common language that everybody can understand.
// The /last and /history syntaxes will display your say history.

inherit CMD;
inherit M_GRAMMAR;

#ifdef SAY_HISTORY_IN_ROOMS
# define HISTORY_OB environment(this_body())
#else
# define HISTORY_OB this_body()
#endif

void create()
{
  ::create();
  no_redirection();
}

private void main(string str)
{
  string array msgs;
  object array others = ({});
  object ob;

// Collect speech recipients upwards through environments,
// where proper. Not possible to use normal message propagation
// if you want to save say history in the body object.
// -- Marroc
  ob = this_body();
  while (ob && ob->environment_can_hear())
  {
    others += all_inventory(environment(ob)) - ({ ob });
    ob = environment(ob);
  }

  if (!str || str == "")
  {
    out("Say what?\n");
    return;
  }
  switch(explode(str," ")[0])
  {
    string array out=({});
    case "/last":
    case "/history":
      out=({"History of says:\n"});
      msgs=HISTORY_OB->list_say_history();
      if(sizeof(msgs))
        out+=msgs;
      else
        out+=({"\t<none>"});
      more(out);
      break;
    default:
      msgs=this_body()->action(({this_body()}),
          "%^SAY%^$N $vsay:%^RESET%^ $o",
          punctuate(str));
      this_body()->inform(({this_body()}),msgs,others);
#ifndef SAY_HISTORY_IN_ROOMS
      HISTORY_OB->add_say_history(msgs[0]);
      others->add_say_history(msgs[1]);
#else
      HISTORY_OB->add_say_history(msgs[1]);
#endif
  }
}

nomask int valid_resend(string ob)
{
  return ob == "/cmds/player/converse";
}