diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm
index 7d7cf1c0a7..1227f3bd78 100644
--- a/code/modules/antagonists/abductor/equipment/glands/heal.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm
@@ -144,7 +144,7 @@
owner.Stun(15)
owner.adjustToxLoss(-15, TRUE, TRUE)
- owner.AddIntegrationBlood(min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20))
+ owner.AddIntegrationBlood(20)
if(owner.blood_volume < BLOOD_VOLUME_NORMAL)
keep_going = TRUE
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 568f01ab83..6f6f43cd96 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -687,10 +687,10 @@
if(H.stat == DEAD)
to_chat(user,"Only a revive rune can bring back the dead!")
return
- if(H.blood_volume < (BLOOD_VOLUME_SAFE*H.blood_ratio))
+ if(H.functional_blood() < (BLOOD_VOLUME_SAFE*H.blood_ratio))
var/restore_blood = (BLOOD_VOLUME_SAFE*H.blood_ratio) - H.blood_volume
- if(uses*2 < restore_blood)
- H.blood_volume += uses*2
+ if(uses * 2 < restore_blood)
+ H.AddIntegrationBlood(uses * 2)
to_chat(user,"You use the last of your blood rites to restore what blood you could!")
uses = 0
return ..()
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 812cf74424..256f869198 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -40,27 +40,28 @@
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
if(integrating_blood > 0)
- integrating_blood = max(integrating_blood - 1, 0)
- //Blood regeneration if there is some space
- if(blood_volume < BLOOD_VOLUME_NORMAL)
- var/nutrition_ratio = 0
+ var/integrated_blood = max(integrating_blood - 1, 0)
+ integrating_blood = integrated_blood
+ if(blood_volume < BLOOD_VOLUME_MAXIMUM)
blood_volume ++
- if(!HAS_TRAIT(src, TRAIT_NOHUNGER))
- switch(nutrition)
- if(0 to NUTRITION_LEVEL_STARVING)
- nutrition_ratio = 0.2
- if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
- nutrition_ratio = 0.4
- if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
- nutrition_ratio = 0.6
- if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
- nutrition_ratio = 0.8
- else
- nutrition_ratio = 1
- if(satiety > 80)
- nutrition_ratio *= 1.25
- adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR)
- blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio)
+ if(blood_volume < BLOOD_VOLUME_NORMAL)
+ var/nutrition_ratio = 0
+ if(!HAS_TRAIT(src, TRAIT_NOHUNGER))
+ switch(nutrition)
+ if(0 to NUTRITION_LEVEL_STARVING)
+ nutrition_ratio = 0.2
+ if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
+ nutrition_ratio = 0.4
+ if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
+ nutrition_ratio = 0.6
+ if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
+ nutrition_ratio = 0.8
+ else
+ nutrition_ratio = 1
+ if(satiety > 80)
+ nutrition_ratio *= 1.25
+ adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR)
+ blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio)
//Effects of bloodloss
var/word = pick("dizzy","woozy","faint")
@@ -390,8 +391,7 @@
H.handle_blood()
/mob/living/proc/AddIntegrationBlood(value, force)
- var/species_maxblood = BLOOD_VOLUME_NORMAL
- if(isslimeperson(src) || isvampire(src))
- species_maxblood = BLOOD_VOLUME_MAXIMUM
- if(blood_volume + integrating_blood < species_maxblood || force)
+ if(value < 0 && integrating_blood < value) //Remove the normal blood of the carbon if we can't afford it with integrating_blood
+ blood_volume = min(blood_volume, value)
+ if(integrating_blood < blood_volume + BLOOD_VOLUME_NORMAL || force)
integrating_blood += value
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 44379660b6..bd966599c8 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -1273,3 +1273,6 @@
var/mob/living/carbon/C = usr
if(I.can_give())
C.give(src)
+
+/mob/living/carbon/proc/functional_blood()
+ return blood_volume + integrating_blood
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 7e3b2ab015..c732a754fc 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -182,3 +182,8 @@
destination.underwear = underwear
destination.undershirt = undershirt
destination.socks = socks
+
+/mob/living/carbon/human/AddIntegrationBlood(value, force)
+ if(NOBLOOD in dna.species.species_traits) //Can't lose blood if your species doesn't have any
+ return
+ . = ..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 1ccda4812d..d1395c7386 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -396,19 +396,21 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 60
taste_description = "sweetness and salt"
+ var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick
var/last_added = 0
var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
pH = 5.5
-/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M)
+/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/human/M)
if((HAS_TRAIT(M, TRAIT_NOMARROW)))
return
if(last_added)
- M.integrating_blood -= min(M.integrating_blood, last_added)
+ M.AddIntegrationBlood(-last_added)
last_added = 0
- if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level.
- last_added = volume * 5
- M.AddIntegrationBlood(last_added)
+ if(M.functional_blood() < maximum_reachable) //Can only up to double your effective blood level.
+ var/new_blood_level = min(volume * 5, maximum_reachable)
+ last_added = new_blood_level
+ M.AddIntegrationBlood(new_blood_level + (extra_regen * REM))
if(prob(33))
M.adjustBruteLoss(-0.5*REM, 0)
M.adjustFireLoss(-0.5*REM, 0)