diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index a09c218e9b9..410253a2749 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -158,25 +158,25 @@
// Init disease archive
GLOB.archive_diseases += list(
- "sneeze" = new /datum/disease/advance/preset/cold(),
- "cough" = new /datum/disease/advance/preset/flu(),
- "voice_change" = new /datum/disease/advance/preset/voice_change(),
- "heal" = new /datum/disease/advance/preset/heal(),
- "hallucigen" = new /datum/disease/advance/preset/hullucigen(),
- "sensory_restoration" = new /datum/disease/advance/preset/sensory_restoration(),
- "mind_restoration" = new /datum/disease/advance/preset/mind_restoration(),
- "damage_converter:heal:viralevolution" = new /datum/disease/advance/preset/advanced_regeneration(),
- "dizzy:flesh_eating:viraladaptation:youth" = new /datum/disease/advance/preset/stealth_necrosis(),
- "beard:itching:voice_change" = new /datum/disease/advance/preset/pre_kingstons(),
- "love" = new /datum/disease/advance/preset/love(),
- "aggression" = new /datum/disease/advance/preset/aggression(),
- "obsession" = new /datum/disease/advance/preset/obsession(),
- "confusion" = new /datum/disease/advance/preset/confusion(),
- "bones" = new /datum/disease/advance/preset/bones(),
- "laugh" = new /datum/disease/advance/preset/laugh(),
- "moan" = new /datum/disease/advance/preset/moan(),
- "infection" = new /datum/disease/advance/preset/infection(),
- "hallucigen:laugh:moan" = new /datum/disease/advance/preset/pre_loyalty()
+ "sneeze" = new /datum/disease/virus/advance/preset/sneezing(),
+ "cough" = new /datum/disease/virus/advance/preset/cough(),
+ "voice_change" = new /datum/disease/virus/advance/preset/voice_change(),
+ "heal" = new /datum/disease/virus/advance/preset/heal(),
+ "hallucigen" = new /datum/disease/virus/advance/preset/hullucigen(),
+ "sensory_restoration" = new /datum/disease/virus/advance/preset/sensory_restoration(),
+ "mind_restoration" = new /datum/disease/virus/advance/preset/mind_restoration(),
+ "damage_converter:heal:viralevolution" = new /datum/disease/virus/advance/preset/advanced_regeneration(),
+ "dizzy:flesh_eating:viraladaptation:youth" = new /datum/disease/virus/advance/preset/stealth_necrosis(),
+ "beard:itching:voice_change" = new /datum/disease/virus/advance/preset/pre_kingstons(),
+ "love" = new /datum/disease/virus/advance/preset/love(),
+ "aggression" = new /datum/disease/virus/advance/preset/aggression(),
+ "obsession" = new /datum/disease/virus/advance/preset/obsession(),
+ "confusion" = new /datum/disease/virus/advance/preset/confusion(),
+ "bones" = new /datum/disease/virus/advance/preset/bones(),
+ "laugh" = new /datum/disease/virus/advance/preset/laugh(),
+ "moan" = new /datum/disease/virus/advance/preset/moan(),
+ "infection" = new /datum/disease/virus/advance/preset/infection(),
+ "hallucigen:laugh:moan" = new /datum/disease/virus/advance/preset/pre_loyalty()
)
//creates every subtype of prototype (excluding prototype) and adds it to list L.
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index d8c53f7b660..93e16bbccd3 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -1,135 +1,134 @@
-
-/mob/proc/HasDisease(datum/disease/D)
- for(var/thing in viruses)
- var/datum/disease/DD = thing
- if(D.IsSame(DD))
- return 1
- return 0
-
-
-/mob/proc/CanContractDisease(datum/disease/D)
- if(stat == DEAD)
+/mob/proc/HasDisease(disease_type_or_instance)
+ if(ispath(disease_type_or_instance))
+ for(var/datum/disease/D2 in diseases)
+ if(D2.type == disease_type_or_instance)
+ return TRUE
return FALSE
-
- if(D.GetDiseaseID() in resistances)
- return FALSE
-
- if(HasDisease(D))
+ else if(!istype(disease_type_or_instance, /datum/disease))
return FALSE
- if(istype(D, /datum/disease/advance) && count_by_type(viruses, /datum/disease/advance) > 0)
- return FALSE
-
- if(!(type in D.viable_mobtypes))
- return -1 //for stupid fucking monkies
-
- return TRUE
-
-
-/mob/proc/ContractDisease(datum/disease/D)
- if(!CanContractDisease(D))
- return 0
- D.Contract(src)
-
-/mob/living/carbon/ContractDisease(datum/disease/D)
- if(!CanContractDisease(D))
- 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(istype(src, /mob/living/carbon/human))
- 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(slot_w_uniform))
- Cl = slot_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)
- D.Contract(src)
+ for(var/datum/disease/D2 in diseases)
+ if(D2.IsSame(disease_type_or_instance))
+ return TRUE
+ return FALSE
+/mob/proc/CureAllDiseases(need_immunity = TRUE)
+ for(var/datum/disease/D in diseases)
+ D.cure(need_immunity = need_immunity)
/**
- * 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
+ * A special checks for this type of mob
*
- * Arguments:
- * * D - the disease the mob will try to contract
+ * Returns:
+ * * TRUE - if can contract disease
+ * * FALSE - otherwise
*/
-//Same as ContractDisease, except never overidden clothes checks
-/mob/proc/ForceContractDisease(datum/disease/D)
- if(!CanContractDisease(D))
- return FALSE
- D.Contract(src)
+/mob/proc/CanContractDisease(datum/disease/D)
return TRUE
-
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
- if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity)
- return 0
+ if((VIRUSIMMUNE in dna.species.species_traits) && !D.ignore_immunity)
+ return FALSE
for(var/thing in D.required_organs)
if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
- return 0
+ return FALSE
return ..()
-/mob/living/carbon/human/lesser/monkey/CanContractDisease(datum/disease/D)
- . = ..()
- 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
+/**
+ * Checking mob's protection against disease D by the chosen method in chosen zone
+ * Returns:
+ * * TRUE - mob has protected from the virus
+ * * FALSE - otherwise
+ */
+/mob/proc/CheckVirusProtection(datum/disease/virus/V, act_type = BITES|CONTACT|AIRBORNE, zone)
+ if(prob(15/V.permeability_mod))
+ return TRUE
+
+ if(satiety > 0 && prob(satiety/10))
+ return TRUE
+
+ //virus must to pass all the checks stated in act_type
+ if((act_type & BITES) && !CheckBitesProtection(V, zone))
+ return FALSE
+
+ if((act_type & CONTACT) && !CheckContactProtection(V, zone))
+ return FALSE
+
+ if((act_type & AIRBORNE) && !CheckAirborneProtection(V, zone))
+ return FALSE
+
+ return TRUE
+
+//Returns TRUE, if mob protected
+/mob/proc/CheckBitesProtection(datum/disease/virus/V, zone)
+ return FALSE
+
+/mob/proc/CheckContactProtection(datum/disease/virus/V, zone)
+ return FALSE
+
+/mob/proc/CheckAirborneProtection(datum/disease/virus/V, zone)
+ return FALSE
+
+/mob/living/CheckBitesProtection(datum/disease/virus/V, zone = BODY_ZONE_CHEST)
+ return ..() || prob(run_armor_check(zone, "melee") / V.permeability_mod)
+
+/mob/living/carbon/human/CheckContactProtection(datum/disease/virus/V, zone)
+ if(..())
+ return TRUE
+
+ var/zone_text
+ if(!zone)
+ zone_text = pick(40; "head", 40; "chest", 10; "l_arm", 10; "l_leg")
+ else
+ if(istype(zone, /obj/item/organ/external))
+ var/obj/item/organ/external/E = zone
+ zone_text = E.limb_name
+ else
+ zone_text = zone
+
+ switch(zone_text)
+ if("head", "eyes", "mouth")
+ if(ClothingVirusProtection(head) || ClothingVirusProtection(wear_mask))
+ return TRUE
+ if("chest", "groin", "tail", "wing")
+ if(ClothingVirusProtection(wear_suit) || ClothingVirusProtection(w_uniform))
+ return TRUE
+ if("l_arm", "r_arm", "l_hand", "r_hand")
+ if(istype(wear_suit) && (wear_suit.body_parts_covered & HANDS) && ClothingVirusProtection(wear_suit))
+ return TRUE
+ if(ClothingVirusProtection(gloves))
+ return TRUE
+ if("l_leg", "r_leg", "l_foot", "r_foot")
+ if(istype(wear_suit) && (wear_suit.body_parts_covered & FEET) && ClothingVirusProtection(wear_suit))
+ return TRUE
+ if(ClothingVirusProtection(shoes))
+ return TRUE
+
+ return FALSE
+
+/mob/living/carbon/human/CheckAirborneProtection(datum/disease/virus/V, zone)
+ if(..())
+ return TRUE
+
+ var/internals_mod = internal ? 1 : 0.2
+ var/permeability_mod = clamp((2 - V.permeability_mod), 0.1, 1)
+ var/mask_protection_mod = 1
+ if(wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))
+ mask_protection_mod = 0.3
+ if(istype(wear_mask, /obj/item/clothing/mask/breath))
+ mask_protection_mod = 0.4
+ if(istype(wear_mask, /obj/item/clothing/mask/gas))
+ mask_protection_mod = 0.6
+ if(istype(wear_mask, /obj/item/clothing/mask/surgical) || istype(wear_mask, /obj/item/clothing/mask/breath/medical))
+ mask_protection_mod = 0.9
+
+ if(prob(100 * permeability_mod * internals_mod * mask_protection_mod))
+ return TRUE
+
+ return FALSE
+
+/mob/living/carbon/human/proc/ClothingVirusProtection(obj/item/Clothing)
+ //permeability_coefficient == 0.01 => 99% defense; permeability_coefficient == 1 => 0% defense
+ if(istype(Clothing) && prob(100 * (1 - Clothing.permeability_coefficient)))
+ return TRUE
+ return FALSE
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index 3092d82f3e8..e5b2811a226 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -1,25 +1,8 @@
-
-#define VIRUS_SYMPTOM_LIMIT 6
-
//Visibility Flags
-#define VISIBLE 0
-#define HIDDEN_SCANNER 1
-#define HIDDEN_PANDEMIC 2
-
-//Disease Flags
-#define CURABLE 1
-#define CAN_CARRY 2
-#define CAN_RESIST 4
-
-//Spread Flags
-#define SPECIAL 1
-#define NON_CONTAGIOUS 2
-#define BLOOD 4
-#define CONTACT_FEET 8
-#define CONTACT_HANDS 16
-#define CONTACT_GENERAL 32
-#define AIRBORNE 64
-
+#define VISIBLE 0
+#define HIDDEN_HUD 1 //hidden from huds & medbots
+#define HIDDEN_SCANNER 2 //hidden from health analyzers & stationary body analyzers
+#define HIDDEN_PANDEMIC 4 //hidden from pandemic
//Severity Defines
#define NONTHREAT "No threat"
@@ -29,193 +12,253 @@
#define DANGEROUS "Dangerous!"
#define BIOHAZARD "BIOHAZARD THREAT!"
-
GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
-
/datum/disease
- //Flags
- var/visibility_flags = VISIBLE
- var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST
- var/spread_flags = AIRBORNE
-
//Fluff
- var/form = "Virus"
- var/name = "No disease"
+ var/form = "Болезнь"
+ var/name = "Unknown"
var/desc = ""
var/agent = "some microbes"
- var/spread_text = ""
- var/cure_text = ""
+ var/cure_text = null
+ var/additional_info = "Болезнь"
//Stages
+
+ /// Current stage of disease
var/stage = 1
- var/max_stages = 0
+ /// Count of stages of disease
+ var/max_stages = 5
+ /// Probability of moving to the next stage for a tick
var/stage_prob = 4
- /// The fraction of stages the virus must at least be at to show up on medical HUDs. Rounded up.
+
+ //Visibility
+ var/visibility_flags = VISIBLE
+ /// If NONTHREAT, not marked on HUD
+ var/severity = NONTHREAT
+
+ /// The fraction of stages the disease must at least be at to show up on medical HUDs. Rounded up.
var/discovery_threshold = 0.5
- /// If TRUE, this virus will show up on medical HUDs. Automatically set when it reaches mid-stage.
+ /// If TRUE, this disease will show up on medical HUDs. Automatically set when it reaches mid-stage.
var/discovered = FALSE
- //Other
- var/list/viable_mobtypes = list() //typepaths of viable mobs
- var/mob/living/carbon/affected_mob = null
- var/list/cures = list() //list of cures if the disease has the 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/list/required_organs = list()
+ //Cure & immunity
+
+ /// Сan the disease be cured
+ var/curable = TRUE
+ /// List of cures if the disease has curable = TRUE, these are reagent ids
+ var/list/cures = list()
+ /// If FASLSE, you need one of any cure from the cures list. Otherwise, you need all the cures from the cure list
var/needs_all_cures = TRUE
- var/list/strain_data = list() //dna_spread special bullshit
+ /// Probability of cure for a tick
+ var/cure_prob = 8
+ /// Immunity can be developed from the disease
+ var/can_immunity = TRUE
+ /// Does it skip VIRUSIMMUNE trait check
+ var/ignore_immunity = FALSE
+ /// Immunity to Anti-Bodies Metabolism symptom
+ var/virus_heal_resistant = FALSE
+ /// Message when cured
+ var/cured_message = "You feel better."
+
+ //Mutations
+
+ /// Probability of mutation if the necessary reagents are in the body
var/mutation_chance = 1
+ /// Necessary reagents
var/list/mutation_reagents = list("mutagen")
+ /// List of diseases in which it can mutate
var/list/possible_mutations
+ //Other
+
+ /// Mob that is suffering from this disease
+ var/mob/living/affected_mob
+ /// Types of infectable mobs
+ var/list/infectable_mobtypes = list(/mob/living/carbon/human)
+ /// Required organs
+ var/list/required_organs = list()
+ /// If TRUE, disease can progress in dead mobs
+ var/can_progress_in_dead = FALSE
+ /// If TRUE, disease can contract dead mobs
+ var/can_contract_dead = FALSE
+ /// If TRUE, host not affected by virus, but can spread it (mostly for viruses)
+ var/carrier = FALSE
+ /// Infectable mob types, that can only be carriers
+ var/list/carrier_mobtypes = list()
+
+
+/datum/disease/New()
+ if(!cure_text)
+ var/reagents = list()
+ for(var/id in cures)
+ var/datum/reagent/R = GLOB.chemical_reagents_list[id]
+ if(istype(R))
+ reagents += R.name
+ cure_text = english_list(reagents, "Неизлечимо", needs_all_cures ? " & " : " or ")
+
/datum/disease/Destroy()
affected_mob = null
GLOB.active_diseases.Remove(src)
return ..()
+
+/**
+ * Main disease process, that executed every tick
+ *
+ * Returns:
+ * * TRUE - if process finished the work properlly
+ * * FALSE - if disease was deleted
+ */
/datum/disease/proc/stage_act()
- var/cure = has_cure()
+ if(!affected_mob)
+ return FALSE
- if(carrier && !cure)
- return TRUE
+ if(affected_mob?.stat == DEAD && !can_progress_in_dead)
+ return FALSE
+ var/cure = has_cure()
stage = min(stage, max_stages)
- if(!cure)
- if(prob(stage_prob))
- stage = min(stage + 1,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()
+ if(cure)
+ try_reduce_stage()
else
- if(prob(cure_chance))
- stage = max(stage - 1, 1)
+ try_increase_stage()
- if(disease_flags & CURABLE)
- if(cure && prob(cure_chance))
- cure()
- return FALSE
+ if(curable && cure && prob(cure_prob))
+ cure()
+ return FALSE
if(possible_mutations && prob(mutation_chance))
- mutate()
-
+ if(mutate())
+ return FALSE
return TRUE
-/datum/disease/proc/has_cure()
- if(!(disease_flags & CURABLE))
- return 0
+/datum/disease/proc/try_increase_stage()
+ if(prob(stage_prob))
+ stage = min(stage + 1, max_stages)
+ // Once we reach a late enough stage, medical HUDs can pick us up even if we regress
+ if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1))
+ discovered = TRUE
+ affected_mob.med_hud_set_status()
+/datum/disease/proc/try_reduce_stage()
+ if(prob(cure_prob))
+ stage = max(stage - 1, 1)
+
+/**
+ * Returns the number of reagents from the cures list that are in the body
+ */
+/datum/disease/proc/has_cure()
. = cures.len
for(var/C_id in cures)
- if(!affected_mob.reagents.has_reagent(C_id))
+ if(!affected_mob.reagents?.has_reagent(C_id))
.--
- if(!. || (needs_all_cures && . < cures.len))
+ if(. <= 0 || (needs_all_cures && . < cures.len))
return 0
-/datum/disease/proc/spread(force_spread = 0)
- if(!affected_mob)
- return
- if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
- return
+/datum/disease/proc/cure(id = type, need_immunity = TRUE)
+ if(affected_mob)
+ if(can_immunity && need_immunity && !(id in affected_mob.resistances))
+ affected_mob.resistances += id
+ affected_mob.diseases -= src
+ affected_mob.med_hud_set_status()
+ if(cured_message)
+ to_chat(affected_mob, span_notice(cured_message))
+ qdel(src)
- if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
- return
- var/spread_range = 1
+/datum/disease/proc/spread()
+ return
- if(force_spread)
- spread_range = force_spread
+/**
+ * Basic checks of the possibility of infecting a mob
+ */
+/datum/disease/proc/CanContract(mob/living/M, act_type, need_protection_check, zone)
+ . = FALSE
+ if(!M.CanContractDisease(src))
+ return FALSE
- if(spread_flags & AIRBORNE)
- spread_range++
+ if(M.stat == DEAD && !can_contract_dead)
+ return FALSE
- var/turf/T = affected_mob.loc
- if(istype(T))
- for(var/mob/living/carbon/C in oview(spread_range, affected_mob))
- var/turf/V = get_turf(C)
- if(V)
- while(TRUE)
- if(V == T)
- C.ContractDisease(src)
- break
- var/turf/Temp = get_step_towards(V, T)
- if(!V.CanAtmosPass(Temp))
- break
- V = Temp
+ if(GetDiseaseID() in M.resistances)
+ return FALSE
-/datum/disease/proc/Contract(mob/M)
- var/datum/disease/D = new type()
- M.viruses += D
- D.affected_mob = M
- GLOB.active_diseases += D //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")
- for(var/V in D.vars)
- if(V in skipped)
- continue
- if(istype(D.vars[V],/list))
- var/list/L = vars[V]
- D.vars[V] = L.Copy()
- else
- D.vars[V] = vars[V]
+ if(M.HasDisease(src))
+ return FALSE
+
+ for(var/mobtype in infectable_mobtypes + carrier_mobtypes)
+ if(istype(M, mobtype))
+ . = TRUE
+
+ if(. && need_protection_check && M.CheckVirusProtection(src, act_type, zone))
+ . = FALSE
- D.affected_mob.med_hud_set_status()
return
-/datum/disease/proc/cure(resistance = TRUE)
- if(affected_mob)
- if(disease_flags & CAN_RESIST)
- if(!(type in affected_mob.resistances))
- affected_mob.resistances += type
- remove_virus()
- qdel(src)
+/**
+ * Attempt to infect a mob
+ * Arguments:
+ * * act_type - type of contract. Can be BITES, CONTACT, AIRBORNE or combination of them, for example CONTACT|AIRBORNE
+ * * is_carrier - make this mob a carrier of the virus
+ * * need_protection_check - check mob's clothing, internals, special masks etc
+ * * zone - zone of contact ("l_leg", "head", etc or /obj/item/organ/external)
+ * Returns:
+ * * /datum/disease/D - a new instance of the virus that contract the mob
+ * * FALSE - otherwise
+ */
+/datum/disease/proc/Contract(mob/living/M, act_type, is_carrier = FALSE, need_protection_check = FALSE, zone)
+ if(!CanContract(M, act_type, need_protection_check, zone))
+ return FALSE
+
+ var/datum/disease/D = Copy()
+ M.diseases += D
+ D.affected_mob = M
+ GLOB.active_diseases += D
+ D.carrier = is_carrier
+ D.affected_mob.med_hud_set_status()
+ return D
+
/datum/disease/proc/IsSame(datum/disease/D)
if(src.type == D.type)
- return 1
- return 0
+ return TRUE
+ return FALSE
/datum/disease/proc/Copy()
var/datum/disease/D = new type()
- D.strain_data = strain_data.Copy()
return D
/datum/disease/proc/GetDiseaseID()
return type
-/datum/disease/proc/IsSpreadByTouch()
- if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL)
- return 1
- return 0
-
-//don't use this proc directly. this should only ever be called by cure() //nope
-/datum/disease/proc/remove_virus()
- affected_mob.viruses -= src //remove the datum from the list
- affected_mob.med_hud_set_status()
-
+/**
+ * Transform a disease into another, if the requirements are met
+ *
+ * Returns:
+ * * TRUE - if mutation was succesful
+ * * FALSE - otherwise
+ */
/datum/disease/proc/mutate()
var/datum/reagents/reagents = affected_mob.reagents
if(!reagents.reagent_list.len)
- return
+ return FALSE
for(var/R in mutation_reagents)
if(!reagents.has_reagent(R))
- return
+ return FALSE
//Here we have all the necessary reagents in affected_mob
var/type = pick(possible_mutations)
if(type)
- remove_virus()
- affected_mob.ForceContractDisease(new type)
+ affected_mob.diseases -= src
+ affected_mob.med_hud_set_status()
+ var/datum/disease/new_disease = new type
+ new_disease.Contract(affected_mob)
qdel(src)
+ return TRUE
diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm
deleted file mode 100644
index 0d84afeab57..00000000000
--- a/code/datums/diseases/anxiety.dm
+++ /dev/null
@@ -1,42 +0,0 @@
-/datum/disease/anxiety
- name = "Severe Anxiety"
- form = "Infection"
- max_stages = 4
- spread_text = "On contact"
- spread_flags = CONTACT_GENERAL
- cure_text = "Ethanol"
- cures = list("ethanol")
- agent = "Excess Lepidopticides"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey)
- desc = "If left untreated subject will regurgitate butterflies."
- severity = MEDIUM
- possible_mutations = list(/datum/disease/beesease)
-
-/datum/disease/anxiety/stage_act()
- ..()
- switch(stage)
- if(2) //also changes say, see say.dm
- if(prob(5))
- to_chat(affected_mob, "You feel anxious.")
- if(3)
- if(prob(10))
- to_chat(affected_mob, "Your stomach flutters.")
- if(prob(5))
- to_chat(affected_mob, "You feel panicky.")
- if(prob(2))
- to_chat(affected_mob, "You're overtaken with panic!")
- affected_mob.AdjustConfused(rand(4 SECONDS, 6 SECONDS))
- if(4)
- if(prob(10))
- to_chat(affected_mob, "You feel butterflies in your stomach.")
- if(prob(5))
- affected_mob.visible_message("[affected_mob] stumbles around in a panic.", \
- "You have a panic attack!")
- affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS))
- affected_mob.AdjustJitter(rand(12 SECONDS, 16 SECONDS))
- if(prob(2))
- affected_mob.visible_message("[affected_mob] coughs up butterflies!", \
- "You cough up butterflies!")
- new /mob/living/simple_animal/butterfly(affected_mob.loc)
- new /mob/living/simple_animal/butterfly(affected_mob.loc)
- return
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index bdbb0fe4455..4fa7169b8fd 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -1,35 +1,150 @@
/datum/disease/appendicitis
form = "Condition"
name = "Appendicitis"
- max_stages = 3
- cure_text = "Surgery"
agent = "Shitty Appendix"
- viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 1
desc = "If left untreated the subject will become very weak, and may vomit often."
- severity = "Dangerous!"
- disease_flags = CAN_CARRY|CAN_RESIST
- spread_flags = NON_CONTAGIOUS
+ cure_text = "Surgery"
+ stage_prob = 2
+ severity = DANGEROUS
+ curable = FALSE
+ can_immunity = FALSE
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/internal/appendix)
- bypasses_immunity = TRUE
+ ignore_immunity = TRUE
virus_heal_resistant = TRUE
+ var/ruptured = FALSE
/datum/disease/appendicitis/stage_act()
- ..()
+ if(!..())
+ return FALSE
+
+ var/mob/living/carbon/human/H = affected_mob
+ if(!istype(H))
+ return
+
+ var/obj/item/organ/internal/appendix/A = H.get_int_organ(/obj/item/organ/internal/appendix)
+ if(!istype(A))
+ cure()
+ return
+
+ if(!A.inflamed)
+ A.inflamed = TRUE
+ A.update_icon()
+
+ if(!ruptured && (A.germ_level >= INFECTION_LEVEL_THREE || A.status & ORGAN_DEAD))
+ rupture(H, A)
+
switch(stage)
- if(1)
- if(prob(5))
- affected_mob.emote("cough")
if(2)
- var/obj/item/organ/internal/appendix/A = affected_mob.get_int_organ(/obj/item/organ/internal/appendix)
- if(A)
- A.inflamed = 1
- A.update_icon()
- if(prob(3))
- to_chat(affected_mob, "You feel a stabbing pain in your abdomen!")
- affected_mob.Stun(rand(4 SECONDS, 6 SECONDS))
- affected_mob.adjustToxLoss(1)
+ if(A.germ_level < INFECTION_LEVEL_ONE)
+ A.germ_level = INFECTION_LEVEL_ONE
+ A.germ_level += rand(1, 4) * H.dna.species.germs_growth_rate
+
+ if(prob(2))
+ H.vomit()
+
+ if(prob(5))
+ A.receive_damage(1, silent = prob(65))
+
if(3)
- if(prob(1))
- affected_mob.vomit(95)
+ if(A.germ_level < INFECTION_LEVEL_ONE)
+ A.germ_level = INFECTION_LEVEL_ONE
+ A.germ_level += rand(2, 6) * H.dna.species.germs_growth_rate
+
+ if(prob(10))
+ A.receive_damage(1, silent = prob(45))
+
+ if(prob(3))
+ H.vomit()
+
+ if(prob(10))
+ H.emote("moan")
+
+ if(prob(5))
+ to_chat(H, span_warning("You feel a stabbing pain in your abdomen!"))
+ H.Stun(rand(2 SECONDS, 4 SECONDS))
+ H.Slowed(10 SECONDS, 5)
+ H.adjustToxLoss(1)
+
+ if(4)
+
+ if(A.germ_level < INFECTION_LEVEL_TWO)
+ A.germ_level = INFECTION_LEVEL_TWO
+ A.germ_level += rand(4, 10) * H.dna.species.germs_growth_rate
+
+ if(prob(10))
+ A.receive_damage(2, silent = 0)
+
+ if(prob(3))
+ H.vomit()
+
+ if(prob(15))
+ H.emote(pick("moan", "cry"))
+
+ if(prob(7))
+ to_chat(H, span_danger("You feel a stabbing pain in your abdomen!"))
+ H.Stun(rand(2 SECONDS, 4 SECONDS))
+ H.Slowed(15 SECONDS, 5)
+ H.adjustToxLoss(3)
+
+ if(5)
+ if(A.germ_level < INFECTION_LEVEL_TWO)
+ A.germ_level = INFECTION_LEVEL_TWO
+ A.germ_level += rand(6, 12) * H.dna.species.germs_growth_rate
+
+ H.adjustToxLoss(0.5)
+ if(H.IsSlowed())
+ H.AdjustSlowedDuration(30 SECONDS, bound_upper = 40 SECONDS)
+ else
+ H.Slowed(30 SECONDS, 5)
+
+ H.damageoverlaytemp = 30
+
+ if(prob(20))
+ A.receive_damage(3, silent = 0)
+
+ if(prob(5))
+ H.vomit()
+
+ if(prob(10))
+ H.emote(pick("moan", "cry"))
+
+ if(prob(8))
+ to_chat(H, span_danger("You feel a stabbing pain in your abdomen!"))
+ H.Stun(rand(2 SECONDS, 4 SECONDS))
+ H.Jitter(10 SECONDS)
+
+
+/datum/disease/appendicitis/proc/rupture(mob/living/carbon/human/H, obj/item/organ/internal/appendix/A)
+ ruptured = TRUE
+ A.necrotize()
+ stage = 5
+
+ var/obj/item/organ/external/parent = H.get_organ(check_zone(A.parent_organ))
+ if(istype(parent))
+ parent.receive_damage(25, used_weapon = "appendix rupture")
+ if(parent.germ_level < INFECTION_LEVEL_TWO)
+ parent.germ_level = INFECTION_LEVEL_TWO
+ for(var/obj/item/organ/internal/O in parent.internal_organs)
+ if(O.germ_level < INFECTION_LEVEL_TWO)
+ O.germ_level = INFECTION_LEVEL_TWO
+ O.receive_damage(10)
+
+ to_chat(H, span_userdanger("You feel a hellish pain in your abdomen, as if something is torn!"))
+ H.Stun(20 SECONDS)
+ H.emote("scream")
+ addtimer(CALLBACK(src, PROC_REF(fall), H, A), 10 SECONDS)
+
+/datum/disease/appendicitis/proc/fall(mob/living/carbon/human/H, obj/item/organ/internal/appendix/A)
+ to_chat(H, span_danger("You feel weakening..."))
+ H.Weaken(10 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(exhausted), H, A), 10 SECONDS)
+
+/datum/disease/appendicitis/proc/exhausted(mob/living/carbon/human/H, obj/item/organ/internal/appendix/A)
+ to_chat(H, span_danger("You feel weakening... Need to sleep"))
+ H.SetSleeping(40 SECONDS)
+ H.Slowed(200 SECONDS, 10)
+
+
+
+
diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm
deleted file mode 100644
index ff9a2408640..00000000000
--- a/code/datums/diseases/beesease.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/datum/disease/beesease
- name = "Beesease"
- form = "Infection"
- max_stages = 4
- spread_text = "On contact"
- spread_flags = CONTACT_GENERAL
- cure_text = "Sugar"
- cures = list("sugar")
- agent = "Apidae Infection"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey)
- desc = "If left untreated subject will regurgitate bees."
- severity = DANGEROUS
- possible_mutations = list(/datum/disease/lycan)
-
-/datum/disease/beesease/stage_act()
- ..()
- switch(stage)
- if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey
- if(prob(2))
- to_chat(affected_mob, "You taste honey in your mouth.")
- if(3)
- if(prob(10))
- to_chat(affected_mob, "Your stomach rumbles.")
- if(prob(2))
- to_chat(affected_mob, "Your stomach stings painfully.")
- if(prob(20))
- affected_mob.adjustToxLoss(2)
- if(4)
- if(prob(10))
- affected_mob.visible_message("[affected_mob] buzzes.", \
- "Your stomach buzzes violently!")
- if(prob(5))
- to_chat(affected_mob, "You feel something moving in your throat.")
- if(prob(1))
- affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \
- "You cough up a swarm of bees!")
- new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc)
- //if(5)
- //Plus if you die, you explode into bees
- return
diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm
index 81b3ca8cb72..ef2681690b7 100644
--- a/code/datums/diseases/berserker.dm
+++ b/code/datums/diseases/berserker.dm
@@ -1,21 +1,20 @@
/datum/disease/berserker
name = "Berserker"
+ desc = "Swearing, shouting, attacking nearby crew members uncontrollably."
+ agent = "Jagged Crystals"
+ cure_text = "Anti-Psychotics"
max_stages = 2
stage_prob = 5
- spread_text = "Non-Contagious"
- spread_flags = SPECIAL
- 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."
+ cure_prob = 10
severity = DANGEROUS
- disease_flags = CURABLE
- spread_flags = NON_CONTAGIOUS
+ can_immunity = FALSE
+ visibility_flags = HIDDEN_PANDEMIC
/datum/disease/berserker/stage_act()
- ..()
+ if(!..())
+ return FALSE
+
if(affected_mob.reagents.has_reagent("thc"))
to_chat(affected_mob, "You mellow out.")
cure()
diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm
deleted file mode 100644
index 167ab190a08..00000000000
--- a/code/datums/diseases/brainrot.dm
+++ /dev/null
@@ -1,58 +0,0 @@
-/datum/disease/brainrot
- name = "Brainrot"
- max_stages = 4
- spread_text = "On contact"
- spread_flags = CONTACT_GENERAL
- cure_text = "Mannitol"
- cures = list("mannitol")
- agent = "Cryptococcus Cosmosis"
- viable_mobtypes = list(/mob/living/carbon/human)
- cure_chance = 15//higher chance to cure, since two reagents are required
- desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
- required_organs = list(/obj/item/organ/internal/brain)
- severity = DANGEROUS
- mutation_reagents = list("mutagen", "neurotoxin2")
- possible_mutations = list(/datum/disease/kuru, /datum/disease/advance/preset/mind_restoration/, /datum/disease/transformation/jungle_fever)
-
-/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
- ..()
-
- switch(stage)
- if(2)
- if(prob(2))
- affected_mob.emote("blink")
- if(prob(2))
- affected_mob.emote("yawn")
- if(prob(2))
- to_chat(affected_mob, "You don't feel like yourself.")
- if(prob(5))
- affected_mob.adjustBrainLoss(1)
- if(3)
- if(prob(2))
- affected_mob.emote("stare")
- if(prob(2))
- affected_mob.emote("drool")
- if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't brainpain you to death now
- affected_mob.adjustBrainLoss(2)
- if(prob(2))
- to_chat(affected_mob, "Your try to remember something important...but can't.")
-
- if(4)
- if(prob(2))
- affected_mob.emote("stare")
- if(prob(2))
- affected_mob.emote("drool")
- if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't brainpain you to death now
- affected_mob.adjustBrainLoss(3)
- if(prob(2))
- to_chat(affected_mob, "Strange buzzing fills your head, removing all thoughts.")
- if(prob(3))
- to_chat(affected_mob, "You lose consciousness...")
- affected_mob.visible_message("[affected_mob] suddenly collapses")
- affected_mob.Paralyse(rand(10 SECONDS, 20 SECONDS))
- if(prob(1))
- affected_mob.emote("snore")
- if(prob(15))
- affected_mob.AdjustStuttering(6 SECONDS)
-
- return
diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm
deleted file mode 100644
index 6b05014cc6e..00000000000
--- a/code/datums/diseases/cold.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-/datum/disease/cold
- name = "The Cold"
- max_stages = 3
- spread_flags = AIRBORNE
- cure_text = "Rest & Spaceacillin"
- cures = list("spaceacillin")
- agent = "XY-rhinovirus"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey)
- permeability_mod = 0.5
- desc = "If left untreated the subject will contract the flu."
- severity = MINOR
-
-/datum/disease/cold/stage_act()
- ..()
- switch(stage)
- if(2)
-/*
- if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed
- to_chat(affected_mob, "You feel better.")
- cure()
- return
-*/
- if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(1) && prob(5))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(1))
- affected_mob.emote("sneeze")
- if(prob(1))
- affected_mob.emote("cough")
- if(prob(1))
- to_chat(affected_mob, "Your throat feels sore.")
- if(prob(1))
- to_chat(affected_mob, "Mucous runs down the back of your throat.")
- if(3)
-/*
- if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed
- to_chat(affected_mob, "You feel better.")
- cure()
- return
-*/
- if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(1) && prob(1))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(1))
- affected_mob.emote("sneeze")
- if(prob(1))
- affected_mob.emote("cough")
- if(prob(1))
- to_chat(affected_mob, "Your throat feels sore.")
- if(prob(1))
- to_chat(affected_mob, "Mucous runs down the back of your throat.")
- if(prob(1) && prob(50))
- if(!affected_mob.resistances.Find(/datum/disease/flu))
- var/datum/disease/Flu = new /datum/disease/flu
- affected_mob.ContractDisease(Flu)
- cure()
diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm
deleted file mode 100644
index 60af82e6939..00000000000
--- a/code/datums/diseases/cold9.dm
+++ /dev/null
@@ -1,39 +0,0 @@
-/datum/disease/cold9
- name = "The Cold"
- max_stages = 3
- spread_text = "On contact"
- spread_flags = CONTACT_GENERAL
- cure_text = "Common Cold Anti-bodies & 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 = MEDIUM
-
-/datum/disease/cold9/stage_act()
- ..()
- switch(stage)
- if(2)
- affected_mob.bodytemperature -= 10
- if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(1))
- affected_mob.emote("sneeze")
- if(prob(1))
- affected_mob.emote("cough")
- if(prob(1))
- to_chat(affected_mob, "Your throat feels sore.")
- if(prob(5))
- to_chat(affected_mob, "You feel stiff.")
- if(3)
- affected_mob.bodytemperature -= 20
- if(prob(1))
- affected_mob.emote("sneeze")
- if(prob(1))
- affected_mob.emote("cough")
- if(prob(1))
- to_chat(affected_mob, "Your throat feels sore.")
- if(prob(10))
- to_chat(affected_mob, "You feel stiff.")
diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm
index b9503cbad77..74831e95cc8 100644
--- a/code/datums/diseases/critical.dm
+++ b/code/datums/diseases/critical.dm
@@ -1,6 +1,14 @@
/datum/disease/critical
+ visibility_flags = HIDDEN_PANDEMIC
+ can_immunity = FALSE
+ ignore_immunity = TRUE
+ virus_heal_resistant = TRUE
+ severity = DANGEROUS
/datum/disease/critical/stage_act() //overriden to ensure unique behavior
+ if(affected_mob?.stat == DEAD)
+ return FALSE
+
stage = min(stage, max_stages)
if(prob(stage_prob))
@@ -14,88 +22,74 @@
/datum/disease/critical/has_cure()
for(var/C_id in cures)
if(affected_mob.reagents.has_reagent(C_id))
- if(prob(cure_chance))
+ if(prob(cure_prob))
return TRUE
return FALSE
/datum/disease/critical/shock
name = "Shock"
form = "Medical Emergency"
- spread_text = "The patient is in shock"
+ additional_info = "The patient is in shock"
max_stages = 3
- spread_flags = SPECIAL
- cure_text = "Saline-Glucose Solution"
- cures = list("salglu_solution")
- cure_chance = 10
- viable_mobtypes = list(/mob/living/carbon/human)
stage_prob = 6
- severity = DANGEROUS
- disease_flags = CURABLE
- bypasses_immunity = TRUE
- virus_heal_resistant = TRUE
+ cures = list("salglu_solution")
+ cure_prob = 10
/datum/disease/critical/shock/stage_act()
if(..())
if(affected_mob.health >= 25 && affected_mob.nutrition >= NUTRITION_LEVEL_HYPOGLYCEMIA)
- to_chat(affected_mob, "You feel better.")
+ to_chat(affected_mob, span_notice("You feel better."))
cure()
return
switch(stage)
if(1)
if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
+ to_chat(affected_mob, span_notice("You feel better."))
cure()
return
if(prob(8))
affected_mob.emote(pick("shiver", "pale", "moan"))
if(prob(5))
- to_chat(affected_mob, "You feel weak!")
+ to_chat(affected_mob, span_danger("You feel weak!"))
if(2)
if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
+ to_chat(affected_mob, span_notice("You feel better."))
cure()
return
if(prob(8))
affected_mob.emote(pick("shiver", "pale", "moan", "shudder", "tremble"))
if(prob(5))
- to_chat(affected_mob, "You feel absolutely terrible!")
+ to_chat(affected_mob, span_danger("You feel absolutely terrible!"))
if(prob(5))
affected_mob.emote("faint", "collapse", "groan")
if(3)
if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
+ to_chat(affected_mob, span_notice("You feel better."))
cure()
return
if(prob(8))
affected_mob.emote(pick("shudder", "pale", "tremble", "groan", "bshake"))
if(prob(5))
- to_chat(affected_mob, "You feel horrible!")
+ to_chat(affected_mob, span_danger("You feel horrible!"))
if(prob(5))
affected_mob.emote(pick("faint", "collapse", "groan"))
if(prob(7))
- to_chat(affected_mob, "You can't breathe!")
+ to_chat(affected_mob, span_danger("You can't breathe!"))
affected_mob.AdjustLoseBreath(2 SECONDS)
if(prob(5))
var/datum/disease/D = new /datum/disease/critical/heart_failure
- affected_mob.ForceContractDisease(D)
+ D.Contract(affected_mob)
/datum/disease/critical/heart_failure
name = "Cardiac Failure"
form = "Medical Emergency"
- spread_text = "The patient is having a cardiac emergency"
+ additional_info = "The patient is having a cardiac emergency"
max_stages = 3
- spread_flags = SPECIAL
- cure_text = "Atropine, Epinephrine, or Heparin"
+ stage_prob = 5
cures = list("atropine", "epinephrine", "heparin")
- cure_chance = 10
+ cure_prob = 10
needs_all_cures = FALSE
- viable_mobtypes = list(/mob/living/carbon/human)
- stage_prob = 5
- severity = DANGEROUS
- disease_flags = CURABLE
required_organs = list(/obj/item/organ/internal/heart)
- bypasses_immunity = TRUE
- virus_heal_resistant = TRUE
/datum/disease/critical/heart_failure/has_cure()
if(affected_mob.has_status_effect(STATUS_EFFECT_EXERCISED))
@@ -108,27 +102,27 @@
switch(stage)
if(1)
if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
+ to_chat(affected_mob, span_notice("You feel better."))
cure()
return
if(prob(8))
affected_mob.emote(pick("pale", "shudder"))
if(prob(5))
- to_chat(affected_mob, "Your arm hurts!")
+ to_chat(affected_mob, span_danger("Your arm hurts!"))
else if(prob(5))
- to_chat(affected_mob, "Your chest hurts!")
+ to_chat(affected_mob, span_danger("Your chest hurts!"))
if(2)
if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
+ to_chat(affected_mob, span_notice("You feel better."))
cure()
return
if(prob(8))
affected_mob.emote(pick("pale", "groan"))
if(prob(5))
- to_chat(affected_mob, "Your heart lurches in your chest!")
+ to_chat(affected_mob, span_danger("Your heart lurches in your chest!"))
affected_mob.AdjustLoseBreath(2 SECONDS)
if(prob(3))
- to_chat(affected_mob, "Your heart stops beating!")
+ to_chat(affected_mob, span_danger("Your heart stops beating!"))
affected_mob.AdjustLoseBreath(6 SECONDS)
if(prob(5))
affected_mob.emote(pick("faint", "collapse", "groan"))
@@ -143,16 +137,10 @@
/datum/disease/critical/hypoglycemia
name = "Hypoglycemia"
form = "Medical Emergency"
+ additional_info = "The patient has low blood sugar."
max_stages = 3
- spread_flags = SPECIAL
- spread_text = "The patient has low blood sugar."
- cure_text = "Eating or administration of vitamins or nutrients"
- viable_mobtypes = list(/mob/living/carbon/human)
stage_prob = 1
- severity = DANGEROUS
- disease_flags = CURABLE
- bypasses_immunity = TRUE
- virus_heal_resistant = TRUE
+ cure_text = "Eating or administration of vitamins or nutrients"
/datum/disease/critical/hypoglycemia/has_cure()
if(ishuman(affected_mob))
@@ -168,37 +156,37 @@
if(isLivingSSD(affected_mob)) // We don't want AFK people dying from this.
return
if(affected_mob.nutrition > NUTRITION_LEVEL_HYPOGLYCEMIA)
- to_chat(affected_mob, "You feel a lot better!")
+ to_chat(affected_mob, span_notice("You feel a lot better!"))
cure()
return
switch(stage)
if(1)
if(prob(4))
- to_chat(affected_mob, "You feel hungry!")
+ to_chat(affected_mob, span_warning("You feel hungry!"))
if(prob(2))
- to_chat(affected_mob, "You have a headache!")
+ to_chat(affected_mob, span_warning("You have a headache!"))
if(prob(2))
- to_chat(affected_mob, "You feel [pick("anxious", "depressed")]!")
+ to_chat(affected_mob, span_warning("You feel [pick("anxious", "depressed")]!"))
if(2)
if(prob(4))
- to_chat(affected_mob, "You feel like everything is wrong with your life!")
+ to_chat(affected_mob, span_warning("You feel like everything is wrong with your life!"))
if(prob(5))
affected_mob.Slowed(rand(8 SECONDS, 32 SECONDS))
- to_chat(affected_mob, "You feel [pick("tired", "exhausted", "sluggish")].")
+ to_chat(affected_mob, span_warning("You feel [pick("tired", "exhausted", "sluggish")]."))
if(prob(5))
affected_mob.Weaken(12 SECONDS)
affected_mob.Stuttering(20 SECONDS)
- to_chat(affected_mob, "You feel [pick("numb", "confused", "dizzy", "lightheaded")].")
+ to_chat(affected_mob, span_warning("You feel [pick("numb", "confused", "dizzy", "lightheaded")]."))
affected_mob.emote("collapse")
if(3)
if(prob(1))
var/datum/disease/D = new /datum/disease/critical/shock
- affected_mob.ForceContractDisease(D)
+ D.Contract(affected_mob)
if(prob(12))
affected_mob.Weaken(12 SECONDS)
affected_mob.Stuttering(20 SECONDS)
- to_chat(affected_mob, "You feel [pick("numb", "confused", "dizzy", "lightheaded")].")
+ to_chat(affected_mob, span_warning("You feel [pick("numb", "confused", "dizzy", "lightheaded")]."))
affected_mob.emote("collapse")
if(prob(12))
- to_chat(affected_mob, "You feel [pick("tired", "exhausted", "sluggish")].")
+ to_chat(affected_mob, span_warning("You feel [pick("tired", "exhausted", "sluggish")]."))
affected_mob.Slowed(rand(8 SECONDS, 32 SECONDS))
diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm
deleted file mode 100644
index 699fc2d2567..00000000000
--- a/code/datums/diseases/fake_gbs.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/datum/disease/fake_gbs
- name = "GBS"
- max_stages = 5
- spread_text = "On contact"
- spread_flags = 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/lesser/monkey)
- desc = "If left untreated death will occur."
- severity = BIOHAZARD
-
-/datum/disease/fake_gbs/stage_act()
- ..()
- switch(stage)
- if(2)
- if(prob(1))
- affected_mob.emote("sneeze")
- if(3)
- if(prob(5))
- affected_mob.emote("cough")
- else if(prob(5))
- affected_mob.emote("gasp")
- if(prob(10))
- to_chat(affected_mob, "You're starting to feel very weak...")
- if(4)
- if(prob(10))
- affected_mob.emote("cough")
-
- if(5)
- if(prob(10))
- affected_mob.emote("cough")
diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm
deleted file mode 100644
index e9feee5094c..00000000000
--- a/code/datums/diseases/flu.dm
+++ /dev/null
@@ -1,52 +0,0 @@
-/datum/disease/flu
- name = "The Flu"
- max_stages = 3
- spread_text = "Airborne"
- cure_text = "Spaceacillin"
- cures = list("spaceacillin")
- cure_chance = 10
- agent = "H13N1 flu virion"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey)
- permeability_mod = 0.75
- desc = "If left untreated the subject will feel quite unwell."
- severity = MEDIUM
-
-/datum/disease/flu/stage_act()
- ..()
- switch(stage)
- if(2)
- if(affected_mob.lying && prob(20))
- to_chat(affected_mob, "You feel better.")
- stage--
- return
- if(prob(1))
- affected_mob.emote("sneeze")
- if(prob(1))
- affected_mob.emote("cough")
- if(prob(1))
- to_chat(affected_mob, "Your muscles ache.")
- if(prob(20))
- affected_mob.take_organ_damage(1)
- if(prob(1))
- to_chat(affected_mob, "Your stomach hurts.")
- if(prob(20))
- affected_mob.adjustToxLoss(1)
-
- if(3)
- if(affected_mob.lying && prob(15))
- to_chat(affected_mob, "You feel better.")
- stage--
- return
- if(prob(1))
- affected_mob.emote("sneeze")
- if(prob(1))
- affected_mob.emote("cough")
- if(prob(1))
- to_chat(affected_mob, "Your muscles ache.")
- if(prob(20))
- affected_mob.take_organ_damage(1)
- if(prob(1))
- to_chat(affected_mob, "Your stomach hurts.")
- if(prob(20))
- affected_mob.adjustToxLoss(1)
- return
diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm
index dfa58264b97..334279bb5e7 100644
--- a/code/datums/diseases/food_poisoning.dm
+++ b/code/datums/diseases/food_poisoning.dm
@@ -1,72 +1,62 @@
/datum/disease/food_poisoning
name = "Food Poisoning"
+ agent = "Salmonella"
+ desc = "Nausea, sickness, and vomitting."
max_stages = 3
stage_prob = 5
- spread_text = "Non-Contagious"
- spread_flags = SPECIAL
- cure_text = "Sleep"
- agent = "Salmonella"
+ cure_text = "Proper diet & sleep"
cures = list("chicken_soup")
- cure_chance = 10
- viable_mobtypes = list(/mob/living/carbon/human)
- desc = "Nausea, sickness, and vomitting."
+ cure_prob = 100 //override in has_cure()
severity = MINOR
- disease_flags = CURABLE
- spread_flags = NON_CONTAGIOUS
+ can_immunity = FALSE
+ ignore_immunity = TRUE
virus_heal_resistant = TRUE
- possible_mutations = list(/datum/disease/tuberculosis)
+ visibility_flags = HIDDEN_PANDEMIC
+ possible_mutations = list(/datum/disease/virus/tuberculosis)
/datum/disease/food_poisoning/stage_act()
- ..()
- if(affected_mob.IsSleeping() && prob(33))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
+ if(!..())
+ return FALSE
+
switch(stage)
if(1)
if(prob(5))
- to_chat(affected_mob, "Your stomach feels weird.")
+ to_chat(affected_mob, span_danger("Your stomach feels weird."))
if(prob(5))
- to_chat(affected_mob, "You feel queasy.")
+ to_chat(affected_mob, span_danger("You feel queasy."))
if(2)
- if(affected_mob.IsSleeping() && prob(40))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
if(prob(10))
affected_mob.emote("groan")
if(prob(5))
- to_chat(affected_mob, "Your stomach aches.")
+ to_chat(affected_mob, span_danger("Your stomach aches."))
if(prob(5))
- to_chat(affected_mob, "You feel nauseous.")
+ to_chat(affected_mob, span_danger("You feel nauseous."))
if(3)
- if(affected_mob.IsSleeping() && prob(25))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(1) && prob(10))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
if(prob(10))
affected_mob.emote("moan")
if(prob(10))
affected_mob.emote("groan")
if(prob(1))
- to_chat(affected_mob, "Your stomach hurts.")
+ to_chat(affected_mob, span_danger("Your stomach hurts."))
if(prob(1))
- to_chat(affected_mob, "You feel sick.")
+ to_chat(affected_mob, span_danger("You feel sick."))
if(prob(5))
if(affected_mob.nutrition > 10)
- affected_mob.visible_message("[affected_mob] vomits on the floor profusely!")
+ affected_mob.visible_message(span_danger("[affected_mob] vomits on the floor profusely!"))
affected_mob.fakevomit(no_text = 1)
affected_mob.adjust_nutrition(-rand(3,5))
else
- to_chat(affected_mob, "Your stomach lurches painfully!")
- affected_mob.visible_message("[affected_mob] gags and retches!")
+ to_chat(affected_mob, span_danger("Your stomach lurches painfully!"))
+ affected_mob.visible_message(span_danger("[affected_mob] gags and retches!"))
affected_mob.Stun(rand(4 SECONDS, 8 SECONDS))
affected_mob.Weaken(rand(4 SECONDS, 8 SECONDS))
+
+/datum/disease/food_poisoning/has_cure()
+ if(..())
+ if(affected_mob.IsSleeping())
+ return prob(80 - 15 * stage)
+ return prob(8)
+ else
+ if(affected_mob.IsSleeping())
+ return prob(30 - 7.5 * stage)
+ return prob(1) && prob(50)
diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm
deleted file mode 100644
index 19d4c287427..00000000000
--- a/code/datums/diseases/gbs.dm
+++ /dev/null
@@ -1,51 +0,0 @@
-/datum/disease/gbs
- name = "GBS"
- max_stages = 5
- spread_text = "On contact"
- spread_flags = 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)
- disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
- permeability_mod = 1
- severity = BIOHAZARD
-
-/datum/disease/gbs/stage_act()
- ..()
- switch(stage)
- if(2)
- if(prob(45))
- affected_mob.adjustToxLoss(5)
- if(prob(1))
- affected_mob.emote("sneeze")
- if(3)
- if(prob(5))
- affected_mob.emote("cough")
- else if(prob(5))
- affected_mob.emote("gasp")
- if(prob(10))
- to_chat(affected_mob, "You're starting to feel very weak...")
- if(4)
- if(prob(10))
- affected_mob.emote("cough")
- affected_mob.adjustToxLoss(5)
- if(5)
- to_chat(affected_mob, "Your body feels as if it's trying to rip itself open...")
- if(prob(50))
- affected_mob.delayed_gib()
- else
- return
-
-/datum/disease/gbs/curable
- name = "Non-Contagious GBS"
- stage_prob = 5
- spread_text = "Non-Contagious"
- spread_flags = SPECIAL
- cure_text = "Cryoxadone"
- cures = list("cryoxadone")
- cure_chance = 10
- agent = "gibbis"
- spread_flags = NON_CONTAGIOUS
- disease_flags = CURABLE
diff --git a/code/datums/diseases/kingstons.dm b/code/datums/diseases/kingstons.dm
deleted file mode 100644
index 34a2951a546..00000000000
--- a/code/datums/diseases/kingstons.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-/datum/disease/kingstons
- name = "Kingstons Syndrome"
- max_stages = 4
- spread_text = "Airborne"
- cure_text = "Milk"
- cures = list("milk")
- cure_chance = 50
- agent = "Nya Virus"
- 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 = DANGEROUS
- mutation_reagents = list("mutagen", "radium")
- possible_mutations = list(/datum/disease/kingstons_advanced)
-
-/datum/disease/kingstons/stage_act()
- ..()
- switch(stage)
- if(1)
- if(prob(10))
- if(istajaran(affected_mob))
- to_chat(affected_mob, "You feel good.")
- else
- to_chat(affected_mob, "You feel like playing with string.")
- if(2)
- if(prob(10))
- if(istajaran(affected_mob))
- to_chat(affected_mob, "Something in your throat itches.")
- else
- to_chat(affected_mob, "You NEED to find a mouse.")
- if(3)
- if(prob(10))
- if(istajaran(affected_mob))
- to_chat(affected_mob, "You feel something in your throat!")
- affected_mob.emote("cough")
- else
- affected_mob.say(pick(list("Mew", "Meow!", "Nya!~")))
- if(4)
- if(prob(5))
- if(istajaran(affected_mob))
- affected_mob.visible_message("[affected_mob] coughs up a hairball!", \
- "You cough up a hairball!")
- affected_mob.Stun(10 SECONDS)
- else
- affected_mob.visible_message("[affected_mob]'s form contorts into something more feline!", \
- "YOU TURN INTO A TAJARAN!")
- var/mob/living/carbon/human/catface = affected_mob
- catface.set_species(/datum/species/tajaran, retain_damage = TRUE)
-
-
-/datum/disease/kingstons_advanced //this used to be directly a subtype of kingstons, which sounds nice, but it ment that it would *turn you into a tarjaran always and have normal kingstons stage act* Don't make virusus subtypes unless the base virus does nothing.
- name = "Advanced Kingstons Syndrome"
- max_stages = 4
- spread_text = "Airborne"
- cure_text = "Plasma"
- cures = list("plasma")
- cure_chance = 50
- agent = "AMB45DR Bacteria"
- 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
- var/list/virspecies = list(/datum/species/human, /datum/species/tajaran, /datum/species/unathi,/datum/species/skrell, /datum/species/vulpkanin, /datum/species/diona) //no karma races sorrys.
- var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay")
- var/datum/species/chosentype
- var/chosensuff
- possible_mutations = null
-
-/datum/disease/kingstons_advanced/New()
- chosentype = pick(virspecies)
- chosensuff = pick(virsuffix)
-
- name = "[initial(chosentype.name)] [chosensuff]"
-
-/datum/disease/kingstons_advanced/stage_act()
- ..()
- if(ishuman(affected_mob))
- var/mob/living/carbon/human/twisted = affected_mob
- switch(stage)
- if(1)
- if(prob(10))
- to_chat(twisted, "You feel awkward.")
- if(2)
- if(prob(10))
- to_chat(twisted, "You itch.")
- if(3)
- if(prob(10))
- to_chat(twisted, "Your skin starts to flake!")
-
- if(4)
- if(prob(5))
- if(!istype(twisted.dna.species, chosentype))
- twisted.visible_message("[twisted]'s skin splits and form contorts!", \
- "Your body mutates into a [initial(chosentype.name)]!")
- twisted.set_species(chosentype, retain_damage = TRUE)
- else
- twisted.visible_message("[twisted] scratches at thier skin!", \
- "You scratch your skin to try not to itch!")
- twisted.adjustBruteLoss(-5)
- twisted.adjustStaminaLoss(5)
diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm
index 3091e2bc12e..ed4c4bce1ab 100644
--- a/code/datums/diseases/kuru.dm
+++ b/code/datums/diseases/kuru.dm
@@ -1,22 +1,20 @@
/datum/disease/kuru
- form = "Disease"
name = "Space Kuru"
- max_stages = 4
- stage_prob = 5
- spread_text = "Non-Contagious"
- spread_flags = SPECIAL
- cure_text = "Incurable"
agent = "Prions"
- viable_mobtypes = list(/mob/living/carbon/human)
desc = "Uncontrollable laughing."
+ max_stages = 4
+ stage_prob = 5
severity = BIOHAZARD
- spread_flags = NON_CONTAGIOUS
- disease_flags = CAN_CARRY
- bypasses_immunity = TRUE //Kuru is a prion disorder, not a virus
+ visibility_flags = HIDDEN_PANDEMIC
+ curable = FALSE
+ can_immunity = FALSE
+ ignore_immunity = TRUE //Kuru is a prion disorder, not a virus
virus_heal_resistant = TRUE
/datum/disease/kuru/stage_act()
- ..()
+ if(!..())
+ return FALSE
+
switch(stage)
if(1)
if(prob(50))
@@ -25,22 +23,22 @@
affected_mob.Jitter(50 SECONDS)
if(2)
if(prob(50))
- affected_mob.visible_message("[affected_mob] laughs uncontrollably!")
+ affected_mob.visible_message(span_danger("[affected_mob] laughs uncontrollably!"))
affected_mob.Weaken(20 SECONDS)
affected_mob.Jitter(500 SECONDS)
if(3)
if(prob(25))
- to_chat(affected_mob, "You feel like you are about to drop dead!")
- to_chat(affected_mob, "Your body convulses painfully!")
+ to_chat(affected_mob, span_danger("You feel like you are about to drop dead!"))
+ to_chat(affected_mob, span_danger("Your body convulses painfully!"))
affected_mob.adjustBruteLoss(5)
affected_mob.adjustOxyLoss(5)
affected_mob.Weaken(20 SECONDS)
affected_mob.Jitter(500 SECONDS)
- affected_mob.visible_message("[affected_mob] laughs uncontrollably!")
+ affected_mob.visible_message(span_danger("[affected_mob] laughs uncontrollably!"))
if(4)
if(prob(25))
- to_chat(affected_mob, "You feel like you are going to die!")
+ to_chat(affected_mob, span_danger("You feel like you are going to die!"))
affected_mob.adjustOxyLoss(75)
affected_mob.adjustBruteLoss(75)
affected_mob.Weaken(20 SECONDS)
- affected_mob.visible_message("[affected_mob] laughs uncontrollably!")
+ affected_mob.visible_message(span_danger("[affected_mob] laughs uncontrollably!"))
diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm
deleted file mode 100644
index ebd649adc0d..00000000000
--- a/code/datums/diseases/lycancoughy.dm
+++ /dev/null
@@ -1,54 +0,0 @@
-/datum/disease/lycan
- name = "Lycancoughy"
- form = "Infection"
- max_stages = 4
- spread_text = "On contact"
- spread_flags = CONTACT_GENERAL
- cure_text = "Ethanol"
- cures = list("ethanol")
- agent = "Excess Snuggles"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey)
- desc = "If left untreated subject will regurgitate... puppies."
- severity = MEDIUM
- var/barklimit = 0
-
-/datum/disease/lycan/stage_act()
- ..()
- switch(stage)
- if(2) //also changes say, see say.dm
- if(prob(5))
- to_chat(affected_mob, "You itch.")
- affected_mob.emote("cough")
- if(3)
- if(prob(10))
- to_chat(affected_mob, "You hear faint barking.")
- if(prob(5))
- to_chat(affected_mob, "You crave meat.")
- affected_mob.emote("cough")
- if(prob(2))
- to_chat(affected_mob, "Your stomach growls!")
- if(4)
- if(prob(10))
- to_chat(affected_mob, "Your stomach barks?!")
- if(prob(5))
- affected_mob.visible_message("[affected_mob] howls!", \
- "You howl!")
- affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS))
- if(prob(3) && barklimit <= 10)
- var/list/puppytype = list(/mob/living/simple_animal/pet/dog/corgi/puppy, /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/pet/dog/fox)
- var/mob/living/puppypicked = pick(puppytype)
- affected_mob.visible_message("[affected_mob] coughs up [initial(puppypicked.name)]!", \
- "You cough up [initial(puppypicked.name)]?!")
- new puppypicked(affected_mob.loc)
- new puppypicked(affected_mob.loc)
- barklimit ++
- if(prob(1))
- var/list/plushtype = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox)
- var/obj/item/toy/plushie/coughfox = pick(plushtype)
- new coughfox(affected_mob.loc)
- affected_mob.visible_message("[affected_mob] coughs up a [initial(coughfox.name)]!", \
- "You cough [initial(coughfox.name)] up ?!")
-
- affected_mob.emote("cough")
- affected_mob.adjustBruteLoss(5)
- return
diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm
deleted file mode 100644
index dd1d062cbf7..00000000000
--- a/code/datums/diseases/magnitis.dm
+++ /dev/null
@@ -1,63 +0,0 @@
-/datum/disease/magnitis
- name = "Magnitis"
- max_stages = 4
- spread_text = "Airborne"
- cure_text = "Iron"
- cures = list("iron")
- agent = "Fukkos Miracos"
- viable_mobtypes = list(/mob/living/carbon/human)
- disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
- 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 = MEDIUM
-
-/datum/disease/magnitis/stage_act()
- ..()
- switch(stage)
- if(2)
- if(prob(2))
- to_chat(affected_mob, "You feel a slight shock course through your body.")
- if(prob(2))
- for(var/obj/M in orange(2,affected_mob))
- if(!M.anchored && (M.flags & CONDUCT))
- step_towards(M,affected_mob)
- for(var/mob/living/silicon/S in orange(2,affected_mob))
- if(istype(S, /mob/living/silicon/ai)) continue
- step_towards(S,affected_mob)
- if(3)
- if(prob(2))
- to_chat(affected_mob, "You feel a strong shock course through your body.")
- if(prob(2))
- to_chat(affected_mob, "You feel like clowning around.")
- if(prob(4))
- for(var/obj/M in orange(4,affected_mob))
- if(!M.anchored && (M.flags & CONDUCT))
- var/i
- var/iter = rand(1,2)
- for(i=0,iYou feel a powerful shock course through your body.")
- if(prob(2))
- to_chat(affected_mob, "You query upon the nature of miracles.")
- if(prob(8))
- for(var/obj/M in orange(6,affected_mob))
- if(!M.anchored && (M.flags & CONDUCT))
- var/i
- var/iter = rand(1,3)
- for(i=0,iYou feel a little silly.")
- if(2)
- if(prob(10))
- to_chat(affected_mob, "You start seeing rainbows.")
- if(3)
- if(prob(10))
- to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!")
- if(4)
- if(prob(5))
- affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
-
-
-/datum/disease/pierrot_throat/advanced
- name = "Advanced Pierrot's Throat"
- spread_text = "Airborne"
- cure_text = "Banana products, especially banana bread."
- cures = list("banana")
- cure_chance = 75
- agent = "H0NI<42.B4n4 Virus"
- 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 = DANGEROUS
- possible_mutations = null
-
-/datum/disease/pierrot_throat/advanced/stage_act()
- ..()
- switch(stage)
- if(1)
- if(prob(10))
- to_chat(affected_mob, "You feel very silly.")
- if(prob(5))
- to_chat(affected_mob, "You feel like making a joke.")
- if(2)
- if(prob(10))
- to_chat(affected_mob, "You don't just start seeing rainbows... YOU ARE RAINBOWS!")
- if(3)
- if(prob(10))
- to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!")
- affected_mob << 'sound/items/airhorn.ogg'
- if(4)
- if(prob(5))
- affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
-
- if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/clown_hat/nodrop))
- affected_mob.drop_item_ground(affected_mob.wear_mask, force = TRUE)
- affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/clown_hat/nodrop(src), slot_wear_mask)
diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm
deleted file mode 100644
index 5873733902d..00000000000
--- a/code/datums/diseases/retrovirus.dm
+++ /dev/null
@@ -1,83 +0,0 @@
-/datum/disease/dna_retrovirus
- name = "Retrovirus"
- max_stages = 4
- spread_text = "Contact"
- spread_flags = 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 = DANGEROUS
- permeability_mod = 0.4
- stage_prob = 2
- var/SE
- var/UI
- var/restcure = 0
-
-
-/datum/disease/dna_retrovirus/New()
- ..()
- agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]"
- if(prob(40))
- cures = list("mutadone")
- else
- restcure = 1
-
-
-/datum/disease/dna_retrovirus/stage_act()
- ..()
- switch(stage)
- if(1)
- if(restcure)
- if(affected_mob.lying && prob(30))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(8))
- to_chat(affected_mob, "Your head hurts.")
- if(prob(9))
- to_chat(affected_mob, "You feel a tingling sensation in your chest.")
- if(prob(9))
- to_chat(affected_mob, "You feel angry.")
- if(2)
- if(restcure)
- if(affected_mob.lying && prob(20))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(8))
- to_chat(affected_mob, "Your skin feels loose.")
- if(prob(10))
- to_chat(affected_mob, "You feel very strange.")
- if(prob(4))
- to_chat(affected_mob, "You feel a stabbing pain in your head!")
- affected_mob.Paralyse(4 SECONDS)
- if(prob(4))
- to_chat(affected_mob, "Your stomach churns.")
- if(3)
- if(restcure)
- if(affected_mob.lying && prob(20))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(10))
- to_chat(affected_mob, "Your entire body vibrates.")
-
- if(prob(35))
- if(prob(50))
- scramble(1, affected_mob, rand(15, 45))
- else
- scramble(0, affected_mob, rand(15, 45))
-
- if(4)
- if(restcure)
- if(affected_mob.lying && prob(5))
- to_chat(affected_mob, "You feel better.")
- cure()
- return
- if(prob(60))
- if(prob(50))
- scramble(1, affected_mob, rand(15, 45))
- else
- scramble(0, affected_mob, rand(15, 45))
diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm
deleted file mode 100644
index 1ba2270008b..00000000000
--- a/code/datums/diseases/rhumba_beat.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/datum/disease/rhumba_beat
- name = "The Rhumba Beat"
- max_stages = 5
- spread_text = "On contact"
- spread_flags = CONTACT_GENERAL
- cure_text = "Chick Chicky Boom!"
- cures = list("plasma")
- agent = "Unknown"
- viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 1
- severity = BIOHAZARD
-
-/datum/disease/rhumba_beat/stage_act()
- ..()
- if(affected_mob.ckey == "rosham")
- cure()
- return
- switch(stage)
- if(2)
- if(prob(45))
- affected_mob.adjustToxLoss(5)
- if(prob(1))
- to_chat(affected_mob, "You feel strange...")
- if(3)
- if(prob(5))
- to_chat(affected_mob, "You feel the urge to dance...")
- else if(prob(5))
- affected_mob.emote("gasp")
- else if(prob(10))
- to_chat(affected_mob, "You feel the need to chick chicky boom...")
- if(4)
- if(prob(10))
- affected_mob.emote("gasp")
- to_chat(affected_mob, "You feel a burning beat inside...")
- if(prob(20))
- affected_mob.adjustToxLoss(5)
- if(5)
- to_chat(affected_mob, "Your body is unable to contain the Rhumba Beat...")
- if(prob(50))
- affected_mob.gib()
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
deleted file mode 100644
index 181ee3f2669..00000000000
--- a/code/datums/diseases/transformation.dm
+++ /dev/null
@@ -1,256 +0,0 @@
-/datum/disease/transformation
- name = "Transformation"
- max_stages = 5
- spread_text = "Acute"
- spread_flags = SPECIAL
- cure_text = "A coder's love (theoretical)."
- agent = "Shenanigans"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
- severity = HARMFUL
- stage_prob = 10
- visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
- disease_flags = CURABLE
- var/list/stage1 = list("You feel unremarkable.")
- var/list/stage2 = list("You feel boring.")
- var/list/stage3 = list("You feel utterly plain.")
- var/list/stage4 = list("You feel white bread.")
- var/list/stage5 = list("Oh the humanity!")
- var/new_form = /mob/living/carbon/human
- var/is_new_mind = FALSE
-
-/datum/disease/transformation/stage_act()
- ..()
- switch(stage)
- if(1)
- if(prob(stage_prob) && stage1)
- to_chat(affected_mob, pick(stage1))
- if(2)
- if(prob(stage_prob) && stage2)
- to_chat(affected_mob, pick(stage2))
- if(3)
- if(prob(stage_prob*2) && stage3)
- to_chat(affected_mob, pick(stage3))
- if(4)
- if(prob(stage_prob*2) && stage4)
- to_chat(affected_mob, pick(stage4))
- if(5)
- do_disease_transformation(affected_mob)
-
-/datum/disease/transformation/proc/do_disease_transformation(mob/living/affected_mob)
- if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD)
- if(stage5)
- to_chat(affected_mob, pick(stage5))
- if(jobban_isbanned(affected_mob, new_form))
- affected_mob.death(1)
- return
- if(affected_mob.notransform)
- return
- affected_mob.notransform = 1
- affected_mob.canmove = 0
- affected_mob.icon = null
- affected_mob.overlays.Cut()
- affected_mob.invisibility = INVISIBILITY_ABSTRACT
- for(var/obj/item/W in affected_mob)
- if(istype(W, /obj/item/implant))
- qdel(W)
- continue
- affected_mob.drop_item_ground(W) //Если вещь снимается - снимаем
- if(isobj(affected_mob.loc))
- var/obj/O = affected_mob.loc
- O.force_eject_occupant(affected_mob)
- var/mob/living/new_mob = new new_form(affected_mob.loc)
- if(istype(new_mob))
- new_mob.a_intent = "harm"
- if(affected_mob.mind)
- affected_mob.mind.transfer_to(new_mob)
- if(is_new_mind)
- new_mob.mind.wipe_memory()
- else
- new_mob.key = affected_mob.key
- qdel(affected_mob)
-
-
-
-/datum/disease/transformation/jungle_fever
- name = "Jungle Fever"
- cure_text = "Bananas"
- cures = list("banana")
- spread_text = "Monkey Bites"
- spread_flags = SPECIAL
- viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 1
- cure_chance = 1
- disease_flags = CAN_CARRY|CAN_RESIST
- desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
- severity = BIOHAZARD
- stage_prob = 4
- visibility_flags = 0
- agent = "Kongey Vibrion M-909"
- new_form = /mob/living/carbon/human/lesser/monkey
- is_new_mind = TRUE
-
- stage1 = null
- stage2 = null
- stage3 = null
- stage4 = list("Your back hurts.", "You breathe through your mouth.",
- "You have a craving for bananas.", "Your mind feels clouded.")
- stage5 = list("You feel like monkeying around.")
-
-/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/human/affected_mob)
- if(!issmall(affected_mob))
- affected_mob.monkeyize()
-
-/datum/disease/transformation/jungle_fever/stage_act()
- ..()
- switch(stage)
- if(2)
- if(prob(2))
- to_chat(affected_mob, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.")
- if(3)
- if(prob(4))
- to_chat(affected_mob, "You feel a stabbing pain in your head.")
- affected_mob.AdjustConfused(20 SECONDS)
- if(4)
- if(prob(3))
- affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."))
-
-
-/datum/disease/transformation/robot
-
- name = "Robotic Transformation"
- cure_text = "An injection of copper."
- cures = list("copper")
- cure_chance = 5
- agent = "R2D2 Nanomachines"
- desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg."
- severity = DANGEROUS
- visibility_flags = 0
- new_form = /mob/living/silicon/robot
- is_new_mind = TRUE
-
- stage1 = null
- stage2 = list("Your joints feel stiff.", "Beep...boop..")
- stage3 = list("Your joints feel very stiff.", "Your skin feels loose.", "You can feel something move...inside.")
- stage4 = list("Your skin feels very loose.", "You can feel... something...inside you.")
- stage5 = list("Your skin feels as if it's about to burst off!")
-
-
-/datum/disease/transformation/robot/stage_act()
- ..()
- switch(stage)
- if(3)
- if(prob(8))
- affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"))
- if(prob(4))
- to_chat(affected_mob, "You feel a stabbing pain in your head.")
- affected_mob.Paralyse(4 SECONDS)
- if(4)
- if(prob(20))
- affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."))
-
-
-/datum/disease/transformation/xeno
-
- name = "Xenomorph Transformation"
- cure_text = "Spaceacillin & Glycerol"
- cures = list("spaceacillin", "glycerol")
- cure_chance = 5
- agent = "Rip-LEY Alien Microbes"
- desc = "This disease changes the victim into a xenomorph."
- severity = BIOHAZARD
- visibility_flags = 0
- stage1 = null
- stage2 = list("Your throat feels scratchy.", "Kill...")
- stage3 = list("Your throat feels very scratchy.", "Your skin feels tight.", "You can feel something move...inside.")
- stage4 = list("Your skin feels very tight.", "Your blood boils!", "You can feel... something...inside you.")
- stage5 = list("Теперь вы ксеноморф.\n\
- Вы чувствуете боль от превращения! Вы желаете укусить того, кто с вами это сделал, благо, память вас не покинула и вы всё помните.")
- new_form = null
-
-/datum/disease/transformation/xeno/New()
- new_form = pick(/mob/living/carbon/alien/humanoid/hunter, /mob/living/carbon/alien/humanoid/drone/no_queen, /mob/living/carbon/alien/humanoid/sentinel)
-
-/datum/disease/transformation/xeno/stage_act()
- ..()
- switch(stage)
- if(3)
- if(prob(4))
- to_chat(affected_mob, "You feel a stabbing pain in your head.")
- affected_mob.Paralyse(4 SECONDS)
- if(4)
- if(prob(20))
- affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"))
-
-
-/datum/disease/transformation/slime
- name = "Advanced Mutation Transformation"
- cure_text = "frost oil"
- cures = list("frostoil")
- cure_chance = 80
- agent = "Advanced Mutation Toxin"
- desc = "This highly concentrated extract converts anything into more of itself."
- severity = BIOHAZARD
- visibility_flags = 0
- stage1 = list("You don't feel very well.")
- stage2 = list("Your skin feels a little slimy.")
- stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.")
- stage4 = list("You are turning into a slime.")
- stage5 = list("You have become a slime.")
- new_form = /mob/living/simple_animal/slime/random
-
-/datum/disease/transformation/slime/stage_act()
- ..()
- switch(stage)
- if(1)
- if(ishuman(affected_mob))
- var/mob/living/carbon/human/H = affected_mob
- if(isslimeperson(H))
- stage = 5
- if(3)
- if(ishuman(affected_mob))
- var/mob/living/carbon/human/human = affected_mob
- if(!isslimeperson(human))
- human.set_species(/datum/species/slime)
-
-/datum/disease/transformation/corgi
- name = "The Barkening"
- cure_text = "Death"
- cures = list("adminordrazine")
- agent = "Fell Doge Majicks"
- desc = "This disease transforms the victim into a corgi."
- visibility_flags = 0
- stage1 = list("BARK.")
- stage2 = list("You feel the need to wear silly hats.")
- stage3 = list("Must... eat... chocolate....", "YAP")
- stage4 = list("Visions of washing machines assail your mind!")
- stage5 = list("AUUUUUU!!!")
- new_form = /mob/living/simple_animal/pet/dog/corgi
- is_new_mind = TRUE
-
-/datum/disease/transformation/corgi/stage_act()
- ..()
- switch(stage)
- if(3)
- if(prob(8))
- affected_mob.say(pick("YAP", "Woof!"))
- if(4)
- if(prob(20))
- affected_mob.say(pick("Bark!", "AUUUUUU"))
-
-/datum/disease/transformation/morph
- name = "Gluttony's Blessing"
- cure_text = "nothing"
- cures = list("adminordrazine")
- agent = "Gluttony's Blessing"
- desc = "A 'gift' from somewhere terrible."
- stage_prob = 20
- severity = BIOHAZARD
- visibility_flags = 0
- stage1 = list("Your stomach rumbles.")
- stage2 = list("Your skin feels saggy.")
- stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.")
- stage4 = list("You're ravenous.")
- stage5 = list("ТЕПЕРЬ ВЫ МОРФ! \n \
- Хоть Вы и трансформировались в отвратительную зелёную жижу, но это не повлияло на Ваше сознание \
- и память. Вы не являетесь антагонистом.")
- new_form = /mob/living/simple_animal/hostile/morph
diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm
deleted file mode 100644
index 970cc22914e..00000000000
--- a/code/datums/diseases/tuberculosis.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/datum/disease/tuberculosis
- form = "Disease"
- name = "Fungal tuberculosis"
- max_stages = 5
- spread_text = "Airborne"
- cure_text = "Spaceacillin & salbutamol"
- cures = list("spaceacillin", "salbutamol")
- agent = "Fungal Tubercle bacillus Cosmosis"
- viable_mobtypes = list(/mob/living/carbon/human)
- 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(/obj/item/organ/internal/lungs)
- severity = DANGEROUS
- bypasses_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs
-
-/datum/disease/tuberculosis/stage_act() //it begins
- ..()
- switch(stage)
- if(2)
- if(prob(2))
- affected_mob.emote("cough")
- to_chat(affected_mob, "Your chest hurts.")
- if(prob(2))
- to_chat(affected_mob, "Your stomach violently rumbles!")
- if(prob(5))
- to_chat(affected_mob, "You feel a cold sweat form.")
- if(4)
- if(prob(2))
- to_chat(affected_mob, "You see four of everything")
- affected_mob.Dizzy(10 SECONDS)
- if(prob(2))
- to_chat(affected_mob, "You feel a sharp pain from your lower chest!")
- affected_mob.adjustOxyLoss(5)
- affected_mob.emote("gasp")
- if(prob(10))
- to_chat(affected_mob, "You feel air escape from your lungs painfully.")
- affected_mob.adjustOxyLoss(25)
- affected_mob.emote("gasp")
- if(5)
- if(prob(2))
- to_chat(affected_mob, "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]")
- affected_mob.adjustStaminaLoss(70)
- if(prob(10))
- affected_mob.adjustStaminaLoss(100)
- affected_mob.visible_message("[affected_mob] faints!", "You surrender yourself and feel at peace...")
- affected_mob.AdjustSleeping(10 SECONDS)
- if(prob(2))
- to_chat(affected_mob, "You feel your mind relax and your thoughts drift!")
- affected_mob.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS)
- if(prob(10))
- affected_mob.vomit(20)
- if(prob(3))
- to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]")
- affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0)
- affected_mob.adjust_nutrition(-100)
- if(prob(15))
- to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]")
- affected_mob.bodytemperature += 40
- return
diff --git a/code/datums/diseases/vampire.dm b/code/datums/diseases/vampire.dm
index e51f34796ac..29b90816d3d 100644
--- a/code/datums/diseases/vampire.dm
+++ b/code/datums/diseases/vampire.dm
@@ -1,20 +1,18 @@
/datum/disease/vampire
name = "Grave Fever"
- max_stages = 3
- stage_prob = 5
- spread_text = "Non-Contagious"
- spread_flags = SPECIAL
- cure_text = "Antibiotics"
- cures = list("spaceacillin")
agent = "Grave Dust"
- cure_chance = 20
- viable_mobtypes = list(/mob/living/carbon/human)
+ max_stages = 4
+ stage_prob = 5
+ //TODO: Something with chaplain & cure
+ cures = list("garlic")
+ cure_prob = 8
severity = DANGEROUS
- disease_flags = CURABLE
- spread_flags = NON_CONTAGIOUS
+ can_immunity = FALSE
/datum/disease/vampire/stage_act()
- ..()
+ if(!..())
+ return FALSE
+
var/toxdamage = stage * 2
var/stuntime = stage * 2
@@ -24,10 +22,10 @@
if(prob(15))
if(prob(33))
- to_chat(affected_mob, "You feel sickly and weak.")
+ to_chat(affected_mob, span_danger("You feel sickly and weak."))
affected_mob.Slowed(6 SECONDS)
affected_mob.adjustToxLoss(toxdamage)
if(prob(5))
- to_chat(affected_mob, "Your joints ache horribly!")
+ to_chat(affected_mob, span_danger("Your joints ache horribly!"))
affected_mob.Weaken(stuntime STATUS_EFFECT_CONSTANT)
diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm
new file mode 100644
index 00000000000..1057fc7a33b
--- /dev/null
+++ b/code/datums/diseases/viruses/_virus.dm
@@ -0,0 +1,89 @@
+//Spread Flags
+#define NON_CONTAGIOUS 0 //virus can't spread
+#define BITES 1 //virus can spread with bites
+#define BLOOD 2 //virus can spread with infected blood
+#define CONTACT 4 //virus can spread with any touch
+#define AIRBORNE 8 //virus spreads through the air
+
+/datum/disease/virus
+ form = "Вирус"
+ carrier_mobtypes = list(/mob/living/simple_animal/mouse)
+ var/spread_flags = NON_CONTAGIOUS
+
+ ///affects how often the virus will try to spread. The more the better. In range [0-100]
+ var/infectivity = 65
+ ///affects how well the virus will pass through the protection. The more the better. In range (0-2]
+ var/permeability_mod = 1
+
+/datum/disease/virus/New()
+ ..()
+ additional_info = spread_text()
+
+/**
+ * Main virus process, that executed every tick
+ *
+ * Returns:
+ * * TRUE - if process finished the work properlly
+ * * FALSE - if don't need to call a child proc
+ */
+/datum/disease/virus/stage_act()
+ if(prob(infectivity))
+ spread()
+
+ . = ..()
+
+ if(!. || carrier || (affected_mob.type in carrier_mobtypes))
+ return FALSE
+
+ return TRUE
+
+/datum/disease/virus/try_increase_stage()
+ if(prob(affected_mob.reagents?.has_reagent("spaceacillin") ? stage_prob/2 : stage_prob))
+ stage = min(stage + 1,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()
+
+/datum/disease/virus/spread(force_spread = 0)
+ if(!affected_mob)
+ return
+
+ if((spread_flags <= BLOOD) && !force_spread)
+ return
+
+ if(affected_mob.reagents?.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
+ return
+
+ var/spread_range = force_spread ? force_spread : 1
+
+ if(spread_flags & AIRBORNE)
+ spread_range++
+
+ var/turf/T = affected_mob.loc
+ if(istype(T))
+ for(var/mob/living/C in oview(spread_range, affected_mob))
+ var/turf/V = get_turf(C)
+ if(V)
+ while(TRUE)
+ if(V == T)
+ var/a_type = (spread_range == 1) ? CONTACT : CONTACT|AIRBORNE
+ Contract(C, act_type = a_type, need_protection_check = TRUE)
+ break
+ var/turf/Temp = get_step_towards(V, T)
+ if(!V.CanAtmosPass(Temp))
+ break
+ V = Temp
+
+/datum/disease/virus/proc/spread_text()
+ var/list/spread = list()
+ if(!spread_flags)
+ spread += "Не заразный"
+ if(spread_flags & BITES)
+ spread += "Распространяемый через укусы"
+ if(spread_flags & BLOOD)
+ spread += "Распространяемый через кровь"
+ if(spread_flags & CONTACT)
+ spread += "Контактный"
+ if(spread_flags & AIRBORNE)
+ spread += "Воздушно-капельный"
+ return english_list(spread, "Неизвестен", " и ")
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/viruses/advance/advance.dm
similarity index 59%
rename from code/datums/diseases/advance/advance.dm
rename to code/datums/diseases/viruses/advance/advance.dm
index de99208c2ca..2e85700833f 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/viruses/advance/advance.dm
@@ -3,10 +3,11 @@
Advance Disease is a system for Virologist to Engineer their own disease with symptoms that have effects and properties
which add onto the overall disease.
- If you need help with creating new symptoms or expanding the advance disease, ask for Giacom on #coderbus.
-
*/
+#define VIRUS_SYMPTOM_LIMIT 6
+#define VIRUS_MAX_SYMPTOM_LEVEL 6
+
// The order goes from easy to cure to hard to cure.
GLOBAL_LIST_INIT(advance_cures, list(
"sodiumchloride", "sugar", "orangejuice",
@@ -23,15 +24,13 @@ GLOBAL_LIST_EMPTY(archive_diseases)
*/
-/datum/disease/advance
+/datum/disease/virus/advance
name = "Unknown" // We will always let our Virologist name our disease.
desc = "Спроектированная болезнь, может содержать сразу несколько симптомов."
- form = "Улучшенная болезнь" // Will let med-scanners know that this disease was engineered.
+ form = "Продвинутая болезнь" // Will let med-scanners know that this disease was engineered.
agent = "advance microbes"
max_stages = 5
- spread_text = "Unknown"
- viable_mobtypes = list(/mob/living/carbon/human)
// NEW VARS
@@ -39,21 +38,22 @@ GLOBAL_LIST_EMPTY(archive_diseases)
var/id = ""
var/processing = 0
-/datum/disease/advance/New()
+/datum/disease/virus/advance/New()
if(!symptoms || !symptoms.len)
- symptoms = GenerateSymptoms(0, 2)
+ symptoms = GenerateSymptoms(1, 2)
AssignProperties(GenerateProperties())
id = GetDiseaseID()
+ ..()
-/datum/disease/advance/Destroy()
+/datum/disease/virus/advance/Destroy()
if(processing)
for(var/datum/symptom/S in symptoms)
S.End(src)
return ..()
// Randomly pick a symptom to activate.
-/datum/disease/advance/stage_act()
+/datum/disease/virus/advance/stage_act()
if(!..())
return FALSE
if(symptoms && symptoms.len)
@@ -70,9 +70,8 @@ GLOBAL_LIST_EMPTY(archive_diseases)
return TRUE
// Compares type then ID.
-/datum/disease/advance/IsSame(datum/disease/advance/D)
-
- if(!(istype(D, /datum/disease/advance)))
+/datum/disease/virus/advance/IsSame(datum/disease/virus/advance/D)
+ if(!(istype(D, /datum/disease/virus/advance)))
return FALSE
if(GetDiseaseID() != D.GetDiseaseID())
@@ -80,19 +79,16 @@ GLOBAL_LIST_EMPTY(archive_diseases)
return TRUE
// To add special resistances.
-/datum/disease/advance/cure(resistance = TRUE)
- if(affected_mob)
- var/id = "[GetDiseaseID()]"
- if(resistance && !(id in affected_mob.resistances))
- affected_mob.resistances[id] = id
- remove_virus()
- qdel(src) //delete the datum to stop it processing
+/datum/disease/virus/advance/cure(id, need_immunity)
+ ..(GetDiseaseID(), need_immunity)
// Returns the advance disease with a different reference memory.
-/datum/disease/advance/Copy()
- var/datum/disease/advance/copy = new
- var/list/skipped = list("symptoms","affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
- for(var/V in vars - skipped)
+/datum/disease/virus/advance/Copy()
+ var/datum/disease/virus/advance/copy = new
+ var/list/required_vars = list(
+ "name","severity","id","visibility_flags","spread_flags", "additional_info",
+ "stage_prob","cures","cure_prob","cure_text", "permeability_mod")
+ for(var/V in required_vars)
if(istype(vars[V], /list))
var/list/L = vars[V]
copy.vars[V] = L.Copy()
@@ -104,20 +100,20 @@ GLOBAL_LIST_EMPTY(archive_diseases)
return copy
// Mix the symptoms of two diseases (the src and the argument)
-/datum/disease/advance/proc/Mix(datum/disease/advance/D)
+/datum/disease/virus/advance/proc/Mix(datum/disease/virus/advance/D)
if(!(IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
AddSymptom(new S.type)
-/datum/disease/advance/proc/HasSymptom(datum/symptom/S)
+/datum/disease/virus/advance/proc/HasSymptom(datum/symptom/S)
for(var/datum/symptom/symp in symptoms)
if(symp.id == S.id)
- return 1
- return 0
+ return TRUE
+ return FALSE
// Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated.
-/datum/disease/advance/proc/GenerateSymptoms(level_min, level_max, amount_get = 0)
+/datum/disease/virus/advance/proc/GenerateSymptoms(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 0, override_symptoms = FALSE)
var/list/generated = list() // Symptoms we generated.
@@ -126,31 +122,31 @@ GLOBAL_LIST_EMPTY(archive_diseases)
for(var/symp in GLOB.list_symptoms)
var/datum/symptom/S = new symp
if(S.level >= level_min && S.level <= level_max)
- if(!HasSymptom(S))
+ if(!HasSymptom(S) || override_symptoms)
possible_symptoms += S
if(!possible_symptoms.len)
return generated
- // Random chance to get more than one symptom
- var/number_of = amount_get
- if(!amount_get)
- number_of = 1
- while(prob(20))
- number_of += 1
+ var/N = 1
+ if(count_of_symptoms)
+ N = count_of_symptoms
+ else
+ while(prob(20) && N < VIRUS_SYMPTOM_LIMIT)
+ N++
- for(var/i = 1; number_of >= i && possible_symptoms.len; i++)
+ for(var/i = 1; i <= N && possible_symptoms.len; i++)
generated += pick_n_take(possible_symptoms)
return generated
-/datum/disease/advance/proc/Refresh(var/update_mutations = TRUE, var/reset_name = FALSE)
- AssignProperties(GenerateProperties())
+/datum/disease/virus/advance/proc/Refresh(reset_name = FALSE, update_properties = TRUE)
+ if(update_properties)
+ AssignProperties(GenerateProperties())
id = GetDiseaseID()
- var/datum/disease/advance/A = GLOB.archive_diseases[id]
- if(update_mutations)
- UpdateMutationsProps(A)
+ var/datum/disease/virus/advance/A = GLOB.archive_diseases[id]
+ UpdateMutationsProps(A)
if(A)
name = A.name
@@ -159,17 +155,17 @@ GLOBAL_LIST_EMPTY(archive_diseases)
name = "Unknown"
AddToArchive()
-/datum/disease/advance/proc/AddToArchive()
+/datum/disease/virus/advance/proc/AddToArchive()
GLOB.archive_diseases[id] = Copy()
-/datum/disease/advance/proc/UpdateMutationsProps(var/datum/disease/advance/A)
- var/datum/disease/advance/AA = A ? A : new
+/datum/disease/virus/advance/proc/UpdateMutationsProps(datum/disease/virus/advance/A)
+ var/datum/disease/virus/advance/AA = A ? A : new
mutation_reagents = AA.mutation_reagents.Copy()
possible_mutations = AA.possible_mutations?.Copy()
//Generate disease properties based on the effects. Returns an associated list.
-/datum/disease/advance/proc/GenerateProperties()
+/datum/disease/virus/advance/proc/GenerateProperties()
if(!symptoms || !symptoms.len)
CRASH("We did not have any symptoms before generating properties.")
@@ -187,76 +183,66 @@ GLOBAL_LIST_EMPTY(archive_diseases)
return properties
// Assign the properties that are in the list.
-/datum/disease/advance/proc/AssignProperties(list/properties = list())
-
+/datum/disease/virus/advance/proc/AssignProperties(list/properties = list())
if(properties && properties.len)
+ // stealth
switch(properties["stealth"])
+ if(1)
+ visibility_flags = HIDDEN_HUD
if(2)
- visibility_flags = HIDDEN_SCANNER
+ visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER
if(3 to INFINITY)
- visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
+ visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER|HIDDEN_PANDEMIC
else
visibility_flags = VISIBLE
- // The more symptoms we have, the less transmittable it is but some symptoms can make up for it.
- SetSpread(clamp(2 ** (properties["transmittable"] - symptoms.len), 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_speed"], 2)
- SetSeverity(properties["severity"])
- GenerateCure(properties)
+ // transmittable
+ switch(properties["transmittable"] - round(symptoms.len/2))
+ if(-INFINITY to 1)
+ spread_flags = BLOOD
+ if(2 to 3)
+ spread_flags = CONTACT
+ if(4 to INFINITY)
+ spread_flags = AIRBORNE
+ additional_info = spread_text()
+ permeability_mod = clamp((0.25 * properties["transmittable"]), 0.2, 2)
+
+ //stage speed
+ stage_prob = clamp(max(1.3 * sqrtor0(properties["stage_speed"] + 11), properties["stage_speed"]), 1, 40)
+
+ //severity
+ switch(properties["severity"])
+ if(-INFINITY to 0)
+ severity = NONTHREAT
+ if(1)
+ severity = MINOR
+ if(2)
+ severity = MEDIUM
+ if(3)
+ severity = HARMFUL
+ if(4)
+ severity = DANGEROUS
+ if(5 to INFINITY)
+ severity = BIOHAZARD
+
+ //resistance
+ cure_prob = clamp(15 - properties["resistance"], 5, 40)
+ GenerateCure(properties["resistance"])
else
CRASH("Our properties were empty or null!")
-
-// Assign the spread type and give it the correct description.
-/datum/disease/advance/proc/SetSpread(spread_id)
- switch(spread_id)
- if(NON_CONTAGIOUS)
- spread_text = "None"
- if(SPECIAL)
- spread_text = "None"
- if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET)
- spread_text = "On contact"
- if(AIRBORNE)
- spread_text = "Airborne"
- if(BLOOD)
- spread_text = "Blood"
-
- spread_flags = spread_id
-
-/datum/disease/advance/proc/SetSeverity(level_sev)
-
- switch(level_sev)
-
- if(-INFINITY to 0)
- severity = NONTHREAT
- if(1)
- severity = MINOR
- if(2)
- severity = MEDIUM
- if(3)
- severity = HARMFUL
- if(4)
- severity = DANGEROUS
- if(5 to INFINITY)
- severity = BIOHAZARD
- else
- severity = "Unknown"
-
-
+//TODO: доделать эту хуйню
// 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 && properties.len)
- var/res = round(clamp(properties["resistance"] - (symptoms.len / 2), 1, GLOB.advance_cures.len))
+/datum/disease/virus/advance/proc/GenerateCure(resistance)
+ var/res = round(clamp(resistance - (symptoms.len / 2), 1, GLOB.advance_cures.len))
- // Get the cure name from the cure_id
- var/datum/reagent/D = GLOB.chemical_reagents_list[GLOB.advance_cures[res]]
- cures = list(GLOB.advance_cures[res])
- cure_text = D.name
+ // Get the cure name from the cure_id
+ var/datum/reagent/D = GLOB.chemical_reagents_list[GLOB.advance_cures[res]]
+ cures = list(GLOB.advance_cures[res])
+ cure_text = D.name
// Randomly generate a symptom, has a chance to lose or gain a symptom.
-/datum/disease/advance/proc/Evolve(min_level, max_level)
+/datum/disease/virus/advance/proc/Evolve(min_level, max_level)
var/s = safepick(GenerateSymptoms(min_level, max_level, 1))
if(s)
AddSymptom(s)
@@ -264,7 +250,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
return
// Randomly remove a symptom.
-/datum/disease/advance/proc/Devolve()
+/datum/disease/virus/advance/proc/Devolve()
if(symptoms.len > 1)
var/s = safepick(symptoms)
if(s)
@@ -273,12 +259,12 @@ GLOBAL_LIST_EMPTY(archive_diseases)
return
// Name the disease.
-/datum/disease/advance/proc/AssignName(name = "Unknown")
+/datum/disease/virus/advance/proc/AssignName(name = "Unknown")
src.name = name
return
// Return a unique ID of the disease.
-/datum/disease/advance/GetDiseaseID()
+/datum/disease/virus/advance/GetDiseaseID()
var/list/L = list()
for(var/datum/symptom/S in symptoms)
L += S.id
@@ -287,7 +273,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
// Add a symptom, if it is over the limit (with a small chance to be able to go over)
// we take a random symptom away and add the new one.
-/datum/disease/advance/proc/AddSymptom(datum/symptom/S)
+/datum/disease/virus/advance/proc/AddSymptom(datum/symptom/S)
if(HasSymptom(S))
return
@@ -300,10 +286,15 @@ GLOBAL_LIST_EMPTY(archive_diseases)
return
// Simply removes the symptom.
-/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S)
+/datum/disease/virus/advance/proc/RemoveSymptom(datum/symptom/S)
symptoms -= S
return
+/datum/disease/virus/advance/CanContract(mob/living/M, act_type, need_protection_check, zone)
+ . = ..()
+ if(count_by_type(M.diseases, /datum/disease/virus/advance) > 0)
+ . = FALSE
+
/*
Static Procs
@@ -315,7 +306,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
var/list/diseases = list()
- for(var/datum/disease/advance/A in D_list)
+ for(var/datum/disease/virus/advance/A in D_list)
diseases += A.Copy()
if(!diseases.len)
@@ -329,15 +320,15 @@ GLOBAL_LIST_EMPTY(archive_diseases)
i++
- var/datum/disease/advance/D1 = pick(diseases)
+ var/datum/disease/virus/advance/D1 = pick(diseases)
diseases -= D1
- var/datum/disease/advance/D2 = pick(diseases)
+ var/datum/disease/virus/advance/D2 = pick(diseases)
D2.Mix(D1)
// Should be only 1 entry left, but if not let's only return a single entry
// to_chat(world, "END MIXING!!!!!")
- var/datum/disease/advance/to_return = pick(diseases)
+ var/datum/disease/virus/advance/to_return = pick(diseases)
to_return.Refresh(reset_name = TRUE)
return to_return
@@ -345,7 +336,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
if(data)
var/list/preserve = list()
if(istype(data) && data["viruses"])
- for(var/datum/disease/A in data["viruses"])
+ for(var/datum/disease/virus/A in data["viruses"])
preserve += A.Copy()
R.data = data.Copy()
if(preserve.len)
@@ -358,7 +349,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
var/i = VIRUS_SYMPTOM_LIMIT
- var/datum/disease/advance/D = new
+ var/datum/disease/virus/advance/D = new
D.Refresh()
D.symptoms = list()
@@ -387,7 +378,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
D.AssignName(new_name)
D.Refresh()
- for(var/datum/disease/advance/AD in GLOB.active_diseases)
+ for(var/datum/disease/virus/advance/AD in GLOB.active_diseases)
AD.Refresh()
for(var/thing in shuffle(GLOB.human_list))
@@ -395,7 +386,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
if(H.stat == DEAD || !is_station_level(H.z))
continue
if(!H.HasDisease(D))
- H.ForceContractDisease(D)
+ D.Contract(H)
break
var/list/name_symptoms = list()
@@ -403,30 +394,42 @@ GLOBAL_LIST_EMPTY(archive_diseases)
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)]")
+/**
+ * Creates and returns a random virus with properties independent of symptoms properties
+ */
+/proc/CreateRandomVirus(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 6,
+ resistance, stealth, stage_rate, transmittable, severity)
+
+ var/datum/disease/virus/advance/A = new
+ A.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs))
+ A.symptoms = A.GenerateSymptoms(count_of_symptoms = rand(4, 6), override_symptoms = TRUE)
+ A.AssignProperties(list("resistance" = resistance, "stealth" = stealth, "stage_rate" = stage_rate, "transmittable" = transmittable, "severity" = severity))
+ A.Refresh(update_properties = FALSE)
+ return A
-/datum/disease/advance/proc/totalStageSpeed()
+/datum/disease/virus/advance/proc/totalStageSpeed()
var/total_stage_speed = 0
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()
+/datum/disease/virus/advance/proc/totalStealth()
var/total_stealth = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_stealth += S.stealth
return total_stealth
-/datum/disease/advance/proc/totalResistance()
+/datum/disease/virus/advance/proc/totalResistance()
var/total_resistance = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_resistance += S.resistance
return total_resistance
-/datum/disease/advance/proc/totalTransmittable()
+/datum/disease/virus/advance/proc/totalTransmittable()
var/total_transmittable = 0
for(var/i in symptoms)
var/datum/symptom/S = i
diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/viruses/advance/presets.dm
similarity index 63%
rename from code/datums/diseases/advance/presets.dm
rename to code/datums/diseases/viruses/advance/presets.dm
index 872ce088871..42b0701f6e4 100644
--- a/code/datums/diseases/advance/presets.dm
+++ b/code/datums/diseases/viruses/advance/presets.dm
@@ -1,107 +1,107 @@
// Cold
-/datum/disease/advance/preset/cold
- name = "Cold"
+/datum/disease/virus/advance/preset/sneezing
+ name = "Sneezing"
symptoms = list(new/datum/symptom/sneeze)
// Flu
-/datum/disease/advance/preset/flu
- name = "Flu"
+/datum/disease/virus/advance/preset/cough
+ name = "Cough"
symptoms = list(new/datum/symptom/cough)
// Voice Changing
-/datum/disease/advance/preset/voice_change
+/datum/disease/virus/advance/preset/voice_change
name = "Epiglottis Mutation"
symptoms = list(new/datum/symptom/voice_change)
// Toxin Filter
-/datum/disease/advance/preset/heal
+/datum/disease/virus/advance/preset/heal
name = "Liver Enhancer"
symptoms = list(new/datum/symptom/heal)
- possible_mutations = list(/datum/disease/advance/preset/advanced_regeneration, /datum/disease/advance/preset/cold/)
+ possible_mutations = list(/datum/disease/virus/advance/preset/advanced_regeneration, /datum/disease/virus/advance/preset/sneezing)
// Hullucigen
-/datum/disease/advance/preset/hullucigen
+/datum/disease/virus/advance/preset/hullucigen
name = "Reality Impairment"
symptoms = list(new/datum/symptom/hallucigen)
- possible_mutations = list(/datum/disease/brainrot, /datum/disease/advance/preset/sensory_restoration)
+ possible_mutations = list(/datum/disease/virus/brainrot, /datum/disease/virus/advance/preset/sensory_restoration)
// Sensory Restoration
-/datum/disease/advance/preset/sensory_restoration
+/datum/disease/virus/advance/preset/sensory_restoration
name = "Reality Enhancer"
symptoms = list(new/datum/symptom/sensory_restoration)
// Mind Restoration
-/datum/disease/advance/preset/mind_restoration
+/datum/disease/virus/advance/preset/mind_restoration
name = "Reality Purifier"
symptoms = list(new/datum/symptom/mind_restoration)
// Toxic Filter + Toxic Compensation + Viral Evolutionary Acceleration
-/datum/disease/advance/preset/advanced_regeneration
+/datum/disease/virus/advance/preset/advanced_regeneration
name = "Advanced Neogenesis"
symptoms = list(new/datum/symptom/heal, new/datum/symptom/damage_converter, new/datum/symptom/viralevolution)
// Necrotizing Fasciitis + Viral Self-Adaptation + Eternal Youth + Dizziness
-/datum/disease/advance/preset/stealth_necrosis
+/datum/disease/virus/advance/preset/stealth_necrosis
name = "Necroeyrosis"
symptoms = list(new/datum/symptom/flesh_eating, new/datum/symptom/viraladaptation, new/datum/symptom/youth, new/datum/symptom/dizzy)
mutation_reagents = list("mutagen", "histamine")
- possible_mutations = list(/datum/disease/transformation/xeno)
+ possible_mutations = list(/datum/disease/virus/transformation/xeno)
//Facial Hypertrichosis + Voice Change + Itching
-/datum/disease/advance/preset/pre_kingstons
+/datum/disease/virus/advance/preset/pre_kingstons
name = "Neverlasting Stranger"
symptoms = list(new/datum/symptom/beard, new/datum/symptom/voice_change, new/datum/symptom/itching)
mutation_reagents = list("mutagen", "radium")
- possible_mutations = list(/datum/disease/kingstons)
+ possible_mutations = list(/datum/disease/virus/kingstons)
//Pacifist Syndrome
-/datum/disease/advance/preset/love
+/datum/disease/virus/advance/preset/love
name = "Pacifist Syndrome"
symptoms = list(new/datum/symptom/love)
//Uncontrollable Aggression
-/datum/disease/advance/preset/aggression
+/datum/disease/virus/advance/preset/aggression
name = "Uncontrollable Aggression"
symptoms = list(new/datum/symptom/aggression)
//Uncontrollable Actions
-/datum/disease/advance/preset/obsession
+/datum/disease/virus/advance/preset/obsession
name = "Uncontrollable Actions"
symptoms = list(new/datum/symptom/obsession)
//Topographical Cretinism
-/datum/disease/advance/preset/confusion
+/datum/disease/virus/advance/preset/confusion
name = "Topographical Cretinism"
symptoms = list(new/datum/symptom/confusion)
//Fragile Bones Syndrome
-/datum/disease/advance/preset/bones
+/datum/disease/virus/advance/preset/bones
name = "Fragile Bones Syndrome"
symptoms = list(new/datum/symptom/bones)
//Limb Rejection
-/datum/disease/advance/preset/limb_throw
+/datum/disease/virus/advance/preset/limb_throw
name = "Limb Rejection"
symptoms = list(new/datum/symptom/limb_throw)
//Uncontrolled Laughter Effect
-/datum/disease/advance/preset/laugh
+/datum/disease/virus/advance/preset/laugh
name = "Uncontrolled Laughter Effect"
symptoms = list(new/datum/symptom/laugh)
//Groaning Syndrome
-/datum/disease/advance/preset/moan
+/datum/disease/virus/advance/preset/moan
name = "Groaning Syndrome"
symptoms = list(new/datum/symptom/moan)
//Toxification syndrome
-/datum/disease/advance/preset/infection
+/datum/disease/virus/advance/preset/infection
name = "Toxification syndrome"
symptoms = list(new/datum/symptom/infection)
// Uncontrolled Laughter Effect + Groaning Syndrome + Hullucigen
-/datum/disease/advance/preset/pre_loyalty
+/datum/disease/virus/advance/preset/pre_loyalty
name = "Merry sufferer"
symptoms = list(new/datum/symptom/laugh, new/datum/symptom/moan, new/datum/symptom/hallucigen)
mutation_reagents = list("love")
- possible_mutations = list(/datum/disease/loyalty)
+ possible_mutations = list(/datum/disease/virus/loyalty)
diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/viruses/advance/symptoms/beard.dm
similarity index 83%
rename from code/datums/diseases/advance/symptoms/beard.dm
rename to code/datums/diseases/viruses/advance/symptoms/beard.dm
index 26b6e9e4096..16e0113bdfe 100644
--- a/code/datums/diseases/advance/symptoms/beard.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/beard.dm
@@ -25,7 +25,7 @@ BONUS
level = 4
severity = 1
-/datum/symptom/beard/Activate(datum/disease/advance/A)
+/datum/symptom/beard/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
@@ -34,17 +34,17 @@ BONUS
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
switch(A.stage)
if(1, 2)
- to_chat(H, "Your chin itches.")
+ to_chat(H, span_warning("Your chin itches."))
if(head_organ.f_style == "Shaved")
head_organ.f_style = "Jensen Beard"
H.update_fhair()
if(3, 4)
- to_chat(H, "You feel tough.")
+ to_chat(H, span_warning("You feel tough."))
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, "You feel manly!")
+ to_chat(H, span_warning("You feel manly!"))
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()
diff --git a/code/datums/diseases/advance/symptoms/blood.dm b/code/datums/diseases/viruses/advance/symptoms/blood.dm
similarity index 79%
rename from code/datums/diseases/advance/symptoms/blood.dm
rename to code/datums/diseases/viruses/advance/symptoms/blood.dm
index 4ebb8b582df..87878e6f154 100644
--- a/code/datums/diseases/advance/symptoms/blood.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/blood.dm
@@ -24,16 +24,16 @@ Bonus
level = 5
var/check = FALSE
-/datum/symptom/blood/Activate(datum/disease/advance/A)
+/datum/symptom/blood/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/M = A.affected_mob
if(prob(SYMPTOM_ACTIVATION_PROB))
switch(A.stage)
if(3,4)
- to_chat(M, "You feel hungry")
+ to_chat(M, span_notice("You feel hungry"))
if(5)
if(prob(10))
- to_chat(M, "You can hear own heartbeat")
+ to_chat(M, span_notice("You can hear own heartbeat"))
check = TRUE
if(check == TRUE && (M.blood_volume < BLOOD_VOLUME_NORMAL) && !(NO_BLOOD in M.dna.species.species_traits))
M.blood_volume += 0.4
diff --git a/code/datums/diseases/advance/symptoms/bones.dm b/code/datums/diseases/viruses/advance/symptoms/bones.dm
similarity index 94%
rename from code/datums/diseases/advance/symptoms/bones.dm
rename to code/datums/diseases/viruses/advance/symptoms/bones.dm
index 83de1b8c5ee..b5186c34a9f 100644
--- a/code/datums/diseases/advance/symptoms/bones.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/bones.dm
@@ -20,7 +20,7 @@ Fragile Bones Syndrome
var/fragile_bones_chance = 3
var/done = FALSE
-/datum/symptom/bones/Activate(datum/disease/advance/A)
+/datum/symptom/bones/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/carbon/human/M = A.affected_mob
if(prob(SYMPTOM_ACTIVATION_PROB * 4))
@@ -62,7 +62,7 @@ Fragile Bones Syndrome
return
-/datum/symptom/bones/End(datum/disease/advance/A)
+/datum/symptom/bones/End(datum/disease/virus/advance/A)
var/mob/living/carbon/human/M = A.affected_mob
M.dna.species.bonefragility /= bonefragility_multiplier
M.dna.species.fragile_bones_chance -= fragile_bones_chance
diff --git a/code/datums/diseases/advance/symptoms/booze.dm b/code/datums/diseases/viruses/advance/symptoms/booze.dm
similarity index 74%
rename from code/datums/diseases/advance/symptoms/booze.dm
rename to code/datums/diseases/viruses/advance/symptoms/booze.dm
index 93111d5e76a..d7542908eb4 100644
--- a/code/datums/diseases/advance/symptoms/booze.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/booze.dm
@@ -24,7 +24,7 @@ Bonus
transmittable = -2
level = 3
-/datum/symptom/booze/Activate(datum/disease/advance/A)
+/datum/symptom/booze/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 2))
var/mob/living/M = A.affected_mob
@@ -33,5 +33,5 @@ Bonus
M.reagents.add_reagent(pick("rum", "vodka", "whiskey", "ale", "cider", "mead", "tequila", "wine", "beer"), 5) //somewhat safe drinks
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
- to_chat(M, "[pick("You feel warmth.", "You feel joyful.", "You relax for a moment")]") //span class notice because this is a drunkeness. Epic mind games ensues
+ to_chat(M, span_notice(pick("You feel warmth.", "You feel joyful.", "You relax for a moment"))) //span class notice because this is a drunkeness. Epic mind games ensues
return
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/viruses/advance/symptoms/choking.dm
similarity index 64%
rename from code/datums/diseases/advance/symptoms/choking.dm
rename to code/datums/diseases/viruses/advance/symptoms/choking.dm
index ab5bfbb0358..2dcb01e9c0d 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/choking.dm
@@ -26,29 +26,29 @@ Bonus
level = 3
severity = 3
-/datum/symptom/choking/Activate(datum/disease/advance/A)
+/datum/symptom/choking/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
- to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]")
+ to_chat(M, span_warning(pick("You're having difficulty breathing.", "Your breathing becomes heavy.")))
if(3, 4)
- to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")
+ to_chat(M, span_warning("[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]"))
Choke_stage_3_4(M, A)
M.emote("gasp")
else
- to_chat(M, "[pick("You're choking!", "You can't breathe!")]")
+ to_chat(M, span_userdanger(pick("You're choking!", "You can't breathe!")))
Choke(M, A)
M.emote("gasp")
return
-/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
+/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/virus/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)
+/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/virus/advance/A)
var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5)
M.adjustOxyLoss(get_damage)
return 1
diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/viruses/advance/symptoms/confusion.dm
similarity index 74%
rename from code/datums/diseases/advance/symptoms/confusion.dm
rename to code/datums/diseases/viruses/advance/symptoms/confusion.dm
index 3d7fd4dd5b6..d0f430f3cba 100644
--- a/code/datums/diseases/advance/symptoms/confusion.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/confusion.dm
@@ -27,16 +27,16 @@ Bonus
severity = 2
-/datum/symptom/confusion/Activate(datum/disease/advance/A)
+/datum/symptom/confusion/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
if(prob(SYMPTOM_ACTIVATION_PROB))
- to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]")
+ to_chat(M, span_warning(pick("Your head hurts.", "Your mind blanks for a moment.")))
else
if(prob(SYMPTOM_ACTIVATION_PROB * 3))
- to_chat(M, "You can't think straight!")
+ to_chat(M, span_userdanger("You can't think straight!"))
M.AdjustConfused(20 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS)
M.Disoriented(1)
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/viruses/advance/symptoms/cough.dm
similarity index 79%
rename from code/datums/diseases/advance/symptoms/cough.dm
rename to code/datums/diseases/viruses/advance/symptoms/cough.dm
index d9a0e3b008b..d6c24d72008 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/cough.dm
@@ -26,13 +26,13 @@ BONUS
level = 1
severity = 1
-/datum/symptom/cough/Activate(datum/disease/advance/A)
+/datum/symptom/cough/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
- to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]")
+ to_chat(M, span_notice(pick("You swallow excess mucus.", "You lightly cough.")))
else
M.emote("cough")
var/obj/item/I = M.get_active_hand()
diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm
similarity index 90%
rename from code/datums/diseases/advance/symptoms/damage_converter.dm
rename to code/datums/diseases/viruses/advance/symptoms/damage_converter.dm
index 94826f4cbde..cf713948ffe 100644
--- a/code/datums/diseases/advance/symptoms/damage_converter.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm
@@ -25,7 +25,7 @@ Bonus
transmittable = -2
level = 4
-/datum/symptom/damage_converter/Activate(datum/disease/advance/A)
+/datum/symptom/damage_converter/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
@@ -48,10 +48,9 @@ Bonus
var/healed = 0
for(var/obj/item/organ/external/E in parts)
healed += min(E.brute_dam, get_damage) + min(E.burn_dam, get_damage)
- E.heal_damage(get_damage, get_damage, 0, 0)
+ E.heal_damage(get_damage, get_damage, updating_health = TRUE)
M.adjustToxLoss(healed)
-
else
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
M.adjustFireLoss(-get_damage)
diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/viruses/advance/symptoms/deafness.dm
similarity index 65%
rename from code/datums/diseases/advance/symptoms/deafness.dm
rename to code/datums/diseases/viruses/advance/symptoms/deafness.dm
index 7d9184ec7b9..381fe5a9be3 100644
--- a/code/datums/diseases/advance/symptoms/deafness.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/deafness.dm
@@ -26,19 +26,19 @@ Bonus
level = 4
severity = 3
-/datum/symptom/deafness/Activate(datum/disease/advance/A)
+/datum/symptom/deafness/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(3, 4)
- to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]")
+ to_chat(M, span_warning(pick("You hear a ringing in your ear.", "Your ears pop.")))
if(5)
if(!(DEAF in M.mutations))
- to_chat(M, "Your ears pop and begin ringing loudly!")
+ to_chat(M, span_userdanger("Your ears pop and begin ringing loudly!"))
M.BecomeDeaf()
spawn(200)
if(M)
- to_chat(M, "The ringing in your ears fades...")
+ to_chat(M, span_warning("The ringing in your ears fades..."))
M.CureDeaf()
return
diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/viruses/advance/symptoms/dizzy.dm
similarity index 64%
rename from code/datums/diseases/advance/symptoms/dizzy.dm
rename to code/datums/diseases/viruses/advance/symptoms/dizzy.dm
index 730e2a8591a..70bcf6d340a 100644
--- a/code/datums/diseases/advance/symptoms/dizzy.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/dizzy.dm
@@ -26,14 +26,14 @@ Bonus
level = 4
severity = 2
-/datum/symptom/dizzy/Activate(datum/disease/advance/A)
+/datum/symptom/dizzy/Activate(datum/disease/virus/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
+ if(prob(SYMPTOM_ACTIVATION_PROB*5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
- to_chat(M, "[pick("You feel dizzy.", "Your head spins.")]")
+ to_chat(M, span_warning(pick("You feel dizzy.", "Your head spins.")))
else
- to_chat(M, "A wave of dizziness washes over you!")
- M.Dizzy(10 SECONDS)
+ to_chat(M, span_userdanger("A wave of dizziness washes over you!"))
+ M.Dizzy(15 SECONDS)
return
diff --git a/code/datums/diseases/advance/symptoms/epinephrine.dm b/code/datums/diseases/viruses/advance/symptoms/epinephrine.dm
similarity index 83%
rename from code/datums/diseases/advance/symptoms/epinephrine.dm
rename to code/datums/diseases/viruses/advance/symptoms/epinephrine.dm
index e1dd2822f76..18389cc3407 100644
--- a/code/datums/diseases/advance/symptoms/epinephrine.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/epinephrine.dm
@@ -24,14 +24,14 @@ Bonus
transmittable = -2
level = 5
-/datum/symptom/epinephrine/Activate(datum/disease/advance/A)
+/datum/symptom/epinephrine/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/M = A.affected_mob
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
switch(A.stage)
if(5)
if(prob(10))
- to_chat(M, "[pick("Your body feels tough.", "You are feeling on edge.")]")
+ to_chat(M, span_notice(pick("Your body feels tough.", "You are feeling on edge.")))
if(A.stage > 4 && M.health <= HEALTH_THRESHOLD_CRIT)
M.reagents.add_reagent("epinephrine", 0.5)
if(M.reagents.get_reagent_amount("epinephrine") > 20)
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/viruses/advance/symptoms/fever.dm
similarity index 76%
rename from code/datums/diseases/advance/symptoms/fever.dm
rename to code/datums/diseases/viruses/advance/symptoms/fever.dm
index 9d29d237693..cd097eadb6c 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/fever.dm
@@ -26,17 +26,17 @@ Bonus
level = 2
severity = 2
-/datum/symptom/fever/Activate(datum/disease/advance/A)
+/datum/symptom/fever/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
- to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]")
+ to_chat(M, span_warning(pick("You feel hot.", "You feel like you're burning.")))
if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT)
Heat(M, A)
return
-/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
+/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/virus/advance/A)
var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return 1
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/viruses/advance/symptoms/fire.dm
similarity index 75%
rename from code/datums/diseases/advance/symptoms/fire.dm
rename to code/datums/diseases/viruses/advance/symptoms/fire.dm
index 2f79cc55a46..9b443be6ae9 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/fire.dm
@@ -26,32 +26,32 @@ Bonus
level = 6
severity = 5
-/datum/symptom/fire/Activate(datum/disease/advance/A)
+/datum/symptom/fire/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(3)
- to_chat(M, "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]")
+ to_chat(M, span_warning(pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")))
if(4)
Firestacks_stage_4(M, A)
M.IgniteMob()
- to_chat(M, "Your skin bursts into flames!")
+ to_chat(M, span_userdanger("Your skin bursts into flames!"))
M.emote("scream")
if(5)
Firestacks_stage_5(M, A)
M.IgniteMob()
- to_chat(M, "Your skin erupts into an inferno!")
+ to_chat(M, span_userdanger("Your skin erupts into an inferno!"))
M.emote("scream")
return
-/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
+/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/virus/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_stage_5(mob/living/M, datum/disease/advance/A)
+/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/virus/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)
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm
similarity index 66%
rename from code/datums/diseases/advance/symptoms/flesh_eating.dm
rename to code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm
index 1cef07340b9..e85aa1b8bc9 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm
@@ -26,19 +26,19 @@ Bonus
level = 6
severity = 5
-/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
+/datum/symptom/flesh_eating/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(2,3)
- to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]")
+ to_chat(M, span_warning(pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")))
if(4,5)
- to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]")
+ to_chat(M, span_userdanger(pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")))
Flesheat(M, A)
return
-/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
+/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/virus/advance/A)
var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
return 1
diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/viruses/advance/symptoms/hallucigen.dm
similarity index 52%
rename from code/datums/diseases/advance/symptoms/hallucigen.dm
rename to code/datums/diseases/viruses/advance/symptoms/hallucigen.dm
index 4bd438a7258..c98767a4c7e 100644
--- a/code/datums/diseases/advance/symptoms/hallucigen.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/hallucigen.dm
@@ -26,17 +26,17 @@ Bonus
level = 5
severity = 3
-/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
+/datum/symptom/hallucigen/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2)
- to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]")
+ to_chat(M, span_warning(pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")))
if(3, 4)
- to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]")
+ to_chat(M, span_warning("[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]"))
else
- to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]")
+ to_chat(M, span_userdanger(pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")))
M.AdjustHallucinate(5 SECONDS)
M.last_hallucinator_log = name
diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/viruses/advance/symptoms/headache.dm
similarity index 75%
rename from code/datums/diseases/advance/symptoms/headache.dm
rename to code/datums/diseases/viruses/advance/symptoms/headache.dm
index 0cf33f93797..95e641686c1 100644
--- a/code/datums/diseases/advance/symptoms/headache.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/headache.dm
@@ -27,9 +27,9 @@ BONUS
level = 1
severity = 1
-/datum/symptom/headache/Activate(datum/disease/advance/A)
+/datum/symptom/headache/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
- to_chat(M, "[pick("Your head hurts.", "Your head starts pounding.")]")
+ to_chat(M, span_warning(pick("Your head hurts.", "Your head starts pounding.")))
return
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/viruses/advance/symptoms/heal.dm
similarity index 60%
rename from code/datums/diseases/advance/symptoms/heal.dm
rename to code/datums/diseases/viruses/advance/symptoms/heal.dm
index 62df49f4f2c..b23f5df519d 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/heal.dm
@@ -25,7 +25,7 @@ Bonus
transmittable = -4
level = 6
-/datum/symptom/heal/Activate(datum/disease/advance/A)
+/datum/symptom/heal/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
@@ -34,7 +34,7 @@ Bonus
Heal(M, A)
return
-/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
+/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/virus/advance/A)
var/get_damage = (sqrtor0(20+A.totalStageSpeed())*(1+rand()))
M.adjustToxLoss(-get_damage)
return 1
@@ -67,9 +67,9 @@ Bonus
level = 3
var/list/cured_diseases = list()
-/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A)
+/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/virus/advance/A)
var/cured = 0
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
if(D.virus_heal_resistant)
continue
@@ -78,9 +78,9 @@ Bonus
cured_diseases += D.GetDiseaseID()
D.cure()
if(cured)
- to_chat(M, "You feel much better.")
+ to_chat(M, span_notice("You feel much better."))
-/datum/symptom/heal/metabolism/End(datum/disease/advance/A)
+/datum/symptom/heal/metabolism/End(datum/disease/virus/advance/A)
// Remove all the diseases we cured.
var/mob/living/M = A.affected_mob
if(istype(M))
@@ -88,7 +88,7 @@ Bonus
for(var/res in M.resistances)
if(res in cured_diseases)
M.resistances -= res
- to_chat(M, "You feel weaker.")
+ to_chat(M, span_warning("You feel weaker."))
/*
//////////////////////////////////////
@@ -118,47 +118,10 @@ Bonus
level = 3
var/longevity = 30
-/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/advance/A)
+/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/virus/advance/A)
longevity -= 1
if(!longevity)
A.cure()
-/datum/symptom/heal/longevity/Start(datum/disease/advance/A)
+/datum/symptom/heal/longevity/Start(datum/disease/virus/advance/A)
longevity = rand(initial(longevity) - 5, initial(longevity) + 5)
-
-/*
-/*
-//////////////////////////////////////
-
- DNA Restoration
-
- Not well hidden.
- Lowers resistance minorly.
- Does not affect stage speed.
- Decreases transmittablity greatly.
- Very high level.
-
-Bonus
- Heals brain damage, treats radiation, cleans SE of non-power mutations.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/heal/dna
-
- name = "Deoxyribonucleic Acid Restoration"
- stealth = -1
- resistance = -1
- stage_speed = 0
- transmittable = -3
- level = 5
-
-/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/amt_healed = (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand()))
- M.adjustBrainLoss(-amt_healed)
- //Non-power mutations, excluding race, so the virus does not force monkey -> human transformations.
- var/list/unclean_mutations = (not_good_mutations|bad_mutations) - mutations_list[RACEMUT]
- M.dna.remove_mutation_group(unclean_mutations)
- M.radiation = max(M.radiation - 3, 0)
- return 1
-*/
diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/viruses/advance/symptoms/itching.dm
similarity index 76%
rename from code/datums/diseases/advance/symptoms/itching.dm
rename to code/datums/diseases/viruses/advance/symptoms/itching.dm
index 74f95fa91f0..bc6cc11ffad 100644
--- a/code/datums/diseases/advance/symptoms/itching.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/itching.dm
@@ -27,9 +27,9 @@ BONUS
level = 1
severity = 1
-/datum/symptom/itching/Activate(datum/disease/advance/A)
+/datum/symptom/itching/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
- to_chat(M, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.")
+ to_chat(M, span_warning("Your [pick("back", "arm", "leg", "elbow", "head")] itches."))
return
diff --git a/code/datums/diseases/advance/symptoms/laugh.dm b/code/datums/diseases/viruses/advance/symptoms/laugh.dm
similarity index 92%
rename from code/datums/diseases/advance/symptoms/laugh.dm
rename to code/datums/diseases/viruses/advance/symptoms/laugh.dm
index 8da9ebc416d..c3a878ba7ac 100644
--- a/code/datums/diseases/advance/symptoms/laugh.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/laugh.dm
@@ -17,7 +17,7 @@ Uncontrolled Laughter Effect
level = 2
severity = 1
-/datum/symptom/laugh/Activate(datum/disease/advance/A)
+/datum/symptom/laugh/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 2))
var/mob/living/M = A.affected_mob
diff --git a/code/datums/diseases/advance/symptoms/limb_throw.dm b/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm
similarity index 76%
rename from code/datums/diseases/advance/symptoms/limb_throw.dm
rename to code/datums/diseases/viruses/advance/symptoms/limb_throw.dm
index 41723cb0785..5a56fd0dde3 100644
--- a/code/datums/diseases/advance/symptoms/limb_throw.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm
@@ -18,13 +18,13 @@ Limb Rejection
severity = 4
var/spell_learned = FALSE
-/datum/symptom/limb_throw/Activate(datum/disease/advance/A)
+/datum/symptom/limb_throw/Activate(datum/disease/virus/advance/A)
if(!spell_learned && A.stage >= 4)
A.affected_mob.mind?.AddSpell(new /obj/effect/proc_holder/spell/limb_throw)
spell_learned = TRUE
return
-/datum/symptom/limb_throw/End(datum/disease/advance/A)
+/datum/symptom/limb_throw/End(datum/disease/virus/advance/A)
A.affected_mob.mind?.RemoveSpell(/obj/effect/proc_holder/spell/limb_throw)
spell_learned = FALSE
return
@@ -38,8 +38,8 @@ Limb Rejection
need_active_overlay = TRUE
invocation = ""
- selection_activated_message = "Your prepare to throw a limb!! Left-click to cast at a target!"
- selection_deactivated_message = "You decided not to throw a limb...for now."
+ selection_activated_message = span_notice("Your prepare to throw a limb!! Left-click to cast at a target!")
+ selection_deactivated_message = span_notice("You decided not to throw a limb...for now.")
action_icon_state = "limb_throw"
action_background_icon_state = "bg_changeling"
@@ -62,16 +62,16 @@ Limb Rejection
var/obj/item/organ/external/limb = H.bodyparts_by_name[H.zone_selected]
if(!istype(limb))
- to_chat(H, "You don't have the selected body part!")
+ to_chat(H, span_alert("You don't have the selected body part!"))
return FALSE
if(limb.vital)
- to_chat(H, "You still need [limb]!")
+ to_chat(H, span_alert("You still need [limb]!"))
return FALSE
for(var/obj/item/organ/internal/organ in limb.internal_organs)
if(organ.vital)
- to_chat(H, "You still need [organ]!")
+ to_chat(H, span_alert("You still need [organ]!"))
return FALSE
var/obj/item/projectile/limb/limb_projectile = new(user.loc, limb)
diff --git a/code/datums/diseases/advance/symptoms/love.dm b/code/datums/diseases/viruses/advance/symptoms/love.dm
similarity index 93%
rename from code/datums/diseases/advance/symptoms/love.dm
rename to code/datums/diseases/viruses/advance/symptoms/love.dm
index 1913cf8aa42..ff03537bf6c 100644
--- a/code/datums/diseases/advance/symptoms/love.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/love.dm
@@ -17,7 +17,7 @@ Pacifist Syndrome
level = 3
severity = 0
-/datum/symptom/love/Activate(datum/disease/advance/A)
+/datum/symptom/love/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/M = A.affected_mob
if(prob(SYMPTOM_ACTIVATION_PROB * 3))
diff --git a/code/datums/diseases/advance/symptoms/moan.dm b/code/datums/diseases/viruses/advance/symptoms/moan.dm
similarity index 78%
rename from code/datums/diseases/advance/symptoms/moan.dm
rename to code/datums/diseases/viruses/advance/symptoms/moan.dm
index c84a0413cae..f4439b4826b 100644
--- a/code/datums/diseases/advance/symptoms/moan.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/moan.dm
@@ -17,7 +17,7 @@ Groaning Syndrome
level = 2
severity = 1
-/datum/symptom/moan/Activate(datum/disease/advance/A)
+/datum/symptom/moan/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 2))
var/mob/living/M = A.affected_mob
@@ -25,9 +25,14 @@ Groaning Syndrome
if(1, 2, 3)
to_chat(M, span_notice("Your muscles spasm, making you want to moan"))
else
- M.emote("moan")
+ if(prob(50))
+ M.emote("moan")
+ else
+ M.say(pick("Ммм...", "Ах...", "Ох..."))
+
if(prob(1))
M.emote("blush")
+
var/obj/item/I = M.get_active_hand()
if(I && I.w_class == 1)
M.drop_from_active_hand()
diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/viruses/advance/symptoms/oxygen.dm
similarity index 76%
rename from code/datums/diseases/advance/symptoms/oxygen.dm
rename to code/datums/diseases/viruses/advance/symptoms/oxygen.dm
index 371b55c7664..a8d26de3e53 100644
--- a/code/datums/diseases/advance/symptoms/oxygen.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/oxygen.dm
@@ -25,7 +25,7 @@ Bonus
transmittable = -4
level = 6
-/datum/symptom/oxygen/Activate(datum/disease/advance/A)
+/datum/symptom/oxygen/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
@@ -35,5 +35,5 @@ Bonus
M.reagents.add_reagent("salbutamol", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
- to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")
+ to_chat(M, span_notice(pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")))
return
diff --git a/code/datums/diseases/advance/symptoms/painkiller.dm b/code/datums/diseases/viruses/advance/symptoms/painkiller.dm
similarity index 67%
rename from code/datums/diseases/advance/symptoms/painkiller.dm
rename to code/datums/diseases/viruses/advance/symptoms/painkiller.dm
index 53c5f4934ed..5c152d1b6b9 100644
--- a/code/datums/diseases/advance/symptoms/painkiller.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/painkiller.dm
@@ -24,7 +24,7 @@ Bonus
transmittable = -2
level = 6
-/datum/symptom/painkiller/Activate(datum/disease/advance/A)
+/datum/symptom/painkiller/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/M = A.affected_mob
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
@@ -34,10 +34,10 @@ Bonus
if(2, 3)
M.Slowed(40 SECONDS)
M.Confused(80 SECONDS)
- to_chat(M, "[pick("Something feels very wrong about your body.", "You have hard time controlling own body", "You can't feel your body.")]")
+ to_chat(M, span_danger(pick("Something feels very wrong about your body.", "You have hard time controlling own body", "You can't feel your body.")))
if(4, 5)
if(prob(10))
- to_chat(M, "[pick("Your body feels numb.", "You realize you feel nothing.", "You can't feel your body.")]")
+ to_chat(M, span_notice(pick("Your body feels numb.", "You realize you feel nothing.", "You can't feel your body.")))
if(M.reagents.get_reagent_amount("hydrocodone") < 2 && M.getToxLoss() < 13 && A.stage > 4)
M.reagents.add_reagent("hydrocodone", 0.5)
return
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/viruses/advance/symptoms/sensory.dm
similarity index 81%
rename from code/datums/diseases/advance/symptoms/sensory.dm
rename to code/datums/diseases/viruses/advance/symptoms/sensory.dm
index 34ea5dd59d1..699f91a85f8 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/sensory.dm
@@ -25,7 +25,7 @@ Bonus
level = 5
severity = 0
-/datum/symptom/mind_restoration/Activate(datum/disease/advance/A)
+/datum/symptom/mind_restoration/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 3))
var/mob/living/M = A.affected_mob
@@ -54,7 +54,7 @@ Bonus
transmittable = -4
level = 4
-/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A)
+/datum/symptom/sensory_restoration/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
@@ -64,4 +64,4 @@ Bonus
M.reagents.add_reagent("oculine", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
- to_chat(M, "[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.")]")
+ to_chat(M, span_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.")))
diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/viruses/advance/symptoms/shedding.dm
similarity index 75%
rename from code/datums/diseases/advance/symptoms/shedding.dm
rename to code/datums/diseases/viruses/advance/symptoms/shedding.dm
index 6586b267355..eadaab577b8 100644
--- a/code/datums/diseases/advance/symptoms/shedding.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/shedding.dm
@@ -25,24 +25,24 @@ BONUS
level = 4
severity = 1
-/datum/symptom/shedding/Activate(datum/disease/advance/A)
+/datum/symptom/shedding/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
- to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]")
+ to_chat(M, span_warning(pick("Your scalp itches.", "Your skin feels flakey.")))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
switch(A.stage)
if(3, 4)
if(!(head_organ.h_style == "Bald") && !(head_organ.h_style == "Balding Hair"))
- to_chat(H, "Your hair starts to fall out in clumps...")
+ to_chat(H, span_warning("Your hair starts to fall out in clumps..."))
spawn(50)
head_organ.h_style = "Balding Hair"
H.update_hair()
if(5)
if(!(head_organ.f_style == "Shaved") || !(head_organ.h_style == "Bald"))
- to_chat(H, "Your hair starts to fall out in clumps...")
+ to_chat(H, span_warning("Your hair starts to fall out in clumps..."))
spawn(50)
head_organ.f_style = "Shaved"
head_organ.h_style = "Bald"
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/viruses/advance/symptoms/shivering.dm
similarity index 83%
rename from code/datums/diseases/advance/symptoms/shivering.dm
rename to code/datums/diseases/viruses/advance/symptoms/shivering.dm
index 1fcc586897b..1c2d8ace7af 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/shivering.dm
@@ -26,16 +26,16 @@ Bonus
level = 2
severity = 2
-/datum/symptom/shivering/Activate(datum/disease/advance/A)
+/datum/symptom/shivering/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
- to_chat(M, "[pick("You feel cold.", "You start shivering.")]")
+ to_chat(M, span_warning(pick("You feel cold.", "You start shivering.")))
if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT)
Chill(M, A)
return
-/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
+/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/virus/advance/A)
var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/viruses/advance/symptoms/skin.dm
similarity index 77%
rename from code/datums/diseases/advance/symptoms/skin.dm
rename to code/datums/diseases/viruses/advance/symptoms/skin.dm
index b24ce2cc5a1..da589365b70 100644
--- a/code/datums/diseases/advance/symptoms/skin.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/skin.dm
@@ -25,7 +25,7 @@ BONUS
level = 4
severity = 1
-/datum/symptom/vitiligo/Activate(datum/disease/advance/A)
+/datum/symptom/vitiligo/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
@@ -38,7 +38,7 @@ BONUS
H.s_tone = -85
H.update_body()
else
- H.visible_message("[H] looks a bit pale...", "Your skin suddenly appears lighter...")
+ H.visible_message(span_warning("[H] looks a bit pale..."), span_notice("Your skin suddenly appears lighter..."))
return
@@ -70,7 +70,7 @@ BONUS
level = 4
severity = 1
-/datum/symptom/revitiligo/Activate(datum/disease/advance/A)
+/datum/symptom/revitiligo/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
@@ -83,6 +83,6 @@ BONUS
H.s_tone = 85
H.update_body()
else
- H.visible_message("[H] looks a bit dark...", "Your skin suddenly appears darker...")
+ H.visible_message(span_warning("[H] looks a bit dark..."), span_warning("Your skin suddenly appears darker..."))
return
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/viruses/advance/symptoms/sneeze.dm
similarity index 90%
rename from code/datums/diseases/advance/symptoms/sneeze.dm
rename to code/datums/diseases/viruses/advance/symptoms/sneeze.dm
index 71acf2faab5..a7030ed9a3c 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/sneeze.dm
@@ -27,7 +27,7 @@ Bonus
level = 1
severity = 1
-/datum/symptom/sneeze/Activate(datum/disease/advance/A)
+/datum/symptom/sneeze/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/viruses/advance/symptoms/symptoms.dm
similarity index 82%
rename from code/datums/diseases/advance/symptoms/symptoms.dm
rename to code/datums/diseases/viruses/advance/symptoms/symptoms.dm
index dc8023310ad..253f2b8956a 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/symptoms.dm
@@ -18,13 +18,13 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
var/id = ""
// Called when processing of the advance disease, which holds this symptom, starts.
-/datum/symptom/proc/Start(datum/disease/advance/A)
+/datum/symptom/proc/Start(datum/disease/virus/advance/A)
return
// Called when the advance disease is going to be deleted or when the advance disease stops processing.
-/datum/symptom/proc/End(datum/disease/advance/A)
+/datum/symptom/proc/End(datum/disease/virus/advance/A)
return
-/datum/symptom/proc/Activate(datum/disease/advance/A)
+/datum/symptom/proc/Activate(datum/disease/virus/advance/A)
return
diff --git a/code/datums/diseases/advance/symptoms/toxification.dm b/code/datums/diseases/viruses/advance/symptoms/toxification.dm
similarity index 86%
rename from code/datums/diseases/advance/symptoms/toxification.dm
rename to code/datums/diseases/viruses/advance/symptoms/toxification.dm
index de92181056c..0c1d0116189 100644
--- a/code/datums/diseases/advance/symptoms/toxification.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/toxification.dm
@@ -18,13 +18,13 @@ Toxification syndrome
severity = 5
var/germs_multiplier = 1
-/datum/symptom/infection/Start(datum/disease/advance/A)
+/datum/symptom/infection/Start(datum/disease/virus/advance/A)
var/mob/living/carbon/human/H = A.affected_mob
if(istype(H))
germs_multiplier = 6 + sqrtor0(25 + A.totalTransmittable()) //~~10 on average
H.dna.species.germs_growth_rate *= germs_multiplier
-/datum/symptom/infection/Activate(datum/disease/advance/A)
+/datum/symptom/infection/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/carbon/human/M = A.affected_mob
@@ -44,7 +44,7 @@ Toxification syndrome
O.germ_level = INFECTION_LEVEL_ONE
return
-/datum/symptom/infection/End(datum/disease/advance/A)
+/datum/symptom/infection/End(datum/disease/virus/advance/A)
var/mob/living/carbon/human/H = A.affected_mob
if(germs_multiplier)
H.dna.species.germs_growth_rate /= germs_multiplier
diff --git a/code/datums/diseases/advance/symptoms/uncotrollable.dm b/code/datums/diseases/viruses/advance/symptoms/uncotrollable.dm
similarity index 97%
rename from code/datums/diseases/advance/symptoms/uncotrollable.dm
rename to code/datums/diseases/viruses/advance/symptoms/uncotrollable.dm
index 8dc9e283d4e..68bb45c6501 100644
--- a/code/datums/diseases/advance/symptoms/uncotrollable.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/uncotrollable.dm
@@ -17,7 +17,7 @@ Uncontrollable Aggression
level = 6
severity = 4
-/datum/symptom/aggression/Activate(datum/disease/advance/A)
+/datum/symptom/aggression/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/carbon/human/aggressor = A.affected_mob
if(!istype(aggressor))
@@ -116,7 +116,7 @@ Uncontrollable Actions
level = 6
severity = 4
-/datum/symptom/obsession/Activate(datum/disease/advance/A)
+/datum/symptom/obsession/Activate(datum/disease/virus/advance/A)
..()
var/mob/living/carbon/human/possesed = A.affected_mob
if(!istype(possesed))
diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/viruses/advance/symptoms/viral.dm
similarity index 68%
rename from code/datums/diseases/advance/symptoms/viral.dm
rename to code/datums/diseases/viruses/advance/symptoms/viral.dm
index 082b726ea4f..d2e59e2c953 100644
--- a/code/datums/diseases/advance/symptoms/viral.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/viral.dm
@@ -22,15 +22,15 @@ BONUS
transmittable = 0
level = 3
-/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
+/datum/symptom/viraladaptation/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
- to_chat(M, "You feel off, but no different from before.")
+ to_chat(M, span_notice("You feel off, but no different from before."))
if(5)
- to_chat(M, "You feel better, but nothing interesting happens.")
+ to_chat(M, span_notice("You feel better, but nothing interesting happens."))
/*
//////////////////////////////////////
@@ -56,12 +56,12 @@ BONUS
transmittable = 3
level = 3
-/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
+/datum/symptom/viraladaptation/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
- to_chat(M, "You feel better, but no different from before.")
+ to_chat(M, span_notice("You feel better, but no different from before."))
if(5)
- to_chat(M, "You feel off, but nothing interesting happens.")
+ to_chat(M, span_notice("You feel off, but nothing interesting happens."))
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/viruses/advance/symptoms/vision.dm
similarity index 75%
rename from code/datums/diseases/advance/symptoms/vision.dm
rename to code/datums/diseases/viruses/advance/symptoms/vision.dm
index 6e58faf5837..9f7f329d39d 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/vision.dm
@@ -26,7 +26,7 @@ Bonus
level = 5
severity = 4
-/datum/symptom/visionloss/Activate(datum/disease/advance/A)
+/datum/symptom/visionloss/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
@@ -35,13 +35,13 @@ Bonus
return
switch(A.stage)
if(1, 2)
- to_chat(M, "Your eyes itch.")
+ to_chat(M, span_warning("Your eyes itch."))
if(3, 4)
- to_chat(M, "Your eyes burn!")
+ to_chat(M, span_warning("Your eyes burn!"))
M.EyeBlurry(40 SECONDS)
eyes.receive_damage(1)
else
- to_chat(M, "Your eyes burn horrificly!")
+ to_chat(M, span_userdanger("Your eyes burn horrificly!"))
M.EyeBlurry(60 SECONDS)
eyes.receive_damage(5)
if(eyes.damage >= 10)
@@ -50,4 +50,4 @@ Bonus
if(!(BLINDNESS in M.mutations))
M.mutations |= BLINDNESS
M.update_blind_effects()
- to_chat(M, "You go blind!")
+ to_chat(M, span_userdanger("You go blind!"))
diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/viruses/advance/symptoms/voice_change.dm
similarity index 80%
rename from code/datums/diseases/advance/symptoms/voice_change.dm
rename to code/datums/diseases/viruses/advance/symptoms/voice_change.dm
index 202c00ef23f..54e0686956d 100644
--- a/code/datums/diseases/advance/symptoms/voice_change.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/voice_change.dm
@@ -26,14 +26,14 @@ Bonus
level = 6
severity = 2
-/datum/symptom/voice_change/Activate(datum/disease/advance/A)
+/datum/symptom/voice_change/Activate(datum/disease/virus/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, "[pick("Your throat hurts.", "You clear your throat.")]")
+ to_chat(M, span_warning(pick("Your throat hurts.", "You clear your throat.")))
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -42,7 +42,7 @@ Bonus
return
-/datum/symptom/voice_change/End(datum/disease/advance/A)
+/datum/symptom/voice_change/End(datum/disease/virus/advance/A)
..()
if(ishuman(A.affected_mob))
var/mob/living/carbon/human/H = A.affected_mob
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/viruses/advance/symptoms/vomit.dm
similarity index 91%
rename from code/datums/diseases/advance/symptoms/vomit.dm
rename to code/datums/diseases/viruses/advance/symptoms/vomit.dm
index 571bcb66e53..1387543d0fd 100644
--- a/code/datums/diseases/advance/symptoms/vomit.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/vomit.dm
@@ -30,13 +30,13 @@ Bonus
level = 3
severity = 4
-/datum/symptom/vomit/Activate(datum/disease/advance/A)
+/datum/symptom/vomit/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB / 2))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
- to_chat(M, "[pick("You feel nauseous.", "You feel like you're going to throw up!")]")
+ to_chat(M, span_warning(pick("You feel nauseous.", "You feel like you're going to throw up!")))
else
Vomit(M)
diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/viruses/advance/symptoms/weakness.dm
similarity index 54%
rename from code/datums/diseases/advance/symptoms/weakness.dm
rename to code/datums/diseases/viruses/advance/symptoms/weakness.dm
index 614aa38e0f9..9837694cdae 100644
--- a/code/datums/diseases/advance/symptoms/weakness.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/weakness.dm
@@ -26,20 +26,20 @@ Bonus
level = 3
severity = 3
-/datum/symptom/weakness/Activate(datum/disease/advance/A)
+/datum/symptom/weakness/Activate(datum/disease/virus/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
+ if(prob(SYMPTOM_ACTIVATION_PROB*2))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
- to_chat(M, "[pick("You feel weak.", "You feel lazy.")]")
+ to_chat(M, span_warning(pick("You feel weak.", "You feel lazy.")))
if(3, 4)
- to_chat(M, "[pick("You feel very frail.", "You think you might faint.")]")
+ to_chat(M, span_warning("[pick("You feel very frail.", "You think you might faint.")]"))
M.adjustStaminaLoss(15)
else
- to_chat(M, "[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]")
+ to_chat(M, span_userdanger(pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")))
M.adjustStaminaLoss(30)
if(M.getStaminaLoss() > 60 && !M.stat)
- M.visible_message("[M] faints!", "You swoon and faint...")
+ M.visible_message(span_warning("[M] faints!"), span_userdanger("You swoon and faint..."))
M.AdjustSleeping(10 SECONDS)
return
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/viruses/advance/symptoms/weight.dm
similarity index 67%
rename from code/datums/diseases/advance/symptoms/weight.dm
rename to code/datums/diseases/viruses/advance/symptoms/weight.dm
index 46a6c8f2162..2532c47deb9 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/weight.dm
@@ -27,14 +27,14 @@ Bonus
level = 3
severity = 1
-/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
+/datum/symptom/weight_loss/Activate(datum/disease/virus/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, "[pick("You feel hungry.", "You crave for food.")]")
+ to_chat(M, span_warning(pick("You feel hungry.", "You crave for food.")))
else
- to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]")
+ to_chat(M, span_warning("[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]"))
M.overeatduration = max(M.overeatduration - 100, 0)
M.adjust_nutrition(-100)
diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/viruses/advance/symptoms/youth.dm
similarity index 65%
rename from code/datums/diseases/advance/symptoms/youth.dm
rename to code/datums/diseases/viruses/advance/symptoms/youth.dm
index 81f88aa29cb..73b64657765 100644
--- a/code/datums/diseases/advance/symptoms/youth.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/youth.dm
@@ -25,7 +25,7 @@ BONUS
transmittable = -4
level = 5
-/datum/symptom/youth/Activate(datum/disease/advance/A)
+/datum/symptom/youth/Activate(datum/disease/virus/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 2))
var/mob/living/M = A.affected_mob
@@ -35,22 +35,22 @@ BONUS
if(1)
if(H.age > 41)
H.age = 41
- to_chat(H, "You haven't had this much energy in years!")
+ to_chat(H, span_notice("You haven't had this much energy in years!"))
if(2)
if(H.age > 36)
H.age = 36
- to_chat(H, "You're suddenly in a good mood.")
+ to_chat(H, span_notice("You're suddenly in a good mood."))
if(3)
if(H.age > 31)
H.age = 31
- to_chat(H, "You begin to feel more lithe.")
+ to_chat(H, span_notice("You begin to feel more lithe."))
if(4)
if(H.age > 26)
H.age = 26
- to_chat(H, "You feel reinvigorated.")
+ to_chat(H, span_notice("You feel reinvigorated."))
if(5)
if(H.age > 21)
H.age = 21
- to_chat(H, "You feel like you can take on the world!")
+ to_chat(H, span_notice("You feel like you can take on the world!"))
return
diff --git a/code/datums/diseases/viruses/anxiety.dm b/code/datums/diseases/viruses/anxiety.dm
new file mode 100644
index 00000000000..a910f0cfc60
--- /dev/null
+++ b/code/datums/diseases/viruses/anxiety.dm
@@ -0,0 +1,45 @@
+/datum/disease/virus/anxiety
+ name = "Severe Anxiety"
+ form = "Infection"
+ agent = "Excess Lepidopticides"
+ desc = "If left untreated subject will regurgitate butterflies."
+ max_stages = 4
+ spread_flags = CONTACT
+ cures = list("ethanol")
+ severity = MEDIUM
+ possible_mutations = list(/datum/disease/virus/beesease)
+
+/datum/disease/virus/anxiety/stage_act()
+ if(!..())
+ return FALSE
+ switch(stage)
+ if(2)
+ if(prob(5))
+ to_chat(affected_mob, span_notice("You feel anxious."))
+ if(prob(5))
+ affected_mob.AdjustJitter(5 SECONDS)
+ if(3)
+ if(prob(10))
+ to_chat(affected_mob, span_notice("Your stomach flutters."))
+ if(prob(5))
+ to_chat(affected_mob, span_notice("You feel panicky."))
+ if(prob(5))
+ to_chat(affected_mob, span_danger("You're overtaken with panic!"))
+ affected_mob.AdjustJitter(10 SECONDS, bound_upper = 20 SECONDS)
+ affected_mob.AdjustStuttering(10 SECONDS, bound_upper = 20 SECONDS)
+ if(4)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("You feel butterflies in your stomach."))
+ if(prob(5))
+ affected_mob.visible_message(span_danger("[affected_mob] stumbles around in a panic."), \
+ span_userdanger("You have a panic attack!"))
+ affected_mob.AdjustConfused(rand(6 SECONDS, 12 SECONDS), bound_upper = 20 SECONDS)
+ affected_mob.AdjustJitter(rand(20 SECONDS, 40 SECONDS), bound_upper = 50 SECONDS)
+ affected_mob.AdjustStuttering(rand(20 SECONDS, 40 SECONDS), bound_upper = 50 SECONDS)
+ if(prob(3))
+ affected_mob.visible_message(span_danger("[affected_mob] coughs up butterflies!"), \
+ span_userdanger("You cough up butterflies!"))
+ affected_mob.Stun(rand(5 SECONDS, 10 SECONDS))
+ new /mob/living/simple_animal/butterfly(affected_mob.loc)
+ new /mob/living/simple_animal/butterfly(affected_mob.loc)
+ return
diff --git a/code/datums/diseases/viruses/beesease.dm b/code/datums/diseases/viruses/beesease.dm
new file mode 100644
index 00000000000..a71351ea199
--- /dev/null
+++ b/code/datums/diseases/viruses/beesease.dm
@@ -0,0 +1,59 @@
+/datum/disease/virus/beesease
+ name = "Beesease"
+ form = "Infection"
+ agent = "Apidae Infection"
+ desc = "If left untreated subject will turn into a beehive."
+ max_stages = 4
+ stage_prob = 2
+ can_progress_in_dead = TRUE
+ discovery_threshold = 0.9
+ spread_flags = CONTACT
+ cures = list("sugar")
+ severity = DANGEROUS
+ possible_mutations = list(/datum/disease/virus/lycan)
+ var/bees_spawned = 0
+
+/datum/disease/virus/beesease/stage_act()
+ if(!..())
+ return FALSE
+ if(affected_mob.stat != DEAD)
+ switch(stage)
+ if(2)
+ if(prob(10))
+ to_chat(affected_mob, span_notice("You taste honey in your mouth."))
+ if(prob(1))
+ bee_stinging()
+ if(3)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("Your stomach rumbles."))
+ affected_mob.adjustBruteLoss(2)
+ if(prob(7))
+ bee_stinging()
+ if(4)
+ if(prob(10))
+ affected_mob.visible_message(span_danger("[affected_mob] buzzes."), \
+ span_userdanger("Your stomach buzzes violently!"))
+ if(prob(5))
+ to_chat(affected_mob, span_danger("You feel something moving in your throat."))
+ if(prob(12))
+ bee_stinging()
+
+ if(prob(5 * stage))
+ playsound(get_turf(affected_mob.loc), pick('sound/creatures/bee3.ogg', 'sound/creatures/bee4.ogg'), (stage*stage)*6.25, 1)
+
+ if(stage == max_stages && prob(3) && bees_spawned < 10)
+ affected_mob.visible_message(span_danger("Swarm of bees flies out of a [affected_mob]'s mouth!"),
+ span_userdanger("Swarm of bees flies out of your mouth!"))
+ affected_mob.adjustBruteLoss(3)
+ for(var/i = 0, i < 3, i++)
+ var/mob/living/simple_animal/hostile/poison/bees/new_bee = new(affected_mob.loc)
+ new_bee.beegent = new /datum/reagent/bee_venom_beesease
+
+ bees_spawned++
+
+/datum/disease/virus/beesease/proc/bee_stinging()
+ to_chat(affected_mob, span_danger("Your stomach stings painfully."))
+ affected_mob.Slowed(3 SECONDS, 10)
+ var/datum/reagent/bee_venom_beesease/R = new
+ R.volume = 5
+ affected_mob.reagents.add_reagent(R.id, R.volume)
diff --git a/code/datums/diseases/viruses/brainrot.dm b/code/datums/diseases/viruses/brainrot.dm
new file mode 100644
index 00000000000..efd3f76e1d9
--- /dev/null
+++ b/code/datums/diseases/viruses/brainrot.dm
@@ -0,0 +1,52 @@
+/datum/disease/virus/brainrot
+ name = "Brainrot"
+ agent = "Cryptococcus Cosmosis"
+ desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
+ max_stages = 4
+ spread_flags = CONTACT
+ cures = list("mannitol")
+ cure_prob = 15
+ required_organs = list(/obj/item/organ/internal/brain)
+ severity = DANGEROUS
+ mutation_reagents = list("mutagen", "neurotoxin2")
+ possible_mutations = list(/datum/disease/kuru, /datum/disease/virus/advance/preset/mind_restoration, /datum/disease/virus/transformation/jungle_fever)
+
+/datum/disease/virus/brainrot/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(2)
+ if(prob(3))
+ affected_mob.emote("blink")
+ if(prob(4))
+ affected_mob.emote("yawn")
+ if(prob(7))
+ to_chat(affected_mob, span_danger("You don't feel like yourself."))
+ if(prob(15) && affected_mob.getBrainLoss()<=98)
+ affected_mob.adjustBrainLoss(1)
+ if(3)
+ if(prob(5))
+ affected_mob.emote("stare")
+ if(prob(5))
+ affected_mob.emote("drool")
+ if(prob(7))
+ to_chat(affected_mob, span_danger("You don't feel like yourself."))
+ if(prob(25) && affected_mob.getBrainLoss()<=97)
+ affected_mob.adjustBrainLoss(2)
+ to_chat(affected_mob, span_danger("Your try to remember something important...but can't."))
+
+ if(4)
+ if(prob(7))
+ affected_mob.emote("stare")
+ if(prob(7))
+ affected_mob.emote("drool")
+ if(prob(30) && affected_mob.getBrainLoss()<=97)
+ affected_mob.adjustBrainLoss(2)
+ if(prob(30))
+ to_chat(affected_mob, span_danger("Strange buzzing fills your head, removing all thoughts."))
+ if(prob(4))
+ affected_mob.visible_message(span_warning("[affected_mob] suddenly collapses"), span_danger("You lose consciousness..."))
+ affected_mob.Paralyse(rand(10 SECONDS, 20 SECONDS))
+ if(prob(10))
+ affected_mob.AdjustStuttering(30 SECONDS, bound_upper = 30 SECONDS)
diff --git a/code/datums/diseases/viruses/cold.dm b/code/datums/diseases/viruses/cold.dm
new file mode 100644
index 00000000000..4501158108e
--- /dev/null
+++ b/code/datums/diseases/viruses/cold.dm
@@ -0,0 +1,49 @@
+/datum/disease/virus/cold
+ name = "The Cold"
+ agent = "XY-rhinovirus"
+ desc = "If left untreated the subject will contract the flu."
+ max_stages = 3
+ spread_flags = AIRBORNE
+ visibility_flags = HIDDEN_HUD
+ cure_text = "Rest & Spaceacillin"
+ cures = list("spaceacillin")
+ cure_prob = 30
+ permeability_mod = 0.5
+ severity = MINOR
+
+/datum/disease/virus/cold/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(2, 3)
+ if(prob(stage))
+ affected_mob.emote("sneeze")
+ if(prob(stage))
+ affected_mob.emote("cough")
+ if(prob(stage))
+ to_chat(affected_mob, span_danger("Your throat feels sore."))
+ if(prob(stage))
+ to_chat(affected_mob, span_danger("Mucous runs down the back of your throat."))
+ if(3)
+ if(prob(1) && prob(50))
+ if(!affected_mob.resistances.Find(/datum/disease/virus/flu))
+ var/datum/disease/virus/flu/Flu = new
+ Flu.Contract(affected_mob)
+ cure()
+
+/datum/disease/virus/cold/has_cure()
+ //if has spaceacillin
+ if(..())
+ if(affected_mob.IsSleeping())
+ return TRUE
+ if(affected_mob.lying)
+ return prob(33)
+ return prob(1)
+ //if not
+ else
+ if(affected_mob.IsSleeping())
+ return prob(20)
+ if(affected_mob.lying)
+ return prob(7)
+ return FALSE
diff --git a/code/datums/diseases/viruses/flu.dm b/code/datums/diseases/viruses/flu.dm
new file mode 100644
index 00000000000..3f1dc2f86e0
--- /dev/null
+++ b/code/datums/diseases/viruses/flu.dm
@@ -0,0 +1,47 @@
+/datum/disease/virus/flu
+ name = "The Flu"
+ agent = "H13N1 flu virion"
+ desc = "If left untreated the subject will feel quite unwell."
+ max_stages = 3
+ spread_flags = AIRBORNE
+ visibility_flags = HIDDEN_HUD
+ cure_text = "Rest & Spaceacillin"
+ cures = list("spaceacillin")
+ cure_prob = 30
+ permeability_mod = 0.75
+ severity = MEDIUM
+
+/datum/disease/virus/flu/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(2, 3)
+ if(prob(stage))
+ affected_mob.emote("sneeze")
+ if(prob(stage))
+ affected_mob.emote("cough")
+ if(prob(stage))
+ to_chat(affected_mob, span_danger("Your muscles ache"))
+ affected_mob.take_organ_damage(1)
+ if(prob(stage))
+ to_chat(affected_mob, span_danger("Your stomach hurts."))
+ affected_mob.adjustToxLoss(1)
+ return
+
+/datum/disease/virus/flu/has_cure()
+ //if has spaceacillin
+ if(..())
+ if(affected_mob.IsSleeping())
+ return TRUE
+ if(affected_mob.lying)
+ return prob(33)
+ return prob(1)
+ //if not
+ else
+ if(affected_mob.IsSleeping())
+ return prob(20)
+ if(affected_mob.lying)
+ return prob(7)
+ return FALSE
+
diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/viruses/fluspanish.dm
similarity index 55%
rename from code/datums/diseases/fluspanish.dm
rename to code/datums/diseases/viruses/fluspanish.dm
index b348934c7aa..a9ece081675 100644
--- a/code/datums/diseases/fluspanish.dm
+++ b/code/datums/diseases/viruses/fluspanish.dm
@@ -1,18 +1,19 @@
-/datum/disease/fluspanish
- name = "Spanish inquisition Flu"
+/datum/disease/virus/fluspanish
+ name = "Spanish Inquisition Flu"
+ agent = "1nqu1s1t10n flu virion"
+ desc = "If left untreated the subject will burn to death for being a heretic."
max_stages = 3
- spread_text = "Airborne"
+ spread_flags = AIRBORNE
cure_text = "Spaceacillin & Anti-bodies to the common flu"
cures = list("spaceacillin")
- cure_chance = 10
- agent = "1nqu1s1t10n flu virion"
- viable_mobtypes = list(/mob/living/carbon/human)
+ cure_prob = 10
permeability_mod = 0.75
- desc = "If left untreated the subject will burn to death for being a heretic."
severity = DANGEROUS
-/datum/disease/fluspanish/stage_act()
- ..()
+/datum/disease/virus/fluspanish/stage_act()
+ if(!..())
+ return FALSE
+
switch(stage)
if(2)
affected_mob.bodytemperature += 10
@@ -21,7 +22,7 @@
if(prob(5))
affected_mob.emote("cough")
if(prob(1))
- to_chat(affected_mob, "You're burning in your own skin!")
+ to_chat(affected_mob, span_danger("You're burning in your own skin!"))
affected_mob.take_organ_damage(0,5)
if(3)
@@ -31,6 +32,17 @@
if(prob(5))
affected_mob.emote("cough")
if(prob(5))
- to_chat(affected_mob, "You're burning in your own skin!")
+ to_chat(affected_mob, span_danger("You're burning in your own skin!"))
affected_mob.take_organ_damage(0,5)
return
+
+/datum/disease/virus/fluspanish/has_cure()
+ //if has spaceacillin
+ if(..())
+ if(affected_mob.resistances.Find(/datum/disease/virus/flu))
+ return TRUE
+ else
+ return prob(1)
+ //if not
+ else
+ return FALSE
diff --git a/code/datums/diseases/viruses/gbs.dm b/code/datums/diseases/viruses/gbs.dm
new file mode 100644
index 00000000000..6cd70b97350
--- /dev/null
+++ b/code/datums/diseases/viruses/gbs.dm
@@ -0,0 +1,69 @@
+/datum/disease/virus/gbs
+ name = "GBS"
+ agent = "Gravitokinetic Bipotential SADS+"
+ spread_flags = CONTACT
+ cures = list("diphenhydramine","sulfur")
+ cure_prob = 15
+ severity = BIOHAZARD
+
+/datum/disease/virus/gbs/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(2)
+ if(prob(45))
+ affected_mob.adjustToxLoss(5)
+ if(prob(1))
+ affected_mob.emote("sneeze")
+ if(3)
+ if(prob(5))
+ affected_mob.emote("cough")
+ else if(prob(5))
+ affected_mob.emote("gasp")
+ if(prob(10))
+ to_chat(affected_mob, span_danger("You're starting to feel very weak..."))
+ if(4)
+ if(prob(10))
+ affected_mob.emote("cough")
+ affected_mob.adjustToxLoss(5)
+ if(5)
+ to_chat(affected_mob, span_userdanger("Your body feels as if it's trying to rip itself open..."))
+ if(prob(50))
+ affected_mob.delayed_gib()
+
+/datum/disease/virus/gbs/non_con
+ name = "Non-Contagious GBS"
+ agent = "gibbis"
+ spread_flags = NON_CONTAGIOUS
+ cures = list("cryoxadone")
+ cure_prob = 10
+ can_immunity = FALSE
+
+/datum/disease/virus/fake_gbs
+ name = "GBS"
+ desc = "If left untreated death will occur."
+ agent = "Gravitokinetic Bipotential SADS-"
+ spread_flags = CONTACT
+ cures = list("diphenhydramine","sulfur")
+ cure_prob = 15
+ severity = BIOHAZARD
+
+/datum/disease/virus/fake_gbs/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(2)
+ if(prob(1))
+ affected_mob.emote("sneeze")
+ if(3)
+ if(prob(5))
+ affected_mob.emote("cough")
+ else if(prob(5))
+ affected_mob.emote("gasp")
+ if(prob(10))
+ to_chat(affected_mob, span_danger("You're starting to feel very weak..."))
+ if(4, 5)
+ if(prob(10))
+ affected_mob.emote("cough")
diff --git a/code/datums/diseases/viruses/kingstons.dm b/code/datums/diseases/viruses/kingstons.dm
new file mode 100644
index 00000000000..c3f1dd722f3
--- /dev/null
+++ b/code/datums/diseases/viruses/kingstons.dm
@@ -0,0 +1,144 @@
+/datum/disease/virus/kingstons
+ name = "Kingstons Syndrome"
+ agent = "Nya Virus"
+ desc = "If left untreated the subject will turn into a feline. In felines it has... OTHER... effects."
+ max_stages = 4
+ spread_flags = AIRBORNE
+ cures = list("milk")
+ cure_prob = 50
+ permeability_mod = 0.75
+ severity = DANGEROUS
+ mutation_reagents = list("mutagen", "radium")
+ possible_mutations = list(/datum/disease/virus/kingstons_advanced)
+
+/datum/disease/virus/kingstons/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(1)
+ if(prob(10))
+ if(istajaran(affected_mob))
+ to_chat(affected_mob, span_notice("You feel good."))
+ else
+ to_chat(affected_mob, span_notice("You feel like playing with string."))
+
+ if(2)
+ if(prob(10))
+ if(istajaran(affected_mob))
+ to_chat(affected_mob, span_danger("Something in your throat itches."))
+ else
+ to_chat(affected_mob, span_danger("You NEED to find a mouse."))
+
+ if(3)
+ if(prob(10))
+ if(istajaran(affected_mob))
+ to_chat(affected_mob, span_danger("You feel something in your throat!"))
+ affected_mob.emote("cough")
+ else
+ if(prob(50))
+ affected_mob.say(pick(list("Mew", "Meow!", "Nya!~")))
+ else
+ affected_mob.emote("purrs")
+
+ if(4)
+ if(istajaran(affected_mob))
+ if(prob(5))
+ affected_mob.visible_message(span_danger("[affected_mob] coughs up a hairball!"), \
+ span_userdanger("You cough up a hairball!"))
+ affected_mob.Stun(10 SECONDS)
+ else
+ if(prob(30))
+ affected_mob.emote("purrs")
+ if(prob(5))
+ affected_mob.visible_message(span_danger("[affected_mob]'s form contorts into something more feline!"), \
+ span_userdanger("YOU TURN INTO A TAJARAN!"))
+ var/mob/living/carbon/human/catface = affected_mob
+ catface?.set_species(/datum/species/tajaran, retain_damage = TRUE)
+
+
+/datum/disease/virus/kingstons_advanced
+ name = "Advanced Kingstons Syndrome"
+ agent = "AMB45DR Bacteria"
+ desc = "If left untreated the subject will mutate to a different species."
+ max_stages = 4
+ spread_flags = AIRBORNE
+ cures = list("plasma")
+ cure_prob = 50
+ permeability_mod = 0.75
+ severity = BIOHAZARD
+ var/list/virspecies = list(/datum/species/human, /datum/species/tajaran, /datum/species/unathi,/datum/species/skrell, /datum/species/vulpkanin, /datum/species/diona)
+ var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay")
+ var/datum/species/chosentype
+ var/chosensuff
+ possible_mutations = null
+
+/datum/disease/virus/kingstons_advanced/New()
+ ..()
+ chosentype = pick(virspecies)
+ chosensuff = pick(virsuffix)
+
+ name = "[initial(chosentype.name)] [chosensuff]"
+
+/datum/disease/virus/kingstons_advanced/Copy()
+ var/datum/disease/virus/kingstons_advanced/KA = ..()
+ KA.chosentype = chosentype
+ KA.chosensuff = chosensuff
+ KA.name = name
+ return KA
+
+/datum/disease/virus/kingstons_advanced/stage_act()
+ if(!..())
+ return FALSE
+
+ if(ishuman(affected_mob))
+ var/mob/living/carbon/human/H = affected_mob
+ switch(stage)
+ if(1)
+ if(prob(10))
+ to_chat(H, span_notice("You feel awkward."))
+ if(2, 3)
+ if(prob(7) && !istype(H.dna.species, chosentype))
+ make_sound(H)
+ if(2)
+ if(prob(10))
+ to_chat(H, span_danger("You itch."))
+ if(3)
+ if(prob(10))
+ to_chat(H, span_danger("Your skin starts to flake!"))
+ if(4)
+ if(!istype(H.dna.species, chosentype))
+ if(prob(30))
+ make_sound(H)
+ if(prob(5))
+ H.visible_message(span_danger("[H]'s skin splits and form contorts!"), \
+ span_userdanger("Your body mutates into a [initial(chosentype.name)]!"))
+ H.set_species(chosentype, retain_damage = TRUE)
+ else
+ if(prob(5))
+ H.visible_message(span_danger("[H] scratches at thier skin!"), \
+ span_userdanger("You scratch your skin to try not to itch!"))
+ H.adjustBruteLoss(5)
+ affected_mob.Stun(rand(2 SECONDS, 4 SECONDS))
+
+// Костыли, систему эмоутов переписывать лень. Она ужасна. У расовых эмоутов проверка на расу, поэтому так просто их не заюзать
+/datum/disease/virus/kingstons_advanced/proc/make_sound(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+
+ switch(chosentype)
+ if(/datum/species/tajaran)
+ H.custom_emote(m_type = EMOTE_SOUND, message = "мурчит")
+ playsound(H.loc, 'sound/voice/cat_purr.ogg', 80, 1, frequency = H.get_age_pitch())
+ if(/datum/species/unathi)
+ H.custom_emote(m_type = EMOTE_SOUND, message = "шипит")
+ playsound(H.loc, 'sound/effects/unathihiss.ogg', 50, 1, frequency = H.get_age_pitch())
+ if(/datum/species/skrell)
+ H.custom_emote(m_type = EMOTE_SOUND, message = "издает трель")
+ playsound(H.loc, 'sound/effects/warble.ogg', 50, 1, frequency = H.get_age_pitch())
+ if(/datum/species/vulpkanin)
+ H.custom_emote(m_type = EMOTE_SOUND, message = "воет")
+ playsound(H.loc, 'sound/goonstation/voice/howl.ogg', 100, 1, frequency = H.get_age_pitch())
+ if(/datum/species/diona)
+ H.custom_emote(m_type = EMOTE_SOUND, message = "скрипит")
+ playsound(H.loc, 'sound/voice/dionatalk1.ogg', 50, 1, frequency = H.get_age_pitch())
diff --git a/code/datums/diseases/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm
similarity index 71%
rename from code/datums/diseases/loyalty_syndrome.dm
rename to code/datums/diseases/viruses/loyalty_syndrome.dm
index e6f37c2ac9a..d7e0688edf9 100644
--- a/code/datums/diseases/loyalty_syndrome.dm
+++ b/code/datums/diseases/viruses/loyalty_syndrome.dm
@@ -1,17 +1,17 @@
#define STAGE_TIME 60
-/datum/disease/loyalty
+/datum/disease/virus/loyalty
name = "Loyalty Syndrome"
+ agent = "Halomonas minomae"
+ desc = "A disease that causes acute mass insanity for a certain person, as well as various obsessions"
max_stages = 5
- spread_text = "On contact"
- spread_flags = CONTACT_GENERAL
- disease_flags = CAN_CARRY|CURABLE
+ spread_flags = CONTACT
+ permeability_mod = 0.8
+ can_immunity = FALSE
cure_text = "Anti-Psychotics"
cures = list("haloperidol")
- cure_chance = 5
- agent = "Halomonas minomae"
- viable_mobtypes = list(/mob/living/carbon/human)
- visibility_flags = HIDDEN_SCANNER
+ cure_prob = 8
+ visibility_flags = HIDDEN_HUD
severity = DANGEROUS
var/is_master = FALSE
var/mob/living/carbon/human/master
@@ -23,37 +23,49 @@
var/need_meating_message = FALSE
var/need_master_death_message = FALSE
-/datum/disease/loyalty/New(var/mob/living/carbon/human/new_master)
+/datum/disease/virus/loyalty/New(var/mob/living/carbon/human/new_master)
+ ..()
if(new_master)
master = new_master
else
is_master = TRUE
-/datum/disease/loyalty/Contract(mob/M)
+/datum/disease/virus/loyalty/Contract(mob/living/M, act_type, is_carrier = FALSE, need_protection_check = FALSE, zone)
+ if(!CanContract(M, act_type, need_protection_check, zone))
+ return FALSE
+
var/mob/living/carbon/human/new_master = is_master ? affected_mob : master
- var/datum/disease/loyalty/copy = new(new_master)
+ var/datum/disease/virus/loyalty/copy = new(new_master)
+
+ //recontract cured master
+ if(new_master == M)
+ copy.is_master = TRUE
- M.viruses += copy
+ M.diseases += copy
copy.affected_mob = M
GLOB.active_diseases += copy
+ copy.carrier = is_carrier
copy.affected_mob.med_hud_set_status()
+ return copy
-/datum/disease/loyalty/stage_act()
- ..()
+/datum/disease/virus/loyalty/stage_act()
+ if(!..())
+ return FALSE
if(affected_mob && !is_master && master && stage >= 4)
var/message = ""
var/health_change = 0
var/see_master = FALSE
+ if(QDELETED(master))
+ if(need_master_death_message)
+ death_of_master(span_cultlarge("Внезапно всё ваше тело пронзает боль от осознания одной мысли. \n[span_reallybig("[master] больше нет с нами")]"))
+ return FALSE
+
if(master.stat == DEAD)
if(need_master_death_message)
- affected_mob.emote("scream")
- to_chat(affected_mob, span_cultlarge("Внезапно всё ваше тело пронзает боль от осознания одной мысли. \n[span_reallybig("[master] мертв[genderize_ru(master.gender, "", "а", "о", "ы")]!")]"))
- need_master_death_message = FALSE
- affected_mob.adjustBrainLoss(50)
- addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/living/carbon/human, emote), "cry"), rand(3, 10) SECONDS)
- return
+ death_of_master(span_cultlarge("Внезапно всё ваше тело пронзает боль от осознания одной мысли. \n[span_reallybig("[master] мертв[genderize_ru(master.gender, "", "а", "о", "ы")]!")]"))
+ return FALSE
else
need_master_death_message = TRUE
@@ -121,17 +133,18 @@
span_userdanger("Странный голос [pick("ужасающе вопит", "жалобно стонет", "кричит")] [get_direction("где-то на ", "e")]!!")), rand(2, 20) SECONDS)
health_change = round(timer/(4 * STAGE_TIME), 0.25) //1 - ∞ toxins
- if(timer <= STAGE_TIME)
- affected_mob.adjustOxyLoss(health_change)
- affected_mob.adjustBruteLoss(health_change)
- affected_mob.adjustFireLoss(health_change)
- affected_mob.adjustToxLoss(health_change)
+ if(affected_mob.z == master.z)
+ if(timer <= STAGE_TIME)
+ affected_mob.adjustOxyLoss(health_change)
+ affected_mob.adjustBruteLoss(health_change)
+ affected_mob.adjustFireLoss(health_change)
+ affected_mob.adjustToxLoss(health_change)
if(message != "")
affected_mob.say(message)
say_timer = 0
return
-/datum/disease/loyalty/proc/get_direction(var/begin="", var/ending = "")
+/datum/disease/virus/loyalty/proc/get_direction(var/begin="", var/ending = "")
if(affected_mob.z == master.z)
. = begin
. += dir2rustext(get_dir(affected_mob.loc, master.loc))
@@ -139,9 +152,15 @@
else
. = "где-то далеко отсюда"
-/datum/disease/loyalty/Copy()
+/datum/disease/virus/loyalty/Copy()
var/mob/living/carbon/human/new_master = is_master ? affected_mob : master
- var/datum/disease/loyalty/copy = new(new_master)
+ var/datum/disease/virus/loyalty/copy = new(new_master)
return copy
+/datum/disease/virus/loyalty/proc/death_of_master(message)
+ affected_mob.emote("scream")
+ to_chat(affected_mob, message)
+ need_master_death_message = FALSE
+ affected_mob.adjustBrainLoss(50)
+ addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/living/carbon/human, emote), "cry"), rand(3, 10) SECONDS)
#undef STAGE_TIME
diff --git a/code/datums/diseases/viruses/lycancoughy.dm b/code/datums/diseases/viruses/lycancoughy.dm
new file mode 100644
index 00000000000..81b5194ee4b
--- /dev/null
+++ b/code/datums/diseases/viruses/lycancoughy.dm
@@ -0,0 +1,57 @@
+/datum/disease/virus/lycan
+ name = "Lycancoughy"
+ form = "Infection"
+ agent = "Excess Snuggles"
+ desc = "If left untreated subject will regurgitate... puppies."
+ max_stages = 4
+ spread_flags = CONTACT
+ cures = list("ethanol")
+ severity = DANGEROUS
+ var/barklimit = 0
+
+/datum/disease/virus/lycan/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(2)
+ if(prob(5))
+ to_chat(affected_mob, span_notice("You itch."))
+ affected_mob.emote("cough")
+ if(3)
+ if(prob(10))
+ to_chat(affected_mob, span_notice("You hear faint barking."))
+ if(prob(5))
+ to_chat(affected_mob, span_notice("You crave meat."))
+ affected_mob.emote("cough")
+ if(prob(2))
+ to_chat(affected_mob, span_danger("Your stomach growls!"))
+ if(4)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("Your stomach barks?!"))
+ if(prob(5))
+ affected_mob.visible_message(span_danger("[affected_mob] howls!"), \
+ span_userdanger("You howl!"))
+ affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS))
+ if(prob(3) && barklimit <= 10)
+ var/list/puppytype = list(
+ /mob/living/simple_animal/pet/dog/corgi/puppy,
+ /mob/living/simple_animal/pet/dog/pug,
+ /mob/living/simple_animal/pet/dog/fox)
+
+ var/mob/living/puppypicked = pick(puppytype)
+ affected_mob.visible_message(span_danger("[affected_mob] coughs up [initial(puppypicked.name)]!"), \
+ span_userdanger("You cough up [initial(puppypicked.name)]?!"))
+ new puppypicked(affected_mob.loc)
+ new puppypicked(affected_mob.loc)
+ barklimit ++
+ if(prob(1))
+ var/list/plushtype = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox)
+ var/obj/item/toy/plushie/coughfox = pick(plushtype)
+ new coughfox(affected_mob.loc)
+ affected_mob.visible_message(span_danger("[affected_mob] coughs up a [initial(coughfox.name)]!"), \
+ span_userdanger("You cough [initial(coughfox.name)] up ?!"))
+ if(prob(50))
+ affected_mob.emote("cough")
+ affected_mob.adjustBruteLoss(5)
+ return
diff --git a/code/datums/diseases/viruses/magnitis.dm b/code/datums/diseases/viruses/magnitis.dm
new file mode 100644
index 00000000000..1dcbaa508f3
--- /dev/null
+++ b/code/datums/diseases/viruses/magnitis.dm
@@ -0,0 +1,65 @@
+/datum/disease/virus/magnitis
+ name = "Magnitis"
+ agent = "Nanobots Fukkos Miracos"
+ 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."
+ max_stages = 4
+ visibility_flags = HIDDEN_HUD
+ spread_flags = AIRBORNE
+ cure_text = "Iron for the living, nanopaste for robots"
+ cures = list("iron")
+ infectable_mobtypes = list(/mob/living/carbon/human, /mob/living/silicon/robot, /mob/living/simple_animal/pet/dog/corgi/borgi)
+ ignore_immunity = TRUE
+ permeability_mod = 0.75
+ severity = MEDIUM
+
+/datum/disease/virus/magnitis/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(2)
+ if(prob(2))
+ to_chat(affected_mob, span_danger("You feel a slight shock course through your body."))
+ if(prob(2))
+ move_obj(2, 1)
+ move_mobs(2, 1)
+ if(3)
+ if(prob(3))
+ to_chat(affected_mob, span_danger("You feel a strong shock course through your body."))
+ if(prob(3))
+ to_chat(affected_mob, span_danger("You feel like clowning around."))
+ if(prob(4))
+ move_obj(4, rand(1, 2))
+ move_mobs(4, rand(1, 2))
+ if(4)
+ if(prob(5))
+ to_chat(affected_mob, span_danger("You feel a powerful shock course through your body."))
+ if(prob(5))
+ to_chat(affected_mob, span_danger("You query upon the nature of miracles."))
+ if(prob(8))
+ move_obj(6, rand(1, 3))
+ move_mobs(6, rand(1, 3))
+
+/datum/disease/virus/magnitis/proc/move_obj(range, iter)
+ playsound(get_turf(affected_mob.loc), 'sound/effects/magnitis.ogg', 100, 1)
+ for(var/obj/M in orange(range, affected_mob))
+ if(!M.anchored && (M.flags & CONDUCT))
+ var/i
+ for(i = 0, i < iter, i++)
+ step_towards(M, affected_mob)
+
+/datum/disease/virus/magnitis/proc/move_mobs(range, iter)
+ for(var/mob/living/L in orange(range, affected_mob))
+ if(istype(L, /mob/living/silicon/robot) || \
+ istype(L, /mob/living/simple_animal/pet/dog/corgi/borgi) || \
+ ismachineperson(L))
+
+ var/i
+ for(i = 0, i < iter, i++)
+ step_towards(L, affected_mob)
+
+//machinepersons cures with nanopaste, applied at any bodypart
+/datum/disease/virus/magnitis/has_cure()
+ return ismachineperson(affected_mob) ? FALSE : ..()
+
+
diff --git a/code/datums/diseases/viruses/pierrot_throat.dm b/code/datums/diseases/viruses/pierrot_throat.dm
new file mode 100644
index 00000000000..d580caca851
--- /dev/null
+++ b/code/datums/diseases/viruses/pierrot_throat.dm
@@ -0,0 +1,60 @@
+/datum/disease/virus/pierrot_throat
+ name = "Pierrot's Throat"
+ agent = "H0NI<42 Virus"
+ desc = "If left untreated the subject will probably drive others to insanity."
+ max_stages = 4
+ spread_flags = AIRBORNE
+ cures = list("banana")
+ cure_prob = 75
+ permeability_mod = 0.75
+ severity = MEDIUM
+ possible_mutations = list(/datum/disease/virus/pierrot_throat/advanced, /datum/disease/virus/wizarditis)
+
+/datum/disease/virus/pierrot_throat/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(1)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("You feel a little silly."))
+ if(2)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("You start seeing rainbows."))
+ if(3)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("Your thoughts are interrupted by a loud HONK!"))
+ if(4)
+ if(prob(5))
+ affected_mob.say(pick(list("ХОНК!", "Хонк!", "Хонк.", "Хонк?", "Хонк!!", "Хонк?!", "Хонк...")))
+
+
+/datum/disease/virus/pierrot_throat/advanced
+ name = "Advanced Pierrot's Throat"
+ agent = "H0NI<42.B4n4 Virus"
+ desc = "If left untreated the subject will probably drive others to insanity and go insane themselves."
+ severity = DANGEROUS
+ possible_mutations = null
+
+/datum/disease/virus/pierrot_throat/advanced/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(1)
+ if(prob(5))
+ to_chat(affected_mob, span_danger("You feel like making a joke."))
+ if(2)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("You don't just start seeing rainbows... YOU ARE RAINBOWS!"))
+ if(3)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("Your thoughts are interrupted by a loud HONK!"))
+ affected_mob << 'sound/items/airhorn.ogg'
+ if(4)
+ if(prob(5))
+ affected_mob.say(pick(list("ХОНК!", "Хонк!", "Хонк.", "Хонк?", "Хонк!!", "Хонк?!", "Хонк...")))
+
+ if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/clown_hat/nodrop))
+ affected_mob.drop_item_ground(affected_mob.wear_mask, force = TRUE)
+ affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/clown_hat/nodrop(src), slot_wear_mask)
diff --git a/code/datums/diseases/viruses/retrovirus.dm b/code/datums/diseases/viruses/retrovirus.dm
new file mode 100644
index 00000000000..0a860e80fe9
--- /dev/null
+++ b/code/datums/diseases/viruses/retrovirus.dm
@@ -0,0 +1,68 @@
+/// Just dont use this virus :)
+/datum/disease/virus/dna_retrovirus
+ name = "Retrovirus"
+ agent = ""
+ desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly."
+ stage_prob = 2
+ max_stages = 4
+ spread_flags = CONTACT
+ cure_text = "Rest or an injection of mutadone"
+ cure_prob = 6
+ severity = DANGEROUS
+ permeability_mod = 0.4
+
+
+/datum/disease/virus/dna_retrovirus/New()
+ ..()
+ agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]"
+ //else cure is rest
+ if(prob(40))
+ cures = list("mutadone")
+
+
+/datum/disease/virus/dna_retrovirus/stage_act()
+ if(!..())
+ return FALSE
+
+ switch(stage)
+ if(1)
+ if(prob(8))
+ to_chat(affected_mob, span_danger("Your head hurts."))
+ if(prob(9))
+ to_chat(affected_mob, span_notice("You feel a tingling sensation in your chest."))
+ if(prob(9))
+ to_chat(affected_mob, span_danger("You feel angry."))
+
+ if(2)
+ if(prob(8))
+ to_chat(affected_mob, span_danger("Your skin feels loose."))
+ if(prob(10))
+ to_chat(affected_mob, span_danger("You feel very strange."))
+ if(prob(4))
+ to_chat(affected_mob, span_danger("You feel a stabbing pain in your head!"))
+ affected_mob.Paralyse(4 SECONDS)
+ if(prob(4))
+ to_chat(affected_mob, span_danger("Your stomach churns."))
+
+ if(3)
+ if(prob(10))
+ to_chat(affected_mob, span_danger("Your entire body vibrates."))
+
+ if(prob(35))
+ scramble(pick(0,1), affected_mob, rand(15, 45))
+
+ if(4)
+ if(prob(60))
+ scramble(pick(0,1), affected_mob, rand(15, 45))
+
+/datum/disease/virus/dna_retrovirus/has_cure()
+ if(cures.len)
+ return ..()
+ else
+ if(affected_mob.IsSleeping())
+ return TRUE
+ if(affected_mob.lying)
+ return prob(33)
+ return FALSE
+
+
diff --git a/code/datums/diseases/viruses/rhumba_beat.dm b/code/datums/diseases/viruses/rhumba_beat.dm
new file mode 100644
index 00000000000..26f50431488
--- /dev/null
+++ b/code/datums/diseases/viruses/rhumba_beat.dm
@@ -0,0 +1,41 @@
+//meme copy of GBS
+/datum/disease/virus/rhumba_beat
+ name = "The Rhumba Beat"
+ agent = "Unknown"
+ max_stages = 5
+ spread_flags = CONTACT
+ cure_text = "Chick Chicky Boom!"
+ cures = list("plasma")
+ severity = BIOHAZARD
+
+/datum/disease/virus/rhumba_beat/stage_act()
+ if(!..())
+ return FALSE
+
+ if(affected_mob.ckey == "rosham")
+ cure()
+ return
+
+ switch(stage)
+ if(2)
+ if(prob(45))
+ affected_mob.adjustToxLoss(5)
+ if(prob(1))
+ to_chat(affected_mob, span_danger("You feel strange..."))
+ if(3)
+ if(prob(5))
+ to_chat(affected_mob, span_danger("You feel the urge to dance..."))
+ else if(prob(5))
+ affected_mob.emote("gasp")
+ else if(prob(10))
+ to_chat(affected_mob, span_danger("You feel the need to chick chicky boom..."))
+ if(4)
+ if(prob(10))
+ affected_mob.emote("gasp")
+ to_chat(affected_mob, span_danger("You feel a burning beat inside..."))
+ if(prob(20))
+ affected_mob.adjustToxLoss(5)
+ if(5)
+ to_chat(affected_mob, span_userdanger("Your body is unable to contain the Rhumba Beat..."))
+ if(prob(50))
+ affected_mob.gib()
diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm
new file mode 100644
index 00000000000..4cce03f8116
--- /dev/null
+++ b/code/datums/diseases/viruses/transformation.dm
@@ -0,0 +1,268 @@
+/datum/disease/virus/transformation
+ name = "Transformation"
+ stage_prob = 10
+ max_stages = 5
+ spread_flags = NON_CONTAGIOUS
+ severity = DANGEROUS
+ can_immunity = FALSE
+ infectable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
+ var/list/stage1
+ var/list/stage2
+ var/list/stage3
+ var/list/stage4
+ var/list/stage5
+ var/list/transform_message
+ var/new_form
+ var/is_new_mind = FALSE
+ var/transformed = FALSE
+ var/cure_after_transform = TRUE
+
+/datum/disease/virus/transformation/stage_act()
+ if(!..() || !affected_mob)
+ return FALSE
+
+ switch(stage)
+ if(1)
+ if(prob(stage_prob) && stage1)
+ to_chat(affected_mob, pick(stage1))
+ if(2)
+ if(prob(stage_prob) && stage2)
+ to_chat(affected_mob, pick(stage2))
+ if(3)
+ if(prob(stage_prob*2) && stage3)
+ to_chat(affected_mob, pick(stage3))
+ if(4)
+ if(prob(stage_prob*2) && stage4)
+ to_chat(affected_mob, pick(stage4))
+ if(5)
+ if(prob(stage_prob*2) && stage5)
+ to_chat(affected_mob, pick(stage5))
+ if(!transformed)
+ if(transform_message)
+ to_chat(affected_mob, pick(transform_message))
+ do_disease_transformation()
+ if(cure_after_transform)
+ cure()
+
+/datum/disease/virus/transformation/proc/do_disease_transformation()
+ if(istype(affected_mob) && new_form)
+ if(jobban_isbanned(affected_mob, new_form))
+ affected_mob.death(1)
+ return
+
+ if(affected_mob.notransform)
+ return
+
+ affected_mob.notransform = 1
+ affected_mob.canmove = 0
+ affected_mob.icon = null
+ affected_mob.overlays.Cut()
+ affected_mob.invisibility = INVISIBILITY_ABSTRACT
+
+ for(var/obj/item/W in affected_mob)
+ if(istype(W, /obj/item/implant))
+ qdel(W)
+ continue
+ affected_mob.drop_item_ground(W) //Если вещь снимается - снимаем
+
+ if(isobj(affected_mob.loc))
+ var/obj/O = affected_mob.loc
+ O.force_eject_occupant(affected_mob)
+
+ var/mob/living/new_mob = new new_form(affected_mob.loc)
+ if(istype(new_mob))
+ new_mob.a_intent = "harm"
+ if(affected_mob.mind)
+ affected_mob.mind.transfer_to(new_mob)
+ if(is_new_mind)
+ new_mob.mind.wipe_memory()
+ else
+ new_mob.key = affected_mob.key
+
+ qdel(affected_mob)
+ transformed = TRUE
+ return new_mob
+
+/datum/disease/virus/transformation/jungle_fever
+ name = "Jungle Fever"
+ agent = "Kongey Vibrion M-909"
+ desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
+ stage_prob = 2
+ cure_prob = 5
+ cures = list("banana")
+ spread_flags = BITES
+ infectable_mobtypes = list(/mob/living/carbon/human)
+ severity = BIOHAZARD
+ cure_after_transform = FALSE
+ stage1 = null
+ stage2 = null
+ stage3 = null
+ stage4 = list(span_warning("Your back hurts."), span_warning("You breathe through your mouth."),
+ span_warning("You have a craving for bananas."), span_warning("Your mind feels clouded."))
+ stage5 = list(span_warning("You feel like monkeying around."))
+ new_form = /mob/living/carbon/human/lesser/monkey
+
+/datum/disease/virus/transformation/jungle_fever/do_disease_transformation()
+ var/mob/living/carbon/human/H = affected_mob
+ if(!istype(H))
+ return
+ if(!issmall(H))
+ if(istype(H.dna.species.primitive_form))
+ H.monkeyize()
+ transformed = TRUE
+ else
+ var/mob/living/new_mob = ..()
+ var/datum/disease/virus/transformation/jungle_fever/D = Contract(new_mob)
+ D?.stage = 5
+ D.transformed = TRUE
+ else
+ transformed = TRUE
+
+/datum/disease/virus/transformation/jungle_fever/stage_act()
+ if(!..() || !affected_mob)
+ return FALSE
+
+ switch(stage)
+ if(2)
+ if(prob(2))
+ to_chat(affected_mob, span_notice("Your [pick("back", "arm", "leg", "elbow", "head")] itches."))
+ if(3)
+ if(prob(4))
+ to_chat(affected_mob, span_danger("You feel a stabbing pain in your head."))
+ affected_mob.AdjustConfused(20 SECONDS)
+ if(4, 5)
+ if(prob(4))
+ affected_mob.say(pick("Иииик, уку уку!", "Иии-ииик!", "Ииии!", "Ун, ун."))
+
+/datum/disease/virus/transformation/robot
+ name = "Robotic Transformation"
+ agent = "R2D2 Nanomachines"
+ desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg."
+ cures = list("copper")
+ cure_prob = 5
+ is_new_mind = TRUE
+ stage1 = null
+ stage2 = list(span_notice("Your joints feel stiff."), span_danger("Beep...boop.."))
+ stage3 = list(span_danger("Your joints feel very stiff."), span_notice("Your skin feels loose."), span_danger("You can feel something move...inside."))
+ stage4 = list(span_danger("Your skin feels very loose."), span_danger("You can feel... something...inside you."))
+ transform_message = list(span_danger("Your skin feels as if it's about to burst off!"))
+ new_form = /mob/living/silicon/robot
+
+/datum/disease/virus/transformation/robot/stage_act()
+ if(!..() || !affected_mob)
+ return FALSE
+
+ switch(stage)
+ if(3)
+ if(prob(8))
+ affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"))
+ if(prob(4))
+ to_chat(affected_mob, span_danger("You feel a stabbing pain in your head."))
+ affected_mob.Paralyse(4 SECONDS)
+ if(4)
+ if(prob(20))
+ affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."))
+
+
+/datum/disease/virus/transformation/xeno
+ name = "Xenomorph Transformation"
+ agent = "Rip-LEY Alien Microbes"
+ desc = "This disease changes the victim into a xenomorph."
+ cures = list("spaceacillin", "glycerol")
+ cure_prob = 5
+ stage1 = null
+ stage2 = list("Your throat feels scratchy.", span_danger("Kill..."))
+ stage3 = list(span_danger("Your throat feels very scratchy."), "Your skin feels tight.", span_danger("You can feel something move...inside."))
+ stage4 = list(span_danger("Your skin feels very tight."), span_danger("Your blood boils!"), span_danger("You can feel... something...inside you."))
+ transform_message = list(span_danger("Теперь вы ксеноморф.\n\
+ Вы чувствуете боль от превращения! Вы желаете укусить того, кто с вами это сделал, благо, память вас не покинула и вы всё помните."))
+ new_form = null
+
+/datum/disease/virus/transformation/xeno/New()
+ ..()
+ new_form = pick(/mob/living/carbon/alien/humanoid/hunter, /mob/living/carbon/alien/humanoid/drone/no_queen, /mob/living/carbon/alien/humanoid/sentinel)
+
+/datum/disease/virus/transformation/xeno/stage_act()
+ if(!..() || !affected_mob)
+ return FALSE
+
+ switch(stage)
+ if(3)
+ if(prob(4))
+ to_chat(affected_mob, span_danger("You feel a stabbing pain in your head."))
+ affected_mob.Paralyse(4 SECONDS)
+ if(4)
+ if(prob(20))
+ affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"))
+
+
+/datum/disease/virus/transformation/slime
+ name = "Advanced Mutation Transformation"
+ agent = "Advanced Mutation Toxin"
+ desc = "This highly concentrated extract converts anything into more of itself."
+ cures = list("frostoil")
+ cure_prob = 80
+ stage1 = list(span_notice("You don't feel very well."))
+ stage2 = list(span_notice("Your skin feels a little slimy."))
+ stage3 = list(span_danger("Your appendages are melting away."), span_danger("Your limbs begin to lose their shape."))
+ stage4 = list(span_danger("You are turning into a slime."))
+ transform_message = list(span_danger("You have become a slime."))
+ new_form = /mob/living/simple_animal/slime/random
+
+/datum/disease/virus/transformation/slime/stage_act()
+ if(!..() || !affected_mob)
+ return FALSE
+
+ switch(stage)
+ if(1)
+ if(ishuman(affected_mob))
+ var/mob/living/carbon/human/H = affected_mob
+ if(isslimeperson(H))
+ stage = 5
+ if(3)
+ if(ishuman(affected_mob))
+ var/mob/living/carbon/human/human = affected_mob
+ if(!isslimeperson(human))
+ human.set_species(/datum/species/slime)
+
+/datum/disease/virus/transformation/corgi
+ name = "The Barkening"
+ agent = "Fell Doge Majicks"
+ desc = "This disease transforms the victim into a corgi."
+ cure_text = "Death"
+ cures = list("adminordrazine")
+ stage1 = list(span_notice("BARK."))
+ stage2 = list(span_notice("You feel the need to wear silly hats."))
+ stage3 = list(span_danger("Must... eat... chocolate...."), span_danger("YAP"))
+ stage4 = list(span_danger("Visions of washing machines assail your mind!"))
+ transform_message = list(span_danger("AUUUUUU!!!"))
+ new_form = /mob/living/simple_animal/pet/dog/corgi
+ is_new_mind = TRUE
+
+/datum/disease/virus/transformation/corgi/stage_act()
+ if(!..() || !affected_mob)
+ return FALSE
+
+ switch(stage)
+ if(3)
+ if(prob(8))
+ affected_mob.say(pick("YAP", "Woof!"))
+ if(4)
+ if(prob(20))
+ affected_mob.say(pick("Bark!", "AUUUUUU"))
+
+/datum/disease/virus/transformation/morph
+ name = "Gluttony's Blessing"
+ agent = "Gluttony's Blessing"
+ desc = "A 'gift' from somewhere terrible."
+ cure_text = "Nothing"
+ cures = list("adminordrazine")
+ stage_prob = 20
+ stage1 = list(span_notice("Your stomach rumbles."))
+ stage2 = list(span_notice("Your skin feels saggy."))
+ stage3 = list(span_danger("Your appendages are melting away."), span_danger("Your limbs begin to lose their shape."))
+ stage4 = list(span_danger("You're ravenous."))
+ transform_message = list(span_danger("ТЕПЕРЬ ВЫ МОРФ! \n \
+ Хоть Вы и трансформировались в отвратительную зелёную жижу, но это не повлияло на Ваше сознание \
+ и память. Вы не являетесь антагонистом."))
+ new_form = /mob/living/simple_animal/hostile/morph
diff --git a/code/datums/diseases/viruses/tuberculosis.dm b/code/datums/diseases/viruses/tuberculosis.dm
new file mode 100644
index 00000000000..ee8cdaf6581
--- /dev/null
+++ b/code/datums/diseases/viruses/tuberculosis.dm
@@ -0,0 +1,59 @@
+/datum/disease/virus/tuberculosis
+ form = "Disease"
+ name = "Fungal Tuberculosis"
+ agent = "Fungal Tubercle bacillus Cosmosis"
+ 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."
+ spread_flags = AIRBORNE
+ cures = list("spaceacillin", "salbutamol")
+ cure_prob = 5
+ required_organs = list(/obj/item/organ/internal/lungs)
+ severity = DANGEROUS
+ ignore_immunity = TRUE
+
+/datum/disease/virus/tuberculosis/stage_act()
+ if(!..())
+ return FALSE
+
+ var/mob/living/carbon/human/H = affected_mob
+ switch(stage)
+ if(2, 3)
+ if(prob(2))
+ H.emote("cough")
+ to_chat(H, span_danger("Your chest hurts."))
+ if(prob(2))
+ to_chat(H, span_danger("Your stomach violently rumbles!"))
+ if(prob(5))
+ to_chat(H, span_danger("You feel a cold sweat form."))
+ if(4)
+ if(prob(2))
+ to_chat(H, span_userdanger("You see four of everything"))
+ H.Dizzy(10 SECONDS)
+ if(prob(2))
+ to_chat(H, span_danger("You feel a sharp pain from your lower chest!"))
+ H.adjustOxyLoss(5)
+ H.emote("gasp")
+ if(prob(10))
+ to_chat(H, span_danger("You feel air escape from your lungs painfully."))
+ H.adjustOxyLoss(25)
+ H.emote("gasp")
+ if(5)
+ if(prob(2))
+ to_chat(H, span_userdanger("[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]"))
+ H.adjustStaminaLoss(70)
+ if(prob(10))
+ H.adjustStaminaLoss(100)
+ H.visible_message(span_warning("[H] faints!"), span_userdanger("You surrender yourself and feel at peace..."))
+ H.AdjustSleeping(10 SECONDS)
+ if(prob(2))
+ to_chat(H, span_userdanger("You feel your mind relax and your thoughts drift!"))
+ H.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS)
+ if(prob(10))
+ H.vomit(20)
+ if(prob(3))
+ to_chat(H, span_warning("[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]"))
+ H.overeatduration = max(H.overeatduration - 100, 0)
+ H.adjust_nutrition(-100)
+ if(prob(15))
+ to_chat(H, span_danger("[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]"))
+ H.bodytemperature += 40
+ return
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/viruses/wizarditis.dm
similarity index 60%
rename from code/datums/diseases/wizarditis.dm
rename to code/datums/diseases/viruses/wizarditis.dm
index b270b01e07b..2e846ee7b0e 100644
--- a/code/datums/diseases/wizarditis.dm
+++ b/code/datums/diseases/viruses/wizarditis.dm
@@ -1,15 +1,13 @@
-/datum/disease/wizarditis
+/datum/disease/virus/wizarditis
name = "Wizarditis"
+ agent = "Rincewindus Vulgaris"
+ desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of dementia, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
max_stages = 4
- spread_text = "Airborne"
- cure_text = "The Manly Dorf"
+ visibility_flags = HIDDEN_HUD
+ spread_flags = AIRBORNE
cures = list("manlydorf")
- cure_chance = 100
- agent = "Rincewindus Vulgaris"
- viable_mobtypes = list(/mob/living/carbon/human)
- disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
+ cure_prob = 100
permeability_mod = 0.75
- desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of dementia, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
severity = HARMFUL
required_organs = list(/obj/item/organ/external/head)
@@ -23,70 +21,69 @@ TARCOL MINTI ZHERI - forcewall
STI KALY - blind
*/
-/datum/disease/wizarditis/stage_act()
- ..()
+/datum/disease/virus/wizarditis/stage_act()
+ if(!..())
+ return FALSE
switch(stage)
if(2)
- if(prob(1)&&prob(50))
+ if(prob(5))
affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"))
- if(prob(1)&&prob(50))
- to_chat(affected_mob, "You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].")
+ if(prob(3))
+ to_chat(affected_mob, span_danger("You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")]."))
if(3)
- if(prob(1)&&prob(50))
+ if(prob(2))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"))
- if(prob(1)&&prob(50))
- to_chat(affected_mob, "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].")
+ if(prob(6))
+ to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")]."))
if(4)
-
- if(prob(1))
+ if(prob(3))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"))
- return
- if(prob(1)&&prob(50))
- to_chat(affected_mob, "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].")
- spawn_wizard_clothes(50)
- if(prob(1)&&prob(1))
+ if(prob(1))
+ to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]."))
+ spawn_wizard_clothes()
+ if(prob(1))
teleport()
return
-/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0)
- if(istype(affected_mob, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = affected_mob
- if(prob(chance))
+/datum/disease/virus/wizarditis/proc/spawn_wizard_clothes()
+ var/mob/living/carbon/human/H = affected_mob
+ switch(pick("head", "robe", "sandal", "staff"))
+
+ if("head")
if(!istype(H.head, /obj/item/clothing/head/wizard))
if(!H.drop_item_ground(H.head))
qdel(H.head)
H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), slot_head)
- return
- if(prob(chance))
+ return
+
+ if("robe")
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
if(!H.drop_item_ground(H.wear_suit))
qdel(H.wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), slot_wear_suit)
- return
- if(prob(chance))
+ return
+
+ if("sandal")
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
if(!H.drop_item_ground(H.shoes))
qdel(H.shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
- return
- else
- var/mob/living/carbon/H = affected_mob
- if(prob(chance))
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
+ return
+
+ if("staff")
if(!istype(H.r_hand, /obj/item/twohanded/staff))
H.drop_r_hand()
- H.put_in_r_hand( new /obj/item/twohanded/staff(H) )
- return
- return
-
+ H.put_in_r_hand(new /obj/item/twohanded/staff(H))
+ return
-/datum/disease/wizarditis/proc/teleport()
+/datum/disease/virus/wizarditis/proc/teleport()
var/list/theareas = get_areas_in_range(80, affected_mob)
for(var/area/space/S in theareas)
theareas -= S
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 1f4dc7ebef5..b55690cb657 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -975,8 +975,10 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
/datum/supply_packs/medical/virus
name = "Virus Crate"
- contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion,
+ contains = list(/obj/item/reagent_containers/glass/bottle/flu,
/obj/item/reagent_containers/glass/bottle/cold,
+ /obj/item/reagent_containers/glass/bottle/sneezing,
+ /obj/item/reagent_containers/glass/bottle/cough,
/obj/item/reagent_containers/glass/bottle/epiglottis_virion,
/obj/item/reagent_containers/glass/bottle/liver_enhance_virion,
/obj/item/reagent_containers/glass/bottle/fake_gbs,
diff --git a/code/datums/syndiesupplypacks.dm b/code/datums/syndiesupplypacks.dm
index 8d68b4744bc..7b05cc82d9a 100644
--- a/code/datums/syndiesupplypacks.dm
+++ b/code/datums/syndiesupplypacks.dm
@@ -844,8 +844,10 @@ GLOBAL_LIST_INIT(all_syndie_supply_groups, list(SYNDIE_SUPPLY_EMERGENCY,SYNDIE_S
/datum/syndie_supply_packs/medical/virus
name = "Virus Crate"
- contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion,
+ contains = list(/obj/item/reagent_containers/glass/bottle/flu,
/obj/item/reagent_containers/glass/bottle/cold,
+ /obj/item/reagent_containers/glass/bottle/sneezing,
+ /obj/item/reagent_containers/glass/bottle/cough,
/obj/item/reagent_containers/glass/bottle/epiglottis_virion,
/obj/item/reagent_containers/glass/bottle/liver_enhance_virion,
/obj/item/reagent_containers/glass/bottle/fake_gbs,
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 1a5c0f33804..69e686fd4f1 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -73,7 +73,7 @@
/// Whether the carbon mob is currently in crit.
// Even though "crit" does not realistically happen for non-humans..
/mob/living/carbon/proc/is_in_crit()
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
if(istype(D, /datum/disease/critical))
return TRUE
@@ -87,12 +87,12 @@
return FALSE
/// Whether a virus worthy displaying on the HUD is present.
-/mob/living/carbon/proc/has_virus()
- for(var/thing in viruses)
+/mob/living/proc/has_virus()
+ for(var/thing in diseases)
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 & HIDDEN_HUD)) && (D.severity != NONTHREAT))
return TRUE
return FALSE
@@ -173,6 +173,8 @@
var/image/holder = hud_list[STATUS_HUD]
if(stat == DEAD)
holder.icon_state = "huddead"
+ else if(has_virus())
+ holder.icon_state = "hudill"
else
holder.icon_state = "hudhealthy"
diff --git a/code/game/gamemodes/clockwork/cogscarab.dm b/code/game/gamemodes/clockwork/cogscarab.dm
index e86a1903482..e63a0771375 100644
--- a/code/game/gamemodes/clockwork/cogscarab.dm
+++ b/code/game/gamemodes/clockwork/cogscarab.dm
@@ -119,7 +119,7 @@
adjustBruteLoss(2)
else
wind_up_timer -= seconds
- hud_used.wind_up_timer?.icon_state = "windup_display-[6-(round(wind_up_timer, wind_up_icon_segment) / wind_up_icon_segment)]"
+ hud_used?.wind_up_timer?.icon_state = "windup_display-[6-(round(wind_up_timer, wind_up_icon_segment) / wind_up_icon_segment)]"
//rounds to 30 and divides by 30. if timer full, 6 - 5, state 1. from 1 to 6.
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 31ddd80a140..1d95b3a76c8 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -346,7 +346,7 @@ structure_check() searches for nearby cultist structures required for the invoca
for(var/obj/item/organ/external/E in H.bodyparts)
E.mend_fracture()
E.internal_bleeding = FALSE
- for(var/datum/disease/critical/crit in H.viruses) // cure all crit conditions
+ for(var/datum/disease/critical/crit in H.diseases) // cure all crit conditions
crit.cure()
H.uncuff()
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index d17447171cc..62b1ba62cb1 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -219,33 +219,13 @@
/obj/item/organ/internal/heart/gland/viral/activate()
to_chat(owner, "You feel sick.")
- var/datum/disease/advance/rand_virus = random_virus(rand(2, 6), 6)
- rand_virus.carrier = TRUE
- var/datum/disease/advance/check = locate() in owner.viruses
- if(check)
- check.cure(resistance = FALSE)
- owner.ForceContractDisease(rand_virus)
-
-/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
- var/list/datum/symptom/possible_symptoms = list()
- for(var/symptom in subtypesof(/datum/symptom))
- var/datum/symptom/S = symptom
- if(initial(S.level) > max_level)
- continue
- if(initial(S.level) <= 0) //unobtainable symptoms
- continue
- possible_symptoms += S
- for(var/i in 1 to max_symptoms)
- var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
- if(chosen_symptom)
- var/datum/symptom/S = new chosen_symptom
- A.symptoms += S
- A.Refresh() //just in case someone already made and named the same disease
- return A
-
+ var/datum/disease/virus/advance/new_virus
+ new_virus = CreateRandomVirus(count_of_symptoms = rand(4, 6), resistance = rand(0,11), stealth = pick(0,0,1,1,2),
+ stage_rate = rand(-11,5), transmittable = rand(2,9), severity = rand(0,5))
+ var/datum/disease/virus/advance/old_virus = locate() in owner.diseases
+ if(old_virus)
+ old_virus.cure(need_immunity = FALSE)
+ new_virus.Contract(owner, is_carrier = TRUE)
/obj/item/organ/internal/heart/gland/emp //TODO : Replace with something more interesting
origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index abc84313786..41fbbd19447 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -283,6 +283,8 @@ GLOBAL_VAR(bomb_set)
attack_hand(user)
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
add_fingerprint(user)
if(!panel_open)
return ui_interact(user)
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index c14472cc8d4..f4c5e63fcac 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -107,6 +107,9 @@
attack_hand(user)
/obj/machinery/atmospherics/unary/cold_sink/freezer/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
+
if(panel_open)
to_chat(user, span_notice("Сначала закройте панель техобслуживания."))
return
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 148f49c5e9a..3e6bad4728b 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -133,6 +133,9 @@
if(stat & (NOPOWER|BROKEN))
return
+ if(..())
+ return TRUE
+
if(panel_open)
to_chat(user, span_notice("Close the maintenance panel first."))
return
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index cb86e413a0a..354de75e424 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -139,6 +139,9 @@
ui_interact(user)
/obj/machinery/bodyscanner/attack_hand(user)
+ if(..())
+ return TRUE
+
if(stat & (NOPOWER|BROKEN))
return
@@ -222,9 +225,9 @@
occupantData["maxHealth"] = occupant.maxHealth
var/found_disease = FALSE
- for(var/thing in occupant.viruses)
+ for(var/thing in occupant.diseases)
var/datum/disease/D = thing
- if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
+ if(D.visibility_flags & HIDDEN_SCANNER)
continue
if(istype(D, /datum/disease/critical))
continue
@@ -388,9 +391,9 @@
dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
"
var/found_disease = FALSE
- for(var/thing in occupant.viruses)
+ for(var/thing in occupant.diseases)
var/datum/disease/D = thing
- if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
+ if(D.visibility_flags & HIDDEN_SCANNER)
continue
found_disease = TRUE
break
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index f4fa9203463..22f655ddba0 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -281,6 +281,9 @@ update_flag
return ui_interact(user)
/obj/machinery/portable_atmospherics/canister/attack_hand(var/mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
return ui_interact(user)
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 1223fbdbae6..e5987d8076f 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -115,6 +115,9 @@
return attack_hand(user)
/obj/machinery/portable_atmospherics/pump/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 09c5a6c88c6..5d1b6f5a3ee 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -109,6 +109,9 @@
return attack_hand(user)
/obj/machinery/portable_atmospherics/scrubber/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
return
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 237621e32a6..ab1b604cd3f 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -550,7 +550,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
missing_organs.Cut()
occupant.SetLoseBreath(0) // Stop friggin' dying, gosh damn
occupant.setOxyLoss(0)
- for(var/datum/disease/critical/crit in occupant.viruses)
+ for(var/datum/disease/critical/crit in occupant.diseases)
crit.cure()
occupant.forceMove(T)
occupant.update_body()
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 29f17890f68..28e44640f1e 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -26,6 +26,8 @@
ui_interact(user)
/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob)
+ if(..())
+ return TRUE
ui_interact(user)
/obj/machinery/computer/aifixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 3d2b1b3e0c7..52e81a8e665 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -20,6 +20,9 @@
return ..()
/obj/machinery/computer/atmos_alert/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/machinery/computer/brigcells.dm b/code/game/machinery/computer/brigcells.dm
index 5e0bca438a7..774e89761b6 100644
--- a/code/game/machinery/computer/brigcells.dm
+++ b/code/game/machinery/computer/brigcells.dm
@@ -17,6 +17,10 @@
/obj/machinery/computer/brigcells/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
+
+ if(..())
+ return TRUE
+
if(!allowed(user))
to_chat(user, span_warning("Access denied."))
return
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 96769c44a18..c54a11f2445 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -117,6 +117,9 @@
return attack_hand(user)
/obj/machinery/computer/cloning/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
+
user.set_machine(src)
add_fingerprint(user)
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index ff61e860bea..220a32ed5fb 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -24,6 +24,10 @@
/obj/machinery/computer/crew/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
+
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index f8ec9853b0f..f648b951825 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -54,6 +54,9 @@
to_chat(usr, "The upload computer is broken!")
return
+ if(..())
+ return TRUE
+
src.current = select_active_ai(user)
if(!src.current)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 87973705e49..25f073ec8a2 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -146,7 +146,7 @@
data["virus"] = list()
for(var/D in typesof(/datum/disease))
var/datum/disease/DS = new D(0)
- if(istype(DS, /datum/disease/advance))
+ if(istype(DS, /datum/disease/virus/advance))
continue
if(!DS.desc)
continue
@@ -218,7 +218,7 @@
var/list/payload = list(
name = D.name,
max_stages = D.max_stages,
- spread_text = D.spread_text,
+ spread_text = D.additional_info,
cure = D.cure_text || "None",
desc = D.desc,
severity = D.severity
diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm
index 647b15587d1..983e4b5e006 100644
--- a/code/game/machinery/computer/pod_tracking_console.dm
+++ b/code/game/machinery/computer/pod_tracking_console.dm
@@ -11,6 +11,9 @@
return attack_hand(user)
/obj/machinery/computer/podtracker/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index d71f4ea2c47..c8e7dae6b74 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -70,6 +70,10 @@
/obj/machinery/computer/monitor/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
+
+ if(..())
+ return TRUE
+
add_fingerprint(user)
// Update the powernet
powernet = find_powernet()
diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm
index 28623d27c6e..dff1a929f40 100644
--- a/code/game/machinery/computer/salvage_ship.dm
+++ b/code/game/machinery/computer/salvage_ship.dm
@@ -42,6 +42,9 @@
return attack_hand(user)
/obj/machinery/computer/salvage_ship/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
+
if(!allowed(user))
to_chat(user, span_warning("Access Denied"))
playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20)
diff --git a/code/game/machinery/computer/sm_monitor.dm b/code/game/machinery/computer/sm_monitor.dm
index 1df2bfec2ab..966fe4b6b3f 100644
--- a/code/game/machinery/computer/sm_monitor.dm
+++ b/code/game/machinery/computer/sm_monitor.dm
@@ -22,6 +22,10 @@
/obj/machinery/computer/sm_monitor/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
+
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index 886e3e02a9d..2037e71744c 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -29,6 +29,10 @@
/obj/machinery/computer/station_alert/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
+
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm
index edb667f2287..aac67d05f97 100644
--- a/code/game/machinery/computer/store.dm
+++ b/code/game/machinery/computer/store.dm
@@ -23,6 +23,9 @@
if(stat & (BROKEN|NOPOWER))
return
+ if(..())
+ return TRUE
+
var/balance=0
if(user.mind)
if(user.mind.initial_account)
diff --git a/code/game/machinery/computer/syndie_cargo.dm b/code/game/machinery/computer/syndie_cargo.dm
index 28990d4c3a9..1c5f967f282 100644
--- a/code/game/machinery/computer/syndie_cargo.dm
+++ b/code/game/machinery/computer/syndie_cargo.dm
@@ -506,6 +506,9 @@ GLOBAL_LIST_INIT(data_storages, list()) //list of all cargo console data storage
/obj/machinery/computer/syndie_supplycomp/attack_hand(var/mob/user as mob)
+ if(..())
+ return TRUE
+
if(!allowed(user) && !isobserver(user))
to_chat(user, span_warning("Access denied."))
playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 925a8ff89b5..f5c148e8dc0 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -196,6 +196,9 @@
ui_interact(user)
/obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
if(user == occupant)
return
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 8910f71684c..a9fcf27dd2c 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -282,11 +282,9 @@ Class Procs:
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.getBrainLoss() >= 60)
+ if(!H.check_brain_for_complex_interactions())
visible_message(span_warning("[H] stares cluelessly at [src] and drools."))
- return TRUE
- else if(prob(H.getBrainLoss()))
- to_chat(user, span_warning("You momentarily forget how to use [src]."))
+ to_chat(H, span_warning("You momentarily forget how to use [src]."))
return TRUE
if(panel_open)
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 75a2d867602..24a33fc43b0 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -204,6 +204,9 @@
interact(user)
/obj/machinery/syndicatebomb/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
interact(user)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 58031f9fc9b..a9402b0cba8 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -71,6 +71,8 @@
attack_hand(user)
/obj/machinery/computer/teleporter/attack_hand(mob/user)
+ if(..())
+ return TRUE
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index 6b615922bff..929c4bc02bf 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -141,6 +141,8 @@
ui_interact(user)
/obj/machinery/turretid/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
ui_interact(user)
/obj/machinery/turretid/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index e7c263ddb7c..dcca62a5c73 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -454,6 +454,9 @@
if(stat & (BROKEN|NOPOWER))
return
+ if(..())
+ return TRUE
+
if(src.seconds_electrified != 0)
if(src.shock(user, 100))
add_fingerprint(user)
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 7a78c035c6d..ee3a3aa15ad 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -14,6 +14,9 @@
return attack_hand(user)
/obj/machinery/computer/mecha/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 009da06d235..ab8ab9a6ddc 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -477,12 +477,12 @@ REAGENT SCANNER
. += " [R.name] Стадия: [R.addiction_stage]/5"
else
. += "Зависимости от реагентов не обнаружены."
- for(var/thing in H.viruses)
+ for(var/thing in H.diseases)
var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
. += "Внимание: обнаружен [D.form]"
. += " Название: [D.name]"
- . += " Тип: [D.spread_text]"
+ . += " Тип: [D.additional_info]"
. += " Стадия: [D.stage]/[D.max_stages]"
. += " Лечение: [D.cure_text]"
if(H.undergoing_cardiac_arrest())
@@ -903,9 +903,9 @@ REAGENT SCANNER
dat += "[target.health > 50 ? "" : ""]\tHealth %: [target.health], ([t1])
"
var/found_disease = FALSE
- for(var/thing in target.viruses)
+ for(var/thing in target.diseases)
var/datum/disease/D = thing
- if(D.visibility_flags) //If any visibility flags are on.
+ if(D.visibility_flags & HIDDEN_SCANNER)
continue
found_disease = TRUE
break
diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index 0ad9af40b5a..b270d14cd0b 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -26,8 +26,9 @@
return 0
if(istype(M,/mob/living/silicon/robot)) //Repairing cyborgs
var/mob/living/silicon/robot/R = M
- if(R.getBruteLoss() || R.getFireLoss() )
+ if(R.getBruteLoss() || R.getFireLoss() || R.diseases?.len)
R.heal_overall_damage(15, 15)
+ R.CureAllDiseases(FALSE)
use(1)
user.visible_message("\The [user] applied some [src] at [R]'s damaged areas.",\
"You apply some [src] at [R]'s damaged areas.")
@@ -39,6 +40,11 @@
var/obj/item/organ/external/S = H.get_organ(user.zone_selected)
if(S && S.is_robotic())
+ if(ismachineperson(M) && M.diseases?.len)
+ use(1)
+ M.CureAllDiseases()
+ user.visible_message("\The [user] applies some nanite paste at \the [M] to fix problems.")
+ return
if(S.get_damage())
use(1)
var/remheal = 15
diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm
index c41a3839009..65883392d66 100644
--- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm
+++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm
@@ -22,7 +22,7 @@
var/activated = FALSE
/obj/item/storage/toolbox/green/memetic/ui_action_click(mob/user)
- if(user.HasDisease(new /datum/disease/memetic_madness))
+ if(user.HasDisease(/datum/disease/memetic_madness))
var/obj/item/storage/toolbox/green/memetic/M = user.get_active_hand()
if(istype(M))
to_chat(user, "His Grace [flags & NODROP ? "releases from" : "binds to"] your hand!")
@@ -41,10 +41,11 @@
..()
/obj/item/storage/toolbox/green/memetic/proc/link_user(mob/living/carbon/user)
- if(ishuman(user) && !user.HasDisease(new /datum/disease/memetic_madness))
+ if(ishuman(user) && !user.HasDisease(/datum/disease/memetic_madness))
activated = TRUE
- user.ForceContractDisease(new /datum/disease/memetic_madness)
- for(var/datum/disease/memetic_madness/DD in user.viruses)
+ var/datum/disease/memetic_madness/D = new
+ D.Contract(user)
+ for(var/datum/disease/memetic_madness/DD in user.diseases)
DD.progenitor = src
servantlinks.Add(DD)
break
@@ -74,7 +75,7 @@
if(istype(I, /obj/item/grab))
var/obj/item/grab/G = I
var/mob/living/victim = G.affecting
- if(!user.HasDisease(new /datum/disease/memetic_madness))
+ if(!user.HasDisease(/datum/disease/memetic_madness))
to_chat(user, "You can't seem to find the latch to open this.")
return
if(!victim)
@@ -147,13 +148,10 @@
name = "Memetic Kill Agent"
max_stages = 4
stage_prob = 8
- spread_text = "Non-Contagious"
- spread_flags = SPECIAL
cure_text = "Unknown"
- viable_mobtypes = list(/mob/living/carbon/human)
severity = BIOHAZARD
- disease_flags = CAN_CARRY
- spread_flags = NON_CONTAGIOUS
+ curable = FALSE
+ can_immunity = FALSE
virus_heal_resistant = TRUE
var/obj/item/storage/toolbox/green/memetic/progenitor = null
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index e54e1bb84c7..2a9b76e5ef0 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -878,9 +878,10 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, 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/choosen_disease = input("Choose the disease to give to that guy", "ACHOO") as null|anything in GLOB.diseases
+ if(!choosen_disease) return
+ var/datum/disease/D = new choosen_disease()
+ D.Contract(T)
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_and_message_admins("gave [key_name_log(T)] the disease [D].")
diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm
index 621cae81add..9bce2614773 100644
--- a/code/modules/antagonists/changeling/powers/panacea.dm
+++ b/code/modules/antagonists/changeling/powers/panacea.dm
@@ -34,7 +34,7 @@
user.reagents.add_reagent("mutadone", 2)
user.apply_status_effect(STATUS_EFFECT_PANACEA)
- for(var/datum/disease/virus in user.viruses)
+ for(var/datum/disease/virus in user.diseases)
if(virus.severity == NONTHREAT)
continue
virus.cure()
diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm
index 60f8ba25369..6a716392112 100644
--- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm
+++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm
@@ -220,8 +220,8 @@
to_chat(user, span_warning("Вам кажется, что заражающее касание не подействовало на [target]."))
return
- var/datum/disease/virus = new /datum/disease/vampire
- target.ForceContractDisease(virus)
+ var/datum/disease/vampire/virus = new
+ virus.Contract(target)
/obj/effect/proc_holder/spell/goon_vampire/glare
diff --git a/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm b/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm
index 79af8d00499..d59d4978470 100644
--- a/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm
+++ b/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm
@@ -33,10 +33,10 @@
info_list += "[span_info("Температура тела: [ninja.bodytemperature-T0C] градусов C ([ninja.bodytemperature*1.8-459.67] градусов F)")]\n"
//Diseases
- if(length(ninja.viruses))
+ if(length(ninja.diseases))
info_list += "[span_info("Вирусы:")]\n"
- for(var/datum/disease/ninja_disease in ninja.viruses)
- info_list += "[span_info("* [ninja_disease.name], Тип: [ninja_disease.spread_text], Стадия: [ninja_disease.stage]/[ninja_disease.max_stages], Возможное лекарство: [ninja_disease.cure_text]")]\n"
+ for(var/datum/disease/ninja_disease in ninja.diseases)
+ info_list += "[span_info("* [ninja_disease.name], Тип: [ninja_disease.additional_info], Стадия: [ninja_disease.stage]/[ninja_disease.max_stages], Возможное лекарство: [ninja_disease.cure_text]")]\n"
//Реагенты
if(ninja.reagents.reagent_list.len)
info_list += "[span_info("Обнаружены реагенты:")]\n"
diff --git a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm
index 9e11912748e..fb99afca83f 100644
--- a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm
+++ b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm
@@ -684,7 +684,8 @@ GLOBAL_LIST_INIT(vampire_dissect_organs, list(
if(prob(10 + vampire.get_trophies("livers") * 3))
new /obj/effect/temp_visual/cult/sparks(get_turf(victim))
- victim.ForceContractDisease(new /datum/disease/vampire) // grave fever
+ var/datum/disease/vampire/D = new
+ D.Contract(victim) // grave fever
/*======================================================================================================================================*\
@@ -1576,7 +1577,7 @@ GLOBAL_LIST_INIT(vampire_dissect_organs, list(
// cures heart attack, heart failure and shock
human_vampire.set_heartattack(FALSE)
- for(var/datum/disease/critical/crit_virus in human_vampire.viruses)
+ for(var/datum/disease/critical/crit_virus in human_vampire.diseases)
crit_virus.cure()
// a little bit of nutrition for mr. vampire
@@ -1688,10 +1689,10 @@ GLOBAL_LIST_INIT(vampire_dissect_organs, list(
else
organ.status = NONE
- for(var/datum/disease/virus in human_vampire.viruses)
+ for(var/datum/disease/virus in human_vampire.diseases)
if(virus.severity == NONTHREAT)
continue
- virus.cure(resistance = FALSE)
+ virus.cure(need_immunity = FALSE)
var/mob/living/simple_animal/borer/borer = human_vampire.has_brain_worms()
if(borer)
diff --git a/code/modules/arcade/mob_hunt/battle_computer.dm b/code/modules/arcade/mob_hunt/battle_computer.dm
index ba4f5899493..32c0cb292af 100644
--- a/code/modules/arcade/mob_hunt/battle_computer.dm
+++ b/code/modules/arcade/mob_hunt/battle_computer.dm
@@ -107,6 +107,9 @@
avatar.update_self()
/obj/machinery/computer/mob_battle_terminal/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
interact(user)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index f0b2aaec750..a53d5a788c7 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -168,7 +168,8 @@
if(faction)
M.faction = list(faction)
if(disease)
- M.ForceContractDisease(new disease)
+ var/datum/disease/D = new disease
+ D.Contract(M)
M.adjustOxyLoss(oxy_damage)
M.adjustBruteLoss(brute_damage)
M.adjustFireLoss(burn_damage)
@@ -450,13 +451,13 @@
outfit = /datum/outfit/job/assistant
/obj/effect/mob_spawn/human/corpse/assistant/beesease_infection
- disease = /datum/disease/beesease
+ disease = /datum/disease/virus/beesease
/obj/effect/mob_spawn/human/corpse/assistant/brainrot_infection
- disease = /datum/disease/brainrot
+ disease = /datum/disease/virus/brainrot
/obj/effect/mob_spawn/human/corpse/assistant/spanishflu_infection
- disease = /datum/disease/fluspanish
+ disease = /datum/disease/virus/fluspanish
/obj/effect/mob_spawn/human/cook
name = "Cook"
diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm
index 18294bed86e..3d1e2c17e37 100644
--- a/code/modules/awaymissions/mission_code/academy.dm
+++ b/code/modules/awaymissions/mission_code/academy.dm
@@ -142,9 +142,9 @@
explosion(get_turf(user),-1,0,2, flame_range = 2, cause = src)
if(9)
//Cold
- var/datum/disease/D = new /datum/disease/cold
T.visible_message("[user] looks a little under the weather!")
- user.ForceContractDisease(D)
+ var/datum/disease/virus/cold/D = new
+ D.Contract(user)
if(10)
//Nothing
T.visible_message("Nothing seems to happen.")
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index ab1f4b348a8..c65289c4ac8 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -5,6 +5,7 @@
item_state = "labcoat_open"
ignore_suitadjust = 0
suit_adjusted = 1
+ permeability_coefficient = 0.5
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index ece4aadddb5..42a6694133c 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -57,6 +57,9 @@ GLOBAL_VAR(current_date_string)
return ..()
/obj/machinery/computer/account_database/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 880b832567b..ddfa7e05d31 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -1,27 +1,35 @@
/datum/event/disease_outbreak
- announceWhen = 15
- /// The type of disease that patient zero will be infected with.
- var/datum/disease/D
+ announceWhen = 150
+ /// The type of virus that patient zero will be infected with.
+ var/datum/disease/virus/D
/// The initial target of the disease.
var/mob/living/carbon/human/patient_zero
/datum/event/disease_outbreak/setup()
- announceWhen = rand(15, 30)
- if(prob(40))
- var/virus_type = pick(/datum/disease/advance/preset/flu, /datum/disease/advance/preset/cold, \
- /datum/disease/brainrot, /datum/disease/magnitis, /datum/disease/beesease, /datum/disease/anxiety, \
- /datum/disease/fake_gbs, /datum/disease/fluspanish, /datum/disease/pierrot_throat, /datum/disease/lycan, \
- /datum/disease/loyalty)
- D = new virus_type()
+ announceWhen = rand(150, 300)
+ var/virus_type = pick(
+ 5; /datum/disease/virus/advance,
+ 1; /datum/disease/virus/anxiety,
+ 1; /datum/disease/virus/beesease,
+ 1; /datum/disease/virus/brainrot,
+ 1; /datum/disease/virus/cold,
+ 1; /datum/disease/virus/flu,
+ 1; /datum/disease/virus/fluspanish,
+ 1; /datum/disease/virus/fake_gbs,
+ 1; /datum/disease/virus/loyalty,
+ 1; /datum/disease/virus/lycan,
+ 1; /datum/disease/virus/magnitis,
+ 1; /datum/disease/virus/pierrot_throat,
+ 1; /datum/disease/virus/pierrot_throat/advanced,
+ 1; /datum/disease/virus/tuberculosis,
+ 1; /datum/disease/virus/wizarditis
+ )
+ if(virus_type == /datum/disease/virus/advance)
+ //creates only contagious viruses, that are always visible in Pandemic
+ D = CreateRandomVirus(count_of_symptoms = rand(4, 6), resistance = rand(0,11), stealth = pick(0,0,1,1,2),
+ stage_rate = rand(-11,5), transmittable = rand(5,9), severity = rand(0,5))
else
- var/datum/disease/advance/A = new /datum/disease/advance
- A.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) // random silly name
- A.symptoms = A.GenerateSymptoms(1,9,6)
- A.Refresh()
- A.AssignProperties(list("resistance" = rand(0,11), "stealth" = rand(0,2), "stage_rate" = rand(0,5), "transmittable" = rand(0,5), "severity" = rand(0,10)))
- D = A
-
- D.carrier = TRUE
+ D = new virus_type()
/datum/event/disease_outbreak/announce()
GLOB.event_announcement.Announce("Вспышка вирусной угрозы 7-го уровня зафиксирована на борту станции [station_name()]. Всему персоналу надлежит сдержать ее распространение.", "ВНИМАНИЕ: БИОЛОГИЧЕСКАЯ УГРОЗА.", new_sound = 'sound/AI/outbreak7.ogg')
@@ -33,15 +41,17 @@
for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list))
if(!H.client)
continue
- if(issmall(H)) //don't infect monkies; that's a waste
- continue
var/turf/T = get_turf(H)
if(!T)
continue
if(!is_station_level(T.z))
continue
- if(!H.ForceContractDisease(D))
+ if(istype(D, /datum/disease/virus/advance))
+ var/datum/disease/virus/advance/old_virus = locate() in H.diseases
+ if(old_virus)
+ old_virus.cure(need_immunity = FALSE)
+ if(!D.Contract(H, is_carrier = TRUE))
continue
patient_zero = H
break
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index 53923f4d124..e7033c1fa7a 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -7,12 +7,12 @@
if(!H.get_int_organ(/obj/item/organ/internal/appendix))
continue
var/foundAlready = FALSE //don't infect someone that already has appendicitis
- for(var/datum/disease/appendicitis/A in H.viruses)
+ for(var/datum/disease/appendicitis/A in H.diseases)
foundAlready = TRUE
break
if(H.stat == DEAD || foundAlready)
continue
- var/datum/disease/D = new /datum/disease/appendicitis
- H.ForceContractDisease(D)
+ var/datum/disease/appendicitis/D = new
+ D.Contract(H)
break
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
index 6c1964b8994..ce40ea54e9d 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
@@ -306,6 +306,10 @@
/obj/machinery/bottler/attack_hand(mob/user)
if(stat & BROKEN)
return
+
+ if(..())
+ return TRUE
+
add_fingerprint(user)
interact(user)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
index a698c6679b8..adfed758c15 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
@@ -69,6 +69,9 @@
return 0
/obj/machinery/juicer/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
user.set_machine(src)
interact(user)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index ab39dcb7f44..934bec6307f 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -597,7 +597,9 @@
spawn_meds = list(
/obj/item/reagent_containers/syringe/antiviral = 4,
/obj/item/reagent_containers/glass/bottle/cold = 1,
- /obj/item/reagent_containers/glass/bottle/flu_virion = 1,
+ /obj/item/reagent_containers/glass/bottle/flu = 1,
+ /obj/item/reagent_containers/glass/bottle/sneezing = 1,
+ /obj/item/reagent_containers/glass/bottle/cough = 1,
/obj/item/reagent_containers/glass/bottle/mutagen = 1,
/obj/item/reagent_containers/glass/bottle/plasma = 1,
/obj/item/reagent_containers/glass/bottle/diphenhydramine = 1
@@ -621,7 +623,9 @@
spawn_meds = list(
/obj/item/reagent_containers/syringe/antiviral = 4,
/obj/item/reagent_containers/glass/bottle/cold = 1,
- /obj/item/reagent_containers/glass/bottle/flu_virion = 1,
+ /obj/item/reagent_containers/glass/bottle/flu = 1,
+ /obj/item/reagent_containers/glass/bottle/sneezing = 1,
+ /obj/item/reagent_containers/glass/bottle/cough = 1,
/obj/item/reagent_containers/glass/bottle/mutagen = 1,
/obj/item/reagent_containers/glass/bottle/plasma = 1,
/obj/item/reagent_containers/glass/bottle/reagent/synaptizine = 1,
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 3dcad99d53f..9f0c5a9cb35 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -137,6 +137,8 @@
src.amount = am
/obj/machinery/seed_extractor/attack_hand(mob/user)
+ if(..())
+ return TRUE
interact(user)
/obj/machinery/seed_extractor/attack_ghost(mob/user)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index 09f09929944..a489c947a6d 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -51,6 +51,9 @@
return ..()
/obj/machinery/mineral/labor_claim_console/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index 415181d4222..7b0810c814e 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -161,15 +161,15 @@
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
qdel(src)
-/datum/disease/transformation/dragon
+/datum/disease/virus/transformation/dragon
name = "dragon transformation"
- cure_text = "nothing"
+ cure_text = "Nothing"
cures = list("adminordrazine")
agent = "dragon's blood"
desc = "What do dragons have to do with Space Station 13?"
stage_prob = 20
severity = BIOHAZARD
- visibility_flags = 0
+ visibility_flags = VISIBLE
stage1 = list("Your bones ache.")
stage2 = list("Your skin feels scaley.")
stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.")
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index f7e84abece4..6d3b6965764 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -19,6 +19,9 @@
qdel(src)
/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
var/obj/item/stack/sheet/s
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 341585cdadf..cfd3bc0b59f 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -48,15 +48,13 @@
if(!iscarbon(user))
return
- for(var/thing in viruses)
- var/datum/disease/D = thing
- if(D.IsSpreadByTouch())
- user.ContractDisease(D)
-
- for(var/thing in user.viruses)
- var/datum/disease/D = thing
- if(D.IsSpreadByTouch())
- ContractDisease(D)
+ for(var/datum/disease/virus/V in diseases)
+ if(V.spread_flags & CONTACT)
+ V.Contract(user, act_type = CONTACT, need_protection_check = TRUE, zone = user.hand ? "l_hand" : "r_hand")
+
+ for(var/datum/disease/virus/V in user.diseases)
+ if(V.spread_flags & CONTACT)
+ V.Contract(src, act_type = CONTACT, need_protection_check = TRUE, zone = user.zone_selected)
if(lying && surgeries.len)
if(user.a_intent == INTENT_HELP)
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 8d03128a20e..4b99f0c627e 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -114,6 +114,16 @@
else
return 0
+/mob/living/carbon/human/proc/check_brain_for_complex_interactions()
+ if(getBrainLoss() >= 60 || prob(getBrainLoss()))
+ return FALSE
+ var/datum/disease/virus/advance/A = locate(/datum/disease/virus/advance) in diseases
+ if(istype(A))
+ var/datum/symptom/headache/S = locate(/datum/symptom/headache) in A.symptoms
+ if(istype(S))
+ return FALSE
+ return TRUE
+
//These procs fetch a cumulative total damage from all organs
/mob/living/carbon/human/getBruteLoss()
if(status_flags & GODMODE)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index e9160944cfb..e7ea6a330da 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -380,6 +380,9 @@
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
var/mult = dna.species.coldmod
if(mult>0)
+ if(bodytemperature < dna.species.cold_level_2 && prob(1))
+ var/datum/disease/virus/cold/D = new
+ D.Contract(src)
if(bodytemperature >= dna.species.cold_level_2 && bodytemperature <= dna.species.cold_level_1)
throw_alert("temp", /obj/screen/alert/cold, 1)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature")
@@ -679,8 +682,8 @@
overeatduration -= 2
if(!ismachineperson(src) && !isLivingSSD(src) && nutrition < NUTRITION_LEVEL_HYPOGLYCEMIA) //Gosh damn snowflakey IPCs
- var/datum/disease/D = new /datum/disease/critical/hypoglycemia
- ForceContractDisease(D)
+ var/datum/disease/critical/hypoglycemia/D = new
+ D.Contract(src)
//metabolism change
if(nutrition > NUTRITION_LEVEL_FAT)
@@ -748,24 +751,24 @@
var/mob/living/carbon/human/H = src
H.set_heartattack(TRUE)
if(prob(health * -0.2))
- var/datum/disease/D = new /datum/disease/critical/heart_failure
- ForceContractDisease(D)
+ var/datum/disease/critical/heart_failure/D = new
+ D.Contract(src)
Paralyse(10 SECONDS)
if(-99 to -80)
adjustOxyLoss(1)
if(prob(4))
to_chat(src, "Your chest hurts...")
Paralyse(4 SECONDS)
- var/datum/disease/D = new /datum/disease/critical/heart_failure
- ForceContractDisease(D)
+ var/datum/disease/critical/heart_failure/D = new
+ D.Contract(src)
if(-79 to -50)
adjustOxyLoss(1)
if(prob(10))
- var/datum/disease/D = new /datum/disease/critical/shock
- ForceContractDisease(D)
+ var/datum/disease/critical/shock/D = new
+ D.Contract(src)
if(prob(health * -0.08))
- var/datum/disease/D = new /datum/disease/critical/heart_failure
- ForceContractDisease(D)
+ var/datum/disease/critical/heart_failure/D = new
+ D.Contract(src)
if(prob(6))
to_chat(src, "You feel [pick("horrible pain", "awful", "like shit", "absolutely awful", "like death", "like you are dying", "nothing", "warm", "sweaty", "tingly", "really, really bad", "horrible")]!")
Weaken(6 SECONDS)
@@ -774,8 +777,8 @@
if(-49 to 0)
adjustOxyLoss(1)
if(prob(3))
- var/datum/disease/D = new /datum/disease/critical/shock
- ForceContractDisease(D)
+ var/datum/disease/critical/shock/D = new
+ D.Contract(src)
if(prob(5))
to_chat(src, "You feel [pick("terrible", "awful", "like shit", "sick", "numb", "cold", "sweaty", "tingly", "horrible")]!")
Weaken(6 SECONDS)
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index 5645c648fac..7c19265fbf9 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -538,6 +538,25 @@
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_selected))
var/armor_block = target.run_armor_check(affecting, "melee")
+ // Contract diseases
+
+ //user beats target, check target's defense in selected zone
+ for(var/datum/disease/virus/V in user.diseases)
+ var/is_infected = FALSE
+ if(attack.is_bite && (V.spread_flags & BITES))
+ is_infected = V.Contract(target, act_type = BITES|CONTACT, need_protection_check = TRUE, zone = affecting)
+ if(!is_infected && (V.spread_flags & CONTACT))
+ V.Contract(target, act_type = CONTACT, need_protection_check = TRUE, zone = affecting)
+
+ //check user's defense in attacking zone (hands or mouth)
+ for(var/datum/disease/virus/V in target.diseases)
+ var/is_infected = FALSE
+ if(attack.is_bite && (V.spread_flags > NON_CONTAGIOUS))
+ //infected blood contacts with mouth, ignore protection & spread_flags
+ is_infected = V.Contract(user, need_protection_check = FALSE)
+ if(!is_infected && (V.spread_flags & CONTACT))
+ V.Contract(user, act_type = CONTACT, need_protection_check = TRUE, zone = user.hand ? "l_hand" : "r_hand")
+
playsound(target.loc, attack.attack_sound, 25, 1, -1)
target.visible_message("[user.declent_ru(NOMINATIVE)] [attack_species] [target.declent_ru(ACCUSATIVE)]!")
@@ -682,6 +701,7 @@
var/sharp = FALSE
var/animation_type = ATTACK_EFFECT_PUNCH
var/harmless = FALSE //if set to true, attacks won't be admin logged and punches will "hit" for no damage
+ var/is_bite = FALSE
/datum/unarmed_attack/diona
attack_verb = list("охлестал", "тяжело стукнул", "лозой хлестанул", "ветвью щелкнул")
@@ -699,6 +719,7 @@
attack_sound = 'sound/weapons/bite.ogg'
sharp = TRUE
animation_type = ATTACK_EFFECT_BITE
+ is_bite = TRUE
/datum/unarmed_attack/claws/armalis
attack_verb = list("хлестает", "хлестанул", "искромсал", "разорвал") //армалисами почти никто не пользуется. Зачем вносить пол вырезаной расе которой никогда не будет в игре?
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 7f38a0de6fb..752607c835a 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -207,15 +207,6 @@
var/obj/item/organ/internal/O = thing
O.on_life()
-/mob/living/carbon/handle_diseases()
- for(var/thing in viruses)
- var/datum/disease/D = thing
- if(prob(D.infectivity))
- D.spread()
-
- if(stat != DEAD)
- D.stage_act()
-
//remember to remove the "proc" of the child procs of these.
/mob/living/carbon/proc/handle_blood()
return
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 9125fd67487..e5a658c4b04 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -42,7 +42,7 @@
//Random events (vomiting etc)
handle_random_events()
- if(LAZYLEN(viruses))
+ if(LAZYLEN(diseases))
handle_diseases()
if(QDELETED(src)) // diseases can qdel the mob via transformations
@@ -111,7 +111,9 @@
return
/mob/living/proc/handle_diseases()
- return
+ for(var/thing in diseases)
+ var/datum/disease/D = thing
+ D.stage_act()
/mob/living/proc/handle_random_events()
return
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 8fc051771bd..1d3ada3cd20 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -543,6 +543,7 @@
SetDeaf(0)
heal_overall_damage(1000, 1000)
ExtinguishMob()
+ CureAllDiseases(FALSE)
fire_stacks = 0
on_fire = 0
suiciding = 0
@@ -553,9 +554,9 @@
var/mob/living/carbon/C = src
C.uncuff()
- for(var/thing in C.viruses)
+ for(var/thing in C.diseases)
var/datum/disease/D = thing
- D.cure(0)
+ D.cure(need_immunity = FALSE)
// restore all of the human's blood and reset their shock stage
if(ishuman(src))
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 8f34b956cec..676fc3368c2 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -399,9 +399,9 @@
if(!treat_virus)
return
- for(var/datum/disease/D as anything in C.viruses)
- if(!(D.visibility_flags & HIDDEN_SCANNER && D.visibility_flags & HIDDEN_PANDEMIC) && D.severity != NONTHREAT && (D.stage > 1 || D.spread_flags & AIRBORNE))
- return TRUE //Medbots see viruses that aren't fully hidden and have developed enough/are airborne, ignoring safe viruses
+ for(var/datum/disease/D as anything in C.diseases)
+ if(!(D.visibility_flags & HIDDEN_HUD) && D.discovered && D.severity != NONTHREAT)
+ return TRUE //Medbots see viruses if they displayed on HUD, ignoring safe viruses
/mob/living/simple_animal/bot/medbot/proc/select_medication(mob/living/carbon/C, beaker_injection)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 94f48b21b61..9a70d2fca61 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -815,6 +815,16 @@
if(target)
shootAt(target)
+/mob/living/simple_animal/pet/dog/corgi/borgi/attackby(obj/item/I, mob/living/user)
+ if(istype(I, /obj/item/stack/nanopaste))
+ var/obj/item/stack/nanopaste/N = I
+ N.use(1)
+ if(diseases?.len)
+ CureAllDiseases()
+ visible_message("[name] looks happy! ")
+ chasetail()
+ return ..()
+
/mob/living/simple_animal/pet/dog/corgi/borgi/death(gibbed)
// Only execute the below if we successfully died
. = ..(gibbed)
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 934040052b3..1c275670e2f 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -170,7 +170,7 @@
beegent.reaction_mob(L, REAGENT_INGEST)
L.reagents.add_reagent(beegent.id, rand(1, 5))
else
- L.reagents.add_reagent("spidertoxin", 5)
+ L.reagents.add_reagent("beetoxin", 5)
/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R)
if(istype(R))
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 78d4cd7e94e..fd5291d7991 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -486,10 +486,10 @@
return S
-/mob/living/proc/AdjustSlowedDuration(amount)
+/mob/living/proc/AdjustSlowedDuration(amount, bound_lower = 0, bound_upper = INFINITY)
var/datum/status_effect/incapacitating/slowed/S = IsSlowed()
if(S)
- S.duration += amount
+ S.duration = directional_bounded_sum(S.duration, amount, bound_lower, bound_upper)
/mob/living/proc/AdjustSlowedIntensity(intensity)
var/datum/status_effect/incapacitating/slowed/S = IsSlowed()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 8b9da7b61bc..9ea77a4d555 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -7,7 +7,7 @@
if(mind && mind.current == src)
spellremove(src)
mobspellremove(src)
- QDEL_LIST(viruses)
+ QDEL_LIST(diseases)
for(var/alert in alerts)
clear_alert(alert)
ghostize()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index cbd5297dfd0..02f1b81a099 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -150,7 +150,7 @@
//List of active diseases
- var/list/viruses = list() // list of all diseases in a mob
+ var/list/diseases = list() // list of all diseases in a mob
var/list/resistances = list()
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 32d4ebba41e..d31682694ab 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -432,13 +432,23 @@
return FALSE
user.visible_message("[user.name] поглоща[pluralize_ru(user.gender,"ет","ют")] [affecting.name]!")
+
if(affecting.mind)
add_attack_logs(attacker, affecting, "Devoured")
+
if(isvampire(user))
user.adjust_nutrition(affecting.blood_nutrients)
else
user.adjust_nutrition(10 * affecting.health)
+ for(var/datum/disease/virus/V in affecting.diseases)
+ if(V.spread_flags > NON_CONTAGIOUS)
+ V.Contract(user)
+
+ for(var/datum/disease/virus/V in user.diseases)
+ if(V.spread_flags > NON_CONTAGIOUS)
+ V.Contract(affecting)
+
affecting.forceMove(user)
LAZYADD(attacker.stomach_contents, affecting)
qdel(src)
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index e14de64d365..af1305c0ff4 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -81,6 +81,9 @@ GLOBAL_LIST_EMPTY(fax_blacklist)
GLOB.hidden_ussp |= department
/obj/machinery/photocopier/faxmachine/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 3f8f48dee88..6b93e7dc6dc 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -20,6 +20,7 @@
resistance_flags = FLAMMABLE
max_integrity = 50
attack_verb = list("bapped")
+ permeability_coefficient = 0.01
dog_fashion = /datum/dog_fashion/head
var/header //Above the main body, displayed at the top
var/info //What's actually written on the paper.
@@ -782,7 +783,8 @@
STOP_PROCESSING(SSobj, src)
if(mytarget && !used)
var/mob/living/carbon/target = mytarget
- target.ForceContractDisease(new /datum/disease/transformation/corgi)
+ var/datum/disease/virus/transformation/corgi/D = new
+ D.Contract(target)
return ..()
@@ -806,10 +808,12 @@
var/obj/machinery/photocopier/faxmachine/fax = locateUID(faxmachineid)
if(myeffect == "Borgification")
to_chat(target,"You seem to comprehend the AI a little better. Why are your muscles so stiff?")
- target.ForceContractDisease(new /datum/disease/transformation/robot)
+ var/datum/disease/virus/transformation/robot/D = new
+ D.Contract(target)
else if(myeffect == "Corgification")
to_chat(target,"You hear distant howling as the world seems to grow bigger around you. Boy, that itch sure is getting worse!")
- target.ForceContractDisease(new /datum/disease/transformation/corgi)
+ var/datum/disease/virus/transformation/corgi/D = new
+ D.Contract(target)
else if(myeffect == "Death By Fire")
to_chat(target,"You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting?")
var/turf/simulated/T = get_turf(target)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 985d4210e4c..714122fd12d 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -816,6 +816,10 @@
/obj/machinery/power/apc/attack_hand(mob/user)
if(!user)
return
+
+ if(..())
+ return TRUE
+
add_fingerprint(user)
if(usr == user && opened && !issilicon(user))
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 38e6fa9924d..1ded07a2a83 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -37,6 +37,9 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
+
if(anchored)
if(!src.locked)
add_fingerprint(user)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 92cd9599ff3..8caccfba7cc 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -37,6 +37,9 @@
return attack_hand(user)
/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
if(construction_state >= 3)
interact(user)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 4d5aa5a4617..da3f01f882d 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -353,6 +353,9 @@
ui_interact(user)
/obj/machinery/power/smes/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 62226f7b301..177c0708765 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -336,6 +336,10 @@
/obj/machinery/chem_dispenser/attack_hand(mob/user)
if(stat & BROKEN)
return
+
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index 8aa1f4c2366..502eca34007 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -99,6 +99,8 @@
default_deconstruction_crowbar(user, I)
/obj/machinery/chem_heater/attack_hand(mob/user)
+ if(..())
+ return TRUE
ui_interact(user)
/obj/machinery/chem_heater/attack_ghost(mob/user)
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 1d8f8eda582..799410ad9ec 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -105,19 +105,17 @@
return
else if(href_list["create_virus_culture"])
if(!wait)
- var/type = GetVirusTypeByIndex(text2num(href_list["create_virus_culture"]))//the path is received as string - converting
- var/datum/disease/D = null
- if(!ispath(type))
- D = GetVirusByIndex(text2num(href_list["create_virus_culture"]))
- var/datum/disease/advance/A = GLOB.archive_diseases[D.GetDiseaseID()]
+ var/datum/disease/D = GetVirusByIndex(text2num(href_list["create_virus_culture"]))
+ var/datum/disease/copy = null
+ if(istype(D, /datum/disease/virus/advance))
+ var/datum/disease/virus/advance/A = GLOB.archive_diseases[D.GetDiseaseID()]
if(A)
- D = A.Copy()
- else if(type)
- if(type in GLOB.diseases) // Make sure this is a disease
- D = new type()
- if(!D)
+ copy = A.Copy()
+ if(!copy)
+ copy = D.Copy()
+ if(!copy)
return
- var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN)
+ var/name = stripped_input(usr,"Name:","Name the culture",copy.name,MAX_NAME_LEN)
if(name == null || wait)
return
var/obj/item/reagent_containers/glass/bottle/B = new/obj/item/reagent_containers/glass/bottle(loc)
@@ -125,9 +123,9 @@
B.pixel_x = rand(-3, 3)
B.pixel_y = rand(-3, 3)
replicator_cooldown(50)
- var/list/data = list("viruses"=list(D))
+ var/list/data = list("viruses"=list(copy))
B.name = "[name] culture bottle"
- B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium."
+ B.desc = "A small bottle. Contains [copy.agent] culture in synthblood medium."
B.reagents.add_reagent("blood",20,data)
updateUsrDialog()
else
@@ -155,9 +153,9 @@
return
var/id = GetVirusTypeByIndex(text2num(href_list["name_disease"]))
if(GLOB.archive_diseases[id])
- var/datum/disease/advance/A = GLOB.archive_diseases[id]
+ var/datum/disease/virus/advance/A = GLOB.archive_diseases[id]
A.AssignName(new_name)
- for(var/datum/disease/advance/AD in GLOB.active_diseases)
+ for(var/datum/disease/virus/advance/AD in GLOB.active_diseases)
AD.Refresh()
updateUsrDialog()
else if(href_list["print_form"])
@@ -179,7 +177,7 @@
icon_state = "mixer0"
//Prints a nice virus release form. Props to Urbanliner for the layout
-/obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/advance/D, mob/living/user)
+/obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/virus/advance/D, mob/living/user)
D = GLOB.archive_diseases[D.GetDiseaseID()]
if(!(printing) && D)
var/reason = input(user,"Укажите причину выпуска", "Указать", null) as message
@@ -206,7 +204,7 @@
P.info += "
"
P.info += "Название вируса: [D.name]
"
P.info += "Симптомы: [symtoms]
"
- P.info += "Путь передачи: [D.spread_text]
"
+ P.info += "Путь передачи: [D.additional_info]
"
P.info += "Лекарство от вируса: [D.cure_text]
"
P.info += "
"
P.info += "Причина выпуска: [reason]"
@@ -258,9 +256,9 @@
i++
if(!(D.visibility_flags & HIDDEN_PANDEMIC))
- if(istype(D, /datum/disease/advance))
+ if(istype(D, /datum/disease/virus/advance))
- var/datum/disease/advance/A = D
+ var/datum/disease/virus/advance/A = D
D = GLOB.archive_diseases[A.GetDiseaseID()]
if(D)
if(D.name == "Unknown")
@@ -274,11 +272,12 @@
dat += "Болезнетворный агент: [D?"[D.agent] — Создать бутылёк с вирусной культурой":"нет"]
"
dat += "Общепринятое название: [(D.name||"нет")]
"
dat += "Описание: [(D.desc||"нет")]
"
- dat += "Путь передачи: [(D.spread_text||"нет")]
"
+ dat += "Путь передачи: [(D.additional_info||"нет")]
"
dat += "Возможное лекарство: [(D.cure_text||"нет")]
"
+ dat += "Возможность выработки антител: [(D.can_immunity ? "Присутствует" : "Отсутствует")]
"
- if(istype(D, /datum/disease/advance))
- var/datum/disease/advance/A = D
+ if(istype(D, /datum/disease/virus/advance))
+ var/datum/disease/virus/advance/A = D
dat += "Симптомы: "
var/english_symptoms = list()
for(var/datum/symptom/S in A.symptoms)
@@ -301,7 +300,7 @@
var/disease_name = "Unknown"
if(!ispath(type))
- var/datum/disease/advance/A = GLOB.archive_diseases[type]
+ var/datum/disease/virus/advance/A = GLOB.archive_diseases[type]
if(A)
disease_name = A.name
else
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index c08b5a4fafc..e8acaa151ca 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -238,11 +238,13 @@
/obj/machinery/reagentgrinder/attack_ai(mob/user)
- return FALSE
+ return FALSE
/obj/machinery/reagentgrinder/attack_hand(mob/user)
- user.set_machine(src)
- interact(user)
+ if(..())
+ return TRUE
+ user.set_machine(src)
+ interact(user)
/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu
var/is_chamber_empty = 0
diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm
index 97bfb6eba7a..aeaffa9dfcb 100644
--- a/code/modules/reagents/chemistry/reagents/admin.dm
+++ b/code/modules/reagents/chemistry/reagents/admin.dm
@@ -49,11 +49,11 @@
M.SetConfused(0)
M.SetSleeping(0, FALSE)
M.SetJitter(0)
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
if(D.severity == NONTHREAT)
continue
- D.cure(0)
+ D.cure(need_immunity = FALSE)
..()
return STATUS_UPDATE_ALL
diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm
index 736e78a5c5e..dd14a22b989 100644
--- a/code/modules/reagents/chemistry/reagents/disease.dm
+++ b/code/modules/reagents/chemistry/reagents/disease.dm
@@ -25,7 +25,8 @@
/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M)
if(volume > 1.5)
- M.ForceContractDisease(new /datum/disease/transformation/robot)
+ var/datum/disease/virus/transformation/robot/D = new
+ D.Contract(M)
return ..()
@@ -39,7 +40,8 @@
/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M)
if(volume > 1.5)
- M.ContractDisease(new /datum/disease/transformation/xeno)
+ var/datum/disease/virus/transformation/xeno/D = new
+ D.Contract(M)
return ..()
/datum/reagent/fungalspores
@@ -52,7 +54,8 @@
/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M)
if(volume > 2.5)
- M.ForceContractDisease(new /datum/disease/tuberculosis)
+ var/datum/disease/virus/tuberculosis/D = new
+ D.Contract(M)
return ..()
/datum/reagent/jagged_crystals
@@ -65,7 +68,8 @@
taste_mult = 0
/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M)
- M.ForceContractDisease(new /datum/disease/berserker)
+ var/datum/disease/berserker/D = new
+ D.Contract(M)
return ..()
/datum/reagent/salmonella
@@ -78,7 +82,8 @@
taste_mult = 0
/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M)
- M.ForceContractDisease(new /datum/disease/food_poisoning)
+ var/datum/disease/food_poisoning/D = new
+ D.Contract(M)
return ..()
/datum/reagent/gibbis
@@ -92,7 +97,8 @@
/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M)
if(volume > 2.5)
- M.ForceContractDisease(new /datum/disease/gbs/curable)
+ var/datum/disease/virus/gbs/non_con/D = new
+ D.Contract(M)
return ..()
/datum/reagent/prions
@@ -106,7 +112,8 @@
/datum/reagent/prions/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
- M.ForceContractDisease(new /datum/disease/kuru)
+ var/datum/disease/kuru/D = new
+ D.Contract(M)
return ..()
/datum/reagent/grave_dust
@@ -120,7 +127,8 @@
/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
- M.ForceContractDisease(new /datum/disease/vampire)
+ var/datum/disease/vampire/D = new
+ D.Contract(M)
return ..()
/datum/reagent/bacon_grease
@@ -134,7 +142,8 @@
/datum/reagent/bacon_grease/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
- M.ForceContractDisease(new /datum/disease/critical/heart_failure)
+ var/datum/disease/critical/heart_failure/D = new
+ D.Contract(M)
return ..()
/datum/reagent/heartworms
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
index 7fd74a4c863..b523dd0faf8 100644
--- a/code/modules/reagents/chemistry/reagents/food.dm
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -885,7 +885,8 @@
to_chat(H, "Ugh! Eating that was a terrible idea!")
if(NO_HUNGER in H.dna.species.species_traits) //If you don't eat, then you can't get food poisoning
return
- H.ForceContractDisease(new /datum/disease/food_poisoning)
+ var/datum/disease/food_poisoning/D = new
+ D.Contract(H)
/datum/reagent/msg
name = "Monosodium glutamate"
@@ -931,7 +932,8 @@
else if(volume >= 150 && prob(volume*0.01))
to_chat(M, "Your chest is burning with pain!")
M.Weaken(2 SECONDS)
- M.ForceContractDisease(new /datum/disease/critical/heart_failure)
+ var/datum/disease/critical/heart_failure/D = new
+ D.Contract(M)
return ..() | update_flags
/datum/reagent/fungus
@@ -950,7 +952,8 @@
M.reagents.add_reagent("toxin", rand(1,5))
else if(ranchance <= 5)
to_chat(M, "That tasted absolutely FOUL.")
- M.ForceContractDisease(new /datum/disease/food_poisoning)
+ var/datum/disease/food_poisoning/D = new
+ D.Contract(M)
else
to_chat(M, "Yuck!")
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index 3dcd83a1bf9..a0a2d0450dd 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -1349,7 +1349,7 @@
I.heal_internal_damage(4)
if(H.blood_volume < BLOOD_VOLUME_NORMAL * 0.9)// If below 90% blood, regenerate 225 units total
H.blood_volume += 15
- for(var/datum/disease/critical/heart_failure/HF in H.viruses)
+ for(var/datum/disease/critical/heart_failure/HF in H.diseases)
HF.cure() //Won't fix a stopped heart, but it will sure fix a critical one. Shock is not fixed as healing will fix it
if(M.health < 40)
update_flags |= M.adjustOxyLoss(-3, FALSE)
diff --git a/code/modules/reagents/chemistry/reagents/ninja.dm b/code/modules/reagents/chemistry/reagents/ninja.dm
index 62e716f108c..e2a9fabae5b 100644
--- a/code/modules/reagents/chemistry/reagents/ninja.dm
+++ b/code/modules/reagents/chemistry/reagents/ninja.dm
@@ -100,7 +100,7 @@
if(our_ears.damage < 25 && prob(30))
mob_human.SetDeaf(0)
//ALL viruses
- for(var/thing in mob_human.viruses)
+ for(var/thing in mob_human.diseases)
var/datum/disease/our_disease = thing
our_disease.cure(0)
//Genes(resets them like mutadone)
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index c528033c9e8..7a95340c09e 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -25,6 +25,61 @@
update_flags |= M.adjustToxLoss(1.5, FALSE)
return ..() | update_flags
+/datum/reagent/bee_venom
+ name = "Bee venom"
+ id = "beetoxin"
+ description = "A toxic venom injected by space bees."
+ reagent_state = LIQUID
+ color = "#ff932f"
+ taste_description = "pain"
+
+/datum/reagent/bee_venom/on_mob_life(mob/living/M)
+ var/update_flags = STATUS_UPDATE_NONE
+ update_flags |= M.adjustToxLoss(1.5, FALSE)
+ return ..() | update_flags
+
+//bee venom specially for Beesease bees
+/datum/reagent/bee_venom_beesease
+ name = "Bee venom"
+ id = "beetoxinbeesease"
+ description = "A toxic venom injected by space bees."
+ reagent_state = LIQUID
+ color = "#ff932f"
+ taste_description = "pain"
+ overdose_threshold = 30
+
+/datum/reagent/bee_venom_beesease/on_mob_life(mob/living/M)
+ var/update_flags = STATUS_UPDATE_NONE
+ update_flags |= M.adjustToxLoss(0.1, FALSE)
+ return ..() | update_flags
+
+/datum/reagent/bee_venom_beesease/overdose_process(mob/living/M, severity)
+ var/list/overdose_info = ..()
+ var/effect = overdose_info[REAGENT_OVERDOSE_EFFECT]
+ var/update_flags = overdose_info[REAGENT_OVERDOSE_FLAGS]
+ switch(severity)
+ //30-60 units
+ if(1)
+ M.Slowed(3 SECONDS, 3)
+ M.damageoverlaytemp = 50
+ update_flags |= M.adjustToxLoss(0.75, FALSE)
+ if(effect <= 5)
+ M.Jitter(8 SECONDS)
+ else if(effect <= 7)
+ M.Stuttering(8 SECONDS)
+ //60 - Infinity units
+ if(2)
+ M.Slowed(3 SECONDS, 6)
+ M.damageoverlaytemp = 90
+ update_flags |= M.adjustToxLoss(1.5, FALSE)
+ if(effect <= 3)
+ M.Weaken(4 SECONDS)
+ M.Jitter(8 SECONDS)
+ M.Stuttering(8 SECONDS)
+ else if(effect <= 7)
+ M.Stuttering(8 SECONDS)
+ return list(effect, update_flags)
+
/datum/reagent/minttoxin
name = "Mint Toxin"
id = "minttoxin"
@@ -99,7 +154,8 @@
/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
if(method != REAGENT_TOUCH)
- M.ForceContractDisease(new /datum/disease/transformation/slime)
+ var/datum/disease/virus/transformation/slime/D = new
+ D.Contract(M)
/datum/reagent/mercury
@@ -1246,7 +1302,8 @@
taste_description = "decay"
/datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=REAGENT_TOUCH, reac_volume)
- L.ForceContractDisease(new /datum/disease/transformation/morph)
+ var/datum/disease/virus/transformation/morph/D = new
+ D.Contract(L)
/datum/reagent/bungotoxin
name = "Bungotoxin"
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 8e5617acceb..84b1bd05779 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -105,15 +105,15 @@
/datum/reagent/blood/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
if(data && data["viruses"])
for(var/thing in data["viruses"])
- var/datum/disease/D = thing
+ var/datum/disease/virus/V = thing
- if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
+ if(V.spread_flags < BLOOD)
continue
if(method == REAGENT_TOUCH)
- M.ContractDisease(D)
- else //ingest, patch or inject
- M.ForceContractDisease(D)
+ V.Contract(M, need_protection_check = TRUE, act_type = CONTACT)
+ else
+ V.Contract(M, need_protection_check = FALSE)
if(method == REAGENT_INGEST && iscarbon(M))
var/mob/living/carbon/C = M
@@ -138,19 +138,19 @@
// Stop issues with the list changing during mixing.
var/list/to_mix = list()
- for(var/datum/disease/advance/AD in mix1)
+ for(var/datum/disease/virus/advance/AD in mix1)
to_mix += AD
- for(var/datum/disease/advance/AD in mix2)
+ for(var/datum/disease/virus/advance/AD in mix2)
to_mix += AD
- var/datum/disease/advance/AD = Advance_Mix(to_mix)
+ var/datum/disease/virus/advance/AD = Advance_Mix(to_mix)
var/list/preserve = list()
if(istype(AD))
preserve += AD
for(var/datum/disease/D in data["viruses"] + mix_data["viruses"])
- if(!istype(D, /datum/disease/advance))
+ if(!istype(D, /datum/disease/virus/advance))
preserve += D.Copy()
data["viruses"] = preserve
@@ -186,15 +186,15 @@
/datum/reagent/blood/synthetic/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
if(data && data["viruses"])
for(var/thing in data["viruses"])
- var/datum/disease/D = thing
+ var/datum/disease/virus/V = thing
- if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
+ if(V.spread_flags < BLOOD)
continue
if(method == REAGENT_TOUCH)
- M.ContractDisease(D)
- else //ingest, patch or inject
- M.ForceContractDisease(D)
+ V.Contract(M, need_protection_check = TRUE, act_type = CONTACT)
+ else
+ V.Contract(M, need_protection_check = FALSE)
/datum/reagent/blood/synthetic/vox
name = "Synthetic Blood"
@@ -243,7 +243,7 @@
/datum/reagent/vaccine/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
if(islist(data) && (method == REAGENT_INGEST))
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
if(D.GetDiseaseID() in data)
D.cure()
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 487677c184c..ef5fe406b31 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -680,7 +680,7 @@
/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B && B.data)
- var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
+ var/datum/disease/virus/advance/D = locate(/datum/disease/virus/advance) in B.data["viruses"]
if(D)
D.Evolve(level_min, level_max)
@@ -750,6 +750,6 @@
/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B && B.data)
- var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
+ var/datum/disease/virus/advance/D = locate(/datum/disease/virus/advance) in B.data["viruses"]
if(D)
D.Devolve()
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 5b753e5f3c1..5dc907fbd58 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -281,204 +281,216 @@
icon_state = "wide_bottle"
list_reagents = list("potass_iodide" = 30)
-/obj/item/reagent_containers/glass/bottle/flu_virion
+/obj/item/reagent_containers/glass/bottle/cold
+ name = "Rhinovirus culture bottle"
+ desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
+ icon_state = "round_bottle"
+ spawned_disease = /datum/disease/virus/cold
+
+/obj/item/reagent_containers/glass/bottle/flu
name = "Flu virion culture bottle"
desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/flu
+ spawned_disease = /datum/disease/virus/flu
+
+/obj/item/reagent_containers/glass/bottle/sneezing
+ name = "Sneezing symptom bottle"
+ desc = "A small bottle. Contains a simple advanced virus in synthblood medium that makes infected sneeze."
+ icon_state = "round_bottle"
+ spawned_disease = /datum/disease/virus/advance/preset/sneezing
+
+/obj/item/reagent_containers/glass/bottle/cough
+ name = "Cough symptom bottle"
+ desc = "A small bottle. Contains a simple advanced virus in synthblood medium that makes infected cough."
+ icon_state = "round_bottle"
+ spawned_disease = /datum/disease/virus/advance/preset/cough
/obj/item/reagent_containers/glass/bottle/epiglottis_virion
name = "Epiglottis virion culture bottle"
desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/voice_change
+ spawned_disease = /datum/disease/virus/advance/preset/voice_change
/obj/item/reagent_containers/glass/bottle/liver_enhance_virion
name = "Liver enhancement virion culture bottle"
desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/heal
+ spawned_disease = /datum/disease/virus/advance/preset/heal
/obj/item/reagent_containers/glass/bottle/hullucigen_virion
name = "Hullucigen virion culture bottle"
desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/hullucigen
+ spawned_disease = /datum/disease/virus/advance/preset/hullucigen
/obj/item/reagent_containers/glass/bottle/pierrot_throat
name = "Pierrot's Throat culture bottle"
desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/pierrot_throat
-
-/obj/item/reagent_containers/glass/bottle/cold
- name = "Rhinovirus culture bottle"
- desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
- icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/cold
+ spawned_disease = /datum/disease/virus/pierrot_throat
/obj/item/reagent_containers/glass/bottle/mind_restoration
name = "Reality Purifier culture bottle"
desc = "A small bottle. Contains Reality Purifier culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/mind_restoration
+ spawned_disease = /datum/disease/virus/advance/preset/mind_restoration
/obj/item/reagent_containers/glass/bottle/advanced_regeneration
name = "Advanced Neogenesis culture bottle"
desc = "A small bottle. Contains Advanced Neogenesis culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/advanced_regeneration
+ spawned_disease = /datum/disease/virus/advance/preset/advanced_regeneration
/obj/item/reagent_containers/glass/bottle/stealth_necrosis
name = "Necroeyrosis culture bottle"
desc = "A small bottle. Contains Necroeyrosis culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/stealth_necrosis
+ spawned_disease = /datum/disease/virus/advance/preset/stealth_necrosis
/obj/item/reagent_containers/glass/bottle/pre_kingstons
name = "Neverlasting Stranger culture bottle"
desc = "A small bottle. Contains Neverlasting Stranger culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/pre_kingstons
+ spawned_disease = /datum/disease/virus/advance/preset/pre_kingstons
/obj/item/reagent_containers/glass/bottle/love
name = "love"
desc = "love"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/love
+ spawned_disease = /datum/disease/virus/advance/preset/love
/obj/item/reagent_containers/glass/bottle/aggression
name = "aggression"
desc = "aggression"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/aggression
+ spawned_disease = /datum/disease/virus/advance/preset/aggression
/obj/item/reagent_containers/glass/bottle/obsession
name = "obsession"
desc = "obsession"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/obsession
+ spawned_disease = /datum/disease/virus/advance/preset/obsession
/obj/item/reagent_containers/glass/bottle/confusion
name = "confusion"
desc = "confusion"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/confusion
+ spawned_disease = /datum/disease/virus/advance/preset/confusion
/obj/item/reagent_containers/glass/bottle/bones
name = "bones"
desc = "bones"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/bones
+ spawned_disease = /datum/disease/virus/advance/preset/bones
/obj/item/reagent_containers/glass/bottle/limb_throw
name = "limb_throw"
desc = "limb_throw"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/limb_throw
+ spawned_disease = /datum/disease/virus/advance/preset/limb_throw
/obj/item/reagent_containers/glass/bottle/laugh
name = "laugh"
desc = "laugh"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/laugh
+ spawned_disease = /datum/disease/virus/advance/preset/laugh
/obj/item/reagent_containers/glass/bottle/moan
name = "moan"
desc = "moan"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/moan
+ spawned_disease = /datum/disease/virus/advance/preset/moan
/obj/item/reagent_containers/glass/bottle/infection
name = "infection"
desc = "infection"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/infection
+ spawned_disease = /datum/disease/virus/advance/preset/infection
/obj/item/reagent_containers/glass/bottle/loyalty
name = "loyalty"
desc = "loyalty"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/loyalty
+ spawned_disease = /datum/disease/virus/loyalty
/obj/item/reagent_containers/glass/bottle/pre_loyalty
name = "pre_loyalty"
desc = "pre_loyalty"
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/pre_loyalty
+ spawned_disease = /datum/disease/virus/advance/preset/pre_loyalty
/obj/item/reagent_containers/glass/bottle/retrovirus
name = "Retrovirus culture bottle"
desc = "A small bottle. Contains a retrovirus culture in a synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/dna_retrovirus
+ spawned_disease = /datum/disease/virus/dna_retrovirus
/obj/item/reagent_containers/glass/bottle/gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit
icon_state = "round_bottle"
amount_per_transfer_from_this = 5
- spawned_disease = /datum/disease/gbs
+ spawned_disease = /datum/disease/virus/gbs
/obj/item/reagent_containers/glass/bottle/fake_gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit
icon_state = "round_bottle"
- spawned_disease = /datum/disease/fake_gbs
+ spawned_disease = /datum/disease/virus/fake_gbs
/obj/item/reagent_containers/glass/bottle/brainrot
name = "Brainrot culture bottle"
desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/brainrot
+ spawned_disease = /datum/disease/virus/brainrot
/obj/item/reagent_containers/glass/bottle/magnitis
name = "Magnitis culture bottle"
desc = "A small bottle. Contains a small dosage of Fukkos Miracos."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/magnitis
+ spawned_disease = /datum/disease/virus/magnitis
/obj/item/reagent_containers/glass/bottle/wizarditis
name = "Wizarditis culture bottle"
desc = "A small bottle. Contains a sample of Rincewindus Vulgaris."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/wizarditis
+ spawned_disease = /datum/disease/virus/wizarditis
/obj/item/reagent_containers/glass/bottle/anxiety
name = "Severe Anxiety culture bottle"
desc = "A small bottle. Contains a sample of Lepidopticides."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/anxiety
+ spawned_disease = /datum/disease/virus/anxiety
/obj/item/reagent_containers/glass/bottle/beesease
name = "Beesease culture bottle"
desc = "A small bottle. Contains a sample of invasive Apidae."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/beesease
+ spawned_disease = /datum/disease/virus/beesease
/obj/item/reagent_containers/glass/bottle/fluspanish
name = "Spanish flu culture bottle"
desc = "A small bottle. Contains a sample of Inquisitius."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/fluspanish
+ spawned_disease = /datum/disease/virus/fluspanish
/obj/item/reagent_containers/glass/bottle/tuberculosis
name = "Fungal Tuberculosis culture bottle"
desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/tuberculosis
+ spawned_disease = /datum/disease/virus/tuberculosis
/obj/item/reagent_containers/glass/bottle/regeneration
name = "Regeneration culture bottle"
desc = "A small bottle. Contains a sample of a virus that heals toxin damage."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/heal
+ spawned_disease = /datum/disease/virus/advance/preset/heal
/obj/item/reagent_containers/glass/bottle/sensory_restoration
name = "Sensory Restoration culture bottle"
desc = "A small bottle. Contains a sample of a virus that heals sensory damage."
icon_state = "round_bottle"
- spawned_disease = /datum/disease/advance/preset/sensory_restoration
+ spawned_disease = /datum/disease/virus/advance/preset/sensory_restoration
/obj/item/reagent_containers/glass/bottle/tuberculosiscure
name = "BVAK bottle"
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 7e3d219ad52..85e9dc7eaa1 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -129,7 +129,7 @@
var/datum/disease/D = dis
var/virusData = D.name
var/english_symptoms = list()
- var/datum/disease/advance/A = D
+ var/datum/disease/virus/advance/A = D
if(istype(A))
for(var/datum/symptom/S in A.symptoms)
english_symptoms += S.name
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 9cd7fee382a..ef81f6ec415 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -164,6 +164,9 @@
..(O)
/obj/machinery/r_n_d/experimentor/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
user.set_machine(src)
var/dat = {""}
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 6e0cbdb0693..378c865cae1 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -115,6 +115,8 @@ GLOBAL_LIST_EMPTY(message_servers)
/obj/machinery/message_server/attack_hand(user as mob)
// to_chat(user, "There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays.")
+ if(..())
+ return TRUE
add_fingerprint(user)
to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]")
active = !active
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 3133a407ac9..aa5491ed23c 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -42,6 +42,8 @@
w -= src.disable_wire
/obj/machinery/r_n_d/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
add_fingerprint(user)
if(shocked)
shock(user,50)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 55c6ebb949c..3642427b1b8 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -169,6 +169,9 @@
return ..()
/obj/machinery/r_n_d/server/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
+
if(disabled)
return
@@ -342,6 +345,8 @@
/obj/machinery/computer/rdservercontrol/attack_hand(mob/user as mob)
if(stat & (BROKEN|NOPOWER))
return
+ if(..())
+ return TRUE
add_fingerprint(user)
user.set_machine(src)
var/dat = ""
diff --git a/code/modules/shuttle/shuttle_manipulator.dm b/code/modules/shuttle/shuttle_manipulator.dm
index bc9458f3611..8ba798e3bf9 100644
--- a/code/modules/shuttle/shuttle_manipulator.dm
+++ b/code/modules/shuttle/shuttle_manipulator.dm
@@ -59,6 +59,8 @@
. = "ERROR"
/obj/machinery/shuttle_manipulator/attack_hand(mob/user)
+ if(..())
+ return TRUE
add_fingerprint(user)
ui_interact(user)
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 5b8abdff9c4..c53a994afe8 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -419,6 +419,9 @@
playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20)
return 1
+ if(..())
+ return TRUE
+
add_fingerprint(user)
post_signal("supply")
ui_interact(user)
diff --git a/code/modules/station_goals/bfl.dm b/code/modules/station_goals/bfl.dm
index 8cf1bdf3839..7e92559251f 100644
--- a/code/modules/station_goals/bfl.dm
+++ b/code/modules/station_goals/bfl.dm
@@ -81,6 +81,8 @@
var/lavaland_z_lvl // Определяется кодом по имени лаваленда
/obj/machinery/power/bfl_emitter/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
var/response
src.add_fingerprint(user)
if(state)
@@ -247,6 +249,8 @@
var/last_icon_change = 0
/obj/machinery/bfl_receiver/attack_hand(mob/user as mob)
+ if(..())
+ return TRUE
var/response
src.add_fingerprint(user)
if(state)
diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm
index b690dfb39e8..5c855cc5dd0 100644
--- a/code/modules/station_goals/bluespace_tap.dm
+++ b/code/modules/station_goals/bluespace_tap.dm
@@ -375,6 +375,9 @@
/obj/machinery/power/bluespace_tap/attack_hand(mob/user)
+ if(..())
+ return TRUE
+
add_fingerprint(user)
ui_interact(user)
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 32ad1fb564f..65b374eabe2 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -171,10 +171,10 @@
if(blood_id == "blood") //normal blood
if(blood_data["viruses"])
for(var/thing in blood_data["viruses"])
- var/datum/disease/D = thing
- if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
+ var/datum/disease/virus/V = thing
+ if(V.spread_flags < BLOOD)
continue
- C.ForceContractDisease(D)
+ V.Contract(C)
if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)) || !(blood_data["blood_species"] == C.dna.species.blood_species))
C.reagents.add_reagent("toxin", amount * 0.5)
return 1
@@ -196,7 +196,7 @@
blood_data["donor"] = src
blood_data["viruses"] = list()
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
blood_data["viruses"] += D.Copy()
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 8ebefbad9f3..2e11d176c1b 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -180,17 +180,17 @@
addtimer(CALLBACK(src, PROC_REF(recharge)), 300)
addtimer(CALLBACK(src, PROC_REF(message_to_owner), owner, "Your [name] fails to return to its normal rhythm!"), 30)
- if(!(status & ORGAN_DEAD) && !attempted_restart && owner.HasDisease(new /datum/disease/critical/heart_failure))
+ if(!(status & ORGAN_DEAD) && !attempted_restart && owner.HasDisease(/datum/disease/critical/heart_failure))
to_chat(owner, "Your [name] detects a cardiac event and attempts to return to its normal rhythm!")
if(prob(40) && emagged)
attempted_restart = TRUE
- for(var/datum/disease/critical/heart_failure/HF in owner.viruses)
+ for(var/datum/disease/critical/heart_failure/HF in owner.diseases)
HF.cure()
addtimer(CALLBACK(src, PROC_REF(message_to_owner), owner, "Your [name] returns to its normal rhythm!"), 30)
addtimer(CALLBACK(src, PROC_REF(recharge)), 200)
else if(prob(25))
attempted_restart = TRUE
- for(var/datum/disease/critical/heart_failure/HF in owner.viruses)
+ for(var/datum/disease/critical/heart_failure/HF in owner.diseases)
HF.cure()
addtimer(CALLBACK(src, PROC_REF(message_to_owner), owner, "Your [name] returns to its normal rhythm!"), 30)
addtimer(CALLBACK(src, PROC_REF(recharge)), 200)
@@ -256,7 +256,8 @@
owner.adjustFireLoss(numHigh)
if(prob(numMid))
to_chat(owner, "Your [name] lurches awkwardly!")
- owner.ForceContractDisease(new /datum/disease/critical/heart_failure)
+ var/datum/disease/critical/heart_failure/D = new
+ D.Contract(owner)
if(prob(numMid))
to_chat(owner, "Your [name] stops beating!")
Stop()
@@ -272,4 +273,5 @@
owner.adjustFireLoss(numMid)
if(prob(numLow))
to_chat(owner, "Your [name] lurches awkwardly!")
- owner.ForceContractDisease(new /datum/disease/critical/heart_failure)
+ var/datum/disease/critical/heart_failure/D = new
+ D.Contract(owner)
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index 61b3b591ca8..fcce8c7e53b 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -193,5 +193,6 @@ GLOBAL_LIST_EMPTY(limb_icon_cache)
var/n_is = damage_state_text()
if(n_is != damage_state)
damage_state = n_is
+ owner?.UpdateDamageIcon()
return 1
return 0
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index be0514aaab2..31b86db1c01 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -181,12 +181,12 @@
organ_tag = "appendix"
parent_organ = "groin"
slot = "appendix"
- var/inflamed = 0
+ var/inflamed = FALSE
/obj/item/organ/internal/appendix/remove(mob/living/carbon/M, special = 0)
- for(var/datum/disease/appendicitis/A in M.viruses)
+ for(var/datum/disease/appendicitis/A in M.diseases)
A.cure()
- inflamed = 1
+ inflamed = TRUE
update_icon()
. = ..()
@@ -369,7 +369,7 @@
if(germ_level >= INFECTION_LEVEL_TWO)
if(prob(3 * owner.dna.species.germs_growth_rate))
// big message from every 1 damage is not good. If germs growth rate is big, it will spam the chat.
- receive_damage(1, silent = prob(30/owner.dna.species.germs_growth_rate))
+ receive_damage(1, silent = prob(30*owner.dna.species.germs_growth_rate))
/mob/living/carbon/human/proc/check_infections()
var/list/infections = list()
diff --git a/paradise.dme b/paradise.dme
index a27e1384265..071500d7d96 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -400,73 +400,72 @@
#include "code\datums\components\swarming.dm"
#include "code\datums\components\twohanded.dm"
#include "code\datums\diseases\_disease.dm"
+#include "code\datums\diseases\viruses\_virus.dm"
#include "code\datums\diseases\_MobProcs.dm"
-#include "code\datums\diseases\anxiety.dm"
+#include "code\datums\diseases\viruses\anxiety.dm"
#include "code\datums\diseases\appendicitis.dm"
-#include "code\datums\diseases\beesease.dm"
+#include "code\datums\diseases\viruses\beesease.dm"
#include "code\datums\diseases\berserker.dm"
-#include "code\datums\diseases\brainrot.dm"
-#include "code\datums\diseases\cold.dm"
-#include "code\datums\diseases\cold9.dm"
+#include "code\datums\diseases\viruses\brainrot.dm"
+#include "code\datums\diseases\viruses\cold.dm"
#include "code\datums\diseases\critical.dm"
-#include "code\datums\diseases\fake_gbs.dm"
-#include "code\datums\diseases\flu.dm"
-#include "code\datums\diseases\fluspanish.dm"
+#include "code\datums\diseases\viruses\flu.dm"
+#include "code\datums\diseases\viruses\fluspanish.dm"
#include "code\datums\diseases\food_poisoning.dm"
-#include "code\datums\diseases\gbs.dm"
-#include "code\datums\diseases\kingstons.dm"
+#include "code\datums\diseases\viruses\gbs.dm"
+#include "code\datums\diseases\viruses\kingstons.dm"
#include "code\datums\diseases\kuru.dm"
-#include "code\datums\diseases\loyalty_syndrome.dm"
-#include "code\datums\diseases\lycancoughy.dm"
-#include "code\datums\diseases\magnitis.dm"
-#include "code\datums\diseases\pierrot_throat.dm"
-#include "code\datums\diseases\retrovirus.dm"
-#include "code\datums\diseases\rhumba_beat.dm"
-#include "code\datums\diseases\transformation.dm"
-#include "code\datums\diseases\tuberculosis.dm"
+#include "code\datums\diseases\viruses\loyalty_syndrome.dm"
+#include "code\datums\diseases\viruses\lycancoughy.dm"
+#include "code\datums\diseases\viruses\magnitis.dm"
+#include "code\datums\diseases\viruses\pierrot_throat.dm"
+#include "code\datums\diseases\viruses\retrovirus.dm"
+#include "code\datums\diseases\viruses\rhumba_beat.dm"
+#include "code\datums\diseases\viruses\transformation.dm"
+#include "code\datums\diseases\viruses\tuberculosis.dm"
#include "code\datums\diseases\vampire.dm"
-#include "code\datums\diseases\wizarditis.dm"
-#include "code\datums\diseases\advance\advance.dm"
-#include "code\datums\diseases\advance\presets.dm"
-#include "code\datums\diseases\advance\symptoms\beard.dm"
-#include "code\datums\diseases\advance\symptoms\blood.dm"
-#include "code\datums\diseases\advance\symptoms\bones.dm"
-#include "code\datums\diseases\advance\symptoms\booze.dm"
-#include "code\datums\diseases\advance\symptoms\choking.dm"
-#include "code\datums\diseases\advance\symptoms\confusion.dm"
-#include "code\datums\diseases\advance\symptoms\cough.dm"
-#include "code\datums\diseases\advance\symptoms\damage_converter.dm"
-#include "code\datums\diseases\advance\symptoms\deafness.dm"
-#include "code\datums\diseases\advance\symptoms\dizzy.dm"
-#include "code\datums\diseases\advance\symptoms\epinephrine.dm"
-#include "code\datums\diseases\advance\symptoms\fever.dm"
-#include "code\datums\diseases\advance\symptoms\fire.dm"
-#include "code\datums\diseases\advance\symptoms\flesh_eating.dm"
-#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
-#include "code\datums\diseases\advance\symptoms\headache.dm"
-#include "code\datums\diseases\advance\symptoms\heal.dm"
-#include "code\datums\diseases\advance\symptoms\itching.dm"
-#include "code\datums\diseases\advance\symptoms\laugh.dm"
-#include "code\datums\diseases\advance\symptoms\limb_throw.dm"
-#include "code\datums\diseases\advance\symptoms\love.dm"
-#include "code\datums\diseases\advance\symptoms\moan.dm"
-#include "code\datums\diseases\advance\symptoms\oxygen.dm"
-#include "code\datums\diseases\advance\symptoms\painkiller.dm"
-#include "code\datums\diseases\advance\symptoms\sensory.dm"
-#include "code\datums\diseases\advance\symptoms\shedding.dm"
-#include "code\datums\diseases\advance\symptoms\shivering.dm"
-#include "code\datums\diseases\advance\symptoms\skin.dm"
-#include "code\datums\diseases\advance\symptoms\sneeze.dm"
-#include "code\datums\diseases\advance\symptoms\symptoms.dm"
-#include "code\datums\diseases\advance\symptoms\toxification.dm"
-#include "code\datums\diseases\advance\symptoms\uncotrollable.dm"
-#include "code\datums\diseases\advance\symptoms\viral.dm"
-#include "code\datums\diseases\advance\symptoms\vision.dm"
-#include "code\datums\diseases\advance\symptoms\voice_change.dm"
-#include "code\datums\diseases\advance\symptoms\vomit.dm"
-#include "code\datums\diseases\advance\symptoms\weakness.dm"
-#include "code\datums\diseases\advance\symptoms\weight.dm"
-#include "code\datums\diseases\advance\symptoms\youth.dm"
+#include "code\datums\diseases\viruses\wizarditis.dm"
+#include "code\datums\diseases\viruses\advance\advance.dm"
+#include "code\datums\diseases\viruses\advance\presets.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\beard.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\blood.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\bones.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\booze.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\choking.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\confusion.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\cough.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\damage_converter.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\deafness.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\dizzy.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\epinephrine.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\fever.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\fire.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\flesh_eating.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\hallucigen.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\headache.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\heal.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\itching.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\laugh.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\limb_throw.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\love.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\moan.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\oxygen.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\painkiller.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\sensory.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\shedding.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\shivering.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\skin.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\sneeze.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\symptoms.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\toxification.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\uncotrollable.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\viral.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\vision.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\voice_change.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\vomit.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\weakness.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\weight.dm"
+#include "code\datums\diseases\viruses\advance\symptoms\youth.dm"
#include "code\datums\elements\_element.dm"
#include "code\datums\elements\connect_loc.dm"
#include "code\datums\elements\waddling.dm"
diff --git a/sound/creatures/bee2.ogg b/sound/creatures/bee2.ogg
new file mode 100644
index 00000000000..52315c2c95a
Binary files /dev/null and b/sound/creatures/bee2.ogg differ
diff --git a/sound/creatures/bee3.ogg b/sound/creatures/bee3.ogg
new file mode 100644
index 00000000000..70975ad4364
Binary files /dev/null and b/sound/creatures/bee3.ogg differ
diff --git a/sound/creatures/bee4.ogg b/sound/creatures/bee4.ogg
new file mode 100644
index 00000000000..575a0b2c172
Binary files /dev/null and b/sound/creatures/bee4.ogg differ
diff --git a/sound/effects/magnitis.ogg b/sound/effects/magnitis.ogg
new file mode 100644
index 00000000000..407f986e01c
Binary files /dev/null and b/sound/effects/magnitis.ogg differ