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 164fabe806..17b5e9fd99 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ 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()