diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 51505ae52b3..a7838ce0182 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -235,6 +235,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define GENERIC_ITEM_TRAIT "generic_item" #define UNCONSCIOUS_BLIND "unconscious_blind" #define EYE_DAMAGE "eye_damage" +#define EAR_DAMAGE "ear_damage" #define GENETIC_MUTATION "genetic" #define OBESITY "obesity" #define MAGIC_TRAIT "magic" diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 4a92e628eab..515fd264a7e 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -260,14 +260,14 @@ M.fields["name"] = H.real_name M.fields["blood_type"] = H.dna.blood_type M.fields["b_dna"] = H.dna.unique_enzymes - M.fields["mi_dis"] = H.get_trait_string(!medical, CAT_QUIRK_MINOR_DISABILITY) - M.fields["mi_dis_d"] = H.get_trait_string(medical, CAT_QUIRK_MINOR_DISABILITY) - M.fields["ma_dis"] = H.get_trait_string(!medical, CAT_QUIRK_MAJOR_DISABILITY) - M.fields["ma_dis_d"] = H.get_trait_string(medical, CAT_QUIRK_MAJOR_DISABILITY) + M.fields["mi_dis"] = H.get_quirk_string(!medical, CAT_QUIRK_MINOR_DISABILITY) + M.fields["mi_dis_d"] = H.get_quirk_string(medical, CAT_QUIRK_MINOR_DISABILITY) + M.fields["ma_dis"] = H.get_quirk_string(!medical, CAT_QUIRK_MAJOR_DISABILITY) + M.fields["ma_dis_d"] = H.get_quirk_string(medical, CAT_QUIRK_MAJOR_DISABILITY) M.fields["cdi"] = "None" M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["notes"] = H.get_trait_string(!medical, CAT_QUIRK_NOTES) - M.fields["notes_d"] = H.get_trait_string(medical, CAT_QUIRK_NOTES) + M.fields["notes"] = H.get_quirk_string(!medical, CAT_QUIRK_NOTES) + M.fields["notes_d"] = H.get_quirk_string(medical, CAT_QUIRK_NOTES) medical += M //Security Record diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 0d8027917fe..1a45ce850c7 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -45,17 +45,19 @@ Bonus if(!..()) return var/mob/living/carbon/M = A.affected_mob + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + if(!ears) + return //cutting off your ears to cure the deafness: the ultimate own switch(A.stage) if(3, 4) if(prob(base_message_chance) && !suppress_warning) to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]") if(5) if(power >= 2) - var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) - if(istype(ears) && ears.damage < ears.maxHealth) + if(ears.damage < ears.maxHealth) to_chat(M, "Your ears pop painfully and start bleeding!") ears.damage = max(ears.damage, ears.maxHealth) M.emote("scream") else to_chat(M, "Your ears pop and begin ringing loudly!") - M.minimumDeafTicks(20) + ears.deaf = min(20, ears.deaf + 15) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index e7c6c78bf9f..6542b919222 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -79,14 +79,16 @@ /datum/symptom/sensory_restoration/Activate(datum/disease/advance/A) if(!..()) return - var/mob/living/M = A.affected_mob + var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(4, 5) - M.restoreEars() //this is mostly just copy+pasted from oculine and inacusiate + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + if(ears) + ears.adjustEarDamage(-4, -4) M.adjust_blindness(-2) M.adjust_blurriness(-2) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) - if(!eyes) + if(!eyes) // only dealing with eye stuff from here on out return eyes.applyOrganDamage(-2) if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE)) diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 92c7e6cfd59..deb2d696615 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -26,10 +26,8 @@ /datum/element/earhealing/process() for(var/i in user_by_item) var/mob/living/carbon/user = user_by_item[i] - if(HAS_TRAIT(user, TRAIT_DEAF)) - continue var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) - if(!ears) + if(!ears || HAS_TRAIT_NOT_FROM(user, TRAIT_DEAF, EAR_DAMAGE)) continue ears.deaf = max(ears.deaf - 0.25, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged ears.damage = max(ears.damage - 0.025, 0) diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index c36e1679135..367f7dca8bb 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -67,7 +67,14 @@ return on_process() -/mob/living/proc/get_trait_string(medical, category) //helper string. gets a string of all the traits the mob has +/** + * get_quirk_string() is used to get a printable string of all the quirk traits someone has for certain criteria + * + * Arguments: + * * Medical- If we want the long, fancy descriptions that show up in medical records, or if not, just the name + * * Category- Which types of quirks we want to print out. Defaults to everything + */ +/mob/living/proc/get_quirk_string(medical, category = CAT_QUIRK_ALL) //helper string. gets a string of all the quirks the mob has var/list/dat = list() switch(category) if(CAT_QUIRK_ALL) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 95d51440825..f44af2af368 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -182,17 +182,17 @@ playsound(chassis, 'sound/items/airhorn.ogg', 100, TRUE) chassis.occupant_message("HONK") for(var/mob/living/carbon/M in ohearers(6, chassis)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) - continue + if(!M.can_hear()) + continue var/turf/turf_check = get_turf(M) if(isspaceturf(turf_check) && !turf_check.Adjacent(src)) //in space nobody can hear you honk. continue to_chat(M, "HONK") M.SetSleeping(0) M.stuttering += 20 - M.adjustEarDamage(0, 30) + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + if(ears) + ears.adjustEarDamage(0, 30) M.Paralyze(60) if(prob(30)) M.Stun(200) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 50380e6badd..87b22d30d08 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -221,11 +221,8 @@ /obj/item/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) var/turf/T = get_turf(src) for(M in ohearers(7, T)) - if(ishuman(M) && M.can_hear()) - var/mob/living/carbon/human/H = M - if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) - continue - M.emote("flip") + if(M.can_hear()) + M.emote("flip") flip_cooldown = world.time + 7 //canned laughter diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c7dc1066601..0649d8910ec 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -204,9 +204,9 @@ GENE SCANNER trauma_text += trauma_desc render_list += "Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" if(C.roundstart_quirks.len) - render_list += "Subject Major Disabilities: [C.get_trait_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY)].\n" + render_list += "Subject Major Disabilities: [C.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY)].\n" if(advanced) - render_list += "Subject Minor Disabilities: [C.get_trait_string(FALSE, CAT_QUIRK_MINOR_DISABILITY)].\n" + render_list += "Subject Minor Disabilities: [C.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY)].\n" if(advanced) render_list += "Brain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%.\n" @@ -255,6 +255,8 @@ GENE SCANNER message = "" if(HAS_TRAIT_FROM(C, TRAIT_DEAF, GENETIC_MUTATION)) message = "\nSubject is genetically deaf." + else if(HAS_TRAIT_FROM(C, TRAIT_DEAF, EAR_DAMAGE)) + message = "\nSubject is deaf from ear damage." else if(HAS_TRAIT(C, TRAIT_DEAF)) message = "\nSubject is deaf." else diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 6b5be5d2366..e30726da7b6 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -14,7 +14,9 @@ if(iscarbon(M)) var/mob/living/carbon/C = M if(!C.mind || !C.mind.has_antag_datum(/datum/antagonist/changeling)) - C.adjustEarDamage(0, 30) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) + if(ears) + ears.adjustEarDamage(0, 30) C.confused += 25 C.Jitter(50) else diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 11564049b60..7a25fb55118 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -300,7 +300,9 @@ else if(istype(I, /obj/item/bikehorn)) to_chat(target, "HONK") SEND_SOUND(target, 'sound/items/airhorn.ogg') - target.adjustEarDamage(0,3) + var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) + if(ears) + ears.adjustEarDamage(0, 3) GiveHint(target) cooldown = world.time +cooldown_time return diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index bf1350a708c..d96a46ba38c 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -111,6 +111,7 @@ In all, this is a lot like the monkey code. /N ..() if(QDELETED(src)) return + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) gib() @@ -118,13 +119,15 @@ In all, this is a lot like the monkey code. /N if (EXPLODE_HEAVY) take_overall_damage(60, 60) - adjustEarDamage(30,120) + if(ears) + ears.adjustEarDamage(30,120) if(EXPLODE_LIGHT) take_overall_damage(30,0) if(prob(50)) Unconscious(20) - adjustEarDamage(15,60) + if(ears) + ears.adjustEarDamage(15,60) /mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8a6f1ff684f..7520cc56007 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -862,9 +862,6 @@ reagents.addiction_list = list() cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) ..() - // heal ears after healing traits, since ears check TRAIT_DEAF trait - // when healing. - restoreEars() /mob/living/carbon/can_be_revived() . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index ac1ecbc0357..34a0f75c621 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -399,16 +399,16 @@ Paralyze((stun_pwr*effect_amount)*0.1) Knockdown(stun_pwr*effect_amount) - if(istype(ears) && (deafen_pwr || damage_pwr)) + if(ears && (deafen_pwr || damage_pwr)) var/ear_damage = damage_pwr * effect_amount var/deaf = deafen_pwr * effect_amount - adjustEarDamage(ear_damage,deaf) + ears.adjustEarDamage(ear_damage,deaf) if(ears.damage >= 15) to_chat(src, "Your ears start to ring badly!") if(prob(ears.damage - 5)) to_chat(src, "You can't hear anything!") - ears.damage = min(ears.damage, ears.maxHealth) + ears.damage = min(ears.damage, ears.maxHealth) // does this actually do anything useful? all this would do is set an upper bound on damage, is this supposed to be a max? // you need earmuffs, inacusiate, or replacement else if(ears.damage >= 5) to_chat(src, "Your ears start to ring!") @@ -434,7 +434,7 @@ /mob/living/carbon/can_hear() . = FALSE var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) - if(istype(ears) && !ears.deaf) + if(ears && !HAS_TRAIT(src, TRAIT_DEAF)) . = TRUE diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index cadd508f013..aa100c6416e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -365,8 +365,6 @@ if (!isnull(trait_exam)) . += trait_exam - var/traitstring = get_trait_string() - var/perpname = get_face_name(get_id_name("")) if(perpname && (HAS_TRAIT(user, TRAIT_SECURITY_HUD) || HAS_TRAIT(user, TRAIT_MEDICAL_HUD))) var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) @@ -388,9 +386,10 @@ R = find_record("name", perpname, GLOB.data_core.medical) if(R) . += "\[Medical evaluation\]
" - if(traitstring) + var/quirkstring = get_quirk_string(TRUE, CAT_QUIRK_ALL) + if(quirkstring) . += "Detected physiological traits:" - . += "[traitstring]" + . += "[quirkstring]" if(HAS_TRAIT(user, TRAIT_SECURITY_HUD)) if(!user.stat && user != src) @@ -407,8 +406,8 @@ "\[Add crime\]", "\[View comment log\]", "\[Add comment\]"), "") - else if(isobserver(user) && traitstring) - . += "Traits: [traitstring]" + else if(isobserver(user)) + . += "Traits: [get_quirk_string(FALSE, CAT_QUIRK_ALL)]" . += "*---------*" SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ce6397ad98f..54babd0e24e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -825,7 +825,7 @@ for(var/datum/mutation/human/HM in dna.mutations) if(HM.quality != POSITIVE) dna.remove_mutation(HM.name) - ..() + return ..() /mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) . = ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index d357848124c..d297b742d83 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -402,7 +402,7 @@ //200 max knockdown for EXPLODE_HEAVY //160 max knockdown for EXPLODE_LIGHT - + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) if(bomb_armor < EXPLODE_GIB_THRESHOLD) //gibs the mob if their bomb armor is lower than EXPLODE_GIB_THRESHOLD @@ -431,8 +431,8 @@ brute_loss = 30*(2 - round(bomb_armor*0.01, 0.05)) burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn damage_clothes(200 - bomb_armor, BRUTE, "bomb") - if (!istype(ears, /obj/item/clothing/ears/earmuffs)) - adjustEarDamage(30, 120) + if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT)) + ears.adjustEarDamage(30, 120) Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards Knockdown(200 - (bomb_armor * 1.6)) //between ~4 and ~20 seconds of knockdown depending on bomb armor @@ -441,8 +441,8 @@ if(bomb_armor) brute_loss = 15*(2 - round(bomb_armor*0.01, 0.05)) damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb") - if (!istype(ears, /obj/item/clothing/ears/earmuffs)) - adjustEarDamage(15,60) + if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT)) + ears.adjustEarDamage(15,60) Knockdown(160 - (bomb_armor * 1.6)) //100 bomb armor will prevent knockdown altogether take_overall_damage(brute_loss,burn_loss) @@ -876,7 +876,7 @@ to_chat(src, "Your [damaged_message] [damaged_plural ? "are" : "is"] hurt.") if(roundstart_quirks.len) - to_chat(src, "You have these quirks: [get_trait_string(FALSE, CAT_QUIRK_ALL)].") + to_chat(src, "You have these quirks: [get_quirk_string(FALSE, CAT_QUIRK_ALL)].") /mob/living/carbon/human/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) if(damage_type != BRUTE && damage_type != BURN) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ed904fa60a2..643be2d46d0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -288,7 +288,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) oldorgan.Remove(C,TRUE) QDEL_NULL(oldorgan) - if(!oldorgan && should_have && !(initial(neworgan.zone) in excluded_zones)) + if(oldorgan) + oldorgan.setOrganDamage(0) + else if(should_have && !(initial(neworgan.zone) in excluded_zones)) used_neworgan = TRUE neworgan.Insert(C, TRUE, FALSE) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 37e6c119e43..807ee64e2f6 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -180,6 +180,7 @@ ..() if(QDELETED(src)) return + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) gib() @@ -188,14 +189,16 @@ if (EXPLODE_HEAVY) take_overall_damage(60, 60) damage_clothes(200, BRUTE, "bomb") - adjustEarDamage(30, 120) + if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT)) + ears.adjustEarDamage(30, 120) if(prob(70)) Unconscious(200) if(EXPLODE_LIGHT) take_overall_damage(30, 0) damage_clothes(50, BRUTE, "bomb") - adjustEarDamage(15,60) + if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT)) + ears.adjustEarDamage(15,60) if (prob(50)) Unconscious(160) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 7138810d610..c5c7cf3b0ff 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -193,7 +193,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, if(spam_flag == 0) if(ishuman(C)) C.stuttering = 20 - C.adjustEarDamage(0, 5) //far less damage than the H.O.N.K. + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) + if (ears && !HAS_TRAIT_FROM(C, TRAIT_DEAF, CLOTHING_TRAIT)) + ears.adjustEarDamage(0, 5) //far less damage than the H.O.N.K. C.Jitter(50) C.Paralyze(60) var/mob/living/carbon/human/H = C diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 00c41700ef4..cb2236a777d 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -664,11 +664,12 @@ /datum/reagent/medicine/inacusiate name = "Inacusiate" - description = "Instantly restores all hearing to the patient, but does not work on patients without ears, cure genetic deafness, or cure chronic deafness." //by "chronic" deafness, we mean people with the "deaf" quirk + description = "Rapidly repairs damage to the patient's ears to cure deafness, assuming the source of said deafness isn't from genetic mutations, chronic deafness, or a total defecit of ears." //by "chronic" deafness, we mean people with the "deaf" quirk color = "#606060" // ditto /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M) - M.restoreEars() + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + ears.adjustEarDamage(-4, -4) ..() /datum/reagent/medicine/atropine diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 3687ac08cb9..02149f6ea81 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -28,67 +28,35 @@ var/damage_multiplier = 1 /obj/item/organ/ears/on_life() - if(!iscarbon(owner)) + . = ..() + // if we have non-damage related deafness like mutations, quirks or clothing (earmuffs), don't bother processing here. Ear healing from earmuffs or chems happen elsewhere + if(HAS_TRAIT_NOT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) return - ..() - var/mob/living/carbon/C = owner + if((damage < maxHealth) && (organ_flags & ORGAN_FAILING)) //ear damage can be repaired from the failing condition organ_flags &= ~ORGAN_FAILING - // genetic deafness prevents the body from using the ears, even if healthy - if(HAS_TRAIT(C, TRAIT_DEAF)) - deaf = max(deaf, 1) - else if(!(organ_flags & ORGAN_FAILING)) // if this organ is failing, do not clear deaf stacks. + + if((organ_flags & ORGAN_FAILING)) + deaf = max(deaf, 1) // if we're failing we always have at least 1 deaf stack (and thus deafness) + else // only clear deaf stacks if we're not failing deaf = max(deaf - 1, 0) - if(prob(damage / 30) && (damage > low_threshold)) + if((damage > low_threshold) && prob(damage / 30)) adjustEarDamage(0, 4) - SEND_SOUND(C, sound('sound/weapons/flash_ring.ogg')) - to_chat(C, "The ringing in your ears grows louder, blocking out any external noises for a moment.") - else if((organ_flags & ORGAN_FAILING) && (deaf == 0)) - deaf = 1 //stop being not deaf you deaf idiot + SEND_SOUND(owner, sound('sound/weapons/flash_ring.ogg')) + to_chat(owner, "The ringing in your ears grows louder, blocking out any external noises for a moment.") -/obj/item/organ/ears/proc/restoreEars() - deaf = 0 - damage = 0 - organ_flags &= ~ORGAN_FAILING - - var/mob/living/carbon/C = owner - - if(iscarbon(owner) && HAS_TRAIT(C, TRAIT_DEAF)) - deaf = 1 + if(deaf) + ADD_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) + else + REMOVE_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) /obj/item/organ/ears/proc/adjustEarDamage(ddmg, ddeaf) damage = max(damage + (ddmg*damage_multiplier), 0) deaf = max(deaf + (ddeaf*damage_multiplier), 0) -/obj/item/organ/ears/proc/minimumDeafTicks(value) - deaf = max(deaf, value) - /obj/item/organ/ears/invincible damage_multiplier = 0 - -/mob/proc/restoreEars() - -/mob/living/carbon/restoreEars() - var/obj/item/organ/ears/ears = getorgan(/obj/item/organ/ears) - if(ears) - ears.restoreEars() - -/mob/proc/adjustEarDamage() - -/mob/living/carbon/adjustEarDamage(ddmg, ddeaf) - var/obj/item/organ/ears/ears = getorgan(/obj/item/organ/ears) - if(ears) - ears.adjustEarDamage(ddmg, ddeaf) - -/mob/proc/minimumDeafTicks() - -/mob/living/carbon/minimumDeafTicks(value) - var/obj/item/organ/ears/ears = getorgan(/obj/item/organ/ears) - if(ears) - ears.minimumDeafTicks(value) - - /obj/item/organ/ears/cat name = "cat ears" icon = 'icons/obj/clothing/hats.dmi' diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 98500fe422c..2c22fc5bdb0 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -184,25 +184,35 @@ return else - if(!getorganslot(ORGAN_SLOT_LUNGS)) - var/obj/item/organ/lungs/L = new() + var/obj/item/organ/lungs/L = getorganslot(ORGAN_SLOT_LUNGS) + if(!L) + L = new() L.Insert(src) + L.setOrganDamage(0) - if(!getorganslot(ORGAN_SLOT_HEART)) - var/obj/item/organ/heart/H = new() + var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) + if(!H) + H = new() H.Insert(src) + H.setOrganDamage(0) - if(!getorganslot(ORGAN_SLOT_TONGUE)) - var/obj/item/organ/tongue/T = new() + var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) + if(!T) + T = new() T.Insert(src) + T.setOrganDamage(0) - if(!getorganslot(ORGAN_SLOT_EYES)) - var/obj/item/organ/eyes/E = new() - E.Insert(src) + var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) + if(!eyes) + eyes = new() + eyes.Insert(src) + eyes.setOrganDamage(0) - if(!getorganslot(ORGAN_SLOT_EARS)) - var/obj/item/organ/ears/ears = new() + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + if(!ears) + ears = new() ears.Insert(src) + ears.setOrganDamage(0) /** get_availability