FUNKTION:
public int AddPromptModifier(string modi, closure cl)
IMPLEMENTIERT:
/std/player/prompt.c
ARGUMENTE:
modi - der Name des neuen Makros
cl - Closure die den Ersetzungstext zum Makro liefert
BESCHREIBUNG:
Mit dieser Funktion kann ein Objekt einem Spieler ein neues
Makro fuer die Prompt-Erzeugung bereitstellen ('hilfe prompt').
Baut der Spieler das Makro 'modi' in seinen Prompt ein, so wird
die Closure 'cl' ausgefuehrt, um den Ersetzungstext zu bestimmen.
Die Closure muss an eine Funktion des aufrufenden Objektes gebunden
sein, man kann also nicht 'im Namen eines anderen Objektes' anmelden.
pl->AddPromptModifier("XXX", #'funktion);
Die Funktion, auf die die Closure zeigt, muss wie folgt aussehen:
string funktion(string what) {
...
return "Ersetzung";
}
Als Argument bekommt sie das zu ersetzende Makro, so dass man
in einer Funktion auch mehrere verschiedene Makros behandeln
kann. Achtung: Vor dem Makro steht jeweils immer ein Schraegstrich,
Falls das Makro XXX hiess also \XXX (genauso wie es der Spieler
eingegeben hat). In Strings muss der '\' verdoppelt werden, also
entspricht dann "\\XXX" (siehe 'man escape').
Die Funktion muss einen String zurueckliefern. Wenn sie Null
zurueckliefert, wird sie automatisch ausgetragen. Will man keinen
Ersetzungstext (aber nicht ausgetragen werden, weil eventuell
spaeter doch Text ausgegeben werden soll), so muss man den
Leerstring "" zurueckliefern.
Makronamen duerfen nur aus Grossbuchstaben bestehen oder aus einem
einzelnen Kleinbuchstaben. Also "a", "x", "BLAH", "FASEL", "Q"
oder anders ausgedrueckt: /[a-z]|[A-Z]+/
RÜCKGABEWERT:
1 - Erfolg
-1 - cl ist keine Closure oder nicht an das aufrufende Obj gebunden
-2 - das Makro ist schon vergeben (fuer dieses oder ein anderes Obj)
-3 - das Makro entspricht nicht den Vorgaben
BEISPIEL:
Bei diesem Beispiel vergibt ein Objekt Makros, wenn der Spieler es
im Inventar hat. Legt er es wieder ab sind die Makros auch nicht
mehr nutzbar.
// Anmelden im Move
int move(mixed dest, int method) {
int ret;
closure cl;
ret = ::move(dest, method);
if (ret <= 0) return ret;
if (objectp(dest) && interactive(dest)) {
cl = #'prompt;
dest->AddPromptModifier("LP", cl);
dest->AddPromptModifier("LPMAX", cl);
}
return ret;
}
// Erzeugen der Ersetzung und ggf Abmelden
string prompt(string what) {
object po;
po = previous_object();
if (environment() != po) {
po->RemovePromptModifier("LP");
po->RemovePromptModifier("LPMAX");
return 0;
}
switch (what) {
case "\\LP": return to_string(po->QueryProp(P_HP));
case "\\LPMAX": return to_string(po->QueryProp(P_MAX_HP));
}
return 0;
}
SIEHE AUCH:
RemovePromptModifier(L)
|