AddAction()
===========

AddAction(L)
------------
::

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

			P_LOCALCMDS
     Fehlermeldungen:	notify_fail(E), _notify_fail(E)
     Argumentstring:	query_verb(E), _unparsed_args(L)
     Sonstiges:		replace_personal(E), enable_commands(E)
     Alternativen:	AddCmd(L), add_action(E)

24. Maerz 2004 Gloinson

