ReceiveMsg: Flag MSG_ALL_SENSES fuer Sinnkombi

Hiermit wird die Moeglichkeit geschaffen, dass die relevanten Sinne fuer
mehrere Nachrichtentypen aktiv sind, d.h. die Sinnkombination muss
wahrnehmbar sein statt nur min. eines der relevanten Sinne.
(Technisch: UND statt ODER)

Change-Id: Ie093e70d5432953501b24cb6542c0055efee8a07
diff --git a/std/player/comm.c b/std/player/comm.c
index c32f590..135d10e 100644
--- a/std/player/comm.c
+++ b/std/player/comm.c
@@ -1832,18 +1832,22 @@
   // unterdrueckt werden.
   if (!senses)
     return 0;
-
+  
+  int orig_senses = senses;
+  
   if ((senses & MT_LOOK) && CannotSee(1))
     senses &= ~MT_LOOK;  // Sinn loeschen
 
   if ((senses & MT_LISTEN) && QueryProp(P_DEAF))
     senses &= ~MT_LISTEN;
 
-  // wenn kein Sinn mehr ueber, wird die Nachricht nicht wahrgenommen.
-  if (!senses)
-    return MSG_SENSE_BLOCK;
+  // Wenn kein Sinn mehr ueber ist oder all_types gesetzt ist und nicht mehr
+  // alle Sinne vorhanden sind, wird die Nachricht nicht wahrgenommen.
+  if (orig_senses == senses // kein Sinn geloescht, haeufigster Fall
+      || (!(msg_type&MSG_ALL_SENSES) && senses) ) // min. ein Sinn uebrig
+    return 0;
 
-  return 0;
+  return MSG_SENSE_BLOCK;
 }
 
 public varargs int ReceiveMsg(string msg, int msg_type, string msg_action,
@@ -1874,8 +1878,8 @@
   // aber bestimmte Dinge lassen sich einfach nicht ignorieren.
   if (!(flags & MSG_DONT_IGNORE))
   {
-    // Sinne pruefen. (nur typen uebergeben, keine Flags)
-    int res=check_senses(type);
+    // Sinne pruefen.
+    int res=check_senses(msg_type);
     if (res) return res;
 
     // Spieler-definiertes Ignoriere? (nur typen uebergeben, keine Flags)