// MorgenGrauen MUDlib
//
// comm.c
//
// $Id: comm.c 8755 2014-04-26 13:13:40Z Zesstra $
#pragma strict_types
#pragma save_types
#pragma range_check
#pragma no_clone

#include <wizlevels.h>
#include <magier.h>
#define NEED_PROTOTYPES
#include <thing/properties.h>
#include <thing/description.h>
#include <player.h>
#include <properties.h>


//                           ###########
//############################ ECHOALL ################################
//                           ###########

static int _echoall(string str)
{
  if (!(str=_unparsed_args()))
    return USAGE("echoall <text>\n");
  str=break_string(str);
  shout(str);
  printf(str);
  return 1;
}

//                           ##########
//############################ ECHOTO #################################
//                           ##########

static int _echoto(string str)
{
  object ob;
  string who;
  string msg;

  if (!(str=_unparsed_args())||sscanf(str, "%s %s", who, msg) != 2)
    return USAGE("echoto <spieler> <text>\n");
  ob = find_player(lower_case(who));
  if (!ob)
  {
    printf("echoto: Es ist kein Spieler '%s' eingeloggt.\n",who);
    return 1;
  }
  msg=break_string(msg,78);
  tell_object(ob,msg);
  printf("%s->%s",({string})ob->Name(WEN),msg);
  return 1;
}

//                           #########
//############################ MECHO ##################################
//                           #########

static int _mecho(string str)  {
  object *who;
  int i;

  if (!sizeof(str=_unparsed_args()))
    return USAGE("mecho <text>\n");
  who=users();
  i=sizeof(who);
  while(i--)if (IS_LEARNER(who[i]))
      tell_object(who[i], break_string(str,78));
  return 1;
}

//                            ########
//############################# PING ##################################
//                            ########

static int _ping(string str)
{
  object pl;

  if (!sizeof(str))
    return USAGE("ping <spielername>\n");
  if (!(pl=find_player(lower_case(str))))
    return
      _notify_fail(sprintf("ping: Spieler %s nicht gefunden.\n",
                           capitalize(str))),0;
  tell_object(pl,sprintf("%s pingt Dich an.\a\n",capitalize(getuid())));
  return printf("PINGGGGGGG! DAS sollte %s auf Dich aufmerksam "
                "gemacht haben.\n",capitalize(getuid(pl))),1;
}

//                           ##########
//############################ OROPAX #################################
//                           ##########

int _oropax(string cmdline)
{
  int level,old,new;

  cmdline=_unparsed_args();
  old=QueryProp(P_EARMUFFS);
  if (!sizeof(cmdline)||cmdline=="0")
  {
    if (old)
    {
      printf("Du nimmst das Oropax aus Deinen Ohren und hoerst "
             "wieder allen anderen zu.\n");
      SetProp(P_EARMUFFS, 0);
    }
    else
      printf("Du hast doch gar kein Oropax in den Ohren.\n");
    return 1;
  }
  if (sscanf(cmdline, "%d", level) == 0 || level < 1)
    return USAGE("oropax [<magierlevel>]\n");
  if ((new=SetProp(P_EARMUFFS, level))==level)
  {
    if (new==old)
      return printf("Du hattest Deine Oropaxmenge schon auf Magierlevel "
                    "%d angepasst.\n",level),1;
    if (new>old)
      return printf("Du stopfst Dir soviel Oropax in die Ohren, dass "
                    "Du nur noch %s ab\nLevel %d hoerst.\n",
                    level>=LEARNER_LVL?"Magier":"Seher",level),1;
    return printf("Du nimmst soviel Oropax aus den Ohren, dass Du ab "
                  "sofort wieder %s ab\nLevel %d verstehst.\n",
                  level>=LEARNER_LVL?"Magier":"Seher",level),1;
  }
  return printf("Du stopfst und stopfst, bis Dir das Oropax wieder zur "
                "Nase herauskommt.\nLeider musst Du damit Magier ab Level "
                "%d weiterhin hoeren.\n",new),1;
}

//                         ###################
//########################## INITIALISIERUNG #############################
//                         ###################

static mixed _query_localcmds()
{
  return
    ({({"oropax","_oropax",0,LEARNER_LVL}),
      ({"echoto","_echoto",0,LEARNER_LVL}),
      ({"echoall","_echoall",0,LEARNER_LVL}),
      ({"mecho","_mecho",0,LEARNER_LVL}),
      ({"ping","_ping",0,LEARNER_LVL})});
}
