Advanced Disease Rework (#28451)

* Reworks cures, adds strains, adds treatment chems to symptoms

* Enables coexistence of different samples of the same strain at different stages within the same container

* Adds symptom guessing. Correct guesses reduce analysis time and wrong ones increase it.

* Adds a chance for a virus to evolve into a new strain. changing the cure and adding/subtracting symptoms

* Revert "Adds a chance for a virus to evolve into a new strain. changing the cure and adding/subtracting symptoms"

This reverts commit 124dd485c7.

* Adds spontaneous virus mutations, strain tracking. Removes antibody metabolism

* change the amount of time added/reduced by each factor

* Creates a disease outbreak event that allows admins to cause an outbreak of a virus of their choosing. Allows virus creation when choosing virus to give someone or for an outbreak.

* The normal base property values are now the defaults for disease creation

* Rebuild TGUI

* Rebuild TGUI

* Rebuild TGUI

* Update tgui.bundle.js

* remove redundant lines

* improves ui some and moves to using world time for analysis time

* fixes a bug with the analysis time and updates the initial known advanced disease list

* Buffs the disease outbreak event and adds a base stat row to the PANDEMIC

* Update tgui.bundle.js

* Implements calibration

* Adds a remove from database button

* Moves the known disease global list to work per z level

* Removes treatments from most chems and makes each instance of a symptom not acting purge some of the reagent that treated it

* Update symptoms.dm

* Adds stage to unknown diseases

* Moves accumulated error to work per z level and change the location of the delete strain data button

* Adds confirmation to the delete data button and moves the disease text out of the loop in the copy constructor

* fix indentation

* Replaces pent with hydrocodone in the advanced cure list

* gives more buffs to event disease based on severity. removes longevity from possible symptoms an event disease can get.  Fixes a bug with determining analysis time

* Update tgui.bundle.js

* Update pandemic.dm

* Update pandemic.dm

* Update tgui.bundle.js

* review changes

* Update tgui.bundle.js

* Update tgui.bundle.js

* Update tgui.bundle.js

* Update tgui.bundle.js

* Update tgui.bundle.js

* Update tgui.bundle.js

* Update tgui.bundle.js

* Update tgui.bundle.js

* review changes

* Update tgui.bundle.js

* Makes vaccines only add resistances and no longer cure

* improves pandemic ui and fixes calibration button not being properly disabled

* Update tgui.bundle.js

* Add the new agars to the virologist's fridge

* lowered evolution chance of viruses a bit

* further lowers evolution chance

* Update advance.dm

* Changes the scaling of analysis time and fixes stage speed presentation in the pandemic

* Scanners can now see virus strains that have been inserted in the pandemic

* Allows a mob to be infected by both an event and non event disease

* Fixes the +1 syringe of translocation stabbing your feet

* Update tgui.bundle.js

* Changes spontanous mutation to be per spread and makes disease events less likely.

* Diseases less common, mutations happen only on spread now, symptom list ordered alphabetically in the dropdown, fixed some bugs

* Update tgui.bundle.js

* changes virus alerts

* Removes numbers from the virus alert text and fixes a bug that caused excessive virus mutations

* Update tgui.bundle.js

* refactor disease spread

* Changes disease spread logic to give players options to protect themselves and others

* Blackbox things

* Increases announcement timer and fixes the infection talley

* Update disease_outbreak.dm

* Adds an incubation period to advanced viruses. bumps sneeze back to 5 range

* Adds failsafe to disease outbreaks that will infect a random crew member if none have arrived in 10 minutes

* Only record advanced disease infections

* Properly handle recording of disease infection events

* Changed resistance effect on cure

* another adjustment to res effect on cure

* Small resist buff, spontanous combustion buff and some calculation fixes

* changes spontanous combustion stat bonuses and maluses

* Update flesh_eating.dm

* Update flesh_eating.dm

* Update flesh_eating.dm

* Big trait changes and rebalance

* adds treatments to fire and necro

* Introduces viral contamination of food and reagent containers, as well as disinfection

* Fix runtime in reagent transfers

* Revert the prefs and config changes

* Slowed down diseases and made symptoms more gradual, improved disease alerts to both crew and dchat

* Sterilizine now sterilizes things contaminated with viruses. Heat reactions now take place alongside chemical reactions when adding reagents to a beaker

* Adds option to order sterile masks, goggles and biosuits in packs of 4. Makes sterile masks as good as internals for viruses

* adds logging to pandemic

* Changes symptom stats and increased disease varaiety

* Fixes some disease bugs

* Fixes some bugs and makes it behave better

* Adds shiver emote to shiver symptom

* Adds admin message/log to contracting an event disease and fixes copy behaviour when infecting

* Prefix spread defines

* Change the rest of the macros

* correct the disinfection temp macro

* Moves disease signals to their own file

* move disnifection temp back

* fix a type

* viral contaminations component review changes

* var name changes

* more style fixes

* Update tgui.bundle.js

* fixes pandemic

* Fixes disease outbreak having two carriers sometimes and changes the virus alert to the new one

* Update disease_defines.dm

* fixes samples not passing stages on properly

* actually fixes the bug

* Fixes stabilization being lost on cloning

* Finally completely and absolutely fixes the sample stages bug(please)

* Makes the pandemic a machine

* Update pandemic.dm

* removed drinks from cure requirements

* lowers chance of major viral outbreak

* fixes pandemic not processing properly

* Changes the cure system to have more options

* Makes mixing event viruses more random

* Fixes hardsuits having a 1% chance to be infected

* Increases virus protection of most clothing. medical scrubs and surgical hat buffed sunstantially

* Slow down progress of diseases

* makes spread less likely

* envirosuit is now slightly more protective from viruses, while the medical one is as good as scrubs

* Adds further protection to helmets

* Increases the number of possible cures and the scaling of required cures

* Pandemic ui improvements

* Update _disease.dm

* fix a bug with spread target in the disease outbreak event

* changes some clothing permeability

* Adds the ability to make viral DNA extracts by injecting a sample into a black slime core. It's equivalent to 2 stages

* Adds age to health analyzer, makes viral evolution toggle minor disabilities, confusion symptom now confuses more often

* Update pandemic.dm

* replace lazarus with acetic acid in the cures

* Changes the relation of the amount of cure options to required cures and the scaling of required cures with resistance

* Fixes virus renaming

* changes description and permeability of some medical jumpsuits

* Adds a list of all diseases infecting client mobs to the disease outbreak event

* uses event UID instead of ref in the disease

* Adds advanced disease carriers to admin antag menu

* Adds viral eraser which removes tracking and stabilizing. Admin spawn only for now

* Update tgui.bundle.js

* Adds the ability to create viral genetic material using radiation. it can be used in addition to that produced in xenobio

* changes alert logic, disease generation logic, adds treatments to weakness, cough and sneeze now more gradual and cough spreads at range 3

* makes disease advance a bit faster

* reduce time to announcement to 6 minutes after 3 people are infected

* Changes medibot disease detection to be the same as analyzers. Treatment chems now put the symptom on a cooldown that persists after they leave the body.

* Make sure the disease outbreak event only selects crew

* Fix abductor virus gland virus generation

* Adds sterilizine to viro locker

* Fixes null viruses appearing when merging virusless blood

* Adds oculine to hyphema treatments

* Rebalances weight loss and flesh eating

* Improvements to advanced disease carrier tab on the TGUI antag menu

* change the flag on away missions

* Update mob_spawn.dm

* Update tgui.bundle.js

* adds sterilizine recipe back

* Adds viral contamination to surgery tools and surgery steps

* small changes

* fixes pandemic ui. should work properly now(I hope)

* CI compliance

* Update flesh_eating.dm

* Update vomit.dm

* Update tgui.bundle.js

* Initial revision of analysis and fixes the UI issue with multiple stage samples

* refactors treatment and makes treatment chems more adjustable

* var correction

* symptoms and their contribution now show up on the pandemic

* Update tgui.bundle.js

* Update code/datums/diseases/advance/symptoms/cough.dm

Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>

* change wizard disease and zombie disease macros to new ones

* Update tgui.bundle.js

* changes the part requirements on the pandemic boards to fit the actual parts

* fix misbehaviour when inserting samples without symptoms

* Some changes to difficulty scaling, reverts the level of projectile vomiting back to 4, and disallows germaphobes to avoid infection by injection

* Adds viral contamination to IV bags

---------

Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
Migratingcocofruit
2025-08-08 04:54:36 +03:00
committed by GitHub
parent 4f77a856f0
commit a5260456ae
133 changed files with 2484 additions and 1117 deletions
@@ -126,7 +126,7 @@
/turf/simulated/floor/plating/damaged/airless,
/area/ruin/unpowered)
"aZ" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/plasteel/airless,
/area/ruin/unpowered)
"Di" = (
@@ -4554,7 +4554,7 @@
},
/area/ruin/space/deepstorage)
"BU" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/plasteel{
dir = 10;
icon_state = "white"
@@ -4728,7 +4728,7 @@
},
/area/ruin/unpowered/syndicate_space_base/genetics)
"Br" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
+1 -1
View File
@@ -264,7 +264,7 @@
/turf/simulated/floor/plating,
/area/shuttle/administration)
"bp" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/mineral/titanium,
/area/shuttle/administration)
"br" = (
+1 -1
View File
@@ -32777,7 +32777,7 @@
},
/area/station/science/genetics)
"cpL" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "whitegreen"
+1 -1
View File
@@ -79121,7 +79121,7 @@
/turf/simulated/floor/wood,
/area/station/hallway/secondary/entry/south)
"ptq" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
+1 -1
View File
@@ -95690,7 +95690,7 @@
/turf/simulated/floor/plasteel/white,
/area/station/medical/virology)
"wWX" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/obj/effect/turf_decal/delivery/green,
/turf/simulated/floor/plasteel{
dir = 8;
+1 -1
View File
@@ -8647,7 +8647,7 @@
/area/station/maintenance/dorms/port)
"bJK" = (
/obj/machinery/newscaster/directional/east,
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "whitegreen"
+1 -1
View File
@@ -21015,7 +21015,7 @@
/turf/simulated/floor/plasteel,
/area/station/hallway/primary/central/south)
"ccp" = (
/obj/machinery/computer/pandemic,
/obj/machinery/pandemic,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "whitegreen"
+4
View File
@@ -0,0 +1,4 @@
/// Sent when the conditions to disinfect an atom are met
#define COMSIG_ATOM_DISINFECTED "atom_disinfected"
/// Sent when something is eaten or drunk by a mob
#define COMSIG_MOB_REAGENT_EXCHANGE "mob_reagent_exchange"
+40
View File
@@ -0,0 +1,40 @@
/// Temperature at which objects contaminated by viruses are disinfected
#define VIRUS_DISINFECTION_TEMP (T0C + 60)
/// The maximum amount of symptoms a virus can have
#define VIRUS_SYMPTOM_LIMIT 6
/// The maximum amount of time a symptom will be delayed for after the treating reagents have left the body
#define VIRUS_MAX_TREATMENT_TIMER 300
#define VIRUS_TREATMENT_TIMER_MOD 2
/// Evoltion chance each cycle in percents.
/// The base chance in % that a virus will mutate as it spreads. Further modified by stage speed and the viral evolutionary acceleration trait
#define VIRUS_EVOLUTION_CHANCE 2
//Visibility Flags
#define VIRUS_HIDDEN_SCANNER (1<<0)
#define VIRUS_HIDDEN_PANDEMIC (1<<1)
//Disease Flags
#define VIRUS_CURABLE (1<<0)
#define VIRUS_CAN_CARRY (1<<1)
#define VIRUS_CAN_RESIST (1<<2)
//Spread Flags
#define SPREAD_SPECIAL (1<<0)
#define SPREAD_NON_CONTAGIOUS (1<<1)
#define SPREAD_BLOOD (1<<2)
#define SPREAD_CONTACT_FEET (1<<3)
#define SPREAD_CONTACT_HANDS (1<<4)
#define SPREAD_CONTACT_GENERAL (1<<5)
#define SPREAD_AIRBORNE (1<<6)
//Severity Defines
#define VIRUS_NONTHREAT "No threat"
#define VIRUS_MINOR "Minor"
#define VIRUS_MEDIUM "Medium"
#define VIRUS_HARMFUL "Harmful"
#define VIRUS_DANGEROUS "Dangerous!"
#define VIRUS_BIOHAZARD "BIOHAZARD THREAT!"
+21
View File
@@ -115,6 +115,27 @@
return "[output][and_text][input[index]]"
// Returns a map in plain english as a string
/proc/english_map(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
var/total = length(input)
if(!total)
return "[nothing_text]"
else if(total == 1)
return "[input[1]]"
else if(total == 2)
return "[input[1]][and_text][input[2]]"
else
var/output = ""
var/index = 1
while(index < total)
if(index == total - 1)
comma_text = final_comma_text
output += "[input[index]] : [input[input[index]]][comma_text]"
index++
return "[output][and_text][input[index]] : [input[input[index]]]"
//Returns list element or null. Should prevent "index out of bounds" error.
/proc/listgetindex(list/list, index)
if(istype(list) && length(list))
+3 -2
View File
@@ -31,8 +31,9 @@
insulation = thing.rad_insulation_beta
if(GAMMA_RAD)
insulation = thing.rad_insulation_gamma
/// 1 means no rad insulation, which means perfectly permeable, so no interaction with it directly, but the contents might be relevant.
if(insulation < 1)
// 1 means no rad insulation, which means perfectly permeable, so no interaction with it directly, but the contents might be relevant.
// HAS_TRAIT is used manually here since the macros for HAS_TRAIT as well as the traits aren't being recognized here
if(insulation < 1 || (thing.status_traits ? (thing.status_traits["absorb_rads"] ? TRUE : FALSE) : FALSE))
if(istype(thing, /obj/structure/window))
window_priority += thing
else if(istype(thing, /obj/machinery/power/rad_collector))
+6
View File
@@ -315,6 +315,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// A surgical tool; If a surgical tool has this flag it can be used as an alternative to an open hand in surgery
#define TRAIT_SURGICAL_OPEN_HAND "surgical_hand_alternative"
/// A wearable item that protects the covered areas from viral infection
#define TRAIT_ANTI_VIRAL "anti_viral"
/// Given to items that have something that absorbs radiation in them that is neither the item or in it's contents
#define TRAIT_ABSORB_RADS "absorb_rads"
/// Prevent mobs on the turf from being affected by anything below that turf, such as a pulse demon going under it. Added by a /obj/structure with creates_cover set to TRUE
#define TRAIT_TURF_COVERED "turf_covered"
+2 -2
View File
@@ -13,7 +13,7 @@ GLOBAL_LIST_INIT(drinks, list("beer2","hot_coco","orangejuice","tomatojuice","li
"berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana", "bungojuice",
"nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee",
"icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb",
"space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater",
"space_up","lemon_lime","triple_citrus","beer","whiskey","gin","rum","vodka","holywater",
"tequila","vermouth","wine","tonic","kahlua","cognac","ale","sodawater",
"ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic",
"cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail",
@@ -50,5 +50,5 @@ GLOBAL_LIST_INIT(blocked_chems, list("polonium", "initropidril", "concentrated_i
"teslium_paste", "omnizine_no_addiction", "zombiecure1",
"zombiecure2", "zombiecure3", "zombiecure4",
"admincleaner_all", "admincleaner_item", "admincleaner_mob",
"synthetic_omnizine_no_addiction", "surge_plus"
"synthetic_omnizine_no_addiction", "surge_plus", "viral_eraser"
))
+3 -1
View File
@@ -146,7 +146,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ITEM_ACTIVE" = TRAIT_ITEM_ACTIVE,
"TRAIT_NO_STRIP" = TRAIT_NO_STRIP,
"TRAIT_SKIP_EXAMINE" = TRAIT_SKIP_EXAMINE,
"TRAIT_I_WANT_BRAINS_ORGAN" = TRAIT_I_WANT_BRAINS_ORGAN
"TRAIT_I_WANT_BRAINS_ORGAN" = TRAIT_I_WANT_BRAINS_ORGAN,
"TRAIT_ANTI_VIRAL" = TRAIT_ANTI_VIRAL,
"TRAIT_ABSORB_RADS" = TRAIT_ABSORB_RADS
),
/turf = list(
@@ -0,0 +1,45 @@
/datum/component/viral_contamination
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
/// Asoc list of virus Ids to virus refs.
var/list/viruses = list()
/datum/component/viral_contamination/Initialize(_viruses)
if(!isobj(parent))
return COMPONENT_INCOMPATIBLE
for(var/datum/disease/virus in _viruses)
// If we don't have a copy of this virus, put one it
if(virus.spread_flags >= SPREAD_BLOOD && !(virus.GetDiseaseID() in viruses))
viruses += list("[virus.GetDiseaseID()]" = virus.Copy())
RegisterSignal(parent, COMSIG_MOB_REAGENT_EXCHANGE, PROC_REF(infect_target))
RegisterSignal(parent, COMSIG_ATOM_DISINFECTED, PROC_REF(disinfect))
/datum/component/viral_contamination/InheritComponent(datum/component/viral_contamination/C, i_am_original, _viruses)
if(!i_am_original)
return
var/list/virus_list = list()
if(C)
virus_list = C.viruses
// Add a copy of each virus to our list if we don't already have one
for(var/disease_id in virus_list)
if(!(disease_id in viruses))
var/datum/disease/virus = C.viruses["[disease_id]"]
viruses += list("[disease_id]" = virus.Copy())
else
virus_list = _viruses
// Add a copy of each virus to our list if we don't already have on
for(var/datum/disease/virus in virus_list)
if(virus.spread_flags >= SPREAD_BLOOD && !(virus.GetDiseaseID() in viruses))
viruses += list(list("[virus.GetDiseaseID()]" = virus.Copy()))
/datum/component/viral_contamination/proc/infect_target(atom/source, mob/target)
SIGNAL_HANDLER // COMSIG_MOB_REAGENT_EXCHANGE
if(!istype(target))
return
for(var/disease_id in viruses)
var/datum/disease/virus = viruses[disease_id]
if(istype(virus))
target.ForceContractDisease(virus, FALSE)
/datum/component/viral_contamination/proc/disinfect(atom/source)
SIGNAL_HANDLER // COMSIG_ATOM_DISINFECTED
qdel(src)
+172 -142
View File
@@ -1,13 +1,14 @@
/mob/proc/HasDisease(datum/disease/D)
for(var/thing in viruses)
var/datum/disease/DD = thing
if(DD.IsSame(D))
return TRUE
return FALSE
/*
MARK: Contraction
/mob/proc/CanContractDisease(datum/disease/D)
MARK: Helpers
*/
/mob/proc/check_contraction_mob(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
if(stat == DEAD && !D.allow_dead)
return FALSE
@@ -17,145 +18,30 @@
if(HasDisease(D))
return FALSE
if(istype(D, /datum/disease/advance) && count_by_type(viruses, /datum/disease/advance) > 0)
return FALSE
if(istype(D, /datum/disease/advance))
var/datum/disease/advance/advanced = D
for(var/datum/disease/advance/exists in viruses)
if(exists.event == advanced.event)
return FALSE
if(!(type in D.viable_mobtypes))
return -1 //for stupid fucking monkies
return TRUE
/mob/living/carbon/proc/check_contraction_carbon(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
// positive satiety makes it harder to contract the disease.
return (spread_method & SPREAD_BLOOD) || !((satiety > 0 && prob(satiety/10)) || (prob(15/D.permeability_mod)))
/mob/proc/ContractDisease(datum/disease/D)
if(!CanContractDisease(D))
return 0
AddDisease(D)
return TRUE
/mob/living/carbon/human/proc/check_contraction_human(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
if((HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity))
return FALSE
/mob/proc/AddDisease(datum/disease/D, respect_carrier = FALSE)
var/datum/disease/DD = new D.type(1, D, 0)
viruses += DD
DD.affected_mob = src
GLOB.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
//Copy properties over. This is so edited diseases persist.
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
if(respect_carrier)
skipped -= "carrier"
for(var/V in DD.vars)
if(V in skipped)
continue
if(istype(DD.vars[V],/list))
var/list/L = D.vars[V]
DD.vars[V] = L.Copy()
else
DD.vars[V] = D.vars[V]
create_log(MISC_LOG, "has contacted the virus \"[DD]\"")
DD.affected_mob.med_hud_set_status()
/mob/living/carbon/ContractDisease(datum/disease/D)
if(!CanContractDisease(D))
return 0
// We transfer to the blood directly
if(spread_method == SPREAD_BLOOD)
return TRUE
if(src.mind && HAS_TRAIT(src.mind, TRAIT_GERMOPHOBE) && prob(85))
return 0
var/obj/item/clothing/Cl = null
var/passed = 1
var/head_ch = 100
var/body_ch = 100
var/hands_ch = 25
var/feet_ch = 25
if(D.spread_flags & CONTACT_HANDS)
head_ch = 0
body_ch = 0
hands_ch = 100
feet_ch = 0
if(D.spread_flags & CONTACT_FEET)
head_ch = 0
body_ch = 0
hands_ch = 0
feet_ch = 100
if(prob(15/D.permeability_mod))
return
if(satiety > 0 && prob(satiety/10)) // positive satiety makes it harder to contract the disease.
return
var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)
if(ishuman(src))
var/mob/living/carbon/human/H = src
switch(target_zone)
if(1)
if(isobj(H.head) && !istype(H.head, /obj/item/paper))
Cl = H.head
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.wear_mask))
Cl = H.wear_mask
passed = prob((Cl.permeability_coefficient*100) - 1)
if(2)
if(isobj(H.wear_suit))
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.w_uniform))
Cl = H.w_uniform
passed = prob((Cl.permeability_coefficient*100) - 1)
if(3)
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS)
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.gloves))
Cl = H.gloves
passed = prob((Cl.permeability_coefficient*100) - 1)
if(4)
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET)
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.shoes))
Cl = H.shoes
passed = prob((Cl.permeability_coefficient*100) - 1)
if(!passed && (D.spread_flags & AIRBORNE) && !internal)
passed = (prob((50*D.permeability_mod) - 1))
if(passed)
AddDisease(D)
return passed
/**
* Forces the mob to contract a virus. If the mob can have viruses. Ignores clothing and other protection
* Returns TRUE if it succeeds. False if it doesn't
*
* Arguments:
* * D - the disease the mob will try to contract
* * respect_carrier - if set to TRUE will not ignore the disease carrier flag
* * notify_ghosts - will notify ghosts of infection if set to TRUE
*/
//Same as ContractDisease, except never overidden clothes checks
/mob/proc/ForceContractDisease(datum/disease/D, respect_carrier, notify_ghosts = FALSE)
if(!CanContractDisease(D))
return FALSE
if(notify_ghosts)
for(var/mob/ghost as anything in GLOB.dead_mob_list) //Announce outbreak to dchat
to_chat(ghost, "<span class='deadsay'><b>Disease outbreak: </b>[src] ([ghost_follow_link(src, ghost)]) [D.carrier ? "is now a carrier of" : "has contracted"] [D]!</span>")
AddDisease(D, respect_carrier)
return TRUE
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
if(HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity)
return FALSE
for(var/organ in D.required_organs)
@@ -166,13 +52,157 @@
if(locate(organ) in bodyparts)
continue
return FALSE
return ..()
/mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D)
var/passed = FALSE
if(spread_method & (SPREAD_CONTACT_FEET | SPREAD_CONTACT_HANDS | SPREAD_CONTACT_GENERAL))
passed = TRUE
var/obj/item/clothing/covering_garment = null
var/head_ch = 100
var/body_ch = 100
var/hands_ch = 25
var/feet_ch = 25
if(D.spread_flags & SPREAD_CONTACT_HANDS)
head_ch = 0
body_ch = 0
hands_ch = 100
feet_ch = 0
if(D.spread_flags & SPREAD_CONTACT_FEET)
head_ch = 0
body_ch = 0
hands_ch = 0
feet_ch = 100
var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)
switch(target_zone)
if(1)
if(isobj(head) && !istype(head, /obj/item/paper))
covering_garment = head
passed = prob((covering_garment.permeability_coefficient*100) - 1)
if(passed && isobj(wear_mask))
covering_garment = wear_mask
passed = prob((covering_garment.permeability_coefficient*100) - 1)
if(2)
if(isobj(wear_suit))
covering_garment = wear_suit
passed = prob((covering_garment.permeability_coefficient*100) - 1)
if(passed && isobj(w_uniform))
covering_garment = w_uniform
passed = prob((covering_garment.permeability_coefficient*100) - 1)
if(3)
if(isobj(wear_suit) && wear_suit.body_parts_covered&HANDS)
covering_garment = wear_suit
passed = prob((covering_garment.permeability_coefficient*100) - 1)
if(passed && isobj(gloves))
covering_garment = gloves
passed = prob((covering_garment.permeability_coefficient*100) - 1)
if(4)
if(isobj(wear_suit) && wear_suit.body_parts_covered&FEET)
covering_garment = wear_suit
passed = prob((covering_garment.permeability_coefficient*100) - 1)
if(passed && isobj(shoes))
covering_garment = shoes
passed = prob((covering_garment.permeability_coefficient*100) - 1)
// If spreading by air we need to get through the mask and helmet.
if(!passed && (spread_method & SPREAD_AIRBORNE))
// Check for eye protection
var/eye_check = !((wear_mask?.flags_cover & MASKCOVERSEYES) || (head?.flags_cover & HEADCOVERSEYES) || (glasses?.flags_cover & GLASSESCOVERSEYES))
// Masks and hoods protect our mouth from sneezes, but not truely airborn viruses
var/mouth_check = ((prob((wear_mask?.permeability_coefficient*100) - 1) || !(wear_mask?.flags_cover & MASKCOVERSMOUTH)) && (prob((head?.permeability_coefficient*100) - 1) || !(head?.flags_cover & HEADCOVERSMOUTH)))
// A further check on the mask against airborne diseases
var/breath_check = !internal && (D.spread_flags & SPREAD_AIRBORNE) && prob(100 * D.permeability_mod) && !((wear_mask?.flags_cover & MASKCOVERSMOUTH && HAS_TRAIT(wear_mask, TRAIT_ANTI_VIRAL)) || (head?.flags_cover & MASKCOVERSMOUTH && HAS_TRAIT(head, TRAIT_ANTI_VIRAL)))
// If anything gets penetrated we contract the disease.
passed = eye_check || mouth_check || breath_check
return passed
// MARK: Mob
/// Grinds a mob in the turbine
/mob/compressor_grind()
gib()
/// Returns whether or not the mob has the disease
/mob/proc/HasDisease(datum/disease/D)
for(var/datum/disease/DD in viruses)
if(DD.IsSame(D))
return TRUE
return FALSE
/// Checks if a mob can contract the disease
/mob/proc/can_contract_disease(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
return check_contraction_mob(D, spread_method)
/mob/proc/can_spread_disease(D, spread_method = SPREAD_CONTACT_GENERAL)
return TRUE
// Attempt contracting a diseas
/mob/proc/ContractDisease(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
if(!can_contract_disease(D, spread_method))
return FALSE
AddDisease(D)
return TRUE
/**
* Forces the mob to contract a virus. If the mob can have viruses. Ignores clothing and other protection
* Returns TRUE if it succeeds. False if it doesn't
*
* Arguments:
* * D - the disease the mob will try to contract
* * respect_carrier - if set to TRUE will not ignore the disease carrier flag
* * notify_ghosts - will notify ghosts of infection if set to TRUE
*/
//Same as ContractDisease, except it ignores the clothes check
/mob/proc/ForceContractDisease(datum/disease/D, respect_carrier, notify_ghosts = FALSE)
if(!can_contract_disease(D, SPREAD_BLOOD))
return FALSE
if(notify_ghosts)
for(var/mob/ghost as anything in GLOB.dead_mob_list) //Announce outbreak to dchat
to_chat(ghost, "<span class='deadsay'><b>Disease outbreak: </b>[src] ([ghost_follow_link(src, ghost)]) [D.carrier ? "is now a carrier of" : "has contracted"] [D]!</span>")
message_admins("[key_name(src)] [D.carrier ? "is now a carrier of" : "has contracted"] [D]!")
log_admin("[key_name(src)] [D.carrier ? "is now a carrier of" : "has contracted"] [D]!")
AddDisease(D, respect_carrier)
return TRUE
/// Directly adds a disease to a mob.
/mob/proc/AddDisease(datum/disease/D, respect_carrier = FALSE, start_stage = 1)
if(client)
D.record_infection()
var/datum/disease/DD = D.Copy(FALSE)
DD.stage = start_stage
viruses += DD
DD.affected_mob = src
GLOB.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
if(respect_carrier)
DD.carrier = D.carrier
create_log(MISC_LOG, "has contracted the virus \"[DD]\"")
DD.affected_mob.med_hud_set_status()
DD.after_infect()
// MARK: Carbon
/mob/living/carbon/can_spread_disease(D, spread_method = SPREAD_CONTACT_GENERAL)
return check_contraction_carbon(D, spread_method)
/mob/living/carbon/can_contract_disease(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
return ..() && check_contraction_carbon(D)
//MARK: Human
/mob/living/carbon/human/can_spread_disease(D, spread_method = SPREAD_CONTACT_GENERAL)
return check_contraction_human(D, spread_method)
/mob/living/carbon/human/can_contract_disease(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
return check_contraction_human(D, spread_method) && ..()
/mob/living/carbon/human/monkey/can_contract_disease(datum/disease/D, spread_method = SPREAD_CONTACT_GENERAL)
. = ..()
if(. == -1)
if(D.viable_mobtypes.Find(/mob/living/carbon/human))
return 1 //this is stupid as fuck but because monkeys are only half the time actually subtypes of humans they need this
/mob/compressor_grind()
gib()
+85 -41
View File
@@ -1,42 +1,12 @@
#define VIRUS_SYMPTOM_LIMIT 6
//Visibility Flags
#define HIDDEN_SCANNER (1<<0)
#define HIDDEN_PANDEMIC (1<<1)
//Disease Flags
#define CURABLE (1<<0)
#define CAN_CARRY (1<<1)
#define CAN_RESIST (1<<2)
//Spread Flags
#define SPECIAL (1<<0)
#define NON_CONTAGIOUS (1<<1)
#define BLOOD (1<<2)
#define CONTACT_FEET (1<<3)
#define CONTACT_HANDS (1<<4)
#define CONTACT_GENERAL (1<<5)
#define AIRBORNE (1<<6)
//Severity Defines
#define NONTHREAT "No threat"
#define MINOR "Minor"
#define MEDIUM "Medium"
#define HARMFUL "Harmful"
#define DANGEROUS "Dangerous!"
#define BIOHAZARD "BIOHAZARD THREAT!"
GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
/datum/disease
//Flags
var/visibility_flags = 0
var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST
var/spread_flags = AIRBORNE
var/disease_flags = VIRUS_CURABLE|VIRUS_CAN_CARRY|VIRUS_CAN_RESIST
var/spread_flags = SPREAD_AIRBORNE
//Fluff
/// Used for identification of viruses in the Medical Records Virus Database
@@ -60,19 +30,21 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
//Other
var/list/viable_mobtypes = list() //typepaths of viable mobs
var/mob/living/carbon/affected_mob
var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids
var/list/cures = list() //list of cures if the disease has the VIRUS_CURABLE flag, these are reagent ids
var/infectivity = 65
var/cure_chance = 8
var/carrier = FALSE //If our host is only a carrier
var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
var/virus_heal_resistant = FALSE // Some things aren't technically viruses/traditional diseases and should be immune to edge case cure methods, like healing viruses.
var/permeability_mod = 1
var/severity = NONTHREAT
var/severity = VIRUS_NONTHREAT
var/list/required_organs = list()
var/needs_all_cures = TRUE
var/list/strain_data = list() //dna_spread special bullshit
/// Allow the virus to infect and process while the affected_mob is dead
var/allow_dead = FALSE
/// How many cycles we should incubate
var/incubation = 0
/datum/disease/Destroy()
affected_mob = null
@@ -80,10 +52,19 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
return ..()
/datum/disease/proc/stage_act()
// Still incubating, do nothing
if(incubation)
if(is_species(affected_mob, /datum/species/monkey))
incubation = 0
else
incubation--
return FALSE
// We have no host
if(!affected_mob)
return FALSE
var/cure = has_cure()
// This is patient 0 and we aren't curing them. Do nothing
if(carrier && !cure)
return FALSE
@@ -104,14 +85,14 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
if(has_cure && prob(cure_chance))
stage = max(stage - 1, 1)
if(disease_flags & CURABLE)
if(disease_flags & VIRUS_CURABLE)
if(has_cure && prob(cure_chance))
cure()
return FALSE
return TRUE
/datum/disease/proc/has_cure()
if(!(disease_flags & CURABLE))
if(!(disease_flags & VIRUS_CURABLE))
return 0
var/cures_found = 0
@@ -132,7 +113,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
if(!affected_mob)
return
if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
if((spread_flags & SPREAD_SPECIAL || spread_flags & SPREAD_NON_CONTAGIOUS || spread_flags & SPREAD_BLOOD) && !force_spread)
return
if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
@@ -143,17 +124,29 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
if(force_spread)
spread_range = force_spread
if(spread_flags & AIRBORNE)
if(spread_flags & SPREAD_AIRBORNE)
spread_range++
var/spread_method = NONE
// If we do an airborne spread we will do that as well as other spreads
if((spread_flags & SPREAD_AIRBORNE) || spread_range > 1)
spread_method |= SPREAD_AIRBORNE
var/turf/target = affected_mob.loc
if(istype(target))
for(var/mob/living/carbon/C in oview(spread_range, affected_mob))
// Assume we are touching
spread_method |= (SPREAD_CONTACT_GENERAL | SPREAD_CONTACT_FEET | SPREAD_CONTACT_HANDS)
var/turf/current = get_turf(C)
if(current)
while(TRUE)
// Found a path from target to source that isn't atmos blocked. Try to give them the disease
if(current == target)
C.ContractDisease(src)
// If we are further than 1 tile we aren't touching
if(get_dist(target, C) > 1)
spread_method &= ~(SPREAD_CONTACT_GENERAL | SPREAD_CONTACT_FEET | SPREAD_CONTACT_HANDS)
// We also want to test our own mob's permeability so people in hardsuits with internals won't just infect others with sneezes or touch
affected_mob.can_spread_disease(src, spread_method) && C.ContractDisease(src, spread_method)
break
var/direction = get_dir(current, target)
var/turf/next = get_step(current, direction)
@@ -161,16 +154,23 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
break
current = next
/datum/disease/proc/after_infect()
return
/datum/disease/proc/cure()
if(affected_mob)
if(disease_flags & CAN_RESIST)
if(disease_flags & VIRUS_CAN_RESIST)
if(!(type in affected_mob.resistances))
affected_mob.resistances += type
remove_virus()
affected_mob.create_log(MISC_LOG, "has been cured from the virus \"[src]\"")
qdel(src)
// Gives the received mob a resistance to this disease. Does not cure it if they are already infected
/datum/disease/proc/make_resistant(mob/living/target)
if(target && disease_flags & VIRUS_CAN_RESIST && !(type in target.resistances))
target.resistances += type
/datum/disease/proc/IsSame(datum/disease/D)
if(ispath(D))
return istype(src, D)
@@ -183,12 +183,35 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
D.strain_data = strain_data.Copy()
return D
/datum/disease/proc/get_required_cures()
return needs_all_cures ? length(cures) : 1
/datum/disease/proc/is_stabilized()
return TRUE
/datum/disease/proc/get_tracker()
return ""
/datum/disease/proc/get_stage()
return stage
/datum/disease/proc/GetDiseaseID()
return type
// Id for the pandemic
/datum/disease/proc/get_ui_id()
return name
// Another Id for the pandemic. We need multiple procs so we can override them in different ways
/datum/disease/proc/get_strain_id()
return name
// Another Id for the pandemic.
/datum/disease/proc/get_full_strain_id()
return name
/datum/disease/proc/IsSpreadByTouch()
if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL)
if(spread_flags & SPREAD_CONTACT_FEET || spread_flags & SPREAD_CONTACT_HANDS || spread_flags & SPREAD_CONTACT_GENERAL)
return 1
return 0
@@ -196,3 +219,24 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
/datum/disease/proc/remove_virus()
affected_mob.viruses -= src //remove the datum from the list
affected_mob.med_hud_set_status()
/// Not interested in normal diseases right now
/datum/disease/proc/record_infection()
return
/// Returns whether or not the disease is known
/datum/disease/proc/is_known(z)
return TRUE
/// Returns an Asoc list of disease's symptoms and their properties in a format usable by the PANDEMIC
/datum/disease/proc/get_pandemic_symptoms()
return list()
/// Returns the Disease's base stats
/datum/disease/proc/get_pandemic_base_stats()
return list(
"resistance" = 0,
"stealth" = 0,
"stageSpeed" = 0,
"transmissibility" = 0,
)
+293 -92
View File
@@ -1,3 +1,4 @@
/*
Advance Disease is a system for Virologist to Engineer their own disease with symptoms that have effects and properties
@@ -6,16 +7,30 @@
If you need help with creating new symptoms or expanding the advance disease, ask for Giacom on #coderbus.
*/
GLOBAL_VAR_INIT(next_unique_strain, 1)
GLOBAL_LIST_EMPTY(archive_diseases)
// The order goes from easy to cure to hard to cure.
GLOBAL_LIST_INIT(advance_cures, list(
GLOBAL_LIST_INIT(standard_cures, list(
"sodiumchloride", "sugar", "orangejuice",
"spaceacillin", "salglu_solution", "ethanol",
"teporone", "diphenhydramine", "lipolicide",
"silver", "gold"
))
GLOBAL_LIST_INIT(advanced_cures, list(
"atropine", "mitocholide", "acetic_acid",
"cryoxadone", "hydrocodone", "haloperidol",
"degreaser", "perfluorodecalin"
))
GLOBAL_LIST_INIT(plant_cures,list(
"bicaridine", "kelotane", "omnizine",
"synaptizine", "weak_omnizine", "morphine",
"cbd", "thc", "nicotine" , "psilocybin"
))
/*
PROPERTIES
@@ -31,12 +46,31 @@ GLOBAL_LIST_INIT(advance_cures, list(
max_stages = 5
spread_text = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
incubation = 60
// NEW VARS
var/list/symptoms = list() // The symptoms of the disease.
/// The base properties of the virus. retained between strains
var/list/base_properties = list("resistance" = 1, "stealth" = 0, "stage rate" = 1, "transmissibility" = 1)
/// Chance of the virus evolving on spread
var/evolution_chance = VIRUS_EVOLUTION_CHANCE
/// The symptoms of the disease.
var/list/symptoms = list()
/// A unique ID for the strain and symptoms.
var/id = ""
/// Saves an ID. If that ID is analyzed the virus will be automatically analyzed when inserted into the PANDEMIC
var/tracker = ""
var/processing = FALSE
/// A unique ID for the strain. Uses the unique_datum_id of the first virus datum that is of that strain.
var/strain = ""
/// The event the virus came from, if it did
var/event
/// How far along the disease has progressed? This is tied with stage but is separate to give more granularity to symptom effects
var/progress = 0
/// The time at which the disease last advanced
var/last_advancement = 0
/// The number of cures from the cure list required to cure a patient
var/cures_required = 1
/*
@@ -44,46 +78,102 @@ GLOBAL_LIST_INIT(advance_cures, list(
*/
/datum/disease/advance/New(process = 1, datum/disease/advance/D)
if(!istype(D))
D = null
/datum/disease/advance/New(datum/disease/advance/to_copy, _event = NONE, copy_stage = TRUE)
if(!istype(to_copy))
to_copy = null
strain = "origin"
event = _event
last_advancement = world.time
// whether to generate a new cure or not
var/new_cure = TRUE
// Generate symptoms if we weren't given any.
if(!symptoms || !length(symptoms))
if(!D || !D.symptoms || !length(D.symptoms))
if(!to_copy || !to_copy.symptoms || !length(to_copy.symptoms))
symptoms = GenerateSymptoms(0, 2)
else
for(var/datum/symptom/S in D.symptoms)
for(var/datum/symptom/S in to_copy.symptoms)
symptoms += new S.type
// Copy cure, evolution ability and strain if we are copying an existing disease
if(to_copy)
name = to_copy.name
base_properties = to_copy.base_properties.Copy()
evolution_chance = to_copy.evolution_chance
tracker = to_copy.tracker
for(var/cure_reagent in to_copy.cures)
cures += cure_reagent
cure_text = to_copy.cure_text
strain = to_copy.strain
if(copy_stage)
stage = to_copy.stage
event = to_copy.event
new_cure = FALSE
Refresh(FALSE, FALSE , new_cure, FALSE)
Refresh()
..(process, D)
return
/datum/disease/advance/Destroy()
if(processing)
for(var/datum/symptom/S in symptoms)
S.End(src)
if(event)
var/datum/event/disease_outbreak/outbreak = locateUID(event)
if(istype(outbreak) && !QDELETED(outbreak))
outbreak.infected_players -= src
return ..()
/// Randomly mutate the disease
/datum/disease/advance/after_infect()
if(event && affected_mob.mind)
var/datum/event/disease_outbreak/outbreak = locateUID(event)
if(istype(outbreak) && !QDELETED(outbreak))
outbreak.infected_players |= src
if(prob(evolution_chance))
if(affected_mob.mind)
SSblackbox.record_feedback("tally", "Advanced Disease", 1, "Spontanous Evolution")
var/min = rand(1, 6)
var/max = rand(min, 6)
var/last_strain = strain
// In most cases we try to gain a symptom, rarely we lose one
if(prob(95))
Evolve(min, max)
else
Devolve()
// Create a new strain even if we didn't gain or lose symptoms
if(last_strain == strain)
Refresh()
// Randomly pick a symptom to activate.
/datum/disease/advance/stage_act()
if(!..())
return FALSE
if(symptoms && length(symptoms))
var/list/mob_reagents = list()
for(var/datum/reagent/chem in affected_mob.reagents.reagent_list)
mob_reagents += list("[chem.id]" = chem.volume)
if(!processing)
processing = TRUE
for(var/datum/symptom/S in symptoms)
S.Start(src)
for(var/datum/symptom/S in symptoms)
S.Activate(src)
else
CRASH("We do not have any symptoms during stage_act()!")
return TRUE
/datum/disease/advance/spread(force_spread)
if(carrier || force_spread || prob(40 + progress))
return ..()
/datum/disease/advance/handle_stage_advance(has_cure = FALSE)
if(!has_cure && (prob(stage_prob) || world.time > last_advancement + 1000))
last_advancement = world.time
progress = min(progress + 6, 100)
stage = min(ceil(progress / 20), max_stages)
if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) // Once we reach a late enough stage, medical HUDs can pick us up even if we regress
discovered = TRUE
affected_mob.med_hud_set_status()
// Compares type then ID.
/datum/disease/advance/IsSame(datum/disease/advance/D)
if(ispath(D))
@@ -97,6 +187,11 @@ GLOBAL_LIST_INIT(advance_cures, list(
return TRUE
/datum/disease/advance/handle_cure_testing(has_cure = FALSE)
. = ..()
if(has_cure)
progress = min(progress, stage * 20)
// To add special resistances.
/datum/disease/advance/cure(resistance=1)
if(affected_mob)
@@ -106,9 +201,19 @@ GLOBAL_LIST_INIT(advance_cures, list(
remove_virus()
qdel(src) //delete the datum to stop it processing
// Gives the mob a resistance to this disease. Does not cure it if they are already infected
/datum/disease/advance/make_resistant(mob/living/target)
if(target)
var/id = "[GetDiseaseID()]"
if(!(id in target.resistances))
target.resistances[id] = id
// Returns the advance disease with a different reference memory.
/datum/disease/advance/Copy(process = 0)
return new /datum/disease/advance(process, src, 1)
/datum/disease/advance/Copy(copy_stage = TRUE)
return new /datum/disease/advance(to_copy = src, copy_stage = copy_stage)
/datum/disease/advance/record_infection()
SSblackbox.record_feedback("tally", "Advanced Disease", 1, "[name]_[strain] Infection")
/*
@@ -119,7 +224,12 @@ GLOBAL_LIST_INIT(advance_cures, list(
// Mix the symptoms of two diseases (the src and the argument)
/datum/disease/advance/proc/Mix(datum/disease/advance/D)
if(!(IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
var/list/possible_symptoms = list()
// Wild viruses are less predictable when mixed
if(D.event || event)
possible_symptoms = shuffle(D.symptoms + D.GenerateSymptoms(1, 6, 3))
else
possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
AddSymptom(new S.type)
@@ -177,55 +287,63 @@ GLOBAL_LIST_INIT(advance_cures, list(
return generated
/datum/disease/advance/proc/Refresh(new_name = FALSE, archive = FALSE)
/// Called after changes are made to a disease to apply them properly
/datum/disease/advance/proc/Refresh(new_name = FALSE, archive = FALSE, new_cure = TRUE, new_strain = TRUE)
if(new_strain)
strain = "adv_[num2text(GLOB.next_unique_strain++, 8)]"
evolution_chance = VIRUS_EVOLUTION_CHANCE
var/list/properties = GenerateProperties()
AssignProperties(properties)
AssignProperties(properties, new_cure)
id = null
if(!GLOB.archive_diseases[GetDiseaseID()])
if(new_name)
AssignName()
GLOB.archive_diseases[GetDiseaseID()] = src // So we don't infinite loop
GLOB.archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1)
GLOB.archive_diseases[GetDiseaseID()] = new /datum/disease/advance(src)
var/datum/disease/advance/A = GLOB.archive_diseases[GetDiseaseID()]
AssignName(A.name)
//Generate disease properties based on the effects. Returns an associated list.
/// Generate disease properties based on the symptoms and base properties. Returns an associated list.
/datum/disease/advance/proc/GenerateProperties()
if(!symptoms || !length(symptoms))
CRASH("We did not have any symptoms before generating properties.")
var/list/properties = list("resistance" = 1, "stealth" = 0, "stage rate" = 1, "transmittable" = 1, "severity" = 0)
var/list/properties = base_properties.Copy()
for(var/datum/symptom/S in symptoms)
properties["resistance"] += S.resistance
properties["stealth"] += S.stealth
properties["stage rate"] += S.stage_speed
properties["transmittable"] += S.transmittable
properties["transmissibility"] += S.transmissibility
properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity symptom
return properties
// Assign the properties that are in the list.
/datum/disease/advance/proc/AssignProperties(list/properties = list())
/// Set the characteristics of the disease depending on the received properties
/datum/disease/advance/proc/AssignProperties(list/properties = list(), new_cure = TRUE)
if(properties && length(properties))
switch(properties["stealth"])
if(2)
visibility_flags = HIDDEN_SCANNER
if(3 to INFINITY)
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
if(0 to 2)
visibility_flags = 0
if(2 to INFINITY)
visibility_flags = VIRUS_HIDDEN_SCANNER
// The more symptoms we have, the less transmittable it is but some symptoms can make up for it.
SetSpread(clamp(2 ** (properties["transmittable"] - length(symptoms)), BLOOD, AIRBORNE))
permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1)
cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20
stage_prob = max(properties["stage rate"], 2)
// The more symptoms we have, the less transmissibility it is but some symptoms can make up for it.
SetSpread(clamp(2 ** (properties["transmissibility"] - length(symptoms)), SPREAD_BLOOD, SPREAD_AIRBORNE))
permeability_mod = max(CEILING(0.4 * properties["transmissibility"], 1), 1)
cure_chance = 20 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20
// The amount of cures needed to cure the disease. clamped between 1 and 6 because we generate 6 possible cures
cures_required = round(max(2.2 * (1.1 ** properties["resistance"]), 1))
// 9 stage rate is twice as fast as 0 stage rate, -9 stage rate is half as fast as 0.
stage_prob = 4 * (1.08 ** properties["stage rate"])
SetSeverity(properties["severity"])
GenerateCure(properties)
// Calculate evolution chance, unless stabilized with stabilizing agar
if(evolution_chance)
evolution_chance = VIRUS_EVOLUTION_CHANCE * (1 + sqrtor0(properties["stage rate"]) / 6)
if(new_cure)
GenerateCure(properties)
else
CRASH("Our properties were empty or null!")
@@ -233,13 +351,13 @@ GLOBAL_LIST_INIT(advance_cures, list(
// Assign the spread type and give it the correct description.
/datum/disease/advance/proc/SetSpread(spread_id)
switch(spread_id)
if(NON_CONTAGIOUS, SPECIAL)
if(SPREAD_NON_CONTAGIOUS, SPREAD_SPECIAL)
spread_text = "Non-contagious"
if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET)
if(SPREAD_CONTACT_GENERAL, SPREAD_CONTACT_HANDS, SPREAD_CONTACT_FEET)
spread_text = "On contact"
if(AIRBORNE)
if(SPREAD_AIRBORNE)
spread_text = "Airborne"
if(BLOOD)
if(SPREAD_BLOOD)
spread_text = "Blood"
spread_flags = spread_id
@@ -249,33 +367,57 @@ GLOBAL_LIST_INIT(advance_cures, list(
switch(level_sev)
if(-INFINITY to 0)
severity = NONTHREAT
severity = VIRUS_NONTHREAT
if(1)
severity = MINOR
severity = VIRUS_MINOR
if(2)
severity = MEDIUM
severity = VIRUS_MEDIUM
if(3)
severity = HARMFUL
severity = VIRUS_HARMFUL
if(4)
severity = DANGEROUS
severity = VIRUS_DANGEROUS
if(5 to INFINITY)
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
else
severity = "Unknown"
/datum/disease/advance/has_cure()
if(!(disease_flags & VIRUS_CURABLE))
return 0
var/cures_found = 0
for(var/C_id in cures)
if(C_id == "ethanol")
for(var/datum/reagent/consumable/ethanol/booze in affected_mob.reagents.reagent_list)
cures_found++
break
else if(affected_mob.reagents.has_reagent(C_id))
cures_found++
return cures_found >= cures_required
/datum/disease/advance/proc/cure_pick(list/curelist = list())
var/list/options = curelist - cures
return pick(options)
// Will generate a random cure, the less resistance the symptoms have, the harder the cure.
/datum/disease/advance/proc/GenerateCure(list/properties = list())
if(properties && length(properties))
var/res = clamp(properties["resistance"] - (length(symptoms) / 2), 1, length(GLOB.advance_cures))
// to_chat(world, "Res = [res]")
cures = list(GLOB.advance_cures[res])
// Get the cure name from the cure_id
var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]]
cure_text = D.name
cures = list()
cure_text = ""
cures += pick(GLOB.standard_cures)
for(var/i in 1 to cures_required + 2)
switch(pick(40;1, 40;2, 20;3))
if(1)
cures += cure_pick(GLOB.advanced_cures)
if(2)
cures += cure_pick(GLOB.plant_cures)
if(3)
cures += cure_pick(GLOB.drinks)
for(var/cure in cures)
// Get the cure name from the cure_id
var/datum/reagent/D = GLOB.chemical_reagents_list[cure]
cure_text += cure_text == "" ? "[D.name]" : ", [D.name]"
return
// Randomly generate a symptom, has a chance to lose or gain a symptom.
@@ -296,8 +438,11 @@ GLOBAL_LIST_INIT(advance_cures, list(
return
// Name the disease.
/datum/disease/advance/proc/AssignName(name = "Unknown")
src.name = name
/datum/disease/advance/proc/AssignName(_name = "Unknown")
name = _name
if(GLOB.archive_diseases[GetDiseaseID()])
var/datum/disease/advance/virus = GLOB.archive_diseases[GetDiseaseID()]
virus.name = _name
return
// Return a unique ID of the disease.
@@ -306,7 +451,8 @@ GLOBAL_LIST_INIT(advance_cures, list(
var/list/L = list()
for(var/datum/symptom/S in symptoms)
L += S.id
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in.
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in and add the strain to the end
L += strain
var/result = jointext(L, ":")
id = result
return id
@@ -326,11 +472,29 @@ GLOBAL_LIST_INIT(advance_cures, list(
symptoms += S
return
/datum/disease/advance/proc/has_symptom_path(symptom_path)
for(var/datum/symptom/current_symptom in symptoms)
if(current_symptom.type == symptom_path)
return TRUE
return FALSE
/datum/disease/advance/proc/add_symptom_path(symptom_path)
if(has_symptom_path(symptom_path))
return
if(length(symptoms) < VIRUS_SYMPTOM_LIMIT)
symptoms += new symptom_path
// Simply removes the symptom.
/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S)
symptoms -= S
return
/datum/disease/advance/proc/clear_symptoms()
for(var/datum/symptom/current_symptom in symptoms)
symptoms -= current_symptom
qdel(current_symptom)
/*
Static Procs
@@ -362,7 +526,9 @@ GLOBAL_LIST_INIT(advance_cures, list(
diseases -= D1
var/datum/disease/advance/D2 = pick(diseases)
D2.Mix(D1)
// So that we don't mix a virus with itself
if(D2.GetDiseaseID() != D1.GetDiseaseID())
D2.Mix(D1)
// Should be only 1 entry left, but if not let's only return a single entry
// to_chat(world, "END MIXING!!!!!")
@@ -385,78 +551,113 @@ GLOBAL_LIST_INIT(advance_cures, list(
if(!user)
return
var/datum/disease/advance/admin_disease = new(_event = TRUE)
var/base_props = list("resistance" = 1, "stealth" = 0, "stage rate" = 1, "transmissibility" = 1)
for(var/prop in base_props)
var/current_prop = input(user, "Enter base [prop]", "Base Stats", null)
if(current_prop)
admin_disease.base_properties[prop] = text2num(current_prop)
var/i = VIRUS_SYMPTOM_LIMIT
var/datum/disease/advance/D = new(0, null)
D.symptoms = list()
admin_disease.symptoms = list()
var/list/symptoms = list()
symptoms += "Done"
symptoms += GLOB.list_symptoms.Copy()
do
if(user)
var/symptom = input(user, "Choose a symptom to add ([i] remaining)", "Choose a Symptom") in symptoms
var/symptom = tgui_input_list(user, "Choose a Symptom", "Choose a symptom to add ([i] remaining)", symptoms)
if(isnull(symptom))
return
else if(istext(symptom))
i = 0
else if(ispath(symptom))
var/datum/symptom/S = new symptom
if(!D.HasSymptom(S))
D.symptoms += S
if(!admin_disease.HasSymptom(S))
admin_disease.symptoms += S
i -= 1
while(i > 0)
if(length(D.symptoms) > 0)
if(length(admin_disease.symptoms) > 0)
var/new_name = stripped_input(user, "Name your new disease.", "New Name")
if(!new_name)
return
D.AssignName(new_name)
D.Refresh()
for(var/datum/disease/advance/AD in GLOB.active_diseases)
AD.Refresh()
for(var/thing in shuffle(GLOB.human_list))
var/mob/living/carbon/human/H = thing
if(H.stat == DEAD || !is_station_level(H.z))
continue
if(!H.HasDisease(D))
H.ForceContractDisease(D)
break
var/list/name_symptoms = list()
for(var/datum/symptom/S in D.symptoms)
name_symptoms += S.name
message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
admin_disease.AssignName(new_name)
admin_disease.Refresh(FALSE, TRUE, TRUE, TRUE)
return admin_disease
/datum/disease/advance/proc/totalStageSpeed()
var/total_stage_speed = 0
var/total_stage_speed = base_properties["stage rate"]
for(var/i in symptoms)
var/datum/symptom/S = i
total_stage_speed += S.stage_speed
return total_stage_speed
/datum/disease/advance/proc/totalStealth()
var/total_stealth = 0
var/total_stealth = base_properties["stealth"]
for(var/i in symptoms)
var/datum/symptom/S = i
total_stealth += S.stealth
return total_stealth
/datum/disease/advance/proc/totalResistance()
var/total_resistance = 0
var/total_resistance = base_properties["resistance"]
for(var/i in symptoms)
var/datum/symptom/S = i
total_resistance += S.resistance
return total_resistance
/datum/disease/advance/proc/totalTransmittable()
var/total_transmittable = 0
/datum/disease/advance/proc/totaltransmissibility()
var/total_transmissibility = base_properties["transmissibility"]
for(var/i in symptoms)
var/datum/symptom/S = i
total_transmittable += S.transmittable
return total_transmittable
total_transmissibility += S.transmissibility
return total_transmissibility
/datum/disease/advance/get_required_cures()
return cures_required
/datum/disease/advance/is_stabilized()
return !evolution_chance
/datum/disease/advance/get_tracker()
return tracker
/datum/disease/advance/get_ui_id()
return id
/datum/disease/advance/get_strain_id()
return strain
/datum/disease/advance/get_full_strain_id()
return GetDiseaseID()
/datum/disease/advance/is_known(z)
return (GetDiseaseID() in GLOB.known_advanced_diseases["[z]"])
/datum/disease/advance/get_pandemic_symptoms(z)
. = list()
var/disease_known = is_known(z)
for(var/datum/symptom/virus_symptom in symptoms)
var/known = disease_known || (virus_symptom.name in GLOB.detected_advanced_diseases["[z]"][GetDiseaseID()]["known_symptoms"])
. += list(list(
"name" = known ? virus_symptom.name : "UNKNOWN",
"stealth" = known ? virus_symptom.stealth : "UNKNOWN",
"resistance" = known ? virus_symptom.resistance : "UNKNOWN",
"stageSpeed" = known ? virus_symptom.stage_speed : "UNKNOWN",
"transmissibility" = known ? virus_symptom.transmissibility : "UNKNOWN",
"complexity" = known ? virus_symptom.level : "UNKNOWN",
))
/datum/disease/advance/get_pandemic_base_stats()
return list(
"resistance" = base_properties["resistance"],
"stageSpeed" = base_properties["stage rate"],
"stealth" = base_properties["stealth"],
"transmissibility" = base_properties["transmissibility"],
)
+18 -18
View File
@@ -1,51 +1,51 @@
// Cold
/datum/disease/advance/cold/New(process = 1, datum/disease/advance/D, copy = 0)
if(!D)
/datum/disease/advance/cold/New(datum/disease/advance/to_copy, _event = FALSE, copy_stage = FALSE)
if(!to_copy)
name = "Cold"
symptoms = list(new/datum/symptom/sneeze)
..(process, D, copy)
..()
// Flu
/datum/disease/advance/flu/New(process = 1, datum/disease/advance/D, copy = 0)
if(!D)
/datum/disease/advance/flu/New(datum/disease/advance/to_copy, _event = FALSE, copy_stage = FALSE)
if(!to_copy)
name = "Flu"
symptoms = list(new/datum/symptom/cough)
..(process, D, copy)
..()
// Voice Changing
/datum/disease/advance/voice_change/New(process = 1, datum/disease/advance/D, copy = 0)
if(!D)
/datum/disease/advance/voice_change/New(datum/disease/advance/to_copy, _event = FALSE, copy_stage = FALSE)
if(!to_copy)
name = "Epiglottis Mutation"
symptoms = list(new/datum/symptom/voice_change)
..(process, D, copy)
..()
// Toxin Filter
/datum/disease/advance/heal/New(process = 1, datum/disease/advance/D, copy = 0)
if(!D)
/datum/disease/advance/heal/New(datum/disease/advance/to_copy, _event = FALSE, copy_stage = FALSE)
if(!to_copy)
name = "Liver Enhancer"
symptoms = list(new/datum/symptom/heal)
..(process, D, copy)
..()
// Hullucigen
/datum/disease/advance/hullucigen/New(process = 1, datum/disease/advance/D, copy = 0)
if(!D)
/datum/disease/advance/hullucigen/New(datum/disease/advance/to_copy, _event = FALSE, copy_stage = FALSE)
if(!to_copy)
name = "Reality Impairment"
symptoms = list(new/datum/symptom/hallucigen)
..(process, D, copy)
..()
// Sensory Restoration
/datum/disease/advance/sensory_restoration/New(process = 1, datum/disease/advance/D, copy = 0)
if(!D)
/datum/disease/advance/sensory_restoration/New(datum/disease/advance/to_copy, _event = FALSE, copy_stage = FALSE)
if(!to_copy)
name = "Reality Enhancer"
symptoms = list(new/datum/symptom/sensory_restoration)
..(process, D, copy)
..()
+25 -29
View File
@@ -17,36 +17,32 @@ BONUS
/datum/symptom/beard
name = "Facial Hypertrichosis"
stealth = -3
resistance = -1
stage_speed = -3
transmittable = -1
stealth = -1
stage_speed = 2
transmissibility = -1
level = 4
severity = 1
/datum/symptom/beard/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!istype(head_organ))
return
switch(A.stage)
if(1, 2)
to_chat(H, "<span class='warning'>Your chin itches.</span>")
if(head_organ.f_style == "Shaved")
head_organ.f_style = "Jensen Beard"
H.update_fhair()
if(3, 4)
to_chat(H, "<span class='warning'>You feel tough.</span>")
if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard") && !(head_organ.f_style == "Full Beard"))
head_organ.f_style = "Full Beard"
H.update_fhair()
else
to_chat(H, "<span class='warning'>You feel manly!</span>")
if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard"))
head_organ.f_style = pick("Dwarf Beard", "Very Long Beard")
H.update_fhair()
/datum/symptom/beard/symptom_act(datum/disease/advance/A, unmitigated)
if(ishuman(A.affected_mob))
var/mob/living/carbon/human/H = A.affected_mob
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!istype(head_organ))
return
switch(A.stage)
if(1, 2)
to_chat(H, "<span class='warning'>Your chin itches.</span>")
if(head_organ.f_style == "Shaved")
head_organ.f_style = "Jensen Beard"
H.update_fhair()
if(3, 4)
to_chat(H, "<span class='warning'>You feel tough.</span>")
if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard") && !(head_organ.f_style == "Full Beard"))
head_organ.f_style = "Full Beard"
H.update_fhair()
else
to_chat(H, "<span class='warning'>You feel manly!</span>")
if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard"))
head_organ.f_style = pick("Dwarf Beard", "Very Long Beard")
H.update_fhair()
return
@@ -19,35 +19,33 @@ Bonus
name = "Choking"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -4
transmissibility = -4
level = 3
severity = 3
chem_treatments = list(
"perfluorodecalin" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/choking/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]</span>")
Choke_stage_3_4(M, A)
M.emote("gasp")
else
to_chat(M, "<span class='userdanger'>[pick("You're choking!", "You can't breathe!")]</span>")
Choke(M, A)
M.emote("gasp")
/datum/symptom/choking/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]</span>")
Choke(M, A, unmitigated)
M.emote("gasp")
else
to_chat(M, "<span class='userdanger'>[pick("You're choking!", "You can't breathe!")]</span>")
Choke(M, A)
M.emote("gasp")
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth())
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5)
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A, unmitigated)
var/get_damage = unmitigated
if(A.stage < 5)
get_damage *= sqrtor0(21 + A.totalStageSpeed() * 0.5)+sqrtor0(16+A.totalStealth())
else
get_damage *= sqrtor0(21 + A.totalStageSpeed() * 0.5)+sqrtor0(16+A.totalStealth() * 5)
M.adjustOxyLoss(get_damage)
return 1
@@ -6,7 +6,7 @@ Confusion
Little bit hidden.
Lowers resistance.
Decreases stage speed.
Not very transmittable.
Not very transmissibility.
Intense Level.
Bonus
@@ -19,21 +19,25 @@ Bonus
name = "Confusion"
stealth = 1
resistance = -1
resistance = 1
stage_speed = -3
level = 4
severity = 2
chem_treatments = list(
"synaptazine" = list("multiplier" = 0, "timer" = 0),
"ephedrine" = list("multiplier" = 0, "timer" = 0),
"methamphetamine" = list("multiplier" = 0, "timer" = 0),
"coffee" = list("multiplier" = 0.7, "timer" = 0),
"tea"= list("multiplier" = 0.7, "timer" = 0))
/datum/symptom/confusion/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, "<span class='warning'>[pick("Your head hurts.", "Your mind blanks for a moment.")]</span>")
else
to_chat(M, "<span class='userdanger'>You can't think straight!</span>")
M.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS)
/datum/symptom/confusion/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/carbon/M = A.affected_mob
if(prob(A.progress ** 2))
to_chat(M, "<span class='userdanger'>You can't think straight!</span>")
M.AdjustConfused(16 SECONDS * unmitigated, bound_lower = 0, bound_upper = 200 SECONDS)
else
to_chat(M, "<span class='warning'>[pick("Your head hurts.", "Your mind blanks for a moment.")]</span>")
return
+17 -16
View File
@@ -6,7 +6,7 @@ Coughing
Noticable.
Little Resistance.
Doesn't increase stage speed much.
Transmittable.
transmissibility.
Low Level.
BONUS
@@ -18,23 +18,24 @@ BONUS
/datum/symptom/cough
name = "Cough"
stealth = -1
resistance = 3
stealth = 2
stage_speed = 1
transmittable = 2
transmissibility = 2
level = 1
severity = 1
chem_treatments = list(
"salbutamol" = list("multiplier" = 0, "timer" = 0),
"perfluorodecalin" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/cough/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
to_chat(M, "<span notice='warning'>[pick("You swallow excess mucus.", "You lightly cough.")]</span>")
else
M.emote("cough")
var/obj/item/I = M.get_active_hand()
if(I && I.w_class == 1)
M.drop_item()
/datum/symptom/cough/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(prob(A.progress + 20))
M.emote("cough")
var/obj/item/I = M.get_active_hand()
if(prob(A.progress * unmitigated) && I && I.w_class == 1)
M.drop_item()
// smaller spread than sneeze
A.spread(3 * unmitigated)
else
to_chat(M, "<span notice='warning'>[pick("You swallow excess mucus.", "You lightly cough.")]</span>")
return
@@ -21,16 +21,15 @@ Bonus
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -2
transmissibility = -2
level = 4
activation_prob = SYMPTOM_ACTIVATION_PROB * 10
/datum/symptom/damage_converter/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
Convert(M)
/datum/symptom/damage_converter/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
Convert(M)
return
/datum/symptom/damage_converter/proc/Convert(mob/living/M)
@@ -17,23 +17,22 @@ Bonus
/datum/symptom/deafness
name = "Deafness"
stealth = -1
resistance = -2
stealth = 1
stage_speed = -1
transmittable = -3
transmissibility = -3
level = 4
severity = 3
chem_treatments = list(
"oculine" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/deafness/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
var/obj/item/organ/internal/ears/ears = M.get_organ_slot("ears")
if(!ears)
return //cutting off your ears to cure the deafness: the ultimate own
switch(A.stage)
if(3, 4)
to_chat(M, "<span class='warning'>[pick("You hear a ringing in your ear.", "Your ears pop.")]</span>")
if(5)
to_chat(M, "<span class='userdanger'>Your ears pop and begin ringing loudly!</span>")
M.Deaf(40 SECONDS)
/datum/symptom/deafness/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
var/obj/item/organ/internal/ears/ears = M.get_organ_slot("ears")
if(!ears)
return //cutting off your ears to cure the deafness: the ultimate own
switch(A.stage)
if(3, 4)
to_chat(M, "<span class='warning'>[pick("You hear a ringing in your ear.", "Your ears pop.")]</span>")
if(5)
to_chat(M, "<span class='userdanger'>Your ears pop and begin ringing loudly!</span>")
M.Deaf(40 SECONDS * unmitigated)
+13 -13
View File
@@ -20,20 +20,20 @@ Bonus
name = "Dizziness"
stealth = 2
resistance = -2
stage_speed = -3
transmittable = -1
stage_speed = -1
transmissibility = -1
level = 4
severity = 2
chem_treatments = list(
"antihol" = list("multiplier" = 0, "timer" = 0),
"ephedrine" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/dizzy/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, "<span class='warning'>[pick("You feel dizzy.", "Your head spins.")]</span>")
else
to_chat(M, "<span class='userdanger'>A wave of dizziness washes over you!</span>")
M.Dizzy(10 SECONDS)
/datum/symptom/dizzy/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, "<span class='warning'>[pick("You feel dizzy.", "Your head spins.")]</span>")
else
to_chat(M, "<span class='userdanger'>A wave of dizziness washes over you!</span>")
M.Dizzy(10 SECONDS * unmitigated)
return
+11 -13
View File
@@ -6,7 +6,7 @@ Fever
No change to hidden.
Increases resistance.
Increases stage speed.
Little transmittable.
Little transmissibility.
Low level.
Bonus
@@ -18,23 +18,21 @@ Bonus
/datum/symptom/fever
name = "Fever"
resistance = 3
stealth = 2
resistance = 1
stage_speed = 3
transmittable = 2
transmissibility = 2
level = 2
severity = 2
/datum/symptom/fever/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
to_chat(M, "<span class='warning'>[pick("You feel hot.", "You feel like you're burning.")]</span>")
if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT)
Heat(M, A)
/datum/symptom/fever/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/carbon/M = A.affected_mob
to_chat(M, "<span class='warning'>[pick("You feel hot.", "You feel like you're burning.")]</span>")
if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT)
Heat(M, A, unmitigated)
return
/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A, unmitigated)
var/get_heat = unmitigated * ((sqrtor0(21 + A.totaltransmissibility() * 2)) + (sqrtor0(20 + A.totalStageSpeed() * 3)))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return 1
+32 -30
View File
@@ -18,40 +18,42 @@ Bonus
/datum/symptom/fire
name = "Spontaneous Combustion"
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -4
stealth = -3
resistance = 3
stage_speed = 1
transmissibility = -4
level = 6
severity = 5
severity = 6
chem_treatments = list(
"frostoil" = list("multiplier" = 0, "timer" = 0),
"menthol" = list("multiplier" = 0, "timer" = 0),
"water" = list("multiplier" = 0.82, "timer" = 0))
/datum/symptom/fire/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(3)
to_chat(M, "<span class='warning'>[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]</span>")
if(4)
Firestacks_stage_4(M, A)
M.IgniteMob()
to_chat(M, "<span class='userdanger'>Your skin bursts into flames!</span>")
M.emote("scream")
if(5)
Firestacks_stage_5(M, A)
M.IgniteMob()
to_chat(M, "<span class='userdanger'>Your skin erupts into an inferno!</span>")
M.emote("scream")
/datum/symptom/fire/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.progress)
if(30 to 59)
to_chat(M, "<span class='warning'>[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]</span>")
if(60 to 79)
Firestacks(M, A, unmitigated)
M.IgniteMob()
to_chat(M, "<span class='userdanger'>Your skin bursts into flames!</span>")
M.emote("scream")
if(80 to INFINITY)
Firestacks(M, A, unmitigated)
M.IgniteMob()
to_chat(M, "<span class='userdanger'>Your skin erupts into an inferno!</span>")
M.emote("scream")
return
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1)
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks * 0.5)
return 1
/datum/symptom/fire/proc/Firestacks(mob/living/M, datum/disease/advance/A, unmitigated)
var/get_stacks = unmitigated
if(A.stage < 5)
get_stacks *= ((A.progress / 100) ** 2) * max(sqrtor0(5 + A.totalStageSpeed() * 2), 1)
M.adjustFireLoss(get_stacks * 2)
else
get_stacks *= ((A.progress / 100) ** 2) * max(sqrtor0(10 + A.totalStageSpeed() * 3), 1)
M.adjustFireLoss(get_stacks * 4)
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1)
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
return 1
@@ -18,25 +18,27 @@ Bonus
/datum/symptom/flesh_eating
name = "Necrotizing Fasciitis"
stealth = -3
resistance = -4
transmittable = -4
stealth = -4
resistance = 3
transmissibility = -3
level = 6
severity = 5
severity = 6
chem_treatments = list(
"synthflesh" = list("multiplier" = 0, "timer" = 0),
"lazarus_reagent" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/flesh_eating/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(A.stage > 1)
if(prob(A.progress))
to_chat(M, "<span class='userdanger'>[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]</span>")
Flesheat(M, A)
else
to_chat(M, "<span class='warning'>[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]</span>")
/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(2,3)
to_chat(M, "<span class='warning'>[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]</span>")
if(4,5)
to_chat(M, "<span class='userdanger'>[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]</span>")
Flesheat(M, A)
return
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
var/get_damage = (A.progress / 100) * ((sqrtor0(49 + 2 * A.totalStageSpeed()))*5)
M.adjustBruteLoss(get_damage)
return 1
+24 -26
View File
@@ -16,34 +16,32 @@ BONUS
/datum/symptom/hair
name = "Cranial Hypertrichosis"
stealth = -3
stealth = -1
resistance = -1
stage_speed = -3
transmittable = -1
stage_speed = 1
transmissibility = 1
level = 4
severity = 1
/datum/symptom/hair/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
if(!ishuman(A.affected_mob))
return
var/mob/living/carbon/human/H = A.affected_mob
if(H.dna.species.bodyflags & BALD)
return
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!istype(head_organ))
return
switch(A.stage)
if(1, 2, 3)
to_chat(H, "<span class='warning'>Your scalp itches.</span>")
head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
else
to_chat(H, "<span class='warning'>Hair bursts forth from your scalp!</span>")
var/datum/sprite_accessory/tmp_hair_style = GLOB.hair_styles_full_list["Very Long Hair"]
/datum/symptom/hair/symptom_act(datum/disease/advance/A, unmitigated)
if(!ishuman(A.affected_mob))
return
var/mob/living/carbon/human/H = A.affected_mob
if(H.dna.species.bodyflags & BALD)
return
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!istype(head_organ))
return
switch(A.stage)
if(1, 2, 3)
to_chat(H, "<span class='warning'>Your scalp itches.</span>")
head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
else
to_chat(H, "<span class='warning'>Hair bursts forth from your scalp!</span>")
var/datum/sprite_accessory/tmp_hair_style = GLOB.hair_styles_full_list["Very Long Hair"]
if(head_organ.dna.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
head_organ.h_style = "Very Long Hair"
else //Otherwise, give them a random hair style.
head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
H.update_hair()
if(head_organ.dna.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
head_organ.h_style = "Very Long Hair"
else //Otherwise, give them a random hair style.
head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
H.update_hair()
@@ -6,7 +6,7 @@ Hallucigen
Very noticable.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittable.
Reduced transmissibility.
Critical Level.
Bonus
@@ -19,23 +19,23 @@ Bonus
name = "Hallucigen"
stealth = -2
resistance = -3
stage_speed = -3
transmittable = -1
stage_speed = -4
transmissibility = 1
level = 5
severity = 3
chem_treatments = list(
"synaptazine" = list("multiplier" = 0, "timer" = 0),
"ephedrine" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")]</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]</b></span>")
else
to_chat(M, "<span class='userdanger'>[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]</span>")
M.AdjustHallucinate(5 SECONDS)
/datum/symptom/hallucigen/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")]</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]</b></span>")
else
to_chat(M, "<span class='userdanger'>[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]</span>")
M.AdjustHallucinate(5 SECONDS)
return
@@ -6,7 +6,7 @@ Headache
Noticable.
Highly resistant.
Increases stage speed.
Not transmittable.
Not transmissibility.
Low Level.
BONUS
@@ -19,15 +19,17 @@ BONUS
/datum/symptom/headache
name = "Headache"
stealth = -1
resistance = 4
stage_speed = 2
stealth = 2
transmissibility = 3
level = 1
severity = 1
chem_treatments = list(
"hydrocodone" = list("multiplier" = 0, "timer" = 0),
"morphine" = list("multiplier" = 0, "timer" = 0),
"sal_acid" = list("multiplier" = 0, "timer" = 0),
"tea" = list("multiplier" = 0.5, "timer" = 0))
/datum/symptom/headache/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
to_chat(M, "<span class='warning'>[pick("Your head hurts.", "Your head starts pounding.")]</span>")
/datum/symptom/headache/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
to_chat(M, "<span class='warning'>[pick("Your head hurts.", "Your head starts pounding.")]</span>")
return
+15 -12
View File
@@ -21,21 +21,22 @@ Bonus
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -4
transmissibility = -4
level = 6
chem_treatments = list(
"frostoil" = list("multiplier" = 0.5, "timer" = 0))
activation_prob = SYMPTOM_ACTIVATION_PROB * 10
/datum/symptom/heal/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
Heal(M, A)
/datum/symptom/heal/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
Heal(M, A, unmitigated)
return
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, unmitigated)
var/get_damage = (sqrtor0(20+A.totalStageSpeed())*(1+rand()))
M.adjustToxLoss(-get_damage)
M.adjustToxLoss(-get_damage * unmitigated)
return 1
/*
@@ -55,6 +56,7 @@ Bonus
//////////////////////////////////////
*/
/*
/datum/symptom/heal/metabolism
name = "Anti-Bodies Metabolism"
@@ -87,6 +89,7 @@ Bonus
M.resistances -= res
to_chat(M, "<span class='warning'>You feel weaker.</span>")
*/
/*
//////////////////////////////////////
@@ -110,7 +113,7 @@ Bonus
stealth = 3
resistance = 4
stage_speed = 4
transmittable = 4
transmissibility = 4
level = 3
var/longevity = 30
@@ -146,7 +149,7 @@ Bonus
stealth = -1
resistance = -1
stage_speed = 0
transmittable = -3
transmissibility = -3
level = 5
/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A)
@@ -6,7 +6,7 @@ Itching
Not noticable or unnoticable.
Resistant.
Increases stage speed.
Little transmittable.
Little transmissibility.
Low Level.
BONUS
@@ -19,15 +19,16 @@ BONUS
/datum/symptom/itching
name = "Itching"
resistance = 3
stealth = 2
resistance = -1
stage_speed = 3
transmittable = 1
transmissibility = 1
level = 1
severity = 1
chem_treatments = list(
"silver_sulfadiazine" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/itching/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
to_chat(M, "<span class='warning'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>")
/datum/symptom/itching/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
to_chat(M, "<span class='warning'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>")
return
+12 -12
View File
@@ -21,18 +21,18 @@ Bonus
stealth = 1
resistance = -3
stage_speed = -3
transmittable = -4
transmissibility = -4
level = 6
chem_treatments = list(
"cyanide" = list("multiplier" = 0, "timer" = 0))
activation_prob = SYMPTOM_ACTIVATION_PROB * 5
/datum/symptom/oxygen/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if(M.reagents.get_reagent_amount("salbutamol") < 20)
M.reagents.add_reagent("salbutamol", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
to_chat(M, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
/datum/symptom/oxygen/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if(M.reagents.get_reagent_amount("salbutamol") < 20)
M.reagents.add_reagent("salbutamol", 20)
else
to_chat(M, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
return
@@ -20,45 +20,43 @@ Bonus
stealth = -1
resistance = -4
stage_speed = -4
transmittable = -3
transmissibility = -3
level = 5
activation_prob = SYMPTOM_ACTIVATION_PROB * 3
/datum/symptom/mind_restoration/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 3))
var/mob/living/M = A.affected_mob
var/datum/reagents/RD = M.reagents
/datum/symptom/mind_restoration/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
var/datum/reagents/RD = M.reagents
if(A.stage >= 3)
M.AdjustSlur(-4 SECONDS)
M.AdjustDrunk(-8 SECONDS)
M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3)
if(A.stage >= 4)
M.AdjustDrowsy(-4 SECONDS)
if(RD.has_reagent("lsd"))
RD.remove_reagent("lsd", 5)
if(RD.has_reagent("histamine"))
RD.remove_reagent("histamine", 5)
M.AdjustHallucinate(-10 SECONDS)
if(A.stage >= 5)
RD.check_and_add("mannitol", 10, 10)
if(A.stage >= 3)
M.AdjustSlur(-4 SECONDS)
M.AdjustDrunk(-8 SECONDS)
M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3)
if(A.stage >= 4)
M.AdjustDrowsy(-4 SECONDS)
if(RD.has_reagent("lsd"))
RD.remove_reagent("lsd", 5)
if(RD.has_reagent("histamine"))
RD.remove_reagent("histamine", 5)
M.AdjustHallucinate(-10 SECONDS)
if(A.stage >= 5)
RD.check_and_add("mannitol", 10, 10)
/datum/symptom/sensory_restoration
name = "Sensory Restoration"
stealth = -1
resistance = -3
stage_speed = -2
transmittable = -4
transmissibility = -4
level = 4
activation_prob = SYMPTOM_ACTIVATION_PROB * 5
/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if(M.reagents.get_reagent_amount("oculine") < 20)
M.reagents.add_reagent("oculine", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
to_chat(M, "<span class='notice'>[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]</span>")
/datum/symptom/sensory_restoration/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if(M.reagents.get_reagent_amount("oculine") < 20)
M.reagents.add_reagent("oculine", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
to_chat(M, "<span class='notice'>[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]</span>")
@@ -5,7 +5,7 @@ Alopecia
Noticable.
Decreases resistance slightly.
Reduces stage speed slightly.
Transmittable.
transmissibility.
Intense Level.
BONUS
@@ -19,15 +19,11 @@ BONUS
name = "Alopecia"
stealth = -1
resistance = -1
stage_speed = -1
transmittable = 2
transmissibility = 2
level = 4
severity = 1
/datum/symptom/shedding/Activate(datum/disease/advance/A)
..()
if(!prob(SYMPTOM_ACTIVATION_PROB))
return
/datum/symptom/shedding/symptom_act(datum/disease/advance/A, unmitigated)
if(!ishuman(A.affected_mob))
return
var/mob/living/carbon/human/H = A.affected_mob
@@ -6,7 +6,7 @@ Shivering
No change to hidden.
Increases resistance.
Increases stage speed.
Little transmittable.
Little transmissibility.
Low level.
Bonus
@@ -18,19 +18,18 @@ Bonus
/datum/symptom/shivering
name = "Shivering"
resistance = 2
stealth = 1
stage_speed = 2
transmittable = 2
transmissibility = 3
level = 2
severity = 2
/datum/symptom/shivering/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
to_chat(M, "<span class='warning'>[pick("You feel cold.", "You start shivering.")]</span>")
if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT)
Chill(M, A)
/datum/symptom/shivering/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/carbon/M = A.affected_mob
to_chat(M, "<span class='warning'>[pick("You feel cold.", "You start shivering.")]</span>")
M.emote("shiver")
if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT)
Chill(M, A)
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
+29 -30
View File
@@ -18,25 +18,24 @@ BONUS
name = "Vitiligo"
stealth = -3
resistance = -1
stage_speed = -1
transmittable = -2
stage_speed = 1
transmissibility = 2
level = 4
severity = 1
chem_treatments = list(
"synthflesh" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/vitiligo/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.s_tone == 85)
return
switch(A.stage)
if(5)
H.change_skin_tone(85, TRUE)
else
H.visible_message("<span class='warning'>[H] looks a bit pale...</span>", "<span class='notice'>Your skin suddenly appears lighter...</span>")
/datum/symptom/vitiligo/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.s_tone == 85)
return
switch(A.stage)
if(5)
H.change_skin_tone(85, TRUE)
else
H.visible_message("<span class='warning'>[H] looks a bit pale...</span>", "<span class='notice'>Your skin suddenly appears lighter...</span>")
return
@@ -63,22 +62,22 @@ BONUS
stealth = -3
resistance = -1
stage_speed = -1
transmittable = -2
transmissibility = -2
level = 4
severity = 1
chem_treatments = list(
"synthflesh" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/revitiligo/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.s_tone == -85)
return
switch(A.stage)
if(5)
H.change_skin_tone(-85, TRUE)
else
H.visible_message("<span class='warning'>[H] looks a bit dark...</span>", "<span class='notice'>Your skin suddenly appears darker...</span>")
/datum/symptom/revitiligo/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.s_tone == -85)
return
switch(A.stage)
if(5)
H.change_skin_tone(-85, TRUE)
else
H.visible_message("<span class='warning'>[H] looks a bit dark...</span>", "<span class='notice'>Your skin suddenly appears darker...</span>")
return
+14 -14
View File
@@ -6,11 +6,11 @@ Sneezing
Very Noticable.
Increases resistance.
Doesn't increase stage speed.
Very transmittable.
Very transmissibility.
Low Level.
Bonus
Forces a spread type of AIRBORNE
Forces a spread type of SPREAD_AIRBORNE
with extra range!
//////////////////////////////////////
@@ -20,19 +20,19 @@ Bonus
name = "Sneezing"
stealth = -2
resistance = 3
transmittable = 4
stage_speed = 2
transmissibility = 5
level = 1
severity = 1
chem_treatments = list(
"salbutamol" = list("multiplier" = 0, "timer" = 0),
"perfluorodecalin" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/sneeze/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
M.emote("sniff")
else
M.emote("sneeze")
A.spread(5)
/datum/symptom/sneeze/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(prob(A.progress + 20))
M.emote("sneeze")
A.spread(5 * unmitigated)
else
M.emote("sniff")
return
@@ -8,13 +8,20 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
var/stealth = 0
var/resistance = 0
var/stage_speed = 0
var/transmittable = 0
// The type level of the symptom. Higher is harder to generate.
var/transmissibility = 0
/// The type level of the symptom. Higher is harder to generate.
var/level = 0
// The severity level of the symptom. Higher is more dangerous.
/// The severity level of the symptom. Higher is more dangerous.
var/severity = 0
// The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!!
/// The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!!
var/id = ""
/// Asoc list of treatment reagents to multiplier and timer. Multiplier multiplies the frequency and strength of the symptom
var/list/chem_treatments = list()
/// Amount of treatment reagents the symptom will consume
var/purge_amount = 0.4
/// How likely the symptom is to activate each process cycle
var/activation_prob = SYMPTOM_ACTIVATION_PROB
/datum/symptom/New()
var/list/S = GLOB.list_symptoms
@@ -32,6 +39,46 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
/datum/symptom/proc/End(datum/disease/advance/A)
return
/// Checks the conditions for symptom activation
/datum/symptom/proc/Activate(datum/disease/advance/A)
var/unmitigated = check_treatment(A)
if(prob(unmitigated * activation_prob))
symptom_act(A, unmitigated)
return
/// Applies the symptom effects
/datum/symptom/proc/symptom_act(datum/disease/advance/A, unmitigated)
return
/// Checks all forms of treatment and
/datum/symptom/proc/check_treatment(datum/disease/advance/A)
. = 1
. *= check_chem_treatment(A)
. *= check_phys_treatment(A)
post_treatment(A, .)
/// Actions that are taken after the treatment check like reverting or lessening effects.
/datum/symptom/proc/post_treatment(datum/disease/advance/A, unmitigated)
return
/// Default behaviour for treatment chems. Mitigate the symptom for a while after being consumed.
/datum/symptom/proc/check_chem_treatment(datum/disease/advance/A)
. = 1
// Make an assoc id to volume list we can easily search through and use
var/list/mob_reagents = list()
for(var/datum/reagent/chem in A.affected_mob.reagents.reagent_list)
mob_reagents += list("[chem.id]" = chem.volume)
// Go over each treatment and apply its mitigation if it still has timer. increase its timer if present in the patient
for(var/treatment in chem_treatments)
if(chem_treatments[treatment]["timer"] >= 1)
. *= chem_treatments[treatment]["multiplier"]
chem_treatments[treatment]["timer"]--
if(treatment in mob_reagents)
// Consume as much as we need but no more than we have
var/consumption_mod = min(mob_reagents[treatment] / purge_amount, (VIRUS_MAX_TREATMENT_TIMER - chem_treatments[treatment]["timer"]) / VIRUS_TREATMENT_TIMER_MOD, 1)
A.affected_mob.reagents.remove_reagent(treatment, purge_amount * consumption_mod)
// Add to timer according to the amount consumed
chem_treatments[treatment]["timer"] += VIRUS_TREATMENT_TIMER_MOD * consumption_mod
/datum/symptom/proc/check_phys_treatment(datum/disease/advance/A)
return 1
+25 -21
View File
@@ -20,15 +20,13 @@ BONUS
stage_speed = -3
level = 3
/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
to_chat(M, "<span class='notice'>You feel off, but no different from before.</span>")
if(5)
to_chat(M, "<span class='notice'>You feel better, but nothing interesting happens.</span>")
/datum/symptom/viraladaptation/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
to_chat(M, "<span class='notice'>You feel off, but no different from before.</span>")
if(5)
to_chat(M, "<span class='notice'>You feel better, but nothing interesting happens.</span>")
/*
//////////////////////////////////////
@@ -47,18 +45,24 @@ BONUS
*/
/datum/symptom/viralevolution
name = "Viral evolutionary acceleration"
stealth = -2
resistance = -3
stealth = -4
stage_speed = 5
transmittable = 3
transmissibility = 3
level = 3
var/static/list/possible_blocks
/datum/symptom/viralevolution/Start(datum/disease/advance/A)
. = ..()
A.evolution_chance *= 1.5
possible_blocks = list(GLOB.hornsblock, GLOB.loudblock, GLOB.comicblock, GLOB.swedeblock, GLOB.chavblock, GLOB.nervousblock, GLOB.lispblock)
/datum/symptom/viralevolution/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(prob(A.progress * 2))
// randomly set the value of a minor disability block
to_chat(M, "<span class='notice'>You feel like something is changing</span>")
A.affected_mob.dna.SetSEValue(pick(possible_blocks), rand(0, 4095))
domutcheck(A.affected_mob)
else
to_chat(M, "<span class='notice'>You feel a weird</span>")
/datum/symptom/viralevolution/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
to_chat(M, "<span class='notice'>You feel better, but no different from before.</span>")
if(5)
to_chat(M, "<span class='notice'>You feel off, but nothing interesting happens.</span>")
+29 -28
View File
@@ -18,34 +18,35 @@ Bonus
/datum/symptom/visionloss
name = "Hyphema"
stealth = -1
resistance = -4
stage_speed = -4
transmittable = -3
stealth = 2
resistance = 1
stage_speed = -1
transmissibility = -4
level = 5
severity = 4
chem_treatments = list(
"oculine" = list("multiplier" = 0, "timer" = 0)
)
/datum/symptom/visionloss/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
var/obj/item/organ/internal/eyes/eyes = M.get_int_organ(/obj/item/organ/internal/eyes)
if(!eyes) //NO EYES, NO PROBLEM! Rip out your eyes today to prevent future blindness!
return
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>Your eyes itch.</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>Your eyes burn!</b></span>")
M.EyeBlurry(40 SECONDS)
eyes.receive_damage(1)
else
to_chat(M, "<span class='userdanger'>Your eyes burn horrificly!</span>")
M.EyeBlurry(60 SECONDS)
eyes.receive_damage(5)
if(eyes.damage >= 10)
M.become_nearsighted(EYE_DAMAGE)
if(prob(eyes.damage - 10 + 1))
if(!M.AmountBlinded())
to_chat(M, "<span class='userdanger'>You go blind!</span>")
eyes.receive_damage(eyes.max_damage)
/datum/symptom/visionloss/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/carbon/M = A.affected_mob
var/obj/item/organ/internal/eyes/eyes = M.get_int_organ(/obj/item/organ/internal/eyes)
if(!eyes) //NO EYES, NO PROBLEM! Rip out your eyes today to prevent future blindness!
return
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>Your eyes itch.</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>Your eyes burn!</b></span>")
M.EyeBlurry(40 SECONDS * unmitigated)
eyes.receive_damage(1 * unmitigated)
else
to_chat(M, "<span class='userdanger'>Your eyes burn horrificly!</span>")
M.EyeBlurry(60 SECONDS * unmitigated)
eyes.receive_damage(5 * unmitigated)
if(eyes.damage >= 10)
M.become_nearsighted(EYE_DAMAGE)
if(prob(eyes.damage - 10 + 1) * unmitigated)
if(!M.AmountBlinded())
to_chat(M, "<span class='userdanger'>You go blind!</span>")
eyes.receive_damage(eyes.max_damage)
@@ -6,7 +6,7 @@ Voice Change
Very Very noticable.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittable.
Reduced transmissibility.
Fatal Level.
Bonus
@@ -18,28 +18,34 @@ Bonus
/datum/symptom/voice_change
name = "Voice Change"
stealth = -2
stealth = 2
resistance = -3
stage_speed = -3
transmittable = -1
stage_speed = 3
transmissibility = -2
level = 6
severity = 2
chem_treatments = list(
"honey" = list("multiplier" = 0, "timer" = 0),
"lemonjuice" = list("multiplier" = 0, "timer" = 0),
"orangejuice" = list("multiplier" = 0, "timer" = 0),
"tea" = list("multiplier" = 0, "timer" = 0),
)
/datum/symptom/voice_change/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, "<span class='warning'>[pick("Your throat hurts.", "You clear your throat.")]</span>")
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.SetSpecialVoice(H.dna.species.get_random_name(H.gender))
/datum/symptom/voice_change/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, "<span class='warning'>[pick("Your throat hurts.", "You clear your throat.")]</span>")
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.SetSpecialVoice(H.dna.species.get_random_name(H.gender))
return
/datum/symptom/voice_change/post_treatment(datum/disease/advance/A, unmitigated)
if(!unmitigated)
End()
/datum/symptom/voice_change/End(datum/disease/advance/A)
..()
if(ishuman(A.affected_mob))
+32 -23
View File
@@ -6,7 +6,7 @@ Vomiting
Very Very Noticable.
Decreases resistance.
Doesn't increase stage speed.
Little transmittable.
Little transmissibility.
Medium Level.
Bonus
@@ -22,26 +22,30 @@ Bonus
/datum/symptom/vomit
name = "Vomiting"
stealth = -2
resistance = -1
transmittable = 1
stealth = -3
stage_speed = -2
transmissibility = 1
level = 3
severity = 4
severity = 3
chem_treatments = list(
"calomel" = list("multiplier" = 0, "timer" = 0),
"charcoal" = list("multiplier" = 0, "timer" = 0),
"pen_acid" = list("multiplier" = 0, "timer" = 0))
/datum/symptom/vomit/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB / 2))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
/datum/symptom/vomit/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(A.progress > 20 && prob(A.progress))
Vomit(M, A.progress)
else
switch(A.progress)
if(0 to 59)
to_chat(M, "<span class='warning'>[pick("You feel nauseous.", "You feel like you're going to throw up!")]</span>")
else
Vomit(M)
if(60 to INFINITY)
to_chat(M, "<span class='warning'>[pick("You feel extremely nauseous!", "You barely manage to not throw up!")]</span>")
return
/datum/symptom/vomit/proc/Vomit(mob/living/carbon/M)
M.vomit(20)
/datum/symptom/vomit/proc/Vomit(mob/living/carbon/M, progress)
M.vomit(20 * (progress / 100))
/*
//////////////////////////////////////
@@ -51,7 +55,7 @@ Vomiting Blood
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Little transmittable.
Little transmissibility.
Intense level.
Bonus
@@ -66,12 +70,14 @@ Bonus
/datum/symptom/vomit/blood
name = "Blood Vomiting"
stage_speed = -1
stealth = -2
resistance = 2
stage_speed = -3
level = 4
severity = 5
/datum/symptom/vomit/blood/Vomit(mob/living/carbon/M)
M.vomit(0, 1)
/datum/symptom/vomit/blood/Vomit(mob/living/carbon/M, progress)
M.vomit(35 * ((progress / 100) ** 2), TRUE, TRUE, distance = 1)
/*
@@ -82,7 +88,7 @@ Projectile Vomiting
Very Very Noticable.
Decreases resistance.
Doesn't increase stage speed.
Little transmittable.
Little transmissibility.
Medium Level.
Bonus
@@ -95,7 +101,10 @@ Bonus
/datum/symptom/vomit/projectile
name = "Projectile Vomiting"
stealth = -2
resistance = 1
level = 4
severity = 4
/datum/symptom/vomit/projectile/Vomit(mob/living/carbon/M)
M.vomit(6,0,FALSE,5,1)
/datum/symptom/vomit/projectile/Vomit(mob/living/carbon/M, progress)
M.vomit(10 * ((progress / 100) ** 2), FALSE, TRUE, 6, 1)
@@ -18,27 +18,30 @@ Bonus
/datum/symptom/weakness
name = "Weakness"
stealth = -1
resistance = -1
stealth = -2
resistance = 1
stage_speed = -2
transmittable = -2
transmissibility = -1
level = 3
severity = 3
severity = 4
chem_treatments = list(
"synaptazine" = list("multiplier" = 0, "timer" = 0),
"ephedrine" = list("multiplier" = 0, "timer" = 0),
"coffee" = list("multiplier" = 0.6, "timer" = 0),
"tea" = list("multiplier" = 0.6, "timer" = 0))
/datum/symptom/weakness/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>[pick("You feel weak.", "You feel lazy.")]</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>[pick("You feel very frail.", "You think you might faint.")]</span>")
M.adjustStaminaLoss(15)
else
to_chat(M, "<span class='userdanger'>[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]</span>")
M.adjustStaminaLoss(30)
if(M.getStaminaLoss() > 60 && !M.stat)
M.visible_message("<span class='warning'>[M] faints!</span>", "<span class='userdanger'>You swoon and faint...</span>")
M.AdjustSleeping(10 SECONDS)
/datum/symptom/weakness/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, "<span class='warning'>[pick("You feel weak.", "You feel lazy.")]</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>[pick("You feel very frail.", "You think you might faint.")]</span>")
M.adjustStaminaLoss(15 * unmitigated)
else
to_chat(M, "<span class='userdanger'>[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]</span>")
M.adjustStaminaLoss(30 * unmitigated)
if(M.getStaminaLoss() > 60 && !M.stat)
M.visible_message("<span class='warning'>[M] faints!</span>", "<span class='userdanger'>You swoon and faint...</span>")
M.AdjustSleeping(10 SECONDS * unmitigated)
return
+21 -16
View File
@@ -6,7 +6,7 @@ Weight Loss
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced Transmittable.
Reduced transmissibility.
High level.
Bonus
@@ -19,21 +19,26 @@ Bonus
/datum/symptom/weight_loss
name = "Weight Loss"
stealth = -3
resistance = -2
stealth = -2
resistance = 1
stage_speed = -2
transmittable = -2
transmissibility = -3
level = 3
severity = 1
severity = 4
chem_treatments = list(
"frostoil" = list("multiplier" = 0, "timer" = 0),
"protein" = list("multiplier" = 0.8, "timer" = 0),
"sugar" = list("multiplier" = 0.9, "timer" = 0),
"plantmatter" = list("multiplier" = 0.9, "timer" = 0),
"vitamin" = list("multiplier" = 0.8, "timer" = 0)
)
/datum/symptom/weight_loss/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(prob(A.progress))
to_chat(M, "<span class='warning'><i>[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]</i></span>")
M.overeatduration = max(M.overeatduration - A.progress * unmitigated, 0)
M.adjust_nutrition(-A.progress * unmitigated)
else
to_chat(M, "<span class='warning'>[pick("You feel hungry.", "You crave for food.")]</span>")
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, "<span class='warning'>[pick("You feel hungry.", "You crave for food.")]</span>")
else
to_chat(M, "<span class='warning'><i>[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]</i></span>")
M.overeatduration = max(M.overeatduration - 100, 0)
M.adjust_nutrition(-100)
+27 -29
View File
@@ -21,35 +21,33 @@ BONUS
stealth = 3
resistance = 4
stage_speed = 4
transmittable = -4
transmissibility = -4
level = 5
activation_prob = SYMPTOM_ACTIVATION_PROB * 2
/datum/symptom/youth/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 2))
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
switch(A.stage)
if(1)
if(H.age > 41)
H.age = 41
to_chat(H, "<span class='notice'>You haven't had this much energy in years!</span>")
if(2)
if(H.age > 36)
H.age = 36
to_chat(H, "<span class='notice'>You're suddenly in a good mood.</span>")
if(3)
if(H.age > 31)
H.age = 31
to_chat(H, "<span class='notice'>You begin to feel more lithe.</span>")
if(4)
if(H.age > 26)
H.age = 26
to_chat(H, "<span class='notice'>You feel reinvigorated.</span>")
if(5)
if(H.age > 21)
H.age = 21
to_chat(H, "<span class='notice'>You feel like you can take on the world!</span>")
/datum/symptom/youth/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(ishuman(M))
var/mob/living/carbon/human/H = M
switch(A.stage)
if(1)
if(H.age > 41)
H.age = 41
to_chat(H, "<span class='notice'>You haven't had this much energy in years!</span>")
if(2)
if(H.age > 36)
H.age = 36
to_chat(H, "<span class='notice'>You're suddenly in a good mood.</span>")
if(3)
if(H.age > 31)
H.age = 31
to_chat(H, "<span class='notice'>You begin to feel more lithe.</span>")
if(4)
if(H.age > 26)
H.age = 26
to_chat(H, "<span class='notice'>You feel reinvigorated.</span>")
if(5)
if(H.age > 21)
H.age = 21
to_chat(H, "<span class='notice'>You feel like you can take on the world!</span>")
return
+2 -2
View File
@@ -3,13 +3,13 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Ethanol"
cures = list("ethanol")
agent = "Excess Lepidopticides"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated subject will regurgitate butterflies."
severity = MINOR
severity = VIRUS_MINOR
/datum/disease/anxiety/stage_act()
if(!..())
+4 -4
View File
@@ -3,14 +3,14 @@
name = "Appendicitis"
max_stages = 3
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "Surgery"
agent = "Shitty Appendix"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated the subject will become very weak, and may vomit often."
severity = MINOR
disease_flags = CAN_CARRY|CAN_RESIST
visibility_flags = HIDDEN_PANDEMIC
severity = VIRUS_MINOR
disease_flags = VIRUS_CAN_CARRY|VIRUS_CAN_RESIST
visibility_flags = VIRUS_HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/internal/appendix)
bypasses_immunity = TRUE
virus_heal_resistant = TRUE
+2 -2
View File
@@ -3,13 +3,13 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Sugar"
cures = list("sugar")
agent = "Apidae Infection"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated subject will regurgitate bees."
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
/datum/disease/beesease/stage_act()
if(!..())
+3 -3
View File
@@ -3,15 +3,15 @@
max_stages = 2
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "Anti-Psychotics"
cures = list("haloperidol")
agent = "Jagged Crystals"
cure_chance = 10
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Swearing, shouting, attacking nearby crew members uncontrollably."
severity = BIOHAZARD
disease_flags = CURABLE
severity = VIRUS_BIOHAZARD
disease_flags = VIRUS_CURABLE
/datum/disease/berserker/stage_act()
if(!..())
+2 -2
View File
@@ -2,7 +2,7 @@
name = "Brainrot"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Mannitol"
cures = list("mannitol")
agent = "Cryptococcus Cosmosis"
@@ -10,7 +10,7 @@
cure_chance = 15
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organs = list(/obj/item/organ/internal/brain)
severity = HARMFUL
severity = VIRUS_HARMFUL
/datum/disease/brainrot/stage_act()
if(!..())
+1 -1
View File
@@ -8,7 +8,7 @@
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
permeability_mod = 0.5
desc = "If left untreated the subject will contract the flu."
severity = MINOR
severity = VIRUS_MINOR
/datum/disease/cold/stage_act()
if(!..())
+2 -2
View File
@@ -3,13 +3,13 @@
medical_name = "ICE9 Cold"
max_stages = 3
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Spaceacillin"
cures = list("spaceacillin")
agent = "ICE9-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated the subject will slow, as if partly frozen."
severity = HARMFUL
severity = VIRUS_HARMFUL
/datum/disease/cold9/stage_act()
if(!..())
+5 -5
View File
@@ -1,11 +1,11 @@
/datum/disease/critical
form = "Medical Emergency"
max_stages = 3
spread_flags = SPECIAL
spread_flags = SPREAD_SPECIAL
viable_mobtypes = list(/mob/living/carbon/human)
severity = MINOR
disease_flags = CURABLE
visibility_flags = HIDDEN_PANDEMIC
severity = VIRUS_MINOR
disease_flags = VIRUS_CURABLE
visibility_flags = VIRUS_HIDDEN_PANDEMIC
bypasses_immunity = TRUE
virus_heal_resistant = TRUE
@@ -87,7 +87,7 @@
cures = list("atropine", "epinephrine", "heparin", "syndicate_nanites", "stimulative_agent")
cure_chance = 10
stage_prob = 5
severity = HARMFUL
severity = VIRUS_HARMFUL
required_organs = list(ORGAN_DATUM_HEART)
/datum/disease/critical/heart_failure/stage_act()
+2 -2
View File
@@ -2,13 +2,13 @@
name = "GBS"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Diphenhydramine & Sulfur"
cures = list("diphenhydramine","sulfur")
agent = "Gravitokinetic Bipotential SADS-"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated death will occur."
severity = BIOHAZARD // Mimicking real GBS
severity = VIRUS_BIOHAZARD // Mimicking real GBS
/datum/disease/fake_gbs/stage_act()
if(!..())
+1 -1
View File
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
permeability_mod = 0.75
desc = "If left untreated the subject will feel quite unwell."
severity = MINOR
severity = VIRUS_MINOR
/datum/disease/flu/stage_act()
if(!..())
+1 -1
View File
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will burn to death for being a heretic."
severity = HARMFUL
severity = VIRUS_HARMFUL
/datum/disease/fluspanish/stage_act()
if(!..())
+3 -3
View File
@@ -3,15 +3,15 @@
max_stages = 3
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "Sleep"
agent = "Salmonella"
cures = list("chicken_soup")
cure_chance = 10
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Nausea, sickness, and vomitting."
severity = MINOR
disease_flags = CURABLE
severity = VIRUS_MINOR
disease_flags = VIRUS_CURABLE
virus_heal_resistant = TRUE
/datum/disease/food_poisoning/stage_act()
+4 -4
View File
@@ -2,13 +2,13 @@
name = "GBS"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Diphenhydramine & Sulfur"
cures = list("diphenhydramine","sulfur")
cure_chance = 15 // Higher chance to cure, since two reagents are required
agent = "Gravitokinetic Bipotential SADS+"
viable_mobtypes = list(/mob/living/carbon/human)
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
/datum/disease/gbs/stage_act()
if(!..())
@@ -41,9 +41,9 @@
name = "Non-Contagious GBS"
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "Cryoxadone"
cures = list("cryoxadone")
cure_chance = 10
agent = "gibbis"
disease_flags = CURABLE
disease_flags = VIRUS_CURABLE
+2 -2
View File
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will turn into a feline. In felines it has... OTHER... effects."
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
/datum/disease/kingstons/stage_act()
if(!..())
@@ -59,7 +59,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will mutate to a different species."
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
var/list/virspecies = list(/datum/species/human, /datum/species/tajaran, /datum/species/unathi,/datum/species/skrell, /datum/species/vulpkanin, /datum/species/diona,
/datum/species/slime, /datum/species/kidan, /datum/species/drask, /datum/species/grey, /datum/species/moth) // No IPCs (not organic), or vox+plasmemes because of air requirements
var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay")
+3 -3
View File
@@ -4,13 +4,13 @@
max_stages = 4
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "Incurable"
agent = "Prions"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Uncontrollable laughing."
severity = BIOHAZARD
disease_flags = CAN_CARRY
severity = VIRUS_BIOHAZARD
disease_flags = VIRUS_CAN_CARRY
bypasses_immunity = TRUE // Kuru is a prion disorder, not a virus
virus_heal_resistant = TRUE
+2 -2
View File
@@ -3,13 +3,13 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Ethanol"
cures = list("ethanol")
agent = "Excess Snuggles"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated subject will regurgitate... puppies."
severity = HARMFUL
severity = VIRUS_HARMFUL
var/barklimit = 10
var/list/puppy_types = list(/mob/living/simple_animal/pet/dog/corgi/puppy, /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/pet/dog/fox)
var/list/plush_types = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox)
+1 -1
View File
@@ -8,7 +8,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field."
severity = MINOR
severity = VIRUS_MINOR
/datum/disease/magnitis/stage_act()
if(!..())
+1 -1
View File
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will probably drive others to insanity and go insane themselves."
severity = MINOR
severity = VIRUS_MINOR
/datum/disease/pierrot_throat/stage_act()
if(!..())
+2 -2
View File
@@ -2,13 +2,13 @@
name = "Retrovirus"
max_stages = 4
spread_text = "Contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Rest or an injection of mutadone"
cure_chance = 6
agent = ""
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly."
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
permeability_mod = 0.4
stage_prob = 2
var/SE
+2 -2
View File
@@ -2,12 +2,12 @@
name = "The Rhumba Beat"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = SPREAD_CONTACT_GENERAL
cure_text = "Chick Chicky Boom!"
cures = list("plasma")
agent = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
/datum/disease/rhumba_beat/stage_act()
if(!..())
+3 -3
View File
@@ -2,13 +2,13 @@
name = "Transformation"
max_stages = 5
spread_text = "Acute"
spread_flags = SPECIAL
spread_flags = SPREAD_SPECIAL
cure_text = "A coder's love (theoretical)."
agent = "Shenanigans"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
stage_prob = 10
disease_flags = CURABLE
disease_flags = VIRUS_CURABLE
var/list/stage1 = list("You feel unremarkable.")
var/list/stage2 = list("You feel boring.")
var/list/stage3 = list("You feel utterly plain.")
+1 -1
View File
@@ -10,7 +10,7 @@
cure_chance = 5 // Like hell are you getting out of hell
desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
required_organs = list(ORGAN_DATUM_LUNGS)
severity = HARMFUL
severity = VIRUS_HARMFUL
bypasses_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs
/datum/disease/tuberculosis/stage_act()
+15 -15
View File
@@ -1,39 +1,39 @@
/datum/disease/beesease/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/cold9/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/fluspanish/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/kingstons_advanced/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/dna_retrovirus/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/tuberculosis/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/wizarditis/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/anxiety/wizard_variant
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
/datum/disease/grut_gut
name = "Grut Gut"
max_stages = 5
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "Pyrotech stabilizing agents"
agent = "Eruca Stomachum"
cures = list("stabilizing_agent")
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A magic-infused disease that builds up dangerously high pressure bile within the stomach."
severity = DANGEROUS
desc = "A magic-infused disease that builds up VIRUS_DANGEROUSly high pressure bile within the stomach."
severity = VIRUS_DANGEROUS
virus_heal_resistant = TRUE
/datum/disease/grut_gut/stage_act()
@@ -98,13 +98,13 @@
max_stages = 5
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "Acetaldehyde"
agent = "nasum magicum"
cures = list("acetaldehyde")
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A magic-infused disease that replaces one's nose hairs with tiny wands. Avoid nasal irritants."
severity = DANGEROUS
severity = VIRUS_DANGEROUS
virus_heal_resistant = TRUE
/datum/disease/wand_rot/stage_act()
@@ -165,13 +165,13 @@
max_stages = 5
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
cure_text = "liquid dark matter"
agent = "Spatio Ventrem"
cures = list("liquid_dark_matter")
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A magic-infused disease that resides in the gut, converting gastric juices into space-matter."
severity = DANGEROUS
severity = VIRUS_DANGEROUS
virus_heal_resistant = TRUE
/datum/disease/mystic_malaise/stage_act()
+1 -1
View File
@@ -9,7 +9,7 @@
agent = "Rincewindus Vulgaris"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
severity = MINOR
severity = VIRUS_MINOR
/// A mapping of `num2text(ITEM_SLOT_XYZ)` -> item path
var/list/magic_fashion = list()
+4 -4
View File
@@ -4,14 +4,14 @@
desc = "This virus infects humanoids and drives them insane with a hunger for flesh, along with possessing regenerative abilities."
max_stages = 7
spread_text = "Blood and Saliva"
spread_flags = BLOOD
spread_flags = SPREAD_BLOOD
cure_text = "Anti-plague viral solutions"
cures = list()
agent = ""
viable_mobtypes = list(/mob/living/carbon/human)
severity = BIOHAZARD
severity = VIRUS_BIOHAZARD
allow_dead = TRUE
disease_flags = CAN_CARRY
disease_flags = VIRUS_CAN_CARRY
virus_heal_resistant = TRUE
stage_prob = 100 // It isn't actually 100%, but is instead based on a timer
cure_chance = 80
@@ -180,7 +180,7 @@
return ..()
/datum/disease/zombie/wizard
spread_flags = NON_CONTAGIOUS
spread_flags = SPREAD_NON_CONTAGIOUS
bypasses_immunity = TRUE
spread_text = "Non Contagious"
cure_text = "Anti-magic"
+1 -1
View File
@@ -107,7 +107,7 @@
var/datum/disease/D = thing
if(!D.discovered) // Early-stage viruses should not show up on med HUD (though health analywers can still pick them up)
continue
if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT))
if((!(D.visibility_flags & VIRUS_HIDDEN_SCANNER)) && (D.severity != VIRUS_NONTHREAT))
return TRUE
return FALSE
@@ -194,12 +194,13 @@
to_chat(owner, "<span class='warning'>You feel sick.</span>")
var/datum/disease/advance/A = random_virus(pick(2, 6), 6)
A.carrier = TRUE
owner.ForceContractDisease(A)
owner.ForceContractDisease(A, TRUE)
/obj/item/organ/internal/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
max_symptoms = VIRUS_SYMPTOM_LIMIT
var/datum/disease/advance/A = new /datum/disease/advance()
A.clear_symptoms()
var/list/datum/symptom/possible_symptoms = list()
for(var/symptom in subtypesof(/datum/symptom))
var/datum/symptom/S = symptom
@@ -208,7 +209,7 @@
if(initial(S.level) <= 0) //unobtainable symptoms
continue
possible_symptoms += S
for(var/i in 1 to max_symptoms)
while(length(A.symptoms) < max_symptoms)
var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
if(chosen_symptom)
var/datum/symptom/S = new chosen_symptom
+1 -1
View File
@@ -533,7 +533,7 @@
H.apply_status_effect(STATUS_EFFECT_PANACEA)
for(var/thing in H.viruses)
var/datum/disease/D = thing
if(D.severity == NONTHREAT)
if(D.severity == VIRUS_NONTHREAT)
continue
D.cure()
+2 -2
View File
@@ -251,7 +251,7 @@
var/found_disease = FALSE
for(var/thing in occupant.viruses)
var/datum/disease/D = thing
if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
if(D.visibility_flags & VIRUS_HIDDEN_SCANNER || D.visibility_flags & VIRUS_HIDDEN_PANDEMIC)
continue
if(istype(D, /datum/disease/critical))
continue
@@ -441,7 +441,7 @@
var/found_disease = FALSE
for(var/thing in occupant.viruses)
var/datum/disease/D = thing
if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
if(D.visibility_flags & VIRUS_HIDDEN_SCANNER || D.visibility_flags & VIRUS_HIDDEN_PANDEMIC)
continue
found_disease = TRUE
break
@@ -179,12 +179,6 @@
build_path = /obj/machinery/computer/med_data
origin_tech = "programming=2;biotech=2"
/obj/item/circuitboard/pandemic
board_name = "PanD.E.M.I.C. 2200"
icon_state = "medical"
build_path = /obj/machinery/computer/pandemic
origin_tech = "programming=2;biotech=2"
/obj/item/circuitboard/scan_consolenew
board_name = "DNA Machine"
icon_state = "medical"
+1
View File
@@ -89,6 +89,7 @@
LAZYADD(dish_drive_contents, I)
visible_message("<span class='notice'>[src] beams up [I]!</span>")
I.forceMove(src)
SEND_SIGNAL(src, COMSIG_ATOM_DISINFECTED)
playsound(src, 'sound/items/pshoom.ogg', 15, TRUE)
flick("synthesizer_beam", src)
else
+8
View File
@@ -987,6 +987,14 @@ to destroy them and players will be able to make replacements.
/obj/item/stack/cable_coil = 1,
/obj/item/stack/sheet/glass = 4)
/obj/item/circuitboard/pandemic
board_name = "PanD.E.M.I.C. 2200"
icon_state = "medical"
board_type = "machine"
build_path = /obj/machinery/pandemic
req_components = list(/obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 1)
origin_tech = "programming=2;biotech=2"
/obj/item/circuitboard/cell_charger
board_name = "Cell Charger"
icon_state = "engineering"
+12 -2
View File
@@ -275,11 +275,19 @@ SLIME SCANNER
for(var/thing in H.viruses)
var/datum/disease/D = thing
if(D.visibility_flags & HIDDEN_SCANNER)
// If the disease is incubating, or if it's stealthy and hasn't been put into a pandemic yet the scanner won't see it
if(D.incubation || (D.visibility_flags & VIRUS_HIDDEN_SCANNER && !(D.GetDiseaseID() in GLOB.detected_advanced_diseases["[user.z]"])))
continue
// Snowflaking heart problems, because they are special (and common).
if(istype(D, /datum/disease/critical))
msgs += "<span class='notice'><font color='red'><b>Warning: Subject is undergoing [D.name].</b>\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]</font></span>"
msgs += "<span class='notice'><font color='red'><b>Warning: Subject is undergoing [D.name].</b>\nStage: [D.stage]/[D.max_stages].\nCure: [D.cure_text]</font></span>"
continue
if(istype(D, /datum/disease/advance))
var/datum/disease/advance/A = D
if(!(A.id in GLOB.known_advanced_diseases[num2text(user.z)]))
msgs += "<span class='notice'><font color='red'><b>Warning: Unknown viral strain detected</b>\nStrain:[A.strain]\nStage: [A.stage]</span>"
else
msgs += "<span class='notice'><font color='red'><b>Warning: [A.form] detected</b>\nName: [A.name].\nStrain:[A.strain]\nType: [A.spread_text].\nStage: [A.stage]/[A.max_stages].\nPossible Cures: [A.cure_text]\nNeeded Cures: [A.cures_required]</font></span>"
continue
msgs += "<span class='notice'><font color='red'><b>Warning: [D.form] detected</b>\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]</font></span>"
@@ -395,6 +403,8 @@ SLIME SCANNER
if(H.radiation > RAD_MOB_SAFE)
msgs += "<span class='danger'>Subject is irradiated.</span>"
msgs += "<span class='notice'>Biological Age: [H.age]</span>"
to_chat(user, chat_box_healthscan(msgs.Join("<br>")))
/obj/item/healthanalyzer/attackby__legacy__attackchain(obj/item/I, mob/user, params)
+2
View File
@@ -210,6 +210,8 @@
. = ..()
extinguish()
acid_level = 0
if(temperature > VIRUS_DISINFECTION_TEMP)
SEND_SIGNAL(src, COMSIG_ATOM_DISINFECTED)
/obj/singularity_pull(S, current_size)
..()
+2
View File
@@ -15,6 +15,8 @@
atmos_mode = ATMOS_MODE_SPACE
rad_insulation_alpha = RAD_NO_INSULATION
/turf/space/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
if(!istype(src, /turf/space/transit))
+47 -5
View File
@@ -92,6 +92,7 @@ GLOBAL_LIST_INIT(admin_verbs_event, list(
/client/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/disease_outbreak,
/client/proc/one_click_antag,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_add_random_ai_law,
@@ -776,12 +777,53 @@ GLOBAL_LIST_INIT(view_logs_verbs, list(
set category = "Event"
set name = "Give Disease"
set desc = "Gives a Disease to a mob."
var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in GLOB.diseases
if(!D) return
T.ForceContractDisease(new D)
var/datum/disease/given_disease = null
if(tgui_input_list(usr, "Create own disease", "Would you like to create your own disease?", list("Yes","No")) == "Yes")
given_disease = AdminCreateVirus(usr)
else
given_disease = tgui_input_list(usr, "ACHOO", "Choose the disease to give to that guy", GLOB.diseases)
if(!given_disease)
return
if(!istype(given_disease, /datum/disease/advance))
given_disease = new given_disease
T.ForceContractDisease(given_disease)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] gave [key_name(T)] the disease [D].</span>")
log_admin("[key_name(usr)] gave [key_name(T)] the disease [given_disease].")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] gave [key_name(T)] the disease [given_disease].</span>")
/client/proc/disease_outbreak()
set category = "Event"
set name = "Disease Outbreak"
set desc = "Creates a disease and infects a random player with it"
var/datum/disease/given_disease = null
if(tgui_input_list(usr, "Create own disease", "Would you like to create your own disease?", list("Yes","No")) == "Yes")
given_disease = AdminCreateVirus(usr)
else
given_disease = tgui_input_list(usr, "ACHOO", "Choose the disease to give to that guy", GLOB.diseases)
if(!given_disease)
return
if(!istype(given_disease, /datum/disease/advance))
given_disease = new given_disease
for(var/thing in shuffle(GLOB.human_list))
var/mob/living/carbon/human/H = thing
if(H.stat == DEAD || !is_station_level(H.z))
continue
if(!H.HasDisease(given_disease))
H.ForceContractDisease(given_disease)
break
if(istype(given_disease, /datum/disease/advance))
var/datum/disease/advance/given_advanced_disease = given_disease
var/list/name_symptoms = list()
for(var/datum/symptom/S in given_advanced_disease.symptoms)
name_symptoms += S.name
message_admins("[key_name_admin(usr)] has triggered a custom virus outbreak of [given_advanced_disease.name]! It has these symptoms: [english_list(name_symptoms)] and these base stats [english_map(given_advanced_disease.base_properties)]")
else
message_admins("[key_name_admin(usr)] has triggered a custom virus outbreak of [given_disease.name]!")
/client/proc/make_sound(obj/O in view()) // -- TLE
set name = "\[Admin\] Make Sound"
@@ -133,6 +133,28 @@ RESTRICT_TYPE(/datum/ui_module/admin/antagonist_menu)
temp_list["max_health"] = player.maxHealth
cached_data["security"] += list(temp_list)
cached_data["disease_carriers"] = list()
cached_data["virus_data"] = list()
for(var/datum/disease/advance/virus in GLOB.active_diseases)
var/list/temp_list = list()
var/list/temp_list2 = list()
var/mob/living/carbon/player = virus.affected_mob
if(!player?.mind)
continue
temp_list["name"] = player.mind.name
temp_list["mind_uid"] = player.mind.UID()
temp_list["ckey"] = ckey(player.mind.key)
temp_list["status"] = player.stat
temp_list["health"] = player.health
temp_list["max_health"] = player.maxHealth
temp_list["progress"] = virus.progress
temp_list["patient_zero"] = virus.carrier
temp_list["virus_name"] = virus.name
temp_list["strain"] = virus.strain
if(!("[virus.strain]" in temp_list2))
temp_list2["[virus.strain]"] = english_list(virus.symptoms)
cached_data["disease_carriers"] += list(temp_list)
cached_data["virus_data"] += temp_list2
/datum/ui_module/admin/antagonist_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
if(..())
@@ -26,7 +26,7 @@
user.apply_status_effect(STATUS_EFFECT_PANACEA)
for(var/thing in user.viruses)
var/datum/disease/D = thing
if(D.severity == NONTHREAT)
if(D.severity == VIRUS_NONTHREAT)
continue
D.cure()
@@ -79,8 +79,7 @@ RESTRICT_TYPE(/datum/antagonist/zombie)
ADD_TRAIT(L, trait, ZOMBIE_TRAIT)
if(!L.HasDisease(/datum/disease/zombie))
var/datum/disease/zombie/zomb = new /datum/disease/zombie()
zomb.stage = 7
L.AddDisease(zomb)
L.AddDisease(zomb, FALSE, 7)
if(ishuman(L))
var/mob/living/carbon/human/H = L
+2 -2
View File
@@ -764,8 +764,8 @@
ADD_TRAIT(H, TRAIT_NON_INFECTIOUS_ZOMBIE, ROUNDSTART_TRAIT)
. = ..()
for(var/datum/disease/zombie/zomb in H.viruses)
zomb.spread_flags = SPECIAL
zomb.visibility_flags = HIDDEN_PANDEMIC // This is how critical diseases block being interacted by the pandemic or copied. I hate it here.
zomb.spread_flags = SPREAD_SPECIAL
zomb.visibility_flags = VIRUS_HIDDEN_PANDEMIC // This is how critical diseases block being interacted by the pandemic or copied. I hate it here.
/// these mob spawn subtypes trigger immediately (New or Initialize) and are not player controlled... since they're dead, you know?
+6 -3
View File
@@ -2,6 +2,7 @@
name = "clothing"
integrity_failure = 80
resistance_flags = FLAMMABLE
permeability_coefficient = 0.8
/// Only these species can wear this kit.
var/list/species_restricted
/// Can the wearer see reagents inside transparent containers while it's equipped?
@@ -244,6 +245,7 @@
gender = PLURAL
icon = 'icons/obj/clothing/gloves.dmi'
siemens_coefficient = 0.50
permeability_coefficient = 0.5
body_parts_covered = HANDS
slot_flags = ITEM_SLOT_GLOVES
attack_verb = list("challenged")
@@ -538,6 +540,7 @@
body_parts_covered = HEAD
slot_flags = ITEM_SLOT_MASK
put_on_delay = 4 SECONDS
permeability_coefficient = 0.7
var/adjusted_flags = null
@@ -620,7 +623,7 @@
dyeable = TRUE
dyeing_key = DYE_REGISTRY_SHOES
permeability_coefficient = 0.50
permeability_coefficient = 0.4
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/shoes.dmi',
@@ -748,6 +751,7 @@
drop_sound = 'sound/items/handling/cloth_drop.ogg'
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
slot_flags = ITEM_SLOT_OUTER_SUIT
permeability_coefficient = 0.75
var/fire_resist = T0C + 100
var/blood_overlay_type = "suit"
@@ -972,7 +976,7 @@
item_state = "s_suit"
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
permeability_coefficient = 0.01
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
@@ -999,7 +1003,6 @@
icon = 'icons/obj/clothing/under/misc.dmi'
name = "under"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
permeability_coefficient = 0.90
slot_flags = ITEM_SLOT_JUMPSUIT
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
equip_sound = 'sound/items/equip/jumpsuit_equip.ogg'
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/clothing/glasses/hud
name = "\improper HUD"
desc = "A heads-up display that provides important info in (almost) real time."
flags = null //doesn't protect eyes because it's a monocle, duh
flags_cover = null //doesn't protect eyes because it's a monocle, duh
origin_tech = "magnets=3;biotech=2"
prescription_upgradable = TRUE
/// The visual icons granted by wearing these glasses.
@@ -2,23 +2,28 @@
name = "security HUD goggles"
desc = "Fashionable security goggles."
icon_state = "sechudgoggles"
flags_cover = GLASSESCOVERSEYES
/obj/item/clothing/glasses/hud/health/goggles
name = "health HUD goggles"
desc = "Fashionable medical goggles."
icon_state = "medhudgoggles"
flags_cover = GLASSESCOVERSEYES
/obj/item/clothing/glasses/hud/diagnostic/goggles
name = "diagnostic HUD goggles"
desc = "Fashionable diagnostic goggles."
icon_state = "diaghudgoggles"
flags_cover = GLASSESCOVERSEYES
/obj/item/clothing/glasses/hud/hydroponic/goggles
name = "hydroponic HUD goggles"
desc = "Fashionable hydroponic goggles."
icon_state = "hydrohudgoggles"
flags_cover = GLASSESCOVERSEYES
/obj/item/clothing/glasses/hud/skills/goggles
name = "skills HUD goggles"
desc = "Fashionable skills goggles."
icon_state = "skillhudgoggles"
flags_cover = GLASSESCOVERSEYES
@@ -7,7 +7,7 @@
icon_state = "yellow"
item_state = "ygloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
permeability_coefficient = 0.01
item_color = "yellow"
resistance_flags = NONE
@@ -21,7 +21,7 @@
icon_state = "yellow"
item_state = "ygloves"
siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
permeability_coefficient = 0.05
permeability_coefficient = 0.01
item_color="yellow"
resistance_flags = NONE
@@ -55,6 +55,7 @@
"Grey" = 'icons/mob/clothing/species/grey/gloves.dmi',
"Kidan" = 'icons/mob/clothing/species/kidan/gloves.dmi',
)
permeability_coefficient = 0.1
/obj/item/clothing/gloves/color/black/thief
pickpocket = 1
@@ -98,7 +99,7 @@
name = "insulated gloves"
desc = "A pair of rubber-lined industrial gloves. They'll protect the wearer from electrical shocks."
siemens_coefficient = 0
permeability_coefficient = 0.05
permeability_coefficient = 0.01
resistance_flags = NONE
/obj/item/clothing/gloves/color/rainbow
@@ -193,7 +194,7 @@
item_state = "captain"
item_color = "captain"
siemens_coefficient = 0
permeability_coefficient = 0.05
permeability_coefficient = 0.01
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
@@ -7,6 +7,7 @@
transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
permeability_coefficient = 1
strip_delay = 40
put_on_delay = 20
clipped = TRUE
+2
View File
@@ -19,6 +19,7 @@
"Drask" = 'icons/mob/clothing/species/drask/helmet.dmi',
"Grey" = 'icons/mob/clothing/species/grey/helmet.dmi'
)
permeability_coefficient = 0.4
/obj/item/clothing/head/helmet/attack_self__legacy__attackchain(mob/user)
if(can_toggle && !user.incapacitated())
@@ -94,6 +95,7 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
dog_fashion = null
permeability_coefficient = 0.01
/obj/item/clothing/head/helmet/riot/knight
name = "medieval helmet"
+1
View File
@@ -198,6 +198,7 @@
"Drask" = 'icons/mob/clothing/species/drask/head.dmi',
"Vox" = 'icons/mob/clothing/species/vox/head.dmi'
)
permeability_coefficient = 0.01
/obj/item/clothing/head/surgery/purple
name = "purple surgical cap"
@@ -194,6 +194,9 @@
"Drask" = 'icons/mob/clothing/species/drask/mask.dmi'
)
/obj/item/clothing/mask/surgical/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_ANTI_VIRAL, "inherent")
/obj/item/clothing/mask/surgical/attack_self__legacy__attackchain(mob/user)
adjustmask(user)
+3
View File
@@ -20,6 +20,7 @@
)
actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
permeability_coefficient = 0.35
/obj/item/clothing/suit/storage/labcoat/medical
name = "medical doctor's labcoat"
@@ -33,6 +34,7 @@
icon_state = "labcoat_cmo_open"
item_state = "labcoat_cmo_open"
insert_max = 2
permeability_coefficient = 0.2
/obj/item/clothing/suit/storage/labcoat/mad
name = "mad scientist's labcoat"
@@ -57,6 +59,7 @@
desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has green medical markings."
icon_state = "labcoat_viro_open"
item_state = "labcoat_viro_open"
permeability_coefficient = 0.2
/obj/item/clothing/suit/storage/labcoat/science
name = "scientist labcoat"
@@ -28,7 +28,7 @@
/obj/item/clothing/under/rank/medical/doctor
name = "medical doctor's jumpsuit"
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
desc = "It's made of a special fiber that provides protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
icon_state = "medical"
item_state = "medical"
item_color = "medical"
@@ -90,35 +90,36 @@
/obj/item/clothing/under/rank/medical/scrubs
name = "blue medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
desc = "It's made of a special fiber that provides protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
item_color = "scrubsblue"
permeability_coefficient = 0.1
/obj/item/clothing/under/rank/medical/scrubs/green
name = "green medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green."
desc = "It's made of a special fiber that provides protection against biohazards. This one is in dark green."
icon_state = "scrubsgreen"
item_color = "scrubsgreen"
/obj/item/clothing/under/rank/medical/scrubs/purple
name = "purple medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
desc = "It's made of a special fiber that provides protection against biohazards. This one is in deep purple."
icon_state = "scrubspurple"
item_color = "scrubspurple"
/obj/item/clothing/under/rank/medical/scrubs/coroner
name = "coroner's scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is as dark as an emo's poetry."
desc = "It's made of a special fiber that provides protection against biohazards. This one is as dark as an emo's poetry."
icon_state = "scrubsblack"
item_color = "scrubsblack"
/obj/item/clothing/under/rank/medical/chemist
name = "chemist's jumpsuit"
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
desc = "It's made of a special fiber that gives minor protection against biohazards. It has a chemist rank stripe on it."
icon_state = "chemistry"
item_state = "chemistry"
item_color = "chemistry"
permeability_coefficient = 0.50
permeability_coefficient = 0.3
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 50, ACID = 95)
/obj/item/clothing/under/rank/medical/chemist/skirt
@@ -133,7 +134,7 @@
icon_state = "paramedic"
item_state = "paramedic"
item_color = "paramedic"
permeability_coefficient = 0.50
permeability_coefficient = 0.3
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 5, FIRE = 0, ACID = 0)
/obj/item/clothing/under/rank/medical/paramedic/skirt

Some files were not shown because too many files have changed in this diff Show More