From f94efe06a431c5e1056d2c1b0bb381fb1498b02c Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Sat, 9 Aug 2025 11:18:49 -0700 Subject: [PATCH] [MIRROR] Allergic Reaction Element (And direct_say proc) (#11359) Co-authored-by: Will <7099514+Willburd@users.noreply.github.com> Co-authored-by: C.L. --- code/__defines/_reagents.dm | 2 + code/__defines/dcs/signals.dm | 2 + code/__defines/species_flags.dm | 79 ++++++++++++++ code/__defines/species_languages.dm | 100 +++++------------- code/__defines/species_languages_vr.dm | 32 +----- code/controllers/subsystems/internal_wiki.dm | 2 - .../components/disabilities/coughing.dm | 2 + .../components/disabilities/epilepsy.dm | 2 + .../datums/components/disabilities/gibbing.dm | 2 + .../components/disabilities/nervousness.dm | 2 + code/datums/components/disabilities/pollen.dm | 77 ++++++++++++++ .../datums/components/disabilities/rotting.dm | 2 + .../components/disabilities/tourettes.dm | 6 +- code/datums/elements/allergy.dm | 95 +++++++++++++++++ code/game/machinery/telecomms/broadcaster.dm | 88 +++++++-------- .../machinery/telecomms/broadcaster_vr.dm | 36 ++++--- .../machinery/telecomms/telecomunications.dm | 5 + code/modules/food/food/snacks.dm | 66 +++++++++--- code/modules/food/food/snacks/meat.dm | 1 + code/modules/food/food/snacks_vr.dm | 3 + .../hydroponics/seedtypes/mushrooms.dm | 20 ++-- code/modules/mob/language/language.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 2 - code/modules/mob/living/carbon/human/life.dm | 31 +----- .../living/carbon/human/species/species.dm | 5 + .../human/species/station/traits/neutral.dm | 36 +++++++ code/modules/mob/living/say.dm | 29 +++-- code/modules/mob/say.dm | 5 + code/modules/reagents/reagents/food_drinks.dm | 14 ++- vorestation.dme | 3 + 30 files changed, 507 insertions(+), 244 deletions(-) create mode 100644 code/__defines/species_flags.dm create mode 100644 code/datums/components/disabilities/pollen.dm create mode 100644 code/datums/elements/allergy.dm diff --git a/code/__defines/_reagents.dm b/code/__defines/_reagents.dm index 6bfb2457e6..985cb1d447 100644 --- a/code/__defines/_reagents.dm +++ b/code/__defines/_reagents.dm @@ -616,6 +616,8 @@ #define REAGENT_ID_TOFU "tofu" #define REAGENT_SEAFOOD "seafood protein" #define REAGENT_ID_SEAFOOD "seafood" +#define REAGENT_FUNGI "fungal protein" +#define REAGENT_ID_FUNGI "fungi" #define REAGENT_CHEESE "cheese" #define REAGENT_ID_CHEESE "cheese" #define REAGENT_EGG "egg yolk" diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm index f6333041f8..ab036d07f1 100644 --- a/code/__defines/dcs/signals.dm +++ b/code/__defines/dcs/signals.dm @@ -362,6 +362,8 @@ #define COMSIG_LIVING_LIFE "living_life" ///From /living/handle_disabilities(). #define COMSIG_HANDLE_DISABILITIES "handle_disabilities" +///From /living/handle_allergens(). +#define COMSIG_HANDLE_ALLERGENS "handle_allergens" ///From /mob/living/proc/updatehealth(). #define COMSIG_UPDATE_HEALTH "update_health" #define COMSIG_UPDATE_HEALTH_GOD_MODE (1<<0) //If this will set health to 100 and stat to conscious. diff --git a/code/__defines/species_flags.dm b/code/__defines/species_flags.dm new file mode 100644 index 0000000000..199028181d --- /dev/null +++ b/code/__defines/species_flags.dm @@ -0,0 +1,79 @@ +// Species flags. +#define NO_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona), cut resistant (slimes) or incorporeal (shadows) +#define IS_PLANT 0x2 // Is a treeperson. +#define NO_SLEEVE 0x4 // Cannot be resleeved by clonepods +#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator. +#define NO_SLIP 0x10 // Cannot fall over. +#define NO_POISON 0x20 // Cannot not suffer toxloss. +#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it. +#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever +#define NO_BLOOD 0x100 // Never bleed, never show blood amount +#define UNDEAD 0x200 // Various things that living things don't do, mostly for skeletons +#define NO_INFECT 0x400 // Don't allow infections in limbs or organs, similar to IS_PLANT, without other strings. +#define NO_DEFIB 0x800 // Don't allow them to be defibbed +#define NO_DNA 0x1000 // Cannot have mutations or have their dna changed by genetics/radiation/genome-stolen. +#define THICK_SKIN 0x2000 // Needles have a chain to fail when attempted to be used on them. +// unused: 0x8000 - higher than this will overflow + +// Species EMP vuln for carbons +#define EMP_PAIN 0x1 // EMPs cause pain +#define EMP_BLIND 0x2 // EMPs cause screenflash and blindness +#define EMP_DEAFEN 0x4 // EMPs cause deafness +#define EMP_CONFUSE 0x8 // EMPs cause disorientation +#define EMP_WEAKEN 0x10 // EMPs cause collapsing (at high severity only) +#define EMP_BRUTE_DMG 0x20 // EMPs inflict brute damage +#define EMP_BURN_DMG 0x40 // EMPs inflict burn damage +#define EMP_TOX_DMG 0x80 // EMPs inflict toxin damage +#define EMP_OXY_DMG 0x100 // EMPs inflict oxy damage + +// Species spawn flags +#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play. +#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces) +#define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen. +#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game. +#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen. +#define SPECIES_NO_POSIBRAIN 0x20 // FBP of this species cannot have a positronic brain. +#define SPECIES_NO_DRONEBRAIN 0x40 // FBP of this species cannot have a drone intelligence. +#define SPECIES_WHITELIST_SELECTABLE 0x80 // Can select and customize, but not join as + +// Species appearance flags +#define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255) +#define HAS_SKIN_COLOR 0x2 // Skin colour selectable in chargen. (RGB) +#define HAS_LIPS 0x4 // Lips are drawn onto the mob icon. (lipstick) +#define HAS_UNDERWEAR 0x8 // Underwear is drawn onto the mob icon. +#define HAS_EYE_COLOR 0x10 // Eye colour selectable in chargen. (RGB) +#define HAS_HAIR_COLOR 0x20 // Hair colour selectable in chargen. (RGB) +#define RADIATION_GLOWS 0x40 // Radiation causes this character to glow. + +// Species allergens +#define ALLERGEN_MEAT 0x1 // Skrell won't like this. +#define ALLERGEN_FISH 0x2 // Seperate for completion's sake. Still bad for skrell. +#define ALLERGEN_FRUIT 0x4 // An apple a day only keeps the doctor away if they're allergic. +#define ALLERGEN_VEGETABLE 0x8 // Taters 'n' carrots. Potato allergy is a thing, apparently. +#define ALLERGEN_GRAINS 0x10 // Wheat, oats, etc. +#define ALLERGEN_BEANS 0x20 // The musical fruit! Includes soy. +#define ALLERGEN_SEEDS 0x40 // Hope you don't have a nut allergy. +#define ALLERGEN_DAIRY 0x80 // Lactose intolerance, ho! Also bad for skrell. +#define ALLERGEN_FUNGI 0x100 // Delicious shrooms. +#define ALLERGEN_COFFEE 0x200 // Mostly here for tajara. +#define ALLERGEN_SUGARS 0x400 // For unathi-like reactions +#define ALLERGEN_EGGS 0x800 // For Skrell eggs allergy +#define ALLERGEN_STIMULANT 0x1000 // Stimulants are what makes the Tajaran heart go ruh roh - not just coffee! +#define ALLERGEN_CHOCOLATE 0x2000 // Makes dogs die if they want to? +#define ALLERGEN_POLLEN 0x4000 // Teshari sneezes! Grasses and plants make you have a reaction. +#define ALLERGEN_SALT 0x8000 // Chefs beware, can't have fast food! + +// Allergen reactions +#define AG_PHYS_DMG 0x1 // brute +#define AG_BURN_DMG 0x2 // burns +#define AG_TOX_DMG 0x4 // the classic +#define AG_OXY_DMG 0x8 // intense airway reactions +#define AG_EMOTE 0x10 // general emote reactions based on affect type +#define AG_PAIN 0x20 // short-lived hurt +#define AG_WEAKEN 0x40 // too weak to move, oof +#define AG_BLURRY 0x80 // blurred vision! +#define AG_SLEEPY 0x100 // fatigue/exhaustion +#define AG_CONFUSE 0x200 // disorientation +#define AG_GIBBING 0x400 // SPLODE +#define AG_SNEEZE 0x800 // sneezes +#define AG_COUGH 0x1000 // coughing diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 1480bf3d39..32919c0fe9 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -1,77 +1,3 @@ -// Species flags. -#define NO_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona), cut resistant (slimes) or incorporeal (shadows) -#define IS_PLANT 0x2 // Is a treeperson. -#define NO_SLEEVE 0x4 // Cannot be resleeved by clonepods -#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator. -#define NO_SLIP 0x10 // Cannot fall over. -#define NO_POISON 0x20 // Cannot not suffer toxloss. -#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it. -#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever -#define NO_BLOOD 0x100 // Never bleed, never show blood amount -#define UNDEAD 0x200 // Various things that living things don't do, mostly for skeletons -#define NO_INFECT 0x400 // Don't allow infections in limbs or organs, similar to IS_PLANT, without other strings. -#define NO_DEFIB 0x800 // Don't allow them to be defibbed -#define NO_DNA 0x1000 // Cannot have mutations or have their dna changed by genetics/radiation/genome-stolen. -#define THICK_SKIN 0x2000 // Needles have a chain to fail when attempted to be used on them. -// unused: 0x8000 - higher than this will overflow - -// Species EMP vuln for carbons -#define EMP_PAIN 0x1 // EMPs cause pain -#define EMP_BLIND 0x2 // EMPs cause screenflash and blindness -#define EMP_DEAFEN 0x4 // EMPs cause deafness -#define EMP_CONFUSE 0x8 // EMPs cause disorientation -#define EMP_WEAKEN 0x10 // EMPs cause collapsing (at high severity only) -#define EMP_BRUTE_DMG 0x20 // EMPs inflict brute damage -#define EMP_BURN_DMG 0x40 // EMPs inflict burn damage -#define EMP_TOX_DMG 0x80 // EMPs inflict toxin damage -#define EMP_OXY_DMG 0x100 // EMPs inflict oxy damage - -// Species allergens -#define ALLERGEN_MEAT 0x1 // Skrell won't like this. -#define ALLERGEN_FISH 0x2 // Seperate for completion's sake. Still bad for skrell. -#define ALLERGEN_FRUIT 0x4 // An apple a day only keeps the doctor away if they're allergic. -#define ALLERGEN_VEGETABLE 0x8 // Taters 'n' carrots. Potato allergy is a thing, apparently. -#define ALLERGEN_GRAINS 0x10 // Wheat, oats, etc. -#define ALLERGEN_BEANS 0x20 // The musical fruit! Includes soy. -#define ALLERGEN_SEEDS 0x40 // Hope you don't have a nut allergy. -#define ALLERGEN_DAIRY 0x80 // Lactose intolerance, ho! Also bad for skrell. -#define ALLERGEN_FUNGI 0x100 // Delicious shrooms. -#define ALLERGEN_COFFEE 0x200 // Mostly here for tajara. -#define ALLERGEN_SUGARS 0x400 // For unathi-like reactions -#define ALLERGEN_EGGS 0x800 // For Skrell eggs allergy -#define ALLERGEN_STIMULANT 0x1000 // Stimulants are what makes the Tajaran heart go ruh roh - not just coffee! -#define ALLERGEN_CHOCOLATE 0x2000 // Makes dogs die if they want to? - -// Allergen reactions -#define AG_PHYS_DMG 0x1 // brute -#define AG_BURN_DMG 0x2 // burns -#define AG_TOX_DMG 0x4 // the classic -#define AG_OXY_DMG 0x8 // intense airway reactions -#define AG_EMOTE 0x10 // general emote reactions based on affect type -#define AG_PAIN 0x20 // short-lived hurt -#define AG_WEAKEN 0x40 // too weak to move, oof -#define AG_BLURRY 0x80 // blurred vision! -#define AG_SLEEPY 0x100 // fatigue/exhaustion -#define AG_CONFUSE 0x200 // disorientation - -// Species spawn flags -#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play. -#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces) -#define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen. -#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game. -#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen. -#define SPECIES_NO_POSIBRAIN 0x20 // FBP of this species cannot have a positronic brain. -#define SPECIES_NO_DRONEBRAIN 0x40 // FBP of this species cannot have a drone intelligence. - -// Species appearance flags -#define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255) -#define HAS_SKIN_COLOR 0x2 // Skin colour selectable in chargen. (RGB) -#define HAS_LIPS 0x4 // Lips are drawn onto the mob icon. (lipstick) -#define HAS_UNDERWEAR 0x8 // Underwear is drawn onto the mob icon. -#define HAS_EYE_COLOR 0x10 // Eye colour selectable in chargen. (RGB) -#define HAS_HAIR_COLOR 0x20 // Hair colour selectable in chargen. (RGB) -#define RADIATION_GLOWS 0x40 // Radiation causes this character to glow. - // Languages. #define LANGUAGE_GALCOM "Galactic Common" #define LANGUAGE_EAL "Encoded Audio Language" @@ -81,9 +7,7 @@ #define LANGUAGE_SIIK "Siik" #define LANGUAGE_SKRELLIAN "Common Skrellian" #define LANGUAGE_TRADEBAND "Tradeband" -//VOREStation edit 08/23/20 #define LANGUAGE_GUTTER "Gutterband" -//VS edit end #define LANGUAGE_SIGN "Sign Language" #define LANGUAGE_SCHECHI "Schechi" #define LANGUAGE_ROOTLOCAL "Local Rootspeak" @@ -101,6 +25,30 @@ #define LANGUAGE_GIBBERISH "Babel" #define LANGUAGE_ROBOT_TALK "Robot Talk" #define LANGUAGE_DRONE_TALK "Drone Talk" +#define LANGUAGE_DRUDAKAR "D'Rudak'Ar" +#define LANGUAGE_BIRDSONG "Birdsong" +#define LANGUAGE_SAGARU "Sagaru" +#define LANGUAGE_CANILUNZT "Canilunzt" +#define LANGUAGE_ECUREUILIAN "Ecureuilian" +#define LANGUAGE_DAEMON "Daemon" +#define LANGUAGE_ENOCHIAN "Enochian" +#define LANGUAGE_VESPINAE "Vespinae" +#define LANGUAGE_SPACER "Spacer" +#define LANGUAGE_TAVAN "Tavan" +#define LANGUAGE_ECHOSONG "Echo Song" + +#define LANGUAGE_ANIMAL "Animal" +#define LANGUAGE_TEPPI "Teppi" +#define LANGUAGE_MOUSE "Mouse" +#define LANNGUAGE_DRAKE "Drake" + +#define LANGUAGE_SHADEKIN "Shadekin Empathy" +#define LANGUAGE_LLEILL "Glamour Speak" + +#define LANGUAGE_SPARKLE "Sparkle" + +#define LANGUAGE_XENOLINGUA "Xenomorph" +#define LANGUAGE_HIVEMIND "Hivemind" // Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index eab86fb8dd..d0f8beed93 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -1,32 +1,2 @@ -#define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as - -#define LANGUAGE_DRUDAKAR "D'Rudak'Ar" #define LANGUAGE_SLAVIC "Pan-Slavic" //CHOMP reAdd -#define LANGUAGE_BIRDSONG "Birdsong" -#define LANGUAGE_SAGARU "Sagaru" -#define LANGUAGE_CANILUNZT "Canilunzt" -#define LANGUAGE_ECUREUILIAN "Ecureuilian" -#define LANGUAGE_DAEMON "Daemon" -#define LANGUAGE_ENOCHIAN "Enochian" -#define LANGUAGE_VESPINAE "Vespinae" -#define LANGUAGE_SPACER "Spacer" -#define LANGUAGE_TAVAN "Tavan" -#define LANGUAGE_ECHOSONG "Echo Song" - -#define LANGUAGE_ANIMAL "Animal" -#define LANGUAGE_TEPPI "Teppi" -#define LANGUAGE_MOUSE "Mouse" -#define LANNGUAGE_DRAKE "Drake" - -#define LANGUAGE_SHADEKIN "Shadekin Empathy" -#define LANGUAGE_LLEILL "Glamour Speak" - -#define LANGUAGE_SPARKLE "Sparkle" - -// CHOMPAdd Start -#define LANGUAGE_MARISH "Marish" -// CHOMPAdd End - -// Xeno languages selectable -#define LANGUAGE_XENOLINGUA "Xenolingua" -#define LANGUAGE_HIVEMIND "Hivemind" +#define LANGUAGE_MARISH "Marish" //CHOMP Add diff --git a/code/controllers/subsystems/internal_wiki.dm b/code/controllers/subsystems/internal_wiki.dm index d111aefa3c..86fc917982 100644 --- a/code/controllers/subsystems/internal_wiki.dm +++ b/code/controllers/subsystems/internal_wiki.dm @@ -420,12 +420,10 @@ SUBSYSTEM_DEF(internal_wiki) allergies.Add("Stimulant") if(allergens & ALLERGEN_CHOCOLATE) allergies.Add("Chocolate") - /* Downstream features if(allergens & ALLERGEN_POLLEN) allergies.Add("Pollen") if(allergens & ALLERGEN_SALT) allergies.Add("Salt") - */ return allergies return null diff --git a/code/datums/components/disabilities/coughing.dm b/code/datums/components/disabilities/coughing.dm index fd98dcd2cd..8d52ea93bd 100644 --- a/code/datums/components/disabilities/coughing.dm +++ b/code/datums/components/disabilities/coughing.dm @@ -10,6 +10,8 @@ RegisterSignal(owner, COMSIG_HANDLE_DISABILITIES, PROC_REF(process_component)) /datum/component/coughing_disability/proc/process_component() + SIGNAL_HANDLER + if (QDELETED(parent)) return if(isbelly(owner.loc)) diff --git a/code/datums/components/disabilities/epilepsy.dm b/code/datums/components/disabilities/epilepsy.dm index 37127d5fff..ee8d026f84 100644 --- a/code/datums/components/disabilities/epilepsy.dm +++ b/code/datums/components/disabilities/epilepsy.dm @@ -9,6 +9,8 @@ RegisterSignal(owner, COMSIG_HANDLE_DISABILITIES, PROC_REF(process_component)) /datum/component/epilepsy_disability/proc/process_component() + SIGNAL_HANDLER + if (QDELETED(parent)) return if(isbelly(owner.loc)) diff --git a/code/datums/components/disabilities/gibbing.dm b/code/datums/components/disabilities/gibbing.dm index 53972cdd0e..18d3cfcded 100644 --- a/code/datums/components/disabilities/gibbing.dm +++ b/code/datums/components/disabilities/gibbing.dm @@ -12,6 +12,8 @@ RegisterSignal(owner, COMSIG_HANDLE_DISABILITIES, PROC_REF(process_component)) /datum/component/gibbing_disability/proc/process_component() + SIGNAL_HANDLER + if(QDELETED(parent)) return if(isbelly(owner.loc)) diff --git a/code/datums/components/disabilities/nervousness.dm b/code/datums/components/disabilities/nervousness.dm index 241dd154b6..7452a2e809 100644 --- a/code/datums/components/disabilities/nervousness.dm +++ b/code/datums/components/disabilities/nervousness.dm @@ -9,6 +9,8 @@ RegisterSignal(owner, COMSIG_HANDLE_DISABILITIES, PROC_REF(process_component)) /datum/component/nervousness_disability/proc/process_component() + SIGNAL_HANDLER + if(QDELETED(parent)) return if(isbelly(owner.loc)) diff --git a/code/datums/components/disabilities/pollen.dm b/code/datums/components/disabilities/pollen.dm new file mode 100644 index 0000000000..e51b3c872e --- /dev/null +++ b/code/datums/components/disabilities/pollen.dm @@ -0,0 +1,77 @@ +/datum/component/pollen_disability + var/mob/living/carbon/human/owner + var/allergy_chance = 20 + +/datum/component/pollen_disability/Initialize() + if (!ishuman(parent)) + return COMPONENT_INCOMPATIBLE + + owner = parent + RegisterSignal(owner, COMSIG_HANDLE_DISABILITIES, PROC_REF(process_component)) + +/datum/component/pollen_disability/proc/process_component() + SIGNAL_HANDLER + + if(QDELETED(parent)) + return + if(!prob(allergy_chance)) + return + if(!isturf(owner.loc)) + return + if(owner.stat != CONSCIOUS) + return + if(owner.transforming) + return + + // Check for masks or internals + if(istype(owner.head,/obj/item/clothing/head/helmet/space) && owner.internal) // Hardsuits + return + if(owner.wear_mask) // masks block it entirely + if(owner.wear_mask.item_flags & AIRTIGHT) + if(owner.internal) // gas on + return + if(owner.wear_mask.item_flags & BLOCK_GAS_SMOKE_EFFECT) + return + + // Time to ENGAGE THE ALLERGY + if(prob(5) && istype(owner.loc,/turf/simulated/floor/grass)) + trigger_allergy() + return + + // Hand check + var/list/things = list() + if(prob(32)) + if(!isnull(owner.r_hand)) + things += owner.r_hand + if(!isnull(owner.l_hand)) + things += owner.l_hand + + // terrain tests + things += owner.loc.contents + if(prob(25)) // ranged check + things += orange(2,owner.loc) + + // scan irritants! + if(things.len) + if(locate(/obj/structure/flora) in things) + trigger_allergy() + return + if(locate(/obj/effect/plant) in things) + trigger_allergy() + return + if(locate(/obj/item/toy/bouquet) in things) + trigger_allergy() + return + for(var/obj/machinery/portable_atmospherics/hydroponics/irritant_tray in things) + if(!irritant_tray.dead && !isnull(irritant_tray.seed)) + trigger_allergy() + return + +/datum/component/pollen_disability/proc/trigger_allergy() + to_chat(owner, span_danger("[pick("The air feels itchy!","Your face feels uncomfortable!","Your body tingles!")]")) + owner.add_chemical_effect(CE_ALLERGEN, rand(5,20) * REM) + +/datum/component/pollen_disability/Destroy(force = FALSE) + UnregisterSignal(owner, COMSIG_HANDLE_DISABILITIES) + owner = null + . = ..() diff --git a/code/datums/components/disabilities/rotting.dm b/code/datums/components/disabilities/rotting.dm index dcd0b82a5b..a8e3f3801a 100644 --- a/code/datums/components/disabilities/rotting.dm +++ b/code/datums/components/disabilities/rotting.dm @@ -9,6 +9,8 @@ RegisterSignal(owner, COMSIG_HANDLE_DISABILITIES, PROC_REF(process_component)) /datum/component/rotting_disability/proc/process_component() + SIGNAL_HANDLER + if (QDELETED(parent)) return if(isbelly(owner.loc)) diff --git a/code/datums/components/disabilities/tourettes.dm b/code/datums/components/disabilities/tourettes.dm index 5aa12e2492..f64e16403c 100644 --- a/code/datums/components/disabilities/tourettes.dm +++ b/code/datums/components/disabilities/tourettes.dm @@ -10,6 +10,8 @@ RegisterSignal(owner, COMSIG_HANDLE_DISABILITIES, PROC_REF(process_component)) /datum/component/tourettes_disability/proc/process_component() + SIGNAL_HANDLER + if(QDELETED(parent)) return if(isbelly(owner.loc)) @@ -18,6 +20,8 @@ return if(owner.transforming) return + if(owner.client && (owner.client.prefs.muted & MUTE_IC)) + return if((prob(1) && prob(2) && owner.paralysis <= 1)) owner.Stun(10) owner.make_jittery(100) @@ -25,7 +29,7 @@ if(1) owner.emote("twitch") if(2 to 3) - owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") + owner.direct_say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") /datum/component/tourettes_disability/Destroy(force = FALSE) diff --git a/code/datums/elements/allergy.dm b/code/datums/elements/allergy.dm new file mode 100644 index 0000000000..893de93fb8 --- /dev/null +++ b/code/datums/elements/allergy.dm @@ -0,0 +1,95 @@ +// Element for handling allergic reactions. This is only added to humans with allergies actually set in their species datum. +// Is added to the mob in species.produceCopy() after all traits have been resolved. +/datum/element/allergy/Attach(datum/target) + . = ..() + if(!ishuman(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_HANDLE_ALLERGENS, PROC_REF(handle_allergic_reaction), override = TRUE) + +/datum/element/allergy/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_HANDLE_ALLERGENS) + +/datum/element/allergy/proc/handle_allergic_reaction(datum/source,var/allergen_CE_amount) + SIGNAL_HANDLER + if(allergen_CE_amount <= 0) + return + //first, multiply the basic species-level value by our allergen effect rating, so consuming multiple seperate allergen typess simultaneously hurts more + var/mob/living/carbon/human/H = source + var/datum/species/species = H.species + var/damage_severity = species.allergen_damage_severity * allergen_CE_amount + var/disable_severity = species.allergen_disable_severity * allergen_CE_amount + + if(species.allergen_reaction & AG_PHYS_DMG) + H.adjustBruteLoss(damage_severity) + + if(species.allergen_reaction & AG_BURN_DMG) + H.adjustFireLoss(damage_severity) + + if(species.allergen_reaction & AG_TOX_DMG) + H.adjustToxLoss(damage_severity) + + if(species.allergen_reaction & AG_OXY_DMG) + H.adjustOxyLoss(damage_severity) + if(prob(disable_severity/2)) + H.emote(pick("cough","gasp","choke")) + + if(species.allergen_reaction & AG_EMOTE) + if(prob(disable_severity/2)) + H.emote(pick("pale","shiver","twitch")) + + if(species.allergen_reaction & AG_PAIN) + H.adjustHalLoss(disable_severity) + + if(species.allergen_reaction & AG_WEAKEN) + H.Weaken(disable_severity) + + if(species.allergen_reaction & AG_BLURRY) + H.eye_blurry = max(H.eye_blurry, disable_severity) + + if(species.allergen_reaction & AG_SLEEPY) + H.drowsyness = max(H.drowsyness, disable_severity) + + if(species.allergen_reaction & AG_CONFUSE) + H.Confuse(disable_severity/4) + + if(species.allergen_reaction & AG_GIBBING) + if(prob(disable_severity / 6)) + addtimer(CALLBACK(src, PROC_REF(allergy_gib), H), rand(3,6), TIMER_DELETE_ME) + else if(prob(disable_severity)) + H.emote(pick(list("whimper","belch","belch","belch","choke","shiver"))) + H.Weaken(disable_severity / 3) + + if(species.allergen_reaction & AG_SNEEZE) + if(prob(disable_severity/3)) + if(prob(20)) + to_chat(H, span_warning("You go to sneeze, but it gets caught in your sinuses!")) + else if(prob(80)) + if(prob(30)) + to_chat(H, span_warning("You feel like you are about to sneeze!")) + addtimer(CALLBACK(src, PROC_REF(allergy_sneeze), H), rand(0.75,3) SECOND, TIMER_DELETE_ME) + + if(species.allergen_reaction & AG_COUGH) + if(prob(disable_severity/2)) + H.emote(pick(list("cough","cough","cough","gasp","choke"))) + if(prob(10)) + H.drop_item() + +// Helpers for delayed actions +/datum/element/allergy/proc/allergy_sneeze(var/mob/living/carbon/human/H) + SHOULD_NOT_OVERRIDE(TRUE) + PRIVATE_PROC(TRUE) + H.emote("sneeze") + if(prob(23)) + H.drop_item() + +/datum/element/allergy/proc/allergy_gib(var/mob/living/carbon/human/H,var/remaining) + SHOULD_NOT_OVERRIDE(TRUE) + PRIVATE_PROC(TRUE) + if(remaining > 0) + H.emote(pick(list("whimper","belch","shiver"))) + remaining-- + addtimer(CALLBACK(src, PROC_REF(allergy_gib), H, remaining), rand(1,1.2) SECOND, TIMER_DELETE_ME) + return + H.emote("belch") + H.gib() diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 412dea4f99..ff25dfec10 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -56,62 +56,66 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages return GLOB.recentmessages.Add(signal_message) + // simulate the network lag if necessary if(signal.data["slow"] > 0) - sleep(signal.data["slow"]) // simulate the network lag if necessary + addtimer(CALLBACK(src, PROC_REF(receive_information_delayed), signal), signal.data["slow"], TIMER_DELETE_ME) + return + receive_information_delayed(signal) - signal.data["level"] |= using_map.get_map_levels(listening_level, TRUE, overmap_range) +/obj/machinery/telecomms/broadcaster/receive_information_delayed(datum/signal/signal) + signal.data["level"] |= using_map.get_map_levels(listening_level, TRUE, overmap_range) - var/list/forced_radios - for(var/datum/weakref/wr in linked_radios_weakrefs) - var/obj/item/radio/R = wr.resolve() - if(istype(R)) - LAZYDISTINCTADD(forced_radios, R) + var/list/forced_radios + for(var/datum/weakref/wr in linked_radios_weakrefs) + var/obj/item/radio/R = wr.resolve() + if(istype(R)) + LAZYDISTINCTADD(forced_radios, R) - /** #### - Normal Broadcast - #### **/ - if(signal.data["type"] == SIGNAL_NORMAL) - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], DATA_NORMAL, - signal.data["compression"], signal.data["level"], signal.frequency, - signal.data["verb"], forced_radios) + /** #### - Normal Broadcast - #### **/ + if(signal.data["type"] == SIGNAL_NORMAL) + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_Message(signal.data["connection"], signal.data["mob"], + signal.data["vmask"], signal.data["vmessage"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], signal.data["vname"], DATA_NORMAL, + signal.data["compression"], signal.data["level"], signal.frequency, + signal.data["verb"], forced_radios) - /** #### - Simple Broadcast - #### **/ + /** #### - Simple Broadcast - #### **/ - if(signal.data["type"] == SIGNAL_SIMPLE) + if(signal.data["type"] == SIGNAL_SIMPLE) - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_SimpleMessage(signal.data["name"], signal.frequency, - signal.data["message"], DATA_NORMAL, null, - signal.data["compression"], listening_level, forced_radios) + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_SimpleMessage(signal.data["name"], signal.frequency, + signal.data["message"], DATA_NORMAL, null, + signal.data["compression"], listening_level, forced_radios) - /** #### - Artificial Broadcast - #### **/ - // (Imitates a mob) + /** #### - Artificial Broadcast - #### **/ + // (Imitates a mob) - if(signal.data["type"] == SIGNAL_FAKE) + if(signal.data["type"] == SIGNAL_FAKE) - /* ###### Broadcast a message using signal.data ###### */ - // Parameter "data" as DATA_FAKE: AI can't track this person/mob + /* ###### Broadcast a message using signal.data ###### */ + // Parameter "data" as DATA_FAKE: AI can't track this person/mob - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], DATA_FAKE, - signal.data["compression"], signal.data["level"], signal.frequency, - signal.data["verb"], forced_radios) + Broadcast_Message(signal.data["connection"], signal.data["mob"], + signal.data["vmask"], signal.data["vmessage"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], signal.data["vname"], DATA_FAKE, + signal.data["compression"], signal.data["level"], signal.frequency, + signal.data["verb"], forced_radios) - if(!GLOB.message_delay) - GLOB.message_delay = 1 - spawn(10) - GLOB.message_delay = 0 - GLOB.recentmessages = list() + if(!GLOB.message_delay) + GLOB.message_delay = 1 + spawn(10) + GLOB.message_delay = 0 + GLOB.recentmessages = list() - /* --- Do a snazzy animation! --- */ - flick("broadcaster_send", src) + /* --- Do a snazzy animation! --- */ + flick("broadcaster_send", src) /obj/machinery/telecomms/broadcaster/Destroy() // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. diff --git a/code/game/machinery/telecomms/broadcaster_vr.dm b/code/game/machinery/telecomms/broadcaster_vr.dm index 07bdb3cbce..c182812bd8 100644 --- a/code/game/machinery/telecomms/broadcaster_vr.dm +++ b/code/game/machinery/telecomms/broadcaster_vr.dm @@ -23,24 +23,28 @@ // Because this is a 'all in one' machine, we're gonna just cheat. //signal.data["level"] = using_map.contact_levels.Copy() + // simulate the network lag if necessary if(signal.data["slow"] > 0) - sleep(signal.data["slow"]) // simulate the network lag if necessary + addtimer(CALLBACK(src, PROC_REF(receive_information_delayed), signal), signal.data["slow"], TIMER_DELETE_ME) + return + receive_information_delayed(signal) - /* ###### Broadcast a message using signal.data ###### */ +/obj/machinery/telecomms/allinone/ert/receive_information_delayed(datum/signal/signal) + /* ###### Broadcast a message using signal.data ###### */ - var/datum/radio_frequency/connection = signal.data["connection"] + var/datum/radio_frequency/connection = signal.data["connection"] - var/list/forced_radios - for(var/datum/weakref/wr in linked_radios_weakrefs) - var/obj/item/radio/R = wr.resolve() - if(istype(R)) - LAZYDISTINCTADD(forced_radios, R) + var/list/forced_radios + for(var/datum/weakref/wr in linked_radios_weakrefs) + var/obj/item/radio/R = wr.resolve() + if(istype(R)) + LAZYDISTINCTADD(forced_radios, R) - if(connection.frequency in CENT_FREQS) // if ert broadcast, just - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], DATA_NORMAL, - signal.data["compression"], list(0), connection.frequency, - signal.data["verb"], forced_radios) + if(connection.frequency in CENT_FREQS) // if ert broadcast, just + Broadcast_Message(signal.data["connection"], signal.data["mob"], + signal.data["vmask"], signal.data["vmessage"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], signal.data["vname"], DATA_NORMAL, + signal.data["compression"], list(0), connection.frequency, + signal.data["verb"], forced_radios) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 8aec42c98a..ced480284e 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -104,6 +104,11 @@ // receive information from linked machinery return +/obj/machinery/telecomms/proc/receive_information_delayed(datum/signal/signal, obj/machinery/telecomms/machine_from) + // The second half of receive_information(), called after the slowness delay from its first half. + PROTECTED_PROC(TRUE) + return + /obj/machinery/telecomms/proc/is_freq_listening(datum/signal/signal) // return 1 if found, 0 if not found if(!signal) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 1a934b9dae..77a3c7e1c5 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -1146,6 +1146,7 @@ /obj/item/reagent_containers/food/snacks/mushroomslice/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PSILOCYBIN, 3) + reagents.add_reagent(REAGENT_ID_FUNGI, 1) /obj/item/reagent_containers/food/snacks/tomatomeat name = "tomato slice" @@ -1653,6 +1654,7 @@ . = ..() reagents.add_reagent(REAGENT_ID_AMATOXIN, 3) reagents.add_reagent(REAGENT_ID_PSILOCYBIN, 1) + reagents.add_reagent(REAGENT_ID_FUNGI, 2) /obj/item/reagent_containers/food/snacks/plump_pie name = "plump pie" @@ -1667,6 +1669,7 @@ /obj/item/reagent_containers/food/snacks/plump_pie/Initialize(mapload) . = ..() + reagents.add_reagent(REAGENT_ID_FUNGI, 2) if(prob(10)) name = "exceptional plump pie" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" @@ -1854,7 +1857,7 @@ /obj/item/reagent_containers/food/snacks/carrotfries/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_IMIDAZOLINE, 3) - + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/cheesyfries name = "Cheesy Fries" @@ -1972,6 +1975,7 @@ /obj/item/reagent_containers/food/snacks/spacylibertyduff/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PSILOCYBIN, 6) + reagents.add_reagent(REAGENT_ID_FUNGI, 1) /obj/item/reagent_containers/food/snacks/amanitajelly name = "Amanita Jelly" @@ -1989,6 +1993,7 @@ . = ..() reagents.add_reagent(REAGENT_ID_AMATOXIN, 6) reagents.add_reagent(REAGENT_ID_PSILOCYBIN, 3) + reagents.add_reagent(REAGENT_ID_FUNGI, 2) /obj/item/reagent_containers/food/snacks/poppypretzel name = "Poppy pretzel" @@ -2209,6 +2214,7 @@ /obj/item/reagent_containers/food/snacks/fishandchips/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PROTEIN, 3) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/rofflewaffles name = "Roffle Waffles" @@ -2597,6 +2603,7 @@ /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize(mapload) . = ..() + reagents.add_reagent(REAGENT_ID_FUNGI, 1) if(prob(10)) name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" @@ -2725,6 +2732,7 @@ . = ..() reagents.add_reagent(REAGENT_ID_BANANA, 5) reagents.add_reagent(REAGENT_ID_WATER, 10) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/vegetablesoup name = "Vegetable soup" @@ -2923,6 +2931,7 @@ reagents.add_reagent(REAGENT_ID_TOMATOJUICE, 5) reagents.add_reagent(REAGENT_ID_IMIDAZOLINE, 5) reagents.add_reagent(REAGENT_ID_WATER, 5) + reagents.add_reagent(REAGENT_ID_FUNGI, 1) /obj/item/reagent_containers/food/snacks/bearstew name = "bear stew" @@ -3607,6 +3616,10 @@ w_class = ITEMSIZE_TINY nutriment_amt = 1 +/obj/item/reagent_containers/food/snacks/cracker/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) + /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp name = "Njarir Merana Grill" desc = "A well-dressed fish, seared to perfection and adorned with herbs and spices in a traditional Nerahni Tajaran style. Can be sliced into proper serving sizes." @@ -4067,6 +4080,7 @@ /obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PROTEIN, 5) + reagents.add_reagent(REAGENT_ID_FUNGI, 5) /obj/item/reagent_containers/food/snacks/slice/mushroompizza name = "Mushroompizza slice" @@ -4650,6 +4664,10 @@ nutriment_amt = 2 nutriment_desc = list("salt" = 3) +/obj/item/reagent_containers/food/snacks/roastedsunflower/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) + /obj/item/reagent_containers/food/snacks/roastedpeanuts name = "peanuts" desc = "Stopped being the planetary airline food of Earth in 2120." @@ -4661,6 +4679,10 @@ nutriment_amt = 2 nutriment_desc = list("salt" = 3) +/obj/item/reagent_containers/food/snacks/roastedpeanuts/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) + /obj/item/reagent_containers/food/snacks/liquidfood name = "\improper LiquidFood Ration" desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy?" @@ -4758,6 +4780,11 @@ nutriment_desc = list(PLANT_MUSHROOMS = 5, "salt" = 5) bitesize = 3 +/obj/item/reagent_containers/food/snacks/skrellsnacks/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) + reagents.add_reagent(REAGENT_ID_FUNGI, 1) + /obj/item/reagent_containers/food/snacks/unajerky name = "Moghes Imported Sissalik Jerky" icon = 'icons/obj/food_snacks.dmi' @@ -4959,6 +4986,7 @@ /obj/item/reagent_containers/food/snacks/cubannachos/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_CAPSAICIN, 4) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/curryrice name = "curry rice" @@ -4971,6 +4999,7 @@ /obj/item/reagent_containers/food/snacks/curryrice/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_CAPSAICIN, 4) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/piginblanket name = "pig in a blanket" @@ -6875,6 +6904,10 @@ nutriment_desc = list("salt" = 1, "chips" = 2) bitesize = 1 +/obj/item/reagent_containers/food/snacks/chips/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) + /obj/item/reagent_containers/food/snacks/chips/bbq name = "\improper Legendary BBQ Chips" desc = "You know I can't grab your ghost chips!" @@ -6909,20 +6942,6 @@ nutriment_desc = list("bread" = 2, "sweetness" = 3) bitesize = 2 -/obj/item/reagent_containers/food/snacks/skrellsnacks - name = "\improper SkrellSnax" - desc = "Cured fungus shipped all the way from Qerr'balak, almost like jerky! Almost." - description_fluff = "Despite the packaging, most SkrellSnax sold in Vir are produced using locally-grown, Qerr'Balak-native Go'moa fungi in controversial Skrell-owned biodomes on the suface of Sif. SkrellSnax were originally a product of Natuna, designed to welcome Ue-Katish refugees to their colony. The brand was recreated by Centauri Provisions after Natuna and SolGov broke off diplomatic relations." - icon = 'icons/obj/food_snacks.dmi' - icon_state = "skrellsnacks" - trash = /obj/item/trash/skrellsnax - filling_color = "#A66829" - center_of_mass_x = 15 - center_of_mass_y = 12 - nutriment_amt = 10 - nutriment_desc = list(PLANT_MUSHROOMS = 5, "salt" = 5) - bitesize = 3 - /obj/item/reagent_containers/food/snacks/sosjerky name = "Scaredy's Private Reserve Beef Jerky" icon = 'icons/obj/food_snacks.dmi' @@ -7018,6 +7037,7 @@ /obj/item/reagent_containers/food/snacks/squid/true/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PROTEIN, 4) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/croutons name = "\improper Suhariki" @@ -7048,6 +7068,7 @@ /obj/item/reagent_containers/food/snacks/salo/true/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PROTEIN, 8) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/driedfish name = "\improper Vobla" @@ -7065,6 +7086,7 @@ /obj/item/reagent_containers/food/snacks/driedfish/Initialize(mapload) .=..() reagents.add_reagent(REAGENT_ID_PROTEIN, 4) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/no_raisin name = "4no Raisins" @@ -7141,6 +7163,10 @@ nutriment_amt = 5 bitesize = 2 +/obj/item/reagent_containers/food/snacks/triton/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 10) + /obj/item/reagent_containers/food/snacks/saturn name = "\improper Saturn-Os" icon = 'icons/obj/food_snacks.dmi' @@ -7154,6 +7180,10 @@ nutriment_amt = 5 bitesize = 2 +/obj/item/reagent_containers/food/snacks/saturn/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) + /obj/item/reagent_containers/food/snacks/jupiter name = "\improper Jove Gello" icon = 'icons/obj/food_snacks.dmi' @@ -7271,6 +7301,10 @@ nutriment_amt = 4 bitesize = 1 +/obj/item/reagent_containers/food/snacks/hakarl/Initialize(mapload) + .=..() + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) + ////////////////////weeb_vend (Nippon-tan!)//////////////////////////////////////////////////// /obj/item/reagent_containers/food/snacks/ricecake @@ -7508,6 +7542,7 @@ /obj/item/reagent_containers/food/snacks/canned/caviar/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_SEAFOOD, 5) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/canned/caviar/true name = "\improper Classic Terran Caviar" @@ -7525,6 +7560,7 @@ . = ..() reagents.add_reagent(REAGENT_ID_SEAFOOD, 4) reagents.add_reagent(REAGENT_ID_CARPOTOXIN, 1) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/canned/maps name = "\improper MAPS" diff --git a/code/modules/food/food/snacks/meat.dm b/code/modules/food/food/snacks/meat.dm index 5cfa50a6e2..231d48f3b4 100644 --- a/code/modules/food/food/snacks/meat.dm +++ b/code/modules/food/food/snacks/meat.dm @@ -83,6 +83,7 @@ /obj/item/reagent_containers/food/snacks/hugemushroomslice/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PSILOCYBIN, 3) + reagents.add_reagent(REAGENT_ID_FUNGI, 1) /obj/item/reagent_containers/food/snacks/tomatomeat name = "tomato slice" diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index d37bb4e7e6..497d9d7f45 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -403,6 +403,7 @@ bitesize = 3 reagents.add_reagent(REAGENT_ID_CAPSAICIN, 4) reagents.add_reagent(REAGENT_ID_PROTEIN, 4) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) /obj/item/reagent_containers/food/snacks/sharkmeatcubes name = "shark cubes" @@ -564,6 +565,7 @@ /obj/item/reagent_containers/food/snacks/nachos/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_NUTRIMENT, 1) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) bitesize = 1 /obj/item/reagent_containers/food/snacks/cheesenachos @@ -577,6 +579,7 @@ . = ..() reagents.add_reagent(REAGENT_ID_NUTRIMENT, 5) reagents.add_reagent(REAGENT_ID_PROTEIN, 2) + reagents.add_reagent(REAGENT_ID_SODIUMCHLORIDE, 1) bitesize = 2 /obj/item/reagent_containers/food/snacks/milosoup diff --git a/code/modules/hydroponics/seedtypes/mushrooms.dm b/code/modules/hydroponics/seedtypes/mushrooms.dm index 19d738c3c0..bbdfb6a4ca 100644 --- a/code/modules/hydroponics/seedtypes/mushrooms.dm +++ b/code/modules/hydroponics/seedtypes/mushrooms.dm @@ -5,7 +5,7 @@ seed_noun = "spores" display_name = "chanterelle mushrooms" mutants = list(PLANT_REISHI,PLANT_AMANITA,PLANT_PLUMPHELMET) - chems = list(REAGENT_ID_NUTRIMENT = list(1,25)) + chems = list(REAGENT_ID_NUTRIMENT = list(1,20), REAGENT_ID_FUNGI = list(1,4)) splat_type = /obj/effect/plant kitchen_tag = PLANT_MUSHROOMS @@ -44,7 +44,7 @@ seed_name = "plump helmet" display_name = "plump helmet mushrooms" mutants = list("walkingmushroom",PLANT_TOWERCAP) - chems = list(REAGENT_ID_NUTRIMENT = list(2,10)) + chems = list(REAGENT_ID_NUTRIMENT = list(5,10), REAGENT_ID_FUNGI = 1) kitchen_tag = PLANT_PLUMPHELMET /datum/seed/mushroom/plump/New() @@ -62,7 +62,7 @@ seed_name = PLANT_REISHI display_name = PLANT_REISHI mutants = list(PLANT_LIBERTYCAP,PLANT_GLOWSHROOM) - chems = list(REAGENT_ID_NUTRIMENT = list(1,50), REAGENT_ID_PSILOCYBIN = list(3,5)) + chems = list(REAGENT_ID_NUTRIMENT = list(1,50), REAGENT_ID_PSILOCYBIN = list(3,5), REAGENT_ID_FUNGI = list(1,5)) /datum/seed/mushroom/hallucinogenic/New() ..() @@ -80,7 +80,7 @@ seed_name = "liberty cap" display_name = "liberty cap mushrooms" mutants = null - chems = list(REAGENT_ID_NUTRIMENT = list(1), REAGENT_ID_STOXIN = list(3,3), REAGENT_ID_BLISS = list(1,25)) + chems = list(REAGENT_ID_NUTRIMENT = list(1), REAGENT_ID_STOXIN = list(3,3), REAGENT_ID_BLISS = list(1,12), REAGENT_ID_FUNGI = list(1,12)) /datum/seed/mushroom/hallucinogenic/strong/New() ..() @@ -96,7 +96,7 @@ seed_name = "fly amanita" display_name = "fly amanita mushrooms" mutants = list(PLANT_DESTROYINGANGEL,PLANT_PLASTIC) - chems = list(REAGENT_ID_NUTRIMENT = list(1), REAGENT_ID_AMATOXIN = list(3,3), REAGENT_ID_PSILOCYBIN = list(1,25)) + chems = list(REAGENT_ID_NUTRIMENT = list(1), REAGENT_ID_AMATOXIN = list(3,3), REAGENT_ID_PSILOCYBIN = list(1,25), REAGENT_ID_FUNGI = list(1,4)) /datum/seed/mushroom/poison/New() ..() @@ -114,7 +114,7 @@ seed_name = "destroying angel" display_name = "destroying angel mushrooms" mutants = null - chems = list(REAGENT_ID_NUTRIMENT = list(1,50), REAGENT_ID_AMATOXIN = list(13,3), REAGENT_ID_PSILOCYBIN = list(1,25)) + chems = list(REAGENT_ID_NUTRIMENT = list(1,50), REAGENT_ID_AMATOXIN = list(13,3), REAGENT_ID_PSILOCYBIN = list(1,25), REAGENT_ID_FUNGI = list(1,2)) /datum/seed/mushroom/poison/death/New() ..() @@ -146,7 +146,7 @@ name = PLANT_REDCAP seed_name = "red cap" display_name = "red caps" - chems = list(REAGENT_ID_WOODPULP = list(10,1), REAGENT_ID_TANNIN = list(1,10)) + chems = list(REAGENT_ID_WOODPULP = list(1,10), REAGENT_ID_TANNIN = list(1,10), REAGENT_ID_FUNGI = list(1,2)) mutants = null has_item_product = null @@ -159,7 +159,7 @@ seed_name = PLANT_GLOWSHROOM display_name = "glowshrooms" mutants = null - chems = list(REAGENT_ID_RADIUM = list(1,20)) + chems = list(REAGENT_ID_RADIUM = list(1,20), REAGENT_ID_FUNGI = list(1,5)) /datum/seed/mushroom/glowshroom/New() ..() @@ -179,7 +179,7 @@ seed_name = "plastellium" display_name = "plastellium" mutants = null - chems = list(REAGENT_ID_PLASTICIDE = list(1,10)) + chems = list(REAGENT_ID_PLASTICIDE = list(1,10), REAGENT_ID_FUNGI = list(2,6)) /datum/seed/mushroom/plastic/New() ..() @@ -197,7 +197,7 @@ seed_name = "corpellian" display_name = "corpellian" mutants = null - chems = list(REAGENT_ID_SEROTROTIUM = list(5,10), REAGENT_ID_MOLD = list(1,10)) + chems = list(REAGENT_ID_SEROTROTIUM = list(5,10), REAGENT_ID_MOLD = list(1,10), REAGENT_ID_FUNGI = list(1,4)) /datum/seed/mushroom/spore/New() ..() diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index e78a24ed2e..f674f67ff9 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -130,7 +130,7 @@ return (copytext(message, length(message)) == "!") ? 2 : 1 /datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) - log_say("(HIVE) [message]", speaker) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(log_say), "(HIVE) [message]", speaker) //CHOMP EDIT - TODO: FIX ME (selis logging pr) add_verb(speaker, /mob/proc/adjust_hive_range) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index a8abcb8ccf..b7b9a65ceb 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -18,8 +18,6 @@ for(var/obj/item/organ/external/E in src.organs) E.droplimb(0,DROPLIMB_EDGE,1) - sleep(1) - for(var/obj/item/I in src) drop_from_inventory(I) I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)), rand(1,3), round(30/I.w_class)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ae43b23392..a8b965589e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -65,7 +65,7 @@ handle_pain() - handle_allergens() + SEND_SIGNAL(src,COMSIG_HANDLE_ALLERGENS, chem_effects[CE_ALLERGEN]) handle_medical_side_effects() @@ -830,35 +830,6 @@ playsound_local(get_turf(src), suit_exhale_sound, 100, pressure_affected = FALSE, volume_channel = VOLUME_CHANNEL_AMBIENCE) -/mob/living/carbon/human/proc/handle_allergens() - if(chem_effects[CE_ALLERGEN]) - //first, multiply the basic species-level value by our allergen effect rating, so consuming multiple seperate allergen typess simultaneously hurts more - var/damage_severity = species.allergen_damage_severity * chem_effects[CE_ALLERGEN] - var/disable_severity = species.allergen_disable_severity * chem_effects[CE_ALLERGEN] - if(species.allergen_reaction & AG_PHYS_DMG) - adjustBruteLoss(damage_severity) - if(species.allergen_reaction & AG_BURN_DMG) - adjustFireLoss(damage_severity) - if(species.allergen_reaction & AG_TOX_DMG) - adjustToxLoss(damage_severity) - if(species.allergen_reaction & AG_OXY_DMG) - adjustOxyLoss(damage_severity) - if(prob(disable_severity/2)) - emote(pick("cough","gasp","choke")) - if(species.allergen_reaction & AG_EMOTE) - if(prob(disable_severity/2)) - emote(pick("pale","shiver","twitch")) - if(species.allergen_reaction & AG_PAIN) - adjustHalLoss(disable_severity) - if(species.allergen_reaction & AG_WEAKEN) - Weaken(disable_severity) - if(species.allergen_reaction & AG_BLURRY) - eye_blurry = max(eye_blurry, disable_severity) - if(species.allergen_reaction & AG_SLEEPY) - drowsyness = max(drowsyness, disable_severity) - if(species.allergen_reaction & AG_CONFUSE) - Confuse(disable_severity/4) - /mob/living/carbon/human/proc/handle_species_components() species.handle_species_components(src) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 52fb338106..1949cda46b 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -802,6 +802,11 @@ if(H.species.has_vibration_sense) H.motiontracker_subscribe() + if(H.species.allergens) + H.AddElement(/datum/element/allergy) + else + H.RemoveElement(/datum/element/allergy) + return new_copy //We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515 diff --git a/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm index de19f509be..8fe25cad52 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm @@ -555,6 +555,20 @@ custom_only = FALSE allergen = ALLERGEN_CHOCOLATE +/datum/trait/neutral/allergy/pollen + name = "Allergy: Pollen" + desc = "You're highly allergic to pollen and many plants. It's probably best to avoid hydroponics in general. Be sure to configure your allergic reactions, otherwise you will die touching grass. NB: By taking this trait, you acknowledge there is a significant risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = ALLERGEN_POLLEN // Gee billy... + added_component_path = /datum/component/pollen_disability // Why does mom let you have two things? + +/datum/trait/neutral/allergy/salt + name = "Allergy: Salt" + desc = "You're highly allergic to sodium chloride aka salt. NB: By taking this trait, you acknowledge there is a significant risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + allergen = ALLERGEN_SALT + /datum/trait/neutral/allergy_reaction name = "Allergy Reaction: Disable Toxicity" desc = "Take this trait to disable the toxic damage effect of being exposed to one of your allergens. Combine with the Disable Suffocation trait to have purely nonlethal reactions." @@ -622,6 +636,28 @@ custom_only = FALSE reaction = AG_CONFUSE +/datum/trait/neutral/allergy_reaction/gibbing + name = "Allergy Reaction: Gibbing" + desc = "When exposed to one of your allergens, you will explode, god help you. Does nothing if you have no allergens." + cost = 0 + custom_only = FALSE + reaction = AG_GIBBING + hidden = TRUE // Disabled on virgo for obvious reasons + +/datum/trait/neutral/allergy_reaction/sneeze + name = "Allergy Reaction: Sneezing" + desc = "When exposed to one of your allergens, you will begin sneezing harmlessly. Does nothing if you have no allergens." + cost = 0 + custom_only = FALSE + reaction = AG_SNEEZE + +/datum/trait/neutral/allergy_reaction/cough + name = "Allergy Reaction: Coughing" + desc = "When exposed to one of your allergens, you will begin coughing, potentially dropping items. Does nothing if you have no allergens." + cost = 0 + custom_only = FALSE + reaction = AG_COUGH + /datum/trait/neutral/allergen_reduced_effect name = "Allergen Reaction: Reduced Intensity" desc = "This trait drastically reduces the effects of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to special reactions (such as unathi drowsiness from sugars)." diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 2ff5a4fda0..fccbc8791d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -165,22 +165,22 @@ var/list/channel_to_radio_key = list() if(stat == DEAD && !forbid_seeing_deadchat) return say_dead(message) return - //VOREStation Addition Start if(forced_psay) psay(message) return - if(autowhisper) - whispering = 1 - //VOREStation Addition End - //Parse the mode - var/message_mode = parse_message_mode(message, "headset") - //Maybe they are using say/whisper to do a quick emote, so do those switch(copytext(message, 1, 2)) if("*") return emote(copytext(message, 2)) if("^") return custom_emote(VISIBLE_MESSAGE, copytext(message, 2)) + direct_say(message, speaking, whispering) + +/mob/living/direct_say(var/message, var/datum/language/speaking = null, var/whispering = 0) + // Handle automatic whispering mode + if(autowhisper) + whispering = 1 //Parse the radio code and consume it + var/message_mode = parse_message_mode(message, "headset") if(message_mode) if(message_mode == "headset") message = copytext(message, 2) //it would be really nice if the parse procs could do this for us. @@ -301,7 +301,7 @@ var/list/channel_to_radio_key = list() message_range = 1 sound_vol *= 0.5 - //VOREStation edit - allows for custom say verbs, overriding all other say-verb types- e.g. "says loudly" instead of "shouts" + //allows for custom say verbs, overriding all other say-verb types- e.g. "says loudly" instead of "shouts" //You'll still stammer if injured or slur if drunk, but it won't have those specific words var/ending = copytext(message, length(message)) @@ -313,12 +313,12 @@ var/list/channel_to_radio_key = list() verb = "[custom_ask]" else if(custom_say) verb = "[custom_say]" - //VOREStation edit ends //Handle nonverbal languages here for(var/datum/multilingual_say_piece/S in message_pieces) if((S.speaking.flags & NONVERBAL) || (S.speaking.flags & INAUDIBLE)) - custom_emote(VISIBLE_MESSAGE, "[pick(S.speaking.signlang_verb)].") + var/sign_action = "[pick(S.speaking.signlang_verb)]." + automatic_custom_emote(VISIBLE_MESSAGE,sign_action) do_sound = FALSE //These will contain the main receivers of the message @@ -358,10 +358,8 @@ var/list/channel_to_radio_key = list() var/image/speech_bubble = generate_speech_bubble(src, "[speech_type][speech_bubble_test]") var/sb_alpha = 255 var/atom/loc_before_turf = src - //VOREStation Add if(isbelly(loc)) speech_bubble.pixel_y = -13 //teehee - //VOREStation Add End while(loc_before_turf && !isturf(loc_before_turf.loc)) loc_before_turf = loc_before_turf.loc sb_alpha -= 50 @@ -376,12 +374,11 @@ var/list/channel_to_radio_key = list() spawn(0) //Using spawns to queue all the messages for AFTER this proc is done, and stop runtimes if(M && src) //If we still exist, when the spawn processes - //VOREStation Add - Ghosts don't hear whispers + // Ghosts don't hear whispers if(whispering && isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \ (!(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || (isbelly(M.loc) && src == M.loc:owner)) && !check_rights_for(M.client, R_HOLDER)))) M.show_message(span_game(span_say(span_name(src.name) + " [w_not_heard].")), 2) return - //VOREStation Add End var/dst = get_dist(get_turf(M),get_turf(src)) var/runechat_enabled = M.client?.prefs?.read_preference(/datum/preference/toggle/runechat_mob) @@ -427,12 +424,12 @@ var/list/channel_to_radio_key = list() blooploop(message, extrarange = -6, volume = 25, sound_preference = /datum/preference/toggle/whisper_sounds) // playsound(T, pick(voice_sounds_list), 25, TRUE, extrarange = -6, falloff = 1 , is_global = TRUE, frequency = voice_freq, ignore_walls = TRUE, preference = /datum/preference/toggle/whisper_sounds) //CHOMPEdit - ignore_walls = TRUE - log_whisper(message, src) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(log_whisper), message, src) //CHOMP EDIT - TODO: FIX ME (selis logging pr) else if(do_sound && message) blooploop(message, volume = 75) // playsound(T, pick(voice_sounds_list), 75, TRUE, falloff = 1 , is_global = TRUE, frequency = voice_freq, ignore_walls = TRUE, preference = /datum/preference/toggle/say_sounds) //CHOMPEdit - ignore_walls = TRUE - log_say(message, src) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(log_say), message, src) //CHOMP EDIT - TODO: FIX ME (selis logging pr) return 1 /*************************************************************************/ diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index ed3cc1c608..a3b7c498be 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -1,6 +1,11 @@ /mob/proc/say(var/message, var/datum/language/speaking = null, var/whispering = 0) return +// MUST BE NON-BLOCKING, signals can call this +/mob/proc/direct_say(var/message, var/datum/language/speaking = null, var/whispering = 0) + SHOULD_NOT_SLEEP(TRUE) + return + /mob/verb/whisper(message as text) set name = "Whisper" set hidden = 1 diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index c7aa37ef9e..2b5504d273 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -309,6 +309,13 @@ taste_description = "tofu" allergen_type = ALLERGEN_BEANS //Made from soy beans +/datum/reagent/nutriment/protein/fungi + name = REAGENT_FUNGI + id = REAGENT_ID_FUNGI + taste_description = "some sort of mushroom" + color = "#979797" + allergen_type = ALLERGEN_FUNGI + /datum/reagent/nutriment/protein/seafood name = REAGENT_SEAFOOD id = REAGENT_ID_SEAFOOD @@ -514,7 +521,7 @@ reagent_state = LIQUID nutriment_factor = 2 color = "#792300" - allergen_type = ALLERGEN_BEANS //Soy (beans) + allergen_type = ALLERGEN_BEANS | ALLERGEN_SALT //Soy (beans) cup_prefix = "umami" /datum/reagent/nutriment/vinegar @@ -683,6 +690,7 @@ color = "#FFFFFF" overdose = REAGENTS_OVERDOSE ingest_met = REM + allergen_type = ALLERGEN_SALT cup_prefix = "salty" supply_conversion_value = REFINERYEXPORT_VALUE_COMMON industrial_use = REFINERYEXPORT_REASON_FOOD @@ -4038,7 +4046,7 @@ glass_name = REAGENT_ID_MARGARITA glass_desc = "On the rocks with salt on the rim. Arriba~!" - allergen_type = ALLERGEN_FRUIT //Made from lime juice(fruit) + allergen_type = ALLERGEN_FRUIT | ALLERGEN_SALT //Made from lime juice(fruit) /datum/reagent/ethanol/mead name = REAGENT_MEAD @@ -4109,6 +4117,8 @@ glass_name = "red mead" glass_desc = "A true Viking's beverage, though its color is strange." + allergen_type = ALLERGEN_SALT + /datum/reagent/ethanol/sbiten name = REAGENT_SBITEN id = REAGENT_ID_SBITEN diff --git a/vorestation.dme b/vorestation.dme index 41ccdf4de8..3ecd5eb2b5 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -160,6 +160,7 @@ #include "code\__defines\soulcatcher.dm" #include "code\__defines\sound.dm" #include "code\__defines\span.dm" +#include "code\__defines\species_flags.dm" #include "code\__defines\species_languages.dm" #include "code\__defines\species_languages_vr.dm" #include "code\__defines\species_languages_YW.dm" @@ -619,6 +620,7 @@ #include "code\datums\components\disabilities\epilepsy.dm" #include "code\datums\components\disabilities\gibbing.dm" #include "code\datums\components\disabilities\nervousness.dm" +#include "code\datums\components\disabilities\pollen.dm" #include "code\datums\components\disabilities\rotting.dm" #include "code\datums\components\disabilities\tourettes.dm" #include "code\datums\components\materials\material_container.dm" @@ -697,6 +699,7 @@ #include "code\datums\diseases\advance\symptoms\weight.dm" #include "code\datums\diseases\advance\symptoms\youth.dm" #include "code\datums\elements\_element.dm" +#include "code\datums\elements\allergy.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\climbable.dm" #include "code\datums\elements\conflict_checking.dm"