
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
