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)