FUNKTION:
void AddReaction(string verb, int modus, mixed action)
DEFINIERT IN:
/sys/npc/react.h
ARGUMENTE:
verb: Das Verb (oder Verbenliste), auf das reagiert werden soll
modus: In welchem Zusammenhang des Verb gebraucht worden sein soll
action: Eine Liste mit Kommandos als Reaktion
FUNKTION:
Die Kommandoliste actions wird abgearbeitet, wenn ein Spieler das
Verb verb im Kontext modus benutzt hat.
verb ist dabei die Normalform des Verbes, also wenn moeglich die
kuerzeste, mit 'e' endende Form. In Zweifelsfaellen kann man in
/global/handler/soul nachsehen, oder eine Liste via
"/std/player/soulhelp"->QueryActions() anfordern.
Sollen mehrere Verben mit einer identischen Reaktion versehen werden,
so kann statt eines einzelnen Verbs auch eine Verbenliste der
Art "verb1|verb2|verb3" angegeben werden.
Der modus gibt an, wie der Spieler das Verb benutzt haben muss, damit
die Reaktion erfolgt. Moegliche Werte sind z.B.
R_ME : Der Spieler interagiert mit uns
R_OTHER: Der Spieler interagiert mit jemand anderem
R_NOONE: Der Spieler interagiert mit niemand im besonderen
R_ALL : Alle Moeglichkeiten (R_ME|R_OTHER|R_NOONE)
Die Kommandoliste kann im einfachsten Fall ein String sein, der direkt
an command_me() weitergegeben wird; oder eine Closure, die dann
ausgefuehrt wird (siehe Hinweise zu Closures unten):
AddReaction("weine", R_ME|R_OTHER, "sag Och....");
Im String werden folgende Schluesselworte ersetzt:
&Name : Der (grossgeschriebene) Name des Spielers
&name : Die uid des Spielers
&Opfer : Der (grossgeschriebene) Name des 'Opfers'
&opfer : Die uid des 'Opfers'
&verb : Das verwendete Verb in der Normalform
&adverb: Eventuelle verwendete Adverbien
Es kann auch ein Array uebergeben werden, welches noch die Moeglich-
keiten zur Simulation einer Reaktionszeit, zufaelliges Auswaehlen
einer Reaktion und bedingtes Abbrechen der Kommandokette bietet:
({ 3, "sag Hallo", "30%schmunzle", "70%lach", "seufze" })
Es soll drei Sekunden gewartet werden, dann sagt der NPC "Hallo".
Mit 30% Wahrscheinlichkeit schmunzelt er nun, ansonsten lacht er.
Danach seufzt er sofort.
Die Prozentfelder duerfen immer nur 100% insgesamt haben, und sie
duerfen nicht durch andere Befehle unterbrochen sein - sie muessen
also hintereinander stehen. Wird keine Zahl angegeben so verwendet
der Befehl die restliche Wahrscheinlichkeit.
Soll auf ein Prozentfeld ein anderes folgen, so muss das Ende des
ersten durch ein '<' ("30%<lach") markiert, oder eine Zeitver-
zoegerung von Null Sekunden eingebaut werden.
Wird das Zeichen '|' ("30%|lach") verwendet, so wird die Kommando-
kette nur weiter abgearbeitet, wenn auch 'lach' ausgefuehrt wird.
Anstelle von Closures kann auch ein String der Form "#fun MyFun"
verwendet werden, der die Funktion 'MyFun' aufruft. So kann man
auch Funktionen Zufallsgesteuert aufrufen ("30%#fun DoIt").
Die Closures und Funktionen werden immer mit folgenden Argumenten
aufgerufen: Playerobject, Victimobject, Verb, Adverb.
Liefert die Closure oder Funktion einen String zurueck, so wird
dieser als Kommando ausgefuehrt, als sei er anstelle der Closure
angegeben gewesen (insbesondere werden o.g. Ersetzungen durchge-
fuehrt). Liefert die Closure oder Funktion NULL zurueck, so wird
die Befehlskette abgebrochen.
KURZUEBERBLICK:
Elemente im Kommandoarray:
0... Warte diese Zeitspanne in Sekunden
#fun myfun Rufe Funktion 'myfun' auf
30%cmd Werte mit 30% Wahrscheinlichkeit 'cmd' aus.
30%<cmd dito, aber Ende der Gruppe von alternativen Befehlen
30%|cmd dito, aber wenn cmd nicht ausgewertet wird Abbruch
%cmd Werte 'cmd' mit der restlichen Wahrscheinlichkeit aus
BEMERKUNG:
Es laeuft immer nur eine Befehlskette zur Zeit. Wird ein neues
Kommando von einem Spieler gegeben, auf welches wir reagieren,
so wird die Ausfuehrung der alten Befehlskette zugunsten der neuen
beendet. Vergleiche hierzu auch P_REACT_FLAGS.
BEISPIELE:
AddReaction("weine", R_NOONE, ({ 1, "sag Ooch &Name", 2,
"40%umarme &name", "30%umarme &name /troestend", "%knuddel &name",
2, "50%seufz /schwer", "50%<seufz", "90%denk ...&Name..." }));
Weint Fiona, so warte eine Sekunde, sag Ooch Fiona, warte zwei
Sekunden, umarme fiona mit 40% Wahrscheinlichkeit, umarme fiona
troestend mit 30% Wahrscheinlichkeit oder knuddel fiona mit der
restlichen Wahrscheinlichkeit bis 100 (30? ;). Dann warte zwei
Sekunden. Seufze 50:50 entweder normal oder schwer. Dann denke
...Fiona... mit 90% Wahrscheinlickeit (mit 10% tue nichts).
SIEHE AUCH:
RemoveReaction(L), command_me(L), command(E), getuid(E)
P_REACTIONS, P_REACT_FLAGS, PlayerTickles(L), PlayerTousles(L),
SetStandardReactions(L)
|