From 97c1a2de78dbb8d628acd03b6da176e4cbd447a7 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Wed, 4 Oct 2023 07:10:41 +0300 Subject: [PATCH 01/17] disease vars & flags --- code/datums/diseases/_MobProcs.dm | 45 +++-------- code/datums/diseases/_disease.dm | 80 ++++++++----------- code/datums/diseases/advance/advance.dm | 21 ++--- code/datums/diseases/anxiety.dm | 3 +- code/datums/diseases/appendicitis.dm | 21 ++--- code/datums/diseases/beesease.dm | 3 +- code/datums/diseases/berserker.dm | 4 +- code/datums/diseases/brainrot.dm | 3 +- code/datums/diseases/cold.dm | 1 - code/datums/diseases/cold9.dm | 3 +- code/datums/diseases/critical.dm | 19 ++--- code/datums/diseases/fake_gbs.dm | 3 +- code/datums/diseases/flu.dm | 2 +- code/datums/diseases/fluspanish.dm | 2 +- code/datums/diseases/food_poisoning.dm | 6 +- code/datums/diseases/gbs.dm | 8 +- code/datums/diseases/kingstons.dm | 4 +- code/datums/diseases/kuru.dm | 7 +- code/datums/diseases/loyalty_syndrome.dm | 7 +- code/datums/diseases/lycancoughy.dm | 3 +- code/datums/diseases/magnitis.dm | 3 +- code/datums/diseases/pierrot_throat.dm | 3 +- code/datums/diseases/retrovirus.dm | 3 +- code/datums/diseases/rhumba_beat.dm | 4 +- code/datums/diseases/transformation.dm | 23 +++--- code/datums/diseases/tuberculosis.dm | 57 ++++++------- code/datums/diseases/vampire.dm | 6 +- code/datums/diseases/wizarditis.dm | 3 +- code/game/data_huds.dm | 2 +- code/game/machinery/adv_med.dm | 4 +- code/game/objects/items/devices/scanners.dm | 2 +- .../items/weapons/storage/artistic_toolbox.dm | 7 +- .../mining/lavaland/loot/ashdragon_loot.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 4 +- .../mob/living/simple_animal/bot/medbot.dm | 4 +- .../reagents/chemistry/reagents/water.dm | 4 +- code/modules/surgery/organs/blood.dm | 2 +- 37 files changed, 159 insertions(+), 219 deletions(-) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index d8c53f7b660..3343aecb156 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -20,10 +20,11 @@ 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 + for(var/mobtype in D.viable_mobtypes) + if(istype(src, mobtype)) + return TRUE - return TRUE + return FALSE /mob/proc/ContractDisease(datum/disease/D) @@ -36,23 +37,7 @@ 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 + var/passed = TRUE if(prob(15/D.permeability_mod)) return @@ -60,27 +45,25 @@ 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) + switch(pick(40;"head", 40;"body", 10;"hands", 10;"feet")) + if("head") 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("body") 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("hands") if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS) Cl = H.wear_suit passed = prob((Cl.permeability_coefficient*100) - 1) @@ -88,7 +71,7 @@ if(passed && isobj(H.gloves)) Cl = H.gloves passed = prob((Cl.permeability_coefficient*100) - 1) - if(4) + if("feet") if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET) Cl = H.wear_suit passed = prob((Cl.permeability_coefficient*100) - 1) @@ -121,15 +104,9 @@ /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity) + if((VIRUSIMMUNE in dna.species.species_traits) && !D.ignore_immunity) return 0 for(var/thing in D.required_organs) if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) return 0 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 diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 3092d82f3e8..ae5a6798dc2 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -1,25 +1,15 @@ - -#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 +#define VISIBLE 0 +#define HIDDEN_HUD 1 +#define HIDDEN_SCANNER 2 +#define HIDDEN_PANDEMIC 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 NON_CONTAGIOUS 0 //disease can't spread +#define SPECIAL 1 //disease can spread in specially created procs +#define BLOOD 2 //disease can spread with infected blood +#define CONTACT 4 //disease can spread with any touch +#define AIRBORNE 8 //disease spreads through the air //Severity Defines #define NONTHREAT "No threat" @@ -29,15 +19,12 @@ #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 + var/spread_flags = NON_CONTAGIOUS //Fluff var/form = "Virus" @@ -56,24 +43,32 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /// If TRUE, this virus 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 + var/curable = TRUE + var/list/cures = list() //list of cures if the disease has curable = TRUE, these are reagent ids var/needs_all_cures = TRUE - var/list/strain_data = list() //dna_spread special bullshit + var/cure_chance = 8 + var/can_immunity = TRUE //immunity can be developed from the disease + var/ignore_immunity = FALSE //Does it skip species VIRUSIMMUNE check? Some things may diseases and not viruses + var/virus_heal_resistant = FALSE // immunity to Anti-Bodies Metabolism symptom + + //Mutations var/mutation_chance = 1 var/list/mutation_reagents = list("mutagen") var/list/possible_mutations + //Infectivity + var/infectivity = 65 //affects how often the virus will try to spread + var/permeability_mod = 1 + var/carrier = FALSE //If our host is only a carrier + + //Other + var/severity = NONTHREAT + var/mob/living/affected_mob //Mob that is suffering from this virus + var/list/viable_mobtypes = list(/mob/living/carbon/human) //Types of infectable mobs + var/list/required_organs = list() + var/list/strain_data = list() //dna_spread special bullshit + /datum/disease/Destroy() affected_mob = null GLOB.active_diseases.Remove(src) @@ -97,7 +92,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) if(prob(cure_chance)) stage = max(stage - 1, 1) - if(disease_flags & CURABLE) + if(curable) if(cure && prob(cure_chance)) cure() return FALSE @@ -109,7 +104,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease/proc/has_cure() - if(!(disease_flags & CURABLE)) + if(!curable) return 0 . = cures.len @@ -123,7 +118,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) if(!affected_mob) return - if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) + if((spread_flags <= BLOOD) && !force_spread) return if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) @@ -173,7 +168,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease/proc/cure(resistance = TRUE) if(affected_mob) - if(disease_flags & CAN_RESIST) + if(can_immunity) if(!(type in affected_mob.resistances)) affected_mob.resistances += type remove_virus() @@ -194,11 +189,6 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /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 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index de99208c2ca..2c7ec20e00b 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -7,6 +7,8 @@ */ +#define VIRUS_SYMPTOM_LIMIT 6 + // The order goes from easy to cure to hard to cure. GLOBAL_LIST_INIT(advance_cures, list( "sodiumchloride", "sugar", "orangejuice", @@ -31,7 +33,6 @@ GLOBAL_LIST_EMPTY(archive_diseases) agent = "advance microbes" max_stages = 5 spread_text = "Unknown" - viable_mobtypes = list(/mob/living/carbon/human) // NEW VARS @@ -191,16 +192,18 @@ GLOBAL_LIST_EMPTY(archive_diseases) if(properties && properties.len) 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) + permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) // TODO: нерабочая хуйня, не забудь пофиксить cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_speed"], 2) SetSeverity(properties["severity"]) @@ -212,16 +215,14 @@ GLOBAL_LIST_EMPTY(archive_diseases) // 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) + if(NONE, SPECIAL) spread_text = "None" - if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET) + if(BLOOD) + spread_text = "Blood" + if(CONTACT) spread_text = "On contact" if(AIRBORNE) spread_text = "Airborne" - if(BLOOD) - spread_text = "Blood" spread_flags = spread_id diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 0d84afeab57..13385673946 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -3,11 +3,10 @@ form = "Infection" max_stages = 4 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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) diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index bdbb0fe4455..99f60fc8a3f 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -4,32 +4,33 @@ 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 + curable = FALSE spread_flags = NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/internal/appendix) - bypasses_immunity = TRUE + ignore_immunity = TRUE virus_heal_resistant = TRUE /datum/disease/appendicitis/stage_act() ..() + var/mob/living/carbon/human/H = affected_mob + if(!istype(H)) + return switch(stage) if(1) if(prob(5)) - affected_mob.emote("cough") + H.emote("cough") if(2) - var/obj/item/organ/internal/appendix/A = affected_mob.get_int_organ(/obj/item/organ/internal/appendix) + var/obj/item/organ/internal/appendix/A = H.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) + to_chat(H, "You feel a stabbing pain in your abdomen!") + H.Stun(rand(4 SECONDS, 6 SECONDS)) + H.adjustToxLoss(1) if(3) if(prob(1)) - affected_mob.vomit(95) + H.vomit(95) diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index ff9a2408640..bee6a8e8c5f 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -3,11 +3,10 @@ form = "Infection" max_stages = 4 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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) diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm index 81b3ca8cb72..bb153928b8e 100644 --- a/code/datums/diseases/berserker.dm +++ b/code/datums/diseases/berserker.dm @@ -3,15 +3,13 @@ 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." severity = DANGEROUS - disease_flags = CURABLE + can_immunity = FALSE spread_flags = NON_CONTAGIOUS /datum/disease/berserker/stage_act() diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 167ab190a08..a2c8647ff9a 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -2,11 +2,10 @@ name = "Brainrot" max_stages = 4 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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) diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 6b05014cc6e..1a14ed92307 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -5,7 +5,6 @@ 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 diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index 60af82e6939..460dbc7daea 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -2,11 +2,10 @@ name = "The Cold" max_stages = 3 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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 diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm index b9503cbad77..d9cbcbbaefe 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -1,4 +1,5 @@ /datum/disease/critical + spread_flags = NON_CONTAGIOUS /datum/disease/critical/stage_act() //overriden to ensure unique behavior stage = min(stage, max_stages) @@ -23,15 +24,13 @@ form = "Medical Emergency" spread_text = "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 + can_immunity = FALSE + ignore_immunity = TRUE virus_heal_resistant = TRUE /datum/disease/critical/shock/stage_act() @@ -84,17 +83,15 @@ form = "Medical Emergency" spread_text = "The patient is having a cardiac emergency" max_stages = 3 - spread_flags = SPECIAL cure_text = "Atropine, Epinephrine, or Heparin" cures = list("atropine", "epinephrine", "heparin") cure_chance = 10 needs_all_cures = FALSE - viable_mobtypes = list(/mob/living/carbon/human) stage_prob = 5 severity = DANGEROUS - disease_flags = CURABLE + can_immunity = FALSE required_organs = list(/obj/item/organ/internal/heart) - bypasses_immunity = TRUE + ignore_immunity = TRUE virus_heal_resistant = TRUE /datum/disease/critical/heart_failure/has_cure() @@ -144,14 +141,12 @@ name = "Hypoglycemia" form = "Medical Emergency" 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 + can_immunity = FALSE + ignore_immunity = TRUE virus_heal_resistant = TRUE /datum/disease/critical/hypoglycemia/has_cure() diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index 699fc2d2567..305805db0f4 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -2,11 +2,10 @@ name = "GBS" max_stages = 5 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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 diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index e9feee5094c..46681f1a613 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -1,12 +1,12 @@ /datum/disease/flu name = "The Flu" max_stages = 3 + spread_flags = AIRBORNE 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 diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index b348934c7aa..73a38d4d23a 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -1,12 +1,12 @@ /datum/disease/fluspanish name = "Spanish inquisition Flu" max_stages = 3 + spread_flags = AIRBORNE spread_text = "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) permeability_mod = 0.75 desc = "If left untreated the subject will burn to death for being a heretic." severity = DANGEROUS diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index dfa58264b97..b24daaab477 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -3,16 +3,14 @@ max_stages = 3 stage_prob = 5 spread_text = "Non-Contagious" - spread_flags = SPECIAL + spread_flags = NON_CONTAGIOUS cure_text = "Sleep" agent = "Salmonella" cures = list("chicken_soup") cure_chance = 10 - viable_mobtypes = list(/mob/living/carbon/human) desc = "Nausea, sickness, and vomitting." severity = MINOR - disease_flags = CURABLE - spread_flags = NON_CONTAGIOUS + can_immunity = FALSE virus_heal_resistant = TRUE possible_mutations = list(/datum/disease/tuberculosis) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 19d4c287427..937e8f922e8 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -2,14 +2,11 @@ name = "GBS" max_stages = 5 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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() @@ -42,10 +39,9 @@ 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 + can_immunity = FALSE diff --git a/code/datums/diseases/kingstons.dm b/code/datums/diseases/kingstons.dm index 34a2951a546..8dc2c770f53 100644 --- a/code/datums/diseases/kingstons.dm +++ b/code/datums/diseases/kingstons.dm @@ -1,12 +1,12 @@ /datum/disease/kingstons name = "Kingstons Syndrome" max_stages = 4 + spread_flags = AIRBORNE 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 @@ -51,12 +51,12 @@ /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_flags = AIRBORNE 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 diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index 3091e2bc12e..e140e32302d 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -4,15 +4,14 @@ 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." severity = BIOHAZARD spread_flags = NON_CONTAGIOUS - disease_flags = CAN_CARRY - bypasses_immunity = TRUE //Kuru is a prion disorder, not a virus + 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() diff --git a/code/datums/diseases/loyalty_syndrome.dm b/code/datums/diseases/loyalty_syndrome.dm index e6f37c2ac9a..59de2a29148 100644 --- a/code/datums/diseases/loyalty_syndrome.dm +++ b/code/datums/diseases/loyalty_syndrome.dm @@ -4,14 +4,13 @@ name = "Loyalty Syndrome" max_stages = 5 spread_text = "On contact" - spread_flags = CONTACT_GENERAL - disease_flags = CAN_CARRY|CURABLE + spread_flags = CONTACT + 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 + visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER severity = DANGEROUS var/is_master = FALSE var/mob/living/carbon/human/master diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm index ebd649adc0d..f6f5873c7b4 100644 --- a/code/datums/diseases/lycancoughy.dm +++ b/code/datums/diseases/lycancoughy.dm @@ -3,11 +3,10 @@ form = "Infection" max_stages = 4 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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 diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index dd1d062cbf7..678192fa5ec 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -1,12 +1,11 @@ /datum/disease/magnitis name = "Magnitis" max_stages = 4 + spread_flags = AIRBORNE 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 diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 0b0592b6a93..2c61805327f 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -1,12 +1,12 @@ /datum/disease/pierrot_throat name = "Pierrot's Throat" max_stages = 4 + spread_flags = AIRBORNE spread_text = "Airborne" cure_text = "Banana products, especially banana bread." cures = list("banana") cure_chance = 75 agent = "H0NI<42 Virus" - viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 0.75 desc = "If left untreated the subject will probably drive others to insanity." severity = MEDIUM @@ -36,7 +36,6 @@ 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 diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 5873733902d..17c3214a7f1 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -2,11 +2,10 @@ name = "Retrovirus" max_stages = 4 spread_text = "Contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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 diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 1ba2270008b..3646244e6c0 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -2,12 +2,10 @@ name = "The Rhumba Beat" max_stages = 5 spread_text = "On contact" - spread_flags = CONTACT_GENERAL + spread_flags = CONTACT 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() diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index a1604069241..7a11503e00b 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -2,14 +2,14 @@ name = "Transformation" max_stages = 5 spread_text = "Acute" - spread_flags = SPECIAL + spread_flags = NON_CONTAGIOUS 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 + visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER|HIDDEN_PANDEMIC + can_immunity = FALSE var/list/stage1 = list("You feel unremarkable.") var/list/stage2 = list("You feel boring.") var/list/stage3 = list("You feel utterly plain.") @@ -76,15 +76,14 @@ cure_text = "Bananas" cures = list("banana") spread_text = "Monkey Bites" - spread_flags = SPECIAL + spread_flags = SPECIAL //TODO: spread with bites viable_mobtypes = list(/mob/living/carbon/human) - permeability_mod = 1 cure_chance = 1 - disease_flags = CAN_CARRY|CAN_RESIST + curable = FALSE desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." severity = BIOHAZARD stage_prob = 4 - visibility_flags = 0 + visibility_flags = VISIBLE agent = "Kongey Vibrion M-909" new_form = /mob/living/carbon/human/lesser/monkey is_new_mind = TRUE @@ -124,7 +123,7 @@ agent = "R2D2 Nanomachines" desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." severity = DANGEROUS - visibility_flags = 0 + visibility_flags = VISIBLE new_form = /mob/living/silicon/robot is_new_mind = TRUE @@ -158,7 +157,7 @@ agent = "Rip-LEY Alien Microbes" desc = "This disease changes the victim into a xenomorph." severity = BIOHAZARD - visibility_flags = 0 + visibility_flags = VISIBLE 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.") @@ -190,7 +189,7 @@ agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." severity = BIOHAZARD - visibility_flags = 0 + visibility_flags = VISIBLE 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.") @@ -218,7 +217,7 @@ cures = list("adminordrazine") agent = "Fell Doge Majicks" desc = "This disease transforms the victim into a corgi." - visibility_flags = 0 + visibility_flags = VISIBLE stage1 = list("BARK.") stage2 = list("You feel the need to wear silly hats.") stage3 = list("Must... eat... chocolate....", "YAP") @@ -245,7 +244,7 @@ desc = "A 'gift' from somewhere terrible." stage_prob = 20 severity = BIOHAZARD - visibility_flags = 0 + visibility_flags = VISIBLE 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.") diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 970cc22914e..1521a433905 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -2,58 +2,61 @@ form = "Disease" name = "Fungal tuberculosis" max_stages = 5 + spread_flags = AIRBORNE 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 + ignore_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs /datum/disease/tuberculosis/stage_act() //it begins ..() + var/mob/living/carbon/human/H = affected_mob + if(!istype(H)) + return switch(stage) if(2) if(prob(2)) - affected_mob.emote("cough") - to_chat(affected_mob, "Your chest hurts.") + H.emote("cough") + to_chat(H, "Your chest hurts.") if(prob(2)) - to_chat(affected_mob, "Your stomach violently rumbles!") + to_chat(H, "Your stomach violently rumbles!") if(prob(5)) - to_chat(affected_mob, "You feel a cold sweat form.") + to_chat(H, "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) + to_chat(H, "You see four of everything") + H.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") + to_chat(H, "You feel a sharp pain from your lower chest!") + H.adjustOxyLoss(5) + H.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") + to_chat(H, "You feel air escape from your lungs painfully.") + H.adjustOxyLoss(25) + H.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) + to_chat(H, "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]") + H.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) + H.adjustStaminaLoss(100) + H.visible_message("[H] faints!", "You surrender yourself and feel at peace...") + H.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) + to_chat(H, "You feel your mind relax and your thoughts drift!") + H.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS) if(prob(10)) - affected_mob.vomit(20) + H.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) + to_chat(H, "[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(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") - affected_mob.bodytemperature += 40 + to_chat(H, "[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/vampire.dm b/code/datums/diseases/vampire.dm index e51f34796ac..a21b479cd89 100644 --- a/code/datums/diseases/vampire.dm +++ b/code/datums/diseases/vampire.dm @@ -3,15 +3,13 @@ max_stages = 3 stage_prob = 5 spread_text = "Non-Contagious" - spread_flags = SPECIAL + spread_flags = NON_CONTAGIOUS cure_text = "Antibiotics" cures = list("spaceacillin") agent = "Grave Dust" cure_chance = 20 - viable_mobtypes = list(/mob/living/carbon/human) severity = DANGEROUS - disease_flags = CURABLE - spread_flags = NON_CONTAGIOUS + can_immunity = FALSE /datum/disease/vampire/stage_act() ..() diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index b270b01e07b..9763bff4a5f 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -1,13 +1,12 @@ /datum/disease/wizarditis name = "Wizarditis" max_stages = 4 + spread_flags = AIRBORNE spread_text = "Airborne" cure_text = "The Manly Dorf" cures = list("manlydorf") cure_chance = 100 agent = "Rincewindus Vulgaris" - viable_mobtypes = list(/mob/living/carbon/human) - disease_flags = CAN_CARRY|CAN_RESIST|CURABLE 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 diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 1a5c0f33804..120bb6cf59c 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -92,7 +92,7 @@ var/datum/disease/D = thing if(!D.discovered) // Early-stage viruses should not show up on med HUD (though health analywers can still pick them up) continue - if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT)) + if((!(D.visibility_flags & HIDDEN_HUD)) && (D.severity != NONTHREAT)) return TRUE return FALSE diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index cb86e413a0a..cbb2e6cd9ea 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -224,7 +224,7 @@ var/found_disease = FALSE for(var/thing in occupant.viruses) var/datum/disease/D = thing - if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + if(D.visibility_flags & HIDDEN_SCANNER) continue if(istype(D, /datum/disease/critical)) continue @@ -390,7 +390,7 @@ var/found_disease = FALSE for(var/thing in occupant.viruses) var/datum/disease/D = thing - if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + if(D.visibility_flags & HIDDEN_SCANNER) continue found_disease = TRUE break diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 1bb163ba2c5..f4ba6ef478a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -905,7 +905,7 @@ REAGENT SCANNER var/found_disease = FALSE for(var/thing in target.viruses) 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/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index c41a3839009..87db16fa42b 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -148,12 +148,11 @@ max_stages = 4 stage_prob = 8 spread_text = "Non-Contagious" - spread_flags = SPECIAL + spread_flags = NON_CONTAGIOUS 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/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 3a8a1f7634c..0afd2ca495a 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -169,7 +169,7 @@ 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/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index d89ca9195aa..22eba6bdfc1 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -34,12 +34,12 @@ for(var/thing in viruses) var/datum/disease/D = thing - if(D.IsSpreadByTouch()) + if(D.spread_flags & CONTACT) user.ContractDisease(D) for(var/thing in user.viruses) var/datum/disease/D = thing - if(D.IsSpreadByTouch()) + if(D.spread_flags & CONTACT) ContractDisease(D) if(lying && surgeries.len) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 11b81201837..6208b69a1f8 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -407,7 +407,7 @@ for(var/thing in C.viruses) var/datum/disease/D = thing //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. - if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + if(D.visibility_flags & HIDDEN_HUD) return 0 if(D.severity == NONTHREAT) // medibot doesn't try to heal truly harmless viruses return 0 @@ -464,7 +464,7 @@ for(var/thing in C.viruses) var/datum/disease/D = thing //detectable virus - if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC))) + if(!(D.visibility_flags & HIDDEN_HUD)) if(D.severity != NONTHREAT) //virus is harmful if((D.stage > 1) || (D.spread_flags & AIRBORNE)) virus = 1 diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 863356c9036..041ba3792c0 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -107,7 +107,7 @@ for(var/thing in data["viruses"]) var/datum/disease/D = thing - if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + if(D.spread_flags < BLOOD) continue if(method == REAGENT_TOUCH) @@ -185,7 +185,7 @@ for(var/thing in data["viruses"]) var/datum/disease/D = thing - if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + if(D.spread_flags < BLOOD) continue if(method == REAGENT_TOUCH) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 32ad1fb564f..a83d0ff8701 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -172,7 +172,7 @@ 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)) + if(D.spread_flags < BLOOD) continue C.ForceContractDisease(D) if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)) || !(blood_data["blood_species"] == C.dna.species.blood_species)) From c9537e771eba9d2071282e75e81b80e17e7ced6e Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Thu, 5 Oct 2023 17:38:11 +0300 Subject: [PATCH 02/17] glands & outbreak generation --- code/datums/diseases/_disease.dm | 8 ++-- code/datums/diseases/advance/advance.dm | 18 +++++---- .../gamemodes/miniantags/abduction/gland.dm | 37 +++++-------------- code/modules/events/disease_outbreak.dm | 26 ++++++++----- 4 files changed, 41 insertions(+), 48 deletions(-) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index ae5a6798dc2..db132c27d3f 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -1,8 +1,8 @@ //Visibility Flags #define VISIBLE 0 -#define HIDDEN_HUD 1 -#define HIDDEN_SCANNER 2 -#define HIDDEN_PANDEMIC 4 +#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 //Spread Flags #define NON_CONTAGIOUS 0 //disease can't spread @@ -60,7 +60,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) //Infectivity var/infectivity = 65 //affects how often the virus will try to spread var/permeability_mod = 1 - var/carrier = FALSE //If our host is only a carrier + var/carrier = FALSE //If TRUE, host not affected by virus, but can spread it //Other var/severity = NONTHREAT diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 2c7ec20e00b..43b975c6a25 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -8,6 +8,7 @@ */ #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( @@ -42,7 +43,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) /datum/disease/advance/New() if(!symptoms || !symptoms.len) - symptoms = GenerateSymptoms(0, 2) + symptoms = GenerateSymptoms(1, 2) AssignProperties(GenerateProperties()) id = GetDiseaseID() @@ -118,7 +119,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) return 0 // 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/advance/proc/GenerateSymptoms(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 0) var/list/generated = list() // Symptoms we generated. @@ -134,13 +135,14 @@ GLOBAL_LIST_EMPTY(archive_diseases) 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 diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index d17447171cc..e62c271c213 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -219,33 +219,16 @@ /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/advance/new_virus = new + new_virus.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) + new_virus.symptoms = new_virus.GenerateSymptoms(count_of_symptoms = rand(4, 6)) + new_virus.Refresh() + new_virus.carrier = TRUE + + var/datum/disease/advance/old_virus = locate() in owner.viruses + if(old_virus) + old_virus.cure(resistance = FALSE) + owner.ForceContractDisease(new_virus) /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/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 880b832567b..f7bcff75378 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -7,19 +7,27 @@ /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() - else - var/datum/disease/advance/A = new /datum/disease/advance + var/virus_type = pick( + 5; /datum/disease/advance, \ + 1; /datum/disease/anxiety, \ + 1; /datum/disease/beesease, \ + 1; /datum/disease/brainrot, \ + 1; /datum/disease/fake_gbs, \ + 1; /datum/disease/fluspanish, \ + 1; /datum/disease/loyalty, \ + 1; /datum/disease/lycan, \ + 1; /datum/disease/magnitis, \ + 1; /datum/disease/pierrot_throat, \ + ) + if(virus_type == /datum/disease/advance) + var/datum/disease/advance/A = new A.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) // random silly name - A.symptoms = A.GenerateSymptoms(1,9,6) + A.symptoms = A.GenerateSymptoms(count_of_symptoms = 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 + else + D = new virus_type() D.carrier = TRUE From aba50e6389bdb930d473659e1616ce8c9d4cd19c Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Thu, 5 Oct 2023 17:38:28 +0300 Subject: [PATCH 03/17] appendicitis --- code/datums/diseases/appendicitis.dm | 137 ++++++++++++++++-- code/modules/surgery/organs/organ_internal.dm | 6 +- 2 files changed, 130 insertions(+), 13 deletions(-) diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 99f60fc8a3f..9b3a785d03a 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -1,36 +1,153 @@ /datum/disease/appendicitis form = "Condition" name = "Appendicitis" - max_stages = 3 + max_stages = 5 + stage_prob = 2 cure_text = "Surgery" agent = "Shitty Appendix" desc = "If left untreated the subject will become very weak, and may vomit often." severity = "Dangerous!" curable = FALSE + can_immunity = FALSE + spread_text = "The patient has acute appendicitis!" spread_flags = NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/internal/appendix) ignore_immunity = TRUE virus_heal_resistant = TRUE + var/ruptured = FALSE /datum/disease/appendicitis/stage_act() ..() + 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)) H.emote("cough") if(2) - var/obj/item/organ/internal/appendix/A = H.get_int_organ(/obj/item/organ/internal/appendix) - if(A) - A.inflamed = 1 - A.update_icon() + + 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(prob(5)) + H.emote("cough") + + if(3) + + 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)) - to_chat(H, "You feel a stabbing pain in your abdomen!") - H.Stun(rand(4 SECONDS, 6 SECONDS)) + H.vomit() + + if(prob(10)) + H.emote(pick("cough", "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(3) - if(prob(1)) - H.vomit(95) + + 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(5)) + H.vomit() + + if(prob(15)) + H.emote(pick("cough", "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 + + if(prob(20)) + A.receive_damage(3, silent = 0) + + H.adjustToxLoss(0.5) + H.Slowed(20 SECONDS, 5) + + if(prob(7)) + H.vomit() + + if(prob(15)) + H.emote(pick("moan", "cry")) + + if(prob(10)) + to_chat(H, span_danger("You feel a stabbing pain in your abdomen!")) + H.Stun(rand(3 SECONDS, 6 SECONDS)) + + +/datum/disease/appendicitis/proc/rupture(mob/living/carbon/human/H, obj/item/organ/internal/appendix/A) + ruptured = TRUE + A.necrotize() + + 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/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index be0514aaab2..89fd2219710 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) 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() From 8aa9ba5caaacb35fb72ffcc8a3a30bb4d65216e0 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Sun, 8 Oct 2023 04:45:33 +0300 Subject: [PATCH 04/17] Copy & Contract --- code/datums/diseases/_disease.dm | 19 ++------- code/datums/diseases/advance/advance.dm | 6 +-- .../datums/diseases/advance/symptoms/beard.dm | 6 +-- .../datums/diseases/advance/symptoms/blood.dm | 4 +- .../datums/diseases/advance/symptoms/booze.dm | 2 +- .../diseases/advance/symptoms/choking.dm | 6 +-- .../diseases/advance/symptoms/confusion.dm | 4 +- .../datums/diseases/advance/symptoms/cough.dm | 2 +- .../diseases/advance/symptoms/deafness.dm | 6 +-- .../datums/diseases/advance/symptoms/dizzy.dm | 8 ++-- .../diseases/advance/symptoms/epinephrine.dm | 2 +- .../datums/diseases/advance/symptoms/fever.dm | 2 +- code/datums/diseases/advance/symptoms/fire.dm | 6 +-- .../diseases/advance/symptoms/flesh_eating.dm | 4 +- .../diseases/advance/symptoms/hallucigen.dm | 6 +-- .../diseases/advance/symptoms/headache.dm | 2 +- code/datums/diseases/advance/symptoms/heal.dm | 41 +------------------ .../diseases/advance/symptoms/itching.dm | 2 +- .../diseases/advance/symptoms/limb_throw.dm | 10 ++--- .../diseases/advance/symptoms/oxygen.dm | 2 +- .../diseases/advance/symptoms/painkiller.dm | 4 +- .../diseases/advance/symptoms/sensory.dm | 2 +- .../diseases/advance/symptoms/shedding.dm | 6 +-- .../diseases/advance/symptoms/shivering.dm | 2 +- code/datums/diseases/advance/symptoms/skin.dm | 4 +- .../datums/diseases/advance/symptoms/viral.dm | 8 ++-- .../diseases/advance/symptoms/vision.dm | 8 ++-- .../diseases/advance/symptoms/voice_change.dm | 2 +- .../datums/diseases/advance/symptoms/vomit.dm | 2 +- .../diseases/advance/symptoms/weakness.dm | 10 ++--- .../diseases/advance/symptoms/weight.dm | 4 +- .../datums/diseases/advance/symptoms/youth.dm | 10 ++--- code/datums/diseases/flu.dm | 4 +- 33 files changed, 78 insertions(+), 128 deletions(-) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index db132c27d3f..b0d33960ee4 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -67,7 +67,6 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/mob/living/affected_mob //Mob that is suffering from this virus var/list/viable_mobtypes = list(/mob/living/carbon/human) //Types of infectable mobs var/list/required_organs = list() - var/list/strain_data = list() //dna_spread special bullshit /datum/disease/Destroy() affected_mob = null @@ -83,7 +82,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) stage = min(stage, max_stages) if(!cure) - if(prob(stage_prob)) + 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 @@ -147,21 +146,10 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) V = Temp /datum/disease/proc/Contract(mob/M) - var/datum/disease/D = new type() + var/datum/disease/D = Copy() 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] + GLOB.active_diseases += D D.affected_mob.med_hud_set_status() return @@ -182,7 +170,6 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease/proc/Copy() var/datum/disease/D = new type() - D.strain_data = strain_data.Copy() return D diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 43b975c6a25..4a7d04ebd6b 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -93,8 +93,8 @@ GLOBAL_LIST_EMPTY(archive_diseases) // 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) + var/list/required_vars = list("name","severity","id","visibility_flags","spread_flags","stage_prob","cures","cure_chance","permeability_mod") + for(var/V in required_vars) if(istype(vars[V], /list)) var/list/L = vars[V] copy.vars[V] = L.Copy() @@ -204,7 +204,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) 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)) + SetSpread(clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE)) //TODO: подредактировать цифры под новые границы цифры флагов permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) // TODO: нерабочая хуйня, не забудь пофиксить cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_speed"], 2) diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index 26b6e9e4096..d2509469085 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -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/advance/symptoms/blood.dm index 4ebb8b582df..546df907aa8 100644 --- a/code/datums/diseases/advance/symptoms/blood.dm +++ b/code/datums/diseases/advance/symptoms/blood.dm @@ -30,10 +30,10 @@ Bonus 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/booze.dm b/code/datums/diseases/advance/symptoms/booze.dm index 93111d5e76a..6e21b9faa3d 100644 --- a/code/datums/diseases/advance/symptoms/booze.dm +++ b/code/datums/diseases/advance/symptoms/booze.dm @@ -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/advance/symptoms/choking.dm index ab5bfbb0358..d2311516c51 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -32,13 +32,13 @@ Bonus 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 diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 3d7fd4dd5b6..12c55f2fe70 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -33,10 +33,10 @@ Bonus 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/advance/symptoms/cough.dm index d9a0e3b008b..f7139fa79ab 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -32,7 +32,7 @@ BONUS 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/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 7d9184ec7b9..c3452361916 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -32,13 +32,13 @@ Bonus 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/advance/symptoms/dizzy.dm index 730e2a8591a..a30d0d48e42 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -28,12 +28,12 @@ Bonus /datum/symptom/dizzy/Activate(datum/disease/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/advance/symptoms/epinephrine.dm index e1dd2822f76..e82e18ae439 100644 --- a/code/datums/diseases/advance/symptoms/epinephrine.dm +++ b/code/datums/diseases/advance/symptoms/epinephrine.dm @@ -31,7 +31,7 @@ Bonus 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/advance/symptoms/fever.dm index 9d29d237693..16049907127 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -30,7 +30,7 @@ Bonus ..() 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) diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index 2f79cc55a46..a8ff40e46aa 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -32,16 +32,16 @@ Bonus 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 diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 1cef07340b9..03a752a39db 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -32,9 +32,9 @@ Bonus 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 diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index 4bd438a7258..0c120f0aa76 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -32,11 +32,11 @@ Bonus 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/advance/symptoms/headache.dm index 0cf33f93797..e1fbdfbd96b 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -31,5 +31,5 @@ BONUS ..() 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/advance/symptoms/heal.dm index 62df49f4f2c..951526cf052 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -78,7 +78,7 @@ 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) // Remove all the diseases we cured. @@ -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.")) /* ////////////////////////////////////// @@ -125,40 +125,3 @@ Bonus /datum/symptom/heal/longevity/Start(datum/disease/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/advance/symptoms/itching.dm index 74f95fa91f0..d84b933f3b2 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -31,5 +31,5 @@ BONUS ..() 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/limb_throw.dm b/code/datums/diseases/advance/symptoms/limb_throw.dm index 41723cb0785..41bad387e2a 100644 --- a/code/datums/diseases/advance/symptoms/limb_throw.dm +++ b/code/datums/diseases/advance/symptoms/limb_throw.dm @@ -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/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 371b55c7664..90b818cdb66 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -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/advance/symptoms/painkiller.dm index 53c5f4934ed..c6257b7078e 100644 --- a/code/datums/diseases/advance/symptoms/painkiller.dm +++ b/code/datums/diseases/advance/symptoms/painkiller.dm @@ -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/advance/symptoms/sensory.dm index 34ea5dd59d1..4fd4f12892b 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -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/advance/symptoms/shedding.dm index 6586b267355..9e4f81a2fa4 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -29,20 +29,20 @@ BONUS ..() 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/advance/symptoms/shivering.dm index 1fcc586897b..6966e355863 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -30,7 +30,7 @@ Bonus ..() 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 diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm index b24ce2cc5a1..5e8ccbfdf9f 100644 --- a/code/datums/diseases/advance/symptoms/skin.dm +++ b/code/datums/diseases/advance/symptoms/skin.dm @@ -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 @@ -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/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm index 082b726ea4f..3d7ff5a5ef9 100644 --- a/code/datums/diseases/advance/symptoms/viral.dm +++ b/code/datums/diseases/advance/symptoms/viral.dm @@ -28,9 +28,9 @@ BONUS 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.")) /* ////////////////////////////////////// @@ -62,6 +62,6 @@ BONUS 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/advance/symptoms/vision.dm index 6e58faf5837..69694d985ff 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -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/advance/symptoms/voice_change.dm index 202c00ef23f..dd24364cc68 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -33,7 +33,7 @@ Bonus 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 diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 571bcb66e53..28d30414e9b 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -36,7 +36,7 @@ Bonus 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/advance/symptoms/weakness.dm index 614aa38e0f9..a95ff2e292a 100644 --- a/code/datums/diseases/advance/symptoms/weakness.dm +++ b/code/datums/diseases/advance/symptoms/weakness.dm @@ -28,18 +28,18 @@ Bonus /datum/symptom/weakness/Activate(datum/disease/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/advance/symptoms/weight.dm index 46a6c8f2162..c14a091e788 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -33,8 +33,8 @@ Bonus 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/advance/symptoms/youth.dm index 81f88aa29cb..74b209a41ae 100644 --- a/code/datums/diseases/advance/symptoms/youth.dm +++ b/code/datums/diseases/advance/symptoms/youth.dm @@ -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/flu.dm b/code/datums/diseases/flu.dm index 46681f1a613..0f6760731ba 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -16,7 +16,7 @@ switch(stage) if(2) if(affected_mob.lying && prob(20)) - to_chat(affected_mob, "You feel better.") + to_chat(affected_mob, span_notice("You feel better")) stage-- return if(prob(1)) @@ -24,7 +24,7 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - to_chat(affected_mob, "Your muscles ache.") + to_chat(affected_mob, span_danger("Your muscles ache")) if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) From 65789e9134b21eec936ea739d713bdeaf4466a89 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Mon, 9 Oct 2023 22:26:25 +0300 Subject: [PATCH 05/17] /disease/visus --- code/__HELPERS/global_lists.dm | 38 ++-- code/datums/diseases/_MobProcs.dm | 108 ++--------- code/datums/diseases/_disease.dm | 181 ++++++++---------- code/datums/diseases/appendicitis.dm | 2 - code/datums/diseases/berserker.dm | 4 +- code/datums/diseases/critical.dm | 17 +- code/datums/diseases/food_poisoning.dm | 6 +- code/datums/diseases/kuru.dm | 2 - code/datums/diseases/vampire.dm | 4 +- code/datums/diseases/viruses/_virus.dm | 130 +++++++++++++ .../diseases/{ => viruses}/advance/advance.dm | 92 +++++---- .../diseases/{ => viruses}/advance/presets.dm | 50 ++--- .../{ => viruses}/advance/symptoms/beard.dm | 2 +- .../{ => viruses}/advance/symptoms/blood.dm | 2 +- .../{ => viruses}/advance/symptoms/bones.dm | 4 +- .../{ => viruses}/advance/symptoms/booze.dm | 2 +- .../{ => viruses}/advance/symptoms/choking.dm | 6 +- .../advance/symptoms/confusion.dm | 2 +- .../{ => viruses}/advance/symptoms/cough.dm | 2 +- .../advance/symptoms/damage_converter.dm | 2 +- .../advance/symptoms/deafness.dm | 2 +- .../{ => viruses}/advance/symptoms/dizzy.dm | 2 +- .../advance/symptoms/epinephrine.dm | 2 +- .../{ => viruses}/advance/symptoms/fever.dm | 4 +- .../{ => viruses}/advance/symptoms/fire.dm | 6 +- .../advance/symptoms/flesh_eating.dm | 4 +- .../advance/symptoms/hallucigen.dm | 2 +- .../advance/symptoms/headache.dm | 2 +- .../{ => viruses}/advance/symptoms/heal.dm | 14 +- .../{ => viruses}/advance/symptoms/itching.dm | 2 +- .../{ => viruses}/advance/symptoms/laugh.dm | 2 +- .../advance/symptoms/limb_throw.dm | 4 +- .../{ => viruses}/advance/symptoms/love.dm | 2 +- .../{ => viruses}/advance/symptoms/moan.dm | 2 +- .../{ => viruses}/advance/symptoms/oxygen.dm | 2 +- .../advance/symptoms/painkiller.dm | 2 +- .../{ => viruses}/advance/symptoms/sensory.dm | 4 +- .../advance/symptoms/shedding.dm | 2 +- .../advance/symptoms/shivering.dm | 4 +- .../{ => viruses}/advance/symptoms/skin.dm | 4 +- .../{ => viruses}/advance/symptoms/sneeze.dm | 2 +- .../advance/symptoms/symptoms.dm | 6 +- .../advance/symptoms/toxification.dm | 6 +- .../advance/symptoms/uncotrollable.dm | 4 +- .../{ => viruses}/advance/symptoms/viral.dm | 4 +- .../{ => viruses}/advance/symptoms/vision.dm | 2 +- .../advance/symptoms/voice_change.dm | 4 +- .../{ => viruses}/advance/symptoms/vomit.dm | 2 +- .../advance/symptoms/weakness.dm | 2 +- .../{ => viruses}/advance/symptoms/weight.dm | 2 +- .../{ => viruses}/advance/symptoms/youth.dm | 2 +- code/datums/diseases/{ => viruses}/anxiety.dm | 6 +- .../datums/diseases/{ => viruses}/beesease.dm | 6 +- .../datums/diseases/{ => viruses}/brainrot.dm | 8 +- code/datums/diseases/{ => viruses}/cold.dm | 10 +- code/datums/diseases/{ => viruses}/cold9.dm | 4 +- .../datums/diseases/{ => viruses}/fake_gbs.dm | 4 +- code/datums/diseases/{ => viruses}/flu.dm | 6 +- .../diseases/{ => viruses}/fluspanish.dm | 6 +- code/datums/diseases/{ => viruses}/gbs.dm | 10 +- .../diseases/{ => viruses}/kingstons.dm | 16 +- .../{ => viruses}/loyalty_syndrome.dm | 20 +- .../diseases/{ => viruses}/lycancoughy.dm | 4 +- .../datums/diseases/{ => viruses}/magnitis.dm | 4 +- .../diseases/{ => viruses}/pierrot_throat.dm | 14 +- .../diseases/{ => viruses}/retrovirus.dm | 8 +- .../diseases/{ => viruses}/rhumba_beat.dm | 4 +- .../diseases/{ => viruses}/transformation.dm | 40 ++-- .../diseases/{ => viruses}/tuberculosis.dm | 6 +- .../diseases/{ => viruses}/wizarditis.dm | 10 +- code/game/data_huds.dm | 4 +- code/game/gamemodes/cult/runes.dm | 2 +- .../gamemodes/miniantags/abduction/gland.dm | 8 +- .../ninja_status_read.dm | 6 +- code/game/machinery/adv_med.dm | 4 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/medical.dm | 4 +- code/game/objects/items/devices/scanners.dm | 6 +- .../items/weapons/storage/artistic_toolbox.dm | 13 +- code/modules/admin/admin_verbs.dm | 2 +- .../antagonists/changeling/powers/panacea.dm | 2 +- .../goon_vampire/goon_vampire_powers.dm | 4 +- .../vampire/vampire_powers/bestia_powers.dm | 9 +- code/modules/awaymissions/corpse.dm | 9 +- .../awaymissions/mission_code/academy.dm | 4 +- code/modules/events/disease_outbreak.dm | 28 +-- .../events/spontaneous_appendicitis.dm | 6 +- .../mining/lavaland/loot/ashdragon_loot.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 16 +- code/modules/mob/living/carbon/human/life.dm | 24 +-- code/modules/mob/living/carbon/life.dm | 9 - code/modules/mob/living/life.dm | 6 +- code/modules/mob/living/living.dm | 4 +- .../mob/living/simple_animal/bot/medbot.dm | 9 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/paperwork/paper.dm | 9 +- .../reagents/chemistry/machinery/pandemic.dm | 20 +- .../reagents/chemistry/reagents/admin.dm | 4 +- .../reagents/chemistry/reagents/disease.dm | 27 ++- .../reagents/chemistry/reagents/food.dm | 9 +- .../reagents/chemistry/reagents/medicine.dm | 2 +- .../reagents/chemistry/reagents/ninja.dm | 2 +- .../reagents/chemistry/reagents/toxins.dm | 6 +- .../reagents/chemistry/reagents/water.dm | 26 +-- .../reagents/chemistry/recipes/others.dm | 4 +- .../reagents/reagent_containers/bottle.dm | 66 +++---- .../reagents/reagent_containers/dropper.dm | 2 +- code/modules/surgery/organs/blood.dm | 8 +- code/modules/surgery/organs/heart.dm | 12 +- code/modules/surgery/organs/organ_internal.dm | 2 +- paradise.dme | 121 ++++++------ 112 files changed, 749 insertions(+), 704 deletions(-) create mode 100644 code/datums/diseases/viruses/_virus.dm rename code/datums/diseases/{ => viruses}/advance/advance.dm (79%) rename code/datums/diseases/{ => viruses}/advance/presets.dm (64%) rename code/datums/diseases/{ => viruses}/advance/symptoms/beard.dm (95%) rename code/datums/diseases/{ => viruses}/advance/symptoms/blood.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/bones.dm (94%) rename code/datums/diseases/{ => viruses}/advance/symptoms/booze.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/choking.dm (88%) rename code/datums/diseases/{ => viruses}/advance/symptoms/confusion.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/cough.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/damage_converter.dm (94%) rename code/datums/diseases/{ => viruses}/advance/symptoms/deafness.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/dizzy.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/epinephrine.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/fever.dm (85%) rename code/datums/diseases/{ => viruses}/advance/symptoms/fire.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/flesh_eating.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/hallucigen.dm (94%) rename code/datums/diseases/{ => viruses}/advance/symptoms/headache.dm (90%) rename code/datums/diseases/{ => viruses}/advance/symptoms/heal.dm (85%) rename code/datums/diseases/{ => viruses}/advance/symptoms/itching.dm (90%) rename code/datums/diseases/{ => viruses}/advance/symptoms/laugh.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/limb_throw.dm (94%) rename code/datums/diseases/{ => viruses}/advance/symptoms/love.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/moan.dm (91%) rename code/datums/diseases/{ => viruses}/advance/symptoms/oxygen.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/painkiller.dm (94%) rename code/datums/diseases/{ => viruses}/advance/symptoms/sensory.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/shedding.dm (95%) rename code/datums/diseases/{ => viruses}/advance/symptoms/shivering.dm (91%) rename code/datums/diseases/{ => viruses}/advance/symptoms/skin.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/sneeze.dm (90%) rename code/datums/diseases/{ => viruses}/advance/symptoms/symptoms.dm (82%) rename code/datums/diseases/{ => viruses}/advance/symptoms/toxification.dm (86%) rename code/datums/diseases/{ => viruses}/advance/symptoms/uncotrollable.dm (97%) rename code/datums/diseases/{ => viruses}/advance/symptoms/viral.dm (90%) rename code/datums/diseases/{ => viruses}/advance/symptoms/vision.dm (95%) rename code/datums/diseases/{ => viruses}/advance/symptoms/voice_change.dm (88%) rename code/datums/diseases/{ => viruses}/advance/symptoms/vomit.dm (96%) rename code/datums/diseases/{ => viruses}/advance/symptoms/weakness.dm (94%) rename code/datums/diseases/{ => viruses}/advance/symptoms/weight.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/youth.dm (95%) rename code/datums/diseases/{ => viruses}/anxiety.dm (92%) rename code/datums/diseases/{ => viruses}/beesease.dm (91%) rename code/datums/diseases/{ => viruses}/brainrot.dm (77%) rename code/datums/diseases/{ => viruses}/cold.dm (90%) rename code/datums/diseases/{ => viruses}/cold9.dm (94%) rename code/datums/diseases/{ => viruses}/fake_gbs.dm (90%) rename code/datums/diseases/{ => viruses}/flu.dm (94%) rename code/datums/diseases/{ => viruses}/fluspanish.dm (91%) rename code/datums/diseases/{ => viruses}/gbs.dm (86%) rename code/datums/diseases/{ => viruses}/kingstons.dm (86%) rename code/datums/diseases/{ => viruses}/loyalty_syndrome.dm (92%) rename code/datums/diseases/{ => viruses}/lycancoughy.dm (97%) rename code/datums/diseases/{ => viruses}/magnitis.dm (96%) rename code/datums/diseases/{ => viruses}/pierrot_throat.dm (86%) rename code/datums/diseases/{ => viruses}/retrovirus.dm (94%) rename code/datums/diseases/{ => viruses}/rhumba_beat.dm (93%) rename code/datums/diseases/{ => viruses}/transformation.dm (90%) rename code/datums/diseases/{ => viruses}/tuberculosis.dm (94%) rename code/datums/diseases/{ => viruses}/wizarditis.dm (94%) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a09c218e9b9..4a68a6c2ffe 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/cold(), + "cough" = new /datum/disease/virus/advance/preset/flu(), + "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 3343aecb156..53732e2a8d9 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,14 +1,21 @@ -/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/HasDisease(disease_type_or_instance) + var/datum/disease/D1 + if(ispath(disease_type_or_instance)) + D1 = new disease_type_or_instance() + else + D1 = disease_type_or_instance + if(!istype(D1)) + return FALSE + + for(var/datum/disease/D2 in diseases) + if(D2.IsSame(D1)) + return TRUE + return FALSE -/mob/proc/CanContractDisease(datum/disease/D) - if(stat == DEAD) +/mob/proc/CanContractVirus(datum/disease/virus/D) + if(stat == DEAD && !D.can_spread_to_dead) return FALSE if(D.GetDiseaseID() in resistances) @@ -17,7 +24,7 @@ if(HasDisease(D)) return FALSE - if(istype(D, /datum/disease/advance) && count_by_type(viruses, /datum/disease/advance) > 0) + if(istype(D, /datum/disease/virus/advance) && count_by_type(diseases, /datum/disease/virus/advance) > 0) return FALSE for(var/mobtype in D.viable_mobtypes) @@ -26,87 +33,10 @@ return FALSE - -/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 = TRUE - - if(prob(15/D.permeability_mod)) - return - - if(satiety > 0 && prob(satiety/10)) // positive satiety makes it harder to contract the disease. - return - - if(istype(src, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - - switch(pick(40;"head", 40;"body", 10;"hands", 10;"feet")) - if("head") - 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("body") - 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("hands") - 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("feet") - 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) - - -/** - * Forces the mob to contract a virus. If the mob can have viruses. Ignores clothing and other protection - * Returns TRUE if it succeeds. False if it doesn't - * - * Arguments: - * * D - the disease the mob will try to contract - */ -//Same as ContractDisease, except never overidden clothes checks -/mob/proc/ForceContractDisease(datum/disease/D) - if(!CanContractDisease(D)) - return FALSE - D.Contract(src) - return TRUE - - -/mob/living/carbon/human/CanContractDisease(datum/disease/D) +/mob/living/carbon/human/CanContractVirus(datum/disease/virus/D) if((VIRUSIMMUNE in dna.species.species_traits) && !D.ignore_immunity) - return 0 + return FALSE for(var/thing in D.required_organs) if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) - return 0 + return FALSE return ..() diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index b0d33960ee4..d1c9fced8ce 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -4,13 +4,6 @@ #define HIDDEN_SCANNER 2 //hidden from health analyzers & stationary body analyzers #define HIDDEN_PANDEMIC 4 //hidden from pandemic -//Spread Flags -#define NON_CONTAGIOUS 0 //disease can't spread -#define SPECIAL 1 //disease can spread in specially created procs -#define BLOOD 2 //disease can spread with infected blood -#define CONTACT 4 //disease can spread with any touch -#define AIRBORNE 8 //disease spreads through the air - //Severity Defines #define NONTHREAT "No threat" #define MINOR "Minor" @@ -22,34 +15,34 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease - //Flags - var/visibility_flags = VISIBLE - var/spread_flags = NON_CONTAGIOUS - //Fluff - var/form = "Virus" - var/name = "No disease" + var/form = "Disease" + var/name = "Unknown" var/desc = "" var/agent = "some microbes" - var/spread_text = "" var/cure_text = "" //Stages - var/stage = 1 - var/max_stages = 0 - var/stage_prob = 4 - /// The fraction of stages the virus must at least be at to show up on medical HUDs. Rounded up. + var/stage = 1 //current stage of disease + var/max_stages = 5 //count of stages of disease + var/stage_prob = 4 //probability of moving to the next stage for a tick + + //Visibility + var/visibility_flags = VISIBLE + 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 //Cure & immunity var/curable = TRUE var/list/cures = list() //list of cures if the disease has curable = TRUE, these are reagent ids var/needs_all_cures = TRUE - var/cure_chance = 8 + var/cure_prob = 8 //probability of cure for a tick var/can_immunity = TRUE //immunity can be developed from the disease - var/ignore_immunity = FALSE //Does it skip species VIRUSIMMUNE check? Some things may diseases and not viruses + var/ignore_immunity = FALSE //Does it skip VIRUSIMMUNE trait check var/virus_heal_resistant = FALSE // immunity to Anti-Bodies Metabolism symptom //Mutations @@ -57,115 +50,106 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/list/mutation_reagents = list("mutagen") var/list/possible_mutations - //Infectivity - var/infectivity = 65 //affects how often the virus will try to spread - var/permeability_mod = 1 - var/carrier = FALSE //If TRUE, host not affected by virus, but can spread it - //Other - var/severity = NONTHREAT - var/mob/living/affected_mob //Mob that is suffering from this virus + var/mob/living/affected_mob //Mob that is suffering from this disease + var/can_progress_in_dead = FALSE //can progresses in a dead affected_mob var/list/viable_mobtypes = list(/mob/living/carbon/human) //Types of infectable mobs var/list/required_organs = list() + /datum/disease/Destroy() affected_mob = null GLOB.active_diseases.Remove(src) return ..() -/datum/disease/proc/stage_act() - var/cure = has_cure() - if(carrier && !cure) +/** + * 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() + if(affected_mob?.stat == DEAD && !can_progress_in_dead) return TRUE + var/cure = has_cure() stage = min(stage, max_stages) - if(!cure) - 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() + if(cure) + try_reduce_stage() else - if(prob(cure_chance)) - stage = max(stage - 1, 1) + try_increase_stage() - if(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(!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(!. || (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 <= 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() + 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 - if(spread_flags & AIRBORNE) - spread_range++ +/datum/disease/proc/TryContract(mob/M) + return TRUE - 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 /datum/disease/proc/Contract(mob/M) + if(TryContract(M)) + . = ForceContract(M) + + +/datum/disease/proc/ForceContract(mob/M) var/datum/disease/D = Copy() - M.viruses += D + M.diseases += D D.affected_mob = M GLOB.active_diseases += D - D.affected_mob.med_hud_set_status() - return - -/datum/disease/proc/cure(resistance = TRUE) - if(affected_mob) - if(can_immunity) - if(!(type in affected_mob.resistances)) - affected_mob.resistances += type - remove_virus() - qdel(src) + return TRUE /datum/disease/proc/IsSame(datum/disease/D) if(src.type == D.type) - return 1 - return 0 + return TRUE + return FALSE /datum/disease/proc/Copy() @@ -176,23 +160,28 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease/proc/GetDiseaseID() return type -//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.ForceContract(affected_mob) qdel(src) + return TRUE diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 9b3a785d03a..0dfd8098adc 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -9,8 +9,6 @@ severity = "Dangerous!" curable = FALSE can_immunity = FALSE - spread_text = "The patient has acute appendicitis!" - spread_flags = NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/internal/appendix) ignore_immunity = TRUE diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm index bb153928b8e..7c3e9eb657a 100644 --- a/code/datums/diseases/berserker.dm +++ b/code/datums/diseases/berserker.dm @@ -2,15 +2,13 @@ name = "Berserker" max_stages = 2 stage_prob = 5 - spread_text = "Non-Contagious" cure_text = "Anti-Psychotics" cures = list("haloperidol") agent = "Jagged Crystals" - cure_chance = 10 + cure_prob = 10 desc = "Swearing, shouting, attacking nearby crew members uncontrollably." severity = DANGEROUS can_immunity = FALSE - spread_flags = NON_CONTAGIOUS /datum/disease/berserker/stage_act() ..() diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm index d9cbcbbaefe..27175876b31 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -1,5 +1,4 @@ /datum/disease/critical - spread_flags = NON_CONTAGIOUS /datum/disease/critical/stage_act() //overriden to ensure unique behavior stage = min(stage, max_stages) @@ -15,18 +14,18 @@ /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" + //spread_text = "The patient is in shock" max_stages = 3 cure_text = "Saline-Glucose Solution" cures = list("salglu_solution") - cure_chance = 10 + cure_prob = 10 stage_prob = 6 severity = DANGEROUS can_immunity = FALSE @@ -76,16 +75,16 @@ affected_mob.AdjustLoseBreath(2 SECONDS) if(prob(5)) var/datum/disease/D = new /datum/disease/critical/heart_failure - affected_mob.ForceContractDisease(D) + D.ForceContract(affected_mob) /datum/disease/critical/heart_failure name = "Cardiac Failure" form = "Medical Emergency" - spread_text = "The patient is having a cardiac emergency" + //spread_text = "The patient is having a cardiac emergency" max_stages = 3 cure_text = "Atropine, Epinephrine, or Heparin" cures = list("atropine", "epinephrine", "heparin") - cure_chance = 10 + cure_prob = 10 needs_all_cures = FALSE stage_prob = 5 severity = DANGEROUS @@ -141,7 +140,7 @@ name = "Hypoglycemia" form = "Medical Emergency" max_stages = 3 - spread_text = "The patient has low blood sugar." + //spread_text = "The patient has low blood sugar." cure_text = "Eating or administration of vitamins or nutrients" stage_prob = 1 severity = DANGEROUS @@ -188,7 +187,7 @@ if(3) if(prob(1)) var/datum/disease/D = new /datum/disease/critical/shock - affected_mob.ForceContractDisease(D) + D.ForceContract(affected_mob) if(prob(12)) affected_mob.Weaken(12 SECONDS) affected_mob.Stuttering(20 SECONDS) diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index b24daaab477..de9806a803f 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -2,17 +2,15 @@ name = "Food Poisoning" max_stages = 3 stage_prob = 5 - spread_text = "Non-Contagious" - spread_flags = NON_CONTAGIOUS cure_text = "Sleep" agent = "Salmonella" cures = list("chicken_soup") - cure_chance = 10 + cure_prob = 10 desc = "Nausea, sickness, and vomitting." severity = MINOR can_immunity = FALSE virus_heal_resistant = TRUE - possible_mutations = list(/datum/disease/tuberculosis) + possible_mutations = list(/datum/disease/virus/tuberculosis) /datum/disease/food_poisoning/stage_act() ..() diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index e140e32302d..f98138b7dc9 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -3,12 +3,10 @@ name = "Space Kuru" max_stages = 4 stage_prob = 5 - spread_text = "Non-Contagious" cure_text = "Incurable" agent = "Prions" desc = "Uncontrollable laughing." severity = BIOHAZARD - spread_flags = NON_CONTAGIOUS curable = FALSE can_immunity = FALSE ignore_immunity = TRUE //Kuru is a prion disorder, not a virus diff --git a/code/datums/diseases/vampire.dm b/code/datums/diseases/vampire.dm index a21b479cd89..09c09f995ac 100644 --- a/code/datums/diseases/vampire.dm +++ b/code/datums/diseases/vampire.dm @@ -2,12 +2,10 @@ name = "Grave Fever" max_stages = 3 stage_prob = 5 - spread_text = "Non-Contagious" - spread_flags = NON_CONTAGIOUS cure_text = "Antibiotics" cures = list("spaceacillin") agent = "Grave Dust" - cure_chance = 20 + cure_prob = 20 severity = DANGEROUS can_immunity = FALSE diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm new file mode 100644 index 00000000000..c9986065f4b --- /dev/null +++ b/code/datums/diseases/viruses/_virus.dm @@ -0,0 +1,130 @@ +//Spread Flags +#define NON_CONTAGIOUS 0 //virus can't spread +#define SPECIAL 1 //virus can spread in specially created procs +#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 = "Virus" + + var/spread_flags = NON_CONTAGIOUS + var/spread_text = "" + + //Infectivity + var/infectivity = 65 //affects how often the virus will try to spread + var/permeability_mod = 1 // + var/carrier = FALSE //if TRUE, host not affected by virus, but can spread it + var/can_spread_to_dead //if TRUE, virus can contract dead mobs + +/** + * 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) + 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 = 1 + + if(force_spread) + spread_range = force_spread + + if(spread_flags & AIRBORNE) + spread_range++ + + 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) + Contract(C) + break + var/turf/Temp = get_step_towards(V, T) + if(!V.CanAtmosPass(Temp)) + break + V = Temp + + +/datum/disease/virus/TryContract(mob/M) + if(!M.CanContractVirus(src)) + return FALSE + + var/obj/item/clothing/Cl = null + var/passed = TRUE + + if(prob(15/permeability_mod)) + return + + if(M.satiety > 0 && prob(M.satiety/10)) // positive satiety makes it harder to contract the disease. + return + + if(istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + + switch(pick(40;"head", 40;"body", 10;"hands", 10;"feet")) + if("head") + 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("body") + 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("hands") + 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("feet") + 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 && (spread_flags & AIRBORNE) && !M.internal) + passed = (prob((50*permeability_mod) - 1)) + + return passed diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/viruses/advance/advance.dm similarity index 79% rename from code/datums/diseases/advance/advance.dm rename to code/datums/diseases/viruses/advance/advance.dm index 4a7d04ebd6b..29c610315ce 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/viruses/advance/advance.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) */ -/datum/disease/advance +/datum/disease/virus/advance name = "Unknown" // We will always let our Virologist name our disease. desc = "Спроектированная болезнь, может содержать сразу несколько симптомов." @@ -41,21 +41,21 @@ 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(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) @@ -72,9 +72,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()) @@ -82,18 +81,13 @@ 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/required_vars = list("name","severity","id","visibility_flags","spread_flags","stage_prob","cures","cure_chance","permeability_mod") +/datum/disease/virus/advance/Copy() + var/datum/disease/virus/advance/copy = new + var/list/required_vars = list("name","severity","id","visibility_flags","spread_flags","stage_prob","cures","cure_prob","permeability_mod") for(var/V in required_vars) if(istype(vars[V], /list)) var/list/L = vars[V] @@ -106,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 // 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 = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 0) +/datum/disease/virus/advance/proc/GenerateSymptoms(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 0) var/list/generated = list() // Symptoms we generated. @@ -147,11 +141,11 @@ GLOBAL_LIST_EMPTY(archive_diseases) return generated -/datum/disease/advance/proc/Refresh(var/update_mutations = TRUE, var/reset_name = FALSE) +/datum/disease/virus/advance/proc/Refresh(var/update_mutations = TRUE, var/reset_name = FALSE) AssignProperties(GenerateProperties()) id = GetDiseaseID() - var/datum/disease/advance/A = GLOB.archive_diseases[id] + var/datum/disease/virus/advance/A = GLOB.archive_diseases[id] if(update_mutations) UpdateMutationsProps(A) @@ -162,17 +156,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(var/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.") @@ -190,7 +184,7 @@ 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) switch(properties["stealth"]) @@ -206,7 +200,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) // 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)) //TODO: подредактировать цифры под новые границы цифры флагов permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) // TODO: нерабочая хуйня, не забудь пофиксить - cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 + cure_prob = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_speed"], 2) SetSeverity(properties["severity"]) GenerateCure(properties) @@ -215,7 +209,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) // Assign the spread type and give it the correct description. -/datum/disease/advance/proc/SetSpread(spread_id) +/datum/disease/virus/advance/proc/SetSpread(spread_id) switch(spread_id) if(NONE, SPECIAL) spread_text = "None" @@ -228,7 +222,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) spread_flags = spread_id -/datum/disease/advance/proc/SetSeverity(level_sev) +/datum/disease/virus/advance/proc/SetSeverity(level_sev) switch(level_sev) @@ -249,7 +243,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) // Will generate a random cure, the less resistance the symptoms have, the harder the cure. -/datum/disease/advance/proc/GenerateCure(list/properties = list()) +/datum/disease/virus/advance/proc/GenerateCure(list/properties = list()) if(properties && properties.len) var/res = round(clamp(properties["resistance"] - (symptoms.len / 2), 1, GLOB.advance_cures.len)) @@ -259,7 +253,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) 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) @@ -267,7 +261,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) @@ -276,12 +270,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 @@ -290,7 +284,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 @@ -303,7 +297,7 @@ 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 @@ -318,7 +312,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) @@ -332,15 +326,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 @@ -348,7 +342,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) @@ -361,7 +355,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() @@ -390,7 +384,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)) @@ -398,7 +392,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) if(H.stat == DEAD || !is_station_level(H.z)) continue if(!H.HasDisease(D)) - H.ForceContractDisease(D) + D.ForceContract(H) break var/list/name_symptoms = list() @@ -408,28 +402,28 @@ GLOBAL_LIST_EMPTY(archive_diseases) -/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 64% rename from code/datums/diseases/advance/presets.dm rename to code/datums/diseases/viruses/advance/presets.dm index 872ce088871..a9bc1cd595b 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 +/datum/disease/virus/advance/preset/cold name = "Cold" symptoms = list(new/datum/symptom/sneeze) // Flu -/datum/disease/advance/preset/flu +/datum/disease/virus/advance/preset/flu name = "Flu" 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/cold/) // 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 95% rename from code/datums/diseases/advance/symptoms/beard.dm rename to code/datums/diseases/viruses/advance/symptoms/beard.dm index d2509469085..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 diff --git a/code/datums/diseases/advance/symptoms/blood.dm b/code/datums/diseases/viruses/advance/symptoms/blood.dm similarity index 93% rename from code/datums/diseases/advance/symptoms/blood.dm rename to code/datums/diseases/viruses/advance/symptoms/blood.dm index 546df907aa8..87878e6f154 100644 --- a/code/datums/diseases/advance/symptoms/blood.dm +++ b/code/datums/diseases/viruses/advance/symptoms/blood.dm @@ -24,7 +24,7 @@ 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)) 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 93% rename from code/datums/diseases/advance/symptoms/booze.dm rename to code/datums/diseases/viruses/advance/symptoms/booze.dm index 6e21b9faa3d..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 diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/viruses/advance/symptoms/choking.dm similarity index 88% rename from code/datums/diseases/advance/symptoms/choking.dm rename to code/datums/diseases/viruses/advance/symptoms/choking.dm index d2311516c51..2dcb01e9c0d 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/viruses/advance/symptoms/choking.dm @@ -26,7 +26,7 @@ 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 @@ -43,12 +43,12 @@ Bonus 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 93% rename from code/datums/diseases/advance/symptoms/confusion.dm rename to code/datums/diseases/viruses/advance/symptoms/confusion.dm index 12c55f2fe70..d0f430f3cba 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/viruses/advance/symptoms/confusion.dm @@ -27,7 +27,7 @@ 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) diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/viruses/advance/symptoms/cough.dm similarity index 92% rename from code/datums/diseases/advance/symptoms/cough.dm rename to code/datums/diseases/viruses/advance/symptoms/cough.dm index f7139fa79ab..d6c24d72008 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/viruses/advance/symptoms/cough.dm @@ -26,7 +26,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm similarity index 94% rename from code/datums/diseases/advance/symptoms/damage_converter.dm rename to code/datums/diseases/viruses/advance/symptoms/damage_converter.dm index 94826f4cbde..e648bfece2e 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 diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/viruses/advance/symptoms/deafness.dm similarity index 93% rename from code/datums/diseases/advance/symptoms/deafness.dm rename to code/datums/diseases/viruses/advance/symptoms/deafness.dm index c3452361916..381fe5a9be3 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/viruses/advance/symptoms/deafness.dm @@ -26,7 +26,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/viruses/advance/symptoms/dizzy.dm similarity index 92% rename from code/datums/diseases/advance/symptoms/dizzy.dm rename to code/datums/diseases/viruses/advance/symptoms/dizzy.dm index a30d0d48e42..70bcf6d340a 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/viruses/advance/symptoms/dizzy.dm @@ -26,7 +26,7 @@ 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*5)) var/mob/living/M = A.affected_mob diff --git a/code/datums/diseases/advance/symptoms/epinephrine.dm b/code/datums/diseases/viruses/advance/symptoms/epinephrine.dm similarity index 93% rename from code/datums/diseases/advance/symptoms/epinephrine.dm rename to code/datums/diseases/viruses/advance/symptoms/epinephrine.dm index e82e18ae439..18389cc3407 100644 --- a/code/datums/diseases/advance/symptoms/epinephrine.dm +++ b/code/datums/diseases/viruses/advance/symptoms/epinephrine.dm @@ -24,7 +24,7 @@ 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)) diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/viruses/advance/symptoms/fever.dm similarity index 85% rename from code/datums/diseases/advance/symptoms/fever.dm rename to code/datums/diseases/viruses/advance/symptoms/fever.dm index 16049907127..cd097eadb6c 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/viruses/advance/symptoms/fever.dm @@ -26,7 +26,7 @@ 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 @@ -36,7 +36,7 @@ Bonus 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 92% rename from code/datums/diseases/advance/symptoms/fire.dm rename to code/datums/diseases/viruses/advance/symptoms/fire.dm index a8ff40e46aa..9b443be6ae9 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/viruses/advance/symptoms/fire.dm @@ -26,7 +26,7 @@ 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 @@ -45,13 +45,13 @@ Bonus 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 92% rename from code/datums/diseases/advance/symptoms/flesh_eating.dm rename to code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm index 03a752a39db..e85aa1b8bc9 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm @@ -26,7 +26,7 @@ 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 @@ -38,7 +38,7 @@ Bonus 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 94% rename from code/datums/diseases/advance/symptoms/hallucigen.dm rename to code/datums/diseases/viruses/advance/symptoms/hallucigen.dm index 0c120f0aa76..c98767a4c7e 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/viruses/advance/symptoms/hallucigen.dm @@ -26,7 +26,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/viruses/advance/symptoms/headache.dm similarity index 90% rename from code/datums/diseases/advance/symptoms/headache.dm rename to code/datums/diseases/viruses/advance/symptoms/headache.dm index e1fbdfbd96b..95e641686c1 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/viruses/advance/symptoms/headache.dm @@ -27,7 +27,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/viruses/advance/symptoms/heal.dm similarity index 85% rename from code/datums/diseases/advance/symptoms/heal.dm rename to code/datums/diseases/viruses/advance/symptoms/heal.dm index 951526cf052..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 @@ -80,7 +80,7 @@ Bonus if(cured) 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)) @@ -118,10 +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) diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/viruses/advance/symptoms/itching.dm similarity index 90% rename from code/datums/diseases/advance/symptoms/itching.dm rename to code/datums/diseases/viruses/advance/symptoms/itching.dm index d84b933f3b2..bc6cc11ffad 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/viruses/advance/symptoms/itching.dm @@ -27,7 +27,7 @@ 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 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 94% rename from code/datums/diseases/advance/symptoms/limb_throw.dm rename to code/datums/diseases/viruses/advance/symptoms/limb_throw.dm index 41bad387e2a..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 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 91% rename from code/datums/diseases/advance/symptoms/moan.dm rename to code/datums/diseases/viruses/advance/symptoms/moan.dm index c84a0413cae..f0e30529345 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 diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/viruses/advance/symptoms/oxygen.dm similarity index 93% rename from code/datums/diseases/advance/symptoms/oxygen.dm rename to code/datums/diseases/viruses/advance/symptoms/oxygen.dm index 90b818cdb66..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 diff --git a/code/datums/diseases/advance/symptoms/painkiller.dm b/code/datums/diseases/viruses/advance/symptoms/painkiller.dm similarity index 94% rename from code/datums/diseases/advance/symptoms/painkiller.dm rename to code/datums/diseases/viruses/advance/symptoms/painkiller.dm index c6257b7078e..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)) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/viruses/advance/symptoms/sensory.dm similarity index 92% rename from code/datums/diseases/advance/symptoms/sensory.dm rename to code/datums/diseases/viruses/advance/symptoms/sensory.dm index 4fd4f12892b..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 diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/viruses/advance/symptoms/shedding.dm similarity index 95% rename from code/datums/diseases/advance/symptoms/shedding.dm rename to code/datums/diseases/viruses/advance/symptoms/shedding.dm index 9e4f81a2fa4..eadaab577b8 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/viruses/advance/symptoms/shedding.dm @@ -25,7 +25,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/viruses/advance/symptoms/shivering.dm similarity index 91% rename from code/datums/diseases/advance/symptoms/shivering.dm rename to code/datums/diseases/viruses/advance/symptoms/shivering.dm index 6966e355863..1c2d8ace7af 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/viruses/advance/symptoms/shivering.dm @@ -26,7 +26,7 @@ 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 @@ -35,7 +35,7 @@ Bonus 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 92% rename from code/datums/diseases/advance/symptoms/skin.dm rename to code/datums/diseases/viruses/advance/symptoms/skin.dm index 5e8ccbfdf9f..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 @@ -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 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 90% rename from code/datums/diseases/advance/symptoms/viral.dm rename to code/datums/diseases/viruses/advance/symptoms/viral.dm index 3d7ff5a5ef9..d2e59e2c953 100644 --- a/code/datums/diseases/advance/symptoms/viral.dm +++ b/code/datums/diseases/viruses/advance/symptoms/viral.dm @@ -22,7 +22,7 @@ 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 @@ -56,7 +56,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/viruses/advance/symptoms/vision.dm similarity index 95% rename from code/datums/diseases/advance/symptoms/vision.dm rename to code/datums/diseases/viruses/advance/symptoms/vision.dm index 69694d985ff..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 diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/viruses/advance/symptoms/voice_change.dm similarity index 88% rename from code/datums/diseases/advance/symptoms/voice_change.dm rename to code/datums/diseases/viruses/advance/symptoms/voice_change.dm index dd24364cc68..54e0686956d 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/viruses/advance/symptoms/voice_change.dm @@ -26,7 +26,7 @@ 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)) @@ -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 96% rename from code/datums/diseases/advance/symptoms/vomit.dm rename to code/datums/diseases/viruses/advance/symptoms/vomit.dm index 28d30414e9b..1387543d0fd 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/viruses/advance/symptoms/vomit.dm @@ -30,7 +30,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/viruses/advance/symptoms/weakness.dm similarity index 94% rename from code/datums/diseases/advance/symptoms/weakness.dm rename to code/datums/diseases/viruses/advance/symptoms/weakness.dm index a95ff2e292a..9837694cdae 100644 --- a/code/datums/diseases/advance/symptoms/weakness.dm +++ b/code/datums/diseases/viruses/advance/symptoms/weakness.dm @@ -26,7 +26,7 @@ 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*2)) var/mob/living/M = A.affected_mob diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/viruses/advance/symptoms/weight.dm similarity index 92% rename from code/datums/diseases/advance/symptoms/weight.dm rename to code/datums/diseases/viruses/advance/symptoms/weight.dm index c14a091e788..2532c47deb9 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/viruses/advance/symptoms/weight.dm @@ -27,7 +27,7 @@ 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 diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/viruses/advance/symptoms/youth.dm similarity index 95% rename from code/datums/diseases/advance/symptoms/youth.dm rename to code/datums/diseases/viruses/advance/symptoms/youth.dm index 74b209a41ae..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 diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/viruses/anxiety.dm similarity index 92% rename from code/datums/diseases/anxiety.dm rename to code/datums/diseases/viruses/anxiety.dm index 13385673946..aee6433bf7a 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/viruses/anxiety.dm @@ -1,4 +1,4 @@ -/datum/disease/anxiety +/datum/disease/virus/anxiety name = "Severe Anxiety" form = "Infection" max_stages = 4 @@ -9,9 +9,9 @@ agent = "Excess Lepidopticides" desc = "If left untreated subject will regurgitate butterflies." severity = MEDIUM - possible_mutations = list(/datum/disease/beesease) + possible_mutations = list(/datum/disease/virus/beesease) -/datum/disease/anxiety/stage_act() +/datum/disease/virus/anxiety/stage_act() ..() switch(stage) if(2) //also changes say, see say.dm diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/viruses/beesease.dm similarity index 91% rename from code/datums/diseases/beesease.dm rename to code/datums/diseases/viruses/beesease.dm index bee6a8e8c5f..e5b0556f485 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/viruses/beesease.dm @@ -1,4 +1,4 @@ -/datum/disease/beesease +/datum/disease/virus/beesease name = "Beesease" form = "Infection" max_stages = 4 @@ -9,9 +9,9 @@ agent = "Apidae Infection" desc = "If left untreated subject will regurgitate bees." severity = DANGEROUS - possible_mutations = list(/datum/disease/lycan) + possible_mutations = list(/datum/disease/virus/lycan) -/datum/disease/beesease/stage_act() +/datum/disease/virus/beesease/stage_act() ..() switch(stage) if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/viruses/brainrot.dm similarity index 77% rename from code/datums/diseases/brainrot.dm rename to code/datums/diseases/viruses/brainrot.dm index a2c8647ff9a..9cb720c8c79 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/viruses/brainrot.dm @@ -1,4 +1,4 @@ -/datum/disease/brainrot +/datum/disease/virus/brainrot name = "Brainrot" max_stages = 4 spread_text = "On contact" @@ -6,14 +6,14 @@ cure_text = "Mannitol" cures = list("mannitol") agent = "Cryptococcus Cosmosis" - cure_chance = 15//higher chance to cure, since two reagents are required + cure_prob = 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) + possible_mutations = list(/datum/disease/kuru, /datum/disease/virus/advance/preset/mind_restoration, /datum/disease/virus/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 +/datum/disease/virus/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) diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/viruses/cold.dm similarity index 90% rename from code/datums/diseases/cold.dm rename to code/datums/diseases/viruses/cold.dm index 1a14ed92307..278155a4bab 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/viruses/cold.dm @@ -1,4 +1,4 @@ -/datum/disease/cold +/datum/disease/virus/cold name = "The Cold" max_stages = 3 spread_flags = AIRBORNE @@ -9,7 +9,7 @@ desc = "If left untreated the subject will contract the flu." severity = MINOR -/datum/disease/cold/stage_act() +/datum/disease/virus/cold/stage_act() ..() switch(stage) if(2) @@ -59,7 +59,7 @@ 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) + if(!affected_mob.resistances.Find(/datum/disease/virus/flu)) + var/datum/disease/virus/flu/Flu = new + Flu.ForceContract(affected_mob) cure() diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/viruses/cold9.dm similarity index 94% rename from code/datums/diseases/cold9.dm rename to code/datums/diseases/viruses/cold9.dm index 460dbc7daea..4d878dcb373 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/viruses/cold9.dm @@ -1,4 +1,4 @@ -/datum/disease/cold9 +/datum/disease/virus/cold9 name = "The Cold" max_stages = 3 spread_text = "On contact" @@ -9,7 +9,7 @@ desc = "If left untreated the subject will slow, as if partly frozen." severity = MEDIUM -/datum/disease/cold9/stage_act() +/datum/disease/virus/cold9/stage_act() ..() switch(stage) if(2) diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/viruses/fake_gbs.dm similarity index 90% rename from code/datums/diseases/fake_gbs.dm rename to code/datums/diseases/viruses/fake_gbs.dm index 305805db0f4..a2e207d45c1 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/viruses/fake_gbs.dm @@ -1,4 +1,4 @@ -/datum/disease/fake_gbs +/datum/disease/virus/fake_gbs name = "GBS" max_stages = 5 spread_text = "On contact" @@ -9,7 +9,7 @@ desc = "If left untreated death will occur." severity = BIOHAZARD -/datum/disease/fake_gbs/stage_act() +/datum/disease/virus/fake_gbs/stage_act() ..() switch(stage) if(2) diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/viruses/flu.dm similarity index 94% rename from code/datums/diseases/flu.dm rename to code/datums/diseases/viruses/flu.dm index 0f6760731ba..b2404e4a637 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/viruses/flu.dm @@ -1,17 +1,17 @@ -/datum/disease/flu +/datum/disease/virus/flu name = "The Flu" max_stages = 3 spread_flags = AIRBORNE spread_text = "Airborne" cure_text = "Spaceacillin" cures = list("spaceacillin") - cure_chance = 10 + cure_prob = 10 agent = "H13N1 flu virion" permeability_mod = 0.75 desc = "If left untreated the subject will feel quite unwell." severity = MEDIUM -/datum/disease/flu/stage_act() +/datum/disease/virus/flu/stage_act() ..() switch(stage) if(2) diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/viruses/fluspanish.dm similarity index 91% rename from code/datums/diseases/fluspanish.dm rename to code/datums/diseases/viruses/fluspanish.dm index 73a38d4d23a..94f7d9cdce0 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/viruses/fluspanish.dm @@ -1,17 +1,17 @@ -/datum/disease/fluspanish +/datum/disease/virus/fluspanish name = "Spanish inquisition Flu" max_stages = 3 spread_flags = AIRBORNE spread_text = "Airborne" cure_text = "Spaceacillin & Anti-bodies to the common flu" cures = list("spaceacillin") - cure_chance = 10 + cure_prob = 10 agent = "1nqu1s1t10n flu virion" 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() ..() switch(stage) if(2) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/viruses/gbs.dm similarity index 86% rename from code/datums/diseases/gbs.dm rename to code/datums/diseases/viruses/gbs.dm index 937e8f922e8..53a78a07bff 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/viruses/gbs.dm @@ -1,15 +1,15 @@ -/datum/disease/gbs +/datum/disease/virus/gbs name = "GBS" max_stages = 5 spread_text = "On contact" spread_flags = CONTACT cure_text = "Diphenhydramine & Sulfur" cures = list("diphenhydramine","sulfur") - cure_chance = 15//higher chance to cure, since two reagents are required + cure_prob = 15 agent = "Gravitokinetic Bipotential SADS+" severity = BIOHAZARD -/datum/disease/gbs/stage_act() +/datum/disease/virus/gbs/stage_act() ..() switch(stage) if(2) @@ -35,13 +35,13 @@ else return -/datum/disease/gbs/curable +/datum/disease/virus/gbs/curable name = "Non-Contagious GBS" stage_prob = 5 spread_text = "Non-Contagious" cure_text = "Cryoxadone" cures = list("cryoxadone") - cure_chance = 10 + cure_prob = 10 agent = "gibbis" spread_flags = NON_CONTAGIOUS can_immunity = FALSE diff --git a/code/datums/diseases/kingstons.dm b/code/datums/diseases/viruses/kingstons.dm similarity index 86% rename from code/datums/diseases/kingstons.dm rename to code/datums/diseases/viruses/kingstons.dm index 8dc2c770f53..8c9d3ad4e8c 100644 --- a/code/datums/diseases/kingstons.dm +++ b/code/datums/diseases/viruses/kingstons.dm @@ -1,19 +1,19 @@ -/datum/disease/kingstons +/datum/disease/virus/kingstons name = "Kingstons Syndrome" max_stages = 4 spread_flags = AIRBORNE spread_text = "Airborne" cure_text = "Milk" cures = list("milk") - cure_chance = 50 + cure_prob = 50 agent = "Nya Virus" 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) + possible_mutations = list(/datum/disease/virus/kingstons_advanced) -/datum/disease/kingstons/stage_act() +/datum/disease/virus/kingstons/stage_act() ..() switch(stage) if(1) @@ -48,14 +48,14 @@ 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. +/datum/disease/virus/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_flags = AIRBORNE spread_text = "Airborne" cure_text = "Plasma" cures = list("plasma") - cure_chance = 50 + cure_prob = 50 agent = "AMB45DR Bacteria" permeability_mod = 0.75 desc = "If left untreated the subject will mutate to a different species." @@ -66,13 +66,13 @@ var/chosensuff possible_mutations = null -/datum/disease/kingstons_advanced/New() +/datum/disease/virus/kingstons_advanced/New() chosentype = pick(virspecies) chosensuff = pick(virsuffix) name = "[initial(chosentype.name)] [chosensuff]" -/datum/disease/kingstons_advanced/stage_act() +/datum/disease/virus/kingstons_advanced/stage_act() ..() if(ishuman(affected_mob)) var/mob/living/carbon/human/twisted = affected_mob diff --git a/code/datums/diseases/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm similarity index 92% rename from code/datums/diseases/loyalty_syndrome.dm rename to code/datums/diseases/viruses/loyalty_syndrome.dm index 59de2a29148..1fefe307570 100644 --- a/code/datums/diseases/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -1,6 +1,6 @@ #define STAGE_TIME 60 -/datum/disease/loyalty +/datum/disease/virus/loyalty name = "Loyalty Syndrome" max_stages = 5 spread_text = "On contact" @@ -8,7 +8,7 @@ can_immunity = FALSE cure_text = "Anti-Psychotics" cures = list("haloperidol") - cure_chance = 5 + cure_prob = 5 agent = "Halomonas minomae" visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER severity = DANGEROUS @@ -22,22 +22,22 @@ 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/M) 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) - M.viruses += copy + M.diseases += copy copy.affected_mob = M GLOB.active_diseases += copy copy.affected_mob.med_hud_set_status() -/datum/disease/loyalty/stage_act() +/datum/disease/virus/loyalty/stage_act() ..() if(affected_mob && !is_master && master && stage >= 4) @@ -130,7 +130,7 @@ 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)) @@ -138,9 +138,9 @@ 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 #undef STAGE_TIME diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/viruses/lycancoughy.dm similarity index 97% rename from code/datums/diseases/lycancoughy.dm rename to code/datums/diseases/viruses/lycancoughy.dm index f6f5873c7b4..b4ec8d8706c 100644 --- a/code/datums/diseases/lycancoughy.dm +++ b/code/datums/diseases/viruses/lycancoughy.dm @@ -1,4 +1,4 @@ -/datum/disease/lycan +/datum/disease/virus/lycan name = "Lycancoughy" form = "Infection" max_stages = 4 @@ -11,7 +11,7 @@ severity = MEDIUM var/barklimit = 0 -/datum/disease/lycan/stage_act() +/datum/disease/virus/lycan/stage_act() ..() switch(stage) if(2) //also changes say, see say.dm diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/viruses/magnitis.dm similarity index 96% rename from code/datums/diseases/magnitis.dm rename to code/datums/diseases/viruses/magnitis.dm index 678192fa5ec..0dc473e6b87 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/viruses/magnitis.dm @@ -1,4 +1,4 @@ -/datum/disease/magnitis +/datum/disease/virus/magnitis name = "Magnitis" max_stages = 4 spread_flags = AIRBORNE @@ -10,7 +10,7 @@ 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() +/datum/disease/virus/magnitis/stage_act() ..() switch(stage) if(2) diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/viruses/pierrot_throat.dm similarity index 86% rename from code/datums/diseases/pierrot_throat.dm rename to code/datums/diseases/viruses/pierrot_throat.dm index 2c61805327f..ec46e36e40b 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/viruses/pierrot_throat.dm @@ -1,18 +1,18 @@ -/datum/disease/pierrot_throat +/datum/disease/virus/pierrot_throat name = "Pierrot's Throat" max_stages = 4 spread_flags = AIRBORNE spread_text = "Airborne" cure_text = "Banana products, especially banana bread." cures = list("banana") - cure_chance = 75 + cure_prob = 75 agent = "H0NI<42 Virus" permeability_mod = 0.75 desc = "If left untreated the subject will probably drive others to insanity." severity = MEDIUM - possible_mutations = list(/datum/disease/pierrot_throat/advanced, /datum/disease/wizarditis) + possible_mutations = list(/datum/disease/virus/pierrot_throat/advanced, /datum/disease/virus/wizarditis) -/datum/disease/pierrot_throat/stage_act() +/datum/disease/virus/pierrot_throat/stage_act() ..() switch(stage) if(1) @@ -29,19 +29,19 @@ affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) -/datum/disease/pierrot_throat/advanced +/datum/disease/virus/pierrot_throat/advanced name = "Advanced Pierrot's Throat" spread_text = "Airborne" cure_text = "Banana products, especially banana bread." cures = list("banana") - cure_chance = 75 + cure_prob = 75 agent = "H0NI<42.B4n4 Virus" 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() +/datum/disease/virus/pierrot_throat/advanced/stage_act() ..() switch(stage) if(1) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/viruses/retrovirus.dm similarity index 94% rename from code/datums/diseases/retrovirus.dm rename to code/datums/diseases/viruses/retrovirus.dm index 17c3214a7f1..e82ba05e4fc 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/viruses/retrovirus.dm @@ -1,10 +1,10 @@ -/datum/disease/dna_retrovirus +/datum/disease/virus/dna_retrovirus name = "Retrovirus" max_stages = 4 spread_text = "Contact" spread_flags = CONTACT cure_text = "Rest or an injection of mutadone" - cure_chance = 6 + cure_prob = 6 agent = "" desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly." severity = DANGEROUS @@ -15,7 +15,7 @@ var/restcure = 0 -/datum/disease/dna_retrovirus/New() +/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)]" if(prob(40)) @@ -24,7 +24,7 @@ restcure = 1 -/datum/disease/dna_retrovirus/stage_act() +/datum/disease/virus/dna_retrovirus/stage_act() ..() switch(stage) if(1) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/viruses/rhumba_beat.dm similarity index 93% rename from code/datums/diseases/rhumba_beat.dm rename to code/datums/diseases/viruses/rhumba_beat.dm index 3646244e6c0..a31a3573761 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/viruses/rhumba_beat.dm @@ -1,4 +1,4 @@ -/datum/disease/rhumba_beat +/datum/disease/virus/rhumba_beat name = "The Rhumba Beat" max_stages = 5 spread_text = "On contact" @@ -8,7 +8,7 @@ agent = "Unknown" severity = BIOHAZARD -/datum/disease/rhumba_beat/stage_act() +/datum/disease/virus/rhumba_beat/stage_act() ..() if(affected_mob.ckey == "rosham") cure() diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/viruses/transformation.dm similarity index 90% rename from code/datums/diseases/transformation.dm rename to code/datums/diseases/viruses/transformation.dm index 7a11503e00b..9fcd62e1856 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/viruses/transformation.dm @@ -1,4 +1,4 @@ -/datum/disease/transformation +/datum/disease/virus/transformation name = "Transformation" max_stages = 5 spread_text = "Acute" @@ -18,7 +18,7 @@ var/new_form = /mob/living/carbon/human var/is_new_mind = FALSE -/datum/disease/transformation/stage_act() +/datum/disease/virus/transformation/stage_act() ..() switch(stage) if(1) @@ -36,7 +36,7 @@ if(5) do_disease_transformation(affected_mob) -/datum/disease/transformation/proc/do_disease_transformation(mob/living/affected_mob) +/datum/disease/virus/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)) @@ -71,14 +71,14 @@ -/datum/disease/transformation/jungle_fever +/datum/disease/virus/transformation/jungle_fever name = "Jungle Fever" cure_text = "Bananas" cures = list("banana") spread_text = "Monkey Bites" spread_flags = SPECIAL //TODO: spread with bites viable_mobtypes = list(/mob/living/carbon/human) - cure_chance = 1 + cure_prob = 1 curable = FALSE desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." severity = BIOHAZARD @@ -95,11 +95,11 @@ "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) +/datum/disease/virus/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() +/datum/disease/virus/transformation/jungle_fever/stage_act() ..() switch(stage) if(2) @@ -114,12 +114,12 @@ affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh.")) -/datum/disease/transformation/robot +/datum/disease/virus/transformation/robot name = "Robotic Transformation" cure_text = "An injection of copper." cures = list("copper") - cure_chance = 5 + cure_prob = 5 agent = "R2D2 Nanomachines" desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." severity = DANGEROUS @@ -134,7 +134,7 @@ stage5 = list("Your skin feels as if it's about to burst off!") -/datum/disease/transformation/robot/stage_act() +/datum/disease/virus/transformation/robot/stage_act() ..() switch(stage) if(3) @@ -148,12 +148,12 @@ affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) -/datum/disease/transformation/xeno +/datum/disease/virus/transformation/xeno name = "Xenomorph Transformation" cure_text = "Spaceacillin & Glycerol" cures = list("spaceacillin", "glycerol") - cure_chance = 5 + cure_prob = 5 agent = "Rip-LEY Alien Microbes" desc = "This disease changes the victim into a xenomorph." severity = BIOHAZARD @@ -166,10 +166,10 @@ Вы чувствуете боль от превращения! Вы желаете укусить того, кто с вами это сделал, благо, память вас не покинула и вы всё помните.") new_form = null -/datum/disease/transformation/xeno/New() +/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/transformation/xeno/stage_act() +/datum/disease/virus/transformation/xeno/stage_act() ..() switch(stage) if(3) @@ -181,11 +181,11 @@ affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) -/datum/disease/transformation/slime +/datum/disease/virus/transformation/slime name = "Advanced Mutation Transformation" cure_text = "frost oil" cures = list("frostoil") - cure_chance = 80 + cure_prob = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." severity = BIOHAZARD @@ -197,7 +197,7 @@ stage5 = list("You have become a slime.") new_form = /mob/living/simple_animal/slime/random -/datum/disease/transformation/slime/stage_act() +/datum/disease/virus/transformation/slime/stage_act() ..() switch(stage) if(1) @@ -211,7 +211,7 @@ if(!isslimeperson(human)) human.set_species(/datum/species/slime) -/datum/disease/transformation/corgi +/datum/disease/virus/transformation/corgi name = "The Barkening" cure_text = "Death" cures = list("adminordrazine") @@ -226,7 +226,7 @@ new_form = /mob/living/simple_animal/pet/dog/corgi is_new_mind = TRUE -/datum/disease/transformation/corgi/stage_act() +/datum/disease/virus/transformation/corgi/stage_act() ..() switch(stage) if(3) @@ -236,7 +236,7 @@ if(prob(20)) affected_mob.say(pick("Bark!", "AUUUUUU")) -/datum/disease/transformation/morph +/datum/disease/virus/transformation/morph name = "Gluttony's Blessing" cure_text = "nothing" cures = list("adminordrazine") diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/viruses/tuberculosis.dm similarity index 94% rename from code/datums/diseases/tuberculosis.dm rename to code/datums/diseases/viruses/tuberculosis.dm index 1521a433905..8be7da0ef19 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/viruses/tuberculosis.dm @@ -1,4 +1,4 @@ -/datum/disease/tuberculosis +/datum/disease/virus/tuberculosis form = "Disease" name = "Fungal tuberculosis" max_stages = 5 @@ -7,13 +7,13 @@ cure_text = "Spaceacillin & salbutamol" cures = list("spaceacillin", "salbutamol") agent = "Fungal Tubercle bacillus Cosmosis" - cure_chance = 5//like hell are you getting out of hell + cure_prob = 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 ignore_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs -/datum/disease/tuberculosis/stage_act() //it begins +/datum/disease/virus/tuberculosis/stage_act() //it begins ..() var/mob/living/carbon/human/H = affected_mob if(!istype(H)) diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/viruses/wizarditis.dm similarity index 94% rename from code/datums/diseases/wizarditis.dm rename to code/datums/diseases/viruses/wizarditis.dm index 9763bff4a5f..94142e55f07 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/viruses/wizarditis.dm @@ -1,11 +1,11 @@ -/datum/disease/wizarditis +/datum/disease/virus/wizarditis name = "Wizarditis" max_stages = 4 spread_flags = AIRBORNE spread_text = "Airborne" cure_text = "The Manly Dorf" cures = list("manlydorf") - cure_chance = 100 + cure_prob = 100 agent = "Rincewindus Vulgaris" 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." @@ -22,7 +22,7 @@ TARCOL MINTI ZHERI - forcewall STI KALY - blind */ -/datum/disease/wizarditis/stage_act() +/datum/disease/virus/wizarditis/stage_act() ..() switch(stage) @@ -53,7 +53,7 @@ STI KALY - blind -/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0) +/datum/disease/virus/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)) @@ -85,7 +85,7 @@ STI KALY - blind -/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/game/data_huds.dm b/code/game/data_huds.dm index 120bb6cf59c..8f4cf42c020 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 @@ -88,7 +88,7 @@ /// Whether a virus worthy displaying on the HUD is present. /mob/living/carbon/proc/has_virus() - for(var/thing in viruses) + 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 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 e62c271c213..063f9d2a6c8 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -219,16 +219,16 @@ /obj/item/organ/internal/heart/gland/viral/activate() to_chat(owner, "You feel sick.") - var/datum/disease/advance/new_virus = new + var/datum/disease/virus/advance/new_virus = new new_virus.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) new_virus.symptoms = new_virus.GenerateSymptoms(count_of_symptoms = rand(4, 6)) new_virus.Refresh() new_virus.carrier = TRUE - var/datum/disease/advance/old_virus = locate() in owner.viruses + var/datum/disease/virus/advance/old_virus = locate() in owner.diseases if(old_virus) - old_virus.cure(resistance = FALSE) - owner.ForceContractDisease(new_virus) + old_virus.cure(need_immunity = FALSE) + new_virus.ForceContract(owner) /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/spaceninja/ninja/suit/ninja_equipment_actions/ninja_status_read.dm b/code/game/gamemodes/spaceninja/ninja/suit/ninja_equipment_actions/ninja_status_read.dm index 79af8d00499..d463694100a 100644 --- a/code/game/gamemodes/spaceninja/ninja/suit/ninja_equipment_actions/ninja_status_read.dm +++ b/code/game/gamemodes/spaceninja/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.spread_text], Стадия: [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/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index cbb2e6cd9ea..6567340de07 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -222,7 +222,7 @@ 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) continue @@ -388,7 +388,7 @@ 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) continue diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index e3f1a4b6c7c..e41b8bb2170 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -554,7 +554,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/medical.dm b/code/game/machinery/computer/medical.dm index 87973705e49..b24ef484fe2 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.spread_text, cure = D.cure_text || "None", desc = D.desc, severity = D.severity diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index f4ba6ef478a..97cb0602be6 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.spread_text]" . += " Стадия: [D.stage]/[D.max_stages]" . += " Лечение: [D.cure_text]" if(H.undergoing_cardiac_arrest()) @@ -903,7 +903,7 @@ 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 & HIDDEN_SCANNER) continue diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index 87db16fa42b..edaf5e5c1e8 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.ForceContract(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,8 +148,6 @@ name = "Memetic Kill Agent" max_stages = 4 stage_prob = 8 - spread_text = "Non-Contagious" - spread_flags = NON_CONTAGIOUS cure_text = "Unknown" severity = BIOHAZARD curable = FALSE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index e54e1bb84c7..66311f79fae 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -880,7 +880,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( 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) + D.ForceContract(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..0336ea8c8ec 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.ForceContract(target) /obj/effect/proc_holder/spell/goon_vampire/glare diff --git a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm index 7e6af7bb100..26559dd2f2a 100644 --- a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm @@ -683,7 +683,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.ForceContract(victim) // grave fever /*======================================================================================================================================*\ @@ -1572,7 +1573,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 @@ -1684,10 +1685,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/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index f0b2aaec750..569f2c077b0 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.ForceContract(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..c27e11aaed0 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.ForceContract(user) if(10) //Nothing T.visible_message("Nothing seems to happen.") diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index f7bcff75378..e7a09e22966 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -1,26 +1,26 @@ /datum/event/disease_outbreak announceWhen = 15 /// The type of disease that patient zero will be infected with. - var/datum/disease/D + 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) var/virus_type = pick( - 5; /datum/disease/advance, \ - 1; /datum/disease/anxiety, \ - 1; /datum/disease/beesease, \ - 1; /datum/disease/brainrot, \ - 1; /datum/disease/fake_gbs, \ - 1; /datum/disease/fluspanish, \ - 1; /datum/disease/loyalty, \ - 1; /datum/disease/lycan, \ - 1; /datum/disease/magnitis, \ - 1; /datum/disease/pierrot_throat, \ + 5; /datum/disease/virus/advance, \ + 1; /datum/disease/virus/anxiety, \ + 1; /datum/disease/virus/beesease, \ + 1; /datum/disease/virus/brainrot, \ + 1; /datum/disease/virus/fake_gbs, \ + 1; /datum/disease/virus/fluspanish, \ + 1; /datum/disease/virus/loyalty, \ + 1; /datum/disease/virus/lycan, \ + 1; /datum/disease/virus/magnitis, \ + 1; /datum/disease/virus/pierrot_throat, \ ) - if(virus_type == /datum/disease/advance) - var/datum/disease/advance/A = new + if(virus_type == /datum/disease/virus/advance) + var/datum/disease/virus/advance/A = new A.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) // random silly name A.symptoms = A.GenerateSymptoms(count_of_symptoms = 6) A.Refresh() @@ -49,7 +49,7 @@ if(!is_station_level(T.z)) continue - if(!H.ForceContractDisease(D)) + if(!D.ForceContract(H)) continue patient_zero = H break diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 53923f4d124..f36942ced70 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.ForceContract(H) break diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 0afd2ca495a..eb4299be98d 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -161,7 +161,7 @@ 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" cures = list("adminordrazine") diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 22eba6bdfc1..75cac599666 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -32,15 +32,15 @@ if(!iscarbon(user)) return - for(var/thing in viruses) - var/datum/disease/D = thing - if(D.spread_flags & CONTACT) - user.ContractDisease(D) + for(var/thing in diseases) + var/datum/disease/virus/V = thing + if(V.spread_flags & CONTACT) + V.Contract(user) - for(var/thing in user.viruses) - var/datum/disease/D = thing - if(D.spread_flags & CONTACT) - ContractDisease(D) + for(var/thing in user.diseases) + var/datum/disease/virus/V = thing + if(V.spread_flags & CONTACT) + V.Contract(src) if(lying && surgeries.len) if(user.a_intent == INTENT_HELP) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 88156b22cda..989b6016180 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -678,8 +678,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.ForceContract(src) //metabolism change if(nutrition > NUTRITION_LEVEL_FAT) @@ -747,24 +747,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.ForceContract(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.ForceContract(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.ForceContract(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.ForceContract(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) @@ -773,8 +773,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.ForceContract(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/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 0f8f485ea39..65ad4be5f5e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -549,9 +549,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 6208b69a1f8..37a26cc8121 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -404,15 +404,14 @@ return 1 if(treat_virus) - for(var/thing in C.viruses) + for(var/thing in C.diseases) var/datum/disease/D = thing //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. if(D.visibility_flags & HIDDEN_HUD) return 0 if(D.severity == NONTHREAT) // medibot doesn't try to heal truly harmless viruses return 0 - if((D.stage > 1) || (D.spread_flags & AIRBORNE)) // medibot can't detect a virus in its initial stage unless it spreads airborne. - + if(D.discovered) if(!C.reagents.has_reagent(treatment_virus)) return 1 //STOP DISEASE FOREVER @@ -461,12 +460,12 @@ else if(treat_virus) var/virus = 0 - for(var/thing in C.viruses) + for(var/thing in C.diseases) var/datum/disease/D = thing //detectable virus if(!(D.visibility_flags & HIDDEN_HUD)) if(D.severity != NONTHREAT) //virus is harmful - if((D.stage > 1) || (D.spread_flags & AIRBORNE)) + if((D.discovered)) virus = 1 if(!reagent_id && (virus)) 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/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 0de3ab03f48..d6d11e4ab8d 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -774,7 +774,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.ForceContract(target) return ..() @@ -798,10 +799,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.ForceContract(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.ForceContract(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/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 1d8f8eda582..533aed4b76e 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -109,7 +109,7 @@ 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/virus/advance/A = GLOB.archive_diseases[D.GetDiseaseID()] if(A) D = A.Copy() else if(type) @@ -155,9 +155,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 +179,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 @@ -258,9 +258,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 +274,11 @@ dat += "Болезнетворный агент: [D?"[D.agent] — Создать бутылёк с вирусной культурой":"нет"]
" dat += "Общепринятое название: [(D.name||"нет")]
" dat += "Описание: [(D.desc||"нет")]
" - dat += "Путь передачи: [(D.spread_text||"нет")]
" + //dat += "Путь передачи: [(D.spread_text||"нет")]
" dat += "Возможное лекарство: [(D.cure_text||"нет")]

" - 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 +301,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/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..01f795de175 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.ForceContract(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.ForceContract(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.ForceContract(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.ForceContract(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.ForceContract(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/curable/D = new + D.ForceContract(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.ForceContract(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.ForceContract(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.ForceContract(M) return ..() /datum/reagent/heartworms diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index 856eda2d2b7..2c70d55cc85 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -877,7 +877,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.ForceContract(H) /datum/reagent/msg name = "Monosodium glutamate" @@ -923,7 +924,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.ForceContract(M) return ..() | update_flags /datum/reagent/fungus @@ -942,7 +944,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.ForceContract(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 831221e536f..4638ccd2755 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -1350,7 +1350,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 6e7b56ad2a7..3079bf62310 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -99,7 +99,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.ForceContract(M) /datum/reagent/mercury @@ -1246,7 +1247,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.ForceContract(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 041ba3792c0..b16cd811086 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 < BLOOD) + if(V.spread_flags < BLOOD) continue if(method == REAGENT_TOUCH) - M.ContractDisease(D) + V.Contract(M) else //ingest, patch or inject - M.ForceContractDisease(D) + V.ForceContract(M) if(method == REAGENT_INGEST && iscarbon(M)) var/mob/living/carbon/C = M @@ -138,16 +138,16 @@ // 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) if(AD) var/list/preserve = list(AD) for(var/D in data["viruses"]) - if(!istype(D, /datum/disease/advance)) + if(!istype(D, /datum/disease/virus/advance)) preserve += D data["viruses"] = preserve @@ -183,15 +183,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 < BLOOD) + if(V.spread_flags < BLOOD) continue if(method == REAGENT_TOUCH) - M.ContractDisease(D) + V.Contract(M) else //ingest, patch or inject - M.ForceContractDisease(D) + V.ForceContract(M) /datum/reagent/blood/synthetic/vox name = "Synthetic Blood" @@ -240,7 +240,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..777135ac5d9 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -285,200 +285,200 @@ 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/advance/preset/flu /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 + spawned_disease = /datum/disease/virus/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/advance/preset/cold /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 8ebc6be6585..c2f63dc6b47 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -128,7 +128,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(A) for(var/datum/symptom/S in A.symptoms) english_symptoms += S.name diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index a83d0ff8701..c16b877a8ec 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 < BLOOD) + var/datum/disease/virus/V = thing + if(V.spread_flags < BLOOD) continue - C.ForceContractDisease(D) + V.ForceContract(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..84a77073697 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.ForceContract(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.ForceContract(owner) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 89fd2219710..31b86db1c01 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -184,7 +184,7 @@ 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 = TRUE update_icon() diff --git a/paradise.dme b/paradise.dme index 5686587dd67..95360db570f 100644 --- a/paradise.dme +++ b/paradise.dme @@ -395,72 +395,73 @@ #include "code\datums\components\twohanded.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" -#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\viruses\_virus.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\viruses\cold9.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\fake_gbs.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" From 07efcf78e4713a1801db8f14455ee22426ba9eff Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Wed, 11 Oct 2023 20:59:58 +0300 Subject: [PATCH 06/17] remove unnecessary variables --- code/datums/diseases/_MobProcs.dm | 33 ++---- code/datums/diseases/_disease.dm | 56 ++++++++- code/datums/diseases/appendicitis.dm | 7 +- code/datums/diseases/berserker.dm | 6 +- code/datums/diseases/critical.dm | 9 +- code/datums/diseases/kuru.dm | 1 - code/datums/diseases/vampire.dm | 1 - code/datums/diseases/viruses/_virus.dm | 27 ++++- .../diseases/viruses/advance/advance.dm | 107 ++++++++---------- code/datums/diseases/viruses/anxiety.dm | 2 - code/datums/diseases/viruses/beesease.dm | 1 - code/datums/diseases/viruses/brainrot.dm | 10 +- code/datums/diseases/viruses/cold9.dm | 7 +- code/datums/diseases/viruses/fake_gbs.dm | 31 ----- code/datums/diseases/viruses/flu.dm | 6 +- code/datums/diseases/viruses/fluspanish.dm | 7 +- code/datums/diseases/viruses/gbs.dm | 45 ++++++-- code/datums/diseases/viruses/kingstons.dm | 12 +- .../diseases/viruses/loyalty_syndrome.dm | 3 +- code/datums/diseases/viruses/lycancoughy.dm | 6 +- code/datums/diseases/viruses/magnitis.dm | 6 +- .../datums/diseases/viruses/pierrot_throat.dm | 17 +-- code/datums/diseases/viruses/retrovirus.dm | 7 +- code/datums/diseases/viruses/rhumba_beat.dm | 3 +- .../datums/diseases/viruses/transformation.dm | 41 +++---- code/datums/diseases/viruses/tuberculosis.dm | 13 +-- code/datums/diseases/viruses/wizarditis.dm | 6 +- .../ninja_status_read.dm | 2 +- code/game/machinery/computer/medical.dm | 2 +- code/game/objects/items/devices/scanners.dm | 2 +- code/modules/admin/admin_verbs.dm | 5 +- code/modules/events/disease_outbreak.dm | 4 +- .../mining/lavaland/loot/ashdragon_loot.dm | 2 +- .../reagents/chemistry/machinery/pandemic.dm | 4 +- .../reagents/chemistry/reagents/disease.dm | 2 +- paradise.dme | 1 - 36 files changed, 244 insertions(+), 250 deletions(-) delete mode 100644 code/datums/diseases/viruses/fake_gbs.dm diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 53732e2a8d9..9bdb64d87f7 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,4 +1,3 @@ - /mob/proc/HasDisease(disease_type_or_instance) var/datum/disease/D1 if(ispath(disease_type_or_instance)) @@ -13,27 +12,17 @@ return TRUE return FALSE - -/mob/proc/CanContractVirus(datum/disease/virus/D) - if(stat == DEAD && !D.can_spread_to_dead) - return FALSE - - if(D.GetDiseaseID() in resistances) - return FALSE - - if(HasDisease(D)) - return FALSE - - if(istype(D, /datum/disease/virus/advance) && count_by_type(diseases, /datum/disease/virus/advance) > 0) - return FALSE - - for(var/mobtype in D.viable_mobtypes) - if(istype(src, mobtype)) - return TRUE - - return FALSE - -/mob/living/carbon/human/CanContractVirus(datum/disease/virus/D) +/** + * A special checks for this type of mob + * + * Returns: + * * TRUE - if can contract disease + * * FALSE - otherwise + */ +/mob/proc/CanContractDisease(datum/disease/D) + return TRUE + +/mob/living/carbon/human/CanContractDisease(datum/disease/D) if((VIRUSIMMUNE in dna.species.species_traits) && !D.ignore_immunity) return FALSE for(var/thing in D.required_organs) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index d1c9fced8ce..3f23afc2d61 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -16,11 +16,12 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease //Fluff - var/form = "Disease" + var/form = "Болезнь" var/name = "Unknown" var/desc = "" var/agent = "some microbes" - var/cure_text = "" + var/cure_text = null + var/additional_info = "Болезнь" //Stages var/stage = 1 //current stage of disease @@ -55,8 +56,18 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/can_progress_in_dead = FALSE //can progresses in a dead affected_mob var/list/viable_mobtypes = list(/mob/living/carbon/human) //Types of infectable mobs var/list/required_organs = list() + var/can_contract_dead = FALSE //if TRUE, disease can contract dead mobs +/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) @@ -128,17 +139,53 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease/proc/spread() return - +/** + * Checking mob's protection against this disease + */ /datum/disease/proc/TryContract(mob/M) return TRUE - +/** + * Attempt to infect a mob with a check of its protection + * Returns: + * * TRUE - mob successfully infected + * * FALSE - otherwise + */ /datum/disease/proc/Contract(mob/M) if(TryContract(M)) . = ForceContract(M) +/** + * Basic checks of the possibility of infecting a mob + */ +/datum/disease/proc/CanContract(mob/M) + if(!M.CanContractDisease(src)) + return FALSE + + if(M.stat == DEAD && !can_contract_dead) + return FALSE + if(GetDiseaseID() in M.resistances) + return FALSE + + if(M.HasDisease(src)) + return FALSE + + for(var/mobtype in viable_mobtypes) + if(istype(M, mobtype)) + return TRUE + return FALSE + +/** + * Attempt to infect a mob without a check of its protection + * Returns: + * * TRUE - mob successfully infected + * * FALSE - otherwise + */ /datum/disease/proc/ForceContract(mob/M) + if(!CanContract(M)) + return FALSE + var/datum/disease/D = Copy() M.diseases += D D.affected_mob = M @@ -146,6 +193,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) D.affected_mob.med_hud_set_status() return TRUE + /datum/disease/proc/IsSame(datum/disease/D) if(src.type == D.type) return TRUE diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 0dfd8098adc..70d9308516d 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -1,12 +1,11 @@ /datum/disease/appendicitis form = "Condition" name = "Appendicitis" - max_stages = 5 - stage_prob = 2 - cure_text = "Surgery" agent = "Shitty Appendix" desc = "If left untreated the subject will become very weak, and may vomit often." - severity = "Dangerous!" + cure_text = "Surgery" + stage_prob = 2 + severity = DANGEROUS curable = FALSE can_immunity = FALSE visibility_flags = HIDDEN_PANDEMIC diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm index 7c3e9eb657a..e9ca5a134c3 100644 --- a/code/datums/diseases/berserker.dm +++ b/code/datums/diseases/berserker.dm @@ -1,12 +1,12 @@ /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 - cure_text = "Anti-Psychotics" cures = list("haloperidol") - agent = "Jagged Crystals" cure_prob = 10 - desc = "Swearing, shouting, attacking nearby crew members uncontrollably." severity = DANGEROUS can_immunity = FALSE diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm index 27175876b31..0dbfee3d8b9 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -1,4 +1,5 @@ /datum/disease/critical + visibility_flags = HIDDEN_PANDEMIC /datum/disease/critical/stage_act() //overriden to ensure unique behavior stage = min(stage, max_stages) @@ -21,9 +22,8 @@ /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 - cure_text = "Saline-Glucose Solution" cures = list("salglu_solution") cure_prob = 10 stage_prob = 6 @@ -80,9 +80,8 @@ /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 - cure_text = "Atropine, Epinephrine, or Heparin" cures = list("atropine", "epinephrine", "heparin") cure_prob = 10 needs_all_cures = FALSE @@ -139,8 +138,8 @@ /datum/disease/critical/hypoglycemia name = "Hypoglycemia" form = "Medical Emergency" + additional_info = "The patient has low blood sugar." max_stages = 3 - //spread_text = "The patient has low blood sugar." cure_text = "Eating or administration of vitamins or nutrients" stage_prob = 1 severity = DANGEROUS diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index f98138b7dc9..cd8ae5c6b10 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -1,5 +1,4 @@ /datum/disease/kuru - form = "Disease" name = "Space Kuru" max_stages = 4 stage_prob = 5 diff --git a/code/datums/diseases/vampire.dm b/code/datums/diseases/vampire.dm index 09c09f995ac..e9d72476637 100644 --- a/code/datums/diseases/vampire.dm +++ b/code/datums/diseases/vampire.dm @@ -2,7 +2,6 @@ name = "Grave Fever" max_stages = 3 stage_prob = 5 - cure_text = "Antibiotics" cures = list("spaceacillin") agent = "Grave Dust" cure_prob = 20 diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm index c9986065f4b..36ab36ce1a4 100644 --- a/code/datums/diseases/viruses/_virus.dm +++ b/code/datums/diseases/viruses/_virus.dm @@ -6,16 +6,18 @@ #define AIRBORNE 8 //virus spreads through the air /datum/disease/virus - form = "Virus" + form = "Вирус" var/spread_flags = NON_CONTAGIOUS - var/spread_text = "" //Infectivity var/infectivity = 65 //affects how often the virus will try to spread var/permeability_mod = 1 // var/carrier = FALSE //if TRUE, host not affected by virus, but can spread it - var/can_spread_to_dead //if TRUE, virus can contract dead mobs + +/datum/disease/virus/New() + ..() + additional_info = spread_text() /** * Main virus process, that executed every tick @@ -74,9 +76,22 @@ break V = Temp +/datum/disease/virus/proc/spread_text() + var/list/spread = list() + if(!spread_flags) + spread += "Не заразный" + if(spread_flags & SPECIAL) + spread += "Специальный" + if(spread_flags & BLOOD) + spread += "Распространяемый через кровь" + if(spread_flags & CONTACT) + spread += "Контактный" + if(spread_flags & AIRBORNE) + spread += "Воздушно-капельный" + return english_list(spread, "Неизвестен", "и") /datum/disease/virus/TryContract(mob/M) - if(!M.CanContractVirus(src)) + if(!..()) return FALSE var/obj/item/clothing/Cl = null @@ -128,3 +143,7 @@ passed = (prob((50*permeability_mod) - 1)) return passed + +/datum/disease/virus/ForceContract(mob/M, is_carrier = FALSE) + . = ..() + carrier = is_carrier diff --git a/code/datums/diseases/viruses/advance/advance.dm b/code/datums/diseases/viruses/advance/advance.dm index 29c610315ce..0a7426636c9 100644 --- a/code/datums/diseases/viruses/advance/advance.dm +++ b/code/datums/diseases/viruses/advance/advance.dm @@ -3,8 +3,6 @@ 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 @@ -30,10 +28,9 @@ GLOBAL_LIST_EMPTY(archive_diseases) 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" // NEW VARS @@ -47,6 +44,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) AssignProperties(GenerateProperties()) id = GetDiseaseID() + ..() /datum/disease/virus/advance/Destroy() if(processing) @@ -87,7 +85,9 @@ GLOBAL_LIST_EMPTY(archive_diseases) // Returns the advance disease with a different reference memory. /datum/disease/virus/advance/Copy() var/datum/disease/virus/advance/copy = new - var/list/required_vars = list("name","severity","id","visibility_flags","spread_flags","stage_prob","cures","cure_prob","permeability_mod") + var/list/required_vars = list( + "name","severity","id","visibility_flags","spread_flags", + "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] @@ -109,8 +109,8 @@ GLOBAL_LIST_EMPTY(archive_diseases) /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/virus/advance/proc/GenerateSymptoms(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 0) @@ -185,8 +185,8 @@ GLOBAL_LIST_EMPTY(archive_diseases) // Assign the properties that are in the list. /datum/disease/virus/advance/proc/AssignProperties(list/properties = list()) - if(properties && properties.len) + // stealth switch(properties["stealth"]) if(1) visibility_flags = HIDDEN_HUD @@ -197,60 +197,49 @@ GLOBAL_LIST_EMPTY(archive_diseases) 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)) //TODO: подредактировать цифры под новые границы цифры флагов - permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) // TODO: нерабочая хуйня, не забудь пофиксить - cure_prob = 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"] - symptoms.len) + if(-INFINITY to 1) + spread_flags = BLOOD + if(2 to 3) + spread_flags = CONTACT + if(4 to INFINITY) + spread_flags = AIRBORNE + permeability_mod = clamp((0.25 * properties["transmittable"]), 0.1, 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/virus/advance/proc/SetSpread(spread_id) - switch(spread_id) - if(NONE, SPECIAL) - spread_text = "None" - if(BLOOD) - spread_text = "Blood" - if(CONTACT) - spread_text = "On contact" - if(AIRBORNE) - spread_text = "Airborne" - - spread_flags = spread_id - -/datum/disease/virus/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/virus/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/virus/advance/proc/Evolve(min_level, max_level) @@ -301,6 +290,10 @@ GLOBAL_LIST_EMPTY(archive_diseases) symptoms -= S return +/datum/disease/virus/advance/CanContract(mob/M) + . = ..() + if(count_by_type(M.diseases, /datum/disease/virus/advance) > 0) + . = FALSE /* Static Procs diff --git a/code/datums/diseases/viruses/anxiety.dm b/code/datums/diseases/viruses/anxiety.dm index aee6433bf7a..b98b25d773e 100644 --- a/code/datums/diseases/viruses/anxiety.dm +++ b/code/datums/diseases/viruses/anxiety.dm @@ -2,9 +2,7 @@ name = "Severe Anxiety" form = "Infection" max_stages = 4 - spread_text = "On contact" spread_flags = CONTACT - cure_text = "Ethanol" cures = list("ethanol") agent = "Excess Lepidopticides" desc = "If left untreated subject will regurgitate butterflies." diff --git a/code/datums/diseases/viruses/beesease.dm b/code/datums/diseases/viruses/beesease.dm index e5b0556f485..0abdb68d8ad 100644 --- a/code/datums/diseases/viruses/beesease.dm +++ b/code/datums/diseases/viruses/beesease.dm @@ -2,7 +2,6 @@ name = "Beesease" form = "Infection" max_stages = 4 - spread_text = "On contact" spread_flags = CONTACT cure_text = "Sugar" cures = list("sugar") diff --git a/code/datums/diseases/viruses/brainrot.dm b/code/datums/diseases/viruses/brainrot.dm index 9cb720c8c79..c7ecc9365ee 100644 --- a/code/datums/diseases/viruses/brainrot.dm +++ b/code/datums/diseases/viruses/brainrot.dm @@ -1,19 +1,17 @@ /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_text = "On contact" spread_flags = CONTACT - cure_text = "Mannitol" cures = list("mannitol") - agent = "Cryptococcus Cosmosis" - cure_prob = 15//higher chance to cure, since two reagents are required - desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." + 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() //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 +/datum/disease/virus/brainrot/stage_act() ..() switch(stage) diff --git a/code/datums/diseases/viruses/cold9.dm b/code/datums/diseases/viruses/cold9.dm index 4d878dcb373..6d6e586d2d9 100644 --- a/code/datums/diseases/viruses/cold9.dm +++ b/code/datums/diseases/viruses/cold9.dm @@ -1,12 +1,11 @@ /datum/disease/virus/cold9 name = "The Cold" + agent = "ICE9-rhinovirus" + desc = "If left untreated the subject will slow, as if partly frozen." max_stages = 3 - spread_text = "On contact" spread_flags = CONTACT - cure_text = "Common Cold Anti-bodies & Spaceacillin" + //cure_text = "Common Cold Anti-bodies & Spaceacillin" //TODO: cure cures = list("spaceacillin") - agent = "ICE9-rhinovirus" - desc = "If left untreated the subject will slow, as if partly frozen." severity = MEDIUM /datum/disease/virus/cold9/stage_act() diff --git a/code/datums/diseases/viruses/fake_gbs.dm b/code/datums/diseases/viruses/fake_gbs.dm deleted file mode 100644 index a2e207d45c1..00000000000 --- a/code/datums/diseases/viruses/fake_gbs.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/disease/virus/fake_gbs - name = "GBS" - max_stages = 5 - spread_text = "On contact" - spread_flags = CONTACT - cure_text = "Diphenhydramine & Sulfur" - cures = list("diphenhydramine","sulfur") - agent = "Gravitokinetic Bipotential SADS-" - desc = "If left untreated death will occur." - severity = BIOHAZARD - -/datum/disease/virus/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/viruses/flu.dm b/code/datums/diseases/viruses/flu.dm index b2404e4a637..9e2782e06a1 100644 --- a/code/datums/diseases/viruses/flu.dm +++ b/code/datums/diseases/viruses/flu.dm @@ -1,14 +1,12 @@ /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 - spread_text = "Airborne" - cure_text = "Spaceacillin" cures = list("spaceacillin") cure_prob = 10 - agent = "H13N1 flu virion" permeability_mod = 0.75 - desc = "If left untreated the subject will feel quite unwell." severity = MEDIUM /datum/disease/virus/flu/stage_act() diff --git a/code/datums/diseases/viruses/fluspanish.dm b/code/datums/diseases/viruses/fluspanish.dm index 94f7d9cdce0..85b0046b5c3 100644 --- a/code/datums/diseases/viruses/fluspanish.dm +++ b/code/datums/diseases/viruses/fluspanish.dm @@ -1,14 +1,13 @@ /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_flags = AIRBORNE - spread_text = "Airborne" - cure_text = "Spaceacillin & Anti-bodies to the common flu" + //cure_text = "Spaceacillin & Anti-bodies to the common flu" TODO: Cure cures = list("spaceacillin") cure_prob = 10 - agent = "1nqu1s1t10n flu virion" permeability_mod = 0.75 - desc = "If left untreated the subject will burn to death for being a heretic." severity = DANGEROUS /datum/disease/virus/fluspanish/stage_act() diff --git a/code/datums/diseases/viruses/gbs.dm b/code/datums/diseases/viruses/gbs.dm index 53a78a07bff..26a10c04445 100644 --- a/code/datums/diseases/viruses/gbs.dm +++ b/code/datums/diseases/viruses/gbs.dm @@ -1,12 +1,9 @@ /datum/disease/virus/gbs name = "GBS" - max_stages = 5 - spread_text = "On contact" + agent = "Gravitokinetic Bipotential SADS+" spread_flags = CONTACT - cure_text = "Diphenhydramine & Sulfur" cures = list("diphenhydramine","sulfur") cure_prob = 15 - agent = "Gravitokinetic Bipotential SADS+" severity = BIOHAZARD /datum/disease/virus/gbs/stage_act() @@ -35,13 +32,41 @@ else return -/datum/disease/virus/gbs/curable +/datum/disease/virus/gbs/non_con name = "Non-Contagious GBS" - stage_prob = 5 - spread_text = "Non-Contagious" - cure_text = "Cryoxadone" - cures = list("cryoxadone") - cure_prob = 10 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() + ..() + 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/viruses/kingstons.dm b/code/datums/diseases/viruses/kingstons.dm index 8c9d3ad4e8c..0ec63e1705b 100644 --- a/code/datums/diseases/viruses/kingstons.dm +++ b/code/datums/diseases/viruses/kingstons.dm @@ -1,14 +1,12 @@ /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 - spread_text = "Airborne" - cure_text = "Milk" cures = list("milk") cure_prob = 50 - agent = "Nya Virus" 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/virus/kingstons_advanced) @@ -50,15 +48,13 @@ /datum/disease/virus/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" + agent = "AMB45DR Bacteria" + desc = "If left untreated the subject will mutate to a different species." max_stages = 4 spread_flags = AIRBORNE - spread_text = "Airborne" - cure_text = "Plasma" cures = list("plasma") cure_prob = 50 - agent = "AMB45DR Bacteria" 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") diff --git a/code/datums/diseases/viruses/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm index 1fefe307570..5396a35a84b 100644 --- a/code/datums/diseases/viruses/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -2,14 +2,13 @@ /datum/disease/virus/loyalty name = "Loyalty Syndrome" + agent = "Halomonas minomae" max_stages = 5 - spread_text = "On contact" spread_flags = CONTACT can_immunity = FALSE cure_text = "Anti-Psychotics" cures = list("haloperidol") cure_prob = 5 - agent = "Halomonas minomae" visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER severity = DANGEROUS var/is_master = FALSE diff --git a/code/datums/diseases/viruses/lycancoughy.dm b/code/datums/diseases/viruses/lycancoughy.dm index b4ec8d8706c..cc3066bf056 100644 --- a/code/datums/diseases/viruses/lycancoughy.dm +++ b/code/datums/diseases/viruses/lycancoughy.dm @@ -1,13 +1,11 @@ /datum/disease/virus/lycan name = "Lycancoughy" form = "Infection" + agent = "Excess Snuggles" + desc = "If left untreated subject will regurgitate... puppies." max_stages = 4 - spread_text = "On contact" spread_flags = CONTACT - cure_text = "Ethanol" cures = list("ethanol") - agent = "Excess Snuggles" - desc = "If left untreated subject will regurgitate... puppies." severity = MEDIUM var/barklimit = 0 diff --git a/code/datums/diseases/viruses/magnitis.dm b/code/datums/diseases/viruses/magnitis.dm index 0dc473e6b87..50fb977ca10 100644 --- a/code/datums/diseases/viruses/magnitis.dm +++ b/code/datums/diseases/viruses/magnitis.dm @@ -1,13 +1,11 @@ /datum/disease/virus/magnitis name = "Magnitis" + agent = "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 spread_flags = AIRBORNE - spread_text = "Airborne" - cure_text = "Iron" cures = list("iron") - agent = "Fukkos Miracos" 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/virus/magnitis/stage_act() diff --git a/code/datums/diseases/viruses/pierrot_throat.dm b/code/datums/diseases/viruses/pierrot_throat.dm index ec46e36e40b..b8aa117f56d 100644 --- a/code/datums/diseases/viruses/pierrot_throat.dm +++ b/code/datums/diseases/viruses/pierrot_throat.dm @@ -1,14 +1,12 @@ /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 - spread_text = "Airborne" - cure_text = "Banana products, especially banana bread." cures = list("banana") cure_prob = 75 - agent = "H0NI<42 Virus" permeability_mod = 0.75 - desc = "If left untreated the subject will probably drive others to insanity." severity = MEDIUM possible_mutations = list(/datum/disease/virus/pierrot_throat/advanced, /datum/disease/virus/wizarditis) @@ -26,17 +24,12 @@ 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...") ) ) + affected_mob.say(pick(list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk..."))) /datum/disease/virus/pierrot_throat/advanced name = "Advanced Pierrot's Throat" - spread_text = "Airborne" - cure_text = "Banana products, especially banana bread." - cures = list("banana") - cure_prob = 75 agent = "H0NI<42.B4n4 Virus" - 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 @@ -45,8 +38,6 @@ ..() 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) @@ -58,7 +49,7 @@ affected_mob << 'sound/items/airhorn.ogg' if(4) if(prob(5)) - affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) + 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) diff --git a/code/datums/diseases/viruses/retrovirus.dm b/code/datums/diseases/viruses/retrovirus.dm index e82ba05e4fc..d7fc60ae89c 100644 --- a/code/datums/diseases/viruses/retrovirus.dm +++ b/code/datums/diseases/viruses/retrovirus.dm @@ -1,15 +1,14 @@ /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_text = "Contact" spread_flags = CONTACT cure_text = "Rest or an injection of mutadone" cure_prob = 6 - agent = "" - 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 diff --git a/code/datums/diseases/viruses/rhumba_beat.dm b/code/datums/diseases/viruses/rhumba_beat.dm index a31a3573761..8ea13d6c918 100644 --- a/code/datums/diseases/viruses/rhumba_beat.dm +++ b/code/datums/diseases/viruses/rhumba_beat.dm @@ -1,11 +1,10 @@ /datum/disease/virus/rhumba_beat name = "The Rhumba Beat" + agent = "Unknown" max_stages = 5 - spread_text = "On contact" spread_flags = CONTACT cure_text = "Chick Chicky Boom!" cures = list("plasma") - agent = "Unknown" severity = BIOHAZARD /datum/disease/virus/rhumba_beat/stage_act() diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm index 9fcd62e1856..eb80d4ed0d1 100644 --- a/code/datums/diseases/viruses/transformation.dm +++ b/code/datums/diseases/viruses/transformation.dm @@ -1,10 +1,8 @@ /datum/disease/virus/transformation name = "Transformation" + agent = "Shenanigans" max_stages = 5 - spread_text = "Acute" spread_flags = NON_CONTAGIOUS - 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 @@ -73,18 +71,17 @@ /datum/disease/virus/transformation/jungle_fever name = "Jungle Fever" - cure_text = "Bananas" + agent = "Kongey Vibrion M-909" + desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." + curable = FALSE + cure_prob = 1 cures = list("banana") - spread_text = "Monkey Bites" + //spread_text = "Monkey Bites" spread_flags = SPECIAL //TODO: spread with bites viable_mobtypes = list(/mob/living/carbon/human) - cure_prob = 1 - curable = FALSE - desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." severity = BIOHAZARD stage_prob = 4 visibility_flags = VISIBLE - agent = "Kongey Vibrion M-909" new_form = /mob/living/carbon/human/lesser/monkey is_new_mind = TRUE @@ -115,18 +112,15 @@ /datum/disease/virus/transformation/robot - name = "Robotic Transformation" - cure_text = "An injection of copper." - cures = list("copper") - cure_prob = 5 agent = "R2D2 Nanomachines" desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." + cures = list("copper") + cure_prob = 5 severity = DANGEROUS visibility_flags = VISIBLE 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.") @@ -149,13 +143,11 @@ /datum/disease/virus/transformation/xeno - name = "Xenomorph Transformation" - cure_text = "Spaceacillin & Glycerol" - cures = list("spaceacillin", "glycerol") - cure_prob = 5 agent = "Rip-LEY Alien Microbes" desc = "This disease changes the victim into a xenomorph." + cures = list("spaceacillin", "glycerol") + cure_prob = 5 severity = BIOHAZARD visibility_flags = VISIBLE stage1 = null @@ -183,11 +175,10 @@ /datum/disease/virus/transformation/slime name = "Advanced Mutation Transformation" - cure_text = "frost oil" - cures = list("frostoil") - cure_prob = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." + cures = list("frostoil") + cure_prob = 80 severity = BIOHAZARD visibility_flags = VISIBLE stage1 = list("You don't feel very well.") @@ -213,10 +204,10 @@ /datum/disease/virus/transformation/corgi name = "The Barkening" - cure_text = "Death" - cures = list("adminordrazine") agent = "Fell Doge Majicks" desc = "This disease transforms the victim into a corgi." + cure_text = "Death" + cures = list("adminordrazine") visibility_flags = VISIBLE stage1 = list("BARK.") stage2 = list("You feel the need to wear silly hats.") @@ -238,10 +229,10 @@ /datum/disease/virus/transformation/morph name = "Gluttony's Blessing" - cure_text = "nothing" - cures = list("adminordrazine") agent = "Gluttony's Blessing" desc = "A 'gift' from somewhere terrible." + cure_text = "Nothing" + cures = list("adminordrazine") stage_prob = 20 severity = BIOHAZARD visibility_flags = VISIBLE diff --git a/code/datums/diseases/viruses/tuberculosis.dm b/code/datums/diseases/viruses/tuberculosis.dm index 8be7da0ef19..f60ce60dc7a 100644 --- a/code/datums/diseases/viruses/tuberculosis.dm +++ b/code/datums/diseases/viruses/tuberculosis.dm @@ -1,19 +1,16 @@ /datum/disease/virus/tuberculosis form = "Disease" name = "Fungal tuberculosis" - max_stages = 5 - spread_flags = AIRBORNE - spread_text = "Airborne" - cure_text = "Spaceacillin & salbutamol" - cures = list("spaceacillin", "salbutamol") agent = "Fungal Tubercle bacillus Cosmosis" - cure_prob = 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." + spread_flags = AIRBORNE + cures = list("spaceacillin", "salbutamol") + cure_prob = 5 required_organs = list(/obj/item/organ/internal/lungs) severity = DANGEROUS - ignore_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs + ignore_immunity = TRUE -/datum/disease/virus/tuberculosis/stage_act() //it begins +/datum/disease/virus/tuberculosis/stage_act() ..() var/mob/living/carbon/human/H = affected_mob if(!istype(H)) diff --git a/code/datums/diseases/viruses/wizarditis.dm b/code/datums/diseases/viruses/wizarditis.dm index 94142e55f07..f4964b98a34 100644 --- a/code/datums/diseases/viruses/wizarditis.dm +++ b/code/datums/diseases/viruses/wizarditis.dm @@ -1,14 +1,12 @@ /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_flags = AIRBORNE - spread_text = "Airborne" - cure_text = "The Manly Dorf" cures = list("manlydorf") cure_prob = 100 - agent = "Rincewindus Vulgaris" 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) diff --git a/code/game/gamemodes/spaceninja/ninja/suit/ninja_equipment_actions/ninja_status_read.dm b/code/game/gamemodes/spaceninja/ninja/suit/ninja_equipment_actions/ninja_status_read.dm index d463694100a..d59d4978470 100644 --- a/code/game/gamemodes/spaceninja/ninja/suit/ninja_equipment_actions/ninja_status_read.dm +++ b/code/game/gamemodes/spaceninja/ninja/suit/ninja_equipment_actions/ninja_status_read.dm @@ -36,7 +36,7 @@ if(length(ninja.diseases)) info_list += "[span_info("Вирусы:")]\n" for(var/datum/disease/ninja_disease in ninja.diseases) - info_list += ""//"[span_info("* [ninja_disease.name], Тип: [ninja_disease.spread_text], Стадия: [ninja_disease.stage]/[ninja_disease.max_stages], Возможное лекарство: [ninja_disease.cure_text]")]\n" + 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/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index b24ef484fe2..25f073ec8a2 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -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/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 97cb0602be6..978e19b6799 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -482,7 +482,7 @@ REAGENT SCANNER 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()) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 66311f79fae..5d1f8fdd629 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -878,8 +878,9 @@ 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 + 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.ForceContract(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/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index e7a09e22966..8529e762260 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -29,8 +29,6 @@ else D = new virus_type() - D.carrier = TRUE - /datum/event/disease_outbreak/announce() GLOB.event_announcement.Announce("Вспышка вирусной угрозы 7-го уровня зафиксирована на борту станции [station_name()]. Всему персоналу надлежит сдержать ее распространение.", "ВНИМАНИЕ: БИОЛОГИЧЕСКАЯ УГРОЗА.", new_sound = 'sound/AI/outbreak7.ogg') for(var/p in GLOB.dead_mob_list) @@ -49,7 +47,7 @@ if(!is_station_level(T.z)) continue - if(!D.ForceContract(H)) + if(!D.ForceContract(H, is_carrier = TRUE)) continue patient_zero = H break diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index eb4299be98d..832c5f2c25a 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -163,7 +163,7 @@ /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?" diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 533aed4b76e..3fc5d2daf2e 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -206,7 +206,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]" @@ -274,7 +274,7 @@ dat += "Болезнетворный агент: [D?"[D.agent] — Создать бутылёк с вирусной культурой":"нет"]
" dat += "Общепринятое название: [(D.name||"нет")]
" dat += "Описание: [(D.desc||"нет")]
" - //dat += "Путь передачи: [(D.spread_text||"нет")]
" + dat += "Путь передачи: [(D.additional_info||"нет")]
" dat += "Возможное лекарство: [(D.cure_text||"нет")]

" if(istype(D, /datum/disease/virus/advance)) diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm index 01f795de175..94c4fbd650d 100644 --- a/code/modules/reagents/chemistry/reagents/disease.dm +++ b/code/modules/reagents/chemistry/reagents/disease.dm @@ -97,7 +97,7 @@ /datum/reagent/gibbis/on_mob_life(mob/living/carbon/M) if(volume > 2.5) - var/datum/disease/virus/gbs/curable/D = new + var/datum/disease/virus/gbs/non_con/D = new D.ForceContract(M) return ..() diff --git a/paradise.dme b/paradise.dme index 95360db570f..c959d856ef7 100644 --- a/paradise.dme +++ b/paradise.dme @@ -404,7 +404,6 @@ #include "code\datums\diseases\viruses\cold.dm" #include "code\datums\diseases\viruses\cold9.dm" #include "code\datums\diseases\critical.dm" -#include "code\datums\diseases\viruses\fake_gbs.dm" #include "code\datums\diseases\viruses\flu.dm" #include "code\datums\diseases\viruses\fluspanish.dm" #include "code\datums\diseases\food_poisoning.dm" From 0a417cadf92261d20db8d3336fb9db6cc9fe47cd Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Thu, 12 Oct 2023 01:54:44 +0300 Subject: [PATCH 07/17] disease outbreak --- code/datums/diseases/_disease.dm | 12 ++++--- code/datums/diseases/viruses/_virus.dm | 11 ++---- .../diseases/viruses/advance/advance.dm | 35 +++++++++++++------ .../diseases/viruses/loyalty_syndrome.dm | 8 ++++- .../datums/diseases/viruses/transformation.dm | 1 + .../gamemodes/miniantags/abduction/gland.dm | 11 +++--- code/modules/events/disease_outbreak.dm | 23 ++++++------ 7 files changed, 57 insertions(+), 44 deletions(-) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 3f23afc2d61..599aa81a4ad 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -53,10 +53,11 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) //Other var/mob/living/affected_mob //Mob that is suffering from this disease - var/can_progress_in_dead = FALSE //can progresses in a dead affected_mob var/list/viable_mobtypes = list(/mob/living/carbon/human) //Types of infectable mobs var/list/required_organs = list() - var/can_contract_dead = FALSE //if TRUE, disease can contract dead mobs + var/can_progress_in_dead = FALSE //if TRUE, disease can progress in dead mobs + var/can_contract_dead = FALSE //if TRUE, disease can contract dead mobs + var/carrier = FALSE //if TRUE, host not affected by virus, but can spread it (mostly for viruses) /datum/disease/New() @@ -179,10 +180,10 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /** * Attempt to infect a mob without a check of its protection * Returns: - * * TRUE - mob successfully infected + * * /datum/disease/D - a new instance of the virus that contract the mob * * FALSE - otherwise */ -/datum/disease/proc/ForceContract(mob/M) +/datum/disease/proc/ForceContract(mob/M, is_carrier = FALSE) if(!CanContract(M)) return FALSE @@ -190,8 +191,9 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) M.diseases += D D.affected_mob = M GLOB.active_diseases += D + D.carrier = is_carrier D.affected_mob.med_hud_set_status() - return TRUE + return D /datum/disease/proc/IsSame(datum/disease/D) diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm index 36ab36ce1a4..ea465728183 100644 --- a/code/datums/diseases/viruses/_virus.dm +++ b/code/datums/diseases/viruses/_virus.dm @@ -13,7 +13,6 @@ //Infectivity var/infectivity = 65 //affects how often the virus will try to spread var/permeability_mod = 1 // - var/carrier = FALSE //if TRUE, host not affected by virus, but can spread it /datum/disease/virus/New() ..() @@ -88,7 +87,7 @@ spread += "Контактный" if(spread_flags & AIRBORNE) spread += "Воздушно-капельный" - return english_list(spread, "Неизвестен", "и") + return english_list(spread, "Неизвестен", " и ") /datum/disease/virus/TryContract(mob/M) if(!..()) @@ -103,8 +102,8 @@ if(M.satiety > 0 && prob(M.satiety/10)) // positive satiety makes it harder to contract the disease. return - if(istype(src, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M switch(pick(40;"head", 40;"body", 10;"hands", 10;"feet")) if("head") @@ -143,7 +142,3 @@ passed = (prob((50*permeability_mod) - 1)) return passed - -/datum/disease/virus/ForceContract(mob/M, is_carrier = FALSE) - . = ..() - carrier = is_carrier diff --git a/code/datums/diseases/viruses/advance/advance.dm b/code/datums/diseases/viruses/advance/advance.dm index 0a7426636c9..e7895e55b21 100644 --- a/code/datums/diseases/viruses/advance/advance.dm +++ b/code/datums/diseases/viruses/advance/advance.dm @@ -86,8 +86,8 @@ GLOBAL_LIST_EMPTY(archive_diseases) /datum/disease/virus/advance/Copy() var/datum/disease/virus/advance/copy = new var/list/required_vars = list( - "name","severity","id","visibility_flags","spread_flags", - "stage_prob","cures","cure_prob","cure_text", "permeability_mod",) + "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] @@ -113,7 +113,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) return FALSE // Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated. -/datum/disease/virus/advance/proc/GenerateSymptoms(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 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. @@ -122,13 +122,12 @@ 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/N = 1 if(count_of_symptoms) N = count_of_symptoms @@ -141,13 +140,13 @@ GLOBAL_LIST_EMPTY(archive_diseases) return generated -/datum/disease/virus/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/virus/advance/A = GLOB.archive_diseases[id] - if(update_mutations) - UpdateMutationsProps(A) + UpdateMutationsProps(A) if(A) name = A.name @@ -159,7 +158,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) /datum/disease/virus/advance/proc/AddToArchive() GLOB.archive_diseases[id] = Copy() -/datum/disease/virus/advance/proc/UpdateMutationsProps(var/datum/disease/virus/advance/A) +/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() @@ -198,13 +197,14 @@ GLOBAL_LIST_EMPTY(archive_diseases) visibility_flags = VISIBLE // transmittable - switch(properties["transmittable"] - symptoms.len) + 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.1, 2) //stage speed @@ -294,6 +294,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) . = ..() if(count_by_type(M.diseases, /datum/disease/virus/advance) > 0) . = FALSE + /* Static Procs @@ -393,6 +394,18 @@ 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/virus/advance/proc/totalStageSpeed() diff --git a/code/datums/diseases/viruses/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm index 5396a35a84b..579caeb7fef 100644 --- a/code/datums/diseases/viruses/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -22,19 +22,25 @@ var/need_master_death_message = FALSE /datum/disease/virus/loyalty/New(var/mob/living/carbon/human/new_master) + ..() if(new_master) master = new_master else is_master = TRUE -/datum/disease/virus/loyalty/Contract(mob/M) +/datum/disease/virus/loyalty/ForceContract(mob/M, is_carrier = FALSE) + if(!CanContract(M)) + return FALSE + var/mob/living/carbon/human/new_master = is_master ? affected_mob : master var/datum/disease/virus/loyalty/copy = new(new_master) 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/virus/loyalty/stage_act() ..() diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm index eb80d4ed0d1..04d04052c05 100644 --- a/code/datums/diseases/viruses/transformation.dm +++ b/code/datums/diseases/viruses/transformation.dm @@ -159,6 +159,7 @@ 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() diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 063f9d2a6c8..8c7002bfd7d 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -219,16 +219,13 @@ /obj/item/organ/internal/heart/gland/viral/activate() to_chat(owner, "You feel sick.") - var/datum/disease/virus/advance/new_virus = new - new_virus.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) - new_virus.symptoms = new_virus.GenerateSymptoms(count_of_symptoms = rand(4, 6)) - new_virus.Refresh() - new_virus.carrier = TRUE - + 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(4,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.ForceContract(owner) + new_virus.ForceContract(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/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 8529e762260..228e31e7a48 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -1,14 +1,14 @@ /datum/event/disease_outbreak - announceWhen = 15 - /// The type of disease that patient zero will be infected with. + 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) + announceWhen = rand(150, 300) var/virus_type = pick( - 5; /datum/disease/virus/advance, \ + 999; /datum/disease/virus/advance, \ 1; /datum/disease/virus/anxiety, \ 1; /datum/disease/virus/beesease, \ 1; /datum/disease/virus/brainrot, \ @@ -20,12 +20,8 @@ 1; /datum/disease/virus/pierrot_throat, \ ) if(virus_type == /datum/disease/virus/advance) - var/datum/disease/virus/advance/A = new - A.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) // random silly name - A.symptoms = A.GenerateSymptoms(count_of_symptoms = 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 = 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(4,9), severity = rand(0,5)) else D = new virus_type() @@ -47,7 +43,10 @@ if(!is_station_level(T.z)) continue - if(!D.ForceContract(H, is_carrier = TRUE)) - continue + var/datum/disease/virus/advance/old_virus = locate() in H.diseases + if(old_virus) + old_virus.cure(need_immunity = FALSE) + if(!D.ForceContract(H, is_carrier = TRUE)) + continue patient_zero = H break From ea2cff20d93fa3590f6fb984af69be91080f6748 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Fri, 13 Oct 2023 07:22:01 +0300 Subject: [PATCH 08/17] comments to variable & bugfixes --- code/datums/diseases/_disease.dm | 50 ++++++++++++++----- code/datums/diseases/viruses/_virus.dm | 7 +-- .../advance/symptoms/damage_converter.dm | 3 +- .../diseases/viruses/loyalty_syndrome.dm | 6 +++ .../gamemodes/miniantags/abduction/gland.dm | 2 +- code/modules/events/disease_outbreak.dm | 33 ++++++------ code/modules/surgery/organs/organ_icon.dm | 1 + 7 files changed, 67 insertions(+), 35 deletions(-) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 599aa81a4ad..537e92be9aa 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -24,12 +24,17 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/additional_info = "Болезнь" //Stages - var/stage = 1 //current stage of disease - var/max_stages = 5 //count of stages of disease - var/stage_prob = 4 //probability of moving to the next stage for a tick + + /// Current stage of disease + var/stage = 1 + /// Count of stages of disease + var/max_stages = 5 + /// Probability of moving to the next stage for a tick + var/stage_prob = 4 //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. @@ -38,26 +43,45 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/discovered = FALSE //Cure & immunity + + /// Сan the disease be cured var/curable = TRUE - var/list/cures = list() //list of cures if the disease has curable = TRUE, these are reagent ids + /// 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/cure_prob = 8 //probability of cure for a tick - var/can_immunity = TRUE //immunity can be developed from the disease - var/ignore_immunity = FALSE //Does it skip VIRUSIMMUNE trait check - var/virus_heal_resistant = FALSE // immunity to Anti-Bodies Metabolism symptom + /// 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 //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 - var/mob/living/affected_mob //Mob that is suffering from this disease - var/list/viable_mobtypes = list(/mob/living/carbon/human) //Types of infectable mobs + + /// Mob that is suffering from this disease + var/mob/living/affected_mob + /// Types of infectable mobs + var/list/viable_mobtypes = list(/mob/living/carbon/human) + /// Required organs var/list/required_organs = list() - var/can_progress_in_dead = FALSE //if TRUE, disease can progress in dead mobs - var/can_contract_dead = FALSE //if TRUE, disease can contract dead mobs - var/carrier = FALSE //if TRUE, host not affected by virus, but can spread it (mostly for viruses) + /// 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 /datum/disease/New() diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm index ea465728183..755b95cb476 100644 --- a/code/datums/diseases/viruses/_virus.dm +++ b/code/datums/diseases/viruses/_virus.dm @@ -10,9 +10,10 @@ var/spread_flags = NON_CONTAGIOUS - //Infectivity - var/infectivity = 65 //affects how often the virus will try to spread - var/permeability_mod = 1 // + ///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() ..() diff --git a/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm index e648bfece2e..cf713948ffe 100644 --- a/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm +++ b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm @@ -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/viruses/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm index 579caeb7fef..f300ee19aae 100644 --- a/code/datums/diseases/viruses/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -3,8 +3,10 @@ /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_flags = CONTACT + permeability_mod = 0.5 can_immunity = FALSE cure_text = "Anti-Psychotics" cures = list("haloperidol") @@ -35,6 +37,10 @@ var/mob/living/carbon/human/new_master = is_master ? affected_mob : master var/datum/disease/virus/loyalty/copy = new(new_master) + //recontract cured master + if(new_master == M) + copy.is_master = TRUE + M.diseases += copy copy.affected_mob = M GLOB.active_diseases += copy diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 8c7002bfd7d..e983b60ba7f 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -221,7 +221,7 @@ to_chat(owner, "You feel sick.") 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(4,9), severity = rand(0,5)) + 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) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 228e31e7a48..8c2af3df9cf 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -8,20 +8,20 @@ /datum/event/disease_outbreak/setup() announceWhen = rand(150, 300) var/virus_type = pick( - 999; /datum/disease/virus/advance, \ - 1; /datum/disease/virus/anxiety, \ - 1; /datum/disease/virus/beesease, \ - 1; /datum/disease/virus/brainrot, \ - 1; /datum/disease/virus/fake_gbs, \ - 1; /datum/disease/virus/fluspanish, \ - 1; /datum/disease/virus/loyalty, \ - 1; /datum/disease/virus/lycan, \ - 1; /datum/disease/virus/magnitis, \ - 1; /datum/disease/virus/pierrot_throat, \ + 5; /datum/disease/virus/advance, + 1; /datum/disease/virus/anxiety, + 1; /datum/disease/virus/beesease, + 1; /datum/disease/virus/brainrot, + 1; /datum/disease/virus/fake_gbs, + 1; /datum/disease/virus/fluspanish, + 1; /datum/disease/virus/loyalty, + 1; /datum/disease/virus/lycan, + 1; /datum/disease/virus/magnitis, + 1; /datum/disease/virus/pierrot_throat, ) if(virus_type == /datum/disease/virus/advance) 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(4,9), severity = rand(0,5)) + stage_rate = rand(-11,5), transmittable = rand(5,9), severity = rand(0,5)) else D = new virus_type() @@ -43,10 +43,11 @@ if(!is_station_level(T.z)) continue - var/datum/disease/virus/advance/old_virus = locate() in H.diseases - if(old_virus) - old_virus.cure(need_immunity = FALSE) - if(!D.ForceContract(H, is_carrier = TRUE)) - continue + 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.ForceContract(H, is_carrier = TRUE)) + continue patient_zero = H break 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 From 0a6d7177d2a6a19f24617f66e6c1e0135a47e9ce Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Sun, 15 Oct 2023 06:18:02 +0300 Subject: [PATCH 09/17] Brainrot, Anxiety, Beesease, Flu & Cold, Spanish, Kingstons & Loyalty --- code/__HELPERS/global_lists.dm | 4 +- code/datums/diseases/_disease.dm | 6 +- code/datums/diseases/appendicitis.dm | 3 +- code/datums/diseases/berserker.dm | 4 +- code/datums/diseases/critical.dm | 3 + code/datums/diseases/food_poisoning.dm | 4 +- code/datums/diseases/kuru.dm | 4 +- code/datums/diseases/vampire.dm | 4 +- .../diseases/viruses/advance/presets.dm | 10 +-- code/datums/diseases/viruses/anxiety.dm | 31 +++---- code/datums/diseases/viruses/beesease.dm | 56 ++++++++----- code/datums/diseases/viruses/brainrot.dm | 49 ++++++----- code/datums/diseases/viruses/cold.dm | 77 +++++++----------- code/datums/diseases/viruses/cold9.dm | 37 --------- code/datums/diseases/viruses/flu.dm | 64 +++++++-------- code/datums/diseases/viruses/fluspanish.dm | 19 ++++- code/datums/diseases/viruses/gbs.dm | 23 +++--- code/datums/diseases/viruses/kingstons.dm | 59 +++++++++----- .../diseases/viruses/loyalty_syndrome.dm | 18 ++-- code/datums/diseases/viruses/lycancoughy.dm | 4 +- code/datums/diseases/viruses/magnitis.dm | 4 +- .../datums/diseases/viruses/pierrot_throat.dm | 8 +- code/datums/diseases/viruses/retrovirus.dm | 4 +- code/datums/diseases/viruses/rhumba_beat.dm | 4 +- .../datums/diseases/viruses/transformation.dm | 4 +- code/datums/diseases/viruses/tuberculosis.dm | 4 +- code/datums/diseases/viruses/wizarditis.dm | 3 +- code/datums/supplypacks.dm | 4 +- code/datums/syndiesupplypacks.dm | 4 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 2 + code/game/machinery/Freezer.dm | 3 + code/game/machinery/Sleeper.dm | 3 + code/game/machinery/adv_med.dm | 3 + code/game/machinery/atmoalter/canister.dm | 3 + code/game/machinery/atmoalter/pump.dm | 3 + code/game/machinery/atmoalter/scrubber.dm | 3 + code/game/machinery/computer/aifixer.dm | 2 + code/game/machinery/computer/atmos_alert.dm | 3 + code/game/machinery/computer/brigcells.dm | 4 + code/game/machinery/computer/cloning.dm | 3 + code/game/machinery/computer/crew.dm | 4 + code/game/machinery/computer/law.dm | 3 + .../computer/pod_tracking_console.dm | 3 + code/game/machinery/computer/power.dm | 4 + code/game/machinery/computer/salvage_ship.dm | 3 + code/game/machinery/computer/sm_monitor.dm | 4 + code/game/machinery/computer/station_alert.dm | 4 + code/game/machinery/computer/store.dm | 3 + code/game/machinery/computer/syndie_cargo.dm | 3 + code/game/machinery/cryo.dm | 3 + code/game/machinery/syndicatebomb.dm | 3 + code/game/machinery/teleporter.dm | 2 + code/game/machinery/turret_control.dm | 2 + code/game/machinery/vending.dm | 3 + code/game/mecha/mecha_control_console.dm | 3 + .../arcade/mob_hunt/battle_computer.dm | 3 + code/modules/economy/Accounts_DB.dm | 3 + .../food_and_drinks/drinks/bottler/bottler.dm | 4 + .../kitchen_machinery/juicer.dm | 3 + .../kitchen_machinery/smartfridge.dm | 8 +- code/modules/hydroponics/seed_extractor.dm | 2 + code/modules/mining/laborcamp/laborstacker.dm | 3 + code/modules/mining/machine_stacking.dm | 3 + .../mob/living/simple_animal/hostile/bees.dm | 2 +- code/modules/paperwork/faxmachine.dm | 3 + code/modules/power/apc.dm | 4 + code/modules/power/singularity/collector.dm | 3 + .../particle_accelerator/particle_control.dm | 3 + code/modules/power/smes.dm | 3 + .../chemistry/machinery/chem_dispenser.dm | 4 + .../chemistry/machinery/chem_heater.dm | 2 + .../reagents/chemistry/machinery/pandemic.dm | 22 +++-- .../chemistry/machinery/reagentgrinder.dm | 8 +- .../reagents/chemistry/reagents/toxins.dm | 14 ++++ .../reagents/reagent_containers/bottle.dm | 28 +++++-- code/modules/research/experimentor.dm | 3 + code/modules/research/message_server.dm | 2 + code/modules/research/rdmachines.dm | 2 + code/modules/research/server.dm | 5 ++ code/modules/shuttle/shuttle_manipulator.dm | 2 + code/modules/shuttle/supply.dm | 3 + code/modules/station_goals/bfl.dm | 4 + code/modules/station_goals/bluespace_tap.dm | 3 + paradise.dme | 1 - sound/creatures/bee2.ogg | Bin 0 -> 7065 bytes sound/creatures/bee3.ogg | Bin 0 -> 22850 bytes sound/creatures/bee4.ogg | Bin 0 -> 70668 bytes 87 files changed, 473 insertions(+), 274 deletions(-) delete mode 100644 code/datums/diseases/viruses/cold9.dm create mode 100644 sound/creatures/bee2.ogg create mode 100644 sound/creatures/bee3.ogg create mode 100644 sound/creatures/bee4.ogg diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 4a68a6c2ffe..410253a2749 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -158,8 +158,8 @@ // Init disease archive GLOB.archive_diseases += list( - "sneeze" = new /datum/disease/virus/advance/preset/cold(), - "cough" = new /datum/disease/virus/advance/preset/flu(), + "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(), diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 537e92be9aa..b3c1552054b 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -58,6 +58,8 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/ignore_immunity = FALSE /// Immunity to Anti-Bodies Metabolism symptom var/virus_heal_resistant = FALSE + /// Message when cured + var/cured_message //Mutations @@ -108,7 +110,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) */ /datum/disease/proc/stage_act() if(affected_mob?.stat == DEAD && !can_progress_in_dead) - return TRUE + return FALSE var/cure = has_cure() stage = min(stage, max_stages) @@ -158,6 +160,8 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) 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) diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 70d9308516d..35646b5391e 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -15,7 +15,8 @@ var/ruptured = FALSE /datum/disease/appendicitis/stage_act() - ..() + if(!..()) + return FALSE var/mob/living/carbon/human/H = affected_mob if(!istype(H)) diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm index e9ca5a134c3..0b2bbdfd4e7 100644 --- a/code/datums/diseases/berserker.dm +++ b/code/datums/diseases/berserker.dm @@ -11,7 +11,9 @@ can_immunity = FALSE /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/critical.dm b/code/datums/diseases/critical.dm index 0dbfee3d8b9..e82c974b3a5 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -2,6 +2,9 @@ visibility_flags = HIDDEN_PANDEMIC /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)) diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index de9806a803f..1013fe22c5c 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -13,7 +13,9 @@ possible_mutations = list(/datum/disease/virus/tuberculosis) /datum/disease/food_poisoning/stage_act() - ..() + if(!..()) + return FALSE + if(affected_mob.IsSleeping() && prob(33)) to_chat(affected_mob, "You feel better.") cure() diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index cd8ae5c6b10..c7dfaa9c605 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -12,7 +12,9 @@ virus_heal_resistant = TRUE /datum/disease/kuru/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(1) if(prob(50)) diff --git a/code/datums/diseases/vampire.dm b/code/datums/diseases/vampire.dm index e9d72476637..df6f1d44e8b 100644 --- a/code/datums/diseases/vampire.dm +++ b/code/datums/diseases/vampire.dm @@ -9,7 +9,9 @@ can_immunity = FALSE /datum/disease/vampire/stage_act() - ..() + if(!..()) + return FALSE + var/toxdamage = stage * 2 var/stuntime = stage * 2 diff --git a/code/datums/diseases/viruses/advance/presets.dm b/code/datums/diseases/viruses/advance/presets.dm index a9bc1cd595b..42b0701f6e4 100644 --- a/code/datums/diseases/viruses/advance/presets.dm +++ b/code/datums/diseases/viruses/advance/presets.dm @@ -1,11 +1,11 @@ // Cold -/datum/disease/virus/advance/preset/cold - name = "Cold" +/datum/disease/virus/advance/preset/sneezing + name = "Sneezing" symptoms = list(new/datum/symptom/sneeze) // Flu -/datum/disease/virus/advance/preset/flu - name = "Flu" +/datum/disease/virus/advance/preset/cough + name = "Cough" symptoms = list(new/datum/symptom/cough) // Voice Changing @@ -17,7 +17,7 @@ /datum/disease/virus/advance/preset/heal name = "Liver Enhancer" symptoms = list(new/datum/symptom/heal) - possible_mutations = list(/datum/disease/virus/advance/preset/advanced_regeneration, /datum/disease/virus/advance/preset/cold/) + possible_mutations = list(/datum/disease/virus/advance/preset/advanced_regeneration, /datum/disease/virus/advance/preset/sneezing) // Hullucigen /datum/disease/virus/advance/preset/hullucigen diff --git a/code/datums/diseases/viruses/anxiety.dm b/code/datums/diseases/viruses/anxiety.dm index b98b25d773e..31e938d01dd 100644 --- a/code/datums/diseases/viruses/anxiety.dm +++ b/code/datums/diseases/viruses/anxiety.dm @@ -1,39 +1,42 @@ /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") - agent = "Excess Lepidopticides" - desc = "If left untreated subject will regurgitate butterflies." severity = MEDIUM possible_mutations = list(/datum/disease/virus/beesease) /datum/disease/virus/anxiety/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) - if(2) //also changes say, see say.dm + if(2) if(prob(5)) - to_chat(affected_mob, "You feel anxious.") + to_chat(affected_mob, span_notice("You feel anxious.")) if(3) if(prob(10)) - to_chat(affected_mob, "Your stomach flutters.") + to_chat(affected_mob, span_notice("Your stomach flutters.")) if(prob(5)) - to_chat(affected_mob, "You feel panicky.") + to_chat(affected_mob, span_notice("You feel panicky.")) if(prob(2)) - to_chat(affected_mob, "You're overtaken with panic!") + to_chat(affected_mob, span_danger("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.") + to_chat(affected_mob, span_danger("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.visible_message(span_danger("[affected_mob] stumbles around in a panic."), \ + span_userdanger("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!") + 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 index 0abdb68d8ad..d1c37d11892 100644 --- a/code/datums/diseases/viruses/beesease.dm +++ b/code/datums/diseases/viruses/beesease.dm @@ -1,38 +1,52 @@ /datum/disease/virus/beesease name = "Beesease" form = "Infection" + agent = "Apidae Infection" + desc = "If left untreated subject will regurgitate bees." max_stages = 4 + stage_prob = 2 spread_flags = CONTACT - cure_text = "Sugar" cures = list("sugar") - agent = "Apidae Infection" - desc = "If left untreated subject will regurgitate bees." severity = DANGEROUS possible_mutations = list(/datum/disease/virus/lycan) /datum/disease/virus/beesease/stage_act() - ..() + if(!..()) + return FALSE + 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(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, "Your stomach rumbles.") - if(prob(2)) - to_chat(affected_mob, "Your stomach stings painfully.") - if(prob(20)) - affected_mob.adjustToxLoss(2) + to_chat(affected_mob, span_danger("Your stomach rumbles.")) + affected_mob.adjustBruteLoss(2) + if(prob(10)) + bee_stinging() if(4) if(prob(10)) - affected_mob.visible_message("[affected_mob] buzzes.", \ - "Your stomach buzzes violently!") + affected_mob.visible_message(span_danger("[affected_mob] buzzes."), \ + span_userdanger("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!") + to_chat(affected_mob, span_danger("You feel something moving in your throat.")) + if(prob(15)) + bee_stinging() + if(prob(2)) + affected_mob.visible_message(span_danger("[affected_mob] coughs up a swarm of bees!"), \ + span_userdanger("You cough up a swarm of bees!")) + affected_mob.adjustBruteLoss(3) new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) - //if(5) - //Plus if you die, you explode into bees - return + new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) + new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) + if(prob(5 * stage)) + playsound(get_turf(affected_mob.loc), pick('sound/creatures/bee3.ogg', 'sound/creatures/bee4.ogg'), (stage*stage)*6.25, 1) + +/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/R = new + R.volume = rand(1,3) + 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 index c7ecc9365ee..efd3f76e1d9 100644 --- a/code/datums/diseases/viruses/brainrot.dm +++ b/code/datums/diseases/viruses/brainrot.dm @@ -12,44 +12,41 @@ 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(2)) + if(prob(3)) affected_mob.emote("blink") - if(prob(2)) + if(prob(4)) affected_mob.emote("yawn") - if(prob(2)) - to_chat(affected_mob, "You don't feel like yourself.") - if(prob(5)) + 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(2)) + if(prob(5)) affected_mob.emote("stare") - if(prob(2)) + if(prob(5)) affected_mob.emote("drool") - if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't brainpain you to death now + 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) - if(prob(2)) - to_chat(affected_mob, "Your try to remember something important...but can't.") + to_chat(affected_mob, span_danger("Your try to remember something important...but can't.")) if(4) - if(prob(2)) + if(prob(7)) affected_mob.emote("stare") - if(prob(2)) + if(prob(7)) 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") + 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(1)) - affected_mob.emote("snore") - if(prob(15)) - affected_mob.AdjustStuttering(6 SECONDS) - - return + 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 index 278155a4bab..df68f53b23a 100644 --- a/code/datums/diseases/viruses/cold.dm +++ b/code/datums/diseases/viruses/cold.dm @@ -1,65 +1,50 @@ /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") - agent = "XY-rhinovirus" + cure_prob = 30 + cured_message = "You feel better" permeability_mod = 0.5 - desc = "If left untreated the subject will contract the flu." severity = MINOR /datum/disease/virus/cold/stage_act() - ..() + if(!..()) + return FALSE + 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)) + if(2, 3) + if(prob(stage)) affected_mob.emote("sneeze") - if(prob(1)) + if(prob(stage)) 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(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(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/virus/flu)) var/datum/disease/virus/flu/Flu = new Flu.ForceContract(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/cold9.dm b/code/datums/diseases/viruses/cold9.dm deleted file mode 100644 index 6d6e586d2d9..00000000000 --- a/code/datums/diseases/viruses/cold9.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/disease/virus/cold9 - name = "The Cold" - agent = "ICE9-rhinovirus" - desc = "If left untreated the subject will slow, as if partly frozen." - max_stages = 3 - spread_flags = CONTACT - //cure_text = "Common Cold Anti-bodies & Spaceacillin" //TODO: cure - cures = list("spaceacillin") - severity = MEDIUM - -/datum/disease/virus/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/viruses/flu.dm b/code/datums/diseases/viruses/flu.dm index 9e2782e06a1..9c3d9150aa9 100644 --- a/code/datums/diseases/viruses/flu.dm +++ b/code/datums/diseases/viruses/flu.dm @@ -4,47 +4,45 @@ 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 = 10 + cure_prob = 30 + cured_message = "You feel better" permeability_mod = 0.75 severity = MEDIUM /datum/disease/virus/flu/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) - if(2) - if(affected_mob.lying && prob(20)) - to_chat(affected_mob, span_notice("You feel better")) - stage-- - return - if(prob(1)) + if(2, 3) + if(prob(stage)) affected_mob.emote("sneeze") - if(prob(1)) + if(prob(stage)) affected_mob.emote("cough") - if(prob(1)) + if(prob(stage)) to_chat(affected_mob, span_danger("Your muscles ache")) - if(prob(20)) - affected_mob.take_organ_damage(1) - if(prob(1)) + affected_mob.take_organ_damage(1) + if(prob(stage)) 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) + 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/viruses/fluspanish.dm b/code/datums/diseases/viruses/fluspanish.dm index 85b0046b5c3..94f8474cd3c 100644 --- a/code/datums/diseases/viruses/fluspanish.dm +++ b/code/datums/diseases/viruses/fluspanish.dm @@ -1,17 +1,19 @@ /datum/disease/virus/fluspanish - name = "Spanish inquisition Flu" + 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_flags = AIRBORNE - //cure_text = "Spaceacillin & Anti-bodies to the common flu" TODO: Cure + cure_text = "Spaceacillin & Anti-bodies to the common flu" cures = list("spaceacillin") cure_prob = 10 permeability_mod = 0.75 severity = DANGEROUS /datum/disease/virus/fluspanish/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(2) affected_mob.bodytemperature += 10 @@ -33,3 +35,14 @@ to_chat(affected_mob, "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 index 26a10c04445..6cd70b97350 100644 --- a/code/datums/diseases/viruses/gbs.dm +++ b/code/datums/diseases/viruses/gbs.dm @@ -7,7 +7,9 @@ severity = BIOHAZARD /datum/disease/virus/gbs/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(2) if(prob(45)) @@ -20,17 +22,15 @@ else if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - to_chat(affected_mob, "You're starting to feel very weak...") + 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, "Your body feels as if it's trying to rip itself open...") + 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() - else - return /datum/disease/virus/gbs/non_con name = "Non-Contagious GBS" @@ -50,7 +50,9 @@ severity = BIOHAZARD /datum/disease/virus/fake_gbs/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(2) if(prob(1)) @@ -61,12 +63,7 @@ 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) + 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 index 0ec63e1705b..68fdaf29257 100644 --- a/code/datums/diseases/viruses/kingstons.dm +++ b/code/datums/diseases/viruses/kingstons.dm @@ -12,41 +12,46 @@ 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, "You feel good.") + to_chat(affected_mob, span_notice("You feel good.")) else - to_chat(affected_mob, "You feel like playing with string.") + 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, "Something in your throat itches.") + to_chat(affected_mob, span_danger("Something in your throat itches.")) else - to_chat(affected_mob, "You NEED to find a mouse.") + 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, "You feel something in your throat!") + to_chat(affected_mob, span_danger("You feel something in your throat!")) affected_mob.emote("cough") else - affected_mob.say(pick(list("Mew", "Meow!", "Nya!~"))) + if(prob(50)) + affected_mob.say(pick(list("Mew", "Meow!", "Nya!~"))) + else + affected_mob.emote("purrs") 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.visible_message(span_danger("[affected_mob] coughs up a hairball!"), \ + span_userdanger("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!") + 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) + catface?.set_species(/datum/species/tajaran, retain_damage = TRUE) -/datum/disease/virus/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. +/datum/disease/virus/kingstons_advanced name = "Advanced Kingstons Syndrome" agent = "AMB45DR Bacteria" desc = "If left untreated the subject will mutate to a different species." @@ -56,41 +61,51 @@ 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) //no karma races sorrys. + 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/twisted = affected_mob switch(stage) if(1) if(prob(10)) - to_chat(twisted, "You feel awkward.") + to_chat(twisted, span_notice("You feel awkward.")) if(2) if(prob(10)) - to_chat(twisted, "You itch.") + to_chat(twisted, span_danger("You itch.")) if(3) if(prob(10)) - to_chat(twisted, "Your skin starts to flake!") + to_chat(twisted, span_danger("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.visible_message(span_danger("[twisted]'s skin splits and form contorts!"), \ + span_userdanger("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.visible_message(span_danger("[twisted] scratches at thier skin!"), \ + span_userdanger("You scratch your skin to try not to itch!")) twisted.adjustBruteLoss(-5) twisted.adjustStaminaLoss(5) diff --git a/code/datums/diseases/viruses/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm index f300ee19aae..78f7b3d1e67 100644 --- a/code/datums/diseases/viruses/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -10,8 +10,8 @@ can_immunity = FALSE cure_text = "Anti-Psychotics" cures = list("haloperidol") - cure_prob = 5 - visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER + cure_prob = 8 + visibility_flags = HIDDEN_HUD severity = DANGEROUS var/is_master = FALSE var/mob/living/carbon/human/master @@ -49,7 +49,8 @@ return copy /datum/disease/virus/loyalty/stage_act() - ..() + if(!..()) + return FALSE if(affected_mob && !is_master && master && stage >= 4) var/message = "" @@ -131,11 +132,12 @@ 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 diff --git a/code/datums/diseases/viruses/lycancoughy.dm b/code/datums/diseases/viruses/lycancoughy.dm index cc3066bf056..392e33239d7 100644 --- a/code/datums/diseases/viruses/lycancoughy.dm +++ b/code/datums/diseases/viruses/lycancoughy.dm @@ -10,7 +10,9 @@ var/barklimit = 0 /datum/disease/virus/lycan/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(2) //also changes say, see say.dm if(prob(5)) diff --git a/code/datums/diseases/viruses/magnitis.dm b/code/datums/diseases/viruses/magnitis.dm index 50fb977ca10..b5bace11771 100644 --- a/code/datums/diseases/viruses/magnitis.dm +++ b/code/datums/diseases/viruses/magnitis.dm @@ -9,7 +9,9 @@ severity = MEDIUM /datum/disease/virus/magnitis/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(2) if(prob(2)) diff --git a/code/datums/diseases/viruses/pierrot_throat.dm b/code/datums/diseases/viruses/pierrot_throat.dm index b8aa117f56d..06a2b088b07 100644 --- a/code/datums/diseases/viruses/pierrot_throat.dm +++ b/code/datums/diseases/viruses/pierrot_throat.dm @@ -11,7 +11,9 @@ 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)) @@ -35,7 +37,9 @@ possible_mutations = null /datum/disease/virus/pierrot_throat/advanced/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(1) if(prob(5)) diff --git a/code/datums/diseases/viruses/retrovirus.dm b/code/datums/diseases/viruses/retrovirus.dm index d7fc60ae89c..7b7adb07b49 100644 --- a/code/datums/diseases/viruses/retrovirus.dm +++ b/code/datums/diseases/viruses/retrovirus.dm @@ -24,7 +24,9 @@ /datum/disease/virus/dna_retrovirus/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(1) if(restcure) diff --git a/code/datums/diseases/viruses/rhumba_beat.dm b/code/datums/diseases/viruses/rhumba_beat.dm index 8ea13d6c918..0b118644225 100644 --- a/code/datums/diseases/viruses/rhumba_beat.dm +++ b/code/datums/diseases/viruses/rhumba_beat.dm @@ -8,7 +8,9 @@ severity = BIOHAZARD /datum/disease/virus/rhumba_beat/stage_act() - ..() + if(!..()) + return FALSE + if(affected_mob.ckey == "rosham") cure() return diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm index 04d04052c05..8063cedf72b 100644 --- a/code/datums/diseases/viruses/transformation.dm +++ b/code/datums/diseases/viruses/transformation.dm @@ -17,7 +17,9 @@ var/is_new_mind = FALSE /datum/disease/virus/transformation/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(1) if(prob(stage_prob) && stage1) diff --git a/code/datums/diseases/viruses/tuberculosis.dm b/code/datums/diseases/viruses/tuberculosis.dm index f60ce60dc7a..dab0fc668c0 100644 --- a/code/datums/diseases/viruses/tuberculosis.dm +++ b/code/datums/diseases/viruses/tuberculosis.dm @@ -11,7 +11,9 @@ ignore_immunity = TRUE /datum/disease/virus/tuberculosis/stage_act() - ..() + if(!..()) + return FALSE + var/mob/living/carbon/human/H = affected_mob if(!istype(H)) return diff --git a/code/datums/diseases/viruses/wizarditis.dm b/code/datums/diseases/viruses/wizarditis.dm index f4964b98a34..c08210fd343 100644 --- a/code/datums/diseases/viruses/wizarditis.dm +++ b/code/datums/diseases/viruses/wizarditis.dm @@ -21,7 +21,8 @@ STI KALY - blind */ /datum/disease/virus/wizarditis/stage_act() - ..() + if(!..()) + return FALSE switch(stage) if(2) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 22731fe66ba..503cdf393fc 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -961,8 +961,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/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index f65fa60a63a..3248d1cfce0 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 6567340de07..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 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/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/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 b60792f2a75..d5961642a4c 100644 --- a/code/game/machinery/computer/syndie_cargo.dm +++ b/code/game/machinery/computer/syndie_cargo.dm @@ -499,6 +499,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/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 512a27f328c..39eae46a18b 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/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/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/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/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/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/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/power/apc.dm b/code/modules/power/apc.dm index f99ba92f8f6..4c8b7f5f3e2 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 ca91b0d3c29..780d3276a9b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -334,6 +334,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 3fc5d2daf2e..219747742f4 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/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 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/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 3079bf62310..73828fcb499 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -25,6 +25,20 @@ 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" + +//TODO: overdose +/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 + /datum/reagent/minttoxin name = "Mint Toxin" id = "minttoxin" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 777135ac5d9..5dc907fbd58 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -281,11 +281,29 @@ 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/virus/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" @@ -311,12 +329,6 @@ icon_state = "round_bottle" spawned_disease = /datum/disease/virus/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/virus/advance/preset/cold - /obj/item/reagent_containers/glass/bottle/mind_restoration name = "Reality Purifier culture bottle" desc = "A small bottle. Contains Reality Purifier culture in synthblood medium." 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 140e4b501f6..c98495f9fa7 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/paradise.dme b/paradise.dme index c959d856ef7..ef321621dbd 100644 --- a/paradise.dme +++ b/paradise.dme @@ -402,7 +402,6 @@ #include "code\datums\diseases\berserker.dm" #include "code\datums\diseases\viruses\brainrot.dm" #include "code\datums\diseases\viruses\cold.dm" -#include "code\datums\diseases\viruses\cold9.dm" #include "code\datums\diseases\critical.dm" #include "code\datums\diseases\viruses\flu.dm" #include "code\datums\diseases\viruses\fluspanish.dm" diff --git a/sound/creatures/bee2.ogg b/sound/creatures/bee2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..52315c2c95a67d2d9e905d0e6e0d9314d1f3f879 GIT binary patch literal 7065 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
  • o(~42_^1j0=}$5ryR2S3?nkY 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 literal 0 HcmV?d00001 From b46111bf517689eb7314fd65cf7410253d3ce441 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Tue, 17 Oct 2023 08:58:18 +0300 Subject: [PATCH 10/17] diseases rework --- code/datums/diseases/_MobProcs.dm | 4 + code/datums/diseases/_disease.dm | 4 +- code/datums/diseases/appendicitis.dm | 15 +--- code/datums/diseases/berserker.dm | 1 + code/datums/diseases/critical.dm | 68 +++++++------- code/datums/diseases/food_poisoning.dm | 58 ++++++------ code/datums/diseases/kuru.dm | 17 ++-- code/datums/diseases/vampire.dm | 13 +-- code/datums/diseases/viruses/_virus.dm | 6 +- .../diseases/viruses/advance/symptoms/moan.dm | 7 +- code/datums/diseases/viruses/anxiety.dm | 13 +-- code/datums/diseases/viruses/beesease.dm | 67 +++++++------- code/datums/diseases/viruses/cold.dm | 1 - code/datums/diseases/viruses/flu.dm | 3 +- code/datums/diseases/viruses/fluspanish.dm | 4 +- .../diseases/viruses/loyalty_syndrome.dm | 19 ++-- code/datums/diseases/viruses/lycancoughy.dm | 36 ++++---- code/datums/diseases/viruses/magnitis.dm | 85 +++++++++--------- .../datums/diseases/viruses/pierrot_throat.dm | 16 ++-- code/datums/diseases/viruses/retrovirus.dm | 67 ++++++-------- code/datums/diseases/viruses/rhumba_beat.dm | 12 +-- code/datums/diseases/viruses/tuberculosis.dm | 28 +++--- code/datums/diseases/viruses/wizarditis.dm | 59 ++++++------ code/game/data_huds.dm | 4 +- code/game/gamemodes/clockwork/cogscarab.dm | 2 +- code/game/objects/items/stacks/nanopaste.dm | 8 +- code/modules/events/disease_outbreak.dm | 10 ++- code/modules/mob/living/living.dm | 1 + .../mob/living/simple_animal/friendly/dog.dm | 10 +++ .../reagents/chemistry/reagents/toxins.dm | 43 ++++++++- sound/effects/magnitis.ogg | Bin 0 -> 33748 bytes 31 files changed, 367 insertions(+), 314 deletions(-) create mode 100644 sound/effects/magnitis.ogg diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 9bdb64d87f7..d88fff6c824 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -12,6 +12,10 @@ return TRUE return FALSE +/mob/proc/CureAllDiseases(need_immunity = TRUE) + for(var/datum/disease/D in diseases) + D.cure(need_immunity) + /** * A special checks for this type of mob * diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index b3c1552054b..e9c963f8502 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /// Immunity to Anti-Bodies Metabolism symptom var/virus_heal_resistant = FALSE /// Message when cured - var/cured_message + var/cured_message = "You feel better." //Mutations @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /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(. <= 0 || (needs_all_cures && . < cures.len)) return 0 diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 35646b5391e..842ba088b8c 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -35,11 +35,7 @@ rupture(H, A) switch(stage) - if(1) - if(prob(5)) - H.emote("cough") if(2) - 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 @@ -50,11 +46,7 @@ if(prob(5)) A.receive_damage(1, silent = prob(65)) - if(prob(5)) - H.emote("cough") - if(3) - 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 @@ -66,7 +58,7 @@ H.vomit() if(prob(10)) - H.emote(pick("cough", "moan")) + H.emote("moan") if(prob(5)) to_chat(H, span_warning("You feel a stabbing pain in your abdomen!")) @@ -83,11 +75,8 @@ if(prob(10)) A.receive_damage(2, silent = 0) - if(prob(5)) - H.vomit() - if(prob(15)) - H.emote(pick("cough", "moan", "cry")) + H.emote(pick("moan", "cry")) if(prob(7)) to_chat(H, span_danger("You feel a stabbing pain in your abdomen!")) diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm index 0b2bbdfd4e7..ef2681690b7 100644 --- a/code/datums/diseases/berserker.dm +++ b/code/datums/diseases/berserker.dm @@ -9,6 +9,7 @@ cure_prob = 10 severity = DANGEROUS can_immunity = FALSE + visibility_flags = HIDDEN_PANDEMIC /datum/disease/berserker/stage_act() if(!..()) diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm index e82c974b3a5..2e05e9b6fd5 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -1,5 +1,9 @@ /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) @@ -27,54 +31,50 @@ form = "Medical Emergency" additional_info = "The patient is in shock" max_stages = 3 + stage_prob = 6 cures = list("salglu_solution") cure_prob = 10 - stage_prob = 6 - severity = DANGEROUS - can_immunity = FALSE - ignore_immunity = TRUE - virus_heal_resistant = TRUE /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 @@ -85,15 +85,11 @@ form = "Medical Emergency" additional_info = "The patient is having a cardiac emergency" max_stages = 3 + stage_prob = 5 cures = list("atropine", "epinephrine", "heparin") cure_prob = 10 needs_all_cures = FALSE - stage_prob = 5 - severity = DANGEROUS - can_immunity = FALSE required_organs = list(/obj/item/organ/internal/heart) - ignore_immunity = TRUE - virus_heal_resistant = TRUE /datum/disease/critical/heart_failure/has_cure() if(affected_mob.has_status_effect(STATUS_EFFECT_EXERCISED)) @@ -106,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,12 +139,8 @@ form = "Medical Emergency" additional_info = "The patient has low blood sugar." max_stages = 3 - cure_text = "Eating or administration of vitamins or nutrients" stage_prob = 1 - severity = DANGEROUS - can_immunity = FALSE - ignore_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)) @@ -164,27 +156,27 @@ 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)) @@ -193,8 +185,8 @@ 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/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index 1013fe22c5c..0cd0adc1b3d 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -1,70 +1,62 @@ /datum/disease/food_poisoning name = "Food Poisoning" + agent = "Salmonella" + desc = "Nausea, sickness, and vomitting." max_stages = 3 stage_prob = 5 - cure_text = "Sleep" - agent = "Salmonella" + cure_text = "Proper diet & sleep" cures = list("chicken_soup") - cure_prob = 10 - desc = "Nausea, sickness, and vomitting." + cure_prob = 100 //override in has_cure() severity = MINOR can_immunity = FALSE + ignore_immunity = TRUE virus_heal_resistant = TRUE + visibility_flags = HIDDEN_PANDEMIC possible_mutations = list(/datum/disease/virus/tuberculosis) /datum/disease/food_poisoning/stage_act() if(!..()) return FALSE - if(affected_mob.IsSleeping() && prob(33)) - to_chat(affected_mob, "You feel better.") - cure() - return 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(20) + else + if(affected_mob.IsSleeping()) + return prob(30 - 7.5 * stage) + return prob(1) && prob(10) diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index c7dfaa9c605..43d2c50ee0d 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -1,10 +1,9 @@ /datum/disease/kuru name = "Space Kuru" - max_stages = 4 - stage_prob = 5 - cure_text = "Incurable" agent = "Prions" desc = "Uncontrollable laughing." + max_stages = 4 + stage_prob = 5 severity = BIOHAZARD curable = FALSE can_immunity = FALSE @@ -23,22 +22,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/vampire.dm b/code/datums/diseases/vampire.dm index df6f1d44e8b..29b90816d3d 100644 --- a/code/datums/diseases/vampire.dm +++ b/code/datums/diseases/vampire.dm @@ -1,10 +1,11 @@ /datum/disease/vampire name = "Grave Fever" - max_stages = 3 - stage_prob = 5 - cures = list("spaceacillin") agent = "Grave Dust" - cure_prob = 20 + max_stages = 4 + stage_prob = 5 + //TODO: Something with chaplain & cure + cures = list("garlic") + cure_prob = 8 severity = DANGEROUS can_immunity = FALSE @@ -21,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 index 755b95cb476..bad459c26e9 100644 --- a/code/datums/diseases/viruses/_virus.dm +++ b/code/datums/diseases/viruses/_virus.dm @@ -38,7 +38,7 @@ return TRUE /datum/disease/virus/try_increase_stage() - if(prob(affected_mob.reagents.has_reagent("spaceacillin") ? stage_prob/2 : stage_prob)) + 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 @@ -51,7 +51,7 @@ if((spread_flags <= BLOOD) && !force_spread) return - if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) + if(affected_mob.reagents?.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) return var/spread_range = 1 @@ -64,7 +64,7 @@ var/turf/T = affected_mob.loc if(istype(T)) - for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) + for(var/mob/living/C in oview(spread_range, affected_mob)) var/turf/V = get_turf(C) if(V) while(TRUE) diff --git a/code/datums/diseases/viruses/advance/symptoms/moan.dm b/code/datums/diseases/viruses/advance/symptoms/moan.dm index f0e30529345..f4439b4826b 100644 --- a/code/datums/diseases/viruses/advance/symptoms/moan.dm +++ b/code/datums/diseases/viruses/advance/symptoms/moan.dm @@ -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/viruses/anxiety.dm b/code/datums/diseases/viruses/anxiety.dm index 31e938d01dd..a910f0cfc60 100644 --- a/code/datums/diseases/viruses/anxiety.dm +++ b/code/datums/diseases/viruses/anxiety.dm @@ -12,27 +12,30 @@ /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(2)) + if(prob(5)) to_chat(affected_mob, span_danger("You're overtaken with panic!")) - affected_mob.AdjustConfused(rand(4 SECONDS, 6 SECONDS)) + 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(12 SECONDS, 16 SECONDS)) - affected_mob.AdjustJitter(rand(12 SECONDS, 16 SECONDS)) + 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!")) diff --git a/code/datums/diseases/viruses/beesease.dm b/code/datums/diseases/viruses/beesease.dm index d1c37d11892..a71351ea199 100644 --- a/code/datums/diseases/viruses/beesease.dm +++ b/code/datums/diseases/viruses/beesease.dm @@ -2,51 +2,58 @@ name = "Beesease" form = "Infection" agent = "Apidae Infection" - desc = "If left untreated subject will regurgitate bees." + 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() - 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(10)) - 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(15)) - bee_stinging() - if(prob(2)) - affected_mob.visible_message(span_danger("[affected_mob] coughs up a swarm of bees!"), \ - span_userdanger("You cough up a swarm of bees!")) - affected_mob.adjustBruteLoss(3) - new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) - new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) - new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) 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/R = new - R.volume = rand(1,3) + 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/cold.dm b/code/datums/diseases/viruses/cold.dm index df68f53b23a..1d9df11a842 100644 --- a/code/datums/diseases/viruses/cold.dm +++ b/code/datums/diseases/viruses/cold.dm @@ -8,7 +8,6 @@ cure_text = "Rest & Spaceacillin" cures = list("spaceacillin") cure_prob = 30 - cured_message = "You feel better" permeability_mod = 0.5 severity = MINOR diff --git a/code/datums/diseases/viruses/flu.dm b/code/datums/diseases/viruses/flu.dm index 9c3d9150aa9..3f1dc2f86e0 100644 --- a/code/datums/diseases/viruses/flu.dm +++ b/code/datums/diseases/viruses/flu.dm @@ -8,7 +8,6 @@ cure_text = "Rest & Spaceacillin" cures = list("spaceacillin") cure_prob = 30 - cured_message = "You feel better" permeability_mod = 0.75 severity = MEDIUM @@ -26,7 +25,7 @@ to_chat(affected_mob, span_danger("Your muscles ache")) affected_mob.take_organ_damage(1) if(prob(stage)) - to_chat(affected_mob, "Your stomach hurts.") + to_chat(affected_mob, span_danger("Your stomach hurts.")) affected_mob.adjustToxLoss(1) return diff --git a/code/datums/diseases/viruses/fluspanish.dm b/code/datums/diseases/viruses/fluspanish.dm index 94f8474cd3c..a9ece081675 100644 --- a/code/datums/diseases/viruses/fluspanish.dm +++ b/code/datums/diseases/viruses/fluspanish.dm @@ -22,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) @@ -32,7 +32,7 @@ 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 diff --git a/code/datums/diseases/viruses/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm index 78f7b3d1e67..f4f692aae61 100644 --- a/code/datums/diseases/viruses/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -57,14 +57,15 @@ 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 @@ -156,4 +157,10 @@ 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 index 392e33239d7..81b5194ee4b 100644 --- a/code/datums/diseases/viruses/lycancoughy.dm +++ b/code/datums/diseases/viruses/lycancoughy.dm @@ -6,7 +6,7 @@ max_stages = 4 spread_flags = CONTACT cures = list("ethanol") - severity = MEDIUM + severity = DANGEROUS var/barklimit = 0 /datum/disease/virus/lycan/stage_act() @@ -14,30 +14,34 @@ return FALSE switch(stage) - if(2) //also changes say, see say.dm + if(2) if(prob(5)) - to_chat(affected_mob, "You itch.") + to_chat(affected_mob, span_notice("You itch.")) affected_mob.emote("cough") if(3) if(prob(10)) - to_chat(affected_mob, "You hear faint barking.") + to_chat(affected_mob, span_notice("You hear faint barking.")) if(prob(5)) - to_chat(affected_mob, "You crave meat.") + to_chat(affected_mob, span_notice("You crave meat.")) affected_mob.emote("cough") if(prob(2)) - to_chat(affected_mob, "Your stomach growls!") + to_chat(affected_mob, span_danger("Your stomach growls!")) if(4) if(prob(10)) - to_chat(affected_mob, "Your stomach barks?!") + to_chat(affected_mob, span_danger("Your stomach barks?!")) if(prob(5)) - affected_mob.visible_message("[affected_mob] howls!", \ - "You howl!") + 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/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)]?!") + 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 ++ @@ -45,9 +49,9 @@ 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.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 index b5bace11771..4a4f619e39b 100644 --- a/code/datums/diseases/viruses/magnitis.dm +++ b/code/datums/diseases/viruses/magnitis.dm @@ -1,10 +1,14 @@ /datum/disease/virus/magnitis name = "Magnitis" - agent = "Fukkos Miracos" + 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") + viable_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 @@ -15,48 +19,47 @@ switch(stage) if(2) if(prob(2)) - to_chat(affected_mob, "You feel a slight shock course through your body.") + to_chat(affected_mob, span_danger("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) + move_obj(2, 1) + move_mobs(2, 1) 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(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)) - 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(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)) - 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.") + to_chat(affected_mob, span_danger("You feel a little silly.")) if(2) if(prob(10)) - to_chat(affected_mob, "You start seeing rainbows.") + to_chat(affected_mob, span_danger("You start seeing rainbows.")) if(3) if(prob(10)) - to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!") + to_chat(affected_mob, span_danger("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..."))) + affected_mob.say(pick(list("ХОНК!", "Хонк!", "Хонк.", "Хонк?", "Хонк!!", "Хонк?!", "Хонк..."))) /datum/disease/virus/pierrot_throat/advanced @@ -43,17 +43,17 @@ switch(stage) if(1) if(prob(5)) - to_chat(affected_mob, "You feel like making a joke.") + to_chat(affected_mob, span_danger("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!") + 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, "Your thoughts are interrupted by a loud HONK!") + 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("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk..."))) + 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) diff --git a/code/datums/diseases/viruses/retrovirus.dm b/code/datums/diseases/viruses/retrovirus.dm index 7b7adb07b49..0a860e80fe9 100644 --- a/code/datums/diseases/viruses/retrovirus.dm +++ b/code/datums/diseases/viruses/retrovirus.dm @@ -1,3 +1,4 @@ +/// Just dont use this virus :) /datum/disease/virus/dna_retrovirus name = "Retrovirus" agent = "" @@ -9,18 +10,14 @@ cure_prob = 6 severity = DANGEROUS permeability_mod = 0.4 - var/SE - var/UI - var/restcure = 0 /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") - else - restcure = 1 /datum/disease/virus/dna_retrovirus/stage_act() @@ -29,55 +26,43 @@ 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.") + to_chat(affected_mob, span_danger("Your head hurts.")) if(prob(9)) - to_chat(affected_mob, "You feel a tingling sensation in your chest.") + to_chat(affected_mob, span_notice("You feel a tingling sensation in your chest.")) if(prob(9)) - to_chat(affected_mob, "You feel angry.") + to_chat(affected_mob, span_danger("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.") + to_chat(affected_mob, span_danger("Your skin feels loose.")) if(prob(10)) - to_chat(affected_mob, "You feel very strange.") + to_chat(affected_mob, span_danger("You feel very strange.")) if(prob(4)) - to_chat(affected_mob, "You feel a stabbing pain in your head!") + 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, "Your stomach churns.") + to_chat(affected_mob, span_danger("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.") + to_chat(affected_mob, span_danger("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)) + scramble(pick(0,1), 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)) + 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 index 0b118644225..26f50431488 100644 --- a/code/datums/diseases/viruses/rhumba_beat.dm +++ b/code/datums/diseases/viruses/rhumba_beat.dm @@ -1,3 +1,4 @@ +//meme copy of GBS /datum/disease/virus/rhumba_beat name = "The Rhumba Beat" agent = "Unknown" @@ -14,26 +15,27 @@ 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...") + to_chat(affected_mob, span_danger("You feel strange...")) if(3) if(prob(5)) - to_chat(affected_mob, "You feel the urge to dance...") + 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, "You feel the need to chick chicky boom...") + 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, "You feel a burning beat inside...") + 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, "Your body is unable to contain the Rhumba Beat...") + 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/tuberculosis.dm b/code/datums/diseases/viruses/tuberculosis.dm index dab0fc668c0..ee8cdaf6581 100644 --- a/code/datums/diseases/viruses/tuberculosis.dm +++ b/code/datums/diseases/viruses/tuberculosis.dm @@ -1,6 +1,6 @@ /datum/disease/virus/tuberculosis form = "Disease" - name = "Fungal tuberculosis" + 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 @@ -15,47 +15,45 @@ return FALSE var/mob/living/carbon/human/H = affected_mob - if(!istype(H)) - return switch(stage) - if(2) + if(2, 3) if(prob(2)) H.emote("cough") - to_chat(H, "Your chest hurts.") + to_chat(H, span_danger("Your chest hurts.")) if(prob(2)) - to_chat(H, "Your stomach violently rumbles!") + to_chat(H, span_danger("Your stomach violently rumbles!")) if(prob(5)) - to_chat(H, "You feel a cold sweat form.") + to_chat(H, span_danger("You feel a cold sweat form.")) if(4) if(prob(2)) - to_chat(H, "You see four of everything") + to_chat(H, span_userdanger("You see four of everything")) H.Dizzy(10 SECONDS) if(prob(2)) - to_chat(H, "You feel a sharp pain from your lower chest!") + 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, "You feel air escape from your lungs painfully.") + 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, "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]") + 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("[H] faints!", "You surrender yourself and feel at peace...") + 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, "You feel your mind relax and your thoughts drift!") + 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, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]") + 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, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") + 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/viruses/wizarditis.dm b/code/datums/diseases/viruses/wizarditis.dm index c08210fd343..2e846ee7b0e 100644 --- a/code/datums/diseases/viruses/wizarditis.dm +++ b/code/datums/diseases/viruses/wizarditis.dm @@ -3,6 +3,7 @@ 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 + visibility_flags = HIDDEN_HUD spread_flags = AIRBORNE cures = list("manlydorf") cure_prob = 100 @@ -26,62 +27,60 @@ STI KALY - blind 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/virus/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/virus/wizarditis/proc/teleport() diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 8f4cf42c020..69e686fd4f1 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -87,7 +87,7 @@ return FALSE /// Whether a virus worthy displaying on the HUD is present. -/mob/living/carbon/proc/has_virus() +/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) @@ -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/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/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 8c2af3df9cf..32401d8ce0f 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -12,14 +12,20 @@ 1; /datum/disease/virus/anxiety, 1; /datum/disease/virus/beesease, 1; /datum/disease/virus/brainrot, - 1; /datum/disease/virus/fake_gbs, + 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 @@ -35,8 +41,6 @@ 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 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 65ad4be5f5e..5a4b0c4a15d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -539,6 +539,7 @@ SetDeaf(0) heal_overall_damage(1000, 1000) ExtinguishMob() + CureAllDiseases(FALSE) fire_stacks = 0 on_fire = 0 suiciding = 0 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/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 73828fcb499..736d1c91b0a 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -33,12 +33,53 @@ color = "#ff932f" taste_description = "pain" -//TODO: overdose /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" diff --git a/sound/effects/magnitis.ogg b/sound/effects/magnitis.ogg new file mode 100644 index 0000000000000000000000000000000000000000..407f986e01cd13dbcc99eec5477430bd8d12655b GIT binary patch literal 33748 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 Date: Thu, 19 Oct 2023 06:52:08 +0300 Subject: [PATCH 11/17] transformation --- code/datums/diseases/appendicitis.dm | 9 +- code/datums/diseases/food_poisoning.dm | 4 +- code/datums/diseases/viruses/_virus.dm | 6 +- code/datums/diseases/viruses/kingstons.dm | 65 ++++-- .../datums/diseases/viruses/transformation.dm | 189 ++++++++++-------- code/game/machinery/machinery.dm | 6 +- .../mob/living/carbon/carbon_defense.dm | 6 +- .../mob/living/carbon/human/human_damage.dm | 10 + code/modules/mob/living/carbon/human/life.dm | 3 + .../living/carbon/human/species/_species.dm | 11 + 10 files changed, 191 insertions(+), 118 deletions(-) diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 842ba088b8c..de6c87528fd 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -93,7 +93,7 @@ A.receive_damage(3, silent = 0) H.adjustToxLoss(0.5) - H.Slowed(20 SECONDS, 5) + H.SetSlowed(20 SECONDS, 5) if(prob(7)) H.vomit() @@ -101,14 +101,15 @@ if(prob(15)) H.emote(pick("moan", "cry")) - if(prob(10)) + if(prob(8)) to_chat(H, span_danger("You feel a stabbing pain in your abdomen!")) - H.Stun(rand(3 SECONDS, 6 SECONDS)) + H.Stun(rand(2 SECONDS, 4 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)) @@ -131,7 +132,7 @@ 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")) + 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/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index 0cd0adc1b3d..334279bb5e7 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -55,8 +55,8 @@ if(..()) if(affected_mob.IsSleeping()) return prob(80 - 15 * stage) - return prob(20) + return prob(8) else if(affected_mob.IsSleeping()) return prob(30 - 7.5 * stage) - return prob(1) && prob(10) + return prob(1) && prob(50) diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm index bad459c26e9..25ebc50bb6b 100644 --- a/code/datums/diseases/viruses/_virus.dm +++ b/code/datums/diseases/viruses/_virus.dm @@ -1,6 +1,6 @@ //Spread Flags #define NON_CONTAGIOUS 0 //virus can't spread -#define SPECIAL 1 //virus can spread in specially created procs +#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 @@ -80,8 +80,8 @@ var/list/spread = list() if(!spread_flags) spread += "Не заразный" - if(spread_flags & SPECIAL) - spread += "Специальный" + if(spread_flags & BITES) + spread += "Распространяемый через укусы" if(spread_flags & BLOOD) spread += "Распространяемый через кровь" if(spread_flags & CONTACT) diff --git a/code/datums/diseases/viruses/kingstons.dm b/code/datums/diseases/viruses/kingstons.dm index 68fdaf29257..c3f1dd722f3 100644 --- a/code/datums/diseases/viruses/kingstons.dm +++ b/code/datums/diseases/viruses/kingstons.dm @@ -22,12 +22,14 @@ 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)) @@ -38,13 +40,17 @@ affected_mob.say(pick(list("Mew", "Meow!", "Nya!~"))) else affected_mob.emote("purrs") + if(4) - if(prob(5)) - if(istajaran(affected_mob)) + 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 + 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 @@ -86,26 +92,53 @@ return FALSE if(ishuman(affected_mob)) - var/mob/living/carbon/human/twisted = affected_mob + var/mob/living/carbon/human/H = affected_mob switch(stage) if(1) if(prob(10)) - to_chat(twisted, span_notice("You feel awkward.")) + 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(twisted, span_danger("You itch.")) + to_chat(H, span_danger("You itch.")) if(3) if(prob(10)) - to_chat(twisted, span_danger("Your skin starts to flake!")) - + to_chat(H, span_danger("Your skin starts to flake!")) if(4) - if(prob(5)) - if(!istype(twisted.dna.species, chosentype)) - twisted.visible_message(span_danger("[twisted]'s skin splits and form contorts!"), \ + 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)]!")) - twisted.set_species(chosentype, retain_damage = TRUE) - else - twisted.visible_message(span_danger("[twisted] scratches at thier skin!"), \ + 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!")) - twisted.adjustBruteLoss(-5) - twisted.adjustStaminaLoss(5) + 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/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm index 8063cedf72b..6d3bf15d1cd 100644 --- a/code/datums/diseases/viruses/transformation.dm +++ b/code/datums/diseases/viruses/transformation.dm @@ -1,23 +1,24 @@ /datum/disease/virus/transformation name = "Transformation" - agent = "Shenanigans" + stage_prob = 10 max_stages = 5 spread_flags = NON_CONTAGIOUS - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien) - severity = HARMFUL - stage_prob = 10 - visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER|HIDDEN_PANDEMIC + severity = DANGEROUS can_immunity = FALSE - 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 + viable_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(!..()) + if(!..() || !affected_mob) return FALSE switch(stage) @@ -34,30 +35,40 @@ if(prob(stage_prob*2) && stage4) to_chat(affected_mob, pick(stage4)) if(5) - do_disease_transformation(affected_mob) + 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(mob/living/affected_mob) - if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) - if(stage5) - to_chat(affected_mob, pick(stage5)) +/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 = 101 + 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" @@ -67,51 +78,61 @@ new_mob.mind.wipe_memory() else new_mob.key = affected_mob.key - qdel(affected_mob) - + 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." - curable = FALSE - cure_prob = 1 + stage_prob = 2 + cure_prob = 5 cures = list("banana") - //spread_text = "Monkey Bites" - spread_flags = SPECIAL //TODO: spread with bites + spread_flags = BITES viable_mobtypes = list(/mob/living/carbon/human) severity = BIOHAZARD - stage_prob = 4 - visibility_flags = VISIBLE - new_form = /mob/living/carbon/human/lesser/monkey - is_new_mind = TRUE - + cure_after_transform = FALSE 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.") + 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(mob/living/carbon/human/affected_mob) - if(!issmall(affected_mob)) - affected_mob.monkeyize() +/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 = ForceContract(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, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") + to_chat(affected_mob, span_notice("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.") + to_chat(affected_mob, span_danger("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.")) - + if(4, 5) + if(prob(4)) + affected_mob.say(pick("Иииик, уку уку!", "Иии-ииик!", "Ииии!", "Ун, ун.")) /datum/disease/virus/transformation/robot name = "Robotic Transformation" @@ -119,25 +140,24 @@ desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." cures = list("copper") cure_prob = 5 - severity = DANGEROUS - visibility_flags = VISIBLE - 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!") - + 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, "You feel a stabbing pain in your head.") + to_chat(affected_mob, span_danger("You feel a stabbing pain in your head.")) affected_mob.Paralyse(4 SECONDS) if(4) if(prob(20)) @@ -150,14 +170,12 @@ desc = "This disease changes the victim into a xenomorph." cures = list("spaceacillin", "glycerol") cure_prob = 5 - severity = BIOHAZARD - visibility_flags = VISIBLE - 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\ - Вы чувствуете боль от превращения! Вы желаете укусить того, кто с вами это сделал, благо, память вас не покинула и вы всё помните.") + 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() @@ -165,11 +183,13 @@ 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, "You feel a stabbing pain in your head.") + to_chat(affected_mob, span_danger("You feel a stabbing pain in your head.")) affected_mob.Paralyse(4 SECONDS) if(4) if(prob(20)) @@ -182,17 +202,17 @@ desc = "This highly concentrated extract converts anything into more of itself." cures = list("frostoil") cure_prob = 80 - severity = BIOHAZARD - visibility_flags = VISIBLE - 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.") + 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)) @@ -211,17 +231,18 @@ desc = "This disease transforms the victim into a corgi." cure_text = "Death" cures = list("adminordrazine") - visibility_flags = VISIBLE - 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!!!") + 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)) @@ -237,13 +258,11 @@ cure_text = "Nothing" cures = list("adminordrazine") stage_prob = 20 - severity = BIOHAZARD - visibility_flags = VISIBLE - 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 \ + 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/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/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 75cac599666..365a6f2995a 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -32,13 +32,11 @@ if(!iscarbon(user)) return - for(var/thing in diseases) - var/datum/disease/virus/V = thing + for(var/datum/disease/virus/V in diseases) if(V.spread_flags & CONTACT) V.Contract(user) - for(var/thing in user.diseases) - var/datum/disease/virus/V = thing + for(var/datum/disease/virus/V in user.diseases) if(V.spread_flags & CONTACT) V.Contract(src) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 7d0ee56265e..976fb45c6cd 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -70,6 +70,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 989b6016180..e772042bbfd 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -379,6 +379,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.ForceContract(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") diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 272ce877de8..5f0ecc1535c 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -534,6 +534,15 @@ playsound(target.loc, attack.miss_sound, 25, 1, -1) target.visible_message("[user.declent_ru(NOMINATIVE)] [attack_species] [target.declent_ru(ACCUSATIVE)], но промахива[pluralize_ru(user.gender,"ется","ются")]!") return FALSE + else + // Contract diseases + for(var/datum/disease/virus/V in user.diseases) + if((V.spread_flags & CONTACT) || attack.is_bite && (V.spread_flags & BITES)) + V.Contract(target) + + for(var/datum/disease/virus/V in target.diseases) + if((V.spread_flags & CONTACT) || attack.is_bite && (V.spread_flags & BITES)) + V.Contract(user) var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_selected)) var/armor_block = target.run_armor_check(affecting, "melee") @@ -682,6 +691,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 +709,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("хлестает", "хлестанул", "искромсал", "разорвал") //армалисами почти никто не пользуется. Зачем вносить пол вырезаной расе которой никогда не будет в игре? From 331819ed835cdc31d870501e0d7f1373ad42e878 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Fri, 20 Oct 2023 06:42:42 +0300 Subject: [PATCH 12/17] virus-carrying mice --- code/datums/diseases/_disease.dm | 6 ++++-- code/datums/diseases/viruses/_virus.dm | 4 ++-- code/datums/diseases/viruses/magnitis.dm | 2 +- code/datums/diseases/viruses/transformation.dm | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index e9c963f8502..7e603c44e50 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /// Mob that is suffering from this disease var/mob/living/affected_mob /// Types of infectable mobs - var/list/viable_mobtypes = list(/mob/living/carbon/human) + var/list/infectable_mobtypes = list(/mob/living/carbon/human) /// Required organs var/list/required_organs = list() /// If TRUE, disease can progress in dead mobs @@ -84,6 +84,8 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) 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() @@ -200,7 +202,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) if(M.HasDisease(src)) return FALSE - for(var/mobtype in viable_mobtypes) + for(var/mobtype in infectable_mobtypes + carrier_mobtypes) if(istype(M, mobtype)) return TRUE return FALSE diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm index 25ebc50bb6b..9e5799c944f 100644 --- a/code/datums/diseases/viruses/_virus.dm +++ b/code/datums/diseases/viruses/_virus.dm @@ -7,7 +7,7 @@ /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] @@ -32,7 +32,7 @@ . = ..() - if(!. || carrier) + if(!. || carrier || (affected_mob.type in carrier_mobtypes)) return FALSE return TRUE diff --git a/code/datums/diseases/viruses/magnitis.dm b/code/datums/diseases/viruses/magnitis.dm index 4a4f619e39b..1dcbaa508f3 100644 --- a/code/datums/diseases/viruses/magnitis.dm +++ b/code/datums/diseases/viruses/magnitis.dm @@ -7,7 +7,7 @@ spread_flags = AIRBORNE cure_text = "Iron for the living, nanopaste for robots" cures = list("iron") - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/silicon/robot, /mob/living/simple_animal/pet/dog/corgi/borgi) + 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 diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm index 6d3bf15d1cd..89db35bde18 100644 --- a/code/datums/diseases/viruses/transformation.dm +++ b/code/datums/diseases/viruses/transformation.dm @@ -5,7 +5,7 @@ spread_flags = NON_CONTAGIOUS severity = DANGEROUS can_immunity = FALSE - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien) + infectable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien) var/list/stage1 var/list/stage2 var/list/stage3 @@ -91,7 +91,7 @@ cure_prob = 5 cures = list("banana") spread_flags = BITES - viable_mobtypes = list(/mob/living/carbon/human) + infectable_mobtypes = list(/mob/living/carbon/human) severity = BIOHAZARD cure_after_transform = FALSE stage1 = null From de33d64c315ff5fb18afa59f5a57538ea40bdff3 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Sat, 21 Oct 2023 08:32:06 +0300 Subject: [PATCH 13/17] Contract system rework --- code/datums/diseases/_MobProcs.dm | 85 ++++++++++++++++++- code/datums/diseases/_disease.dm | 35 +++----- code/datums/diseases/critical.dm | 4 +- code/datums/diseases/viruses/_virus.dm | 62 +------------- .../diseases/viruses/advance/advance.dm | 6 +- code/datums/diseases/viruses/cold.dm | 2 +- .../diseases/viruses/loyalty_syndrome.dm | 4 +- .../datums/diseases/viruses/transformation.dm | 2 +- .../gamemodes/miniantags/abduction/gland.dm | 2 +- .../items/weapons/storage/artistic_toolbox.dm | 2 +- code/modules/admin/admin_verbs.dm | 2 +- .../goon_vampire/goon_vampire_powers.dm | 2 +- .../vampire/vampire_powers/bestia_powers.dm | 2 +- code/modules/awaymissions/corpse.dm | 2 +- .../awaymissions/mission_code/academy.dm | 2 +- code/modules/clothing/suits/labcoat.dm | 1 + code/modules/events/disease_outbreak.dm | 2 +- .../events/spontaneous_appendicitis.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 4 +- code/modules/mob/living/carbon/human/life.dm | 14 +-- .../living/carbon/human/species/_species.dm | 28 ++++-- code/modules/mob/mob_grab.dm | 10 +++ code/modules/paperwork/paper.dm | 7 +- .../reagents/chemistry/reagents/disease.dm | 18 ++-- .../reagents/chemistry/reagents/food.dm | 6 +- .../reagents/chemistry/reagents/toxins.dm | 4 +- .../reagents/chemistry/reagents/water.dm | 12 +-- code/modules/surgery/organs/blood.dm | 2 +- code/modules/surgery/organs/heart.dm | 4 +- paradise.dme | 2 +- 30 files changed, 184 insertions(+), 146 deletions(-) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index d88fff6c824..3b2366bd679 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -14,7 +14,7 @@ /mob/proc/CureAllDiseases(need_immunity = TRUE) for(var/datum/disease/D in diseases) - D.cure(need_immunity) + D.cure(need_immunity = need_immunity) /** * A special checks for this type of mob @@ -33,3 +33,86 @@ if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) return FALSE return ..() + +/** + * 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 + + if((act_type & BITES) && CheckBitesProtection(V, zone)) + return TRUE + + if((act_type & CONTACT) && CheckContactProtection(V, zone)) + return TRUE + + if((act_type & AIRBORNE) && CheckAirborneProtection(V, zone)) + return TRUE + + return FALSE + +//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(slot_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/CheckAirborneProtection(datum/disease/virus/V, zone) + //permeability_mod == 0 => 100% defense; permeability_mod == 2 => 0% defense + if(..() || internal || prob(50 * (2 - V.permeability_mod))) + return TRUE + return FALSE + +/mob/living/carbon/human/proc/ClothingVirusProtection(obj/item/Clothing) + //permeability_coefficient == 0.01 => 100% defense; permeability_coefficient == 1 => 1% defense + if(istype(Clothing) && prob(100 * (1.01 - Clothing.permeability_coefficient))) + return TRUE + return FALSE diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 7e603c44e50..7d9300ef530 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -170,26 +170,11 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /datum/disease/proc/spread() return -/** - * Checking mob's protection against this disease - */ -/datum/disease/proc/TryContract(mob/M) - return TRUE - -/** - * Attempt to infect a mob with a check of its protection - * Returns: - * * TRUE - mob successfully infected - * * FALSE - otherwise - */ -/datum/disease/proc/Contract(mob/M) - if(TryContract(M)) - . = ForceContract(M) - /** * Basic checks of the possibility of infecting a mob */ -/datum/disease/proc/CanContract(mob/M) +/datum/disease/proc/CanContract(mob/living/M, act_type, need_protection_check, zone) + . = FALSE if(!M.CanContractDisease(src)) return FALSE @@ -204,17 +189,21 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) for(var/mobtype in infectable_mobtypes + carrier_mobtypes) if(istype(M, mobtype)) - return TRUE - return FALSE + . = TRUE + + if(. && need_protection_check && M.CheckVirusProtection(src, act_type, zone)) + . = FALSE + + return /** - * Attempt to infect a mob without a check of its protection + * Attempt to infect a mob * Returns: * * /datum/disease/D - a new instance of the virus that contract the mob * * FALSE - otherwise */ -/datum/disease/proc/ForceContract(mob/M, is_carrier = FALSE) - if(!CanContract(M)) +/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() @@ -261,7 +250,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) affected_mob.diseases -= src affected_mob.med_hud_set_status() var/datum/disease/new_disease = new type - new_disease.ForceContract(affected_mob) + new_disease.Contract(affected_mob) qdel(src) return TRUE diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm index 2e05e9b6fd5..74831e95cc8 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -78,7 +78,7 @@ affected_mob.AdjustLoseBreath(2 SECONDS) if(prob(5)) var/datum/disease/D = new /datum/disease/critical/heart_failure - D.ForceContract(affected_mob) + D.Contract(affected_mob) /datum/disease/critical/heart_failure name = "Cardiac Failure" @@ -181,7 +181,7 @@ if(3) if(prob(1)) var/datum/disease/D = new /datum/disease/critical/shock - D.ForceContract(affected_mob) + D.Contract(affected_mob) if(prob(12)) affected_mob.Weaken(12 SECONDS) affected_mob.Stuttering(20 SECONDS) diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm index 9e5799c944f..1057fc7a33b 100644 --- a/code/datums/diseases/viruses/_virus.dm +++ b/code/datums/diseases/viruses/_virus.dm @@ -54,10 +54,7 @@ if(affected_mob.reagents?.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) return - var/spread_range = 1 - - if(force_spread) - spread_range = force_spread + var/spread_range = force_spread ? force_spread : 1 if(spread_flags & AIRBORNE) spread_range++ @@ -69,7 +66,8 @@ if(V) while(TRUE) if(V == T) - Contract(C) + 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)) @@ -89,57 +87,3 @@ if(spread_flags & AIRBORNE) spread += "Воздушно-капельный" return english_list(spread, "Неизвестен", " и ") - -/datum/disease/virus/TryContract(mob/M) - if(!..()) - return FALSE - - var/obj/item/clothing/Cl = null - var/passed = TRUE - - if(prob(15/permeability_mod)) - return - - if(M.satiety > 0 && prob(M.satiety/10)) // positive satiety makes it harder to contract the disease. - return - - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - - switch(pick(40;"head", 40;"body", 10;"hands", 10;"feet")) - if("head") - 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("body") - 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("hands") - 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("feet") - 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 && (spread_flags & AIRBORNE) && !M.internal) - passed = (prob((50*permeability_mod) - 1)) - - return passed diff --git a/code/datums/diseases/viruses/advance/advance.dm b/code/datums/diseases/viruses/advance/advance.dm index e7895e55b21..2e85700833f 100644 --- a/code/datums/diseases/viruses/advance/advance.dm +++ b/code/datums/diseases/viruses/advance/advance.dm @@ -205,7 +205,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) if(4 to INFINITY) spread_flags = AIRBORNE additional_info = spread_text() - permeability_mod = clamp((0.25 * properties["transmittable"]), 0.1, 2) + 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) @@ -290,7 +290,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) symptoms -= S return -/datum/disease/virus/advance/CanContract(mob/M) +/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 @@ -386,7 +386,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) if(H.stat == DEAD || !is_station_level(H.z)) continue if(!H.HasDisease(D)) - D.ForceContract(H) + D.Contract(H) break var/list/name_symptoms = list() diff --git a/code/datums/diseases/viruses/cold.dm b/code/datums/diseases/viruses/cold.dm index 1d9df11a842..4501158108e 100644 --- a/code/datums/diseases/viruses/cold.dm +++ b/code/datums/diseases/viruses/cold.dm @@ -29,7 +29,7 @@ if(prob(1) && prob(50)) if(!affected_mob.resistances.Find(/datum/disease/virus/flu)) var/datum/disease/virus/flu/Flu = new - Flu.ForceContract(affected_mob) + Flu.Contract(affected_mob) cure() /datum/disease/virus/cold/has_cure() diff --git a/code/datums/diseases/viruses/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm index f4f692aae61..b59afeed918 100644 --- a/code/datums/diseases/viruses/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -30,8 +30,8 @@ else is_master = TRUE -/datum/disease/virus/loyalty/ForceContract(mob/M, is_carrier = FALSE) - if(!CanContract(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 diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm index 89db35bde18..4a80ffc4cb6 100644 --- a/code/datums/diseases/viruses/transformation.dm +++ b/code/datums/diseases/viruses/transformation.dm @@ -112,7 +112,7 @@ transformed = TRUE else var/mob/living/new_mob = ..() - var/datum/disease/virus/transformation/jungle_fever/D = ForceContract(new_mob) + var/datum/disease/virus/transformation/jungle_fever/D = Contract(new_mob) D?.stage = 5 D.transformed = TRUE else diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index e983b60ba7f..62b1ba62cb1 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -225,7 +225,7 @@ var/datum/disease/virus/advance/old_virus = locate() in owner.diseases if(old_virus) old_virus.cure(need_immunity = FALSE) - new_virus.ForceContract(owner, is_carrier = TRUE) + 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/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index edaf5e5c1e8..65883392d66 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -44,7 +44,7 @@ if(ishuman(user) && !user.HasDisease(/datum/disease/memetic_madness)) activated = TRUE var/datum/disease/memetic_madness/D = new - D.ForceContract(user) + D.Contract(user) for(var/datum/disease/memetic_madness/DD in user.diseases) DD.progenitor = src servantlinks.Add(DD) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5d1f8fdd629..2a9b76e5ef0 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -881,7 +881,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( 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.ForceContract(T) + 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/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm index 0336ea8c8ec..6a716392112 100644 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm @@ -221,7 +221,7 @@ return var/datum/disease/vampire/virus = new - virus.ForceContract(target) + virus.Contract(target) /obj/effect/proc_holder/spell/goon_vampire/glare diff --git a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm index 3da053a4f9d..5283f92c082 100644 --- a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm @@ -685,7 +685,7 @@ 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)) var/datum/disease/vampire/D = new - D.ForceContract(victim) // grave fever + D.Contract(victim) // grave fever /*======================================================================================================================================*\ diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 569f2c077b0..a53d5a788c7 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -169,7 +169,7 @@ M.faction = list(faction) if(disease) var/datum/disease/D = new disease - D.ForceContract(M) + D.Contract(M) M.adjustOxyLoss(oxy_damage) M.adjustBruteLoss(brute_damage) M.adjustFireLoss(burn_damage) diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm index c27e11aaed0..3d1e2c17e37 100644 --- a/code/modules/awaymissions/mission_code/academy.dm +++ b/code/modules/awaymissions/mission_code/academy.dm @@ -144,7 +144,7 @@ //Cold T.visible_message("[user] looks a little under the weather!") var/datum/disease/virus/cold/D = new - D.ForceContract(user) + 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/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 32401d8ce0f..ddfa7e05d31 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -51,7 +51,7 @@ var/datum/disease/virus/advance/old_virus = locate() in H.diseases if(old_virus) old_virus.cure(need_immunity = FALSE) - if(!D.ForceContract(H, is_carrier = TRUE)) + 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 f36942ced70..e7033c1fa7a 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -14,5 +14,5 @@ continue var/datum/disease/appendicitis/D = new - D.ForceContract(H) + D.Contract(H) break diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 365a6f2995a..a1291226224 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -34,11 +34,11 @@ for(var/datum/disease/virus/V in diseases) if(V.spread_flags & CONTACT) - V.Contract(user) + 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) + 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/life.dm b/code/modules/mob/living/carbon/human/life.dm index e772042bbfd..33f8d29a585 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -381,7 +381,7 @@ if(mult>0) if(bodytemperature < dna.species.cold_level_2 && prob(1)) var/datum/disease/virus/cold/D = new - D.ForceContract(src) + 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") @@ -682,7 +682,7 @@ if(!ismachineperson(src) && !isLivingSSD(src) && nutrition < NUTRITION_LEVEL_HYPOGLYCEMIA) //Gosh damn snowflakey IPCs var/datum/disease/critical/hypoglycemia/D = new - D.ForceContract(src) + D.Contract(src) //metabolism change if(nutrition > NUTRITION_LEVEL_FAT) @@ -751,7 +751,7 @@ H.set_heartattack(TRUE) if(prob(health * -0.2)) var/datum/disease/critical/heart_failure/D = new - D.ForceContract(src) + D.Contract(src) Paralyse(10 SECONDS) if(-99 to -80) adjustOxyLoss(1) @@ -759,15 +759,15 @@ to_chat(src, "Your chest hurts...") Paralyse(4 SECONDS) var/datum/disease/critical/heart_failure/D = new - D.ForceContract(src) + D.Contract(src) if(-79 to -50) adjustOxyLoss(1) if(prob(10)) var/datum/disease/critical/shock/D = new - D.ForceContract(src) + D.Contract(src) if(prob(health * -0.08)) var/datum/disease/critical/heart_failure/D = new - D.ForceContract(src) + 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) @@ -777,7 +777,7 @@ adjustOxyLoss(1) if(prob(3)) var/datum/disease/critical/shock/D = new - D.ForceContract(src) + 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 5e6825deb5b..7c19265fbf9 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -534,19 +534,29 @@ playsound(target.loc, attack.miss_sound, 25, 1, -1) target.visible_message("[user.declent_ru(NOMINATIVE)] [attack_species] [target.declent_ru(ACCUSATIVE)], но промахива[pluralize_ru(user.gender,"ется","ются")]!") return FALSE - else - // Contract diseases - for(var/datum/disease/virus/V in user.diseases) - if((V.spread_flags & CONTACT) || attack.is_bite && (V.spread_flags & BITES)) - V.Contract(target) - - for(var/datum/disease/virus/V in target.diseases) - if((V.spread_flags & CONTACT) || attack.is_bite && (V.spread_flags & BITES)) - V.Contract(user) 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)]!") 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/paper.dm b/code/modules/paperwork/paper.dm index 7acd29008d6..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. @@ -783,7 +784,7 @@ if(mytarget && !used) var/mob/living/carbon/target = mytarget var/datum/disease/virus/transformation/corgi/D = new - D.ForceContract(target) + D.Contract(target) return ..() @@ -808,11 +809,11 @@ if(myeffect == "Borgification") to_chat(target,"You seem to comprehend the AI a little better. Why are your muscles so stiff?") var/datum/disease/virus/transformation/robot/D = new - D.ForceContract(target) + 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!") var/datum/disease/virus/transformation/corgi/D = new - D.ForceContract(target) + 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/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm index 94c4fbd650d..dd14a22b989 100644 --- a/code/modules/reagents/chemistry/reagents/disease.dm +++ b/code/modules/reagents/chemistry/reagents/disease.dm @@ -26,7 +26,7 @@ /datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M) if(volume > 1.5) var/datum/disease/virus/transformation/robot/D = new - D.ForceContract(M) + D.Contract(M) return ..() @@ -41,7 +41,7 @@ /datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M) if(volume > 1.5) var/datum/disease/virus/transformation/xeno/D = new - D.ForceContract(M) + D.Contract(M) return ..() /datum/reagent/fungalspores @@ -55,7 +55,7 @@ /datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M) if(volume > 2.5) var/datum/disease/virus/tuberculosis/D = new - D.ForceContract(M) + D.Contract(M) return ..() /datum/reagent/jagged_crystals @@ -69,7 +69,7 @@ /datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M) var/datum/disease/berserker/D = new - D.ForceContract(M) + D.Contract(M) return ..() /datum/reagent/salmonella @@ -83,7 +83,7 @@ /datum/reagent/salmonella/on_mob_life(mob/living/carbon/M) var/datum/disease/food_poisoning/D = new - D.ForceContract(M) + D.Contract(M) return ..() /datum/reagent/gibbis @@ -98,7 +98,7 @@ /datum/reagent/gibbis/on_mob_life(mob/living/carbon/M) if(volume > 2.5) var/datum/disease/virus/gbs/non_con/D = new - D.ForceContract(M) + D.Contract(M) return ..() /datum/reagent/prions @@ -113,7 +113,7 @@ /datum/reagent/prions/on_mob_life(mob/living/carbon/M) if(volume > 4.5) var/datum/disease/kuru/D = new - D.ForceContract(M) + D.Contract(M) return ..() /datum/reagent/grave_dust @@ -128,7 +128,7 @@ /datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M) if(volume > 4.5) var/datum/disease/vampire/D = new - D.ForceContract(M) + D.Contract(M) return ..() /datum/reagent/bacon_grease @@ -143,7 +143,7 @@ /datum/reagent/bacon_grease/on_mob_life(mob/living/carbon/M) if(volume > 4.5) var/datum/disease/critical/heart_failure/D = new - D.ForceContract(M) + 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 39589fbd1cf..b523dd0faf8 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -886,7 +886,7 @@ if(NO_HUNGER in H.dna.species.species_traits) //If you don't eat, then you can't get food poisoning return var/datum/disease/food_poisoning/D = new - D.ForceContract(H) + D.Contract(H) /datum/reagent/msg name = "Monosodium glutamate" @@ -933,7 +933,7 @@ to_chat(M, "Your chest is burning with pain!") M.Weaken(2 SECONDS) var/datum/disease/critical/heart_failure/D = new - D.ForceContract(M) + D.Contract(M) return ..() | update_flags /datum/reagent/fungus @@ -953,7 +953,7 @@ else if(ranchance <= 5) to_chat(M, "That tasted absolutely FOUL.") var/datum/disease/food_poisoning/D = new - D.ForceContract(M) + D.Contract(M) else to_chat(M, "Yuck!") diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 736d1c91b0a..9e6d9e7855a 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -155,7 +155,7 @@ /datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume) if(method != REAGENT_TOUCH) var/datum/disease/virus/transformation/slime/D = new - D.ForceContract(M) + D.Contract(M) /datum/reagent/mercury @@ -1303,7 +1303,7 @@ /datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=REAGENT_TOUCH, reac_volume) var/datum/disease/virus/transformation/morph/D = new - D.ForceContract(L) + 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 04eaf26507c..84b1bd05779 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -111,9 +111,9 @@ continue if(method == REAGENT_TOUCH) - V.Contract(M) - else //ingest, patch or inject - V.ForceContract(M) + 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 @@ -192,9 +192,9 @@ continue if(method == REAGENT_TOUCH) - V.Contract(M) - else //ingest, patch or inject - V.ForceContract(M) + 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" diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index c16b877a8ec..65b374eabe2 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -174,7 +174,7 @@ var/datum/disease/virus/V = thing if(V.spread_flags < BLOOD) continue - V.ForceContract(C) + 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 diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 84a77073697..2e11d176c1b 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -257,7 +257,7 @@ if(prob(numMid)) to_chat(owner, "Your [name] lurches awkwardly!") var/datum/disease/critical/heart_failure/D = new - D.ForceContract(owner) + D.Contract(owner) if(prob(numMid)) to_chat(owner, "Your [name] stops beating!") Stop() @@ -274,4 +274,4 @@ if(prob(numLow)) to_chat(owner, "Your [name] lurches awkwardly!") var/datum/disease/critical/heart_failure/D = new - D.ForceContract(owner) + D.Contract(owner) diff --git a/paradise.dme b/paradise.dme index 59de87b06e8..0ffd1aa7a9e 100644 --- a/paradise.dme +++ b/paradise.dme @@ -394,8 +394,8 @@ #include "code\datums\components\swarming.dm" #include "code\datums\components\twohanded.dm" #include "code\datums\diseases\_disease.dm" -#include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\viruses\_virus.dm" +#include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\viruses\anxiety.dm" #include "code\datums\diseases\appendicitis.dm" #include "code\datums\diseases\viruses\beesease.dm" From b196414e5d7432eaaab36b623af65f54e9ed9d51 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Mon, 23 Oct 2023 07:41:35 +0300 Subject: [PATCH 14/17] Airborne Protection --- code/datums/diseases/_MobProcs.dm | 38 ++++++++++++++++++++++--------- code/datums/diseases/_disease.dm | 5 ++++ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 3b2366bd679..05a1732f1ab 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -47,16 +47,17 @@ if(satiety > 0 && prob(satiety/10)) return TRUE - if((act_type & BITES) && CheckBitesProtection(V, zone)) - 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 TRUE + if((act_type & CONTACT) && !CheckContactProtection(V, zone)) + return FALSE - if((act_type & AIRBORNE) && CheckAirborneProtection(V, zone)) - return TRUE + if((act_type & AIRBORNE) && !CheckAirborneProtection(V, zone)) + return FALSE - return FALSE + return TRUE //Returns TRUE, if mob protected /mob/proc/CheckBitesProtection(datum/disease/virus/V, zone) @@ -90,7 +91,7 @@ if(ClothingVirusProtection(head) || ClothingVirusProtection(wear_mask)) return TRUE if("chest", "groin", "tail", "wing") - if(ClothingVirusProtection(wear_suit) || ClothingVirusProtection(slot_w_uniform)) + 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)) @@ -105,10 +106,25 @@ return FALSE -/mob/living/CheckAirborneProtection(datum/disease/virus/V, zone) - //permeability_mod == 0 => 100% defense; permeability_mod == 2 => 0% defense - if(..() || internal || prob(50 * (2 - V.permeability_mod))) +/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) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 7d9300ef530..759a8d39374 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -198,6 +198,11 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) /** * 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 From 8e94c95aea6bff9ce1e34246635bc26342a2f6bf Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Wed, 25 Oct 2023 19:50:37 +0300 Subject: [PATCH 15/17] tweaks --- code/datums/diseases/_MobProcs.dm | 4 ++-- code/datums/diseases/_disease.dm | 3 +++ code/datums/diseases/appendicitis.dm | 19 ++++++++++++++----- code/datums/diseases/kuru.dm | 1 + .../diseases/viruses/loyalty_syndrome.dm | 2 +- code/modules/mob/living/status_procs.dm | 4 ++-- .../reagents/chemistry/machinery/pandemic.dm | 1 + 7 files changed, 24 insertions(+), 10 deletions(-) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 05a1732f1ab..0027b4aeb14 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -128,7 +128,7 @@ return FALSE /mob/living/carbon/human/proc/ClothingVirusProtection(obj/item/Clothing) - //permeability_coefficient == 0.01 => 100% defense; permeability_coefficient == 1 => 1% defense - if(istype(Clothing) && prob(100 * (1.01 - Clothing.permeability_coefficient))) + //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 759a8d39374..e5b2811a226 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -111,6 +111,9 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) * * FALSE - if disease was deleted */ /datum/disease/proc/stage_act() + if(!affected_mob) + return FALSE + if(affected_mob?.stat == DEAD && !can_progress_in_dead) return FALSE diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index de6c87528fd..4fa7169b8fd 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -75,6 +75,9 @@ if(prob(10)) A.receive_damage(2, silent = 0) + if(prob(3)) + H.vomit() + if(prob(15)) H.emote(pick("moan", "cry")) @@ -89,21 +92,27 @@ 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) - H.adjustToxLoss(0.5) - H.SetSlowed(20 SECONDS, 5) - - if(prob(7)) + if(prob(5)) H.vomit() - if(prob(15)) + 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) diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index 43d2c50ee0d..ed4c4bce1ab 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -5,6 +5,7 @@ max_stages = 4 stage_prob = 5 severity = BIOHAZARD + visibility_flags = HIDDEN_PANDEMIC curable = FALSE can_immunity = FALSE ignore_immunity = TRUE //Kuru is a prion disorder, not a virus diff --git a/code/datums/diseases/viruses/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm index b59afeed918..d7e0688edf9 100644 --- a/code/datums/diseases/viruses/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -6,7 +6,7 @@ desc = "A disease that causes acute mass insanity for a certain person, as well as various obsessions" max_stages = 5 spread_flags = CONTACT - permeability_mod = 0.5 + permeability_mod = 0.8 can_immunity = FALSE cure_text = "Anti-Psychotics" cures = list("haloperidol") 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/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 219747742f4..799410ad9ec 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -274,6 +274,7 @@ dat += "Описание: [(D.desc||"нет")]
    " dat += "Путь передачи: [(D.additional_info||"нет")]
    " dat += "Возможное лекарство: [(D.cure_text||"нет")]

    " + dat += "Возможность выработки антител: [(D.can_immunity ? "Присутствует" : "Отсутствует")]

    " if(istype(D, /datum/disease/virus/advance)) var/datum/disease/virus/advance/A = D From d006a4491f342f74ef168b287b83695f71a1e933 Mon Sep 17 00:00:00 2001 From: LiquidPotroh Date: Thu, 26 Oct 2023 23:30:51 +0300 Subject: [PATCH 16/17] merge fix --- code/modules/mob/living/simple_animal/bot/medbot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index a24efd41bd3..676fc3368c2 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -400,7 +400,7 @@ return for(var/datum/disease/D as anything in C.diseases) - if(!(D.visibility_flags & HIDDEN_HUD) && D.severity != NONTHREAT) + if(!(D.visibility_flags & HIDDEN_HUD) && D.discovered && D.severity != NONTHREAT) return TRUE //Medbots see viruses if they displayed on HUD, ignoring safe viruses From a220e6ae9bb79e5a7f103f95c2862d1b10617a74 Mon Sep 17 00:00:00 2001 From: Dimach Date: Tue, 7 Nov 2023 17:22:10 +0000 Subject: [PATCH 17/17] Update code/datums/diseases/_MobProcs.dm --- code/datums/diseases/_MobProcs.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 0027b4aeb14..93e16bbccd3 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,14 +1,14 @@ /mob/proc/HasDisease(disease_type_or_instance) - var/datum/disease/D1 if(ispath(disease_type_or_instance)) - D1 = new disease_type_or_instance() - else - D1 = disease_type_or_instance - if(!istype(D1)) - return FALSE + for(var/datum/disease/D2 in diseases) + if(D2.type == disease_type_or_instance) + return TRUE + return FALSE + else if(!istype(disease_type_or_instance, /datum/disease)) + return FALSE for(var/datum/disease/D2 in diseases) - if(D2.IsSame(D1)) + if(D2.IsSame(disease_type_or_instance)) return TRUE return FALSE