diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 01ac96a2..a9636b64 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -62,6 +62,7 @@
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
#define MONKEY_BODYPART "monkey"
+#define TERATOMA_BODYPART "teratoma"
#define ALIEN_BODYPART "alien"
#define LARVA_BODYPART "larva"
#define DEVIL_BODYPART "devil"
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index c47c6052..f56a5683 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -118,6 +118,7 @@
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer"
+#define TRAIT_BEEFRIEND "beefriend"
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 6a41b710..ed0cc337 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -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)
diff --git a/code/datums/diseases/advance/symptoms/beesymptom.dm b/code/datums/diseases/advance/symptoms/beesymptom.dm
index b56f2dc8..a5e530e9 100644
--- a/code/datums/diseases/advance/symptoms/beesymptom.dm
+++ b/code/datums/diseases/advance/symptoms/beesymptom.dm
@@ -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 = "Resistance 14: Host synthesizes honey instead of toxins, bees now sting with honey instead of toxin.
\
- Transmission 10: Bees now contain a completely random toxin, unless resistance exceeds 14"
-
+ threshold_desc = "Resistance 14: The bees become symbiotic with the host, synthesizing honey and no longer stinging the stomach lining, and no longer attacking the host.
\
+ Transmission 10: 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, "You can't get the taste of honey out of your mouth!.")
M.reagents.add_reagent(/datum/reagent/consumable/honey, 2)
else
- to_chat(M, "Your stomach stings painfully.")
+ to_chat(M, "Your stomach stings painfully.")
M.adjustToxLoss(5)
M.updatehealth()
if(4, 5)
+ if(honey)
+ ADD_TRAIT(M, TRAIT_BEEFRIEND, DISEASE_TRAIT)
if(prob(15))
to_chat(M, "Your stomach squirms.")
- if(prob(15))
+ if(prob(25))
if(honey)
to_chat(M, "You can't get the taste of honey out of your mouth!.")
- 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, "Your stomach stings painfully.")
+ to_chat(M, "Your stomach stings painfully.")
M.adjustToxLoss(5)
M.updatehealth()
if(prob(10))
@@ -60,10 +63,12 @@
if(prob(10))
M.visible_message("[M] coughs up a bee!", \
"You cough up a bee!")
- 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)
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 48f68e69..b6e8d9a3 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -1,76 +1,6 @@
/*
//////////////////////////////////////
-Choking
-
- Very very noticable.
- Lowers resistance.
- Decreases stage speed.
- Decreases transmittablity tremendously.
- Moderate Level.
-
-Bonus
- Inflicts spikes of oxyloss
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/choking
-
- name = "Choking"
- desc = "The virus causes inflammation of the host's air conduits, leading to intermittent choking."
- stealth = -3
- resistance = -2
- stage_speed = -2
- transmittable = -4
- level = 3
- severity = 3
- base_message_chance = 15
- symptom_delay_min = 10
- symptom_delay_max = 30
- threshold_desc = "Stage Speed 8: Causes choking more frequently.
\
- Stealth 4: The symptom remains hidden until active."
-
-/datum/symptom/choking/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 8)
- symptom_delay_min = 7
- symptom_delay_max = 24
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
-
-/datum/symptom/choking/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]")
- if(3, 4)
- if(!suppress_warning)
- to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")
- else
- to_chat(M, "You feel very [pick("dizzy","woozy","faint")].") //fake bloodloss messages
- Choke_stage_3_4(M, A)
- M.emote("gasp")
- else
- to_chat(M, "[pick("You're choking!", "You can't breathe!")]")
- Choke(M, A)
- M.emote("gasp")
-
-/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- M.adjustOxyLoss(rand(6,13))
- return 1
-
-/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- M.adjustOxyLoss(rand(10,18))
- return 1
-
-/*
-//////////////////////////////////////
-
Asphyxiation
Very very noticable.
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index bb1da9ac..1c1aa856 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -20,9 +20,9 @@ Bonus
name = "Spontaneous Combustion"
desc = "The virus turns fat into an extremely flammable compound, and raises the body's temperature, making the host burst into flames spontaneously."
stealth = 1
- resistance = -4
- stage_speed = -4
- transmittable = -4
+ resistance = -2
+ stage_speed = -3
+ transmittable = -3
level = 6
severity = 5
base_message_chance = 20
@@ -73,12 +73,16 @@ Bonus
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
- M.adjust_fire_stacks(3 * power)
+ if(HAS_TRAIT(M, TRAIT_FAT))
+ M.adjust_fire_stacks(6 * power)
+ else
+ M.adjust_fire_stacks(3 * power)
M.take_overall_damage(burn = 5 * power, required_status = BODYPART_ORGANIC)
if(infective)
A.spread(4)
return 1
+
/*
//////////////////////////////////////
@@ -152,7 +156,7 @@ Bonus
M.IgniteMob()
to_chat(M, "Your skin erupts into an inferno!")
M.emote("scream")
-
+
/datum/symptom/alkali/proc/Alkali_fire_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = 6 * power
M.adjust_fire_stacks(get_stacks)
diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm
index 49b229e5..fbfa41a2 100644
--- a/code/datums/diseases/advance/symptoms/genetics.dm
+++ b/code/datums/diseases/advance/symptoms/genetics.dm
@@ -1,78 +1,82 @@
-/*
-//////////////////////////////////////
-
-DNA Saboteur
-
- Very noticable.
- Lowers resistance tremendously.
- No changes to stage speed.
- Decreases transmittablity tremendously.
- Fatal Level.
-
-Bonus
- Cleans the DNA of a person and then randomly gives them a trait.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/genetic_mutation
- name = "Deoxyribonucleic Acid Saboteur"
- desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
- stealth = -2
- resistance = -3
- stage_speed = 0
- transmittable = -3
- level = 6
- severity = 4
- var/list/possible_mutations
- var/archived_dna = null
- base_message_chance = 50
- symptom_delay_min = 60
- symptom_delay_max = 120
- var/no_reset = FALSE
- threshold_desc = "Resistance 8: Causes two harmful mutations at once.
\
- Stage Speed 10: Increases mutation frequency.
\
- Stealth 5: The mutations persist even if the virus is cured."
-
-/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/C = A.affected_mob
- if(!C.has_dna())
- return
- switch(A.stage)
- if(4, 5)
- to_chat(C, "[pick("Your skin feels itchy.", "You feel light headed.")]")
- C.dna.remove_mutation_group(possible_mutations)
- for(var/i in 1 to power)
- C.randmut(possible_mutations)
-
-// Archive their DNA before they were infected.
-/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 5) //don't restore dna after curing
- no_reset = TRUE
- if(A.properties["stage_rate"] >= 10) //mutate more often
- symptom_delay_min = 20
- symptom_delay_max = 60
- if(A.properties["resistance"] >= 8) //mutate twice
- power = 2
- possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT]
- var/mob/living/carbon/M = A.affected_mob
- if(M)
- if(!M.has_dna())
- return
- archived_dna = M.dna.mutation_index
-
-// Give them back their old DNA when cured.
-/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
- if(!..())
- return
- if(!no_reset)
- var/mob/living/carbon/M = A.affected_mob
- if(M && archived_dna)
- if(!M.has_dna())
- return
- M.dna.mutation_index = archived_dna
- M.domutcheck()
+/*
+//////////////////////////////////////
+
+DNA Saboteur
+
+ Very noticable.
+ Lowers resistance tremendously.
+ No changes to stage speed.
+ Decreases transmittablity tremendously.
+ Fatal Level.
+
+Bonus
+ Cleans the DNA of a person and then randomly gives them a trait.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/genetic_mutation
+ name = "Deoxyribonucleic Acid Saboteur"
+ desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
+ stealth = -2
+ resistance = -3
+ stage_speed = 0
+ transmittable = -3
+ level = 6
+ severity = 4
+ var/list/possible_mutations
+ var/archived_dna = null
+ base_message_chance = 50
+ symptom_delay_min = 60
+ symptom_delay_max = 120
+ var/no_reset = FALSE
+ threshold_desc = "Resistance 8: Causes two harmful mutations at once.
\
+ Stage Speed 10: Increases mutation frequency.
\
+ Stage Speed 14: Mutations will be beneficial.
\
+ Stealth 5: The mutations persist even if the virus is cured."
+
+/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/C = A.affected_mob
+ if(!C.has_dna())
+ return
+ switch(A.stage)
+ if(4, 5)
+ to_chat(C, "[pick("Your skin feels itchy.", "You feel light headed.")]")
+ C.dna.remove_mutation_group(possible_mutations)
+ for(var/i in 1 to power)
+ C.randmut(possible_mutations)
+
+// Archive their DNA before they were infected.
+/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stealth"] >= 5) //don't restore dna after curing
+ no_reset = TRUE
+ if(A.properties["stage_rate"] >= 10) //mutate more often
+ symptom_delay_min = 20
+ symptom_delay_max = 60
+ if(A.properties["resistance"] >= 8) //mutate twice
+ power = 2
+ if(A.properties["stage_rate"] >= 14)
+ possible_mutations = (GLOB.good_mutations | GLOB.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()
diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm
index 873d9605..86587abd 100644
--- a/code/datums/diseases/advance/symptoms/hallucigen.dm
+++ b/code/datums/diseases/advance/symptoms/hallucigen.dm
@@ -18,23 +18,23 @@ Bonus
/datum/symptom/hallucigen
name = "Hallucigen"
desc = "The virus stimulates the brain, causing occasional hallucinations."
- stealth = -2
+ stealth = 1
resistance = -3
- stage_speed = -3
+ stage_speed = -1
transmittable = -1
level = 5
severity = 2
base_message_chance = 25
- symptom_delay_min = 25
- symptom_delay_max = 90
+ symptom_delay_min = 10
+ symptom_delay_max = 70
var/fake_healthy = FALSE
threshold_desc = "Stage Speed 7: Increases the amount of hallucinations.
\
- Stealth 4: The virus mimics positive symptoms.."
+ Stealth 2: The virus mimics positive symptoms.."
/datum/symptom/hallucigen/Start(datum/disease/advance/A)
if(!..())
return
- if(A.properties["stealth"] >= 4) //fake good symptom messages
+ if(A.properties["stealth"] >= 2) //fake good symptom messages
fake_healthy = TRUE
base_message_chance = 50
if(A.properties["stage_rate"] >= 7) //stronger hallucinations
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index b8a52e0c..a133be00 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -1,466 +1,415 @@
-/datum/symptom/heal
- name = "Basic Healing (does nothing)" //warning for adminspawn viruses
- desc = "You should not be seeing this."
- stealth = 0
- resistance = 0
- stage_speed = 0
- transmittable = 0
- level = -1 //not obtainable
- base_message_chance = 20 //here used for the overlays
- symptom_delay_min = 1
- symptom_delay_max = 1
- var/passive_message = "" //random message to infected but not actively healing people
- threshold_desc = "Stage Speed 6: Doubles healing speed.
\
- Stealth 4: Healing will no longer be visible to onlookers."
-
-/datum/symptom/heal/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 6) //stronger healing
- power = 2
-
-/datum/symptom/heal/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- var/effectiveness = CanHeal(A)
- if(!effectiveness)
- if(passive_message && prob(2) && passive_message_condition(M))
- to_chat(M, passive_message)
- return
- else
- Heal(M, A, effectiveness)
- return
-
-/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
- return power
-
-/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
- return TRUE
-
-/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
- return TRUE
-
-
-/datum/symptom/heal/starlight
- name = "Starlight Condensation"
- desc = "The virus reacts to direct starlight, producing regenerative chemicals. Works best against toxin-based damage."
- stealth = -1
- resistance = -2
- stage_speed = 0
- transmittable = 1
- level = 6
- passive_message = "You miss the feeling of starlight on your skin."
- var/nearspace_penalty = 0.3
- threshold_desc = "Stage Speed 6: Increases healing speed.
\
- Transmission 6: Removes penalty for only being close to space."
-
-/datum/symptom/heal/starlight/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["transmittable"] >= 6)
- nearspace_penalty = 1
- if(A.properties["stage_rate"] >= 6)
- power = 2
-
-/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- if(istype(get_turf(M), /turf/open/space))
- return power
- else
- for(var/turf/T in view(M, 2))
- if(istype(T, /turf/open/space))
- return power * nearspace_penalty
-
-/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = actual_power
- if(M.getToxLoss() && prob(5))
- to_chat(M, "Your skin tingles as the starlight seems to heal you.")
-
- M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
-
-/datum/symptom/heal/starlight/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/chem
- name = "Toxolysis"
- stealth = 0
- resistance = -2
- stage_speed = 2
- transmittable = -2
- level = 7
- var/food_conversion = FALSE
- desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
- threshold_desc = "Resistance 7: Increases chem removal speed.
\
- Stage Speed 6: Consumed chemicals nourish the host."
-
-/datum/symptom/heal/chem/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 6)
- food_conversion = TRUE
- if(A.properties["resistance"] >= 7)
- power = 2
-
-/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
- for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
- M.reagents.remove_reagent(R.id, actual_power)
- if(food_conversion)
- M.nutrition += 0.3
- if(prob(2))
- to_chat(M, "You feel a mild warmth as your blood purifies itself.")
- return 1
-
-
-
-/datum/symptom/heal/metabolism
- name = "Metabolic Boost"
- stealth = -1
- resistance = -2
- stage_speed = 2
- transmittable = 1
- level = 7
- var/triple_metabolism = FALSE
- var/reduced_hunger = FALSE
- desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\
- but also causing increased hunger."
- threshold_desc = "Stealth 3: Reduces hunger rate.
\
- Stage Speed 10: Chemical metabolization is tripled instead of doubled."
-
-/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 10)
- triple_metabolism = TRUE
- if(A.properties["stealth"] >= 3)
- reduced_hunger = TRUE
-
-/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
- if(!istype(C))
- return
- C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
- if(triple_metabolism)
- C.reagents.metabolize(C, can_overdose=TRUE)
- C.overeatduration = max(C.overeatduration - 2, 0)
- var/lost_nutrition = 9 - (reduced_hunger * 5)
- C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed
- if(prob(2))
- to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.")
- return 1
-
-/datum/symptom/heal/darkness
- name = "Nocturnal Regeneration"
- desc = "The virus is able to mend the host's flesh when in conditions of low light, repairing physical damage. More effective against brute damage."
- stealth = 2
- resistance = -1
- stage_speed = -2
- transmittable = -1
- level = 6
- passive_message = "You feel tingling on your skin as light passes over it."
- threshold_desc = "Stage Speed 8: Doubles healing speed."
-
-/datum/symptom/heal/darkness/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 8)
- power = 2
-
-/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- var/light_amount = 0
- if(isturf(M.loc)) //else, there's considered to be no light
- var/turf/T = M.loc
- light_amount = min(1,T.get_lumcount()) - 0.5
- if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
- return power
-
-/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 2 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- if(prob(5))
- to_chat(M, "The darkness soothes and mends your wounds.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute
- M.update_damage_overlays()
- return 1
-
-/datum/symptom/heal/darkness/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/coma
- name = "Regenerative Coma"
- desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
- stealth = 0
- resistance = 2
- stage_speed = -3
- transmittable = -2
- level = 8
- passive_message = "The pain from your wounds makes you feel oddly sleepy..."
- var/deathgasp = FALSE
- var/active_coma = FALSE //to prevent multiple coma procs
- threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
\
- Stage Speed 7: Increases healing speed."
-
-/datum/symptom/heal/coma/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 1.5
- if(A.properties["stealth"] >= 2)
- deathgasp = TRUE
-
-/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
- return power
- else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
- return power * 0.9
- else if(M.stat == SOFT_CRIT)
- return power * 0.5
- else if(M.IsSleeping())
- return power * 0.25
- else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
- to_chat(M, "You feel yourself slip into a regenerative coma...")
- active_coma = TRUE
- addtimer(CALLBACK(src, .proc/coma, M), 60)
-
-/datum/symptom/heal/coma/proc/coma(mob/living/M)
- if(deathgasp)
- M.emote("deathgasp")
- M.fakedeath("regenerative_coma")
- M.update_stat()
- M.update_canmove()
- addtimer(CALLBACK(src, .proc/uncoma, M), 300)
-
-/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
- if(!active_coma)
- return
- active_coma = FALSE
- M.cure_fakedeath("regenerative_coma")
- M.update_stat()
- M.update_canmove()
-
-/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 4 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
-
- if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
- uncoma(M)
-
- return 1
-
-/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
- if((M.getBruteLoss() + M.getFireLoss()) > 30)
- return TRUE
- return FALSE
-
-/datum/symptom/heal/water
- name = "Tissue Hydration"
- desc = "The virus uses excess water inside and outside the body to repair damaged tissue cells. More effective against burns."
- stealth = 0
- resistance = -1
- stage_speed = 0
- transmittable = 1
- level = 6
- passive_message = "Your skin feels oddly dry..."
- var/absorption_coeff = 1
- threshold_desc = "Resistance 5: Water is consumed at a much slower rate.
\
- Stage Speed 7: Increases healing speed."
-
-/datum/symptom/heal/water/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 2
- if(A.properties["stealth"] >= 2)
- absorption_coeff = 0.25
-
-/datum/symptom/heal/water/CanHeal(datum/disease/advance/A)
- . = 0
- var/mob/living/M = A.affected_mob
- if(M.fire_stacks < 0)
- M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0)
- . += power
- if(M.reagents.has_reagent("holywater"))
- M.reagents.remove_reagent("holywater", 0.5 * absorption_coeff)
- . += power * 0.75
- else if(M.reagents.has_reagent("water"))
- M.reagents.remove_reagent("water", 0.5 * absorption_coeff)
- . += power * 0.5
-
-/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 2 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1) //more effective on burns
-
- if(!parts.len)
- return
-
- if(prob(5))
- to_chat(M, "You feel yourself absorbing the water around you to soothe your damaged skin.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len))
- M.update_damage_overlays()
-
- return 1
-
-/datum/symptom/heal/water/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/plasma
- name = "Plasma Fixation"
- desc = "The virus draws plasma from the atmosphere and from inside the body to heal and stabilize body temperature."
- stealth = 0
- resistance = 3
- stage_speed = -2
- transmittable = -2
- level = 8
- passive_message = "You feel an odd attraction to plasma."
- var/temp_rate = 1
- threshold_desc = "Transmission 6: Increases temperature adjustment rate.
\
- Stage Speed 7: Increases healing speed."
-
-/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 2
- if(A.properties["transmittable"] >= 6)
- temp_rate = 4
-
-/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- var/datum/gas_mixture/environment
- var/plasmamount
-
- . = 0
-
- if(M.loc)
- environment = M.loc.return_air()
- if(environment)
- plasmamount = environment.gases[/datum/gas/plasma]
- if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see
- . += power * 0.5
- if(M.reagents.has_reagent("plasma"))
- . += power * 0.75
-
-/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 4 * actual_power
-
- if(prob(5))
- to_chat(M, "You feel yourself absorbing plasma inside and around you...")
-
- if(M.bodytemperature > BODYTEMP_NORMAL)
- M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL)
- if(prob(5))
- to_chat(M, "You feel less hot.")
- else if(M.bodytemperature < (BODYTEMP_NORMAL + 1))
- M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL)
- if(prob(5))
- to_chat(M, "You feel warmer.")
-
- M.adjustToxLoss(-heal_amt)
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
- if(!parts.len)
- return
- if(prob(5))
- to_chat(M, "The pain from your wounds fades rapidly.")
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
-
-
-/datum/symptom/heal/radiation
- name = "Radioactive Resonance"
- desc = "The virus uses radiation to fix damage through dna mutations."
- stealth = -1
- resistance = -2
- stage_speed = 2
- transmittable = -3
- level = 6
- symptom_delay_min = 1
- symptom_delay_max = 1
- passive_message = "Your skin glows faintly for a moment."
- var/cellular_damage = FALSE
- threshold_desc = "Transmission 6: Additionally heals cellular damage.
\
- Resistance 7: Increases healing speed."
-
-/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 7)
- power = 2
- if(A.properties["transmittable"] >= 6)
- cellular_damage = TRUE
-
-/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- switch(M.radiation)
- if(0)
- return FALSE
- if(1 to RAD_MOB_SAFE)
- return 0.25
- if(RAD_MOB_SAFE to RAD_BURN_THRESHOLD)
- return 0.5
- if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE)
- return 0.75
- if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN)
- return 1
- else
- return 1.5
-
-/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = actual_power
-
- if(cellular_damage)
- M.adjustCloneLoss(-heal_amt * 0.5)
-
- M.adjustToxLoss(-(2 * heal_amt))
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- if(prob(4))
- to_chat(M, "Your skin glows faintly, and you feel your wounds mending themselves.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
+/datum/symptom/heal
+ name = "Basic Healing (does nothing)" //warning for adminspawn viruses
+ desc = "You should not be seeing this."
+ stealth = 0
+ resistance = 0
+ stage_speed = 0
+ transmittable = 0
+ level = -1 //not obtainable
+ base_message_chance = 20 //here used for the overlays
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/passive_message = "" //random message to infected but not actively healing people
+ threshold_desc = "Stage Speed 6: Doubles healing speed.
\
+ Stealth 4: Healing will no longer be visible to onlookers."
+
+/datum/symptom/heal/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 6) //stronger healing
+ power = 2
+
+/datum/symptom/heal/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ var/effectiveness = CanHeal(A)
+ if(!effectiveness)
+ if(passive_message && prob(2) && passive_message_condition(M))
+ to_chat(M, passive_message)
+ return
+ else
+ Heal(M, A, effectiveness)
+ return
+
+/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
+ return power
+
+/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
+ return TRUE
+
+/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
+ return TRUE
+
+/datum/symptom/heal/chem
+ name = "Toxolysis"
+ stealth = 0
+ resistance = -2
+ stage_speed = 2
+ transmittable = -2
+ level = 7
+ var/food_conversion = FALSE
+ desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
+ threshold_desc = "Resistance 7: Increases chem removal speed.
\
+ Stage Speed 6: Consumed chemicals nourish the host."
+
+/datum/symptom/heal/chem/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 6)
+ food_conversion = TRUE
+ if(A.properties["resistance"] >= 7)
+ power = 2
+
+/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
+ for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
+ M.reagents.remove_reagent(R.id, actual_power)
+ if(food_conversion)
+ M.nutrition += 0.3
+ if(prob(2))
+ to_chat(M, "You feel a mild warmth as your blood purifies itself.")
+ return 1
+
+
+/datum/symptom/heal/coma
+ name = "Regenerative Coma"
+ desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
+ stealth = 0
+ resistance = 2
+ stage_speed = -3
+ transmittable = -2
+ level = 8
+ passive_message = "The pain from your wounds makes you feel oddly sleepy..."
+ var/deathgasp = FALSE
+ var/active_coma = FALSE //to prevent multiple coma procs
+ threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
\
+ Stage Speed 7: Increases healing speed."
+
+/datum/symptom/heal/coma/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 7)
+ power = 1.5
+ if(A.properties["stealth"] >= 2)
+ deathgasp = TRUE
+
+/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
+ return power
+ else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
+ return power * 0.9
+ else if(M.stat == SOFT_CRIT)
+ return power * 0.5
+ else if(M.IsSleeping())
+ return power * 0.25
+ else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
+ to_chat(M, "You feel yourself slip into a regenerative coma...")
+ active_coma = TRUE
+ addtimer(CALLBACK(src, .proc/coma, M), 60)
+
+/datum/symptom/heal/coma/proc/coma(mob/living/M)
+ if(deathgasp)
+ M.emote("deathgasp")
+ M.fakedeath("regenerative_coma")
+ M.update_stat()
+ M.update_canmove()
+ addtimer(CALLBACK(src, .proc/uncoma, M), 300)
+
+/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
+ if(!active_coma)
+ return
+ active_coma = FALSE
+ M.cure_fakedeath("regenerative_coma")
+ M.update_stat()
+ M.update_canmove()
+
+/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = 4 * actual_power
+
+ var/list/parts = M.get_damaged_bodyparts(1,1)
+
+ if(!parts.len)
+ return
+
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
+ M.update_damage_overlays()
+
+ if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
+ uncoma(M)
+
+ return 1
+
+/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
+ if((M.getBruteLoss() + M.getFireLoss()) > 30)
+ return TRUE
+ return FALSE
+
+/*
+//////////////////////////////////////
+im not even gonna bother with these for the following symptoms. typed em out, code was deleted, had to start over, read the symptoms yourself.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/EMP
+ name = "Organic Flux Induction"
+ desc = "Causes electromagnetic interference around the subject"
+ stealth = -2
+ resistance = -1
+ stage_speed = 0
+ transmittable = -2
+ level = 6
+ severity = 4
+ symptom_delay_min = 15
+ symptom_delay_max = 40
+ var/bigemp = FALSE
+ var/cellheal = FALSE
+ threshold_desc = "Stealth 4: The disease resets cell DNA, quickly curing cell damage and mutations
\
+ transmission 8: The EMP affects electronics adjacent to the subject as well."
+
+/datum/symptom/EMP/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stealth"] >= 4)
+ cellheal = TRUE
+ if(A.properties["transmittable"] >= 8)
+ bigemp = TRUE
+
+/datum/symptom/EMP/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ M.emp_act(EMP_HEAVY)
+ if(cellheal)
+ M.adjustCloneLoss(-40)
+ M.reagents.add_reagent(/datum/reagent/medicine/mutadone = 1)
+ if(bigemp)
+ empulse(M.loc, 0, 1)
+ to_chat(M, "[pick("Your mind fills with static!.", "You feel a jolt!", "Your sense of direction flickers out!")]")
+ else
+ to_chat(M, "[pick("You feel a slight tug toward the station's wall.", "Nearby electronics flicker", "Your hair stands on end")]")
+ return
+
+/datum/symptom/sweat
+ name = "Hyperperspiration"
+ desc = "Causes the host to sweat profusely, leaving small water puddles and extnguishing small fires"
+ stealth = 1
+ resistance = -1
+ stage_speed = 0
+ transmittable = 1
+ level = 6
+ severity = 4
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/bigsweat = FALSE
+ var/toxheal = FALSE
+ threshold_desc = "transmission 6: The sweat production ramps up to the point that it cleans messes and puts out fires in the general vicinity
\
+ transmission 8: The EMP affects electronics adjacent to the subject as well."
+
+/datum/symptom/sweat/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["transmittable"] >= 8)
+ toxheal = TRUE
+ if(A.properties["transmittable"] >= 6)
+ bigsweat = TRUE
+
+/datum/symptom/sweat/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ M.adjust_fire_stacks(-5)
+ if(prob(30))
+ var/turf/open/OT = get_turf(M)
+ if(istype(OT))
+ to_chat(M, "The sweat pools into a puddle!")
+ OT.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
+ if(bigsweat)
+ var/obj/effect/sweatsplash/S = new(M.loc)
+ if(toxheal)
+ for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
+ M.reagents.remove_reagent(R.type, 5)
+ S.reagents.add_reagent(R.type, 5)
+ M.adjustToxLoss(-20, forced = TRUE)
+ S.splash()
+ to_chat(M, "You sweat out nearly everything in your body!")
+ else
+ to_chat(M, "[pick("You feel moist.", "Your clothes are soaked", "You're sweating buckets")]")
+ return
+
+/obj/effect/sweatsplash
+ name = "Sweatsplash"
+
+/obj/effect/sweatsplash/Initialize()
+ create_reagents(1000)
+ reagents.add_reagent(/datum/reagent/water, 10)
+ reagents.add_reagent(/datum/reagent/space_cleaner, 10)
+
+obj/effect/sweatsplash/proc/splash()
+ chem_splash(loc, 2, list(reagents))
+ qdel(src)
+
+/datum/symptom/teleport
+ name = "Thermal Retrostable Displacement"
+ desc = "When too hot or cold, the subject will return to a recent location they experienced safe homeostasis"
+ stealth = 1
+ resistance = 2
+ stage_speed = -2
+ transmittable = -3
+ level = 8
+ severity = 0
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/telethreshold = 0
+ var/burnheal = FALSE
+ var/turf/open/location_return = null
+ var/cooldowntimer = 0
+ threshold_desc = "Resistance 8: The disease acts on a smaller scale, resetting burnt tissue back to a state of health
\
+ Transmission 8: The disease becomes more active, activating in a smaller temperature range."
+
+/datum/symptom/teleport/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["resistance"] >= 8)
+ burnheal = TRUE
+ if(A.properties["transmittable"] >= 8)
+ telethreshold = 25
+ power = 2
+
+/datum/symptom/teleport/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ if(burnheal)
+ M.adjustFireLoss(-1 * power)
+ if(prob(5) && (M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT))
+ location_return = get_turf(M) //sets up return point
+ if(prob(50))
+ to_chat(M, "The lukewarm temperature makes you feel strange!")
+ if(cooldowntimer == 0 && (M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT - telethreshold || M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT + telethreshold || (burnheal && M.getFireLoss() > 75 - telethreshold)))
+ do_sparks(5,FALSE,M)
+ to_chat(M, "The change in temperature shocks you back to a previous spacial state!")
+ do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
+ do_sparks(5,FALSE,M)
+ cooldowntimer = 10
+ if(burnheal)
+ M.adjust_fire_stacks(-10)
+ if(cooldowntimer > 0)
+ cooldowntimer --
+ else
+ if(prob(7))
+ to_chat(M, "[pick("Your warm breath fizzles out of existence.", "You feel attracted to temperate climates", "You feel like you're forgetting something")]")
+ return
+
+/datum/symptom/growth
+ name = "Pituitary Disruption"
+ desc = "Causes uncontrolled growth in the subject"
+ stealth = -3
+ resistance = -2
+ stage_speed = 1
+ transmittable = -2
+ level = 7
+ severity = 4
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/current_size = 1
+ var/tetsuo = FALSE
+ var/bruteheal = FALSE
+ threshold_desc = "Stage Speed 8: The disease heals brute damage at a fast rate, but causes expulsion of benign tumors
\
+ Stage Speed 12: The disease heals brute damage incredibly fast, but deteriorates cell health and causes tumors to become more advanced."
+
+/datum/symptom/growth/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 8)
+ bruteheal = TRUE
+ if(A.properties["stage_rate"] >= 12)
+ tetsuo = TRUE
+
+/datum/symptom/growth/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ var/newsize = current_size
+ switch(A.stage)
+ if(4, 5)
+ switch(A.properties["stage_rate"])
+ if(5 to 8)
+ newsize = 1.25
+ if(9 to 12)
+ newsize = 1.5
+ if(13 to 16)
+ newsize = 1.75
+ if(17 to INFINITY)
+ newsize = 2
+ M.resize = newsize/current_size
+ current_size = newsize
+ M.update_transform()
+ if(prob(5) && bruteheal)
+ to_chat(M, "You retch, and a splatter of gore escapes your gullet")
+ M.Knockdown(40)
+ new /obj/effect/gibspawner/generic(M.loc)
+ if(prob(80))
+ new /obj/effect/spawner/lootdrop/teratoma/minor(M.loc)
+ if(tetsuo && prob(30))
+ new /obj/effect/spawner/lootdrop/teratoma/major(M.loc)
+ if(tetsuo && prob(10) && A.affected_mob.job == "Clown")
+ new /obj/effect/spawner/lootdrop/teratoma/major/clown(M.loc)
+ if(tetsuo)
+ M.adjustBruteLoss(-5)
+ if(prob(20))
+ M.adjustCloneLoss(1)
+ else if(bruteheal)
+ M.adjustBruteLoss(-1)
+ else
+ if(prob(5))
+ to_chat(M, "[pick("You feel bloated.", "The station seems small", "You are the strongest")]")
+ return
+
+/obj/effect/mob_spawn/teratomamonkey //spawning these is one of the downsides of overclocking the symptom
+ name = "fleshy mass"
+ desc = "A writhing mass of flesh."
+ icon = 'icons/mob/blob.dmi'
+ icon_state = "blob_spore_temp"
+ density = FALSE
+ anchored = FALSE
+
+ mob_type = /mob/living/carbon/monkey/tumor
+ mob_name = "a living tumor"
+ death = FALSE
+ roundstart = FALSE
+ flavour_text = {"
+ You are a living teratoma, and your existence is misery. You feel the need to spread woe about the station- but not to kill.
+ "}
+
+/obj/effect/mob_spawn/teratomamonkey/Initialize()
+ . = ..()
+ var/area/A = get_area(src)
+ if(A)
+ notify_ghosts("A living tumor has been born in [A.name].", 'sound/effects/splat.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
+
+/obj/effect/mob_spawn/teratomamonkey/attack_hand(mob/living/user)
+ . = ..()
+ if(.)
+ return
+ to_chat(user, "Ew... It would be a bad idea to touch this. It could probably be destroyed with the extreme heat of a welder.")
+
+/obj/effect/mob_spawn/teratomamonkey/attackby(obj/item/W, mob/user, params)
+ if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM)
+ user.visible_message("[usr.name] destroys [src].",
+ "You hold the welder to [src], and it violently bursts!",
+ "You hear a gurgling noise")
+ new /obj/effect/gibspawner/human(get_turf(src))
+ qdel(src)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm
index 24ba024a..89d1d6d6 100644
--- a/code/datums/diseases/advance/symptoms/narcolepsy.dm
+++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm
@@ -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
diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm
index a60011d3..778909ed 100644
--- a/code/datums/diseases/advance/symptoms/oxygen.dm
+++ b/code/datums/diseases/advance/symptoms/oxygen.dm
@@ -1,52 +1,66 @@
-/*
-//////////////////////////////////////
-
-Self-Respiration
-
- Slightly hidden.
- Lowers resistance significantly.
- Decreases stage speed significantly.
- Decreases transmittablity tremendously.
- Fatal Level.
-
-Bonus
- The body generates salbutamol.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/oxygen
-
- name = "Self-Respiration"
- desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
- stealth = 1
- resistance = -3
- stage_speed = -3
- transmittable = -4
- level = 6
- base_message_chance = 5
- symptom_delay_min = 1
- symptom_delay_max = 1
- var/regenerate_blood = FALSE
- threshold_desc = "Resistance 8:Additionally regenerates lost blood.
"
-
-/datum/symptom/oxygen/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 8) //blood regeneration
- regenerate_blood = TRUE
-
-/datum/symptom/oxygen/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- M.adjustOxyLoss(-7, 0)
- M.losebreath = max(0, M.losebreath - 4)
- if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio))
- M.blood_volume += 1
- else
- if(prob(base_message_chance))
- to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")
- return
+/*
+//////////////////////////////////////
+
+Self-Respiration
+
+ Slightly hidden.
+ Lowers resistance significantly.
+ Decreases stage speed significantly.
+ Decreases transmittablity tremendously.
+ Fatal Level.
+
+Bonus
+ The body generates salbutamol.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/oxygen
+
+ name = "Self-Respiration"
+ desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
+ stealth = 1
+ resistance = -3
+ stage_speed = -3
+ transmittable = -4
+ level = 6
+ base_message_chance = 5
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/regenerate_blood = FALSE
+ threshold_desc = "Resistance 8: Additionally regenerates lost blood.
"
+
+/datum/symptom/oxygen/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["resistance"] >= 8) //blood regeneration
+ regenerate_blood = TRUE
+
+/datum/symptom/oxygen/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
+ M.adjustOxyLoss(-7, 0)
+ M.losebreath = max(0, M.losebreath - 4)
+ if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL)
+ M.blood_volume += 1
+ else
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")
+ return
+
+/datum/symptom/oxygen/on_stage_change(new_stage, datum/disease/advance/A)
+ if(!..())
+ return FALSE
+ var/mob/living/carbon/M = A.affected_mob
+ if(A.stage <= 3)
+ REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
+ return TRUE
+
+/datum/symptom/oxygen/End(datum/disease/advance/A)
+ if(!..())
+ return
+ REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT)
diff --git a/code/datums/diseases/advance/symptoms/radiation.dm b/code/datums/diseases/advance/symptoms/radiation.dm
index c52ae6a8..17447f90 100644
--- a/code/datums/diseases/advance/symptoms/radiation.dm
+++ b/code/datums/diseases/advance/symptoms/radiation.dm
@@ -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 = "Transmission 12: Makes the host irradiate others around them as well.
\
- Speed 8: Host takes radiation damage faster."
+ threshold_desc = "Speed 8: 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, "You feel like the atoms inside you are beginning to split...")
if(4, 5)
- if(fastrads)
- radiate(M, 80)
- else
- radiate(M, 40)
- if(radothers && A.stage == 5)
- if(prob(40))
- M.visible_message("[M] glows green for a moment!", \
- "You feel a massive wave of pain flow through you!")
- radiation_pulse(M, 20)
-
+ radiate(M)
-/datum/symptom/radiation/proc/radiate(mob/living/carbon/M, chance)
- if(prob(chance))
- to_chat(M, "You feel a wave of pain throughout your body!")
- M.radiation += 4
+/datum/symptom/radiation/proc/radiate(mob/living/carbon/M)
+ to_chat(M, "You feel a wave of pain throughout your body!")
+ if(fastrads)
+ M.radiation += 150
+ else
+ M.radiation += 75
+ return 1
diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm
index 2d8ec91f..2d20ca80 100644
--- a/code/datums/diseases/advance/symptoms/skin.dm
+++ b/code/datums/diseases/advance/symptoms/skin.dm
@@ -86,3 +86,46 @@ BONUS
H.update_body(0)
else
H.visible_message("[H] looks a bit dark...", "Your skin suddenly appears darker...")
+
+/*
+//////////////////////////////////////
+Polyvitiligo
+
+ Not Noticeable.
+ Increases resistance slightly.
+ Increases stage speed.
+ Transmittable.
+ Low Level.
+
+BONUS
+ Makes the host change color
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/polyvitiligo
+ name = "Polyvitiligo"
+ desc = "The virus replaces the melanin in the skin with reactive pigment."
+ stealth = 0
+ resistance = 1
+ stage_speed = 2
+ transmittable = 2
+ level = 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("[M] looks rather vibrant...", "The colors, man, the colors...")
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 4b040786..4c858172 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -26,8 +26,7 @@ Bonus
severity = 1
symptom_delay_min = 5
symptom_delay_max = 35
- threshold_desc = "Transmission 9: The host will sneeze periodically, spreading the disease.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_desc = "Stealth 4: The symptom remains hidden until active."
/datum/symptom/sneeze/Start(datum/disease/advance/A)
if(!..())
@@ -38,8 +37,6 @@ Bonus
/datum/symptom/sneeze/Activate(datum/disease/advance/A)
if(!..())
return
- if(!A.properties["transmittable"] >= 9)
- return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
@@ -47,4 +44,3 @@ Bonus
M.emote("sniff")
else
M.emote("sneeze")
- A.spread(4 + power)
diff --git a/code/datums/diseases/advance/symptoms/species.dm b/code/datums/diseases/advance/symptoms/species.dm
index d0c32f32..a8b18ae7 100644
--- a/code/datums/diseases/advance/symptoms/species.dm
+++ b/code/datums/diseases/advance/symptoms/species.dm
@@ -8,12 +8,14 @@
level = 5
severity = 0
-/datum/symptom/undead_adaptation/Start(datum/disease/advance/A)
- if(!..())
- return
+/datum/symptom/undead_adaptation/OnAdd(datum/disease/advance/A)
A.process_dead = TRUE
A.infectable_biotypes |= MOB_UNDEAD
+/datum/symptom/undead_adaptation/OnRemove(datum/disease/advance/A)
+ A.process_dead = FALSE
+ A.infectable_biotypes -= MOB_UNDEAD
+
/datum/symptom/inorganic_adaptation
name = "Inorganic Biology"
desc = "The virus can survive and replicate even in an inorganic environment, increasing its resistance and infection rate."
@@ -24,7 +26,8 @@
level = 5
severity = 0
-/datum/symptom/inorganic_adaptation/Start(datum/disease/advance/A)
- if(!..())
- return
- A.infectable_biotypes |= MOB_INORGANIC
\ No newline at end of file
+/datum/symptom/inorganic_adaptation/OnAdd(datum/disease/advance/A)
+ A.infectable_biotypes |= MOB_INORGANIC
+
+/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A)
+ A.infectable_biotypes -= MOB_INORGANIC
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 95831b36..33f5ca4d 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -60,15 +60,26 @@
next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10)
return TRUE
+/datum/symptom/proc/on_stage_change(new_stage, datum/disease/advance/A)
+ if(neutered)
+ return FALSE
+ return TRUE
+
/datum/symptom/proc/Copy()
var/datum/symptom/new_symp = new type
new_symp.name = name
new_symp.id = id
new_symp.neutered = neutered
return new_symp
-
+
/datum/symptom/proc/OnDeath(datum/disease/advance/A)
return !neutered
/datum/symptom/proc/generate_threshold_desc()
return
+
+/datum/symptom/proc/OnAdd(datum/disease/advance/A) //Overload when a symptom needs to be active before processing, like changing biotypes.
+ return
+
+/datum/symptom/proc/OnRemove(datum/disease/advance/A) //But dont forget to remove them too.
+ return
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index b4a33cb8..940e1af7 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -20,9 +20,9 @@ Bonus
name = "Hyphema"
desc = "The virus causes inflammation of the retina, leading to eye damage and eventually blindness."
stealth = -1
- resistance = -4
+ resistance = -3
stage_speed = -4
- transmittable = -3
+ transmittable = -2
level = 5
severity = 5
base_message_chance = 50
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm
index f53638bc..8c57fc82 100644
--- a/code/datums/diseases/advance/symptoms/vomit.dm
+++ b/code/datums/diseases/advance/symptoms/vomit.dm
@@ -24,9 +24,9 @@ Bonus
name = "Vomiting"
desc = "The virus causes nausea and irritates the stomach, causing occasional vomit."
stealth = -2
- resistance = -1
+ resistance = 1
stage_speed = 0
- transmittable = 1
+ transmittable = 2
level = 3
severity = 3
base_message_chance = 100
@@ -60,4 +60,4 @@ Bonus
vomit(M)
/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
- M.vomit(20, vomit_blood, distance = proj_vomit)
+ M.vomit(20, vomit_blood, stun = 0, distance = proj_vomit)
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm
index 66fc90f1..a1129561 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/advance/symptoms/weight.dm
@@ -23,18 +23,18 @@ Bonus
stealth = -2
resistance = 2
stage_speed = -2
- transmittable = -2
+ transmittable = -1
level = 3
severity = 3
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 45
- threshold_desc = "Stealth 4: The symptom is less noticeable."
+ threshold_desc = "Stealth 2: The symptom is less noticeable."
/datum/symptom/weight_loss/Start(datum/disease/advance/A)
if(!..())
return
- if(A.properties["stealth"] >= 4) //warn less often
+ if(A.properties["stealth"] >= 2) //warn less often
base_message_chance = 25
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index b78a2192..5466d9ff 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -172,6 +172,53 @@
/obj/item/organ/body_egg/alien_embryo = 1,
/obj/item/organ/regenerative_core = 2)
lootcount = 3
+/obj/effect/spawner/lootdrop/teratoma/minor
+ name = "teratoma spawner"
+ loot = list(
+ /obj/item/organ/tongue = 5,
+ /obj/item/organ/tongue/lizard = 1,
+ /obj/item/organ/tail/cat = 1,
+ /obj/item/organ/stomach = 5,
+ /obj/item/organ/tongue/zombie = 1,
+ /obj/item/organ/tongue/fly = 1,
+ /obj/item/organ/stomach/fly = 1,
+ /obj/item/organ/ears = 5,
+ /obj/item/organ/ears/cat = 1,
+ /obj/item/organ/eyes = 5,
+ /obj/item/organ/heart = 5,
+ /obj/item/organ/liver = 5,
+ /obj/item/organ/tail/lizard = 1,
+ /obj/item/organ/appendix = 5,
+ /obj/effect/gibspawner/human = 1)
+
+/obj/effect/spawner/lootdrop/teratoma/major
+ name = "advanced teratoma spawner"
+ loot = list(
+ /obj/item/organ/adamantine_resonator = 2,
+ /obj/item/organ/heart/gland/viral = 1,
+ /obj/item/organ/eyes/night_vision = 1,
+ /obj/item/organ/liver/plasmaman = 3,
+ /obj/item/organ/stomach/plasmaman = 3,
+ /obj/item/organ/lungs/plasmaman = 3,
+ /obj/item/organ/lungs/slime = 3,
+ /obj/item/organ/tongue/abductor = 1,
+ /obj/item/organ/tongue/bone = 3,
+ /obj/item/organ/tongue/bone/plasmaman = 1,
+ /obj/item/organ/vocal_cords/adamantine = 1,
+ /obj/effect/gibspawner/xeno = 1,
+ /obj/effect/mob_spawn/human/corpse/assistant = 1,
+ /obj/effect/mob_spawn/teratomamonkey = 5)
+
+/obj/effect/spawner/lootdrop/teratoma/major/clown
+ name = "funny teratoma spawner"
+ loot = list(
+ /mob/living/simple_animal/hostile/retaliate/frog = 1,
+ /mob/living/simple_animal/hostile/retaliate/clown = 1,
+ /mob/living/simple_animal/hostile/retaliate/spaceman = 1,
+ /obj/item/clothing/mask/gas/clown_hat = 4,
+ /obj/item/clothing/shoes/clown_shoes = 3,
+ /obj/item/bikehorn = 5,
+ /obj/item/reagent_containers/food/snacks/pie/cream = 3)
/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner
name = "2% chance xeno egg spawner"
diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm
index 07cd3030..ccab2be3 100644
--- a/code/modules/antagonists/disease/disease_abilities.dm
+++ b/code/modules/antagonists/disease/disease_abilities.dm
@@ -5,26 +5,48 @@ is currently following.
*/
GLOBAL_LIST_INIT(disease_ability_singletons, list(
- new /datum/disease_ability/action/cough(),
- new /datum/disease_ability/action/sneeze(),
- new /datum/disease_ability/action/infect(),
- new /datum/disease_ability/symptom/cough(),
- new /datum/disease_ability/symptom/sneeze(),\
- new /datum/disease_ability/symptom/hallucigen(),
- new /datum/disease_ability/symptom/choking(),
- new /datum/disease_ability/symptom/confusion(),
- new /datum/disease_ability/symptom/youth(),
- new /datum/disease_ability/symptom/vomit(),
- new /datum/disease_ability/symptom/voice_change(),
- new /datum/disease_ability/symptom/visionloss(),
- new /datum/disease_ability/symptom/viraladaptation(),
- new /datum/disease_ability/symptom/vitiligo(),
- new /datum/disease_ability/symptom/sensory_restoration(),
- new /datum/disease_ability/symptom/itching(),
- new /datum/disease_ability/symptom/weight_loss(),
- new /datum/disease_ability/symptom/metabolism_heal(),
- new /datum/disease_ability/symptom/coma_heal()
- ))
+new /datum/disease_ability/action/cough,
+new /datum/disease_ability/action/sneeze,
+new /datum/disease_ability/action/infect,
+new /datum/disease_ability/symptom/mild/cough,
+new /datum/disease_ability/symptom/mild/sneeze,
+new /datum/disease_ability/symptom/medium/beard,
+new /datum/disease_ability/symptom/medium/hallucigen,
+new /datum/disease_ability/symptom/medium/confusion,
+new /datum/disease_ability/symptom/medium/vomit,
+new /datum/disease_ability/symptom/medium/voice_change,
+new /datum/disease_ability/symptom/medium/visionloss,
+new /datum/disease_ability/symptom/medium/deafness,
+new /datum/disease_ability/symptom/powerful/narcolepsy,
+new /datum/disease_ability/symptom/medium/fever,
+new /datum/disease_ability/symptom/medium/shivering,
+new /datum/disease_ability/symptom/medium/headache,
+new /datum/disease_ability/symptom/medium/nano_boost,
+new /datum/disease_ability/symptom/medium/nano_destroy,
+new /datum/disease_ability/symptom/medium/viraladaptation,
+new /datum/disease_ability/symptom/medium/viralevolution,
+new /datum/disease_ability/symptom/medium/vitiligo,
+new /datum/disease_ability/symptom/medium/revitiligo,
+new /datum/disease_ability/symptom/medium/itching,
+new /datum/disease_ability/symptom/medium/heal/weight_loss,
+new /datum/disease_ability/symptom/medium/heal/sensory_restoration,
+new /datum/disease_ability/symptom/medium/heal/mind_restoration,
+new /datum/disease_ability/symptom/powerful/fire,
+new /datum/disease_ability/symptom/powerful/flesh_eating,
+new /datum/disease_ability/symptom/powerful/genetic_mutation,
+new /datum/disease_ability/symptom/powerful/inorganic_adaptation,
+new /datum/disease_ability/symptom/powerful/heal/oxygen,
+new /datum/disease_ability/symptom/powerful/heal/chem,
+new /datum/disease_ability/symptom/powerful/heal/coma,
+new /datum/disease_ability/symptom/powerful/heal/teleport,
+new /datum/disease_ability/symptom/powerful/heal/growth,
+new /datum/disease_ability/symptom/powerful/heal/EMP,
+new /datum/disease_ability/symptom/powerful/heal/sweat,
+new /datum/disease_ability/symptom/powerful/wizarditis,
+new /datum/disease_ability/symptom/medium/pierrot,
+new /datum/disease_ability/symptom/medium/cockroach,
+new /datum/disease_ability/symptom/powerful/youth
+))
/datum/disease_ability
var/name
@@ -234,155 +256,180 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
O.AddComponent(/datum/component/infective, D.disease_template, 300)
StartCooldown()
return TRUE
+/*******************BASE SYMPTOM TYPES*******************/
+// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype...
+//healing no longer costs more, sans regen coma, due to how healing symptoms have been made scary
-//passive symptom abilities
-
-/datum/disease_ability/symptom/cough
- name = "Involuntary Coughing"
- symptoms = list(/datum/symptom/cough)
+/datum/disease_ability/symptom/mild
cost = 2
required_total_points = 4
+ category = "Symptom (Weak)"
+
+/datum/disease_ability/symptom/medium
+ cost = 4
+ required_total_points = 8
+ category = "Symptom"
+
+/datum/disease_ability/symptom/medium/heal
+ cost = 5
+ category = "Symptom (+)"
+
+/datum/disease_ability/symptom/powerful
+ cost = 4
+ required_total_points = 16
+ category = "Symptom (Strong)"
+
+/datum/disease_ability/symptom/powerful/heal
+ cost = 8
+ category = "Symptom (Strong+)"
+
+/******MILD******/
+
+/datum/disease_ability/symptom/mild/cough
+ name = "Involuntary Coughing"
+ symptoms = list(/datum/symptom/cough)
short_desc = "Cause victims to cough intermittently."
long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high."
-/datum/disease_ability/symptom/sneeze
+/datum/disease_ability/symptom/mild/sneeze
name = "Involuntary Sneezing"
symptoms = list(/datum/symptom/sneeze)
- cost = 2
- required_total_points = 4
short_desc = "Cause victims to sneeze intermittently."
long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth."
-/datum/disease_ability/symptom/beard
- //I don't think I need to justify the fact that this is the best symptom
- name = "Beard Growth"
- symptoms = list(/datum/symptom/beard)
- cost = 1
- required_total_points = 8
- short_desc = "Cause all victims to grow a luscious beard."
- long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus."
+/******MEDIUM******/
-/datum/disease_ability/symptom/hallucigen
- name = "Hallucinations"
+/datum/disease_ability/symptom/medium/beard
+ symptoms = list(/datum/symptom/beard)
+ short_desc = "Cause all victims to grow a luscious beard."
+ long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus."
+
+/datum/disease_ability/symptom/medium/hallucigen
symptoms = list(/datum/symptom/hallucigen)
- cost = 4
- required_total_points = 8
short_desc = "Cause victims to hallucinate."
long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance."
-
-/datum/disease_ability/symptom/choking
- name = "Choking"
- symptoms = list(/datum/symptom/choking)
- cost = 4
- required_total_points = 8
- short_desc = "Cause victims to choke."
- long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility."
-
-
-/datum/disease_ability/symptom/confusion
- name = "Confusion"
+/datum/disease_ability/symptom/medium/confusion
symptoms = list(/datum/symptom/confusion)
- cost = 4
- required_total_points = 8
short_desc = "Cause victims to become confused."
long_desc = "Cause victims to become confused intermittently."
-
-/datum/disease_ability/symptom/youth
- name = "Eternal Youth"
- symptoms = list(/datum/symptom/youth)
- cost = 4
- required_total_points = 8
- short_desc = "Cause victims to become eternally young."
- long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
-
-
-/datum/disease_ability/symptom/vomit
- name = "Vomiting"
+/datum/disease_ability/symptom/medium/vomit
symptoms = list(/datum/symptom/vomit)
- cost = 4
- required_total_points = 8
short_desc = "Cause victims to vomit."
long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
-
-/datum/disease_ability/symptom/voice_change
- name = "Voice Changing"
+/datum/disease_ability/symptom/medium/voice_change
symptoms = list(/datum/symptom/voice_change)
- cost = 4
- required_total_points = 8
short_desc = "Change the voice of victims."
long_desc = "Change the voice of victims, causing confusion in communications."
-
-/datum/disease_ability/symptom/visionloss
- name = "Vision Loss"
+/datum/disease_ability/symptom/medium/visionloss
symptoms = list(/datum/symptom/visionloss)
- cost = 4
- required_total_points = 8
short_desc = "Damage the eyes of victims, eventually causing blindness."
long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats."
+/datum/disease_ability/symptom/medium/deafness
+ symptoms = list(/datum/symptom/deafness)
-/datum/disease_ability/symptom/viraladaptation
- name = "Self-Adaptation"
+/datum/disease_ability/symptom/medium/fever
+ symptoms = list(/datum/symptom/fever)
+
+/datum/disease_ability/symptom/medium/shivering
+ symptoms = list(/datum/symptom/shivering)
+
+/datum/disease_ability/symptom/medium/headache
+ symptoms = list(/datum/symptom/headache)
+
+/datum/disease_ability/symptom/medium/nano_boost
+ symptoms = list(/datum/symptom/nano_boost)
+
+/datum/disease_ability/symptom/medium/nano_destroy
+ symptoms = list(/datum/symptom/nano_destroy)
+
+/datum/disease_ability/symptom/medium/viraladaptation
symptoms = list(/datum/symptom/viraladaptation)
- cost = 4
- required_total_points = 8
short_desc = "Cause your infection to become more resistant to detection and eradication."
long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed."
+/datum/disease_ability/symptom/medium/viralevolution
+ symptoms = list(/datum/symptom/viralevolution)
-/datum/disease_ability/symptom/vitiligo
- name = "Skin Paleness"
+/datum/disease_ability/symptom/medium/vitiligo
symptoms = list(/datum/symptom/vitiligo)
- cost = 1
- required_total_points = 8
- short_desc = "Cause victims to become pale."
- long_desc = "Cause victims to become pale. Decreases all stats."
+/datum/disease_ability/symptom/medium/revitiligo
+ symptoms = list(/datum/symptom/revitiligo)
-/datum/disease_ability/symptom/sensory_restoration
- name = "Sensory Restoration"
- symptoms = list(/datum/symptom/sensory_restoration)
- cost = 4
- required_total_points = 8
- short_desc = "Regenerate eye and ear damage of victims."
- long_desc = "Regenerate eye and ear damage of victims."
+/datum/disease_ability/symptom/medium/pierrot
+ symptoms = list(/datum/symptom/pierrot)
+/datum/disease_ability/symptom/medium/cockroach
+ symptoms = list(/datum/symptom/cockroach)
-/datum/disease_ability/symptom/itching
- name = "Itching"
+/datum/disease_ability/symptom/medium/itching
symptoms = list(/datum/symptom/itching)
- cost = 4
- required_total_points = 8
short_desc = "Cause victims to itch."
long_desc = "Cause victims to itch, increasing all stats except stealth."
-
-/datum/disease_ability/symptom/weight_loss
- name = "Weight Loss"
+/datum/disease_ability/symptom/medium/heal/weight_loss
symptoms = list(/datum/symptom/weight_loss)
- cost = 4
- required_total_points = 8
short_desc = "Cause victims to lose weight."
long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
+/datum/disease_ability/symptom/medium/heal/sensory_restoration
+ symptoms = list(/datum/symptom/sensory_restoration)
+ short_desc = "Regenerate eye and ear damage of victims."
+ long_desc = "Regenerate eye and ear damage of victims."
-/datum/disease_ability/symptom/metabolism_heal
- name = "Metabolic Boost"
- symptoms = list(/datum/symptom/heal/metabolism)
+/datum/disease_ability/symptom/medium/heal/mind_restoration
+ symptoms = list(/datum/symptom/mind_restoration)
+
+/******POWERFUL******/
+
+/datum/disease_ability/symptom/powerful/fire
+ symptoms = list(/datum/symptom/fire)
+
+/datum/disease_ability/symptom/powerful/flesh_eating
+ symptoms = list(/datum/symptom/flesh_eating)
+
+/datum/disease_ability/symptom/powerful/wizarditis //strong because it can remove hardsuits and bio protection
+ symptoms = list(/datum/symptom/wizarditis)
+
+/datum/disease_ability/symptom/powerful/genetic_mutation
+ symptoms = list(/datum/symptom/genetic_mutation)
+
+/datum/disease_ability/symptom/powerful/inorganic_adaptation
+ symptoms = list(/datum/symptom/inorganic_adaptation)
+
+/datum/disease_ability/symptom/powerful/narcolepsy
+ symptoms = list(/datum/symptom/narcolepsy)
+
+/datum/disease_ability/symptom/powerful/youth
+ symptoms = list(/datum/symptom/youth)
+ short_desc = "Cause victims to become eternally young."
+ long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
+
+/****HEALING SUBTYPE****/
+
+/datum/disease_ability/symptom/powerful/heal/oxygen
+ symptoms = list(/datum/symptom/oxygen)
+
+/datum/disease_ability/symptom/powerful/heal/chem
+ symptoms = list(/datum/symptom/heal/chem)
cost = 4
- required_total_points = 16
- short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster."
- long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly."
-
-/datum/disease_ability/symptom/coma_heal
- name = "Regenerative Coma"
+/datum/disease_ability/symptom/powerful/heal/coma
symptoms = list(/datum/symptom/heal/coma)
- cost = 8
- required_total_points = 16
- short_desc = "Cause victims to fall into a healing coma when hurt."
- long_desc = "Cause victims to fall into a healing coma when hurt."
+
+/datum/disease_ability/symptom/powerful/heal/teleport
+ symptoms = list(/datum/symptom/teleport)
+
+/datum/disease_ability/symptom/powerful/heal/growth
+ symptoms = list(/datum/symptom/growth)
+
+/datum/disease_ability/symptom/powerful/heal/EMP
+ symptoms = list(/datum/symptom/EMP)
+
+/datum/disease_ability/symptom/powerful/heal/sweat
+ symptoms = list(/datum/symptom/sweat)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 0840288e..07d76fe3 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -249,3 +249,13 @@
max_integrity = 200
resistance_flags = FLAMMABLE
armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
+
+/obj/item/clothing/suit/armor/monolith
+ name = "Monolith suit"
+ desc = "The producer is unknown. Its protective properties are slightly worse then those of the bulletproof vest. Its structure combines a bulletproof vest and radiation protection plates. It provides good protection from gunfire."
+ icon_state = "monolit"
+ item_state = "monolit"
+ blood_overlay_type = "armor"
+ armor = list("melee" = 15, "bullet" = 55, "laser" = 5, "energy" = 5, "bomb" = 40, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 50)
+ strip_delay = 70
+ equip_delay_other = 50
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index b3b9c0c5..a621404a 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -755,4 +755,14 @@
icon_state = "christmasfemaleg"
item_state = "christmasfemaleg"
body_parts_covered = CHEST|GROIN
- can_adjust = FALSE
\ No newline at end of file
+ can_adjust = FALSE
+
+/obj/item/clothing/under/zone/monolith
+ name = "Urban BDU"
+ desc = "A splinter urban camouflage Battle-Dress uniform."
+ icon_state = "camourban"
+ item_state = "camourban"
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS
+ fitted = NO_FEMALE_UNIFORM
+ can_adjust = FALSE
+ resistance_flags = NONE
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index e26dab07..e9ec7eff 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -23,6 +23,8 @@
var/obj/item/clothing/CH = head
if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL)
return 1
+ if(HAS_TRAIT(src, TRAIT_BEEFRIEND))
+ return 1
return 0
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 23ec0297..bf1fe383 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -136,7 +136,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
hoodtype = /obj/item/clothing/head/hooded/explorer/seva
- armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25)
+ armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 25)
resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS
/obj/item/clothing/head/hooded/explorer/seva
@@ -145,7 +145,7 @@
icon_state = "seva"
item_state = "seva"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25)
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 25)
resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS
/obj/item/clothing/mask/gas/seva
@@ -153,32 +153,38 @@
desc = "A face-covering plate that can be connected to an air supply. Intended for use with the SEVA Suit."
icon_state = "seva"
item_state = "seva"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 100, "rad" = 30, "fire" = 100, "acid" = 25)
resistance_flags = FIRE_PROOF
/****************Exo-Suit and Mask****************/
/obj/item/clothing/suit/hooded/explorer/exo
- name = "Exo-suit"
- desc = "A robust suit for exploring dangerous environments."
+ name = "Explorer Exoskeleton"
+ desc = "A very robust military exosuit. It is composed of two separate pieces of equipment: the Radiation suit which boasts heavy military kevlar around the entire body, along with composite plates on some of the outer regions of the armour."
icon_state = "exo"
item_state = "exo"
w_class = WEIGHT_CLASS_BULKY
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
hoodtype = /obj/item/clothing/head/hooded/explorer/exo
- armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
+ armor = list("melee" = 60, "bullet" = 15, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE
/obj/item/clothing/head/hooded/explorer/exo
- name = "Exo-hood"
- desc = "A robust helmet for exploring dangerous environments."
+ name = "Tactical Exo-Helmet"
+ desc = "A recent model of a tactical helmet that lacks camouflage. It is not known how it made its way into NT. The helmet is designed to provide a squad leader with strategic superiority over the enemy via its many scanners and satellite communications devices, which have not been installed in this particular helmet. Comes with multi-layered Kevlar protection and armored elements."
icon_state = "exo"
item_state = "exo"
- armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
+ armor = list("melee" = 60, "bullet" = 15, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE
/obj/item/clothing/mask/gas/exo
- name = "Exosuit Mask"
- desc = "A face-covering mask that can be connected to an air supply. Intended for use with the Exosuit."
+ name = "M40 Gasmask"
+ desc = "One of various gas masks used by the ancient U.S.A.F. and its allies to protect from field concentrations of chemical and biological agents, along with radiological fallout particles. It is not effective in an oxygen deficient environment, so it must be connected to an air supply."
icon_state = "exo"
item_state = "exo"
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
+ visor_flags_inv = HIDEFACIALHAIR
+ visor_flags_cover = MASKCOVERSMOUTH
+ actions_types = list(/datum/action/item_action/adjust)
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 0796b713..7b44a01a 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -1,171 +1,183 @@
-/mob/living/carbon/monkey
- name = "monkey"
- verb_say = "chimpers"
- initial_language_holder = /datum/language_holder/monkey
- icon = 'icons/mob/monkey.dmi'
- icon_state = ""
- gender = NEUTER
- pass_flags = PASSTABLE
- ventcrawler = VENTCRAWLER_NUDE
- mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
- type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey
- gib_type = /obj/effect/decal/cleanable/blood/gibs
- unique_name = TRUE
- bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey,
- /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey)
- hud_type = /datum/hud/monkey
-
-/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
- verbs += /mob/living/proc/mob_sleep
- verbs += /mob/living/proc/lay_down
-
- if(unique_name) //used to exclude pun pun
- gender = pick(MALE, FEMALE)
- real_name = name
-
- //initialize limbs
- create_bodyparts()
- create_internal_organs()
-
- . = ..()
-
- if (cubespawned)
- var/cap = CONFIG_GET(number/monkeycap)
- if (LAZYLEN(SSmobs.cubemonkeys) > cap)
- if (spawner)
- to_chat(spawner, "Bluespace harmonics prevent the spawning of more than [cap] monkeys on the station at one time!")
- return INITIALIZE_HINT_QDEL
- SSmobs.cubemonkeys += src
-
- create_dna(src)
- dna.initialize_dna(random_blood_type())
-
-/mob/living/carbon/monkey/Destroy()
- SSmobs.cubemonkeys -= src
- return ..()
-
-/mob/living/carbon/monkey/create_internal_organs()
- internal_organs += new /obj/item/organ/appendix
- internal_organs += new /obj/item/organ/lungs
- internal_organs += new /obj/item/organ/heart
- internal_organs += new /obj/item/organ/brain
- internal_organs += new /obj/item/organ/tongue
- internal_organs += new /obj/item/organ/eyes
- internal_organs += new /obj/item/organ/ears
- internal_organs += new /obj/item/organ/liver
- internal_organs += new /obj/item/organ/stomach
- ..()
-
-/mob/living/carbon/monkey/on_reagent_change()
- . = ..()
- remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE)
- var/amount
- if(reagents.has_reagent("morphine"))
- amount = -1
- if(reagents.has_reagent("nuka_cola"))
- amount = -1
- if(amount)
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
-
-/mob/living/carbon/monkey/updatehealth()
- . = ..()
- var/slow = 0
- var/health_deficiency = (100 - health)
- if(health_deficiency >= 45)
- slow += (health_deficiency / 25)
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow)
-
-/mob/living/carbon/monkey/adjust_bodytemperature(amount)
- . = ..()
- var/slow = 0
- if (bodytemperature < 283.222)
- slow += (283.222 - bodytemperature) / 10 * 1.75
- if(slow <= 0)
- return
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
-
-/mob/living/carbon/monkey/Stat()
- ..()
- if(statpanel("Status"))
- stat(null, "Intent: [a_intent]")
- stat(null, "Move Mode: [m_intent]")
- if(client && mind)
- var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
- if(changeling)
- stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]")
- stat("Absorbed DNA", changeling.absorbedcount)
- return
-
-
-/mob/living/carbon/monkey/verb/removeinternal()
- set name = "Remove Internals"
- set category = "IC"
- internal = null
- return
-
-
-/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools
- if(mind && is_monkey(mind))
- return TRUE
- return FALSE
-
-/mob/living/carbon/monkey/reagent_check(datum/reagent/R) //can metabolize all reagents
- return FALSE
-
-/mob/living/carbon/monkey/canBeHandcuffed()
- return TRUE
-
-/mob/living/carbon/monkey/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
- if(judgement_criteria & JUDGE_EMAGGED)
- return 10 //Everyone is a criminal!
-
- var/threatcount = 0
-
- //Securitrons can't identify monkeys
- if( !(judgement_criteria & JUDGE_IGNOREMONKEYS) && (judgement_criteria & JUDGE_IDCHECK) )
- threatcount += 4
-
- //Lasertag bullshit
- if(lasercolor)
- if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
- if(is_holding_item_of_type(/obj/item/gun/energy/laser/redtag))
- threatcount += 4
-
- if(lasercolor == "r")
- if(is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag))
- threatcount += 4
-
- return threatcount
-
- //Check for weapons
- if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck )
- for(var/obj/item/I in held_items) //if they're holding a gun
- if(weaponcheck.Invoke(I))
- threatcount += 4
- if(weaponcheck.Invoke(back)) //if a weapon is present in the back slot
- threatcount += 4 //trigger look_for_perp() since they're nonhuman and very likely hostile
-
- //mindshield implants imply trustworthyness
- if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
- threatcount -= 1
-
- return threatcount
-
-/mob/living/carbon/monkey/IsVocal()
- if(!getorganslot(ORGAN_SLOT_LUNGS))
- return 0
- return 1
-
-/mob/living/carbon/monkey/can_use_guns(obj/item/G)
- return TRUE
-
-/mob/living/carbon/monkey/angry
- aggressive = TRUE
-
-/mob/living/carbon/monkey/angry/Initialize()
- . = ..()
- if(prob(10))
- var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
- equip_to_slot_or_del(helmet,SLOT_HEAD)
- helmet.attack_self(src) // todo encapsulate toggle
+/mob/living/carbon/monkey
+ name = "monkey"
+ verb_say = "chimpers"
+ initial_language_holder = /datum/language_holder/monkey
+ icon = 'icons/mob/monkey.dmi'
+ icon_state = ""
+ gender = NEUTER
+ pass_flags = PASSTABLE
+ ventcrawler = VENTCRAWLER_NUDE
+ mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
+ type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey
+ gib_type = /obj/effect/decal/cleanable/blood/gibs
+ unique_name = TRUE
+ bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey,
+ /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey)
+ hud_type = /datum/hud/monkey
+
+/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
+ verbs += /mob/living/proc/mob_sleep
+ verbs += /mob/living/proc/lay_down
+
+ if(unique_name) //used to exclude pun pun
+ gender = pick(MALE, FEMALE)
+ real_name = name
+
+ //initialize limbs
+ create_bodyparts()
+ create_internal_organs()
+
+ . = ..()
+
+ if (cubespawned)
+ var/cap = CONFIG_GET(number/monkeycap)
+ if (LAZYLEN(SSmobs.cubemonkeys) > cap)
+ if (spawner)
+ to_chat(spawner, "Bluespace harmonics prevent the spawning of more than [cap] monkeys on the station at one time!")
+ return INITIALIZE_HINT_QDEL
+ SSmobs.cubemonkeys += src
+
+ create_dna(src)
+ dna.initialize_dna(random_blood_type())
+
+/mob/living/carbon/monkey/Destroy()
+ SSmobs.cubemonkeys -= src
+ return ..()
+
+/mob/living/carbon/monkey/create_internal_organs()
+ internal_organs += new /obj/item/organ/appendix
+ internal_organs += new /obj/item/organ/lungs
+ internal_organs += new /obj/item/organ/heart
+ internal_organs += new /obj/item/organ/brain
+ internal_organs += new /obj/item/organ/tongue
+ internal_organs += new /obj/item/organ/eyes
+ internal_organs += new /obj/item/organ/ears
+ internal_organs += new /obj/item/organ/liver
+ internal_organs += new /obj/item/organ/stomach
+ ..()
+
+/mob/living/carbon/monkey/on_reagent_change()
+ . = ..()
+ remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE)
+ var/amount
+ if(reagents.has_reagent("morphine"))
+ amount = -1
+ if(reagents.has_reagent("nuka_cola"))
+ amount = -1
+ if(amount)
+ add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+
+/mob/living/carbon/monkey/updatehealth()
+ . = ..()
+ var/slow = 0
+ var/health_deficiency = (100 - health)
+ if(health_deficiency >= 45)
+ slow += (health_deficiency / 25)
+ add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow)
+
+/mob/living/carbon/monkey/adjust_bodytemperature(amount)
+ . = ..()
+ var/slow = 0
+ if (bodytemperature < 283.222)
+ slow += (283.222 - bodytemperature) / 10 * 1.75
+ if(slow <= 0)
+ return
+ add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+
+/mob/living/carbon/monkey/Stat()
+ ..()
+ if(statpanel("Status"))
+ stat(null, "Intent: [a_intent]")
+ stat(null, "Move Mode: [m_intent]")
+ if(client && mind)
+ var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
+ if(changeling)
+ stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]")
+ stat("Absorbed DNA", changeling.absorbedcount)
+ return
+
+
+/mob/living/carbon/monkey/verb/removeinternal()
+ set name = "Remove Internals"
+ set category = "IC"
+ internal = null
+ return
+
+
+/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools
+ if(mind && is_monkey(mind))
+ return TRUE
+ return FALSE
+
+/mob/living/carbon/monkey/reagent_check(datum/reagent/R) //can metabolize all reagents
+ return FALSE
+
+/mob/living/carbon/monkey/canBeHandcuffed()
+ return TRUE
+
+/mob/living/carbon/monkey/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
+ if(judgement_criteria & JUDGE_EMAGGED)
+ return 10 //Everyone is a criminal!
+
+ var/threatcount = 0
+
+ //Securitrons can't identify monkeys
+ if( !(judgement_criteria & JUDGE_IGNOREMONKEYS) && (judgement_criteria & JUDGE_IDCHECK) )
+ threatcount += 4
+
+ //Lasertag bullshit
+ if(lasercolor)
+ if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
+ if(is_holding_item_of_type(/obj/item/gun/energy/laser/redtag))
+ threatcount += 4
+
+ if(lasercolor == "r")
+ if(is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag))
+ threatcount += 4
+
+ return threatcount
+
+ //Check for weapons
+ if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck )
+ for(var/obj/item/I in held_items) //if they're holding a gun
+ if(weaponcheck.Invoke(I))
+ threatcount += 4
+ if(weaponcheck.Invoke(back)) //if a weapon is present in the back slot
+ threatcount += 4 //trigger look_for_perp() since they're nonhuman and very likely hostile
+
+ //mindshield implants imply trustworthyness
+ if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
+ threatcount -= 1
+
+ return threatcount
+
+/mob/living/carbon/monkey/IsVocal()
+ if(!getorganslot(ORGAN_SLOT_LUNGS))
+ return 0
+ return 1
+
+/mob/living/carbon/monkey/can_use_guns(obj/item/G)
+ return TRUE
+
+/mob/living/carbon/monkey/angry
+ aggressive = TRUE
+
+/mob/living/carbon/monkey/angry/Initialize()
+ . = ..()
+ if(prob(10))
+ var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
+ equip_to_slot_or_del(helmet,SLOT_HEAD)
+ helmet.attack_self(src) // todo encapsulate toggle
+
+/mob/living/carbon/monkey/tumor
+ name = "living teratoma"
+ verb_say = "blabbers"
+ initial_language_holder = /datum/language_holder/monkey
+ icon = 'icons/mob/monkey.dmi'
+ icon_state = ""
+ butcher_results = list(/obj/effect/spawner/lootdrop/teratoma/minor = 5, /obj/effect/spawner/lootdrop/teratoma/major = 1)
+ type_of_meat = /obj/effect/spawner/lootdrop/teratoma/minor
+ aggressive = TRUE
+ bodyparts = list(/obj/item/bodypart/chest/monkey/teratoma, /obj/item/bodypart/head/monkey/teratoma, /obj/item/bodypart/l_arm/monkey/teratoma,
+ /obj/item/bodypart/r_arm/monkey/teratoma, /obj/item/bodypart/r_leg/monkey/teratoma, /obj/item/bodypart/l_leg/monkey/teratoma)
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 856dfed7..035a6cde 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -85,11 +85,9 @@
name = "riot shotgun"
desc = "A sturdy shotgun with a longer magazine and a fixed tactical stock designed for non-lethal riot control."
icon_state = "riotshotgun"
+ item_state = "riotshotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
- unique_reskin = list("Tatical" = "riotshotgun",
- "Wood Stock" = "wood_riotshotgun"
- )
/obj/item/gun/ballistic/shotgun/riot/attackby(obj/item/A, mob/user, params)
..()
@@ -205,6 +203,7 @@
name = "combat shotgun"
desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath."
icon_state = "cshotgun"
+ item_state = "combatshotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
unique_reskin = list("Tatical" = "cshotgun",
@@ -215,6 +214,7 @@
name = "warden's combat shotgun"
desc = "A modified version of the semi automatic combat shotgun with a collapsible stock. For close encounters."
icon_state = "cshotgunc"
+ item_state = "combatshotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_NORMAL
var/stock = FALSE
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 1095e60e..e203bc94 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -604,21 +604,23 @@
..()
/datum/reagent/consumable/honey
- name = "honey"
+ name = "Honey"
id = "honey"
description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties."
color = "#d3a308"
nutriment_factor = 15 * REAGENTS_METABOLISM
metabolization_rate = 1 * REAGENTS_METABOLISM
taste_description = "sweetness"
+ var/power = 0
/datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/M)
- M.reagents.add_reagent("sugar",3)
+ if(power == 0)
+ M.reagents.add_reagent(/datum/reagent/consumable/sugar,3)
if(prob(55))
- M.adjustBruteLoss(-1*REM, 0)
- M.adjustFireLoss(-1*REM, 0)
- M.adjustOxyLoss(-1*REM, 0)
- M.adjustToxLoss(-1*REM, 0)
+ M.adjustBruteLoss(-1*REM+power, 0)
+ M.adjustFireLoss(-1*REM+power, 0)
+ M.adjustOxyLoss(-1*REM+power, 0)
+ M.adjustToxLoss(-1*REM+power, 0)
..()
/datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
@@ -629,6 +631,12 @@
S.success_multiplier = max(0.6, S.success_multiplier) // +60% success probability on each step, compared to bacchus' blessing's ~46%
..()
+/datum/reagent/consumable/honey/special
+ name = "Royal Honey"
+ id = "royalhoney"
+ description = "A special honey which heals the imbiber far faster than normal honey"
+ power = 1
+
/datum/reagent/consumable/mayonnaise
name = "Mayonnaise"
id = "mayonnaise"
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index da8efcab..f79cdaee 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -591,6 +591,10 @@
icon_state = "default_monkey_chest"
animal_origin = MONKEY_BODYPART
+/obj/item/bodypart/chest/monkey/teratoma
+ icon_state = "teratoma_chest"
+ animal_origin = TERATOMA_BODYPART
+
/obj/item/bodypart/chest/alien
icon = 'icons/mob/animal_parts.dmi'
icon_state = "alien_chest"
@@ -663,6 +667,10 @@
px_x = -5
px_y = -3
+/obj/item/bodypart/l_arm/monkey/teratoma
+ icon_state = "teratoma_l_arm"
+ animal_origin = TERATOMA_BODYPART
+
/obj/item/bodypart/l_arm/alien
icon = 'icons/mob/animal_parts.dmi'
icon_state = "alien_l_arm"
@@ -729,6 +737,10 @@
px_x = 5
px_y = -3
+/obj/item/bodypart/r_arm/monkey/teratoma
+ icon_state = "teratoma_r_arm"
+ animal_origin = TERATOMA_BODYPART
+
/obj/item/bodypart/r_arm/alien
icon = 'icons/mob/animal_parts.dmi'
icon_state = "alien_r_arm"
@@ -787,6 +799,10 @@
animal_origin = MONKEY_BODYPART
px_y = 4
+/obj/item/bodypart/l_leg/monkey/teratoma
+ icon_state = "teratoma_l_leg"
+ animal_origin = TERATOMA_BODYPART
+
/obj/item/bodypart/l_leg/alien
icon = 'icons/mob/animal_parts.dmi'
icon_state = "alien_l_leg"
@@ -845,6 +861,10 @@
icon_state = "default_monkey_r_leg"
animal_origin = MONKEY_BODYPART
px_y = 4
+
+/obj/item/bodypart/r_leg/monkey/teratoma
+ icon_state = "teratoma_r_leg"
+ animal_origin = TERATOMA_BODYPART
/obj/item/bodypart/r_leg/alien
icon = 'icons/mob/animal_parts.dmi'
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 46ee10a3..9057ceca 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -184,6 +184,10 @@
icon_state = "default_monkey_head"
animal_origin = MONKEY_BODYPART
+/obj/item/bodypart/head/monkey/teratoma
+ icon_state = "teratoma_head"
+ animal_origin = TERATOMA_BODYPART
+
/obj/item/bodypart/head/alien
icon = 'icons/mob/animal_parts.dmi'
icon_state = "alien_head"
diff --git a/icons/mob/animal_parts.dmi b/icons/mob/animal_parts.dmi
index 375df934..d51bd882 100644
Binary files a/icons/mob/animal_parts.dmi and b/icons/mob/animal_parts.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 9efccfc3..89b1910b 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
index ea185c5a..5b3efeb7 100644
Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
index 1d380e34..b5c60fc8 100644
Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ
diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi
index 77a21eed..8c25a3dc 100644
Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index e4b6f7da..fd041b1d 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi
index 58dd2f57..8aae972c 100644
Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 700d05fc..c897e899 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 6282e555..f6f55f8b 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index c6933b06..ae5a8539 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index f34fe3be..3925f719 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 60b6d2b7..019ab7d4 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index ac2eff6d..3322094c 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/modular_citadel/icons/mob/muzzled_mask.dmi b/modular_citadel/icons/mob/muzzled_mask.dmi
index 9e8ac12e..fafc1576 100644
Binary files a/modular_citadel/icons/mob/muzzled_mask.dmi and b/modular_citadel/icons/mob/muzzled_mask.dmi differ