diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 8e922b5b39..c4b668696d 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -84,6 +84,7 @@ S.blood_smear[blood_state] = min(MAX_SHOE_BLOODINESS,S.blood_smear[blood_state]+add_blood) S.add_blood_DNA(return_blood_DNA()) S.blood_state = blood_state + S.blood_color = blood_color update_icon() H.update_inv_shoes() @@ -97,6 +98,7 @@ H.blood_smear[blood_state] = min(MAX_SHOE_BLOODINESS,H.blood_smear[blood_state]+add_blood) H.add_blood_DNA(return_blood_DNA()) H.blood_state = blood_state + H.blood_color = blood_color update_icon() /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() diff --git a/code/game/objects/effects/decals/cleanable/gibs.dm b/code/game/objects/effects/decals/cleanable/gibs.dm index a2c6d69741..5c76bd6867 100644 --- a/code/game/objects/effects/decals/cleanable/gibs.dm +++ b/code/game/objects/effects/decals/cleanable/gibs.dm @@ -11,12 +11,16 @@ /obj/effect/decal/cleanable/blood/gibs/proc/guts() if(gib_overlay) - var/mutable_appearance/gibz = mutable_appearance(icon, icon_state + "-overlay", layer = (LOW_OBJ_LAYER - 0.1)) - var/mutable_appearance/gibz2 = mutable_appearance(icon, icon_state + "c-overlay", color = body_colors, layer = (LOW_OBJ_LAYER - 0.2)) + var/mutable_appearance/gibz = mutable_appearance(icon, icon_state + "-overlay", color = blood_color) + gibz.layer = (LOW_OBJ_LAYER - 0.1) + var/mutable_appearance/gibz2 = mutable_appearance(icon, icon_state + "c-overlay", color = body_colors) + gibz2.layer = (LOW_OBJ_LAYER - 0.2) if(!slimy_gibs) gibz.appearance_flags = RESET_COLOR - add_overlay(gibz) - add_overlay(gibz2) + add_overlay(gibz) + else + add_overlay(gibz) + add_overlay(gibz2) /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return @@ -41,8 +45,10 @@ GET_COMPONENT(infective, /datum/component/infective) if(infective) diseases = infective.diseases + var/obj/effect/decal/cleanable/blood/gibs/gibbers = src var/obj/effect/decal/cleanable/blood/splatter/splat = new /obj/effect/decal/cleanable/blood/splatter(loc, diseases) - splat.update_icon() + splat.color = gibbers.blood_color + if(!step_to(src, get_step(src, direction), 0)) break @@ -97,8 +103,8 @@ /obj/effect/decal/cleanable/blood/gibs/human/Initialize(mapload, list/datum/disease/diseases) . = ..() reagents.add_reagent("liquidgibs", 5) - update_icon() guts() + update_icon() /obj/effect/decal/cleanable/blood/gibs/human/up random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 7a7475d072..1c9dfb9a35 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -8,9 +8,9 @@ color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere. bloodiness = BLOOD_AMOUNT_PER_DECAL -/obj/effect/decal/cleanable/blood/Initialize(mapload, list/datum/disease/diseases) - AddComponent(/datum/component/forensics, null,null,blood_DNA,null,blood_mix_types,blood_mix_color) +/obj/effect/decal/cleanable/blood/ComponentInitialize() . = ..() + AddComponent(/datum/component/forensics) update_icon() /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) @@ -20,7 +20,7 @@ update_icon() return ..() -obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_dna) +/obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_dna) return TRUE /obj/effect/decal/cleanable/blood/transfer_mob_blood_dna() @@ -29,10 +29,21 @@ obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_dna) /obj/effect/decal/cleanable/blood/update_icon() GET_COMPONENT(F, /datum/component/forensics) - if(istype(F)) - F.blood_mix_color = blood_color + if(F && istype(F)) + blood_color = F.blood_mix_color + else + for(var/datum/reagent/R in reagents.reagent_list) + // Get blood data from the blood reagent. + if(istype(R, /datum/reagent/blood)) + if(R.data["blood_type"]) + blood_color = bloodtype_to_color(R.data["blood_type"]) + else if(istype(R, /datum/reagent/liquidgibs)) + if(R.data["blood_type"]) + blood_color = bloodtype_to_color(R.data["blood_type"]) + color = blood_color + /obj/effect/decal/cleanable/blood/old name = "dried blood" desc = "Looks like it's been here a while. Eew." @@ -91,6 +102,7 @@ obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_dna) var/obj/item/clothing/shoes/S = H.shoes if(S && S.blood_smear[blood_state]) S.blood_smear[blood_state] = max(S.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) + S.blood_color = blood_color shoe_types |= S.type if (!(entered_dirs & H.dir)) entered_dirs |= H.dir @@ -99,6 +111,7 @@ obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_dna) else if(!H.bloodiness) H.blood_smear[blood_state] = max(S.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) H.bloodiness = max(H.bloodiness - BLOOD_LOSS_IN_SPREAD, 0) + H.blood_color = blood_color if (!(entered_dirs & H.dir)) entered_dirs |= H.dir update_icon() @@ -111,6 +124,7 @@ obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_dna) var/obj/item/clothing/shoes/S = H.shoes if(S && S.blood_smear[blood_state]) S.blood_smear[blood_state] = max(S.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) + S.blood_color = blood_color shoe_types |= S.type if (!(exited_dirs & H.dir)) exited_dirs |= H.dir @@ -119,31 +133,29 @@ obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_dna) else if(!H.bloodiness) H.blood_smear[blood_state] = max(H.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) H.bloodiness = max(H.bloodiness - BLOOD_LOSS_IN_SPREAD, 0) + H.blood_color = blood_color if (!(exited_dirs & H.dir)) exited_dirs |= H.dir update_icon() /obj/effect/decal/cleanable/blood/footprints/tracks/update_icon() - ..() cut_overlays() for(var/Ddir in GLOB.cardinals) - GET_COMPONENT(B, /datum/component/forensics) if(entered_dirs & Ddir) var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[print_state]-[Ddir]-[color]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["entered-[print_state]-[Ddir]-[color]"] = bloodstep_overlay = image(icon, "[print_state]1", dir = Ddir, color = blood_color) - bloodstep_overlay.Blend(blood_color, ICON_MULTIPLY) + GLOB.bloody_footprints_cache["entered-[print_state]-[Ddir]-[color]"] = bloodstep_overlay = image(icon, "[print_state]1", dir = Ddir) add_overlay(bloodstep_overlay) if(exited_dirs & Ddir) var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[print_state]-[Ddir]-[color]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["exited-[print_state]-[Ddir]-[color]"] = bloodstep_overlay = image(icon, "[print_state]2", dir = Ddir, color = blood_color) - bloodstep_overlay.Blend(blood_color, ICON_MULTIPLY) + GLOB.bloody_footprints_cache["exited-[print_state]-[Ddir]-[color]"] = bloodstep_overlay = image(icon, "[print_state]2", dir = Ddir) add_overlay(bloodstep_overlay) alpha = BLOODY_FOOTPRINT_BASE_ALPHA + bloodiness + /obj/effect/decal/cleanable/blood/footprints/tracks/examine(mob/user) . = ..() if(shoe_types.len && ishuman(user) && user.mind.assigned_role == "Detective") //gumshoe does the detective thing, not every fucking assistant diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index c815eae39b..4c6131644c 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -52,11 +52,10 @@ if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") if(bloody) - GET_COMPONENT(D, /datum/component/forensics) if(adjusted == NORMAL_STYLE) - . += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = D.blood_mix_color) + . += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = blood_color) else - . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood", color = D.blood_mix_color) + . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood", color = blood_color) /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() @@ -97,6 +96,7 @@ return blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) blood_state = BLOOD_STATE_NOT_BLOODY + blood_color = null if(ismob(loc)) var/mob/M = loc M.update_inv_shoes() diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 344140b00f..86bf676f7e 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -234,7 +234,7 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C if(H.dna.species.exotic_blood) - return "[H.dna.species.exotic_blood]" + return H.dna.species.exotic_blood if(dna.species.exotic_blood) return dna.species.exotic_blood else if((NOBLOOD in dna.species.species_traits) || (has_trait(TRAIT_NOCLONE))) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 9d072c90a2..1135a592e1 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -64,6 +64,7 @@ FP.icon_state = FOOTPRINT_SHOE FP.print_state = FOOTPRINT_SHOE FP.blood_state = S.blood_state + FP.blood_color = S.blood_color FP.entered_dirs |= dir FP.bloodiness = S.blood_smear[S.blood_state] FP.update_icon() @@ -79,7 +80,8 @@ if(!has_gravity(loc)) return var/turf/T = get_turf(src) - if(bloodiness) + var/mob/living/carbon/human/H = src + if(H.bloodiness) var/obj/effect/decal/cleanable/blood/footprints/tracks/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints/tracks) in T if(oldFP && (oldFP.blood_state == blood_state && oldFP.color == color)) return @@ -106,6 +108,7 @@ FP.icon_state = FOOTPRINT_SHOE FP.print_state = FOOTPRINT_SHOE FP.add_blood_DNA(return_blood_DNA()) + FP.blood_color = H.blood_color FP.update_icon() var/newdir = get_dir(T, loc) if(newdir == dir) @@ -124,6 +127,7 @@ if(!has_gravity(loc)) return var/turf/T = get_turf(src) + var/mob/living/carbon/human/H = src if(bloodiness) var/obj/effect/decal/cleanable/blood/footprints/tracks/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints/tracks) in T if(oldFP && (oldFP.blood_state == blood_state && oldFP.color == color)) @@ -133,6 +137,7 @@ FP.icon_state = FOOTPRINT_DRAG FP.print_state = FOOTPRINT_DRAG FP.add_blood_DNA(return_blood_DNA()) + FP.blood_color = H.blood_color FP.update_icon() var/newdir = get_dir(T, loc) if(newdir == dir)