From c885ddb9c0127b8360e137d7b2ef0ec3b0ef07c9 Mon Sep 17 00:00:00 2001 From: Guti <32563288+TheCaramelion@users.noreply.github.com> Date: Sat, 17 Jan 2026 18:18:07 +0100 Subject: [PATCH] Virology Update #4 (#19002) * I'm about to viro it * I thought I was done, I was not :( * Wrong proc oops * Small oops * Fix that * Grrr nutrition --- code/__defines/diseases.dm | 2 +- code/_helpers/sorts/comparators.dm | 6 + code/datums/diseases/_MobProcs.dm | 34 +++-- code/datums/diseases/_disease.dm | 27 +++- code/datums/diseases/advance/advance.dm | 92 ++++++++---- .../diseases/advance/symptoms/choking.dm | 2 +- .../diseases/advance/symptoms/confusion.dm | 2 +- .../datums/diseases/advance/symptoms/cough.dm | 2 +- .../advance/symptoms/damage_converter.dm | 60 -------- .../diseases/advance/symptoms/genetics.dm | 134 ------------------ .../diseases/advance/symptoms/hallucigen.dm | 2 +- .../diseases/advance/symptoms/headache.dm | 2 +- code/datums/diseases/advance/symptoms/heal.dm | 4 +- .../diseases/advance/symptoms/narcolepsy.dm | 103 ++++++++++++++ .../diseases/advance/symptoms/sensory.dm | 63 -------- .../diseases/advance/symptoms/shivering.dm | 2 +- code/datums/diseases/advance/symptoms/spin.dm | 9 +- .../diseases/advance/symptoms/stimulant.dm | 2 +- .../datums/diseases/advance/symptoms/vomit.dm | 2 +- .../diseases/advance/symptoms/weakness.dm | 47 ------ .../diseases/advance/symptoms/weight.dm | 4 +- code/game/objects/structures/holosign.dm | 8 +- code/modules/organs/blood.dm | 2 +- code/modules/reagents/reagents/core.dm | 3 +- vorestation.dme | 1 + 25 files changed, 245 insertions(+), 370 deletions(-) delete mode 100644 code/datums/diseases/advance/symptoms/damage_converter.dm delete mode 100644 code/datums/diseases/advance/symptoms/genetics.dm create mode 100644 code/datums/diseases/advance/symptoms/narcolepsy.dm delete mode 100644 code/datums/diseases/advance/symptoms/sensory.dm delete mode 100644 code/datums/diseases/advance/symptoms/weakness.dm diff --git a/code/__defines/diseases.dm b/code/__defines/diseases.dm index b546b3e0dc4..3543cd2e9a9 100644 --- a/code/__defines/diseases.dm +++ b/code/__defines/diseases.dm @@ -1,4 +1,4 @@ -#define DISEASE_LIMIT 1 +#define DISEASE_LIMIT 3 #define VIRUS_SYMPTOM_LIMIT 6 //Visibility Flags diff --git a/code/_helpers/sorts/comparators.dm b/code/_helpers/sorts/comparators.dm index 83583307040..ae3af53f916 100644 --- a/code/_helpers/sorts/comparators.dm +++ b/code/_helpers/sorts/comparators.dm @@ -122,3 +122,9 @@ /proc/cmp_name_dsc(atom/a, atom/b) return sorttext(a.name, b.name) + +/proc/cmp_advdisease_resistance_asc(datum/disease/advance/A, datum/disease/advance/B) + return A.resistance - B.resistance + +/proc/cmp_advdisease_symptomid_asc(datum/symptom/A, datum/symptom/B) + return sorttext(B.id, A.id) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index db387c3d610..8d82327652f 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -38,14 +38,6 @@ if(HasDisease(D)) return FALSE - if(istype(D, /datum/disease/advance)) - var/active_diseases = 0 - for(var/datum/disease/AD in GetViruses()) - if(!(AD.virus_modifiers & DORMANT)) // You can have as many dormant diseases as you want - active_diseases++ - if(active_diseases > 0) // But ONLY one active disease - return FALSE - var/compatible_type = FALSE for(var/type_to_test in D.viable_mobtypes) if(ispath(type, type_to_test)) @@ -63,8 +55,8 @@ /mob/proc/ContractDisease(datum/disease/D, var/target_zone) if(!CanContractDisease(D)) - return 0 - D.infect(src) + return FALSE + D.try_infect(src) return TRUE /mob/living/carbon/human/ContractDisease(datum/disease/D, target_zone) @@ -85,8 +77,10 @@ if(prob(15/D.permeability_mod)) return +/* We have stupid high nutrition values - Something to see about in the future if(nutrition > 300 && prob(nutrition/50)) return +*/ if(!target_zone) target_zone = pick(list( @@ -136,10 +130,10 @@ passed = prob((Cl.permeability_coefficient*100) - 1) if(passed) - D.infect(src) + D.try_infect(src) /mob/living/proc/AirborneContractDisease(datum/disease/D, force_spread) - if(((D.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob(50*D.spreading_modifier) - 1) + if(((D.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob(50*D.permeability_mod) - 1) ForceContractDisease(D) /mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread) @@ -184,6 +178,11 @@ LAZYINITLIST(viruses) return viruses +/mob/proc/GetActiveViruses() + var/list/viruses_to_return = GetViruses() + viruses_to_return.Remove(GetDormantDiseases()) + return viruses_to_return + /mob/proc/GetSpreadableViruses() LAZYINITLIST(viruses) var/list/viruses_to_return = list() @@ -210,6 +209,17 @@ resistances |= resistance return TRUE +/mob/proc/check_virus() + var/threat + var/danger + for(var/thing in viruses) + var/datum/disease/disease = thing + if(!(disease.visibility_flags & HIDDEN_SCANNER)) + if(!threat || get_disease_danger_value(disease.danger) > threat) + threat = get_disease_danger_value(disease.danger) + danger = disease.danger + return danger + /client/proc/ReleaseVirus() set category = "Fun.Event Kit" set name = "Release Virus" diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index f1ad49c7671..5e55da014bb 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -31,7 +31,6 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/list/cures = list() var/infectivity = 10 var/cure_chance = 8 - var/spreading_modifier = 1 var/permeability_mod = 1 var/danger = DISEASE_MINOR var/list/required_organs = list() @@ -44,6 +43,9 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) End() return ..() +/datum/disease/proc/try_infect(var/mob/living/infectee, make_copy = TRUE) + infect(infectee, make_copy) + /datum/disease/proc/infect(var/mob/living/infectee, make_copy = TRUE) var/datum/disease/D = make_copy ? Copy() : src infectee.addDisease(D) @@ -123,7 +125,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) if(affected_mob.stat == DEAD && !global_flag_check(virus_modifiers, SPREAD_DEAD) && !force_spread) return - if(affected_mob.reagents.has_reagent(REAGENT_ID_SPACEACILLIN) || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/50))) + if(affected_mob.reagents.has_reagent(REAGENT_ID_SPACEACILLIN)) return var/spread_range = 2 @@ -247,3 +249,24 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) GLOB.virusDB["[GetDiseaseID()]"] = v return TRUE + +/proc/get_disease_danger_value(danger) + switch(danger) + if(DISEASE_BENEFICIAL) + return 1 + if(DISEASE_POSITIVE) + return 2 + if(DISEASE_NONTHREAT) + return 3 + if(DISEASE_MINOR) + return 4 + if(DISEASE_MEDIUM) + return 5 + if(DISEASE_HARMFUL) + return 6 + if(DISEASE_DANGEROUS) + return 7 + if(DISEASE_BIOHAZARD) + return 8 + if(DISEASE_PANDEMIC) + return 9 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 2a89c0bb8a2..b083b3e5dff 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -1,19 +1,17 @@ GLOBAL_LIST_EMPTY(archive_diseases) GLOBAL_LIST_INIT(advance_cures, list( - REAGENT_ID_SPACEACILLIN, - REAGENT_ID_ORANGEJUICE, - REAGENT_ID_ETHANOL, - REAGENT_ID_GLUCOSE, - REAGENT_ID_COPPER, - REAGENT_ID_LEAD, - REAGENT_ID_LITHIUM, - REAGENT_ID_RADIUM, - REAGENT_ID_MERCURY, - REAGENT_ID_BLISS, - REAGENT_ID_MUTAGEN, - REAGENT_ID_PHORON, - REAGENT_ID_SACID + list(REAGENT_ID_WATER, REAGENT_ID_NUTRIMENT, REAGENT_ID_IRON), + list(REAGENT_ID_ETHANOL, REAGENT_ID_RADIUM, REAGENT_ID_POTASSIUM, REAGENT_ID_LITHIUM), + list(REAGENT_ID_SODIUMCHLORIDE, REAGENT_ID_NICOTINE, REAGENT_ID_BLISS), + list(REAGENT_ID_ANTITOXIN, REAGENT_ID_ETHYLREDOXRAZINE, REAGENT_ID_FUEL, REAGENT_ID_CLEANER), + list(REAGENT_ID_SPACEACILLIN, REAGENT_ID_MINDBREAKER, REAGENT_ID_CRYOXADONE), + list(REAGENT_ID_TRAMADOL, REAGENT_ID_KELOTANE, REAGENT_INAPROVALINE), + list(REAGENT_ID_LEPORAZINE, REAGENT_ID_HOLYWATER, REAGENT_ID_ALKYSINE), + list(REAGENT_ID_PAROXETINE, REAGENT_ID_RADIUM, REAGENT_ID_PHORON), + list(REAGENT_ID_ADRANOL, REAGENT_ID_MUTAGEN, REAGENT_ID_ARITHRAZINE), + list(REAGENT_ID_LIPOZINE, REAGENT_ID_LUBE, REAGENT_ID_SACID), + list(REAGENT_ID_ASUSTENANCE, REAGENT_ID_CORDRADAXON, REAGENT_ID_OXYCODONE), )) /datum/disease/advance @@ -198,6 +196,8 @@ GLOBAL_LIST_INIT(advance_cures, list( transmission += S.transmission for(var/datum/symptom/S as anything in symptoms) S.severityset(src) + if(S.neutered) + continue switch(S.severity) if(-INFINITY to 0) c1sev += S.severity @@ -222,10 +222,11 @@ GLOBAL_LIST_INIT(advance_cures, list( SetSpread() permeability_mod = max(CEILING(0.4 * transmission, 1), 1) - cure_chance = 15 - clamp(resistance, -5, 5) // can be between 10 and 20 + cure_chance = clamp(7.5 - (0.5 * resistance), 5, 10) stage_prob = max(stage_rate, 2) - SetSeverity(severity) + SetDanger(severity) GenerateCure() + symptoms = sortList(symptoms, GLOBAL_PROC_REF(cmp_advdisease_symptomid_asc)) /datum/disease/advance/proc/SetSpread() if(global_flag_check(virus_modifiers, FALTERED)) @@ -246,34 +247,34 @@ GLOBAL_LIST_INIT(advance_cures, list( spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS | DISEASE_SPREAD_CONTACT spread_text = "On Contact" -/datum/disease/advance/proc/SetSeverity(level_sev) +/datum/disease/advance/proc/SetDanger(level_sev) switch(level_sev) if(-INFINITY to -2) - severity = DISEASE_BENEFICIAL + danger = DISEASE_BENEFICIAL if(-1) - severity = DISEASE_POSITIVE + danger = DISEASE_POSITIVE if(0) - severity = DISEASE_NONTHREAT + danger = DISEASE_NONTHREAT if(1) - severity = DISEASE_MINOR + danger = DISEASE_MINOR if(2) - severity = DISEASE_MEDIUM + danger = DISEASE_MEDIUM if(3) - severity = DISEASE_HARMFUL + danger = DISEASE_HARMFUL if(4) - severity = DISEASE_DANGEROUS + danger = DISEASE_DANGEROUS if(5) - severity = DISEASE_BIOHAZARD + danger = DISEASE_BIOHAZARD if(6 to INFINITY) - severity = DISEASE_PANDEMIC + danger = DISEASE_PANDEMIC else - severity = "Unknown" + danger = "Unknown" /datum/disease/advance/proc/GenerateCure() var/res = clamp(resistance - (length(symptoms) / 2), 1, length(GLOB.advance_cures)) - cures = list(GLOB.advance_cures[res]) + cures = list(pick(GLOB.advance_cures[res])) cure_text = cures[1] return @@ -370,6 +371,41 @@ GLOBAL_LIST_INIT(advance_cures, list( S.name += " (neutered)" S.OnRemove(src) +/datum/disease/advance/try_infect(mob/living/infectee, make_copy = TRUE) + var/list/advance_diseases = list() + var/channel = check_channel() + for(var/datum/disease/advance/disease in infectee.GetViruses()) + var/other_channel = disease.check_channel() + if(global_flag_check(disease_flags, DORMANT) || global_flag_check(disease.disease_flags, DORMANT)) + continue + if(IsSame(disease)) + continue + if(channel == other_channel) + advance_diseases += disease + if(advance_diseases.len > 0) + sortList(advance_diseases, GLOBAL_PROC_REF(cmp_advdisease_resistance_asc)) + for(var/i in 1 to advance_diseases.len) + var/datum/disease/advance/competition = advance_diseases[i] + if(transmission > (competition.resistance * 2)) + competition.cure(FALSE) + else + return FALSE + else if(length(infectee.GetActiveViruses()) >= DISEASE_LIMIT) + return FALSE + infect(infectee, make_copy) + return TRUE + +/datum/disease/advance/proc/check_channel() + switch(severity) + if(-INFINITY to 0) + return 1 + if(1 to 4) + return 2 + if(5 to INFINITY) + return 3 + else + return 2 + // Mix a list of advance diseases and return the mixed result. /proc/Advance_Mix(list/D_list) @@ -447,7 +483,7 @@ GLOBAL_LIST_INIT(advance_cures, list( var/new_name = tgui_input_text(src, "Name your new disease.", "New Name") if(!new_name) return FALSE - D.Refresh(new_name) + D.AssignName(new_name) D.Finalize() for(var/datum/disease/advance/AD in GLOB.active_diseases) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 8ee41282966..bc2edf49f8c 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -60,7 +60,7 @@ Bonus switch(A.stage) if(3, 4) - to_chat(M, span_warning(pick("Your windpipe feels thin.", "Your lungs feel small-"))) + to_chat(M, span_warning(pick("Your windpipe feels thin.", "Your lungs feel small."))) Choke_stage_3_4(M, A) M.emote("gasp") if(5) diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index e47a7fbaaaa..c504bf5f965 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -56,7 +56,7 @@ Bonus if(L.stat == DEAD) return switch(A.stage) - if(1, 2, 3, 4) + if(1 to 4) if(prob(base_message_chance) && !supress_warning) to_chat(L, span_warning(pick("Your head hurts", "Your mind blanks for a moment."))) else diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 2625530dab3..27b3e4b61d0 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -68,7 +68,7 @@ BONUS if(M.stat == DEAD) return switch(A.stage) - if(1, 2, 3) + if(1 to 3) if(prob(base_message_chance) && !supress_warning) to_chat(M, span_warning(pick("Your throat itches.", "You lightly cough."))) else diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm deleted file mode 100644 index a57c407b8d7..00000000000 --- a/code/datums/diseases/advance/symptoms/damage_converter.dm +++ /dev/null @@ -1,60 +0,0 @@ -/* -////////////////////////////////////// - -Damage Converter - - Little bit hidden. - Lowers resistance tremendously. - Decreases stage speed tremendously. - Reduced transmittablity - Intense Level. - -Bonus - Slowly converts brute/fire damage to toxin. - -////////////////////////////////////// -*/ - -/datum/symptom/damage_converter - name = "Toxic Compensation" - stealth = 1 - resistance = -4 - stage_speed = -4 - transmission = -2 - level = 4 - severity = 0 - -/datum/symptom/damage_converter/Activate(datum/disease/advance/A) - ..() - if(prob(SYMPTOM_ACTIVATION_PROB * 10)) - var/mob/living/M = A.affected_mob - switch(A.stage) - if(4, 5) - Convert(M) - return - -/datum/symptom/damage_converter/proc/Convert(mob/living/M) - - var/get_damage = rand(1, 2) - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - var/list/parts = H.get_damaged_organs(TRUE, TRUE) - - if(!length(parts)) - return - 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) - M.adjustToxLoss(healed) - - else - if(M.getFireLoss() > 0 || M.getBruteLoss() > 0) - M.adjustFireLoss(-get_damage) - M.adjustBruteLoss(-get_damage) - M.adjustToxLoss(get_damage) - else - return - return TRUE diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm deleted file mode 100644 index 97d9082bc2a..00000000000 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ /dev/null @@ -1,134 +0,0 @@ -/datum/symptom/genetic - name = "Basic Genetic Symptom (does nothing)" - stealth = 0 - resistance = 0 - stage_speed = 0 - transmission = 0 - level = -1 - base_message_chance = 20 - symptom_delay_min = 1 - symptom_delay_max = 1 - var/datum/gene/trait/mutation - var/passive_message - var/preset = FALSE - -/datum/symptom/genetic/Start(datum/disease/advance/A) - if(!..()) - return - var/mob/living/carbon/human/H = A.affected_mob - if(mutation) - preset = H.dna.GetSEState(mutation.block) - -/datum/symptom/genetic/OnAdd(datum/disease/advance/A) - . = ..() - if(mutation && !preset) - var/mob/living/carbon/human/H = A.affected_mob - H.dna.SetSEState(mutation.block, TRUE) - domutcheck(H, null, TRUE) - H.UpdateAppearance() - -/datum/symptom/genetic/OnRemove(datum/disease/advance/A) - . = ..() - if(mutation && !preset) - var/mob/living/carbon/human/H = A.affected_mob - H.dna.SetSEState(mutation.block, FALSE) - domutcheck(H, null, TRUE) - H.UpdateAppearance() - -/datum/symptom/genetic/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/carbon/human/H = A.affected_mob - switch(A.stage) - if(4, 5) - if(passive_message && prob(2)) - to_chat(H, passive_message) - -/* -////////////////////////////////////// - -Telepathy - - Hidden. - Decreases resistance. - Decreases stage speed significantly. - Decreases transmittablity tremendously. - Critical Level. - -Bonus - The user gains telepathy. - -////////////////////////////////////// -*/ - -/datum/symptom/genetic/telepathy - name = "Pineal Gland Decalcification" - stealth = 2 - resistance = -2 - stage_speed = -3 - transmission = -4 - level = 5 - severity = 0 - -/datum/symptom/genetic/telepathy/New() - . = ..() - mutation = get_gene_from_trait(/datum/trait/positive/superpower_remotetalk) - -/* -////////////////////////////////////// - -Hematophagy - - Little bit hidden. - Decreases resistance slightly. - Decreases stage speed tremendously. - Slightly increased transmittablity. - Intense level. - -BONUS - The host must feed on BLOOD - -////////////////////////////////////// -*/ - -/datum/symptom/genetic/hematophagy - name = "Hematophagy" - stealth = 1 - resistance = -1 - resistance = -4 - transmission = 1 - severity = 1 - -/datum/symptom/genetic/hematophagy/New() - . = ..() - mutation = get_gene_from_trait(/datum/trait/positive/superpower_remotetalk) - -/* -////////////////////////////////////// - -Pica - - Not noticable or unnoticable. - Decreases resistance. - Increases stage speed. - Little transmittable. - Low Level. - -BONUS - The host gains hunger for any kind of object. - -////////////////////////////////////// -*/ - -/datum/symptom/genetic/pica - name = "Pica" - stealth = 0 - resistance = -2 - stage_speed = 3 - transmission = 1 - level = 1 - severity = 0 - -/datum/symptom/genetic/pica/New() - . = ..() - mutation = get_gene_from_trait(/datum/trait/neutral/trashcan) diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index be1cb384730..90199cf3f12 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -83,4 +83,4 @@ Bonus else if(prob(base_message_chance)) to_chat(M, span_userdanger(pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something is in the shadows..."))) - M.hallucination += (45 * power) + M.hallucination += (25 * power) diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index 5ed93588f32..ead68a51df5 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -70,4 +70,4 @@ BONUS M.Weaken(10) if(power >= 3 && A.stage >= 5) to_chat(M, span_userdanger(pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your brain!"))) - M.Stun(15) + M.Stun(5) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index b447cdf8de5..ed00ee34314 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -261,10 +261,10 @@ . += power if(H.ingested.has_reagent(REAGENT_ID_HOLYWATER)) H.ingested.remove_reagent(REAGENT_ID_HOLYWATER, 0.5 * absorption_coeff) - . += power * 0.75 + . += power * 1.25 else if(H.ingested.has_reagent(REAGENT_ID_WATER)) H.ingested.remove_reagent(REAGENT_ID_WATER, 0.5 * absorption_coeff) - . += power * 0.5 + . += power * 0.75 /datum/symptom/heal/water/Heal(mob/living/carbon/human/H, datum/disease/advance/A, actual_power) if(!istype(H)) diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm new file mode 100644 index 00000000000..6bb3c458b3d --- /dev/null +++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm @@ -0,0 +1,103 @@ + +/* +////////////////////////////////////// +Narcolepsy + Noticeable. + Lowers resistance + Decreases stage speed tremendously. + Decreases transmittablity tremendously. + +Bonus + Causes weakness and sleep. + +////////////////////////////////////// +*/ + +/datum/symptom/narcolepsy + name = "Narcolepsy" + stealth = 1 + resistance = -1 + stage_speed = -2 + transmission = -2 + symptom_delay_min = 15 SECONDS + symptom_delay_max = 30 SECONDS + level = 3 + severity = 2 + + var/weakens = FALSE + + var/sleep_level = 0 + var/sleepy_ticks = 0 + + prefixes = list("Lazy ", "Yawning ") + bodies = list("Sleep") + + threshold_descs = list( + "Trasmission 7" = "Also relaxes the muscles, weakning and slowing the host.", + "Resistance 10" = "Causes narcolepsy more often, increasing the chance of the host falling asleep." + ) + +/datum/symptom/narcolepsy/severityset(datum/disease/advance/A) + . = ..() + if(A.resistance >= 10) + severity += 1 + +/datum/symptom/narcolepsy/Start(datum/disease/advance/A) + if(!..()) + return + if(A.transmission >= 7) + weakens = TRUE + if(A.resistance >= 10) + symptom_delay_min = 5 SECONDS + symptom_delay_max = 20 SECONDS + +/datum/symptom/narcolepsy/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + if(M.stat == DEAD) + return + + switch(sleep_level) + if(10 to 19) + M.drowsyness += 1 + if(20 to INFINITY) + M.AdjustSleeping(30) + sleep_level = 0 + sleepy_ticks = 0 + + if(sleepy_ticks && A.stage >= 5) + sleep_level++ + sleepy_ticks-- + else + sleep_level = 0 + + switch(A.stage) + if(1) + if(base_message_chance) + to_chat(M, span_warning("You feel tired.")) + if(2) + if(prob(10)) + to_chat(M, span_warning("You feel very tired.")) + sleepy_ticks += rand(10, 14) + if(weakens) + M.AdjustWeakened(10) + if(3) + if(prob(15)) + to_chat(M, "You try to focus on staying awake.") + sleepy_ticks += rand(10, 14) + if(weakens) + M.AdjustWeakened(15) + if(4) + if(prob(20)) + to_chat(M, "You nod off for a moment.") + sleepy_ticks += rand(10, 14) + if(weakens) + M.AdjustWeakened(20) + if(5) + if(prob(25)) + to_chat(M, span_warning("[pick("So tired...","You feel very sleepy.","You have a hard time keeping your eyes open.","You try to stay awake.")]")) + M.drowsyness = max(M.drowsyness, 2) + sleepy_ticks += rand(10, 14) + if(weakens) + M.AdjustWeakened(30) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm deleted file mode 100644 index fcce95fd09b..00000000000 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ /dev/null @@ -1,63 +0,0 @@ -/* -////////////////////////////////////// -Sensory-Restoration - Very very very very noticable. - Lowers resistance tremendously. - Decreases stage speed tremendously. - Decreases transmittablity tremendously. - Fatal. -Bonus - The body generates Sensory restorational chemicals. - imidazoline for eyes - removes alcohol - removes hallucinogens - alkysine to kickstart the mind - -////////////////////////////////////// -*/ -/datum/symptom/mind_restoration - name = "Mind Restoration" - stealth = -3 - resistance = -4 - stage_speed = -4 - transmission = -3 - level = 5 - severity = 0 - -/datum/symptom/mind_restoration/Activate(datum/disease/advance/A) - ..() - if(prob(SYMPTOM_ACTIVATION_PROB * 3)) - var/mob/living/M = A.affected_mob - - if(A.stage >= 3) - M.slurring = max(0, M.slurring-4) - M.druggy = max(0, M.druggy-4) - M.reagents.remove_reagent(REAGENT_ID_ETHANOL, 3) - if(A.stage >= 4) - M.drowsyness = max(0, M.drowsyness-4) - if(M.reagents.has_reagent(REAGENT_ID_BLISS)) - M.reagents.del_reagent(REAGENT_ID_BLISS) - M.hallucination = max(0, M.hallucination-4) - if(A.stage >= 5) - if(M.reagents.get_reagent_amount(REAGENT_ID_ALKYSINE) < 10) - M.reagents.add_reagent(REAGENT_ID_ALKYSINE, 5) - -/datum/symptom/sensory_restoration - name = "Sensory Restoration" - stealth = -1 - resistance = -3 - stage_speed = -2 - transmission = -4 - level = 4 - -/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A) - ..() - if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - var/mob/living/M = A.affected_mob - switch(A.stage) - if(4, 5) - if(M.reagents.get_reagent_amount(REAGENT_ID_IMIDAZOLINE) < 10) - M.reagents.add_reagent(REAGENT_ID_IMIDAZOLINE, 5) - else - if(prob(SYMPTOM_ACTIVATION_PROB)) - 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."))) diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 6500d2e2c26..1953eca57a5 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -67,6 +67,6 @@ Bonus /datum/symptom/shivering/proc/set_body_temp(var/mob/living/carbon/H, datum/disease/advance/A) if(!unsafe) - H.bodytemperature = max(-((3 * power) * A.stage), (BODYTEMP_COLD_DAMAGE_LIMIT +1)) + H.bodytemperature = max(-((3 * power) * A.stage), (BODYTEMP_COLD_DAMAGE_LIMIT + 1)) else H.bodytemperature = max(-((3 * power) * A.stage), (BODYTEMP_COLD_DAMAGE_LIMIT - 20)) diff --git a/code/datums/diseases/advance/symptoms/spin.dm b/code/datums/diseases/advance/symptoms/spin.dm index 319929009bb..41c779641eb 100644 --- a/code/datums/diseases/advance/symptoms/spin.dm +++ b/code/datums/diseases/advance/symptoms/spin.dm @@ -17,8 +17,9 @@ BONUS /datum/symptom/spyndrome name = "Spyndrome" - stealth = 2 - resistance = 0 + desc = "The virus hijacks the host's motor system, making them spin incontrollably." + stealth = -1 + resistance = 3 stage_speed = 3 transmission = 1 level = 1 @@ -26,7 +27,7 @@ BONUS symptom_delay_max = 35 SECONDS severity = 0 threshold_descs = list( - "Resistance 6" = "The target will flip more violently." + "Resistance 6" = "The target will spin more violently." ) var/bigspin = FALSE @@ -45,7 +46,7 @@ BONUS return var/mob/living/M = A.affected_mob switch(A.stage) - if(1, 2, 3) + if(1 to 3) if(prob(base_message_chance)) to_chat(M, span_notice("You can't stand still.")) else diff --git a/code/datums/diseases/advance/symptoms/stimulant.dm b/code/datums/diseases/advance/symptoms/stimulant.dm index 7cbac050b35..9c4733604db 100644 --- a/code/datums/diseases/advance/symptoms/stimulant.dm +++ b/code/datums/diseases/advance/symptoms/stimulant.dm @@ -67,7 +67,7 @@ Bonus if(prob(power) && H.stat) H.make_jittery(2 * power) H.emote("twitch") - to_chat(H, span_notice("[pick("you feel energetic!", "You feel well-rested.", "You feel great!")]")) + to_chat(H, span_notice("[pick("You feel energetic!", "You feel well-rested.", "You feel great!")]")) if(4 to 5) H.drowsyness = max(0, H.drowsyness - 10 * power) H.AdjustSleeping(-10 * power) diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 181d2c0b839..9cc80a8e688 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -58,7 +58,7 @@ Bonus if(M.stat == DEAD) return switch(A.stage) - if(1, 2, 3, 4) + if(1 to 4) if(prob(base_message_chance) && !supress_warning) to_chat(M, span_warning(pick("You feel nauseated.", "You feel like you're going to throw up!"))) else diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/advance/symptoms/weakness.dm deleted file mode 100644 index 3b436c6920d..00000000000 --- a/code/datums/diseases/advance/symptoms/weakness.dm +++ /dev/null @@ -1,47 +0,0 @@ -/* -////////////////////////////////////// - -Weakness - - Slightly noticeable. - Lowers resistance slightly. - Decreases stage speed moderately. - Decreases transmittablity moderately. - Moderate Level. - -Bonus - Weakens the host - -////////////////////////////////////// -*/ - -/datum/symptom/weakness - name = "Weakness" - stealth = -1 - resistance = -1 - stage_speed = -2 - transmission = -2 - symptom_delay_min = 20 SECONDS - symptom_delay_max = 60 SECONDS - level = 3 - severity = 3 - - prefixes = list("Weakening ", "Weak's ") - -/datum/symptom/weakness/Activate(datum/disease/advance/A) - ..() - if(prob(SYMPTOM_ACTIVATION_PROB)) - var/mob/living/M = A.affected_mob - switch(A.stage) - if(1, 2) - to_chat(M, span_warning(pick("You feel weak.", "You feel lazy."))) - if(3, 4) - to_chat(M, span_boldwarning(pick("You feel very frail.", "You think you might faint."))) - M.Weaken(10) - else - to_chat(M, span_userdanger(pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you."))) - M.Weaken(20) - if(M.weakened > 60 && !M.stat) - M.visible_message(span_warning("[M] faints!"), span_userdanger("You swoon and faint...")) - M.AdjustSleeping(10) - return diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 94ee0b6a696..4dfcc6506e6 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -24,7 +24,7 @@ Bonus stage_speed = -2 transmission = -1 level = 3 - severity = 2 + severity = 1 base_message_chance = 100 symptom_delay_min = 15 SECONDS symptom_delay_max = 45 SECONDS @@ -56,7 +56,7 @@ Bonus if(M.stat == DEAD) return switch(A.stage) - if(1, 2, 3, 4) + if(1 to 4) if(prob(base_message_chance)) to_chat(M, span_warning(pick("You feel hungry.", "You crave for food."))) else diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 662f8643003..8bfbf1e6569 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -100,9 +100,7 @@ /obj/structure/holosign/barrier/medical/proc/CheckHuman(mob/living/carbon/human/H) if(H.get_species() == SPECIES_XENOCHIMERA) return FALSE - if(H.GetViruses()) - for(var/datum/disease/D in H.GetSpreadableViruses()) - if(D.danger == DISEASE_POSITIVE || D.danger == DISEASE_BENEFICIAL || D.disease_flags & DORMANT || D.spread_flags & DISEASE_SPREAD_FALTERED) - continue - return FALSE + var/threat = H.check_virus() + if(get_disease_danger_value(threat) > get_disease_danger_value(DISEASE_MINOR)) + return FALSE return TRUE diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 12638d30ee0..dec2252542b 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -360,7 +360,7 @@ BLOOD_VOLUME_SURVIVE = 40 var/datum/disease/D = ID if(D.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) // Special/Non-Contagious stay in the blood, but they won't spread continue - ContractDisease(D) + ForceContractDisease(D) if (injected.data["resistances"] && prob(5)) antibodies |= injected.data["resistances"] if (injected.data[REAGENT_ID_ANTIBODIES] && prob(5)) diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm index 65221386f55..b537fccd933 100644 --- a/code/modules/reagents/reagents/core.dm +++ b/code/modules/reagents/reagents/core.dm @@ -88,7 +88,8 @@ var/datum/disease/D = ID if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue - M.ContractDisease(D) + M.ForceContractDisease(D) + D.try_infect(M) /datum/reagent/blood/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) diff --git a/vorestation.dme b/vorestation.dme index 9f1af3f6762..709f35cc847 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -838,6 +838,7 @@ #include "code\datums\diseases\advance\symptoms\light.dm" #include "code\datums\diseases\advance\symptoms\macrophage.dm" #include "code\datums\diseases\advance\symptoms\mlem.dm" +#include "code\datums\diseases\advance\symptoms\narcolepsy.dm" #include "code\datums\diseases\advance\symptoms\necrotic_agent.dm" #include "code\datums\diseases\advance\symptoms\radiation.dm" #include "code\datums\diseases\advance\symptoms\robot.dm"