From c10c9442a5ca8f93db6cf6aaa84eebc22e7e4871 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 18 Jul 2017 10:58:23 -0400 Subject: [PATCH] Refactor Lung Handling (#29280) * Refactor Lung Handling * fix ups * fixes --- code/__DEFINES/atmospherics.dm | 4 +- code/__DEFINES/combat.dm | 1 + code/_onclick/hud/alert.dm | 24 ++- code/modules/flufftext/Hallucination.dm | 10 +- .../modules/mob/living/carbon/damage_procs.dm | 2 + code/modules/mob/living/carbon/human/life.dm | 4 +- .../mob/living/carbon/human/species.dm | 2 + code/modules/mob/living/carbon/life.dm | 13 +- code/modules/mob/living/damage_procs.dm | 10 +- code/modules/mob/living/living.dm | 2 +- code/modules/surgery/organs/lungs.dm | 174 ++++++++++++------ icons/mob/screen_alert.dmi | Bin 103116 -> 103553 bytes 12 files changed, 163 insertions(+), 83 deletions(-) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 5ce803fa3cd..a79850b04f6 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -67,8 +67,8 @@ #define PLASMA_MINIMUM_OXYGEN_NEEDED 2 #define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 #define PLASMA_OXYGEN_FULLBURN 10 -#define MIN_PLASMA_DAMAGE 1 -#define MAX_PLASMA_DAMAGE 10 +#define MIN_TOXIC_GAS_DAMAGE 1 +#define MAX_TOXIC_GAS_DAMAGE 10 #define MOLES_PLASMA_VISIBLE 0.5 //Moles in a standard cell after which plasma is visible //Plasma fusion properties #define PLASMA_BINDING_ENERGY 3000000 diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 3e7d2847943..a307a0819dd 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -9,6 +9,7 @@ #define OXY "oxy" #define CLONE "clone" #define STAMINA "stamina" +#define BRAIN "brain" //bitflag damage defines used for suicide_act #define BRUTELOSS 1 diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index b792f4399e1..b944f327547 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -109,17 +109,26 @@ //Gas alerts -/obj/screen/alert/oxy +/obj/screen/alert/not_enough_oxy name = "Choking (No O2)" - desc = "You're not getting enough oxygen. Find some good air before you pass out! \ -The box in your backpack has an oxygen tank and breath mask in it." - icon_state = "oxy" + desc = "You're not getting enough oxygen. Find some good air before you pass out! The box in your backpack has an oxygen tank and breath mask in it." + icon_state = "not_enough_oxy" /obj/screen/alert/too_much_oxy name = "Choking (O2)" desc = "There's too much oxygen in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_oxy" +/obj/screen/alert/not_enough_nitro + name = "Choking (No N2)" + desc = "You're not getting enough nitrogen. Find some good air before you pass out!" + icon_state = "not_enough_nitro" + +/obj/screen/alert/too_much_nitro + name = "Choking (N2)" + desc = "There's too much nitrogen in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_nitro" + /obj/screen/alert/not_enough_co2 name = "Choking (No CO2)" desc = "You're not getting enough carbon dioxide. Find some good air before you pass out!" @@ -135,11 +144,10 @@ The box in your backpack has an oxygen tank and breath mask in it." desc = "You're not getting enough plasma. Find some good air before you pass out!" icon_state = "not_enough_tox" -/obj/screen/alert/tox_in_air +/obj/screen/alert/too_much_tox name = "Choking (Plasma)" - desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. \ -The box in your backpack has an oxygen tank and gas mask in it." - icon_state = "tox_in_air" + desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." + icon_state = "too_much_tox" //End gas alerts diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 53555079fff..6701ed96416 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -839,12 +839,12 @@ Gunshots/explosions/opening doors/less rare audio (done) hal_screwyhud = 0 if("fake_alert") - var/alert_type = pick("oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","tox_in_air","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure") + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure") if(specific) alert_type = specific switch(alert_type) - if("oxy") - throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE) + if("not_enough_oxy") + throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) if("not_enough_tox") throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) if("not_enough_co2") @@ -853,8 +853,8 @@ Gunshots/explosions/opening doors/less rare audio (done) throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) if("too_much_co2") throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) - if("tox_in_air") - throw_alert("tox_in_air", /obj/screen/alert/tox_in_air, override = TRUE) + if("too_much_tox") + throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) if("nutrition") if(prob(50)) throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 5051b333b00..6192dbbfd72 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -36,6 +36,8 @@ adjustCloneLoss(damage * hit_percent) if(STAMINA) adjustStaminaLoss(damage * hit_percent) + if(BRAIN) + adjustBrainLoss(damage * hit_percent) return 1 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a039a8c19df..418d213139c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -98,11 +98,13 @@ var/datum/species/S = dna.species if(S.breathid == "o2") - throw_alert("oxy", /obj/screen/alert/oxy) + throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else if(S.breathid == "tox") throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) else if(S.breathid == "co2") throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) + else if(S.breathid == "n2") + throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) return 0 else diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2981ffe8494..a2fa6e22a87 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1331,6 +1331,8 @@ H.adjustCloneLoss(damage * hit_percent) if(STAMINA) H.adjustStaminaLoss(damage * hit_percent) + if(BRAIN) + H.adjustBrainLoss(damage * hit_percent) return 1 /datum/species/proc/on_hit(obj/item/projectile/P, mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index c4388ae6a4c..a1b894e4f07 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -110,7 +110,7 @@ return adjustOxyLoss(1) failed_last_breath = 1 - throw_alert("oxy", /obj/screen/alert/oxy) + throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) return 0 var/safe_oxy_min = 16 @@ -141,14 +141,14 @@ else adjustOxyLoss(3) failed_last_breath = 1 - throw_alert("oxy", /obj/screen/alert/oxy) + throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else //Enough oxygen failed_last_breath = 0 if(oxyloss) adjustOxyLoss(-5) oxygen_used = breath_gases["o2"][MOLES] - clear_alert("oxy") + clear_alert("not_enough_oxy") breath_gases["o2"][MOLES] -= oxygen_used breath_gases["co2"][MOLES] += oxygen_used @@ -171,11 +171,10 @@ //TOXINS/PLASMA if(Toxins_partialpressure > safe_tox_max) var/ratio = (breath_gases["plasma"][MOLES]/safe_tox_max) * 10 - if(reagents) - reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - throw_alert("tox_in_air", /obj/screen/alert/tox_in_air) + adjustToxLoss(Clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) + throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else - clear_alert("tox_in_air") + clear_alert("too_much_tox") //NITROUS OXIDE if(breath_gases["n2o"]) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 32cb1b76dfe..6d69e521962 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -25,6 +25,8 @@ adjustCloneLoss(damage * hit_percent) if(STAMINA) adjustStaminaLoss(damage * hit_percent) + if(BRAIN) + adjustBrainLoss(damage * hit_percent) return 1 /mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs @@ -41,6 +43,8 @@ return adjustCloneLoss(damage) if(STAMINA) return adjustStaminaLoss(damage) + if(BRAIN) + return adjustBrainLoss(damage) /mob/living/proc/get_damage_amount(damagetype = BRUTE) switch(damagetype) @@ -56,9 +60,11 @@ return getCloneLoss() if(STAMINA) return getStaminaLoss() + if(BRAIN) + return getBrainLoss() -/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0) +/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0) if(blocked >= 100) return 0 if(brute) @@ -73,6 +79,8 @@ apply_damage(clone, CLONE, def_zone, blocked) if(stamina) apply_damage(stamina, STAMINA, def_zone, blocked) + if(brain) + apply_damage(brain, BRAIN, def_zone, blocked) return 1 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index eca53694b4e..81d0314e67b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -357,7 +357,7 @@ updatehealth() //then we check if the mob should wake up. update_canmove() update_sight() - clear_alert("oxy") + clear_alert("not_enough_oxy") reload_fullscreen() . = 1 if(mind) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 4a529409c9a..f95e2cd996e 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -15,13 +15,13 @@ slot = "lungs" gender = PLURAL w_class = WEIGHT_CLASS_NORMAL - var/list/breathlevels = list("safe_oxygen_min" = 16,"safe_oxygen_max" = 0,"safe_co2_min" = 0,"safe_co2_max" = 10, - "safe_toxins_min" = 0,"safe_toxins_max" = 0.05,"SA_para_min" = 1,"SA_sleep_min" = 5,"BZ_trip_balls_min" = 1) //Breath damage var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa var/safe_oxygen_max = 0 + var/safe_nitro_min = 0 + var/safe_nitro_max = 0 var/safe_co2_min = 0 var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? var/safe_toxins_min = 0 @@ -30,16 +30,41 @@ var/SA_sleep_min = 5 //Sleeping agent var/BZ_trip_balls_min = 1 //BZ gas. - var/oxy_breath_dam_min = 1 - var/oxy_breath_dam_max = 10 - var/co2_breath_dam_min = 1 - var/co2_breath_dam_max = 10 - var/tox_breath_dam_min = MIN_PLASMA_DAMAGE - var/tox_breath_dam_max = MAX_PLASMA_DAMAGE + var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/oxy_damage_type = OXY + var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/nitro_damage_type = OXY + var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/co2_damage_type = OXY + var/tox_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/tox_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/tox_damage_type = TOX + + var/cold_message = "your face freezing and an icicle forming" + var/cold_level_1_threshold = 260 + var/cold_level_2_threshold = 200 + var/cold_level_3_threshold = 120 + var/cold_level_1_damage = COLD_GAS_DAMAGE_LEVEL_1 //Keep in mind with gas damage levels, you can set these to be negative, if you want someone to heal, instead. + var/cold_level_2_damage = COLD_GAS_DAMAGE_LEVEL_2 + var/cold_level_3_damage = COLD_GAS_DAMAGE_LEVEL_3 + var/cold_damage_type = BURN + + var/hot_message = "your face burning and a searing heat" + var/heat_level_1_threshold = 360 + var/heat_level_2_threshold = 400 + var/heat_level_3_threshold = 1000 + var/heat_level_1_damage = HEAT_GAS_DAMAGE_LEVEL_1 + var/heat_level_2_damage = HEAT_GAS_DAMAGE_LEVEL_2 + var/heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3 + var/heat_damage_type = BURN + + var/crit_stabilizing_reagent = "epinephrine" - -/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) +/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) if((H.status_flags & GODMODE)) return @@ -48,30 +73,33 @@ species_traits = H.dna.species.species_traits if(!breath || (breath.total_moles() == 0)) - if(H.reagents.has_reagent("epinephrine")) + if(H.reagents.has_reagent(crit_stabilizing_reagent)) return if(H.health >= HEALTH_THRESHOLD_CRIT) H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) else if(!(NOCRITDAMAGE in species_traits)) H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - H.failed_last_breath = 1 + H.failed_last_breath = TRUE if(safe_oxygen_min) - H.throw_alert("oxy", /obj/screen/alert/oxy) + H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else if(safe_toxins_min) H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) else if(safe_co2_min) H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) - return 0 + else if(safe_nitro_min) + H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + return FALSE var/gas_breathed = 0 var/list/breath_gases = breath.gases - breath.assert_gases("o2", "plasma", "co2", "n2o", "bz") + breath.assert_gases("o2", "n2", "plasma", "co2", "n2o", "bz") //Partial pressures in our breath var/O2_pp = breath.get_breath_partial_pressure(breath_gases["o2"][MOLES]) + var/N2_pp = breath.get_breath_partial_pressure(breath_gases["n2"][MOLES]) var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases["plasma"][MOLES]) var/CO2_pp = breath.get_breath_partial_pressure(breath_gases["co2"][MOLES]) @@ -82,7 +110,7 @@ if(safe_oxygen_max) if(O2_pp > safe_oxygen_max) var/ratio = (breath_gases["o2"][MOLES]/safe_oxygen_max) * 10 - H.adjustOxyLoss(Clamp(ratio,oxy_breath_dam_min,oxy_breath_dam_max)) + H.apply_damage_type(Clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) else H.clear_alert("too_much_oxy") @@ -90,20 +118,45 @@ //Too little oxygen! if(safe_oxygen_min) if(O2_pp < safe_oxygen_min) - gas_breathed = handle_too_little_breath(H,O2_pp,safe_oxygen_min,breath_gases["o2"][MOLES]) - H.throw_alert("oxy", /obj/screen/alert/oxy) + gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath_gases["o2"][MOLES]) + H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else - H.failed_last_breath = 0 - if(H.getOxyLoss()) - H.adjustOxyLoss(-5) + H.failed_last_breath = FALSE + H.adjustOxyLoss(-5) gas_breathed = breath_gases["o2"][MOLES] - H.clear_alert("oxy") + H.clear_alert("not_enough_oxy") //Exhale breath_gases["o2"][MOLES] -= gas_breathed breath_gases["co2"][MOLES] += gas_breathed gas_breathed = 0 + //-- Nitrogen --// + + //Too much nitrogen! + if(safe_nitro_max) + if(N2_pp > safe_nitro_max) + var/ratio = (breath_gases["n2"][MOLES]/safe_nitro_max) * 10 + H.apply_damage_type(Clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) + H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) + else + H.clear_alert("too_much_nitro") + + //Too little nitrogen! + if(safe_nitro_min) + if(N2_pp < safe_nitro_min) + gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath_gases["n2"][MOLES]) + H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro) + else + H.failed_last_breath = FALSE + H.adjustOxyLoss(-5) + gas_breathed = breath_gases["n2"][MOLES] + H.clear_alert("nitro") + + //Exhale + breath_gases["n2"][MOLES] -= gas_breathed + breath_gases["co2"][MOLES] += gas_breathed + gas_breathed = 0 //-- CO2 --// @@ -114,9 +167,9 @@ H.co2overloadtime = world.time else if(world.time - H.co2overloadtime > 120) H.Unconscious(60) - H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business + H.apply_damage_type(3, co2_damage_type) // Lets hurt em a little, let them know we mean business if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - H.adjustOxyLoss(8) + H.apply_damage_type(8, co2_damage_type) H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2) if(prob(20)) // Lets give them some chance to know somethings not right though I guess. H.emote("cough") @@ -126,12 +179,12 @@ H.clear_alert("too_much_co2") //Too little CO2! - if(breathlevels["safe_co2_min"]) + if(safe_co2_min) if(CO2_pp < safe_co2_min) - gas_breathed = handle_too_little_breath(H,CO2_pp, safe_co2_min,breath_gases["co2"][MOLES]) + gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath_gases["co2"][MOLES]) H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) else - H.failed_last_breath = 0 + H.failed_last_breath = FALSE H.adjustOxyLoss(-5) gas_breathed = breath_gases["co2"][MOLES] H.clear_alert("not_enough_co2") @@ -148,20 +201,19 @@ if(safe_toxins_max) if(Toxins_pp > safe_toxins_max) var/ratio = (breath_gases["plasma"][MOLES]/safe_toxins_max) * 10 - if(H.reagents) - H.reagents.add_reagent("plasma", Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max)) - H.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air) + H.apply_damage_type(Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) + H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else - H.clear_alert("tox_in_air") + H.clear_alert("too_much_tox") //Too little toxins! if(safe_toxins_min) if(Toxins_pp < safe_toxins_min) - gas_breathed = handle_too_little_breath(H,Toxins_pp, safe_toxins_min, breath_gases["plasma"][MOLES]) + gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath_gases["plasma"][MOLES]) H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) else - H.failed_last_breath = 0 + H.failed_last_breath = FALSE H.adjustOxyLoss(-5) gas_breathed = breath_gases["plasma"][MOLES] H.clear_alert("not_enough_tox") @@ -199,50 +251,56 @@ handle_breath_temperature(breath, H) breath.garbage_collect() - return 1 + return TRUE -/obj/item/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/H = null,breath_pp = 0, safe_breath_min = 0, true_pp = 0) +/obj/item/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/H = null, breath_pp = 0, safe_breath_min = 0, true_pp = 0) . = 0 if(!H || !safe_breath_min) //the other args are either: Ok being 0 or Specifically handled. - return 0 + return FALSE if(prob(20)) H.emote("gasp") if(breath_pp > 0) var/ratio = safe_breath_min/breath_pp H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all! - H.failed_last_breath = 1 + H.failed_last_breath = TRUE . = true_pp*ratio/6 else H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - H.failed_last_breath = 1 + H.failed_last_breath = TRUE /obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures - if(abs(310.15 - breath.temperature) > 50) + var/breath_temperature = breath.temperature - var/species_traits = list() - if(H && H.dna && H.dna.species && H.dna.species.species_traits) - species_traits = H.dna.species.species_traits + var/species_traits = list() + if(H && H.dna && H.dna.species && H.dna.species.species_traits) + species_traits = H.dna.species.species_traits - if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE - switch(breath.temperature) - if(-INFINITY to 120) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head") - if(120 to 200) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head") - if(200 to 260) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head") + if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE + var/cold_modifier = H.dna.species.coldmod + if(breath_temperature < cold_level_3_threshold) + H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) + if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) + H.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) + if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) + H.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) + if(breath_temperature < cold_level_1_threshold) + if(prob(20)) + to_chat(H, "You feel [cold_message] in your [name]!") - if(!(RESISTHOT in species_traits)) // HEAT DAMAGE - switch(breath.temperature) - if(360 to 400) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head") - if(400 to 1000) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head") - if(1000 to INFINITY) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head") + if(!(RESISTHOT in species_traits)) // HEAT DAMAGE + var/heat_modifier = H.dna.species.heatmod + if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) + H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) + if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) + H.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type) + if(breath_temperature > heat_level_3_threshold) + H.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type) + if(breath_temperature > heat_level_1_threshold) + if(prob(20)) + to_chat(H, "You feel [hot_message] in your [name]!") /obj/item/organ/lungs/prepare_eat() var/obj/S = ..() diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 7e12b8aeee1b114b87bf747182a0d1b7eea51f5c..afc3c4f815ef9b7891df4f19dc854fee10482f50 100644 GIT binary patch delta 18334 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

}I$ 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

4rruSS1rj+Hqj8n1 ze@AH02t`(M3B9-K?uR~ue?(5fEznH*niR5%Kd$P^pmy<8|~rH zBSS+B3=W5O%px4QMhAQo4@e zb~7pj-c>$Moqve&j;o4VkIE6l0Mq2;mMuNYckQZ(UAy zFTGS!_)Y@LOBE_ne?C}j{`n@Bo$q4x#pbWzlaDMXm@E-&Yx}AcE{S*T=q*1b|LUio z0uS2O;eXX_*;&`}iJwI4N;fzDepCD>&y9Qk>p!IbAeVZXHB@)L$UWBovZ*fK*y75B z)2Q$-F8}gfyEeIRxS=PcC|m`2EQ@uPMXhO)8lT{5j|Xo&&T&oSa?8T2>li{%4P2E> zGAcxRJ(_9qp{CJd7&HOVXp}nBBT1|{rQT>e6iU4i!CCH&0oPM z8zLAC&f2&+5ctKcg0@xoKp6+!ZogZQwbn16_wTe-d;AxA zrva$&FCPEDy%4O)Eq8LumYylYz)}2)EEG)zA4B97K*%qGa83w|Ay@byzxYXf?bg7I91a_uAu}|#&~P4mbcW2I zZ-swx`JKooP}g*I^*q73{C($>#i4=<@*ANdfR{G@f1t4>NxOJy*Z=?k07*qoM6N<$ Ef+CPeCjbBd delta 17893 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 v=;(R|JAWV93=%Sk_I%-5fG%8IzWDzE?71gPkC