From cc53a0061feeba0558f8608f099fd9397a603f87 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 02:15:58 +0000 Subject: [PATCH 01/24] 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 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 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() From ff7b070fa1164b7fb12b615fd0e03163813ed8cd Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 02:16:15 +0000 Subject: [PATCH 02/24] Maps --- _maps/map_files/BoxStation/BoxStation.dmm | 12 +++++++---- .../map_files/Deltastation/DeltaStation2.dmm | 11 +++++----- _maps/map_files/MetaStation/MetaStation.dmm | 12 +++++++---- _maps/map_files/OmegaStation/OmegaStation.dmm | 6 +++++- _maps/map_files/PubbyStation/PubbyStation.dmm | 20 +++++++++++-------- 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 53b12ca0bb..d8671b6a27 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -35129,9 +35129,6 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bDD" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, /obj/structure/bed, /obj/item/bedsheet/medical, /obj/effect/turf_decal/tile/blue{ @@ -36070,6 +36067,9 @@ "bFJ" = ( /obj/structure/bed, /obj/item/bedsheet/medical, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -28 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bFK" = ( @@ -57530,6 +57530,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"nWU" = ( +/obj/machinery/smartfridge/organ, +/turf/closed/wall, +/area/medical/sleeper) "oce" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -93288,7 +93292,7 @@ bvj bvj bvd bFu -bvj +nWU bvj bvd bKH diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index d9d46066bf..7d4644dd35 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -103794,10 +103794,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dsI" = ( -/obj/structure/sign/warning/nosmoking, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/smartfridge/organ, /turf/closed/wall, /area/medical/surgery) "dsJ" = ( @@ -127428,6 +127425,10 @@ /obj/item/assembly/signaler, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"mMC" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall, +/area/medical/surgery) "mQE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -174919,7 +174920,7 @@ dkv dma dma dma -dma +mMC dsI dro dvz diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index f72a787214..a21e6da9a8 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -62776,6 +62776,9 @@ "cro" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -28 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) "crq" = ( @@ -63296,9 +63299,6 @@ dir = 1; pixel_y = -22 }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -83997,6 +83997,10 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"qnB" = ( +/obj/machinery/smartfridge/organ, +/turf/closed/wall, +/area/medical/surgery) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -104229,7 +104233,7 @@ cia cia cpX cia -cia +qnB cia ceu dyg diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index a7ab212bd6..0722811852 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -42880,6 +42880,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"uvp" = ( +/obj/machinery/smartfridge/organ, +/turf/closed/wall, +/area/medical/medbay/zone3) "uxJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -81595,7 +81599,7 @@ aSh bcf bcW blt -aSh +uvp aOL bfA bfX diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index d70bc0187b..20bfe0e850 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -37749,6 +37749,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/light_switch{ + pixel_x = -22 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) "bIp" = ( @@ -38828,10 +38831,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -39305,15 +39304,16 @@ /obj/item/clothing/gloves/color/latex, /obj/item/clothing/mask/surgical, /obj/item/clothing/suit/apron/surgical, -/obj/machinery/light_switch{ - pixel_x = -22 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) "bLN" = ( @@ -55674,6 +55674,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"jdA" = ( +/obj/machinery/smartfridge/organ, +/turf/closed/wall, +/area/medical/surgery) "jeq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -92221,7 +92225,7 @@ bFU bFU bIn bJt -bFU +jdA bFU bFU bFU From ef78757ed8b6c978461c6d803f5a2694918aae47 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 02:19:25 +0000 Subject: [PATCH 03/24] oops --- _maps/map_files/Deltastation/DeltaStation2.dmm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 7d4644dd35..c7a902f090 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -103795,6 +103795,9 @@ /area/medical/medbay/central) "dsI" = ( /obj/machinery/smartfridge/organ, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/closed/wall, /area/medical/surgery) "dsJ" = ( From 18e1246fd0e27a907aa4de8d5ba0f070fb4bfb56 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 03:16:18 +0000 Subject: [PATCH 04/24] Classic fixes --- _maps/map_files/BoxStation/BoxStation.dmm | 2 +- .../map_files/Deltastation/DeltaStation2.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/OmegaStation/OmegaStation.dmm | 4 +- _maps/map_files/PubbyStation/PubbyStation.dmm | 2 +- code/game/data_huds.dm | 8 +- code/game/objects/items/devices/scanners.dm | 82 +++++++++--------- .../kitchen_machinery/smartfridge.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 7 +- icons/mob/hud.dmi | Bin 16268 -> 16277 bytes 10 files changed, 60 insertions(+), 51 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index d8671b6a27..55ed3e72ff 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -57531,7 +57531,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "nWU" = ( -/obj/machinery/smartfridge/organ, +/obj/machinery/smartfridge/organ/preloaded, /turf/closed/wall, /area/medical/sleeper) "oce" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c7a902f090..ac7d291b2f 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -103794,10 +103794,10 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dsI" = ( -/obj/machinery/smartfridge/organ, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/smartfridge/organ/preloaded, /turf/closed/wall, /area/medical/surgery) "dsJ" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index a21e6da9a8..0e6feb67c6 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -83998,7 +83998,7 @@ /turf/open/floor/plating, /area/maintenance/port) "qnB" = ( -/obj/machinery/smartfridge/organ, +/obj/machinery/smartfridge/organ/preloaded, /turf/closed/wall, /area/medical/surgery) "qqg" = ( diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 0722811852..bd3d72dc85 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -42881,7 +42881,9 @@ /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "uvp" = ( -/obj/machinery/smartfridge/organ, +/obj/machinery/smartfridge/organ/preloaded{ + pixel_y = 2 + }, /turf/closed/wall, /area/medical/medbay/zone3) "uxJ" = ( diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 20bfe0e850..9f1c1824cd 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -55675,7 +55675,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "jdA" = ( -/obj/machinery/smartfridge/organ, +/obj/machinery/smartfridge/organ/preloaded, /turf/closed/wall, /area/medical/surgery) "jeq" = ( diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 55fe37008a..1a57cf5051 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -190,10 +190,12 @@ var/tdelta = round(world.time - timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) var/obj/item/organ/heart/He = getorgan(/obj/item/organ/heart) - if(!He || He.organ_flags & ORGAN_FAILING) - holder.icon_state = "huddefibheart" - else + if(He) holder.icon_state = "huddefib" + if(He.organ_flags & ORGAN_FAILING) + holder.icon_state = "huddefibheart" + else + holder.icon_state = "huddefibheart" 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 2cc0321f6a..b98cbc5495 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -150,11 +150,10 @@ SLIME SCANNER msg += "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.\n" if(advanced) 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.) - + to_chat(user, msg) + msg = "" // Body part damage report var/list/dmgreport = list() @@ -180,7 +179,7 @@ SLIME SCANNER [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]\ [(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]" dmgreport += "\n" - msg += dmgreport + to_chat(user, dmgreport.Join()) //Organ damages report @@ -190,6 +189,7 @@ SLIME SCANNER for(var/organ in C.internal_organs) var/temp_message + var/damage_message var/obj/item/organ/O = organ //EYES @@ -197,15 +197,15 @@ SLIME SCANNER var/obj/item/organ/eyes/eyes = O if(advanced) if(HAS_TRAIT(C, TRAIT_BLIND)) - temp_message += "\tSubject is blind." + temp_message += " Subject is blind." if(HAS_TRAIT(C, TRAIT_NEARSIGHT)) - temp_message += "\tSubject is nearsighted." + temp_message += " Subject is nearsighted." if(eyes.damage > 30) - temp_message += "\tSubject has severe eye damage." + damage_message += " Subject has severe eye damage." else if(eyes.damage > 20) - temp_message += "\tSubject has significant eye damage." + damage_message += " Subject has significant eye damage." else if(eyes.damage) - temp_message += "\tSubject has minor eye damage." + damage_message += " Subject has minor eye damage." //EARS @@ -213,28 +213,28 @@ SLIME SCANNER var/obj/item/organ/ears/ears = O if(advanced) if(HAS_TRAIT_FROM(C, TRAIT_DEAF, GENETIC_MUTATION)) - temp_message += "\tSubject is genetically deaf." + temp_message += " Subject is genetically deaf." else if(HAS_TRAIT(C, TRAIT_DEAF)) - temp_message += "\tSubject is deaf." + temp_message += " Subject is deaf." else if(ears.damage) - temp_message += "\tSubject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage." + damage_message += " Subject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage." if(ears.deaf) - temp_message += "\tSubject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf." + damage_message += " Subject 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." + damage_message += " Subject'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." + damage_message += " Severe 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." + damage_message += " Brain damage detected." + else if(!advanced) + damage_message += " Functional Brain detected." if(advanced) - temp_message += "\tBrain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%." + temp_message += " Brain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%." //TRAUMAS if(LAZYLEN(C.get_traumas())) @@ -250,40 +250,42 @@ SLIME SCANNER 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)]." + temp_message += " Cerebral 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()]." + temp_message += " Subject 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." + temp_message += " Subject is hallucinating." //MKUltra if(H.has_status_effect(/datum/status_effect/chem/enthrall)) - temp_message += "\tSubject has abnormal brain fuctions." + temp_message += " Subject has abnormal brain fuctions." //Astrogen shenanigans if(H.reagents.has_reagent("astral")) if(H.mind) - temp_message += "\tWarning: subject may be possesed." + temp_message += " Warning: subject may be possesed." else - temp_message += "\tSubject appears to be astrally projecting." + temp_message += " Subject appears to be astrally projecting." //LIVER if(istype(O, /obj/item/organ/liver)) var/obj/item/organ/liver/L = O + if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated + msg += "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!" if(L.swelling > 20) - msg += "\tSubject is suffering from an enlarged liver." //i.e. shrink their liver or give them a transplant. + msg += " Subject 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!" + msg += " Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!" if(He.organ_flags & ORGAN_FAILING) heart_ded = TRUE @@ -291,30 +293,32 @@ SLIME SCANNER 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." + msg += " Subject 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." + msg += " Subject 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." + msg += " Subject 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(!damage_message) + if(O.organ_flags & ORGAN_FAILING) + damage_message += " End Stage [uppertext(O.name)] failure detected." + else if(O.damage > O.high_threshold) + damage_message += " Chronic [uppertext(O.name)] failure detected." + else if(O.damage > O.low_threshold && advanced) + damage_message += " Acute [uppertext(O.name)] failure detected." if(temp_message || damage_message) - msg += "[O.name]: [damage_message] [temp_message]\n" + msg += "[uppertext(O.name)]: [damage_message] [temp_message]\n" @@ -418,7 +422,7 @@ SLIME SCANNER if(cyberimp_detect) msg += "Detected cybernetic modifications:\n" msg += "[cyberimp_detect]\n" - msg += "*---------*" + msg += "*---------*" to_chat(user, msg) SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 88176f4f26..01e0001226 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -426,7 +426,7 @@ if(istype(AM)) AM.organ_flags &= ~ORGAN_FROZEN -/obj/machinery/smartfridge/chemistry/preloaded +/obj/machinery/smartfridge/organ/preloaded initial_contents = list( /obj/item/organ/random = 1, /obj/item/reagent_containers/medspray/synthtissue = 1, diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index ad0b7f46fe..73a15b2226 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -235,6 +235,7 @@ if(delta > 0) if(damage >= maxHealth) organ_flags |= ORGAN_FAILING + owner.med_hud_set_status() return now_failing if(damage > high_threshold && prev_damage <= high_threshold) return high_threshold_passed @@ -242,6 +243,7 @@ return low_threshold_passed else organ_flags &= ~ORGAN_FAILING + owner.med_hud_set_status() if(!owner)//Processing is stopped when the organ is dead and outside of someone. This hopefully should restart it if a removed organ is repaired outside of a body. START_PROCESSING(SSobj, src) if(prev_damage > low_threshold && damage <= low_threshold) @@ -368,12 +370,11 @@ /obj/item/organ/random name = "Illegal organ" - desc = "Something fucked up" + desc = "Something hecked up" /obj/item/organ/random/Initialize() ..() - var/list = subtypesof(/obj/item/organ) - list -= /obj/item/organ/random + var/list = (/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) var/newtype = pick(list) new newtype(loc) return INITIALIZE_HINT_QDEL diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 17b5e9fd99514ff6ae39c85e2390e04296d48d7e..5659e0208ff342e29e63face7571a4c5c543c7d2 100644 GIT binary patch delta 14243 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 Q5by_6*Lzg_@a4Pz3)R|&I{*Lx delta 14217 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 From 01f465dc8c7822b3aa5480e8217c24b999e5935a Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 03:52:00 +0000 Subject: [PATCH 05/24] Scanner formatting --- code/game/objects/items/devices/scanners.dm | 20 +++++++++---------- .../reagents/chemistry/reagents/healing.dm | 3 +++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index b98cbc5495..694aedfe13 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -131,25 +131,25 @@ SLIME SCANNER mob_status = "Deceased" oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss - var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n" + var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]" // Damage descriptions if(brute_loss > 10) - msg += "\t[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected.\n" + msg += "\n\t[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected." if(fire_loss > 10) - msg += "\t[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected.\n" + msg += "\n\t[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected." if(oxy_loss > 10) - msg += "\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.\n" + msg += "\n\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected." if(tox_loss > 10) - msg += "\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.\n" + msg += "\n\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected." if(M.getStaminaLoss()) - msg += "\tSubject appears to be suffering from fatigue.\n" + msg += "\n\tSubject appears to be suffering from fatigue." if(advanced) - msg += "\tFatigue Level: [M.getStaminaLoss()]%.\n" + msg += "\n\tFatigue Level: [M.getStaminaLoss()]%." if (M.getCloneLoss()) - msg += "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.\n" + msg += "\n\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage." if(advanced) - msg += "\tCellular Damage Level: [M.getCloneLoss()].\n" + msg += "\n\tCellular Damage Level: [M.getCloneLoss()]." to_chat(user, msg) @@ -178,7 +178,7 @@ SLIME SCANNER dmgreport += "[capitalize(org.name)]:\ [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]\ [(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]" - dmgreport += "\n" + dmgreport += "" to_chat(user, dmgreport.Join()) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 5f89a7e4ed..310403effc 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -120,6 +120,9 @@ if(data["grown_volume"] > 135 && ((C.health + C.oxyloss)>=80)) if(M.revive()) M.emote("gasp") + borrowed_health *= 2 + if(borrowed_health < 100) + borrowed_health = 100 log_combat(M, M, "revived", src) else M.adjustBruteLoss(-healing_factor) From b90213882e4ebc0f926f6bbb2efbde21639738b5 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 03:58:16 +0000 Subject: [PATCH 06/24] Again with the rouge --- code/game/objects/items/devices/scanners.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 694aedfe13..f843f6786e 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -276,16 +276,16 @@ SLIME SCANNER if(istype(O, /obj/item/organ/liver)) var/obj/item/organ/liver/L = O if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated - msg += "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!" + temp_message += "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!" if(L.swelling > 20) - msg += " Subject is suffering from an enlarged liver." //i.e. shrink their liver or give them a transplant. + temp_message += " Subject 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 += " Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!" + temp_message += " Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!" if(He.organ_flags & ORGAN_FAILING) heart_ded = TRUE @@ -293,18 +293,18 @@ SLIME SCANNER if(istype(O, /obj/item/organ/tongue)) var/obj/item/organ/tongue/T = O if(T.name == "fluffy tongue") - msg += " Subject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant." + temp_message += " Subject 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 += " Subject has a sizeable gentleman's organ at [P.length] inches." + temp_message += " Subject 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 += " Subject has a sizeable bosom with a [Br.size] cup." + temp_message += " Subject has a sizeable bosom with a [Br.size] cup." From b911fabb37f4f0da8ae1198a6a4510b320a3df2e Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Thu, 21 Nov 2019 04:25:25 +0000 Subject: [PATCH 07/24] Okay bedtime --- code/game/objects/items/devices/scanners.dm | 16 ++++++---------- code/modules/surgery/organs/organ_internal.dm | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index f843f6786e..33ecfa9e37 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -184,9 +184,9 @@ SLIME SCANNER //Organ damages report var/heart_ded = FALSE - if(ishuman(M)) + if(iscarbon(M)) var/mob/living/carbon/C = M - + var/mob/living/carbon/human/H = M for(var/organ in C.internal_organs) var/temp_message var/damage_message @@ -231,8 +231,6 @@ SLIME SCANNER damage_message += " Severe brain damage detected. Subject likely to have mental traumas." else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 45) damage_message += " Brain damage detected." - else if(!advanced) - damage_message += " Functional Brain detected." if(advanced) temp_message += " Brain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%." @@ -255,7 +253,6 @@ SLIME SCANNER temp_message += " Subject 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 += " Subject is hallucinating." @@ -283,7 +280,6 @@ SLIME SCANNER //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) temp_message += " Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!" if(He.organ_flags & ORGAN_FAILING) @@ -311,14 +307,14 @@ SLIME SCANNER //GENERAL HANDLER if(!damage_message) if(O.organ_flags & ORGAN_FAILING) - damage_message += " End Stage [uppertext(O.name)] failure detected." + damage_message += " End Stage [O.name] failure detected." else if(O.damage > O.high_threshold) - damage_message += " Chronic [uppertext(O.name)] failure detected." + damage_message += " Chronic [O.name] failure detected." else if(O.damage > O.low_threshold && advanced) - damage_message += " Acute [uppertext(O.name)] failure detected." + damage_message += " Acute [O.name] failure detected." if(temp_message || damage_message) - msg += "[uppertext(O.name)]: [damage_message] [temp_message]\n" + msg += "[uppertext(O.name)]: [damage_message] [temp_message]\n" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 73a15b2226..036ef87428 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -374,7 +374,7 @@ /obj/item/organ/random/Initialize() ..() - var/list = (/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) + var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) var/newtype = pick(list) new newtype(loc) return INITIALIZE_HINT_QDEL From 8256a206cf2854e61fb09cd7b12e54beb9a5b566 Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Thu, 21 Nov 2019 13:24:57 +0000 Subject: [PATCH 08/24] Update code/modules/surgery/emergency_cardioversion_recovery.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/modules/surgery/emergency_cardioversion_recovery.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm index 4d3a6ed72c..4f82a0b66d 100644 --- a/code/modules/surgery/emergency_cardioversion_recovery.dm +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -20,7 +20,7 @@ /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) + 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!") From 46076c95c7cf9712c364dc09c08a7890114373a5 Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Thu, 21 Nov 2019 14:22:04 +0000 Subject: [PATCH 09/24] Ghommie is a good friend --- .../kitchen_machinery/smartfridge.dm | 10 ++++- .../chemistry/reagents/medicine_reagents.dm | 5 +-- .../emergency_cardioversion_recovery.dm | 40 +++++++++---------- code/modules/surgery/organs/organ_internal.dm | 7 +++- .../reagents/chemistry/reagents/healing.dm | 12 +++--- 5 files changed, 40 insertions(+), 34 deletions(-) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 01e0001226..9af7235815 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -407,7 +407,8 @@ if(!.) //if the item loads, clear can_decompose return var/obj/item/organ/organ = O - organ.organ_flags |= ORGAN_FROZEN + if(organ) + organ.organ_flags |= ORGAN_FROZEN /obj/machinery/smartfridge/organ/RefreshParts() for(var/obj/item/stock_parts/matter_bin/B in component_parts) @@ -428,10 +429,15 @@ /obj/machinery/smartfridge/organ/preloaded initial_contents = list( - /obj/item/organ/random = 1, /obj/item/reagent_containers/medspray/synthtissue = 1, /obj/item/reagent_containers/medspray/sterilizine = 1) +/obj/machinery/smartfridge/organ/preloaded/Initialize() + ..() + var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) + var/newtype = pick(list) + load(new newtype) + // ----------------------------- // Chemistry Medical Smartfridge // ----------------------------- diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d864616b9f..0bf1339bad 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -941,10 +941,9 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#EEFF8F" /datum/reagent/neurine/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - var/mob/living/carbon/C = M - if(!C) + var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) + if(!B) return - var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) if(method == INJECT) if(B.organ_flags & ORGAN_FAILING) B.applyOrganDamage(-20) diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm index 4f82a0b66d..fd14c2ea8f 100644 --- a/code/modules/surgery/emergency_cardioversion_recovery.dm +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -18,6 +18,7 @@ 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) + var/mob/living/carbon/human/H = target playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) playsound(src, "bodyfall", 50, 1) if(H.stat != DEAD) @@ -29,32 +30,29 @@ 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) + 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!.", + "") + if (!(NOBLOOD in H.dna.species.species_traits)) + 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) + 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) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 036ef87428..55f81504d9 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -98,13 +98,16 @@ //Checks to see if the organ is frozen from temperature /obj/item/organ/proc/is_cold() - var/freezing_objects = list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon) + var/freezing_objects = list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon, /obj/machinery/smartfridge/organ) if(istype(loc, /obj/))//Freezer of some kind, I hope. if(is_type_in_list(loc, freezing_objects)) if(!(organ_flags & ORGAN_FROZEN))//Incase someone puts them in when cold, but they warm up inside of the thing. (i.e. they have the flag, the thing turns it off, this rights it.) organ_flags |= ORGAN_FROZEN return TRUE - return + var/external_check = FALSE + if(organ_flags & ORGAN_FROZEN) + external_check = TRUE + return external_check var/local_temp if(istype(loc, /turf/))//Only concern is adding an organ to a freezer when the area around it is cold. diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 310403effc..8ac5e1a192 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -172,18 +172,18 @@ update_name() ..() -/datum/reagent/synthtissue/proc/update_name() +/datum/reagent/synthtissue/proc/update_name() //They are but babes on creation and have to grow unto godhood switch(data["grown_volume"]) if(-INFINITY to 50) - name = "Young Synthtissue Colony" + name = "Induced Synthtissue Colony" if(50 to 80) - name = "Adolescent Synthtissue Colony" + name = "Oligopotent Synthtissue Colony" if(80 to 135) - name = "Adult Synthtissue Colony" + name = "Pluripotent Synthtissue Colony" if(135 to 175) - name = "Master Synthtissue Colony" + name = "SuperSomatic Synthtissue Colony" if(175 to INFINITY) - name = "Apex Synthtissue Colony" + name = "Omnipotent Synthtissue Colony" /datum/reagent/synthtissue/on_mob_delete(mob/living/M) if(!iscarbon(M)) From 00bffba7ea1cf6855eb3a905dec1581f2cbcbe0d Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Thu, 21 Nov 2019 15:57:21 +0000 Subject: [PATCH 10/24] Why do surgeries always end up with jank --- code/game/objects/items/defib.dm | 2 - .../kitchen_machinery/smartfridge.dm | 6 +- .../emergency_cardioversion_recovery.dm | 52 ++++++++++-------- code/modules/surgery/organs/heart.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 6 +- icons/mob/hud.dmi | Bin 16277 -> 16325 bytes tgstation.dme | 1 + 7 files changed, 37 insertions(+), 32 deletions(-) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index f5799e1a22..ee85005c61 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -762,5 +762,3 @@ desc = "An upgrade to the defibrillator capacitors, which let it charge faster" icon_state = "fast_disk" materials = list(MAT_METAL=16000, MAT_GLASS = 8000, MAT_GOLD = 26000, MAT_SILVER = 26000) - -#undef HALFWAYCRITDEATH diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 9af7235815..893a53ede7 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -406,8 +406,8 @@ . = ..() if(!.) //if the item loads, clear can_decompose return - var/obj/item/organ/organ = O - if(organ) + if(istype(O, /obj/item/organ)) + var/obj/item/organ/organ = O organ.organ_flags |= ORGAN_FROZEN /obj/machinery/smartfridge/organ/RefreshParts() @@ -436,7 +436,7 @@ ..() var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) var/newtype = pick(list) - load(new newtype) + load(new newtype(src.loc)) // ----------------------------- // Chemistry Medical Smartfridge diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm index fd14c2ea8f..f0540e78c0 100644 --- a/code/modules/surgery/emergency_cardioversion_recovery.dm +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -10,14 +10,14 @@ 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...", +/datum/surgery_step/ventricular_electrotherapy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You begin to apply an electrical charge directly to the heart 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!") + target.notify_ghost_cloning("Your heart is undergoing Emergency Cardioversion Induction Surgery!") 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) +/datum/surgery_step/ventricular_electrotherapy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/mob/living/carbon/human/H = target playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) playsound(src, "bodyfall", 50, 1) @@ -25,51 +25,56 @@ 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("scream") + H.electrocute_act(25, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.adjustFireLoss(10) H.emote("flip") H.Jitter(100) return FALSE - 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!.", + display_results(user, target, "You induce a stable cardio in [H]'s heart.", + "[H]'s heart is shocked, attemping to bring them back to a stable rhythm!", "") - if (!(NOBLOOD in H.dna.species.species_traits)) - H.bleed_rate += 10 H.adjustBruteLoss(10) - H.adjustOrganLoss(ORGAN_SLOT_HEART, -10) + H.adjustOrganLoss(ORGAN_SLOT_HEART, -15) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) - H.electrocute_act(0, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(0, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + if(istype(tool, /obj/item/twohanded/shockpaddles)) + display_results(user, target, "You move the paddles to the restart position.", + "[user] moves the paddles to the restart position...", + "") + return TRUE if(!do_they_live(H)) playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) + log_combat(user, H, "revived", "Emergency Cardioversion Induction") return TRUE -/datum/surgery_step/incise_heart/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/datum/surgery_step/ventricular_electrotherapy/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) var/mob/living/carbon/human/H = target - display_results(user, target, "You screw up, sending current racing though their body!", + display_results(user, target, "You screw up, sending a current through 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.electrocute_act(25, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.adjustFireLoss(5) H.emote("flip") H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) -/datum/surgery_step/incise_heart/do_they_live(mob/living/carbon/human/H) +/datum/surgery_step/ventricular_electrotherapy/proc/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/total_brute = H.getBruteLoss() + var/total_burn = H.getFireLoss() var/failed - var/tdelta = round(world.time - timeofdeath) + var/tdelta = round(world.time - H.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)) + else if(world.time < (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." @@ -93,7 +98,7 @@ if(failed) - user.visible_message(failed) + H.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 @@ -107,11 +112,10 @@ 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.") + H.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/organs/heart.dm b/code/modules/surgery/organs/heart.dm index a9830f36df..963c7ac6f9 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -6,7 +6,7 @@ slot = ORGAN_SLOT_HEART healing_factor = STANDARD_ORGAN_HEALING - decay_factor = 3 * STANDARD_ORGAN_DECAY //designed to fail about 5 minutes after death + decay_factor = 2.5 * STANDARD_ORGAN_DECAY //designed to fail about 5 minutes after death low_threshold_passed = "Prickles of pain appear then die out from within your chest..." high_threshold_passed = "Something inside your chest hurts, and the pain isn't subsiding. You notice yourself breathing far faster than before." diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 55f81504d9..45cbda9898 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -238,7 +238,8 @@ if(delta > 0) if(damage >= maxHealth) organ_flags |= ORGAN_FAILING - owner.med_hud_set_status() + if(owner) + owner.med_hud_set_status() return now_failing if(damage > high_threshold && prev_damage <= high_threshold) return high_threshold_passed @@ -246,7 +247,8 @@ return low_threshold_passed else organ_flags &= ~ORGAN_FAILING - owner.med_hud_set_status() + if(owner) + owner.med_hud_set_status() if(!owner)//Processing is stopped when the organ is dead and outside of someone. This hopefully should restart it if a removed organ is repaired outside of a body. START_PROCESSING(SSobj, src) if(prev_damage > low_threshold && damage <= low_threshold) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 5659e0208ff342e29e63face7571a4c5c543c7d2..d2b67f4314665ff948ad26bf0e63bb961c405788 100644 GIT binary patch delta 14206 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 delta 14166 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 Date: Thu, 21 Nov 2019 18:55:43 +0000 Subject: [PATCH 11/24] This should be the one! --- code/game/objects/items/devices/scanners.dm | 2 +- code/modules/surgery/advanced/revival.dm | 3 + .../emergency_cardioversion_recovery.dm | 78 ++++++++++--------- code/modules/surgery/organs/organ_internal.dm | 7 ++ 4 files changed, 52 insertions(+), 38 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 33ecfa9e37..c07c52b075 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -314,7 +314,7 @@ SLIME SCANNER damage_message += " Acute [O.name] failure detected." if(temp_message || damage_message) - msg += "[uppertext(O.name)]: [damage_message] [temp_message]\n" + msg += "[uppertext(O.name)]: [damage_message] [temp_message]\n" diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index a2d5345ea4..fbfec404b2 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -65,6 +65,9 @@ target.visible_message("...[target] wakes up, alive and aware!") target.emote("gasp") target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) //MAD SCIENCE + for(var/obj/item/organ/O in target.internal_organs)//zap those buggers back to life! + if(O.organ_flags & ORGAN_FAILING) + O.applyOrganDamage(-5) return TRUE else user.visible_message("...[target.p_they()] convulses, then lies still.") diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm index f0540e78c0..284722d271 100644 --- a/code/modules/surgery/emergency_cardioversion_recovery.dm +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -11,13 +11,22 @@ repeatable = TRUE //So you can retry /datum/surgery_step/ventricular_electrotherapy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, "You begin to apply an electrical charge directly to the heart body...", - "[user] begins to make an incision in [target]'s heart.", - "[user] begins to make an incision in [target]'s heart.") + if(istype(tool, /obj/item/twohanded/shockpaddles)) + var/obj/item/twohanded/shockpaddles/pads = tool + if(!pads.wielded) + to_chat(user, "You need to wield the paddles in both hands before you can use them!") + return FALSE + display_results(user, target, "You begin to apply the [tool] onto the heart directly...", + "[user] begin to prepare the heart for contact with the [tool].", + "[user] begin to prepare the heart for contact with the [tool]. ") target.notify_ghost_cloning("Your heart is undergoing Emergency Cardioversion Induction Surgery!") playsound(src, 'sound/machines/defib_charge.ogg', 75, 0) /datum/surgery_step/ventricular_electrotherapy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool, /obj/item/twohanded/shockpaddles)) + var/obj/item/twohanded/shockpaddles/pads = tool + if(!pads.wielded) + return FALSE var/mob/living/carbon/human/H = target playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) playsound(src, "bodyfall", 50, 1) @@ -26,25 +35,31 @@ "[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.emote("scream") - H.electrocute_act(25, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(25, (tool), 1, FALSE, FALSE, FALSE, TRUE) H.adjustFireLoss(10) H.emote("flip") H.Jitter(100) return FALSE - display_results(user, target, "You induce a stable cardio in [H]'s heart.", - "[H]'s heart is shocked, attemping to bring them back to a stable rhythm!", + display_results(user, target, "You attach the [tool] to [target]'s heart and prepare to pulse.", + "[user] attaches the [tool] to [H]'s heart and prepares to pulse.", "") H.adjustBruteLoss(10) - H.adjustOrganLoss(ORGAN_SLOT_HEART, -15) - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) - H.electrocute_act(0, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) + if(heart.organ_flags & ORGAN_FAILING) + H.adjustOrganLoss(ORGAN_SLOT_HEART, -15) + var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) + if(BR.organ_flags & ORGAN_FAILING) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + H.electrocute_act(0, (tool), 1, FALSE, FALSE, FALSE, TRUE) + //If we're using a defib, let the defib handle the revive. if(istype(tool, /obj/item/twohanded/shockpaddles)) - display_results(user, target, "You move the paddles to the restart position.", - "[user] moves the paddles to the restart position...", - "") - return TRUE - if(!do_they_live(H)) + return + //Otherwise, we're ad hocing it + if(!(do_after(user, 50, target = target))) + return FALSE + if(!ghetto_defib(user, H, tool)) playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) + return FALSE log_combat(user, H, "revived", "Emergency Cardioversion Induction") return TRUE @@ -55,50 +70,39 @@ display_results(user, target, "You screw up, sending a current through 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(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(25, (tool), 1, FALSE, FALSE, FALSE, TRUE) H.adjustFireLoss(5) H.emote("flip") H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) -/datum/surgery_step/ventricular_electrotherapy/proc/do_they_live(mob/living/carbon/human/H) - - var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) +/datum/surgery_step/ventricular_electrotherapy/proc/ghetto_defib(mob/user, mob/living/carbon/human/H, obj/item/tool) H.visible_message("[H]'s body convulses a bit.") var/total_brute = H.getBruteLoss() var/total_burn = H.getFireLoss() var/failed var/tdelta = round(world.time - H.timeofdeath) - if (H.suiciding || (HAS_TRAIT(H, TRAIT_NOCLONE))) - failed = "The [src] equipment buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile." + failed = "The heart is zapped by the [tool], but nothing happens. You feel like the spark of life has fully left [H]." 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(world.time < (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." + failed = "The heart is zapped by the [tool], but nothing happens. You notice a small tatoo with the words \"Property of Satan\" branded just above the right ventricle." + else if(tdelta > (DEFIB_TIME_LIMIT * 10)) + failed = "The heart is zapped by the [tool], but nothing happens. It appears their body has become too decomposed." 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." + failed = "The [tool] zaps the heart, inducing a sudden contraction, but it appears [H]'s body is too damaged to revive presently." else if(H.get_ghost()) - failed = "The [src] equipment buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." + failed = "The [tool] zaps the heart, inducing several contractions before dying down, but there's no spark of life in [H]'s eyes. It may be worth it to try again, however." 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." + failed = "The heart is zapped by the [tool], but nothing happens. You feel like the spark of life has fully left [H]." else - failed = "The [src] equipment buzzes: Resuscitation failed - Patient's brain is missing. Further attempts futile." + failed = "The [tool] zaps the heart, restarting the heart, but without a brain the contractions quickly die out." if(failed) - H.visible_message(failed) + to_chat(user, 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 @@ -112,7 +116,7 @@ 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. - H.visible_message("The [src] equipment pings: Resuscitation successful.") + H.visible_message("The [tool] zaps the heart, inducing several contractions before speeding up into a regular rhythm, [H]'s eyes snapping open with a loud gasp!") playsound(src, 'sound/machines/defib_success.ogg', 50, 0) H.set_heartattack(FALSE) H.revive() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 45cbda9898..ddd7378008 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -283,6 +283,12 @@ var/has_liver = (!(NOLIVER in dna.species.species_traits)) var/has_stomach = (!(NOSTOMACH in dna.species.species_traits)) + for(var/obj/item/organ/O in internal_organs) + if(O.organ_flags & ORGAN_FAILING) + O.setOrganDamage(0) + if(only_one) + return TRUE + if(has_liver && !getorganslot(ORGAN_SLOT_LIVER)) var/obj/item/organ/liver/LI @@ -373,6 +379,7 @@ if(only_one) return TRUE + /obj/item/organ/random name = "Illegal organ" desc = "Something hecked up" From da1da717d295e16ddbbd2480c208adb8951668f5 Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:03:48 +0000 Subject: [PATCH 12/24] Update code/game/objects/items/devices/scanners.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/game/objects/items/devices/scanners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c07c52b075..70359cd160 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -209,7 +209,7 @@ SLIME SCANNER //EARS - if(istype(O, /obj/item/organ/ears)) + else 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)) From a0a52018f39ceb0d3d0b90f874003f3bba1e51af Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:06:34 +0000 Subject: [PATCH 13/24] Apply suggestions from code review Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/game/objects/items/devices/scanners.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 70359cd160..8cb2f51e9c 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -224,7 +224,7 @@ SLIME SCANNER //BRAIN - if(istype(O, /obj/item/organ/brain)) + else if(istype(O, /obj/item/organ/brain)) if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 200) damage_message += " Subject's brain function is non-existent. Neurine injection recomended." else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 120) @@ -270,7 +270,7 @@ SLIME SCANNER //LIVER - if(istype(O, /obj/item/organ/liver)) + else if(istype(O, /obj/item/organ/liver)) var/obj/item/organ/liver/L = O if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated temp_message += "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!" @@ -278,7 +278,7 @@ SLIME SCANNER temp_message += " Subject 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))) + else if(ishuman(M) && (istype(O, /obj/item/organ/heart))) var/obj/item/organ/heart/He = O if(H.undergoing_cardiac_arrest() && H.stat != DEAD) temp_message += " Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!" @@ -286,18 +286,18 @@ SLIME SCANNER heart_ded = TRUE //TONGUE - if(istype(O, /obj/item/organ/tongue)) + else if(istype(O, /obj/item/organ/tongue)) var/obj/item/organ/tongue/T = O if(T.name == "fluffy tongue") temp_message += " Subject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant." //HECK - if(istype(O, /obj/item/organ/genital/penis)) + else if(istype(O, /obj/item/organ/genital/penis)) var/obj/item/organ/genital/penis/P = O if(P.length>20) temp_message += " Subject has a sizeable gentleman's organ at [P.length] inches." - if(istype(O, /obj/item/organ/genital/breasts)) + else if(istype(O, /obj/item/organ/genital/breasts)) var/obj/item/organ/genital/breasts/Br = O if(Br.cached_size>5) temp_message += " Subject has a sizeable bosom with a [Br.size] cup." From 0cce3a01f4724a87aec71bfe260ad74d3d044362 Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:39:55 +0000 Subject: [PATCH 14/24] Ghommie's requiem --- code/_globalvars/lists/objects.dm | 2 ++ code/game/objects/items/devices/scanners.dm | 30 +++++++++++------ .../chemistry/reagents/medicine_reagents.dm | 22 ++++++------- .../emergency_cardioversion_recovery.dm | 32 ++++++++----------- code/modules/surgery/organs/organ_internal.dm | 12 +++---- 5 files changed, 52 insertions(+), 46 deletions(-) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 14c752613b..6fa9fa0daf 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -32,6 +32,8 @@ GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers GLOBAL_LIST_EMPTY(ladders) GLOBAL_LIST_EMPTY(trophy_cases) +GLOBAL_LIST_INIT(freezing_objects, list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon, /obj/machinery/smartfridge/organ)) //list of all cold objects, that freeze organs when inside + GLOBAL_LIST_EMPTY(wire_color_directory) GLOBAL_LIST_EMPTY(wire_name_directory) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c07c52b075..19a82ab818 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -319,18 +319,30 @@ SLIME SCANNER //END; LOOK FOR MISSING ORGANS? - if(!M.getorgan(/obj/item/organ/eyes)) + var/breathes = TRUE + var/blooded = TRUE + if(C.dna && C.dna.species) + if(HAS_TRAIT_FROM(C, TRAIT_NOBREATH, SPECIES_TRAIT)) + breathes = FALSE + if(NOBLOOD in C.dna.species.species_traits) + blooded = FALSE + var/has_liver = (!(NOLIVER in C.dna.species.species_traits)) + var/has_stomach = (!(NOSTOMACH in C.dna.species.species_traits)) + if(!M.getorganslot(ORGAN_SLOT_EYES)) msg += "\tSubject does not have eyes.\n" - if(!M.getorgan(/obj/item/organ/ears)) + if(!M.getorganslot(ORGAN_SLOT_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)) + if(!M.getorganslot(ORGAN_SLOT_BRAIN)) + msg += "\tSubject's brain function is non-existent!\n" + if(has_liver && !M.getorganslot(ORGAN_SLOT_LIVER)) + msg += "\tSubject's liver is missing!/span>\n" + if(blooded && !M.getorganslot(ORGAN_SLOT_HEART)) msg += "\tSubject's heart is missing!\n" + if(breathes && !M.getorganslot(ORGAN_SLOT_LUNGS)) + msg += "\tSubject's lungs have collapsed from trauma!\n" + if(has_stomach && !M.getorganslot(ORGAN_SLOT_STOMACH)) + msg += "\tSubject's stomach is missing!\n" + if(M.radiation) msg += "\tSubject is irradiated.\n" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 0bf1339bad..e380d96921 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -941,18 +941,18 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#EEFF8F" /datum/reagent/neurine/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) - if(!B) + if(method != INJECT) return - 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) + var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) + if(!B || !(B.organ_flags & ORGAN_FAILING)) + return + 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")) diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm index 284722d271..ae451fbbd1 100644 --- a/code/modules/surgery/emergency_cardioversion_recovery.dm +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -16,17 +16,13 @@ if(!pads.wielded) to_chat(user, "You need to wield the paddles in both hands before you can use them!") return FALSE - display_results(user, target, "You begin to apply the [tool] onto the heart directly...", - "[user] begin to prepare the heart for contact with the [tool].", - "[user] begin to prepare the heart for contact with the [tool]. ") + display_results(user, target, "You begin to apply an electrical charge directly to the heart 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 Surgery!") playsound(src, 'sound/machines/defib_charge.ogg', 75, 0) /datum/surgery_step/ventricular_electrotherapy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(istype(tool, /obj/item/twohanded/shockpaddles)) - var/obj/item/twohanded/shockpaddles/pads = tool - if(!pads.wielded) - return FALSE var/mob/living/carbon/human/H = target playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) playsound(src, "bodyfall", 50, 1) @@ -35,12 +31,12 @@ "[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.emote("scream") - H.electrocute_act(25, (tool), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(25, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) H.adjustFireLoss(10) H.emote("flip") H.Jitter(100) return FALSE - display_results(user, target, "You attach the [tool] to [target]'s heart and prepare to pulse.", + display_results(user, target, "You attach the [tool] to [target]'s heart and prepares to pulse.", "[user] attaches the [tool] to [H]'s heart and prepares to pulse.", "") H.adjustBruteLoss(10) @@ -50,10 +46,10 @@ var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) if(BR.organ_flags & ORGAN_FAILING) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) - H.electrocute_act(0, (tool), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(0, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) //If we're using a defib, let the defib handle the revive. if(istype(tool, /obj/item/twohanded/shockpaddles)) - return + return TRUE //Otherwise, we're ad hocing it if(!(do_after(user, 50, target = target))) return FALSE @@ -70,8 +66,8 @@ display_results(user, target, "You screw up, sending a current through 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, (tool), 1, FALSE, FALSE, FALSE, TRUE) - H.adjustFireLoss(5) + H.electrocute_act(25, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.adjustFireLoss(10) H.emote("flip") H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) @@ -87,18 +83,18 @@ else if (H.hellbound) failed = "The heart is zapped by the [tool], but nothing happens. You notice a small tatoo with the words \"Property of Satan\" branded just above the right ventricle." else if(tdelta > (DEFIB_TIME_LIMIT * 10)) - failed = "The heart is zapped by the [tool], but nothing happens. It appears their body has become too decomposed." + failed = "The heart is zapped by the [tool], but nothing happens. It appears their body has beomce too decomposed." else if(total_burn >= 180 || total_brute >= 180) - failed = "The [tool] zaps the heart, inducing a sudden contraction, but it appears [H]'s body is too damaged to revive presently." + failed = "The [tool] zaps the heart, incuding a sudden contraction, but it appears [H]'s body is too damaged to revive presently." else if(H.get_ghost()) - failed = "The [tool] zaps the heart, inducing several contractions before dying down, but there's no spark of life in [H]'s eyes. It may be worth it to try again, however." + failed = "The [tool] zaps the heart, incuding several contractions before dying down, but there's no spark of life in [H]'s eyes. It may be worth it to try again, however." else var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) if(BR) if(H.suiciding || BR.brainmob?.suiciding) failed = "The heart is zapped by the [tool], but nothing happens. You feel like the spark of life has fully left [H]." else - failed = "The [tool] zaps the heart, restarting the heart, but without a brain the contractions quickly die out." + failed = "The [tool] zaps the heart, incuding several contractions before dying down, but without a brain the contractions quickly die out." if(failed) @@ -116,7 +112,7 @@ 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. - H.visible_message("The [tool] zaps the heart, inducing several contractions before speeding up into a regular rhythm, [H]'s eyes snapping open with a loud gasp!") + H.visible_message("The [tool] zaps the heart, incuding several contractions before speeding up into a regular rhythm, [H]'s eyes snapping open with a loud gasp!") playsound(src, 'sound/machines/defib_success.ogg', 50, 0) H.set_heartattack(FALSE) H.revive() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index ddd7378008..c44a2cae4d 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -98,16 +98,12 @@ //Checks to see if the organ is frozen from temperature /obj/item/organ/proc/is_cold() - var/freezing_objects = list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon, /obj/machinery/smartfridge/organ) if(istype(loc, /obj/))//Freezer of some kind, I hope. - if(is_type_in_list(loc, freezing_objects)) + if(is_type_in_list(loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN))//Incase someone puts them in when cold, but they warm up inside of the thing. (i.e. they have the flag, the thing turns it off, this rights it.) organ_flags |= ORGAN_FROZEN return TRUE - var/external_check = FALSE - if(organ_flags & ORGAN_FROZEN) - external_check = TRUE - return external_check + return (organ_flags & ORGAN_FROZEN) //Incase something else toggles it var/local_temp if(istype(loc, /turf/))//Only concern is adding an organ to a freezer when the area around it is cold. @@ -117,7 +113,7 @@ else if(istype(loc, /mob/) && !owner) var/mob/M = loc - if(is_type_in_list(M.loc, freezing_objects)) + if(is_type_in_list(M.loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN)) organ_flags |= ORGAN_FROZEN return TRUE @@ -127,7 +123,7 @@ if(owner) //Don't interfere with bodies frozen by structures. - if(is_type_in_list(owner.loc, freezing_objects)) + if(is_type_in_list(owner.loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN)) organ_flags |= ORGAN_FROZEN return TRUE From db74091dd4822fe83f6bf886552a283dbde15b97 Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:47:00 +0000 Subject: [PATCH 15/24] Strange revert --- .../emergency_cardioversion_recovery.dm | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm index ae451fbbd1..25f499fa76 100644 --- a/code/modules/surgery/emergency_cardioversion_recovery.dm +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -16,13 +16,17 @@ if(!pads.wielded) to_chat(user, "You need to wield the paddles in both hands before you can use them!") return FALSE - display_results(user, target, "You begin to apply an electrical charge directly to the heart body...", - "[user] begins to make an incision in [target]'s heart.", - "[user] begins to make an incision in [target]'s heart.") + display_results(user, target, "You begin to apply the [tool] onto the heart directly...", + "[user] begin to prepare the heart for contact with the [tool].", + "[user] begin to prepare the heart for contact with the [tool]. ") target.notify_ghost_cloning("Your heart is undergoing Emergency Cardioversion Induction Surgery!") playsound(src, 'sound/machines/defib_charge.ogg', 75, 0) /datum/surgery_step/ventricular_electrotherapy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool, /obj/item/twohanded/shockpaddles)) + var/obj/item/twohanded/shockpaddles/pads = tool + if(!pads.wielded) + return FALSE var/mob/living/carbon/human/H = target playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) playsound(src, "bodyfall", 50, 1) @@ -31,12 +35,12 @@ "[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.emote("scream") - H.electrocute_act(25, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(25, (tool), 1, FALSE, FALSE, FALSE, TRUE) H.adjustFireLoss(10) H.emote("flip") H.Jitter(100) return FALSE - display_results(user, target, "You attach the [tool] to [target]'s heart and prepares to pulse.", + display_results(user, target, "You attach the [tool] to [target]'s heart and prepare to pulse.", "[user] attaches the [tool] to [H]'s heart and prepares to pulse.", "") H.adjustBruteLoss(10) @@ -46,10 +50,10 @@ var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) if(BR.organ_flags & ORGAN_FAILING) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) - H.electrocute_act(0, (get_turf(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(0, (tool), 1, FALSE, FALSE, FALSE, TRUE) //If we're using a defib, let the defib handle the revive. if(istype(tool, /obj/item/twohanded/shockpaddles)) - return TRUE + return //Otherwise, we're ad hocing it if(!(do_after(user, 50, target = target))) return FALSE @@ -66,7 +70,7 @@ display_results(user, target, "You screw up, sending a current through 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(H)), 1, FALSE, FALSE, FALSE, TRUE) + H.electrocute_act(25, (tool), 1, FALSE, FALSE, FALSE, TRUE) H.adjustFireLoss(10) H.emote("flip") H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) @@ -83,18 +87,18 @@ else if (H.hellbound) failed = "The heart is zapped by the [tool], but nothing happens. You notice a small tatoo with the words \"Property of Satan\" branded just above the right ventricle." else if(tdelta > (DEFIB_TIME_LIMIT * 10)) - failed = "The heart is zapped by the [tool], but nothing happens. It appears their body has beomce too decomposed." + failed = "The heart is zapped by the [tool], but nothing happens. It appears their body decomposed beyond repair." else if(total_burn >= 180 || total_brute >= 180) - failed = "The [tool] zaps the heart, incuding a sudden contraction, but it appears [H]'s body is too damaged to revive presently." + failed = "The [tool] zaps the heart, inducing a sudden contraction, but it appears [H]'s body is too damaged to revive presently." else if(H.get_ghost()) - failed = "The [tool] zaps the heart, incuding several contractions before dying down, but there's no spark of life in [H]'s eyes. It may be worth it to try again, however." + failed = "The [tool] zaps the heart, inducing several contractions before dying down, but there's no spark of life in [H]'s eyes. It may be worth it to try again, however." else var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) if(BR) if(H.suiciding || BR.brainmob?.suiciding) failed = "The heart is zapped by the [tool], but nothing happens. You feel like the spark of life has fully left [H]." else - failed = "The [tool] zaps the heart, incuding several contractions before dying down, but without a brain the contractions quickly die out." + failed = "The [tool] zaps the heart, restarting the heart, but without a brain the contractions quickly die out." if(failed) @@ -112,7 +116,7 @@ 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. - H.visible_message("The [tool] zaps the heart, incuding several contractions before speeding up into a regular rhythm, [H]'s eyes snapping open with a loud gasp!") + H.visible_message("The [tool] zaps the heart, inducing several contractions before speeding up into a regular rhythm, [H]'s eyes snapping open with a loud gasp!") playsound(src, 'sound/machines/defib_success.ogg', 50, 0) H.set_heartattack(FALSE) H.revive() From 7b17bf2acdc7ade5a182fcbce1d5083c2ef77822 Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Thu, 21 Nov 2019 20:30:49 +0000 Subject: [PATCH 16/24] god damn bitflags ARGH --- code/game/objects/items/devices/scanners.dm | 18 +++++++++--------- .../chemistry/reagents/medicine_reagents.dm | 7 ++++--- .../reagents/chemistry/reagents/healing.dm | 1 + 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e6636ad92c..ed2ee333ab 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -226,7 +226,7 @@ SLIME SCANNER //BRAIN else if(istype(O, /obj/item/organ/brain)) if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 200) - damage_message += " Subject's brain function is non-existent. Neurine injection recomended." + damage_message += " Subject's brain non-functional. Neurine injection recomended." else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 120) damage_message += " Severe brain damage detected. Subject likely to have mental traumas." else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 45) @@ -314,7 +314,7 @@ SLIME SCANNER damage_message += " Acute [O.name] failure detected." if(temp_message || damage_message) - msg += "[uppertext(O.name)]: [damage_message] [temp_message]\n" + msg += "\t[uppertext(O.name)]: [damage_message] [temp_message]\n" @@ -329,19 +329,19 @@ SLIME SCANNER var/has_liver = (!(NOLIVER in C.dna.species.species_traits)) var/has_stomach = (!(NOSTOMACH in C.dna.species.species_traits)) if(!M.getorganslot(ORGAN_SLOT_EYES)) - msg += "\tSubject does not have eyes.\n" + msg += "\tSubject does not have eyes.\n" if(!M.getorganslot(ORGAN_SLOT_EARS)) - msg += "\tSubject does not have ears.\n" + msg += "\tSubject does not have ears.\n" if(!M.getorganslot(ORGAN_SLOT_BRAIN)) - msg += "\tSubject's brain function is non-existent!\n" + msg += "\tSubject's brain function is non-existent!\n" if(has_liver && !M.getorganslot(ORGAN_SLOT_LIVER)) - msg += "\tSubject's liver is missing!/span>\n" + msg += "\tSubject's liver is missing!\n" if(blooded && !M.getorganslot(ORGAN_SLOT_HEART)) - msg += "\tSubject's heart is missing!\n" + msg += "\tSubject's heart is missing!\n" if(breathes && !M.getorganslot(ORGAN_SLOT_LUNGS)) - msg += "\tSubject's lungs have collapsed from trauma!\n" + msg += "\tSubject's lungs have collapsed from trauma!\n" if(has_stomach && !M.getorganslot(ORGAN_SLOT_STOMACH)) - msg += "\tSubject's stomach is missing!\n" + msg += "\tSubject's stomach is missing!\n" if(M.radiation) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index e380d96921..de3e46355c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -940,11 +940,11 @@ 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) - if(method != INJECT) +/datum/reagent/medicine/neurine/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(!(method == INJECT)) return var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) - if(!B || !(B.organ_flags & ORGAN_FAILING)) + if(!B || (B.organ_flags & ORGAN_FAILING)) return B.applyOrganDamage(-20) if(prob(80)) @@ -953,6 +953,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) B.gain_trauma_type(BRAIN_TRAUMA_SEVERE) else B.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + message_admins("Trauma'd") /datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) if(holder.has_reagent("neurotoxin")) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 8ac5e1a192..363ee58649 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -103,6 +103,7 @@ metabolization_rate = 0.05 //Give them time to graft data = list("grown_volume" = 0, "injected_vol" = 0) var/borrowed_health + color = "#FFDADA" /datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) From 9af48caa62f63fd9fd38bfa8b564f28dcf2cdea3 Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Thu, 21 Nov 2019 20:46:00 +0000 Subject: [PATCH 17/24] OKAY DONE ARGH --- code/modules/reagents/chemistry/reagents/medicine_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index de3e46355c..73a72a3f09 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -944,7 +944,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) if(!(method == INJECT)) return var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) - if(!B || (B.organ_flags & ORGAN_FAILING)) + if(!B || (!(B.organ_flags & ORGAN_FAILING))) return B.applyOrganDamage(-20) if(prob(80)) @@ -953,7 +953,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) B.gain_trauma_type(BRAIN_TRAUMA_SEVERE) else B.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) - message_admins("Trauma'd") + /datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) if(holder.has_reagent("neurotoxin")) From 7bbc90d74790257ce1d92c8a2d715ecbd91615af Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Fri, 22 Nov 2019 23:56:05 +0000 Subject: [PATCH 18/24] makes the freezing list a typecache --- code/_globalvars/lists/objects.dm | 2 -- code/_globalvars/lists/typecache.dm | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 6fa9fa0daf..14c752613b 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -32,8 +32,6 @@ GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers GLOBAL_LIST_EMPTY(ladders) GLOBAL_LIST_EMPTY(trophy_cases) -GLOBAL_LIST_INIT(freezing_objects, list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon, /obj/machinery/smartfridge/organ)) //list of all cold objects, that freeze organs when inside - GLOBAL_LIST_EMPTY(wire_color_directory) GLOBAL_LIST_EMPTY(wire_name_directory) diff --git a/code/_globalvars/lists/typecache.dm b/code/_globalvars/lists/typecache.dm index 96807214f2..1ec3de0bc5 100644 --- a/code/_globalvars/lists/typecache.dm +++ b/code/_globalvars/lists/typecache.dm @@ -10,3 +10,5 @@ GLOBAL_LIST_INIT(typecache_living, typecacheof(/mob/living)) GLOBAL_LIST_INIT(typecache_stack, typecacheof(/obj/item/stack)) GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list(/obj/machinery, /obj/structure))) + +GLOBAL_LIST_INIT(freezing_objects, typecacheof(list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon, /obj/machinery/smartfridge/organ))) //list of all cold objects, that freeze organs when inside From 399986f3f7f66c728387cd6dae90b9e1a5e4ea1a Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Fri, 22 Nov 2019 23:57:09 +0000 Subject: [PATCH 19/24] Forgot to update the procs --- code/modules/surgery/organs/organ_internal.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index c44a2cae4d..6ff752705c 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -99,7 +99,7 @@ //Checks to see if the organ is frozen from temperature /obj/item/organ/proc/is_cold() if(istype(loc, /obj/))//Freezer of some kind, I hope. - if(is_type_in_list(loc, GLOB.freezing_objects)) + if(is_type_in_typecache(loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN))//Incase someone puts them in when cold, but they warm up inside of the thing. (i.e. they have the flag, the thing turns it off, this rights it.) organ_flags |= ORGAN_FROZEN return TRUE @@ -113,7 +113,7 @@ else if(istype(loc, /mob/) && !owner) var/mob/M = loc - if(is_type_in_list(M.loc, GLOB.freezing_objects)) + if(is_type_in_typecache(M.loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN)) organ_flags |= ORGAN_FROZEN return TRUE @@ -123,7 +123,7 @@ if(owner) //Don't interfere with bodies frozen by structures. - if(is_type_in_list(owner.loc, GLOB.freezing_objects)) + if(is_type_in_typecache(owner.loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN)) organ_flags |= ORGAN_FROZEN return TRUE From 79a64d9c6340b00fdd4be3d661949e706f907df7 Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Mon, 25 Nov 2019 03:36:39 +0000 Subject: [PATCH 20/24] Makes synthtissue a lil easier. --- code/modules/reagents/chemistry/recipes/medicine.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 374f7715bb..607e0b5a4e 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -73,7 +73,7 @@ id = "synthtissue" results = list("synthtissue" = 5) required_reagents = list("synthflesh" = 1) - required_catalysts = list("nutriment" = 0.1) + required_catalysts = list("sugar" = 0.1) //FermiChem vars: OptimalTempMin = 305 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 315 // Upper end for above @@ -86,13 +86,13 @@ CurveSharppH = 2.5 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 0.01 // Temperature change per 1u produced HIonRelease = 0.015 // pH change per 1u reaction (inverse for some reason) - RateUpLim = 0.05 // Optimal/max rate possible if all conditions are perfect + RateUpLim = 0.1 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics PurityMin = 0 /datum/chemical_reaction/synthtissue/FermiCreate(datum/reagents/holder, added_volume, added_purity) var/datum/reagent/synthtissue/St = holder.has_reagent("synthtissue") - var/datum/reagent/N = holder.has_reagent("nutriment") + var/datum/reagent/N = holder.has_reagent("sugar") if(!St) return if(holder.chem_temp > 320) From 69e0f6836aabd2c1d166cce755d6b0ead84ee0de Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Tue, 26 Nov 2019 04:05:43 +0000 Subject: [PATCH 21/24] Adds a lil message so people don't spend 25 minutes trying everything --- code/game/objects/items/devices/scanners.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index ed2ee333ab..c91b858e51 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -390,9 +390,14 @@ SLIME SCANNER var/tdelta = round(world.time - M.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) if(heart_ded) - msg += "Subject died [DisplayTimeText(tdelta)] ago, heart requires surgical intervention for defibrillation.\n" + msg += "Subject died [DisplayTimeText(tdelta)] ago, heart requires surgical intervention for defibrillation." else - msg += "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!\n" + msg += "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!" + if(advanced) + if(H.get_ghost() || H.key || H.client)//Since it can last a while. + msg += "Intervention recommended.\n" + else + msg += "\n" for(var/thing in M.diseases) var/datum/disease/D = thing From c5e6cb8ac0fb26de65d8c10d6e856ec74cc91479 Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Tue, 26 Nov 2019 04:08:10 +0000 Subject: [PATCH 22/24] space --- code/game/objects/items/devices/scanners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c91b858e51..2a8bc0d3ba 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -395,7 +395,7 @@ SLIME SCANNER msg += "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!" if(advanced) if(H.get_ghost() || H.key || H.client)//Since it can last a while. - msg += "Intervention recommended.\n" + msg += " Intervention recommended.\n" else msg += "\n" From ca2467ff93cf4ec4abbbec802a136285f90b3764 Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Tue, 26 Nov 2019 23:14:14 +0000 Subject: [PATCH 23/24] Thingie --- code/game/objects/items/devices/scanners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 2a8bc0d3ba..085ce0f78c 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -351,8 +351,8 @@ SLIME SCANNER // Species and body temperature + var/mob/living/carbon/human/H = M if(ishuman(M)) - var/mob/living/carbon/human/H = M var/datum/species/S = H.dna.species var/mutant = FALSE if (H.dna.check_mutation(HULK)) From e6ecabe54c00ed6ba143661e903048e52ab9df11 Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Tue, 26 Nov 2019 23:23:29 +0000 Subject: [PATCH 24/24] Scanner --- code/game/objects/items/devices/scanners.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 085ce0f78c..d91075bf16 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -351,7 +351,7 @@ SLIME SCANNER // Species and body temperature - var/mob/living/carbon/human/H = M + var/mob/living/carbon/human/H = M //Start to use human only stuff here if(ishuman(M)) var/datum/species/S = H.dna.species var/mutant = FALSE @@ -410,7 +410,6 @@ SLIME SCANNER var/blood_id = C.get_blood_id() if(blood_id) if(ishuman(C)) - var/mob/living/carbon/human/H = C if(H.bleed_rate) msg += "Subject is bleeding!\n" var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)