diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 8f23d89a0b..c9385e7e16 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -68,17 +68,19 @@ #define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. -#define SYNTH_PASSIVE_HEAT_GAIN 10 //Degrees C per handle_environment() Synths passively heat up. Mitigated by cooling efficiency. Can lead to overheating if not managed. -#define SYNTH_MAX_PASSIVE_GAIN_TEMP 250 //Degrees C that a synth can be heated up to by their internal heat gain, provided their cooling is insufficient to mitigate it. -#define SYNTH_MIN_PASSIVE_COOLING_TEMP -30 //Degrees C a synth can cool towards at very high cooling efficiency. -#define SYNTH_HEAT_EFFICIENCY_COEFF 0.005 //How quick the difference between the Synth and the environment starts to matter. The smaller the higher the difference has to be for the same change. -#define SYNTH_SINGLE_INFLUENCE_COOLING_EFFECT_CAP 3 //How big can the multiplier for heat / pressure cooling be in an optimal environment -#define SYNTH_TOTAL_ENVIRONMENT_EFFECT_CAP 2 //How big of an multiplier can the environment give in an optimal scenario (maximum efficiency in the end is at a lower cap, this mostly counters low coolant levels) -#define SYNTH_MAX_COOLING_EFFICIENCY 1.5 //The maximum possible cooling efficiency one can achieve at optimal conditions. -#define SYNTH_ACTIVE_COOLING_TEMP_BOUNDARY 10 //The minimum distance from room temperature a Synth needs to have for active cooling to actively cool. +#define SYNTH_PASSIVE_HEAT_GAIN 10 //Degrees C per handle_environment() Synths passively heat up. Mitigated by cooling efficiency. Can lead to overheating if not managed. +#define SYNTH_MAX_PASSIVE_GAIN_TEMP 250 //Degrees C that a synth can be heated up to by their internal heat gain, provided their cooling is insufficient to mitigate it. +#define SYNTH_MIN_PASSIVE_COOLING_TEMP -30 //Degrees C a synth can cool towards at very high cooling efficiency. +#define SYNTH_HEAT_EFFICIENCY_COEFF 0.005 //How quick the difference between the Synth and the environment starts to matter. The smaller the higher the difference has to be for the same change. +#define SYNTH_SINGLE_INFLUENCE_COOLING_EFFECT_CAP 3 //How big can the multiplier for heat / pressure cooling be in an optimal environment +#define SYNTH_TOTAL_ENVIRONMENT_EFFECT_CAP 2 //How big of an multiplier can the environment give in an optimal scenario (maximum efficiency in the end is at a lower cap, this mostly counters low coolant levels) +#define SYNTH_MAX_COOLING_EFFICIENCY 1.5 //The maximum possible cooling efficiency one can achieve at optimal conditions. +#define SYNTH_ACTIVE_COOLING_TEMP_BOUNDARY 10 //The minimum distance from room temperature a Synth needs to have for active cooling to actively cool. #define SYNTH_ACTIVE_COOLING_LOW_PRESSURE_THRESHOLD 0.05 //At how much percentage of default pressure (or lower) active cooling gets a massive cost penalty. #define SYNTH_ACTIVE_COOLING_LOW_PRESSURE_PENALTY 2.5 //By how much is active cooling cost multiplied if in a very-low-pressure environment? #define SYNTH_ACTIVE_COOLING_MIN_ADJUSTMENT 5 //What is the minimum amount of temp you move towards the target point, even if it would be less with default calculations? +#define SYNTH_INTEGRATION_COOLANT_PENALTY 0.4 //Integrating coolant is multiplied with this for calculation of impact on passive cooling. +#define SYNTH_INTEGRATION_COOLANT_CAP 0.25 //Integrating coolant is capped at counting as current_blood * this number. This is so you can't just run on salglu or whatever. #define BODYTEMP_NORMAL 310.15 //The natural temperature for a body #define BODYTEMP_AUTORECOVERY_DIVISOR 11 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 8617d3e2ee..83b8d7be48 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -153,17 +153,24 @@ var/coolant var/total_efficiency var/environ_efficiency + var/suitlink_efficiency if(!jammed) coolant = owner.blood_volume total_efficiency = owner.get_cooling_efficiency() environ_efficiency = owner.get_environment_cooling_efficiency() + suitlink_efficiency = owner.check_suitlinking() else coolant = rand(1, 600) total_efficiency = rand(1, 15) / 10 environ_efficiency = rand(1, 20) / 10 . += "Performing internal cooling system diagnostics:" . += "Coolant level: [coolant] units, [round((coolant / (BLOOD_VOLUME_NORMAL * owner.blood_ratio)) * 100, 0.1)] percent" - . += "Current Cooling Efficiency: [round(total_efficiency * 100, 0.1)] percent, environment viability: [round(environ_efficiency * 100, 0.1)] percent." + . += "Current Cooling Efficiency: [round(total_efficiency * 100, 0.1)] percent, [suitlink_efficiency ? "active suitlink detected, guaranteeing [suitlink_efficiency * 100]% environmental cooling efficiency." : "environment viability: [round(environ_efficiency * 100, 0.1)] percent."]" + +/atom/movable/screen/synth/coolant_counter/proc/jam(amount, cap = 20) + if(jammed > cap) //Preserve previous more impactful event. + return + jammed = min(jammed + amount, cap) /datum/hud/human/New(mob/living/carbon/human/owner) ..() diff --git a/code/modules/mob/living/carbon/handle_corruption.dm b/code/modules/mob/living/carbon/handle_corruption.dm index 5ac2a2f616..b56752453b 100644 --- a/code/modules/mob/living/carbon/handle_corruption.dm +++ b/code/modules/mob/living/carbon/handle_corruption.dm @@ -37,7 +37,7 @@ var/list/whatmighthappen = list() whatmighthappen += list("avoided" = 3, "dropthing" = 1, "movetile" = 1, "shortdeaf" = 1, "flopover" = 1, "nutriloss" = 1, "selfflash" = 1, "harmies" = 1) if(corruption >= CORRUPTION_THRESHHOLD_MAJOR) - whatmighthappen += list("longdeaf" = 1, "longknockdown" = 1, "shortlimbdisable" = 1, "shortblind" = 1, "shortstun" = 1, "shortmute" = 1, "vomit" = 1, "halluscinate" = 1) + whatmighthappen += list("longdeaf" = 1, "longknockdown" = 1, "shortlimbdisable" = 1, "shortblind" = 1, "shortstun" = 1, "shortmute" = 1, "vomit" = 1, "hallucinate" = 1, "jamcoolanthud" = 1) if(corruption >= CORRUPTION_THRESHHOLD_CRITICAL) whatmighthappen += list("receporgandamage" = 1, "longlimbdisable" = 1, "blindmutedeaf" = 1, "longstun" = 1, "sleep" = 1, "inducetrauma" = 1, "amplifycorrupt" = 1, "changetemp" = 1) var/event = pickweight(whatmighthappen) @@ -97,8 +97,10 @@ if("vomit") to_chat(src, "Ejecting contaminant.") vomit() - if("halluscinate") + if("hallucinate") hallucination += 20 //Doesn't give a cue + if("jamcoolanthud") + hud_used.coolant_display.jam(10) if("receporgandamage") adjustOrganLoss(ORGAN_SLOT_EARS, rand(10, 20)) adjustOrganLoss(ORGAN_SLOT_EYES, rand(10, 20)) @@ -159,7 +161,7 @@ /mob/living/carbon/proc/forcesleep(time = 100) to_chat(src, "Preparations complete, powering down.") - Sleeping(time, 0) + Sleeping(time) #undef CORRUPTION_CHECK_INTERVAL diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index e1f4055998..71573abc90 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -416,7 +416,7 @@ severity *= 0.5 var/do_not_stun = FALSE if(HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) - hud_used?.coolant_display.jammed = min(round(hud_used.coolant_display.jammed + (severity / 10),1), 20) //Messes up the cooling system readout. + hud_used?.coolant_display.jam(round(severity / 10, 1)) //Messes up the cooling system readout. severity *= 0.5 //Robotpeople take less limb damage, but instead suffer system corruption (see carbon emp_act) do_not_stun = TRUE for(var/obj/item/bodypart/L in src.bodyparts) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index bfd45f52f9..6950f75172 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -679,7 +679,8 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if(!HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) return 1 - var/blood_effective_volume = blood_volume + integrating_blood + var/integration_bonus = min(blood_volume * SYNTH_INTEGRATION_COOLANT_CAP, integrating_blood * SYNTH_INTEGRATION_COOLANT_PENALTY) //Integration blood somewhat helps, though only at 40% impact and to a cap of 25% of current blood level. + var/blood_effective_volume = blood_volume + integration_bonus var/coolant_efficiency = min(blood_effective_volume / BLOOD_VOLUME_SAFE, 1) //Low coolant is only a negative, adding more than needed will not help you. var/environment_efficiency = get_environment_cooling_efficiency() @@ -687,10 +688,9 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put /mob/living/carbon/proc/get_environment_cooling_efficiency() - var/suit_item = get_item_by_slot(SLOT_WEAR_SUIT) - var/head_item = get_item_by_slot(SLOT_HEAD) - if((istype(head_item, /obj/item/clothing/head/helmet/space) && istype(suit_item, /obj/item/clothing/suit/space)) || (istype(head_item, /obj/item/clothing/head/hooded/explorer) && istype(suit_item, /obj/item/clothing/suit/hooded/explorer))) - return 1 //If you are wearing full EVA or lavaland hazard gear, assume it has been made to accomodate your cooling needs. + var/suitlink = check_suitlinking() + if(suitlink) + return suitlink //If you are wearing full EVA or lavaland hazard gear (on lavaland), assume it has been made to accomodate your cooling needs. var/datum/gas_mixture/environment = loc.return_air() if(!environment) return 0 @@ -704,7 +704,18 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put var/total_environment_efficiency = min(heat_efficiency * pressure_efficiency, SYNTH_TOTAL_ENVIRONMENT_EFFECT_CAP) //At best, you can get 200% total return total_environment_efficiency +/mob/living/carbon/proc/check_suitlinking() + var/suit_item = get_item_by_slot(SLOT_WEAR_SUIT) + var/head_item = get_item_by_slot(SLOT_HEAD) + var/turf/T = get_turf(src) + + if(istype(head_item, /obj/item/clothing/head/helmet/space) && istype(suit_item, /obj/item/clothing/suit/space)) + return 1 + + if(T && is_mining_level(T.z) && istype(head_item, /obj/item/clothing/head/hooded/explorer) && istype(suit_item, /obj/item/clothing/suit/hooded/explorer)) + return 1 + return 0 ///////// //LIVER//