Updates erzeugter Manpages
Diese Manpages werden mit sphinx erzeugt. Sie werden
hier committet, damit auch Nutzer ohne sphinx die
Textversion haben.
Change-Id: Ibe6acc626b51b42364af33450a719e88281651b9
diff --git a/doc/lfun/AddExtraLook b/doc/lfun/AddExtraLook
index 7436f7e..279b496 100644
--- a/doc/lfun/AddExtraLook
+++ b/doc/lfun/AddExtraLook
@@ -2,9 +2,11 @@
AddExtraLook()
**************
-AddExtraLook() varargs int AddExtraLook(string look, [int duration,
-string key,
+FUNKTION
+========
+
+ varargs int AddExtraLook(string look, [int duration, string key,
string lookende, object ob]);
@@ -14,117 +16,168 @@
/std/living/description.c
+ARGUMENTE
+=========
+
+ string look:
+
+ * String, der in der Langbeschreibung des Lebewesens
+ zusaetzlich ausgegeben wird.
+
+ * zu rufender Funktionsname, wenn 'ob' angegeben ist
+
+ int duration:
+
+ * > 0: Dauer der Gueltigkeit des Extralooks in Sekunden.
+
+ * 0: Unbegrenzt gueltiger Eintrag. Rebootfest.
+
+ * < 0: Bis Ende/Reboot bestehender Eintrag.
+
+ string key:
+ Schluesselwort, unter dem der Eintrag registriert wird und mit
+ dem man diesen auch mittels RemoveExtraLook() entfernen kann.
+ Sollte eindeutig sein! Ist 'key' nicht angeben, wird der
+ Objektname (object_name()) des setzenden Objekts benutzt.
+
+ string lookende:
+
+ * String, der an das Lebewesen (nur bei Spielern) ausgegeben
+ wird, wenn der eingetragene Extralook abgelaufen ist.
+
+ * zu rufender Funktionsname, wenn 'ob' angegeben ist
+
+ object ob:
+ Ein Objekt, an dem die in 'look' und 'lookende' abgelegten
+ Methoden bei Abfrage oder Ablauf aufgerufen werden. Die Methoden
+ bekommen das Living uebergeben und muessen selbst umgebrochene
+ Strings zurueckgeben.
+
+
BESCHREIBUNG
============
Der Extralook erscheint in der Langbeschreibung des Lebewesens.
- Eintraege koennen mit dieser Funktion hinzugefuegt werden. Dies ist der
- bevorzugte Weg, wenn ansonsten extra ein Objekt im Spielerinventar abgelegt
- werden muesste.
+ Texte dafuer koennen mit dieser Funktion hinzugefuegt und verwaltet
+ werden. Wenn ihr nicht ohnehin unbedingt ein Objekt IM Spieler
+ ablegt (wie zB eine Ruestung mit einem Extralook) (1), dann ist
+ diese Methode bevorzugt zu verwenden.
+ Ueber die Angabe eines 'ob' koennen Looks auch dynamisch erstellt
+ werden, dabei werden dann 'look' bzw. 'lookende' als Methoden am
+ Objekt gerufen. (1) Ein so fuer AddExtraLook verwendetes Objekt
+ 'ob' muss nicht wie bisher ueblich im Inv des Spieler liegen!
- Alle Parameter bis auf <look> sind optional.
-
-
-ARGUMENTE
-=========
-
- - string look:
- String, der in der Langbeschreibung des Lebewesens zusaetzlich ausgegeben
- wird.
- Kann auch ein Funktionsname sein, wenn <ob> angegeben wird (s.u.).
- - int duration:
- > 0: Wie lang bleibt der Extralook gueltig (in Sekunden)? Anschliessend
- wird er automatisch geloescht.
- 0: Dieser Eintrag bleibt unbegrenzt gueltig.
- < 0: Dieser Eintrag bleibt bis zum Ende/Reboot bestehen.
- - string key:
- Schluesselwort, unter dem der Eintrag registriert wird und mit dem man ihn
- auch mittels RemoveExtraLook() entfernen kann. Sollte natuerlich
- moeglichst eindeutig sein. ;-) Wenn <key> nicht angeben wird, wird der
- Objektname (object_name()) benutzt.
- - string lookende:
- String, der an das Lebewesen (nur bei Spielern) ausgegeben wird, wenn der
- eingetragene Extralook abgelaufen ist.
- Kann auch ein Funktionsname sein, wenn <ob> angegeben wird.
- - object ob:
- Wenn hier ein Objekt angegeben wird, werden <look> und <lookende> als
- Funktonsnamen aufgefasst. Diese Funktionen werden in <ob> aufgerufen, wenn
- der Extralook des Lebewesen angezeigt wird bzw. der eingetragene Extralook
- abgelaufen ist. Diese Funktionen bekommen das jeweilige Lebenwesen als
- Objekt uebergeben. Sie muessen einen String zurueckliefern, der ausgegeben
- wird. Dieser String wird direkt so ausgeben, also selber fuer Zeilenumbruch
- etc. sorgen!
- WICHTIG: Das Objekt sollte nach Moeglichkeit eine Blueprint sein, da das
- ganze nix mehr ausgibt, sobald der Clone zerstoert wird, falls hier
- einer angeben wird. Wenn ihr keine BP uebergebt: Wisst, was ihr tut. ;-)
-
-
-RUECKGABEWERTE
-==============
-
- > 0, falls der Eintrag erfolgreich registriert wurde.
- < 0 sonst.
- -1: <key> war nicht gueltig und es konnte keiner ermittelt werden.
- -2: <look> war kein gueltiger String.
- -3: <duration> war kein Integer.
- -4: unter <key> gibt es schon einen Eintrag.
+ Direkt angegebene Texte (also nicht von einem Objekt 'ob' bezogen)
+ werden durch replace_personal() gefiltert und unter Beibehaltung
+ existierender Umbrueche auf 78 Zeichen umgebrochen.
BEMERKUNGEN
===========
- Die Strings <look> und <lookende> werden vor Ausgabe durch
- replace_personal() geschickt, daher ist die Verwendung von @WER1, @WESSEN1
- usw. moeglich (s. replace_personal). Dies gilt aber _nicht_ fuer den Fall,
- dass die entsprechenden Funktionen in <ob> gerufen werden, dann muessen die
- Funktionen selber umbrechen, etc.
- Nach replace_personal() werden die Strings noch von break_string() auf 78
- Zeilen umgebrochen, allerdings bleiben dabei vorhandene Umbrueche erhalten.
- Die Meldung von <lookende> bzw. der Funktionsaufruf erfolgt, wenn der
- Extralook der Lebewesen das erste Mal nach Ablauf der Gueltigkeit aufgerufen
- wird.
+ * Die Meldung von <lookende> bzw. der Funktionsaufruf erfolgt,
+ wenn der Extralook der Lebewesen das erste Mal nach Ablauf der
+ Gueltigkeit aufgerufen wird.
+
+ * Das uebergbene Objekt sollte fuer permanente Eintraege eine
+ Blueprint sein, da Clones irgendwann (spaetestens mit Reboot)
+ zerstoert werden und der Eintrag dann bei Abfrage automatisch
+ geloescht wird.
+
+ * Folgerung: Clone-Objekte koennen fuer selbst beschraenkt
+ temporaere Extralooks benutzt werden.
+
+
+RUECKGABEWERTE
+==============
+
+ Siehe auch /sys/living/description.h fuer Konstanten.
+
+ * 1, falls der Eintrag erfolgreich registriert wurde.
+
+ * < 0 sonst.
+
+ * -1: <key> war nicht gueltig und es konnte keiner ermittelt
+ werden.
+
+ * -2: <look> war kein gueltiger String.
+
+ * -3: <duration> war kein Integer.
+
+ * -4: unter <key> gibt es schon einen Eintrag.
BEISPIELE
=========
- # einfacher Eintrag, "fuer die Ewigkeit"
+ // (1) einfacher Eintrag, "fuer die Ewigkeit"
living->AddExtraLook("@WER1 hat den Drachengott der SSP besiegt.");
- # Eintrag der nach 1h automatisch weg ist.
+ // (2) Eintrag der nach 1h automatisch weg ist.
living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600);
-
-
- # Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann.
+ // (3) Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann
living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600,
"humni_marmeladen_look");
-
-
- # Mit "Ende"-Meldung, aber kein eigener Schluessel.
+ // (4) Mit "Ende"-Meldung, aber kein eigener Schluessel
living->AddExtraLook("@WER1 ist patschnass.", 1200, 0,
"Du bist endlich wieder trocken. Puuh.");
+ // (5) Mit Objekt, welches den Extralook dynamisch erzeugt
+ living->AddExtraLook("get_my_special_extralook", 3600, 0, 0,
+ this_object());
+ // In diesem Fall muss this_object() natuerlich die Funktion
+ // "get_my_special_extralook()" definieren, die einen String zurueckgibt
-
- # Mit Objekt, was den Extralook dynamisch erzeugt
- living->AddExtraLook("get_my_special_extralook", 3600, 0, 0, this_object());
- In diesem Fall muss this_object() natuerlich die Funktion
- "get_my_special_extralook()" definieren, die einen String zurueckgibt.
-
- # Mit Objekt, was den Extralook und die Endemeldung dynamisch erzeugt
+ // (6) Mit Objekt, welches den Extralook dynamisch erzeugt
+ // Hier wird explizit die Blueprint uebergeben, der Extralook ist also
+ // rebootfest.
living->AddExtraLook("get_my_special_extralook", 3600, 0,
- "extralookende", this_object());
+ "extralookende", blueprint(this_object()));
+
+ // Mit Objekt, was den Extralook und die Endemeldung dynamisch erzeugt
+ // und keine festgelegte Existenzdauer hat, sondern sich aufgrund
+ // eigener Konditionen entsorgt
+ void set_extra_look(object living) {
+ object dyntemplook = clone_object("/path/to/some/object");
+ if(living->AddExtraLook("get_my_special_extralook", 0,
+ object_name(dyntemplook),
+ 0, dyntemplook) == XL_OK)
+ dyntemplook->SetProp(P_INTERNAL_EXTRA_LOOK, living);
+ else
+ dyntemplook->remove();
+ }
+
+ // entsprechendes Objekt:
+ varargs int remove(int silent) {
+ object ob = QueryProp(P_INTERNAL_EXTRA_LOOK);
+ // wenn der Spieler da ist, entfernen wir den Look regulaer
+ if(objectp(ob))
+ ob->RemoveExtraLook(object_name(this_object()));
+ return ::remove(silent);
+ }
+
+ void reset() {
+ if(!random(10))
+ remove();
+ else
+ ::reset();
+ }
SIEHE AUCH
==========
- RemoveExtraLook(),
- replace_personal(), break_string()
- P_INTERNAL_EXTRA_LOOK
+ Verwandt:
+ *RemoveExtraLook()*, *P_INTERNAL_EXTRA_LOOK*
-14.05.2007, Zesstra
+ Sonstiges:
+ *replace_personal()*, *break_string()*
+
+ Fuer Spielerobjekte:
+ *P_EXTRA_LOOK*
+
+5. Juni 2017 Gloinson
diff --git a/doc/lfun/AddInfo b/doc/lfun/AddInfo
index 759a300..a75a22d 100644
--- a/doc/lfun/AddInfo
+++ b/doc/lfun/AddInfo
@@ -7,7 +7,7 @@
========
varargs void AddInfo( frage, meldung
- [, indent [, [silent [, casebased] ] ] );
+ [, indent [, [silent [, casebased] ] ] );
DEFINIERT IN
@@ -21,58 +21,67 @@
string/string* frage
Schluesseltext(e) auf die Informationen gegeben werden sollen.
+
string/closure meldung
- Information, die gegeben werden soll/Closure
+ Information, die gegeben werden soll/Closure Bekommt nichts
+ uebergeben.
+
string indent
Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
+
int/string silent
Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
+
string/closure casebased
- Closure mit Returnwert string oder int.
+ Closure mit Returnwert string oder int. Bekommt nichts
+ uebergeben.
BESCHREIBUNG
============
- Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>" nach
- einer Information mit dem Schluessel 'frage' fragt, so wird die
- entsprechende 'meldung' ausgegeben (oder die Closure in 'meldung'
- gerufen und der zurueckgegebene Text ausgegeben). Der Meldung wird
- der Name des Monsters vorangestellt.
+ Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>"
+ nach einer Information mit dem Schluessel 'frage' fragt, so wird
+ die entsprechende 'meldung' ausgegeben (oder die Closure in
+ 'meldung' gerufen und der zurueckgegebene Text ausgegeben). Der
+ Meldung wird der Name des Monsters vorangestellt.
Frage:
- Schluessel muessen kleingeschrieben sein, koennen aber Leerzeichen
- enthalten.
+ Schluessel muessen kleingeschrieben sein, koennen aber
+ Leerzeichen enthalten.
Meldung:
- Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
- umbrechen.
+ Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
+ umbrechen.
Indent:
- Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
- Monsternamen noch das 'indent' vorangesetzt. Zusaetzlich wird
- 'meldung' auf jeden Fall sauber umgebrochen.
- Ein typisches indent ist "sagt: ".
+ Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
+ Monsternamen noch das 'indent' vorangesetzt. Ein typisches
+ indent ist "sagt: ".
Silent:
- Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im Raum,
- ist 'silent' ein String, so wird jener an alle anderen Spieler ausser
- dem Fragesteller im Raum ausgegeben.
+ Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im
+ Raum, ist 'silent' ein String, so wird jener an alle anderen
+ Spieler ausser dem Fragesteller im Raum ausgegeben.
Casebased:
- Die als Closure angegebene Methode entscheidet, ob oder wie der NPC
- auf diese Frage antworten soll:
- - return 0: normale Antwort mit "meldung"
- - return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
- - return string: Antwort mit string unter Beruecksichtigung eines
- indent
+ Die als Closure angegebene Methode entscheidet, ob oder wie der
+ NPC auf diese Frage antworten soll:
- Die Strings von 'silent' und 'meldung' werden geparsed.
- Dabei koennen die @...-Tags von replace_personal() verwendet werden,
+ # return 0: normale Antwort mit "meldung"
+
+ # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
+
+ # return string: Antwort mit string unter Beruecksichtigung
+ eines indent
+
+ Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
+ koennen die @[...]-Tags von replace_personal() verwendet werden,
Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
- automatisch gross geschrieben.
- AddInfo() konvertiert die alten Schluesselworte @WER, @WESSEN, @WEM,
- @WEN zu denen von replace_personal().
+ automatisch gross geschrieben. AddInfo() konvertiert die alten
+ Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
+ replace_personal(), jedoch nicht in den Rueckgabe- werten von
+ Closures.
Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
@@ -83,25 +92,27 @@
BEISPIELE
=========
- ### eine Standardantwort setzen ###
+ Siehe auch: /doc/beispiele/AddInfo/
+
+ // Beispiel 1: ### eine Standardantwort setzen ###
AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
// identisch zu
- SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
+ // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
- ### einfache Beispiele, auch mit casebased ###
+ // Beispiel 2: einfache Beispiele, auch mit casebased
AddInfo(({"knete","kohle"}),
- "sagt: ich habe so etwas nicht.\n");
+ "sagt: ich habe so etwas nicht.\n");
AddInfo("geld",
- "Ich habe zwar kein Geld, aber ... blablabla ...",
- "sagt: " );
+ "Ich habe zwar kein Geld, aber [...] blablabla [...]",
+ "sagt: ");
AddInfo("muenzen",
- "fluestert: Du willst Geld?\n",
- 0,
- "fluestert @WEM etwas zu.\n");
+ "fluestert: Du willst Geld?",
+ 0,
+ "fluestert @WEM etwas zu.");
// "frage monster nach geld": alle im Raum hoeren
- // Das Monster sagt: Ich habe zwar kein Geld, aber ...
- // Das Monster sagt: ... blablabla ...
+ // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
+ // Das Monster sagt: [...] blablabla [...]
// "frage monster nach muenzen":
// - der Fragensteller hoert:
@@ -109,47 +120,48 @@
// - alle andere hoeren:
// "Das Monster fluestert <Fragenstellernamen> etwas zu."
- ### dynamisch ###
+ // Beispiel 3: dynamisch
// ein Prototyp, damit wir die Methode bekannt machen
- static string query_kekse();
- ...
- AddInfo(({"keks","kekse"}),
- #'query_kekse, // ein Verweis auf die Funktion
- "sagt: ");
- ...
- static string query_kekse() {
- if(present("keks"))
- return("Ich hab noch welche. Aetsch!");
- return("Menno. Keine mehr da!");
- }
+ protected string query_kekse();
+ AddInfo(({"keks","kekse"}),
+ #'query_kekse, // ein Verweis auf die Funktion
+ "sagt: ");
+
+ protected string query_kekse() {
+ if(present("keks", this_object()))
+ return("Ich hab noch welche. Aetsch!");
+ else if(present("keks", environment()))
+ return("Da liegt einer!");
+ return("Menno. Keine mehr da!");
+ }
// "frage monster nach keks":
// - wenn es noch Kekse hat, hoeren alle:
// "Das Monster sagt: Ich hab noch welche. Aetsch!
// - sonst:
// "Das Monster sagt: "Menno. Keine mehr da!
- ### dynamischer ###
+ // Beispiel 4: dynamischer
// ein Prototyp, damit wir die Methode bekannt machen
- static string query_kekse();
- static mixed case_fighting();
- ...
+ protected string query_kekse();
+ protected mixed case_fighting();
+
AddInfo(({"keks","kekse"}),
- #'query_kekse," // ein Verweis auf die Funktion
- sagt: ",
- 0, // nicht silent :)
- #'case_fighting); // noch ein Funktionsverweis
- ...
- static string query_kekse() {
- if(present("keks"))
- return("Ich hab noch welche. Aetsch!");
- return("Menno. Keine mehr da!");
+ #'query_kekse," // ein Verweis auf die Funktion
+ sagt: ",
+ 0, // nicht silent :)
+ #'case_fighting); // noch ein Funktionsverweis
+
+ protected string query_kekse() {
+ if(present("keks"))
+ return("Ich hab noch welche. Aetsch!");
+ return("Menno. Keine mehr da!");
}
- static mixed case_fighting() {
- if(InFight())
- return("Keine Zeit fuer Kekse. Muss kaempfen.");
- return 0;
+ protected mixed case_fighting() {
+ if(InFight())
+ return("Keine Zeit fuer Kekse. Muss kaempfen.");
+ return 0;
}
// "frage monster nach keks":
@@ -160,59 +172,53 @@
// - sonst:
// "Das Monster sagt: "Menno. Keine mehr da!
-
- ### dynamisch und komplex ###
+ // Beispiel 5: ### dynamisch und komplex ###
// ein Prototyp, damit wir die Methode bekannt machen
- static string question_gold();
- ...
+ protected string question_gold();
// "gold" wird eine Closure auf die Methode question_gold()
// zugewiesen, ausserdem soll es still bleiben (wir informieren
// den Restraum selbst)
- AddInfo("gold",#'question_gold,"murmelt: ",1);
- ...
+ AddInfo("gold", #'question_gold, "murmelt: ", 1);
// los gehts, wir generieren unsere Antwort selbst
- static string question_gold() {
- int money;
- string *y, objstr;
- object o;
- // wieviel Kohle hat der Spieler
- money=this_player()->QueryMoney();
- y=allocate(0);
- // und jetzt suchen wir die Dinge aus Gold
- o=first_inventory(this_player());
- while(o) {
- if(o->QueryMaterial(MAT_GOLD)>0 &&
- strstr(object_name(o),"/obj/money"))
- y+=({o->name(WER,1)});
- o=next_inventory(o);
- }
+ protected string question_gold() {
+ // wieviel Kohle hat der Spieler
+ int money = this_player()->QueryMoney();
+ string *y = map(deep_inventory(this_player()),
+ function string(object o) {
+ if(o->QueryMaterial(MAT_GOLD)>0 &&
+ strstr(object_name(o),"/items/money")<0 &&
+ o->QueryProp(P_NAME))
+ return o->name(WER,1);
+ })-({0});
- // das geht an alle anderen im Raum, silent bietet sich hier
- // nicht an, weil es mehrere Moeglichkeiten gibt
- say(break_string(
- Name(WER,1)+" murmelt "+
- this_player()->name(WEM,1)+
- " etwas zu"+
- ((money || sizeof(y))?
- " und glotzt "+
- this_player()->QueryPronoun(WEN)+" gierig an.":
- "."),78),({this_player()}));
-
- // und hier die Antwort an den Spieler selbst, mit vielen
- // Verzweigungen fuer dessen Besitztum
- return("Ich hab kein Gold bei mir."+
+ // das geht an alle anderen im Raum, silent bietet sich hier
+ // nicht an, weil es mehrere Moeglichkeiten gibt
+ send_room(environment(),
+ (Name(WER,1)+" murmelt "+
+ this_player()->name(WEM,1)+
+ " etwas zu"+
((money || sizeof(y))?
+ " und glotzt "+this_player()->QueryPronoun(WEN)+" gierig an.":
+ ".")),
+ MT_LOOK|MT_LISTEN,
+ MA_EMOTE, 0, ({this_player()}));
+
+ // und hier die Antwort an den Spieler selbst, mit vielen
+ // Verzweigungen fuer dessen Besitztum
+ return("Ich hab kein Gold bei mir."+
+ ((money || sizeof(y))?
" Aber du "+
- (money?"hast ja jede Menge Kohle bei dir, so etwa "+money+
- " Muenzen."+
- (sizeof(y)?
- " Ausserdem "+
- ((sizeof(y)==1)?"ist":"sind")+
- " auch noch "+CountUp(y)+" aus Gold.":
- ""):
- (sizeof(y)?" Aber was du so bei dir hast: "+
+ (money?
+ "hast ja jede Menge Kohle bei dir, so etwa "+money+
+ " Muenzen."+
+ (sizeof(y)?
+ " Ausserdem "+
+ ((sizeof(y)==1)?"ist":"sind")+
+ " auch noch "+CountUp(y)+" aus Gold.":
+ ""):
+ (sizeof(y)?"hast ja ein paar Wertsachen dabei: "+
CountUp(y)+
(sizeof(y)==1?" ist":" sind")+
" aus Gold.":"")):
@@ -234,10 +240,19 @@
SIEHE AUCH
==========
- Verwandt: AddSpecialInfo(L), RemoveInfo(L)
- Props: P_PRE_INFO, P_DEFAULT_INFO
- Files: /std/npc/info.c
- Loggen: P_LOG_INFO
- Interna: GetInfoArr, do_frage
+ Verwandt:
+ *AddSpecialInfo()*, *RemoveInfo()*
-7.Apr 2004 Gloinson
+ Props:
+ *P_PRE_INFO*
+
+ Files:
+ /std/npc/info.c
+
+ Loggen:
+ *P_LOG_INFO*
+
+ Interna:
+ *GetInfoArr()* , *do_frage()*
+
+7. Mar 2017 Gloinson
diff --git a/doc/lfun/AddRoomMessage b/doc/lfun/AddRoomMessage
index aa700c1..7d33a52 100644
--- a/doc/lfun/AddRoomMessage
+++ b/doc/lfun/AddRoomMessage
@@ -6,7 +6,7 @@
FUNKTION
========
- void AddRoomMessage(string *msg, int time, mixed *func);
+ void AddRoomMessage(string* msg, int time, mixed* func);
DEFINIERT IN
@@ -18,67 +18,80 @@
ARGUMENTE
=========
- msg
- Array von Strings mit den Meldungen.
- time
- Der Abstand zwischen zwei Meldungen in Sekunden.
- func (optional)
- String oder Array von Strings mit Funktionsnamen
+ string* msg
+ Array von Strings mit den Meldungen.
+
+ int time
+ Der Abstand zwischen zwei Meldungen in Sekunden.
+
+ string|string* func (optional)
+ String oder Array von Strings mit Funktionsnamen
BESCHREIBUNG
============
- Mit dieser Funktion legt man fest, dass in bestimmten Zeitabstaenden
- Meldungen an den Raum geschickt werden sollen.
+ Mit dieser Funktion legt man fest, dass in bestimmten
+ Zeitabstaenden Meldungen an den Raum geschickt werden sollen.
- Es wird alle time Sekunden zufaellig eine der in msg angegebenen
- Meldungen ausgegeben. Hat man auch noch func angegeben, so wird
- zusaetzlich diese Funktion (bei einem Array: eine zufaellig ausgesuchte
- Funktion) im Raum aufgerufen. Als Parameter bekommt die Funktion die
- Nummer der ausgegebenen Meldung.
+ Es wird alle 'time' Sekunden (beim ersten Betreten durch einen
+ Spieler ein random() des Wertes) zufaellig eine der in msg
+ angegebenen Meldungen ausgegeben. Hat man func angegeben, so wird
+ diese Funktion (bei einem Array: eine zufaellig ausgesuchte
+ Funktion) im Raum aufgerufen. Als Parameter bekommt die Funktion
+ die Nummer der ggf zuvor ausgegebenen Meldung (Default also 0).
- Bevor man allerdings jeden Raum mit AddRoomMessage() pflastert, sollte
- man folgendes bedenken:
- o Viele Meldungen in vielen Raeumen tendieren dazu, den Spielern auf
- die Nerven zu gehen!
- o Da das Timing ueber einen call_out() gesteuert wird, ist das Ganze
- aus Sicht des GameDrivers auch noch relativ teuer!
- Fazit: weniger ist mehr!
+ Bevor man allerdings jeden Raum mit AddRoomMessage() pflastert,
+ sollte man folgendes bedenken (Fazit: weniger ist mehr):
+
+ * Viele Meldungen in vielen Raeumen tendieren dazu, den Spielern
+ auf die Nerven zu gehen.
+
+ * Die das Timing steuernden call_out() sind nicht umsonst.
BEMERKUNGEN
===========
- * Falls time < 15 Sekunden ist, wird auf 15 Sekunden aufgerundet.
- * der Praefix Add... taeuscht hier. Ein Aufruf von AddRoomMessage()
- ueberschreibt alle vorherigen Werte
- * THIS_PLAYER() NICHT VERWENDEN!
+ * falls time < 15 Sekunden ist, wird auf 15 Sekunden aufgerundet
+
+ * der Praefix Add... taeuscht hier. Ein Aufruf von
+ AddRoomMessage() ueberschreibt alle vorherigen Werte
+
+ * this_player() NICHT VERWENDEN!
+
+ * Abschalten der Raumnachrichten:
+
+ * passiert automatisch nur, wenn alle Spieler den Raum
+ verlassen haben
+
+ * ist manuell nur ueber Loeschen der Nachrichten umsetzbar,
+ also mit "AddRoomMessage((string)0, 0, (string)0);"
+
In Funktionen, die durch AddRoomMessage() ausgeloest werden, darf
- this_player() nicht verwendet werden. AddRoomMessage ist call_out-
- gesteuert und speichert somit das this_player(). Damit ist this_player()
- immer der Spieler, der den Raum geladen, also den Raum als erster
- betreten hat.
- Spieler also bitte selbst ueber filter(all_inventory(this_object()),
- #'interactive) suchen.
+ this_player() nicht verwendet werden, da die call_out()-Kette den
+ ersten ausloesenden Spieler speichert. Anwesende Spieler also bitte
+ ggf mit "filter(all_inventory(this_object()), #'interactive)"
+ suchen.
BEISPIELE
=========
- Es soll alle halbe Minute eine Meldung ausgegeben werden. Falls es
- unter den Fuessen knackt, soll man zudem mit 30%-iger
- Wahrscheinlichkeit zusammenzucken:
+ // Beispiel 1:
+ // Es soll alle halbe Minute eine Meldung ausgegeben werden. Falls es
+ // unter den Fuessen knackt, soll man zudem mit 30%-iger
+ // Wahrscheinlichkeit zusammenzucken:
inherit "/std/room";
void create() {
::create();
- AddRoomMessage( ({ "In der Ferne schreit ein Kaeuzchen.\n",
- "Es raschelt im Gebuesch.\n",
- "Etwas knackt unter Deinen Fuessen.\n" }),
- 30, ({"sound", "sound_more_rnd"}) );
- ...
+ AddRoomMessage(({"In der Ferne schreit ein Kaeuzchen.\n",
+ "Es raschelt im Gebuesch.\n",
+ "Etwas knackt unter Deinen Fuessen.\n"}),
+ 30,
+ ({"sound", "sound_more_rnd"}) );
}
void sound(int msg) {
@@ -88,16 +101,60 @@
}
// Extra-Beispiel: wir setzen die Wartedauer (Parameter tim) neu
- void sound_more_rnd() {
- sound(0); // die Message-Nummer ist hier unwichtig
+ void sound_more_rnd(int msg) {
+ sound(msg);
SetProp(P_MSG_PROB, 25+random(20)); // neue Wartedauer
}
+ // Beispiel 2: Abschalten der Raumnachrichten
+ public int action_laerm(string str);
+ protected void reset_room_messages();
+
+ void create() {
+ ::create();
+ reset_room_messages();
+
+ AddCmd("mach|mache&laerm|krach",
+ "action_laerm",
+ "Was willst du machen?");
+ AddCmd("schlag|schlage&laerm|krach",
+ "action_laerm",
+ "Was willst du schlagen?");
+ }
+
+ protected void reset_room_messages() {
+ AddRoomMessage(({"Das Reh quakt leise.\n",
+ "Der Frosch grunzt.\n",
+ "Gelbe Schnorpfel pupsen im Takt.\n"}),
+ 45);
+ }
+
+ public int action_laerm(string str) {
+ AddRoomMessage((string)0, 0, (string)0);
+
+ this_player()->ReceiveMsg(
+ "Du schreist dir kurz die Seele aus dem Leib. Alle Tiere "
+ "verstummen sofort.", MT_NOTIFICATION);
+ send_room(this_object(),
+ this_player()->Name()+" schreit laut. Alle Tiere verstummen "
+ "sofort.", MT_LISTEN, 0, 0, ({this_player()}));
+ return 1;
+ }
+
+ void reset() {
+ :reset();
+ if(!QueryProp(P_ROOM_MSG))
+ reset_room_messages();
+ }
+
SIEHE AUCH
==========
- Verwandt: tell_room(), ReceiveMsg()
- Props: P_ROOM_MSG, P_FUNC_MSG, P_MSG_PROB
+ Verwandt:
+ tell_room(), *send_room()*, *ReceiveMsg()*
-2.Feb 2016 Gloinson
+ Props:
+ *P_MSG_PROB*, *P_FUNC_MSG*, *P_ROOM_MSG*
+
+28. Mar 2016 Gloinson
diff --git a/doc/lfun/Defend b/doc/lfun/Defend
index aa53945..3e40cfc 100644
--- a/doc/lfun/Defend
+++ b/doc/lfun/Defend
@@ -6,8 +6,9 @@
FUNKTION
========
- public int Defend(int dam, string|string* dam_type, int|mapping spell,
- object enemy)
+ public int Defend(int dam, string|string* dam_type, int|mapping
+ spell,
+ object enemy)
DEFINIERT IN
@@ -19,120 +20,139 @@
ARGUMENTE
=========
- int dam initiale Staerke des Angriffs (10 dam ~ 1 HP)
- string* dam_type Art(en) des Schadens, der angerichtet werden
- soll
- Muss ein Array von Schadenstypen sein,
- alte Objekte uebergeben hier manchmal strings.
- int/mapping spell - 0 fuer normale Angriffe (keine Zauber)
- - 1 fuer Zauber (Standardruestungen ignorieren)
- - mapping fuer mehr Informationen
- Heute bitte nach Moeglichkeit ein Mapping
- uebergeben.
- object enemy der Feind/Schadenverursacher
+ int dam
+ Initiale Staerke des Angriffs (10 dam ~ 1 HP)
+
+ string* dam_type
+ Art des Schadens, der angerichtet werden soll Muss ein Array von
+ Schadenstypen sein, alte Objekte uebergeben hier manchmal
+ strings.
+
+ mapping spell
+ Mapping mit zusaetzlichen Informationen zum Angriff(Siehe unten)
+ Alte Objekte uebergeben manchmal einen Integer (0 fuer
+ Physikalischen Angriff, 1 fuer Zauber.
+
+ object enemy
+ Der Feind/Schadenverursacher
BESCHREIBUNG
============
1. Generell
- Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
- Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke des
- Schadens dementsprechend vermindert.
- Ggf. wird der Schaden zugefuegt und der Feind in die Liste der Feinde
- aufgenommen. Der Schaden betraegt:
- (dam-Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
- aber nicht unter 0.
+
+ Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark
+ die Ruestungen und koerpereigenen Abwehrkraefte sind und die
+ Staerke des Schadens dementsprechend vermindert. Ggf. wird der
+ Schaden zugefuegt und der Feind in die Liste der Feinde
+ aufgenommen. Der Schaden betraegt: (dam-Summe(Ruestungsstaerken
+ )-random(P_BODY+A_DEX))*CheckResistance/10 aber nicht unter 0.
2. Der Parameter 'spell'
- Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
- Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
- diverse Flags, die das Ergebnis manipulieren (in new_skills.h
- enthalten). Nichtangabe eines Flags gilt als 0.
- - SP_PHYSICAL_ATTACK ---------- 0/1
- 1, wenn Ruestungen wirken sollen, 0 sonst
- -> entspricht !spell, wenn dieses Int ist
- - SP_NO_ENEMY ----------------- 0/1
- 1, falls der Angriff nicht toedlich ist, es also keinen echten
- Gegner gibt
- -> es wird dann reduce_hit_points() gerufen statt do_damage()
- - SP_NO_ACTIVE_DEFENSE -------- 0/1
- 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
- Karateabwehren oder Ausweichmanoever) unterbleiben sollen
- -> zB bei Kratzen durch Dornen oder Fall aus grosser Hoehe
- ist aktive Abwehr oder Ausweichen unlogisch
- - SP_RECURSIVE ---------------- 0/1
- 1, falls der Spell aus einem Defend gerufen wurde (oder einer
- DefendFunc)
- -> verhindert Rekursionsprobleme
- - SP_NAME --------------------- string
- Name des Spells
- - SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values int>=0
- Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
- typabhaengig reduziert. Aufbau eines Mappings im Beispiel:
- ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
- P_BODY: 50, // Koerper zu 50%
- AT_BELT: 600 // Guertel zu 600%
- ])
- -> alle 'fehlenden' Eintraege wirken normal
- - SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays
- 0, fuer keine Treffermeldung, 1 sonst
- In einem Array koennen Ersatz-Treffermeldungen definiert
- werden. Format ist:
+ Ist 'spell' 0, dann gilt der Angriff als normale physische
+ Attacke Uebergibt man als 'spell'-Parameter ein Mapping, so gibt
+ es dafuer diverse Flags, die das Ergebnis manipulieren (in
+ new_skills.h enthalten). Nichtangabe eines Flags gilt als 0.
+
+ * SP_PHYSICAL_ATTACK ---------- 0/1 1, wenn Ruestungen wirken
+ sollen, 0 sonst -> entspricht !spell, wenn dieses Int ist
+
+ * SP_NO_ENEMY ----------------- 0/1 1, falls der Angriff nicht
+ toedlich ist, es also keinen echten Gegner gibt -> es wird
+ dann reduce_hit_points() gerufen statt do_damage()
+
+ * SP_NO_ACTIVE_DEFENSE -------- 0/1 1, falls aktive Abwehren
+ (wie zurueckschlagende Amulette, Karateabwehren oder
+ Ausweichmanoever) unterbleiben sollen -> zB bei Kratzen durch
+ Dornen oder Fall aus grosser Hoehe ist aktive Abwehr oder
+ Ausweichen unlogisch
+
+ * SP_RECURSIVE ---------------- 0/1 1, falls der Spell aus
+ einem Defend gerufen wurde (oder einer DefendFunc) ->
+ verhindert Rekursionsprobleme
+
+ * SP_NAME --------------------- string Name des Spells
+
+ * SP_GLOBAL_ATTACK ------------ 0/1 1 bei Flaechenspells
+
+ * SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY,
+ values int>=0 Die Schutzwirkung durch P_AC/Magie einer
+ Ruestung wird typabhaengig reduziert. Aufbau eines Mappings im
+ Beispiel:
+
+ ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht P_BODY: 50,
+ // Koerper zu 50% AT_BELT: 600 // Guertel zu 600% ])
+
+ -> alle 'fehlenden' Eintraege wirken normal
+
+ * SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays 0,
+ fuer keine Treffermeldung, 1 sonst In einem Array koennen
+ Ersatz-Treffermeldungen definiert werden. Format ist:
+
({
- ({ int lphit1, string mess_me,
- string mess_en,
- string mess_room }),
- ({ lphit2, mess_me, mess_en, mess_room }),
- ...
- ({ lphitn, mess_me, mess_en, mess_room }),
- })
- wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-
- Array aufsteigend sortiert.
- Ist ein Treffer x LP hart, werden die Meldungen des lphit-
- Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
- liegt.
+ ({ int lphit1, string mess_me, string mess_en, string
+ mess_room }), ({ lphit2, mess_me, mess_en, mess_room }),
+ ... ({ lphitn, mess_me, mess_en, mess_room }), }) wobei
+ lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
+ aufsteigend sortiert.
- In den Meldungen mess_me (an den Getroffenen), mess_en (an
- den Feind), mess_room (an die restlichen Umstehenden) koennen
- Ersatzstrings wie folgt verwendet werden:
- @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
- @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
- - EINFO_DEFEND ------------ Mapping
- Dieses Mapping liefert erweiterte Informationen zu dem
- bisherigen Ablauf des aktiven Attacks.
- Die verfuegbaren Informationen sind in der Manpage zu
- DefendInfo festgehalten.
+ Ist ein Treffer x LP hart, werden die Meldungen des lphit-
+ Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
+ liegt.
+
+ In den Meldungen mess_me (an den Getroffenen), mess_en (an den
+ Feind), mess_room (an die restlichen Umstehenden) koennen
+ Ersatzstrings wie folgt verwendet werden:
+
+ @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen
+ (TO) @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes
+ (enemy)
+
+ * EINFO_DEFEND ------------ Mapping Dieses Mapping liefert
+ erweiterte Informationen zu dem bisherigen Ablauf des aktiven
+ Attacks. Die verfuegbaren Informationen sind in der Manpage zu
+ DefendInfo festgehalten.
3. Reihenfolgen in Defend
- - das Living wird angegriffen, wenn
- - P_NO_ATTACK != 0
- - 'enemy' existiert und kein netztoter Spieler ist
- - P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
- - P_TMP_ATTACK_HOOK wird abgefragt
- - die Ruestungen werden vom Schaden gegebenenfalls abgezogen
- - magischer Ausweichskill beruecksichtigt
- - sensitive Objekte werden ggf. benachrichtigt
- - InternalModifyDefend wird gerufen
- - Koerperabwehr abgezogen
- - der Schaden an do_damage()/reduce_hit_points() uebergeben
- - Flucht ueberpruefen mit CheckWimpyAndFlee()
+
+ * das Living wird angegriffen, wenn - P_NO_ATTACK != 0 -
+ 'enemy' existiert und kein netztoter Spieler ist
+
+ * P_DEFENDERS werden durchgegangen (und eventuell
+ benachrichtigt)
+
+ * P_TMP_ATTACK_HOOK wird abgefragt
+
+ * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
+
+ * magischer Ausweichskill beruecksichtigt
+
+ * sensitive Objekte werden ggf. benachrichtigt
+
+ * InternalModifyDefend wird gerufen
+
+ * Koerperabwehr abgezogen
+
+ * der Schaden an do_damage()/reduce_hit_points() uebergeben
+
+ * Flucht ueberpruefen mit CheckWimpyAndFlee()
BEMERKUNGEN
===========
- Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
- mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
- auf 1 ist.
+ Ruestungen wirken konventionell nur, wenn mindestens ein
+ Schadensanteil mechanisch ist und es kein Spell oder ein Spell mit
+ SP_PHYSICAL_ATTACK auf 1 ist.
- Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
- sich hat, sollte also aus Fairness gegenueber den Objekten anderer
- Magier immer dem direkten reduce_hit_points() oder do_damage()
- vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
- aendern.
+ Defend() beruecksichtigt magische Verteidigungen, die der Spieler
+ bei sich hat, sollte also aus Fairness gegenueber den Objekten
+ anderer Magier immer dem direkten reduce_hit_points() oder
+ do_damage() vorgezogen werden. Mittels der Flags in 'spell' kann
+ man sehr viel aendern.
RUECKGABEWERT
@@ -142,11 +162,11 @@
Lebenspunkte des Lebewesens.
BEISPIELE (SIEHE AUCH Defend_bsp):
- // ein simpler Angriff: enem->Defend(100, ({DT_BLUDGEON}), 0,
- this_object());
+ // ein simpler Angriff: enem->Defend(100, ({DT_BLUDGEON}),
+ ([SP_PHYSICAL_ATTACK:1]), this_object());
// ein magischer Angriff (ohne Treffermeldung): enem->Defend(100,
- ({DT_BLUDGEON, DT_FIRE}), 1, this_object());
+ ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
// ein magischer Angriff mit Treffermeldung: enem->Defend(100,
({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
@@ -157,19 +177,23 @@
SIEHE AUCH
==========
- Angriff: Attack(L), P_NO_ATTACK, InsertEnemy(L)
- Schaden: P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE,
- do_damage(L), reduce_hit_points(L)
- Schutz: P_DEFENDERS, InformDefend(L), DefendOther(L)
- P_ARMOURS, P_AC, P_DEFEND_FUNC, QueryDefend(L)
- P_BODY, A_DEX
- Daten: P_LAST_COMBAT_TIME
- P_LAST_DAMTYPES, P_LAST_DAMTIME, P_LAST_DAMAGE
- P_DAMAGE_MSG
- Resistenz: P_RESISTANCE_STRENGTHS, CheckResistance(L)
- Sonstiges: CheckSensitiveAttack(L)
- InternalModifyDefend(L)
- UseSkill(L),
- DefendInfo
+ Angriff: *Attack()*, *P_NO_ATTACK*, *InsertEnemy()* Schaden:
+ *P_ENABLE_IN_ATTACK_OUT*,
-15.09.2010, Zesstra
+ *P_LAST_MOVE*, *do_damage()*, *reduce_hit_points()*
+
+ Schutz: *P_DEFENDERS*, *InformDefend()*,
+ *DefendOther()*, *P_ARMOURS*, *P_AC*, *P_DEFEND_FUNC*,
+ *QueryDefend()*, *P_BODY*
+
+ Daten: *P_LAST_COMBAT_TIME*,
+ *P_LAST_DAMTYPES*, *P_LAST_DAMTIME*, *P_LAST_DAMAGE*,
+ *P_DAMAGE_MSG*
+
+ Resistenz: *P_RESISTANCE_STRENGTHS*,
+ *CheckResistance()*
+
+ Sonstiges: *CheckSensitiveAttack()*,
+ *InternalModifyDefend()*, *UseSkill()*, *DefendInfo()*
+
+Letzte Aenderung: 29.12.2017, Bugfix
diff --git a/doc/lfun/DefendFunc b/doc/lfun/DefendFunc
index 1683b3f..a544cc2 100644
--- a/doc/lfun/DefendFunc
+++ b/doc/lfun/DefendFunc
@@ -3,43 +3,39 @@
************
-DefendFunc(L)
-=============
-
-
FUNKTION
========
- int DefendFunc(string|string *dtyp, int|mappingspell, object enemy);
+ public int DefendFunc(string* dtyp, mapping spell, object enemy);
DEFINIERT IN
============
- eigenen Objekten; fuer /std/armour/combat.c
+ Eigenen Objekten; fuer /std/armour/combat.c
ARGUMENTE
=========
dtyp
- Schadenstypen der Angriffsart.
- Sollte heute ein string* sein.
+ Schadenstypen der Angriffsart.
+
spell
- 0 bei veralteten konventionellen Angriffen im Regelfall jedoch
- ein Mapping mit weiteren Infos.
- Bei einem konventionellen Angriff ist spell[SP_PHYSICAL_ATTACK] gleich
- 1.
+ Ein Mapping mit weiteren Infos. Bei einem konventionellen
+ Angriff ist spell[SP_PHYSICAL_ATTACK] gleich 1.
+
enemy
- Der angreifende Gegner
+ Der angreifende Gegner
BESCHREIBUNG
============
- Anhand der uebergebenen Parameter kann hier ein Ruestungsbonus (oder
- auch ein Ruestungsmalus) errechnet werden, der zu dem normalen
- Ruestungswert (abhaengig von der Angriffsart) hinzuaddiert wird.
+ Anhand der uebergebenen Parameter kann hier ein Ruestungsbonus
+ (oder auch ein Ruestungsmalus) errechnet werden, der zu dem
+ normalen Ruestungswert (abhaengig von der Angriffsart) hinzuaddiert
+ wird.
RUeCKGABEWERT
@@ -54,8 +50,9 @@
Auch wenn man eine DefendFunc() benutzt, darf der Rueckgabewert
zusammen mit der P_AC insgesamt nur in sehr seltenen, wohldurch-
dachten Ausnahmefaellen die maximal zulaessige P_AC fuer diesen
- Ruestungstyp ueberschreiten. In solchen Ausnahmefaellen duerfen
- die DefendFuncs nicht konstant wirken.
+ Ruestungstyp ueberschreiten. In solchen Ausnahmefaellen duerfen die
+ DefendFuncs nicht konstant wirken. Ausserdem sind solche Ruestungen
+ immer genehmigungspflichtig.
Bei aktivem Zurueckschlagen IMMER auf Flags wie SP_RECURSIVE und
SP_NO_ACTIVE_DEFENSE pruefen und ggf. abbrechen.
@@ -64,44 +61,46 @@
BEISPIELE
=========
- Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
- und bei Angriffen durch Geister geschwaecht wird:
+ Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke
+ entfaltet und bei Angriffen durch Geister geschwaecht wird:
- void create()
- {
- ::create();
+ protected void create() {
- SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
- SetProp(P_AC, 20);
- ...
- // Die DefendFunc() ist in der Ruestung selbst definiert
- SetProp(P_DEFEND_FUNC, this_object());
+ ::create();
+
+ SetProp(P_ARMOUR_TYPE, AT_ARMOUR); SetProp(P_AC, 20); ... // Die
+ DefendFunc() ist in der Ruestung selbst definiert
+ SetProp(P_DEFEND_FUNC, this_object());
+
}
- int DefendFunc(string *dtyp, mixed spell, object enemy)
- {
- int prot;
+ public int DefendFunc(string* dtyp, mapping spell, object enemy) {
- // Zuerst fragen wir den Angriff durch Feuer ab:
- if (member(dtyp, DT_FIRE) >= 0) // Feuer gehoert zu den Schadenstypen
- prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit P_AC
- // kommt man also maximal auf 14+20 = 34,
- // liegt also unter der fuer AT_ARMOUR
- // geltenden Obergrenze
+ int prot;
- // Und jetzt der Geistertest
- if (enemy->QueryProp(P_RACE) == "Geist" ||
- enemy->is_class_member(CL_GHOST))
- prot -= random(10);
+ // Zuerst fragen wir den Angriff durch Feuer ab: if
+ (member(dtyp, DT_FIRE) >= 0) // Feuer gehoert zu den
+ Schadenstypen
- // Der Rueckgabewert wird auf den aus P_AC errechneten Wert draufgeschlagen
- return prot;
+ prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit
+ P_AC
+ // kommt man also maximal auf 14+20 = 34, // liegt also
+ unter der fuer AT_ARMOUR // geltenden Obergrenze
+
+ // Und jetzt der Geistertest if (enemy->QueryProp(P_RACE) ==
+ "Geist" ||
+
+ enemy->is_class_member(CL_GHOST))
+
+ prot -= random(10);
+
+ // Der Rueckgabewert wird auf den aus P_AC errechneten Wert
+ draufgeschlagen return prot;
+
}
SIEHE AUCH
==========
- P_DEFEND_FUNC, QueryDefend(), /std/armour/combat.c
-
-Last modified: 18.Jul 2006 Muadib
+ *P_DEFEND_FUNC*, "QueryDefendd" /std/armour/combat.c
diff --git a/doc/lfun/GetShopItems b/doc/lfun/GetShopItems
new file mode 100644
index 0000000..9c7f28d
--- /dev/null
+++ b/doc/lfun/GetShopItems
@@ -0,0 +1,40 @@
+
+GetShopItems()
+**************
+
+
+FUNKTION
+========
+
+ protected object* GetShopItems()
+
+
+DEFINIERT IN
+============
+
+ /std/room/shop.c
+
+
+BESCHREIBUNG
+============
+
+ Erstellt ein Array mit den zum Verkauf stehenden Objekten.
+
+
+BEMERKUNG
+=========
+
+ Enthaelt nur jeweils einen Clone von jeder Blueprint.
+
+
+RUECKGABEWERTE
+==============
+
+ Object-Array mit zuerst den Objekten im Store und anschliessend den
+ fixed-Objects.
+
+
+SIEHE AUCH
+==========
+
+ *PrintList()*
diff --git a/doc/lfun/GuildName b/doc/lfun/GuildName
new file mode 100644
index 0000000..4a4dbdf
--- /dev/null
+++ b/doc/lfun/GuildName
@@ -0,0 +1,37 @@
+
+GuildName()
+***********
+
+
+FUNKTION
+========
+
+ string GuildName()
+
+
+DEFINIERT IN
+============
+
+ /std/gilden_ob.c
+
+
+RUeCKGABEWERT
+=============
+
+ string mit Gildennamen
+
+
+BESCHREIBUNG
+============
+
+ Gibt Gildennamen (genauer: object_name ohne "/gilden/") zurueck.
+
+
+SIEHE AUCH
+==========
+
+ Verwandt:
+ *GuildName()*
+
+ Props:
+ *P_GUILD*
diff --git a/doc/lfun/InternalModifyDefend b/doc/lfun/InternalModifyDefend
index 3015534..3762c07 100644
--- a/doc/lfun/InternalModifyDefend
+++ b/doc/lfun/InternalModifyDefend
@@ -10,8 +10,8 @@
FUNKTION
========
- protected void InternalModifyDefend(int dam, mixed dt, mixed spell,
- object enemy)
+ protected void InternalModifyDefend(int dam, string* dt, mapping
+ spell, object enemy)
DEFINIERT IN
@@ -23,28 +23,31 @@
ARGUMENTE
=========
- int dam Staerke des abzuwehrenden Angriffs (in HP/10)
- string/string* dt Art(en) des Schadens, der angerichtet werden soll
- int/mapping spell 0 fuer normale Angriffe (keine Zauber)
- 1 fuer Zauber (Standardruestungen ignorieren)
- mapping fuer mehr Informationen
- object enemy der Feind/Schadenverursacher
+ int dam
+ Staerke des abzuwehrenden Angriffs (in HP/10)
+
+ string* dt
+ Art(en) des Schadens, der angerichtet werden soll
+
+ mapping spell
+ Mapping mit zusaetzlichen Informationen ueber den Angriff
+
+ object enemy
+ der Feind/Schadenverursacher
BESCHREIBUNG
============
Dient dazu noch Aenderungen am Verhalten der Defend() vornehmen zu
- koennen. Die Parameter werden alle per Referenz uebergeben, Aenderungen
- wirken also direkt in der Defend()!
- Einfach ueberschreiben, aber ::InternalModifyDefend(&..., &....) nicht
- vergessen!
+ koennen. Die Parameter werden alle per Referenz uebergeben,
+ Aenderungen wirken also direkt im Defend()!
+
+ Einfach ueberschreiben, aber ::InternalModifyDefend(&..., &....)
+ nicht vergessen!
SIEHE AUCH
==========
- InternalModifyAttack(L)
- Defend(L)
-
-28.03.2008, Zesstra
+ *InternalModifyAttack()* *Defend()*
diff --git a/doc/lfun/IsGuildMember b/doc/lfun/IsGuildMember
new file mode 100644
index 0000000..bc29366
--- /dev/null
+++ b/doc/lfun/IsGuildMember
@@ -0,0 +1,67 @@
+
+IsGuildMember()
+***************
+
+
+FUNKTION
+========
+
+ varargs int IsGuildMember(object pl)
+
+
+DEFINIERT IN
+============
+
+ /std/gilden_ob.c
+
+
+RUeCKGABEWERT
+=============
+
+ 1
+ wenn Gildenmitglied
+
+ 0
+ sonst
+
+
+BESCHREIBUNG
+============
+
+ Gibt 1 zurueck, wenn der Spieler Gildenmitglied ist, d.h. P_GUILD
+ entsprechend den Gildennamen gesetzt ist. Weitere Pruefungen auf
+ Properties oder Skills werden nicht vorgenommen.
+
+ Kann fuer Spieleraktionen im Gildenraum benutzt werden. Setzt
+ bereits ein _notify_fail() fuer Nichtgildenmitglieder.
+
+
+BEISPIEL
+========
+
+ protected int clown_weihe(string str)
+ {
+ if(IsGuildMember()) {
+ tortenweihe+=getuid(this_player());
+ this_player()->ReceiveMsg(
+ "Du kniest nieder und empfaengt die Torte des Meisterclown.",
+ MT_NOTIFICATION);
+ send_room(
+ this_object(),
+ this_player()->Name()+" kniet nieder und wird wuerdig getortet.",
+ MT_LOOK|MT_LISTEN,
+ MA_EMOTE, 0, ({this_player()}));
+ return 1;
+ }
+ return 0;
+ }
+
+
+SIEHE AUCH
+==========
+
+ Verwandt:
+ *GuildName()*
+
+ Props:
+ *P_GUILD*
diff --git a/doc/lfun/PreventFollow b/doc/lfun/PreventFollow
index c3de6b1..fcfc2a6 100644
--- a/doc/lfun/PreventFollow
+++ b/doc/lfun/PreventFollow
@@ -12,61 +12,50 @@
ARGUMENTE
=========
- dest: Zielobjekt, in das der Verfolgte bewegt werden soll.
+ dest:
+ Zielobjekt, in das der Verfolgte bewegt werden soll.
FUNKTION
========
In jedem Verfolger, der mit AddPursuer in die Liste der Verfolger
- eingetragen wurde, wird vor dem Bewegen in das Zielobjekt die Funktion
- PreventFollow mit dem Zielobjekt als Argument aufgerufen.
+ eingetragen wurde, wird vor dem Bewegen in das Zielobjekt die
+ Funktion PreventFollow mit dem Zielobjekt als Argument aufgerufen.
RUECKGABEWERT
=============
- 0: Verfolger darf in das Zielobjekt folgen
- 1: Verfolger darf in dieses Zielobjekt nicht folgen
- (Verfolgung bleibt weiterhin aktiv)
- 2: Verfolger darf in dieses Zielobjekt nicht folgen
- (Verfolgung wird abgebrochen und Verfolger aus der Verfolgerliste
- ausgetragen)
+ 0:
+ Verfolger darf in das Zielobjekt folgen
+ 1:
+ Verfolger darf in dieses Zielobjekt nicht folgen (Verfolgung
+ bleibt weiterhin aktiv)
-BEMERKUNG
-=========
-
- Durch PreventFollow kann der raeumliche Bereich, in dem verfolgt werden
- darf, eingeschraenkt werden.
+ 2:
+ Verfolger darf in dieses Zielobjekt nicht folgen (Verfolgung
+ wird abgebrochen und Verfolger aus der Verfolgerliste
+ ausgetragen)
BEISPIELE
=========
- Man moechte, dass ein NPC auf einer Insel nicht mit dem Spieler in das
- Boot steigt, um mit dem Spieler zusammen von der Insel herunterzukommen.
+ Man moechte, dass nur dann verfolgt wird, wenn das Ziel im gleichen
+ Gebiet liegt, wie man selber (wenn __PATH__(1) das
+ Gebietsverzeichnis ist):
- #define PATH(x) ("/d/.../.../mein/pfad/+(x)")
+ int PreventFollow(object ziel) {
- ...
+ if (strstr(load_name(ziel), __PATH__(1)) != 0)
+ return 1;
- int PreventFollow(object boot)
- {
- if ( object_name(boot)[0..strlen(PATH("boot"))-1] == PATH("boot") )
- return 1;
- }
-
- Diese Funktions-Definition ist sehr flexibel, denn sie erlaubt sowohl
- spaetere Pfadanpassung als auch mehrere Boote.
- Da ueber die Funktion strlen() nur bis zum letzten Buchstaben des
- angegebenen Strings getestet wird, wird also gleichzeitig auch auf
- boot[1], boot[2] usw. getestet.
+ }
SIEHE AUCH
==========
- "AddPursuer", "RemovePursuer"
-
-Last modified: Tue Jun 10 13:59:30 2003 by Gabylon
+ * *AddPursuer()*, *RemovePursuer()*
diff --git a/doc/lfun/PrintList b/doc/lfun/PrintList
new file mode 100644
index 0000000..18be079
--- /dev/null
+++ b/doc/lfun/PrintList
@@ -0,0 +1,57 @@
+
+PrintList()
+***********
+
+
+FUNKTION
+========
+
+ varargs protected int PrintList(string filter_fun, int liststyle)
+
+
+DEFINIERT IN
+============
+
+ /std/room/shop.c
+
+
+ARGUMENTE
+=========
+
+ string filter_fun:
+ Bestimmt welche Art von Items angezeigt werden sollen (z.B. nur
+ Waffen).
+
+ int liststyle:
+ Angabe zur Formatierung. - 1: Einspaltige Ausgabe mit mehr
+ Zeichen fuer den Namen. - 0: Die Standardausgabe mit zwei
+ Spalten.
+
+
+BESCHREIBUNG
+============
+
+ Erstellt anhand der Parameter und dem Rueckgabewert von
+ GetShopItems() die Ausgabe der zu verkaufenden Gegenstaende fuer
+ den Spieler.
+
+
+RUECKGABEWERTE
+==============
+
+ Immer 1.
+
+
+BEMERKUNGEN
+===========
+
+ filter_fun bekommt als Argument ein Objekt uebergeben und muss
+ einen Wert !=0 zurueckgeben, wenn das Objekt in die Ausgabe
+ aufgenommen werden soll. Es funktionieren alle Datentypen, es
+ empfiehlt sich aber ein Integer von 1 fuer true.
+
+
+SIEHE AUCH
+==========
+
+ *GetShopItems()*
diff --git a/doc/lfun/RemoveExtraLook b/doc/lfun/RemoveExtraLook
index 0369992..1bcde43 100644
--- a/doc/lfun/RemoveExtraLook
+++ b/doc/lfun/RemoveExtraLook
@@ -2,11 +2,11 @@
RemoveExtraLook()
*****************
-RemoveExtraLook()
+FUNKTION
+========
-int RemoveExtraLook(string look);
-=================================
+int RemoveExtraLook(string key);
DEFINIERT IN
@@ -15,51 +15,78 @@
/std/living/description.c
+ARGUMENTE
+=========
+
+ * string key: Schluessel, unter dem der Extralook registriert
+ wurde ODER Objektname des registrierenden Objektes
+
+
BESCHREIBUNG
============
Der Extralook erscheint in der Langbeschreibung des Lebewesens.
- Eintraege koennen mit dieser Funktion (vorzeitig) wieder entfernt werden.
-
-ARGUMENTE
-=========
-
- - string look:
- Schluesselwort, unter dem der Eintrag, den man entfernen moechte, von
- AddExtraLook() registriert wurde.
-
-
-RUECKGABEWERTE
-==============
-
- > 0, falls der Eintrag erfolgreich entfernt wurde.
- < 0 sonst.
- -1: keinen (gueltigen) <key> uebergeben.
- -2: kein Eintrag fuer <key> gefunden.
+ Eintraege koennen mit dieser Funktion (vorzeitig) wieder entfernt
+ werden. Dazu wird entweder der selbst festgelegte Schluessel oder
+ der implizite Schluessel *object_name()* des setzenden Objekts
+ benoetigt.
BEMERKUNGEN
===========
- Beim Entfernen mit dieser Funktion wird die "Endemeldung" des entfernten
- Eintrages nicht ausgegeben.
+ Beim Entfernen mit dieser Funktion wird die "Endemeldung" des
+ entfernten Eintrages nicht ausgegeben.
+
+
+RUECKGABEWERTE
+==============
+
+ Siehe auch /sys/living/description.h fuer Konstanten.
+
+ * 1, falls der Eintrag erfolgreich entfernt wurde.
+
+ * < 0 sonst.
+
+ * -1: keinen (gueltigen) <key> uebergeben.
+
+ * -2: kein Eintrag fuer <key> gefunden.
BEISPIELE
=========
- # Extralook registrieren.
- living->AddExtraLook("@WER1 wird von einer Horde Daemonen verfolgt.",
- "ennox_daemonenhordenverfolgerlook");
- # Nun kann der Eintrag auch wieder entfernt werden:
+ // (1) Loeschen ueber expliziten Key
+ living->AddExtraLook(
+ "@WER1 wird von einer Horde Daemonen verfolgt.",
+ 1800, "ennox_daemonenhordenverfolgerlook");
+
+ // Nun kann der Eintrag auch wieder entfernt werden:
living->RemoveExtraLook("ennox_daemonenhordenverfolgerlook");
+ // (2) Loeschen ueber impliziten Objektnamen-Schluessel
+ living->AddExtraLook("Eine Sonnenblume ragt aus dem Ohr.")
+ // das ist nur aus dem gleichen Objekt heraus moeglich:
+ living->RemoveExtraLook(0);
+
+ // (3) Loeschen ueber impliziten Objektnamen-Schluessel
+ string implizite_id = object_name(this_object());
+ living->AddExtraLook("Eine Sonnenblume ragt aus dem Ohr.")
+ // diese ID kann man natuerlich durch die Gegend schicken
+ living->RemoveExtraLook(implizite_id);
+
SIEHE AUCH
==========
- AddExtraLook(),
- P_INTERNAL_EXTRA_LOOK
+ Verwandt:
+ *AddExtraLook()*, *P_INTERNAL_EXTRA_LOOK*
-14.05.2007, Zesstra
+ Sonstiges:
+ *replace_personal()*, *break_string()*
+
+ Fuer Spielerobjekte:
+ *P_EXTRA_LOOK*
+
+15. Jun 2017 Gloinson
diff --git a/doc/lfun/SetAttackChats b/doc/lfun/SetAttackChats
index 90e8a66..b5a26e9 100644
--- a/doc/lfun/SetAttackChats
+++ b/doc/lfun/SetAttackChats
@@ -18,87 +18,108 @@
ARGUMENTE
=========
- chance
- Prozentuale Wahrscheinlichkeit einer Ausgabe
- strs
- Stringarray mit den Monsterchats
+ int chance
+ Prozentuale Wahrscheinlichkeit einer Ausgabe
+
+ mixed strs
+ Array mit den verschiedenen Moeglichkeiten der Monsterchats
BESCHREIBUNG
============
- Der NPC gibt mit der Wahrscheinlichkeit 'chance' einen zufaellig
- gewaehlten Text aus 'strs' von sich. Die Arrayelemente koennen
- auch Funktionen ("@@func@@") oder Closures enthalten, die dann
- aufgerufen werden und deren Rueckgabewerte das Monster dann ausgibt.
+ Der NPC gibt mit der Wahrscheinlichkeit <chance> waehrend des
+ Kampfes pro Heartbeat einen zufaellig gewaehlten Text aus dem Array
+ <strs> in den Raum aus. Dabei wird per Default send_room() ohne
+ erneutes Umbrechen mit den Messagetypen
+ MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL verwendet.
+ Die einzelnen Arrayelemente koennen:
-RUECKGABEWERT
-=============
+ * Strings sein
- keiner
+ * Closures sein, deren Rueckgabe ausgegeben wird und die
+ zusaetzlich einen aenderbaren und in send_room() verwendeten
+ 'msg_typ' per Referenz uebergeben bekommen
+
+ * Arrays mit der Struktur *({<string|closure msg >, <int
+ msg_typ>})* sein, fuer die obige Regeln auf 'msg' angewendet
+ werden und bei denen 'msg_typ' im send_room() verwendet wird
+
+ Fuer keine Ausgabe muss man einen Leerstring "" zurueckgeben oder
+ verwenden. In allen Funktionen ist this_player() das Monster
+ selbst. Normalerweise muss man die Nachrichten selbst umbrechen,
+ ausser man uebergibt die Message-Typen explizit und uebergibt kein
+ MSG_DONT_WRAP.
BEMERKUNGEN
===========
- AttackChats werden nur im Kampf ausgegeben. Ansonsten ist SetChats()
- zu verwenden.
+ * ausserhalb des Kampf werden keine AttackChats ausgegeben, man
+ muss dann SetChats() verwenden
+ * die strings werden (noch) durch process_string() geschickt,
+ dieses sollte man aber nicht mehr verwenden
+ * 'chance' gilt sowohl fuer Attack- als auch normale Chats
- 'chance' wird in der Property P_ACHAT_CHANCE abgelegt. Um einen NPC
- voruebergehend 'stillzulegen', kann man P_ACHAT_CHANCE auf 0 setzen.
+ * 'chance' wird in der Property P_CHAT_CHANCE abgelegt. Um einen
+ NPC voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0
+ setzen
+ * Spieler koennen P_CHAT_CHANCE temporaer auf 0 setzen
+ ('stillen')
+ * NPC haben bei Abwesenheit von Spielern in der Regel keinen
+ Heartbeat, weswegen dann auch die Chats ausgeschaltet sind
- Man kann AttackChats nutzen, um Monsterspells zu realisieren. Besser
- ist es aber, dafuer 'AddSpell' zu verwenden.
+ * send_room() bekommt immer MSG_DONT_STORE|MSG_DONT_BUFFER
+ uebergeben
+
+ Man kann AttackChats nutzen, um Monsterspells zu realisieren.
+ Besser ist es aber, dafuer 'AddSpell' zu benutzen, ausser man
+ moechte zB die Spielerfaehigkeit des Abschaltens der Chats
+ verwenden.
BEISPIELE
=========
+ protected string knirschschrei(int msg_typ);
+
SetAttackChats( 20,
- ({ "Der Ork tritt Dir in den Hintern.\n",
- "Der Ork bruellt: Lebend kommst Du hier nicht raus!\n",
- "Der Ork blutet schon aus mehreren Wunden.\n",
- "@@knirsch@@" }) );
+ ({"Der Ork tritt Dir in den Hintern.\n",
+ ({"Der Ork bruellt: Lebend kommst Du hier nicht raus!\n", MT_LISTEN}),
+ ({"Der Ork blutet schon aus mehreren Wunden.\n", MT_LOOK}),
+ #'knirschschrei}));
-
-
- string knirsch()
- {
- object *ruestung, *tmp, helm;
-
-
-
- ruestung = this_player()->QueryProp(P_ARMOURS); // getragene Ruestung
- tmp = filter_objects(ruestung, "id", AT_HELMET);
- // Wenn der Spieler einen Helm traegt, enthaelt 'tmp' jetzt
- // ein Array mit dem Helmobjekt als einzigem Element
- if (sizeof(tmp)) helm = tmp[0];
- if (objectp(helm))
- {
- // AC nur dann senken, wenn sie nicht schon 0 ist.
- if (helm->QueryProp(P_AC)>0) {
- helm->Damage(1);
- return "Der Ork beschaedigt Deinen Helm!\n";
- }
- return "";
+ protected string knirsch(int msg_typ) {
+ object helm = this_player()->QueryArmourByType(AT_HELMET);
+ if (objectp(helm)) {
+ // AC nur dann senken, wenn sie nicht schon 0 ist.
+ if (helm->QueryProp(P_AC)>0) {
+ helm->Damage(1);
+ msg_typ = MT_LISTEN|MT_FEEL;
+ return ("Der Ork schreit dich so laut an, dass dabei "+
+ helm->QueryOwn(WER)+" "+
+ helm->name(RAW)+" beschaedigt wird.");
}
- else
- return ""; // keine Meldung
+ }
+ return ""; // keine Meldung
}
SIEHE AUCH
==========
- P_ACHAT_CHANCE, SetChats(), /std/npc/chat.c, AddSpell()
+ Verwandt:
+ *SetChats()*, *AddSpell()*
+ Props:
+ *P_CHAT_CHANCE*
-LETZTE AENDERUNG
-================
+ Sonstiges:
+ *send_room()*, *process_string()*
- Don, 27.12.2007, 16:35:00 von Arathorn
+3. April 2017 Gloinson
diff --git a/doc/lfun/SetChats b/doc/lfun/SetChats
index 70d312e..ee6d04b 100644
--- a/doc/lfun/SetChats
+++ b/doc/lfun/SetChats
@@ -6,7 +6,7 @@
FUNKTION
========
- void SetChats(int chance,mixed strs);
+ void SetChats(int chance, mixed strs);
DEFINIERT IN
@@ -18,77 +18,139 @@
ARGUMENTE
=========
- chance
- Prozentuale Wahrscheinlichkeit einer Ausgabe
- strs
- Stringarray mit den Monsterchats
+ int chance
+ Prozentuale Wahrscheinlichkeit einer Ausgabe
+
+ mixed strs
+ Array mit den verschiedenen Moeglichkeiten der Monsterchats
BESCHREIBUNG
============
- Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat einen
- zufaellig gewaehlten Text aus dem Array <strs> von sich.
- Die Arrayelemente koennen auch Closures oder
- process_string()-Funktionen ("@@func@@") enthalten, die dann
- aufgerufen werden und deren Rueckgabewerte das Monster dann ausgibt.
- (Fuer keine Ausgabe dann Leerstring "" zurueckgeben!)
- In diesen Funktionen ist this_player() das Monster selbst!
- Fuer Zeilenumbrueche ist immer selbst zu sorgen.
+ Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat
+ einen zufaellig gewaehlten Text aus dem Array <strs> in den Raum
+ aus. Dabei wird per Default send_room() ohne erneutes Umbrechen mit
+ den Messagetypen MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL verwendet.
+ Die einzelnen Arrayelemente koennen:
-RUECKGABEWERT
-=============
+ * Strings sein
- keiner
+ * Closures sein, deren Rueckgabe ausgegeben wird und die
+ zusaetzlich einen aenderbaren und in send_room() verwendeten
+ 'msg_typ' per Referenz uebergeben bekommen
+ * Arrays mit der Struktur *({<string|closure msg >, <int
+ msg_typ>})* sein, fuer die obige Regeln auf 'msg' angewendet
+ werden und bei denen 'msg_typ' im send_room() verwendet wird
-BEISPIELE
-=========
-
- Ein einfaches Beispiel:
- // Prototype fuer Closure.
- static string info1();
- void create()
- { ...
- SetChats(20,
- ({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n",
- "Der Ork grinst Dich unverschaemt an.\n",
- "Der Ork wedelt mit seinem Saebel vor Deinem Gesicht herum.\n",
- "Der Ork droht Dir mit der Faust.\n",
- #'info1,
- "@@info2@@"}));
- }
- // Funktion als Closure. Prototype notwendig!
- static string info1()
- { if(QueryProp(P_HP)<QueryProp(P_ALIGN))
- return"Gleich werde ich von hier fliehen!\n";
- return"";
- }
- // Funktion als process_string().
- string info2()
- { return QueryProp(P_HP)==QueryProp(P_MAX_HP)?
- "Der Ork grinst: Mir geht es fantastisch!\n":
- "Der Ork seufzt: Mir ging es wirklich schon mal besser.\n";
- }
+ Fuer keine Ausgabe muss man einen Leerstring "" zurueckgeben oder
+ verwenden. In allen Funktionen ist this_player() das Monster
+ selbst. Normalerweise muss man die Nachrichten selbst umbrechen,
+ ausser man uebergibt die Message-Typen explizit und uebergibt kein
+ MSG_DONT_WRAP.
BEMERKUNGEN
===========
- Im Kampf werden keine Chats ausgegeben. Es ist dann SetAttackChats()
- zu verwenden.
- Funktionen als process_string() sollte man nicht mehr verwenden.
- <chance> wird in der Property P_CHAT_CHANCE abgelegt. Um einen NPC
- voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0 setzen.
- Wenn kein Spieler anwesend ist, haben NPC in der Regel keinen Heartbeat,
- weswegen dann auch die Chats ausgeschaltet sind.
- Spieler koennen NPC 'stillen', d.h. Chats und AttackChats abschalten.
+ * im Kampf werden keine Chats ausgegeben, man muss dann
+ SetAttackChats() verwenden
+
+ * die strings werden (noch) durch process_string() geschickt,
+ dieses sollte man aber nicht mehr verwenden
+
+ * 'chance' gilt sowohl fuer Attack- als auch normale Chats
+
+ * 'chance' wird in der Property P_CHAT_CHANCE abgelegt. Um einen
+ NPC voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0
+ setzen
+
+ * Spieler koennen P_CHAT_CHANCE temporaer auf 0 setzen
+ ('stillen')
+
+ * NPC haben bei Abwesenheit von Spielern in der Regel keinen
+ Heartbeat, weswegen dann auch die Chats ausgeschaltet sind
+
+ * send_room() bekommt immer MSG_DONT_STORE|MSG_DONT_BUFFER
+ uebergeben
+
+
+BEISPIELE
+=========
+
+ // Ein einfaches Beispiel:
+ SetChats(20,
+ ({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n",
+ "Der Ork grinst Dich unverschaemt an.\n",
+ "Der Ork wedelt mit seinem Saebel vor dir herum.\n",
+ "Der Ork stupst Dich mit dem Finger hart.\n"}));
+
+ // Ein Beispiel mit send_room-Typen ohne MSG_DONT_WRAP
+ SetChats(20,
+ ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.", MT_LISTEN}),
+ ({"Der Ork grinst Dich unverschaemt an.", MT_LOOK}),
+ ({"Der Ork wedelt mit seinem Saebel vor dir herum.", MT_LOOK}),
+ ({"Der Ork stupst Dich mit dem Finger hart.", MT_LOOK|MT_FEEL})}));
+
+ // Laengeres Beispiel mit Closures
+ protected string chat_flightinfo(int msg_typ);
+ protected string chat_trysteal(int msg_typ);
+
+ void create() {
+ SetChats(20,
+ ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n", MT_LISTEN}),
+ #'chat_flightinfo,
+ #'chat_trysteal}));
+ // [...]
+ }
+
+ protected string chat_flightinfo(int msg_typ) {
+ msg_typ = MT_LISTEN;
+ return ("Der Ork sagt: "+
+ (QueryProp(P_HP)<QueryProp(P_WIMPY)?
+ "Ich hab Angst!":
+ "Guck mich nicht so an, Schwaechling!"));
+ }
+
+ protected string chat_trysteal(int msg_typ) {
+ object *pls = filter(all_inventory(environment()), #'interactive);
+ if(sizeof(pls)) {
+ object pl = pls[random(sizeof(pls))];
+ if(!IS_LEARNER(pl)) {
+ object *objs = all_inventory(pl);
+ if(sizeof(objs)) {
+ object ob = objs[random(sizeof(objs))];
+ if(ob->move(this_object(),
+ M_NO_SHOW|M_GIVE|M_MOVE_ALL)==MOVE_OK) {
+ if(pl->ReceiveMsg(Name(WER)+" stiehlt dir "+ob->name(WEN, 0)+".",
+ MT_FEEL|MT_LOOK)<0)
+ pl->ReceiveMsg("Irgendwie scheint dir jetzt etwas zu fehlen.",
+ MT_FEEL|MT_LOOK|MSG_DONT_IGNORE);
+ send_room(environment(),
+ Name(WER, 1)+" bestiehlt "+pl->name(WEN)+".",
+ MT_LOOK, 0, 0, ({pl}));
+ return "";
+ }
+ }
+ }
+ }
+ msg_typ = MT_LOOK;
+ return Name(WER, 1)+" schaut sich verstohlen um.";
+ }
SIEHE AUCH
==========
- P_CHAT_CHANCE, SetAttackChats(), process_string()
+ Verwandt:
+ *SetAttackChats()*
-Last modified: Sat Jan 18 18:48:06 2003 by Patryn
+ Props:
+ *P_CHAT_CHANCE*
+
+ Sonstiges:
+ *send_room()*, *process_string()*
+
+3. April 2017 Gloinson
diff --git a/doc/lfun/list b/doc/lfun/list
new file mode 100644
index 0000000..41b989f
--- /dev/null
+++ b/doc/lfun/list
@@ -0,0 +1,44 @@
+
+list()
+******
+
+
+FUNKTION
+========
+
+ int list(string str)
+
+
+DEFINIERT IN
+============
+
+ /std/room/shop.c
+
+
+ARGUMENTE
+=========
+
+ string str: Durch den Spieler eingegebene Argumente
+
+
+BESCHREIBUNG
+============
+
+ Diese Funktion wird aufgerufen, wenn ein Spieler im Laden 'zeige'
+ eingibt. Anhand von str wird geprueft, welche Art von Waren er
+ aufgelistet haben moechte und in welchem Format. Diese
+ Informationen werden dann zur Ausgabe an PrintList()
+ weitergeleitet.
+
+
+RUECKGABEWERTE
+==============
+
+ 1 bei erfolgreichem Erkennen der Parameter, sonst 0. (siehe auch
+ AddCmd())
+
+
+SIEHE AUCH
+==========
+
+ *PrintList()*, *AddCmd()*
diff --git a/doc/lfun/obsolete/AddRoomCmd b/doc/lfun/obsolete/AddRoomCmd
new file mode 100644
index 0000000..f4aeb68
--- /dev/null
+++ b/doc/lfun/obsolete/AddRoomCmd
@@ -0,0 +1,23 @@
+
+AddRoomCmd()
+************
+
+
+SYNTAX
+======
+
+ AddRoomCmd( string kommando, string funktion );
+ AddRoomCmd( string *kommandos, string funktion );
+
+
+FUNKTION
+========
+
+ Diese Funktion ist veraltet. Sie wird vollstaendig durch
+ die Funktion AddCmd ersetzt.
+
+
+SIEHE AUCH
+==========
+
+ "AddCmd"
diff --git a/doc/lfun/obsolete/DoList b/doc/lfun/obsolete/DoList
new file mode 100644
index 0000000..4a20ef8
--- /dev/null
+++ b/doc/lfun/obsolete/DoList
@@ -0,0 +1,39 @@
+
+DoList()
+********
+
+********************* OBSOLETE LFUN
+*********************************** * Diese Lfun bitte nicht mehr
+benutzen, sondern stattdessen * * PrintList()
+* *******************************************************************
+****
+
+
+FUNKTION
+========
+
+ static int DoList(string query_fun)
+
+
+DEFINIERT IN
+============
+
+ /std/room/shop.c
+
+
+BESCHREIBUNG
+============
+
+ Veraltete Version von PrintList(), bitte nicht verwenden!
+
+
+RUECKGABEWERTE
+==============
+
+ Immer 1.
+
+
+SIEHE AUCH
+==========
+
+ "PrintList"
diff --git a/doc/lfun/obsolete/GetList b/doc/lfun/obsolete/GetList
new file mode 100644
index 0000000..5cd4fec
--- /dev/null
+++ b/doc/lfun/obsolete/GetList
@@ -0,0 +1,39 @@
+
+GetList()
+*********
+
+********************* OBSOLETE LFUN
+*********************************** * Diese Lfun bitte nicht mehr
+benutzen, sondern stattdessen * * GetShopItems()
+* *******************************************************************
+****
+
+
+FUNKTION
+========
+
+ static mixed >>*<<GetList()
+
+
+DEFINIERT IN
+============
+
+ /std/room/shop.c
+
+
+BESCHREIBUNG
+============
+
+ Veraltete Version von GetShopItems(), bitte nicht verwenden!
+
+
+RUECKGABEWERTE
+==============
+
+ Liste der verkaeuflichen Objekte.
+
+
+SIEHE AUCH
+==========
+
+ "GetShopItems"
diff --git a/doc/lfun/obsolete/extra_look b/doc/lfun/obsolete/extra_look
index d8e9703..6d134a9 100644
--- a/doc/lfun/obsolete/extra_look
+++ b/doc/lfun/obsolete/extra_look
@@ -4,7 +4,7 @@
********************* VERALTETE LFUN ****************************** *
Diese LFUN ist veraltet. Bitte benutzt sie NICHT mehr, sondern * *
-stattdessden AddExtraLook(). *
+stattdessden AddExtraLook() oder P_EXTRA_LOOK. *
*******************************************************************
extra_look()
@@ -19,14 +19,12 @@
BESCHREIBUNG
============
- Kann in Objekt definiert sein. Wenn ein Living (std/living/description)
- das Objekt enthaelt, wird zu dessen long() der zurueckgegebene String
- hinzugefuegt.
+ Kann in Objekt definiert sein. Wenn ein Living
+ (std/living/description) das Objekt enthaelt, wird zu dessen long()
+ der zurueckgegebene String hinzugefuegt.
SIEHE AUCH
==========
- AddExtraLook()
-
-25.Jan 2015 Gloinson
+ *AddExtraLook()*, *P_EXTRA_LOOK*