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
