diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index db56d680a4b..5aa321ca415 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -273,7 +273,7 @@ "stoxin_amount" = H.reagents.get_reagent_amount("stoxin"), "bicaridine_amount" = H.reagents.get_reagent_amount("bicaridine"), "dermaline_amount" = H.reagents.get_reagent_amount("dermaline"), - "blood_amount" = round(H.vessel.get_reagent_amount("blood") / H.species.blood_volume)*100, + "blood_amount" = round((H.vessel.get_reagent_amount("blood") / H.species.blood_volume)*100), "disabilities" = H.sdisabilities, "lung_ruptured" = H.is_lung_ruptured(), "external_organs" = H.organs.Copy(), diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index d694fd5d4ca..d2fa5478cbb 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -110,7 +110,7 @@ return // If the human is losing too much blood, beep. - if(T.vessel.get_reagent_amount("blood") < BLOOD_VOLUME_SAFE) if(prob(5)) + if(((T.vessel.get_reagent_amount("blood")/T.species.blood_volume)*100) < BLOOD_VOLUME_SAFE) visible_message("\The [src] beeps loudly.") var/datum/reagent/B = T.take_blood(beaker,amount) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 63df3158dc1..ef875940adc 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -61,7 +61,7 @@ REAGENT SCANNER user.show_message("Analyzing Results for [M]:") user.show_message("Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health - M.halloss]% healthy"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health/M.maxHealth)*100]% healthy"]") user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) @@ -158,10 +158,10 @@ REAGENT SCANNER user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) break if(M:vessel) - var/blood_volume = round(M:vessel.get_reagent_amount("blood")) - var/blood_percent = round(blood_volume / H.species.blood_volume)*100 - var/blood_type = M.dna.b_type - if(blood_percent <= BLOOD_VOLUME_SAFE && blood_percent > BLOOD_VOLUME_BAD) + 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_SAFE) && (blood_percent > BLOOD_VOLUME_BAD)) user.show_message("Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl. Type: [blood_type]") else if(blood_percent <= BLOOD_VOLUME_BAD) user.show_message("Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl. Type: [blood_type]") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c799eabf953..6b9cbf02589 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -4,7 +4,6 @@ ingested = new/datum/reagents/metabolism(1000, src, CHEM_INGEST) touching = new/datum/reagents/metabolism(1000, src, CHEM_TOUCH) reagents = bloodstr - ..() /mob/living/carbon/Life() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a0636f453f4..94ee52c8221 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -895,7 +895,7 @@ /mob/living/carbon/human/revive() if(should_have_organ(O_HEART)) - vessel.add_reagent("blood",560-vessel.total_volume) + vessel.add_reagent("blood",species.blood_volume-vessel.total_volume) fixblood() species.create_organs(src) // Reset our organs/limbs. @@ -1113,7 +1113,10 @@ spawn(0) regenerate_icons() - vessel.add_reagent("blood",560-vessel.total_volume) + if(vessel.total_volume < species.blood_volume) + vessel.add_reagent("blood", species.blood_volume - vessel.total_volume) + else if(vessel.total_volume > species.blood_volume) + vessel.remove_reagent("blood", vessel.total_volume - species.blood_volume) fixblood() // Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them. diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 53d62dbea0e..e0451046ae5 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -318,10 +318,10 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t This function restores the subjects blood to max. */ /mob/living/carbon/human/proc/restore_blood() - if(should_have_organ(O_HEART)) - var/blood_volume = vessel.get_reagent_amount("blood") - vessel.add_reagent("blood",560.0-blood_volume) - + if(!should_have_organ(O_HEART)) + return + if(vessel.total_volume < species.blood_volume) + vessel.add_reagent("blood", species.blood_volume - vessel.total_volume) /* This function restores all organs. diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 6451d847000..57eaf54a431 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -31,7 +31,7 @@ var/show_ssd = "fast asleep" var/virus_immune var/short_sighted // Permanent weldervision. - var/blood_volume = 500 // Initial blood volume. + var/blood_volume = 560 // Initial blood volume. var/hunger_factor = 0.05 // Multiplier for hunger. // Language/culture vars. diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index 54a7f37f0f4..faa27d93617 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -30,7 +30,7 @@ holder_type = /obj/item/weapon/holder/human short_sighted = 1 gluttonous = 1 - blood_volume = 300 + blood_volume = 400 hunger_factor = 1.2 spawn_flags = CAN_JOIN | IS_WHITELISTED diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index 0d539d44fc5..a95a22b948a 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -350,6 +350,6 @@ visible_message("With a hideous, rattling moan, [src] shudders back to life!") rejuvenate() - vessel.add_reagent("blood",560-vessel.total_volume) + restore_blood() fixblood() update_canmove() \ No newline at end of file diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 25831b24332..1bae132aed9 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -1,7 +1,7 @@ /**************************************************** BLOOD SYSTEM ****************************************************/ -//Blood levels +//Blood levels. These are percentages based on the species blood_volume far. var/const/BLOOD_VOLUME_SAFE = 85 var/const/BLOOD_VOLUME_OKAY = 75 var/const/BLOOD_VOLUME_BAD = 60 @@ -22,7 +22,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 if(!should_have_organ(O_HEART)) //We want the var for safety but we can do without the actual blood. return - vessel.add_reagent("blood",(species.blood_volume * 0.95)) + vessel.add_reagent("blood",species.blood_volume) spawn(1) fixblood() @@ -44,10 +44,11 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood. - var/blood_volume = round(vessel.get_reagent_amount("blood")/species.blood_volume)*100 // Percentage. + var/blood_volume_raw = vessel.get_reagent_amount("blood") + var/blood_volume = round((blood_volume_raw/species.blood_volume)*100) // Percentage. //Blood regeneration if there is some space - if(blood_volume < species.blood_volume && blood_volume) + if(blood_volume_raw < species.blood_volume) var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood if(B) // Make sure there's some blood at all if(B.data["donor"] != src) //If it's not theirs, then we look for theirs @@ -75,46 +76,45 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 blood_volume *= 0.3 //Effects of bloodloss - switch(blood_volume) - if(BLOOD_VOLUME_SAFE to 10000) - if(pale) - pale = 0 - update_body() - if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) - if(!pale) - pale = 1 - update_body() - var/word = pick("dizzy","woosey","faint") - src << "\red You feel [word]" - if(prob(1)) - var/word = pick("dizzy","woosey","faint") - src << "\red You feel [word]" - if(oxyloss < 20) - oxyloss += 3 - if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - if(!pale) - pale = 1 - update_body() - eye_blurry = max(eye_blurry,6) - if(oxyloss < 50) - oxyloss += 10 - oxyloss += 1 - if(prob(15)) - Paralyse(rand(1,3)) - var/word = pick("dizzy","woosey","faint") - src << "\red You feel extremely [word]" - if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) - oxyloss += 5 - toxloss += 3 - if(prob(15)) - var/word = pick("dizzy","woosey","faint") - src << "\red You feel extremely [word]" - if(0 to BLOOD_VOLUME_SURVIVE) - // There currently is a strange bug here. If the mob is not below -100 health - // when death() is called, apparently they will be just fine, and this way it'll - // spam deathgasp. Adjusting toxloss ensures the mob will stay dead. - toxloss += 300 // just to be safe! - death() + if(blood_volume >= BLOOD_VOLUME_SAFE) + if(pale) + pale = 0 + update_body() + else if(blood_volume >= BLOOD_VOLUME_OKAY) + if(!pale) + pale = 1 + update_body() + var/word = pick("dizzy","woosey","faint") + src << "\red You feel [word]" + if(prob(1)) + var/word = pick("dizzy","woosey","faint") + src << "\red You feel [word]" + if(oxyloss < 20) + oxyloss += 3 + else if(blood_volume >= BLOOD_VOLUME_BAD) + if(!pale) + pale = 1 + update_body() + eye_blurry = max(eye_blurry,6) + if(oxyloss < 50) + oxyloss += 10 + oxyloss += 1 + if(prob(15)) + Paralyse(rand(1,3)) + var/word = pick("dizzy","woosey","faint") + src << "\red You feel extremely [word]" + else if(blood_volume >= BLOOD_VOLUME_SURVIVE) + oxyloss += 5 + toxloss += 3 + if(prob(15)) + var/word = pick("dizzy","woosey","faint") + src << "\red You feel extremely [word]" + else + // There currently is a strange bug here. If the mob is not below -100 health + // when death() is called, apparently they will be just fine, and this way it'll + // spam deathgasp. Adjusting toxloss ensures the mob will stay dead. + toxloss += 300 // just to be safe! + death() // Without enough blood you slowly go hungry. if(blood_volume < BLOOD_VOLUME_SAFE) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 8b0f22445cf..27b4e74d406 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -117,7 +117,7 @@ var/list/organ_cache = list() if(germ_level >= INFECTION_LEVEL_THREE) die() - else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs + else if(owner && owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs //** Handle antibiotics and curing infections handle_antibiotics() handle_rejection() diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi index a931fc2d1f8..7305a6e216e 100644 Binary files a/icons/mob/species/seromi/head.dmi and b/icons/mob/species/seromi/head.dmi differ diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi index ae60d147dad..693565171c6 100644 Binary files a/icons/mob/species/seromi/suit.dmi and b/icons/mob/species/seromi/suit.dmi differ