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;