[MIRROR] Allergic Reaction Element (And direct_say proc) (#11359)

Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
Co-authored-by: C.L. <killer65311@gmail.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-08-09 11:18:49 -07:00
committed by GitHub
parent dd89859bba
commit f94efe06a4
30 changed files with 507 additions and 244 deletions

View File

@@ -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"

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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))

View File

@@ -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))

View File

@@ -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))

View File

@@ -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
. = ..()

View File

@@ -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))

View File

@@ -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)

View File

@@ -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()

View File

@@ -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.

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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()
..()

View File

@@ -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)

View File

@@ -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))

View File

@@ -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)

View File

@@ -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

View File

@@ -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)."

View File

@@ -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
/*************************************************************************/

View File

@@ -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

View File

@@ -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