diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 764f150f6f..54ed39584c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -437,7 +437,7 @@ var/safe_pressure_min = 16 // Minimum safe partial pressure of breathable gas in kPa //var/safe_pressure_max = 140 // Maximum safe partial pressure of breathable gas in kPa (Not used for now) - var/safe_exhaled_max = 10 // Yes it's an arbitrary value who cares? + var/safe_exhaled_max = 10 var/safe_toxins_max = 0.005 var/SA_para_min = 1 var/SA_sleep_min = 5 @@ -448,7 +448,6 @@ var/inhaling var/poison var/exhaling - var/no_exhale var/breath_type var/poison_type @@ -459,21 +458,21 @@ if(species.breath_type) breath_type = species.breath_type - inhaling = breath.gas[breath_type] else - inhaling = "oxygen" + breath_type = "oxygen" + inhaling = breath.gas[breath_type] if(species.poison_type) poison_type = species.poison_type - poison = breath.gas[poison_type] else - poison = "phoron" + poison_type = "phoron" + poison = breath.gas[poison_type] if(species.exhale_type) exhale_type = species.exhale_type exhaling = breath.gas[exhale_type] else - no_exhale = 1 + exhaling = 0 var/inhale_pp = (inhaling/breath.total_moles)*breath_pressure var/toxins_pp = (poison/breath.total_moles)*breath_pressure @@ -483,75 +482,66 @@ if(inhale_pp < safe_pressure_min) if(prob(20)) spawn(0) emote("gasp") - if(inhale_pp > 0) - var/ratio = inhale_pp/safe_pressure_min - - // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) - // The hell? By definition ratio > 1, and HUMAN_MAX_OXYLOSS = 1... why do we even have this? - adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) - failed_inhale = 1 - inhaled_gas_used = inhaling*ratio/6 - - else - - adjustOxyLoss(HUMAN_MAX_OXYLOSS) - failed_inhale = 1 - + + var/ratio = inhale_pp/safe_pressure_min + // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) + adjustOxyLoss(max(HUMAN_MAX_OXYLOSS*(1-ratio), 0)) + failed_inhale = 1 + oxygen_alert = max(oxygen_alert, 1) - else // We're in safe limits - inhaled_gas_used = inhaling/6 oxygen_alert = 0 - breath.adjust_gas(breath_type, -inhaled_gas_used) + inhaled_gas_used = inhaling/6 - if(!no_exhale) - breath.adjust_gas(exhale_type, inhaled_gas_used) + breath.adjust_gas(breath_type, -inhaled_gas_used, update = 0) //update afterwards - // Too much exhaled gas in the air - if(exhaled_pp > safe_exhaled_max) - if (!co2_alert|| prob(15)) - var/word = pick("extremely dizzy","short of breath","faint","confused") - src << "You feel [word]." + if(exhale_type) + breath.adjust_gas_temp(exhale_type, inhaled_gas_used, bodytemperature, update = 0) //update afterwards - adjustOxyLoss(HUMAN_MAX_OXYLOSS) - co2_alert = 1 - failed_exhale = 1 + // Too much exhaled gas in the air + if(exhaled_pp > safe_exhaled_max) + if (!co2_alert|| prob(15)) + var/word = pick("extremely dizzy","short of breath","faint","confused") + src << "You feel [word]." - else if(exhaled_pp > safe_exhaled_max * 0.7) - if (!co2_alert || prob(1)) - var/word = pick("dizzy","short of breath","faint","momentarily confused") - src << " safe_exhaled_max * 0.6) - if (prob(0.3)) - var/word = pick("a little dizzy","short of breath") - src << "You feel [word]." - else - co2_alert = 0 + //scale linearly from 0 to 1 between safe_exhaled_max and safe_exhaled_max*0.7 + var/ratio = 1.0 - (safe_exhaled_max - exhaled_pp)/(safe_exhaled_max*0.3) + + //give them some oxyloss, up to the limit - we don't want people falling unconcious due to CO2 alone until they're pretty close to safe_exhaled_max. + if (getOxyLoss() < 50*ratio) + adjustOxyLoss(HUMAN_MAX_OXYLOSS) + co2_alert = 1 + failed_exhale = 1 + + else if(exhaled_pp > safe_exhaled_max * 0.6) + if (prob(0.3)) + var/word = pick("a little dizzy","short of breath") + src << " 0.15) if(prob(20)) spawn(0) emote(pick("giggle", "laugh")) - breath.adjust_gas("sleeping_agent", -breath.gas["sleeping_agent"]) + breath.adjust_gas("sleeping_agent", -breath.gas["sleeping_agent"]/6, update = 0) //update after // Were we able to breathe? if (failed_inhale || failed_exhale) @@ -582,9 +572,6 @@ // Hot air hurts :( if( (breath.temperature < species.cold_level_1 || breath.temperature > species.heat_level_1) && !(COLD_RESISTANCE in mutations)) - if(status_flags & GODMODE) - return 1 - if(breath.temperature < species.cold_level_1) if(prob(20)) src << "You feel your face freezing and icicles forming in your lungs!" @@ -626,6 +613,9 @@ if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX //world << "Breath: [breath.temperature], [src]: [bodytemperature], Adjusting: [temp_adj]" bodytemperature += temp_adj + + + breath.update_values() return 1 proc/handle_environment(datum/gas_mixture/environment)