Wrapper fuer ReceiveMsg()

Da die Wrapper im /std/room thematisch nirgendwo hin passten, wurde
/std/room/comm.c neu erstellt und ReceiveMsg() aus /std/room/items.c
dort hin verlegt.

Die lfun _notify() ist durch SendNotify() ueberfluessig und wurde
ersetzt.

Change-Id: Ia42d131228963cbf8023f6b1563c38f65a38bd63
diff --git a/doc/sphinx/lfun/ReceiveMsg.rst b/doc/sphinx/lfun/ReceiveMsg.rst
index 457235b..1734eb0 100644
--- a/doc/sphinx/lfun/ReceiveMsg.rst
+++ b/doc/sphinx/lfun/ReceiveMsg.rst
@@ -66,7 +66,9 @@
     In diesem Fall ist der Rueckgabe der kleinste von allen gerufenen
     ReceiveMsg() zurueckgelieferte Wert.
 
-    
+  Zur einfacheren Verwendung gibt es einige Wrapper-Funktionen, siehe
+  :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay` und
+  :doc:`ReceiveTeilemit`.
 
 RUeCKGABEWERT
 -------------
@@ -274,10 +276,10 @@
 ----------
 ::
 
+    Wrapper-Funktionen: :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay`, :doc:`ReceiveTeilemit`
     Verwandt: send_room(SE)
     Lfuns:    TestIgnore(L)
     Efuns:    tell_object(E), catch_tell(L), catch_msg(L)
               query_verb(E), query_once_interactive(E), break_string(SE)
 
-13.03.2016, Zesstra
-
+Letzte Aenderung: 07.01.2022
diff --git a/doc/sphinx/lfun/ReceiveMultisense.rst b/doc/sphinx/lfun/ReceiveMultisense.rst
new file mode 100644
index 0000000..cafa5bc
--- /dev/null
+++ b/doc/sphinx/lfun/ReceiveMultisense.rst
@@ -0,0 +1,86 @@
+ReceiveMultisense()
+===================
+
+FUNKTION
+--------
+
+  public int* ReceiveMultisense(struct msg_s* msgs,
+    string action = 0, int commontypes = 0)
+  
+DEFINIERT IN
+------------
+
+  /std/living/comm.c
+  /std/room/comm.c
+  /sys/living/comm.h
+
+ARGUMENTE
+---------
+
+  struct msg_s* msgs
+    Die Auszugebenden Nachrichten mit Zusatzinformationen. (S.u.)
+  string action
+    action wird als action an ReceiveMsg() weitergegeben.
+  int commontypes
+    Muss einen oder mehrere Veroderte messagetypes aus
+    :doc:`ReceiveMsg` enthalten. Diese werden bei jedem Aufruf von
+    :doc:`ReceiveMsg` mit dem jeweiligen Messagetyp aus msgs verodert.
+
+BESCHREIBUNG
+------------
+
+  sendet die in msgs angegebenen Nachrichten an den Empfaenger, bis eine
+  zugestellt werden konnte oder das ende von msgs erreicht wurde.
+
+  msgs ist aufgebaut wie folt:
+  Der struct msg_s ist in /std/living/comm_structs.c definiert. Er hat
+  die Eintraege string msg, int type, string prefix.
+  Das Array wird abgearbeitet, bis eine Nachricht zugestellt werden konnte
+  oder das Ende erreicht ist. msg wird vor der Ausgabe an
+  :doc:`../sefun/replace_personal` uebergeben, als erstes Objekt wird das aufrufende
+  Objekt uebergeben, als zweites this_player(), sofern vorhanden. msg wird
+  automatisch auf 78 Zeichen umgebrochen, vorhandene Zeilenumbrueche werden
+  dabei beibehalten. Fuer prefix findet keine Ersetzung statt.
+
+RUECKGABEWERT
+-------------
+
+  Ein Integer-Array mit folgenden Werten:
+
+  0
+    Der Rueckgabewert von :doc:`../lfun/ReceiveMsg`.
+  1
+    Information, welche Meldung zugestellt wurde. -1 steht fuer keine
+    Meldung, ein wert >= 0 fuer die jeweilige Position in msgs.
+
+  Raeume definieren standardmaessig ebenfalls ein ReceiveMultisense(), welches in
+  jedem Objekt im Raum ReceiveMultisense() mit den uebergebenen Argumenten aufruft.
+  In diesem Fall ist der Rueckgabe der kleinste von allen gerufenen
+  ReceiveMultisense() zurueckgelieferte Wert.
+
+BEISPIEL
+--------
+
+  .. code-block:: pike
+
+  inherit "/std/living/comm_structs";
+  this_player().ReceiveMultisense(
+    ({
+      (<msg_s>
+        msg: "Ein Drache landet neben Dir.",
+        type: MT_LOOK),
+      (<msg_s>
+        message: "Du hoerst ein rumpeln, als waere gerade etwas grosses "
+          "neben Dir eingeschlagen.",
+        type: MT_LISTEN),
+      (<msg_s>
+        msg: "Du spuerst einen heftigen Luftzug.",
+        type: MT_FEEL)})
+    MA_MOVE_IN);
+      
+SIEHE AUCH
+----------
+
+  :doc:`ReceiveMsg`, :doc:`../sefun/replace_personal`
+
+Letzte Aenderung: 07.10.2021, Bugfix
diff --git a/doc/sphinx/lfun/ReceiveNotify.rst b/doc/sphinx/lfun/ReceiveNotify.rst
new file mode 100644
index 0000000..d4171f4
--- /dev/null
+++ b/doc/sphinx/lfun/ReceiveNotify.rst
@@ -0,0 +1,56 @@
+ReceiveNotify()
+===============
+
+FUNKTION
+--------
+
+  public int ReceiveNotify(string msg, string action = 0)
+
+DEFINIERT IN
+------------
+
+  /std/living/comm.c
+  /sys/living/comm.h
+
+ARGUMENTE
+---------
+
+  string msg
+    Die auszugebende Meldung. Sie wird automatisch auf 78 Zeichen umgebrochen,
+    vorhandene Zeilenumbrueche werden dabei beibehalten.
+  string action
+    action wird als action an :doc:`ReceiveMsg` weitergegeben.
+
+BESCHREIBUNG
+------------
+
+  Sendet msg via ReceiveMsg() mit MT_NOTIFICATION | MSG_BS_LEAVE_LFS und den
+  uebergebenen bzw. voreingestellten Werten fuer prefix und action an den
+  Empfaenger.
+
+BEMERKUNGEN
+-----------
+
+  Bitte beachten: MT_NOTIFICATION ist fuer Kommandobestaetigungen,
+  Statusmeldungen o.ae., d.h. out-of-character Meldungen vorgesehen. Es soll
+  nicht als Sammeltyp fuer nicht-ignorierbare Meldungen verwendet werden,
+  dafuer gibt es MSG_DONT_IGNORE in Kombination mit den anderen Typen.
+
+RUECKGABEWERT
+-------------
+
+  Der Rueckgabewert von :doc:`../lfun/ReceiveMsg`.
+
+BEISPIEL
+--------
+
+  .. code-block:: pike
+
+  this_player().ReceiveNotify("Dazu reicht dein Level nicht aus.");
+
+SIEHE AUCH
+----------
+
+  :doc:`ReceiveMsg`
+
+Letzte Aenderung: 07.10.2021, Bugfix
diff --git a/doc/sphinx/lfun/ReceiveSay.rst b/doc/sphinx/lfun/ReceiveSay.rst
new file mode 100644
index 0000000..33ceee1
--- /dev/null
+++ b/doc/sphinx/lfun/ReceiveSay.rst
@@ -0,0 +1,92 @@
+ReceiveSay()
+============
+
+FUNKTION
+--------
+
+  public int* ReceiveSay(string msg, string prefix = 0,
+    struct msg_s sense_blocked =
+      ({(<msg_s>
+        msg: "@WER1 bewegt die Lippen, Du hoerst jedoch nichts.",
+        type: MT_LOOK)}))
+
+DEFINIERT IN
+------------
+
+  /std/living/comm.c
+  /std/room/comm.c
+  /sys/living/comm.h
+  
+ARGUMENTE
+---------
+
+  string msg
+    Die auszugebende Meldung. Sie wird vor der Ausgabe an
+    :doc:`../sefun/replace_personal` uebergeben, als erstes Objekt wird das aufrufende
+    Objekt uebergeben, als zweites this_player(), sofern vorhanden. msg wird
+    automatisch auf 78 Zeichen umgebrochen, vorhandene Zeilenumbrueche werden
+    dabei beibehalten.
+  string prefix
+    prefix wird als prefix an :doc:`ReceiveMsg` weitergegeben. Eine
+    Ersetzung mittels :doc:`replace_personal` findet nicht statt.
+    Wird kein Wert uebergeben, wird
+    previous_object().Name(WER, 1) + " sagt: " verwendet. Hierzu muss Name()
+    am aufrufenden Objekt definiert sein und etwas sinnvolles zurueckgeben.
+  struct msg_s sense_blocked
+    Ersatzmeldungen fuer taube Spieler. enthaelt Structs vom Typ msg_s.
+    Dieser ist in /std/living/comm_structs.c definiert und enthaelt die
+    Eintraege string msg, int type, string prefix.
+    Das Array wird von vorne nach hinten
+    abgearbeitet, bis eine Nachricht zugestellt werden konnte oder das Ende
+    erreicht ist. Auch hier findet fuer msg eine Ersetzung mittels
+    :doc:`../sefun/replace_personal` statt, fuer prefix nicht.
+
+BESCHREIBUNG
+------------
+
+  Sendet msg per :doc:`ReceiveMsg` mit den ueblichen Argumenten von
+  "sage" an den Empfaenger. D.h.: MT_LISTEN, MA_SAY, Name(WER, 1) + " sagt: ". Hierzu
+  muss das aufrufende Objekt :doc:`name` definiert haben und dort
+  etwas sinnvolles zurueckgeben. Falls ein anderer prefix gewaehlt wurde,
+  wird dieser statt Name(WER, 1)  " sagt: " verwendet. 
+
+RUECKGABEWERT
+-------------
+
+  Ein Integer-Array mit folgenden Werten:
+
+  0
+    Der Rueckgabewert von :doc:`../lfun/ReceiveMsg`.
+  1
+    Information, welche Meldung zugestellt wurde. -1 steht fuer msg, ein wert
+    >= 0 fuer die jeweilige Position in sense_blocked.
+
+  Raeume definieren standardmaessig ebenfalls ein ReceiveSay(), welches in
+  jedem Objekt im Raum ReceiveSay() mit den uebergebenen Argumenten aufruft.
+  In diesem Fall ist der Rueckgabe der kleinste von allen gerufenen
+  ReceiveSay() zurueckgelieferte Wert.
+
+BEISPIEL
+--------
+
+  .. code-block:: pike
+
+  SetProp(P_NAME, "Questgeber");
+  SetProp(P_GENDER, MALE);
+  this_player().ReceiveSay(
+    "Das hast Du prima gemacht, @WER2!",
+    Name(WER, 1) + " lobt Dich: ",
+    ({
+      (<message_> 
+        msg: "@WER1 nickt Dir laechelnd zu.",
+        type: MT_LOOK),
+      (<msg_s> 
+        msg: "Jemand klopft Dir lobend auf die Schulter.",
+        type: MT_FEEL)}));
+
+SIEHE AUCH
+----------
+
+  :doc:`ReceiveMsg`, :doc:`../sefun/replace_personal`, :doc:`name`
+
+Letzte Aenderung: 07.10.2021, Bugfix
diff --git a/doc/sphinx/lfun/ReceiveTeilemit.rst b/doc/sphinx/lfun/ReceiveTeilemit.rst
new file mode 100644
index 0000000..46648f3
--- /dev/null
+++ b/doc/sphinx/lfun/ReceiveTeilemit.rst
@@ -0,0 +1,54 @@
+ReceiveTeilemit()
+=================
+
+FUNKTION
+--------
+
+  public int ReceiveTeilemit(string msg)
+  
+DEFINIERT IN
+------------
+
+  /std/living/comm.c
+
+ARGUMENTE
+---------
+
+  string msg
+    Die auszugebende Meldung. Sie wird vor der Ausgabe an
+    :doc:`../sefun/replace_personal` uebergeben, als erstes Objekt wird das aufrufende
+    Objekt uebergeben, als zweites this_player(), sofern vorhanden. msg wird
+    automatisch auf 78 Zeichen umgebrochen, vorhandene Zeilenumbrueche werden
+    dabei beibehalten.
+
+BESCHREIBUNG
+------------
+
+  Sendet msg per :doc:`../lfun/ReceiveMsg` mit den ueblichen Argumenten von
+  "teile mit" an pl. D.h.: MT_COMM | MT_FAR, MA_TELL, Name(WER, 1) + " teilt
+  Dir mit: ". Hierzu muss das aufrufende Objekt :doc:`name` definiert
+  haben und dort etwas sinnvolles zurueckgeben. Der einzige Unterschied zum
+  normalen "teile mit" ist, dass zusaetzlich MSG_DONT_STORE uebergeben wird.
+  Da es sich hier ueblicherweise nicht um Kommunikation zwischen Spielern
+  handelt, muss die Nachricht nicht in die tmhist.
+
+RUECKGABEWERT
+-------------
+
+  Der Rueckgabewert von :doc:`../lfun/ReceiveMsg`.
+
+BEISPIEL
+--------
+
+  .. code-block:: pike
+
+  SetProp(P_NAME, "Questgeber");
+  SetProp(P_GENDER, MALE);
+  this_player().ReceiveTeilemit("Das hast Du prima gemacht, @WER2!");
+
+SIEHE AUCH
+----------
+
+  :doc:`ReceiveMsg`, :doc:`../sefun/replace_personal`, :doc:`name`
+
+Letzte Aenderung: 07.10.2021, Bugfix