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
---------

.. code-block:: pike

     ...
     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:
      :doc:`../props/P_LOCALCMDS`
    Fehlermeldungen:
      :doc:`../efun/notify_fail`, :doc:`../sefun/_notify_fail`
    Argumentstring:
      :doc:`../efun/query_verb`, :doc:`_unparsed_args`
    Sonstiges:
      :doc:`../sefun/replace_personal`, :doc:`../efun/enable_commands`
    Alternativen:
      :doc:`AddCmd`, :doc:`../efun/add_action`

24. Maerz 2004 Gloinson

