From 84128e72ff14205b97645ad5db0c0f040fbe542c Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Fri, 31 Jul 2020 09:53:41 +0100 Subject: [PATCH 1/4] blood mechanics tweaks (#7377) --- code/game/machinery/iv_drip.dm | 2 +- code/game/objects/items/devices/defib.dm | 4 +-- code/game/objects/items/devices/scanners.dm | 6 +++-- code/modules/mob/living/carbon/human/human.dm | 4 +-- code/modules/mob/living/carbon/human/life.dm | 2 +- .../living/carbon/human/species/species.dm | 4 +++ code/modules/organs/blood.dm | 25 +++++++++++-------- code/modules/organs/organ_external.dm | 2 +- 8 files changed, 29 insertions(+), 20 deletions(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index a4654a31a4..0f57b816d0 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -128,7 +128,7 @@ return // If the human is losing too much blood, beep. - if(((T.vessel.get_reagent_amount("blood")/T.species.blood_volume)*100) < BLOOD_VOLUME_SAFE) + if(T.vessel.get_reagent_amount("blood") < T.species.blood_volume*T.species.blood_level_safe) visible_message("\The [src] beeps loudly.") var/datum/reagent/B = T.take_blood(beaker,amount) diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 680bebf6e9..8e5fa683c9 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -338,14 +338,14 @@ if(!heart) return TRUE - var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) + var/blood_volume = H.vessel.get_reagent_amount("blood") if(!heart || heart.is_broken()) blood_volume *= 0.3 else if(heart.is_bruised()) blood_volume *= 0.7 else if(heart.damage > 1) blood_volume *= 0.8 - return blood_volume < BLOOD_VOLUME_SURVIVE + return blood_volume < H.species.blood_volume*H.species.blood_level_fatal /obj/item/weapon/shockpaddles/proc/check_charge(var/charge_amt) return 0 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 06197f202d..5ff1f46cde 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -272,9 +272,11 @@ HALOGEN COUNTER - Radcount on mobs var/blood_volume = H.vessel.get_reagent_amount("blood") var/blood_percent = round((blood_volume / H.species.blood_volume)*100) var/blood_type = H.dna.b_type - if(blood_percent <= BLOOD_VOLUME_BAD) + if(blood_volume <= H.species.blood_volume*H.species.blood_level_danger) dat += "Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" - else if(blood_percent <= BLOOD_VOLUME_SAFE) + else if(blood_volume <= H.species.blood_volume*H.species.blood_level_warning) + dat += "Warning: Blood Level VERY LOW: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" + else if(blood_volume <= H.species.blood_volume*H.species.blood_level_safe) dat += "Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" else dat += "Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index eb95bdebbc..b0d7bacc99 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1676,8 +1676,8 @@ if(species?.flags & NO_BLOOD) bloodtrail = 0 else - var/blood_volume = round((vessel.get_reagent_amount("blood")/species.blood_volume)*100) - if(blood_volume < BLOOD_VOLUME_SURVIVE) + var/blood_volume = vessel.get_reagent_amount("blood") + if(blood_volume < species?.blood_volume*species?.blood_level_fatal) bloodtrail = 0 //Most of it's gone already, just leave it be else vessel.remove_reagent("blood", 1) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1ce3fa0afb..847bdeceb8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1598,7 +1598,7 @@ if(Pump) temp += Pump.standard_pulse_level - PULSE_NORM - if(round(vessel.get_reagent_amount("blood")) <= BLOOD_VOLUME_BAD) //how much blood do we have + if(round(vessel.get_reagent_amount("blood")) <= species.blood_volume*species.blood_level_danger) //how much blood do we have temp = temp + 3 //not enough :( if(status_flags & FAKEDEATH) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 619e011510..237428e24b 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -43,6 +43,10 @@ var/short_sighted // Permanent weldervision. var/blood_volume = 560 // Initial blood volume. var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster + var/blood_level_safe = 0.85 //"Safe" blood level; above this, you're OK + var/blood_level_warning = 0.75 //"Warning" blood level; above this, you're a bit woozy and will have low-level oxydamage (no more than 20, or 15 with inap) + var/blood_level_danger = 0.6 //"Danger" blood level; above this, you'll rapidly take up to 50 oxyloss, and it will then steadily accumulate at a lower rate + var/blood_level_fatal = 0.4 //"Fatal" blood level; below this, you take extremely high oxydamage var/hunger_factor = 0.05 // Multiplier for hunger. var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 931eaab0cb..cc66674b87 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -2,10 +2,13 @@ BLOOD SYSTEM ****************************************************/ //Blood levels. These are percentages based on the species blood_volume var. +//Retained for archival/reference purposes - KK +/* var/const/BLOOD_VOLUME_SAFE = 85 var/const/BLOOD_VOLUME_OKAY = 75 var/const/BLOOD_VOLUME_BAD = 60 var/const/BLOOD_VOLUME_SURVIVE = 40 +*/ var/const/CE_STABLE_THRESHOLD = 0.5 /mob/living/carbon/human/var/datum/reagents/vessel // Container for blood and BLOOD ONLY. Do not transfer other chems here. @@ -88,22 +91,22 @@ var/const/CE_STABLE_THRESHOLD = 0.5 // dmg_coef = min(1, 10/chem_effects[CE_STABLE]) //TODO: add effect for increased damage // threshold_coef = min(dmg_coef / CE_STABLE_THRESHOLD, 1) - if(blood_volume >= BLOOD_VOLUME_SAFE) + if(blood_volume_raw >= species.blood_volume*species.blood_level_safe) if(pale) pale = 0 update_icons_body() - else if(blood_volume >= BLOOD_VOLUME_OKAY) + else if(blood_volume_raw >= species.blood_volume*species.blood_level_warning) if(!pale) pale = 1 update_icons_body() - var/word = pick("dizzy","woosey","faint") - to_chat(src, "You feel [word]") + var/word = pick("dizzy","woozy","faint","disoriented","unsteady") + to_chat(src, "You feel slightly [word]") if(prob(1)) - var/word = pick("dizzy","woosey","faint") + var/word = pick("dizzy","woozy","faint","disoriented","unsteady") to_chat(src, "You feel [word]") if(getOxyLoss() < 20 * threshold_coef) adjustOxyLoss(3 * dmg_coef) - else if(blood_volume >= BLOOD_VOLUME_BAD) + else if(blood_volume_raw >= species.blood_volume*species.blood_level_danger) if(!pale) pale = 1 update_icons_body() @@ -113,13 +116,13 @@ var/const/CE_STABLE_THRESHOLD = 0.5 adjustOxyLoss(1 * dmg_coef) if(prob(15)) Paralyse(rand(1,3)) - var/word = pick("dizzy","woosey","faint") - to_chat(src, "You feel extremely [word]") - else if(blood_volume >= BLOOD_VOLUME_SURVIVE) + var/word = pick("dizzy","woozy","faint","disoriented","unsteady") + to_chat(src, "You feel dangerously [word]") + else if(blood_volume_raw >= species.blood_volume*species.blood_level_fatal) adjustOxyLoss(5 * dmg_coef) // adjustToxLoss(3 * dmg_coef) if(prob(15)) - var/word = pick("dizzy","woosey","faint") + var/word = pick("dizzy","woozy","faint","disoriented","unsteady") to_chat(src, "You feel extremely [word]") else //Not enough blood to survive (usually) if(!pale) @@ -131,7 +134,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5 adjustOxyLoss(75 * dmg_coef) // 15 more than dexp fixes (also more than dex+dexp+tricord) // Without enough blood you slowly go hungry. - if(blood_volume < BLOOD_VOLUME_SAFE) + if(blood_volume_raw < species.blood_volume*species.blood_level_safe) if(nutrition >= 300) adjust_nutrition(-10) else if(nutrition >= 200) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 080b19b32d..8cad30e19c 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -525,7 +525,7 @@ This function completely restores a damaged organ to perfect condition. //Burn damage can cause fluid loss due to blistering and cook-off if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) - var/fluid_loss = 0.4 * (damage/(owner.getMaxHealth() - config.health_threshold_dead)) * owner.species.blood_volume*(1 - BLOOD_VOLUME_SURVIVE/100) + var/fluid_loss = 0.4 * (damage/(owner.getMaxHealth() - config.health_threshold_dead)) * owner.species.blood_volume*(1 - owner.species.blood_level_fatal) owner.remove_blood(fluid_loss) // first check whether we can widen an existing wound From 54d0193353608dfdf5ccf3bae68eec65b29b9692 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 31 Jul 2020 16:54:33 -0400 Subject: [PATCH 3/4] Fixes Stand --- code/game/objects/structures/medical_stand_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/medical_stand_vr.dm b/code/game/objects/structures/medical_stand_vr.dm index e32a1a39df..8e13d4f86b 100644 --- a/code/game/objects/structures/medical_stand_vr.dm +++ b/code/game/objects/structures/medical_stand_vr.dm @@ -423,7 +423,7 @@ return // If the human is losing too much blood, beep. - if(((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) < BLOOD_VOLUME_SAFE) + if(H.vessel.get_reagent_amount("blood") < H.species.blood_volume*T.species.blood_level_safe) visible_message("\The [src] beeps loudly.") var/datum/reagent/B = H.take_blood(beaker,amount) From 2ccb99611eed6282b1cec84336a08f6026857e27 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Fri, 31 Jul 2020 17:01:26 -0400 Subject: [PATCH 4/4] Update medical_stand_vr.dm --- code/game/objects/structures/medical_stand_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/medical_stand_vr.dm b/code/game/objects/structures/medical_stand_vr.dm index 8e13d4f86b..eb3031eca8 100644 --- a/code/game/objects/structures/medical_stand_vr.dm +++ b/code/game/objects/structures/medical_stand_vr.dm @@ -423,7 +423,7 @@ return // If the human is losing too much blood, beep. - if(H.vessel.get_reagent_amount("blood") < H.species.blood_volume*T.species.blood_level_safe) + if(H.vessel.get_reagent_amount("blood") < H.species.blood_volume*H.species.blood_level_safe) visible_message("\The [src] beeps loudly.") var/datum/reagent/B = H.take_blood(beaker,amount)