diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 3aa4dab99b..2e22fd59e0 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -7,7 +7,7 @@
*/
-#define SYMPTOM_LIMIT 8
+#define SYMPTOM_LIMIT 6
@@ -18,7 +18,6 @@
*/
/datum/disease/advance
-
name = "Unknown" // We will always let our Virologist name our disease.
desc = "An engineered disease which can contain a multitude of symptoms."
form = "Advance Disease" // Will let med-scanners know that this disease was engineered.
@@ -58,7 +57,10 @@
symptoms = GenerateSymptoms(0, 2)
else
for(var/datum/symptom/S in D.symptoms)
- symptoms += new S.type
+ var/datum/symptom/new_symp = new S.type
+ new_symp.name = S.name
+ new_symp.neutered = S.neutered
+ symptoms += new_symp
Refresh()
..(process, D)
@@ -119,7 +121,7 @@
if(!(src.IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
- AddSymptom(new S.type)
+ AddSymptom(S.Copy())
/datum/disease/advance/proc/HasSymptom(datum/symptom/S)
for(var/datum/symptom/symp in symptoms)
@@ -155,7 +157,7 @@
return generated
-/datum/disease/advance/proc/Refresh(new_name = 0)
+/datum/disease/advance/proc/Refresh(new_name = FALSE)
//to_chat(world, "[src.name] \ref[src] - REFRESH!")
GenerateProperties()
AssignProperties()
@@ -192,10 +194,8 @@
if(properties && properties.len)
switch(properties["stealth"])
- if(2,3)
+ if(2 to INFINITY)
visibility_flags = HIDDEN_SCANNER
- if(4 to INFINITY)
- visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
// The more symptoms we have, the less transmittable it is but some symptoms can make up for it.
SetSpread(Clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE))
@@ -263,7 +263,7 @@
var/s = safepick(GenerateSymptoms(min_level, max_level, 1))
if(s)
AddSymptom(s)
- Refresh(1)
+ Refresh(TRUE)
return
// Randomly remove a symptom.
@@ -272,7 +272,16 @@
var/s = safepick(symptoms)
if(s)
RemoveSymptom(s)
- Refresh(1)
+ Refresh(TRUE)
+ return
+
+// Randomly neuter a symptom.
+/datum/disease/advance/proc/Neuter()
+ if(symptoms.len)
+ var/s = safepick(symptoms)
+ if(s)
+ NeuterSymptom(s)
+ Refresh(TRUE)
return
// Name the disease.
@@ -311,6 +320,13 @@
symptoms -= S
return
+// Neuter a symptom, so it will only affect stats
+/datum/disease/advance/proc/NeuterSymptom(datum/symptom/S)
+ if(!S.neutered)
+ S.neutered = TRUE
+ S.name += " (neutered)"
+ S.id += "N" //new disease is unique
+
/*
Static Procs
diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm
index 1517201612..07809d3555 100644
--- a/code/datums/diseases/advance/presets.dm
+++ b/code/datums/diseases/advance/presets.dm
@@ -1,6 +1,6 @@
// Cold
-/datum/disease/advance/cold/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
+/datum/disease/advance/cold/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
if(!D)
name = "Cold"
symptoms = list(new/datum/symptom/sneeze)
@@ -9,7 +9,7 @@
// Flu
-/datum/disease/advance/flu/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
+/datum/disease/advance/flu/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
if(!D)
name = "Flu"
symptoms = list(new/datum/symptom/cough)
@@ -18,7 +18,7 @@
// Voice Changing
-/datum/disease/advance/voice_change/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
+/datum/disease/advance/voice_change/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
if(!D)
name = "Epiglottis Mutation"
symptoms = list(new/datum/symptom/voice_change)
@@ -27,7 +27,7 @@
// Toxin Filter
-/datum/disease/advance/heal/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
+/datum/disease/advance/heal/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
if(!D)
name = "Liver Enhancer"
symptoms = list(new/datum/symptom/heal)
@@ -36,7 +36,7 @@
// Hullucigen
-/datum/disease/advance/hullucigen/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
+/datum/disease/advance/hullucigen/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
if(!D)
name = "Reality Impairment"
symptoms = list(new/datum/symptom/hallucigen)
@@ -44,7 +44,7 @@
// Sensory Restoration
-/datum/disease/advance/sensory_restoration/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
+/datum/disease/advance/sensory_restoration/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
if(!D)
name = "Reality Enhancer"
symptoms = list(new/datum/symptom/sensory_restoration)
@@ -52,8 +52,8 @@
// Sensory Destruction
-/datum/disease/advance/sensory_destruction/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
+/datum/disease/advance/narcolepsy/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
if(!D)
- name = "Reality Destruction"
- symptoms = list(new/datum/symptom/sensory_destruction)
+ name = "Experimental Insomnia Cure"
+ symptoms = list(new/datum/symptom/narcolepsy)
..(process, D, copy)
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm
index 8698787dd5..2f8635301e 100644
--- a/code/datums/diseases/advance/symptoms/beard.dm
+++ b/code/datums/diseases/advance/symptoms/beard.dm
@@ -23,27 +23,28 @@ BONUS
transmittable = -1
level = 4
severity = 1
+ symptom_delay_min = 18
+ symptom_delay_max = 36
/datum/symptom/beard/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- switch(A.stage)
- if(1, 2)
- to_chat(H, "Your chin itches.")
- if(H.facial_hair_style == "Shaved")
- H.facial_hair_style = "Jensen Beard"
- H.update_hair()
- if(3, 4)
- to_chat(H, "You feel tough.")
- if(!(H.facial_hair_style == "Dwarf Beard") && !(H.facial_hair_style == "Very Long Beard") && !(H.facial_hair_style == "Full Beard"))
- H.facial_hair_style = "Full Beard"
- H.update_hair()
- else
- to_chat(H, "You feel manly!")
- if(!(H.facial_hair_style == "Dwarf Beard") && !(H.facial_hair_style == "Very Long Beard"))
- H.facial_hair_style = pick("Dwarf Beard", "Very Long Beard")
- H.update_hair()
- return
\ No newline at end of file
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ switch(A.stage)
+ if(1, 2)
+ to_chat(H, "Your chin itches.")
+ if(H.facial_hair_style == "Shaved")
+ H.facial_hair_style = "Jensen Beard"
+ H.update_hair()
+ if(3, 4)
+ to_chat(H, "You feel tough.")
+ if(!(H.facial_hair_style == "Dwarf Beard") && !(H.facial_hair_style == "Very Long Beard") && !(H.facial_hair_style == "Full Beard"))
+ H.facial_hair_style = "Full Beard"
+ H.update_hair()
+ else
+ to_chat(H, "You feel manly!")
+ if(!(H.facial_hair_style == "Dwarf Beard") && !(H.facial_hair_style == "Very Long Beard"))
+ H.facial_hair_style = pick("Dwarf Beard", "Very Long Beard")
+ H.update_hair()
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 492657f97c..a46ef690ef 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -24,32 +24,44 @@ Bonus
transmittable = -4
level = 3
severity = 3
+ base_message_chance = 15
+ symptom_delay_min = 10
+ symptom_delay_max = 30
-/datum/symptom/choking/Activate(datum/disease/advance/A)
+/datum/symptom/choking/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2)
+ 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)
- to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")
- Choke_stage_3_4(M, A)
- M.emote("gasp")
+ 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, "[pick("You're choking!", "You can't breathe!")]")
- Choke(M, A)
- M.emote("gasp")
- return
+ 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)
- var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(max(16+A.totalStealth(),0))
- M.adjustOxyLoss(get_damage)
+ M.adjustOxyLoss(rand(6,13))
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(max(16+A.totalStealth()*5,0))
- M.adjustOxyLoss(get_damage)
+ M.adjustOxyLoss(rand(10,18))
return 1
/*
@@ -78,38 +90,50 @@ Bonus
transmittable = -2
level = 7
severity = 3
+ base_message_chance = 15
+ symptom_delay_min = 14
+ symptom_delay_max = 30
+ var/paralysis = FALSE
-/datum/symptom/asphyxiation/Activate(datum/disease/advance/A)
+/datum/symptom/asphyxiation/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(3, 4)
- to_chat(M, "[pick("Your windpipe feels thin.", "Your lungs feel small.")]")
- Asphyxiate_stage_3_4(M, A)
- M.emote("gasp")
- else
- to_chat(M, "[pick("Your lungs hurt!", "It hurts to breathe!")]")
- Asphyxiate(M, A)
- M.emote("gasp")
- if(M.getOxyLoss() >= 120)
- M.visible_message("[M] stops breathing, as if their lungs have totally collapsed!")
- Asphyxiate_death(M, A)
+ if(A.properties["stage_rate"] >= 8)
+ paralysis = TRUE
+ if(A.properties["transmission"] >= 8)
+ power = 2
+
+/datum/symptom/asphyxiation/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(3, 4)
+ to_chat(M, "[pick("Your windpipe feels thin.", "Your lungs feel small.")]")
+ Asphyxiate_stage_3_4(M, A)
+ M.emote("gasp")
+ else
+ to_chat(M, "[pick("Your lungs hurt!", "It hurts to breathe!")]")
+ Asphyxiate(M, A)
+ M.emote("gasp")
+ if(M.getOxyLoss() >= 120)
+ M.visible_message("[M] stops breathing, as if their lungs have totally collapsed!")
+ Asphyxiate_death(M, A)
return
/datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(abs(21+A.totalStageSpeed()*0.7))+sqrt(abs(16+A.totalStealth()))
+ var/get_damage = rand(10,15) * power
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(abs(21+A.totalStageSpeed()))+sqrt(abs(16+A.totalStealth()*5))
+ var/get_damage = rand(15,21) * power
M.adjustOxyLoss(get_damage)
- M.reagents.add_reagent_list(list("pancuronium" = 2, "sodium_thiopental" = 2))
+ if(paralysis)
+ M.reagents.add_reagent_list(list("pancuronium" = 3, "sodium_thiopental" = 3))
return 1
/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(abs(21+A.totalStageSpeed()*1.5))+sqrt(abs(16+A.totalStealth()*7))
+ var/get_damage = rand(25,35) * power
M.adjustOxyLoss(get_damage)
M.adjustBrainLoss(get_damage/2)
return 1
diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm
index 8f388c45ed..45bf5d6182 100644
--- a/code/datums/diseases/advance/symptoms/confusion.dm
+++ b/code/datums/diseases/advance/symptoms/confusion.dm
@@ -24,17 +24,33 @@ Bonus
transmittable = 0
level = 4
severity = 2
+ base_message_chance = 25
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/brain_damage = FALSE
+/datum/symptom/confusion/Start(datum/disease/advance/A)
+ ..()
+ if(A.properties["resistance"] >= 6)
+ brain_damage = TRUE
+ if(A.properties["transmittable"] >= 6)
+ power = 1.5
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
/datum/symptom/confusion/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]")
- else
- to_chat(M, "You can't think straight!")
- M.confused = min(100, M.confused + 8)
+ else
+ to_chat(M, "You can't think straight!")
+ M.confused = min(100 * power, M.confused + 8)
+ if(brain_damage && M.getBrainLoss()<=80)
+ M.adjustBrainLoss(5 * power)
+ M.updatehealth()
return
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index 13fdb5ea1b..e264b331e7 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -24,17 +24,45 @@ BONUS
transmittable = 2
level = 1
severity = 1
+ base_message_chance = 15
+ symptom_delay_min = 2
+ symptom_delay_max = 15
+ var/infective = FALSE
-/datum/symptom/cough/Activate(datum/disease/advance/A)
+/datum/symptom/cough/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3)
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.spread_flags &= AIRBORNE) //infect bystanders
+ infective = TRUE
+ if(A.properties["resistance"] >= 3) //strong enough to drop items
+ power = 1.5
+ if(A.properties["resistance"] >= 10) //strong enough to stun (rarely)
+ power = 2
+ if(A.properties["stage_rate"] >= 6) //cough more often
+ symptom_delay_max = 10
+
+/datum/symptom/cough/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]")
- else
- M.emote("cough")
+ else
+ M.emote("cough")
+ if(power >= 1.5)
var/obj/item/I = M.get_active_held_item()
if(I && I.w_class == WEIGHT_CLASS_TINY)
M.drop_item()
- return
+ if(power >= 2 && prob(10))
+ to_chat(M, "[pick("You have a coughing fit!", "You can't stop coughing!")]")
+ M.Stun(20)
+ M.emote("cough")
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
+ if(infective)
+ A.spread(A.holder, 1)
+
diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm
index 92269ce8db..b6163a72a1 100644
--- a/code/datums/diseases/advance/symptoms/deafness.dm
+++ b/code/datums/diseases/advance/symptoms/deafness.dm
@@ -24,14 +24,32 @@ Bonus
transmittable = -3
level = 4
severity = 3
+ base_message_chance = 100
+ symptom_delay_min = 25
+ symptom_delay_max = 80
+
+/datum/symptom/deafness/Start(datum/disease/advance/A)
+ ..()
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.properties["resistance"] >= 9) //permanent deafness
+ power = 2
/datum/symptom/deafness/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(3, 4)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]")
- if(5)
+ if(5)
+ if(power > 2)
+ var/obj/item/organ/ears/ears = M.getorganslot("ears")
+ if(istype(ears) && ears.ear_damage < UNHEALING_EAR_DAMAGE)
+ to_chat(M, "Your ears pop painfully and start bleeding!")
+ ears.ear_damage = max(ears.ear_damage, UNHEALING_EAR_DAMAGE)
+ M.emote("scream")
+ else
to_chat(M, "Your ears pop and begin ringing loudly!")
M.minimumDeafTicks(20)
diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm
index c594298b11..60e9989d4a 100644
--- a/code/datums/diseases/advance/symptoms/dizzy.dm
+++ b/code/datums/diseases/advance/symptoms/dizzy.dm
@@ -24,15 +24,27 @@ Bonus
transmittable = -1
level = 4
severity = 2
+ base_message_chance = 50
+ symptom_delay_min = 15
+ symptom_delay_max = 40
-/datum/symptom/dizzy/Activate(datum/disease/advance/A)
+/datum/symptom/dizzy/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.properties["transmittable"] >= 6) //druggy
+ power = 2
+
+/datum/symptom/dizzy/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("You feel dizzy.", "Your head spins.")]")
- else
- to_chat(M, "A wave of dizziness washes over you!")
- M.Dizzy(5)
- return
\ No newline at end of file
+ else
+ to_chat(M, "A wave of dizziness washes over you!")
+ M.Dizzy(5)
+ if(power >= 2)
+ M.set_drugginess(5)
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index 53cc3b6c0d..e69c3bf0a2 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -24,18 +24,34 @@ Bonus
transmittable = 2
level = 2
severity = 2
+ base_message_chance = 20
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/unsafe = FALSE //over the heat threshold
-/datum/symptom/fever/Activate(datum/disease/advance/A)
+/datum/symptom/fever/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/carbon/M = A.affected_mob
- to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]")
- if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT)
- Heat(M, A)
+ if(A.properties["resistance"] >= 5) //dangerous fever
+ power = 1.5
+ unsafe = TRUE
+ if(A.properties["resistance"] >= 10)
+ power = 2.5
- return
+/datum/symptom/fever/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ if(!unsafe || A.stage < 4)
+ to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]")
+ else
+ to_chat(M, "[pick("You feel too hot.", "You feel like your blood is boiling.")]")
+ if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || unsafe)
+ Heat(M, A)
/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
- var/get_heat = (sqrt(max(21,21+A.totalTransmittable()*2)))+(sqrt(max(21,20+A.totalStageSpeed()*3)))
- M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
+ var/get_heat = 6 * power
+ if(!unsafe)
+ M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
+ else
+ M.bodytemperature += (get_heat * A.stage)
return 1
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index 90bfcbc6e3..5e430b3297 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -24,36 +24,53 @@ Bonus
transmittable = -4
level = 6
severity = 5
+ base_message_chance = 20
+ symptom_delay_min = 20
+ symptom_delay_max = 75
+ var/infective = FALSE
+
+/datum/symptom/fire/Start(datum/disease/advance/A)
+ ..()
+ if(A.properties["stage_rate"] >= 4)
+ power = 1.5
+ if(A.properties["stage_rate"] >= 8)
+ power = 2
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.properties["transmittable"] >= 8) //burning skin spreads the virus through smoke
+ infective = TRUE
/datum/symptom/fire/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(3)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(3)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]")
- if(4)
- Firestacks_stage_4(M, A)
- M.IgniteMob()
- to_chat(M, "Your skin bursts into flames!")
- M.emote("scream")
- if(5)
- Firestacks_stage_5(M, A)
- M.IgniteMob()
- to_chat(M, "Your skin erupts into an inferno!")
- M.emote("scream")
- return
+ if(4)
+ Firestacks_stage_4(M, A)
+ M.IgniteMob()
+ to_chat(M, "Your skin bursts into flames!")
+ M.emote("scream")
+ if(5)
+ Firestacks_stage_5(M, A)
+ M.IgniteMob()
+ to_chat(M, "Your skin erupts into an inferno!")
+ M.emote("scream")
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(20+A.totalStageSpeed()*2))-(sqrt(max(0, 16+A.totalStealth())))
- M.adjust_fire_stacks(get_stacks)
- M.adjustFireLoss(get_stacks/2)
+ M.adjust_fire_stacks(1 * power)
+ M.adjustFireLoss(3 * power)
+ if(infective)
+ A.spread(A.holder, 2)
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(max(0, 20+A.totalStageSpeed()*3)))-(sqrt(max(0, 16+A.totalStealth())))
- M.adjust_fire_stacks(get_stacks)
- M.adjustFireLoss(get_stacks)
+ M.adjust_fire_stacks(3 * power)
+ M.adjustFireLoss(5 * power)
+ if(infective)
+ A.spread(A.holder, 4)
return 1
/*
@@ -83,40 +100,58 @@ Bonus
transmittable = -2
level = 7
severity = 6
+ base_message_chance = 100
+ symptom_delay_min = 30
+ symptom_delay_max = 90
+ var/chems = FALSE
+ var/explosion_power = 1
+
+/datum/symptom/alkali/Start(datum/disease/advance/A)
+ ..()
+ if(A.properties["resistance"] >= 9) //intense but sporadic effect
+ power = 2
+ symptom_delay_min = 50
+ symptom_delay_max = 140
+ if(A.properties["stage_rate"] >= 8) //serious boom when wet
+ explosion_power = 2
+ if(A.properties["transmission"] >= 8) //extra chemicals
+ chems = TRUE
/datum/symptom/alkali/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(3)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(3)
+ if(prob(base_message_chance))
to_chat(M, "[pick("Your veins boil.", "You feel hot.", "You smell meat cooking.")]")
- if(4)
- Alkali_fire_stage_4(M, A)
- M.IgniteMob()
- to_chat(M, "Your sweat bursts into flames!")
- M.emote("scream")
- if(5)
+ if(4)
+ Alkali_fire_stage_4(M, A)
+ M.IgniteMob()
+ to_chat(M, "Your sweat bursts into flames!")
+ M.emote("scream")
+ if(5)
+ Alkali_fire_stage_5(M, A)
+ M.IgniteMob()
+ to_chat(M, "Your skin erupts into an inferno!")
+ M.emote("scream")
+ if(M.fire_stacks < 0)
+ M.visible_message("[M]'s sweat sizzles and pops on contact with water!")
+ explosion(get_turf(M),0,0,2 * explosion_power)
Alkali_fire_stage_5(M, A)
- M.IgniteMob()
- to_chat(M, "Your skin erupts into an inferno!")
- M.emote("scream")
- if(M.fire_stacks < 0)
- M.visible_message("[M]'s sweat sizzles and pops on contact with water!")
- explosion(M.loc,0,0,2)
- Alkali_fire_stage_5(M, A)
- return
/datum/symptom/alkali/proc/Alkali_fire_stage_4(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(20+A.totalStageSpeed()*5))
+ var/get_stacks = 6 * power
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks/2)
- M.reagents.add_reagent("clf3", 1)
+ if(chems)
+ M.reagents.add_reagent("clf3", 2 * power)
return 1
/datum/symptom/alkali/proc/Alkali_fire_stage_5(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(20+A.totalStageSpeed()*8))
+ var/get_stacks = 8 * power
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
- M.reagents.add_reagent_list(list("napalm" = 3, "clf3" = 3))
+ if(chems)
+ M.reagents.add_reagent_list(list("napalm" = 4 * power, "clf3" = 4 * power))
return 1
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index a819560ee1..838d4481b5 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -24,22 +24,40 @@ Bonus
transmittable = -4
level = 6
severity = 5
+ base_message_chance = 50
+ symptom_delay_min = 15
+ symptom_delay_max = 60
+ var/bleed = FALSE
+ var/pain = FALSE
-/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
+/datum/symptom/flesh_eating/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(2,3)
+ if(A.properties["resistance"] >= 7) //extra bleeding
+ bleed = TRUE
+ if(A.properties["transmittable"] >= 8) //extra stamina damage
+ pain = TRUE
+
+/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(2,3)
+ if(prob(base_message_chance))
to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]")
- if(4,5)
- to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]")
- Flesheat(M, A)
- return
+ if(4,5)
+ to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]")
+ Flesheat(M, A)
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
- var/get_damage = ((sqrt(16-A.totalStealth()))*5)
+ var/get_damage = rand(15,25) * power
M.adjustBruteLoss(get_damage)
+ if(pain)
+ M.adjustStaminaLoss(get_damage)
+ if(bleed)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.bleed_rate += 5 * power
return 1
/*
@@ -68,21 +86,37 @@ Bonus
transmittable = -2
level = 7
severity = 6
+ base_message_chance = 50
+ symptom_delay_min = 3
+ symptom_delay_max = 6
+ var/chems = FALSE
+ var/zombie = FALSE
-/datum/symptom/flesh_death/Activate(datum/disease/advance/A)
+/datum/symptom/flesh_death/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(2,3)
+ if(A.properties["stealth"] >= 5)
+ suppress_warning = TRUE
+ if(A.properties["stage_rate"] >= 7) //bleeding and hunger
+ chems = TRUE
+
+/datum/symptom/flesh_death/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(2,3)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("You feel your body break apart.", "Your skin rubs off like dust.")]")
- if(4,5)
- to_chat(M, "[pick("You feel your muscles weakening.", "Your skin begins detaching itself.", "You feel sandy.")]")
- Flesh_death(M, A)
- return
+ if(4,5)
+ if(prob(base_message_chance / 2)) //reduce spam
+ to_chat(M, "[pick("You feel your muscles weakening.", "Some of your skin detaches itself.", "You feel sandy.")]")
+ Flesh_death(M, A)
/datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A)
- var/get_damage = ((sqrt(16-A.totalStealth()))*6)
+ var/get_damage = rand(6,10)
M.adjustBruteLoss(get_damage)
- M.reagents.add_reagent_list(list("heparin" = 5, "lipolicide" = 5))
+ if(chems)
+ M.reagents.add_reagent_list(list("heparin" = 2, "lipolicide" = 2))
+ if(zombie)
+ M.reagents.add_reagent("romerol", 1)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm
index a900dbb7c8..0b6ea5f808 100644
--- a/code/datums/diseases/advance/symptoms/genetics.dm
+++ b/code/datums/diseases/advance/symptoms/genetics.dm
@@ -26,22 +26,34 @@ Bonus
severity = 3
var/list/possible_mutations
var/archived_dna = null
+ base_message_chance = 50
+ symptom_delay_min = 60
+ symptom_delay_max = 120
+ var/no_reset = FALSE
/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB * 3)) // 15% chance
- 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)
+ 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)
- return
// Archive their DNA before they were infected.
/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
+ ..()
+ 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.mutations_list[RACEMUT]
var/mob/living/carbon/M = A.affected_mob
if(M)
@@ -51,9 +63,10 @@ Bonus
// Give them back their old DNA when cured.
/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
- var/mob/living/carbon/M = A.affected_mob
- if(M && archived_dna)
- if(!M.has_dna())
- return
- M.dna.struc_enzymes = archived_dna
- M.domutcheck()
+ if(!no_reset)
+ var/mob/living/carbon/M = A.affected_mob
+ if(M && archived_dna)
+ if(!M.has_dna())
+ return
+ M.dna.struc_enzymes = archived_dna
+ M.domutcheck()
diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm
index 0c42101ea1..f913d49573 100644
--- a/code/datums/diseases/advance/symptoms/hallucigen.dm
+++ b/code/datums/diseases/advance/symptoms/hallucigen.dm
@@ -24,18 +24,39 @@ Bonus
transmittable = -1
level = 5
severity = 3
+ base_message_chance = 25
+ symptom_delay_min = 25
+ symptom_delay_max = 90
+ var/fake_healthy = FALSE
-/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
+/datum/symptom/hallucigen/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(1, 2)
- to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]")
- if(3, 4)
- to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]")
- else
- to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]")
- M.hallucination += 25
+ if(A.properties["stealth"] >= 4) //fake good symptom messages
+ fake_healthy = TRUE
+ base_message_chance = 50
+ if(A.properties["stage_rate"] >= 7) //stronger hallucinations
+ power = 2
- return
+/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ var/list/healthy_messages = list("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.",\
+ "Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")
+ switch(A.stage)
+ if(1, 2)
+ if(prob(base_message_chance))
+ if(!fake_healthy)
+ to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]")
+ else
+ to_chat(M, "[pick(healthy_messages)]")
+ if(3, 4)
+ if(prob(base_message_chance))
+ if(!fake_healthy)
+ to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]")
+ else
+ to_chat(M, "[pick(healthy_messages)]")
+ else
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]")
+ M.hallucination += (15 * power)
diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm
index 526ab93836..3baeedea19 100644
--- a/code/datums/diseases/advance/symptoms/headache.dm
+++ b/code/datums/diseases/advance/symptoms/headache.dm
@@ -25,10 +25,31 @@ BONUS
transmittable = 0
level = 1
severity = 1
+ base_message_chance = 100
+ symptom_delay_min = 15
+ symptom_delay_max = 30
-/datum/symptom/headache/Activate(datum/disease/advance/A)
+/datum/symptom/headache/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- to_chat(M, "[pick("Your head hurts.", "Your head starts pounding.")]")
- return
\ No newline at end of file
+ if(A.properties["stealth"] >= 4)
+ base_message_chance = 50
+ if(A.properties["stage_rate"] >= 6) //severe pain
+ power = 2
+ if(A.properties["stage_rate"] >= 9) //cluster headaches
+ symptom_delay_min = 30
+ symptom_delay_max = 60
+ power = 3
+
+/datum/symptom/headache/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ if(power < 2)
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("Your head hurts.", "Your head pounds.")]")
+ if(power >= 2)
+ to_chat(M, "[pick("Your head hurts a lot.", "Your head pounds incessantly.")]")
+ M.adjustStaminaLoss(25)
+ if(power >= 3)
+ to_chat(M, "[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]")
+ M.Stun(35)
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 8fc9e05fd1..5dcba57ca3 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -1,7 +1,41 @@
+/datum/symptom/heal
+ name = "Basic Healing (does nothing)" //warning for adminspawn viruses
+ stealth = 1
+ resistance = -4
+ stage_speed = -4
+ transmittable = -4
+ level = 0 //not obtainable
+ base_message_chance = 20 //here used for the overlays
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/hide_healing = FALSE
+
+/datum/symptom/heal/Start(datum/disease/advance/A)
+ ..()
+ if(A.properties["stealth"] >= 4) //invisible healing
+ hide_healing = TRUE
+ if(A.properties["stage_rate"] >= 6) //stronger healing
+ power = 2
+ if(A.properties["stage_rate"] >= 11) //even stronger healing
+ power = 3
+
+/datum/symptom/heal/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ //100% chance to activate for slow but consistent healing
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ Heal(M, A)
+ return
+
+/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
+ return 1
+
/*
//////////////////////////////////////
-Healing
+Toxin Filter
Little bit hidden.
Lowers resistance tremendously.
@@ -15,8 +49,7 @@ Bonus
//////////////////////////////////////
*/
-/datum/symptom/heal
-
+/datum/symptom/heal/toxin
name = "Toxic Filter"
stealth = 1
resistance = -4
@@ -24,18 +57,9 @@ Bonus
transmittable = -4
level = 6
-/datum/symptom/heal/Activate(datum/disease/advance/A)
- ..()
- //100% chance to activate for slow but consistent healing
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- Heal(M, A)
- return
-
-/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
- var/heal_amt = 0.5
- if(M.toxloss > 0 && prob(20))
+/datum/symptom/heal/toxin/Heal(mob/living/M, datum/disease/advance/A)
+ var/heal_amt = 0.5 * power
+ if(M.toxloss > 0 && prob(base_message_chance) && !hide_healing)
new /obj/effect/temp_visual/heal(get_turf(M), "#66FF99")
M.adjustToxLoss(-heal_amt)
return 1
@@ -55,7 +79,7 @@ Bonus
//////////////////////////////////////
*/
-/datum/symptom/heal/plus
+/datum/symptom/heal/toxin/plus
name = "Apoptoxin filter"
stealth = 0
@@ -64,9 +88,9 @@ Bonus
transmittable = -2
level = 8
-/datum/symptom/heal/plus/Heal(mob/living/M, datum/disease/advance/A)
- var/heal_amt = 1
- if(M.toxloss > 0 && prob(20))
+/datum/symptom/heal/toxin/plus/Heal(mob/living/M, datum/disease/advance/A)
+ var/heal_amt = 1 * power
+ if(M.toxloss > 0 && prob(base_message_chance) && !hide_healing)
new /obj/effect/temp_visual/heal(get_turf(M), "#00FF00")
M.adjustToxLoss(-heal_amt)
return 1
@@ -98,7 +122,7 @@ Bonus
level = 6
/datum/symptom/heal/brute/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/heal_amt = 1
+ var/heal_amt = 1 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
@@ -109,7 +133,7 @@ Bonus
if(L.heal_damage(heal_amt/parts.len, 0))
M.update_damage_overlays()
- if(prob(20))
+ if(prob(base_message_chance) && !hide_healing)
new /obj/effect/temp_visual/heal(get_turf(M), "#FF3333")
return 1
@@ -141,14 +165,15 @@ Bonus
level = 8
/datum/symptom/heal/brute/plus/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/heal_amt = 2
+ var/heal_amt = 2 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
if(M.getCloneLoss() > 0)
M.adjustCloneLoss(-1)
M.take_bodypart_damage(0, 1) //Deals BURN damage, which is not cured by this symptom
- new /obj/effect/temp_visual/heal(get_turf(M), "#33FFCC")
+ if(!hide_healing)
+ new /obj/effect/temp_visual/heal(get_turf(M), "#33FFCC")
if(!parts.len)
return
@@ -157,7 +182,7 @@ Bonus
if(L.heal_damage(heal_amt/parts.len, 0))
M.update_damage_overlays()
- if(prob(20))
+ if(prob(base_message_chance) && !hide_healing)
new /obj/effect/temp_visual/heal(get_turf(M), "#CC1100")
return 1
@@ -189,7 +214,7 @@ Bonus
level = 6
/datum/symptom/heal/burn/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/heal_amt = 1
+ var/heal_amt = 1 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
@@ -200,7 +225,7 @@ Bonus
if(L.heal_damage(0, heal_amt/parts.len))
M.update_damage_overlays()
- if(prob(20))
+ if(prob(base_message_chance) && !hide_healing)
new /obj/effect/temp_visual/heal(get_turf(M), "#FF9933")
return 1
@@ -231,7 +256,7 @@ Bonus
level = 8
/datum/symptom/heal/burn/plus/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/heal_amt = 2
+ var/heal_amt = 2 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
@@ -247,7 +272,7 @@ Bonus
if(L.heal_damage(0, heal_amt/parts.len))
M.update_damage_overlays()
- if(prob(20))
+ if(prob(base_message_chance) && !hide_healing)
new /obj/effect/temp_visual/heal(get_turf(M), "#CC6600")
return 1
@@ -277,9 +302,11 @@ Bonus
stage_speed = 0
transmittable = -3
level = 5
+ symptom_delay_min = 3
+ symptom_delay_max = 8
/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/amt_healed = 1
+ var/amt_healed = 1 * power
M.adjustBrainLoss(-amt_healed)
//Non-power mutations, excluding race, so the virus does not force monkey -> human transformations.
var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) - GLOB.mutations_list[RACEMUT]
diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm
index 8563520b09..880ac1f3e6 100644
--- a/code/datums/diseases/advance/symptoms/itching.dm
+++ b/code/datums/diseases/advance/symptoms/itching.dm
@@ -25,10 +25,23 @@ BONUS
transmittable = 1
level = 1
severity = 1
+ symptom_delay_min = 5
+ symptom_delay_max = 25
+ var/scratch = FALSE
-/datum/symptom/itching/Activate(datum/disease/advance/A)
+/datum/symptom/itching/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- to_chat(M, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.")
- return
\ No newline at end of file
+ if(A.properties["transmittable"] >= 6) //itch more often
+ symptom_delay_min = 1
+ symptom_delay_max = 4
+ if(A.properties["stage_rate"] >= 7) //scratch
+ scratch = TRUE
+
+/datum/symptom/itching/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ var/can_scratch = scratch && !M.incapacitated()
+ to_chat(M, "Your [pick("back", "arm", "leg", "elbow", "head")] itches. [can_scratch ? " You scratch it." : ""]")
+ if(can_scratch)
+ M.adjustBruteLoss(0.5)
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm
new file mode 100644
index 0000000000..a5a2bd7a4c
--- /dev/null
+++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm
@@ -0,0 +1,89 @@
+
+/*
+//////////////////////////////////////
+Narcolepsy
+ Noticeable.
+ Lowers resistance
+ Decreases stage speed tremendously.
+ Decreases transmittablity tremendously.
+
+Bonus
+ Causes drowsiness and sleep.
+
+//////////////////////////////////////
+*/
+/datum/symptom/narcolepsy
+ name = "Narcolepsy"
+ stealth = -1
+ resistance = -2
+ stage_speed = -3
+ transmittable = -4
+ level = 6
+ symptom_delay_min = 15
+ symptom_delay_max = 80
+ severity = 5
+ var/sleep_level = 0
+ var/sleepy_ticks = 0
+ var/stamina = FALSE
+
+/datum/symptom/narcolepsy/Start(datum/disease/advance/A)
+ ..()
+ if(A.properties["transmittable"] >= 7) //stamina damage
+ stamina = TRUE
+ if(A.properties["resistance"] >= 10) //act more often
+ symptom_delay_min = 10
+ symptom_delay_max = 60
+
+/datum/symptom/narcolepsy/Activate(var/datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ //this ticks even when on cooldown
+ switch(sleep_level) //Works sorta like morphine
+ if(10 to 19)
+ M.drowsyness += 1
+ if(20 to INFINITY)
+ M.Sleeping(30, 0)
+ sleep_level = 0
+ sleepy_ticks = 0
+
+ if(sleepy_ticks && A.stage>=5)
+ sleep_level++
+ sleepy_ticks--
+ else
+ sleep_level = 0
+
+ if(!..())
+ return
+
+ switch(A.stage)
+ if(1)
+ if(prob(10))
+ to_chat(M, "You feel tired.")
+ if(2)
+ if(prob(10))
+ to_chat(M, "You feel very tired.")
+ sleepy_ticks += rand(10,14)
+ if(stamina)
+ M.adjustStaminaLoss(10)
+ if(3)
+ if(prob(15))
+ to_chat(M, "You try to focus on staying awake.")
+ sleepy_ticks += rand(10,14)
+ if(stamina)
+ M.adjustStaminaLoss(15)
+ if(4)
+ if(prob(20))
+ to_chat(M, "You nod off for a moment.")
+ sleepy_ticks += rand(10,14)
+ if(stamina)
+ M.adjustStaminaLoss(20)
+ if(5)
+ if(prob(25))
+ to_chat(M, "[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(stamina)
+ M.adjustStaminaLoss(30)
+
+
+
+
diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm
index 99866a3544..70d41363f5 100644
--- a/code/datums/diseases/advance/symptoms/oxygen.dm
+++ b/code/datums/diseases/advance/symptoms/oxygen.dm
@@ -23,16 +23,27 @@ Bonus
stage_speed = -3
transmittable = -4
level = 6
+ base_message_chance = 5
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/regenerate_blood = FALSE
-/datum/symptom/oxygen/Activate(datum/disease/advance/A)
+/datum/symptom/oxygen/Start(datum/disease/advance/A)
..()
- var/mob/living/M = A.affected_mob
+ 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(-3, 0)
- if(M.losebreath >= 4)
- M.losebreath -= 2
+ M.losebreath = max(0, M.losebreath - 2)
+ if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL)
+ M.blood_volume += 1
else
- if(prob(SYMPTOM_ACTIVATION_PROB * 3))
+ 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
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm.rej b/code/datums/diseases/advance/symptoms/sensory.dm.rej
new file mode 100644
index 0000000000..fbf27328fa
--- /dev/null
+++ b/code/datums/diseases/advance/symptoms/sensory.dm.rej
@@ -0,0 +1,134 @@
+diff a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm (rejected hunks)
+@@ -23,106 +23,43 @@ Bonus
+ transmittable = -3
+ level = 5
+ severity = 0
++ symptom_delay_min = 5
++ symptom_delay_max = 10
++ var/purge_alcohol = FALSE
++ var/brain_heal = FALSE
+
+-/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
++/datum/symptom/sensory_restoration/Start(datum/disease/advance/A)
+ ..()
++ if(A.properties["resistance"] >= 6) //heal brain damage
++ brain_heal = TRUE
++ if(A.properties["transmittable"] >= 8) //purge alcohol
++ purge_alcohol = TRUE
++
++/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
++ if(!..())
++ return
+ var/mob/living/M = A.affected_mob
+ if(A.stage >= 2)
+ M.restoreEars()
+
+ if(A.stage >= 3)
+- M.dizziness = 0
+- M.drowsyness = 0
+- M.slurring = 0
+- M.confused = 0
+- M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3)
+- if(ishuman(M))
+- var/mob/living/carbon/human/H = M
+- H.drunkenness = max(H.drunkenness - 10, 0)
++ M.dizziness = max(0, M.dizziness - 2)
++ M.drowsyness = max(0, M.drowsyness - 2)
++ M.slurring = max(0, M.slurring - 2)
++ M.confused = max(0, M.confused - 2)
++ if(purge_alcohol)
++ M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3)
++ if(ishuman(M))
++ var/mob/living/carbon/human/H = M
++ H.drunkenness = max(H.drunkenness - 5, 0)
+
+ if(A.stage >= 4)
+- M.drowsyness = max(M.drowsyness-5, 0)
++ M.drowsyness = max(0, M.drowsyness - 2)
+ if(M.reagents.has_reagent("mindbreaker"))
+ M.reagents.remove_reagent("mindbreaker", 5)
+ if(M.reagents.has_reagent("histamine"))
+ M.reagents.remove_reagent("histamine", 5)
+ M.hallucination = max(0, M.hallucination - 10)
+
+- if(A.stage >= 5)
+- M.adjustBrainLoss(-3)
+-
+-/*
+-//////////////////////////////////////
+-Sensory-Destruction
+- noticable.
+- Lowers resistance
+- Decreases stage speed tremendously.
+- Decreases transmittablity tremendously.
+- the drugs hit them so hard they have to focus on not dying
+-
+-Bonus
+- The body generates Sensory destructive chemicals.
+- You cannot taste anything anymore.
+- ethanol for extremely drunk victim
+- mindbreaker to break the mind
+- impedrezene to ruin the brain
+-
+-//////////////////////////////////////
+-*/
+-/datum/symptom/sensory_destruction
+- name = "Sensory destruction"
+- stealth = -1
+- resistance = -2
+- stage_speed = -3
+- transmittable = -4
+- level = 6
+- severity = 5
+- var/sleepy = 0
+- var/sleepy_ticks = 0
+-
+-/datum/symptom/sensory_destruction/Activate(var/datum/disease/advance/A)
+- ..()
+- var/mob/living/M = A.affected_mob
+- if(prob(SYMPTOM_ACTIVATION_PROB))
+- switch(A.stage)
+- if(1)
+- to_chat(M, "You can't feel anything.")
+- if(2)
+- to_chat(M, "You feel absolutely hammered.")
+- if(prob(10))
+- sleepy_ticks += rand(10,14)
+- if(3)
+- M.reagents.add_reagent("ethanol",rand(5,7))
+- to_chat(M, "You try to focus on not dying.")
+- if(prob(15))
+- sleepy_ticks += rand(10,14)
+- if(4)
+- M.reagents.add_reagent("ethanol",rand(6,10))
+- to_chat(M, "u can count 2 potato!")
+- if(prob(20))
+- sleepy_ticks += rand(10,14)
+- if(5)
+- M.reagents.add_reagent("ethanol",rand(7,13))
+- if(prob(25))
+- sleepy_ticks += rand(10,14)
+-
+- if(sleepy_ticks)
+- if(A.stage>=4)
+- M.hallucination = min(M.hallucination + 10, 50)
+- if(A.stage>=5)
+- if(prob(80))
+- M.adjustBrainLoss(1)
+- if(prob(50))
+- M.drowsyness = max(M.drowsyness, 3)
+- sleepy++
+- sleepy_ticks--
+- else
+- sleepy = 0
+-
+- switch(sleepy) //Works like morphine
+- if(11)
+- to_chat(M, "You start to feel tired...")
+- if(12 to 24)
+- M.drowsyness += 1
+- if(24 to INFINITY)
+- M.Sleeping(2, 0)
++ if(brain_heal && A.stage >= 5)
++ M.adjustBrainLoss(-3)
+\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm
index 44c241a25f..cf88fcf6db 100644
--- a/code/datums/diseases/advance/symptoms/shedding.dm
+++ b/code/datums/diseases/advance/symptoms/shedding.dm
@@ -2,8 +2,8 @@
//////////////////////////////////////
Alopecia
- Noticable.
- Decreases resistance slightly.
+ Not Noticeable.
+ Increases resistance slightly.
Reduces stage speed slightly.
Transmittable.
Intense Level.
@@ -17,29 +17,34 @@ BONUS
/datum/symptom/shedding
name = "Alopecia"
- stealth = -1
- resistance = -1
+ stealth = 0
+ resistance = 1
stage_speed = -1
- transmittable = 2
+ transmittable = 3
level = 4
severity = 1
+ base_message_chance = 50
+ symptom_delay_min = 45
+ symptom_delay_max = 90
/datum/symptom/shedding/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
+ if(!..())
+ return
+
+ var/mob/living/M = A.affected_mob
+ if(prob(base_message_chance))
to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]")
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- switch(A.stage)
- if(3, 4)
- if(!(H.hair_style == "Bald") && !(H.hair_style == "Balding Hair"))
- to_chat(H, "Your hair starts to fall out in clumps...")
- addtimer(CALLBACK(src, .proc/Shed, H, FALSE), 50)
- if(5)
- if(!(H.facial_hair_style == "Shaved") || !(H.hair_style == "Bald"))
- to_chat(H, "Your hair starts to fall out in clumps...")
- addtimer(CALLBACK(src, .proc/Shed, H, TRUE), 50)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ switch(A.stage)
+ if(3, 4)
+ if(!(H.hair_style == "Bald") && !(H.hair_style == "Balding Hair"))
+ to_chat(H, "Your hair starts to fall out in clumps...")
+ addtimer(CALLBACK(src, .proc/Shed, H, FALSE), 50)
+ if(5)
+ if(!(H.facial_hair_style == "Shaved") || !(H.hair_style == "Bald"))
+ to_chat(H, "Your hair starts to fall out in clumps...")
+ addtimer(CALLBACK(src, .proc/Shed, H, TRUE), 50)
/datum/symptom/shedding/proc/Shed(mob/living/carbon/human/H, fullbald)
if(fullbald)
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm
index a26a19de04..4c9ec94a2b 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -24,17 +24,33 @@ Bonus
transmittable = 2
level = 2
severity = 2
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/unsafe = FALSE //over the cold threshold
-/datum/symptom/shivering/Activate(datum/disease/advance/A)
+/datum/symptom/fever/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/carbon/M = A.affected_mob
- to_chat(M, "[pick("You feel cold.", "You start shivering.")]")
- if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
- Chill(M, A)
- return
+ if(A.properties["stage_speed"] >= 5) //dangerous cold
+ power = 1.5
+ unsafe = TRUE
+ if(A.properties["stage_speed"] >= 10)
+ power = 2.5
+
+/datum/symptom/shivering/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ if(!unsafe || A.stage < 4)
+ to_chat(M, "[pick("You feel cold.", "You shiver.")]")
+ else
+ to_chat(M, "[pick("You feel your blood run cold.", "You feel ice in your veins.", "You feel like you can't heat up.", "You shiver violently." )]")
+ if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT || unsafe)
+ Chill(M, A)
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
- var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2))
- M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
+ var/get_cold = 6 * power
+ if(!unsafe)
+ M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
+ else
+ M.bodytemperature -= (get_cold * A.stage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm
index bcd6f80e13..09eea77520 100644
--- a/code/datums/diseases/advance/symptoms/skin.dm
+++ b/code/datums/diseases/advance/symptoms/skin.dm
@@ -23,23 +23,23 @@ BONUS
transmittable = -2
level = 5
severity = 1
+ symptom_delay_min = 25
+ symptom_delay_max = 75
/datum/symptom/vitiligo/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.skin_tone == "albino")
- return
- switch(A.stage)
- if(5)
- H.skin_tone = "albino"
- H.update_body(0)
- else
- H.visible_message("[H] looks a bit pale...", "Your skin suddenly appears lighter...")
-
- return
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.skin_tone == "albino")
+ return
+ switch(A.stage)
+ if(5)
+ H.skin_tone = "albino"
+ H.update_body(0)
+ else
+ H.visible_message("[H] looks a bit pale...", "Your skin suddenly appears lighter...")
/*
@@ -67,20 +67,20 @@ BONUS
transmittable = -2
level = 5
severity = 1
+ symptom_delay_min = 7
+ symptom_delay_max = 14
/datum/symptom/revitiligo/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.skin_tone == "african2")
- return
- switch(A.stage)
- if(5)
- H.skin_tone = "african2"
- H.update_body(0)
- else
- H.visible_message("[H] looks a bit dark...", "Your skin suddenly appears darker...")
-
- return
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.skin_tone == "african2")
+ return
+ switch(A.stage)
+ if(5)
+ H.skin_tone = "african2"
+ H.update_body(0)
+ else
+ H.visible_message("[H] looks a bit dark...", "Your skin suddenly appears darker...")
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 9413eea5db..43caf6d34e 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -17,7 +17,6 @@ Bonus
*/
/datum/symptom/sneeze
-
name = "Sneezing"
stealth = -2
resistance = 3
@@ -25,15 +24,24 @@ Bonus
transmittable = 4
level = 1
severity = 1
+ symptom_delay_min = 5
+ symptom_delay_max = 35
-/datum/symptom/sneeze/Activate(datum/disease/advance/A)
+/datum/symptom/sneeze/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3)
+ if(A.properties["transmittable"] >= 9) //longer spread range
+ power = 2
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+
+/datum/symptom/sneeze/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3)
+ if(!suppress_warning)
M.emote("sniff")
- else
- M.emote("sneeze")
- A.spread(A.holder, 5)
- return
\ No newline at end of file
+ else
+ M.emote("sneeze")
+ A.spread(A.holder, 4 + power)
\ 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 44d7db5709..1e60485a1e 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -13,7 +13,18 @@
var/severity = 0
// The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!!
var/id = ""
- var/static/SYMPTOM_ACTIVATION_PROB = 5
+ //Base chance of sending warning messages, so it can be modified
+ var/base_message_chance = 10
+ //If the early warnings are suppressed or not
+ var/suppress_warning = FALSE
+ //Ticks between each activation
+ var/symptom_counter = 0
+ var/symptom_delay_min = 1
+ var/symptom_delay_max = 1
+ //Can be used to multiply virus effects
+ var/power = 1
+ //A neutered symptom has no effect, and only affects statistics.
+ var/neutered = FALSE
/datum/symptom/New()
var/list/S = SSdisease.list_symptoms
@@ -25,6 +36,7 @@
// Called when processing of the advance disease, which holds this symptom, starts.
/datum/symptom/proc/Start(datum/disease/advance/A)
+ symptom_counter = rand(symptom_delay_min, symptom_delay_max)
return
// Called when the advance disease is going to be deleted or when the advance disease stops processing.
@@ -32,5 +44,18 @@
return
/datum/symptom/proc/Activate(datum/disease/advance/A)
- return
+ if(neutered)
+ return FALSE
+ if(symptom_counter)
+ symptom_counter--
+ return FALSE
+ else
+ symptom_counter = rand(symptom_delay_min, symptom_delay_max)
+ 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
diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm
index 3f75ad5196..49bb2d674c 100644
--- a/code/datums/diseases/advance/symptoms/viral.dm
+++ b/code/datums/diseases/advance/symptoms/viral.dm
@@ -21,16 +21,6 @@ BONUS
transmittable = 0
level = 3
-/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1)
- to_chat(M, "You feel off, but no different from before.")
- if(5)
- to_chat(M, "You feel better, but nothing interesting happens.")
-
/*
//////////////////////////////////////
Viral evolution
@@ -54,29 +44,19 @@ BONUS
transmittable = 3
level = 3
-/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1)
- to_chat(M, "You feel better, but no different from before.")
- if(5)
- to_chat(M, "You feel off, but nothing interesting happens.")
-
/*
//////////////////////////////////////
-Viral aggressive metabolism (ex-Longevity)
+Viral aggressive metabolism
- No stealth.
+ Reduced stealth.
Small resistance boost.
- Reduced stage speed.
- Large transmittablity boost.
- High Level.
+ Increased stage speed.
+ Small transmittablity boost.
+ Medium Level.
Bonus
- The virus starts at stage 5 and decrease over time until it self cures.
+ The virus starts at stage 5, but after a certain time will start curing itself.
Stages still increase naturally with stage speed.
//////////////////////////////////////
@@ -85,23 +65,33 @@ Bonus
/datum/symptom/viralreverse
name = "Viral aggressive metabolism"
- stealth = 0
+ stealth = -2
resistance = 1
- stage_speed = -2
- transmittable = 3
+ stage_speed = 3
+ transmittable = 1
level = 3
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/time_to_cure
/datum/symptom/viralreverse/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
+ if(!..())
+ return
+ if(time_to_cure > 0)
+ time_to_cure--
+ else
var/mob/living/M = A.affected_mob
Heal(M, A)
- return
/datum/symptom/viralreverse/proc/Heal(mob/living/M, datum/disease/advance/A)
A.stage -= 1
if(A.stage < 2)
+ to_chat(M, "You suddenly feel healthy.")
A.cure()
/datum/symptom/viralreverse/Start(datum/disease/advance/A)
+ ..()
A.stage = 5
+ if(A.properties["stealth"] >= 4) //more time before it's cured
+ power = 2
+ time_to_cure = max(A.properties["resistance"], A.properties["stage_rate"]) * 10 * power
diff --git a/code/datums/diseases/advance/symptoms/vision.dm.rej b/code/datums/diseases/advance/symptoms/vision.dm.rej
new file mode 100644
index 0000000000..e9cb0cd6d8
--- /dev/null
+++ b/code/datums/diseases/advance/symptoms/vision.dm.rej
@@ -0,0 +1,19 @@
+diff a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm (rejected hunks)
+@@ -40,7 +40,7 @@ Bonus
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+- var/obj/item/organ/eyes = M.getorganslot("eye_sight")
++ var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight")
+ if(istype(eyes))
+ switch(A.stage)
+ if(1, 2)
+@@ -55,7 +55,7 @@ Bonus
+ M.adjust_eye_damage(5)
+ if(eyes.eye_damage >= 10)
+ M.become_nearsighted()
+- if(prob(M.eye_damage - 10 + 1))
++ if(prob(eyes.eye_damage - 10 + 1))
+ if(!remove_eyes)
+ if(M.become_blind())
+ to_chat(M, "You go blind!")
diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm
index 2731612322..3abeb42f03 100644
--- a/code/datums/diseases/advance/symptoms/voice_change.dm
+++ b/code/datums/diseases/advance/symptoms/voice_change.dm
@@ -3,10 +3,10 @@
Voice Change
- Very Very noticable.
- Lowers resistance considerably.
+ Noticeable.
+ Lowers resistance.
Decreases stage speed.
- Reduced transmittable.
+ Increased transmittable.
Fatal Level.
Bonus
@@ -18,31 +18,59 @@ Bonus
/datum/symptom/voice_change
name = "Voice Change"
- stealth = -2
- resistance = -3
- stage_speed = -3
- transmittable = -1
+ stealth = -1
+ resistance = -2
+ stage_speed = -2
+ transmittable = 2
level = 6
severity = 2
+ base_message_chance = 100
+ symptom_delay_min = 60
+ symptom_delay_max = 120
+ var/scramble_language = FALSE
+ var/datum/language/current_language
+ var/datum/language_holder/original_language
-/datum/symptom/voice_change/Activate(datum/disease/advance/A)
+/datum/symptom/voice_change/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
+ if(A.properties["stealth"] >= 3)
+ suppress_warning = TRUE
+ if(A.properties["stage_rate"] >= 7) //faster change of voice
+ base_message_chance = 25
+ symptom_delay_min = 25
+ symptom_delay_max = 85
+ if(A.properties["transmittable"] >= 14) //random language
+ scramble_language = TRUE
+ var/mob/living/M = A.affected_mob
+ var/datum/language_holder/mob_language = M.get_language_holder()
+ original_language = mob_language.copy()
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
+/datum/symptom/voice_change/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "[pick("Your throat hurts.", "You clear your throat.")]")
- else
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.SetSpecialVoice(H.dna.species.random_name(H.gender))
-
- return
+ else
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.SetSpecialVoice(H.dna.species.random_name(H.gender))
+ if(scramble_language)
+ H.remove_language(current_language)
+ current_language = pick(subtypesof(/datum/language) - /datum/language/common)
+ H.grant_language(current_language)
+ var/datum/language_holder/mob_language = H.get_language_holder()
+ mob_language.only_speaks_language = current_language
/datum/symptom/voice_change/End(datum/disease/advance/A)
..()
if(ishuman(A.affected_mob))
var/mob/living/carbon/human/H = A.affected_mob
H.UnsetSpecialVoice()
- return
+ if(scramble_language)
+ var/mob/living/M = A.affected_mob
+ M.copy_known_languages_from(original_language, TRUE)
+ current_language = null
+ QDEL_NULL(original_language)
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm.rej b/code/datums/diseases/advance/symptoms/vomit.dm.rej
new file mode 100644
index 0000000000..b6fd999e2f
--- /dev/null
+++ b/code/datums/diseases/advance/symptoms/vomit.dm.rej
@@ -0,0 +1,30 @@
+diff a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm (rejected hunks)
+@@ -32,7 +32,7 @@ Bonus
+ symptom_delay_min = 25
+ symptom_delay_max = 80
+ var/vomit_blood = FALSE
+- var/proj_vomit = FALSE
++ var/proj_vomit = 0
+
+ /datum/symptom/vomit/Start(datum/disease/advance/A)
+ ..()
+@@ -41,7 +41,7 @@ Bonus
+ if(A.properties["resistance"] >= 7) //blood vomit
+ vomit_blood = TRUE
+ if(A.properties["transmittable"] >= 7) //projectile vomit
+- proj_vomit = TRUE
++ proj_vomit = 5
+
+ /datum/symptom/vomit/Activate(datum/disease/advance/A)
+ if(!..())
+@@ -52,7 +52,7 @@ Bonus
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("You feel nauseous.", "You feel like you're going to throw up!")]")
+ else
+- Vomit(M)
++ vomit(M)
+
+-/datum/symptom/vomit/proc/Vomit(mob/living/carbon/M)
+- M.vomit(20, vomit_blood, distance = 5 * proj_vomit)
++/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
++ M.vomit(20, vomit_blood, distance = proj_vomit)
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm
index 399a67675e..ec371f1167 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/advance/symptoms/weight.dm
@@ -24,20 +24,26 @@ Bonus
transmittable = -2
level = 4
severity = 1
+ base_message_chance = 100
+ symptom_delay_min = 15
+ symptom_delay_max = 45
-/datum/symptom/weight_gain/Activate(datum/disease/advance/A)
+/datum/symptom/weight_gain/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
- to_chat(M, "[pick("You feel blubbery.", "Your stomach hurts.")]")
- else
- M.overeatduration = min(M.overeatduration + 100, 600)
- M.nutrition = min(M.nutrition + 100, NUTRITION_LEVEL_FULL)
-
- return
+ if(A.properties["stealth"] >= 4) //warn less often
+ base_message_chance = 25
+/datum/symptom/weight_gain/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("You feel blubbery.", "Your stomach hurts.")]")
+ else
+ M.overeatduration = min(M.overeatduration + 100, 600)
+ M.nutrition = min(M.nutrition + 100, NUTRITION_LEVEL_FULL)
/*
//////////////////////////////////////
@@ -66,20 +72,27 @@ Bonus
transmittable = -2
level = 3
severity = 1
+ base_message_chance = 100
+ symptom_delay_min = 15
+ symptom_delay_max = 45
-/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
+/datum/symptom/weight_loss/Start(datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
- to_chat(M, "[pick("You feel hungry.", "You crave for food.")]")
- else
- to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]")
- M.overeatduration = max(M.overeatduration - 100, 0)
- M.nutrition = max(M.nutrition - 100, 0)
+ if(A.properties["stealth"] >= 4) //warn less often
+ base_message_chance = 25
- return
+/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("You feel hungry.", "You crave for food.")]")
+ else
+ to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]")
+ M.overeatduration = max(M.overeatduration - 100, 0)
+ M.nutrition = max(M.nutrition - 100, 0)
/*
//////////////////////////////////////
@@ -108,14 +121,14 @@ Bonus
stage_speed = -2
transmittable = -2
level = 4
+ symptom_delay_min = 5
+ symptom_delay_max = 5
/datum/symptom/weight_even/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- M.overeatduration = 0
- M.nutrition = NUTRITION_LEVEL_WELL_FED + 50
-
- return
\ No newline at end of file
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ M.overeatduration = 0
+ M.nutrition = NUTRITION_LEVEL_WELL_FED + 50
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/advance/symptoms/youth.dm
index 794b15bb91..9793313354 100644
--- a/code/datums/diseases/advance/symptoms/youth.dm
+++ b/code/datums/diseases/advance/symptoms/youth.dm
@@ -23,33 +23,34 @@ BONUS
stage_speed = 4
transmittable = -4
level = 5
+ base_message_chance = 100
+ symptom_delay_min = 25
+ symptom_delay_max = 50
/datum/symptom/youth/Activate(datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB * 2))
- var/mob/living/M = A.affected_mob
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- switch(A.stage)
- if(1)
- if(H.age > 41)
- H.age = 41
- to_chat(H, "You haven't had this much energy in years!")
- if(2)
- if(H.age > 36)
- H.age = 36
- to_chat(H, "You're suddenly in a good mood.")
- if(3)
- if(H.age > 31)
- H.age = 31
- to_chat(H, "You begin to feel more lithe.")
- if(4)
- if(H.age > 26)
- H.age = 26
- to_chat(H, "You feel reinvigorated.")
- if(5)
- if(H.age > 21)
- H.age = 21
- to_chat(H, "You feel like you can take on the world!")
-
- return
\ No newline at end of file
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ switch(A.stage)
+ if(1)
+ if(H.age > 41)
+ H.age = 41
+ to_chat(H, "You haven't had this much energy in years!")
+ if(2)
+ if(H.age > 36)
+ H.age = 36
+ to_chat(H, "You're suddenly in a good mood.")
+ if(3)
+ if(H.age > 31)
+ H.age = 31
+ to_chat(H, "You begin to feel more lithe.")
+ if(4)
+ if(H.age > 26)
+ H.age = 26
+ to_chat(H, "You feel reinvigorated.")
+ if(5)
+ if(H.age > 21)
+ H.age = 21
+ to_chat(H, "You feel like you can take on the world!")
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index c4cf9a5e54..ecacc6d1c6 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -442,7 +442,8 @@
/obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1,
/obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1,
/obj/item/weapon/reagent_containers/glass/bottle/plasma = 1,
- /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1)
+ /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde = 1)
// ----------------------------
// Disk """fridge"""
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 8cdae1123d..4151a2695e 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -291,7 +291,7 @@
results = list("blood" = 1)
required_reagents = list("virusfood" = 1)
required_catalysts = list("blood" = 1)
- var/level_min = 0
+ var/level_min = 1
var/level_max = 2
/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume)
@@ -406,6 +406,21 @@
if(D)
D.Devolve()
+/datum/chemical_reaction/mix_virus/neuter_virus
+
+ name = "Neuter Virus"
+ id = "neutervirus"
+ required_reagents = list("formaldehyde" = 1)
+ required_catalysts = list("blood" = 1)
+
+/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, created_volume)
+
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
+ if(B && B.data)
+ var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
+ if(D)
+ D.Neuter()
+
////////////////////////////////// foam and foam precursor ///////////////////////////////////////////////////
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 37074b6d12..2325a9645e 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -101,6 +101,12 @@
icon_state = "bottle20"
list_reagents = list("synaptizine" = 30)
+/obj/item/weapon/reagent_containers/glass/bottle/formaldehyde
+ name = "formaldehyde bottle"
+ desc = "A small bottle of formaldehyde."
+ icon_state = "bottle20"
+ list_reagents = list("formaldehyde" = 30)
+
/obj/item/weapon/reagent_containers/glass/bottle/ammonia
name = "ammonia bottle"
desc = "A small bottle of ammonia."
diff --git a/tgstation.dme b/tgstation.dme
index 1daecfda5c..1efaeda81f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -310,6 +310,7 @@
#include "code\datums\diseases\advance\symptoms\headache.dm"
#include "code\datums\diseases\advance\symptoms\heal.dm"
#include "code\datums\diseases\advance\symptoms\itching.dm"
+#include "code\datums\diseases\advance\symptoms\narcolepsy.dm"
#include "code\datums\diseases\advance\symptoms\oxygen.dm"
#include "code\datums\diseases\advance\symptoms\sensory.dm"
#include "code\datums\diseases\advance\symptoms\shedding.dm"
@@ -321,7 +322,6 @@
#include "code\datums\diseases\advance\symptoms\vision.dm"
#include "code\datums\diseases\advance\symptoms\voice_change.dm"
#include "code\datums\diseases\advance\symptoms\vomit.dm"
-#include "code\datums\diseases\advance\symptoms\weakness.dm"
#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\diseases\advance\symptoms\youth.dm"
#include "code\datums\helper_datums\construction_datum.dm"