mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 11:05:03 +01:00
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:
committed by
GitHub
parent
4f77a856f0
commit
a5260456ae
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
@@ -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!"
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
))
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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"],
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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,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(!..())
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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,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(!..())
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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,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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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,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,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(!..())
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user