From 936d19c0a0026835ce43e82d97c128f9eb7f2872 Mon Sep 17 00:00:00 2001
From: HMBGERDO <61080616+HMBGERDO@users.noreply.github.com>
Date: Wed, 26 Jun 2024 22:57:30 +0200
Subject: [PATCH] Blood spread fixes and tweaks (#26048)
* blood spread fixes and tweaks
* just to make sure
* soap cant be bloodied, better check on gloves
---
code/game/atoms.dm | 8 ++++++++
code/game/objects/items.dm | 1 +
code/game/objects/items/weapons/soap.dm | 5 ++++-
code/modules/detective_work/detective_work.dm | 11 +++++------
code/modules/mob/living/carbon/human/appearance.dm | 7 +++++++
.../mob/living/carbon/human/human_defense.dm | 13 +++++++++----
code/modules/projectiles/projectile_base.dm | 2 +-
code/modules/surgery/other.dm | 2 +-
code/modules/surgery/surgery.dm | 2 +-
9 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index b4cfe0a781f..98bcca85a89 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -19,6 +19,8 @@
var/blood_color
/// Wont gloves/hands spend blood spill points to make this bloody
var/easy_to_spill_blood = FALSE
+ /// Will the atom spread blood when touched?
+ var/should_spread_blood = FALSE
var/pass_flags = 0
/// The higher the germ level, the more germ on the atom.
var/germ_level = GERM_LEVEL_AMBIENT
@@ -898,10 +900,14 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
return FALSE
/obj/add_blood(list/blood_dna, b_color)
+ if(isnull(b_color))
+ b_color = "#A10808"
blood_color = b_color
return transfer_blood_dna(blood_dna)
/obj/item/add_blood(list/blood_dna, b_color)
+ if(isnull(b_color))
+ b_color = "#A10808"
var/blood_count = !blood_DNA ? 0 : length(blood_DNA)
if(!..())
return FALSE
@@ -915,6 +921,8 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
transfer_blood = rand(2, 4)
/turf/add_blood(list/blood_dna, b_color)
+ if(isnull(b_color))
+ b_color = "#A10808"
var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
if(!B)
B = new /obj/effect/decal/cleanable/blood/splatter(src)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 5c81736b756..f0eb4e5ac75 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -54,6 +54,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
/// Determines what it can pass over/through. IE. 'PASSTABLE' will allow it to pass over tables
pass_flags = PASSTABLE
pressure_resistance = 4
+ should_spread_blood = TRUE
var/obj/item/master
/// Flags which determine which body parts are protected from heat. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
index e7c486d5a40..d474d5a264b 100644
--- a/code/game/objects/items/weapons/soap.dm
+++ b/code/game/objects/items/weapons/soap.dm
@@ -31,6 +31,9 @@
return
target.cleaning_act(user, src, cleanspeed)
+/obj/item/soap/add_blood(list/blood_dna, b_color)
+ return
+
/obj/item/soap/proc/eat_soap(mob/living/carbon/human/drask/user)
times_eaten++
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
@@ -96,7 +99,7 @@
if(!istype(carried_item, /obj/item/bio_chip))//If it's not an implant.
carried_item.add_mob_blood(target)//Oh yes, there will be blood...
var/mob/living/carbon/human/H = target
- H.bloody_hands(target,0)
+ H.make_bloody_hands(H.get_blood_dna_list(), H.get_blood_color())
H.bloody_body(target)
return
diff --git a/code/modules/detective_work/detective_work.dm b/code/modules/detective_work/detective_work.dm
index ea9596dafa4..3c034c8c995 100644
--- a/code/modules/detective_work/detective_work.dm
+++ b/code/modules/detective_work/detective_work.dm
@@ -8,10 +8,10 @@
else if(G.transfer_blood > 1 && add_blood(G.blood_DNA, G.blood_color))
G.transfer_blood--
- if(blood_DNA)
+ if(blood_DNA && should_spread_blood)
var/old_transfer_blood = G.transfer_blood
G.add_blood(blood_DNA, blood_color)
- G.transfer_blood = old_transfer_blood
+ G.transfer_blood = max(1, old_transfer_blood)
M.update_inv_gloves()
else
@@ -20,11 +20,10 @@
else if(M.bloody_hands > 1 && add_blood(M.blood_DNA, M.hand_blood_color))
M.bloody_hands--
- if(blood_DNA)
+ if(blood_DNA && should_spread_blood)
var/old_bloody_hands = M.bloody_hands
- M.add_blood(blood_DNA, blood_color)
- M.bloody_hands = old_bloody_hands
- M.update_inv_gloves()
+ M.make_bloody_hands(blood_DNA, blood_color)
+ M.bloody_hands = max(1, old_bloody_hands)
if(!suit_fibers) suit_fibers = list()
var/fibertext
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 39760db276e..3aaebf3a078 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -498,3 +498,10 @@
valid_alt_heads += alternate_head
return sortTim(valid_alt_heads, GLOBAL_PROC_REF(cmp_text_asc))
+
+/mob/living/carbon/human/proc/get_blood_color()
+ var/bloodcolor = "#A10808"
+ var/list/b_data = get_blood_data(get_blood_id())
+ if(b_data)
+ bloodcolor = b_data["blood_color"]
+ return bloodcolor
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index ada1db48e5b..ee1b197b72c 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -616,11 +616,16 @@ emp_act
visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!")
return TRUE
-/mob/living/carbon/human/proc/bloody_hands(mob/living/source, amount = 2)
+/mob/living/carbon/human/proc/make_bloody_hands(list/blood_dna, b_color)
+ if(isnull(b_color))
+ b_color = "#A10808"
if(gloves)
- gloves.add_mob_blood(source)
+ gloves.add_blood(blood_dna, blood_color)
else
- add_mob_blood(source)
+ hand_blood_color = b_color
+ bloody_hands = rand(2, 4)
+ transfer_blood_dna(blood_dna)
+ add_verb(src, /mob/living/carbon/human/proc/bloody_doodle)
update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
/mob/living/carbon/human/proc/bloody_body(mob/living/source)
@@ -657,7 +662,7 @@ emp_act
if(bleed_rate && ishuman(user))
var/mob/living/carbon/human/attacker = user
- attacker.bloody_hands(src)
+ attacker.make_bloody_hands(get_blood_dna_list(), get_blood_color())
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L)
if(..()) //successful larva bite.
diff --git a/code/modules/projectiles/projectile_base.dm b/code/modules/projectiles/projectile_base.dm
index c0b25e63acf..ac8f9b91abf 100644
--- a/code/modules/projectiles/projectile_base.dm
+++ b/code/modules/projectiles/projectile_base.dm
@@ -201,7 +201,7 @@
L.add_splatter_floor(target_loca, shift_x = shift["x"], shift_y = shift["y"])
if(istype(H))
for(var/mob/living/carbon/human/M in step_over) //Bloody the mobs who're infront of the spray.
- M.bloody_hands(H)
+ M.make_bloody_hands(H.get_blood_dna_list(), H.get_blood_color())
/* Uncomment when bloody_body stops randomly not transferring blood colour.
M.bloody_body(H) */
else if(impact_effect_type && !hitscan)
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 22da9cad876..59b9d14998f 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -109,7 +109,7 @@
affected.fix_internal_bleeding()
if(ishuman(user) && prob(40))
var/mob/living/carbon/human/U = user
- U.bloody_hands(target, 0)
+ U.make_bloody_hands(target.get_blood_dna_list(), target.get_blood_color())
return SURGERY_STEP_CONTINUE
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 6f22fb03501..20cdc7e0425 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -446,7 +446,7 @@
var/mob/living/carbon/human/H = user
switch(blood_level)
if(SURGERY_BLOODSPREAD_HANDS)
- H.bloody_hands(target, 0)
+ H.make_bloody_hands(target.get_blood_dna_list(), target.get_blood_color())
if(SURGERY_BLOODSPREAD_FULLBODY)
H.bloody_body(target)
return