diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index f6452fb3074..fab114039f3 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -244,6 +244,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" #define TRAIT_DISSECTED "dissected" +/// Lets the user succumb even if they got NODEATH +#define TRAIT_SUCCUMB_OVERRIDE "succumb_override" /// Can hear observers #define TRAIT_SIXTHSENSE "sixth_sense" #define TRAIT_FEARLESS "fearless" diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 5ab20c2f409..6d09d471109 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -413,8 +413,13 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(!.) return var/mob/living/living_owner = owner - var/last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince") - if(isnull(last_whisper) || !CAN_SUCCUMB(living_owner)) + var/last_whisper + if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) + last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince") + if(isnull(last_whisper)) + if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) + return + if(!CAN_SUCCUMB(living_owner) && !HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) return if(length(last_whisper)) living_owner.say("#[last_whisper]") diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 8cbb2b9d916..8a5c625478b 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -16,6 +16,7 @@ TRAIT_NOBREATH, TRAIT_NOCLONELOSS, TRAIT_NODEATH, + TRAIT_SUCCUMB_OVERRIDE, TRAIT_NOHUNGER, TRAIT_NOMETABOLISM, TRAIT_RADIMMUNE, @@ -89,6 +90,23 @@ /// The cooldown before the zombie can start regenerating COOLDOWN_DECLARE(regen_cooldown) + inherent_traits = list( + TRAIT_EASILY_WOUNDED, + TRAIT_EASYDISMEMBER, + TRAIT_FAKEDEATH, + TRAIT_LIMBATTACHMENT, + TRAIT_NOBREATH, + TRAIT_NOCLONELOSS, + TRAIT_NODEATH, + TRAIT_NOHUNGER, + TRAIT_NOMETABOLISM, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, + TRAIT_TOXIMMUNE, + ) + /datum/species/zombie/infectious/check_roundstart_eligible() return FALSE diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index fd7c347c20c..fb9f426c5a9 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -188,7 +188,7 @@ */ /mob/living/proc/update_succumb_action() SIGNAL_HANDLER - if (CAN_SUCCUMB(src)) + if (CAN_SUCCUMB(src) || HAS_TRAIT(src, TRAIT_SUCCUMB_OVERRIDE)) throw_alert(ALERT_SUCCUMB, /atom/movable/screen/alert/succumb) else clear_alert(ALERT_SUCCUMB) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cfb5c183cb4..d58aad07f74 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -433,8 +433,13 @@ /mob/living/verb/succumb(whispered as null) set hidden = TRUE if (!CAN_SUCCUMB(src)) - to_chat(src, text="You are unable to succumb to death! This life continues.", type=MESSAGE_TYPE_INFO) - return + if(HAS_TRAIT(src, TRAIT_SUCCUMB_OVERRIDE)) + if(whispered) + to_chat(src, text="You are unable to succumb to death! Unless you just press the UI button.", type=MESSAGE_TYPE_INFO) + return + else + to_chat(src, text="You are unable to succumb to death! This life continues.", type=MESSAGE_TYPE_INFO) + return log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!", LOG_ATTACK) adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) updatehealth() diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 5c6e5babd0d..f1eef9551f2 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -477,7 +477,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( /mob/living/say_mod(input, list/message_mods = list()) if(message_mods[WHISPER_MODE] == MODE_WHISPER) . = verb_whisper - else if(message_mods[WHISPER_MODE] == MODE_WHISPER_CRIT) + else if(message_mods[WHISPER_MODE] == MODE_WHISPER_CRIT && !HAS_TRAIT(src, TRAIT_SUCCUMB_OVERRIDE)) . = "[verb_whisper] in [p_their()] last breath" else if(message_mods[MODE_SING]) . = verb_sing