Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion code/datums/blood_types.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ GLOBAL_LIST_INIT_TYPED(blood_types, /datum/blood_type, init_subtypes_w_path_keys
* * new_splat - whether this is a newly instantiated blood decal, or an existing one this blood is being added to
*/
/datum/blood_type/proc/set_up_blood(obj/effect/decal/cleanable/blood/blood, new_splat = FALSE)
return
blood.color = color

/// A base type for all blood used by humans (NOT humanoids), for organization's sake
/datum/blood_type/human
Expand Down
4 changes: 3 additions & 1 deletion code/datums/components/decals/blood.dm
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, PROC_REF(get_examine_name))

/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color)
var/imported_color = _color || COLOR_BLOOD

var/obj/item/I = parent
if(I.bigboy)
if(!_icon)
Expand All @@ -32,11 +34,11 @@
blood_splatter_icon.Blend(icon(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state))
blood_splatter_appearances[index] = pic
pic.color = imported_color
pic.alpha = 150
return TRUE

/datum/component/decal/blood/apply(atom/thing)
//pic.color = source.get_blood_dna_color() || COLOR_BLOOD
return ..()

/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override)
Expand Down
43 changes: 24 additions & 19 deletions code/game/objects/effects/decals/cleanable/humans.dm
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
desc = ""
icon = 'icons/effects/blood.dmi'
icon_state = "floor1"
color = COLOR_BLOOD
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6")
blood_state = BLOOD_STATE_HUMAN
bloodiness = BLOOD_AMOUNT_PER_DECAL
Expand Down Expand Up @@ -48,7 +49,7 @@
H.bloody_hands++
H.update_inv_gloves()

/obj/effect/decal/cleanable/blood/Initialize(mapload)
/obj/effect/decal/cleanable/blood/Initialize(mapload, override_color)
. = ..()
if(. == INITIALIZE_HINT_QDEL)
return .
Expand All @@ -58,6 +59,8 @@
pixel_y = base_pixel_y + rand(5,5)
blood_timer = addtimer(CALLBACK(src, PROC_REF(become_dry)), rand(5 MINUTES,15 MINUTES), TIMER_STOPPABLE)
GLOB.weather_act_upon_list += src
if(override_color)
color = override_color


/obj/effect/decal/cleanable/blood/proc/become_dry()
Expand Down Expand Up @@ -91,7 +94,6 @@
C.alpha = initial(alpha)
C.bloodiness = initial(bloodiness)
C.name = initial(name)
C.color = initial(color)

/obj/effect/decal/cleanable/blood/Destroy()
deltimer(blood_timer)
Expand All @@ -117,13 +119,13 @@

/obj/effect/decal/cleanable/blood/splatter/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(..())
var/obj/effect/decal/cleanable/blood/splatter/P = C
P.drips++
if(P.drips > 2)
var/obj/effect/decal/cleanable/blood/splatter/previous = C
previous.drips++
if(previous.drips > 2)
var/turf/T = loc
if(istype(T))
new /obj/effect/decal/cleanable/blood(T)
qdel(P)
new /obj/effect/decal/cleanable/blood(T, previous.color)
qdel(previous)
return TRUE


Expand All @@ -144,11 +146,13 @@
appearance_flags = NO_CLIENT_COLOR
var/blood_timer

/obj/effect/decal/cleanable/trail_holder/Initialize(mapload)
/obj/effect/decal/cleanable/trail_holder/Initialize(mapload, override_color)
. = ..()
if(. == INITIALIZE_HINT_QDEL)
return .
blood_timer = addtimer(CALLBACK(src, PROC_REF(become_dry)), rand(5 MINUTES,8 MINUTES), TIMER_STOPPABLE)
if(override_color)
color = override_color

/obj/effect/decal/cleanable/trail_holder/Destroy()
deltimer(blood_timer)
Expand Down Expand Up @@ -185,7 +189,7 @@
for(var/i in 0 to rand(1,3))
sleep(2)
if(i > 0)
new /obj/effect/decal/cleanable/blood/splatter(loc, diseases)
new /obj/effect/decal/cleanable/blood/splatter(loc, color)
if(!step_to(src, get_step(src, direction), 0))
break

Expand Down Expand Up @@ -252,21 +256,21 @@
if(istype(T))
var/obj/effect/decal/cleanable/blood/puddle/PUD = locate() in T
if(!PUD)
PUD = new(T)
PUD = new(T, color)
PUD.blood_vol = blood_vol

/obj/effect/decal/cleanable/blood/drip/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(..())
var/obj/effect/decal/cleanable/blood/drip/P = C
P.drips++
if(P.drips > 5)
var/obj/effect/decal/cleanable/blood/drip/previous = C
previous.drips++
if(previous.drips > 5)
var/turf/T = loc
if(istype(T))
var/obj/effect/decal/cleanable/blood/puddle/PUD = new(T)
var/obj/effect/decal/cleanable/blood/puddle/PUD = new(T, previous.color)
PUD.blood_vol = blood_vol
qdel(P)
qdel(previous)
else
P.update_appearance(UPDATE_ICON_STATE)
previous.update_appearance(UPDATE_ICON_STATE)
return TRUE

/obj/effect/decal/cleanable/blood/puddle
Expand Down Expand Up @@ -294,9 +298,10 @@

/obj/effect/decal/cleanable/blood/puddle/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(..())
var/obj/effect/decal/cleanable/blood/puddle/P = C
P.blood_vol += 10
P.update_appearance(UPDATE_ICON_STATE)
var/obj/effect/decal/cleanable/blood/puddle/previous = C
previous.blood_vol += 10
previous.update_appearance(UPDATE_ICON_STATE)
previous.color = color
return TRUE


Expand Down
4 changes: 3 additions & 1 deletion code/game/objects/effects/temporary_visuals/miscellaneous.dm
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
plane = GAME_PLANE_FOV_HIDDEN
var/splatter_type = "splatter"

/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir)
/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir, datum/blood_type/bloodtype)
if(bloodtype)
color = bloodtype.color
if(set_dir in GLOB.diagonals)
icon_state = "[splatter_type][pick(1, 2, 6)]"
else
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/items/natural/animals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@
if(rotten && istype(I,/obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/F = I
F.become_rotten()

new /obj/effect/decal/cleanable/blood/splatter(get_turf(src))
user.adjust_experience(/datum/skill/labor/butchering, amt2raise, FALSE)
qdel(src)
Expand Down
6 changes: 3 additions & 3 deletions code/game/objects/structures/meathook.dm
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,12 @@
STOP_PROCESSING(SSmachines, src)
return
L.blood_drained++
var/datum/blood_type/bloodtype = L.get_blood_type()

var/obj/item/reagent_containers/container = locate(/obj/item/reagent_containers) in get_turf(src)
playsound(src, 'sound/misc/bleed (3).ogg', 100, FALSE)
if(container && container.is_open_container() && container.reagents.total_volume < container.reagents.maximum_volume)
var/datum/blood_type/type = L.get_blood_type()
container.reagents.add_reagent(initial(type.reagent_type), 5, data = type.get_blood_data(L))
container.reagents.add_reagent(initial(bloodtype.reagent_type), 5, data = bloodtype.get_blood_data(L))
else
var/obj/effect/decal/cleanable/blood/puddle/P = locate() in get_turf(src)
if(P)
Expand All @@ -129,7 +129,7 @@
D.drips++
D.update_appearance(UPDATE_ICON_STATE)
else
new /obj/effect/decal/cleanable/blood/drip(get_turf(src))
new /obj/effect/decal/cleanable/blood/drip(get_turf(src), bloodtype.color)

/obj/structure/meathook/proc/release_mob(mob/living/M)
REMOVE_TRAIT(M, TRAIT_EASYDISMEMBER, "[type]")
Expand Down
7 changes: 3 additions & 4 deletions code/modules/mob/living/blood.dm
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@
W.water_volume = 10

return
var/obj/effect/decal/cleanable/blood/splatter/splatter = new /obj/effect/decal/cleanable/blood/splatter(T)
var/obj/effect/decal/cleanable/blood/splatter/splatter = new /obj/effect/decal/cleanable/blood/splatter(T, blood.color)

splatter.transfer_mob_blood_dna(src)
splatter.update_appearance(UPDATE_ICON_STATE)
Expand All @@ -334,8 +334,7 @@
var/obj/item/reagent_containers/container = locate(/obj/item/reagent_containers) in T
playsound(src, 'sound/misc/bleed (3).ogg', 100, FALSE)
if(container && container.is_open_container() && container.reagents.total_volume < container.reagents.maximum_volume)
var/datum/blood_type/type = get_blood_type()
container.reagents.add_reagent(initial(type.reagent_type), 5, data = type.get_blood_data(src))
container.reagents.add_reagent(initial(blood.reagent_type), 5, data = blood.get_blood_data(src))
else
var/obj/effect/decal/cleanable/blood/puddle/P = locate() in T
if(P)
Expand All @@ -350,7 +349,7 @@
D.transfer_mob_blood_dna(src)
D.update_appearance(UPDATE_ICON_STATE)
else
var/obj/effect/decal/cleanable/blood/drip/splatter = new /obj/effect/decal/cleanable/blood/drip(T)
var/obj/effect/decal/cleanable/blood/drip/splatter = new /obj/effect/decal/cleanable/blood/drip(T, blood.color)
splatter.transfer_mob_blood_dna(src)
splatter.update_appearance(UPDATE_ICON_STATE)

Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/carbon/carbon_defense.dm
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(src)
var/splatter_dir = get_dir(user, src)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(loc, splatter_dir)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(loc, splatter_dir, get_blood_type())
if(affecting.body_zone == BODY_ZONE_HEAD)
if(wear_mask)
wear_mask.add_mob_blood(src)
Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/carbon/human/species.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1905,7 +1905,7 @@ GLOBAL_LIST_EMPTY(roundstart_species)
bloody = 1
var/turf/location = H.loc
var/splatter_dir = get_dir(H, user)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(H.loc, splatter_dir)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(H.loc, splatter_dir, H.get_blood_type())
if(istype(location))
H.add_splatter_floor(location)
if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
species_traits = list(
NO_UNDERWEAR,
NOTRANSSTING,
NOBLOOD
)
inherent_traits = list(
TRAIT_NOMOOD,
Expand Down Expand Up @@ -84,6 +83,8 @@

exotic_bloodtype = /datum/blood_type/oil

bleed_mod = 0.2 // 80% less bleed rate from injuries

custom_id = "automaton"
custom_clothes = FALSE

Expand Down
19 changes: 19 additions & 0 deletions code/modules/mob/living/carbon/human/update_icons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ GLOBAL_PROTECT(no_child_icons)
var/list/limb_overlaysa = list()
var/list/limb_overlaysb = list()
var/list/limb_overlaysc = list()
var/bloodcolor = get_blood_type().color
for(var/obj/item/bodypart/BP as anything in bodyparts)
var/list/damage_overlays = list()
var/list/legdam_overlays = list()
Expand All @@ -133,17 +134,23 @@ GLOBAL_PROTECT(no_child_icons)
if(!BP.skeletonized)
if(BP.brutestate)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.body_zone]_[BP.brutestate]0", -DAMAGE_LAYER)
damage_overlay.color = bloodcolor
damage_overlays += damage_overlay
var/mutable_appearance/legdam_overlay = mutable_appearance(limb_icon, "legdam_[BP.body_zone]_[BP.brutestate]0", -LEG_DAMAGE_LAYER)
legdam_overlay.color = bloodcolor
legdam_overlays += legdam_overlay
var/mutable_appearance/armdam_overlay = mutable_appearance(limb_icon, "armdam_[BP.body_zone]_[BP.brutestate]0", -ARM_DAMAGE_LAYER)
armdam_overlay.color = bloodcolor
armdam_overlays += armdam_overlay
if(BP.burnstate)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.body_zone]_0[BP.burnstate]", -DAMAGE_LAYER)
damage_overlay.color = bloodcolor
damage_overlays += damage_overlay
var/mutable_appearance/legdam_overlay = mutable_appearance(limb_icon, "legdam_[BP.body_zone]_0[BP.burnstate]", -LEG_DAMAGE_LAYER)
legdam_overlay.color = bloodcolor
legdam_overlays += legdam_overlay
var/mutable_appearance/armdam_overlay = mutable_appearance(limb_icon, "armdam_[BP.body_zone]_0[BP.burnstate]", -ARM_DAMAGE_LAYER)
armdam_overlay.color = bloodcolor
armdam_overlays += armdam_overlay
if(BP.get_bleed_rate())
bleed_checker = TRUE
Expand All @@ -164,10 +171,13 @@ GLOBAL_PROTECT(no_child_icons)
wound_overlays |= wound.mob_overlay
for(var/wound_overlay in wound_overlays)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.body_zone]_[wound_overlay]", -DAMAGE_LAYER)
damage_overlay.color = bloodcolor
damage_overlays += damage_overlay
var/mutable_appearance/legdam_overlay = mutable_appearance(limb_icon, "legdam_[BP.body_zone]_[wound_overlay]", -LEG_DAMAGE_LAYER)
legdam_overlay.color = bloodcolor
legdam_overlays += legdam_overlay
var/mutable_appearance/armdam_overlay = mutable_appearance(limb_icon, "armdam_[BP.body_zone]_[wound_overlay]", -ARM_DAMAGE_LAYER)
armdam_overlay.color = bloodcolor
armdam_overlays += armdam_overlay
if(!bleed_checker && BP.bandage)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.body_zone]_b", -DAMAGE_LAYER)
Expand All @@ -183,17 +193,23 @@ GLOBAL_PROTECT(no_child_icons)
if(!BP.skeletonized)
if(BP.brutestate)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.aux_zone]_[BP.brutestate]0", -DAMAGE_LAYER)
damage_overlay.color = bloodcolor
damage_overlays += damage_overlay
var/mutable_appearance/legdam_overlay = mutable_appearance(limb_icon, "legdam_[BP.aux_zone]_[BP.brutestate]0", -LEG_DAMAGE_LAYER)
legdam_overlay.color = bloodcolor
legdam_overlays += legdam_overlay
var/mutable_appearance/armdam_overlay = mutable_appearance(limb_icon, "armdam_[BP.aux_zone]_[BP.brutestate]0", -ARM_DAMAGE_LAYER)
armdam_overlay.color = bloodcolor
armdam_overlays += armdam_overlay
if(BP.burnstate)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.aux_zone]_0[BP.burnstate]", -DAMAGE_LAYER)
damage_overlay.color = bloodcolor
damage_overlays += damage_overlay
var/mutable_appearance/legdam_overlay = mutable_appearance(limb_icon, "legdam_[BP.aux_zone]_0[BP.burnstate]", -LEG_DAMAGE_LAYER)
legdam_overlay.color =bloodcolor
legdam_overlays += legdam_overlay
var/mutable_appearance/armdam_overlay = mutable_appearance(limb_icon, "armdam_[BP.aux_zone]_0[BP.burnstate]", -ARM_DAMAGE_LAYER)
armdam_overlay.color = bloodcolor
armdam_overlays += armdam_overlay
if(bleed_checker)
if(BP.bandage)
Expand All @@ -209,10 +225,13 @@ GLOBAL_PROTECT(no_child_icons)
//We got the wound overlays before, it's all good
for(var/wound_overlay in wound_overlays)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.aux_zone]_[wound_overlay]", -DAMAGE_LAYER)
damage_overlay.color = bloodcolor
damage_overlays += damage_overlay
var/mutable_appearance/legdam_overlay = mutable_appearance(limb_icon, "legdam_[BP.aux_zone]_[wound_overlay]", -LEG_DAMAGE_LAYER)
legdam_overlay.color =bloodcolor
legdam_overlays += legdam_overlay
var/mutable_appearance/armdam_overlay = mutable_appearance(limb_icon, "armdam_[BP.aux_zone]_[wound_overlay]", -ARM_DAMAGE_LAYER)
armdam_overlay.color = bloodcolor
armdam_overlays += armdam_overlay
if(!bleed_checker && BP.bandage)
var/mutable_appearance/damage_overlay = mutable_appearance(limb_icon, "[BP.aux_zone]_b", -DAMAGE_LAYER)
Expand Down
2 changes: 2 additions & 0 deletions code/modules/mob/living/carbon/update_icons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,8 @@
if(BP.burnstate)
damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]")

var/datum/blood_type/bloodtype = get_blood_type()
damage_overlay.color = bloodtype.color
apply_overlay(DAMAGE_LAYER)


Expand Down
6 changes: 4 additions & 2 deletions code/modules/mob/living/living.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1182,12 +1182,14 @@
if((newdir in GLOB.cardinals) && (prob(50)))
newdir = turn(get_dir(target_turf, start), 180)
if(!blood_exists)
new /obj/effect/decal/cleanable/trail_holder(start)
new /obj/effect/decal/cleanable/trail_holder(start, get_blood_type().color)

for(var/obj/effect/decal/cleanable/trail_holder/TH in start)
if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled)
TH.existing_dirs += newdir
TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir))
var/image/bloodthing = image('icons/effects/blood.dmi', trail_type, dir = newdir)
bloodthing.color = get_blood_type().color
TH.add_overlay(bloodthing)
TH.transfer_mob_blood_dna(src)

/mob/living/carbon/human/makeTrail(turf/T)
Expand Down
2 changes: 1 addition & 1 deletion code/modules/projectiles/projectile.dm
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@
var/splatter_dir = dir
if(starting)
splatter_dir = get_dir(starting, target_loca)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, L.get_blood_type())
if(prob(33))
L.add_splatter_floor(target_loca)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,4 @@
span_userdanger("Blood erupts from my body!"),
span_hear("I hear a fluid spill..."),
)
new /obj/effect/decal/cleanable/blood/puddle(get_turf(H))
new /obj/effect/decal/cleanable/blood/puddle(get_turf(H), H.get_blood_type().color)
Loading
Loading