Skip to content

Commit

Permalink
Changes Virology Rather Than Killing It (tgstation#79854)
Browse files Browse the repository at this point in the history
## About The Pull Request
God, alright, here we go. See HackMD here:
https://hackmd.io/@Higgin/HJljdBuNp

Alternative proposal to tgstation#79849 addressing the big problems with
virology. ~~If you need a HackMD for it, I'll put one together, but I
made a comment on that PR and can make it pretty simple here.~~ its done

1. Makes viruses eventually self-cure as long as you're alive. If you
can keep somebody from dying, they can develop immunity.
2. Makes it so you can sleep comfortably and be well-fed to slow and
even potentially defeat viruses without a cure.
3. Makes it so more dangerous viruses can start self-curing faster. This
means Space Ebola is going to burn itself out quicker if a person stays
alive from the other effects.
4. Makes spaceacillin helpful in naturally curing viruses, period, but
with declining effectiveness over 100 cycles.
5. Makes it so curing a virus naturally without being well-fed or having
rode it out from the peak may allow you to be reinfected/not have
natural immunity.
6. Makes it so being well-fed is a much stronger protection against
random virus spread.
7. Makes it so bypasses_immunity stuff like fungal TB and heart failure
isn't subject to any of this.
8. Makes it so using ~~antibiotics~~ spaceacillin jesus christ or being
malnourished can make you lose your healing viruses too. Pay attention
to what you put in your body.
9. ** Makes it so blood can ~~transmit resistances again, not just
vaccines. It's been a hot minute, but it used to work like this.~~ blood
now can cure a virus if the donor has a resistance, but it doesn't
confer lasting immunity. You need to overcome the virus yourself, carry
a constant supply of pure blood, or get a vaccine to get a lasting fix.
10. ** makes severity a function of disease stats and all active
symptoms - not just the highest severity of the active symptoms.
11. ** makes it so you can nosell symptoms firing with spaceacillin or
resting down to a minimum chance of cure_chance to avoid symptoms each
cycle, declining over time, over 100 cycles for a given disease.
12. ** makes it so wearing protective equipment prevents you from
spreading respiratory-spread diseases normally - not just on the
cough/sneezing symptoms.
13. ** gives MDs virology access standard, paramedics and coroners
virology access on skeleton crew. virologists also get pharmacy access.
14. ** makes bypasses_immunity advanced diseases always override
non-bypasses_immunity advanced diseases and resist being overridden by
other advanced diseases. Sentient Disease now has bypasses_immunity.
Sentient Disease fans rejoice!
15. ** also gives SD a buffer of extra stealth points so it has a bit
longer to build up instead of almost uniformly getting spotted and dying
early.
16. ** viruses now scale their severity as a function of their max
symptoms. There's a lot more room to get viruses of varying duration and
severity by adding fewer symptoms now - so creating a tradeoff between
stats (and good thresholds) and the duration of your virus.
17. ** a whole bunch of defines to control all of this stuff - most
recently added a multiplier for symptom appearance frequency.

MAJOR UPDATES: REBALANCING TOWARDS 50% LETHALITY

https://docs.google.com/spreadsheets/d/e/2PACX-1vQ8rqMYFsR1mYj_FGzVjTfcnAF7un-VofOByPxcCCQr6lOOF5fhUgZga0oA4Q5-7K4hr7fCV0jFdmd9/pubhtml#
[Viro Rework Rebalance
Tests.pdf](https://github.com/tgstation/tgstation/files/13447208/Viro.Rework.Rebalance.Tests.pdf)

After a shitload of testing, makes some of the most reliable,
transmissible killers into less-reliable threats. See the above graphs
and pictures for demonstrations of exactly how this was tested and done.

## Why It's Good For The Game

It sucks to be hard-stuck to needing chemistry and medical to deal with
viruses that somebody can randomly blast out without a care in the
world, then be left to sit around waiting to die or otherwise be unable
to do anything as the max-level symptoms fire off on repeat.

This should put curing and surviving viruses much more back in the hands
of normal crew without always ending up at the chemistry front window,
although that is still the fastest and most reliable way to get better.

This also nerfs healing viruses a bit, or makes them a bit less
fire-and-forget if you fail to attend to your body. There's more I'd
like to do in the future and potentially some of the other classic
viruses that could use bypasses_immunity added, values tweaked, but for
now - this seems like the best way to preserve virology as a level of
depth and complexity in the game in a way that rewards people doing
intuitive things to counterplay it when used harmfully.

This also puts more of the mid-range bad symptoms into a better place
balance-wise because the worst ones pretty much only fire at max stages.
With the way this works out, you bounce back and forth between the max
stage and lower stages before, over time, trending towards a cure.
Symptoms that provide more significant effects at lower stages now have
a place that isn't totally overshadowed by the killdeath stage 5 ARDS +
junk symptoms virus Dr. Ambatu Popov shat out in five minutes (as long
as you survive the initial run-in with it.)

## Changelog

:cl:
balance: most diseases can now be slowed, mitigated, and eventually
cured through being well-fed, resting, and using spaceacillin. Curing
diseases through this way will give you immunity if you experience them
at their peak/maximum and aren't starving/malnourished when they cure.
balance: disease symptoms can be forestalled for up to 100 cycles with a
declining chance of avoiding them over time using rest or spaceacillin.
balance: This does not apply to things like fungal TB; it does apply to
healing viruses if you don't take care of yourself by staying fed and
avoiding spaceacillin.
balance: disease can be cured through direct injection or ingestion of
cured blood. However, curing disease in this way does not provide
lasting immunity. You need to naturally beat the virus or get a vaccine
for that.
balance: Wearing internals or using protective equipment while infected
can limit the spread of respiratory illnesses from yourself to others.
Contact transmission is still possible however.
balance: Medical Doctors now have roundstart virology access. Paramedics
and coroners now get virology access on skeleton shift access.
Virologists now have roundstart pharmacy access.
balance: Sentient Diseases now resist being overridden by other advanced
diseases and can always override other advanced diseases; they also have
an extra bonus on their stealth stat to help make up for early outing
without a bit more testing.
balance: biohazard lockers now also contain a syringe of spaceacillin
(in line with the orderable kit from cargo.)
balance: Virus severity is now also a function of the number of symptoms
out of max your virus has. Experiment with different combinations using
less than six symptoms to make viruses that are deceptively less-obvious
and less quick to self-cure at the tradeoff of stats.
/:cl:
  • Loading branch information
Higgin authored Dec 7, 2023
1 parent 1c9f204 commit e9f12be
Show file tree
Hide file tree
Showing 22 changed files with 242 additions and 20 deletions.
55 changes: 55 additions & 0 deletions code/__DEFINES/diseases.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,58 @@ DEFINE_BITFIELD(spread_flags, list(
#define DISEASE_SEVERITY_BIOHAZARD "BIOHAZARD"
/// Diseases that are uncurable (hms)
#define DISEASE_SEVERITY_UNCURABLE "Uncurable"

//Severity Guaranteed Cycles or how long before a disease can potentially self-cure
/// Positive diseases should not self-cure by themselves, but if they do, they cure fast
#define DISEASE_CYCLES_POSITIVE 15
/// Roughly 6 minutes for a harmless virus
#define DISEASE_CYCLES_NONTHREAT 180
/// Roughly 5 minutes for a disruptive nuisance virus
#define DISEASE_CYCLES_MINOR 150
/// Roughly 4 minutes for a medium virus
#define DISEASE_CYCLES_MEDIUM 120
/// Roughly 3 minutes for a dangerous virus
#define DISEASE_CYCLES_DANGEROUS 90
/// Roughly 2 minutes for a harmful virus
#define DISEASE_CYCLES_HARMFUL 60
/// Roughly 1 minute for a biohazard kill-death-evil-bad virus
#define DISEASE_CYCLES_BIOHAZARD 30

//Natural Immunity/Recovery Balance Levers
/// Recovery Constant - starting point, 'base' recovery when you get initially infected.
//// Minimum stage_prob is 1 for most advanced diseases. Don't raise it above that if you don't want those diseases to start naturally curing themselves.
#define DISEASE_RECOVERY_CONSTANT 0
/// Recovery Scaling - the divisor of the number of adjusted cycles at max_stages divided by Severity Guaranteed Cycles.
//// Raise to make over-time scaling more aggressive as you get further away from Severity Guaranteed Cycles.
//// Basically, once you hit Severity Guaranteed Cycles or equivalent, this will be your flat recovery chance, increasing by 1% for every Severity Guaranteed Cycles/this value cycles. So, if SGC = 30 and this = 3, every 10 cycles should give you another 1% per-cycle chance to recover.
#define DISEASE_RECOVERY_SCALING 2
/// Peaked Recovery Multiplier - Once we hit max_stages, multiplicative bonus to recovery scaling.
//// Adjust to make it faster or slower to cure once the virus has reached its peak.
#define DISEASE_PEAKED_RECOVERY_MULTIPLIER 1.2
/// Slowdown Recovery Bonus - set this to the maximum extra chance per tick you want people to get to recover from spaceacillin or other slowdown/virus resistance effects
#define DISEASE_SLOWDOWN_RECOVERY_BONUS 1
/// Slowdown Recovery Bonus Duration - set this to the maximum # of cycles you want things that cause slowdown/virus resistance to be able to add a bonus up to DISEASE_SLOWDOWN_RECOVERY_BONUS.______qdel_list_wrapper(list/L)
//// Scales down linearly over time.
#define DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION 100
/// Negative Malnutrition Recovery Penalty
//// Flat penalty to recovery chance if malnourished or starving
#define DISEASE_MALNUTRITION_RECOVERY_PENALTY 1.5
/// Satiety Recovery Multiplier - added chance to recover based on positive satiety
//// Multiplier of satiety/max_satiety if satiety is positive or zero. Increase to make satiety more valuable, decrease for less.
#define DISEASE_SATIETY_RECOVERY_MULTIPLIER 1
/// Good Sleeping Recovery Bonus - additive benefits for various types of good sleep (blanket, bed, darkness, pillows.)
//// Raise to make each factor add this much chance to recover.
#define DISEASE_GOOD_SLEEPING_RECOVERY_BONUS 0.2
/// Sleeping Recovery Multiplier - multiplies ALL recovery chance effects by this amount.
//// Set to 1 for no effect on recovery chances from sleeping.
#define DISEASE_SLEEPING_RECOVERY_MULTIPLIER 2
/// Final Cure Chance Multiplier - multiplies the disease's cure chance to get the probability of moving from stage 1 to a final cure.
//// Must be greater than zero for diseases to self cure.
#define DISEASE_FINAL_CURE_CHANCE_MULTIPLIER 3
/// Symptom Offset Duration - number of cycles over which sleeping/having spaceacillin or a slowdown effect can prevent symptoms appearing
//// Set to maximum # of cycles you want to be able to offset symptoms. Scales down linearly over time.
#define DISEASE_SYMPTOM_OFFSET_DURATION 100

///Symptom Frequency Modifier
//// Raise to make symptoms fire less frequently, lower to make them fire more frequently. Keep at 0 or above.
#define DISEASE_SYMPTOM_FREQUENCY_MODIFIER 1
2 changes: 1 addition & 1 deletion code/datums/diseases/_MobProcs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
if(prob(15/disease.spreading_modifier))
return

if(satiety>0 && prob(satiety/10)) // positive satiety makes it harder to contract the disease.
if(satiety>0 && prob(satiety/2)) // positive satiety makes it harder to contract the disease.
return

if(!target_zone)
Expand Down
135 changes: 131 additions & 4 deletions code/datums/diseases/_disease.dm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@
var/stage_prob = 2
/// How long this infection incubates (non-visible) before revealing itself
var/incubation_time
/// Has the virus hit its limit?
var/stage_peaked = FALSE
/// How many cycles has the virus been at its peak?
var/peaked_cycles = 0
/// How many cycles do we need to have been active after hitting our max stage to start rolling back?
var/cycles_to_beat = 0
/// Number of cycles we've prevented symptoms from appearing
var/symptom_offsets = 0
/// Number of cycles we've benefited from chemical or other non-resting symptom protection
var/chemical_offsets = 0

//Other
var/list/viable_mobtypes = list() //typepaths of viable mobs
Expand Down Expand Up @@ -67,10 +77,11 @@
///Proc to process the disease and decide on whether to advance, cure or make the symptoms appear. Returns a boolean on whether to continue acting on the symptoms or not.
/datum/disease/proc/stage_act(seconds_per_tick, times_fired)
var/slowdown = HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE) ? 0.5 : 1 // spaceacillin slows stage speed by 50%
var/recovery_prob = 0

if(required_organ)
if(!has_required_infectious_organ(affected_mob, required_organ))
cure()
cure(add_resistance = FALSE)
return FALSE

if(has_cure())
Expand All @@ -83,14 +94,115 @@
if(disease_flags & CURABLE && SPT_PROB(cure_chance, seconds_per_tick))
cure()
return FALSE
else if(SPT_PROB(stage_prob*slowdown, seconds_per_tick))

if(stage == max_stages && stage_peaked != TRUE) //mostly a sanity check in case we manually set a virus to max stages
stage_peaked = TRUE

if(SPT_PROB(stage_prob*slowdown, seconds_per_tick))
update_stage(min(stage + 1, max_stages))

return !carrier
if(!(disease_flags & CHRONIC) && disease_flags & CURABLE && bypasses_immunity != TRUE)
switch(severity)
if(DISEASE_SEVERITY_POSITIVE) //good viruses don't go anywhere after hitting max stage - you can try to get rid of them by sleeping earlier
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_POSITIVE) //because of the way we later check for recovery_prob, we need to floor this at least equal to the scaling to avoid infinitely getting less likely to cure
if((HAS_TRAIT(affected_mob, TRAIT_NOHUNGER)) || affected_mob.nutrition < NUTRITION_LEVEL_STARVING || affected_mob.satiety < 0 || slowdown == 1) //any sort of malnourishment/immunosuppressant opens you to losing a good virus
return TRUE
if(DISEASE_SEVERITY_NONTHREAT)
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_NONTHREAT)
if(DISEASE_SEVERITY_MINOR)
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_MINOR)
if(DISEASE_SEVERITY_MEDIUM)
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_MEDIUM)
if(DISEASE_SEVERITY_DANGEROUS)
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_DANGEROUS)
if(DISEASE_SEVERITY_HARMFUL)
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_HARMFUL)
if(DISEASE_SEVERITY_BIOHAZARD)
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_BIOHAZARD)
peaked_cycles += stage/max_stages //every cycle we spend sick counts towards eventually curing the virus, faster at higher stages
recovery_prob += DISEASE_RECOVERY_CONSTANT + (peaked_cycles / (cycles_to_beat / DISEASE_RECOVERY_SCALING)) //more severe viruses are beaten back more aggressively after the peak
if(stage_peaked)
recovery_prob *= DISEASE_PEAKED_RECOVERY_MULTIPLIER
if(slowdown != 1) //using spaceacillin can help get them over the finish line to kill a virus with decreasing effect over time
recovery_prob += clamp((((1 - slowdown)*(DISEASE_SLOWDOWN_RECOVERY_BONUS * 2)) * ((DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION - chemical_offsets) / DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION)), 0, DISEASE_SLOWDOWN_RECOVERY_BONUS)
chemical_offsets = min(chemical_offsets + 1, DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION)
if(!HAS_TRAIT(affected_mob, TRAIT_NOHUNGER))
if(affected_mob.satiety < 0 || affected_mob.nutrition < NUTRITION_LEVEL_STARVING) //being malnourished makes it a lot harder to defeat your illness
recovery_prob -= DISEASE_MALNUTRITION_RECOVERY_PENALTY
else
if(affected_mob.satiety >= 0)
recovery_prob += round((DISEASE_SATIETY_RECOVERY_MULTIPLIER * (affected_mob.satiety/MAX_SATIETY)), 0.1)

if(affected_mob.mob_mood) // this and most other modifiers below a shameless rip from sleeping healing buffs, but feeling good helps make it go away quicker
switch(affected_mob.mob_mood.sanity_level)
if(SANITY_LEVEL_GREAT)
recovery_prob += 0.2
if(SANITY_LEVEL_NEUTRAL)
recovery_prob += 0.1
if(SANITY_LEVEL_DISTURBED)
recovery_prob += 0
if(SANITY_LEVEL_UNSTABLE)
recovery_prob += 0
if(SANITY_LEVEL_CRAZY)
recovery_prob += -0.1
if(SANITY_LEVEL_INSANE)
recovery_prob += -0.2

if((HAS_TRAIT(affected_mob, TRAIT_NOHUNGER) || !(affected_mob.satiety < 0 || affected_mob.nutrition < NUTRITION_LEVEL_STARVING)) && HAS_TRAIT(affected_mob, TRAIT_KNOCKEDOUT)) //resting starved won't help, but resting helps
var/turf/rest_turf = get_turf(affected_mob)
var/is_sleeping_in_darkness = rest_turf.get_lumcount() <= LIGHTING_TILE_IS_DARK

if(affected_mob.is_blind_from(EYES_COVERED) || is_sleeping_in_darkness)
recovery_prob += DISEASE_GOOD_SLEEPING_RECOVERY_BONUS

// sleeping in silence is always better
if(HAS_TRAIT(affected_mob, TRAIT_DEAF))
recovery_prob += DISEASE_GOOD_SLEEPING_RECOVERY_BONUS

// check for beds
if((locate(/obj/structure/bed) in affected_mob.loc))
recovery_prob += DISEASE_GOOD_SLEEPING_RECOVERY_BONUS
else if((locate(/obj/structure/table) in affected_mob.loc))
recovery_prob += (DISEASE_GOOD_SLEEPING_RECOVERY_BONUS / 2)

// don't forget the bedsheet
if(locate(/obj/item/bedsheet) in affected_mob.loc)
recovery_prob += DISEASE_GOOD_SLEEPING_RECOVERY_BONUS

// you forgot the pillow
if(locate(/obj/item/pillow) in affected_mob.loc)
recovery_prob += DISEASE_GOOD_SLEEPING_RECOVERY_BONUS

recovery_prob *= DISEASE_SLEEPING_RECOVERY_MULTIPLIER //any form of sleeping magnifies all effects a little bit

recovery_prob = clamp(recovery_prob, 0, 100)

if(recovery_prob)
if(SPT_PROB(recovery_prob, seconds_per_tick))
if(stage == 1 && prob(cure_chance * DISEASE_FINAL_CURE_CHANCE_MULTIPLIER)) //if we reduce FROM stage == 1, cure the virus - after defeating its cure_chance in a final battle
if(!HAS_TRAIT(affected_mob, TRAIT_NOHUNGER) && (affected_mob.satiety < 0 || affected_mob.nutrition < NUTRITION_LEVEL_STARVING))
if(stage_peaked == FALSE) //if you didn't ride out the virus from its peak, if you're malnourished when it cures, you don't get resistance
cure(add_resistance = FALSE)
return FALSE
else if(prob(50)) //if you rode it out from the peak, challenge cure_chance on if you get resistance or not
cure(add_resistance = TRUE)
return FALSE
else
cure(add_resistance = TRUE) //stay fed and cure it at any point, you're immune
return FALSE
update_stage(max(stage - 1, 1))

if(HAS_TRAIT(affected_mob, TRAIT_KNOCKEDOUT) || slowdown != 1) //sleeping and using spaceacillin lets us nosell applicable virus symptoms firing with decreasing effectiveness over time
if(prob(100 - min((100 * (symptom_offsets / DISEASE_SYMPTOM_OFFSET_DURATION)), 100 - cure_chance * DISEASE_FINAL_CURE_CHANCE_MULTIPLIER))) //viruses with higher cure_chance will ultimately be more possible to offset symptoms on
symptom_offsets = min(symptom_offsets + 1, DISEASE_SYMPTOM_OFFSET_DURATION)
return FALSE

return !carrier

/datum/disease/proc/update_stage(new_stage)
stage = new_stage
if(new_stage == max_stages && !(stage_peaked)) //once a virus has hit its peak, set it to have done so
stage_peaked = TRUE

/datum/disease/proc/has_cure()
if(!(disease_flags & (CURABLE | CHRONIC)))
Expand All @@ -111,7 +223,19 @@
if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread)
return

if(HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE) || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
if(affected_mob.internal) //if you keep your internals on, no airborne spread at least
return

if(HAS_TRAIT(affected_mob, TRAIT_NOBREATH)) //also if you don't breathe
return

if(!has_required_infectious_organ(affected_mob, ORGAN_SLOT_LUNGS)) //also if you lack lungs
return

if(!affected_mob.CanSpreadAirborneDisease()) //should probably check this huh
return

if(HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE) || (affected_mob.satiety > 0 && prob(affected_mob.satiety/2))) //being full or on spaceacillin makes you less likely to spread a virus
return

var/spread_range = 2
Expand Down Expand Up @@ -144,6 +268,9 @@
if(affected_mob)
if(add_resistance && (disease_flags & CAN_RESIST))
LAZYOR(affected_mob.disease_resistances, GetDiseaseID())
if(affected_mob.ckey)
var/cure_turf = get_turf(affected_mob)
log_virus("[key_name(affected_mob)] was cured of virus: [src.admin_details()] at [loc_name(cure_turf)]")
qdel(src)

/datum/disease/proc/IsSame(datum/disease/D)
Expand Down
26 changes: 18 additions & 8 deletions code/datums/diseases/advance/advance.dm
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,13 @@
sortTim(advance_diseases, GLOBAL_PROC_REF(cmp_advdisease_resistance_asc))
for(var/i in 1 to replace_num)
var/datum/disease/advance/competition = advance_diseases[i]
if(totalTransmittable() > competition.totalResistance())
competition.cure(FALSE)
else
return FALSE //we are not strong enough to bully our way in
if(!competition.bypasses_immunity)
if(bypasses_immunity) //viruses with bypasses_immunity get a free pass on beating normal advanced diseases
competition.cure(FALSE)
if(totalTransmittable() > competition.totalResistance())
competition.cure(FALSE)
else
return FALSE //we are not strong enough to bully our way in
infect(infectee, make_copy)
return TRUE

Expand All @@ -152,7 +155,7 @@
for(var/s in symptoms)
var/datum/symptom/symptom_datum = s
if(symptom_datum.Start(src)) //this will return FALSE if the symptom is neutered
symptom_datum.next_activation = world.time + rand(symptom_datum.symptom_delay_min SECONDS, symptom_datum.symptom_delay_max SECONDS)
symptom_datum.next_activation = world.time + (rand(symptom_datum.symptom_delay_min SECONDS, symptom_datum.symptom_delay_max SECONDS) * DISEASE_SYMPTOM_FREQUENCY_MODIFIER)
symptom_datum.on_stage_change(src)

for(var/s in symptoms)
Expand Down Expand Up @@ -254,7 +257,14 @@
properties["stage_rate"] += S.stage_speed
properties["transmittable"] += S.transmittable
if(!S.neutered)
properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity non-neutered symptom
properties["severity"] += S.severity // severity is based on the sum of all non-neutered symptoms' severity
if(properties["severity"] > 0)
properties["severity"] += round((properties["resistance"] / 12), 1)
properties["severity"] += round((properties["stage_rate"] / 11), 1)
properties["severity"] += round((properties["transmittable"] / 8), 1)
properties["severity"] = round((properties["severity"] / 2), 1)
properties["severity"] *= (symptoms.len / VIRUS_SYMPTOM_LIMIT) //fewer symptoms, less severity
properties["severity"] = clamp(properties["severity"], 1, 7)

// Assign the properties that are in the list.
/datum/disease/advance/proc/assign_properties()
Expand All @@ -275,9 +285,9 @@
set_spread(DISEASE_SPREAD_BLOOD)

spreading_modifier = max(CEILING(0.4 * properties["transmittable"], 1), 1)
cure_chance = clamp(7.5 - (0.5 * properties["resistance"]), 5, 10) // can be between 5 and 10
cure_chance = clamp(7.5 - (0.5 * properties["resistance"]), 1, 10) // can be between 1 and 10
stage_prob = max(0.5 * properties["stage_rate"], 1)
set_severity(properties["severity"])
set_severity(round(properties["severity"]), 1)
generate_cure(properties)
else
CRASH("Our properties were empty or null!")
Expand Down
2 changes: 1 addition & 1 deletion code/datums/diseases/advance/floor_diseases/carpellosis.dm
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
QDEL_NULL(rift_ability)
return ..()

/datum/disease/advance/carpellosis/cure()
/datum/disease/advance/carpellosis/cure(add_resistance = TRUE)
if(ability_granted)
rift_ability.Remove(affected_mob)
if(max_stage_reached && prob(ella_spawn_chance))
Expand Down
1 change: 1 addition & 0 deletions code/datums/diseases/brainrot.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organ = ORGAN_SLOT_BRAIN
severity = DISEASE_SEVERITY_HARMFUL
bypasses_immunity = TRUE

/datum/disease/brainrot/stage_act(seconds_per_tick, times_fired) //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
. = ..()
Expand Down
1 change: 1 addition & 0 deletions code/datums/diseases/chronic_illness.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A disease discovered in an Interdyne laboratory caused by subjection to timesteam correction technology."
severity = DISEASE_SEVERITY_UNCURABLE
bypasses_immunity = TRUE

/datum/disease/chronic_illness/stage_act(seconds_per_tick, times_fired)
. = ..()
Expand Down
3 changes: 2 additions & 1 deletion code/datums/diseases/decloning.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
spread_text = "Organic meltdown"
process_dead = TRUE
bypasses_immunity = TRUE

/datum/disease/decloning/cure()
/datum/disease/decloning/cure(add_resistance = TRUE)
affected_mob.remove_status_effect(/datum/status_effect/decloning)
return ..()

Expand Down
1 change: 1 addition & 0 deletions code/datums/diseases/dna_spread.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
var/transformed = 0
desc = "This disease transplants the genetic code of the initial vector into new hosts."
severity = DISEASE_SEVERITY_MEDIUM
bypasses_immunity = TRUE


/datum/disease/dnaspread/stage_act(seconds_per_tick, times_fired)
Expand Down
3 changes: 2 additions & 1 deletion code/datums/diseases/gastrolisis.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
stage_prob = 0.5
disease_flags = CURABLE
cures = list(/datum/reagent/consumable/salt, /datum/reagent/medicine/mutadone)
bypasses_immunity = TRUE


/datum/disease/gastrolosis/stage_act(seconds_per_tick, times_fired)
Expand Down Expand Up @@ -79,7 +80,7 @@
OT.MakeSlippery(TURF_WET_LUBE, 100)


/datum/disease/gastrolosis/cure()
/datum/disease/gastrolosis/cure(add_resistance = TRUE)
. = ..()
if(affected_mob && !is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening
var/mob/living/carbon/human/H = affected_mob
Expand Down
1 change: 1 addition & 0 deletions code/datums/diseases/gbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
spreading_modifier = 1
severity = DISEASE_SEVERITY_BIOHAZARD
bypasses_immunity = TRUE

/datum/disease/gbs/stage_act(seconds_per_tick, times_fired)
. = ..()
Expand Down
1 change: 1 addition & 0 deletions code/datums/diseases/magnitis.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,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 = DISEASE_SEVERITY_MEDIUM
infectable_biotypes = MOB_ORGANIC|MOB_ROBOTIC
bypasses_immunity = TRUE
process_dead = TRUE


Expand Down
2 changes: 1 addition & 1 deletion code/datums/diseases/parrotpossession.dm
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
affected_mob.say(potential_phrase, forced = "parrot possession")


/datum/disease/parrot_possession/cure()
/datum/disease/parrot_possession/cure(add_resistance = FALSE)
var/atom/movable/inside_parrot = locate(/mob/living/basic/parrot/poly/ghost) in affected_mob
if(inside_parrot)
UnregisterSignal(inside_parrot, list(COMSIG_PREQDELETED, COMSIG_MOVABLE_MOVED))
Expand Down
1 change: 1 addition & 0 deletions code/datums/diseases/retrovirus.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
spreading_modifier = 0.4
stage_prob = 1
var/restcure = 0
bypasses_immunity = TRUE

/datum/disease/dna_retrovirus/New()
..()
Expand Down
Loading

0 comments on commit e9f12be

Please sign in to comment.