
command_me()
************


FUNKTION
========

   int command_me(string str)


ARGUMENTE
=========

   string str - auszufuehrendes Kommando


DEFINIERT IN
============

   /std/npc.c, /std/player/command.c


BESCHREIBUNG
============

   Fuehrt 'str' wie ein Kommando aus, welches direkt vom Living
   abgegeben wurde.

   Der Rueckgabewert ist >=1 fuer Erfolg und 0 fuer Misserfolg.
   Rueckgabewert ist im Erfolgsfall die Hoehe der EvalCost in Ticks.

   command_me() leitet den Befehl an command()(E) weiter und erlaubt
   dadurch auch den Aufruf von sonst durch "static" vor externem Aufruf
   geschuetzten Kommando-Funktionen.

   Kommandos mit oeffentlichen Kommandofunktionen (also damit alle mit
   AddCmd definierten Kommandos) koennen auch durch command()(E)
   von aussen ausgeloest werden.

BEMERKUNGEN:
   * beruecksichtigt Aliase, d.h. wenn man Aliase eines Spielers
     ignorieren will, muss man ein \ (fuer ein im Eingabestring) vor
     den Befehl stellen

   * fuer objektinterne Kommandos funktioniert also auch
     command()(E)


BEISPIEL
========

   (Code des Testraum ist in /doc/beispiele/testobjekte/command_me_testraum)
   // #1: Testraum, zwinge Spieler bei "schleiche heran" zum Furzen
   //     command_me() ist hier noetig, da das Furzen eine geschuetzte
   //     Kommandofunktion hat
   inherit "/std/room";

   void create() {
     ::create();
     AddCmd("schleiche&heran|herum", "action_schleichen");
   }



   void init() {
     ::init();
     add_action("action_kriechen", "kriech", 1);
   }

   static int action_schleichen(string str) {
     string tmp = this_player()->QueryProp(P_RACE);
     // ...
     if(tmp[<1]=='e') tmp=tmp[0..<2];
     write(break_string("Du versuchst leise zu schleichen, dabei passiert "
       "dir aber ein allzu "+
       (tmp=="Mensch"?"menschliches":lower_case(tmp)+"isches")+
       " Missgeschick. Verflucht!", 78));
     this_player()->command_me("\\furze");
     return 1;
   }



   static int action_kriechen(string str) {
     write(break_string("Deine Knie tun zu sehr weh dafuer.", 78));
     tell_room(this_object(), break_string(this_player()->Name(WER)+
       " knackt mit den Knien.", 78));
     return 1;
   }



   // #2 (in obigem Raum): zwinge Spieler in Raum zu obigem Kommando
   //    Beide Kommandos gelingen, da Kommando mit AddCmd definiert.
   find_player("naddl")->command_me("schleiche herum")
   command("schleiche herum", find_player("naddl"));

   // #3 (in obigem Raum): zwinge Spieler in Raum zu obigem Kommando
   find_player("naddl")->command_me("krieche")
   //    Folgendes Kommando schlaegt fehl, da Kommandofunktion static ist.
   command("krieche", find_player("naddl"));


SIEHE AUCH
==========

   enable_commands(E), command(E)

06 Sep 2012 Gloinson
