From a6ab445f8cac839226f952d09407cf34e82fa4e2 Mon Sep 17 00:00:00 2001
From: Migratingcocofruit
<69551563+Migratingcocofruit@users.noreply.github.com>
Date: Tue, 7 Oct 2025 20:59:03 +0300
Subject: [PATCH] Adds additional remedies to more severe symptoms (#30580)
* adds defines and code for physical treatments
* adds wetness check and evaporation for combustion symptom
* adds sleep as treatment for vomiting
* adds treatment to flesheating
* adjustments
---
code/__DEFINES/dcs/mob_signals.dm | 3 +++
code/__DEFINES/disease_defines.dm | 6 ++++--
code/datums/diseases/advance/symptoms/fire.dm | 13 +++++++++++++
.../diseases/advance/symptoms/flesh_eating.dm | 19 ++++++++++++++++---
.../diseases/advance/symptoms/symptoms.dm | 18 +++++++++++++++---
.../datums/diseases/advance/symptoms/vomit.dm | 19 ++++++++++++++++++-
code/datums/status_effects/debuffs.dm | 1 +
7 files changed, 70 insertions(+), 9 deletions(-)
diff --git a/code/__DEFINES/dcs/mob_signals.dm b/code/__DEFINES/dcs/mob_signals.dm
index 434a414279c..a619004bed4 100644
--- a/code/__DEFINES/dcs/mob_signals.dm
+++ b/code/__DEFINES/dcs/mob_signals.dm
@@ -208,6 +208,9 @@
///cancel eating attempt
#define COMSIG_MOB_CANCEL_EAT (1<<0)
+/// From /datum/status_effect/incapacitating/sleeping/tick()
+#define COMSIG_MOB_SLEEP_TICK "mob_sleep_tick"
+
/// From /datum/element/basic_eating/finish_eating()
#define COMSIG_MOB_ATE "mob_ate"
///cancel post eating
diff --git a/code/__DEFINES/disease_defines.dm b/code/__DEFINES/disease_defines.dm
index 11232d52e90..28623db837e 100644
--- a/code/__DEFINES/disease_defines.dm
+++ b/code/__DEFINES/disease_defines.dm
@@ -5,8 +5,10 @@
#define VIRUS_SYMPTOM_LIMIT 6
/// The maximum amount of time a symptom will be delayed for after the treating reagents have left the body
-#define VIRUS_MAX_TREATMENT_TIMER 300
-#define VIRUS_TREATMENT_TIMER_MOD 2
+#define VIRUS_MAX_CHEM_TREATMENT_TIMER 300
+#define VIRUS_CHEM_TREATMENT_TIMER_MOD 2
+#define VIRUS_MAX_PHYS_TREATMENT_TIMER 90
+#define VIRUS_PHYS_TREATMENT_TIMER_MOD 30
/// Evoltion chance each cycle in percents.
/// The base chance in % that a virus will mutate as it spreads. Further modified by stage speed and the viral evolutionary acceleration trait
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index 93c05935cb0..7181971fa82 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -31,6 +31,8 @@ Bonus
/datum/symptom/fire/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
+ if(evaporate_wetness(A, unmitigated * A.progress / 100))
+ return
switch(A.progress)
if(30 to 59)
to_chat(M, "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]")
@@ -57,3 +59,14 @@ Bonus
M.adjust_fire_stacks(get_stacks)
return 1
+
+/datum/symptom/fire/proc/evaporate_wetness(datum/disease/advance/A, heat_mod)
+ . = TRUE
+ var/mob/living/carbon/target = A.affected_mob
+ if(target.wetlevel < 3 * heat_mod)
+ . = FALSE
+ target.wetlevel = max(round(target.wetlevel - 3 * heat_mod), 0)
+ if(target.wetlevel)
+ to_chat(target, "Some water steams off your body")
+ else
+ to_chat(target, "All of the water steams off your body!")
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index 48c81d4aa79..cf8a6ebc5b0 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -26,19 +26,32 @@ Bonus
chem_treatments = list(
"synthflesh" = list("multiplier" = 0, "timer" = 0),
"lazarus_reagent" = list("multiplier" = 0, "timer" = 0))
+ phys_treatments = list(
+ "body_temp" = list("multiplier" = 0.6, "timer" = 0, "max_timer" = VIRUS_MAX_PHYS_TREATMENT_TIMER * 6),
+ )
/datum/symptom/flesh_eating/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
if(A.stage > 1)
if(prob(A.progress))
to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]")
- Flesheat(M, A)
+ Flesheat(M, A, unmitigated)
else
to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]")
return
-/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
- var/get_damage = (A.progress / 100) * ((sqrtor0(49 + 2 * A.totalStageSpeed()))*5)
+/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A, unmitigated)
+ var/get_damage = unmitigated * sqrtor0(49 + 2 * A.totalStageSpeed()) * A.progress / 20
M.adjustBruteLoss(get_damage)
return 1
+
+/datum/symptom/flesh_eating/check_phys_treatment(datum/disease/advance/A)
+ . = ..()
+ if(!A.affected_mob)
+ return
+ var/temp_dist = max(A.affected_mob.bodytemperature - 313.15, 305.15 - A.affected_mob.bodytemperature)
+ if(temp_dist > 0)
+ increase_phys_treatment_timer("body_temp", min(temp_dist * 2, VIRUS_PHYS_TREATMENT_TIMER_MOD))
+
+
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 1c9c5fea8ac..69c0c6c52d4 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -17,6 +17,8 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
var/id = ""
/// Asoc list of treatment reagents to multiplier and timer. Multiplier multiplies the frequency and strength of the symptom
var/list/chem_treatments = list()
+ /// Asoc list of physical treatments to multiplier and timer. Multiplier multiplies the frequency and strength of the symptom
+ var/list/phys_treatments = list()
/// Amount of treatment reagents the symptom will consume
var/purge_amount = 0.4
/// How likely the symptom is to activate each process cycle
@@ -75,10 +77,20 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
chem_treatments[treatment]["timer"]--
if(treatment in mob_reagents)
// Consume as much as we need but no more than we have
- var/consumption_mod = min(mob_reagents[treatment] / purge_amount, (VIRUS_MAX_TREATMENT_TIMER - chem_treatments[treatment]["timer"]) / VIRUS_TREATMENT_TIMER_MOD, 1)
+ var/consumption_mod = min(mob_reagents[treatment] / purge_amount, (VIRUS_MAX_CHEM_TREATMENT_TIMER - chem_treatments[treatment]["timer"]) / VIRUS_CHEM_TREATMENT_TIMER_MOD, 1)
A.affected_mob.reagents.remove_reagent(treatment, purge_amount * consumption_mod)
// Add to timer according to the amount consumed
- chem_treatments[treatment]["timer"] += VIRUS_TREATMENT_TIMER_MOD * consumption_mod
+ chem_treatments[treatment]["timer"] += VIRUS_CHEM_TREATMENT_TIMER_MOD * consumption_mod
+/// Default behaviour for physical treatments. Mitigate the symptoms while effects remain
/datum/symptom/proc/check_phys_treatment(datum/disease/advance/A)
- return 1
+ . = 1
+ for(var/treatment in phys_treatments)
+ if(phys_treatments[treatment]["timer"] >= 1)
+ . *= phys_treatments[treatment]["multiplier"]
+ phys_treatments[treatment]["timer"]--
+
+/datum/symptom/proc/increase_phys_treatment_timer(treatment, time = VIRUS_PHYS_TREATMENT_TIMER_MOD)
+ if(!phys_treatments[treatment])
+ return
+ phys_treatments[treatment]["timer"] = min(phys_treatments[treatment]["timer"] + time, phys_treatments[treatment]["max_timer"])
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm
index e69027adfb6..94831c0c8b6 100644
--- a/code/datums/diseases/advance/symptoms/vomit.dm
+++ b/code/datums/diseases/advance/symptoms/vomit.dm
@@ -30,7 +30,18 @@ Bonus
chem_treatments = list(
"calomel" = list("multiplier" = 0, "timer" = 0),
"charcoal" = list("multiplier" = 0, "timer" = 0),
- "pen_acid" = list("multiplier" = 0, "timer" = 0))
+ "pen_acid" = list("multiplier" = 0, "timer" = 0),
+ )
+ phys_treatments = list(
+ "sleep" = list("multiplier" = 0.2, "timer" = 0, "max_timer" = 2),
+ "sleep_linger" = list("multiplier" = 0.6, "timer" = 0, "max_timer" = VIRUS_MAX_PHYS_TREATMENT_TIMER * 7),
+ )
+
+/datum/symptom/vomit/Start(datum/disease/advance/A)
+ if(!iscarbon(A.affected_mob))
+ return
+ var/mob/living/carbon/target = A.affected_mob
+ RegisterSignal(target, COMSIG_MOB_SLEEP_TICK, PROC_REF(on_mob_sleep))
/datum/symptom/vomit/symptom_act(datum/disease/advance/A, unmitigated)
var/mob/living/M = A.affected_mob
@@ -47,6 +58,12 @@ Bonus
/datum/symptom/vomit/proc/Vomit(mob/living/carbon/M, progress)
M.vomit(20 * (progress / 100))
+/datum/symptom/vomit/proc/on_mob_sleep(mob/source, comfort)
+ SIGNAL_HANDLER // COMSIG_MOB_SLEEP_TICK
+ if(comfort)
+ increase_phys_treatment_timer("sleep", 2)
+ increase_phys_treatment_timer("sleep_linger", 10 * comfort)
+
/*
//////////////////////////////////////
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 917a8b81983..89857a5e1ad 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -681,6 +681,7 @@
dreamer.adjustFireLoss(-1 * comfort)
if(prob(10) && dreamer.health && dreamer.health_hud_override != HEALTH_HUD_OVERRIDE_CRIT)
dreamer.emote("snore")
+ SEND_SIGNAL(owner, COMSIG_MOB_SLEEP_TICK, comfort)
//SLOWED - slows down the victim for a duration and a given slowdown value.