diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 48f68e69..b6e8d9a3 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -1,76 +1,6 @@
/*
//////////////////////////////////////
-Choking
-
- Very very noticable.
- Lowers resistance.
- Decreases stage speed.
- Decreases transmittablity tremendously.
- Moderate Level.
-
-Bonus
- Inflicts spikes of oxyloss
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/choking
-
- name = "Choking"
- desc = "The virus causes inflammation of the host's air conduits, leading to intermittent choking."
- stealth = -3
- resistance = -2
- stage_speed = -2
- transmittable = -4
- level = 3
- severity = 3
- base_message_chance = 15
- symptom_delay_min = 10
- symptom_delay_max = 30
- threshold_desc = "Stage Speed 8: Causes choking more frequently.
\
- Stealth 4: The symptom remains hidden until active."
-
-/datum/symptom/choking/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 8)
- symptom_delay_min = 7
- symptom_delay_max = 24
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
-
-/datum/symptom/choking/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]")
- if(3, 4)
- if(!suppress_warning)
- to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")
- else
- to_chat(M, "You feel very [pick("dizzy","woozy","faint")].") //fake bloodloss messages
- Choke_stage_3_4(M, A)
- M.emote("gasp")
- else
- to_chat(M, "[pick("You're choking!", "You can't breathe!")]")
- Choke(M, A)
- M.emote("gasp")
-
-/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- M.adjustOxyLoss(rand(6,13))
- return 1
-
-/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- M.adjustOxyLoss(rand(10,18))
- return 1
-
-/*
-//////////////////////////////////////
-
Asphyxiation
Very very noticable.
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index bb1da9ac..1c1aa856 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -20,9 +20,9 @@ Bonus
name = "Spontaneous Combustion"
desc = "The virus turns fat into an extremely flammable compound, and raises the body's temperature, making the host burst into flames spontaneously."
stealth = 1
- resistance = -4
- stage_speed = -4
- transmittable = -4
+ resistance = -2
+ stage_speed = -3
+ transmittable = -3
level = 6
severity = 5
base_message_chance = 20
@@ -73,12 +73,16 @@ Bonus
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
- M.adjust_fire_stacks(3 * power)
+ if(HAS_TRAIT(M, TRAIT_FAT))
+ M.adjust_fire_stacks(6 * power)
+ else
+ M.adjust_fire_stacks(3 * power)
M.take_overall_damage(burn = 5 * power, required_status = BODYPART_ORGANIC)
if(infective)
A.spread(4)
return 1
+
/*
//////////////////////////////////////
@@ -152,7 +156,7 @@ Bonus
M.IgniteMob()
to_chat(M, "Your skin erupts into an inferno!")
M.emote("scream")
-
+
/datum/symptom/alkali/proc/Alkali_fire_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = 6 * power
M.adjust_fire_stacks(get_stacks)
diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm
index 49b229e5..87e6286e 100644
--- a/code/datums/diseases/advance/symptoms/genetics.dm
+++ b/code/datums/diseases/advance/symptoms/genetics.dm
@@ -1,78 +1,82 @@
-/*
-//////////////////////////////////////
-
-DNA Saboteur
-
- Very noticable.
- Lowers resistance tremendously.
- No changes to stage speed.
- Decreases transmittablity tremendously.
- Fatal Level.
-
-Bonus
- Cleans the DNA of a person and then randomly gives them a trait.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/genetic_mutation
- name = "Deoxyribonucleic Acid Saboteur"
- desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
- stealth = -2
- resistance = -3
- stage_speed = 0
- transmittable = -3
- level = 6
- severity = 4
- var/list/possible_mutations
- var/archived_dna = null
- base_message_chance = 50
- symptom_delay_min = 60
- symptom_delay_max = 120
- var/no_reset = FALSE
- threshold_desc = "Resistance 8: Causes two harmful mutations at once.
\
- Stage Speed 10: Increases mutation frequency.
\
- Stealth 5: The mutations persist even if the virus is cured."
-
-/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/C = A.affected_mob
- if(!C.has_dna())
- return
- switch(A.stage)
- if(4, 5)
- to_chat(C, "[pick("Your skin feels itchy.", "You feel light headed.")]")
- C.dna.remove_mutation_group(possible_mutations)
- for(var/i in 1 to power)
- C.randmut(possible_mutations)
-
-// Archive their DNA before they were infected.
-/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 5) //don't restore dna after curing
- no_reset = TRUE
- if(A.properties["stage_rate"] >= 10) //mutate more often
- symptom_delay_min = 20
- symptom_delay_max = 60
- if(A.properties["resistance"] >= 8) //mutate twice
- power = 2
- possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT]
- var/mob/living/carbon/M = A.affected_mob
- if(M)
- if(!M.has_dna())
- return
- archived_dna = M.dna.mutation_index
-
-// Give them back their old DNA when cured.
-/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
- if(!..())
- return
- if(!no_reset)
- var/mob/living/carbon/M = A.affected_mob
- if(M && archived_dna)
- if(!M.has_dna())
- return
- M.dna.mutation_index = archived_dna
- M.domutcheck()
+/*
+//////////////////////////////////////
+
+DNA Saboteur
+
+ Very noticable.
+ Lowers resistance tremendously.
+ No changes to stage speed.
+ Decreases transmittablity tremendously.
+ Fatal Level.
+
+Bonus
+ Cleans the DNA of a person and then randomly gives them a trait.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/genetic_mutation
+ name = "Deoxyribonucleic Acid Saboteur"
+ desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
+ stealth = -2
+ resistance = -3
+ stage_speed = 0
+ transmittable = -3
+ level = 6
+ severity = 4
+ var/list/possible_mutations
+ var/archived_dna = null
+ base_message_chance = 50
+ symptom_delay_min = 60
+ symptom_delay_max = 120
+ var/no_reset = FALSE
+ threshold_desc = "Resistance 8: Causes two harmful mutations at once.
\
+ Stage Speed 10: Increases mutation frequency.
\
+ Stage Speed 14: Mutations will be beneficial.
\
+ Stealth 5: The mutations persist even if the virus is cured."
+
+/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/C = A.affected_mob
+ if(!C.has_dna())
+ return
+ switch(A.stage)
+ if(4, 5)
+ to_chat(C, "[pick("Your skin feels itchy.", "You feel light headed.")]")
+ C.dna.remove_mutation_group(possible_mutations)
+ for(var/i in 1 to power)
+ C.randmut(possible_mutations)
+
+// Archive their DNA before they were infected.
+/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stealth"] >= 5) //don't restore dna after curing
+ no_reset = TRUE
+ if(A.properties["stage_rate"] >= 10) //mutate more often
+ symptom_delay_min = 20
+ symptom_delay_max = 60
+ if(A.properties["resistance"] >= 8) //mutate twice
+ power = 2
+ if(A.properties["stage_rate"] >= 14)
+ possible_mutations = (GLOB.good_mutations) - GLOB.all_mutations[RACEMUT]
+ else
+ possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT]
+ var/mob/living/carbon/M = A.affected_mob
+ if(M)
+ if(!M.has_dna())
+ return
+ archived_dna = M.dna.mutation_index
+
+// Give them back their old DNA when cured.
+/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
+ if(!..())
+ return
+ if(!no_reset)
+ var/mob/living/carbon/M = A.affected_mob
+ if(M && archived_dna)
+ if(!M.has_dna())
+ return
+ M.dna.mutation_index = archived_dna
+ M.domutcheck()
diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm
index 873d9605..86587abd 100644
--- a/code/datums/diseases/advance/symptoms/hallucigen.dm
+++ b/code/datums/diseases/advance/symptoms/hallucigen.dm
@@ -18,23 +18,23 @@ Bonus
/datum/symptom/hallucigen
name = "Hallucigen"
desc = "The virus stimulates the brain, causing occasional hallucinations."
- stealth = -2
+ stealth = 1
resistance = -3
- stage_speed = -3
+ stage_speed = -1
transmittable = -1
level = 5
severity = 2
base_message_chance = 25
- symptom_delay_min = 25
- symptom_delay_max = 90
+ symptom_delay_min = 10
+ symptom_delay_max = 70
var/fake_healthy = FALSE
threshold_desc = "Stage Speed 7: Increases the amount of hallucinations.
\
- Stealth 4: The virus mimics positive symptoms.."
+ Stealth 2: The virus mimics positive symptoms.."
/datum/symptom/hallucigen/Start(datum/disease/advance/A)
if(!..())
return
- if(A.properties["stealth"] >= 4) //fake good symptom messages
+ if(A.properties["stealth"] >= 2) //fake good symptom messages
fake_healthy = TRUE
base_message_chance = 50
if(A.properties["stage_rate"] >= 7) //stronger hallucinations
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index b8a52e0c..a133be00 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -1,466 +1,415 @@
-/datum/symptom/heal
- name = "Basic Healing (does nothing)" //warning for adminspawn viruses
- desc = "You should not be seeing this."
- stealth = 0
- resistance = 0
- stage_speed = 0
- transmittable = 0
- level = -1 //not obtainable
- base_message_chance = 20 //here used for the overlays
- symptom_delay_min = 1
- symptom_delay_max = 1
- var/passive_message = "" //random message to infected but not actively healing people
- threshold_desc = "Stage Speed 6: Doubles healing speed.
\
- Stealth 4: Healing will no longer be visible to onlookers."
-
-/datum/symptom/heal/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 6) //stronger healing
- power = 2
-
-/datum/symptom/heal/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- var/effectiveness = CanHeal(A)
- if(!effectiveness)
- if(passive_message && prob(2) && passive_message_condition(M))
- to_chat(M, passive_message)
- return
- else
- Heal(M, A, effectiveness)
- return
-
-/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
- return power
-
-/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
- return TRUE
-
-/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
- return TRUE
-
-
-/datum/symptom/heal/starlight
- name = "Starlight Condensation"
- desc = "The virus reacts to direct starlight, producing regenerative chemicals. Works best against toxin-based damage."
- stealth = -1
- resistance = -2
- stage_speed = 0
- transmittable = 1
- level = 6
- passive_message = "You miss the feeling of starlight on your skin."
- var/nearspace_penalty = 0.3
- threshold_desc = "Stage Speed 6: Increases healing speed.
\
- Transmission 6: Removes penalty for only being close to space."
-
-/datum/symptom/heal/starlight/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["transmittable"] >= 6)
- nearspace_penalty = 1
- if(A.properties["stage_rate"] >= 6)
- power = 2
-
-/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- if(istype(get_turf(M), /turf/open/space))
- return power
- else
- for(var/turf/T in view(M, 2))
- if(istype(T, /turf/open/space))
- return power * nearspace_penalty
-
-/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = actual_power
- if(M.getToxLoss() && prob(5))
- to_chat(M, "Your skin tingles as the starlight seems to heal you.")
-
- M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
-
-/datum/symptom/heal/starlight/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/chem
- name = "Toxolysis"
- stealth = 0
- resistance = -2
- stage_speed = 2
- transmittable = -2
- level = 7
- var/food_conversion = FALSE
- desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
- threshold_desc = "Resistance 7: Increases chem removal speed.
\
- Stage Speed 6: Consumed chemicals nourish the host."
-
-/datum/symptom/heal/chem/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 6)
- food_conversion = TRUE
- if(A.properties["resistance"] >= 7)
- power = 2
-
-/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
- for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
- M.reagents.remove_reagent(R.id, actual_power)
- if(food_conversion)
- M.nutrition += 0.3
- if(prob(2))
- to_chat(M, "You feel a mild warmth as your blood purifies itself.")
- return 1
-
-
-
-/datum/symptom/heal/metabolism
- name = "Metabolic Boost"
- stealth = -1
- resistance = -2
- stage_speed = 2
- transmittable = 1
- level = 7
- var/triple_metabolism = FALSE
- var/reduced_hunger = FALSE
- desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\
- but also causing increased hunger."
- threshold_desc = "Stealth 3: Reduces hunger rate.
\
- Stage Speed 10: Chemical metabolization is tripled instead of doubled."
-
-/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 10)
- triple_metabolism = TRUE
- if(A.properties["stealth"] >= 3)
- reduced_hunger = TRUE
-
-/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
- if(!istype(C))
- return
- C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
- if(triple_metabolism)
- C.reagents.metabolize(C, can_overdose=TRUE)
- C.overeatduration = max(C.overeatduration - 2, 0)
- var/lost_nutrition = 9 - (reduced_hunger * 5)
- C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed
- if(prob(2))
- to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.")
- return 1
-
-/datum/symptom/heal/darkness
- name = "Nocturnal Regeneration"
- desc = "The virus is able to mend the host's flesh when in conditions of low light, repairing physical damage. More effective against brute damage."
- stealth = 2
- resistance = -1
- stage_speed = -2
- transmittable = -1
- level = 6
- passive_message = "You feel tingling on your skin as light passes over it."
- threshold_desc = "Stage Speed 8: Doubles healing speed."
-
-/datum/symptom/heal/darkness/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 8)
- power = 2
-
-/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- var/light_amount = 0
- if(isturf(M.loc)) //else, there's considered to be no light
- var/turf/T = M.loc
- light_amount = min(1,T.get_lumcount()) - 0.5
- if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
- return power
-
-/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 2 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- if(prob(5))
- to_chat(M, "The darkness soothes and mends your wounds.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute
- M.update_damage_overlays()
- return 1
-
-/datum/symptom/heal/darkness/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/coma
- name = "Regenerative Coma"
- desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
- stealth = 0
- resistance = 2
- stage_speed = -3
- transmittable = -2
- level = 8
- passive_message = "The pain from your wounds makes you feel oddly sleepy..."
- var/deathgasp = FALSE
- var/active_coma = FALSE //to prevent multiple coma procs
- threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
\
- Stage Speed 7: Increases healing speed."
-
-/datum/symptom/heal/coma/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 1.5
- if(A.properties["stealth"] >= 2)
- deathgasp = TRUE
-
-/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
- return power
- else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
- return power * 0.9
- else if(M.stat == SOFT_CRIT)
- return power * 0.5
- else if(M.IsSleeping())
- return power * 0.25
- else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
- to_chat(M, "You feel yourself slip into a regenerative coma...")
- active_coma = TRUE
- addtimer(CALLBACK(src, .proc/coma, M), 60)
-
-/datum/symptom/heal/coma/proc/coma(mob/living/M)
- if(deathgasp)
- M.emote("deathgasp")
- M.fakedeath("regenerative_coma")
- M.update_stat()
- M.update_canmove()
- addtimer(CALLBACK(src, .proc/uncoma, M), 300)
-
-/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
- if(!active_coma)
- return
- active_coma = FALSE
- M.cure_fakedeath("regenerative_coma")
- M.update_stat()
- M.update_canmove()
-
-/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 4 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
-
- if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
- uncoma(M)
-
- return 1
-
-/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
- if((M.getBruteLoss() + M.getFireLoss()) > 30)
- return TRUE
- return FALSE
-
-/datum/symptom/heal/water
- name = "Tissue Hydration"
- desc = "The virus uses excess water inside and outside the body to repair damaged tissue cells. More effective against burns."
- stealth = 0
- resistance = -1
- stage_speed = 0
- transmittable = 1
- level = 6
- passive_message = "Your skin feels oddly dry..."
- var/absorption_coeff = 1
- threshold_desc = "Resistance 5: Water is consumed at a much slower rate.
\
- Stage Speed 7: Increases healing speed."
-
-/datum/symptom/heal/water/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 2
- if(A.properties["stealth"] >= 2)
- absorption_coeff = 0.25
-
-/datum/symptom/heal/water/CanHeal(datum/disease/advance/A)
- . = 0
- var/mob/living/M = A.affected_mob
- if(M.fire_stacks < 0)
- M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0)
- . += power
- if(M.reagents.has_reagent("holywater"))
- M.reagents.remove_reagent("holywater", 0.5 * absorption_coeff)
- . += power * 0.75
- else if(M.reagents.has_reagent("water"))
- M.reagents.remove_reagent("water", 0.5 * absorption_coeff)
- . += power * 0.5
-
-/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 2 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1) //more effective on burns
-
- if(!parts.len)
- return
-
- if(prob(5))
- to_chat(M, "You feel yourself absorbing the water around you to soothe your damaged skin.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len))
- M.update_damage_overlays()
-
- return 1
-
-/datum/symptom/heal/water/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/plasma
- name = "Plasma Fixation"
- desc = "The virus draws plasma from the atmosphere and from inside the body to heal and stabilize body temperature."
- stealth = 0
- resistance = 3
- stage_speed = -2
- transmittable = -2
- level = 8
- passive_message = "You feel an odd attraction to plasma."
- var/temp_rate = 1
- threshold_desc = "Transmission 6: Increases temperature adjustment rate.
\
- Stage Speed 7: Increases healing speed."
-
-/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 2
- if(A.properties["transmittable"] >= 6)
- temp_rate = 4
-
-/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- var/datum/gas_mixture/environment
- var/plasmamount
-
- . = 0
-
- if(M.loc)
- environment = M.loc.return_air()
- if(environment)
- plasmamount = environment.gases[/datum/gas/plasma]
- if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see
- . += power * 0.5
- if(M.reagents.has_reagent("plasma"))
- . += power * 0.75
-
-/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 4 * actual_power
-
- if(prob(5))
- to_chat(M, "You feel yourself absorbing plasma inside and around you...")
-
- if(M.bodytemperature > BODYTEMP_NORMAL)
- M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL)
- if(prob(5))
- to_chat(M, "You feel less hot.")
- else if(M.bodytemperature < (BODYTEMP_NORMAL + 1))
- M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL)
- if(prob(5))
- to_chat(M, "You feel warmer.")
-
- M.adjustToxLoss(-heal_amt)
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
- if(!parts.len)
- return
- if(prob(5))
- to_chat(M, "The pain from your wounds fades rapidly.")
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
-
-
-/datum/symptom/heal/radiation
- name = "Radioactive Resonance"
- desc = "The virus uses radiation to fix damage through dna mutations."
- stealth = -1
- resistance = -2
- stage_speed = 2
- transmittable = -3
- level = 6
- symptom_delay_min = 1
- symptom_delay_max = 1
- passive_message = "Your skin glows faintly for a moment."
- var/cellular_damage = FALSE
- threshold_desc = "Transmission 6: Additionally heals cellular damage.
\
- Resistance 7: Increases healing speed."
-
-/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 7)
- power = 2
- if(A.properties["transmittable"] >= 6)
- cellular_damage = TRUE
-
-/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- switch(M.radiation)
- if(0)
- return FALSE
- if(1 to RAD_MOB_SAFE)
- return 0.25
- if(RAD_MOB_SAFE to RAD_BURN_THRESHOLD)
- return 0.5
- if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE)
- return 0.75
- if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN)
- return 1
- else
- return 1.5
-
-/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = actual_power
-
- if(cellular_damage)
- M.adjustCloneLoss(-heal_amt * 0.5)
-
- M.adjustToxLoss(-(2 * heal_amt))
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- if(prob(4))
- to_chat(M, "Your skin glows faintly, and you feel your wounds mending themselves.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
+/datum/symptom/heal
+ name = "Basic Healing (does nothing)" //warning for adminspawn viruses
+ desc = "You should not be seeing this."
+ stealth = 0
+ resistance = 0
+ stage_speed = 0
+ transmittable = 0
+ level = -1 //not obtainable
+ base_message_chance = 20 //here used for the overlays
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/passive_message = "" //random message to infected but not actively healing people
+ threshold_desc = "Stage Speed 6: Doubles healing speed.
\
+ Stealth 4: Healing will no longer be visible to onlookers."
+
+/datum/symptom/heal/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 6) //stronger healing
+ power = 2
+
+/datum/symptom/heal/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ var/effectiveness = CanHeal(A)
+ if(!effectiveness)
+ if(passive_message && prob(2) && passive_message_condition(M))
+ to_chat(M, passive_message)
+ return
+ else
+ Heal(M, A, effectiveness)
+ return
+
+/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
+ return power
+
+/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
+ return TRUE
+
+/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
+ return TRUE
+
+/datum/symptom/heal/chem
+ name = "Toxolysis"
+ stealth = 0
+ resistance = -2
+ stage_speed = 2
+ transmittable = -2
+ level = 7
+ var/food_conversion = FALSE
+ desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
+ threshold_desc = "Resistance 7: Increases chem removal speed.
\
+ Stage Speed 6: Consumed chemicals nourish the host."
+
+/datum/symptom/heal/chem/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 6)
+ food_conversion = TRUE
+ if(A.properties["resistance"] >= 7)
+ power = 2
+
+/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
+ for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
+ M.reagents.remove_reagent(R.id, actual_power)
+ if(food_conversion)
+ M.nutrition += 0.3
+ if(prob(2))
+ to_chat(M, "You feel a mild warmth as your blood purifies itself.")
+ return 1
+
+
+/datum/symptom/heal/coma
+ name = "Regenerative Coma"
+ desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
+ stealth = 0
+ resistance = 2
+ stage_speed = -3
+ transmittable = -2
+ level = 8
+ passive_message = "The pain from your wounds makes you feel oddly sleepy..."
+ var/deathgasp = FALSE
+ var/active_coma = FALSE //to prevent multiple coma procs
+ threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
\
+ Stage Speed 7: Increases healing speed."
+
+/datum/symptom/heal/coma/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 7)
+ power = 1.5
+ if(A.properties["stealth"] >= 2)
+ deathgasp = TRUE
+
+/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
+ return power
+ else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
+ return power * 0.9
+ else if(M.stat == SOFT_CRIT)
+ return power * 0.5
+ else if(M.IsSleeping())
+ return power * 0.25
+ else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
+ to_chat(M, "You feel yourself slip into a regenerative coma...")
+ active_coma = TRUE
+ addtimer(CALLBACK(src, .proc/coma, M), 60)
+
+/datum/symptom/heal/coma/proc/coma(mob/living/M)
+ if(deathgasp)
+ M.emote("deathgasp")
+ M.fakedeath("regenerative_coma")
+ M.update_stat()
+ M.update_canmove()
+ addtimer(CALLBACK(src, .proc/uncoma, M), 300)
+
+/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
+ if(!active_coma)
+ return
+ active_coma = FALSE
+ M.cure_fakedeath("regenerative_coma")
+ M.update_stat()
+ M.update_canmove()
+
+/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = 4 * actual_power
+
+ var/list/parts = M.get_damaged_bodyparts(1,1)
+
+ if(!parts.len)
+ return
+
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
+ M.update_damage_overlays()
+
+ if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
+ uncoma(M)
+
+ return 1
+
+/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
+ if((M.getBruteLoss() + M.getFireLoss()) > 30)
+ return TRUE
+ return FALSE
+
+/*
+//////////////////////////////////////
+im not even gonna bother with these for the following symptoms. typed em out, code was deleted, had to start over, read the symptoms yourself.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/EMP
+ name = "Organic Flux Induction"
+ desc = "Causes electromagnetic interference around the subject"
+ stealth = -2
+ resistance = -1
+ stage_speed = 0
+ transmittable = -2
+ level = 6
+ severity = 4
+ symptom_delay_min = 15
+ symptom_delay_max = 40
+ var/bigemp = FALSE
+ var/cellheal = FALSE
+ threshold_desc = "Stealth 4: The disease resets cell DNA, quickly curing cell damage and mutations
\
+ transmission 8: The EMP affects electronics adjacent to the subject as well."
+
+/datum/symptom/EMP/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stealth"] >= 4)
+ cellheal = TRUE
+ if(A.properties["transmittable"] >= 8)
+ bigemp = TRUE
+
+/datum/symptom/EMP/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ M.emp_act(EMP_HEAVY)
+ if(cellheal)
+ M.adjustCloneLoss(-40)
+ M.reagents.add_reagent(/datum/reagent/medicine/mutadone = 1)
+ if(bigemp)
+ empulse(M.loc, 0, 1)
+ to_chat(M, "[pick("Your mind fills with static!.", "You feel a jolt!", "Your sense of direction flickers out!")]")
+ else
+ to_chat(M, "[pick("You feel a slight tug toward the station's wall.", "Nearby electronics flicker", "Your hair stands on end")]")
+ return
+
+/datum/symptom/sweat
+ name = "Hyperperspiration"
+ desc = "Causes the host to sweat profusely, leaving small water puddles and extnguishing small fires"
+ stealth = 1
+ resistance = -1
+ stage_speed = 0
+ transmittable = 1
+ level = 6
+ severity = 4
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/bigsweat = FALSE
+ var/toxheal = FALSE
+ threshold_desc = "transmission 6: The sweat production ramps up to the point that it cleans messes and puts out fires in the general vicinity
\
+ transmission 8: The EMP affects electronics adjacent to the subject as well."
+
+/datum/symptom/sweat/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["transmittable"] >= 8)
+ toxheal = TRUE
+ if(A.properties["transmittable"] >= 6)
+ bigsweat = TRUE
+
+/datum/symptom/sweat/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ M.adjust_fire_stacks(-5)
+ if(prob(30))
+ var/turf/open/OT = get_turf(M)
+ if(istype(OT))
+ to_chat(M, "The sweat pools into a puddle!")
+ OT.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
+ if(bigsweat)
+ var/obj/effect/sweatsplash/S = new(M.loc)
+ if(toxheal)
+ for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
+ M.reagents.remove_reagent(R.type, 5)
+ S.reagents.add_reagent(R.type, 5)
+ M.adjustToxLoss(-20, forced = TRUE)
+ S.splash()
+ to_chat(M, "You sweat out nearly everything in your body!")
+ else
+ to_chat(M, "[pick("You feel moist.", "Your clothes are soaked", "You're sweating buckets")]")
+ return
+
+/obj/effect/sweatsplash
+ name = "Sweatsplash"
+
+/obj/effect/sweatsplash/Initialize()
+ create_reagents(1000)
+ reagents.add_reagent(/datum/reagent/water, 10)
+ reagents.add_reagent(/datum/reagent/space_cleaner, 10)
+
+obj/effect/sweatsplash/proc/splash()
+ chem_splash(loc, 2, list(reagents))
+ qdel(src)
+
+/datum/symptom/teleport
+ name = "Thermal Retrostable Displacement"
+ desc = "When too hot or cold, the subject will return to a recent location they experienced safe homeostasis"
+ stealth = 1
+ resistance = 2
+ stage_speed = -2
+ transmittable = -3
+ level = 8
+ severity = 0
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/telethreshold = 0
+ var/burnheal = FALSE
+ var/turf/open/location_return = null
+ var/cooldowntimer = 0
+ threshold_desc = "Resistance 8: The disease acts on a smaller scale, resetting burnt tissue back to a state of health
\
+ Transmission 8: The disease becomes more active, activating in a smaller temperature range."
+
+/datum/symptom/teleport/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["resistance"] >= 8)
+ burnheal = TRUE
+ if(A.properties["transmittable"] >= 8)
+ telethreshold = 25
+ power = 2
+
+/datum/symptom/teleport/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ if(burnheal)
+ M.adjustFireLoss(-1 * power)
+ if(prob(5) && (M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT))
+ location_return = get_turf(M) //sets up return point
+ if(prob(50))
+ to_chat(M, "The lukewarm temperature makes you feel strange!")
+ if(cooldowntimer == 0 && (M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT - telethreshold || M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT + telethreshold || (burnheal && M.getFireLoss() > 75 - telethreshold)))
+ do_sparks(5,FALSE,M)
+ to_chat(M, "The change in temperature shocks you back to a previous spacial state!")
+ do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
+ do_sparks(5,FALSE,M)
+ cooldowntimer = 10
+ if(burnheal)
+ M.adjust_fire_stacks(-10)
+ if(cooldowntimer > 0)
+ cooldowntimer --
+ else
+ if(prob(7))
+ to_chat(M, "[pick("Your warm breath fizzles out of existence.", "You feel attracted to temperate climates", "You feel like you're forgetting something")]")
+ return
+
+/datum/symptom/growth
+ name = "Pituitary Disruption"
+ desc = "Causes uncontrolled growth in the subject"
+ stealth = -3
+ resistance = -2
+ stage_speed = 1
+ transmittable = -2
+ level = 7
+ severity = 4
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/current_size = 1
+ var/tetsuo = FALSE
+ var/bruteheal = FALSE
+ threshold_desc = "Stage Speed 8: The disease heals brute damage at a fast rate, but causes expulsion of benign tumors
\
+ Stage Speed 12: The disease heals brute damage incredibly fast, but deteriorates cell health and causes tumors to become more advanced."
+
+/datum/symptom/growth/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 8)
+ bruteheal = TRUE
+ if(A.properties["stage_rate"] >= 12)
+ tetsuo = TRUE
+
+/datum/symptom/growth/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ var/newsize = current_size
+ switch(A.stage)
+ if(4, 5)
+ switch(A.properties["stage_rate"])
+ if(5 to 8)
+ newsize = 1.25
+ if(9 to 12)
+ newsize = 1.5
+ if(13 to 16)
+ newsize = 1.75
+ if(17 to INFINITY)
+ newsize = 2
+ M.resize = newsize/current_size
+ current_size = newsize
+ M.update_transform()
+ if(prob(5) && bruteheal)
+ to_chat(M, "You retch, and a splatter of gore escapes your gullet")
+ M.Knockdown(40)
+ new /obj/effect/gibspawner/generic(M.loc)
+ if(prob(80))
+ new /obj/effect/spawner/lootdrop/teratoma/minor(M.loc)
+ if(tetsuo && prob(30))
+ new /obj/effect/spawner/lootdrop/teratoma/major(M.loc)
+ if(tetsuo && prob(10) && A.affected_mob.job == "Clown")
+ new /obj/effect/spawner/lootdrop/teratoma/major/clown(M.loc)
+ if(tetsuo)
+ M.adjustBruteLoss(-5)
+ if(prob(20))
+ M.adjustCloneLoss(1)
+ else if(bruteheal)
+ M.adjustBruteLoss(-1)
+ else
+ if(prob(5))
+ to_chat(M, "[pick("You feel bloated.", "The station seems small", "You are the strongest")]")
+ return
+
+/obj/effect/mob_spawn/teratomamonkey //spawning these is one of the downsides of overclocking the symptom
+ name = "fleshy mass"
+ desc = "A writhing mass of flesh."
+ icon = 'icons/mob/blob.dmi'
+ icon_state = "blob_spore_temp"
+ density = FALSE
+ anchored = FALSE
+
+ mob_type = /mob/living/carbon/monkey/tumor
+ mob_name = "a living tumor"
+ death = FALSE
+ roundstart = FALSE
+ flavour_text = {"
+ You are a living teratoma, and your existence is misery. You feel the need to spread woe about the station- but not to kill.
+ "}
+
+/obj/effect/mob_spawn/teratomamonkey/Initialize()
+ . = ..()
+ var/area/A = get_area(src)
+ if(A)
+ notify_ghosts("A living tumor has been born in [A.name].", 'sound/effects/splat.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
+
+/obj/effect/mob_spawn/teratomamonkey/attack_hand(mob/living/user)
+ . = ..()
+ if(.)
+ return
+ to_chat(user, "Ew... It would be a bad idea to touch this. It could probably be destroyed with the extreme heat of a welder.")
+
+/obj/effect/mob_spawn/teratomamonkey/attackby(obj/item/W, mob/user, params)
+ if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM)
+ user.visible_message("[usr.name] destroys [src].",
+ "You hold the welder to [src], and it violently bursts!",
+ "You hear a gurgling noise")
+ new /obj/effect/gibspawner/human(get_turf(src))
+ qdel(src)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm
index a60011d3..778909ed 100644
--- a/code/datums/diseases/advance/symptoms/oxygen.dm
+++ b/code/datums/diseases/advance/symptoms/oxygen.dm
@@ -1,52 +1,66 @@
-/*
-//////////////////////////////////////
-
-Self-Respiration
-
- Slightly hidden.
- Lowers resistance significantly.
- Decreases stage speed significantly.
- Decreases transmittablity tremendously.
- Fatal Level.
-
-Bonus
- The body generates salbutamol.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/oxygen
-
- name = "Self-Respiration"
- desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
- stealth = 1
- resistance = -3
- stage_speed = -3
- transmittable = -4
- level = 6
- base_message_chance = 5
- symptom_delay_min = 1
- symptom_delay_max = 1
- var/regenerate_blood = FALSE
- threshold_desc = "Resistance 8:Additionally regenerates lost blood.
"
-
-/datum/symptom/oxygen/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 8) //blood regeneration
- regenerate_blood = TRUE
-
-/datum/symptom/oxygen/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- M.adjustOxyLoss(-7, 0)
- M.losebreath = max(0, M.losebreath - 4)
- if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio))
- M.blood_volume += 1
- else
- if(prob(base_message_chance))
- to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")
- return
+/*
+//////////////////////////////////////
+
+Self-Respiration
+
+ Slightly hidden.
+ Lowers resistance significantly.
+ Decreases stage speed significantly.
+ Decreases transmittablity tremendously.
+ Fatal Level.
+
+Bonus
+ The body generates salbutamol.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/oxygen
+
+ name = "Self-Respiration"
+ desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
+ stealth = 1
+ resistance = -3
+ stage_speed = -3
+ transmittable = -4
+ level = 6
+ base_message_chance = 5
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/regenerate_blood = FALSE
+ threshold_desc = "Resistance 8: Additionally regenerates lost blood.
"
+
+/datum/symptom/oxygen/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["resistance"] >= 8) //blood regeneration
+ regenerate_blood = TRUE
+
+/datum/symptom/oxygen/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
+ M.adjustOxyLoss(-7, 0)
+ M.losebreath = max(0, M.losebreath - 4)
+ if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL)
+ M.blood_volume += 1
+ else
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")
+ return
+
+/datum/symptom/oxygen/on_stage_change(new_stage, datum/disease/advance/A)
+ if(!..())
+ return FALSE
+ var/mob/living/carbon/M = A.affected_mob
+ if(A.stage <= 3)
+ REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
+ return TRUE
+
+/datum/symptom/oxygen/End(datum/disease/advance/A)
+ if(!..())
+ return
+ REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT)
diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm
index 2d8ec91f..7cc84ae7 100644
--- a/code/datums/diseases/advance/symptoms/skin.dm
+++ b/code/datums/diseases/advance/symptoms/skin.dm
@@ -86,3 +86,46 @@ BONUS
H.update_body(0)
else
H.visible_message("[H] looks a bit dark...", "Your skin suddenly appears darker...")
+
+/*
+//////////////////////////////////////
+Polyvitiligo
+
+ Not Noticeable.
+ Increases resistance slightly.
+ Increases stage speed.
+ Transmittable.
+ Low Level.
+
+BONUS
+ Makes the host change color
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/polyvitiligo
+ name = "Polyvitiligo"
+ desc = "The virus replaces the melanin in the skin with reactive pigment."
+ stealth = 0
+ resistance = 1
+ stage_speed = 2
+ transmittable = 2
+ level = 4
+ severity = 1
+ base_message_chance = 50
+ symptom_delay_min = 45
+ symptom_delay_max = 90
+
+/datum/symptom/polyvitiligo/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(5)
+ var/static/list/banned_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/invisible, /datum/reagent/colorful_reagent/crayonpowder/white)
+ var/color = pick(subtypesof(/datum/reagent/colorful_reagent/crayonpowder) - banned_reagents)
+ if(M.reagents.total_volume <= (M.reagents.maximum_volume/10)) // no flooding humans with 1000 units of colorful reagent
+ M.reagents.add_reagent(color, 5)
+ else
+ if (prob(50)) // spam
+ M.visible_message("[M] looks rather vibrant...", "The colors, man, the colors...")
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 4b040786..4c858172 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -26,8 +26,7 @@ Bonus
severity = 1
symptom_delay_min = 5
symptom_delay_max = 35
- threshold_desc = "Transmission 9: The host will sneeze periodically, spreading the disease.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_desc = "Stealth 4: The symptom remains hidden until active."
/datum/symptom/sneeze/Start(datum/disease/advance/A)
if(!..())
@@ -38,8 +37,6 @@ Bonus
/datum/symptom/sneeze/Activate(datum/disease/advance/A)
if(!..())
return
- if(!A.properties["transmittable"] >= 9)
- return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
@@ -47,4 +44,3 @@ Bonus
M.emote("sniff")
else
M.emote("sneeze")
- A.spread(4 + power)
diff --git a/code/datums/diseases/advance/symptoms/species.dm b/code/datums/diseases/advance/symptoms/species.dm
index d0c32f32..a8b18ae7 100644
--- a/code/datums/diseases/advance/symptoms/species.dm
+++ b/code/datums/diseases/advance/symptoms/species.dm
@@ -8,12 +8,14 @@
level = 5
severity = 0
-/datum/symptom/undead_adaptation/Start(datum/disease/advance/A)
- if(!..())
- return
+/datum/symptom/undead_adaptation/OnAdd(datum/disease/advance/A)
A.process_dead = TRUE
A.infectable_biotypes |= MOB_UNDEAD
+/datum/symptom/undead_adaptation/OnRemove(datum/disease/advance/A)
+ A.process_dead = FALSE
+ A.infectable_biotypes -= MOB_UNDEAD
+
/datum/symptom/inorganic_adaptation
name = "Inorganic Biology"
desc = "The virus can survive and replicate even in an inorganic environment, increasing its resistance and infection rate."
@@ -24,7 +26,8 @@
level = 5
severity = 0
-/datum/symptom/inorganic_adaptation/Start(datum/disease/advance/A)
- if(!..())
- return
- A.infectable_biotypes |= MOB_INORGANIC
\ No newline at end of file
+/datum/symptom/inorganic_adaptation/OnAdd(datum/disease/advance/A)
+ A.infectable_biotypes |= MOB_INORGANIC
+
+/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A)
+ A.infectable_biotypes -= MOB_INORGANIC
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 95831b36..33f5ca4d 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -60,15 +60,26 @@
next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10)
return TRUE
+/datum/symptom/proc/on_stage_change(new_stage, datum/disease/advance/A)
+ if(neutered)
+ return FALSE
+ return TRUE
+
/datum/symptom/proc/Copy()
var/datum/symptom/new_symp = new type
new_symp.name = name
new_symp.id = id
new_symp.neutered = neutered
return new_symp
-
+
/datum/symptom/proc/OnDeath(datum/disease/advance/A)
return !neutered
/datum/symptom/proc/generate_threshold_desc()
return
+
+/datum/symptom/proc/OnAdd(datum/disease/advance/A) //Overload when a symptom needs to be active before processing, like changing biotypes.
+ return
+
+/datum/symptom/proc/OnRemove(datum/disease/advance/A) //But dont forget to remove them too.
+ return
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index b4a33cb8..940e1af7 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -20,9 +20,9 @@ Bonus
name = "Hyphema"
desc = "The virus causes inflammation of the retina, leading to eye damage and eventually blindness."
stealth = -1
- resistance = -4
+ resistance = -3
stage_speed = -4
- transmittable = -3
+ transmittable = -2
level = 5
severity = 5
base_message_chance = 50
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm
index f53638bc..8c57fc82 100644
--- a/code/datums/diseases/advance/symptoms/vomit.dm
+++ b/code/datums/diseases/advance/symptoms/vomit.dm
@@ -24,9 +24,9 @@ Bonus
name = "Vomiting"
desc = "The virus causes nausea and irritates the stomach, causing occasional vomit."
stealth = -2
- resistance = -1
+ resistance = 1
stage_speed = 0
- transmittable = 1
+ transmittable = 2
level = 3
severity = 3
base_message_chance = 100
@@ -60,4 +60,4 @@ Bonus
vomit(M)
/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
- M.vomit(20, vomit_blood, distance = proj_vomit)
+ M.vomit(20, vomit_blood, stun = 0, distance = proj_vomit)
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm
index 66fc90f1..a1129561 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/advance/symptoms/weight.dm
@@ -23,18 +23,18 @@ Bonus
stealth = -2
resistance = 2
stage_speed = -2
- transmittable = -2
+ transmittable = -1
level = 3
severity = 3
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 45
- threshold_desc = "Stealth 4: The symptom is less noticeable."
+ threshold_desc = "Stealth 2: The symptom is less noticeable."
/datum/symptom/weight_loss/Start(datum/disease/advance/A)
if(!..())
return
- if(A.properties["stealth"] >= 4) //warn less often
+ if(A.properties["stealth"] >= 2) //warn less often
base_message_chance = 25
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)