diff --git a/code/__DEFINES/dcs/signals/signals_operating_computer.dm b/code/__DEFINES/dcs/signals/signals_operating_computer.dm index 94f2f52ede2..8974bb99db8 100644 --- a/code/__DEFINES/dcs/signals/signals_operating_computer.dm +++ b/code/__DEFINES/dcs/signals/signals_operating_computer.dm @@ -1,5 +1,5 @@ // /obj/machinery/computer/operating signals -/// Fired when a dissection surgery completes. +/// Fired when a autopsy surgery completes. /// (mob/living/target) -#define COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE "operating_computer_dissection_complete" +#define COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE "operating_computer_autopsy_complete" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 5496b62277c..ee5d79ef110 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -328,6 +328,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" #define TRAIT_DISSECTED "dissected" +#define TRAIT_SURGICALLY_ANALYZED "surgically_analyzed" /// Lets the user succumb even if they got NODEATH #define TRAIT_SUCCUMB_OVERRIDE "succumb_override" /// Can hear observers @@ -563,7 +564,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Projectile with this trait will always hit the defined zone of a struck living mob. #define TRAIT_ALWAYS_HIT_ZONE "always_hit_zone" -/// Mobs with this trait do care about a few grizzly things, such as digging up graves. They also really do not like bringing people back to life or tending wounds, but love autopies, dissections and amputations. +/// Mobs with this trait do care about a few grisly things, such as digging up graves. They also really do not like bringing people back to life or tending wounds, but love autopsies and amputations. #define TRAIT_MORBID "morbid" // METABOLISMS @@ -1101,6 +1102,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define HALLUCINATION_TRAIT "hallucination_trait" /// Trait given by simple/basic mob death #define BASIC_MOB_DEATH_TRAIT "basic_mob_death" +/// Trait given to mobs that have been autopsied +#define AUTOPSY_TRAIT "autopsy_trait" /** diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index e9825345653..d6e1a6457f5 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -93,6 +93,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm index 954ec03caee..f512d92acb9 100644 --- a/code/game/machinery/computer/operating_computer.dm +++ b/code/game/machinery/computer/operating_computer.dm @@ -27,7 +27,7 @@ experiment_handler = AddComponent( \ /datum/component/experiment_handler, \ - allowed_experiments = list(/datum/experiment/dissection), \ + allowed_experiments = list(/datum/experiment/autopsy), \ config_flags = EXPERIMENT_CONFIG_ALWAYS_ACTIVE, \ config_mode = EXPERIMENT_CONFIG_ALTCLICK, \ ) diff --git a/code/modules/experisci/experiment/handlers/experiment_handler.dm b/code/modules/experisci/experiment/handlers/experiment_handler.dm index cf3576a62e1..4c0b6ae3b44 100644 --- a/code/modules/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/experisci/experiment/handlers/experiment_handler.dm @@ -55,7 +55,7 @@ if(istype(parent, /obj/machinery/destructive_scanner)) RegisterSignal(parent, COMSIG_MACHINERY_DESTRUCTIVE_SCAN, PROC_REF(try_run_destructive_experiment)) if(istype(parent, /obj/machinery/computer/operating)) - RegisterSignal(parent, COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE, PROC_REF(try_run_dissection_experiment)) + RegisterSignal(parent, COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE, PROC_REF(try_run_autopsy_experiment)) // Determine UI display mode switch(config_mode) @@ -166,15 +166,14 @@ playsound(src, 'sound/machines/buzz-sigh.ogg', 25) our_scanner.say("The scan did not result in anything.") -/// Hooks on a successful dissection experiment -/datum/component/experiment_handler/proc/try_run_dissection_experiment(obj/source, mob/living/target) +/// Hooks on a successful autopsy experiment +/datum/component/experiment_handler/proc/try_run_autopsy_experiment(obj/source, mob/living/target) SIGNAL_HANDLER if (action_experiment(source, target)) playsound(source, 'sound/machines/ping.ogg', 25) - else - playsound(source, 'sound/machines/buzz-sigh.ogg', 25) - source.say("The dissection did not result in anything, either prior dissections have not been complete, or this one has already been researched.") + source.say("New unique autopsy successfully catalogued.") + /** * Announces a message to all experiment handlers diff --git a/code/modules/experisci/experiment/types/autopsy_experiment.dm b/code/modules/experisci/experiment/types/autopsy_experiment.dm new file mode 100644 index 00000000000..3ef339b642a --- /dev/null +++ b/code/modules/experisci/experiment/types/autopsy_experiment.dm @@ -0,0 +1,39 @@ +/datum/experiment/autopsy + name = "Autopsy Experiment" + description = "An experiment requiring a autopsy surgery to progress" + exp_tag = "Autopsy" + performance_hint = "Perform a autopsy surgery while connected to an operating computer." + +/datum/experiment/autopsy/is_complete() + return completed + +/datum/experiment/autopsy/perform_experiment_actions(datum/component/experiment_handler/experiment_handler, mob/target) + if (is_valid_autopsy(target)) + completed = TRUE + return TRUE + else + return FALSE + +/datum/experiment/autopsy/proc/is_valid_autopsy(mob/target) + return TRUE + +/datum/experiment/autopsy/human + name = "Human Autopsy Experiment" + description = "We don't want to invest in a station that doesn't know their coccyx from their cochlea. Send us back data dissecting a human to receive more funding." + +/datum/experiment/autopsy/human/is_valid_autopsy(mob/target) + return ishumanbasic(target) + +/datum/experiment/autopsy/nonhuman + name = "Non-human Autopsy Experiment" + description = "When we asked for a tail bone, we didn't mean...look, just send us back data from something OTHER than a human. It could be a monkey for all we care, just send us research." + +/datum/experiment/autopsy/nonhuman/is_valid_autopsy(mob/target) + return ishuman(target) && !ishumanbasic(target) + +/datum/experiment/autopsy/xenomorph + name = "Xenomorph Autopsy Experiment" + description = "Our understanding of the xenomorph only scratches the surface. Send us research from dissecting a xenomorph." + +/datum/experiment/autopsy/xenomorph/is_valid_autopsy(mob/target) + return isalien(target) diff --git a/code/modules/experisci/experiment/types/dissection_experiment.dm b/code/modules/experisci/experiment/types/dissection_experiment.dm deleted file mode 100644 index 7e077920321..00000000000 --- a/code/modules/experisci/experiment/types/dissection_experiment.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/experiment/dissection - name = "Dissection Experiment" - description = "An experiment requiring a dissection surgery to progress" - exp_tag = "Dissection" - performance_hint = "Perform a dissection surgery while connected to an operating computer." - -/datum/experiment/dissection/is_complete() - return completed - -/datum/experiment/dissection/perform_experiment_actions(datum/component/experiment_handler/experiment_handler, mob/target) - if (is_valid_dissection(target)) - completed = TRUE - return TRUE - else - return FALSE - -/datum/experiment/dissection/proc/is_valid_dissection(mob/target) - return TRUE - -/datum/experiment/dissection/human - name = "Human Dissection Experiment" - description = "We don't want to invest in a station that doesn't know their coccyx from their cochlea. Send us back data dissecting a human to receive more funding." - -/datum/experiment/dissection/human/is_valid_dissection(mob/target) - return ishumanbasic(target) - -/datum/experiment/dissection/nonhuman - name = "Non-human Dissection Experiment" - description = "When we asked for a tail bone, we didn't mean...look, just send us back data from something OTHER than a human. It could be a monkey for all we care, just send us research." - -/datum/experiment/dissection/nonhuman/is_valid_dissection(mob/target) - return ishuman(target) && !ishumanbasic(target) - -/datum/experiment/dissection/xenomorph - name = "Xenomorph Dissection Experiment" - description = "Our understanding of the xenomorph only scratches the surface. Send us research from dissecting a xenomorph." - -/datum/experiment/dissection/xenomorph/is_valid_dissection(mob/target) - return isalien(target) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a921e8e482e..48d3560bcd1 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -821,6 +821,8 @@ if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH)) death() return + if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED, AUTOPSY_TRAIT)) + REMOVE_TRAIT(src, TRAIT_DISSECTED, AUTOPSY_TRAIT) if(health <= hardcrit_threshold && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)) set_stat(HARD_CRIT) else if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index bf5aaf2f404..ff013ca09d3 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -361,6 +361,14 @@ if (!isnull(trait_exam)) . += trait_exam + if(isliving(user)) + var/mob/living/morbid_weirdo = user + if(HAS_MIND_TRAIT(morbid_weirdo, TRAIT_MORBID)) + if(HAS_TRAIT(src, TRAIT_DISSECTED)) + msg += "[span_notice("[t_He] appears to have been dissected. Useless for examination... for now.")]\n" + if(HAS_TRAIT(src, TRAIT_SURGICALLY_ANALYZED)) + msg += "[span_notice("A skilled hand has mapped this one's internal intricacies. It will be far easier to perform future experimentations upon [t_him]. Exquisite.")]\n" + var/perpname = get_face_name(get_id_name("")) if(perpname && (HAS_TRAIT(user, TRAIT_SECURITY_HUD) || HAS_TRAIT(user, TRAIT_MEDICAL_HUD))) var/datum/record/crew/target_record = find_record(perpname) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 11a4fd99c0a..a1bd972a34d 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -403,7 +403,7 @@ "soda_dispenser", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - required_experiments = list(/datum/experiment/dissection/human) + required_experiments = list(/datum/experiment/autopsy/human) /datum/techweb_node/adv_biotech id = "adv_biotech" @@ -425,7 +425,7 @@ "smoke_machine", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - required_experiments = list(/datum/experiment/dissection/nonhuman) + required_experiments = list(/datum/experiment/autopsy/nonhuman) discount_experiments = list(/datum/experiment/scanning/random/material/meat = 4000) /datum/techweb_node/xenoorgan_biotech @@ -443,7 +443,7 @@ discount_experiments = list( /datum/experiment/scanning/random/cytology/easy = 1000, /datum/experiment/scanning/points/slime/hard = 5000, - /datum/experiment/dissection/xenomorph = 5000, + /datum/experiment/autopsy/xenomorph = 5000, ) /datum/techweb_node/bio_process diff --git a/code/modules/surgery/autopsy.dm b/code/modules/surgery/autopsy.dm index 4a552823d68..9bd232e4c0d 100644 --- a/code/modules/surgery/autopsy.dm +++ b/code/modules/surgery/autopsy.dm @@ -34,8 +34,13 @@ display_pain(target, "You feel a burning sensation in your chest!") /datum/surgery_step/autopsy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/autopsy_scanner/tool, datum/surgery/surgery, default_display_results = FALSE) - ADD_TRAIT(target, TRAIT_DISSECTED, REF(src)) + ADD_TRAIT(target, TRAIT_DISSECTED, AUTOPSY_TRAIT) + if(!HAS_TRAIT(src, TRAIT_SURGICALLY_ANALYZED)) + ADD_TRAIT(target, TRAIT_SURGICALLY_ANALYZED, AUTOPSY_TRAIT) tool.scan_cadaver(user, target) + var/obj/machinery/computer/operating/operating_computer = surgery.locate_operating_computer(get_turf(target)) + if (!isnull(operating_computer)) + SEND_SIGNAL(operating_computer, COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE, target) if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_dissection_success", /datum/mood_event/morbid_dissection_success) diff --git a/code/modules/surgery/dissection.dm b/code/modules/surgery/dissection.dm deleted file mode 100644 index 917b67ff5f8..00000000000 --- a/code/modules/surgery/dissection.dm +++ /dev/null @@ -1,85 +0,0 @@ -/datum/surgery/dissection - name = "Dissection" - target_mobtypes = list( - /mob/living/carbon/human, - /mob/living/carbon/alien, - ) - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/dissection, - /datum/surgery_step/close, - ) - -/datum/surgery/dissection/can_start(mob/user, mob/living/patient) - . = ..() - - // This isn't a real advanced tech, but it doesn't make sense using it without an operating computer - if (isnull(locate_operating_computer(get_turf(patient)))) - return FALSE - - if (HAS_TRAIT(patient, TRAIT_DISSECTED)) - return FALSE - - if (patient.stat != DEAD) - return FALSE - - return TRUE - -/datum/surgery_step/dissection - name = "dissect (autopsy scanner)" - time = 16 SECONDS - implements = list( - /obj/item/autopsy_scanner = 100, - ) - -/datum/surgery_step/dissection/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/ending = "..." - if (isnull(surgery.locate_operating_computer(get_turf(target)))) - ending = ", but without a linked operating computer, you won't get any research!" - - display_results( - user, - target, - span_notice("You start to dissect [target][ending]"), - span_notice("[user] starts to dissect [target]..."), - span_notice("[user] begins to start poking around inside your corpse...hey, wait a minute!"), - ) - -/datum/surgery_step/dissection/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - ADD_TRAIT(target, TRAIT_DISSECTED, REF(src)) - - var/obj/machinery/computer/operating/operating_computer = surgery.locate_operating_computer(get_turf(target)) - if (!isnull(operating_computer)) - SEND_SIGNAL(operating_computer, COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE, target) - if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) - var/mob/living/carbon/human/morbid_weirdo = user - morbid_weirdo.add_mood_event("morbid_dissection_success", /datum/mood_event/morbid_dissection_success) - - return TRUE - -/datum/surgery_step/dissection/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - display_results( - user, - target, - span_notice("You mess up, damaging some of the internal organs!"), - span_notice("[user] messes up, damaging some of the internal organs!"), - span_notice("[user] messes up, damaging some of your internal organs!"), - ) - - target.adjustOrganLoss(pick( - ORGAN_SLOT_APPENDIX, - ORGAN_SLOT_BRAIN, - ORGAN_SLOT_HEART, - ORGAN_SLOT_LIVER, - ORGAN_SLOT_LUNGS, - ORGAN_SLOT_STOMACH, - ), 20) - - return FALSE - -/datum/surgery_step/dissection/tool_check(mob/user, obj/item/tool) - return implement_type != /obj/item || tool.get_sharpness() > 0 diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index b6602c15139..eae33e305b8 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -87,7 +87,7 @@ if(tool) speed_mod = tool.toolspeed - if(HAS_TRAIT(target, TRAIT_DISSECTED)) + if(HAS_TRAIT(target, TRAIT_SURGICALLY_ANALYZED)) speed_mod *= SURGERY_SPEED_DISSECTION_MODIFIER if(check_morbid_curiosity(user, tool, surgery)) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 1c770141f6f..4a1b567a287 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -581,7 +581,7 @@ * * Bonuses if the surgery is being done by a morbid user and it is of their interest. * - * Morbid users are interested in; dissections, autospies, revival surgery, plastic surgery, organ/feature manipulations, amputations + * Morbid users are interested in; autospies, revival surgery, plastic surgery, organ/feature manipulations, amputations * * Otherwise, normal tool. */ diff --git a/tgstation.dme b/tgstation.dme index 4bbceb7eece..0bcbf65d79b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3509,7 +3509,7 @@ #include "code\modules\experisci\experiment\experiments.dm" #include "code\modules\experisci\experiment\physical_experiments.dm" #include "code\modules\experisci\experiment\handlers\experiment_handler.dm" -#include "code\modules\experisci\experiment\types\dissection_experiment.dm" +#include "code\modules\experisci\experiment\types\autopsy_experiment.dm" #include "code\modules\experisci\experiment\types\experiment.dm" #include "code\modules\experisci\experiment\types\exploration.dm" #include "code\modules\experisci\experiment\types\ordnance.dm" @@ -5117,7 +5117,6 @@ #include "code\modules\surgery\core_removal.dm" #include "code\modules\surgery\coronary_bypass.dm" #include "code\modules\surgery\dental_implant.dm" -#include "code\modules\surgery\dissection.dm" #include "code\modules\surgery\ear_surgery.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gastrectomy.dm"