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