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