diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index c5ed6c7e964..27384cd5f9d 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -31,6 +31,7 @@ #define IMMUTABLE_SLOW (1<<10) // When players should not be able to change the slowdown of the item (Speed potions, etc) #define IN_STORAGE (1<<11) //is this item in the storage item, such as backpack? used for tooltips #define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) +#define CRUEL_IMPLEMENT (1<<13) //This object, when used for surgery, is a lot worse at the job if the target is alive rather than dead #define HAND_ITEM (1<<14) // If an item is just your hand (circled hand, slapper) and shouldn't block things like riding #define EXAMINE_SKIP (1<<15) // Makes the Examine proc not read out this item. #define XENOMORPH_HOLDABLE (1<<16) // A Xenomorph can hold this item. diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 55dbe8c4499..5349ad6ea50 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -74,3 +74,5 @@ #define SURGERY_REQUIRE_LIMB (1<<3) ///Will allow the surgery to work only if there's a real (eg. not pseudopart) limb. #define SURGERY_REQUIRES_REAL_LIMB (1<<4) +///Will grant a bonus during surgery steps to users with TRAIT_MORBID while they're using tools with CRUEL_IMPLEMENT +#define SURGERY_MORBID_CURIOSITY (1<<5) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index bebb599bd9a..eca2380e121 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -547,6 +547,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PRETENDER_ROYAL_METABOLISM "pretender_royal_metabolism" #define TRAIT_BALLMER_SCIENTIST "ballmer_scientist" #define TRAIT_MAINTENANCE_METABOLISM "maintenance_metabolism" +#define TRAIT_CORONER_METABOLISM "coroner_metabolism" //LUNG TRAITS /// Lungs always breathe normally when in vacuum/space. diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 5668ca879ca..99f90c88e86 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -189,6 +189,7 @@ DEFINE_BITFIELD(item_flags, list( "NO_PIXEL_RANDOM_DROP" = NO_PIXEL_RANDOM_DROP, "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, "SURGICAL_TOOL" = SURGICAL_TOOL, + "CRUEL_IMPLEMENT" = CRUEL_IMPLEMENT, "XENOMORPH_HOLDABLE" = XENOMORPH_HOLDABLE, "NO_BLOOD_ON_ITEM" = NO_BLOOD_ON_ITEM, )) diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 0d35407ca55..45c59ee362a 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -217,6 +217,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, "TRAIT_MAINTENANCE_METABOLISM" = TRAIT_MAINTENANCE_METABOLISM, + "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, ), /obj/item = list( "TRAIT_NODROP" = TRAIT_NODROP, diff --git a/code/datums/ai/hauntium/haunted_controller.dm b/code/datums/ai/hauntium/haunted_controller.dm index 9eb18ed7f6c..0f5f08dfc94 100644 --- a/code/datums/ai/hauntium/haunted_controller.dm +++ b/code/datums/ai/hauntium/haunted_controller.dm @@ -28,7 +28,7 @@ var/haunt_equipper = TRUE if(isliving(equipper)) var/mob/living/possibly_cool = equipper - if(possibly_cool.mob_biotypes & MOB_UNDEAD || HAS_TRAIT(possibly_cool, TRAIT_MORBID)) + if(possibly_cool.mob_biotypes & MOB_UNDEAD || possibly_cool.mind && HAS_TRAIT(possibly_cool.mind, TRAIT_MORBID)) haunt_equipper = FALSE if(haunt_equipper) //You have now become one of the victims of the HAAAAUNTTIIIINNGGG OOOOOO~~~ diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index e4538b450aa..2a62d19452d 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -904,6 +904,7 @@ extra_access = list( ACCESS_GENETICS, ACCESS_XENOBIOLOGY, + ACCESS_MORGUE_SECURE, ) template_access = list( ACCESS_CAPTAIN, diff --git a/code/datums/mood_events/morbid_events.dm b/code/datums/mood_events/morbid_events.dm index 731b62569cc..ce3ba60738f 100644 --- a/code/datums/mood_events/morbid_events.dm +++ b/code/datums/mood_events/morbid_events.dm @@ -17,6 +17,11 @@ Intended to push a creepy, mad scientist/doctor vibe, or someone who is downrigh mood_change = 2 timeout = 2 MINUTES +/datum/mood_event/morbid_abominable_surgery_success + description = "Picasso himself would struggle to match with a brush what I can do with a knife." + mood_change = 2 + timeout = 2 MINUTES + /datum/mood_event/morbid_revival_success description = "IT LIVES! AH HA HA HA HA!!" mood_change = 6 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d2dd9e29ef5..a6436ba16a9 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -390,6 +390,9 @@ . += "[gender == PLURAL ? "They are" : "It is"] a [weight_class_to_text(w_class)] item." + if(item_flags & CRUEL_IMPLEMENT) + . += "[src] seems quite practical for particularly morbid procedures and experiments." + if(resistance_flags & INDESTRUCTIBLE) . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!" else diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index bc3f637935c..1d370c4fbbb 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -648,7 +648,7 @@ H.emote("gasp") H.set_jitter_if_lower(200 SECONDS) SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) - if(HAS_TRAIT(user, TRAIT_MORBID)) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) user.add_mood_event("morbid_saved_life", /datum/mood_event/morbid_saved_life) else user.add_mood_event("saved_life", /datum/mood_event/saved_life) diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 2727547bf98..e14ba3129fe 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -452,12 +452,23 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/pickle = 1, /datum/reagent/medicine/antihol = 2, ) tastes = list("pickle" = 1, "spices" = 1, "salt water" = 2) + juice_results = list(/datum/reagent/consumable/pickle = 5) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL +/obj/item/food/pickle/make_edible() + . = ..() + AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) + +/obj/item/food/pickle/proc/check_liked(fraction, mob/living/carbon/human/consumer) + var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) + return FOOD_LIKED + /obj/item/food/springroll name = "spring roll" desc = "A plate of translucent rice wrappers filled with fresh vegetables, served with sweet chili sauce. You either love them or hate them." diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index c8eccd25407..d24c542b57c 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -61,6 +61,7 @@ righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' inhand_x_dimension = 64 inhand_y_dimension = 64 + item_flags = CRUEL_IMPLEMENT //maybe they want to use it in surgery w_class = WEIGHT_CLASS_NORMAL /obj/item/knife/bloodletter diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 70fd75c04b1..03cdb25adca 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -329,12 +329,27 @@ inhand_icon_state = "coronerkit" var/max_slots = 6 var/max_total_storage = 6 + var/max_object_size = WEIGHT_CLASS_SMALL //so it cannot fit an autopsy scanner /obj/item/storage/medkit/coroner/Initialize(mapload) . = ..() - atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL //lowering this so it can't hold the autopsy scanner + atom_storage.max_specific_storage = max_object_size atom_storage.max_slots = max_slots atom_storage.max_total_storage = max_total_storage + atom_storage.set_holdable(list( + /obj/item/reagent_containers, + /obj/item/bodybag, + /obj/item/folder/white, + /obj/item/toy/crayon, + /obj/item/pen, + /obj/item/paper, + /obj/item/surgical_drapes, + /obj/item/scalpel, + /obj/item/retractor, + /obj/item/hemostat, + /obj/item/cautery, + /obj/item/autopsy_scanner, + )) /obj/item/storage/medkit/coroner/PopulateContents() if(empty) @@ -354,8 +369,9 @@ icon = 'icons/obj/storage/medkit.dmi' icon_state = "coronerkit" inhand_icon_state = "coronerkit" - max_slots = 12 + max_slots = 14 max_total_storage = 24 + max_object_size = WEIGHT_CLASS_NORMAL /obj/item/storage/medkit/coroner/large/PopulateContents() if(empty) @@ -368,6 +384,11 @@ /obj/item/bodybag = 2, /obj/item/reagent_containers/syringe = 1, /obj/item/folder/white = 1,//for storing autopsy reports from the scanner + /obj/item/surgical_drapes = 1, + /obj/item/scalpel/cruel = 1, + /obj/item/retractor/cruel = 1, + /obj/item/hemostat/cruel = 1, + /obj/item/cautery/cruel = 1, ) generate_items_inside(items_inside,src) diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index e752acd237e..106a78bba2b 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -164,17 +164,19 @@ if(!head || !eyeballies || target.is_eyes_covered()) return ..() - + var/eye_snatch_enthusiasm = 5 SECONDS + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) + eye_snatch_enthusiasm *= 0.7 user.do_attack_animation(target, used_item = src) target.visible_message( span_warning("[user] presses [src] against [target]'s skull!"), span_userdanger("[user] presses [src] against your skull!")) - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return to_chat(target, span_userdanger("You feel something forcing its way into your skull!")) balloon_alert(user, "applying pressure...") - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return var/datum/wound/blunt/severe/severe_wound_type = /datum/wound/blunt/severe @@ -190,7 +192,7 @@ playsound(target, "sound/effects/wounds/crackandbleed.ogg", 100) log_combat(user, target, "cracked the skull of (eye snatching)", src) - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return if(!target.is_blind()) diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm index c9e98b33b52..6776dc56b44 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -12,7 +12,8 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and /obj/item/organ/internal/cyberimp/arm/shard/scythe/Insert(mob/living/carbon/receiver, special, drop_if_replaced) . = ..() - ADD_TRAIT(receiver, TRAIT_MORBID, ORGAN_TRAIT) + if(receiver.mind) + receiver.mind.add_traits(TRAIT_MORBID, ORGAN_TRAIT) /obj/item/organ/internal/cyberimp/arm/shard/scythe/Retract() var/obj/item/vorpalscythe/scythe = active_item @@ -163,7 +164,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and scythe_empowerment(potential_empowerment) - if(HAS_TRAIT(user, TRAIT_MORBID)) //You feel good about yourself, pal? + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) //You feel good about yourself, pal? user.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/jobs/job_types/coroner.dm b/code/modules/jobs/job_types/coroner.dm index 0894b5907ae..7b0371068cf 100644 --- a/code/modules/jobs/job_types/coroner.dm +++ b/code/modules/jobs/job_types/coroner.dm @@ -13,6 +13,9 @@ outfit = /datum/outfit/job/coroner plasmaman_outfit = /datum/outfit/plasmaman/coroner + mind_traits = list(TRAIT_MORBID) + liver_traits = list(TRAIT_CORONER_METABOLISM) + paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_MED @@ -28,11 +31,13 @@ /obj/item/reagent_containers/cup/bottle/formaldehyde = 30, /obj/item/storage/box/bodybags = 15, /obj/item/healthanalyzer = 10, + /obj/item/shovel = 5, /obj/effect/spawner/random/medical/organs = 5, /obj/effect/spawner/random/medical/memeorgans = 1, + /obj/item/scythe = 1, ) - family_heirlooms = list(/obj/item/clothing/head/helmet/skull, /obj/item/table_clock) + family_heirlooms = list(/obj/item/clothing/head/helmet/skull, /obj/item/table_clock, /obj/item/shovel, /obj/item/storage/fancy/pickles_jar) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index 4ec58a92c7f..b613ca08bca 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -237,13 +237,16 @@ dug_closed = TRUE close(user) else if(open(user, force = TRUE)) - if (HAS_TRAIT(user, TRAIT_MORBID)) + if (user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) user.add_mood_event("morbid_graverobbing", /datum/mood_event/morbid_graverobbing) else user.add_mood_event("graverobbing", /datum/mood_event/graverobbing) if(lead_tomb && first_open) - user.gain_trauma(/datum/brain_trauma/magic/stalker) - to_chat(user, span_boldwarning("Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) + to_chat(user, span_notice("Did someone say something? I'm sure it was nothing.")) + else + user.gain_trauma(/datum/brain_trauma/magic/stalker) + to_chat(user, span_boldwarning("Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")) first_open = FALSE return TRUE diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 4ec3f754e58..748c14c40a5 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -164,18 +164,24 @@ /obj/item/shovel/serrated name = "serrated bone shovel" - desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs." + desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs. \ + It seems less capable of harming inorganic creatures. Who knows why." icon_state = "shovel_bone" worn_icon_state = "shovel_serr" lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' - force = 15 + force = 10 throwforce = 12 w_class = WEIGHT_CLASS_NORMAL - toolspeed = 0.7 + toolspeed = 0.3 attack_verb_continuous = list("slashes", "impales", "stabs", "slices") attack_verb_simple = list("slash", "impale", "stab", "slice") sharpness = SHARP_EDGED + item_flags = CRUEL_IMPLEMENT + +/obj/item/shovel/serrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_ORGANIC, damage_multiplier = 1) //You may be horridly cursed now, but at least you kill the living a whole lot more easily! /obj/item/trench_tool name = "entrenching tool" diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 5b7e5171baa..c5a4fbea5c4 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -170,6 +170,21 @@ taste_description = "irish sadness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/consumable/pickle + name = "Pickle Juice" + description = "More accurately, this is the brine the pickle was floating in" + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + taste_description = "vinegar brine" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/pickle/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if((liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM))) + affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) + . = TRUE + ..() + /datum/reagent/consumable/grapejuice name = "Grape Juice" description = "The juice of a bunch of grapes. Guaranteed non-alcoholic." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index b8c64a40ed4..56734add996 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -638,7 +638,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(2.5, seconds_per_tick)) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) //mmmm, the forbidden pickle juice + affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) //it counteracts its own toxin damage. + . = TRUE + return ..() + else if(SPT_PROB(2.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine, pick(5,15)) holder.remove_reagent(/datum/reagent/toxin/formaldehyde, 1.2) else diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index c1e02ec8548..8affb1036d4 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -2,6 +2,7 @@ /datum/surgery/amputation name = "Amputation" requires_bodypart_type = NONE + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, @@ -58,7 +59,7 @@ ) display_pain(target, "You can no longer feel your severed [parse_zone(target_zone)]!") - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) diff --git a/code/modules/surgery/autopsy.dm b/code/modules/surgery/autopsy.dm index 6b3e7391292..e5190b91fa2 100644 --- a/code/modules/surgery/autopsy.dm +++ b/code/modules/surgery/autopsy.dm @@ -1,6 +1,6 @@ /datum/surgery/autopsy name = "Autopsy" - surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB + surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST) steps = list( /datum/surgery_step/incise, @@ -36,7 +36,7 @@ /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)) tool.scan_cadaver(user, target) - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + if(user.mind && HAS_TRAIT(user.mind, 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 ..() diff --git a/code/modules/surgery/dissection.dm b/code/modules/surgery/dissection.dm index 96c0f35d8b3..b939a8d3914 100644 --- a/code/modules/surgery/dissection.dm +++ b/code/modules/surgery/dissection.dm @@ -4,7 +4,7 @@ /mob/living/carbon/human, /mob/living/carbon/alien, ) - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + 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, @@ -55,7 +55,7 @@ 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_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + if(user.mind && HAS_TRAIT(user.mind, 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/healing.dm b/code/modules/surgery/healing.dm index 8f58553cc18..105afbf8d06 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -102,7 +102,7 @@ user_msg += get_progress(user, target, brute_healed, burn_healed) - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user) && !dead_patient) //Morbid folk don't care about tending the dead as much as tending the living + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user) && !dead_patient) //Morbid folk don't care about tending the dead as much as tending the living var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_tend_wounds", /datum/mood_event/morbid_tend_wounds) diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index d7fdb869fee..e29f2aaabe8 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -1,6 +1,6 @@ /datum/surgery/organ_manipulation name = "Organ manipulation" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) steps = list( /datum/surgery_step/incise, @@ -276,6 +276,9 @@ span_notice("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!"), span_notice("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!"), ) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) return ..() ///You can never use this MUHAHAHAHAHAHAH (because its the byond version of abstract) diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index fb9f62f7b28..52473b0a7d4 100644 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -98,6 +98,8 @@ . += span_info("Strange glowing residues, sprinklings of congealed solid plasma, and what seem to be tumors indicate this is the radiated liver of a scientist.") if(HAS_TRAIT(src, TRAIT_MAINTENANCE_METABOLISM)) . += span_info("A half-digested rat's tail (somehow), disgusting sludge, and the faint smell of Grey Bull imply this is what remains of an assistant's liver.") + if(HAS_TRAIT(src, TRAIT_CORONER_METABOLISM)) + . += span_info("An aroma of pickles and sea water, along with being remarkably well-preserved, imply this is what remains of a coroner's liver.") // royal trumps pretender royal if(HAS_TRAIT(src, TRAIT_ROYAL_METABOLISM)) diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 821e1054376..1bf552ac37b 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -1,5 +1,6 @@ /datum/surgery/plastic_surgery name = "Plastic surgery" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_HEAD) steps = list( /datum/surgery_step/incise, @@ -65,6 +66,9 @@ if(ishuman(target)) var/mob/living/carbon/human/human_target = target human_target.sec_hud_set_ID() + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) return ..() /datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 736e3982b03..6072b28b9d5 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -4,6 +4,7 @@ The body must still be able to sustain life." requires_bodypart_type = NONE possible_locs = list(BODY_ZONE_HEAD) + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -89,7 +90,7 @@ target.visible_message(span_notice("...[target] wakes up, alive and aware!")) target.emote("gasp") target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) //MAD SCIENCE - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user)) //Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) //Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_revival_success", /datum/mood_event/morbid_revival_success) return TRUE diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 3a5ed229c5f..68086d3ab5f 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -5,7 +5,7 @@ var/desc ///From __DEFINES/surgery.dm - ///Selection: SURGERY_IGNORE_CLOTHES | SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + ///Selection: SURGERY_IGNORE_CLOTHES | SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY var/surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB ///The surgery step we're currently on, increases each time we do a step. var/status = 1 diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 17cd10f9ca4..fcee24eec2b 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -65,7 +65,9 @@ #define SURGERY_SLOWDOWN_CAP_MULTIPLIER 2 //increase to make surgery slower but fail less, and decrease to make surgery faster but fail more ///Modifier given to surgery speed for dissected bodies. -#define SURGERY_DISSECTION_MODIFIER 1.2 +#define SURGERY_SPEED_DISSECTION_MODIFIER 0.8 +///Modifier given to users with TRAIT_MORBID on certain surgeries +#define SURGERY_SPEED_MORBID_CURIOSITY 0.7 /datum/surgery_step/proc/initiate(mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) // Only followers of Asclepius have the ability to use Healing Touch and perform miracle feats of surgery. @@ -86,7 +88,10 @@ speed_mod = tool.toolspeed if(HAS_TRAIT(target, TRAIT_DISSECTED)) - speed_mod /= SURGERY_DISSECTION_MODIFIER + speed_mod *= SURGERY_SPEED_DISSECTION_MODIFIER + + if(check_morbid_curiosity(user, tool, surgery)) + speed_mod *= SURGERY_SPEED_MORBID_CURIOSITY var/implement_speed_mod = 1 if(implement_type) //this means it isn't a require hand or any item step. @@ -220,6 +225,16 @@ chems += chemname return english_list(chems, and_text = require_all_chems ? " and " : " or ") +// Check if we are entitled to morbid bonuses +/datum/surgery_step/proc/check_morbid_curiosity(mob/user, obj/item/tool, datum/surgery/surgery) + if(!(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID))) + return FALSE + if(!tool || tool && !(tool.item_flags & CRUEL_IMPLEMENT)) + return FALSE + if(surgery.surgery_flags != SURGERY_MORBID_CURIOSITY) + return FALSE + return TRUE + //Replaces visible_message during operations so only people looking over the surgeon can see them. /datum/surgery_step/proc/display_results(mob/user, mob/living/target, self_message, detailed_message, vague_message, target_detailed = FALSE) user.visible_message(detailed_message, self_message, vision_distance = 1, ignored_mobs = target_detailed ? null : target) @@ -247,5 +262,6 @@ if(prob(30) && !mechanical_surgery) target.emote("scream") -#undef SURGERY_DISSECTION_MODIFIER +#undef SURGERY_SPEED_DISSECTION_MODIFIER +#undef SURGERY_SPEED_MORBID_CURIOSITY #undef SURGERY_SLOWDOWN_CAP_MULTIPLIER diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index f111ac5625e..81df2da70ac 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -477,7 +477,7 @@ limb_snip_candidate.dismember() user.visible_message(span_danger("[src] violently slams shut, amputating [patient]'s [candidate_name]."), span_notice("You amputate [patient]'s [candidate_name] with [src].")) - if(HAS_TRAIT(user, TRAIT_MORBID)) //Freak + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) //Freak user.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) /obj/item/shears/suicide_act(mob/living/carbon/user) @@ -563,3 +563,43 @@ var/chem_name = params["reagent"] var/chem_id = get_chem_id(chem_name) whitelist -= chem_id + +/* + * Cruel Surgery Tools + * + * This variety of tool has the CRUEL_IMPLEMENT flag. + * + * 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 + * + * Otherwise, normal tool. + */ + +/obj/item/retractor/cruel + name = "twisted retractor" + desc = "Helps reveal secrets that would rather stay buried." + icon_state = "cruelretractor" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/hemostat/cruel + name = "cruel hemostat" + desc = "Clamping bleeders, but not so good at fixing breathers." + icon_state = "cruelhemostat" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/cautery/cruel + name = "savage cautery" + desc = "Chalk this one up as another successful vivisection." + icon_state = "cruelcautery" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/scalpel/cruel + name = "hungry scalpel" + desc = "I remember every time I hold you. My born companion..." + icon_state = "cruelscalpel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/scalpel/cruel/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_UNDEAD, damage_multiplier = 1) //Just in case one of the tennants get uppity diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 3b39229a4e7..34fb74fb24f 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -304,10 +304,16 @@ ) contraband = list( /obj/item/knife/ritual = 1, + /obj/item/scythe = 1, + /obj/item/storage/fancy/pickles_jar = 1, /obj/item/table_clock = 1, ) premium = list( /obj/item/autopsy_scanner = 1, + /obj/item/scalpel/cruel = 1, + /obj/item/retractor/cruel = 1, + /obj/item/hemostat/cruel = 1, + /obj/item/cautery/cruel = 1, ) refill_canister = /obj/item/vending_refill/wardrobe/coroner_wardrobe payment_department = ACCOUNT_MED diff --git a/icons/obj/medical/surgery_tools.dmi b/icons/obj/medical/surgery_tools.dmi index 594f0a8d43f..baa24ca1ad7 100644 Binary files a/icons/obj/medical/surgery_tools.dmi and b/icons/obj/medical/surgery_tools.dmi differ