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", "protected" oder
    "private" 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
