From 08c05a4814d7c19151a21df2e58abb0a02133377 Mon Sep 17 00:00:00 2001 From: Ryal Date: Sun, 20 Sep 2020 15:32:27 -0700 Subject: [PATCH] Adds Earmuffs providing immunity to Changeling shriek (#14033) * Adds Earmuff immunity to shriek * Refactors hearing protection and adds deafness * Update human.dm * Removed implicit src --- code/__DEFINES/mobs.dm | 6 ++++++ code/game/gamemodes/changeling/powers/shriek.dm | 4 ++++ code/game/gamemodes/vampire/vampire_powers.dm | 2 +- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 16 +++++++++++----- code/modules/surgery/organs/vocal_cords.dm | 2 +- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7cd4cc7a918..d000508fdeb 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -241,3 +241,9 @@ #define is_admin(user) (check_rights(R_ADMIN, 0, (user)) != 0) #define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; + +// Hearing protection +#define HEARING_PROTECTION_NONE 0 +#define HEARING_PROTECTION_MINOR 1 +#define HEARING_PROTECTION_MAJOR 2 +#define HEARING_PROTECTION_TOTAL 3 diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 867328c40b3..06332f61670 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -11,6 +11,10 @@ /datum/action/changeling/resonant_shriek/sting_action(var/mob/user) for(var/mob/living/M in get_mobs_in_view(4, user)) if(iscarbon(M)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.check_ear_prot() >= HEARING_PROTECTION_TOTAL) + continue if(!M.mind || !M.mind.changeling) M.MinimumDeafTicks(30) M.AdjustConfused(20) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 406ab50b70d..0ff7192a7e6 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -264,7 +264,7 @@ continue if(ishuman(C)) var/mob/living/carbon/human/H = C - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + if(H.check_ear_prot() >= HEARING_PROTECTION_TOTAL) continue if(!affects(C)) continue diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index d1e63deaf0c..696df32f166 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -209,7 +209,7 @@ for(var/mob/living/carbon/M in ohearers(6, chassis)) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + if(H.check_ear_prot() >= HEARING_PROTECTION_TOTAL) continue to_chat(M, "HONK") M.SetSleeping(0) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index cb4c4968fc1..6393a8333bb 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -254,7 +254,7 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(check_ear_prot() < HEARING_PROTECTION_TOTAL) AdjustEarDamage(30, 120) if(prob(70) && !shielded) Paralyse(10) @@ -278,7 +278,7 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(check_ear_prot() < HEARING_PROTECTION_TOTAL) AdjustEarDamage(15, 60) if(prob(50) && !shielded) Paralyse(10) @@ -931,12 +931,18 @@ return number /mob/living/carbon/human/check_ear_prot() + if(!can_hear()) + return HEARING_PROTECTION_TOTAL + if(istype(l_ear, /obj/item/clothing/ears/earmuffs)) + return HEARING_PROTECTION_TOTAL + if(istype(r_ear, /obj/item/clothing/ears/earmuffs)) + return HEARING_PROTECTION_TOTAL if(head && (head.flags & HEADBANGPROTECT)) - return 1 + return HEARING_PROTECTION_MINOR if(l_ear && (l_ear.flags & EARBANGPROTECT)) - return 1 + return HEARING_PROTECTION_MINOR if(r_ear && (r_ear.flags & EARBANGPROTECT)) - return 1 + return HEARING_PROTECTION_MINOR ///tintcheck() ///Checks eye covering items for visually impairing tinting, such as welding masks diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index c9b26f61228..dd73cf0f02a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -157,7 +157,7 @@ GLOBAL_DATUM_INIT(multispin_words, /regex, regex("like a record baby")) if(L.can_hear() && !L.null_rod_check() && L != owner && L.stat != DEAD) if(ishuman(L)) var/mob/living/carbon/human/H = L - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + if(H.check_ear_prot() >= HEARING_PROTECTION_TOTAL) continue listeners += L