diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 0bcd91ca12a..77b9aff0d68 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -665,7 +665,7 @@
C.update_canmove()
C.remove_changeling_powers()
- C.emote("deathgasp")
+ C.emote("deathgasp", message = TRUE)
C.tod = worldtime2text()
var/time_to_take = rand(800, 1200)
to_chat(C, "This will take [round((time_to_take/10))] seconds.")
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 87b6dccbde3..e046277b825 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -355,7 +355,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
if(src.health < 0 && stat != DEAD) //crit people
- succumb()
+ succumb_proc(0)
ghostize(1)
else if(stat == DEAD)
ghostize(1)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm
index 5ad3f3d142c..5b10367cec3 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/death.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm
@@ -4,7 +4,7 @@
if(healths)
healths.icon_state = "health6"
if(!gibbed)
- emote("deathgasp")
+ emote("deathgasp", message = TRUE)
stat = DEAD
if(!gibbed)
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index bae28e7fa97..d7192342155 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -4,7 +4,7 @@
if(healths)
healths.icon_state = "health6"
if(!gibbed)
- emote("deathgasp")
+ emote("deathgasp", message = TRUE)
stat = DEAD
icon_state = "larva_dead"
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 3b768e443bd..703ff5b1b21 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -103,8 +103,6 @@
H.mind.kills += "[name] ([ckey])"
if(!gibbed)
- emote("deathgasp") //Let the world KNOW WE ARE DEAD
-
update_canmove()
stat = DEAD
tod = worldtime2text() //Weasellos time of death patch
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index e9c58a6bd34..d9137180d13 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -31,7 +31,7 @@
if(healths)
healths.icon_state = "health5"
if(!gibbed)
- emote("deathgasp")
+ emote("deathgasp", message = TRUE)
stat = DEAD
update_canmove()
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 79639dcb582..8a15e845412 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -56,10 +56,19 @@
stat_allowed = UNCONSCIOUS
mob_type_blacklist_typelist = list(/mob/living/carbon/brain) // Everyone can deathgasp
-/datum/emote/living/deathgasp/run_emote(mob/user, params)
+/datum/emote/living/deathgasp/run_emote(mob/living/user, params)
+ if(/datum/dna/gene/disability/elvis in user.active_genes)
+ user.emote("fart", ignore_status = 1)
+ message = "has left the building..."
+ if(!issilent(user) && (M_HARDCORE in user.mutations))
+ message = "whispers with their final breath, 'i told u i was hardcore..'"
. = ..()
if(. && isalienadult(user))
playsound(user.loc, 'sound/voice/hiss6.ogg', 80, 1, 1)
+ if (. && user.stat == UNCONSCIOUS && !params)
+ user.succumb_proc(0, 1)
+ message = initial(message)
+
/datum/emote/living/carbon/drool
key = "drool"
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index fce3bf821f9..c1570b148f3 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -178,10 +178,15 @@
/mob/living/verb/succumb()
set hidden = 1
+ succumb_proc(0)
+
+/mob/living/proc/succumb_proc(var/gibbed = 0, var/from_deathgasp = FALSE)
if (src.health < 0 && stat != DEAD)
src.attack_log += "[src] has succumbed to death with [health] points of health!"
src.apply_damage(maxHealth + src.health, OXY)
- death(0)
+ if (!from_deathgasp)
+ emote("deathgasp", message = TRUE)
+ death(gibbed)
to_chat(src, "You have given up life and succumbed to death.")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 9c692069a8b..9029735efb1 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -117,14 +117,14 @@ var/list/department_radio_keys = list(
say_testing(src, "ur ded kid")
say_dead(message)
return
+ if(check_emote(message))
+ say_testing(src, "Emoted")
+ return
if (stat) // Unconcious.
if(message_mode == MODE_WHISPER) //Lets us say our last words.
say_testing(src, "message mode was whisper.")
whisper(copytext(message, 3))
return
- if(check_emote(message))
- say_testing(src, "Emoted")
- return
if(!can_speak_basic(message))
say_testing(src, "we aren't able to talk")
return
@@ -484,9 +484,6 @@ var/list/department_radio_keys = list(
to_chat(usr, "Speech is currently admin-disabled.")
return
- if(isUnconscious())
- return
-
var/datum/speech/speech = create_speech(message)
speech.language = parse_language(speech.message)
speech.mode = SPEECH_MODE_WHISPER
@@ -553,7 +550,7 @@ var/list/department_radio_keys = list(
watcher.show_message(rendered, 2)
if (said_last_words) // dying words
- succumb(1)
+ succumb_proc(0)
returnToPool(speech)
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 42163ba9521..d3758b821aa 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -2,7 +2,7 @@
if(stat == DEAD)
return
if(!gibbed)
- emote("deathgasp")
+ emote("deathgasp", message = TRUE)
playsound(src, 'sound/machines/WXP_shutdown.ogg', 75, FALSE)
stat = DEAD
update_icon()
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index ef2a06c9c7a..d11859795b6 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -37,7 +37,7 @@
if(stat == DEAD)
return
if(!gibbed)
- emote("deathgasp")
+ emote("deathgasp", message = TRUE)
stat = DEAD
update_canmove()
if(!gibbed)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index aed9cbf0d14..a304c84ec51 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -324,7 +324,7 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t
return "[emote], [text]"
return "says, [text]";
-/mob/living/simple_animal/emote(var/act, var/type, var/desc, var/auto)
+/mob/living/simple_animal/emote(var/act, var/type, var/desc, var/auto, var/message = null)
if(timestopped)
return //under effects of time magick
if(stat)
@@ -512,7 +512,7 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t
return
if(!gibbed)
- emote("deathgasp")
+ emote("deathgasp", message = TRUE)
health = 0 // so /mob/living/simple_animal/Life() doesn't magically revive them
living_mob_list -= src