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/doc/sphinx/lfun/ReceiveMsg.rst b/doc/sphinx/lfun/ReceiveMsg.rst
index 2b2ff65..457235b 100644
--- a/doc/sphinx/lfun/ReceiveMsg.rst
+++ b/doc/sphinx/lfun/ReceiveMsg.rst
@@ -48,6 +48,8 @@
MT_LOOK nur an Nichtblinde
MT_LISTEN nur an Nichttaube
MT_DEBUG nur an Magier/Testspieler
+ Bei gesetztem MSG_ALL_SENSES muessen alle fuer die angegebenen Typen
+ relevanten Sinne des Empfaengers benutzbar sein, nicht nur einer.
2) Pruefen auf Ignorieren von
- Aktion ('msg_action')
- mit 'msg_action' || query_verb()
@@ -226,6 +228,8 @@
MSG_DONT_STORE Nachricht darf nicht in die Comm-History
MSG_DONT_WRAP Nachricht nicht per break_string umbrechen
MSG_DONT_IGNORE Nachricht kann nicht ignoriert werden
+ MSG_ALL_TYPES alle relevanten Sinne fuer die angegebenen Nachrichten-
+ typen muessen benutzbar sein (UND statt ODER).
MSG_BS_LEAVE_LFS wie BS_LEAVE_MY_LFS fuer break_string()
MSG_BS_SINGLE_SPACE wie BS_SINGLE_SPACE fuer break_string()
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)
diff --git a/sys/living/comm.h b/sys/living/comm.h
index e2c048b..83811bb 100644
--- a/sys/living/comm.h
+++ b/sys/living/comm.h
@@ -22,12 +22,13 @@
#define MSG_DONT_STORE 2048
#define MSG_DONT_WRAP 4096
#define MSG_DONT_IGNORE 8192
+#define MSG_ALL_SENSES 16384 // all relevant senses, not one of them
// Flags < 1048576 (2^20) reserviert fuer Flags
#define MSG_ALL_BS_FLAGS (BS_LEAVE_MY_LFS | BS_SINGLE_SPACE | BS_BLOCK\
| BS_NO_PARINDENT | BS_INDENT_ONCE\
|BS_PREPEND_INDENT)
#define MSG_ALL_FLAGS (MSG_DONT_BUFFER | MSG_DONT_STORE | MSG_DONT_WRAP\
- | MSG_DONT_IGNORE | MSG_ALL_BS_FLAGS)
+ | MSG_DONT_IGNORE | MSG_ALL_SENSES | MSG_ALL_BS_FLAGS)
// Nachrichtentypen, Werte ab 2^20
#define MT_UNKNOWN 0