diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 8e7b7ba2a81..a23705f3906 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -129,7 +129,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_HUSK "husk"
#define TRAIT_BADDNA "baddna"
#define TRAIT_CLUMSY "clumsy"
-#define TRAIT_CLOWNLIKE "clownlike" //for those creatures that are related to clowns, but not necessarily clumsy
#define TRAIT_CHUNKYFINGERS "chunkyfingers" //means that you can't use weapons with normal trigger guards.
#define TRAIT_DUMB "dumb"
#define TRAIT_ADVANCEDTOOLUSER "advancedtooluser" //Whether a mob is dexterous enough to use machines and certain items or not.
@@ -204,7 +203,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_MAGIC_CHOKE "magic_choke"
#define TRAIT_SOOTHED_THROAT "soothed-throat"
-#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
#define TRAIT_BOOZE_SLIDER "booze-slider"
#define TRAIT_QUICK_CARRY "quick-carry"
#define TRAIT_QUICKER_CARRY "quicker-carry"
@@ -249,6 +247,27 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// Being close enough to the supermatter makes it heal at higher temperatures
// and emit less heat. Present on /mob or /datum/mind
#define TRAIT_SUPERMATTER_SOOTHER "supermatter_soother"
+/*
+* Trait granted by various security jobs, and checked by [/obj/item/food/donut]
+* When present in the mob's mind, they will always love donuts.
+*/
+#define TRAIT_DONUT_LOVER "donut_lover"
+
+// METABOLISMS
+// Various jobs on the station have historically had better reactions
+// to various drinks and foodstuffs. Security liking donuts is a classic
+// example. Through years of training/abuse, their livers have taken
+// a liking to those substances. Steal a sec officer's liver, eat donuts good.
+
+// These traits are applied to /obj/item/organ/liver
+#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law_enforcement_metabolism"
+#define TRAIT_CULINARY_METABOLISM "culinary_metabolism"
+#define TRAIT_COMEDY_METABOLISM "comedy_metabolism"
+#define TRAIT_MEDICAL_METABOLISM "medical_metabolism"
+#define TRAIT_GREYTIDE_METABOLISM "greytide_metabolism"
+#define TRAIT_ENGINEER_METABOLISM "engineer_metabolism"
+#define TRAIT_ROYAL_METABOLISM "royal_metabolism"
+#define TRAIT_PRETENDER_ROYAL_METABOLISM "pretender_royal_metabolism"
// If present on a mob or mobmind, allows them to "suplex" an immovable rod
// turning it into a glorified potted plant, and giving them an
@@ -263,6 +282,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_LIGHTBULB_REMOVER "lightbulb_remover"
#define TRAIT_KNOW_CYBORG_WIRES "know_cyborg_wires"
#define TRAIT_KNOW_ENGI_WIRES "know_engi_wires"
+#define TRAIT_ENTRAILS_READER "entrails_reader"
///Movement type traits for movables. See elements/movetype_handler.dm
#define TRAIT_MOVE_GROUND "move_ground"
@@ -458,3 +478,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait granted by [/mob/living/silicon/robot]
/// Traits applied to a silicon mob by their module.
#define MODULE_TRAIT "module_trait"
+
+/// Trait from [/datum/antagonist/nukeop/clownop]
+#define CLOWNOP_TRAIT "clownop"
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 4826bc566e3..925a80b6148 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -22,7 +22,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_HUSK" = TRAIT_HUSK,
"TRAIT_BADDNA" = TRAIT_BADDNA,
"TRAIT_CLUMSY" = TRAIT_CLUMSY,
- "TRAIT_CLOWNLIKE" = TRAIT_CLOWNLIKE,
"TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS,
"TRAIT_DUMB" = TRAIT_DUMB,
"TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER,
diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm
index 546e29b14e9..d1b2a19b88f 100644
--- a/code/datums/components/squeak.dm
+++ b/code/datums/components/squeak.dm
@@ -39,6 +39,10 @@
else if(isstructure(parent))
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/use_squeak)
+ if(istype(parent, /obj/item/organ/liver))
+ // Liver squeaking is depending on them functioning like a clown's liver
+ RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_COMEDY_METABOLISM), .proc/on_comedy_metabolism_removal)
+
override_squeak_sounds = custom_sounds
if(chance_override)
squeak_chance = chance_override
@@ -116,3 +120,8 @@
//If the dir changes it means we're going through a bend in the pipes, let's pretend we bumped the wall
if(old_dir != new_dir)
play_squeak()
+
+/datum/component/squeak/proc/on_comedy_metabolism_removal(datum/source, trait)
+ SIGNAL_HANDLER
+
+ qdel(src)
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index ba7bc8e384f..92e0530f262 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -171,7 +171,7 @@
/obj/item/bikehorn
name = "bike horn"
- desc = "A horn off of a bicycle."
+ desc = "A horn off of a bicycle. Rumour has it that they're made from recycled clowns."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "bike_horn"
inhand_icon_state = "bike_horn"
diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm
index f6ded74284f..844bf5eb124 100644
--- a/code/game/objects/items/food/pastries.dm
+++ b/code/game/objects/items/food/pastries.dm
@@ -56,7 +56,7 @@
///Override for checkliked in edible component, because all cops LOVE donuts
/obj/item/food/donut/proc/check_liked(fraction, mob/living/carbon/human/H)
- if(HAS_TRAIT(H.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM) && !HAS_TRAIT(H, TRAIT_AGEUSIA))
+ if(!HAS_TRAIT(H, TRAIT_AGEUSIA) && H.mind && HAS_TRAIT(H.mind, TRAIT_DONUT_LOVER))
return FOOD_LIKED
//Use this donut ingame
diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm
index 0c671502cc8..57c24772354 100644
--- a/code/modules/antagonists/nukeop/clownop.dm
+++ b/code/modules/antagonists/nukeop/clownop.dm
@@ -5,22 +5,28 @@
antagpanel_category = "ClownOp"
nukeop_outfit = /datum/outfit/syndicate/clownop
-/datum/antagonist/nukeop/leader/clownop
- name = "Clown Operative Leader"
- roundend_category = "clown operatives"
- antagpanel_category = "ClownOp"
- nukeop_outfit = /datum/outfit/syndicate/clownop/leader
- challengeitem = /obj/item/nuclear_challenge/clownops
+/datum/antagonist/nukeop/clownop/admin_add(datum/mind/new_owner,mob/admin)
+ new_owner.assigned_role = "Clown Operative"
+ new_owner.add_antag_datum(src)
+ message_admins("[key_name_admin(admin)] has clown op'ed [key_name_admin(new_owner)].")
+ log_admin("[key_name(admin)] has clown op'ed [key_name(new_owner)].")
/datum/antagonist/nukeop/clownop/apply_innate_effects(mob/living/mob_override)
+ . = ..()
var/mob/living/L = owner.current || mob_override
- ADD_TRAIT(L, TRAIT_NAIVE, "clownop")
- ADD_TRAIT(L, TRAIT_CLOWNLIKE, "clownop")
+ ADD_TRAIT(L, TRAIT_NAIVE, CLOWNOP_TRAIT)
/datum/antagonist/nukeop/clownop/remove_innate_effects(mob/living/mob_override)
var/mob/living/L = owner.current || mob_override
- REMOVE_TRAIT(L, TRAIT_NAIVE, "clownop")
- REMOVE_TRAIT(L, TRAIT_CLOWNLIKE, "clownop")
+ REMOVE_TRAIT(L, TRAIT_NAIVE, CLOWNOP_TRAIT)
+ return ..()
+
+/datum/antagonist/nukeop/clownop/equip_op()
+ . = ..()
+ var/mob/living/current_mob = owner.current
+ var/obj/item/organ/liver/liver = current_mob.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver)
+ ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, CLOWNOP_TRAIT)
/datum/antagonist/nukeop/leader/clownop/give_alias()
title = pick("Head Honker", "Slipmaster", "Clown King", "Honkbearer")
@@ -29,8 +35,26 @@
else
owner.current.real_name = "Syndicate [title]"
-/datum/antagonist/nukeop/clownop/admin_add(datum/mind/new_owner,mob/admin)
- new_owner.assigned_role = "Clown Operative"
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has clown op'ed [key_name_admin(new_owner)].")
- log_admin("[key_name(admin)] has clown op'ed [key_name(new_owner)].")
+/datum/antagonist/nukeop/leader/clownop
+ name = "Clown Operative Leader"
+ roundend_category = "clown operatives"
+ antagpanel_category = "ClownOp"
+ nukeop_outfit = /datum/outfit/syndicate/clownop/leader
+ challengeitem = /obj/item/nuclear_challenge/clownops
+
+/datum/antagonist/nukeop/leader/clownop/apply_innate_effects(mob/living/mob_override)
+ . = ..()
+ var/mob/living/L = owner.current || mob_override
+ ADD_TRAIT(L, TRAIT_NAIVE, CLOWNOP_TRAIT)
+
+/datum/antagonist/nukeop/leader/clownop/remove_innate_effects(mob/living/mob_override)
+ var/mob/living/L = owner.current || mob_override
+ REMOVE_TRAIT(L, TRAIT_NAIVE, CLOWNOP_TRAIT)
+ return ..()
+
+/datum/antagonist/nukeop/leader/clownop/equip_op()
+ . = ..()
+ var/mob/living/L = owner.current
+ var/obj/item/organ/liver/liver = L.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver)
+ ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, CLOWNOP_TRAIT)
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index a3d967d7cb6..a55fec7cc7d 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -61,6 +61,9 @@
var/list/mind_traits // Traits added to the mind of the mob assigned this job
+ ///Lazylist of traits added to the liver of the mob assigned this job (used for the classic "cops heal from donuts" reaction, among others)
+ var/list/liver_traits = null
+
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
var/bounty_types = CIV_JOB_BASIC
@@ -87,6 +90,12 @@
for(var/t in mind_traits)
ADD_TRAIT(H.mind, t, JOB_TRAIT)
+ var/obj/item/organ/liver/liver = H.getorganslot(ORGAN_SLOT_LIVER)
+
+ if(liver)
+ for(var/t in liver_traits)
+ ADD_TRAIT(liver, t, JOB_TRAIT)
+
var/list/roundstart_experience
if(!ishuman(H))
diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm
index c66c2617ad3..366f1ca94e0 100644
--- a/code/modules/jobs/job_types/assistant.dm
+++ b/code/modules/jobs/job_types/assistant.dm
@@ -13,6 +13,9 @@ Assistant
outfit = /datum/outfit/job/assistant
antag_rep = 7
paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it.
+
+ liver_traits = list(TRAIT_GREYTIDE_METABOLISM)
+
paycheck_department = ACCOUNT_CIV
display_order = JOB_DISPLAY_ORDER_ASSISTANT
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index 98a2a627494..4102410e73e 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -16,6 +16,9 @@
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_AUX_BASE, ACCESS_CONSTRUCTION, ACCESS_MECH_ENGINE, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_ENG
+
+ liver_traits = list(TRAIT_ENGINEER_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN
bounty_types = CIV_JOB_ENG
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index de67ddb3a2d..bacc99fcaec 100755
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -20,6 +20,8 @@
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SEC
+ liver_traits = list(TRAIT_ROYAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_CAPTAIN
/datum/job/captain/get_access()
diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm
index 9d09f88b50e..e7ae010b185 100644
--- a/code/modules/jobs/job_types/chaplain.dm
+++ b/code/modules/jobs/job_types/chaplain.dm
@@ -129,6 +129,8 @@
/obj/item/camera/spooky = 1
)
+ skillchips = list(/obj/item/skillchip/entrails_reader)
+
backpack = /obj/item/storage/backpack/cultpack
satchel = /obj/item/storage/backpack/cultpack
diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm
index b051ecd0916..a9eaac62c4e 100644
--- a/code/modules/jobs/job_types/chemist.dm
+++ b/code/modules/jobs/job_types/chemist.dm
@@ -16,6 +16,8 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ liver_traits = list(TRAIT_MEDICAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_CHEMIST
bounty_types = CIV_JOB_CHEM
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 1260ea982ec..38d0ad62345 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -27,6 +27,8 @@
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_ENG
+ liver_traits = list(TRAIT_ENGINEER_METABOLISM, TRAIT_ROYAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER
bounty_types = CIV_JOB_ENG
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index e0e1d00d33e..e798268d1fb 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -25,6 +25,8 @@
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_MED
+ liver_traits = list(TRAIT_MEDICAL_METABOLISM, TRAIT_ROYAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER
bounty_types = CIV_JOB_MED
@@ -43,6 +45,8 @@
suit_store = /obj/item/flashlight/pen/paramedic
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced/command=1)
+ skillchips = list(/obj/item/skillchip/entrails_reader)
+
backpack = /obj/item/storage/backpack/medic
satchel = /obj/item/storage/backpack/satchel/med
duffelbag = /obj/item/storage/backpack/duffelbag/med
diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm
index 244d49b00d3..58931876949 100644
--- a/code/modules/jobs/job_types/clown.dm
+++ b/code/modules/jobs/job_types/clown.dm
@@ -14,6 +14,8 @@
paycheck = PAYCHECK_MINIMAL
paycheck_department = ACCOUNT_SRV
+ liver_traits = list(TRAIT_COMEDY_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_CLOWN
@@ -55,7 +57,6 @@
H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly.
ADD_TRAIT(H, TRAIT_NAIVE, JOB_TRAIT)
- ADD_TRAIT(H, TRAIT_CLOWNLIKE, JOB_TRAIT)
H.dna.add_mutation(CLOWNMUT)
for(var/datum/mutation/human/clumsy/M in H.dna.mutations)
M.mutadone_proof = TRUE
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index 06c852e68eb..e669e185d0a 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -15,6 +15,8 @@
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
+ liver_traits = list(TRAIT_CULINARY_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_COOK
bounty_types = CIV_JOB_CHEF
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 0c14fe34287..9808d091cb9 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -17,7 +17,9 @@
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SEC
- mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
+ mind_traits = list(TRAIT_DONUT_LOVER)
+ liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
display_order = JOB_DISPLAY_ORDER_DETECTIVE
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index e800f1b03f0..33e4071fd8a 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -34,6 +34,8 @@
paycheck_department = ACCOUNT_SRV
bounty_types = CIV_JOB_RANDOM
+ liver_traits = list(TRAIT_ROYAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL
/datum/outfit/job/hop
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index 0595c9c25d0..d399578b204 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -15,7 +15,9 @@
exp_type_department = EXP_TYPE_SECURITY
outfit = /datum/outfit/job/hos
- mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
+ mind_traits = list(TRAIT_DONUT_LOVER)
+ liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM, TRAIT_ROYAL_METABOLISM)
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_AUX_BASE,
diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm
index a576a55c60e..edf1f0e360b 100644
--- a/code/modules/jobs/job_types/lawyer.dm
+++ b/code/modules/jobs/job_types/lawyer.dm
@@ -14,7 +14,9 @@
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
- mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
+ mind_traits = list(TRAIT_DONUT_LOVER)
+ liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
display_order = JOB_DISPLAY_ORDER_LAWYER
diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm
index 27000068f62..846d9007770 100644
--- a/code/modules/jobs/job_types/medical_doctor.dm
+++ b/code/modules/jobs/job_types/medical_doctor.dm
@@ -14,6 +14,8 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ liver_traits = list(TRAIT_MEDICAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR
bounty_types = CIV_JOB_MED
@@ -34,4 +36,6 @@
duffelbag = /obj/item/storage/backpack/duffelbag/med
box = /obj/item/storage/box/survival/medical
+ skillchips = list(/obj/item/skillchip/entrails_reader)
+
chameleon_extras = /obj/item/gun/syringe
diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm
index b271864279d..856be186225 100644
--- a/code/modules/jobs/job_types/paramedic.dm
+++ b/code/modules/jobs/job_types/paramedic.dm
@@ -16,6 +16,8 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ liver_traits = list(TRAIT_MEDICAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_PARAMEDIC
bounty_types = CIV_JOB_MED
diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm
index 434ce3a2a8d..507842a65d5 100644
--- a/code/modules/jobs/job_types/psychologist.dm
+++ b/code/modules/jobs/job_types/psychologist.dm
@@ -14,6 +14,8 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SRV
+ liver_traits = list(TRAIT_MEDICAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_PSYCHOLOGIST
/datum/outfit/job/psychologist
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index 94cc106df27..93489b29b20 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -15,6 +15,8 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_CAR
+ liver_traits = list(TRAIT_PRETENDER_ROYAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_QUARTERMASTER
bounty_types = CIV_JOB_RANDOM
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 7dce915fd5d..f079fd13022 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -17,7 +17,9 @@
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
paycheck = PAYCHECK_HARD
paycheck_department = ACCOUNT_SEC
- mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
+ mind_traits = list(TRAIT_DONUT_LOVER)
+ liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER
bounty_types = CIV_JOB_SEC
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index 9122dfe296f..736474a7bf4 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -18,6 +18,8 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_ENG
+ liver_traits = list(TRAIT_ENGINEER_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER
bounty_types = CIV_JOB_ENG
diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm
index 28bf1319ba9..9063b72038d 100644
--- a/code/modules/jobs/job_types/virologist.dm
+++ b/code/modules/jobs/job_types/virologist.dm
@@ -16,6 +16,8 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ liver_traits = list(TRAIT_MEDICAL_METABOLISM)
+
display_order = JOB_DISPLAY_ORDER_VIROLOGIST
bounty_types = CIV_JOB_VIRO
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index 9eb1bc03936..3c33ff0629f 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -17,7 +17,9 @@
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access()
paycheck = PAYCHECK_HARD
paycheck_department = ACCOUNT_SEC
- mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
+ mind_traits = list(TRAIT_DONUT_LOVER)
+ liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
display_order = JOB_DISPLAY_ORDER_WARDEN
bounty_types = CIV_JOB_SEC
diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm
index 60de99294b7..3c9c965ffef 100644
--- a/code/modules/library/skill_learning/skillchip.dm
+++ b/code/modules/library/skill_learning/skillchip.dm
@@ -424,3 +424,12 @@
skill_icon = "save"
activate_message = "You feel your mind automatically verifying long serial numbers on disk shaped objects."
deactivate_message = "The innate recognition of absurdly long disk-related serial numbers fades from your mind."
+
+/obj/item/skillchip/entrails_reader
+ name = "3NTR41LS skillchip"
+ auto_traits = list(TRAIT_ENTRAILS_READER)
+ skill_name = "Entrails Reader"
+ skill_description = "Be able to learn about a person's life, by looking at their internal organs. Not to be confused with looking into the future."
+ skill_icon = "lungs"
+ activate_message = "You feel that you know a lot about interpreting organs."
+ deactivate_message = "Knowledge of liver damage, heart strain and lung scars fades from your mind."
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 62160eb5e25..d4e63eec819 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -532,7 +532,20 @@
id = "bananium golem"
fixed_mut_color = "ff0"
say_mod = "honks"
- inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS, TRAIT_CLUMSY, TRAIT_CLOWNLIKE, TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ inherent_traits = list(
+ TRAIT_RESISTHEAT,
+ TRAIT_NOBREATH,
+ TRAIT_RESISTCOLD,
+ TRAIT_RESISTHIGHPRESSURE,
+ TRAIT_RESISTLOWPRESSURE,
+ TRAIT_NOFIRE,
+ TRAIT_CHUNKYFINGERS,
+ TRAIT_CLUMSY,
+ TRAIT_RADIMMUNE,
+ TRAIT_GENELESS,
+ TRAIT_PIERCEIMMUNE,
+ TRAIT_NODISMEMBER,
+ )
punchdamagelow = 0
punchdamagehigh = 1
punchstunthreshold = 2 //Harmless and can't stun
@@ -554,11 +567,18 @@
last_banana = world.time
last_honk = world.time
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
+ var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver)
+ ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, SPECIES_TRAIT)
/datum/species/golem/bananium/on_species_loss(mob/living/carbon/C)
. = ..()
UnregisterSignal(C, COMSIG_MOB_SAY)
+ var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver)
+ REMOVE_TRAIT(liver, TRAIT_COMEDY_METABOLISM, SPECIES_TRAIT)
+
/datum/species/golem/bananium/random_name(gender,unique,lastname)
var/clown_name = pick(GLOB.clown_names)
var/golem_name = "[uppertext(clown_name)]"
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 77a67546dec..411c611cd79 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -302,7 +302,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(10))
- M.heal_bodypart_damage(1)
+ M.heal_bodypart_damage(brute = 1)
. = 1
return ..() || .
@@ -455,9 +455,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M)
- if(M.mind && M.mind.assigned_role == "Assistant")
- M.heal_bodypart_damage(1,1)
- . = 1
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver && HAS_TRAIT(liver, TRAIT_GREYTIDE_METABOLISM))
+ M.heal_bodypart_damage(brute = 1, burn = 1)
+ . = TRUE
return ..() || .
/datum/reagent/consumable/ethanol/ale
@@ -593,7 +594,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M)
- if(M.mind && (M.mind.assigned_role in GLOB.engineering_positions)) //Engineers lose radiation poisoning at a massive rate.
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM))
+ // Engineers lose radiation poisoning at a massive rate.
M.radiation = max(M.radiation - 25, 0)
return ..()
@@ -707,14 +710,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE))
metabolization_rate = 0.8
- if(M.mind != null && !HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ // if you don't have a liver, or your liver isn't an officer's liver
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
B = new()
M.gain_trauma(B, TRAUMA_RESILIENCE_ABSOLUTE)
..()
/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/M)
M.Jitter(2)
- if(M.mind != null && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ // if you don't have a liver, or your liver isn't an officer's liver
+ if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
M.adjustStaminaLoss(-10, 0)
if(prob(20))
new /datum/hallucination/items_other(M)
@@ -729,7 +736,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/M)
- if(M.mind != null && !HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ // if you don't have a liver, or your liver isn't an officer's liver
+ if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
M.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC)
/datum/reagent/consumable/ethanol/irish_cream
@@ -1203,9 +1212,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A drink from Clown Heaven."
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M)
- if((ishuman(M) && HAS_TRAIT(M, TRAIT_CLOWNLIKE)) || ismonkey(M))
- M.heal_bodypart_damage(1,1)
- . = 1
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(M))
+ M.heal_bodypart_damage(brute = 1, burn = 1)
+ . = TRUE
return ..() || .
/datum/reagent/consumable/ethanol/silencer
@@ -1545,8 +1555,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M)
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes
- if(M.mind != null && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
- M.heal_bodypart_damage(1, 1)
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ M.heal_bodypart_damage(brute = 1, burn = 1)
M.adjustBruteLoss(-2,0)
. = 1
return ..()
@@ -1564,8 +1575,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M)
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG..
- if(M.mind != null && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
- M.heal_bodypart_damage(2,2,2)
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ M.heal_bodypart_damage(brute = 2, burn = 2, stamina = 2)
M.adjustBruteLoss(-5,0)
M.adjustOxyLoss(-5,0)
M.adjustFireLoss(-5,0)
@@ -2055,7 +2067,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M)
//A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting
if(M?.mind?.has_antag_datum(/datum/antagonist/wizard))
- M.heal_bodypart_damage(1,1,1)
+ M.heal_bodypart_damage(brute = 1, burn = 1, stamina = 1)
M.adjustOxyLoss(-1,0)
M.adjustToxLoss(-1,0)
return ..()
@@ -2149,7 +2161,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(N.age > 969) //Best not let people get older than this or i might incur G-ds wrath
M.visible_message("[M] becomes older than any man should be.. and crumbles into dust!")
- M.dust(0,1,0)
+ M.dust(just_ash = FALSE, drop_items = TRUE, force = FALSE)
return ..()
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index c90dde33d7d..6e0bb7c6e37 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -127,9 +127,10 @@
glass_desc = "The raw essence of a banana. HONK."
/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/M)
- if((ishuman(M) && HAS_TRAIT(M, TRAIT_CLOWNLIKE)) || ismonkey(M))
- M.heal_bodypart_damage(1,1, 0)
- . = 1
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(M))
+ M.heal_bodypart_damage(brute = 1, burn = 1)
+ . = TRUE
..()
/datum/reagent/consumable/nothing
@@ -685,7 +686,9 @@
M.adjustToxLoss(-0.5, 0)
M.adjustOxyLoss(-0.5, 0)
if(M.nutrition && (M.nutrition - 2 > 0))
- if(!(M.mind && (M.mind.assigned_role in GLOB.medical_positions))) //Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight!
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(!(HAS_TRAIT(liver, TRAIT_MEDICAL_METABOLISM)))
+ // Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight!
M.adjust_nutrition(-2)
..()
. = 1
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 641553df215..d271c351845 100755
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -57,7 +57,7 @@
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M)
if(prob(50))
- M.heal_bodypart_damage(brute_heal,burn_heal, 0)
+ M.heal_bodypart_damage(brute = brute_heal, burn = burn_heal)
. = 1
..()
@@ -428,11 +428,11 @@
to_chat(M, "You can't get the scent of garlic out of your nose! You can barely think...")
M.Paralyze(10)
M.Jitter(10)
- else if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.job == "Cook")
+ else
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver && HAS_TRAIT(liver, TRAIT_CULINARY_METABOLISM))
if(prob(20)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate
- H.heal_bodypart_damage(1,1, 0)
+ M.heal_bodypart_damage(brute = 1, burn = 1)
. = 1
..()
@@ -443,8 +443,9 @@
taste_description = "childhood whimsy"
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M)
- if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
- M.heal_bodypart_damage(1,1, 0)
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ M.heal_bodypart_damage(brute = 1, burn = 1)
. = 1
..()
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index d0520401ddc..6055aefbbe5 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1677,15 +1677,17 @@
/datum/reagent/carpet/royal/on_mob_life(mob/living/carbon/M)
. = ..()
- if(!M.mind?.assigned_role)
- return
- switch(M.mind.assigned_role)
- if("Chief Medical Officer", "Captain", "Chief Engineer", "Research Director", "Head of Personnel")
+ var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER)
+ if(liver)
+ // Heads of staff and the captain have a "royal metabolism"
+ if(HAS_TRAIT(liver, TRAIT_ROYAL_METABOLISM))
if(prob(10))
to_chat(M, "You feel like royalty.")
if(prob(5))
M.say(pick("Peasants..","This carpet is worth more than your contracts!","I could fire you at any time..."), forced = "royal carpet")
- if("Quartermaster")
+
+ // The quartermaster, as a semi-head, has a "pretender royal" metabolism
+ else if(HAS_TRAIT(liver, TRAIT_PRETENDER_ROYAL_METABOLISM))
if(prob(15))
to_chat(M, "You feel like an impostor...")
@@ -2126,9 +2128,6 @@
description = "A colorless liquid that suppresses violence in its subjects. Cheaper to synthesize than normal Pax, but wears off faster."
metabolization_rate = 1.5 * REAGENTS_METABOLISM
-/datum/reagent/peaceborg
- can_synth = FALSE
-
/datum/reagent/peaceborg/confuse
name = "Dizzying Solution"
description = "Makes the target off balance and dizzy"
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index 509334c1fdc..5d44c045121 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -21,6 +21,53 @@
var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver
var/filterToxins = TRUE //whether to filter toxins
+/obj/item/organ/liver/Initialize()
+ . = ..()
+ // If the liver handles foods like a clown, it honks like a bike horn
+ // Don't think about it too much.
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_COMEDY_METABOLISM), .proc/on_add_comedy_metabolism)
+
+/* Signal handler for the liver gaining the TRAIT_COMEDY_METABOLISM trait
+ *
+ * Adds the "squeak" component, so clown livers will act just like their
+ * bike horns, and honk when you hit them with things, or throw them
+ * against things, or step on them.
+ *
+ * The removal of the component, if this liver loses that trait, is handled
+ * by the component itself.
+ */
+/obj/item/organ/liver/proc/on_add_comedy_metabolism()
+ SIGNAL_HANDLER
+
+ // Are clown "bike" horns made from the livers of ex-clowns?
+ // Would that make the clown more or less likely to honk it
+ AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50, falloff_exponent = 20)
+
+/obj/item/organ/liver/examine(mob/user)
+ . = ..()
+
+ if(HAS_TRAIT(user, TRAIT_ENTRAILS_READER) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ENTRAILS_READER)) || isobserver(user))
+ if(HAS_TRAIT(src, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ . += "Fatty deposits and sprinkle residue, imply that this is the liver of someone in security."
+ if(HAS_TRAIT(src, TRAIT_CULINARY_METABOLISM))
+ . += "The high iron content and slight smell of garlic, implies that this is the liver of a cook."
+ if(HAS_TRAIT(src, TRAIT_COMEDY_METABOLISM))
+ . += "A smell of bananas, a slippery sheen and honking when depressed, implies that this is the liver of a clown."
+ if(HAS_TRAIT(src, TRAIT_MEDICAL_METABOLISM))
+ . += "Marks of stress and a faint whiff of medicinal alcohol, imply that this is the liver of a medical worker."
+ if(HAS_TRAIT(src, TRAIT_GREYTIDE_METABOLISM))
+ . += "Greyer than most with electrical burn marks, this is the liver of an assistant."
+ if(HAS_TRAIT(src, TRAIT_ENGINEER_METABOLISM))
+ . += "Signs of radiation exposure and space adaption, implies that this is the liver of an engineer."
+
+ // royal trumps pretender royal
+ if(HAS_TRAIT(src, TRAIT_ROYAL_METABOLISM))
+ . += "A rich diet of luxury food, suppleness from soft beds, implies that this is the liver of a head of staff."
+ else if(HAS_TRAIT(src, TRAIT_PRETENDER_ROYAL_METABOLISM))
+ . += "A diet of imitation caviar, and signs of insomnia, implies that this is the liver of someone who wants to be a head of staff."
+
+
+
#define HAS_SILENT_TOXIN 0 //don't provide a feedback message if this is the only toxin present
#define HAS_NO_TOXIN 1
#define HAS_PAINFUL_TOXIN 2