@@ -279,6 +279,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
279279
280280 var /message = " "
281281 var /raw_dist = get_dist(speaker, src )
282+ // NON-MODULE CHANGE - check for projected whispers, calculate distance from the projected tile if so
283+ if (message_mods[WHISPER_MODE ] && message_range != INFINITY )
284+ var /turf /in_front = get_step(speaker, speaker. dir)
285+ if (in_front && HAS_TRAIT (in_front, TRAIT_TURF_PROJECTS_WHISPERS ))
286+ raw_dist = min(raw_dist, get_dist(in_front, src ))
287+
282288 // Infinite range implies something like telecomms, ie something that should never be distance modified
283289 if (! HAS_TRAIT (src , TRAIT_GOOD_HEARING ) && message_range != INFINITY )
284290 // How far we are we outside the message range?
@@ -388,6 +394,13 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
388394 var /list /in_view = get_hearers_in_view(message_range + whisper_range, source)
389395 var /list /listening = get_hearers_in_range(message_range + whisper_range, source)
390396
397+ // NON-MODULE CHANGE - check for projected whispers, add new potential hearers if so
398+ if (is_speaker_whispering)
399+ var /turf /in_front = get_step(src , dir)
400+ if (in_front && HAS_TRAIT (in_front, TRAIT_TURF_PROJECTS_WHISPERS ))
401+ in_view |= get_hearers_in_view(message_range + whisper_range, in_front)
402+ listening |= get_hearers_in_range(message_range + whisper_range, in_front)
403+
391404 // Pre-process listeners to account for line-of-sight
392405 for (var /atom/movable /listening_movable as anything in listening)
393406 if (! (listening_movable in in_view) && ! HAS_TRAIT (listening_movable, TRAIT_XRAY_HEARING ))
0 commit comments