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)