From cc53a0061feeba0558f8608f099fd9397a603f87 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 02:15:58 +0000 Subject: [PATCH] Well it compiles --- code/game/data_huds.dm | 6 +- code/game/objects/items/devices/scanners.dm | 365 +++++++++--------- .../kitchen_machinery/smartfridge.dm | 16 +- .../chemistry/reagents/medicine_reagents.dm | 15 + .../reagents/reagent_containers/medspray.dm | 5 + .../emergency_cardioversion_recovery.dm | 119 ++++++ code/modules/surgery/graft_synthtissue.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 12 + icons/mob/hud.dmi | Bin 15921 -> 16268 bytes .../reagents/chemistry/reagents/healing.dm | 64 ++- 10 files changed, 402 insertions(+), 202 deletions(-) create mode 100644 code/modules/surgery/emergency_cardioversion_recovery.dm diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 65a7c6a954..55fe37008a 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -189,7 +189,11 @@ if(tod) var/tdelta = round(world.time - timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) - holder.icon_state = "huddefib" + var/obj/item/organ/heart/He = getorgan(/obj/item/organ/heart) + if(!He || He.organ_flags & ORGAN_FAILING) + holder.icon_state = "huddefibheart" + else + holder.icon_state = "huddefib" return holder.icon_state = "huddead" else diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index d6737b94e9..2cc0321f6a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -131,13 +131,6 @@ SLIME SCANNER mob_status = "Deceased" oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.undergoing_cardiac_arrest() && H.stat != DEAD) - to_chat(user, "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!") - if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated BUG_PROBABLE_CAUSE - to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!") - var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n" // Damage descriptions @@ -159,199 +152,190 @@ SLIME SCANNER msg += "\tCellular Damage Level: [M.getCloneLoss()].\n" if (!M.getorgan(/obj/item/organ/brain)) to_chat(user, "\tSubject lacks a brain.") //Unsure how this won't proc for 50% of the cit playerbase (This is a joke everyone on cit a cute.) - if(ishuman(M) && advanced) // Should I make this not advanced? - var/mob/living/carbon/human/H = M - var/obj/item/organ/liver/L = H.getorganslot("liver") - if(L) - if(L.swelling > 20) - msg += "\tSubject is suffering from an enlarged liver.\n" //i.e. shrink their liver or give them a transplant. - else - msg += "\tSubject's liver is missing.\n" - var/obj/item/organ/tongue/T = H.getorganslot("tongue") - if(T) - if(T.damage > 40) - msg += "\tSubject is suffering from severe burn tissue on their tongue.\n" //i.e. their tongue is shot - if(T.name == "fluffy tongue") - msg += "\tSubject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant.\n" - else - msg += "\tSubject's tongue is missing.\n" - var/obj/item/organ/lungs/Lung = H.getorganslot("lungs") - if(Lung) - if(Lung.damage > 150) - msg += "\tSubject is suffering from acute emphysema leading to trouble breathing.\n" //i.e. Their lungs are shot - else - msg += "\tSubject's lungs have collapsed from trauma!\n" - var/obj/item/organ/genital/penis/P = H.getorganslot("penis") - if(P) - if(P.length>20) - msg += "\tSubject has a sizeable gentleman's organ at [P.length] inches.\n" - var/obj/item/organ/genital/breasts/Br = H.getorganslot("breasts") - if(Br) - if(Br.cached_size>5) - msg += "\tSubject has a sizeable bosom with a [Br.size] cup.\n" - - if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 200 || !M.getorgan(/obj/item/organ/brain)) - msg += "\tSubject's brain function is non-existent.\n" - else if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 120) - msg += "\tSevere brain damage detected. Subject likely to have mental traumas.\n" - else if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 45) - msg += "\tBrain damage detected.\n" - - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(LAZYLEN(C.get_traumas())) - var/list/trauma_text = list() - for(var/datum/brain_trauma/B in C.get_traumas()) - var/trauma_desc = "" - switch(B.resilience) - if(TRAUMA_RESILIENCE_SURGERY) - trauma_desc += "severe " - if(TRAUMA_RESILIENCE_LOBOTOMY) - trauma_desc += "deep-rooted " - if(TRAUMA_RESILIENCE_MAGIC, TRAUMA_RESILIENCE_ABSOLUTE) - trauma_desc += "permanent " - trauma_desc += B.scan_desc - trauma_text += trauma_desc - msg += "\tCerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" - if(C.roundstart_quirks.len) - msg += "\tSubject has the following physiological traits: [C.get_trait_string()].\n" - if(advanced) - msg += "\tBrain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%.\n" - if(M.radiation) - msg += "\tSubject is irradiated.\n" - msg += "\tRadiation Level: [M.radiation] rad\n" - - if(advanced && M.hallucinating()) - msg += "\tSubject is hallucinating.\n" - - //MKUltra - if(advanced && M.has_status_effect(/datum/status_effect/chem/enthrall)) - msg += "\tSubject has abnormal brain fuctions.\n" - - //Astrogen shenanigans - if(advanced && M.reagents.has_reagent("astral")) - if(M.mind) - msg += "\tWarning: subject may be possesed.\n" - else - msg += "\tSubject appears to be astrally projecting.\n" - - //Eyes and ears - if(advanced) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) - msg += "\t==EAR STATUS==\n" - if(istype(ears)) - var/healthy = TRUE - if(HAS_TRAIT_FROM(C, TRAIT_DEAF, GENETIC_MUTATION)) - healthy = FALSE - msg += "\tSubject is genetically deaf.\n" - else if(HAS_TRAIT(C, TRAIT_DEAF)) - healthy = FALSE - msg += "\tSubject is deaf.\n" - else - if(ears.damage) - to_chat(user, "\tSubject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.") - healthy = FALSE - if(ears.deaf) - to_chat(user, "\tSubject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.") - healthy = FALSE - if(healthy) - msg += "\tHealthy.\n" - else - msg += "\tSubject does not have ears.\n" - var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES) - msg += "\t==EYE STATUS==\n" - if(istype(eyes)) - var/healthy = TRUE - if(HAS_TRAIT(C, TRAIT_BLIND)) - msg += "\tSubject is blind.\n" - healthy = FALSE - if(HAS_TRAIT(C, TRAIT_NEARSIGHT)) - msg += "\tSubject is nearsighted.\n" - healthy = FALSE - if(eyes.damage > 30) - msg += "\tSubject has severe eye damage.\n" - healthy = FALSE - else if(eyes.damage > 20) - msg += "\tSubject has significant eye damage.\n" - healthy = FALSE - else if(eyes.damage) - msg += "\tSubject has minor eye damage.\n" - healthy = FALSE - if(healthy) - msg += "\tHealthy.\n" - else - msg += "\tSubject does not have eyes.\n" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/ldamage = H.return_liver_damage() - if(ldamage > 10) - msg += "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.\n" + // Body part damage report + var/list/dmgreport = list() if(iscarbon(M) && mode == 1) var/mob/living/carbon/C = M var/list/damaged = C.get_damaged_bodyparts(1,1) if(length(damaged)>0 || oxy_loss>0 || tox_loss>0 || fire_loss>0) - msg += "\tDamage: Brute-Burn-Toxin-Suffocation\n\t\tSpecifics: [brute_loss]-[fire_loss]-[tox_loss]-[oxy_loss]\n" - for(var/obj/item/bodypart/org in damaged) - msg += "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]\n" + dmgreport += "\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + " + + for(var/o in damaged) + var/obj/item/bodypart/org = o //head, left arm, right arm, etc. + dmgreport += "\ + \ + " + dmgreport += "
Damage:BruteBurnToxinSuffocation
Overall:[brute_loss][fire_loss][tox_loss][oxy_loss]
[capitalize(org.name)]:[(org.brute_dam > 0) ? "[org.brute_dam]" : "0"][(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]
\n" + msg += dmgreport + //Organ damages report + var/heart_ded = FALSE if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/minor_damage - var/major_damage - var/max_damage - var/report_organs = FALSE + var/mob/living/carbon/C = M - //Piece together the lists to be reported - for(var/O in H.internal_organs) - var/obj/item/organ/organ = O - if(organ.organ_flags & ORGAN_FAILING) - report_organs = TRUE //if we report one organ, we report all organs, even if the lists are empty, just for consistency - if(max_damage) - max_damage += ", " //prelude the organ if we've already reported an organ - max_damage += organ.name //this just slaps the organ name into the string of text - else - max_damage = "\tNon-Functional Organs: " //our initial statement - max_damage += organ.name - else if(organ.damage > organ.high_threshold) - report_organs = TRUE - if(major_damage) - major_damage += ", " - major_damage += organ.name - else - major_damage = "\tSeverely Damaged Organs: " - major_damage += organ.name - else if(organ.damage > organ.low_threshold) - report_organs = TRUE - if(minor_damage) - minor_damage += ", " - minor_damage += organ.name - else - minor_damage = "\tMildly Damaged Organs: " - minor_damage += organ.name + for(var/organ in C.internal_organs) + var/temp_message + var/obj/item/organ/O = organ + + //EYES + if(istype(O, /obj/item/organ/eyes)) + var/obj/item/organ/eyes/eyes = O + if(advanced) + if(HAS_TRAIT(C, TRAIT_BLIND)) + temp_message += "\tSubject is blind." + if(HAS_TRAIT(C, TRAIT_NEARSIGHT)) + temp_message += "\tSubject is nearsighted." + if(eyes.damage > 30) + temp_message += "\tSubject has severe eye damage." + else if(eyes.damage > 20) + temp_message += "\tSubject has significant eye damage." + else if(eyes.damage) + temp_message += "\tSubject has minor eye damage." + + + //EARS + if(istype(O, /obj/item/organ/ears)) + var/obj/item/organ/ears/ears = O + if(advanced) + if(HAS_TRAIT_FROM(C, TRAIT_DEAF, GENETIC_MUTATION)) + temp_message += "\tSubject is genetically deaf." + else if(HAS_TRAIT(C, TRAIT_DEAF)) + temp_message += "\tSubject is deaf." + else + if(ears.damage) + temp_message += "\tSubject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage." + if(ears.deaf) + temp_message += "\tSubject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf." + + + //BRAIN + if(istype(O, /obj/item/organ/brain)) + if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 200) + temp_message += "\tSubject's brain function is non-existent. Neurine injection recomended." + else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 120) + temp_message += "\tSevere brain damage detected. Subject likely to have mental traumas." + else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 45) + temp_message += "\tBrain damage detected." + else + temp_message += "\tFunctional Brain detected." + if(advanced) + temp_message += "\tBrain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%." + + //TRAUMAS + if(LAZYLEN(C.get_traumas())) + var/list/trauma_text = list() + for(var/datum/brain_trauma/B in C.get_traumas()) + var/trauma_desc = "" + switch(B.resilience) + if(TRAUMA_RESILIENCE_SURGERY) + trauma_desc += "severe " + if(TRAUMA_RESILIENCE_LOBOTOMY) + trauma_desc += "deep-rooted " + if(TRAUMA_RESILIENCE_MAGIC, TRAUMA_RESILIENCE_ABSOLUTE) + trauma_desc += "permanent " + trauma_desc += B.scan_desc + trauma_text += trauma_desc + temp_message += "\tCerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)]." + if(C.roundstart_quirks.len) + temp_message += "\tSubject has the following physiological traits: [C.get_trait_string()]." + + if(ishuman(C) && advanced) + var/mob/living/carbon/human/H = M + //MON PETIT CHAUFFEUR + if(H.hallucinating()) + temp_message += "\tSubject is hallucinating." + + //MKUltra + if(H.has_status_effect(/datum/status_effect/chem/enthrall)) + temp_message += "\tSubject has abnormal brain fuctions." + + //Astrogen shenanigans + if(H.reagents.has_reagent("astral")) + if(H.mind) + temp_message += "\tWarning: subject may be possesed." + else + temp_message += "\tSubject appears to be astrally projecting." + + + //LIVER + if(istype(O, /obj/item/organ/liver)) + var/obj/item/organ/liver/L = O + if(L.swelling > 20) + msg += "\tSubject is suffering from an enlarged liver." //i.e. shrink their liver or give them a transplant. + + //HEART + if(ishuman(M) && (istype(O, /obj/item/organ/heart))) + var/obj/item/organ/heart/He = O + var/mob/living/carbon/human/H = M + if(H.undergoing_cardiac_arrest() && H.stat != DEAD) + msg += "\tSubject suffering from heart attack: Apply defibrillation or other electric shock immediately!" + if(He.organ_flags & ORGAN_FAILING) + heart_ded = TRUE + + //TONGUE + if(istype(O, /obj/item/organ/tongue)) + var/obj/item/organ/tongue/T = O + if(T.name == "fluffy tongue") + msg += "\tSubject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant." + + //HECK + if(istype(O, /obj/item/organ/genital/penis)) + var/obj/item/organ/genital/penis/P = O + if(P.length>20) + msg += "\tSubject has a sizeable gentleman's organ at [P.length] inches." + + if(istype(O, /obj/item/organ/genital/breasts)) + var/obj/item/organ/genital/breasts/Br = O + if(Br.cached_size>5) + msg += "\tSubject has a sizeable bosom with a [Br.size] cup." + + //GENERAL HANDLER + var/damage_message + if(O.organ_flags & ORGAN_FAILING) + damage_message += "\tEnd Stage [O.name] failure detected." + else if(O.damage > O.high_threshold) + damage_message += "\tChronic [O.name] failure detected." + else if(O.damage > O.low_threshold && advanced) + damage_message += "\tAcute [O.name] failure detected." + + if(temp_message || damage_message) + msg += "[O.name]: [damage_message] [temp_message]\n" + + + + //END; LOOK FOR MISSING ORGANS? + if(!M.getorgan(/obj/item/organ/eyes)) + msg += "\tSubject does not have eyes.\n" + if(!M.getorgan(/obj/item/organ/ears)) + msg += "\tSubject does not have ears.\n" + if(!M.getorgan(/obj/item/organ/brain)) + msg += "\tSubject's brain function is non-existent.\n" + if(!M.getorgan(/obj/item/organ/liver)) + msg += "\tSubject's liver is missing.\n" + if(!M.getorgan(/obj/item/organ/lungs)) + msg += "\tSubject's lungs have collapsed from trauma!\n" + if(!M.getorgan(/obj/item/organ/heart)) + msg += "\tSubject's heart is missing!\n" + + if(M.radiation) + msg += "\tSubject is irradiated.\n" + msg += "\tRadiation Level: [M.radiation] rad\n" - if(report_organs) //we either finish the list, or set it to be empty if no organs were reported in that category - if(!max_damage) - max_damage = "\tNon-Functional Organs: \n" - else - max_damage += "\n" - if(!major_damage) - major_damage = "\tSeverely Damaged Organs: \n" - else - major_damage += "\n" - if(!minor_damage) - minor_damage = "\tMildly Damaged Organs: \n" - else - minor_damage += "
\n" - msg += "[minor_damage]" - msg += "[major_damage]" - msg += "[max_damage]" // Species and body temperature @@ -382,7 +366,7 @@ SLIME SCANNER else if (S.mutantstomach != initial(S.mutantstomach)) mutant = TRUE - msg += "\tReported Species: [H.dna.custom_species ? H.dna.custom_species : S.name]\n" + msg += "\tReported Species: [H.dna.custom_species ? H.dna.custom_species : S.name]\n" msg += "\tBase Species: [S.name]\n" if(mutant) msg += "\tSubject has mutations present.\n" @@ -393,7 +377,10 @@ SLIME SCANNER msg += "Time of Death: [M.tod]\n" var/tdelta = round(world.time - M.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) - msg += "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!\n" + if(heart_ded) + msg += "Subject died [DisplayTimeText(tdelta)] ago, heart requires surgical intervention for defibrillation.\n" + else + msg += "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!\n" for(var/thing in M.diseases) var/datum/disease/D = thing diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index ceb7a01ede..88176f4f26 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -144,7 +144,7 @@ else O.forceMove(src) return TRUE - + ///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge /obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M) if(!M.put_in_hands(O)) @@ -388,12 +388,18 @@ /obj/machinery/smartfridge/organ name = "smart organ storage" desc = "A refrigerated storage unit for organ storage." - max_n_of_items = 20 //vastly lower to prevent processing too long + max_n_of_items = 25 //vastly lower to prevent processing too long var/repair_rate = 0 /obj/machinery/smartfridge/organ/accept_check(obj/item/O) if(istype(O, /obj/item/organ)) return TRUE + if(istype(O, /obj/item/reagent_containers/syringe)) + return TRUE + if(istype(O, /obj/item/reagent_containers/glass/bottle)) + return TRUE + if(istype(O, /obj/item/reagent_containers/medspray)) + return TRUE return FALSE /obj/machinery/smartfridge/organ/load(obj/item/O) @@ -420,6 +426,12 @@ if(istype(AM)) AM.organ_flags &= ~ORGAN_FROZEN +/obj/machinery/smartfridge/chemistry/preloaded + initial_contents = list( + /obj/item/organ/random = 1, + /obj/item/reagent_containers/medspray/synthtissue = 1, + /obj/item/reagent_containers/medspray/sterilizine = 1) + // ----------------------------- // Chemistry Medical Smartfridge // ----------------------------- diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index c4decc081d..d864616b9f 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -940,6 +940,21 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." color = "#EEFF8F" +/datum/reagent/neurine/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + var/mob/living/carbon/C = M + if(!C) + return + var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) + if(method == INJECT) + if(B.organ_flags & ORGAN_FAILING) + B.applyOrganDamage(-20) + if(prob(80)) + B.gain_trauma_type(BRAIN_TRAUMA_MILD) + else if(prob(50)) + B.gain_trauma_type(BRAIN_TRAUMA_SEVERE) + else + B.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + /datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) if(holder.has_reagent("neurotoxin")) holder.remove_reagent("neurotoxin", 5) diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm index df7c7af225..b445c38ad9 100644 --- a/code/modules/reagents/reagent_containers/medspray.dm +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -100,3 +100,8 @@ name = "sterilizer spray" desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." list_reagents = list("sterilizine" = 60) + +/obj/item/reagent_containers/medspray/synthtissue + name = "Synthtissue young culture spray" + desc = "Spray bottle loaded with synthtissue. Useful in synthtissue grafting surgeries." + list_reagents = list("synthtissue" = 60) diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm new file mode 100644 index 0000000000..4d3a6ed72c --- /dev/null +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -0,0 +1,119 @@ +/datum/surgery/cardioversion + name = "Emergency Cardioversion Induction" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/incise_heart, /datum/surgery_step/ventricular_electrotherapy, /datum/surgery_step/close) + possible_locs = list(BODY_ZONE_CHEST) + +/datum/surgery_step/ventricular_electrotherapy + name = "ventricular electrotherapy" + implements = list(/obj/item/twohanded/shockpaddles = 90, /obj/item/defibrillator = 75, /obj/item/inducer = 55, /obj/item/stock_parts/cell = 25) //Just because the idea of a new player using the whole magine to defib is hillarious to me + time = 50 + repeatable = TRUE //So you can retry + +/datum/surgery_step/incise_heart/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You begin apply an electrical charge directly to the heart and across the body...", + "[user] begins to make an incision in [target]'s heart.", + "[user] begins to make an incision in [target]'s heart.") + target.notify_ghost_cloning("Your heart is undergoing Emergency Cardioversion Induction!") + playsound(src, 'sound/machines/defib_charge.ogg', 75, 0) + +/datum/surgery_step/incise_heart/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) + playsound(src, "bodyfall", 50, 1) + if(H.stat == DEAD) + display_results(user, target, "You can't use this procedure on the living! [H]'s body flops madly like a wild fish on the table from the current, and your crazed surgical methods.", + "[user] screws up, causing [H] to flop around violently as they're zapped!", + "[user] screws up, causing [H] to flop around violently as they're zapped!") + M.emote("scream") + H.electrocute_act(25, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) + H.emote("flip") + H.Jitter(100) + return FALSE + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if (!(NOBLOOD in H.dna.species.species_traits)) + display_results(user, target, "induces a stable rythum in [H]'s heart.", + "[H]'s heart is shocked, attemping to bring them back to a stable rythum!.", + "") + H.bleed_rate += 10 + H.adjustBruteLoss(10) + H.adjustOrganLoss(ORGAN_SLOT_HEART, -10) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + H.electrocute_act(0, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) + if(!do_they_live(H)) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) + return TRUE + +/datum/surgery_step/incise_heart/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) + playsound(src, "bodyfall", 50, 1) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + display_results(user, target, "You screw up, sending current racing though their body!", + "[user] screws up, causing [H] to flop around violently as they're zapped!", + "[user] screws up, causing [H] to flop around violently as they're zapped!") + H.electrocute_act(25, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) + H.emote("flip") + H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) + +/datum/surgery_step/incise_heart/do_they_live(mob/living/carbon/human/H) + + var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) + H.visible_message("[H]'s body convulses a bit.") + total_brute = H.getBruteLoss() + total_burn = H.getFireLoss() + shock_touching(30, H) + var/failed + var/tdelta = round(world.time - timeofdeath) + + + if (H.suiciding || (HAS_TRAIT(H, TRAIT_NOCLONE))) + failed = "The [src] equipment buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile." + else if (H.hellbound) + failed = "The [src] equipment buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existence. Further attempts futile." + else if(tdelta < (DEFIB_TIME_LIMIT * 10)) + failed = "The [src] equipment buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile." + else if (!heart) + failed = "The [src] equipment buzzes: Resuscitation failed - Patient's heart is missing." + else if (heart.organ_flags & ORGAN_FAILING) + failed = "The [src] equipment buzzes: Resuscitation failed - Patient's heart too damaged." + else if(total_burn >= 180 || total_brute >= 180) + failed = "The [src] equipment buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via surgery. Further attempts futile." + else if(H.get_ghost()) + failed = "The [src] equipment buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." + else + var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) + if(BR) + if(BR.organ_flags & ORGAN_FAILING) + failed = "The [src] equipment buzzes: Resuscitation failed - Patient's brain tissue is damaged making recovery of patient impossible via surgery. Further attempts futile." + if(BR.brain_death) + failed = "The [src] equipment buzzes: Resuscitation failed - Patient's brain damaged beyond point of no return. Further attempts futile." + if(H.suiciding || BR.brainmob?.suiciding) + failed = "The [src] equipment buzzes: Resuscitation failed - No intelligence pattern can be detected in patient's brain. Further attempts futile." + else + failed = "The [src] equipment buzzes: Resuscitation failed - Patient's brain is missing. Further attempts futile." + + + if(failed) + user.visible_message(failed) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) + else + //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit + if (H.health > HALFWAYCRITDEATH) + H.adjustOxyLoss(H.health - HALFWAYCRITDEATH, 0) + else + var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() + var/mobhealth = H.health + H.adjustOxyLoss((mobhealth - HALFWAYCRITDEATH) * (H.getOxyLoss() / overall_damage), 0) + H.adjustToxLoss((mobhealth - HALFWAYCRITDEATH) * (H.getToxLoss() / overall_damage), 0) + H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), 0) + H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), 0) + H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. + user.visible_message("The [src] equipment pings: Resuscitation successful.") + playsound(src, 'sound/machines/defib_success.ogg', 50, 0) + H.set_heartattack(FALSE) + H.revive() + H.emote("gasp") + H.Jitter(100) + SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) + log_combat(user, H, "revived", "Emergency Cardioversion Induction") diff --git a/code/modules/surgery/graft_synthtissue.dm b/code/modules/surgery/graft_synthtissue.dm index 7540b2cd94..86b2a8e909 100644 --- a/code/modules/surgery/graft_synthtissue.dm +++ b/code/modules/surgery/graft_synthtissue.dm @@ -49,7 +49,7 @@ to_chat(user, "There's not enough synthtissue to perform the operation! There needs to be at least 10u.") return -1 - if((chosen_organ.organ_flags & ORGAN_FAILING) && !(Sf.data["grown_volume"] >= 115)) + if((chosen_organ.organ_flags & ORGAN_FAILING) && !(Sf.data["grown_volume"] >= 80)) to_chat(user, "[chosen_organ] is too damaged to graft onto!") return -1 diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 194a10f4c4..ad0b7f46fe 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -365,3 +365,15 @@ tail.Insert(src) if(only_one) return TRUE + +/obj/item/organ/random + name = "Illegal organ" + desc = "Something fucked up" + +/obj/item/organ/random/Initialize() + ..() + var/list = subtypesof(/obj/item/organ) + list -= /obj/item/organ/random + var/newtype = pick(list) + new newtype(loc) + return INITIALIZE_HINT_QDEL diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 164fabe8063e39972b342358fc0786ad3fd4472e..17b5e9fd99514ff6ae39c85e2390e04296d48d7e 100644 GIT binary patch literal 16268 zcmc(`2UJtvw=Nn~Ktc2`A}B>vy7bnT_-sX4C8Ry>n&VA#K_wIX-G4@z%uk6j5Yp%8Cn)93Aj(n-5N=L&?0|J5Q z)Sf@n1%W6Qfve*(70?nC(2@@VU2+b3W#seB&fCVz(Zk2l-3{IjpIxn$w}D0Pv;($f6$ zV06lMxryMgNnzG?7+967N8^*}+d1Y{seAsEUXvBxJ3rGlo?riMUT5xRDdE&puN)T4 z9q$2_wR24o;8uVeo z5O=sRI2J6fjgj4T%33Hf4nidcKiRV;$?y>S*TkIdP3kfEQC4s2F*cqa8}>r{9dnUtrPTYCQR060 zBX5TJS&54EI}U$%_|{~H>+PYZb^Pq*IR->s*EK5}`)Zp@3yDD=E;&`}Tu2>?RbLEK zo&j6oyxxAee4_T$DMR75%to-td=AZ~JlEqhu60F;T#FzFMOaKh&y1d^2e!aGEA`>4 zD2DuZu9RBqUhz5M>it$yv0F-S#|q78lbqGY{KGDN3|ot#O_Ga)%T;>Szl6pZon=rP zgpHe#INo<1Go+V}1O!KMer9`ixGBmd;h*F$8^EH$_ufN`w!ymyJSOx4b&r>L6QTIn~7pO`$c;D<&Yia4#{>;*g(V zx(encsgIN}IyVJWj2=7NZba?n&eiMC+a_i8KXn%i*5z$szsce~(BQg=SI8?b&gPw2 zyIREK`?wi&onk0x`}IQpSG}|;DtDO*rtOi9;tzw5j+n)s{&w!Ws$X$m{AJs}HJtJv z>ALl4Nt>Dr8K%MxKlW#};JD);*A&YC?Y_L5Q9Sy4*b)k?6sL}vQLf>U^Ub~l_h5J_0 zb6XN~SCiGg;c09Cu6PC|~&yEcbksk$Fa(RdY1_Acsw1 z)PWdoo_mn(AVJFS&s9{|7*$ee7`s%&7Xe8rD_N^RXWu84`{r@>PzHVg=doL18M)o9 zyl4|U42wAeDHB;fn{}_!aP3eu{Xz@5TUr!f0Yj5pi+{aEKk8Gh7diTVK%LQZIv!Ww zY*x;QDM6u?^t0Qc#>DGQN@|$p_yKZX=FnJ_)K~hLe}CCD zJ>lf5()9jbUeS}L+pjpiZUsPLFNRkKZMoll!YL#UZkz=TIdgAtLQrY%2>>wuLbcCVg-=g5!5%PnLx3w?#iiSxUAAPY|td`n}6yj}9=# z<$K-?BAE|l!HT<3@z3&%aVrN#n*=+%@S63>iSjFomJPhl?Qb3)5_R$iYSx7JSlG2&W)_@c;*W z%+5sV!i^xPz;fE-wY15$cHYB)c`j5;f3@4=zXwsz^4522P{WOGYXix-8>z{3QrQ({ zLyh|gI7{VVFm8^L3@~=2&f(R{=)Zh+TXOms)Y^ zGzwpHod>a4*}%&gy$(q_s1npBdl~oi)4E6(l83gBR z0L2gcH&Bl^rB`qcfXv>P5m0Vk=*j2LK0b}KYG zakK)1<)J;l1%FB(t#Ciyoz_x8v=i)oJjG6u=i)*Of8D5v#wG(&-&~`e(&d$8!?{AQ zPIW!bQP~y5k$ zzj(|f_XEZ!V8ktB_CVJ&6Lh0v@9j_ZATo;%cU&8TN`uL>dFi@yv z1PW2or~%aHycR#=$Za`$1hQY{$_82AA{{6ENfwJC-&jRY4-h$~dsAxPkgpqe6w}GA z7C(oloI(8udW%!pet)l!PZEYyA@76j$MARwQ>oXVGl?&z>#;R<{zXK0^AMk&wMo)s zIU{0!?rqs=ldA?Pw|Z8b%)e2f6n}Hw4mKRFWbU;|mX1hA&+Hx#3WNC%6b#x<4y;4w zo95&G)>*=Res+d`S!W|5j{2n_n%os%>V2OEuaR?OE&Y{S3N&D@E0g9U+c2~^Tq)D; zD7$-sd>ohz0_CijBp)A$u;gYj3~aK1LNgd|Q`kRT1UK|b1Zl`zq5Y3pTD&a+x`#HF zT~Cj*=>UbcChv(ARK}Cl8AL!JEsv}J-_Pbh%O>X~d>?M#^|u$3bYOxDgwgSl!wlA2 z7RZ3*ecEr?8lY2xr2rk@l1f318c$$Oomt3Bv?heW*fn`RG=%E&Zx*fj~wceHWlb$>U##5al7n z%2)!}r5G}KN?wYXolQanc*?s1ry4`XJ4#UK#dGCcTOAX%iX&VAVL$Msm8LG$9*ce9 zIM?2Ug^Evs83tC5{L~n886+pHO|wS-%I984kCu3g6XUnpPhON5|MK940b$U2Tkrx@ z*<2fJ*m?S4P1_Xd-$q{Da3}Tg#lL~vu#nr6<0s%_{;Ks5*d(;H;%NEImTG@DCCKS5!FPMY9fEQsOp z_|`M^O+bL_?UyzDj?qWB>}UcBkM<+=Y*}g%WNQ=RpDj_j105J+Qz=YU;#m3kbh=13 zEM8lj0y32)ZxR;HFnoMSB2#Xn61m8)oK_l!nyuK}OdK9;EZ^DM_--B8NB|USH;9%w zLmC`|P1}=rsaXg@2r`L89gRX$nG%4CYDYbGRATvWYW?Qt^<3fZ~J4lBcb>mDt z#d$c*6NW~?v@FcxE1%D|DK=y$IYeNW=79IVu!Yx3Ubq$q3P;3DF~2=Q!A^vq)MHPz zpRX2!$@N&^sQ8M~Zzn5E^`(Ac4?fhG>bWe?=XXE|`^l0KL>ia9Pu_6%**pBnEbC=k z{gEAVmXmB2d0{xX^TzWNhPi`qAvk%NAqDVs(>+gg;LX|I`d_DYw=eUyfx?7`rLg0O z>-D(t=>e3)MH_i=$lgoJqLk09{m4j=#vT( z^zKTg83<+iW!l?tm~BWyP{_}ghuPf1SRPCH2R5Ync)m~1k(=ddWe>pT8 z=&h$jj`)>pY#}ZQc>G~)93%dmgtnLLE=n~{r7Q~H?TqK==Pz@8Dx?Ne>Pk|ef&k+U za_Rb-lu#)Mb*qoZC4e6^3<;wbKTdu4D%zh;t{QUT6WzYbXx084HtdRNv6Lb4K7&)y zG5dV1ps|-Hrqgzg)iu$PytDUgSi(-7PYK%WXER9xR)~PJ2gCNgFyAs7jlH;MXI+Yb z@-k!Jna4uB3wOg1pvDENba4>W;G|8nbD2fL;Zsi>n{x<@8Es1F&Zx}pbFIhVzbBom zPi8q57pv@<2>+;Ebg_$cR!BOg5s{hkm89GYnlbjmb!GFRm9MmX@k1%w^u`UfT*!lX z+atooMXfdBLfx5v`6%lu#f5@{HcM>@zJito<@WO!TNbmvSM5?r8JVMo{4X|rrIEU8xI&_{NU%5hCsBO$2-0^|-2fslz&Yw{%0fkGi& z^41ifMG)oH|2P3&c7Q-Kk0>tw-)v-PUI2j}eQp(i9nKpO!tshNN0M-#{?G2t{bAXh zsqW~yX?4=~t$Fc%a^)5I($(wWd=VQ`RKsy_R?=GVMbPG=!p+EMKBs#PC9SPy@LGq_ z2lK(0wy53}nwEFrYp26#a)w!ZyOaIR{ZUJCZ=8=(fJ=Q!g+ls;!w4a2a~Ef*1~+Jzc_I9;Ja0?cfab5EJKG3>d{Xg+ zkZ%VsFeM$mZu^_hzBM7wGt6OPLHe79wAB%{Rg^}*+gZy3V$S3> zT4Wtbwkhm5&*TMoNw{?9H!OTl1Dh0~z@U*~mI_cnd{UO-a4bP?;Y_0QpQ;Kouc zvooQhhn%aeQn1hlPN*LI;>z;7=6GkUJ{F#Yo%-OrGojW%N^~O)+P^Y1EMB{aRui}h z%x$KLxq0S8{)*AVt#K|cnx^vd;cclo-%0cB@!|%~Z|%@@A@XkQaaS;Y(%BC2+}PIp zl7Jef{nV|e7jO%FynKCqzlc~r!B%PRIIjRTgPz1nmw>WeCOO2x-v*3w#UthM=u+3G zc6N5yz>3n+Ul*?{+*3RED>7M9@2lx~riqffuQzP`#9^9qJ|SA8qG)c$sz`b+|46#^`}gmtpRaSt zJYT___LUFnxz;FG?Q@Ik+B)_Z0E_u0 z)tOr><1?1_YFr0T0%Pe*k) z?A><}ko?iFL`$ler4iPyRD~=2A(xz5{&mLG_JYHjU*+qT$KT7R2b~+U>)r_L5MFXO z=B8M=JfPK+Jze?P8v;oaF0@(x5jk;;W~Z=cemlcTp|Kw&oq9>N zdmhy^aJ0U9OP#5{kfE|<`KUN6T-nywRE1ZkaSJJMfR}DW)vI=-6+v)ow>^X|YbmyT z{-Cm5Wz|6?^prmJ{#kZ{{pUlCPs2(zhMV?}P8+XAB0q@7PW&>~-U1tMSbGS)#CmWo1UJq76eralpV>k)2dKbvb!a7C6Bv zY+vVwD(dOzCpVlS*IW9tnSYg!xSGN_@9UGh zPRCMSVt8wyr^G#opgvYsh#sk!K)c^J=li*$j#+5ax3DPRn{D7{j5Z!RMoywEEAJh6 zf9AC=NxyLK-r)skrT<$})#h!rF|2uH>gkPnDGj(=1_F3fN71Oz==st zwS($ZiGpK=GMEzaLQ(;RWwYT8HEki20>C2)(HRTJwAygZ>Y430#f{xmkAZM)MNS$> zm7h)xNGTldnz;tynZ7`}>F3Y>aKQ`ur3FSSpl-#Xz=kVWSGJwaQ;vqmBaz6mwYWRt zD!@VGQ;h;u)1Gmbrq{FmqJ^PLm`Lr0C`$!kJ1NK!4l1SLL8gDtS#_v<#) zW~FBOQx1D>Ht?7Kh;~y`i(J#P*dG?YLEyJ9@}r{QTNpVRB8H?mo10#2TTUvC6uCSfq!;66E&O^Dgv-abrU;`m)- zul;jL)*RWTlwY*WU(KW0lwg(Wp)Q zOvRV`;gWv8Y1GDAt-BLJu!C@GcFt}v_x2%qd+-(ucN*M zEPB2YEdeWtDr^3*hT7Y$i4~l$b7?fh8+)k$i}lL%8B>$W<5K&1%Y7?WDdaG3V@nw| z&JuF+wQ*U{nZU)x^^lKGEiP0;UEOEhb#+t+OIf4AagoM1f z+_{33y#S*V5n|I5qa(pw2zkqDZGFk5)$(jW{QL~7_PJ^Q2$dWwE)tzGV!^~rp%s2cEvXa1hCr3xK%$6U6aThN=KRJ?1V{cChoX4XQ+NDJ1(4*>EaKfK{ zG7t>*G9ikag^gs@FEqYx^jt|PZh#lZI3k;mn=?h~<(ySCb{ai*u1afQfJ2rbFh1S= zVr^X>0IHtclI$7$#2IMus^_XGW~J5iJhRM~;c`Zkkb~e8D~moBs|3-iB%6*;Mg8J> z)n@SvW6j56=TXCcZ;Jh(gQIzHf5}cLMF-t**s$#v1#j;Z-|Nq-bvm+{Ge}g5S74@k z6_vD~Z-{{2#Z?a#O>sh{r|ARS4`17GYG9I~zY8|L2nGXZ5dSpmMJmwhB}9yQK=byP z?ZKOeYa${5-nQCiwKc;`p$B-U_Voc-QL#EzqW!(50_1O6{T5qPIzW4I*n8&|h&e+= zd`%7oX!u29YSp_grHeDtfS7l1-AWft0LKsH5qAFT{~Ct3SjIc*7*dm?5seYU)r3=b zg%qb(l!=}kVG1hD^JDNQ4KHz-7}%qVyyeyUR&?c0ll{$6n`$L$S|*{(zVh6fUtBmH z0qB|!NlnLGU=t^+qOb4ozfFA3xv&gagS%HG!6|EO^$;BmOl@K5thK_z723=(Y1-z` z*>@GDmNy_JIro0hpZI%E#FNW@qKr&iR8Ec-Ut$wav)529d%Oa_7;H+DJSy^D;|fu+ zW1hWi#hLQ{+mU2*m%?|d@po;aqM}~CdiBf2{OQwhW@hFm{7Y(y-069F584iTSnf<- zzb*2Jj*c!jIcEou$&DehmZ)|R;K0S2Xm4`EJ@=jB&Hn292LTy3MC6)YP};5xEg<}2 zIlmp(ua^w$J3~I*ri?%csx!E~#9yQ?2=j=4M95zlWy;EDqobRtaZWvElgT;1eJ{*8 z@!tFglra3|$jWQF(Np@{*RRjdJ6_wLZ!t8jcj<2?#Y!)XT;a*E5`;~Z8p8`bS9*;5 z-TPaSioeTKxqEH2u+oFUs&#dBa-N3{&S_NvW}`h1t|_hG7Qu#ZNZzW51)rSlpbH^J zewKO%+!{?)1+JUW#YY1}AMh;o0U^PMBLlzP`*+b5%}j=UK#^R6)-O!Do1oI3MInFYUB`{tU-yoCI*@5#Sm`q!Oh19eKa8&&gh`&SO z|G@rC##6z1&)=3D@3{U5s^zHJWWq`zeOlPvCD1YA7BYBb*`$VXoh_Ooa+%Z~xh5kX zng_0N$yNEgD`Ig#^x= z3JkBni>B#Xr%5TGw`W_)8DO(Dp6qfsEvjr98|3@IN57syUCUHV74~PDUp)4wcSdkvO4;$AQk1R7^4O#m zy%BjD+TS5$s4p4;Ch|>LlC{+3X`6T3ixNDhL!4S!`R0cDf*5^Lg$&}}V+en3_U7s| zg7LefsxAH{NF7zK)Y*}dk(|7|yf=j`>sO3)mvytREB$?>JO0c6MCvND#B`!1jE*rUqo-w=#fj}HO}}TWucID zCdNtAc+=AyQjQaM5}4U{WRI|T6btyf3GM^E_t`Hlj21@Q2CrtXpM4Nq7>|w~3hW;K zrBSl*>z`7%_08I)()YAX0r{%&qSFIXgFB(|vg^0$Zj0m?Z=JB8rc%7m&X$|sg|Ygz zCk4$(>$Ga_-`#uYPB6*jCi-tF75Sv!Zg@e`3=>fUuw=lrCF zYH9;YPCtD3PzodMazG3=Z4%P_A~C%?-_kHW-6Mtm*lnle{=?JZA3)cGo)PeO|Hq)7 za`F{^Ac)aGV`nBBU${FNR$E(Mvw9JP)yw5Po2~hIC;H70jXX=jUKy<=j0+6F(uCrd z@S-?Jl6_5)5O00`4M9?Wy+R)~Xf+!+6!e%Fc%r5C_#y;XvR%ACVGwrrKp<HKaTT#1S#ow(Jrvz`gpVd zmoEuRJG~89=h??EM&A&0ewMDK-x{ZY6BAlI^Bx;k%V4>EnzqWyhKZ~jp*{G5p$u+Pd5=sKn zK^p6*AeZ7JVtTKS<~q32D*lMr&%~BFh&UyLOyDpN_u+#GZzRPI0Y-QAny|xOXeFER z9g5y%PvvnF3C8%6x?q;*+sZ2z1HBe=%ie3sT!?o-F!$ka0G}Ag(E_)7Yf|pJ(ba#) z6^F6o@r~DZOrgBsY`jK5nKbJi<6=N#2Vb+dF+Mydb zjY&VkiCJ<5O4wTBrocbQc3%QV**Y~+no%^UamT5I0GjDhrvTE~x-|YyE7cR&;)&`I zm-ms9^JbUhLd`vmyTp5o7dGx8KBfwpZ*!uBmsyUl`oga-{xOoLl{0FL&}-Ly{eva? z^Xkya<*97HWA}Ou85!)*Bz?P`%67;#HCCK!Gd`YjR##6i(F?Q6^a>O)H1sy2TXZ4d z;Mjso4+LT!Ip+f0$#V1?oE$UG()ro?In|G`oT<)_u~J%TJ?*gO)5=O&CMBExptB!i zt@OeIN!7+;`B~|K?lUaLd+CxuKX_KwlkspR9xSBRyhLufsiz2dfT9v6Q5;+Ks(M9xs=~Cv%>i z9i7EBT&hHkU2a@ye*`2jsQ{1SKeA%~nY(;Dhq!tL^hEclyBuCnoTacBpz$gG_WvC7 zvwwUslp{W*A)Rxp7=hjh&{({{Vf8=DhAs*?fco^td$|{APY))Q{93sPk$~U#e>Ot@ z?AQRfXB!;|w8|#*^g^gsDfwr#SX{M~5I-Kv2YY%{2rtm%RBOQ^!p~dGASFCXX0<3Wvr3+!i7#|sm=RP<3vNhJ8jj-`TJ>Li3PLBpRZxj zz~%j!9jFdlfV{TqD(B~47ks2|Fx@4^@E|Kh(dl-!J=3RW+-bKQgIvTdodnPtLJ2}m zoNGD4Jk}JC>=^|tskvAM&{kJwD|1iAib_AO-eL~qk7+gLmgQorwm1@DL)d;2$RhSiX_8p~HekU3YOoZHnTx*)JEA?3TU7Rus~fvIa>#dk%BlWZTlp zKzOZfBttxpn??#}{6)Z@9+{@pn0if6e{0kJ7F!2k(i=ROm2b#W*YG6XrAGvHvkytH z3GS-T;XU#3@(c7J884R9UtCy1v|h=m>&QkT#U5^-<%{8~HEcW?5UHOHR}eDv*!c ze`(qOz47_7fD5QH;{PfkFB@J{NwIqKf1blv=m(&D5D2T48~dpxs>RlYAm70H$7LNx z##3{tfm@q%LU8s0LwNVrs%rOD(?0)Jn5c64n(D0`1r+AK44Ta0kxP#`gmg9Sxqzp5 z4=20xhbQO;t9JLJ?cY7OZ4|*w$KU|88zBxaT=Y?tH1v6O<@1AyEK9QefPFA|99Ona zzOf*b6eCKl84?mwb4qKsAuDmi=EaZChrLT^+Xo3B1D7LtUWA0SCB$s+>Y8f+v%N{dkyvi5c?>uwy8#ha1iA~H#0YY$TK6f zbcodyULwlU24T50<1rRv zUqe@;Bh@TkJ^iq-=<{LYIU(ONy|qzc=!L0Fjb{_(P3{+;1|Mg-(}!o`h938`z7S~W z6E>U8x6HO|>>RDIEeW;!&+TfI9!6UFO&M9*lKT7>o)gQ`&=0;-($;u8%X|Y?A z{9aO0Q+GwJd|)!wq8(mXlatsBK{>Mqp7g$pE-RqMayhDvS0DGWyDJEfr$Ot7>FL%H zi`?LafRs`u0mLvI6F|<33hb{5y~ttZY)>J*k3eA789CgG>|taUyyENEQNg3vycug@ z^)7T%k?eQV1cLL3C*b>QL1Ae3sn=_#(X-|{RX_n z?{qRHyaHd!lHKY0v4JM6{Wvp6sLfS`+%FY;Iu&&5R{D7$-WC-#v_>ZOuVU>c4 zoPRf9l4|Y7C4zkZ65lNh8cR>MD`K!_1b91D4{oF#!h@B<2*p=Ve&1sHT2 zE5HBg&G1!uCF6FREat>&Narugv5?$e9weRzd?%wC(i04^a=J#?v!Gbv^(@m}Pq5zExGHT}%-vh*whvgE|(Da_oUR`l@OCZ4$-y7MD15%xup z-1eai?WIH(h~Tj|ot-7M$9Oo0oQYHQ%KG||H$3!{ zT?T_8g`7I=xDBoW{DIucP&|*460Y^f$zjDEc?F$zwzrn;EK(VzbSzqaZL&@L^pot= zZpj5dLO8Q52@#8>p_68Tg(VJZV`0Jq9$(0N?iI3!JnuJYX<0GkFYfX~mX$eUP7Bgw z`>y=i5^B`kn(B9HuO))di0c|->FM-q{9OC!xg;a#8$=QPU3rBAUz`DFQLeMolZ6fr z1_8@0#!RmPgI?35mIt0&hQ(%O%BJXv3azFYWwP85IBBFfhdMRcaYzx*S(FhDtj21O ztABf{StNtEcYh>#cdUO)=c0|cha8}CCjOQDBFa(c(Hq}TefqHFKt(fC(Nu4o#(#T# zNXpOBE*vQV9SRsSO7y#GwDP;Vi*YW%ChZL>YeHsi&K9@sSdG2-iGxvJ|68=}+U-9p zzCEW=3f^l*TZ2R2cq}ugg+(u9k)wZXBwxi3a;y~YuoP!GJ9!14GzAj05`P?eYg{Xs z-!O%0lxDnJOZ7MrbDgo}P%`e?LfZ2DQwZ!qtKW^M8b@iTc$`#grqp)`FCE&|LqS<3 z-^U7p)dP??BiP;W-%Iu^Kb$Y4atJ_Ma&PBU%W4vX^P;6KotSS;mWgD22rk-A9U{k? zwOrz>gQUM~7yS4fz+}{#CYu!oz?ZaX@b4rhCm+MLp-LMq%kh556RG5Km}QHsuTwJz zz*ivs5~s{C2k=Vog-Y?Gh&I^oTfJsEsRnJ1dnQ&Km~rw$kb;I7fgsQTojESr42+V!zH=j9B8oVs~e+Rju! zaxN<2vrJ04CSu;=r^g?Yz`-fHoOw%50BB0vQo>&$k$8Sb_mbLEy4Y0m- z!F*OGEWZRI!j2p2V9{u-vh#U-p^~OGkOvtxIR{{Bfvww_SOJWj|7Wy;&84fLh)Aq* zFc4$r(D7Qb@)hL(6|K`ep2(Fp2YDd40~oVF+kXeV1B}fGscvUzUPr)+-QU5NKNwt7 z*!2fZlul73Y14_wV=!}**iPi5s=ttU;!7M|!!;jq3PC~VhS~qdX`TV|cMJZfhirg7 zJHwY*w8>T7smFr_(Z?j*nKU0>tDXGz^mvBsuu3ytW9r#sD&h6MKN+INhtISlr-ki5 zib+V|L?vznI-R7$-^QPz9Nnuv>S$_e-X{C(eEwWRH2T5IjAw`qW)`#kct$58+8?cM z@k6Rv|*h%*!{;Xe`t$0Ttn*4+K2jshg!#+peIsONscToyI{&WirOMb zh;@?3i92aRgZEGR#=rVcqTNrR^8EK;2tlToe@^#MR7SVv45`=Bm9YNRcGlArA zyHwp!yBj-%PS-!QBfN02ZON$Go!c^cOS3b8_}+5~FZdepKDA)Fofj(-rL>Zgl2OVr z=@*;^QzK>B&YEWMoDrw{n1-4&Jbt!|WX~F6GKi|BQ%OiV6{!)UaU=t%`M)B>zZ|J{ z?$IkO1Z2%+QZnlgMh9L)h0*PkX}=*|e^BGWS@m-&?L92Q3jvHC17FeWq*MD`DhuKi zO#U=mgHYAc*HE(yc2`d84&w@H9Pd}f)`769^+=D`2LwNLp?DnMBC86p%r|~A_)sS+ z{e01X;Zg4s3V)I5xV^i>X=5M|o_FzDULBAA`y&-rQ0TGUkyydl7{!~-5$j=^y!a)9nI%VktGFHaoXx>`G?I$;m;BZ>ej8@osxlRZjuK zRqX|-uJs8etewdFY+cw|a-MKluQV*(05?I~9{A7Y3gYMTqiBU3QqU={72t@_A63>M z59ADs=U=YYK-`;>HKsu_@UFyBSVZR9`Ah9-xsbwL_lz5@tzQeJC!brUZdG$GWLyM! zMf~>fdI)H$*>BIOjp(I_ko@^YX-07jg{%c=%GZI(yJ!-0Gd4w~S}=KUiIffkwfyyd zC%gR8?(>$6dwpW%HQyJXmnqL@igj{E$F=BYHLnS%&z!-7dVFj%MI#0vgXe_Gho)#1 z4AjSr3WHXqXd1(1GM*GdDDL4s8GWd`uNZ(vWJNCQTm40<0=1VNY*)_#mW@Xg8=sz@ zdA^@u*v)Ovf>VXgb%-vqddpBwr+|ApBqTwrR5UWGb+5iptJexzUIclBpTi4ppQuHt zln>5y0oF*k$f4#)=jV*;Gi4}}u$TN)iO}@<`f5p+!>W2syHu8^oulzHAou+YUfdY- zp#Su9UXh~u*E)h2U^ciht{W{g zs*UzR41SO6b8cru9O;+ypOxdg7vIcL!Dt4vgN_47{ebUo=wb;#zaH6o^_^o3RwsBx!fOSbIzJ%| zdhCKh?2WnpmNFud>`w{Q|B72>ILx(x#5~}`TRV8N5XW3Mu&#SjQ&Z%puHl;Xs-fjo zbWJsMgvISyXikay>D!&5P@DG=C-1(#1|mnBw+WWPS(I}#L@PpbpMMn@6gvD(gfSaq z*K)NJaq0eG^?mXP!TLcqKw*5O#Gf=rR^`ZsU~$sy$AocoJbF9eDV7x$L-8M2r_8FF z5eQVvQ`B+uzri(MJO)x6>g6xqivK5I^f?Te+y^ikAj$bZ!zllk0=R#&>@MR)n&r|I zvK@&rJLlAT%z5hCUSX026p_L32S_b&N6c#!o7n-vxjuUkj93(ZtN1Ed23rg?ym&hhGP6@md+Je20W235S~LZa(}A%-%h< zAfkbxDUgbhk2z1M|J&y<_Ie}bqLgttaQOJp73G$?9UJXnJZnjFb3^G};r&_s&2?fT zORZ-^F`ax=Z6Hpig;0Db&cv`kUUZRKAAe9a(@J0uOh%usDiu{vdIovp-P(>5M(bTM zUhSYKsST7@{|+-xA!E)`Gn(iYCD4$3B4BdRC?RJbsmW z%+4E_l@%Bq`<*n`O@ly@ z`nPfsj;iSPvmv`;wvjcQLP+JL-u&=|5NMXp+BfzRcQn)h3${Pr@n+xG50}lMdr$3q zL>+u6ywKj-hnYXM6+ao&-mE5Dy-gwC#Sq}O z>9;FX23yIYp^eGPnpAE9V|@lkv!vVM!cSpuzRpbo5m~U(?QfSK!I|R1r zWaqQg%B~V|zjNL%JpR_V*%@N)V}(cvx>Gji|FSqhUOoh>Tv2Y)c*H(dHC9^3?~}90 z`z^heIPb~~`E~b;Z2EVpy>I_|o|q=n;wxJs{2V!LNc@jN^Gh@tysSeV1l zQ{DOB)CFf_%dmj$v7dcr_61MAZMb)nF-={!%gBF1Ikh$7QfS)3#f~E1q9f-8b`dK? zJ9fA68E1sh9@z*f_3K+sbOK?n2BF&}jE3J;>Dwz6erFGLC^f*(q-{|P+_06gk+QSu6Tdkw(2CAY0y{&2H z8J6a8($st$L)so&<5e_Z8P_Jas~;V)16kWA$`l-!Hj|pp*(S08Zt3{C9jEKm)YA$? z`@~E%Mnm#w0gtDXFl}h(w<-A9qBX|iURskvPMryI-wA#DW+xak!0;TE1%WRZrGp94 zlhDQAA!bgbD&It(M_&-$6$@tCga?qUACXYdB9&q`iUd{{iG_&Yb9Mv)e`?BF&&r=z Gh5aAMnpva( literal 15921 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 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 4949cc6ecf..5f89a7e4ed 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -102,20 +102,35 @@ pH = 7.6 metabolization_rate = 0.05 //Give them time to graft data = list("grown_volume" = 0, "injected_vol" = 0) + var/borrowed_health /datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) - var/target = M.zone_selected - if (M.stat == DEAD) - show_message = 0 + var/mob/living/carbon/C = M + var/healing_factor = (((data["grown_volume"] / 100) + 1)*reac_volume) if(method in list(PATCH, TOUCH)) - M.apply_damage(reac_volume*-1.5, BRUTE, target) - M.apply_damage(reac_volume*-1.5, BURN, target) - if(show_message) - to_chat(M, "You feel your [target] heal! It stings like hell!") + if (M.stat == DEAD) + M.visible_message("The synthetic tissue rapidly grafts into [M]'s wounds, attemping to repair the damage as quickly as possible.") + borrowed_health += healing_factor + M.adjustBruteLoss(-healing_factor*2) + M.adjustFireLoss(-healing_factor*2) + M.adjustToxLoss(-healing_factor) + M.adjustCloneLoss(-healing_factor) + M.updatehealth() + if(data["grown_volume"] > 135 && ((C.health + C.oxyloss)>=80)) + if(M.revive()) + M.emote("gasp") + log_combat(M, M, "revived", src) + else + M.adjustBruteLoss(-healing_factor) + M.adjustFireLoss(-healing_factor) + to_chat(M, "You feel your flesh merge with the synthetic tissue! It stings like hell!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - if(method==INJECT) - data["injected_vol"] = reac_volume + if(method==INJECT) + data["injected_vol"] = reac_volume + var/obj/item/organ/heart/H = C.getorganslot(ORGAN_SLOT_HEART) + if(data["grown_volume"] > 50 && H.organ_flags & ORGAN_FAILING) + H.applyOrganDamage(-20) ..() /datum/reagent/synthtissue/on_mob_life(mob/living/carbon/C) @@ -129,6 +144,10 @@ to_chat(C, "You feel something reform inside of you!") data["injected_vol"] -= metabolization_rate + if(borrowed_health) + C.adjustToxLoss(1) + C.adjustCloneLoss(1) + borrowed_health -= 1 ..() /datum/reagent/synthtissue/on_merge(passed_data) @@ -139,6 +158,7 @@ if(iscarbon(holder.my_atom)) data["injected_vol"] = data["injected_vol"] + passed_data["injected_vol"] passed_data["injected_vol"] = 0 + update_name() ..() /datum/reagent/synthtissue/on_new(passed_data) @@ -146,6 +166,32 @@ return ..() if(passed_data["grown_volume"] > data["grown_volume"]) data["grown_volume"] = passed_data["grown_volume"] + update_name() ..() +/datum/reagent/synthtissue/proc/update_name() + switch(data["grown_volume"]) + if(-INFINITY to 50) + name = "Young Synthtissue Colony" + if(50 to 80) + name = "Adolescent Synthtissue Colony" + if(80 to 135) + name = "Adult Synthtissue Colony" + if(135 to 175) + name = "Master Synthtissue Colony" + if(175 to INFINITY) + name = "Apex Synthtissue Colony" + +/datum/reagent/synthtissue/on_mob_delete(mob/living/M) + if(!iscarbon(M)) + return + var/mob/living/carbon/C = M + C.adjustBruteLoss(borrowed_health*1.25) + C.adjustToxLoss(borrowed_health*1.25) + C.adjustCloneLoss(borrowed_health*1.25) + C.adjustAllOrganLoss(borrowed_health*0.25) + M.updatehealth() + if(borrowed_health && C.health < -20) + M.stat = DEAD + M.visible_message("The synthetic tissue degrades off [M]'s wounds as they collapse to the floor.") //NEEDS ON_MOB_DEAD()