diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index f721c364c9d..c5a0dc572e4 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -114,3 +114,6 @@
/mob/living/carbon/human/IsAdvancedToolUser()
return 1//Humans can use guns and such
+
+/mob/living/carbon/human/proc/InCritical()
+ return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index d5ec65900b0..213894ad509 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -1,4 +1,3 @@
-//Lallander was here
/mob/living/carbon/human/whisper(message as text)
if(!IsVocal())
@@ -24,16 +23,12 @@
return
- if (src.stat == 2)
+ if (src.stat == DEAD)
return src.say_dead(message)
- if (src.stat)
- return
-
var/alt_name = ""
- if (istype(src, /mob/living/carbon/human) && src.name != GetVoice())
- var/mob/living/carbon/human/H = src
- alt_name = " (as [H.get_id_name("Unknown")])"
+ if (src.name != GetVoice())
+ alt_name = " (as [get_id_name("Unknown")])"
// Mute disability
if (src.sdisabilities & MUTE)
return
@@ -41,6 +36,17 @@
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
return
+ var/whispers = "whispers"
+
+ // If whispering your last words, limit the whisper based on how close you are to death.
+ var/critical = InCritical()
+ if(critical)
+ var/health_diff = round(-config.health_threshold_dead + health)
+ // If we cut our message short, abruptly end it with a-..
+ var/message_len = length(message)
+ message = copytext(message, 1, health_diff) + "[message_len > health_diff ? "-.." : "..."]"
+ whispers = "whispers in his final breath"
+
var/italics = 1
var/message_range = 1
@@ -57,7 +63,8 @@
var/list/listening = hearers(message_range, src)
listening -= src
- listening += src
+ if(!critical)
+ listening += src
var/list/eavesdropping = hearers(2, src)
eavesdropping -= src
eavesdropping -= listening
@@ -79,9 +86,9 @@
for (var/mob/M in watching)
if (M.say_understands(src))
- rendered = "[src.name] whispers something."
+ rendered = "[src.name] [whispers] something."
else
- rendered = "[src.voice_name] whispers something."
+ rendered = "[src.voice_name] [whispers] something."
M.show_message(rendered, 2)
if (length(heard_a))
@@ -90,7 +97,7 @@
if (italics)
message_a = "[message_a]"
//This appears copied from carbon/living say.dm so the istype check for mob is probably not needed. Appending for src is also not needed as the game will check that automatically.
- rendered = "[GetVoice()][alt_name] whispers, \"[message_a]\""
+ rendered = "[GetVoice()][alt_name] [whispers], \"[message_a]\""
for (var/mob/M in heard_a)
M.show_message(rendered, 2)
@@ -106,7 +113,7 @@
if (italics)
message_b = "[message_b]"
- rendered = "[src.voice_name] whispers, \"[message_b]\""
+ rendered = "[src.voice_name] [whispers], \"[message_b]\""
for (var/mob/M in heard_b)
M.show_message(rendered, 2)
@@ -115,18 +122,24 @@
if (M.say_understands(src))
var/message_c
message_c = stars(message)
- rendered = "[GetVoice()][alt_name] whispers, \"[message_c]\""
+ rendered = "[GetVoice()][alt_name] [whispers], \"[message_c]\""
M.show_message(rendered, 2)
else
- rendered = "[src.voice_name] whispers something."
+ rendered = "[src.voice_name] [whispers] something."
M.show_message(rendered, 2)
if (italics)
message = "[message]"
- rendered = "[GetVoice()][alt_name] whispers, \"[message]\""
+ rendered = "[GetVoice()][alt_name] [whispers], \"[message]\""
for (var/mob/M in dead_mob_list)
if (!(M.client))
continue
if (M.stat > 1 && !(M in heard_a))
M.show_message(rendered, 2)
+
+ // We whispered our final breath, now we die and show the message you have sent
+ // since it might have been cut off and it would be annoying not being able to know.
+ if(critical)
+ src << rendered
+ death()