From 89eea73703589eb5259e59b7ef3d76aaeb3bea15 Mon Sep 17 00:00:00 2001 From: coiax Date: Mon, 11 Jan 2021 19:34:40 +0000 Subject: [PATCH] Rework job food/alchohol benefits into livers (#55721) By moving the "special behaviour" of something like security officers eating donuts, or engineers losing radiation by drinking Screwdrivers, into traits on the liver, this makes the "origin" of that behaviour more clearly defined, rather than something that's attached to the mind of the person. (For example, now if a wizard mindswaps into a Security Officer, they too can now digest donuts good.) Having this behaviour be partially visible to the more medically inclined members of the station (like doctors, and the chaplain for "entrails reading mystic" themes), means that a dismembered liver tells a story to those who know how to read it. Some jobs have more "benefits" than others, for example the only thing that the liver of a Quartermaster gives them is a sense of inadequacy when consuming royal carpet. Clowns having livers that honk make them easier to identify, and plays into the retconned "bike horns are clown livers lore"? Also, why not cut out a clown's liver then honk them with it? You monster. --- code/__DEFINES/traits.dm | 27 +++++++++- code/_globalvars/traits.dm | 1 - code/datums/components/squeak.dm | 9 ++++ code/game/objects/items/clown_items.dm | 2 +- code/game/objects/items/food/pastries.dm | 2 +- code/modules/antagonists/nukeop/clownop.dm | 54 +++++++++++++------ code/modules/jobs/job_types/_job.dm | 9 ++++ code/modules/jobs/job_types/assistant.dm | 3 ++ .../jobs/job_types/atmospheric_technician.dm | 3 ++ code/modules/jobs/job_types/captain.dm | 2 + code/modules/jobs/job_types/chaplain.dm | 2 + code/modules/jobs/job_types/chemist.dm | 2 + code/modules/jobs/job_types/chief_engineer.dm | 2 + .../jobs/job_types/chief_medical_officer.dm | 4 ++ code/modules/jobs/job_types/clown.dm | 3 +- code/modules/jobs/job_types/cook.dm | 2 + code/modules/jobs/job_types/detective.dm | 4 +- .../jobs/job_types/head_of_personnel.dm | 2 + .../jobs/job_types/head_of_security.dm | 4 +- code/modules/jobs/job_types/lawyer.dm | 4 +- code/modules/jobs/job_types/medical_doctor.dm | 4 ++ code/modules/jobs/job_types/paramedic.dm | 2 + code/modules/jobs/job_types/psychologist.dm | 2 + code/modules/jobs/job_types/quartermaster.dm | 2 + .../jobs/job_types/security_officer.dm | 4 +- .../jobs/job_types/station_engineer.dm | 2 + code/modules/jobs/job_types/virologist.dm | 2 + code/modules/jobs/job_types/warden.dm | 4 +- .../library/skill_learning/skillchip.dm | 9 ++++ .../carbon/human/species_types/golems.dm | 22 +++++++- .../chemistry/reagents/alcohol_reagents.dm | 46 ++++++++++------ .../chemistry/reagents/drink_reagents.dm | 11 ++-- .../chemistry/reagents/food_reagents.dm | 15 +++--- .../chemistry/reagents/other_reagents.dm | 15 +++--- code/modules/surgery/organs/liver.dm | 47 ++++++++++++++++ 35 files changed, 265 insertions(+), 63 deletions(-) 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