diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 2177f016f90..ed2c96c3f0d 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -196,6 +196,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_VIRUS_RESISTANCE "virus_resistance" /// Causes viruses, infected burns, and parasites to spread more effectively and faster, like an inverse of the above. #define TRAIT_IMMUNODEFICIENCY "immunodeficiency" +/// Prevents viruses from curing naturaly +#define TRAIT_NO_SELF_CURE "noselfcure" #define TRAIT_GENELESS "geneless" #define TRAIT_PIERCEIMMUNE "pierce_immunity" #define TRAIT_NODISMEMBER "dismember_immunity" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 8e5e17d2ee1..0fd52473870 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -422,6 +422,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, + "TRAIT_NO_SELF_CURE" = TRAIT_NO_SELF_CURE, "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, "TRAIT_NOBREATH" = TRAIT_NOBREATH, "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 62f545e6ee3..7db7ebdd8c6 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -155,7 +155,7 @@ if(SPT_PROB(stage_prob * slowdown * bad_immune, seconds_per_tick)) update_stage(min(stage + 1, max_stages)) - if(!(disease_flags & CHRONIC) && disease_flags & CURABLE && bypasses_immunity != TRUE) + if(!(disease_flags & CHRONIC) && disease_flags & CURABLE && bypasses_immunity != TRUE && !HAS_TRAIT(affected_mob, TRAIT_NO_SELF_CURE)) switch(severity) if(DISEASE_SEVERITY_POSITIVE) if(slowdown < 1 || (!(HAS_TRAIT(affected_mob, TRAIT_NOHUNGER)) && (affected_mob.satiety < DISEASE_SATIETY_THRESHOLD || affected_mob.nutrition < NUTRITION_LEVEL_STARVING))) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 29fd91542e8..3caa3d0fe49 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -610,3 +610,31 @@ /datum/symptom/heal/radiation/can_generate_randomly() return ..() && !HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA) // Because people can never really suffer enough + +/datum/symptom/heal/aggressive_healing + name = "Aggressive Healing" + desc = "The virus heals damaged tissues in a way that appears threatening to the immune system." + severity = 1 + stealth = -4 + resistance = 3 + stage_speed = 3 + transmittable = 2 + level = 4 + base_message_chance = 0 + symptom_delay_min = 1 + symptom_delay_max = 1 + symptom_cure = null + power = 2 + + threshold_descs = list( + "Severity > 1" = "For each point of severity above 1, the healing provided by the virus increases.", + ) + ///Increases the healing effect (if active) of the virus by this amount for each severity level above 1 + var/severity_heal_bonus = 0.25 + +/datum/symptom/heal/aggressive_healing/CanHeal(datum/disease/advance/our_disease) + return power + our_disease.totalSeverity() * severity_heal_bonus + +/datum/symptom/heal/aggressive_healing/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) + carbon_host.heal_overall_damage(actual_power, actual_power, required_bodytype = healable_bodytypes) + return TRUE diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 89e74b81a32..205000f0ff0 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -2020,3 +2020,14 @@ if(affected_mob.losebreath >= 1) affected_mob.losebreath -= 1 * metabolization_ratio * seconds_per_tick return UPDATE_MOB_HEALTH + +/datum/reagent/medicine/immunosilence + name = "ImmunoSilence" + description = "Prevents viruses from being naturally cured." + metabolization_rate = 0.25 * REAGENTS_METABOLISM + metabolized_traits = list(TRAIT_NO_SELF_CURE) + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + ph = 5.5 + color = "#C8A5DC" + taste_description = "plastic" + randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 6ec8cf3a1f0..a0e1c53e0ce 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -438,3 +438,9 @@ results = list(/datum/reagent/medicine/naloxone = 4) required_reagents = list(/datum/reagent/medicine/morphine = 1, /datum/reagent/hydrogen_peroxide = 1, /datum/reagent/bromine = 1, /datum/reagent/consumable/ethanol = 1) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER + +/datum/chemical_reaction/medicine/immunosilence + results = list(/datum/reagent/medicine/immunosilence = 1) + required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/ammonia = 1) + reaction_tags = REACTION_TAG_EASY +