AddAction()
***********


FUNKTION
========

   varargs void AddAction(mixed fun, mixed cmd, int flag, int lvl);


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

   /std/player/command.c


ARGUMENTE
=========

   fun
      zu rufende Methode im Spieler oder eine Closure

   cmd
      ausloesendes Kommandoverb

   flag
      unscharf ausfuehren

   lvl
      ab welchem (Magierlevel) funktioniert das Kommando


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

   Vorweg: Da es keine (risikolose) Moeglichkeit gibt, ein so
   definiertes Kommando auch wieder zu entfernen, wird von der
   Verwendung eher abgeraten. Es sei denn, ihr wisst, dass euer
   Kommando nicht wieder (ohne ende/reboot) entfernt werden soll.

   Dem Spieler wird ein neues Kommando definiert. Dieses kann eine
   Methode in ihm sein, so wie bei allen Spielerkommandos ueblich,
   kann aber auch eine Closure (Lfun-Closure oder Lambda) enthalten.

   Mittels "flag" kann man die Kommandoerkennung unscharf halten, d.h.
   wie bei AddCmd(L) und add_action(E) wird ein 'cmd' bei 'flag = 1'
   auch schon von Praefix-Strings (hier ohne Leerzeichen) getriggert:
   AddAction([...], "muh", 1, 0) wird zB auch von 'muhtens' oder
   'muh4' ausgeloest.

   Mit "lvl" begrenzt man die Ausfuehrbarkeit. Spieler haben ein
   Magierlevel von 0, Seher von 1.

   Das Kommando wird in P_LOCALCMDS eingetragen. Diese Property wird
   nicht gespeichert! Effektiv kann man mit AddAction() ein kommando-
   gebendes Objekt im Spieler einsparen.


BEMERKUNGEN
===========

   * es gibt _noch_ kein RemoveAction! Per Hand in P_LOCALCMDS
     editieren kann zu ernsten Fehlern fuehren.

   * echte Spielerkommandos kann man damit _nicht_ ueberschreiben, ein
     AddAction(...,"sag",1,0); funktioniert nicht

   * ein generelles AddAction(...,"",1,0); geht nicht


BEISPIELE
=========

   ...
   this_player()->AddAction(symbol_function("zeige_mysterium",
                                            find_object(".../mystzeiger")),
                            "knorfula",0,0);
   write(break_string("Wann immer du jetzt das Kommando \"knorfula\" "
                      "eingibst, werden dir Mysterien enthuellt!",78));
   ...
   // im Objekt "knorfula" ...
   int zeige_mysterium(string str) {
     string myst;
     myst=environment(TP)->QueryMysterium(str);
     if(myst) {
       write("Du hast ein Mysterium entdeckt!\n");
       write(break_string(myst,78));
       say(break_string(
              TP->Name(WER)+" scheint nach kurzer Konzentration etwas "
              "entdeckt zu haben!",78));
     } else {
       write(break_string(
              "Leider entdeckst du trotz deiner magischen Faehigkeit "
              "kein Mysterium in deiner Umgebung.",78));
       say(break_string(
              TP->Name(WER)+" konzentriert sich sichtbar, sieht dann "
              "jedoch etwas enttaeuscht aus.",78));
     }
     return 1;
   }


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

   Properties:
      P_LOCALCMDS

   Fehlermeldungen:
      *../efun/notify_fail*, _notify_fail()

   Argumentstring:
      *../efun/query_verb*, _unparsed_args()

   Sonstiges:
      replace_personal(), *../efun/enable_commands*

   Alternativen:
      AddCmd(), *../efun/add_action*

24. Maerz 2004 Gloinson
