Doku: AddInfo und IsGuildMember korrigiert
* AddInfo durchgesehen und mit Beispiel versehen
* Code-Tag in IsGuildMember korrigiert
Change-Id: I709ac1178c59872cf2019e0ef2964edf224d5f08
diff --git a/doc/beispiele/AddInfo/goldklumpen.c b/doc/beispiele/AddInfo/goldklumpen.c
new file mode 100644
index 0000000..a1319e1
--- /dev/null
+++ b/doc/beispiele/AddInfo/goldklumpen.c
@@ -0,0 +1,22 @@
+#pragma strong_types, save_types, rtt_checks, pedantic
+inherit "/std/thing";
+
+#include <properties.h>
+
+protected void create() {
+ if(!clonep(this_object())) return;
+ ::create();
+
+ AddId(({"klumpen", "goldklumpen"}));
+
+ SetProp(P_NAME, "Goldklumpen");
+ SetProp(P_SHORT, "Ein Goldklumpen");
+ SetProp(P_LONG, break_string(
+ "Ein Klumpen Gold. Heb ihn doch auf und frage ein Monster "
+ "nach Gold.", 78));
+
+ SetProp(P_GENDER, MALE);
+ SetProp(P_WEIGHT, 200);
+ SetProp(P_VALUE, 0);
+ SetProp(P_MATERIAL, MAT_GOLD);
+}
diff --git a/doc/beispiele/AddInfo/keks.c b/doc/beispiele/AddInfo/keks.c
new file mode 100644
index 0000000..d0f2ea1
--- /dev/null
+++ b/doc/beispiele/AddInfo/keks.c
@@ -0,0 +1,24 @@
+#pragma strong_types, save_types, rtt_checks, pedantic
+inherit "/std/thing";
+
+#include <properties.h>
+
+protected void create() {
+ if(!clonep(this_object())) return;
+ ::create();
+
+ AddId(({"keks"}));
+
+ SetProp(P_NAME, "Keks");
+ SetProp(P_SHORT, "Ein Keks");
+ SetProp(P_LONG, break_string(
+ "Ein leckerer Keks. Gib ihn doch einem Monster.",78));
+
+ SetProp(P_GENDER, MALE);
+ SetProp(P_WEIGHT, 20);
+ SetProp(P_VALUE, 0);
+ SetProp(P_MATERIAL, MAT_MISC_PLANT);
+
+ AddCmd("iss|mampf|friss&@ID&\n", 0,
+ "Was willst du essen?|Sieht nicht lecker genug aus.^");
+}
diff --git a/doc/beispiele/AddInfo/monster.c b/doc/beispiele/AddInfo/monster.c
new file mode 100644
index 0000000..5ffe117
--- /dev/null
+++ b/doc/beispiele/AddInfo/monster.c
@@ -0,0 +1,99 @@
+#pragma strong_types, save_types, rtt_checks, pedantic
+inherit "std/npc";
+
+#include <properties.h>
+
+protected string query_kekse();
+protected string question_gold();
+
+protected void create() {
+ if (!clonep(this_object())) return;
+ ::create();
+
+ SetProp(P_SHORT, "Ein Monster");
+ SetProp(P_LONG, break_string(
+ "Das Monster sieht dich hungrig an. "
+ "Wahrscheinlich will es Geld oder Kekse.", 78));
+ SetProp(P_NAME, "Monster");
+ SetProp(P_GENDER, NEUTER);
+ AddId("monster");
+
+ SetProp(P_RACE, "Monster");
+ SetProp(P_XP, 0);
+ SetProp(P_BODY, 50);
+ SetProp(P_SIZE, random(20)+110);
+
+ // Beispiel 1
+ AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
+
+ // Beispiel 2
+ AddInfo(({"knete","kohle"}),
+ "sagt: ich habe so etwas nicht.");
+ AddInfo("geld",
+ "Ich habe zwar kein Geld, aber [...] blablabla [...] blub muh quak "
+ "lorem blupsum Umbruch now!",
+ "sagt: ");
+ AddInfo("muenzen",
+ "fluestert: Du willst Geld?",
+ 0,
+ "fluestert @WEM etwas zu.");
+
+ // Beispiel 3
+ AddInfo(({"keks","kekse"}),
+ #'query_kekse, // ein Verweis auf die Funktion
+ "sagt: ");
+
+ // Beispiel 5
+ AddInfo("gold", #'question_gold, "murmelt: ", 1);
+}
+
+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!");
+}
+
+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
+ 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)?"hast ja ein paar Wertsachen dabei: "+
+ CountUp(y)+
+ (sizeof(y)==1?" ist":" sind")+
+ " aus Gold.":"")):
+ ""));
+}
\ No newline at end of file
diff --git a/doc/beispiele/AddInfo/raum.c b/doc/beispiele/AddInfo/raum.c
new file mode 100644
index 0000000..e1570c5
--- /dev/null
+++ b/doc/beispiele/AddInfo/raum.c
@@ -0,0 +1,20 @@
+#pragma strong_types, save_types, rtt_checks, pedantic, no_clone
+inherit "/std/room";
+
+#include <config.h>
+#include <properties.h>
+
+protected void create() {
+ ::create();
+
+ SetProp(P_INT_LONG, "Ein leerer Raum.\n");
+ SetProp(P_INT_SHORT, "Im leeren Raum");
+ SetProp(P_LIGHT, 1);
+
+ AddItem(__PATH__(0)"monster", REFRESH_REMOVE);
+ AddItem(__PATH__(0)"keks", REFRESH_REMOVE);
+ AddItem(__PATH__(0)"goldklumpen", REFRESH_REMOVE);
+ AddItem(__PATH__(0)"zuhoerer", REFRESH_REMOVE);
+
+ AddExit("gilde", "/gilden/abenteurer");
+}
diff --git a/doc/beispiele/AddInfo/zuhoerer.c b/doc/beispiele/AddInfo/zuhoerer.c
new file mode 100644
index 0000000..b46a59c
--- /dev/null
+++ b/doc/beispiele/AddInfo/zuhoerer.c
@@ -0,0 +1,47 @@
+#pragma strong_types, save_types, rtt_checks, pedantic
+inherit "std/npc";
+
+#include <properties.h>
+
+protected void create() {
+ if (!clonep(this_object())) return;
+ ::create();
+
+ SetProp(P_SHORT, "Ein Beobachter");
+ SetProp(P_LONG, break_string(
+ "Der Beobachter hoert und sieht zu.", 78));
+ SetProp(P_NAME, "Beobachter");
+ SetProp(P_GENDER, MALE);
+ AddId("beobachter");
+
+ SetProp(P_RACE, "Beobachter");
+ SetProp(P_XP, 0);
+ SetProp(P_BODY, 50);
+}
+
+private string buf = "";
+
+void empty_buffer() {
+ tell_room(environment(),
+ "\nDer Zuhoerer murmelt: 'Folgendes habe ich gesehen'\n***\n"+
+ buf+
+ "***\n",
+ ({this_object()}));
+ buf = "";
+}
+
+public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action,
+ string msg_prefix, mixed origin) {
+ if (msg_typ & MSG_DONT_WRAP)
+ buf+=sprintf("%s%s", msg_prefix||"", msg);
+ else
+ buf+=sprintf("%s%s\n", msg_prefix||"", msg);
+ if(find_call_out("empty_buffer")<0)
+ call_out("empty_buffer", 1);
+}
+
+void catch_tell(string msg) {
+ buf+=msg;
+ if(find_call_out("empty_buffer")<0)
+ call_out("empty_buffer", 1);
+}
diff --git a/doc/sphinx/lfun/AddInfo.rst b/doc/sphinx/lfun/AddInfo.rst
index 2a7928a..1a057da 100644
--- a/doc/sphinx/lfun/AddInfo.rst
+++ b/doc/sphinx/lfun/AddInfo.rst
@@ -3,35 +3,33 @@
FUNKTION
--------
-::
varargs void AddInfo( frage, meldung
- [, indent [, [silent [, casebased] ] ] );
+ [, indent [, [silent [, casebased] ] ] );
DEFINIERT IN
------------
-::
/std/npc/info.c
ARGUMENTE
---------
-::
string/string* frage
- Schluesseltext(e) auf die Informationen gegeben werden sollen.
+ 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.
+ Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
int/string silent
- Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
+ 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
@@ -49,8 +47,7 @@
Indent:
Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
- Monsternamen noch das 'indent' vorangesetzt. Zusaetzlich wird
- 'meldung' auf jeden Fall sauber umgebrochen.
+ Monsternamen noch das 'indent' vorangesetzt.
Ein typisches indent ist "sagt: ".
Silent:
@@ -61,13 +58,16 @@
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
+
+ # 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,
+ 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,
@@ -80,27 +80,31 @@
BEISPIELE
---------
-::
+ Siehe auch: /doc/beispiele/AddInfo/
- ### eine Standardantwort setzen ###
+.. code-block:: pike
+
+ // 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 ###
+.. code-block:: pike
+
+ // 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:
@@ -108,47 +112,52 @@
// - alle andere hoeren:
// "Das Monster fluestert <Fragenstellernamen> etwas zu."
- ### 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!");
- }
+.. code-block:: pike
+ // Beispiel 3: dynamisch
+ // ein Prototyp, damit wir die Methode bekannt machen
+ 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 ###
+.. code-block:: pike
+
+ // 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":
@@ -159,59 +168,55 @@
// - sonst:
// "Das Monster sagt: "Menno. Keine mehr da!
+.. code-block:: pike
- ### 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.":"")):
@@ -229,15 +234,19 @@
// oder
// "Das Monster murmelt @WEM etwas zu und glotzt ihn/sie gierig an."
+
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:
+ :doc:`AddSpecialInfo`, :doc:`RemoveInfo`
+ Props:
+ :doc:`../props/P_PRE_INFO`
+ Files:
+ /std/npc/info.c
+ Loggen:
+ :doc:`P_LOG_INFO`
+ Interna:
+ :doc:`GetInfoArr` , :doc:`do_frage`
-7.Apr 2004 Gloinson
-
+7. Mar 2017 Gloinson
diff --git a/doc/sphinx/lfun/IsGuildMember.rst b/doc/sphinx/lfun/IsGuildMember.rst
index 42355ff..18672f4 100644
--- a/doc/sphinx/lfun/IsGuildMember.rst
+++ b/doc/sphinx/lfun/IsGuildMember.rst
@@ -32,7 +32,7 @@
BEISPIEL
--------
- .. code-block:: pike
+.. code-block:: pike
protected int clown_weihe(string str)
{
@@ -44,7 +44,8 @@
send_room(
this_object(),
this_player()->Name()+" kniet nieder und wird wuerdig getortet.",
- MT_LOOK|MT_LISTEN);
+ MT_LOOK|MT_LISTEN,
+ MA_EMOTE, 0, ({this_player()}));
return 1;
}
return 0;