// Spread flags. Determines what slots are taken into account during a permeability scan. #define SPREAD_FACE 1 #define SPREAD_BODY 2 #define SPREAD_HANDS 4 #define SPREAD_AIR 8 datum/pathogeneffects var/name var/desc var/infect_type = 0 // A symptom with a lower permeability score needs more protective gear to evade. var/permeability_score = 20 var/spread = SPREAD_FACE | SPREAD_BODY | SPREAD_HANDS | SPREAD_AIR var/rarity = RARITY_ABSTRACT var/infect_message = null // This is a list of mutual exclusive symptom TYPES. // If this contains any symptoms, none of these symptoms will be picked upon mutation or initial raffle. // Mutexes cut the ENTIRE object tree - for example, if symptoms a/b, a/c and a/d all exist, then mutexing // symptom a will also mutex b, c and d. var/list/mutex = list() // A symptom might not always infect everyone around. This is a flat probability: 0 means never infect to 1 means always infect. This is checked PER MOB, not per infect call. var/infection_coefficient = 1 // disease_act(mob, datum/pathogen) : void // This is the center of pathogen symptoms. // On every Life() tick, this will be called for every symptom attached to the pathogen. Most pathogens should express their malevolence here, unless they are specifically tailored // to only work on events like human interaction or external effects. A symptom therefore should override this proc. // disease_act is also responsible for handling the symptom's ability to suppress the pathogen. Check the documentation on suppression in pathogen.dm. // OVERRIDE: A subclass (direct or otherwise) is expected to override this. proc/disease_act(var/mob/M as mob, var/datum/pathogen/origin) // infect(mob, datum/pathogen) : void // This is the proc that will handle infection. Infection does not occur on every single tick, as previously. Instead symptoms will independently decide when it would be appropriate to // infect mobs nearby. For example, a coughing symptom shouldn't infect everyone everywhere, but as soon as the affected person coughs they should infect everyone nearby. // The outcome of this call is mostly decided by infect_type and infection_coefficient. // It must be called at least SOMEWHERE for infectious diseases. // OVERRIDE: Generally, you do not need to override this. proc/infect(var/mob/M as mob, var/datum/pathogen/origin) for (var/mob/I in view(infect_type, M.loc)) if (I != M && ((isturf(I.loc) && isturf(M.loc) && can_line(M, I, 5)) || I.loc == M.loc)) var/permeability = get_permeability_score(I) if (permeability < src.permeability_score) continue if (prob(permeability * infection_coefficient)) if (I.infected(origin)) if (infect_message) I.show_message(infect_message) logTheThing("pathology", M, I, "infects %target% with [origin.name] due to symptom [name].") // infect_direct(mob, datum/pathogen) : void // This is the proc that handles direct transmission of the pathogen from one mob to another. This should be called in particular infection scenarios. For example, a sweating person // gets his bodily fluids onto another when they directly disarm, punch, or grab a person. // For INFECT_TOUCH diseases this is automatically called on a successful disarm, punch or grab. When overriding any of these events, use ..() to keep this behaviour. // OVERRIDE: Generally, you do not need to override this. proc/infect_direct(var/mob/target as mob, var/datum/pathogen/origin, contact_type = "touch") var/permeability = get_permeability_score(target) if (permeability < src.permeability_score) return 0 if (prob(permeability * infection_coefficient)) if (target.infected(origin)) if (infect_message) target.show_message(infect_message) logTheThing("pathology", origin.infected, target, "infects %target% with [origin.name] due to symptom [name] through direct contact ([contact_type]).") return 1 proc/onadd(var/datum/pathogen/origin) return // ==== // Events from this point on. Their exact behaviour is documented in pathogen.dm. Please do not add any event definitions outside this block. // ondisarm(mob, mob, boolean, datum/pathogen) : float // OVERRIDE: Overriding this is situational. ..() is expected to be called. proc/ondisarm(var/mob/M as mob, var/mob/V as mob, isPushDown, var/datum/pathogen/origin) if (infect_type == INFECT_TOUCH) infect_direct(V, origin, "disarm") return 1 // onpunch(mob, mob, string, datum/pathogen) : float // OVERRIDE: Overriding this is situational. ..() is expected to be called. proc/onpunch(var/mob/M as mob, var/mob/V as mob, zone, var/datum/pathogen/origin) if (infect_type == INFECT_TOUCH) infect_direct(V, origin, "punching") return 1 // onpunched(mob, mob, string, datum/pathogen) : float // OVERRIDE: Overriding this is situational. ..() is expected to be called. proc/onpunched(var/mob/M as mob, var/mob/A as mob, zone, var/datum/pathogen/origin) if (infect_type == INFECT_TOUCH) infect_direct(A, origin, "being punched") return 1 // onshocked(mob, mob, datum/shockparam, datum/pathogen) : datum/shockparam // OVERRIDE: Overriding this is situational. proc/onshocked(var/mob/M as mob, var/datum/shockparam/ret, var/datum/pathogen/origin) return ret // ongrab(mob, mob, datum/pathogen) : void // TODO: Make this a veto event. // OVERRIDE: Overriding this is situational. ..() is expected to be called. proc/ongrab(var/mob/M as mob, var/mob/V as mob, var/datum/pathogen/origin) if (infect_type == INFECT_TOUCH) infect_direct(V, origin, "grab") return // onsay(mob, string, datum/pathogen) : string // OVERRIDE: Overriding this is situational. proc/onsay(var/mob/M as mob, message, var/datum/pathogen/origin) return message // onemote(mob, string, datum/pathogen) : string // OVERRIDE: Overriding this is situational. proc/onemote(var/mob/target, act, var/datum/pathogen/P) return 1 // End of events: please do not add any event definitions outside this block. // ==== // may_react_to() : string | null // A set of features that you can observe through a microscope and what it might suggest. // This will be used to NARROW DOWN what chemicals the pathogen might react to, so that you only need to try a finite set of reagents to determine exactly what symptoms the pathogen has. // As this is for narrowing down only, it is encouraged to include false positives. // Omitting some reagents from this is also okay - if, say, a family of similar symptoms react to a single reagent in a similar way but each one of them also reacts to (an)other reagent(s) // in fundamentally different ways, the latter reagent(s) may be omitted. In the end, this all is up to you though. // If the symptom provides no hints, null should be returned. // // DO RECYCLING! // Hints SHOULD be reused moderately often, in order to keep experienced pathologists from immediately identifying the pathogen without testing. // // Examples of a return value: // Non-hint: "There is a fever-inducing gland on the pathogen." // Trivial, common symptoms should have this for easy identifiability. Preferrably matching on a few of them, so it takes some work to figure out which it is. // Outright tells: "The pathogen appears to collect toxin molecules." // - this is very particular, no false positives. Only do this if the hinted reagent does not exactly reveal what the symptom is. // Concrete hints: "The pathogen appears to have glands which indicate that they might be receptive to napalm, infernite and cryostylane." // - this is fairly particular. It is fine but to make it more interesting, most of the symptoms should have a bit more obscure hints. // Slightly obscure hints: "The pathogen's behaviour patterns appear to heavily depend on external temperature." // - meaning anything that might be hot or cold. This hints at about 3 or 4 different reagents without particularly naming them. This is what we should be mostly aiming for. // Note that this does not necessarily have to mean multiple different reagents. Anything in fits in this category as long as it's not general enough to point at multiple // chemicals, but requires a good knowledge of chemistry to work out. For example, "The pathogen's structure indicates that it may react to chemicals known to induce heart disease." // is clearly initro for someone with chems knowledge, but still is an excellent hint as it's not an outright tell and it does not even name the chemical that should be used. // More obscure hints: "The pathogen appears to be receptive to compounds with a single hydroxyl group." // - meaning anything that contains or derives from alcohol. This hints at a large family of reagents (all booze and cocktails). This is also fine as long as it's not a riddle // and it is particularly scientific. // Very obscure "hint": "The pathogen reacts with chemicals." // - well fuck you too, that's very useful, microscope. Do not do this. // OVERRIDE: A subclass is expected to override this. proc/may_react_to() return null // react_to(string, int) : string | null // How a pathogen with this symptom reacts to a reagent being introduced to it. // This is: // (1) Not continuous - it is only called once. // (2) Not active - it is not called when the pathogen is acting in a mob, only when research is being done on a pathogen culture. // It must return null if it does not react to the reagent, or text event of an event that is happening (eg. "The pathogens are attempting to escape the space yeti!") if it reacts. // The zoom parameter determines the zoom level at which the pathogen is being viewed. The possible values are 0 and 1. // Ideally what is visible at zoom level 0: a behaviour pattern for the pathogen. // at zoom level 1: the reagent's effect on arbitrary imaginary scientific sounding (hexamelone gland, vascular protomembrane) appendage of a pathogen. // At least one of the zoom levels should be a good enough hint at what the symptom might do. // NOTE: Conforming with the new reagent system, R is now a reagent ID, not a reagent instance. // OVERRIDE: A subclass is expected to override this. proc/react_to(var/R, var/zoom) return null // Creates the permeability score of a mob. proc/get_permeability_score(var/mob/living/carbon/human/H) if (!src.spread) return 0 if (!istype(H)) return 0 var/divisor = 0 var/acc_score = 0 if (spread & SPREAD_AIR) divisor++ if (!H.internal) acc_score += 100 if (spread & SPREAD_FACE) divisor += 2 if (!H.wear_mask) acc_score += 100 else acc_score += 100 * H.wear_mask.permeability_coefficient if (!H.head) acc_score += 100 else acc_score += 100 * H.head.permeability_coefficient if (spread & SPREAD_BODY) divisor++ if (!H.wear_suit) acc_score += 100 else acc_score += 100 * H.wear_suit.permeability_coefficient if (spread & SPREAD_HANDS) divisor++ if (!H.gloves) acc_score += 100 else acc_score += 100 * H.gloves.permeability_coefficient if (divisor) return acc_score / divisor else return 0 datum/pathogeneffects/malevolent name = "Malevolent" rarity = RARITY_ABSTRACT // The following lines are the probably undocumented (well at least my part - Marq) hell of the default symptoms. datum/pathogeneffects/malevolent/coughing name = "Coughing" desc = "Violent coughing occasionally paralyzes the infected." infect_type = INFECT_AREA rarity = RARITY_COMMON permeability_score = 15 spread = SPREAD_FACE | SPREAD_HANDS | SPREAD_AIR disease_act(var/mob/M as mob, var/datum/pathogen/origin) switch (origin.stage) if (1) if (prob(3)) if (origin.symptomatic) M.show_message("You cough.") infect(M, origin) if (2) if (prob(5)) if (origin.symptomatic) M.visible_message("[M] coughs!", "You cough.", "You hear someone coughing.") M.drop_item() infect(M, origin) if (3) if (prob(7)) if (origin.symptomatic) M.visible_message("[M] coughs violently!", "You cough violently!", "You hear someone cough violently!") M.stunned += 1 infect(M, origin) if (4) if (prob(10)) if (origin.symptomatic) M.visible_message("[M] coughs violently!", "You cough violently!", "You hear someone cough violently!") M.stunned += 2 infect(M, origin) if (5) if (prob(10)) if (origin.symptomatic) M.visible_message("[M] coughs violently!", "You cough violently!", "You hear someone cough violently!") M.stunned += 3 infect(M, origin) may_react_to() return "The pathogen appears to generate a high amount of fluids." datum/pathogeneffects/malevolent/indigestion name = "Indigestion" desc = "A bad case of indigestion which occasionally cramps the infected." rarity = RARITY_VERY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1 to 3) if (prob(5)) M.take_toxin_damage(origin.stage - 2) M.show_message("Your stomach hurts.") M.updatehealth() if (4 to 5) if (prob(8)) M.take_toxin_damage(2) M.show_message("Your stomach hurts.") M.updatehealth() if (prob(15)) M.weakened += 1 react_to(var/R, var/zoom) if (R == "saline") if (zoom) return "One of the glands of the pathogen seems to shut down in the presence of the solution." may_react_to() return "The pathogen appears to react to hydrating agents." datum/pathogeneffects/malevolent/muscleache name = "Muscle Ache" desc = "The infected feels a slight, constant aching of muscles." rarity = RARITY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1 to 3) if (prob(5)) M.show_message("Your muscles ache.") M.updatehealth() if (4 to 5) if (prob(8)) M.show_message("Your muscles ache.") M.updatehealth() if (prob(15)) M.stunned += 1 react_to(var/R, var/zoom) if (R == "saline") if (zoom) return "One of the glands of the pathogen seems to shut down in the presence of the solution." may_react_to() return "The pathogen appears to react to hydrating agents." datum/pathogeneffects/malevolent/sneezing name = "Sneezing" desc = "The infected sneezes frequently." infect_type = INFECT_AREA_LARGE rarity = RARITY_COMMON permeability_score = 25 spread = SPREAD_FACE | SPREAD_HANDS | SPREAD_AIR | SPREAD_BODY infection_coefficient = 2 disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) M.visible_message("[M] sneezes!", "You sneeze.", "You hear someone sneezing.") if (prob(3)) M.drop_item() infect(M, origin) if (2) if (prob(12)) M.visible_message("[M] sneezes!", "You sneeze.", "You hear someone sneezing.") if (prob(5)) M.drop_item() infect(M, origin) if (3) if (prob(15)) M.visible_message("[M] sneezes!", "You sneeze.", "You hear someone sneezing.") if (prob(7)) M.drop_item() infect(M, origin) if (4) if (prob(20)) M.visible_message("[M] sneezes!", "You sneeze.", "You hear someone sneezing.") if (prob(14)) M.drop_item() infect(M, origin) if (5) if (prob(20)) M.visible_message("[M] sneezes!", "You sneeze.", "You hear someone sneezing.") if (prob(25)) M.drop_item() infect(M, origin) may_react_to() return "The pathogen appears to generate a high amount of fluids." react_to(var/R, var/zoom) if (R == "pepper") return "The pathogen violently discharges fluids when coming in contact with pepper." datum/pathogeneffects/malevolent/gasping name = "Gasping" desc = "The infected has trouble breathing.." infect_type = INFECT_NONE rarity = RARITY_VERY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(3)) M.emote("gasp") if (2) if (prob(5)) M.emote("gasp") M.take_oxygen_deprivation(1) if (3) if (prob(7)) M.emote("gasp") M.take_oxygen_deprivation(1) if (4) if (prob(10)) M.emote("gasp") M.take_oxygen_deprivation(1) if (5) if (prob(10)) M.emote("gasp") M.take_oxygen_deprivation(1) M.losebreath += 1 may_react_to() return "The pathogen appears to create bubbles of vacuum around its affected area." datum/pathogeneffects/malevolent/moaning name = "Moaning" desc = "This is literally pointless." infect_type = INFECT_NONE rarity = RARITY_VERY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) M:emote("moan") if (2) if (prob(12)) M:emote("moan") if (3) if (prob(14)) M:emote("moan") if (4) if (prob(16)) M:emote("moan") if (5) if (prob(18)) M:emote("moan") may_react_to() return "The pathogen appears to be rather displeased." datum/pathogeneffects/malevolent/hiccups name = "Hiccups" desc = "This is literally pointless." infect_type = INFECT_NONE rarity = RARITY_VERY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) M:emote("hiccup") if (2) if (prob(12)) M:emote("hiccup") if (3) if (prob(14)) M:emote("hiccup") if (4) if (prob(16)) M:emote("hiccup") if (5) if (prob(18)) M:emote("hiccup") may_react_to() return "The pathogen appears to be violently... hiccuping?" datum/pathogeneffects/malevolent/shivering name = "Shivering" desc = "This is literally pointless." infect_type = INFECT_NONE rarity = RARITY_VERY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) M:emote("shiver") if (2) if (prob(12)) M:emote("shiver") if (3) if (prob(14)) M:emote("shiver") if (4) if (prob(16)) M:emote("shiver") if (5) if (prob(18)) M:emote("shiver") may_react_to() return "The pathogen appears to be shivering." datum/pathogeneffects/malevolent/deathgasping name = "Deathgasping" desc = "This is literally pointless." infect_type = INFECT_NONE rarity = RARITY_UNCOMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) M:emote("deathgasp") if (2) if (prob(12)) M:emote("deathgasp") if (3) if (prob(14)) M:emote("deathgasp") if (4) if (prob(16)) M:emote("deathgasp") if (5) if (prob(18)) M:emote("deathgasp") may_react_to() return "The pathogen appears to be.. sort of dead?" datum/pathogeneffects/malevolent/sweating name = "Sweating" desc = "The infected person sweats like a fucking pig." infect_type = INFECT_TOUCH rarity = RARITY_VERY_COMMON permeability_score = 25 spread = SPREAD_HANDS | SPREAD_BODY infection_coefficient = 1.5 disease_act(var/mob/M as mob, var/datum/pathogen/origin) switch (origin.stage) if (1) if (prob(5) && origin.symptomatic) M.show_message("You feel a bit warm.") if (prob(25)) infect(M, origin) if (2) if (prob(5) && origin.symptomatic) M.show_message("You feel rather warm.") if (prob(50)) infect(M, origin) if (3) if (prob(5) && origin.symptomatic) M.show_message("You're sweating heavily.") if (prob(75)) infect(M, origin) if (4) if (prob(5) && origin.symptomatic) M.show_message("You're soaked in your own sweat.") if (prob(85)) infect(M, origin) if (5) if (prob(5) && origin.symptomatic) M.show_message("You're soaked in your own sweat.") if (prob(95)) infect(M, origin) may_react_to() return "The pathogen appears to generate a high amount of fluids." react_to(var/R, zoom) if (R == "cryostylane") return "The cold substance appears to affect the fluid generation of the pathogen." datum/pathogeneffects/malevolent/disorientation name = "Disorientation" desc = "The infected occasionally gets disoriented." infect_type = INFECT_NONE rarity = RARITY_UNCOMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) boutput(M, "You feel a bit disoriented.") M.change_misstep_chance(10) if (2) if (prob(12)) boutput(M, "You feel a bit disoriented.") M.change_misstep_chance(10) if (3) if (prob(14)) boutput(M, "You feel a bit disoriented.") M.change_misstep_chance(20) if (4) if (prob(16)) boutput(M, "You feel rather disoriented.") M.change_misstep_chance(20) if (5) if (prob(18)) boutput(M, "You feel rather disoriented.") M.change_misstep_chance(30) M.take_brain_damage(1) may_react_to() return "A glimpse at the pathogen's exterior indicates it could affect the central nervous system. " react_to(var/R, zoom) if (R == "mannitol") return "The pathogen appears to have trouble cultivating in the areas affected by the mannitol." obj/hallucinated_item icon = null icon_state = null name = "" desc = "" anchored = 1 density = 0 opacity = 0 var/mob/owner = null New(myloc, myowner, var/obj/prototype) ..() myowner = owner name = prototype.name desc = prototype.desc attack_hand(var/mob/M) if (M == owner) M.show_message("[src] slips through your hands!") if (prob(10)) M.show_message("[src] disappears!") qdel(src) datum/pathogeneffects/malevolent/serious_paranoia name = "Serious Paranoia" desc = "The infected is seriously suspicious of others, to the point where they might see others do traitorous things." infect_type = INFECT_NONE rarity = RARITY_RARE var/static/list/hallucinated_images = list(/obj/item/sword, /obj/item/card/emag, /obj/item/cloaking_device) var/static/list/traitor_items = list("cyalume saber", "cryptographic sequencer", "pen", "mini rad-poison crossbow", "cloaking device", "revolver", "butcher's knife", "amplified vuvuzela", "power gloves", "signal jammer") proc/trader(var/mob/M as mob, var/mob/living/O as mob) var/action = "says" if (istype(O, /mob/living/silicon)) action = "states" var/what = pick("I am the traitor.", "I will kill you.", "You will die, [M].") if (prob(50)) boutput(M, "[O] points at [M].") var/point = new /obj/decal/point(get_turf(M)) spawn(30) qdel(point) boutput(M, "[O] [action], \"[what]\"") proc/backpack(var/mob/M, var/mob/living/O) var/item = pick(traitor_items) boutput(M, "[O] has added the [item] to the backpack!") logTheThing("pathology", M, O, "saw a fake message about an %target% adding [item] to their backpacks due to Serious Paranoia symptom.") proc/acidspit(var/mob/M, var/mob/living/O, var/mob/living/O2) if (O2) boutput(M, "[O] spits acid at [O2]!") else boutput(M, "[O] spits acid at you!") logTheThing("pathology", M, O, "saw a fake message about an %target% spitting acid due to Serious Paranoia symptom.") proc/vampirebite(var/mob/M, var/mob/living/O, var/mob/living/O2) if (O2) boutput(M, "[O] bites [O2]!") else boutput(M, "[O] bites you!") logTheThing("pathology", M, O, "saw a fake message about an %target% biting someone due to Serious Paranoia symptom.") proc/floor_in_view(var/mob/M) var/list/ret = list() for (var/turf/simulated/floor/T in view(M, 7)) ret += T return ret proc/hallucinate_item(var/mob/M) var/item = pick(hallucinated_images) var/obj/item_inst = new item() var/list/LF = floor_in_view(M) if(!LF.len) return var/obj/hallucinated_item/H = new /obj/hallucinated_item(pick(floor_in_view(M)), M, item_inst) var/image/hallucinated_image = image(item_inst, H) M << hallucinated_image may_react_to() return "The pathogen appears to be wilder than usual, perhaps sedatives or psychoactive substances might affect its behaviour." react_to(var/R, var/zoom) if (zoom == 1) if (R == "morphine" || R == "sonambutril") return "The pathogens near the sedative appear to be in stasis." if (R == "LSD") return "The pathogen appears to be strangely unaffected by the LSD." disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) for (var/mob/living/O in oview(7, M)) trader(M, O) return if (2) if (prob(12)) for (var/mob/living/O in oview(7, M)) if (prob(50)) trader(M, O) else boutput(M, "[O] has added the suspicious item to the backpack!") return if (3) if (prob(14)) for (var/mob/living/O in oview(7, M)) if (prob(50)) trader(M, O) else backpack(M, O) return if (4) if (prob(16)) var/list/mob/living/OL = list() for (var/mob/living/O in oview(7, M)) OL += O if (OL.len == 0) return var/event = pick(list(1, 2, 3, 4, 5, 6)) switch (event) if (1) trader(M, pick(OL)) if (2) backpack(M, pick(OL)) if (3) var/M1 = pick(OL) OL -= M1 if (OL.len) acidspit(M, M1, pick(OL)) else acidspit(M, M1, null) if (4) var/M1 = pick(OL) OL -= M1 if (OL.len) vampirebite(M, M1, pick(OL)) else vampirebite(M, M1, null) if (5) hallucinate_item(M) if (6) M.flash(30) var/sound/S = sound(pick('sound/effects/Explosion1.ogg','sound/effects/Explosion1.ogg'), repeat=0, wait=0, volume=50) S.frequency = rand(32000, 55000) M << S return if (5) if (prob(18)) var/list/mob/living/OL = list() for (var/mob/living/O in oview(7, M)) OL += O if (OL.len == 0) return var/event = pick(list(1, 2, 3, 4, 5, 6)) switch (event) if (1) trader(M, pick(OL)) if (2) backpack(M, pick(OL)) if (3) var/M1 = pick(OL) OL -= M1 if (OL.len) acidspit(M, M1, pick(OL)) else acidspit(M, M1, null) if (4) var/M1 = pick(OL) OL -= M1 if (OL.len) vampirebite(M, M1, pick(OL)) else vampirebite(M, M1, null) if (5) hallucinate_item(M) if (6) M.flash(30) var/sound/S = sound(pick('sound/effects/Explosion1.ogg','sound/effects/Explosion1.ogg'), repeat=0, wait=0, volume=50) S.frequency = rand(32000, 55000) M << S return datum/pathogeneffects/malevolent/serious_paranoia/mild name = "Paranoia" desc = "The infected is suspicious of others, to the point where they might see others do traitorous things." infect_type = INFECT_NONE rarity = RARITY_UNCOMMON may_react_to() return "The pathogen appears to be wilder than usual, perhaps sedatives or psychoactive substances might affect its behaviour." react_to(var/R, var/zoom) if (zoom == 1) if (R == "morphine" || R == "sonambutril") return "The pathogens near the sedative appear to be in stasis." if (R == "LSD") return "The pathogen appears to be barely affected by the LSD." disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) for (var/mob/living/O in oview(7, M)) trader(M, O) return if (2) if (prob(12)) for (var/mob/living/O in oview(7, M)) if (prob(50)) trader(M, O) else boutput(M, "[O] has added the suspicious item to the backpack!") return if (3) if (prob(14)) for (var/mob/living/O in oview(7, M)) if (prob(50)) trader(M, O) else backpack(M, O) return if (4) if (prob(16)) var/list/mob/living/OL = list() for (var/mob/living/O in oview(7, M)) OL += O if (OL.len == 0) return var/event = pick(list(1, 2, 3)) switch (event) if (1) trader(M, pick(OL)) if (2) backpack(M, pick(OL)) if (3) hallucinate_item(M) return if (5) if (prob(18)) var/list/mob/living/OL = list() for (var/mob/living/O in oview(7, M)) OL += O if (OL.len == 0) return var/event = pick(list(1, 2, 3)) switch (event) if (1) trader(M, pick(OL)) if (2) backpack(M, pick(OL)) if (3) hallucinate_item(M) return datum/pathogeneffects/malevolent/teleportation name = "Teleportation" desc = "The infected exists in a twisted spacetime." infect_type = INFECT_NONE rarity = RARITY_RARE disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(6)) M.show_message("You feel space warping around you.") if (2) if (prob(6)) M.show_message("You feel space warping around you.") if (3) if (prob(8)) M.show_message("You are suddenly zapped elsewhere!") var/turf/T = pick(orange(7, M.loc)) as turf do_teleport(M, T, 1) if (4) if (prob(10)) M.show_message("You are suddenly zapped elsewhere!") var/turf/T = pick(orange(11, M.loc)) as turf do_teleport(M, T, 2) if (5) if (prob(15)) M.show_message("You are suddenly zapped elsewhere!") var/turf/T = pick(orange(15, M.loc)) as turf do_teleport(M, T, 3) may_react_to() return "A glimpse at an irregular nerve center of the pathogen indicates that it might react to psychoactive substances." react_to(var/R, var/zoom) if (R == "LSD") if (zoom) return "Upon closer examination, the pathogens appear to be shifting through space, instantly disappearing and reappearing." else return "The pathogens appear to be rapidly moving around the LSD-filled dish." else return null datum/pathogeneffects/malevolent/gibbing name = "Gibbing" desc = "The infected person may spontaneously gib." infect_type = INFECT_AREA_LARGE rarity = RARITY_VERY_RARE permeability_score = 0 spread = SPREAD_FACE | SPREAD_HANDS | SPREAD_AIR | SPREAD_BODY infection_coefficient = 4 disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(5)) M.show_message("Your body feels a bit tight.") if (2) if (prob(5)) M.show_message("Your body feels a bit tight.") if (3) if (prob(10)) M.show_message("Your body feels too tight to hold your organs inside.") if (4) if (prob(20)) M.show_message("Your body feels too tight to hold your organs inside.") else if (prob(20)) M.show_message("You feel like you could explode at any time.") if (5) if (prob(2)) M.show_message("Your organs burst out of your body!") infect(M, origin) logTheThing("pathology", M, null, "gibbed due to Gibbing symptom in [origin].") M.gib() else if (prob(30)) M.show_message("Your body feels too tight to hold your organs inside.") else if (prob(30)) M.show_message("You feel like you could explode at any time.") may_react_to() return "The culture appears to process proteins at an irregular speed." react_to(var/R, var/zoom) if (R == "synthflesh") if (zoom) return "There are stray synthflesh pieces all over the dish." else return "Pathogens appear to be storming the synthflesh chunks and through an extreme conversion of energy, bursting them into smaller, more processible chunks." else return null datum/pathogeneffects/malevolent/shakespeare name = "Shakespeare" desc = "The infected has an urge to begin reciting shakespearean poetry." infect_type = INFECT_NONE rarity = RARITY_VERY_COMMON var/static/list/shk = list("Expectation is the root of all heartache.", "A fool thinks himself to be wise, but a wise man knows himself to be a fool.", "Love all, trust a few, do wrong to none.", "Hell is empty and all the devils are here.", "Better a witty fool than a foolish wit.", "The course of true love never did run smooth.", "Come, gentlemen, I hope we shall drink down all unkindness.", "Suspicion always haunts the guilty mind.", "No legacy is so rich as honesty.", "Alas, I am a woman friendless, hopeless!", "The empty vessel makes the loudest sound.", "Words without thoughts never to heaven go.", "This above all; to thine own self be true.", "An overflow of good converts to bad.", "It is a wise father that knows his own child.", "Listen to many, speak to a few.", "Boldness be my friend.", "Speak low, if you speak love.", "Give thy thoughts no tongue.", "The devil can cite Scripture for his purpose.", "In time we hate that which we often fear.", "The lady doth protest too much, methinks.") onsay(var/mob/M as mob, message, var/datum/pathogen/origin) if (!(message in shk)) return shakespearify(message) disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return if (prob(origin.stage * 3)) M.say(pick(shk)) may_react_to() return "The culture appears to be quite dramatic." datum/pathogeneffects/malevolent/fluent name = "Fluent Speech" desc = "The infection has a serious excess of saliva." infect_type = INFECT_AREA spread = SPREAD_FACE infect_message = "A drop of saliva lands on your face." rarity = RARITY_UNCOMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) return onsay(var/mob/M as mob, message, var/datum/pathogen/origin) if (!origin.symptomatic) return message switch (origin.stage) if (1 to 3) if (prob(origin.stage * 2)) infect(M, origin) if (4 to 5) if (prob(origin.stage * 5)) infect(M, origin) return message may_react_to() return "The pathogen appears to generate a high amount of fluids." react_to(var/R, var/zoom) if (R == "salt") return "The pathogen stops generating fluids when coming in contact with salt." datum/pathogeneffects/malevolent/capacitor name = "Capacitor" desc = "The infected is involuntarily electrokinetic." infect_type = INFECT_AREA_LARGE rarity = RARITY_VERY_RARE var/static/capacity = 1e7 proc/electrocute(var/mob/V as mob, var/shock_load) V.shock(src, shock_load, "chest", 1, 0.5) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, V) s.start() proc/discharge(var/mob/M as mob, var/datum/pathogen/origin) var/load = origin.symptom_data["capacitor"] if (load == 0) return var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, M) s.start() if (load > 4e6) M.visible_message("[M] releases a burst of lightning into the air!", "You discharge your energy into the air. It leaves your skin burned to a fine crisp.", "You hear a burst of electricity.") M.TakeDamage("chest", 0, 30) M.stunned += 10 for (var/mob/V in orange(4, M)) electrocute(V, load / 10) else if (load > 1e6) M.visible_message("[M] releases a burst of lightning into the air!", "You discharge your energy into the air. It leaves your skin burned to a fine crisp.", "You hear a burst of electricity.") M.TakeDamage("chest", 0, 20) M.stunned += 7 for (var/mob/V in orange(4, M)) electrocute(V, load / 10) else if (load > 50000) M.visible_message("[M] releases a considerable amount of electricity into the air!", "You discharge your energy into the air. It leaves your skin burned heavily.", "You hear a burst of electricity.") M.TakeDamage("chest", 0, 15) M.stunned += 4 for (var/mob/V in orange(3, M)) electrocute(V, load / 10) else if (load > 20000) M.visible_message("[M] releases a bolt of lightning into the air!", "You discharge your energy into the air. It leaves your skin burned lightly.", "You hear a burst of electricity.") M.TakeDamage("chest", 0, 10) M.stunned += 2 for (var/mob/V in orange(2, M)) electrocute(V, load / 10) else if (load > 5000) M.stunned += 1 M.visible_message("[M] releases a few sparks into the air.", "You discharge your energy into the air.", "You hear a burst of electricity.") for (var/mob/V in orange(1, M)) electrocute(V, load / 10) else if (load > 0) M.show_message("You feel discharged.") origin.symptom_data["capacitor"] = 0 proc/load_check(var/mob/M as mob, var/datum/pathogen/origin) var/load = origin.symptom_data["capacitor"] if (load > capacity) M.show_message("You burst into several, shocking pieces.") src.infect(M, origin) explosion(M, M.loc,1,2,3,4) else if (load > capacity * 0.9) M.show_message("You are severely overcharged. It feels like the voltage could burst your body at any moment.") else if (load > capacity * 0.8) M.show_message("You are beginning to feel overcharged.") onadd(var/datum/pathogen/origin) origin.symptom_data["capacitor"] = 0 onshocked(var/mob/M as mob, var/datum/shockparam/ret, var/datum/pathogen/origin) var/amt = ret.amt var/wattage = ret.wattage if (wattage > 45000) origin.symptom_data["capacitor"] += wattage amt /= 2 ret.skipsupp = 1 M.show_message("You absorb a portion of the electric shock!") else amt = 0 ret.skipsupp = 1 M.show_message("You absorb the electric shock!") load_check(M, origin) return ret ondisarm(var/mob/M as mob, var/mob/V as mob, isPushDown, var/datum/pathogen/origin) var/load = origin.symptom_data["capacitor"] if (load > 1e6 && isPushDown) if (prob(25)) M.visible_message("[M]'s hands are glowing in a blue color.", "You discharge yourself onto your opponent with your hands!", "You hear someone getting defibrillated.") electrocute(V, load / 10) if (prob(50)) M.show_message("Your shock jumps back onto you!") electrocute(M, load / 10) origin.symptom_data["capacitor"] = 0 return 1 onpunch(var/mob/M as mob, var/mob/V as mob, zone, var/datum/pathogen/origin) var/load = origin.symptom_data["capacitor"] if (load > 2e6) if (prob(25)) M.visible_message("[M]'s fists are covered in electric arcs.", "You supercharge your punch.", "You hear a huge electric crackle.") electrocute(V, load / 10) if (prob(50)) M.show_message("Your shock jumps back onto you!") electrocute(M, load / 10) origin.symptom_data["capacitor"] /= 2 else if (load > 500000) if (prob(20)) M.visible_message("[M]'s fists spark electric arcs.", "You overcharge your punch.", "You hear a large electric crackle.") electrocute(V, load / 10) if (prob(50)) M.show_message("Your shock jumps back onto you!") electrocute(M, load / 10) origin.symptom_data["capacitor"] /= 2 else if (load > 200000) if (prob(15)) M.visible_message("[M]'s fists throw sparks.", "You charge your punch.", "You hear an electric crackle.") electrocute(V, load / 10) if (prob(50)) M.show_message("Your shock jumps back onto you!") electrocute(M, load / 10) origin.symptom_data["capacitor"] /= 2 return 1 onpunched(var/mob/M as mob, var/mob/A as mob, zone, var/datum/pathogen/origin) var/load = origin.symptom_data["capacitor"] if (load > 5000) if (prob(25)) M.visible_message("[M] loses control and discharges his energy!", "You flinch and discharge.", "You hear someone getting shocked.") discharge(M, origin) return 1 disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return var/load = origin.symptom_data["capacitor"] switch (origin.stage) if (1) if (prob(9)) var/obj/cable/C = locate() in range(3, M) var/datum/powernet/PN if (C) PN = C.get_powernet() if (C && PN.avail > 0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, C) s.start() M.visible_message("A spark jumps from the power cable at [M].", "A spark jumps at you from a nearby cable.", "You hear something spark.") if (2) if (prob(9)) var/obj/cable/C = locate() in range(3, M) var/datum/powernet/PN if (C) PN = C.get_powernet() if (C && PN.avail > 0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, C) s.start() M.visible_message("A spark jumps from the power cable at [M].", "A spark jumps at you from a nearby cable.", "You hear something spark.") var/amt = max(250000, PN.avail) PN.newload -= amt origin.symptom_data["capacitor"] += amt if (amt > 2500 && load > 5000) M.show_message("You feel energized.") load_check(M, origin) else if (prob(6)) if (load > 0) discharge(M, origin) if (3) if (prob(10)) var/obj/cable/C = locate() in range(4, M) var/datum/powernet/PN if (C) PN = C.get_powernet() if (C && PN.avail > 0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, C) s.start() M.visible_message("A bolt of electricity jumps at [M].", "A bolt of electricity jumps at you from a nearby cable. It burns!", "You hear something spark.") M.TakeDamage("chest", 0, 3) var/amt = max(1e6, PN.avail) PN.newload -= amt origin.symptom_data["capacitor"] += amt if (amt > 5000 && load > 5000) M.show_message("You feel energized.") load_check(M, origin) else if (prob(6)) if (load > 0) discharge(M, origin) if (4) if (prob(15)) var/obj/machinery/power/smes/S = locate() in range(4, M) if (S && S.charge > 0) // Look for active SMES first var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, S) s.start() M.visible_message("A burst of lightning jumps at [M] from [S].", "A burst of lightning jumps at you from [S]. It burns!", "You hear something spark.") M.TakeDamage("chest", 0, 15) var/amt = S.charge S.charge -= amt origin.symptom_data["capacitor"] += amt if (amt > 5000 && load > 5000) M.show_message("You feel energized.") load_check(M, origin) else var/obj/machinery/power/apc/A = locate() in view(4, M) if (A && A.cell && A.cell.charge > 0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, A) s.start() M.visible_message("A burst of lightning jumps at [M] from [A].", "A burst of lightning jumps at you from [A]. It burns!", "You hear something spark.") M.TakeDamage("chest", 0, 5) var/amt = A.cell.charge * 100 // apcs have a weirdly low capacity. A.cell.charge -= amt origin.symptom_data["capacitor"] += amt if (amt > 5000 && load > 5000) M.show_message("You feel energized.") load_check(M, origin, origin) else var/obj/cable/C = locate() in range(4, M) var/datum/powernet/PN if (C) PN = C.get_powernet() if (C && PN.avail > 0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, C) s.start() M.visible_message("A burst of lightning jumps at [M].", "A burst of lightning jumps at you from a nearby cable. It burns!", "You hear something spark.") M.TakeDamage("chest", 0, 5) var/amt = max(3e6, PN.avail) PN.newload -= amt origin.symptom_data["capacitor"] += amt * 2 if (amt > 5000 && load > 5000) M.show_message("You feel energized.") load_check(M, origin) else if (prob(6)) if (load > 0) discharge(M, origin) if (5) if (prob(15)) var/obj/machinery/power/smes/S = locate() in range(4, M) if (S && S.charge > 0) // Look for active SMES first var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, S) s.start() M.visible_message("A burst of lightning jumps at [M] from [S].", "A burst of lightning jumps at you from [S]. It burns!", "You hear something spark.") M.TakeDamage("chest", 0, 15) var/amt = S.charge S.charge -= amt origin.symptom_data["capacitor"] += amt if (amt > 5000 && load > 5000) M.show_message("You feel energized.") load_check(M, origin) else var/obj/machinery/power/apc/A = locate() in view(4, M) if (A && A.cell && A.cell.charge > 0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, A) s.start() M.visible_message("A burst of lightning jumps at [M] from [A].", "A burst of lightning jumps at you from [A]. It burns!", "You hear something spark.") M.TakeDamage("chest", 0, 5) var/amt = A.cell.charge * 100 // apcs have a weirdly low capacity. A.cell.charge -= amt origin.symptom_data["capacitor"] += amt if (amt > 5000 && load > 5000) M.show_message("You feel energized.") load_check(M, origin) else // Then a power cable if not found var/obj/cable/C = locate() in range(4, M) var/datum/powernet/PN if (C) PN = C.get_powernet() if (C && PN.avail > 0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, C) s.start() M.visible_message("A burst of lightning jumps at [M].", "A burst of lightning jumps at you from a nearby cable. It burns!", "You hear something spark.") M.TakeDamage("chest", 0, 5) var/amt = PN.avail PN.newload += amt origin.symptom_data["capacitor"] += amt * 3 if (amt > 5000 && load > 5000) M.show_message("You feel energized.") load_check(M, origin) else if (prob(1)) if (load > 0) discharge(M, origin) may_react_to() return "The culture appears to have an irregular lack of liquids, but a very high amount of hydrogen and oxygen." react_to(var/R, var/zoom) if (R == "water") if (zoom) return "The water inside the petri dish appears to be breaking down into hydrogen and oxygen." else return "The water near the pathogen is rapidly disappearing." if (R == "voltagen") return "Bits of pathogen violently explode when coming into contact with the voltagen." else return null datum/pathogeneffects/malevolent/capacitor/unlimited name = "Unlimited Capacitor" load_check(var/mob/M as mob, var/datum/pathogen/origin) return null react_to(var/R, var/zoom) if (R == "voltagen") return "The pathogen appears to have the ability to infinitely absorb the voltagen." datum/pathogeneffects/malevolent/sunglass name = "Sunglass Glands" desc = "The infected grew sunglass glands." infect_type = INFECT_NONE rarity = RARITY_UNCOMMON proc/glasses(var/mob/living/carbon/human/M as mob) M.show_message("[pick("You feel cooler!", "You find yourself wearing sunglasses.", "A pair of sunglasses grow onto your face.")]") var/obj/item/clothing/glasses/G = M.glasses if (G) M.u_equip(G) if (M.client) M.client.screen -= G G.loc = M.loc G.dropped(M) G.layer = initial(G.layer) var/obj/item/clothing/glasses/N = new/obj/item/clothing/glasses/sunglasses() N.loc = M N.layer = M.layer N.master = M M.glasses = N M.update_clothing() disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch(origin.stage) if (2 to 4) if (istype(M, /mob/living/carbon/human)) if (!(M:glasses) || !(istype(M:glasses, /obj/item/clothing/glasses/sunglasses))) if (prob(15)) glasses(M) if (5) if (istype(M, /mob/living/carbon/human)) if (!(M:glasses) || !(istype(M:glasses, /obj/item/clothing/glasses/sunglasses))) if (prob(25)) glasses(M) may_react_to() return "The pathogen appears to be sensitive to sudden flashes of light." react_to(var/R, var/zoom) if (R == "flashpowder") if (zoom) return "The individual microbodies appear to be wearing sunglasses." else return "The pathogen appears to have developed a resistance to the flash powder." datum/pathogeneffects/malevolent/liverdamage name = "Hepatomegaly" desc = "The infected has an inflamed liver." infect_type = INFECT_NONE rarity = RARITY_UNCOMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(4) && M.reagents.has_reagent("ethanol")) M.show_message("You feel a slight burning in your gut.") M.take_toxin_damage(3) M.updatehealth() if (2) if (prob(6) && M.reagents.has_reagent("ethanol")) M.show_message("You feel a burning sensation in your gut.") M.take_toxin_damage(4) M.updatehealth() if (3) if (prob(8) && M.reagents.has_reagent("ethanol")) M.visible_message("[M] clutches their chest in pain!","You feel a searing pain in your chest!") M.take_toxin_damage(5) M.stunned += 2 M.updatehealth() if (4) if (prob(10) && M.reagents.has_reagent("ethanol")) M.visible_message("[M] clutches their chest in pain!","You feel a horrible pain in your chest!") M.take_toxin_damage(8) M.stunned += 2 M.updatehealth() if (5) if (prob(12) && M.reagents.has_reagent("ethanol")) M.visible_message("[M] falls to the ground, clutching their chest!", "The pain overwhelms you!", "You hear someone fall.") M.take_toxin_damage(5) M.weakened += 4 M.updatehealth() may_react_to() return "The pathogen appears to be capable of processing certain beverages." react_to(var/R, var/zoom) var/alcoholic = 0 if (R == "ethanol") alcoholic = "ethanol" else var/datum/reagents/H = new /datum/reagents(5) H.add_reagent(R, 5) var/RE = H.get_reagent(R) if (istype(RE, /datum/reagent/fooddrink/alcoholic)) alcoholic = RE:name if (alcoholic) return "The pathogen appears to react violently to the [alcoholic]." datum/pathogeneffects/malevolent/fever name = "Fever" desc = "The body temperature of the infected individual slightly increases." infect_type = INFECT_NONE rarity = RARITY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1 to 3) if (prob(2 * origin.stage + 3)) M.bodytemperature += origin.stage M.show_message("You feel a bit hot.") if (4) if (prob(11)) M.bodytemperature += 4 M.TakeDamage("chest", 0, 1) M.updatehealth() M.show_message("You feel hot.") if (4) if (prob(13)) M.bodytemperature += 6 M.TakeDamage("chest", 0, 1) if (prob(40)) M.take_toxin_damage(1) M.updatehealth() M.show_message("You feel hot.") may_react_to() return "The pathogen appears to be creating a constant field of radiating heat. The relevant membranes look like they might be affected by painkillers." react_to(var/R, var/zoom) if (R == "salicylic_acid") return "The heat emission of the pathogen is completely shut down by the painkillers." datum/pathogeneffects/malevolent/acutefever name = "Acute Fever" desc = "The body temperature of the infected individual seriously increases and may spontaneously combust." infect_type = INFECT_NONE rarity = RARITY_RARE disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return var/mob/living/carbon/human/H = M switch (origin.stage) if (1 to 3) if (prob(2 * origin.stage + 3)) M.bodytemperature += origin.stage * 2 M.show_message("You feel a bit hot.") if (4) if (prob(11)) M.bodytemperature += 11 M.TakeDamage("chest", 0, 1) M.updatehealth() M.show_message("You feel hot.") if (prob(2)) H.update_burning(15) M.show_message("You spontaneously combust!") if (istype(M.loc, /obj/icecube)) var/IC = M.loc M.set_loc(get_turf(M)) qdel(IC) if (5) if (prob(15)) M.bodytemperature += 17 M.TakeDamage("chest", 0, 2) M.updatehealth() M.show_message("You feel rather hot.") if (prob(3)) H.update_burning(25) M.show_message("You spontaneously combust!") if (istype(M.loc, /obj/icecube)) var/IC = M.loc M.set_loc(get_turf(M)) qdel(IC) may_react_to() return "The pathogen appears to be creating a constant field of radiating heat. The relevant membranes look like they might be affected by painkillers." react_to(var/R, var/zoom) if (R == "salicylic_acid") return "The heat emission of the pathogen is barely affected by the painkillers." datum/pathogeneffects/malevolent/ultimatefever name = "Dragon Fever" desc = "The body temperature of the infected individual seriously increases and may spontaneously combust. Or worse." infect_type = INFECT_NONE rarity = RARITY_VERY_RARE disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return var/mob/living/carbon/human/H = M switch (origin.stage) if (1 to 3) if (prob(4 * origin.stage)) M.bodytemperature += origin.stage * 4 M.show_message("You feel [pick("a bit ", "rather ", "")]hot.") if (4) if (prob(12)) M.bodytemperature += 20 M.TakeDamage("chest", 0, 2) M.updatehealth() M.show_message("You feel extremely hot.") if (prob(5)) H.update_burning(25) M.show_message("You spontaneously combust!") if (istype(M.loc, /obj/icecube)) var/IC = M.loc M.set_loc(get_turf(M)) qdel(IC) if (5) if (prob(17)) M.bodytemperature += 25 M.TakeDamage("chest", 0, 2) M.updatehealth() M.show_message("You feel rather hot.") if (prob(5)) H.update_burning(35) M.show_message("You spontaneously combust!") if (istype(M.loc, /obj/icecube)) var/IC = M.loc M.set_loc(get_turf(M)) qdel(IC) if (prob(2)) M.show_message("You completely burn up!") logTheThing("pathology", M, null, " is firegibbed due to symptom [src].") M.firegib() may_react_to() return "The pathogen appears to be creating a constant field of radiating heat. The relevant membranes look like they might be affected by painkillers." react_to(var/R, var/zoom) if (R == "salicylic_acid") return "The heat emission of the pathogen is completely unaffected by the painkillers and continues to radiate heat at an intense rate." datum/pathogeneffects/malevolent/chills name = "Common Chills" desc = "The infected feels the sensation of lowered body temperature." infect_type = INFECT_NONE rarity = RARITY_COMMON disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(5)) M.bodytemperature -= 1 M.show_message("You feel a little cold.") if (2) if (prob(9)) M.bodytemperature -= 2 M.show_message("You feel cold.") if (3) if (prob(11)) M.bodytemperature -= 4 M.show_message("You feel cold.") M.emote("shiver") if (4) if (prob(13)) M.bodytemperature -= 8 M.show_message("You feel cold.") M.emote("shiver") if (5) if (prob(15)) M.bodytemperature -= 12 M.show_message("You feel rather cold.") M.stunned += 1 M.emote("shiver") if (M.bodytemperature < 0) M.bodytemperature = 0 may_react_to() return "The pathogen is producing a trail of ice. Perhaps something hot might affect it." react_to(var/R, var/zoom) if (R == "napalm" || R == "infernite") return "The hot reagent melts the trail of ice completely." datum/pathogeneffects/malevolent/seriouschills name = "Acute Chills" desc = "The infected feels the sensation of seriously lowered body temperature." infect_type = INFECT_NONE rarity = RARITY_RARE proc/create_icing(var/mob/M) var/obj/decal/icefloor/I = unpool(/obj/decal/icefloor) I.loc = get_turf(M) spawn (300) pool(I) disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(5)) M.bodytemperature -= 2 M.show_message("You feel a little cold.") if (2) if (prob(9)) M.bodytemperature -= 4 M.show_message("You feel cold.") if (3) if (prob(11)) M.bodytemperature -= 12 M.show_message("You rather cold.") M.emote("shiver") if (prob(1) && isturf(M.loc)) M.show_message("You spontaneously freeze!") M.bodytemperature -= 16 new /obj/icecube(get_turf(M), M) if (4) if (prob(50)) create_icing(M) if (prob(13)) if (prob(15) && isturf(M.loc)) M:burning = 0 M.show_message("You spontaneously freeze!") M.bodytemperature -= 20 new /obj/icecube(get_turf(M), M) else M.bodytemperature -= 20 M.show_message("You pretty damn cold.") M.stunned += 1 M.emote("shiver") if (5) if (prob(50)) create_icing(M) if (prob(15)) if (prob(25) && isturf(M.loc)) M:burning = 0 M.show_message("You spontaneously freeze!") M.bodytemperature -= 23 new /obj/icecube(get_turf(M), M) else M.bodytemperature -= 23 M.show_message("You're freezing!") M.stunned += 2 M.emote("shiver") if (M.bodytemperature < 0) M.bodytemperature = 0 may_react_to() return "The pathogen is producing a trail of ice. Perhaps something hot might affect it." react_to(var/R, var/zoom) if (R == "napalm" || R == "infernite") return "The hot reagent barely melts the trail of ice." datum/pathogeneffects/malevolent/seriouschills/ultimate name = "Arctic Chills" desc = "The infected feels the sensation of seriously lowered body temperature. And might spontaneously become an ice statue." infect_type = INFECT_NONE rarity = RARITY_VERY_RARE disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1 to 3) if (prob(origin.stage * 4)) M.bodytemperature -= rand(origin.stage * 5) M.show_message("You feel [pick("a little ", "a bit ", "rather ", "")] cold.") if (prob(origin.stage - 1) && isturf(M.loc)) M.show_message("You spontaneously freeze!") M.bodytemperature -= 25 new /obj/icecube(get_turf(M), M) if (4) if (prob(50)) create_icing(M) if (prob(13)) if (prob(15) && isturf(M.loc)) M:burning = 0 M.show_message("You spontaneously freeze!") M.bodytemperature -= 30 new /obj/icecube(get_turf(M), M) else M.bodytemperature -= 30 M.show_message("You pretty damn cold.") M.stunned += 1 M.emote("shiver") if (5) if (prob(50)) create_icing(M) if (prob(15)) if (prob(25) && isturf(M.loc)) M:burning = 0 M.show_message("You spontaneously freeze!") M.bodytemperature -= 30 new /obj/icecube(get_turf(M), M) else M.bodytemperature -= 50 M.show_message("[pick("You're freezing!", "You're getting cold...", "So very cold...", "You feel your skin turning into ice...")]") M.stunned += 3 M.emote("shiver") if (prob(1)) M.show_message("You freeze completely!") logTheThing("pathology", usr, null, "was ice statuified by symptom [src].") M:become_ice_statue() if (M.bodytemperature < 0) M.bodytemperature = 0 may_react_to() return "The pathogen is producing a trail of ice. Perhaps something hot might affect it." react_to(var/R, var/zoom) if (R == "napalm" || R == "infernite") return "The hot reagent doesn't affect the trail of ice at all!" datum/pathogeneffects/malevolent/farts name = "Farts" desc = "The infected individual occasionally farts." infect_type = INFECT_AREA spread = SPREAD_AIR rarity = RARITY_VERY_COMMON proc/fart(var/mob/M, var/datum/pathogen/origin) M.emote("fart") infect(M, origin) disease_act(var/mob/M, var/datum/pathogen/origin) if (!origin.symptomatic) return if (prob(origin.stage * 3)) fart(M, origin) may_react_to() return "The pathogen appears to produce a large volume of gas." datum/pathogeneffects/malevolent/farts/smoke name = "Smoke Farts" desc = "The infected individual occasionally farts reagent smoke." rarity = RARITY_RARE fart(var/mob/M, var/datum/pathogen/origin) ..() if (M.reagents.total_volume || prob(10)) smoke_reaction(M.reagents, 4, get_turf(M)) disease_act(var/mob/M, var/datum/pathogen/origin) if (!origin.symptomatic) return if (prob(origin.stage * 3)) fart(M, origin) may_react_to() return "The pathogen appears to produce a large volume of gas." react_to(var/R, var/zoom) var/datum/reagents/H = new /datum/reagents(5) H.add_reagent(R, 5) var/datum/reagent/RE = H.get_reagent(R) return "The [RE.name] violently explodes into a puff of smoke when coming into contact with the pathogen." datum/pathogeneffects/malevolent/farts/plasma name = "Plasma Farts" desc = "The infected individual occasionally farts. Plasma." rarity = RARITY_UNCOMMON fart(var/mob/M, var/datum/pathogen/origin) ..() var/turf/T = get_turf(M) var/datum/gas_mixture/gas = unpool(/datum/gas_mixture) gas.zero() gas.toxins = origin.stage * 3 gas.temperature = T20C gas.volume = R_IDEAL_GAS_EQUATION * T20C / 1000 if (T) T.assume_air(gas) disease_act(var/mob/M, var/datum/pathogen/origin) if (!origin.symptomatic) return ..() if (origin.stage > 2 && prob(origin.stage * 3)) M.take_toxin_damage(1) M.take_oxygen_deprivation(2) M.updatehealth() react_to(var/R, var/zoom) if (R == "infernite" || R == "napalm") return "The gas lights up in a puff of flame." datum/pathogeneffects/malevolent/farts/co2 name = "CO2 Farts" desc = "The infected individual occasionally farts. Carbon dioxyde." rarity = RARITY_RARE fart(var/mob/M, var/datum/pathogen/origin) ..() var/turf/T = get_turf(M) var/datum/gas_mixture/gas = unpool(/datum/gas_mixture) gas.zero() gas.carbon_dioxide = origin.stage * 7 gas.temperature = T20C gas.volume = R_IDEAL_GAS_EQUATION * T20C / 1000 if (T) T.assume_air(gas) if (!origin.symptomatic) return ..() if (origin.stage > 2 && prob(origin.stage * 3)) M.take_toxin_damage(1) M.take_oxygen_deprivation(4) M.updatehealth() react_to(var/R, var/zoom) if (R == "infernite" || R == "napalm") return "The flame of the hot reagents is snuffed by the gas." datum/pathogeneffects/malevolent/leprosy name = "Leprosy" desc = "The infected individual is losing limbs." rarity = RARITY_VERY_RARE disease_act(var/mob/living/carbon/human/M, var/datum/pathogen/origin) if (origin.stage < 3 || !origin.symptomatic) return switch (origin.stage) if (3) if (prob(15)) M.show_message(pick("You feel a bit loose...", "You feel like you're falling apart.")) if (4 to 5) if (prob(2 + origin.stage)) var/limb_name = pick("l_arm","r_arm","l_leg","r_leg") var/obj/item/parts/limb = M.limbs.vars[limb_name] if (istype(limb)) if (limb.remove_stage < 2) limb.remove_stage = 2 M.show_message("Your [limb] comes loose!") spawn(rand(150, 200)) if (limb.remove_stage == 2) limb.remove(0) datum/pathogeneffects/malevolent/senility name = "Senility" desc = "Infection damages nerve cells in the host's brain." rarity = RARITY_RARE infect_type = INFECT_NONE disease_act(var/mob/M as mob, var/datum/pathogen/origin) if (!origin.symptomatic) return switch (origin.stage) if (1) if (prob(10)) M.show_message("You feel a little confused.") if (2) if (prob(5)) M.show_message("Your head hurts. You're not sure what's going on.") M.take_brain_damage(1) if (3) if (prob(40)) M.emote("drool") if (prob(20)) M.show_message("... huh?") M.take_brain_damage(2) if (4) if (prob(30)) M.emote("drool") else if (prob(30)) M.emote("nosepick") if (prob(20)) M.show_message("You feel... unsmart.") M.take_brain_damage(3) if (5) if (prob(10)) M.show_message("You completely forget what you were doing.") M.drop_item() M.take_brain_damage(4)