Merge pull request #211 from zeskorion/master

keepin beeviro porting consistent for ya
This commit is contained in:
Dahlular
2020-03-03 00:16:29 -07:00
committed by GitHub
28 changed files with 1124 additions and 1030 deletions
+2
View File
@@ -354,10 +354,12 @@
else
RemoveSymptom(pick(symptoms))
symptoms += S
S.OnAdd(src)
// Simply removes the symptom.
/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S)
symptoms -= S
S.OnRemove(src)
// Neuter a symptom, so it will only affect stats
/datum/disease/advance/proc/NeuterSymptom(datum/symptom/S)
@@ -2,7 +2,7 @@
name = "Bee Infestation"
desc = "Causes the host to cough toxin bees and occasionally synthesize toxin."
stealth = -2
resistance = 2
resistance = 14
stage_speed = 1
transmittable = 1
level = 9
@@ -11,14 +11,15 @@
symptom_delay_max = 20
var/honey = FALSE
var/toxic_bees= FALSE
threshold_desc = "<b>Resistance 14:</b> Host synthesizes honey instead of toxins, bees now sting with honey instead of toxin.<br>\
<b>Transmission 10:</b> Bees now contain a completely random toxin, unless resistance exceeds 14"
threshold_desc = "<b>Resistance 14:</b> The bees become symbiotic with the host, synthesizing honey and no longer stinging the stomach lining, and no longer attacking the host.<br>\
<b>Transmission 10:</b> Bees now contain a completely random toxin, unless resistance exceeds 14"
/datum/symptom/beesease/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["resistance"] >= 14)
honey = TRUE
severity = 0
if(A.properties["transmittable"] >= 10)
toxic_bees = TRUE
@@ -38,18 +39,20 @@
to_chat(M, "<span class='notice'>You can't get the taste of honey out of your mouth!.</span>")
M.reagents.add_reagent(/datum/reagent/consumable/honey, 2)
else
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
M.adjustToxLoss(5)
M.updatehealth()
if(4, 5)
if(honey)
ADD_TRAIT(M, TRAIT_BEEFRIEND, DISEASE_TRAIT)
if(prob(15))
to_chat(M, "<span class='notice'>Your stomach squirms.</span>")
if(prob(15))
if(prob(25))
if(honey)
to_chat(M, "<span class='notice'>You can't get the taste of honey out of your mouth!.</span>")
M.reagents.add_reagent_list(list(/datum/reagent/consumable/honey = 5, /datum/reagent/medicine/insulin = 15)) //honey rooooughly equivalent to 1.5u omnizine. due to how honey synthesizes 7.5 sugar per unit, the large amounts of insulin are necessary to prevent hyperglycaemic shock due to the bees
M.reagents.add_reagent_list(list(/datum/reagent/consumable/honey = 10, /datum/reagent/consumable/honey/special = 5, /datum/reagent/medicine/insulin = 5)) //insulin prevents hyperglycemic shock
else
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
M.adjustToxLoss(5)
M.updatehealth()
if(prob(10))
@@ -60,10 +63,12 @@
if(prob(10))
M.visible_message("<span class='danger'>[M] coughs up a bee!</span>", \
"<span class='userdanger'>You cough up a bee!</span>")
if(honey)
var/mob/living/simple_animal/hostile/poison/bees/B = new(M.loc)
B.assign_reagent(GLOB.chemical_reagents_list[/datum/reagent/consumable/honey])
else if(toxic_bees)
if(toxic_bees)
new /mob/living/simple_animal/hostile/poison/bees/toxin(M.loc)
else
new /mob/living/simple_animal/hostile/poison/bees(M.loc)
/datum/symptom/beesease/End(datum/disease/advance/A)
if(!..())
return
REMOVE_TRAIT(A.affected_mob, TRAIT_BEEFRIEND, DISEASE_TRAIT)
@@ -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 = "<b>Stage Speed 8:</b> Causes choking more frequently.<br>\
<b>Stealth 4:</b> 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, "<span class='warning'>[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]</span>")
if(3, 4)
if(!suppress_warning)
to_chat(M, "<span class='warning'>[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]</span>")
else
to_chat(M, "<span class='warning'>You feel very [pick("dizzy","woozy","faint")].</span>") //fake bloodloss messages
Choke_stage_3_4(M, A)
M.emote("gasp")
else
to_chat(M, "<span class='userdanger'>[pick("You're choking!", "You can't breathe!")]</span>")
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.
@@ -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, "<span class='userdanger'>Your skin erupts into an inferno!</span>")
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)
@@ -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 = "<b>Resistance 8:</b> Causes two harmful mutations at once.<br>\
<b>Stage Speed 10:</b> Increases mutation frequency.<br>\
<b>Stealth 5:</b> 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, "<span class='warning'>[pick("Your skin feels itchy.", "You feel light headed.")]</span>")
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 = "<b>Resistance 8:</b> Causes two harmful mutations at once.<br>\
<b>Stage Speed 10:</b> Increases mutation frequency.<br>\
<b>Stage Speed 14:</b> Mutations will be beneficial.<br>\
<b>Stealth 5:</b> 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, "<span class='warning'>[pick("Your skin feels itchy.", "You feel light headed.")]</span>")
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.not_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()
@@ -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 = "<b>Stage Speed 7:</b> Increases the amount of hallucinations.<br>\
<b>Stealth 4:</b> The virus mimics positive symptoms.."
<b>Stealth 2:</b> 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
+415 -466
View File
@@ -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 = "<b>Stage Speed 6:</b> Doubles healing speed.<br>\
<b>Stealth 4:</b> 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 = "<span class='notice'>You miss the feeling of starlight on your skin.</span>"
var/nearspace_penalty = 0.3
threshold_desc = "<b>Stage Speed 6:</b> Increases healing speed.<br>\
<b>Transmission 6:</b> 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, "<span class='notice'>Your skin tingles as the starlight seems to heal you.</span>")
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 = "<b>Resistance 7:</b> Increases chem removal speed.<br>\
<b>Stage Speed 6:</b> 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, "<span class='notice'>You feel a mild warmth as your blood purifies itself.</span>")
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 = "<b>Stealth 3:</b> Reduces hunger rate.<br>\
<b>Stage Speed 10:</b> 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, "<span class='notice'>You feel an odd gurgle in your stomach, as if it was working much faster than normal.</span>")
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 = "<span class='notice'>You feel tingling on your skin as light passes over it.</span>"
threshold_desc = "<b>Stage Speed 8:</b> 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, "<span class='notice'>The darkness soothes and mends your wounds.</span>")
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 = "<span class='notice'>The pain from your wounds makes you feel oddly sleepy...</span>"
var/deathgasp = FALSE
var/active_coma = FALSE //to prevent multiple coma procs
threshold_desc = "<b>Stealth 2:</b> Host appears to die when falling into a coma.<br>\
<b>Stage Speed 7:</b> 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, "<span class='warning'>You feel yourself slip into a regenerative coma...</span>")
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 = "<span class='notice'>Your skin feels oddly dry...</span>"
var/absorption_coeff = 1
threshold_desc = "<b>Resistance 5:</b> Water is consumed at a much slower rate.<br>\
<b>Stage Speed 7:</b> 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, "<span class='notice'>You feel yourself absorbing the water around you to soothe your damaged skin.</span>")
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 = "<span class='notice'>You feel an odd attraction to plasma.</span>"
var/temp_rate = 1
threshold_desc = "<b>Transmission 6:</b> Increases temperature adjustment rate.<br>\
<b>Stage Speed 7:</b> 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, "<span class='notice'>You feel yourself absorbing plasma inside and around you...</span>")
if(M.bodytemperature > BODYTEMP_NORMAL)
M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL)
if(prob(5))
to_chat(M, "<span class='notice'>You feel less hot.</span>")
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, "<span class='notice'>You feel warmer.</span>")
M.adjustToxLoss(-heal_amt)
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
return
if(prob(5))
to_chat(M, "<span class='notice'>The pain from your wounds fades rapidly.</span>")
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 = "<span class='notice'>Your skin glows faintly for a moment.</span>"
var/cellular_damage = FALSE
threshold_desc = "<b>Transmission 6:</b> Additionally heals cellular damage.<br>\
<b>Resistance 7:</b> 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, "<span class='notice'>Your skin glows faintly, and you feel your wounds mending themselves.</span>")
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 = "<b>Stage Speed 6:</b> Doubles healing speed.<br>\
<b>Stealth 4:</b> 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 = "<b>Resistance 7:</b> Increases chem removal speed.<br>\
<b>Stage Speed 6:</b> 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, "<span class='notice'>You feel a mild warmth as your blood purifies itself.</span>")
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 = "<span class='notice'>The pain from your wounds makes you feel oddly sleepy...</span>"
var/deathgasp = FALSE
var/active_coma = FALSE //to prevent multiple coma procs
threshold_desc = "<b>Stealth 2:</b> Host appears to die when falling into a coma.<br>\
<b>Stage Speed 7:</b> 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, "<span class='warning'>You feel yourself slip into a regenerative coma...</span>")
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 = "<b>Stealth 4:</b> The disease resets cell DNA, quickly curing cell damage and mutations<br>\
<b>transmission 8:</b> 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, "<span class='userdanger'>[pick("Your mind fills with static!.", "You feel a jolt!", "Your sense of direction flickers out!")]</span>")
else
to_chat(M, "<span class='notice'>[pick("You feel a slight tug toward the station's wall.", "Nearby electronics flicker", "Your hair stands on end")]</span>")
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 = "<b>transmission 6:</b> The sweat production ramps up to the point that it cleans messes and puts out fires in the general vicinity<br>\
<b>transmission 8:</b> 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, "<span class='danger'>The sweat pools into a puddle!</span>")
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, "<span class='userdanger'>You sweat out nearly everything in your body!</span>")
else
to_chat(M, "<span class='notice'>[pick("You feel moist.", "Your clothes are soaked", "You're sweating buckets")]</span>")
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 = "<b>Resistance 8:</b> The disease acts on a smaller scale, resetting burnt tissue back to a state of health<br>\
<b>Transmission 8:</b> 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, "<span class='userwarning'>The lukewarm temperature makes you feel strange!</span>")
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, "<span class='userdanger'>The change in temperature shocks you back to a previous spacial state!</span>")
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, "<span class='notice'>[pick("Your warm breath fizzles out of existence.", "You feel attracted to temperate climates", "You feel like you're forgetting something")]</span>")
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 = "<b>Stage Speed 8:</b> The disease heals brute damage at a fast rate, but causes expulsion of benign tumors<br>\
<b>Stage Speed 12:</b> 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, "<span class='userdanger'>You retch, and a splatter of gore escapes your gullet</span>")
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, "<span class='notice'>[pick("You feel bloated.", "The station seems small", "You are the strongest")]</span>")
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 = {"
<b>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, "<span class='notice'>Ew... It would be a bad idea to touch this. It could probably be destroyed with the extreme heat of a welder.</span>")
/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("<span class='warning'>[usr.name] destroys [src].</span>",
"<span class='notice'>You hold the welder to [src], and it violently bursts!</span>",
"<span class='italics'>You hear a gurgling noise</span>")
new /obj/effect/gibspawner/human(get_turf(src))
qdel(src)
else
..()
@@ -15,13 +15,13 @@ Bonus
/datum/symptom/narcolepsy
name = "Narcolepsy"
desc = "The virus causes a hormone imbalance, making the host sleepy and narcoleptic."
stealth = -1
stealth = 1
resistance = -2
stage_speed = -3
transmittable = -4
transmittable = -2
level = 6
symptom_delay_min = 15
symptom_delay_max = 80
symptom_delay_min = 10
symptom_delay_max = 30
severity = 4
var/sleep_level = 0
var/sleepy_ticks = 0
@@ -35,8 +35,8 @@ Bonus
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
symptom_delay_min = 5
symptom_delay_max = 20
/datum/symptom/narcolepsy/Activate(var/datum/disease/advance/A)
var/mob/living/M = A.affected_mob
+66 -52
View File
@@ -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 = "<b>Resistance 8:</b>Additionally regenerates lost blood.<br>"
/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, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
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 = "<b>Resistance 8:</b> Additionally regenerates lost blood.<br>"
/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, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
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)
@@ -7,18 +7,15 @@
transmittable = 2
level = 8
severity = 4
symptom_delay_min = 1
symptom_delay_max = 4
symptom_delay_min = 10
symptom_delay_max = 40
var/fastrads = FALSE
var/radothers = FALSE
threshold_desc = "<b>Transmission 12:</b> Makes the host irradiate others around them as well.<br>\
<b>Speed 8:</b> Host takes radiation damage faster."
threshold_desc = "<b>Speed 8:</b> Host takes radiation damage faster."
/datum/symptom/radiation/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["transmission"] >= 10)
radothers = TRUE
if(A.properties["speed"] >= 8)
fastrads = TRUE
@@ -34,18 +31,12 @@
if(prob(50))
to_chat(M, "<span class='danger'>You feel like the atoms inside you are beginning to split...</span>")
if(4, 5)
if(fastrads)
radiate(M, 80)
else
radiate(M, 40)
if(radothers && A.stage == 5)
if(prob(40))
M.visible_message("<span class='danger'>[M] glows green for a moment!</span>", \
"<span class='userdanger'>You feel a massive wave of pain flow through you!</span>")
radiation_pulse(M, 20)
radiate(M)
/datum/symptom/radiation/proc/radiate(mob/living/carbon/M, chance)
if(prob(chance))
to_chat(M, "<span class='danger'>You feel a wave of pain throughout your body!</span>")
M.radiation += 4
/datum/symptom/radiation/proc/radiate(mob/living/carbon/M)
to_chat(M, "<span class='danger'>You feel a wave of pain throughout your body!</span>")
if(fastrads)
M.radiation += 150
else
M.radiation += 75
return 1
@@ -86,3 +86,46 @@ BONUS
H.update_body(0)
else
H.visible_message("<span class='warning'>[H] looks a bit dark...</span>", "<span class='notice'>Your skin suddenly appears darker...</span>")
/*
//////////////////////////////////////
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 = 0
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("<span class='warning'>[M] looks rather vibrant...</span>", "<span class='notice'>The colors, man, the colors...</span>")
@@ -26,8 +26,7 @@ Bonus
severity = 1
symptom_delay_min = 5
symptom_delay_max = 35
threshold_desc = "<b>Transmission 9:</b> The host will sneeze periodically, spreading the disease. <br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = "<b>Stealth 4:</b> 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)
@@ -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
/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
@@ -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
@@ -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
@@ -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)
@@ -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 = "<b>Stealth 4:</b> The symptom is less noticeable."
threshold_desc = "<b>Stealth 2:</b> 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)