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