Files
2016-03-06 20:52:14 +01:00

1948 lines
71 KiB
Plaintext

// 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("<span style=\"color:red\">You cough.</span>")
infect(M, origin)
if (2)
if (prob(5))
if (origin.symptomatic)
M.visible_message("<span style=\"color:red\">[M] coughs!</span>", "<span style=\"color:red\">You cough.</span>", "<span style=\"color:red\">You hear someone coughing.</span>")
M.drop_item()
infect(M, origin)
if (3)
if (prob(7))
if (origin.symptomatic)
M.visible_message("<span style=\"color:red\">[M] coughs violently!</span>", "<span style=\"color:red\">You cough violently!</span>", "<span style=\"color:red\">You hear someone cough violently!</span>")
M.stunned += 1
infect(M, origin)
if (4)
if (prob(10))
if (origin.symptomatic)
M.visible_message("<span style=\"color:red\">[M] coughs violently!</span>", "<span style=\"color:red\">You cough violently!</span>", "<span style=\"color:red\">You hear someone cough violently!</span>")
M.stunned += 2
infect(M, origin)
if (5)
if (prob(10))
if (origin.symptomatic)
M.visible_message("<span style=\"color:red\">[M] coughs violently!</span>", "<span style=\"color:red\">You cough violently!</span>", "<span style=\"color:red\">You hear someone cough violently!</span>")
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("<span style=\"color:red\">Your stomach hurts.</span>")
M.updatehealth()
if (4 to 5)
if (prob(8))
M.take_toxin_damage(2)
M.show_message("<span style=\"color:red\">Your stomach hurts.</span>")
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("<span style=\"color:red\">Your muscles ache.</span>")
M.updatehealth()
if (4 to 5)
if (prob(8))
M.show_message("<span style=\"color:red\">Your muscles ache.</span>")
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("<span style=\"color:red\">[M] sneezes!</span>", "<span style=\"color:red\">You sneeze.</span>", "<span style=\"color:red\">You hear someone sneezing.</span>")
if (prob(3))
M.drop_item()
infect(M, origin)
if (2)
if (prob(12))
M.visible_message("<span style=\"color:red\">[M] sneezes!</span>", "<span style=\"color:red\">You sneeze.</span>", "<span style=\"color:red\">You hear someone sneezing.</span>")
if (prob(5))
M.drop_item()
infect(M, origin)
if (3)
if (prob(15))
M.visible_message("<span style=\"color:red\">[M] sneezes!</span>", "<span style=\"color:red\">You sneeze.</span>", "<span style=\"color:red\">You hear someone sneezing.</span>")
if (prob(7))
M.drop_item()
infect(M, origin)
if (4)
if (prob(20))
M.visible_message("<span style=\"color:red\">[M] sneezes!</span>", "<span style=\"color:red\">You sneeze.</span>", "<span style=\"color:red\">You hear someone sneezing.</span>")
if (prob(14))
M.drop_item()
infect(M, origin)
if (5)
if (prob(20))
M.visible_message("<span style=\"color:red\">[M] sneezes!</span>", "<span style=\"color:red\">You sneeze.</span>", "<span style=\"color:red\">You hear someone sneezing.</span>")
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("<span style=\"color:red\">You feel a bit warm.</span>")
if (prob(25))
infect(M, origin)
if (2)
if (prob(5) && origin.symptomatic)
M.show_message("<span style=\"color:red\">You feel rather warm.</span>")
if (prob(50))
infect(M, origin)
if (3)
if (prob(5) && origin.symptomatic)
M.show_message("<span style=\"color:red\">You're sweating heavily.</span>")
if (prob(75))
infect(M, origin)
if (4)
if (prob(5) && origin.symptomatic)
M.show_message("<span style=\"color:red\">You're soaked in your own sweat.</span>")
if (prob(85))
infect(M, origin)
if (5)
if (prob(5) && origin.symptomatic)
M.show_message("<span style=\"color:red\">You're soaked in your own sweat.</span>")
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, "<span style=\"color:red\">You feel a bit disoriented.</span>")
M.change_misstep_chance(10)
if (2)
if (prob(12))
boutput(M, "<span style=\"color:red\">You feel a bit disoriented.</span>")
M.change_misstep_chance(10)
if (3)
if (prob(14))
boutput(M, "<span style=\"color:red\">You feel a bit disoriented.</span>")
M.change_misstep_chance(20)
if (4)
if (prob(16))
boutput(M, "<span style=\"color:red\">You feel rather disoriented.</span>")
M.change_misstep_chance(20)
if (5)
if (prob(18))
boutput(M, "<span style=\"color:red\">You feel rather disoriented.</span>")
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("<span style=\"color:red\">[src] slips through your hands!</span>")
if (prob(10))
M.show_message("<span style=\"color:red\">[src] disappears!</span>")
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, "<B>[O]</B> points at [M].")
var/point = new /obj/decal/point(get_turf(M))
spawn(30)
qdel(point)
boutput(M, "<B>[O]</B> [action], \"[what]\"")
proc/backpack(var/mob/M, var/mob/living/O)
var/item = pick(traitor_items)
boutput(M, "<span style=\"color:blue\">[O] has added the [item] to the backpack!</span>")
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, "<span style=\"color:red\"><B>[O] spits acid at [O2]!</B></span>")
else
boutput(M, "<span style=\"color:red\"><B>[O] spits acid at you!</B></span>")
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, "<span style=\"color:red\"><B>[O] bites [O2]!</B></span>")
else
boutput(M, "<span style=\"color:red\"><B>[O] bites you!</B></span>")
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, "<span style=\"color:blue\">[O] has added the suspicious item to the backpack!</span>")
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, "<span style=\"color:blue\">[O] has added the suspicious item to the backpack!</span>")
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("<span style=\"color:red\">You feel space warping around you.</span>")
if (2)
if (prob(6))
M.show_message("<span style=\"color:red\">You feel space warping around you.</span>")
if (3)
if (prob(8))
M.show_message("<span style=\"color:red\">You are suddenly zapped elsewhere!</span>")
var/turf/T = pick(orange(7, M.loc)) as turf
do_teleport(M, T, 1)
if (4)
if (prob(10))
M.show_message("<span style=\"color:red\">You are suddenly zapped elsewhere!</span>")
var/turf/T = pick(orange(11, M.loc)) as turf
do_teleport(M, T, 2)
if (5)
if (prob(15))
M.show_message("<span style=\"color:red\">You are suddenly zapped elsewhere!</span>")
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("<span style=\"color:red\">Your body feels a bit tight.</span>")
if (2)
if (prob(5))
M.show_message("<span style=\"color:red\">Your body feels a bit tight.</span>")
if (3)
if (prob(10))
M.show_message("<span style=\"color:red\">Your body feels too tight to hold your organs inside.</span>")
if (4)
if (prob(20))
M.show_message("<span style=\"color:red\">Your body feels too tight to hold your organs inside.</span>")
else if (prob(20))
M.show_message("<span style=\"color:red\">You feel like you could explode at any time.</span>")
if (5)
if (prob(2))
M.show_message("<span style=\"color:red\">Your organs burst out of your body!</span>")
infect(M, origin)
logTheThing("pathology", M, null, "gibbed due to Gibbing symptom in [origin].")
M.gib()
else if (prob(30))
M.show_message("<span style=\"color:red\">Your body feels too tight to hold your organs inside.</span>")
else if (prob(30))
M.show_message("<span style=\"color:red\">You feel like you could explode at any time.</span>")
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 = "<span style=\"color:red\">A drop of saliva lands on your face.</span>"
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("<span style=\"color:red\">[M] releases a burst of lightning into the air!</span>", "<span style=\"color:red\">You discharge your energy into the air. It leaves your skin burned to a fine crisp.</span>", "<span style=\"color:red\">You hear a burst of electricity.</span>")
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("<span style=\"color:red\">[M] releases a burst of lightning into the air!</span>", "<span style=\"color:red\">You discharge your energy into the air. It leaves your skin burned to a fine crisp.</span>", "<span style=\"color:red\">You hear a burst of electricity.</span>")
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("<span style=\"color:red\">[M] releases a considerable amount of electricity into the air!</span>", "<span style=\"color:red\">You discharge your energy into the air. It leaves your skin burned heavily.</span>", "<span style=\"color:red\">You hear a burst of electricity.</span>")
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("<span style=\"color:red\">[M] releases a bolt of lightning into the air!</span>", "<span style=\"color:red\">You discharge your energy into the air. It leaves your skin burned lightly.</span>", "<span style=\"color:red\">You hear a burst of electricity.</span>")
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("<span style=\"color:red\">[M] releases a few sparks into the air.</span>", "<span style=\"color:red\">You discharge your energy into the air.</span>", "<span style=\"color:red\">You hear a burst of electricity.</span>")
for (var/mob/V in orange(1, M))
electrocute(V, load / 10)
else if (load > 0)
M.show_message("<span style=\"color:blue\">You feel discharged.</span>")
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("<span style=\"color:red\">You burst into several, shocking pieces.</span>")
src.infect(M, origin)
explosion(M, M.loc,1,2,3,4)
else if (load > capacity * 0.9)
M.show_message("<span style=\"color:red\">You are severely overcharged. It feels like the voltage could burst your body at any moment.</span>")
else if (load > capacity * 0.8)
M.show_message("<span style=\"color:red\">You are beginning to feel overcharged.</span>")
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("<span style=\"color:blue\">You absorb a portion of the electric shock!</span>")
else
amt = 0
ret.skipsupp = 1
M.show_message("<span style=\"color:blue\">You absorb the electric shock!</span>")
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("<span style=\"color:red\">[M]'s hands are glowing in a blue color.</span>", "<span style=\"color:blue\">You discharge yourself onto your opponent with your hands!</span>", "<span style=\"color:red\">You hear someone getting defibrillated.</span>")
electrocute(V, load / 10)
if (prob(50))
M.show_message("<span style=\"color:red\">Your shock jumps back onto you!</span>")
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("<span style=\"color:red\">[M]'s fists are covered in electric arcs.</span>", "<span style=\"color:blue\">You supercharge your punch.</span>", "<span style=\"color:red\">You hear a huge electric crackle.</span>")
electrocute(V, load / 10)
if (prob(50))
M.show_message("<span style=\"color:red\">Your shock jumps back onto you!</span>")
electrocute(M, load / 10)
origin.symptom_data["capacitor"] /= 2
else if (load > 500000)
if (prob(20))
M.visible_message("<span style=\"color:red\">[M]'s fists spark electric arcs.</span>", "<span style=\"color:blue\">You overcharge your punch.</span>", "<span style=\"color:red\">You hear a large electric crackle.</span>")
electrocute(V, load / 10)
if (prob(50))
M.show_message("<span style=\"color:red\">Your shock jumps back onto you!</span>")
electrocute(M, load / 10)
origin.symptom_data["capacitor"] /= 2
else if (load > 200000)
if (prob(15))
M.visible_message("<span style=\"color:red\">[M]'s fists throw sparks.</span>", "<span style=\"color:blue\">You charge your punch.</span>", "<span style=\"color:red\">You hear an electric crackle.</span>")
electrocute(V, load / 10)
if (prob(50))
M.show_message("<span style=\"color:red\">Your shock jumps back onto you!</span>")
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("<span style=\"color:red\">[M] loses control and discharges his energy!</span>", "<span style=\"color:red\">You flinch and discharge.</span>", "<span style=\"color:red\">You hear someone getting shocked.</span>")
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("<span style=\"color:red\">A spark jumps from the power cable at [M].</span>", "<span style=\"color:red\">A spark jumps at you from a nearby cable.</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:red\">A spark jumps from the power cable at [M].</span>", "<span style=\"color:red\">A spark jumps at you from a nearby cable.</span>", "<span style=\"color:red\">You hear something spark.</span>")
var/amt = max(250000, PN.avail)
PN.newload -= amt
origin.symptom_data["capacitor"] += amt
if (amt > 2500 && load > 5000)
M.show_message("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:red\">A bolt of electricity jumps at [M].</span>", "<span style=\"color:red\">A bolt of electricity jumps at you from a nearby cable. It burns!</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:red\">A burst of lightning jumps at [M] from [S].</span>", "<span style=\"color:red\">A burst of lightning jumps at you from [S]. It burns!</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:red\">A burst of lightning jumps at [M] from [A].</span>", "<span style=\"color:red\">A burst of lightning jumps at you from [A]. It burns!</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:red\">A burst of lightning jumps at [M].</span>", "<span style=\"color:red\">A burst of lightning jumps at you from a nearby cable. It burns!</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:red\">A burst of lightning jumps at [M] from [S].</span>", "<span style=\"color:red\">A burst of lightning jumps at you from [S]. It burns!</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:red\">A burst of lightning jumps at [M] from [A].</span>", "<span style=\"color:red\">A burst of lightning jumps at you from [A]. It burns!</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:red\">A burst of lightning jumps at [M].</span>", "<span style=\"color:red\">A burst of lightning jumps at you from a nearby cable. It burns!</span>", "<span style=\"color:red\">You hear something spark.</span>")
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("<span style=\"color:blue\">You feel energized.</span>")
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("<span style=\"color:blue\">[pick("You feel cooler!", "You find yourself wearing sunglasses.", "A pair of sunglasses grow onto your face.")]</span>")
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("<span style=\"color:red\">You feel a slight burning in your gut.</span>")
M.take_toxin_damage(3)
M.updatehealth()
if (2)
if (prob(6) && M.reagents.has_reagent("ethanol"))
M.show_message("<span style=\"color:red\">You feel a burning sensation in your gut.</span>")
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!","<span style=\"color:red\">You feel a searing pain in your chest!</span>")
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!","<span style=\"color:red\">You feel a horrible pain in your chest!</span>")
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!", "<span style=\"color:red\">The pain overwhelms you!</span>", "<span style=\"color:red\">You hear someone fall.</span>")
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("<span style=\"color:red\">You feel a bit hot.</span>")
if (4)
if (prob(11))
M.bodytemperature += 4
M.TakeDamage("chest", 0, 1)
M.updatehealth()
M.show_message("<span style=\"color:red\">You feel hot.</span>")
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("<span style=\"color:red\">You feel hot.</span>")
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("<span style=\"color:red\">You feel a bit hot.</span>")
if (4)
if (prob(11))
M.bodytemperature += 11
M.TakeDamage("chest", 0, 1)
M.updatehealth()
M.show_message("<span style=\"color:red\">You feel hot.</span>")
if (prob(2))
H.update_burning(15)
M.show_message("<span style=\"color:red\">You spontaneously combust!</span>")
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("<span style=\"color:red\">You feel rather hot.</span>")
if (prob(3))
H.update_burning(25)
M.show_message("<span style=\"color:red\">You spontaneously combust!</span>")
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("<span style=\"color:red\">You feel [pick("a bit ", "rather ", "")]hot.</span>")
if (4)
if (prob(12))
M.bodytemperature += 20
M.TakeDamage("chest", 0, 2)
M.updatehealth()
M.show_message("<span style=\"color:red\">You feel extremely hot.</span>")
if (prob(5))
H.update_burning(25)
M.show_message("<span style=\"color:red\">You spontaneously combust!</span>")
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("<span style=\"color:red\">You feel rather hot.</span>")
if (prob(5))
H.update_burning(35)
M.show_message("<span style=\"color:red\">You spontaneously combust!</span>")
if (istype(M.loc, /obj/icecube))
var/IC = M.loc
M.set_loc(get_turf(M))
qdel(IC)
if (prob(2))
M.show_message("<span style=\"color:red\">You completely burn up!</span>")
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("<span style=\"color:red\">You feel a little cold.</span>")
if (2)
if (prob(9))
M.bodytemperature -= 2
M.show_message("<span style=\"color:red\">You feel cold.</span>")
if (3)
if (prob(11))
M.bodytemperature -= 4
M.show_message("<span style=\"color:red\">You feel cold.</span>")
M.emote("shiver")
if (4)
if (prob(13))
M.bodytemperature -= 8
M.show_message("<span style=\"color:red\">You feel cold.</span>")
M.emote("shiver")
if (5)
if (prob(15))
M.bodytemperature -= 12
M.show_message("<span style=\"color:red\">You feel rather cold.</span>")
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("<span style=\"color:red\">You feel a little cold.</span>")
if (2)
if (prob(9))
M.bodytemperature -= 4
M.show_message("<span style=\"color:red\">You feel cold.</span>")
if (3)
if (prob(11))
M.bodytemperature -= 12
M.show_message("<span style=\"color:red\">You rather cold.</span>")
M.emote("shiver")
if (prob(1) && isturf(M.loc))
M.show_message("<span style=\"color:red\">You spontaneously freeze!</span>")
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("<span style=\"color:red\">You spontaneously freeze!</span>")
M.bodytemperature -= 20
new /obj/icecube(get_turf(M), M)
else
M.bodytemperature -= 20
M.show_message("<span style=\"color:red\">You pretty damn cold.</span>")
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("<span style=\"color:red\">You spontaneously freeze!</span>")
M.bodytemperature -= 23
new /obj/icecube(get_turf(M), M)
else
M.bodytemperature -= 23
M.show_message("<span style=\"color:red\">You're freezing!</span>")
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("<span style=\"color:red\">You feel [pick("a little ", "a bit ", "rather ", "")] cold.</span>")
if (prob(origin.stage - 1) && isturf(M.loc))
M.show_message("<span style=\"color:red\">You spontaneously freeze!</span>")
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("<span style=\"color:red\">You spontaneously freeze!</span>")
M.bodytemperature -= 30
new /obj/icecube(get_turf(M), M)
else
M.bodytemperature -= 30
M.show_message("<span style=\"color:red\">You pretty damn cold.</span>")
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("<span style=\"color:red\">You spontaneously freeze!</span>")
M.bodytemperature -= 30
new /obj/icecube(get_turf(M), M)
else
M.bodytemperature -= 50
M.show_message("<span style=\"color:red\">[pick("You're freezing!", "You're getting cold...", "So very cold...", "You feel your skin turning into ice...")]</span>")
M.stunned += 3
M.emote("shiver")
if (prob(1))
M.show_message("<span style=\"color:red\">You freeze completely!</span>")
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("<span style=\"color:red\">You feel a bit loose...</span>", "<span style=\"color:red\">You feel like you're falling apart.</span>"))
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("<span style=\"color:red\">Your [limb] comes loose!</span>")
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("<span style=\"color:red\">You feel a little confused.</span>")
if (2)
if (prob(5))
M.show_message("<span style=\"color:red\">Your head hurts. You're not sure what's going on.</span>")
M.take_brain_damage(1)
if (3)
if (prob(40))
M.emote("drool")
if (prob(20))
M.show_message("<span style=\"color:red\">... huh?</span>")
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("<span style=\"color:red\">You feel... unsmart.</span>")
M.take_brain_damage(3)
if (5)
if (prob(10))
M.show_message("<span style=\"color:red\">You completely forget what you were doing.</span>")
M.drop_item()
M.take_brain_damage(4)