diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 355b46850b..126c1ea4c6 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -125,8 +125,8 @@
if(prob(33))
I.add_mob_blood(src)
var/turf/location = get_turf(src)
- add_splatter_floor(location)
- if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
+ bleed(totitemdamage)
+ if(totitemdamage >= 10 && get_dist(user, src) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(src)
return TRUE //successful attack
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 222caeb595..99b3120b0f 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -327,7 +327,7 @@
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
var/turf/location = get_turf(src)
//add_blood doesn't work for borgs/xenos, but add_blood_floor does.
- L.add_splatter_floor(location)
+ L.bleed(DOOR_CRUSH_DAMAGE)
for(var/obj/mecha/M in get_turf(src))
M.take_damage(DOOR_CRUSH_DAMAGE)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index b73c6e496c..75b34b22f6 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -75,7 +75,7 @@
L.visible_message("[user] slams [L] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.")
L.forceMove(drop_location())
L.emote("scream")
- L.add_splatter_floor()
+ L.bleed(30)
L.adjustBruteLoss(30)
L.setDir(2)
buckle_mob(L, force=1)
diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm
index 42d6fcbe1e..c892bfeffc 100644
--- a/code/modules/detectivework/detective_work.dm
+++ b/code/modules/detectivework/detective_work.dm
@@ -93,6 +93,15 @@
else if(length(blood_dna))
AddComponent(/datum/component/forensics, null, null, blood_dna)
bloody_hands = rand(2, 4)
+ if(head)
+ head.add_blood_DNA(blood_dna)
+ update_inv_head()
+ else if(wear_mask)
+ wear_mask.add_blood_DNA(blood_dna)
+ update_inv_wear_mask()
+ if(wear_neck)
+ wear_neck.add_blood_DNA(blood_dna)
+ update_inv_neck()
update_inv_gloves() //handles bloody hands overlays and updating
return TRUE
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index d81ef09d14..30180312bb 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -87,21 +87,22 @@
//CIT CHANGES END HERE
apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage
if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC)
- if(prob(33))
+ var/basebloodychance = affecting.brute_dam + totitemdamage
+ if(prob(basebloodychance))
I.add_mob_blood(src)
var/turf/location = get_turf(src)
- add_splatter_floor(location)
- if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
+ bleed(totitemdamage)
+ if(totitemdamage >= 10 && get_dist(user, src) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(src)
if(affecting.body_zone == BODY_ZONE_HEAD)
- if(wear_mask)
+ if(wear_mask && prob(basebloodychance))
wear_mask.add_mob_blood(src)
update_inv_wear_mask()
- if(wear_neck)
+ if(wear_neck && prob(basebloodychance))
wear_neck.add_mob_blood(src)
update_inv_neck()
- if(head)
+ if(head && prob(basebloodychance))
head.add_mob_blood(src)
update_inv_head()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index aee1daa449..35576a9005 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1552,7 +1552,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
bloody = 1
var/turf/location = H.loc
if(istype(location))
- H.add_splatter_floor(location)
+ H.bleed(totitemdamage)
if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(H)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a23bf1f4ed..38bacb0d76 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -164,8 +164,7 @@
new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
else
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir)
- if(prob(33))
- L.add_splatter_floor(target_loca)
+ L.bleed(damage)
else if(impact_effect_type && !hitscan)
new impact_effect_type(target_loca, hitx, hity)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index a7e4e0f590..4b4f118a9c 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -32,6 +32,12 @@
else
C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM)
+ if(reac_volume >= 10 && istype(L))
+ L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+
+/datum/reagent/blood/reaction_obj(obj/O, volume)
+ if(volume >= 3 && istype(O))
+ O.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
/datum/reagent/blood/on_new(list/data)
if(istype(data))
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 73d0ab305e..1a46a9dcb1 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -26,9 +26,7 @@
burn()
return 1
add_mob_blood(C)
- var/turf/location = C.loc
- if(istype(location))
- C.add_splatter_floor(location)
+ C.bleed(40)
var/direction = pick(GLOB.cardinals)
var/t_range = rand(2,max(throw_range/2, 2))
var/turf/target_turf = get_turf(src)
@@ -54,7 +52,7 @@
. = list()
var/organ_spilled = 0
var/turf/T = get_turf(C)
- C.add_splatter_floor(T)
+ C.bleed(50)
playsound(get_turf(C), 'sound/misc/splort.ogg', 80, 1)
for(var/X in C.internal_organs)
var/obj/item/organ/O = X